Make ExecutionEngine::updateGlobalMapping return the old mapping.
authorChris Lattner <sabre@nondot.org>
Fri, 4 Apr 2008 04:47:41 +0000 (04:47 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 4 Apr 2008 04:47:41 +0000 (04:47 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@49206 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/ExecutionEngine/ExecutionEngine.h
lib/ExecutionEngine/ExecutionEngine.cpp

index 461efe3235aac4cf6cfe2aaf9158520f437d2719..1a6cdba7ea297486cc383e9953f3d0a888b90a6b 100644 (file)
@@ -96,9 +96,9 @@ public:
   /// any of those classes.
   sys::Mutex lock; // Used to make this class and subclasses thread-safe
 
-  //===----------------------------------------------------------------------===//
+  //===--------------------------------------------------------------------===//
   //  ExecutionEngine Startup
-  //===----------------------------------------------------------------------===//
+  //===--------------------------------------------------------------------===//
 
   virtual ~ExecutionEngine();
 
@@ -176,8 +176,9 @@ public:
   
   /// updateGlobalMapping - Replace an existing mapping for GV with a new
   /// address.  This updates both maps as required.  If "Addr" is null, the
-  /// entry for the global is removed from the mappings.
-  void updateGlobalMapping(const GlobalValue *GV, void *Addr);
+  /// entry for the global is removed from the mappings.  This returns the old
+  /// value of the pointer, or null if it was not in the map.
+  void *updateGlobalMapping(const GlobalValue *GV, void *Addr);
   
   /// getPointerToGlobalIfAvailable - This returns the address of the specified
   /// global value if it is has already been codegen'd, otherwise it returns
@@ -211,7 +212,8 @@ public:
   const GlobalValue *getGlobalValueAtAddress(void *Addr);
 
 
-  void StoreValueToMemory(const GenericValue &Val, GenericValue *Ptr, const Type *Ty);
+  void StoreValueToMemory(const GenericValue &Val, GenericValue *Ptr,
+                          const Type *Ty);
   void InitializeMemory(const Constant *Init, void *Addr);
 
   /// recompileAndRelinkFunction - This method is used to force a function
index 6c04e868622c00f46a8c8e8d9253cf1133acd1b6..a56951d2c5269ab13131331e10f05ef27a8972d9 100644 (file)
@@ -109,18 +109,30 @@ void ExecutionEngine::clearAllGlobalMappings() {
 /// updateGlobalMapping - Replace an existing mapping for GV with a new
 /// address.  This updates both maps as required.  If "Addr" is null, the
 /// entry for the global is removed from the mappings.
-void ExecutionEngine::updateGlobalMapping(const GlobalValue *GV, void *Addr) {
+void *ExecutionEngine::updateGlobalMapping(const GlobalValue *GV, void *Addr) {
   MutexGuard locked(lock);
-  
+
+  std::map<const GlobalValue*, void *> &Map = state.getGlobalAddressMap(locked);
+
   // Deleting from the mapping?
   if (Addr == 0) {
-    state.getGlobalAddressMap(locked).erase(GV);
+    std::map<const GlobalValue*, void *>::iterator I = Map.find(GV);
+    void *OldVal;
+    if (I == Map.end())
+      OldVal = 0;
+    else {
+      OldVal = I->second;
+      Map.erase(I); 
+    }
+    
     if (!state.getGlobalAddressReverseMap(locked).empty())
       state.getGlobalAddressReverseMap(locked).erase(Addr);
-    return;
+    return OldVal;
   }
   
-  void *&CurVal = state.getGlobalAddressMap(locked)[GV];
+  void *&CurVal = Map[GV];
+  void *OldVal = CurVal;
+
   if (CurVal && !state.getGlobalAddressReverseMap(locked).empty())
     state.getGlobalAddressReverseMap(locked).erase(CurVal);
   CurVal = Addr;
@@ -131,6 +143,7 @@ void ExecutionEngine::updateGlobalMapping(const GlobalValue *GV, void *Addr) {
     assert((V == 0 || GV == 0) && "GlobalMapping already established!");
     V = GV;
   }
+  return OldVal;
 }
 
 /// getPointerToGlobalIfAvailable - This returns the address of the specified