summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2003-12-31 20:19:31 +0000
committerChris Lattner <sabre@nondot.org>2003-12-31 20:19:31 +0000
commite18c9ba06a7e5103dc085fb812d815f57516e925 (patch)
tree80d759607b422b44517a6d1d35f99b3c1c29f339
parent78f1f51c66a815ee1affffa29f8de31e1dbb9961 (diff)
downloadbcm5719-llvm-e18c9ba06a7e5103dc085fb812d815f57516e925.tar.gz
bcm5719-llvm-e18c9ba06a7e5103dc085fb812d815f57516e925.zip
Add new ExecutionEngine::getGlobalValueAtAddress method, which can efficiently
turn a memory address back into the LLVM global object that starts at that address. Note that this won't cause any additional datastructures to be built for clients of the EE that don't need this information. llvm-svn: 10673
-rw-r--r--llvm/include/llvm/ExecutionEngine/ExecutionEngine.h31
1 files changed, 25 insertions, 6 deletions
diff --git a/llvm/include/llvm/ExecutionEngine/ExecutionEngine.h b/llvm/include/llvm/ExecutionEngine/ExecutionEngine.h
index cf010084b70..2e4b3deda6a 100644
--- a/llvm/include/llvm/ExecutionEngine/ExecutionEngine.h
+++ b/llvm/include/llvm/ExecutionEngine/ExecutionEngine.h
@@ -36,9 +36,15 @@ class ExecutionEngine {
Module &CurMod;
const TargetData *TD;
- // GlobalAddress - A mapping between LLVM global values and their actualized
- // version...
- std::map<const GlobalValue*, void *> GlobalAddress;
+ /// GlobalAddressMap - A mapping between LLVM global values and their
+ /// actualized version...
+ std::map<const GlobalValue*, void *> GlobalAddressMap;
+
+ /// GlobalAddressReverseMap - This is the reverse mapping of GlobalAddressMap,
+ /// used to convert raw addresses into the LLVM global value that is emitted
+ /// at the address. This map is not computed unless getGlobalValueAtAddress
+ /// is called at some point.
+ std::map<void *, const GlobalValue*> GlobalAddressReverseMap;
protected:
ModuleProvider *MP;
@@ -74,17 +80,24 @@ public:
void addGlobalMapping(const GlobalValue *GV, void *Addr) {
- void *&CurVal = GlobalAddress[GV];
+ void *&CurVal = GlobalAddressMap[GV];
assert((CurVal == 0 || Addr == 0) && "GlobalMapping already established!");
CurVal = Addr;
+
+ // If we are using the reverse mapping, add it too
+ if (!GlobalAddressReverseMap.empty()) {
+ const GlobalValue *&V = GlobalAddressReverseMap[Addr];
+ assert((V == 0 || GV == 0) && "GlobalMapping already established!");
+ V = GV;
+ }
}
/// getPointerToGlobalIfAvailable - This returns the address of the specified
/// global value if it is available, otherwise it returns null.
///
void *getPointerToGlobalIfAvailable(const GlobalValue *GV) {
- std::map<const GlobalValue*, void*>::iterator I = GlobalAddress.find(GV);
- return I != GlobalAddress.end() ? I->second : 0;
+ std::map<const GlobalValue*, void*>::iterator I = GlobalAddressMap.find(GV);
+ return I != GlobalAddressMap.end() ? I->second : 0;
}
/// getPointerToGlobal - This returns the address of the specified global
@@ -107,6 +120,12 @@ public:
return getPointerToFunction(F);
}
+ /// getGlobalValueAtAddress - Return the LLVM global value object that starts
+ /// at the specified address.
+ ///
+ const GlobalValue *getGlobalValueAtAddress(void *Addr);
+
+
void StoreValueToMemory(GenericValue Val, GenericValue *Ptr, const Type *Ty);
void InitializeMemory(const Constant *Init, void *Addr);
OpenPOWER on IntegriCloud