[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