diff --git a/lld/ELF/SymbolTable.cpp b/lld/ELF/SymbolTable.cpp index 9334f213054d..da8ed440d797 100644 --- a/lld/ELF/SymbolTable.cpp +++ b/lld/ELF/SymbolTable.cpp @@ -96,6 +96,15 @@ void SymbolTable::addFile(std::unique_ptr File) { 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. template std::unique_ptr SymbolTable::codegen(Module &M) { @@ -123,6 +132,8 @@ std::unique_ptr SymbolTable::codegen(Module &M) { fatal("Failed to setup codegen"); CodeGenPasses.run(M); LtoBuffer = MemoryBuffer::getMemBuffer(OwningLTOData, "", false); + if (Config->SaveTemps) + saveLtoObjectFile(LtoBuffer->getBuffer()); return createObjectFile(*LtoBuffer); } diff --git a/lld/test/ELF/lto/save-temps.ll b/lld/test/ELF/lto/save-temps.ll index 54ffa0807a1d..2764095ff311 100644 --- a/lld/test/ELF/lto/save-temps.ll +++ b/lld/test/ELF/lto/save-temps.ll @@ -1,10 +1,11 @@ ; 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 %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: llvm-nm %t.so | 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 datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" @@ -13,5 +14,5 @@ define void @foo() { ret void } -; CHECK-DAG: T bar -; CHECK-DAG: T foo +; CHECK: T bar +; CHECK: T foo