From cbf870d3b1118dfe60236acbcc31878e14df72d6 Mon Sep 17 00:00:00 2001 From: Tobias Edler von Koch Date: Fri, 20 Nov 2015 00:13:05 +0000 Subject: [PATCH] [LTO] Add options to llvm-lto to select output format and dump merged module This introduces two new options: - "llvm-lto -save-merged-module -o outfile" dumps the LTO Module to outfile.merged.bc prior to CodeGen and after LTO optimizations have been run. - "llvm-lto -filetype=asm -o outfile" makes llvm-lto emit assembly instead of object code in outfile. Both are intended for use in lit tests. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@253624 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/LTO/X86/llvm-lto-output.ll | 21 +++++++++++++++++++++ tools/llvm-lto/llvm-lto.cpp | 23 +++++++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 test/LTO/X86/llvm-lto-output.ll diff --git a/test/LTO/X86/llvm-lto-output.ll b/test/LTO/X86/llvm-lto-output.ll new file mode 100644 index 00000000000..56a9a5284b1 --- /dev/null +++ b/test/LTO/X86/llvm-lto-output.ll @@ -0,0 +1,21 @@ +; Test the various output formats of the llvm-lto utility +; +; RUN: llvm-as < %s > %t1 +; +; RUN: llvm-lto -exported-symbol=main -save-merged-module -filetype=asm -o %t2 %t1 +; RUN: llvm-dis -o - %t2.merged.bc | FileCheck %s +; CHECK: @main() + +; RUN: FileCheck --check-prefix=ASM %s < %t2 +; RUN: llvm-lto -exported-symbol=main -filetype=obj -o %t2 %t1 +; RUN: llvm-objdump -d %t2 | FileCheck --check-prefix=ASM %s +; ASM: main: +; + +target triple = "x86_64-unknown-linux-gnu" + +define i32 @main() { +entry: + ret i32 23 +} + diff --git a/tools/llvm-lto/llvm-lto.cpp b/tools/llvm-lto/llvm-lto.cpp index cdf91f9e377..aac82d31a36 100644 --- a/tools/llvm-lto/llvm-lto.cpp +++ b/tools/llvm-lto/llvm-lto.cpp @@ -64,6 +64,10 @@ static cl::opt ThinLTO("thinlto", cl::init(false), cl::desc("Only write combined global index for ThinLTO backends")); +static cl::opt +SaveModuleFile("save-merged-module", cl::init(false), + cl::desc("Write merged LTO module to file before CodeGen")); + static cl::list InputFilenames(cl::Positional, cl::OneOrMore, cl::desc("")); @@ -343,6 +347,9 @@ int main(int argc, char **argv) { if (!attrs.empty()) CodeGen.setAttr(attrs.c_str()); + if (FileType.getNumOccurrences()) + CodeGen.setFileType(FileType); + if (!OutputFilename.empty()) { if (!CodeGen.optimize(DisableVerify, DisableInline, DisableGVNLoadPRE, DisableLTOVectorization)) { @@ -351,6 +358,17 @@ int main(int argc, char **argv) { return 1; } + if (SaveModuleFile) { + std::string ModuleFilename = OutputFilename; + ModuleFilename += ".merged.bc"; + std::string ErrMsg; + + if (!CodeGen.writeMergedModules(ModuleFilename.c_str())) { + errs() << argv[0] << ": writing merged module failed.\n"; + return 1; + } + } + std::list OSs; std::vector OSPtrs; for (unsigned I = 0; I != Parallelism; ++I) { @@ -381,6 +399,11 @@ int main(int argc, char **argv) { return 1; } + if (SaveModuleFile) { + errs() << argv[0] << ": -save-merged-module must be specified with -o\n"; + return 1; + } + const char *OutputName = nullptr; if (!CodeGen.compile_to_file(&OutputName, DisableVerify, DisableInline, DisableGVNLoadPRE, DisableLTOVectorization)) { -- 2.34.1