[llvm-commits] CVS: llvm/lib/ExecutionEngine/ExecutionEngine.cpp

Chris Lattner lattner at cs.uiuc.edu
Wed Dec 31 14:22:03 PST 2003


Changes in directory llvm/lib/ExecutionEngine:

ExecutionEngine.cpp updated: 1.44 -> 1.45

---
Log message:

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.

Also modified some code to not access the GlobalAddress map directly.


---
Diffs of the changes:  (+21 -5)

Index: llvm/lib/ExecutionEngine/ExecutionEngine.cpp
diff -u llvm/lib/ExecutionEngine/ExecutionEngine.cpp:1.44 llvm/lib/ExecutionEngine/ExecutionEngine.cpp:1.45
--- llvm/lib/ExecutionEngine/ExecutionEngine.cpp:1.44	Sun Dec 28 03:44:36 2003
+++ llvm/lib/ExecutionEngine/ExecutionEngine.cpp	Wed Dec 31 14:21:04 2003
@@ -47,6 +47,21 @@
   delete MP;
 }
 
+/// getGlobalValueAtAddress - Return the LLVM global value object that starts
+/// at the specified address.
+///
+const GlobalValue *ExecutionEngine::getGlobalValueAtAddress(void *Addr) {
+  // If we haven't computed the reverse mapping yet, do so first.
+  if (GlobalAddressReverseMap.empty()) {
+    for (std::map<const GlobalValue*, void *>::iterator I = 
+           GlobalAddressMap.begin(), E = GlobalAddressMap.end(); I != E; ++I)
+      GlobalAddressReverseMap.insert(std::make_pair(I->second, I->first));
+  }
+
+  std::map<void *, const GlobalValue*>::iterator I =
+    GlobalAddressReverseMap.find(Addr);
+  return I != GlobalAddressReverseMap.end() ? I->second : 0;
+}
 
 // CreateArgv - Turn a vector of strings into a nice argv style array of
 // pointers to null terminated strings.
@@ -133,8 +148,8 @@
   if (Function *F = const_cast<Function*>(dyn_cast<Function>(GV)))
     return getPointerToFunction(F);
 
-  assert(GlobalAddress[GV] && "Global hasn't had an address allocated yet?");
-  return GlobalAddress[GV];
+  assert(GlobalAddressMap[GV] && "Global hasn't had an address allocated yet?");
+  return GlobalAddressMap[GV];
 }
 
 /// FIXME: document
@@ -435,12 +450,12 @@
       addGlobalMapping(I, new char[Size]);
 
       DEBUG(std::cerr << "Global '" << I->getName() << "' -> "
-                      << (void*)GlobalAddress[I] << "\n");
+                      << getPointerToGlobal(I) << "\n");
     } else {
       // External variable reference. Try to use the dynamic loader to
       // get a pointer to it.
       if (void *SymAddr = GetAddressOfSymbol(I->getName().c_str()))
-        GlobalAddress[I] = SymAddr;
+        addGlobalMapping(I, SymAddr);
       else {
         std::cerr << "Could not resolve external global address: "
                   << I->getName() << "\n";
@@ -460,11 +475,12 @@
 // address specified in GlobalAddresses, or allocates new memory if it's not
 // already in the map.
 void ExecutionEngine::EmitGlobalVariable(const GlobalVariable *GV) {
-  void *&GA = GlobalAddress[GV];
+  void *GA = getPointerToGlobalIfAvailable(GV);
   const Type *ElTy = GV->getType()->getElementType();
   if (GA == 0) {
     // If it's not already specified, allocate memory for the global.
     GA = new char[getTargetData().getTypeSize(ElTy)];
+    addGlobalMapping(GV, GA);
   }
 
   InitializeMemory(GV->getInitializer(), GA);





More information about the llvm-commits mailing list