diff options
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Analysis/OptimizationDiagnosticInfo.cpp | 80 | ||||
| -rw-r--r-- | llvm/lib/IR/DiagnosticInfo.cpp | 33 | ||||
| -rw-r--r-- | llvm/lib/IR/LLVMContext.cpp | 8 | ||||
| -rw-r--r-- | llvm/lib/IR/LLVMContextImpl.h | 2 | ||||
| -rw-r--r-- | llvm/lib/Transforms/IPO/Inliner.cpp | 14 |
5 files changed, 131 insertions, 6 deletions
diff --git a/llvm/lib/Analysis/OptimizationDiagnosticInfo.cpp b/llvm/lib/Analysis/OptimizationDiagnosticInfo.cpp index 09a4ce51472..864308f62ed 100644 --- a/llvm/lib/Analysis/OptimizationDiagnosticInfo.cpp +++ b/llvm/lib/Analysis/OptimizationDiagnosticInfo.cpp @@ -16,6 +16,7 @@ #include "llvm/Analysis/BranchProbabilityInfo.h" #include "llvm/Analysis/LazyBlockFrequencyInfo.h" #include "llvm/Analysis/LoopInfo.h" +#include "llvm/IR/DebugInfo.h" #include "llvm/IR/DiagnosticInfo.h" #include "llvm/IR/Dominators.h" #include "llvm/IR/LLVMContext.h" @@ -51,6 +52,85 @@ Optional<uint64_t> OptimizationRemarkEmitter::computeHotness(const Value *V) { return BFI->getBlockProfileCount(cast<BasicBlock>(V)); } +template <> struct yaml::MappingTraits<DiagnosticInfoOptimizationBase *> { + static void mapping(IO &io, DiagnosticInfoOptimizationBase *&OptDiag) { + assert(io.outputting() && "input not yet implemented"); + + if (io.mapTag("!Missed", OptDiag->getKind() == DK_OptimizationRemarkMissed)) + ; + else + llvm_unreachable("todo"); + + // These are read-only for now. + DebugLoc DL = OptDiag->getDebugLoc(); + StringRef FN = OptDiag->getFunction().getName(); + + StringRef PassName(OptDiag->PassName); + io.mapRequired("Pass", PassName); + io.mapRequired("Name", OptDiag->RemarkName); + if (!io.outputting() || DL) + io.mapOptional("DebugLoc", DL); + io.mapRequired("Function", FN); + io.mapOptional("Hotness", OptDiag->Hotness); + io.mapOptional("Args", OptDiag->Args); + } +}; + +template <> struct yaml::MappingTraits<DebugLoc> { + static void mapping(IO &io, DebugLoc &DL) { + assert(io.outputting() && "input not yet implemented"); + + auto *Scope = cast<DIScope>(DL.getScope()); + StringRef File = Scope->getFilename(); + unsigned Line = DL.getLine(); + unsigned Col = DL.getCol(); + + io.mapRequired("File", File); + io.mapRequired("Line", Line); + io.mapRequired("Column", Col); + } + + static const bool flow = true; +}; + +template <> +struct yaml::ScalarTraits<DiagnosticInfoOptimizationBase::Argument> { + static void output(const DiagnosticInfoOptimizationBase::Argument &Arg, + void *, llvm::raw_ostream &out) { + out << Arg.Key << ": " << Arg.Val; + } + + static StringRef input(StringRef scalar, void *, + DiagnosticInfoOptimizationBase::Argument &Arg) { + llvm_unreachable("input not yet implemented"); + } + + static bool mustQuote(StringRef) { return false; } +}; + +LLVM_YAML_IS_SEQUENCE_VECTOR(DiagnosticInfoOptimizationBase::Argument) + +void OptimizationRemarkEmitter::computeHotness( + DiagnosticInfoOptimizationBase &OptDiag) { + Value *V = OptDiag.getCodeRegion(); + if (V) + OptDiag.setHotness(computeHotness(V)); +} + +void OptimizationRemarkEmitter::emit(DiagnosticInfoOptimizationBase &OptDiag) { + computeHotness(OptDiag); + + yaml::Output *Out = F->getContext().getDiagnosticsOutputFile(); + if (Out && OptDiag.isEnabled()) { + auto *P = &const_cast<DiagnosticInfoOptimizationBase &>(OptDiag); + *Out << P; + } + // FIXME: now that IsVerbose is part of DI, filtering for this will be moved + // from here to clang. + if (!OptDiag.isVerbose() || shouldEmitVerbose()) + F->getContext().diagnose(OptDiag); +} + void OptimizationRemarkEmitter::emitOptimizationRemark(const char *PassName, const DebugLoc &DLoc, const Value *V, diff --git a/llvm/lib/IR/DiagnosticInfo.cpp b/llvm/lib/IR/DiagnosticInfo.cpp index 7dd4cab734d..e11aeafd01f 100644 --- a/llvm/lib/IR/DiagnosticInfo.cpp +++ b/llvm/lib/IR/DiagnosticInfo.cpp @@ -181,6 +181,13 @@ bool DiagnosticInfoOptimizationRemark::isEnabled() const { PassRemarksOptLoc.Pattern->match(getPassName()); } +DiagnosticInfoOptimizationRemarkMissed::DiagnosticInfoOptimizationRemarkMissed( + const char *PassName, StringRef RemarkName, Instruction *Inst) + : DiagnosticInfoOptimizationBase(DK_OptimizationRemarkMissed, DS_Remark, + PassName, RemarkName, + *Inst->getParent()->getParent(), + Inst->getDebugLoc(), Inst->getParent()) {} + bool DiagnosticInfoOptimizationRemarkMissed::isEnabled() const { return PassRemarksMissedOptLoc.Pattern && PassRemarksMissedOptLoc.Pattern->match(getPassName()); @@ -266,3 +273,29 @@ void llvm::emitLoopInterleaveWarning(LLVMContext &Ctx, const Function &Fn, void DiagnosticInfoISelFallback::print(DiagnosticPrinter &DP) const { DP << "Instruction selection used fallback path for " << getFunction(); } + +DiagnosticInfoOptimizationBase &DiagnosticInfoOptimizationBase:: +operator<<(StringRef S) { + Args.emplace_back(S); + return *this; +} + +DiagnosticInfoOptimizationBase &DiagnosticInfoOptimizationBase:: +operator<<(Argument A) { + Args.push_back(std::move(A)); + return *this; +} + +DiagnosticInfoOptimizationBase &DiagnosticInfoOptimizationBase:: +operator<<(setIsVerbose V) { + IsVerbose = true; + return *this; +} + +std::string DiagnosticInfoOptimizationBase::getMsg() const { + std::string Str; + raw_string_ostream OS(Str); + for (const DiagnosticInfoOptimizationBase::Argument &Arg : Args) + OS << Arg.Val; + return OS.str(); +} diff --git a/llvm/lib/IR/LLVMContext.cpp b/llvm/lib/IR/LLVMContext.cpp index d27fcfb1b7a..c97228fd51a 100644 --- a/llvm/lib/IR/LLVMContext.cpp +++ b/llvm/lib/IR/LLVMContext.cpp @@ -203,6 +203,14 @@ bool LLVMContext::getDiagnosticHotnessRequested() const { return pImpl->DiagnosticHotnessRequested; } +yaml::Output *LLVMContext::getDiagnosticsOutputFile() { + return pImpl->DiagnosticsOutputFile.get(); +} + +void LLVMContext::setDiagnosticsOutputFile(yaml::Output *F) { + pImpl->DiagnosticsOutputFile.reset(F); +} + LLVMContext::DiagnosticHandlerTy LLVMContext::getDiagnosticHandler() const { return pImpl->DiagnosticHandler; } diff --git a/llvm/lib/IR/LLVMContextImpl.h b/llvm/lib/IR/LLVMContextImpl.h index 40935d9331e..49a35a4d375 100644 --- a/llvm/lib/IR/LLVMContextImpl.h +++ b/llvm/lib/IR/LLVMContextImpl.h @@ -33,6 +33,7 @@ #include "llvm/IR/Metadata.h" #include "llvm/IR/ValueHandle.h" #include "llvm/Support/Dwarf.h" +#include "llvm/Support/YAMLTraits.h" #include <vector> namespace llvm { @@ -1043,6 +1044,7 @@ public: void *DiagnosticContext; bool RespectDiagnosticFilters; bool DiagnosticHotnessRequested; + std::unique_ptr<yaml::Output> DiagnosticsOutputFile; LLVMContext::YieldCallbackTy YieldCallback; void *YieldOpaqueHandle; diff --git a/llvm/lib/Transforms/IPO/Inliner.cpp b/llvm/lib/Transforms/IPO/Inliner.cpp index befadb63db5..f1475cd434c 100644 --- a/llvm/lib/Transforms/IPO/Inliner.cpp +++ b/llvm/lib/Transforms/IPO/Inliner.cpp @@ -469,13 +469,15 @@ inlineCallsImpl(CallGraphSCC &SCC, CallGraph &CG, // direct call, so we keep it. if (Function *Callee = CS.getCalledFunction()) if (Callee->isDeclaration()) { - ORE.emitOptimizationRemarkMissedAndAnalysis( - DEBUG_TYPE, &I, - Twine(Callee->getName()) + " will not be inlined into " + - CS.getCaller()->getName(), - Twine("definition of ") + Callee->getName() + - " is not available", + ORE.emitOptimizationRemarkAnalysis( + DEBUG_TYPE, &I, Twine("definition of ") + Callee->getName() + + " is not available", /*Verbose=*/true); + using namespace ore; + ORE.emit(DiagnosticInfoOptimizationRemarkMissed(DEBUG_TYPE, + "NotInlined", &I) + << NV("Callee", Callee) << " will not be inlined into " + << NV("Caller", CS.getCaller()) << setIsVerbose()); continue; } |

