forked from OSchip/llvm-project
Add --plugin-opt=emit-llvm option.
`--plugin-opt=emit-llvm` is an option for LTO. It makes the linker to combine all bitcode files and write the result to an output file without doing codegen. Gold LTO plugin has this option. This option is being used for some post-link code analysis tools that have to see a whole program but don't need to see them in the native machine code. Differential Revision: https://reviews.llvm.org/D55717 llvm-svn: 349198
This commit is contained in:
parent
847e73d69c
commit
9f49990976
|
@ -135,6 +135,7 @@ struct Configuration {
|
||||||
bool Demangle = true;
|
bool Demangle = true;
|
||||||
bool DisableVerify;
|
bool DisableVerify;
|
||||||
bool EhFrameHdr;
|
bool EhFrameHdr;
|
||||||
|
bool EmitLLVM;
|
||||||
bool EmitRelocs;
|
bool EmitRelocs;
|
||||||
bool EnableNewDtags;
|
bool EnableNewDtags;
|
||||||
bool ExecuteOnly;
|
bool ExecuteOnly;
|
||||||
|
|
|
@ -776,6 +776,7 @@ void LinkerDriver::readConfigs(opt::InputArgList &Args) {
|
||||||
Config->DynamicLinker = getDynamicLinker(Args);
|
Config->DynamicLinker = getDynamicLinker(Args);
|
||||||
Config->EhFrameHdr =
|
Config->EhFrameHdr =
|
||||||
Args.hasFlag(OPT_eh_frame_hdr, OPT_no_eh_frame_hdr, false);
|
Args.hasFlag(OPT_eh_frame_hdr, OPT_no_eh_frame_hdr, false);
|
||||||
|
Config->EmitLLVM = Args.hasArg(OPT_plugin_opt_emit_llvm, false);
|
||||||
Config->EmitRelocs = Args.hasArg(OPT_emit_relocs);
|
Config->EmitRelocs = Args.hasArg(OPT_emit_relocs);
|
||||||
Config->CallGraphProfileSort = Args.hasFlag(
|
Config->CallGraphProfileSort = Args.hasFlag(
|
||||||
OPT_call_graph_profile_sort, OPT_no_call_graph_profile_sort, true);
|
OPT_call_graph_profile_sort, OPT_no_call_graph_profile_sort, true);
|
||||||
|
@ -1581,6 +1582,12 @@ template <class ELFT> void LinkerDriver::link(opt::InputArgList &Args) {
|
||||||
if (Config->ThinLTOIndexOnly)
|
if (Config->ThinLTOIndexOnly)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
// Likewise, --plugin-opt=emit-llvm is an option to make LTO create
|
||||||
|
// an output file in bitcode and exit, so that you can just get a
|
||||||
|
// combined bitcode file.
|
||||||
|
if (Config->EmitLLVM)
|
||||||
|
return;
|
||||||
|
|
||||||
// Apply symbol renames for -wrap.
|
// Apply symbol renames for -wrap.
|
||||||
if (!Wrapped.empty())
|
if (!Wrapped.empty())
|
||||||
wrapSymbols<ELFT>(Wrapped);
|
wrapSymbols<ELFT>(Wrapped);
|
||||||
|
|
|
@ -103,6 +103,14 @@ static lto::Config createConfig() {
|
||||||
C.DebugPassManager = Config->LTODebugPassManager;
|
C.DebugPassManager = Config->LTODebugPassManager;
|
||||||
C.DwoDir = Config->DwoDir;
|
C.DwoDir = Config->DwoDir;
|
||||||
|
|
||||||
|
if (Config->EmitLLVM) {
|
||||||
|
C.PostInternalizeModuleHook = [](size_t Task, const Module &M) {
|
||||||
|
if (std::unique_ptr<raw_fd_ostream> OS = openFile(Config->OutputFile))
|
||||||
|
WriteBitcodeToFile(M, *OS, false);
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
if (Config->SaveTemps)
|
if (Config->SaveTemps)
|
||||||
checkError(C.addSaveTemps(Config->OutputFile.str() + ".",
|
checkError(C.addSaveTemps(Config->OutputFile.str() + ".",
|
||||||
/*UseInputModulePath*/ true));
|
/*UseInputModulePath*/ true));
|
||||||
|
|
|
@ -458,6 +458,7 @@ def: F<"plugin-opt=debug-pass-manager">,
|
||||||
def: F<"plugin-opt=disable-verify">, Alias<disable_verify>, HelpText<"Alias for -disable-verify">;
|
def: F<"plugin-opt=disable-verify">, Alias<disable_verify>, HelpText<"Alias for -disable-verify">;
|
||||||
def plugin_opt_dwo_dir_eq: J<"plugin-opt=dwo_dir=">,
|
def plugin_opt_dwo_dir_eq: J<"plugin-opt=dwo_dir=">,
|
||||||
HelpText<"Directory to store .dwo files when LTO and debug fission are used">;
|
HelpText<"Directory to store .dwo files when LTO and debug fission are used">;
|
||||||
|
def plugin_opt_emit_llvm: F<"plugin-opt=emit-llvm">;
|
||||||
def: J<"plugin-opt=jobs=">, Alias<thinlto_jobs>, HelpText<"Alias for -thinlto-jobs">;
|
def: J<"plugin-opt=jobs=">, Alias<thinlto_jobs>, HelpText<"Alias for -thinlto-jobs">;
|
||||||
def: J<"plugin-opt=lto-partitions=">, Alias<lto_partitions>, HelpText<"Alias for -lto-partitions">;
|
def: J<"plugin-opt=lto-partitions=">, Alias<lto_partitions>, HelpText<"Alias for -lto-partitions">;
|
||||||
def plugin_opt_mcpu_eq: J<"plugin-opt=mcpu=">;
|
def plugin_opt_mcpu_eq: J<"plugin-opt=mcpu=">;
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
; REQUIRES: x86
|
||||||
|
|
||||||
|
; RUN: opt -module-hash -module-summary %s -o %t.o
|
||||||
|
; RUN: ld.lld --plugin-opt=emit-llvm -o %t.out.o %t.o
|
||||||
|
; RUN: llvm-dis < %t.out.o -o - | FileCheck %s
|
||||||
|
|
||||||
|
; CHECK: define internal void @main()
|
||||||
|
|
||||||
|
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
||||||
|
target triple = "x86_64-unknown-linux-gnu"
|
||||||
|
|
||||||
|
define void @main() {
|
||||||
|
ret void
|
||||||
|
}
|
Loading…
Reference in New Issue