[LLVMdev] modifiy the address of GlobalVariable emitted by JIT

ChiaLun h3355626 at msn.com
Thu Jan 10 19:00:53 PST 2013


Hi everyone, 

I am building a binary translator, and try to do block chaining.

LLVM version : 3.1
my machine : x86-32 bit, Linux

Before each *LLVM IR returnInst constantValue*, I insert a call instruction
& a returnInst which looks like

%x = call @G  ;
ret %x;

then remove the *LLVM IR returnInst constantValue*


The initializer of @G is a function which has prototype int f(struct MyType*
);
and the content in terms of LLVM IR is 

define internal i32 @chaining1057({ i32, [32 x i32] }* %ThreadCtx1) {
"block":
  %0 = getelementptr inbounds { i32, [32 x i32] }* %ThreadCtx1, i32 0, i32 1 
  %1 = getelementptr inbounds [32 x i32]* %0, i32 0, i32 23
  store i32 0, i32* %1 ; // the first three instruction just stores
information
  ret i32 296696 ; // return the same constantValue of the above said
returnInst
}  

I use JIT to compile the above function and also use
JIT->getOrEmitGlobalVariable to get

the address of @G , and store the address in a pointer variable.  So later,
I can modify the content

pointed by the pointer then 

 %x = call @G

the above instruction would call another function.



My environment has multi-thread, which means maybe some threads would try to
modify the address of @G

at the same time, but I think there is no big deal because what all threads
are trying to do is just

modify the address from A to B ( A , B is fixed ).


I modify the address of the globalvariable by

long* addr = (long*)(cur->getGVAddressPtrVector()[ix]); // no vector
insertion or deletion when this is called.

*addr = (long)next->getMachBlock();

% ix is just a vector index
---------------------------------------------------
std::vector<long>& TransBlock::getGVAddressPtrVector()  
{
	return gvAddress; // this vector stores the address of the globalvariable
emitted by JIT
}

inline void * getMachBlock() const {
        return machBlock;   // this is the address of LLVM function emitted
by JIT 
    }



When I do block chaining, I got segmentation fault, but when I turn it off,
nothing happened, so I guess

it is the source of the problem. I have been stuck here for quite a time.

Any idea on this is welcomed.


Have A Nice Day

Chia Lun Liu


 




--
View this message in context: http://llvm.1065342.n5.nabble.com/modifiy-the-address-of-GlobalVariable-emitted-by-JIT-tp53489.html
Sent from the LLVM - Dev mailing list archive at Nabble.com.



More information about the llvm-dev mailing list