lli: avoid global variables, use a local unique_ptr instead
There was issue with order of destruction in some cases. From: Mehdi Amini <mehdi.amini@apple.com> llvm-svn: 266652
This commit is contained in:
parent
fece67402c
commit
a7de820a20
|
@ -312,27 +312,12 @@ private:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static LLVMContext Context;
|
|
||||||
static ExecutionEngine *EE = nullptr;
|
|
||||||
static LLIObjectCache *CacheManager = nullptr;
|
|
||||||
|
|
||||||
static void do_shutdown() {
|
|
||||||
// Cygwin-1.5 invokes DLL's dtors before atexit handler.
|
|
||||||
#ifndef DO_NOTHING_ATEXIT
|
|
||||||
delete EE;
|
|
||||||
if (CacheManager)
|
|
||||||
delete CacheManager;
|
|
||||||
llvm_shutdown();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
// On Mingw and Cygwin, an external symbol named '__main' is called from the
|
// On Mingw and Cygwin, an external symbol named '__main' is called from the
|
||||||
// generated 'main' function to allow static intialization. To avoid linking
|
// generated 'main' function to allow static intialization. To avoid linking
|
||||||
// problems with remote targets (because lli's remote target support does not
|
// problems with remote targets (because lli's remote target support does not
|
||||||
// currently handle external linking) we add a secondary module which defines
|
// currently handle external linking) we add a secondary module which defines
|
||||||
// an empty '__main' function.
|
// an empty '__main' function.
|
||||||
static void addCygMingExtraModule(ExecutionEngine *EE,
|
static void addCygMingExtraModule(ExecutionEngine &EE, LLVMContext &Context,
|
||||||
LLVMContext &Context,
|
|
||||||
StringRef TargetTripleStr) {
|
StringRef TargetTripleStr) {
|
||||||
IRBuilder<> Builder(Context);
|
IRBuilder<> Builder(Context);
|
||||||
Triple TargetTriple(TargetTripleStr);
|
Triple TargetTriple(TargetTripleStr);
|
||||||
|
@ -362,7 +347,7 @@ static void addCygMingExtraModule(ExecutionEngine *EE,
|
||||||
Builder.CreateRet(ReturnVal);
|
Builder.CreateRet(ReturnVal);
|
||||||
|
|
||||||
// Add this new module to the ExecutionEngine.
|
// Add this new module to the ExecutionEngine.
|
||||||
EE->addModule(std::move(M));
|
EE.addModule(std::move(M));
|
||||||
}
|
}
|
||||||
|
|
||||||
CodeGenOpt::Level getOptLevel() {
|
CodeGenOpt::Level getOptLevel() {
|
||||||
|
@ -386,7 +371,7 @@ int main(int argc, char **argv, char * const *envp) {
|
||||||
sys::PrintStackTraceOnErrorSignal();
|
sys::PrintStackTraceOnErrorSignal();
|
||||||
PrettyStackTraceProgram X(argc, argv);
|
PrettyStackTraceProgram X(argc, argv);
|
||||||
|
|
||||||
atexit(do_shutdown); // Call llvm_shutdown() on exit.
|
atexit(llvm_shutdown); // Call llvm_shutdown() on exit.
|
||||||
|
|
||||||
// If we have a native target, initialize it to ensure it is linked in and
|
// If we have a native target, initialize it to ensure it is linked in and
|
||||||
// usable by the JIT.
|
// usable by the JIT.
|
||||||
|
@ -401,6 +386,8 @@ int main(int argc, char **argv, char * const *envp) {
|
||||||
if (DisableCoreFiles)
|
if (DisableCoreFiles)
|
||||||
sys::Process::PreventCoreFiles();
|
sys::Process::PreventCoreFiles();
|
||||||
|
|
||||||
|
LLVMContext Context;
|
||||||
|
|
||||||
// Load the bitcode...
|
// Load the bitcode...
|
||||||
SMDiagnostic Err;
|
SMDiagnostic Err;
|
||||||
std::unique_ptr<Module> Owner = parseIRFile(InputFile, Err, Context);
|
std::unique_ptr<Module> Owner = parseIRFile(InputFile, Err, Context);
|
||||||
|
@ -471,7 +458,7 @@ int main(int argc, char **argv, char * const *envp) {
|
||||||
|
|
||||||
builder.setTargetOptions(Options);
|
builder.setTargetOptions(Options);
|
||||||
|
|
||||||
EE = builder.create();
|
std::unique_ptr<ExecutionEngine> EE(builder.create());
|
||||||
if (!EE) {
|
if (!EE) {
|
||||||
if (!ErrorMsg.empty())
|
if (!ErrorMsg.empty())
|
||||||
errs() << argv[0] << ": error creating EE: " << ErrorMsg << "\n";
|
errs() << argv[0] << ": error creating EE: " << ErrorMsg << "\n";
|
||||||
|
@ -480,9 +467,10 @@ int main(int argc, char **argv, char * const *envp) {
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::unique_ptr<LLIObjectCache> CacheManager;
|
||||||
if (EnableCacheManager) {
|
if (EnableCacheManager) {
|
||||||
CacheManager = new LLIObjectCache(ObjectCacheDir);
|
CacheManager.reset(new LLIObjectCache(ObjectCacheDir));
|
||||||
EE->setObjectCache(CacheManager);
|
EE->setObjectCache(CacheManager.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load any additional modules specified on the command line.
|
// Load any additional modules specified on the command line.
|
||||||
|
@ -538,7 +526,7 @@ int main(int argc, char **argv, char * const *envp) {
|
||||||
// If the target is Cygwin/MingW and we are generating remote code, we
|
// If the target is Cygwin/MingW and we are generating remote code, we
|
||||||
// need an extra module to help out with linking.
|
// need an extra module to help out with linking.
|
||||||
if (RemoteMCJIT && Triple(Mod->getTargetTriple()).isOSCygMing()) {
|
if (RemoteMCJIT && Triple(Mod->getTargetTriple()).isOSCygMing()) {
|
||||||
addCygMingExtraModule(EE, Context, Mod->getTargetTriple());
|
addCygMingExtraModule(*EE, Context, Mod->getTargetTriple());
|
||||||
}
|
}
|
||||||
|
|
||||||
// The following functions have no effect if their respective profiling
|
// The following functions have no effect if their respective profiling
|
||||||
|
@ -707,8 +695,7 @@ int main(int argc, char **argv, char * const *envp) {
|
||||||
// Delete the EE - we need to tear it down *before* we terminate the session
|
// Delete the EE - we need to tear it down *before* we terminate the session
|
||||||
// with the remote, otherwise it'll crash when it tries to release resources
|
// with the remote, otherwise it'll crash when it tries to release resources
|
||||||
// on a remote that has already been disconnected.
|
// on a remote that has already been disconnected.
|
||||||
delete EE;
|
EE.reset();
|
||||||
EE = nullptr;
|
|
||||||
|
|
||||||
// Signal the remote target that we're done JITing.
|
// Signal the remote target that we're done JITing.
|
||||||
R->terminateSession();
|
R->terminateSession();
|
||||||
|
|
Loading…
Reference in New Issue