Add bitcode dumping to LlvmCompilationUnit

Change-Id: I6d3492c00d0f0c1c56b64a4b431a3e7b48d7a583
diff --git a/src/compiler/llvm/llvm_compilation_unit.cc b/src/compiler/llvm/llvm_compilation_unit.cc
index 41c603f..94dfe72 100644
--- a/src/compiler/llvm/llvm_compilation_unit.cc
+++ b/src/compiler/llvm/llvm_compilation_unit.cc
@@ -136,22 +136,45 @@
 }
 
 
+static std::string DumpDirectory() {
+  if (kIsTargetBuild) {
+    return GetArtCacheOrDie(GetAndroidData());
+  }
+  return "/tmp";
+}
+
+void LlvmCompilationUnit::DumpBitcodeToFile() {
+  std::string bitcode;
+  DumpBitcodeToString(bitcode);
+  std::string filename(StringPrintf("%s/Art%u.bc", DumpDirectory().c_str(), cunit_id_));
+  UniquePtr<File> output(OS::OpenFile(filename.c_str(), true));
+  output->WriteFully(bitcode.data(), bitcode.size());
+  LOG(INFO) << ".bc file written successfully: " << filename;
+}
+
+void LlvmCompilationUnit::DumpBitcodeToString(std::string& str_buffer) {
+  ::llvm::raw_string_ostream str_os(str_buffer);
+  ::llvm::WriteBitcodeToFile(module_, str_os);
+}
+
 bool LlvmCompilationUnit::Materialize() {
+
+  const bool kDumpBitcode = false;
+  if (kDumpBitcode) {
+    // Dump the bitcode for debugging
+    DumpBitcodeToFile();
+  }
+
   // Compile and prelink ::llvm::Module
   if (!MaterializeToString(elf_object_)) {
     LOG(ERROR) << "Failed to materialize compilation unit " << cunit_id_;
     return false;
   }
 
-  if (false) {
+  const bool kDumpELF = false;
+  if (kDumpELF) {
     // Dump the ELF image for debugging
-    std::string directory;
-    if (kIsTargetBuild) {
-      directory += GetArtCacheOrDie(GetAndroidData());
-    } else {
-      directory += "/tmp";
-    }
-    std::string filename(StringPrintf("%s/Art%u.o", directory.c_str(), cunit_id_));
+    std::string filename(StringPrintf("%s/Art%u.o", DumpDirectory().c_str(), cunit_id_));
     UniquePtr<File> output(OS::OpenFile(filename.c_str(), true));
     output->WriteFully(elf_object_.data(), elf_object_.size());
     LOG(INFO) << ".o file written successfully: " << filename;