diff options
author | Christof Douma <Christof.Douma@arm.com> | 2017-06-19 12:41:22 +0000 |
---|---|---|
committer | Christof Douma <Christof.Douma@arm.com> | 2017-06-19 12:41:22 +0000 |
commit | cc1c112806556e75453e0c9a1dc0f4038aecb4ef (patch) | |
tree | d4e0c606067c3b02167ef15e04bd7eff491a85d7 /clang/lib | |
parent | 9376007af71753be2ab3e2594fb4159ccd970520 (diff) | |
download | bcm5719-llvm-cc1c112806556e75453e0c9a1dc0f4038aecb4ef.tar.gz bcm5719-llvm-cc1c112806556e75453e0c9a1dc0f4038aecb4ef.zip |
Revert "[NFC] Refactor DiagnosticRenderer to use FullSourceLoc"
This reverts commit 305684.
This patch breaks extra/tools/clang-tidy
llvm-svn: 305688
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Basic/SourceLocation.cpp | 70 | ||||
-rw-r--r-- | clang/lib/Frontend/DiagnosticRenderer.cpp | 196 | ||||
-rw-r--r-- | clang/lib/Frontend/SerializedDiagnosticPrinter.cpp | 106 | ||||
-rw-r--r-- | clang/lib/Frontend/TextDiagnostic.cpp | 85 | ||||
-rw-r--r-- | clang/lib/Frontend/TextDiagnosticPrinter.cpp | 7 |
5 files changed, 227 insertions, 237 deletions
diff --git a/clang/lib/Basic/SourceLocation.cpp b/clang/lib/Basic/SourceLocation.cpp index 89ddbc946a4..a58d0465a6f 100644 --- a/clang/lib/Basic/SourceLocation.cpp +++ b/clang/lib/Basic/SourceLocation.cpp @@ -92,76 +92,6 @@ FullSourceLoc FullSourceLoc::getSpellingLoc() const { return FullSourceLoc(SrcMgr->getSpellingLoc(*this), *SrcMgr); } -FullSourceLoc FullSourceLoc::getFileLoc() const { - assert(isValid()); - return FullSourceLoc(SrcMgr->getFileLoc(*this), *SrcMgr); -} - -std::pair<FullSourceLoc, FullSourceLoc> -FullSourceLoc::getImmediateExpansionRange() const { - assert(isValid()); - std::pair<SourceLocation, SourceLocation> Range = - SrcMgr->getImmediateExpansionRange(*this); - return std::make_pair(FullSourceLoc(Range.first, *SrcMgr), - FullSourceLoc(Range.second, *SrcMgr)); -} - -PresumedLoc FullSourceLoc::getPresumedLoc(bool UseLineDirectives) const { - if (!isValid()) - return PresumedLoc(); - - return SrcMgr->getPresumedLoc(*this, UseLineDirectives); -} - -bool FullSourceLoc::isMacroArgExpansion(FullSourceLoc *StartLoc) const { - assert(isValid()); - return SrcMgr->isMacroArgExpansion(*this, StartLoc); -} - -FullSourceLoc FullSourceLoc::getImmediateMacroCallerLoc() const { - assert(isValid()); - return FullSourceLoc(SrcMgr->getImmediateMacroCallerLoc(*this), *SrcMgr); -} - -std::pair<FullSourceLoc, StringRef> FullSourceLoc::getModuleImportLoc() const { - if (!isValid()) - return std::make_pair(FullSourceLoc(), StringRef()); - - std::pair<SourceLocation, StringRef> ImportLoc = - SrcMgr->getModuleImportLoc(*this); - return std::make_pair(FullSourceLoc(ImportLoc.first, *SrcMgr), - ImportLoc.second); -} - -unsigned FullSourceLoc::getFileOffset() const { - assert(isValid()); - return SrcMgr->getFileOffset(*this); -} - -unsigned FullSourceLoc::getLineNumber(bool *Invalid) const { - assert(isValid()); - return SrcMgr->getLineNumber(getFileID(), getFileOffset(), Invalid); -} - -unsigned FullSourceLoc::getColumnNumber(bool *Invalid) const { - assert(isValid()); - return SrcMgr->getColumnNumber(getFileID(), getFileOffset(), Invalid); -} - -std::pair<FullSourceLoc, FullSourceLoc> -FullSourceLoc::getExpansionRange() const { - assert(isValid()); - std::pair<SourceLocation, SourceLocation> Range = - SrcMgr->getExpansionRange(*this); - return std::make_pair(FullSourceLoc(Range.first, *SrcMgr), - FullSourceLoc(Range.second, *SrcMgr)); -} - -const FileEntry *FullSourceLoc::getFileEntry() const { - assert(isValid()); - return SrcMgr->getFileEntryForID(getFileID()); -} - unsigned FullSourceLoc::getExpansionLineNumber(bool *Invalid) const { assert(isValid()); return SrcMgr->getExpansionLineNumber(*this, Invalid); diff --git a/clang/lib/Frontend/DiagnosticRenderer.cpp b/clang/lib/Frontend/DiagnosticRenderer.cpp index e3263843e29..177feac9744 100644 --- a/clang/lib/Frontend/DiagnosticRenderer.cpp +++ b/clang/lib/Frontend/DiagnosticRenderer.cpp @@ -76,19 +76,20 @@ static void mergeFixits(ArrayRef<FixItHint> FixItHints, } } -void DiagnosticRenderer::emitDiagnostic(FullSourceLoc Loc, +void DiagnosticRenderer::emitDiagnostic(SourceLocation Loc, DiagnosticsEngine::Level Level, StringRef Message, ArrayRef<CharSourceRange> Ranges, ArrayRef<FixItHint> FixItHints, + const SourceManager *SM, DiagOrStoredDiag D) { - assert(Loc.hasManager() || Loc.isInvalid()); + assert(SM || Loc.isInvalid()); beginDiagnostic(D, Level); if (!Loc.isValid()) // If we have no source location, just emit the diagnostic message. - emitDiagnosticMessage(Loc, PresumedLoc(), Level, Message, Ranges, D); + emitDiagnosticMessage(Loc, PresumedLoc(), Level, Message, Ranges, SM, D); else { // Get the ranges into a local array we can hack on. SmallVector<CharSourceRange, 20> MutableRanges(Ranges.begin(), @@ -96,7 +97,7 @@ void DiagnosticRenderer::emitDiagnostic(FullSourceLoc Loc, SmallVector<FixItHint, 8> MergedFixits; if (!FixItHints.empty()) { - mergeFixits(FixItHints, Loc.getManager(), LangOpts, MergedFixits); + mergeFixits(FixItHints, *SM, LangOpts, MergedFixits); FixItHints = MergedFixits; } @@ -106,25 +107,25 @@ void DiagnosticRenderer::emitDiagnostic(FullSourceLoc Loc, if (I->RemoveRange.isValid()) MutableRanges.push_back(I->RemoveRange); - FullSourceLoc UnexpandedLoc = Loc; + SourceLocation UnexpandedLoc = Loc; // Find the ultimate expansion location for the diagnostic. - Loc = Loc.getFileLoc(); + Loc = SM->getFileLoc(Loc); - PresumedLoc PLoc = Loc.getPresumedLoc(DiagOpts->ShowPresumedLoc); + PresumedLoc PLoc = SM->getPresumedLoc(Loc, DiagOpts->ShowPresumedLoc); // First, if this diagnostic is not in the main file, print out the // "included from" lines. - emitIncludeStack(Loc, PLoc, Level); + emitIncludeStack(Loc, PLoc, Level, *SM); // Next, emit the actual diagnostic message and caret. - emitDiagnosticMessage(Loc, PLoc, Level, Message, Ranges, D); - emitCaret(Loc, Level, MutableRanges, FixItHints); + emitDiagnosticMessage(Loc, PLoc, Level, Message, Ranges, SM, D); + emitCaret(Loc, Level, MutableRanges, FixItHints, *SM); // If this location is within a macro, walk from UnexpandedLoc up to Loc // and produce a macro backtrace. if (UnexpandedLoc.isValid() && UnexpandedLoc.isMacroID()) { - emitMacroExpansions(UnexpandedLoc, Level, MutableRanges, FixItHints); + emitMacroExpansions(UnexpandedLoc, Level, MutableRanges, FixItHints, *SM); } } @@ -138,12 +139,15 @@ void DiagnosticRenderer::emitDiagnostic(FullSourceLoc Loc, void DiagnosticRenderer::emitStoredDiagnostic(StoredDiagnostic &Diag) { emitDiagnostic(Diag.getLocation(), Diag.getLevel(), Diag.getMessage(), Diag.getRanges(), Diag.getFixIts(), + Diag.getLocation().isValid() ? &Diag.getLocation().getManager() + : nullptr, &Diag); } void DiagnosticRenderer::emitBasicNote(StringRef Message) { - emitDiagnosticMessage(FullSourceLoc(), PresumedLoc(), DiagnosticsEngine::Note, - Message, None, DiagOrStoredDiag()); + emitDiagnosticMessage( + SourceLocation(), PresumedLoc(), DiagnosticsEngine::Note, Message, + None, nullptr, DiagOrStoredDiag()); } /// \brief Prints an include stack when appropriate for a particular @@ -157,11 +161,12 @@ void DiagnosticRenderer::emitBasicNote(StringRef Message) { /// \param Loc The diagnostic location. /// \param PLoc The presumed location of the diagnostic location. /// \param Level The diagnostic level of the message this stack pertains to. -void DiagnosticRenderer::emitIncludeStack(FullSourceLoc Loc, PresumedLoc PLoc, - DiagnosticsEngine::Level Level) { - FullSourceLoc IncludeLoc = - PLoc.isInvalid() ? FullSourceLoc() - : FullSourceLoc(PLoc.getIncludeLoc(), Loc.getManager()); +void DiagnosticRenderer::emitIncludeStack(SourceLocation Loc, + PresumedLoc PLoc, + DiagnosticsEngine::Level Level, + const SourceManager &SM) { + SourceLocation IncludeLoc = + PLoc.isInvalid() ? SourceLocation() : PLoc.getIncludeLoc(); // Skip redundant include stacks altogether. if (LastIncludeLoc == IncludeLoc) @@ -173,70 +178,74 @@ void DiagnosticRenderer::emitIncludeStack(FullSourceLoc Loc, PresumedLoc PLoc, return; if (IncludeLoc.isValid()) - emitIncludeStackRecursively(IncludeLoc); + emitIncludeStackRecursively(IncludeLoc, SM); else { - emitModuleBuildStack(Loc.getManager()); - emitImportStack(Loc); + emitModuleBuildStack(SM); + emitImportStack(Loc, SM); } } /// \brief Helper to recursivly walk up the include stack and print each layer /// on the way back down. -void DiagnosticRenderer::emitIncludeStackRecursively(FullSourceLoc Loc) { +void DiagnosticRenderer::emitIncludeStackRecursively(SourceLocation Loc, + const SourceManager &SM) { if (Loc.isInvalid()) { - emitModuleBuildStack(Loc.getManager()); + emitModuleBuildStack(SM); return; } - - PresumedLoc PLoc = Loc.getPresumedLoc(DiagOpts->ShowPresumedLoc); + + PresumedLoc PLoc = SM.getPresumedLoc(Loc, DiagOpts->ShowPresumedLoc); if (PLoc.isInvalid()) return; // If this source location was imported from a module, print the module // import stack rather than the // FIXME: We want submodule granularity here. - std::pair<FullSourceLoc, StringRef> Imported = Loc.getModuleImportLoc(); + std::pair<SourceLocation, StringRef> Imported = SM.getModuleImportLoc(Loc); if (!Imported.second.empty()) { // This location was imported by a module. Emit the module import stack. - emitImportStackRecursively(Imported.first, Imported.second); + emitImportStackRecursively(Imported.first, Imported.second, SM); return; } // Emit the other include frames first. - emitIncludeStackRecursively( - FullSourceLoc(PLoc.getIncludeLoc(), Loc.getManager())); - + emitIncludeStackRecursively(PLoc.getIncludeLoc(), SM); + // Emit the inclusion text/note. - emitIncludeLocation(Loc, PLoc); + emitIncludeLocation(Loc, PLoc, SM); } /// \brief Emit the module import stack associated with the current location. -void DiagnosticRenderer::emitImportStack(FullSourceLoc Loc) { +void DiagnosticRenderer::emitImportStack(SourceLocation Loc, + const SourceManager &SM) { if (Loc.isInvalid()) { - emitModuleBuildStack(Loc.getManager()); + emitModuleBuildStack(SM); return; } - std::pair<FullSourceLoc, StringRef> NextImportLoc = Loc.getModuleImportLoc(); - emitImportStackRecursively(NextImportLoc.first, NextImportLoc.second); + std::pair<SourceLocation, StringRef> NextImportLoc + = SM.getModuleImportLoc(Loc); + emitImportStackRecursively(NextImportLoc.first, NextImportLoc.second, SM); } /// \brief Helper to recursivly walk up the import stack and print each layer /// on the way back down. -void DiagnosticRenderer::emitImportStackRecursively(FullSourceLoc Loc, - StringRef ModuleName) { +void DiagnosticRenderer::emitImportStackRecursively(SourceLocation Loc, + StringRef ModuleName, + const SourceManager &SM) { if (ModuleName.empty()) { return; } - PresumedLoc PLoc = Loc.getPresumedLoc(DiagOpts->ShowPresumedLoc); + PresumedLoc PLoc = SM.getPresumedLoc(Loc, DiagOpts->ShowPresumedLoc); // Emit the other import frames first. - std::pair<FullSourceLoc, StringRef> NextImportLoc = Loc.getModuleImportLoc(); - emitImportStackRecursively(NextImportLoc.first, NextImportLoc.second); + std::pair<SourceLocation, StringRef> NextImportLoc + = SM.getModuleImportLoc(Loc); + emitImportStackRecursively(NextImportLoc.first, NextImportLoc.second, SM); // Emit the inclusion text/note. - emitImportLocation(Loc, PLoc, ModuleName); + emitImportLocation(Loc, PLoc, ModuleName, SM); } /// \brief Emit the module build stack, for cases where a module is (re-)built @@ -244,9 +253,13 @@ void DiagnosticRenderer::emitImportStackRecursively(FullSourceLoc Loc, void DiagnosticRenderer::emitModuleBuildStack(const SourceManager &SM) { ModuleBuildStack Stack = SM.getModuleBuildStack(); for (unsigned I = 0, N = Stack.size(); I != N; ++I) { - emitBuildingModuleLocation(Stack[I].second, Stack[I].second.getPresumedLoc( + const SourceManager &CurSM = Stack[I].second.getManager(); + SourceLocation CurLoc = Stack[I].second; + emitBuildingModuleLocation(CurLoc, + CurSM.getPresumedLoc(CurLoc, DiagOpts->ShowPresumedLoc), - Stack[I].first); + Stack[I].first, + CurSM); } } @@ -335,12 +348,12 @@ static void computeCommonMacroArgExpansionFileIDs( // in the same expansion as the caret; otherwise, we crawl to the top of // each chain. Two locations are part of the same macro expansion // iff the FileID is the same. -static void -mapDiagnosticRanges(FullSourceLoc CaretLoc, ArrayRef<CharSourceRange> Ranges, - SmallVectorImpl<CharSourceRange> &SpellingRanges) { - FileID CaretLocFileID = CaretLoc.getFileID(); - - const SourceManager *SM = &CaretLoc.getManager(); +static void mapDiagnosticRanges( + SourceLocation CaretLoc, + ArrayRef<CharSourceRange> Ranges, + SmallVectorImpl<CharSourceRange> &SpellingRanges, + const SourceManager *SM) { + FileID CaretLocFileID = SM->getFileID(CaretLoc); for (auto I = Ranges.begin(), E = Ranges.end(); I != E; ++I) { if (I->isInvalid()) continue; @@ -391,39 +404,42 @@ mapDiagnosticRanges(FullSourceLoc CaretLoc, ArrayRef<CharSourceRange> Ranges, } } -void DiagnosticRenderer::emitCaret(FullSourceLoc Loc, +void DiagnosticRenderer::emitCaret(SourceLocation Loc, DiagnosticsEngine::Level Level, ArrayRef<CharSourceRange> Ranges, - ArrayRef<FixItHint> Hints) { + ArrayRef<FixItHint> Hints, + const SourceManager &SM) { SmallVector<CharSourceRange, 4> SpellingRanges; - mapDiagnosticRanges(Loc, Ranges, SpellingRanges); - emitCodeContext(Loc, Level, SpellingRanges, Hints); + mapDiagnosticRanges(Loc, Ranges, SpellingRanges, &SM); + emitCodeContext(Loc, Level, SpellingRanges, Hints, SM); } /// \brief A helper function for emitMacroExpansion to print the /// macro expansion message void DiagnosticRenderer::emitSingleMacroExpansion( - FullSourceLoc Loc, DiagnosticsEngine::Level Level, - ArrayRef<CharSourceRange> Ranges) { + SourceLocation Loc, + DiagnosticsEngine::Level Level, + ArrayRef<CharSourceRange> Ranges, + const SourceManager &SM) { // Find the spelling location for the macro definition. We must use the // spelling location here to avoid emitting a macro backtrace for the note. - FullSourceLoc SpellingLoc = Loc.getSpellingLoc(); + SourceLocation SpellingLoc = SM.getSpellingLoc(Loc); // Map the ranges into the FileID of the diagnostic location. SmallVector<CharSourceRange, 4> SpellingRanges; - mapDiagnosticRanges(Loc, Ranges, SpellingRanges); + mapDiagnosticRanges(Loc, Ranges, SpellingRanges, &SM); SmallString<100> MessageStorage; llvm::raw_svector_ostream Message(MessageStorage); - StringRef MacroName = Lexer::getImmediateMacroNameForDiagnostics( - Loc, Loc.getManager(), LangOpts); + StringRef MacroName = + Lexer::getImmediateMacroNameForDiagnostics(Loc, SM, LangOpts); if (MacroName.empty()) Message << "expanded from here"; else Message << "expanded from macro '" << MacroName << "'"; emitDiagnostic(SpellingLoc, DiagnosticsEngine::Note, Message.str(), - SpellingRanges, None); + SpellingRanges, None, &SM); } /// Check that the macro argument location of Loc starts with ArgumentLoc. @@ -457,12 +473,13 @@ static bool checkRangeForMacroArgExpansion(CharSourceRange Range, /// A helper function to check if the current ranges are all inside the same /// macro argument expansion as Loc. -static bool checkRangesForMacroArgExpansion(FullSourceLoc Loc, - ArrayRef<CharSourceRange> Ranges) { +static bool checkRangesForMacroArgExpansion(SourceLocation Loc, + ArrayRef<CharSourceRange> Ranges, + const SourceManager &SM) { assert(Loc.isMacroID() && "Must be a macro expansion!"); SmallVector<CharSourceRange, 4> SpellingRanges; - mapDiagnosticRanges(Loc, Ranges, SpellingRanges); + mapDiagnosticRanges(Loc, Ranges, SpellingRanges, &SM); /// Count all valid ranges. unsigned ValidCount = 0; @@ -473,15 +490,15 @@ static bool checkRangesForMacroArgExpansion(FullSourceLoc Loc, return false; /// To store the source location of the argument location. - FullSourceLoc ArgumentLoc; + SourceLocation ArgumentLoc; /// Set the ArgumentLoc to the beginning location of the expansion of Loc /// so to check if the ranges expands to the same beginning location. - if (!Loc.isMacroArgExpansion(&ArgumentLoc)) + if (!SM.isMacroArgExpansion(Loc,&ArgumentLoc)) return false; for (auto I = SpellingRanges.begin(), E = SpellingRanges.end(); I != E; ++I) { - if (!checkRangeForMacroArgExpansion(*I, Loc.getManager(), ArgumentLoc)) + if (!checkRangeForMacroArgExpansion(*I, SM, ArgumentLoc)) return false; } @@ -499,33 +516,34 @@ static bool checkRangesForMacroArgExpansion(FullSourceLoc Loc, /// \param Level The diagnostic level currently being emitted. /// \param Ranges The underlined ranges for this code snippet. /// \param Hints The FixIt hints active for this diagnostic. -void DiagnosticRenderer::emitMacroExpansions(FullSourceLoc Loc, +void DiagnosticRenderer::emitMacroExpansions(SourceLocation Loc, DiagnosticsEngine::Level Level, ArrayRef<CharSourceRange> Ranges, - ArrayRef<FixItHint> Hints) { + ArrayRef<FixItHint> Hints, + const SourceManager &SM) { assert(Loc.isValid() && "must have a valid source location here"); // Produce a stack of macro backtraces. - SmallVector<FullSourceLoc, 8> LocationStack; + SmallVector<SourceLocation, 8> LocationStack; unsigned IgnoredEnd = 0; while (Loc.isMacroID()) { // If this is the expansion of a macro argument, point the caret at the // use of the argument in the definition of the macro, not the expansion. - if (Loc.isMacroArgExpansion()) - LocationStack.push_back(Loc.getImmediateExpansionRange().first); + if (SM.isMacroArgExpansion(Loc)) + LocationStack.push_back(SM.getImmediateExpansionRange(Loc).first); else LocationStack.push_back(Loc); - if (checkRangesForMacroArgExpansion(Loc, Ranges)) + if (checkRangesForMacroArgExpansion(Loc, Ranges, SM)) IgnoredEnd = LocationStack.size(); - Loc = Loc.getImmediateMacroCallerLoc(); + Loc = SM.getImmediateMacroCallerLoc(Loc); // Once the location no longer points into a macro, try stepping through // the last found location. This sometimes produces additional useful // backtraces. if (Loc.isFileID()) - Loc = LocationStack.back().getImmediateMacroCallerLoc(); + Loc = SM.getImmediateMacroCallerLoc(LocationStack.back()); assert(Loc.isValid() && "must have a valid source location here"); } @@ -537,7 +555,7 @@ void DiagnosticRenderer::emitMacroExpansions(FullSourceLoc Loc, if (MacroDepth <= MacroLimit || MacroLimit == 0) { for (auto I = LocationStack.rbegin(), E = LocationStack.rend(); I != E; ++I) - emitSingleMacroExpansion(*I, Level, Ranges); + emitSingleMacroExpansion(*I, Level, Ranges, SM); return; } @@ -547,7 +565,7 @@ void DiagnosticRenderer::emitMacroExpansions(FullSourceLoc Loc, for (auto I = LocationStack.rbegin(), E = LocationStack.rbegin() + MacroStartMessages; I != E; ++I) - emitSingleMacroExpansion(*I, Level, Ranges); + emitSingleMacroExpansion(*I, Level, Ranges, SM); SmallString<200> MessageStorage; llvm::raw_svector_ostream Message(MessageStorage); @@ -559,24 +577,26 @@ void DiagnosticRenderer::emitMacroExpansions(FullSourceLoc Loc, for (auto I = LocationStack.rend() - MacroEndMessages, E = LocationStack.rend(); I != E; ++I) - emitSingleMacroExpansion(*I, Level, Ranges); + emitSingleMacroExpansion(*I, Level, Ranges, SM); } DiagnosticNoteRenderer::~DiagnosticNoteRenderer() {} -void DiagnosticNoteRenderer::emitIncludeLocation(FullSourceLoc Loc, - PresumedLoc PLoc) { +void DiagnosticNoteRenderer::emitIncludeLocation(SourceLocation Loc, + PresumedLoc PLoc, + const SourceManager &SM) { // Generate a note indicating the include location. SmallString<200> MessageStorage; llvm::raw_svector_ostream Message(MessageStorage); Message << "in file included from " << PLoc.getFilename() << ':' << PLoc.getLine() << ":"; - emitNote(Loc, Message.str()); + emitNote(Loc, Message.str(), &SM); } -void DiagnosticNoteRenderer::emitImportLocation(FullSourceLoc Loc, +void DiagnosticNoteRenderer::emitImportLocation(SourceLocation Loc, PresumedLoc PLoc, - StringRef ModuleName) { + StringRef ModuleName, + const SourceManager &SM) { // Generate a note indicating the include location. SmallString<200> MessageStorage; llvm::raw_svector_ostream Message(MessageStorage); @@ -585,12 +605,14 @@ void DiagnosticNoteRenderer::emitImportLocation(FullSourceLoc Loc, Message << "' imported from " << PLoc.getFilename() << ':' << PLoc.getLine(); Message << ":"; - emitNote(Loc, Message.str()); + emitNote(Loc, Message.str(), &SM); } -void DiagnosticNoteRenderer::emitBuildingModuleLocation(FullSourceLoc Loc, - PresumedLoc PLoc, - StringRef ModuleName) { +void +DiagnosticNoteRenderer::emitBuildingModuleLocation(SourceLocation Loc, + PresumedLoc PLoc, + StringRef ModuleName, + const SourceManager &SM) { // Generate a note indicating the include location. SmallString<200> MessageStorage; llvm::raw_svector_ostream Message(MessageStorage); @@ -599,5 +621,5 @@ void DiagnosticNoteRenderer::emitBuildingModuleLocation(FullSourceLoc Loc, << PLoc.getFilename() << ':' << PLoc.getLine() << ":"; else Message << "while building module '" << ModuleName << "':"; - emitNote(Loc, Message.str()); + emitNote(Loc, Message.str(), &SM); } diff --git a/clang/lib/Frontend/SerializedDiagnosticPrinter.cpp b/clang/lib/Frontend/SerializedDiagnosticPrinter.cpp index 7666fe10b38..b5a5acd8ad9 100644 --- a/clang/lib/Frontend/SerializedDiagnosticPrinter.cpp +++ b/clang/lib/Frontend/SerializedDiagnosticPrinter.cpp @@ -63,20 +63,27 @@ public: ~SDiagsRenderer() override {} protected: - void emitDiagnosticMessage(FullSourceLoc Loc, PresumedLoc PLoc, - DiagnosticsEngine::Level Level, StringRef Message, + void emitDiagnosticMessage(SourceLocation Loc, + PresumedLoc PLoc, + DiagnosticsEngine::Level Level, + StringRef Message, ArrayRef<CharSourceRange> Ranges, + const SourceManager *SM, DiagOrStoredDiag D) override; - void emitDiagnosticLoc(FullSourceLoc Loc, PresumedLoc PLoc, + void emitDiagnosticLoc(SourceLocation Loc, PresumedLoc PLoc, DiagnosticsEngine::Level Level, - ArrayRef<CharSourceRange> Ranges) override {} + ArrayRef<CharSourceRange> Ranges, + const SourceManager &SM) override {} - void emitNote(FullSourceLoc Loc, StringRef Message) override; + void emitNote(SourceLocation Loc, StringRef Message, + const SourceManager *SM) override; - void emitCodeContext(FullSourceLoc Loc, DiagnosticsEngine::Level Level, - SmallVectorImpl<CharSourceRange> &Ranges, - ArrayRef<FixItHint> Hints) override; + void emitCodeContext(SourceLocation Loc, + DiagnosticsEngine::Level Level, + SmallVectorImpl<CharSourceRange>& Ranges, + ArrayRef<FixItHint> Hints, + const SourceManager &SM) override; void beginDiagnostic(DiagOrStoredDiag D, DiagnosticsEngine::Level Level) override; @@ -186,8 +193,11 @@ private: void ExitDiagBlock(); /// \brief Emit a DIAG record. - void EmitDiagnosticMessage(FullSourceLoc Loc, PresumedLoc PLoc, - DiagnosticsEngine::Level Level, StringRef Message, + void EmitDiagnosticMessage(SourceLocation Loc, + PresumedLoc PLoc, + DiagnosticsEngine::Level Level, + StringRef Message, + const SourceManager *SM, DiagOrStoredDiag D); /// \brief Emit FIXIT and SOURCE_RANGE records for a diagnostic. @@ -210,14 +220,16 @@ private: /// \brief Emit (lazily) the file string and retrieved the file identifier. unsigned getEmitFile(const char *Filename); - /// \brief Add SourceLocation information the specified record. - void AddLocToRecord(FullSourceLoc Loc, PresumedLoc PLoc, - RecordDataImpl &Record, unsigned TokSize = 0); + /// \brief Add SourceLocation information the specified record. + void AddLocToRecord(SourceLocation Loc, const SourceManager *SM, + PresumedLoc PLoc, RecordDataImpl &Record, + unsigned TokSize = 0); /// \brief Add SourceLocation information the specified record. - void AddLocToRecord(FullSourceLoc Loc, RecordDataImpl &Record, + void AddLocToRecord(SourceLocation Loc, RecordDataImpl &Record, + const SourceManager *SM, unsigned TokSize = 0) { - AddLocToRecord(Loc, Loc.hasManager() ? Loc.getPresumedLoc() : PresumedLoc(), + AddLocToRecord(Loc, SM, SM ? SM->getPresumedLoc(Loc) : PresumedLoc(), Record, TokSize); } @@ -338,8 +350,11 @@ static void EmitRecordID(unsigned ID, const char *Name, Stream.EmitRecord(llvm::bitc::BLOCKINFO_CODE_SETRECORDNAME, Record); } -void SDiagsWriter::AddLocToRecord(FullSourceLoc Loc, PresumedLoc PLoc, - RecordDataImpl &Record, unsigned TokSize) { +void SDiagsWriter::AddLocToRecord(SourceLocation Loc, + const SourceManager *SM, + PresumedLoc PLoc, + RecordDataImpl &Record, + unsigned TokSize) { if (PLoc.isInvalid()) { // Emit a "sentinel" location. Record.push_back((unsigned)0); // File. @@ -352,19 +367,19 @@ void SDiagsWriter::AddLocToRecord(FullSourceLoc Loc, PresumedLoc PLoc, Record.push_back(getEmitFile(PLoc.getFilename())); Record.push_back(PLoc.getLine()); Record.push_back(PLoc.getColumn()+TokSize); - Record.push_back(Loc.getFileOffset()); + Record.push_back(SM->getFileOffset(Loc)); } void SDiagsWriter::AddCharSourceRangeToRecord(CharSourceRange Range, RecordDataImpl &Record, const SourceManager &SM) { - AddLocToRecord(FullSourceLoc(Range.getBegin(), SM), Record); + AddLocToRecord(Range.getBegin(), Record, &SM); unsigned TokSize = 0; if (Range.isTokenRange()) TokSize = Lexer::MeasureTokenLength(Range.getEnd(), SM, *LangOpts); - - AddLocToRecord(FullSourceLoc(Range.getEnd(), SM), Record, TokSize); + + AddLocToRecord(Range.getEnd(), Record, &SM, TokSize); } unsigned SDiagsWriter::getEmitFile(const char *FileName){ @@ -591,8 +606,8 @@ void SDiagsWriter::HandleDiagnostic(DiagnosticsEngine::Level DiagLevel, if (DiagLevel == DiagnosticsEngine::Note) EnterDiagBlock(); - EmitDiagnosticMessage(FullSourceLoc(), PresumedLoc(), DiagLevel, - State->diagBuf, &Info); + EmitDiagnosticMessage(SourceLocation(), PresumedLoc(), DiagLevel, + State->diagBuf, nullptr, &Info); if (DiagLevel == DiagnosticsEngine::Note) ExitDiagBlock(); @@ -603,9 +618,12 @@ void SDiagsWriter::HandleDiagnostic(DiagnosticsEngine::Level DiagLevel, assert(Info.hasSourceManager() && LangOpts && "Unexpected diagnostic with valid location outside of a source file"); SDiagsRenderer Renderer(*this, *LangOpts, &*State->DiagOpts); - Renderer.emitDiagnostic( - FullSourceLoc(Info.getLocation(), Info.getSourceManager()), DiagLevel, - State->diagBuf, Info.getRanges(), Info.getFixItHints(), &Info); + Renderer.emitDiagnostic(Info.getLocation(), DiagLevel, + State->diagBuf, + Info.getRanges(), + Info.getFixItHints(), + &Info.getSourceManager(), + &Info); } static serialized_diags::Level getStableLevel(DiagnosticsEngine::Level Level) { @@ -623,9 +641,11 @@ static serialized_diags::Level getStableLevel(DiagnosticsEngine::Level Level) { llvm_unreachable("invalid diagnostic level"); } -void SDiagsWriter::EmitDiagnosticMessage(FullSourceLoc Loc, PresumedLoc PLoc, +void SDiagsWriter::EmitDiagnosticMessage(SourceLocation Loc, + PresumedLoc PLoc, DiagnosticsEngine::Level Level, StringRef Message, + const SourceManager *SM, DiagOrStoredDiag D) { llvm::BitstreamWriter &Stream = State->Stream; RecordData &Record = State->Record; @@ -635,7 +655,7 @@ void SDiagsWriter::EmitDiagnosticMessage(FullSourceLoc Loc, PresumedLoc PLoc, Record.clear(); Record.push_back(RECORD_DIAG); Record.push_back(getStableLevel(Level)); - AddLocToRecord(Loc, PLoc, Record); + AddLocToRecord(Loc, SM, PLoc, Record); if (const Diagnostic *Info = D.dyn_cast<const Diagnostic*>()) { // Emit the category string lazily and get the category ID. @@ -652,11 +672,15 @@ void SDiagsWriter::EmitDiagnosticMessage(FullSourceLoc Loc, PresumedLoc PLoc, Stream.EmitRecordWithBlob(Abbrevs.get(RECORD_DIAG), Record, Message); } -void SDiagsRenderer::emitDiagnosticMessage( - FullSourceLoc Loc, PresumedLoc PLoc, DiagnosticsEngine::Level Level, - StringRef Message, ArrayRef<clang::CharSourceRange> Ranges, - DiagOrStoredDiag D) { - Writer.EmitDiagnosticMessage(Loc, PLoc, Level, Message, D); +void +SDiagsRenderer::emitDiagnosticMessage(SourceLocation Loc, + PresumedLoc PLoc, + DiagnosticsEngine::Level Level, + StringRef Message, + ArrayRef<clang::CharSourceRange> Ranges, + const SourceManager *SM, + DiagOrStoredDiag D) { + Writer.EmitDiagnosticMessage(Loc, PLoc, Level, Message, SM, D); } void SDiagsWriter::EnterDiagBlock() { @@ -709,18 +733,20 @@ void SDiagsWriter::EmitCodeContext(SmallVectorImpl<CharSourceRange> &Ranges, } } -void SDiagsRenderer::emitCodeContext(FullSourceLoc Loc, +void SDiagsRenderer::emitCodeContext(SourceLocation Loc, DiagnosticsEngine::Level Level, SmallVectorImpl<CharSourceRange> &Ranges, - ArrayRef<FixItHint> Hints) { - Writer.EmitCodeContext(Ranges, Hints, Loc.getManager()); + ArrayRef<FixItHint> Hints, + const SourceManager &SM) { + Writer.EmitCodeContext(Ranges, Hints, SM); } -void SDiagsRenderer::emitNote(FullSourceLoc Loc, StringRef Message) { +void SDiagsRenderer::emitNote(SourceLocation Loc, StringRef Message, + const SourceManager *SM) { Writer.EnterDiagBlock(); - PresumedLoc PLoc = Loc.hasManager() ? Loc.getPresumedLoc() : PresumedLoc(); - Writer.EmitDiagnosticMessage(Loc, PLoc, DiagnosticsEngine::Note, Message, - DiagOrStoredDiag()); + PresumedLoc PLoc = SM ? SM->getPresumedLoc(Loc) : PresumedLoc(); + Writer.EmitDiagnosticMessage(Loc, PLoc, DiagnosticsEngine::Note, + Message, SM, DiagOrStoredDiag()); Writer.ExitDiagBlock(); } diff --git a/clang/lib/Frontend/TextDiagnostic.cpp b/clang/lib/Frontend/TextDiagnostic.cpp index 1e12ea5e597..a24d5768f55 100644 --- a/clang/lib/Frontend/TextDiagnostic.cpp +++ b/clang/lib/Frontend/TextDiagnostic.cpp @@ -672,16 +672,20 @@ TextDiagnostic::TextDiagnostic(raw_ostream &OS, TextDiagnostic::~TextDiagnostic() {} -void TextDiagnostic::emitDiagnosticMessage( - FullSourceLoc Loc, PresumedLoc PLoc, DiagnosticsEngine::Level Level, - StringRef Message, ArrayRef<clang::CharSourceRange> Ranges, - DiagOrStoredDiag D) { +void +TextDiagnostic::emitDiagnosticMessage(SourceLocation Loc, + PresumedLoc PLoc, + DiagnosticsEngine::Level Level, + StringRef Message, + ArrayRef<clang::CharSourceRange> Ranges, + const SourceManager *SM, + DiagOrStoredDiag D) { uint64_t StartOfLocationInfo = OS.tell(); // Emit the location of this particular diagnostic. if (Loc.isValid()) - emitDiagnosticLoc(Loc, PLoc, Level, Ranges); - + emitDiagnosticLoc(Loc, PLoc, Level, Ranges, *SM); + if (DiagOpts->ShowColors) OS.resetColor(); @@ -783,16 +787,17 @@ void TextDiagnostic::emitFilename(StringRef Filename, const SourceManager &SM) { /// This includes extracting as much location information as is present for /// the diagnostic and printing it, as well as any include stack or source /// ranges necessary. -void TextDiagnostic::emitDiagnosticLoc(FullSourceLoc Loc, PresumedLoc PLoc, +void TextDiagnostic::emitDiagnosticLoc(SourceLocation Loc, PresumedLoc PLoc, DiagnosticsEngine::Level Level, - ArrayRef<CharSourceRange> Ranges) { + ArrayRef<CharSourceRange> Ranges, + const SourceManager &SM) { if (PLoc.isInvalid()) { // At least print the file name if available: - FileID FID = Loc.getFileID(); + FileID FID = SM.getFileID(Loc); if (FID.isValid()) { - const FileEntry *FE = Loc.getFileEntry(); + const FileEntry* FE = SM.getFileEntryForID(FID); if (FE && FE->isValid()) { - emitFilename(FE->getName(), Loc.getManager()); + emitFilename(FE->getName(), SM); if (FE->isInPCH()) OS << " (in PCH)"; OS << ": "; @@ -808,7 +813,7 @@ void TextDiagnostic::emitDiagnosticLoc(FullSourceLoc Loc, PresumedLoc PLoc, if (DiagOpts->ShowColors) OS.changeColor(savedColor, true); - emitFilename(PLoc.getFilename(), Loc.getManager()); + emitFilename(PLoc.getFilename(), SM); switch (DiagOpts->getFormat()) { case DiagnosticOptions::Clang: OS << ':' << LineNo; break; case DiagnosticOptions::MSVC: OS << '(' << LineNo; break; @@ -843,7 +848,8 @@ void TextDiagnostic::emitDiagnosticLoc(FullSourceLoc Loc, PresumedLoc PLoc, } if (DiagOpts->ShowSourceRanges && !Ranges.empty()) { - FileID CaretFileID = Loc.getExpansionLoc().getFileID(); + FileID CaretFileID = + SM.getFileID(SM.getExpansionLoc(Loc)); bool PrintedRange = false; for (ArrayRef<CharSourceRange>::const_iterator RI = Ranges.begin(), @@ -852,10 +858,8 @@ void TextDiagnostic::emitDiagnosticLoc(FullSourceLoc Loc, PresumedLoc PLoc, // Ignore invalid ranges. if (!RI->isValid()) continue; - FullSourceLoc B = - FullSourceLoc(RI->getBegin(), Loc.getManager()).getExpansionLoc(); - FullSourceLoc E = - FullSourceLoc(RI->getEnd(), Loc.getManager()).getExpansionLoc(); + SourceLocation B = SM.getExpansionLoc(RI->getBegin()); + SourceLocation E = SM.getExpansionLoc(RI->getEnd()); // If the End location and the start location are the same and are a // macro location, then the range was something that came from a @@ -863,12 +867,10 @@ void TextDiagnostic::emitDiagnosticLoc(FullSourceLoc Loc, PresumedLoc PLoc, // best we can do is to highlight the range. If this is a // function-like macro, we'd also like to highlight the arguments. if (B == E && RI->getEnd().isMacroID()) - E = FullSourceLoc(RI->getEnd(), Loc.getManager()) - .getExpansionRange() - .second; + E = SM.getExpansionRange(RI->getEnd()).second; - std::pair<FileID, unsigned> BInfo = B.getDecomposedLoc(); - std::pair<FileID, unsigned> EInfo = E.getDecomposedLoc(); + std::pair<FileID, unsigned> BInfo = SM.getDecomposedLoc(B); + std::pair<FileID, unsigned> EInfo = SM.getDecomposedLoc(E); // If the start or end of the range is in another file, just discard // it. @@ -879,10 +881,13 @@ void TextDiagnostic::emitDiagnosticLoc(FullSourceLoc Loc, PresumedLoc PLoc, // tokens. unsigned TokSize = 0; if (RI->isTokenRange()) - TokSize = Lexer::MeasureTokenLength(E, E.getManager(), LangOpts); + TokSize = Lexer::MeasureTokenLength(E, SM, LangOpts); - OS << '{' << B.getLineNumber() << ':' << B.getColumnNumber() << '-' - << E.getLineNumber() << ':' << (E.getColumnNumber() + TokSize) << '}'; + OS << '{' << SM.getLineNumber(BInfo.first, BInfo.second) << ':' + << SM.getColumnNumber(BInfo.first, BInfo.second) << '-' + << SM.getLineNumber(EInfo.first, EInfo.second) << ':' + << (SM.getColumnNumber(EInfo.first, EInfo.second)+TokSize) + << '}'; PrintedRange = true; } @@ -892,7 +897,9 @@ void TextDiagnostic::emitDiagnosticLoc(FullSourceLoc Loc, PresumedLoc PLoc, OS << ' '; } -void TextDiagnostic::emitIncludeLocation(FullSourceLoc Loc, PresumedLoc PLoc) { +void TextDiagnostic::emitIncludeLocation(SourceLocation Loc, + PresumedLoc PLoc, + const SourceManager &SM) { if (DiagOpts->ShowLocation && PLoc.isValid()) OS << "In file included from " << PLoc.getFilename() << ':' << PLoc.getLine() << ":\n"; @@ -900,8 +907,9 @@ void TextDiagnostic::emitIncludeLocation(FullSourceLoc Loc, PresumedLoc PLoc) { OS << "In included file:\n"; } -void TextDiagnostic::emitImportLocation(FullSourceLoc Loc, PresumedLoc PLoc, - StringRef ModuleName) { +void TextDiagnostic::emitImportLocation(SourceLocation Loc, PresumedLoc PLoc, + StringRef ModuleName, + const SourceManager &SM) { if (DiagOpts->ShowLocation && PLoc.isValid()) OS << "In module '" << ModuleName << "' imported from " << PLoc.getFilename() << ':' << PLoc.getLine() << ":\n"; @@ -909,9 +917,10 @@ void TextDiagnostic::emitImportLocation(FullSourceLoc Loc, PresumedLoc PLoc, OS << "In module '" << ModuleName << "':\n"; } -void TextDiagnostic::emitBuildingModuleLocation(FullSourceLoc Loc, +void TextDiagnostic::emitBuildingModuleLocation(SourceLocation Loc, PresumedLoc PLoc, - StringRef ModuleName) { + StringRef ModuleName, + const SourceManager &SM) { if (DiagOpts->ShowLocation && PLoc.isValid()) OS << "While building module '" << ModuleName << "' imported from " << PLoc.getFilename() << ':' << PLoc.getLine() << ":\n"; @@ -1125,8 +1134,10 @@ static std::string buildFixItInsertionLine(unsigned LineNo, /// \param Ranges The underlined ranges for this code snippet. /// \param Hints The FixIt hints active for this diagnostic. void TextDiagnostic::emitSnippetAndCaret( - FullSourceLoc Loc, DiagnosticsEngine::Level Level, - SmallVectorImpl<CharSourceRange> &Ranges, ArrayRef<FixItHint> Hints) { + SourceLocation Loc, DiagnosticsEngine::Level Level, + SmallVectorImpl<CharSourceRange>& Ranges, + ArrayRef<FixItHint> Hints, + const SourceManager &SM) { assert(Loc.isValid() && "must have a valid source location here"); assert(Loc.isFileID() && "must have a file location here"); @@ -1143,18 +1154,18 @@ void TextDiagnostic::emitSnippetAndCaret( return; // Decompose the location into a FID/Offset pair. - std::pair<FileID, unsigned> LocInfo = Loc.getDecomposedLoc(); + std::pair<FileID, unsigned> LocInfo = SM.getDecomposedLoc(Loc); FileID FID = LocInfo.first; - const SourceManager &SM = Loc.getManager(); + unsigned CaretFileOffset = LocInfo.second; // Get information about the buffer it points into. bool Invalid = false; - StringRef BufData = Loc.getBufferData(&Invalid); + StringRef BufData = SM.getBufferData(FID, &Invalid); if (Invalid) return; - unsigned CaretLineNo = Loc.getLineNumber(); - unsigned CaretColNo = Loc.getColumnNumber(); + unsigned CaretLineNo = SM.getLineNumber(FID, CaretFileOffset); + unsigned CaretColNo = SM.getColumnNumber(FID, CaretFileOffset); // Arbitrarily stop showing snippets when the line is too long. static const size_t MaxLineLengthToPrint = 4096; diff --git a/clang/lib/Frontend/TextDiagnosticPrinter.cpp b/clang/lib/Frontend/TextDiagnosticPrinter.cpp index 5dd3252d5b1..17646b48e23 100644 --- a/clang/lib/Frontend/TextDiagnosticPrinter.cpp +++ b/clang/lib/Frontend/TextDiagnosticPrinter.cpp @@ -150,9 +150,10 @@ void TextDiagnosticPrinter::HandleDiagnostic(DiagnosticsEngine::Level Level, "Unexpected diagnostic with no source manager"); assert(TextDiag && "Unexpected diagnostic outside source file processing"); - TextDiag->emitDiagnostic( - FullSourceLoc(Info.getLocation(), Info.getSourceManager()), Level, - DiagMessageStream.str(), Info.getRanges(), Info.getFixItHints()); + TextDiag->emitDiagnostic(Info.getLocation(), Level, DiagMessageStream.str(), + Info.getRanges(), + Info.getFixItHints(), + &Info.getSourceManager()); OS.flush(); } |