From 4aaeac6ad3e3bf8c33274b6daf67c1c0d917c5d1 Mon Sep 17 00:00:00 2001 From: Sean Silva Date: Wed, 9 Mar 2016 22:30:05 +0000 Subject: [PATCH] [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 --- lld/ELF/SymbolTable.cpp | 11 +++++++++++ lld/test/ELF/lto/save-temps.ll | 7 ++++--- 2 files changed, 15 insertions(+), 3 deletions(-) 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