Index: include/clang/Basic/Diagnostic.h =================================================================== --- include/clang/Basic/Diagnostic.h +++ include/clang/Basic/Diagnostic.h @@ -341,6 +341,14 @@ /// \brief Second string argument for the delayed diagnostic. std::string DelayedDiagArg2; + /// \brief Flag name value. + /// + /// Some flags accept values. For instance, -Wframe-larger-than or -Rpass. + /// When reporting a diagnostic with those flags, it is useful to also + /// report the value that actually triggered the flag. The content of this + /// string is a value to be emitted after the flag name. + std::string FlagNameValue; + public: explicit DiagnosticsEngine( const IntrusiveRefCntPtr &Diags, @@ -646,6 +654,11 @@ /// \param DiagID A member of the @c diag::kind enum. /// \param Loc Represents the source location associated with the diagnostic, /// which can be an invalid location if no position information is available. + /// \param FlagNameValue A string that represents the value that triggered + /// this diagnostic. If given, this value will be emitted as "=value" + /// after the flag name. + inline DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID, + StringRef Val); inline DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID); inline DiagnosticBuilder Report(unsigned DiagID); @@ -681,6 +694,9 @@ /// \brief Clear out the current diagnostic. void Clear() { CurDiagID = ~0U; } + /// \brief Return the overridden name for this diagnostic flag. + StringRef getFlagNameValue() const { return StringRef(FlagNameValue); } + private: /// \brief Report the delayed diagnostic. void ReportDelayed(); @@ -1084,15 +1100,22 @@ return DB; } -inline DiagnosticBuilder DiagnosticsEngine::Report(SourceLocation Loc, - unsigned DiagID) { +inline DiagnosticBuilder +DiagnosticsEngine::Report(SourceLocation Loc, unsigned DiagID, StringRef Val) { assert(CurDiagID == ~0U && "Multiple diagnostics in flight at once!"); CurDiagLoc = Loc; CurDiagID = DiagID; + FlagNameValue = Val.str(); return DiagnosticBuilder(this); } + +inline DiagnosticBuilder DiagnosticsEngine::Report(SourceLocation Loc, + unsigned DiagID) { + return Report(Loc, DiagID, ""); +} + inline DiagnosticBuilder DiagnosticsEngine::Report(unsigned DiagID) { - return Report(SourceLocation(), DiagID); + return Report(SourceLocation(), DiagID, ""); } //===----------------------------------------------------------------------===// Index: lib/CodeGen/CodeGenAction.cpp =================================================================== --- lib/CodeGen/CodeGenAction.cpp +++ lib/CodeGen/CodeGenAction.cpp @@ -404,7 +404,8 @@ Loc = SourceMgr.translateFileLineCol(FileMgr.getFile(Filename), Line, Column); } - Diags.Report(Loc, diag::remark_fe_backend_optimization_remark) + Diags.Report(Loc, diag::remark_fe_backend_optimization_remark, + D.getPassName()) << D.getMsg().str(); if (Line == 0) Index: lib/Frontend/TextDiagnosticPrinter.cpp =================================================================== --- lib/Frontend/TextDiagnosticPrinter.cpp +++ lib/Frontend/TextDiagnosticPrinter.cpp @@ -83,6 +83,9 @@ if (!Opt.empty()) { OS << (Started ? "," : " [") << (DiagnosticIDs::isRemark(Info.getID()) ? "-R" : "-W") << Opt; + StringRef OptValue = Info.getDiags()->getFlagNameValue(); + if (!OptValue.empty()) + OS << "=" << OptValue; Started = true; } } Index: test/Frontend/optimization-remark.c =================================================================== --- test/Frontend/optimization-remark.c +++ test/Frontend/optimization-remark.c @@ -13,7 +13,7 @@ int foo(int x, int y) { return x + y; } int bar(int j) { return foo(j, j - 2); } -// INLINE: remark: foo inlined into bar [-Rpass] +// INLINE: remark: foo inlined into bar [-Rpass=inline] // INLINE-NO-LOC: {{^remark: foo inlined into bar}} // INLINE-NO-LOC: note: use -gline-tables-only -gcolumn-info to track