From: wangliushuai Date: Thu, 17 Mar 2022 03:53:44 +0000 (+0800) Subject: [LTO][ELF] Add --stats-file= option. X-Git-Tag: upstream/15.0.7~13346 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1c04b52b2594d403f739ed919ef420b1e47ae343;p=platform%2Fupstream%2Fllvm.git [LTO][ELF] Add --stats-file= option. This patch adds a StatsFile option supported by gold to lld, related patch https://reviews.llvm.org/D45531. Reviewed By: tejohnson, MaskRay Differential Revision: https://reviews.llvm.org/D121809 --- diff --git a/lld/ELF/Config.h b/lld/ELF/Config.h index c05adb5..59df5ee5 100644 --- a/lld/ELF/Config.h +++ b/lld/ELF/Config.h @@ -122,6 +122,7 @@ struct Configuration { llvm::Optional optRemarksHotnessThreshold = 0; llvm::StringRef optRemarksPasses; llvm::StringRef optRemarksFormat; + llvm::StringRef optStatsFilename; llvm::StringRef progName; llvm::StringRef printArchiveStats; llvm::StringRef printSymbolOrder; diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp index c51349d..ebf0de0 100644 --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -1103,6 +1103,7 @@ static void readConfigs(opt::InputArgList &args) { config->oFormatBinary = isOutputFormatBinary(args); config->omagic = args.hasFlag(OPT_omagic, OPT_no_omagic, false); config->optRemarksFilename = args.getLastArgValue(OPT_opt_remarks_filename); + config->optStatsFilename = args.getLastArgValue(OPT_opt_stats_filename); // Parse remarks hotness threshold. Valid value is either integer or 'auto'. if (auto *arg = args.getLastArg(OPT_opt_remarks_hotness_threshold)) { diff --git a/lld/ELF/LTO.cpp b/lld/ELF/LTO.cpp index a6c6e65..9ac21dd 100644 --- a/lld/ELF/LTO.cpp +++ b/lld/ELF/LTO.cpp @@ -142,6 +142,9 @@ static lto::Config createConfig() { c.RemarksHotnessThreshold = config->optRemarksHotnessThreshold; c.RemarksFormat = std::string(config->optRemarksFormat); + // Set up output file to emit statistics. + c.StatsFile = std::string(config->optStatsFilename); + c.SampleProfile = std::string(config->ltoSampleProfile); c.UseNewPM = config->ltoNewPassManager; c.DebugPassManager = config->ltoDebugPassManager; diff --git a/lld/ELF/Options.td b/lld/ELF/Options.td index e50fa2b..43c163b 100644 --- a/lld/ELF/Options.td +++ b/lld/ELF/Options.td @@ -583,6 +583,8 @@ def opt_remarks_with_hotness: FF<"opt-remarks-with-hotness">, HelpText<"Include hotness information in the optimization remarks file">; def opt_remarks_format: Separate<["--"], "opt-remarks-format">, HelpText<"The format used for serializing remarks (default: YAML)">; +def opt_stats_filename: JJ<"stats-file=">, + HelpText<"Filename to write statistics to">; def save_temps: F<"save-temps">, HelpText<"Save intermediate LTO compilation results">; def lto_basic_block_sections: JJ<"lto-basic-block-sections=">, HelpText<"Enable basic block sections for LTO">; diff --git a/lld/test/ELF/lto/stats-file-option.ll b/lld/test/ELF/lto/stats-file-option.ll new file mode 100644 index 0000000..fe39001 --- /dev/null +++ b/lld/test/ELF/lto/stats-file-option.ll @@ -0,0 +1,28 @@ +; RUN: llvm-as -o %t.bc %s + +;; Try to save statistics to file. +; RUN: ld.lld --stats-file=%t2.stats -m elf_x86_64 -r -o %t.o %t.bc +; RUN: FileCheck --input-file=%t2.stats %s + +; CHECK: { +; CHECK: "asm-printer.EmittedInsts": +; CHECK: "inline.NumInlined": +; CHECK: "prologepilog.NumFuncSeen": +; CHECK: } + +target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +declare i32 @patatino() + +define i32 @tinkywinky() { + %a = call i32 @patatino() + ret i32 %a +} + +define i32 @main() !prof !0 { + %i = call i32 @tinkywinky() + ret i32 %i +} + +!0 = !{!"function_entry_count", i64 300}