diff --git a/flang/lib/Frontend/FrontendActions.cpp b/flang/lib/Frontend/FrontendActions.cpp --- a/flang/lib/Frontend/FrontendActions.cpp +++ b/flang/lib/Frontend/FrontendActions.cpp @@ -46,6 +46,7 @@ #include "llvm/Analysis/TargetLibraryInfo.h" #include "llvm/Analysis/TargetTransformInfo.h" #include "llvm/Bitcode/BitcodeWriterPass.h" +#include "llvm/IR/LLVMRemarkStreamer.h" #include "llvm/IR/LegacyPassManager.h" #include "llvm/IR/Verifier.h" #include "llvm/IRReader/IRReader.h" @@ -54,6 +55,7 @@ #include "llvm/Passes/PassBuilder.h" #include "llvm/Passes/PassPlugin.h" #include "llvm/Passes/StandardInstrumentations.h" +#include "llvm/Support/Error.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/Path.h" @@ -986,12 +988,32 @@ if (!ci.getInvocation().getCodeGenOpts().OffloadObjects.empty()) embedOffloadObjects(); + std::string RemarksFile = "simple.yaml"; + std::string RemarksPasses; + std::string RemarksFormat; + + llvm::Expected> RemarksFileOrErr = + setupLLVMOptimizationRemarks(llvmModule->getContext(), RemarksFile, + RemarksPasses, RemarksFormat, + /*RemarksWithHotness=*/false, + /*RemarksHotnessThreshold=*/0); + if (llvm::Error E = RemarksFileOrErr.takeError()) { + llvm::errs() << toString(std::move(E)) << '\n'; + return; + } + std::unique_ptr ToolRemarksFile = + std::move(*RemarksFileOrErr); + // Run LLVM's middle-end (i.e. the optimizer). runOptimizationPipeline(ci.isOutputStreamNull() ? *os : ci.getOutputStream()); if (action == BackendActionTy::Backend_EmitLL) { llvmModule->print(ci.isOutputStreamNull() ? *os : ci.getOutputStream(), /*AssemblyAnnotationWriter=*/nullptr); + if (ToolRemarksFile) { + ToolRemarksFile->keep(); + ToolRemarksFile->os().flush(); + } return; }