diff options
author | Chuck Rose III <cfr@adobe.com> | 2007-07-27 18:26:35 +0000 |
---|---|---|
committer | Chuck Rose III <cfr@adobe.com> | 2007-07-27 18:26:35 +0000 |
commit | 936baaa5aeddb78ff41b1f655101b4d88c47473b (patch) | |
tree | bdb4bb7687a121daf32ab68e13ac0f16da72bc78 /lib/ExecutionEngine/Interpreter | |
parent | 7c2c2e71edf27bd23fd37eb479caa6abf5a2c9cc (diff) | |
download | external_llvm-936baaa5aeddb78ff41b1f655101b4d88c47473b.zip external_llvm-936baaa5aeddb78ff41b1f655101b4d88c47473b.tar.gz external_llvm-936baaa5aeddb78ff41b1f655101b4d88c47473b.tar.bz2 |
VStudio compiler errors and placing Function*->ExFunc map under ManagedStatic control.
This commit fixes two things. One is a pair of VStudio compiler errors stemming from variables
which defined within the for loop statement and also within the body of the for loop. I fixed these
by renaming one of the two variables. Additionally, I've made the Function*->ExFunc map in
ExternalFunctions.cpp a ManagedStatic object, so that cleanup will be done on llvm_shutdown. In repeated
uses of the interpreter, where the same Function* address may get used for completely differnet functions,
this was causing a crash.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@40558 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/ExecutionEngine/Interpreter')
-rw-r--r-- | lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp b/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp index 14dcdf9..55391df 100644 --- a/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp +++ b/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp @@ -25,6 +25,7 @@ #include "llvm/Support/Streams.h" #include "llvm/System/DynamicLibrary.h" #include "llvm/Target/TargetData.h" +#include "llvm/Support/ManagedStatic.h" #include <csignal> #include <map> #include <cmath> @@ -33,7 +34,7 @@ using std::vector; using namespace llvm; typedef GenericValue (*ExFunc)(FunctionType *, const vector<GenericValue> &); -static std::map<const Function *, ExFunc> Functions; +static ManagedStatic<std::map<const Function *, ExFunc> > Functions; static std::map<std::string, ExFunc> FuncNames; static Interpreter *TheInterpreter; @@ -80,7 +81,7 @@ static ExFunc lookupFunction(const Function *F) { FnPtr = (ExFunc)(intptr_t) sys::DynamicLibrary::SearchForAddressOfSymbol(F->getName()); if (FnPtr != 0) - Functions.insert(std::make_pair(F, FnPtr)); // Cache for later + Functions->insert(std::make_pair(F, FnPtr)); // Cache for later return FnPtr; } @@ -90,8 +91,8 @@ GenericValue Interpreter::callExternalFunction(Function *F, // Do a lookup to see if the function is in our cache... this should just be a // deferred annotation! - std::map<const Function *, ExFunc>::iterator FI = Functions.find(F); - ExFunc Fn = (FI == Functions.end()) ? lookupFunction(F) : FI->second; + std::map<const Function *, ExFunc>::iterator FI = Functions->find(F); + ExFunc Fn = (FI == Functions->end()) ? lookupFunction(F) : FI->second; if (Fn == 0) { cerr << "Tried to execute an unknown external function: " << F->getType()->getDescription() << " " << F->getName() << "\n"; |