Fix memory corruption due to premature llvm_shutdown().

Under LLVM, multiple compiler-related gtests randomly crashes from time
to time, because common_test.h has code to new multiple compiler
instances. Multiple CompilerLLVM instances may cause crash if one
shuts down LLVM prematurely.

This fix uses static class member. Destructor is where we shut
down LLVM.

Change-Id: Ied371794af7ca9eb2c9fe6b278fd779a61a4a753
diff --git a/src/compiler_llvm/compiler_llvm.cc b/src/compiler_llvm/compiler_llvm.cc
index b2a6d28..6646b19 100644
--- a/src/compiler_llvm/compiler_llvm.cc
+++ b/src/compiler_llvm/compiler_llvm.cc
@@ -41,11 +41,10 @@
 // ARMISelLowering.cpp, however, it is not in the llvm namespace.
 
 
-namespace {
+namespace art {
+namespace compiler_llvm {
 
-pthread_once_t llvm_initialized = PTHREAD_ONCE_INIT;
-
-void InitializeLLVM() {
+CompilerLLVM::LLVMInitializer::LLVMInitializer() {
   // NOTE: Uncomment following line to show the time consumption of LLVM passes
   //llvm::TimePassesIsEnabled = true;
 
@@ -76,11 +75,13 @@
   llvm::llvm_start_multithreaded();
 }
 
-} // anonymous namespace
+CompilerLLVM::LLVMInitializer::~LLVMInitializer() {
+  llvm::llvm_shutdown();
+}
 
-
-namespace art {
-namespace compiler_llvm {
+// Singleton. Otherwise, multiple CompilerLLVM instances may cause crashes if
+// one shuts down prematurely.
+CompilerLLVM::LLVMInitializer CompilerLLVM::llvm_initialize_guard;
 
 
 llvm::Module* makeLLVMModuleContents(llvm::Module* module);
@@ -89,20 +90,15 @@
 CompilerLLVM::CompilerLLVM(Compiler* compiler, InstructionSet insn_set)
     : compiler_(compiler), compiler_lock_("llvm_compiler_lock"),
       insn_set_(insn_set), curr_cunit_(NULL) {
-
-  // Initialize LLVM libraries
-  pthread_once(&llvm_initialized, InitializeLLVM);
 }
 
 
 CompilerLLVM::~CompilerLLVM() {
   STLDeleteElements(&cunits_);
-  llvm::llvm_shutdown();
 }
 
 
 void CompilerLLVM::EnsureCompilationUnit() {
-  DCHECK_NE(llvm_initialized, PTHREAD_ONCE_INIT);
   compiler_lock_.AssertHeld();
 
   if (curr_cunit_ != NULL) {
diff --git a/src/compiler_llvm/compiler_llvm.h b/src/compiler_llvm/compiler_llvm.h
index 7481c8c..6332fb3 100644
--- a/src/compiler_llvm/compiler_llvm.h
+++ b/src/compiler_llvm/compiler_llvm.h
@@ -107,6 +107,13 @@
 
   std::string bitcode_filename_;
 
+  class LLVMInitializer {
+   public:
+    LLVMInitializer();
+    ~LLVMInitializer();
+  };
+  static LLVMInitializer llvm_initialize_guard;
+
   DISALLOW_COPY_AND_ASSIGN(CompilerLLVM);
 };