diff --git a/include/llvm/ExecutionEngine/ExecutionEngine.h b/include/llvm/ExecutionEngine/ExecutionEngine.h index edcddde2e39..d4fd0fb19b1 100644 --- a/include/llvm/ExecutionEngine/ExecutionEngine.h +++ b/include/llvm/ExecutionEngine/ExecutionEngine.h @@ -65,6 +65,7 @@ class ExecutionEngine { const TargetData *TD; ExecutionEngineState state; bool LazyCompilationDisabled; + bool GVCompilationDisabled; bool SymbolSearchingDisabled; protected: @@ -254,6 +255,16 @@ public: bool isLazyCompilationDisabled() const { return LazyCompilationDisabled; } + + /// DisableGVCompilation - If called, the JIT will abort if it's asked to allocate + /// space and populate a GlobalVariable. + void DisableGVCompilation(bool Disabled = true) { + GVCompilationDisabled = Disabled; + } + bool isGVCompilationDisabled() const { + return GVCompilationDisabled; + } + /// DisableSymbolSearching - If called, the JIT will not try to lookup unknown /// symbols with dlsym. A client can still use InstallLazyFunctionCreator to /// resolve symbols in a custom way. diff --git a/lib/ExecutionEngine/ExecutionEngine.cpp b/lib/ExecutionEngine/ExecutionEngine.cpp index 52a69eaea77..8cc2244272b 100644 --- a/lib/ExecutionEngine/ExecutionEngine.cpp +++ b/lib/ExecutionEngine/ExecutionEngine.cpp @@ -40,6 +40,7 @@ ExecutionEngine::EERegisterFn ExecutionEngine::ExceptionTableRegister = 0; ExecutionEngine::ExecutionEngine(ModuleProvider *P) : LazyFunctionCreator(0) { LazyCompilationDisabled = false; + GVCompilationDisabled = false; SymbolSearchingDisabled = false; Modules.push_back(P); assert(P && "ModuleProvider is null?"); diff --git a/lib/ExecutionEngine/JIT/JIT.cpp b/lib/ExecutionEngine/JIT/JIT.cpp index 39ecc2796c7..383b3804758 100644 --- a/lib/ExecutionEngine/JIT/JIT.cpp +++ b/lib/ExecutionEngine/JIT/JIT.cpp @@ -552,6 +552,10 @@ void *JIT::getOrEmitGlobalVariable(const GlobalVariable *GV) { addGlobalMapping(GV, Ptr); } } else { + if (isGVCompilationDisabled()) { + cerr << "Compilation of GlobalVariable is disabled!\n"; + abort(); + } // If the global hasn't been emitted to memory yet, allocate space and // emit it into memory. It goes in the same array as the generated // code, jump tables, etc.