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;