[LLVMdev] Load from abs address generated bad code on LLVM 2.4

Andrew Haley aph at redhat.com
Wed Jan 21 09:13:25 PST 2009


Óscar Fuentes wrote:
> Andrew Haley <aph at redhat.com> writes:
> 
>> Óscar Fuentes wrote:
>>> The following message is a courtesy copy of an article
>>> that has been posted to gmane.comp.compilers.llvm.devel as well.
>>>
>>> Andrew Haley <aph at redhat.com> writes:
>>>
>>>> This is x86_64.  I have a problem where an absolute memory load
>>>>
>>>> define i32 @foo() {
>>>> entry:
>>>>         %0 = load i32* inttoptr (i64 12704196 to i32*)          ; <i32> [#uses=1]
>>>>         ret i32 %0
>>>> }
>>>>
>>>> generates incorrect code on LLVM 2.4:
>>>>
>>>> 0x7ffff6d54010:	mov    0xc1d9c4(%rip),%eax        # 0x7ffff79719da
>>>> 0x7ffff6d54016:	retq
>>> IIRC, one workaround is to use a GlobalValue instead of a IntToPtr on a
>>> Constant.
>> Err, how?  I can't figure out how to do it.  The only documentation for
>> GlobalValue describes it as a superclass of GlobalVariables and Functions.
> 
> IIRC, the stuff I used was something like...
> 
> GlobalVariable *gv = new GlobalVariable( /* your pointer type */,
>                          other required parameters...);
> AddGlobalMapping(gv, your_pointer_value); // i.e. (void*)0x938742
> 
> then, where you use
> 
>   Constant* thp = ConstantExpr::getCast(Instruction::IntToPtr,
>   your_pointer_value, /* i.e. 0x938742 */
>   /* your pointer type */);
> 
> /* Now use thp */
> 
> change it to
> 
> /* Now just use gv */
> 
> GetGlobalValueAtAddress may be useful for housekeeping.

How does one use GetGlobalValueAtAddress?  It returns a const GlobalValue *,
but it seems that all the LLVM operations take a Value *.  Any attempt to do
anything with a const GlobalValue * is rejected by the C++ compiler.  Perhaps
I'm supposed to cast away the const?

    const GlobalValue *vv = engine->getGlobalValueAtAddress(&p);
    if (vv)
      {
	Value *tmp = builder.CreateLoad(vv);

results in

tut4.cpp:55: error: invalid conversion from 'const llvm::Value*' to 'llvm::Value*'
tut4.cpp:55: error:   initializing argument 1 of 'llvm::LoadInst* llvm::IRBuilder<preserveNames, T>::CreateLoad(llvm::Value*, const char*) [with bool preserveNames = true, T = llvm::ConstantFolder]'

Andrew.



More information about the llvm-dev mailing list