[cfe-commits] r156536 - in /cfe/trunk: include/clang/Frontend/DiagnosticRenderer.h include/clang/Frontend/TextDiagnostic.h include/clang/Frontend/TextDiagnosticPrinter.h lib/Frontend/DiagnosticRenderer.cpp lib/Frontend/SerializedDiagnosticPrinter.cpp lib/Frontend/TextDiagnostic.cpp lib/Frontend/TextDiagnosticPrinter.cpp test/Misc/serialized-diags-frontend.c tools/libclang/CIndexDiagnostic.cpp
Ted Kremenek
kremenek at apple.com
Wed May 9 22:41:41 PDT 2012
Thanks so much!
On May 9, 2012, at 10:03 PM, Argyrios Kyrtzidis <akyrtzi at gmail.com> wrote:
> Author: akirtzidis
> Date: Thu May 10 00:03:45 2012
> New Revision: 156536
>
> URL: http://llvm.org/viewvc/llvm-project?rev=156536&view=rev
> Log:
> Fix an assertion hit when the serialized diagnostics writer receive a diagnostic
> from the frontend when the location is invalid and the SourceManager null.
>
> Instead of keeping the SourceManager object in DiagnosticRenderer, propagate it
> to the calls accordingly (as reference when it is expected to not be null, or pointer
> when it may be null).
> This effectively makes DiagnosticRenderer not tied to a specific SourceManager,
> removing a hack from TextDiagnosticPrinter.
>
> rdar://11386874
>
> Added:
> cfe/trunk/test/Misc/serialized-diags-frontend.c
> Modified:
> cfe/trunk/include/clang/Frontend/DiagnosticRenderer.h
> cfe/trunk/include/clang/Frontend/TextDiagnostic.h
> cfe/trunk/include/clang/Frontend/TextDiagnosticPrinter.h
> cfe/trunk/lib/Frontend/DiagnosticRenderer.cpp
> cfe/trunk/lib/Frontend/SerializedDiagnosticPrinter.cpp
> cfe/trunk/lib/Frontend/TextDiagnostic.cpp
> cfe/trunk/lib/Frontend/TextDiagnosticPrinter.cpp
> cfe/trunk/tools/libclang/CIndexDiagnostic.cpp
>
> Modified: cfe/trunk/include/clang/Frontend/DiagnosticRenderer.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/DiagnosticRenderer.h?rev=156536&r1=156535&r2=156536&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Frontend/DiagnosticRenderer.h (original)
> +++ cfe/trunk/include/clang/Frontend/DiagnosticRenderer.h Thu May 10 00:03:45 2012
> @@ -43,7 +43,6 @@
> /// class.
> class DiagnosticRenderer {
> protected:
> - const SourceManager &SM;
> const LangOptions &LangOpts;
> const DiagnosticOptions &DiagOpts;
>
> @@ -66,8 +65,7 @@
> /// which change the amount of information displayed.
> DiagnosticsEngine::Level LastLevel;
>
> - DiagnosticRenderer(const SourceManager &SM,
> - const LangOptions &LangOpts,
> + DiagnosticRenderer(const LangOptions &LangOpts,
> const DiagnosticOptions &DiagOpts);
>
> virtual ~DiagnosticRenderer();
> @@ -76,20 +74,24 @@
> DiagnosticsEngine::Level Level,
> StringRef Message,
> ArrayRef<CharSourceRange> Ranges,
> + const SourceManager *SM,
> DiagOrStoredDiag Info) = 0;
>
> virtual void emitDiagnosticLoc(SourceLocation Loc, PresumedLoc PLoc,
> DiagnosticsEngine::Level Level,
> - ArrayRef<CharSourceRange> Ranges) = 0;
> + ArrayRef<CharSourceRange> Ranges,
> + const SourceManager &SM) = 0;
>
> virtual void emitBasicNote(StringRef Message) = 0;
>
> virtual void emitCodeContext(SourceLocation Loc,
> DiagnosticsEngine::Level Level,
> SmallVectorImpl<CharSourceRange>& Ranges,
> - ArrayRef<FixItHint> Hints) = 0;
> + ArrayRef<FixItHint> Hints,
> + const SourceManager &SM) = 0;
>
> - virtual void emitIncludeLocation(SourceLocation Loc, PresumedLoc PLoc) = 0;
> + virtual void emitIncludeLocation(SourceLocation Loc, PresumedLoc PLoc,
> + const SourceManager &SM) = 0;
>
> virtual void beginDiagnostic(DiagOrStoredDiag D,
> DiagnosticsEngine::Level Level) {}
> @@ -98,12 +100,14 @@
>
>
> private:
> - void emitIncludeStack(SourceLocation Loc, DiagnosticsEngine::Level Level);
> - void emitIncludeStackRecursively(SourceLocation Loc);
> + void emitIncludeStack(SourceLocation Loc, DiagnosticsEngine::Level Level,
> + const SourceManager &SM);
> + void emitIncludeStackRecursively(SourceLocation Loc, const SourceManager &SM);
> void emitMacroExpansionsAndCarets(SourceLocation Loc,
> DiagnosticsEngine::Level Level,
> SmallVectorImpl<CharSourceRange>& Ranges,
> ArrayRef<FixItHint> Hints,
> + const SourceManager &SM,
> unsigned &MacroDepth,
> unsigned OnMacroInst = 0);
> public:
> @@ -119,9 +123,12 @@
> /// \param Message The diagnostic message to emit.
> /// \param Ranges The underlined ranges for this code snippet.
> /// \param FixItHints The FixIt hints active for this diagnostic.
> + /// \param SM The SourceManager; will be null if the diagnostic came from the
> + /// frontend, thus \param Loc will be invalid.
> void emitDiagnostic(SourceLocation Loc, DiagnosticsEngine::Level Level,
> StringRef Message, ArrayRef<CharSourceRange> Ranges,
> ArrayRef<FixItHint> FixItHints,
> + const SourceManager *SM,
> DiagOrStoredDiag D = (Diagnostic *)0);
>
> void emitStoredDiagnostic(StoredDiagnostic &Diag);
> @@ -131,19 +138,20 @@
> /// notes. It is up to subclasses to further define the behavior.
> class DiagnosticNoteRenderer : public DiagnosticRenderer {
> public:
> - DiagnosticNoteRenderer(const SourceManager &SM,
> - const LangOptions &LangOpts,
> + DiagnosticNoteRenderer(const LangOptions &LangOpts,
> const DiagnosticOptions &DiagOpts)
> - : DiagnosticRenderer(SM, LangOpts, DiagOpts) {}
> + : DiagnosticRenderer(LangOpts, DiagOpts) {}
>
> virtual ~DiagnosticNoteRenderer();
>
> virtual void emitBasicNote(StringRef Message);
>
> virtual void emitIncludeLocation(SourceLocation Loc,
> - PresumedLoc PLoc);
> + PresumedLoc PLoc,
> + const SourceManager &SM);
>
> - virtual void emitNote(SourceLocation Loc, StringRef Message) = 0;
> + virtual void emitNote(SourceLocation Loc, StringRef Message,
> + const SourceManager *SM) = 0;
> };
> } // end clang namespace
> #endif
>
> Modified: cfe/trunk/include/clang/Frontend/TextDiagnostic.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/TextDiagnostic.h?rev=156536&r1=156535&r2=156536&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Frontend/TextDiagnostic.h (original)
> +++ cfe/trunk/include/clang/Frontend/TextDiagnostic.h Thu May 10 00:03:45 2012
> @@ -39,7 +39,6 @@
>
> public:
> TextDiagnostic(raw_ostream &OS,
> - const SourceManager &SM,
> const LangOptions &LangOpts,
> const DiagnosticOptions &DiagOpts);
>
> @@ -83,39 +82,46 @@
> DiagnosticsEngine::Level Level,
> StringRef Message,
> ArrayRef<CharSourceRange> Ranges,
> + const SourceManager *SM,
> DiagOrStoredDiag D);
>
> virtual void emitDiagnosticLoc(SourceLocation Loc, PresumedLoc PLoc,
> DiagnosticsEngine::Level Level,
> - ArrayRef<CharSourceRange> Ranges);
> + ArrayRef<CharSourceRange> Ranges,
> + const SourceManager &SM);
>
> virtual void emitCodeContext(SourceLocation Loc,
> DiagnosticsEngine::Level Level,
> SmallVectorImpl<CharSourceRange>& Ranges,
> - ArrayRef<FixItHint> Hints) {
> - emitSnippetAndCaret(Loc, Level, Ranges, Hints);
> + ArrayRef<FixItHint> Hints,
> + const SourceManager &SM) {
> + emitSnippetAndCaret(Loc, Level, Ranges, Hints, SM);
> }
>
> virtual void emitBasicNote(StringRef Message);
>
> - virtual void emitIncludeLocation(SourceLocation Loc, PresumedLoc PLoc);
> + virtual void emitIncludeLocation(SourceLocation Loc, PresumedLoc PLoc,
> + const SourceManager &SM);
>
> private:
> void emitSnippetAndCaret(SourceLocation Loc, DiagnosticsEngine::Level Level,
> SmallVectorImpl<CharSourceRange>& Ranges,
> - ArrayRef<FixItHint> Hints);
> + ArrayRef<FixItHint> Hints,
> + const SourceManager &SM);
>
> void emitSnippet(StringRef SourceLine);
>
> void highlightRange(const CharSourceRange &R,
> unsigned LineNo, FileID FID,
> const SourceColumnMap &map,
> - std::string &CaretLine);
> + std::string &CaretLine,
> + const SourceManager &SM);
>
> std::string buildFixItInsertionLine(unsigned LineNo,
> const SourceColumnMap &map,
> - ArrayRef<FixItHint> Hints);
> - void emitParseableFixits(ArrayRef<FixItHint> Hints);
> + ArrayRef<FixItHint> Hints,
> + const SourceManager &SM);
> + void emitParseableFixits(ArrayRef<FixItHint> Hints, const SourceManager &SM);
> };
>
> } // end namespace clang
>
> Modified: cfe/trunk/include/clang/Frontend/TextDiagnosticPrinter.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/TextDiagnosticPrinter.h?rev=156536&r1=156535&r2=156536&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Frontend/TextDiagnosticPrinter.h (original)
> +++ cfe/trunk/include/clang/Frontend/TextDiagnosticPrinter.h Thu May 10 00:03:45 2012
> @@ -26,9 +26,7 @@
>
> class TextDiagnosticPrinter : public DiagnosticConsumer {
> raw_ostream &OS;
> - const LangOptions *LangOpts;
> const DiagnosticOptions *DiagOpts;
> - const SourceManager *SM;
>
> /// \brief Handle to the currently active text diagnostic emitter.
> OwningPtr<TextDiagnostic> TextDiag;
>
> Modified: cfe/trunk/lib/Frontend/DiagnosticRenderer.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/DiagnosticRenderer.cpp?rev=156536&r1=156535&r2=156536&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Frontend/DiagnosticRenderer.cpp (original)
> +++ cfe/trunk/lib/Frontend/DiagnosticRenderer.cpp Thu May 10 00:03:45 2012
> @@ -123,10 +123,9 @@
> return SM.getPresumedLoc(Loc);
> }
>
> -DiagnosticRenderer::DiagnosticRenderer(const SourceManager &SM,
> - const LangOptions &LangOpts,
> +DiagnosticRenderer::DiagnosticRenderer(const LangOptions &LangOpts,
> const DiagnosticOptions &DiagOpts)
> -: SM(SM), LangOpts(LangOpts), DiagOpts(DiagOpts), LastLevel() {}
> +: LangOpts(LangOpts), DiagOpts(DiagOpts), LastLevel() {}
>
> DiagnosticRenderer::~DiagnosticRenderer() {}
>
> @@ -184,18 +183,23 @@
> StringRef Message,
> ArrayRef<CharSourceRange> Ranges,
> ArrayRef<FixItHint> FixItHints,
> + const SourceManager *SM,
> DiagOrStoredDiag D) {
> + assert(SM || Loc.isInvalid());
>
> beginDiagnostic(D, Level);
>
> - PresumedLoc PLoc = getDiagnosticPresumedLoc(SM, Loc);
> + PresumedLoc PLoc;
> + if (Loc.isValid()) {
> + PLoc = getDiagnosticPresumedLoc(*SM, Loc);
>
> - // First, if this diagnostic is not in the main file, print out the
> - // "included from" lines.
> - emitIncludeStack(PLoc.getIncludeLoc(), Level);
> + // First, if this diagnostic is not in the main file, print out the
> + // "included from" lines.
> + emitIncludeStack(PLoc.getIncludeLoc(), Level, *SM);
> + }
>
> // Next, emit the actual diagnostic message.
> - emitDiagnosticMessage(Loc, PLoc, Level, Message, Ranges, D);
> + emitDiagnosticMessage(Loc, PLoc, Level, Message, Ranges, SM, D);
>
> // Only recurse if we have a valid location.
> if (Loc.isValid()) {
> @@ -205,7 +209,7 @@
>
> llvm::SmallVector<FixItHint, 8> MergedFixits;
> if (!FixItHints.empty()) {
> - mergeFixits(FixItHints, SM, LangOpts, MergedFixits);
> + mergeFixits(FixItHints, *SM, LangOpts, MergedFixits);
> FixItHints = MergedFixits;
> }
>
> @@ -216,7 +220,7 @@
> MutableRanges.push_back(I->RemoveRange);
>
> unsigned MacroDepth = 0;
> - emitMacroExpansionsAndCarets(Loc, Level, MutableRanges, FixItHints,
> + emitMacroExpansionsAndCarets(Loc, Level, MutableRanges, FixItHints, *SM,
> MacroDepth);
> }
>
> @@ -230,6 +234,8 @@
> void DiagnosticRenderer::emitStoredDiagnostic(StoredDiagnostic &Diag) {
> emitDiagnostic(Diag.getLocation(), Diag.getLevel(), Diag.getMessage(),
> Diag.getRanges(), Diag.getFixIts(),
> + Diag.getLocation().isValid() ? &Diag.getLocation().getManager()
> + : 0,
> &Diag);
> }
>
> @@ -245,7 +251,8 @@
> /// \param Loc The include location of the current file (not the diagnostic
> /// location).
> void DiagnosticRenderer::emitIncludeStack(SourceLocation Loc,
> - DiagnosticsEngine::Level Level) {
> + DiagnosticsEngine::Level Level,
> + const SourceManager &SM) {
> // Skip redundant include stacks altogether.
> if (LastIncludeLoc == Loc)
> return;
> @@ -254,12 +261,13 @@
> if (!DiagOpts.ShowNoteIncludeStack && Level == DiagnosticsEngine::Note)
> return;
>
> - emitIncludeStackRecursively(Loc);
> + emitIncludeStackRecursively(Loc, SM);
> }
>
> /// \brief Helper to recursivly walk up the include stack and print each layer
> /// on the way back down.
> -void DiagnosticRenderer::emitIncludeStackRecursively(SourceLocation Loc) {
> +void DiagnosticRenderer::emitIncludeStackRecursively(SourceLocation Loc,
> + const SourceManager &SM) {
> if (Loc.isInvalid())
> return;
>
> @@ -268,10 +276,10 @@
> return;
>
> // Emit the other include frames first.
> - emitIncludeStackRecursively(PLoc.getIncludeLoc());
> + emitIncludeStackRecursively(PLoc.getIncludeLoc(), SM);
>
> // Emit the inclusion text/note.
> - emitIncludeLocation(Loc, PLoc);
> + emitIncludeLocation(Loc, PLoc, SM);
> }
>
> /// \brief Recursively emit notes for each macro expansion and caret
> @@ -292,6 +300,7 @@
> DiagnosticsEngine::Level Level,
> SmallVectorImpl<CharSourceRange>& Ranges,
> ArrayRef<FixItHint> Hints,
> + const SourceManager &SM,
> unsigned &MacroDepth,
> unsigned OnMacroInst)
> {
> @@ -302,7 +311,7 @@
> if (Loc.isFileID()) {
> assert(MacroDepth == 0 && "We shouldn't hit a leaf node twice!");
> MacroDepth = OnMacroInst;
> - emitCodeContext(Loc, Level, Ranges, Hints);
> + emitCodeContext(Loc, Level, Ranges, Hints, SM);
> return;
> }
> // Otherwise recurse through each macro expansion layer.
> @@ -314,7 +323,7 @@
> SourceLocation OneLevelUp = getImmediateMacroCallerLoc(SM, Loc);
>
> // FIXME: Map ranges?
> - emitMacroExpansionsAndCarets(OneLevelUp, Level, Ranges, Hints, MacroDepth,
> + emitMacroExpansionsAndCarets(OneLevelUp, Level, Ranges, Hints, SM, MacroDepth,
> OnMacroInst + 1);
>
> // Save the original location so we can find the spelling of the macro call.
> @@ -365,22 +374,23 @@
> << getImmediateMacroName(MacroLoc, SM, LangOpts) << "'";
> emitDiagnostic(SM.getSpellingLoc(Loc), DiagnosticsEngine::Note,
> Message.str(),
> - Ranges, ArrayRef<FixItHint>());
> + Ranges, ArrayRef<FixItHint>(), &SM);
> }
>
> DiagnosticNoteRenderer::~DiagnosticNoteRenderer() {}
>
> void DiagnosticNoteRenderer::emitIncludeLocation(SourceLocation Loc,
> - PresumedLoc PLoc) {
> + 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::emitBasicNote(StringRef Message) {
> - emitNote(SourceLocation(), Message);
> + emitNote(SourceLocation(), Message, 0);
> }
>
>
> Modified: cfe/trunk/lib/Frontend/SerializedDiagnosticPrinter.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/SerializedDiagnosticPrinter.cpp?rev=156536&r1=156535&r2=156536&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Frontend/SerializedDiagnosticPrinter.cpp (original)
> +++ cfe/trunk/lib/Frontend/SerializedDiagnosticPrinter.cpp Thu May 10 00:03:45 2012
> @@ -53,10 +53,9 @@
> RecordData &Record;
> public:
> SDiagsRenderer(SDiagsWriter &Writer, RecordData &Record,
> - const SourceManager &SM,
> const LangOptions &LangOpts,
> const DiagnosticOptions &DiagOpts)
> - : DiagnosticNoteRenderer(SM, LangOpts, DiagOpts),
> + : DiagnosticNoteRenderer(LangOpts, DiagOpts),
> Writer(Writer), Record(Record){}
>
> virtual ~SDiagsRenderer() {}
> @@ -67,18 +66,21 @@
> DiagnosticsEngine::Level Level,
> StringRef Message,
> ArrayRef<CharSourceRange> Ranges,
> + const SourceManager *SM,
> DiagOrStoredDiag D);
>
> virtual void emitDiagnosticLoc(SourceLocation Loc, PresumedLoc PLoc,
> DiagnosticsEngine::Level Level,
> - ArrayRef<CharSourceRange> Ranges) {}
> + ArrayRef<CharSourceRange> Ranges,
> + const SourceManager &SM) {}
>
> - void emitNote(SourceLocation Loc, StringRef Message);
> + void emitNote(SourceLocation Loc, StringRef Message, const SourceManager *SM);
>
> virtual void emitCodeContext(SourceLocation Loc,
> DiagnosticsEngine::Level Level,
> SmallVectorImpl<CharSourceRange>& Ranges,
> - ArrayRef<FixItHint> Hints);
> + ArrayRef<FixItHint> Hints,
> + const SourceManager &SM);
>
> virtual void beginDiagnostic(DiagOrStoredDiag D,
> DiagnosticsEngine::Level Level);
> @@ -137,15 +139,16 @@
> unsigned getEmitFile(const char *Filename);
>
> /// \brief Add SourceLocation information the specified record.
> - void AddLocToRecord(SourceLocation Loc, const SourceManager &SM,
> + void AddLocToRecord(SourceLocation Loc, const SourceManager *SM,
> PresumedLoc PLoc, RecordDataImpl &Record,
> unsigned TokSize = 0);
>
> /// \brief Add SourceLocation information the specified record.
> void AddLocToRecord(SourceLocation Loc, RecordDataImpl &Record,
> - const SourceManager &SM,
> + const SourceManager *SM,
> unsigned TokSize = 0) {
> - AddLocToRecord(Loc, SM, SM.getPresumedLoc(Loc), Record, TokSize);
> + AddLocToRecord(Loc, SM, SM ? SM->getPresumedLoc(Loc) : PresumedLoc(),
> + Record, TokSize);
> }
>
> /// \brief Add CharSourceRange information the specified record.
> @@ -241,7 +244,7 @@
> }
>
> void SDiagsWriter::AddLocToRecord(SourceLocation Loc,
> - const SourceManager &SM,
> + const SourceManager *SM,
> PresumedLoc PLoc,
> RecordDataImpl &Record,
> unsigned TokSize) {
> @@ -257,19 +260,19 @@
> Record.push_back(getEmitFile(PLoc.getFilename()));
> Record.push_back(PLoc.getLine());
> Record.push_back(PLoc.getColumn()+TokSize);
> - Record.push_back(SM.getFileOffset(Loc));
> + Record.push_back(SM->getFileOffset(Loc));
> }
>
> void SDiagsWriter::AddCharSourceRangeToRecord(CharSourceRange Range,
> RecordDataImpl &Record,
> const SourceManager &SM) {
> - AddLocToRecord(Range.getBegin(), Record, SM);
> + AddLocToRecord(Range.getBegin(), Record, &SM);
> unsigned TokSize = 0;
> if (Range.isTokenRange())
> TokSize = Lexer::MeasureTokenLength(Range.getEnd(),
> SM, *LangOpts);
>
> - AddLocToRecord(Range.getEnd(), Record, SM, TokSize);
> + AddLocToRecord(Range.getEnd(), Record, &SM, TokSize);
> }
>
> unsigned SDiagsWriter::getEmitFile(const char *FileName){
> @@ -484,13 +487,15 @@
> diagBuf.clear();
> Info.FormatDiagnostic(diagBuf);
>
> - SourceManager &SM = Info.getSourceManager();
> - SDiagsRenderer Renderer(*this, Record, SM, *LangOpts, DiagOpts);
> + const SourceManager *
> + SM = Info.hasSourceManager() ? &Info.getSourceManager() : 0;
> + SDiagsRenderer Renderer(*this, Record, *LangOpts, DiagOpts);
> Renderer.emitDiagnostic(Info.getLocation(), DiagLevel,
> diagBuf.str(),
> Info.getRanges(),
> llvm::makeArrayRef(Info.getFixItHints(),
> Info.getNumFixItHints()),
> + SM,
> &Info);
> }
>
> @@ -500,6 +505,7 @@
> DiagnosticsEngine::Level Level,
> StringRef Message,
> ArrayRef<clang::CharSourceRange> Ranges,
> + const SourceManager *SM,
> DiagOrStoredDiag D) {
> // Emit the RECORD_DIAG record.
> Writer.Record.clear();
> @@ -539,7 +545,8 @@
> void SDiagsRenderer::emitCodeContext(SourceLocation Loc,
> DiagnosticsEngine::Level Level,
> SmallVectorImpl<CharSourceRange> &Ranges,
> - ArrayRef<FixItHint> Hints) {
> + ArrayRef<FixItHint> Hints,
> + const SourceManager &SM) {
> // Emit Source Ranges.
> for (ArrayRef<CharSourceRange>::iterator it=Ranges.begin(), ei=Ranges.end();
> it != ei; ++it) {
> @@ -562,7 +569,8 @@
> }
> }
>
> -void SDiagsRenderer::emitNote(SourceLocation Loc, StringRef Message) {
> +void SDiagsRenderer::emitNote(SourceLocation Loc, StringRef Message,
> + const SourceManager *SM) {
> Writer.Stream.EnterSubblock(BLOCK_DIAG, 4);
> RecordData Record;
> Record.push_back(RECORD_DIAG);
>
> Modified: cfe/trunk/lib/Frontend/TextDiagnostic.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/TextDiagnostic.cpp?rev=156536&r1=156535&r2=156536&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Frontend/TextDiagnostic.cpp (original)
> +++ cfe/trunk/lib/Frontend/TextDiagnostic.cpp Thu May 10 00:03:45 2012
> @@ -602,10 +602,9 @@
> }
>
> TextDiagnostic::TextDiagnostic(raw_ostream &OS,
> - const SourceManager &SM,
> const LangOptions &LangOpts,
> const DiagnosticOptions &DiagOpts)
> - : DiagnosticRenderer(SM, LangOpts, DiagOpts), OS(OS) {}
> + : DiagnosticRenderer(LangOpts, DiagOpts), OS(OS) {}
>
> TextDiagnostic::~TextDiagnostic() {}
>
> @@ -615,11 +614,13 @@
> 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.
> - emitDiagnosticLoc(Loc, PLoc, Level, Ranges);
> + if (Loc.isValid())
> + emitDiagnosticLoc(Loc, PLoc, Level, Ranges, *SM);
>
> if (DiagOpts.ShowColors)
> OS.resetColor();
> @@ -693,7 +694,8 @@
> /// ranges necessary.
> 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 = SM.getFileID(Loc);
> @@ -799,7 +801,8 @@
> }
>
> void TextDiagnostic::emitIncludeLocation(SourceLocation Loc,
> - PresumedLoc PLoc) {
> + PresumedLoc PLoc,
> + const SourceManager &SM) {
> if (DiagOpts.ShowLocation)
> OS << "In file included from " << PLoc.getFilename() << ':'
> << PLoc.getLine() << ":\n";
> @@ -817,7 +820,8 @@
> void TextDiagnostic::emitSnippetAndCaret(
> SourceLocation Loc, DiagnosticsEngine::Level Level,
> SmallVectorImpl<CharSourceRange>& Ranges,
> - ArrayRef<FixItHint> Hints) {
> + ArrayRef<FixItHint> Hints,
> + const SourceManager &SM) {
> assert(!Loc.isInvalid() && "must have a valid source location here");
> assert(Loc.isFileID() && "must have a file location here");
>
> @@ -878,7 +882,7 @@
> for (SmallVectorImpl<CharSourceRange>::iterator I = Ranges.begin(),
> E = Ranges.end();
> I != E; ++I)
> - highlightRange(*I, LineNo, FID, sourceColMap, CaretLine);
> + highlightRange(*I, LineNo, FID, sourceColMap, CaretLine, SM);
>
> // Next, insert the caret itself.
> ColNo = sourceColMap.byteToColumn(ColNo-1);
> @@ -888,7 +892,7 @@
>
> std::string FixItInsertionLine = buildFixItInsertionLine(LineNo,
> sourceColMap,
> - Hints);
> + Hints, SM);
>
> // If the source line is too long for our terminal, select only the
> // "interesting" source region within that line.
> @@ -931,7 +935,7 @@
> }
>
> // Print out any parseable fixit information requested by the options.
> - emitParseableFixits(Hints);
> + emitParseableFixits(Hints, SM);
> }
>
> void TextDiagnostic::emitSnippet(StringRef line) {
> @@ -974,7 +978,8 @@
> void TextDiagnostic::highlightRange(const CharSourceRange &R,
> unsigned LineNo, FileID FID,
> const SourceColumnMap &map,
> - std::string &CaretLine) {
> + std::string &CaretLine,
> + const SourceManager &SM) {
> if (!R.isValid()) return;
>
> SourceLocation Begin = SM.getExpansionLoc(R.getBegin());
> @@ -1059,7 +1064,8 @@
> std::string TextDiagnostic::buildFixItInsertionLine(
> unsigned LineNo,
> const SourceColumnMap &map,
> - ArrayRef<FixItHint> Hints) {
> + ArrayRef<FixItHint> Hints,
> + const SourceManager &SM) {
>
> std::string FixItInsertionLine;
> if (Hints.empty() || !DiagOpts.ShowFixits)
> @@ -1114,7 +1120,8 @@
> return FixItInsertionLine;
> }
>
> -void TextDiagnostic::emitParseableFixits(ArrayRef<FixItHint> Hints) {
> +void TextDiagnostic::emitParseableFixits(ArrayRef<FixItHint> Hints,
> + const SourceManager &SM) {
> if (!DiagOpts.ShowParseableFixits)
> return;
>
>
> Modified: cfe/trunk/lib/Frontend/TextDiagnosticPrinter.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/TextDiagnosticPrinter.cpp?rev=156536&r1=156535&r2=156536&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Frontend/TextDiagnosticPrinter.cpp (original)
> +++ cfe/trunk/lib/Frontend/TextDiagnosticPrinter.cpp Thu May 10 00:03:45 2012
> @@ -27,7 +27,7 @@
> TextDiagnosticPrinter::TextDiagnosticPrinter(raw_ostream &os,
> const DiagnosticOptions &diags,
> bool _OwnsOutputStream)
> - : OS(os), LangOpts(0), DiagOpts(&diags), SM(0),
> + : OS(os), DiagOpts(&diags),
> OwnsOutputStream(_OwnsOutputStream) {
> }
>
> @@ -38,11 +38,11 @@
>
> void TextDiagnosticPrinter::BeginSourceFile(const LangOptions &LO,
> const Preprocessor *PP) {
> - LangOpts = &LO;
> + // Build the TextDiagnostic utility.
> + TextDiag.reset(new TextDiagnostic(OS, LO, *DiagOpts));
> }
>
> void TextDiagnosticPrinter::EndSourceFile() {
> - LangOpts = 0;
> TextDiag.reset(0);
> }
>
> @@ -152,22 +152,16 @@
> }
>
> // Assert that the rest of our infrastructure is setup properly.
> - assert(LangOpts && "Unexpected diagnostic outside source file processing");
> assert(DiagOpts && "Unexpected diagnostic without options set");
> assert(Info.hasSourceManager() &&
> "Unexpected diagnostic with no source manager");
> -
> - // Rebuild the TextDiagnostic utility if missing or the source manager has
> - // changed.
> - if (!TextDiag || SM != &Info.getSourceManager()) {
> - SM = &Info.getSourceManager();
> - TextDiag.reset(new TextDiagnostic(OS, *SM, *LangOpts, *DiagOpts));
> - }
> + assert(TextDiag && "Unexpected diagnostic outside source file processing");
>
> TextDiag->emitDiagnostic(Info.getLocation(), Level, DiagMessageStream.str(),
> Info.getRanges(),
> llvm::makeArrayRef(Info.getFixItHints(),
> - Info.getNumFixItHints()));
> + Info.getNumFixItHints()),
> + &Info.getSourceManager());
>
> OS.flush();
> }
>
> Added: cfe/trunk/test/Misc/serialized-diags-frontend.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Misc/serialized-diags-frontend.c?rev=156536&view=auto
> ==============================================================================
> --- cfe/trunk/test/Misc/serialized-diags-frontend.c (added)
> +++ cfe/trunk/test/Misc/serialized-diags-frontend.c Thu May 10 00:03:45 2012
> @@ -0,0 +1,8 @@
> +// RUN: rm -f %t
> +// RUN: %clang -fsyntax-only %s -Wblahblah --serialize-diagnostics %t > /dev/null 2>&1 || true
> +// RUN: c-index-test -read-diagnostics %t 2>&1 | FileCheck %s
> +
> +// This test case tests that we can handle frontend diagnostics.
> +
> +// CHECK: warning: unknown warning option '-Wblahblah'
> +// CHECK: Number of diagnostics: 1
>
> Modified: cfe/trunk/tools/libclang/CIndexDiagnostic.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndexDiagnostic.cpp?rev=156536&r1=156535&r2=156536&view=diff
> ==============================================================================
> --- cfe/trunk/tools/libclang/CIndexDiagnostic.cpp (original)
> +++ cfe/trunk/tools/libclang/CIndexDiagnostic.cpp Thu May 10 00:03:45 2012
> @@ -86,11 +86,10 @@
>
> class CXDiagnosticRenderer : public DiagnosticNoteRenderer {
> public:
> - CXDiagnosticRenderer(const SourceManager &SM,
> - const LangOptions &LangOpts,
> + CXDiagnosticRenderer(const LangOptions &LangOpts,
> const DiagnosticOptions &DiagOpts,
> CXDiagnosticSetImpl *mainSet)
> - : DiagnosticNoteRenderer(SM, LangOpts, DiagOpts),
> + : DiagnosticNoteRenderer(LangOpts, DiagOpts),
> CurrentSet(mainSet), MainSet(mainSet) {}
>
> virtual ~CXDiagnosticRenderer() {}
> @@ -116,26 +115,38 @@
> DiagnosticsEngine::Level Level,
> StringRef Message,
> ArrayRef<CharSourceRange> Ranges,
> + const SourceManager *SM,
> DiagOrStoredDiag D) {
> if (!D.isNull())
> return;
>
> - CXSourceLocation L = translateSourceLocation(SM, LangOpts, Loc);
> + CXSourceLocation L;
> + if (SM)
> + L = translateSourceLocation(*SM, LangOpts, Loc);
> + else
> + L = clang_getNullLocation();
> CXDiagnosticImpl *CD = new CXDiagnosticCustomNoteImpl(Message, L);
> CurrentSet->appendDiagnostic(CD);
> }
>
> virtual void emitDiagnosticLoc(SourceLocation Loc, PresumedLoc PLoc,
> DiagnosticsEngine::Level Level,
> - ArrayRef<CharSourceRange> Ranges) {}
> + ArrayRef<CharSourceRange> Ranges,
> + const SourceManager &SM) {}
>
> virtual void emitCodeContext(SourceLocation Loc,
> DiagnosticsEngine::Level Level,
> SmallVectorImpl<CharSourceRange>& Ranges,
> - ArrayRef<FixItHint> Hints) {}
> + ArrayRef<FixItHint> Hints,
> + const SourceManager &SM) {}
>
> - virtual void emitNote(SourceLocation Loc, StringRef Message) {
> - CXSourceLocation L = translateSourceLocation(SM, LangOpts, Loc);
> + virtual void emitNote(SourceLocation Loc, StringRef Message,
> + const SourceManager *SM) {
> + CXSourceLocation L;
> + if (SM)
> + L = translateSourceLocation(*SM, LangOpts, Loc);
> + else
> + L = clang_getNullLocation();
> CurrentSet->appendDiagnostic(new CXDiagnosticCustomNoteImpl(Message,
> L));
> }
> @@ -181,8 +192,7 @@
> CXDiagnosticSetImpl *Set = new CXDiagnosticSetImpl();
> TU->Diagnostics = Set;
> DiagnosticOptions DOpts;
> - CXDiagnosticRenderer Renderer(AU->getSourceManager(),
> - AU->getASTContext().getLangOpts(),
> + CXDiagnosticRenderer Renderer(AU->getASTContext().getLangOpts(),
> DOpts, Set);
>
> for (ASTUnit::stored_diag_iterator it = AU->stored_diag_begin(),
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list