Make EngineBuilder return more error codes, by KS Sreeram.
authorChris Lattner <sabre@nondot.org>
Wed, 23 Sep 2009 01:46:04 +0000 (01:46 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 23 Sep 2009 01:46:04 +0000 (01:46 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@82600 91177308-0d34-0410-b5e6-96231b3b80d8

lib/ExecutionEngine/ExecutionEngine.cpp

index 5be3aa87e0a58e38f774f7d1009ab5a3a3a460b9..fa6209d2dff346817f613b009f2b60f16f79c9b1 100644 (file)
@@ -269,7 +269,8 @@ static void *CreateArgv(LLVMContext &C, ExecutionEngine *EE,
 /// runStaticConstructorsDestructors - This method is used to execute all of
 /// the static constructors or destructors for a module, depending on the
 /// value of isDtors.
-void ExecutionEngine::runStaticConstructorsDestructors(Module *module, bool isDtors) {
+void ExecutionEngine::runStaticConstructorsDestructors(Module *module,
+                                                       bool isDtors) {
   const char *Name = isDtors ? "llvm.global_dtors" : "llvm.global_ctors";
   
   // Execute global ctors/dtors for each module in the program.
@@ -425,30 +426,38 @@ ExecutionEngine *EngineBuilder::create() {
   // create, we assume they only want the JIT, and we fail if they only want
   // the interpreter.
   if (JMM) {
-    if (WhichEngine & EngineKind::JIT) {
+    if (WhichEngine & EngineKind::JIT)
       WhichEngine = EngineKind::JIT;
-    else {
+    else {
       *ErrorStr = "Cannot create an interpreter with a memory manager.";
+      return 0;
     }
   }
 
-  ExecutionEngine *EE = 0;
-
   // Unless the interpreter was explicitly selected or the JIT is not linked,
   // try making a JIT.
-  if (WhichEngine & EngineKind::JIT && ExecutionEngine::JITCtor) {
-    EE = ExecutionEngine::JITCtor(MP, ErrorStr, JMM, OptLevel,
-                                  AllocateGVsWithCode);
+  if (WhichEngine & EngineKind::JIT) {
+    if (ExecutionEngine::JITCtor) {
+      ExecutionEngine *EE =
+        ExecutionEngine::JITCtor(MP, ErrorStr, JMM, OptLevel,
+                                 AllocateGVsWithCode);
+      if (EE) return EE;
+    } else {
+      *ErrorStr = "JIT has not been linked in.";
+      return 0;
+    }
   }
 
   // If we can't make a JIT and we didn't request one specifically, try making
   // an interpreter instead.
-  if (WhichEngine & EngineKind::Interpreter && EE == 0 &&
-      ExecutionEngine::InterpCtor) {
-    EE = ExecutionEngine::InterpCtor(MP, ErrorStr);
+  if (WhichEngine & EngineKind::Interpreter) {
+    if (ExecutionEngine::InterpCtor)
+      return ExecutionEngine::InterpCtor(MP, ErrorStr);
+    *ErrorStr = "Interpreter has not been linked in.";
+    return 0;
   }
-
-  return EE;
+  
+  return 0;
 }
 
 /// getPointerToGlobal - This returns the address of the specified global