JIT'ing 2 functions with inter-dependencies

I am having problems JIT'ing 2 functions where one of them calls the other. (I am using the old JIT interface).

Here is the setup:

define void @func1() {
entrypoint:
   call void @func2(void)
   ret void
}

define void @func2(void) {
entrypoint:
   ret void
}

(I omit the arguments and function bodies for simplicity.)

It's 'func1' that would be called from host code, 'func2' gets only called from 'func1'.

The time I have finished building 'func1' (and not yet 'func2') and and ask the execution engine for the function pointer the call to 'func2' is undefined. Thus, even when calling 'func1' after having finshed building 'func2' this results in undef behavior.

When I instead postpone JIT'ing 'func1' and finish building 'func2' first and then ask for the pointer to 'func1' the function pointer returned is somehow corrupt. I guess this is because I already switched to building the function 'func2'?! I cannot even verify 'func1' correctly. I get a strange assertion. So, I guess I have to JIT the function right away after building it .. If this is true, it seems I am out of options here.

What is the correct order to do things here? Is it even possible with the old JIT interface or do I need the new interface?

Frank

Frank Winter wrote:

I am having problems JIT'ing 2 functions where one of them calls the
other. (I am using the old JIT interface).

Here is the setup:

define void @func1() {
entrypoint:
   call void @func2(void)
   ret void
}

define void @func2(void) {
entrypoint:
   ret void
}

(I omit the arguments and function bodies for simplicity.)

It's 'func1' that would be called from host code, 'func2' gets only
called from 'func1'.

The time I have finished building 'func1' (and not yet 'func2') and and
ask the execution engine for the function pointer the call to 'func2' is
undefined. Thus, even when calling 'func1' after having finshed building
'func2' this results in undef behavior.

When I instead postpone JIT'ing 'func1' and finish building 'func2'
first and then ask for the pointer to 'func1' the function pointer
returned is somehow corrupt. I guess this is because I already switched

If both functions are correctly defined in the same module, you should be able
to get the pointer to either of them.

to building the function 'func2'?! I cannot even verify 'func1'
correctly. I get a strange assertion. So, I guess I have to JIT the

The strange assertion suggests that you have another problem, here :slight_smile: