Skip to content

Commit

Permalink
Allow adding a value to a flag in diagnostics.
Browse files Browse the repository at this point in the history
Summary:
This allows callers of Diags.Report() to append a value to the name of
the flag associated with the diagnostic. This is useful in cases like
the -Rpass flag, where we want the diagnostic to show the name of the
pass that matched the pattern. Instead of showing "... [-Rpass]", this
allows us to show "... [-Rpass=passname]".

Reviewers: rsmith

CC: cfe-commits

Differential Revision: http://reviews.llvm.org/D3441

llvm-svn: 206826
  • Loading branch information
dnovillo committed Apr 21, 2014
1 parent 97d4843 commit 9f23997
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 5 deletions.
29 changes: 26 additions & 3 deletions clang/include/clang/Basic/Diagnostic.h
Original file line number Diff line number Diff line change
Expand Up @@ -341,6 +341,14 @@ class DiagnosticsEngine : public RefCountedBase<DiagnosticsEngine> {
/// \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<DiagnosticIDs> &Diags,
Expand Down Expand Up @@ -646,6 +654,11 @@ class DiagnosticsEngine : public RefCountedBase<DiagnosticsEngine> {
/// \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);

Expand Down Expand Up @@ -681,6 +694,9 @@ class DiagnosticsEngine : public RefCountedBase<DiagnosticsEngine> {
/// \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();
Expand Down Expand Up @@ -1084,15 +1100,22 @@ inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB,
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, "");
}

//===----------------------------------------------------------------------===//
Expand Down
3 changes: 2 additions & 1 deletion clang/lib/CodeGen/CodeGenAction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -404,7 +404,8 @@ void BackendConsumer::OptimizationRemarkHandler(
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)
Expand Down
3 changes: 3 additions & 0 deletions clang/lib/Frontend/TextDiagnosticPrinter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,9 @@ static void printDiagnosticOptions(raw_ostream &OS,
if (!Opt.empty()) {
OS << (Started ? "," : " [")
<< (DiagnosticIDs::isRemark(Info.getID()) ? "-R" : "-W") << Opt;
StringRef OptValue = Info.getDiags()->getFlagNameValue();
if (!OptValue.empty())
OS << "=" << OptValue;
Started = true;
}
}
Expand Down
2 changes: 1 addition & 1 deletion clang/test/Frontend/optimization-remark.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ int foo(int x, int y) __attribute__((always_inline));
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

0 comments on commit 9f23997

Please sign in to comment.