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 @@ -43,6 +43,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" @@ -50,8 +51,10 @@ #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/SourceMgr.h" +#include "llvm/Support/ToolOutputFile.h" #include "llvm/Target/TargetMachine.h" #include @@ -587,7 +590,7 @@ // Create `TargetMachine` const auto &CGOpts = ci.getInvocation().getCodeGenOpts(); std::optional OptLevelOrNone = - CodeGenOpt::getLevel(CGOpts.OptimizationLevel); + llvm::CodeGenOpt::getLevel(CGOpts.OptimizationLevel); assert(OptLevelOrNone && "Invalid optimization level!"); llvm::CodeGenOpt::Level OptLevel = *OptLevelOrNone; std::string featuresStr = llvm::join(targetOpts.featuresAsWritten.begin(), @@ -778,12 +781,32 @@ llvmModule->setTargetTriple(theTriple); llvmModule->setDataLayout(tm->createDataLayout()); + 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(*os); if (action == BackendActionTy::Backend_EmitLL) { llvmModule->print(ci.isOutputStreamNull() ? *os : ci.getOutputStream(), /*AssemblyAnnotationWriter=*/nullptr); + if (ToolRemarksFile) { + ToolRemarksFile->keep(); + ToolRemarksFile->os().flush(); + } return; }