Enable multi-threaded Quick compilation

Reuse thread-local copies of llvm context data for Quick compiler
(while continuing to regenerate fresh ones per method for Portable).
This is a transitional CL - the upcoming compiler driver change
is expected to pass pass a thread context structure to each compiler
worker thread rather than use the pthread_key mechanism.

Change-Id: I277920a5c2705748c3a9f37ceace53c903747ec2
diff --git a/src/compiler/codegen/MethodBitcode.cc b/src/compiler/codegen/MethodBitcode.cc
index 58678a0..cf07ea4 100644
--- a/src/compiler/codegen/MethodBitcode.cc
+++ b/src/compiler/codegen/MethodBitcode.cc
@@ -170,11 +170,20 @@
 }
 void initIR(CompilationUnit* cUnit)
 {
-  QuickCompiler* quick = cUnit->quick_compiler;
-  cUnit->context = quick->GetLLVMContext();
-  cUnit->module = quick->GetLLVMModule();
-  cUnit->intrinsic_helper = quick->GetIntrinsicHelper();
-  cUnit->irb = quick->GetIRBuilder();
+  LLVMInfo* llvmInfo = cUnit->llvm_info;
+  if (llvmInfo == NULL) {
+    CompilerTls* tls = cUnit->compiler->GetTls();
+    CHECK(tls != NULL);
+    llvmInfo = static_cast<LLVMInfo*>(tls->GetLLVMInfo());
+    if (llvmInfo == NULL) {
+      llvmInfo = new LLVMInfo();
+      tls->SetLLVMInfo(llvmInfo);
+    }
+  }
+  cUnit->context = llvmInfo->GetLLVMContext();
+  cUnit->module = llvmInfo->GetLLVMModule();
+  cUnit->intrinsic_helper = llvmInfo->GetIntrinsicHelper();
+  cUnit->irb = llvmInfo->GetIRBuilder();
 }
 
 const char* llvmSSAName(CompilationUnit* cUnit, int ssaReg) {