[LLVMdev] direct calls to inttoptr constants

Evan Cheng echeng at apple.com
Thu Feb 19 09:20:55 PST 2009


It's a instruction selection issue. Please file a bugzilla with a test  
case.  Thanks.

Evan

On Feb 12, 2009, at 7:01 AM, Mark Shannon wrote:

> Tobias,
> I've looked into this a bit more.
> You are right.
> The confusion arose as I have two versions of my compiler:
> The ahead-of-time compiler uses symbolic info and does the right  
> thing.
> The JIT compiler uses runtime addresses (in effect integers) and
> when I examined the code in the debugger I found that LLVM produces
> indirect calls, like this:
> mov    $0x8153c8c,%eax
> call   *%eax
>
> Sadly, however, I have no idea how to fix this :(
> but I will try and investigate.
>
> Do you have any ideas yet?
>
> Mark.
>
> Tobias wrote:
>> Hello Mark,
>>
>> I've followed your advice and changed the IR to:
>> %0 = call i32 inttoptr (i32 12345678 to i32 (i32)*)(i32 0) nounwind
>> the call is still indirect.
>>
>> IMHO llc does not call it directly because the address is neither
>> a globalvalue (JIT) nor a external symbol.
>> That's why it uses a fallback mechanism to call it indirectly
>> assuming the address is not constant and is calculated at runtime.
>>
>> tobias
>>
>> Mark wrote:
>>> I'm doing something similar (I use LLVM as part of my JIT  
>>> compiler) and
>>> if I remember correctly, LLVM does the correct thing.
>>>
>>> I think you need to try changing the i64 value to an i32 value.
>>> If that doesn't work you could also try replacing the tail call  
>>> with a
>>> normal call.
>>>
>>>
>>> Mark.
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev




More information about the llvm-dev mailing list