Make compiler class reentrant within a single process

Change-Id: I422947bbbf8667234794737d6632449ed4e5f193
diff --git a/bcc.cpp b/bcc.cpp
index 08328dc..89e33ea 100644
--- a/bcc.cpp
+++ b/bcc.cpp
@@ -2532,6 +2532,7 @@
 
  public:
   Compiler() : mpSymbolLookupFn(NULL), mpSymbolLookupContext(NULL), mModule(NULL) {
+    llvm::remove_fatal_error_handler();
     llvm::install_fatal_error_handler(LLVMErrorHandler, &mError);
     return;
   }
@@ -2831,7 +2832,7 @@
 
   ~Compiler() {
     delete mModule;
-    llvm::llvm_shutdown();
+    //llvm::llvm_shutdown();
     return;
   }
 };  /* End of Class Compiler */
diff --git a/tests/main.cpp b/tests/main.cpp
index 1007b94..e73a8d3 100644
--- a/tests/main.cpp
+++ b/tests/main.cpp
@@ -23,12 +23,12 @@
 
 typedef int (*MainPtr)(int, char**);
 // This is a separate function so it can easily be set by breakpoint in gdb.
-static int run(MainPtr mainFunc, int argc, char** argv) 
+static int run(MainPtr mainFunc, int argc, char** argv)
 {
   return mainFunc(argc, argv);
 }
 
-static BCCvoid* symbolLookup(BCCvoid* pContext, const BCCchar* name) 
+static BCCvoid* symbolLookup(BCCvoid* pContext, const BCCchar* name)
 {
   return (BCCvoid*) dlsym(RTLD_DEFAULT, name);
 }
@@ -85,7 +85,7 @@
       }
     }
     delete[] labels;
-  }   
+  }
 
   return 1;
 }
@@ -158,7 +158,7 @@
 
     switch(c) {
       case 'R':
-        runResults = true; 
+        runResults = true;
         break;
 
       case 'S':
@@ -211,7 +211,7 @@
   rewind(in);
   BCCchar* bitcode = new BCCchar[codeSize + 1];
   size_t bytesRead = fread(bitcode, 1, codeSize, in);
-  if (bytesRead != codeSize) 
+  if (bytesRead != codeSize)
       fprintf(stderr, "Could not read all of file %s\n", inFile);
 
   BCCscript* script = bccCreateScript();
@@ -232,17 +232,17 @@
   if (result != 0) {
     BCCsizei bufferLength;
     bccGetScriptInfoLog(script, 0, &bufferLength, NULL);
-    char* buf = (char*) malloc(bufferLength + 1); 
+    char* buf = (char*) malloc(bufferLength + 1);
     if (buf != NULL) {
         bccGetScriptInfoLog(script, bufferLength + 1, NULL, buf);
         fprintf(stderr, "%s", buf);
         free(buf);
     } else {
         fprintf(stderr, "Out of memory.\n");
-    }   
+    }
     bccDeleteScript(script);
     return 0;
-  }   
+  }
 
   {
     BCCsizei numPragmaStrings;
@@ -250,7 +250,7 @@
     if (numPragmaStrings) {
       char** strings = new char*[numPragmaStrings];
       bccGetPragmas(script, NULL, numPragmaStrings, strings);
-      for(BCCsizei i = 0; i < numPragmaStrings; i += 2) 
+      for(BCCsizei i = 0; i < numPragmaStrings; i += 2)
         fprintf(stderr, "#pragma %s(%s)\n", strings[i], strings[i+1]);
       delete[] strings;
     }
@@ -262,11 +262,11 @@
 static int runMain(BCCscript* script, int argc, char** argv) {
   MainPtr mainPointer = 0;
 
-  bccGetScriptLabel(script, "main", (BCCvoid**) &mainPointer);
+  bccGetScriptLabel(script, "root", (BCCvoid**) &mainPointer);
 
   int result = bccGetError(script);
   if (result != BCC_NO_ERROR) {
-    fprintf(stderr, "Could not find main: %d\n", result);
+    fprintf(stderr, "Could not find root: %d\n", result);
   } else {
     fprintf(stderr, "Executing compiled code:\n");
     int codeArgc = argc - optind;
@@ -274,13 +274,13 @@
     //codeArgv[0] = (char*) (inFile ? inFile : "stdin");
     result = run(mainPointer, codeArgc, codeArgv);
     fprintf(stderr, "result: %d\n", result);
-  }   
+  }
 
   return 1;
 
 }
 
-int main(int argc, char** argv) 
+int main(int argc, char** argv)
 {
   int result = 0;
   BCCscript* script;
@@ -288,7 +288,7 @@
   if(!parseOption(argc, argv)) {
     result = 1;
     fprintf(stderr, "failed to parse option\n");
-    goto exit; 
+    goto exit;
   }
 
   if((script = loadScript()) == NULL) {