diff options
Diffstat (limited to 'lld/ELF/Driver.cpp')
-rw-r--r-- | lld/ELF/Driver.cpp | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp index acbc97b..a14d362 100644 --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -1121,6 +1121,53 @@ static CGProfileSortKind getCGProfileSortKind(Ctx &ctx, return CGProfileSortKind::None; } +static void parseBPOrdererOptions(Ctx &ctx, opt::InputArgList &args) { + if (auto *arg = args.getLastArg(OPT_bp_compression_sort)) { + StringRef s = arg->getValue(); + if (s == "function") { + ctx.arg.bpFunctionOrderForCompression = true; + } else if (s == "data") { + ctx.arg.bpDataOrderForCompression = true; + } else if (s == "both") { + ctx.arg.bpFunctionOrderForCompression = true; + ctx.arg.bpDataOrderForCompression = true; + } else if (s != "none") { + ErrAlways(ctx) << arg->getSpelling() + << ": expected [none|function|data|both]"; + } + if (s != "none" && args.hasArg(OPT_call_graph_ordering_file)) + ErrAlways(ctx) << "--bp-compression-sort is incompatible with " + "--call-graph-ordering-file"; + } + if (auto *arg = args.getLastArg(OPT_bp_startup_sort)) { + StringRef s = arg->getValue(); + if (s == "function") { + ctx.arg.bpStartupFunctionSort = true; + } else if (s != "none") { + ErrAlways(ctx) << arg->getSpelling() << ": expected [none|function]"; + } + if (s != "none" && args.hasArg(OPT_call_graph_ordering_file)) + ErrAlways(ctx) << "--bp-startup-sort=function is incompatible with " + "--call-graph-ordering-file"; + } + + ctx.arg.bpCompressionSortStartupFunctions = + args.hasFlag(OPT_bp_compression_sort_startup_functions, + OPT_no_bp_compression_sort_startup_functions, false); + ctx.arg.bpVerboseSectionOrderer = args.hasArg(OPT_verbose_bp_section_orderer); + + ctx.arg.irpgoProfilePath = args.getLastArgValue(OPT_irpgo_profile); + if (ctx.arg.irpgoProfilePath.empty()) { + if (ctx.arg.bpStartupFunctionSort) + ErrAlways(ctx) << "--bp-startup-sort=function must be used with " + "--irpgo-profile"; + if (ctx.arg.bpCompressionSortStartupFunctions) + ErrAlways(ctx) + << "--bp-compression-sort-startup-functions must be used with " + "--irpgo-profile"; + } +} + static DebugCompressionType getCompressionType(Ctx &ctx, StringRef s, StringRef option) { DebugCompressionType type = StringSwitch<DebugCompressionType>(s) @@ -1262,6 +1309,7 @@ static void readConfigs(Ctx &ctx, opt::InputArgList &args) { ctx.arg.bsymbolic = BsymbolicKind::All; } ctx.arg.callGraphProfileSort = getCGProfileSortKind(ctx, args); + parseBPOrdererOptions(ctx, args); ctx.arg.checkSections = args.hasFlag(OPT_check_sections, OPT_no_check_sections, true); ctx.arg.chroot = args.getLastArgValue(OPT_chroot); |