diff --git a/include/llvm/LTO/Config.h b/include/llvm/LTO/Config.h index 3aa48c9f7c2..06bfdbcecd5 100644 --- a/include/llvm/LTO/Config.h +++ b/include/llvm/LTO/Config.h @@ -68,6 +68,12 @@ struct Config { /// Sample PGO profile path. std::string SampleProfile; + /// Optimization remarks file path. + std::string RemarksFilename = ""; + + /// Whether to emit optimization remarks with hotness informations. + bool RemarksWithHotness = false; + bool ShouldDiscardValueNames = true; DiagnosticHandlerFunction DiagHandler; diff --git a/lib/LTO/LTOBackend.cpp b/lib/LTO/LTOBackend.cpp index 5c3e442faa9..1afdc13045b 100644 --- a/lib/LTO/LTOBackend.cpp +++ b/lib/LTO/LTOBackend.cpp @@ -366,6 +366,12 @@ Error lto::backend(Config &C, AddStreamFn AddStream, handleAsmUndefinedRefs(*Mod, *TM); + // Setup optimization remarks. + auto DiagFileOrErr = lto::setupOptimizationRemarks( + Mod->getContext(), C.RemarksFilename, C.RemarksWithHotness); + if (!DiagFileOrErr) + return DiagFileOrErr.takeError(); + if (!C.CodeGenOnly) if (!opt(C, TM.get(), 0, *Mod, /*IsThinLTO=*/false, CombinedIndex)) return Error::success(); diff --git a/test/LTO/Resolution/X86/diagnostic-handler-remarks.ll b/test/LTO/Resolution/X86/diagnostic-handler-remarks.ll new file mode 100644 index 00000000000..6e5f923e1e1 --- /dev/null +++ b/test/LTO/Resolution/X86/diagnostic-handler-remarks.ll @@ -0,0 +1,33 @@ +; RUN: llvm-as < %s >%t.bc + +; RUN: rm -f %t.yaml +; RUN: llvm-lto2 -pass-remarks-output=%t.yaml \ +; RUN: -r %t.bc,tinkywinky,p \ +; RUN: -r %t.bc,patatino,px \ +; RUN: -r %t.bc,main,px -o %t.o %t.bc 2>&1 +; RUN: cat %t.yaml | FileCheck %s -check-prefix=YAML + +; YAML: --- !Passed +; YAML-NEXT: Pass: inline +; YAML-NEXT: Name: Inlined +; YAML-NEXT: Function: main +; YAML-NEXT: Args: +; YAML-NEXT: - Callee: tinkywinky +; YAML-NEXT: - String: ' inlined into ' +; YAML-NEXT: - Caller: main +; YAML-NEXT: ... + +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-scei-ps4" + +declare i32 @patatino() + +define i32 @tinkywinky() { + %a = call i32 @patatino() + ret i32 %a +} + +define i32 @main() { + %i = call i32 @tinkywinky() + ret i32 %i +} diff --git a/tools/llvm-lto2/llvm-lto2.cpp b/tools/llvm-lto2/llvm-lto2.cpp index c09311a05b9..b2fe2164362 100644 --- a/tools/llvm-lto2/llvm-lto2.cpp +++ b/tools/llvm-lto2/llvm-lto2.cpp @@ -90,6 +90,10 @@ static cl::opt DefaultTriple( cl::desc( "Replace unspecified target triples in input files with this triple")); +static cl::opt + OptRemarksOutput("pass-remarks-output", + cl::desc("YAML output file for optimization remarks")); + static void check(Error E, std::string Msg) { if (!E) return; @@ -176,6 +180,9 @@ int main(int argc, char **argv) { check(Conf.addSaveTemps(OutputFilename + "."), "Config::addSaveTemps failed"); + // Optimization remarks. + Conf.RemarksFilename = OptRemarksOutput; + // Run a custom pipeline, if asked for. Conf.OptPipeline = OptPipeline; Conf.AAPipeline = AAPipeline;