ChiaLun
2013-Jan-11 03:00 UTC
[LLVMdev] modifiy the address of GlobalVariable emitted by JIT
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.
Reasonably Related Threads
- [LLVMdev] Cloning Functions
- [LLVMdev] Object layout bug for C++ derived class with long long integer
- [LLVMdev] patch for llc/ARM: added mechanism to move switch tables from .text -> .data; also cleanup and documentation
- [LLVMdev] patch for llc/ARM: added mechanism to move switch tables from .text -> .data; also cleanup and documentation
- [LLVMdev] Cloning Functions