From f4cc3096fd893cdef5b5c2664ebff8c13a07ad51 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Fri, 4 Apr 2008 04:47:41 +0000 Subject: [PATCH] Make ExecutionEngine::updateGlobalMapping return the old mapping. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@49206 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../llvm/ExecutionEngine/ExecutionEngine.h | 12 ++++++---- lib/ExecutionEngine/ExecutionEngine.cpp | 23 +++++++++++++++---- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/include/llvm/ExecutionEngine/ExecutionEngine.h b/include/llvm/ExecutionEngine/ExecutionEngine.h index 461efe3235a..1a6cdba7ea2 100644 --- a/include/llvm/ExecutionEngine/ExecutionEngine.h +++ b/include/llvm/ExecutionEngine/ExecutionEngine.h @@ -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 diff --git a/lib/ExecutionEngine/ExecutionEngine.cpp b/lib/ExecutionEngine/ExecutionEngine.cpp index 6c04e868622..a56951d2c52 100644 --- a/lib/ExecutionEngine/ExecutionEngine.cpp +++ b/lib/ExecutionEngine/ExecutionEngine.cpp @@ -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 &Map = state.getGlobalAddressMap(locked); + // Deleting from the mapping? if (Addr == 0) { - state.getGlobalAddressMap(locked).erase(GV); + std::map::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