[lto] Add saving the LTO .o file to -save-temps.

Summary:
This implements another part of -save-temps.
After this, the only remaining part is dumping the optimized bitcode. But
currently LLD's LTO doesn't have a non-intrusive place to put this.
Eventually we probably will and it will make sense to add it then.

Reviewers: ruiu, rafael

Subscribers: joker.eph, Bigcheese, llvm-commits

Differential Revision: http://reviews.llvm.org/D18009

llvm-svn: 263070
This commit is contained in:
Sean Silva 2016-03-09 22:30:05 +00:00
parent 9f6c4d50b4
commit 4aaeac6ad3
2 changed files with 15 additions and 3 deletions

View File

@ -96,6 +96,15 @@ void SymbolTable<ELFT>::addFile(std::unique_ptr<InputFile> File) {
resolve(B); resolve(B);
} }
// This is for use when debugging LTO.
static void saveLtoObjectFile(StringRef Buffer) {
std::error_code EC;
raw_fd_ostream OS(Config->OutputFile.str() + ".lto.o", EC,
sys::fs::OpenFlags::F_None);
check(EC);
OS << Buffer;
}
// Codegen the module M and returns the resulting InputFile. // Codegen the module M and returns the resulting InputFile.
template <class ELFT> template <class ELFT>
std::unique_ptr<InputFile> SymbolTable<ELFT>::codegen(Module &M) { std::unique_ptr<InputFile> SymbolTable<ELFT>::codegen(Module &M) {
@ -123,6 +132,8 @@ std::unique_ptr<InputFile> SymbolTable<ELFT>::codegen(Module &M) {
fatal("Failed to setup codegen"); fatal("Failed to setup codegen");
CodeGenPasses.run(M); CodeGenPasses.run(M);
LtoBuffer = MemoryBuffer::getMemBuffer(OwningLTOData, "", false); LtoBuffer = MemoryBuffer::getMemBuffer(OwningLTOData, "", false);
if (Config->SaveTemps)
saveLtoObjectFile(LtoBuffer->getBuffer());
return createObjectFile(*LtoBuffer); return createObjectFile(*LtoBuffer);
} }

View File

@ -1,10 +1,11 @@
; REQUIRES: x86 ; REQUIRES: x86
; RUN: rm -f %t.so %t.so.lto.bc ; RUN: rm -f %t.so %t.so.lto.bc %t.so.lto.o
; RUN: llvm-as %s -o %t.o ; RUN: llvm-as %s -o %t.o
; RUN: llvm-as %p/Inputs/save-temps.ll -o %t2.o ; RUN: llvm-as %p/Inputs/save-temps.ll -o %t2.o
; RUN: ld.lld -shared -m elf_x86_64 %t.o %t2.o -o %t.so -save-temps ; RUN: ld.lld -shared -m elf_x86_64 %t.o %t2.o -o %t.so -save-temps
; RUN: llvm-nm %t.so | FileCheck %s ; RUN: llvm-nm %t.so | FileCheck %s
; RUN: llvm-nm %t.so.lto.bc | FileCheck %s ; RUN: llvm-nm %t.so.lto.bc | FileCheck %s
; RUN: llvm-nm %t.so.lto.o | FileCheck %s
target triple = "x86_64-unknown-linux-gnu" target triple = "x86_64-unknown-linux-gnu"
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
@ -13,5 +14,5 @@ define void @foo() {
ret void ret void
} }
; CHECK-DAG: T bar ; CHECK: T bar
; CHECK-DAG: T foo ; CHECK: T foo