[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
This commit is contained in:
Tobias Edler von Koch 2015-11-20 00:13:05 +00:00
parent 5b01c01496
commit cbf870d3b1
2 changed files with 44 additions and 0 deletions

View File

@ -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
}

View File

@ -64,6 +64,10 @@ static cl::opt<bool>
ThinLTO("thinlto", cl::init(false),
cl::desc("Only write combined global index for ThinLTO backends"));
static cl::opt<bool>
SaveModuleFile("save-merged-module", cl::init(false),
cl::desc("Write merged LTO module to file before CodeGen"));
static cl::list<std::string>
InputFilenames(cl::Positional, cl::OneOrMore,
cl::desc("<input bitcode files>"));
@ -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<tool_output_file> OSs;
std::vector<raw_pwrite_stream *> 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)) {