diff --git a/test/tools/gold/emit-llvm.ll b/test/tools/gold/emit-llvm.ll index ede77ecf7d5..0a6dcfc2568 100644 --- a/test/tools/gold/emit-llvm.ll +++ b/test/tools/gold/emit-llvm.ll @@ -8,23 +8,21 @@ ; RUN: FileCheck --check-prefix=API %s < %T/../apifile.txt ; RUN: ld -plugin %llvmshlibdir/LLVMgold.so \ -; RUN: -m elf_x86_64 --plugin-opt=also-emit-llvm \ +; RUN: -m elf_x86_64 --plugin-opt=save-temps \ ; RUN: -shared %t.o -o %t3.o -; RUN: llvm-dis %t3.o.bc -o /dev/null - -; RUN: ld -plugin %llvmshlibdir/LLVMgold.so \ -; RUN: -m elf_x86_64 --plugin-opt=also-emit-llvm=%t4 \ -; RUN: -shared %t.o -o %t3.o -; RUN: llvm-dis %t4 -o /dev/null +; RUN: llvm-dis %t3.o.bc -o - | FileCheck %s +; RUN: llvm-dis %t3.o.opt.bc -o - | FileCheck --check-prefix=OPT %s target triple = "x86_64-unknown-linux-gnu" ; CHECK: define internal void @f1() +; OPT-NOT: @f1 define hidden void @f1() { ret void } ; CHECK: define hidden void @f2() +; OPT: define hidden void @f2() define hidden void @f2() { ret void } @@ -32,23 +30,27 @@ define hidden void @f2() { @llvm.used = appending global [1 x i8*] [ i8* bitcast (void ()* @f2 to i8*)] ; CHECK: define void @f3() +; OPT: define void @f3() define void @f3() { call void @f4() ret void } ; CHECK: define internal void @f4() +; OPT-NOT: @f4 define linkonce_odr void @f4() { ret void } ; CHECK: define linkonce_odr void @f5() +; OPT: define linkonce_odr void @f5() define linkonce_odr void @f5() { ret void } @g5 = global void()* @f5 ; CHECK: define internal void @f6() unnamed_addr +; OPT: define internal void @f6() unnamed_addr define linkonce_odr void @f6() unnamed_addr { ret void } diff --git a/tools/gold/gold-plugin.cpp b/tools/gold/gold-plugin.cpp index 9d6540d2d47..fb1566ca396 100644 --- a/tools/gold/gold-plugin.cpp +++ b/tools/gold/gold-plugin.cpp @@ -78,10 +78,9 @@ static std::vector Cleanup; static llvm::TargetOptions TargetOpts; namespace options { - enum generate_bc { BC_NO, BC_ALSO, BC_ONLY }; + enum generate_bc { BC_NO, BC_ONLY, BC_SAVE_TEMPS }; static bool generate_api_file = false; static generate_bc generate_bc_file = BC_NO; - static std::string bc_path; static std::string obj_path; static std::string extra_library_path; static std::string triple; @@ -111,18 +110,8 @@ namespace options { obj_path = opt.substr(strlen("obj-path=")); } else if (opt == "emit-llvm") { generate_bc_file = BC_ONLY; - } else if (opt == "also-emit-llvm") { - generate_bc_file = BC_ALSO; - } else if (opt.startswith("also-emit-llvm=")) { - llvm::StringRef path = opt.substr(strlen("also-emit-llvm=")); - generate_bc_file = BC_ALSO; - if (!bc_path.empty()) { - message(LDPL_WARNING, "Path to the output IL file specified twice. " - "Discarding %s", - opt_); - } else { - bc_path = path; - } + } else if (opt == "save-temps") { + generate_bc_file = BC_SAVE_TEMPS; } else { // Save this option to pass to the code generator. // ParseCommandLineOptions() expects argv[0] to be program name. Lazily @@ -691,6 +680,14 @@ static void runLTOPasses(Module &M, TargetMachine &TM) { passes.run(M); } +static void saveBCFile(StringRef Path, Module &M) { + std::error_code EC; + raw_fd_ostream OS(Path, EC, sys::fs::OpenFlags::F_None); + if (EC) + message(LDPL_FATAL, "Failed to write the output file."); + WriteBitcodeToFile(&M, OS); +} + static void codegen(Module &M) { const std::string &TripleStr = M.getTargetTriple(); Triple TheTriple(TripleStr); @@ -715,6 +712,9 @@ static void codegen(Module &M) { runLTOPasses(M, *TM); + if (options::generate_bc_file == options::BC_SAVE_TEMPS) + saveBCFile(output_name + ".opt.bc", M); + PassManager CodeGenPasses; CodeGenPasses.add(new DataLayoutPass()); @@ -800,17 +800,9 @@ static ld_plugin_status allSymbolsReadHook(raw_fd_ostream *ApiFile) { std::string path; if (options::generate_bc_file == options::BC_ONLY) path = output_name; - else if (!options::bc_path.empty()) - path = options::bc_path; else path = output_name + ".bc"; - { - std::error_code EC; - raw_fd_ostream OS(path, EC, sys::fs::OpenFlags::F_None); - if (EC) - message(LDPL_FATAL, "Failed to write the output file."); - WriteBitcodeToFile(L.getModule(), OS); - } + saveBCFile(path, *L.getModule()); if (options::generate_bc_file == options::BC_ONLY) return LDPS_OK; }