forked from OSchip/llvm-project
[lto] Add beginning of -save-temps option.
Summary: This is useful for debugging issues with LTO. The option follows the analogous option in ld64 and the gold plugin (per Rafael's suggestion). For starters, this only dumps the combined bitcode file. In a future patch I will add dumping for the .o file. The naming of the output follows ld64's convention which is slightly more consistent IMO (consistent `.lto.<extension>` for all the files). Reviewers: rafael, ruiu Subscribers: joker.eph, Bigcheese, llvm-commits Differential Revision: http://reviews.llvm.org/D18006 llvm-svn: 263055
This commit is contained in:
parent
669aaccb89
commit
35ef3d95eb
|
|
@ -69,6 +69,7 @@ struct Configuration {
|
|||
bool NoinhibitExec;
|
||||
bool PrintGcSections;
|
||||
bool Relocatable;
|
||||
bool SaveTemps;
|
||||
bool Shared;
|
||||
bool Static = false;
|
||||
bool StripAll;
|
||||
|
|
|
|||
|
|
@ -239,6 +239,7 @@ void LinkerDriver::readConfigs(opt::InputArgList &Args) {
|
|||
Config->NoinhibitExec = Args.hasArg(OPT_noinhibit_exec);
|
||||
Config->PrintGcSections = Args.hasArg(OPT_print_gc_sections);
|
||||
Config->Relocatable = Args.hasArg(OPT_relocatable);
|
||||
Config->SaveTemps = Args.hasArg(OPT_save_temps);
|
||||
Config->Shared = Args.hasArg(OPT_shared);
|
||||
Config->StripAll = Args.hasArg(OPT_strip_all);
|
||||
Config->Verbose = Args.hasArg(OPT_verbose);
|
||||
|
|
|
|||
|
|
@ -182,3 +182,6 @@ def G : Separate<["-"], "G">;
|
|||
|
||||
// Aliases for ignored options
|
||||
def alias_version_script_version_script : Joined<["--"], "version-script=">, Alias<version_script>;
|
||||
|
||||
// Debugging options
|
||||
def save_temps : Flag<["-"], "save-temps">;
|
||||
|
|
|
|||
|
|
@ -147,6 +147,13 @@ static void addBitcodeFile(IRMover &Mover, BitcodeFile &F,
|
|||
Mover.move(std::move(M), Keep, [](GlobalValue &, IRMover::ValueAdder) {});
|
||||
}
|
||||
|
||||
static void saveBCFile(std::string Path, Module &M) {
|
||||
std::error_code EC;
|
||||
raw_fd_ostream OS(Path, EC, sys::fs::OpenFlags::F_None);
|
||||
check(EC);
|
||||
WriteBitcodeToFile(&M, OS, /* ShouldPreserveUseListOrder */ true);
|
||||
}
|
||||
|
||||
// Merge all the bitcode files we have seen, codegen the result and return
|
||||
// the resulting ObjectFile.
|
||||
template <class ELFT>
|
||||
|
|
@ -156,6 +163,8 @@ ObjectFile<ELFT> *SymbolTable<ELFT>::createCombinedLtoObject() {
|
|||
IRMover Mover(Combined);
|
||||
for (const std::unique_ptr<BitcodeFile> &F : BitcodeFiles)
|
||||
addBitcodeFile(Mover, *F, Context);
|
||||
if (Config->SaveTemps)
|
||||
saveBCFile(Config->OutputFile.str() + ".lto.bc", Combined);
|
||||
std::unique_ptr<InputFile> F = codegen(Combined);
|
||||
ObjectFiles.emplace_back(cast<ObjectFile<ELFT>>(F.release()));
|
||||
return &*ObjectFiles.back();
|
||||
|
|
|
|||
|
|
@ -0,0 +1,6 @@
|
|||
target triple = "x86_64-unknown-linux-gnu"
|
||||
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
||||
|
||||
define void @bar() {
|
||||
ret void
|
||||
}
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
; REQUIRES: x86
|
||||
; RUN: rm -f %t.so %t.so.lto.bc
|
||||
; 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
|
||||
|
||||
target triple = "x86_64-unknown-linux-gnu"
|
||||
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
||||
|
||||
define void @foo() {
|
||||
ret void
|
||||
}
|
||||
|
||||
; CHECK-DAG: T bar
|
||||
; CHECK-DAG: T foo
|
||||
Loading…
Reference in New Issue