Index: lld/trunk/ELF/SymbolTable.cpp =================================================================== --- lld/trunk/ELF/SymbolTable.cpp +++ lld/trunk/ELF/SymbolTable.cpp @@ -96,6 +96,15 @@ 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 @@ fatal("Failed to setup codegen"); CodeGenPasses.run(M); LtoBuffer = MemoryBuffer::getMemBuffer(OwningLTOData, "", false); + if (Config->SaveTemps) + saveLtoObjectFile(LtoBuffer->getBuffer()); return createObjectFile(*LtoBuffer); } Index: lld/trunk/test/ELF/lto/save-temps.ll =================================================================== --- lld/trunk/test/ELF/lto/save-temps.ll +++ lld/trunk/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 @@ ret void } -; CHECK-DAG: T bar -; CHECK-DAG: T foo +; CHECK: T bar +; CHECK: T foo