From: Chris Lattner Date: Tue, 18 Nov 2008 04:56:44 +0000 (+0000) Subject: Change the diagnostics interface to take an array of pointers to X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2383b7f6aea2cb2bf2b5bfc0ec730f9354fecbbf;p=clang Change the diagnostics interface to take an array of pointers to strings instead of array of strings. This reduces string copying in some not-very-important cases, but paves the way for future improvements. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@59494 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Analysis/PathDiagnostic.h b/include/clang/Analysis/PathDiagnostic.h index e266ee8518..6183a7c3a6 100644 --- a/include/clang/Analysis/PathDiagnostic.h +++ b/include/clang/Analysis/PathDiagnostic.h @@ -201,7 +201,7 @@ public: Diagnostic::Level DiagLevel, FullSourceLoc Pos, diag::kind ID, - const std::string *Strs, + const std::string **Strs, unsigned NumStrs, const SourceRange *Ranges, unsigned NumRanges); diff --git a/include/clang/Analysis/PathSensitive/BugReporter.h b/include/clang/Analysis/PathSensitive/BugReporter.h index 9d39c9cb9f..6ab2a4e713 100644 --- a/include/clang/Analysis/PathSensitive/BugReporter.h +++ b/include/clang/Analysis/PathSensitive/BugReporter.h @@ -307,7 +307,7 @@ public: Diagnostic::Level DiagLevel, FullSourceLoc Pos, diag::kind ID, - const std::string *Strs, + const std::string **Strs, unsigned NumStrs, const SourceRange *Ranges, unsigned NumRanges) { @@ -322,7 +322,7 @@ public: R.addRange(*Ranges); for ( ; NumStrs ; --NumStrs, ++Strs) - R.addString(*Strs); + R.addString(**Strs); } // Iterators. diff --git a/include/clang/Basic/Diagnostic.h b/include/clang/Basic/Diagnostic.h index 8b0637f59e..41a87434b0 100644 --- a/include/clang/Basic/Diagnostic.h +++ b/include/clang/Basic/Diagnostic.h @@ -165,7 +165,7 @@ public: /// Report - Issue the message to the client. DiagID is a member of the /// diag::kind enum. void Report(FullSourceLoc Pos, unsigned DiagID, - const std::string *Strs = 0, unsigned NumStrs = 0, + const std::string **Strs = 0, unsigned NumStrs = 0, const SourceRange *Ranges = 0, unsigned NumRanges = 0) { Report(NULL, Pos, DiagID, Strs, NumStrs, Ranges, NumRanges); } @@ -173,7 +173,7 @@ public: /// Report - Issue the message to the client. DiagID is a member of the /// diag::kind enum. void Report(unsigned DiagID, - const std::string *Strs = 0, unsigned NumStrs = 0, + const std::string **Strs = 0, unsigned NumStrs = 0, const SourceRange *Ranges = 0, unsigned NumRanges = 0) { Report(FullSourceLoc(), DiagID, Strs, NumStrs, Ranges, NumRanges); } @@ -181,7 +181,7 @@ public: /// Report - Issue the message to the specified client. /// DiagID is a member of the diag::kind enum. void Report(DiagnosticClient* C, FullSourceLoc Pos, unsigned DiagID, - const std::string *Strs = 0, unsigned NumStrs = 0, + const std::string **Strs = 0, unsigned NumStrs = 0, const SourceRange *Ranges = 0, unsigned NumRanges = 0); }; @@ -191,8 +191,7 @@ class DiagnosticClient { protected: std::string FormatDiagnostic(Diagnostic &Diags, Diagnostic::Level Level, diag::kind ID, - const std::string *Strs, - unsigned NumStrs); + const std::string **Strs, unsigned NumStrs); public: virtual ~DiagnosticClient(); @@ -202,7 +201,7 @@ public: Diagnostic::Level DiagLevel, FullSourceLoc Pos, diag::kind ID, - const std::string *Strs, + const std::string **Strs, unsigned NumStrs, const SourceRange *Ranges, unsigned NumRanges) = 0; diff --git a/include/clang/Driver/TextDiagnosticBuffer.h b/include/clang/Driver/TextDiagnosticBuffer.h index 28f2287c67..9933308368 100644 --- a/include/clang/Driver/TextDiagnosticBuffer.h +++ b/include/clang/Driver/TextDiagnosticBuffer.h @@ -43,7 +43,7 @@ public: Diagnostic::Level DiagLevel, FullSourceLoc Pos, diag::kind ID, - const std::string *Strs, + const std::string **Strs, unsigned NumStrs, const SourceRange *Ranges, unsigned NumRanges); diff --git a/include/clang/Driver/TextDiagnosticPrinter.h b/include/clang/Driver/TextDiagnosticPrinter.h index 1d609ced4d..7c6bce58bb 100644 --- a/include/clang/Driver/TextDiagnosticPrinter.h +++ b/include/clang/Driver/TextDiagnosticPrinter.h @@ -45,7 +45,7 @@ public: Diagnostic::Level DiagLevel, FullSourceLoc Pos, diag::kind ID, - const std::string *Strs, + const std::string **Strs, unsigned NumStrs, const SourceRange *Ranges, unsigned NumRanges); diff --git a/lib/Analysis/PathDiagnostic.cpp b/lib/Analysis/PathDiagnostic.cpp index 971e751b8d..02cfe1e341 100644 --- a/lib/Analysis/PathDiagnostic.cpp +++ b/lib/Analysis/PathDiagnostic.cpp @@ -24,7 +24,7 @@ void PathDiagnosticClient::HandleDiagnostic(Diagnostic &Diags, Diagnostic::Level DiagLevel, FullSourceLoc Pos, diag::kind ID, - const std::string *Strs, + const std::string **Strs, unsigned NumStrs, const SourceRange *Ranges, unsigned NumRanges) { diff --git a/lib/Basic/Diagnostic.cpp b/lib/Basic/Diagnostic.cpp index 533a6a76ec..2076b16db0 100644 --- a/lib/Basic/Diagnostic.cpp +++ b/lib/Basic/Diagnostic.cpp @@ -214,7 +214,7 @@ Diagnostic::Level Diagnostic::getDiagnosticLevel(unsigned DiagID) const { /// DiagID is a member of the diag::kind enum. void Diagnostic::Report(DiagnosticClient* C, FullSourceLoc Loc, unsigned DiagID, - const std::string *Strs, unsigned NumStrs, + const std::string **Strs, unsigned NumStrs, const SourceRange *Ranges, unsigned NumRanges) { // Figure out the diagnostic level of this message. @@ -260,7 +260,7 @@ DiagnosticClient::~DiagnosticClient() {} std::string DiagnosticClient::FormatDiagnostic(Diagnostic &Diags, Diagnostic::Level Level, diag::kind ID, - const std::string *Strs, + const std::string **Strs, unsigned NumStrs) { std::string Msg = Diags.getDescription(ID); @@ -269,7 +269,7 @@ std::string DiagnosticClient::FormatDiagnostic(Diagnostic &Diags, if (Msg[i] == '%' && isdigit(Msg[i + 1])) { unsigned StrNo = Msg[i + 1] - '0'; Msg = std::string(Msg.begin(), Msg.begin() + i) + - (StrNo < NumStrs ? Strs[StrNo] : "<<>>") + + (StrNo < NumStrs ? *Strs[StrNo] : "<<>>") + std::string(Msg.begin() + i + 2, Msg.end()); } } diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp index a101e389b2..d7d732997b 100644 --- a/lib/CodeGen/CodeGenModule.cpp +++ b/lib/CodeGen/CodeGenModule.cpp @@ -108,8 +108,9 @@ void CodeGenModule::ErrorUnsupported(const Stmt *S, const char *Type, "cannot codegen this %0 yet"); SourceRange Range = S->getSourceRange(); std::string Msg = Type; + const std::string *Strs[] = { &Msg }; getDiags().Report(Context.getFullLoc(S->getLocStart()), DiagID, - &Msg, 1, &Range, 1); + Strs, 1, &Range, 1); } /// ErrorUnsupported - Print out an error that codegen doesn't support the @@ -121,8 +122,8 @@ void CodeGenModule::ErrorUnsupported(const Decl *D, const char *Type, unsigned DiagID = getDiags().getCustomDiagID(Diagnostic::Error, "cannot codegen this %0 yet"); std::string Msg = Type; - getDiags().Report(Context.getFullLoc(D->getLocation()), DiagID, - &Msg, 1); + const std::string *Strs[] = { &Msg }; + getDiags().Report(Context.getFullLoc(D->getLocation()), DiagID, Strs, 1); } /// setGlobalVisibility - Set the visibility for the given LLVM diff --git a/lib/Driver/TextDiagnosticBuffer.cpp b/lib/Driver/TextDiagnosticBuffer.cpp index 26ac879dd0..ef7ac6d408 100644 --- a/lib/Driver/TextDiagnosticBuffer.cpp +++ b/lib/Driver/TextDiagnosticBuffer.cpp @@ -21,7 +21,7 @@ void TextDiagnosticBuffer::HandleDiagnostic(Diagnostic &Diags, Diagnostic::Level Level, FullSourceLoc Pos, diag::kind ID, - const std::string *Strs, + const std::string **Strs, unsigned NumStrs, const SourceRange *, unsigned) { diff --git a/lib/Driver/TextDiagnosticPrinter.cpp b/lib/Driver/TextDiagnosticPrinter.cpp index e0faf478d1..e03588b989 100644 --- a/lib/Driver/TextDiagnosticPrinter.cpp +++ b/lib/Driver/TextDiagnosticPrinter.cpp @@ -96,7 +96,7 @@ void TextDiagnosticPrinter::HandleDiagnostic(Diagnostic &Diags, Diagnostic::Level Level, FullSourceLoc Pos, diag::kind ID, - const std::string *Strs, + const std::string **Strs, unsigned NumStrs, const SourceRange *Ranges, unsigned NumRanges) { diff --git a/lib/Lex/Preprocessor.cpp b/lib/Lex/Preprocessor.cpp index c65b546209..dc4dd877b6 100644 --- a/lib/Lex/Preprocessor.cpp +++ b/lib/Lex/Preprocessor.cpp @@ -124,14 +124,16 @@ void Preprocessor::Diag(SourceLocation Loc, unsigned DiagID) { void Preprocessor::Diag(SourceLocation Loc, unsigned DiagID, const std::string &Msg) { - Diags.Report(getFullLoc(Loc), DiagID, &Msg, 1); + const std::string *Strs[] = { &Msg }; + Diags.Report(getFullLoc(Loc), DiagID, Strs, 1); } void Preprocessor::Diag(SourceLocation Loc, unsigned DiagID, const std::string &Msg, const SourceRange &R1, const SourceRange &R2) { + const std::string *Strs[] = { &Msg }; SourceRange R[] = {R1, R2}; - Diags.Report(getFullLoc(Loc), DiagID, &Msg, 1, R, 2); + Diags.Report(getFullLoc(Loc), DiagID, Strs, 1, R, 2); } diff --git a/lib/Parse/DeclSpec.cpp b/lib/Parse/DeclSpec.cpp index e80076127d..733c37cb4f 100644 --- a/lib/Parse/DeclSpec.cpp +++ b/lib/Parse/DeclSpec.cpp @@ -311,6 +311,7 @@ void DeclSpec::Diag(Diagnostic &D, SourceLocation Loc, SourceManager& SrcMgr, } void DeclSpec::Diag(Diagnostic &D, SourceLocation Loc, SourceManager& SrcMgr, - unsigned DiagID, const std::string &info) { - D.Report(FullSourceLoc(Loc,SrcMgr), DiagID, &info, 1); + unsigned DiagID, const std::string &Info) { + const std::string *Strs[] = { &Info }; + D.Report(FullSourceLoc(Loc,SrcMgr), DiagID, Strs, 1); } diff --git a/lib/Parse/Parser.cpp b/lib/Parse/Parser.cpp index 3b36ebec7b..dfabc9b16a 100644 --- a/lib/Parse/Parser.cpp +++ b/lib/Parse/Parser.cpp @@ -43,13 +43,15 @@ Action::~Action() {} bool Parser::Diag(SourceLocation Loc, unsigned DiagID, const std::string &Msg) { - Diags.Report(FullSourceLoc(Loc,PP.getSourceManager()), DiagID, &Msg, 1); + const std::string *Strs[] = { &Msg }; + Diags.Report(FullSourceLoc(Loc,PP.getSourceManager()), DiagID, Strs, 1); return true; } bool Parser::Diag(SourceLocation Loc, unsigned DiagID, const std::string &Msg, const SourceRange& Range) { - Diags.Report(PP.getFullLoc(Loc), DiagID, &Msg, 1, &Range,1); + const std::string *Strs[] = { &Msg }; + Diags.Report(PP.getFullLoc(Loc), DiagID, Strs, 1, &Range,1); return true; } diff --git a/lib/Sema/Sema.cpp b/lib/Sema/Sema.cpp index 6495949526..5ea27c979b 100644 --- a/lib/Sema/Sema.cpp +++ b/lib/Sema/Sema.cpp @@ -176,13 +176,14 @@ bool Sema::Diag(SourceLocation Loc, unsigned DiagID) { } bool Sema::Diag(SourceLocation Loc, unsigned DiagID, const std::string &Msg) { - PP.getDiagnostics().Report(PP.getFullLoc(Loc), DiagID, &Msg, 1); + const std::string *Strs[] = { &Msg }; + PP.getDiagnostics().Report(PP.getFullLoc(Loc), DiagID, Strs, 1); return true; } bool Sema::Diag(SourceLocation Loc, unsigned DiagID, const std::string &Msg1, const std::string &Msg2) { - std::string MsgArr[] = { Msg1, Msg2 }; + const std::string *MsgArr[] = { &Msg1, &Msg2 }; PP.getDiagnostics().Report(PP.getFullLoc(Loc), DiagID, MsgArr, 2); return true; } @@ -194,21 +195,22 @@ bool Sema::Diag(SourceLocation Loc, unsigned DiagID, const SourceRange& Range) { bool Sema::Diag(SourceLocation Loc, unsigned DiagID, const std::string &Msg, const SourceRange& Range) { - PP.getDiagnostics().Report(PP.getFullLoc(Loc), DiagID, &Msg, 1, &Range,1); + const std::string *Strs[] = { &Msg }; + PP.getDiagnostics().Report(PP.getFullLoc(Loc), DiagID, Strs, 1, &Range,1); return true; } bool Sema::Diag(SourceLocation Loc, unsigned DiagID, const std::string &Msg1, const std::string &Msg2, const SourceRange& Range) { - std::string MsgArr[] = { Msg1, Msg2 }; + const std::string *MsgArr[] = { &Msg1, &Msg2 }; PP.getDiagnostics().Report(PP.getFullLoc(Loc), DiagID, MsgArr, 2, &Range, 1); return true; } bool Sema::Diag(SourceLocation Loc, unsigned DiagID, const std::string &Msg1, const std::string &Msg2, const std::string &Msg3, - const SourceRange& R1) { - std::string MsgArr[] = { Msg1, Msg2, Msg3 }; + const SourceRange &R1) { + const std::string *MsgArr[] = { &Msg1, &Msg2, &Msg3 }; PP.getDiagnostics().Report(PP.getFullLoc(Loc), DiagID, MsgArr, 3, &R1, 1); return true; } @@ -223,14 +225,15 @@ bool Sema::Diag(SourceLocation Loc, unsigned DiagID, bool Sema::Diag(SourceLocation Loc, unsigned DiagID, const std::string &Msg, const SourceRange& R1, const SourceRange& R2) { SourceRange RangeArr[] = { R1, R2 }; - PP.getDiagnostics().Report(PP.getFullLoc(Loc), DiagID, &Msg, 1, RangeArr, 2); + const std::string *Strs[] = { &Msg }; + PP.getDiagnostics().Report(PP.getFullLoc(Loc), DiagID, Strs, 1, RangeArr, 2); return true; } bool Sema::Diag(SourceLocation Range, unsigned DiagID, const std::string &Msg1, const std::string &Msg2, const SourceRange& R1, const SourceRange& R2) { - std::string MsgArr[] = { Msg1, Msg2 }; + const std::string *MsgArr[] = { &Msg1, &Msg2 }; SourceRange RangeArr[] = { R1, R2 }; PP.getDiagnostics().Report(PP.getFullLoc(Range),DiagID, MsgArr,2,RangeArr, 2); return true;