12898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek//===--- DiagnosticRenderer.cpp - Diagnostic Pretty-Printing --------------===// 22898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek// 32898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek// The LLVM Compiler Infrastructure 42898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek// 52898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek// This file is distributed under the University of Illinois Open Source 62898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek// License. See LICENSE.TXT for details. 72898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek// 82898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek//===----------------------------------------------------------------------===// 92898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek 102898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek#include "clang/Frontend/DiagnosticRenderer.h" 1102c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor#include "clang/Basic/DiagnosticOptions.h" 122898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek#include "clang/Basic/FileManager.h" 132898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek#include "clang/Basic/SourceManager.h" 1430660a898545416f0fea2d717f16f75640001e38Ted Kremenek#include "clang/Edit/Commit.h" 1555fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Edit/EditedSource.h" 1630660a898545416f0fea2d717f16f75640001e38Ted Kremenek#include "clang/Edit/EditsReceiver.h" 1755fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Lex/Lexer.h" 189cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman#include "llvm/ADT/SmallSet.h" 192898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek#include "llvm/ADT/SmallString.h" 2055fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/Support/ErrorHandling.h" 2155fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/Support/MemoryBuffer.h" 2255fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/Support/raw_ostream.h" 232898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek#include <algorithm> 242898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenekusing namespace clang; 252898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek 2616afdf76b6f12e41ff6f6e6828bfb1d4732523baArgyrios KyrtzidisDiagnosticRenderer::DiagnosticRenderer(const LangOptions &LangOpts, 2702c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor DiagnosticOptions *DiagOpts) 2802c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor : LangOpts(LangOpts), DiagOpts(DiagOpts), LastLevel() {} 292898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek 302898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted KremenekDiagnosticRenderer::~DiagnosticRenderer() {} 312898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek 3230660a898545416f0fea2d717f16f75640001e38Ted Kremeneknamespace { 3330660a898545416f0fea2d717f16f75640001e38Ted Kremenek 3430660a898545416f0fea2d717f16f75640001e38Ted Kremenekclass FixitReceiver : public edit::EditsReceiver { 3530660a898545416f0fea2d717f16f75640001e38Ted Kremenek SmallVectorImpl<FixItHint> &MergedFixits; 3630660a898545416f0fea2d717f16f75640001e38Ted Kremenek 3730660a898545416f0fea2d717f16f75640001e38Ted Kremenekpublic: 3830660a898545416f0fea2d717f16f75640001e38Ted Kremenek FixitReceiver(SmallVectorImpl<FixItHint> &MergedFixits) 3930660a898545416f0fea2d717f16f75640001e38Ted Kremenek : MergedFixits(MergedFixits) { } 40651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void insert(SourceLocation loc, StringRef text) override { 4130660a898545416f0fea2d717f16f75640001e38Ted Kremenek MergedFixits.push_back(FixItHint::CreateInsertion(loc, text)); 4230660a898545416f0fea2d717f16f75640001e38Ted Kremenek } 43651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void replace(CharSourceRange range, StringRef text) override { 4430660a898545416f0fea2d717f16f75640001e38Ted Kremenek MergedFixits.push_back(FixItHint::CreateReplacement(range, text)); 4530660a898545416f0fea2d717f16f75640001e38Ted Kremenek } 4630660a898545416f0fea2d717f16f75640001e38Ted Kremenek}; 4730660a898545416f0fea2d717f16f75640001e38Ted Kremenek 4830660a898545416f0fea2d717f16f75640001e38Ted Kremenek} 4930660a898545416f0fea2d717f16f75640001e38Ted Kremenek 5030660a898545416f0fea2d717f16f75640001e38Ted Kremenekstatic void mergeFixits(ArrayRef<FixItHint> FixItHints, 5130660a898545416f0fea2d717f16f75640001e38Ted Kremenek const SourceManager &SM, const LangOptions &LangOpts, 5230660a898545416f0fea2d717f16f75640001e38Ted Kremenek SmallVectorImpl<FixItHint> &MergedFixits) { 5330660a898545416f0fea2d717f16f75640001e38Ted Kremenek edit::Commit commit(SM, LangOpts); 5430660a898545416f0fea2d717f16f75640001e38Ted Kremenek for (ArrayRef<FixItHint>::const_iterator 5530660a898545416f0fea2d717f16f75640001e38Ted Kremenek I = FixItHints.begin(), E = FixItHints.end(); I != E; ++I) { 5630660a898545416f0fea2d717f16f75640001e38Ted Kremenek const FixItHint &Hint = *I; 5730660a898545416f0fea2d717f16f75640001e38Ted Kremenek if (Hint.CodeToInsert.empty()) { 5830660a898545416f0fea2d717f16f75640001e38Ted Kremenek if (Hint.InsertFromRange.isValid()) 5930660a898545416f0fea2d717f16f75640001e38Ted Kremenek commit.insertFromRange(Hint.RemoveRange.getBegin(), 6030660a898545416f0fea2d717f16f75640001e38Ted Kremenek Hint.InsertFromRange, /*afterToken=*/false, 6130660a898545416f0fea2d717f16f75640001e38Ted Kremenek Hint.BeforePreviousInsertions); 6230660a898545416f0fea2d717f16f75640001e38Ted Kremenek else 6330660a898545416f0fea2d717f16f75640001e38Ted Kremenek commit.remove(Hint.RemoveRange); 6430660a898545416f0fea2d717f16f75640001e38Ted Kremenek } else { 6530660a898545416f0fea2d717f16f75640001e38Ted Kremenek if (Hint.RemoveRange.isTokenRange() || 6630660a898545416f0fea2d717f16f75640001e38Ted Kremenek Hint.RemoveRange.getBegin() != Hint.RemoveRange.getEnd()) 6730660a898545416f0fea2d717f16f75640001e38Ted Kremenek commit.replace(Hint.RemoveRange, Hint.CodeToInsert); 6830660a898545416f0fea2d717f16f75640001e38Ted Kremenek else 6930660a898545416f0fea2d717f16f75640001e38Ted Kremenek commit.insert(Hint.RemoveRange.getBegin(), Hint.CodeToInsert, 7030660a898545416f0fea2d717f16f75640001e38Ted Kremenek /*afterToken=*/false, Hint.BeforePreviousInsertions); 7130660a898545416f0fea2d717f16f75640001e38Ted Kremenek } 7230660a898545416f0fea2d717f16f75640001e38Ted Kremenek } 7330660a898545416f0fea2d717f16f75640001e38Ted Kremenek 7430660a898545416f0fea2d717f16f75640001e38Ted Kremenek edit::EditedSource Editor(SM, LangOpts); 7530660a898545416f0fea2d717f16f75640001e38Ted Kremenek if (Editor.commit(commit)) { 7630660a898545416f0fea2d717f16f75640001e38Ted Kremenek FixitReceiver Rec(MergedFixits); 7730660a898545416f0fea2d717f16f75640001e38Ted Kremenek Editor.applyRewrites(Rec); 7830660a898545416f0fea2d717f16f75640001e38Ted Kremenek } 7930660a898545416f0fea2d717f16f75640001e38Ted Kremenek} 802898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek 812898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenekvoid DiagnosticRenderer::emitDiagnostic(SourceLocation Loc, 822898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek DiagnosticsEngine::Level Level, 832898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek StringRef Message, 842898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek ArrayRef<CharSourceRange> Ranges, 852898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek ArrayRef<FixItHint> FixItHints, 8616afdf76b6f12e41ff6f6e6828bfb1d4732523baArgyrios Kyrtzidis const SourceManager *SM, 878be51eab5ad34515d2a40dcdc8558128ca1800adTed Kremenek DiagOrStoredDiag D) { 8816afdf76b6f12e41ff6f6e6828bfb1d4732523baArgyrios Kyrtzidis assert(SM || Loc.isInvalid()); 8998cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith 908be51eab5ad34515d2a40dcdc8558128ca1800adTed Kremenek beginDiagnostic(D, Level); 9198cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith 9298cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith if (!Loc.isValid()) 9398cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith // If we have no source location, just emit the diagnostic message. 9498cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith emitDiagnosticMessage(Loc, PresumedLoc(), Level, Message, Ranges, SM, D); 9598cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith else { 962898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek // Get the ranges into a local array we can hack on. 972898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek SmallVector<CharSourceRange, 20> MutableRanges(Ranges.begin(), 982898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek Ranges.end()); 9998cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith 100cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<FixItHint, 8> MergedFixits; 10130660a898545416f0fea2d717f16f75640001e38Ted Kremenek if (!FixItHints.empty()) { 10216afdf76b6f12e41ff6f6e6828bfb1d4732523baArgyrios Kyrtzidis mergeFixits(FixItHints, *SM, LangOpts, MergedFixits); 10330660a898545416f0fea2d717f16f75640001e38Ted Kremenek FixItHints = MergedFixits; 10430660a898545416f0fea2d717f16f75640001e38Ted Kremenek } 10530660a898545416f0fea2d717f16f75640001e38Ted Kremenek 1062898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek for (ArrayRef<FixItHint>::const_iterator I = FixItHints.begin(), 1072898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek E = FixItHints.end(); 1082898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek I != E; ++I) 1092898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek if (I->RemoveRange.isValid()) 1102898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek MutableRanges.push_back(I->RemoveRange); 111ac31c8346f1ce3628b5a7fb862fefab5b94f8e82Richard Smith 11298cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith SourceLocation UnexpandedLoc = Loc; 11398cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith 1146ee225c8d4381e728c73252ed589f13e9f546defTed Kremenek // Find the ultimate expansion location for the diagnostic. 1156ee225c8d4381e728c73252ed589f13e9f546defTed Kremenek Loc = SM->getFileLoc(Loc); 116ac31c8346f1ce3628b5a7fb862fefab5b94f8e82Richard Smith 11798cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith PresumedLoc PLoc = SM->getPresumedLoc(Loc, DiagOpts->ShowPresumedLoc); 11898cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith 11998cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith // First, if this diagnostic is not in the main file, print out the 12098cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith // "included from" lines. 12198cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith emitIncludeStack(Loc, PLoc, Level, *SM); 12298cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith 12398cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith // Next, emit the actual diagnostic message and caret. 12498cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith emitDiagnosticMessage(Loc, PLoc, Level, Message, Ranges, SM, D); 12598cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith emitCaret(Loc, Level, MutableRanges, FixItHints, *SM); 12698cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith 12798cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith // If this location is within a macro, walk from UnexpandedLoc up to Loc 12898cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith // and produce a macro backtrace. 12998cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith if (UnexpandedLoc.isValid() && UnexpandedLoc.isMacroID()) { 13087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar emitMacroExpansions(UnexpandedLoc, Level, MutableRanges, FixItHints, *SM); 131ac31c8346f1ce3628b5a7fb862fefab5b94f8e82Richard Smith } 1322898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek } 13398cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith 1342898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek LastLoc = Loc; 1352898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek LastLevel = Level; 13698cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith 1378be51eab5ad34515d2a40dcdc8558128ca1800adTed Kremenek endDiagnostic(D, Level); 1388be51eab5ad34515d2a40dcdc8558128ca1800adTed Kremenek} 1398be51eab5ad34515d2a40dcdc8558128ca1800adTed Kremenek 1408be51eab5ad34515d2a40dcdc8558128ca1800adTed Kremenek 1418be51eab5ad34515d2a40dcdc8558128ca1800adTed Kremenekvoid DiagnosticRenderer::emitStoredDiagnostic(StoredDiagnostic &Diag) { 1428be51eab5ad34515d2a40dcdc8558128ca1800adTed Kremenek emitDiagnostic(Diag.getLocation(), Diag.getLevel(), Diag.getMessage(), 1438be51eab5ad34515d2a40dcdc8558128ca1800adTed Kremenek Diag.getRanges(), Diag.getFixIts(), 14416afdf76b6f12e41ff6f6e6828bfb1d4732523baArgyrios Kyrtzidis Diag.getLocation().isValid() ? &Diag.getLocation().getManager() 1456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : nullptr, 1468be51eab5ad34515d2a40dcdc8558128ca1800adTed Kremenek &Diag); 1472898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek} 1482898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek 149c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesvoid DiagnosticRenderer::emitBasicNote(StringRef Message) { 150c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines emitDiagnosticMessage( 151c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines SourceLocation(), PresumedLoc(), DiagnosticsEngine::Note, Message, 152176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines None, nullptr, DiagOrStoredDiag()); 153c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines} 154c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 1552898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek/// \brief Prints an include stack when appropriate for a particular 1562898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek/// diagnostic level and location. 1572898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek/// 1582898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek/// This routine handles all the logic of suppressing particular include 1592898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek/// stacks (such as those for notes) and duplicate include stacks when 1602898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek/// repeated warnings occur within the same file. It also handles the logic 1612898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek/// of customizing the formatting and display of the include stack. 1622898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek/// 1636c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor/// \param Loc The diagnostic location. 1646c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor/// \param PLoc The presumed location of the diagnostic location. 1652898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek/// \param Level The diagnostic level of the message this stack pertains to. 1662898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenekvoid DiagnosticRenderer::emitIncludeStack(SourceLocation Loc, 1676c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor PresumedLoc PLoc, 16816afdf76b6f12e41ff6f6e6828bfb1d4732523baArgyrios Kyrtzidis DiagnosticsEngine::Level Level, 16916afdf76b6f12e41ff6f6e6828bfb1d4732523baArgyrios Kyrtzidis const SourceManager &SM) { 1704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SourceLocation IncludeLoc = 1714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar PLoc.isInvalid() ? SourceLocation() : PLoc.getIncludeLoc(); 1726c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor 1732898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek // Skip redundant include stacks altogether. 1746c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor if (LastIncludeLoc == IncludeLoc) 1752898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek return; 1766c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor 1776c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor LastIncludeLoc = IncludeLoc; 1782898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek 17902c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor if (!DiagOpts->ShowNoteIncludeStack && Level == DiagnosticsEngine::Note) 1802898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek return; 1816c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor 1826c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor if (IncludeLoc.isValid()) 1836c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor emitIncludeStackRecursively(IncludeLoc, SM); 1846c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor else { 1854565e487531c7bf6d348dbe9f5529784966fc7aeDouglas Gregor emitModuleBuildStack(SM); 1866c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor emitImportStack(Loc, SM); 1876c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor } 1882898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek} 1892898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek 1902898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek/// \brief Helper to recursivly walk up the include stack and print each layer 1912898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek/// on the way back down. 19216afdf76b6f12e41ff6f6e6828bfb1d4732523baArgyrios Kyrtzidisvoid DiagnosticRenderer::emitIncludeStackRecursively(SourceLocation Loc, 19316afdf76b6f12e41ff6f6e6828bfb1d4732523baArgyrios Kyrtzidis const SourceManager &SM) { 194830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor if (Loc.isInvalid()) { 1954565e487531c7bf6d348dbe9f5529784966fc7aeDouglas Gregor emitModuleBuildStack(SM); 1962898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek return; 197830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor } 1982898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek 19962221b17c90457df9ca0ff20bb54d634e8951defRichard Smith PresumedLoc PLoc = SM.getPresumedLoc(Loc, DiagOpts->ShowPresumedLoc); 2002898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek if (PLoc.isInvalid()) 2012898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek return; 2026c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor 2036c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor // If this source location was imported from a module, print the module 2046c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor // import stack rather than the 2056c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor // FIXME: We want submodule granularity here. 2066c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor std::pair<SourceLocation, StringRef> Imported = SM.getModuleImportLoc(Loc); 20787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (!Imported.second.empty()) { 2086c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor // This location was imported by a module. Emit the module import stack. 2096c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor emitImportStackRecursively(Imported.first, Imported.second, SM); 2106c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor return; 2116c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor } 2126c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor 2132898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek // Emit the other include frames first. 21416afdf76b6f12e41ff6f6e6828bfb1d4732523baArgyrios Kyrtzidis emitIncludeStackRecursively(PLoc.getIncludeLoc(), SM); 2152898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek 2162898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek // Emit the inclusion text/note. 21716afdf76b6f12e41ff6f6e6828bfb1d4732523baArgyrios Kyrtzidis emitIncludeLocation(Loc, PLoc, SM); 2182898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek} 2192898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek 2206c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor/// \brief Emit the module import stack associated with the current location. 2216c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregorvoid DiagnosticRenderer::emitImportStack(SourceLocation Loc, 2226c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor const SourceManager &SM) { 2236c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor if (Loc.isInvalid()) { 2244565e487531c7bf6d348dbe9f5529784966fc7aeDouglas Gregor emitModuleBuildStack(SM); 2256c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor return; 2266c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor } 2276c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor 2286c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor std::pair<SourceLocation, StringRef> NextImportLoc 2296c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor = SM.getModuleImportLoc(Loc); 2306c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor emitImportStackRecursively(NextImportLoc.first, NextImportLoc.second, SM); 2316c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor} 2326c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor 2336c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor/// \brief Helper to recursivly walk up the import stack and print each layer 2346c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor/// on the way back down. 2356c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregorvoid DiagnosticRenderer::emitImportStackRecursively(SourceLocation Loc, 2366c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor StringRef ModuleName, 2376c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor const SourceManager &SM) { 23887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (ModuleName.empty()) { 2396c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor return; 2406c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor } 2416c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor 2426c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor PresumedLoc PLoc = SM.getPresumedLoc(Loc, DiagOpts->ShowPresumedLoc); 2436c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor 2446c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor // Emit the other import frames first. 2456c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor std::pair<SourceLocation, StringRef> NextImportLoc 2466c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor = SM.getModuleImportLoc(Loc); 2476c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor emitImportStackRecursively(NextImportLoc.first, NextImportLoc.second, SM); 2486c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor 2496c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor // Emit the inclusion text/note. 2506c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor emitImportLocation(Loc, PLoc, ModuleName, SM); 2516c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor} 2526c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor 2534565e487531c7bf6d348dbe9f5529784966fc7aeDouglas Gregor/// \brief Emit the module build stack, for cases where a module is (re-)built 254830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor/// on demand. 2554565e487531c7bf6d348dbe9f5529784966fc7aeDouglas Gregorvoid DiagnosticRenderer::emitModuleBuildStack(const SourceManager &SM) { 2564565e487531c7bf6d348dbe9f5529784966fc7aeDouglas Gregor ModuleBuildStack Stack = SM.getModuleBuildStack(); 2574565e487531c7bf6d348dbe9f5529784966fc7aeDouglas Gregor for (unsigned I = 0, N = Stack.size(); I != N; ++I) { 2584565e487531c7bf6d348dbe9f5529784966fc7aeDouglas Gregor const SourceManager &CurSM = Stack[I].second.getManager(); 2594565e487531c7bf6d348dbe9f5529784966fc7aeDouglas Gregor SourceLocation CurLoc = Stack[I].second; 260830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor emitBuildingModuleLocation(CurLoc, 261830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor CurSM.getPresumedLoc(CurLoc, 262830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor DiagOpts->ShowPresumedLoc), 2634565e487531c7bf6d348dbe9f5529784966fc7aeDouglas Gregor Stack[I].first, 264830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor CurSM); 265830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor } 266830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor} 267830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor 26887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// A recursive function to trace all possible backtrace locations 26987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// to match the \p CaretLocFileID. 27087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstatic SourceLocation 27187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarretrieveMacroLocation(SourceLocation Loc, FileID MacroFileID, 27287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar FileID CaretFileID, 27387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar const SmallVectorImpl<FileID> &CommonArgExpansions, 27487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar bool IsBegin, const SourceManager *SM) { 27587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar assert(SM->getFileID(Loc) == MacroFileID); 27687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (MacroFileID == CaretFileID) 27787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return Loc; 27887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (!Loc.isMacroID()) 27987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return SourceLocation(); 28087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 28187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SourceLocation MacroLocation, MacroArgLocation; 28287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 28387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (SM->isMacroArgExpansion(Loc)) { 28487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Only look at the immediate spelling location of this macro argument if 28587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // the other location in the source range is also present in that expansion. 28687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (std::binary_search(CommonArgExpansions.begin(), 28787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar CommonArgExpansions.end(), MacroFileID)) 28887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar MacroLocation = SM->getImmediateSpellingLoc(Loc); 28987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar MacroArgLocation = IsBegin ? SM->getImmediateExpansionRange(Loc).first 29087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar : SM->getImmediateExpansionRange(Loc).second; 29187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } else { 29287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar MacroLocation = IsBegin ? SM->getImmediateExpansionRange(Loc).first 29387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar : SM->getImmediateExpansionRange(Loc).second; 29487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar MacroArgLocation = SM->getImmediateSpellingLoc(Loc); 29587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 29687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 29787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (MacroLocation.isValid()) { 29887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar MacroFileID = SM->getFileID(MacroLocation); 29987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar MacroLocation = 30087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar retrieveMacroLocation(MacroLocation, MacroFileID, CaretFileID, 30187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar CommonArgExpansions, IsBegin, SM); 30287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (MacroLocation.isValid()) 30387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return MacroLocation; 30487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 30587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 30687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar MacroFileID = SM->getFileID(MacroArgLocation); 30787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return retrieveMacroLocation(MacroArgLocation, MacroFileID, CaretFileID, 30887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar CommonArgExpansions, IsBegin, SM); 30987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} 31087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 31187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// Walk up the chain of macro expansions and collect the FileIDs identifying the 31287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// expansions. 31387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstatic void getMacroArgExpansionFileIDs(SourceLocation Loc, 31487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SmallVectorImpl<FileID> &IDs, 31587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar bool IsBegin, const SourceManager *SM) { 31687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar while (Loc.isMacroID()) { 31787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (SM->isMacroArgExpansion(Loc)) { 31887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar IDs.push_back(SM->getFileID(Loc)); 31987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Loc = SM->getImmediateSpellingLoc(Loc); 32087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } else { 32187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto ExpRange = SM->getImmediateExpansionRange(Loc); 32287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Loc = IsBegin ? ExpRange.first : ExpRange.second; 32387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 32487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 32587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} 32687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 32787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// Collect the expansions of the begin and end locations and compute the set 32887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// intersection. Produces a sorted vector of FileIDs in CommonArgExpansions. 32987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstatic void computeCommonMacroArgExpansionFileIDs( 33087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SourceLocation Begin, SourceLocation End, const SourceManager *SM, 33187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SmallVectorImpl<FileID> &CommonArgExpansions) { 33287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SmallVector<FileID, 4> BeginArgExpansions; 33387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SmallVector<FileID, 4> EndArgExpansions; 33487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar getMacroArgExpansionFileIDs(Begin, BeginArgExpansions, /*IsBegin=*/true, SM); 33587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar getMacroArgExpansionFileIDs(End, EndArgExpansions, /*IsBegin=*/false, SM); 33687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar std::sort(BeginArgExpansions.begin(), BeginArgExpansions.end()); 33787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar std::sort(EndArgExpansions.begin(), EndArgExpansions.end()); 33887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar std::set_intersection(BeginArgExpansions.begin(), BeginArgExpansions.end(), 33987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar EndArgExpansions.begin(), EndArgExpansions.end(), 34087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar std::back_inserter(CommonArgExpansions)); 34187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} 34287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 3439cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman// Helper function to fix up source ranges. It takes in an array of ranges, 3449cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman// and outputs an array of ranges where we want to draw the range highlighting 3459cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman// around the location specified by CaretLoc. 3469cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman// 3479cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman// To find locations which correspond to the caret, we crawl the macro caller 3489cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman// chain for the beginning and end of each range. If the caret location 3499cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman// is in a macro expansion, we search each chain for a location 3509cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman// in the same expansion as the caret; otherwise, we crawl to the top of 3519cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman// each chain. Two locations are part of the same macro expansion 3529cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman// iff the FileID is the same. 3539cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedmanstatic void mapDiagnosticRanges( 3549cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman SourceLocation CaretLoc, 355ac31c8346f1ce3628b5a7fb862fefab5b94f8e82Richard Smith ArrayRef<CharSourceRange> Ranges, 35698cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith SmallVectorImpl<CharSourceRange> &SpellingRanges, 3579cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman const SourceManager *SM) { 3589cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman FileID CaretLocFileID = SM->getFileID(CaretLoc); 3599cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman 36087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (auto I = Ranges.begin(), E = Ranges.end(); I != E; ++I) { 36187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (I->isInvalid()) continue; 36287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 3639cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman SourceLocation Begin = I->getBegin(), End = I->getEnd(); 3649cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman bool IsTokenRange = I->isTokenRange(); 3659cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman 3660fdcd1e81db7b8f5b3fd05154d966b215b20a2ebEli Friedman FileID BeginFileID = SM->getFileID(Begin); 3675bdbc114da925304a774b726b0abb87d75bc3008Nadav Rotem FileID EndFileID = SM->getFileID(End); 3685bdbc114da925304a774b726b0abb87d75bc3008Nadav Rotem 3695bdbc114da925304a774b726b0abb87d75bc3008Nadav Rotem // Find the common parent for the beginning and end of the range. 3705bdbc114da925304a774b726b0abb87d75bc3008Nadav Rotem 3715bdbc114da925304a774b726b0abb87d75bc3008Nadav Rotem // First, crawl the expansion chain for the beginning of the range. 3725bdbc114da925304a774b726b0abb87d75bc3008Nadav Rotem llvm::SmallDenseMap<FileID, SourceLocation> BeginLocsMap; 3735bdbc114da925304a774b726b0abb87d75bc3008Nadav Rotem while (Begin.isMacroID() && BeginFileID != EndFileID) { 3745bdbc114da925304a774b726b0abb87d75bc3008Nadav Rotem BeginLocsMap[BeginFileID] = Begin; 3755bdbc114da925304a774b726b0abb87d75bc3008Nadav Rotem Begin = SM->getImmediateExpansionRange(Begin).first; 3765bdbc114da925304a774b726b0abb87d75bc3008Nadav Rotem BeginFileID = SM->getFileID(Begin); 3775bdbc114da925304a774b726b0abb87d75bc3008Nadav Rotem } 3785bdbc114da925304a774b726b0abb87d75bc3008Nadav Rotem 3795bdbc114da925304a774b726b0abb87d75bc3008Nadav Rotem // Then, crawl the expansion chain for the end of the range. 3805bdbc114da925304a774b726b0abb87d75bc3008Nadav Rotem if (BeginFileID != EndFileID) { 3815bdbc114da925304a774b726b0abb87d75bc3008Nadav Rotem while (End.isMacroID() && !BeginLocsMap.count(EndFileID)) { 3825bdbc114da925304a774b726b0abb87d75bc3008Nadav Rotem End = SM->getImmediateExpansionRange(End).second; 3835bdbc114da925304a774b726b0abb87d75bc3008Nadav Rotem EndFileID = SM->getFileID(End); 3845bdbc114da925304a774b726b0abb87d75bc3008Nadav Rotem } 3855bdbc114da925304a774b726b0abb87d75bc3008Nadav Rotem if (End.isMacroID()) { 3865bdbc114da925304a774b726b0abb87d75bc3008Nadav Rotem Begin = BeginLocsMap[EndFileID]; 3875bdbc114da925304a774b726b0abb87d75bc3008Nadav Rotem BeginFileID = EndFileID; 3885bdbc114da925304a774b726b0abb87d75bc3008Nadav Rotem } 3895bdbc114da925304a774b726b0abb87d75bc3008Nadav Rotem } 390ecdc8d3e0fc65610746a4e074491ca0807fca7b2Eli Friedman 39187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Do the backtracking. 39287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SmallVector<FileID, 4> CommonArgExpansions; 39387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar computeCommonMacroArgExpansionFileIDs(Begin, End, SM, CommonArgExpansions); 39487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Begin = retrieveMacroLocation(Begin, BeginFileID, CaretLocFileID, 39587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar CommonArgExpansions, /*IsBegin=*/true, SM); 39687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar End = retrieveMacroLocation(End, BeginFileID, CaretLocFileID, 39787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar CommonArgExpansions, /*IsBegin=*/false, SM); 39887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Begin.isInvalid() || End.isInvalid()) continue; 3999cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman 4009cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman // Return the spelling location of the beginning and end of the range. 4019cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman Begin = SM->getSpellingLoc(Begin); 4029cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman End = SM->getSpellingLoc(End); 40387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 4049cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman SpellingRanges.push_back(CharSourceRange(SourceRange(Begin, End), 4059cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman IsTokenRange)); 4069cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman } 4079cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman} 4089cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman 409ac31c8346f1ce3628b5a7fb862fefab5b94f8e82Richard Smithvoid DiagnosticRenderer::emitCaret(SourceLocation Loc, 410ac31c8346f1ce3628b5a7fb862fefab5b94f8e82Richard Smith DiagnosticsEngine::Level Level, 411ac31c8346f1ce3628b5a7fb862fefab5b94f8e82Richard Smith ArrayRef<CharSourceRange> Ranges, 412ac31c8346f1ce3628b5a7fb862fefab5b94f8e82Richard Smith ArrayRef<FixItHint> Hints, 413ac31c8346f1ce3628b5a7fb862fefab5b94f8e82Richard Smith const SourceManager &SM) { 414ac31c8346f1ce3628b5a7fb862fefab5b94f8e82Richard Smith SmallVector<CharSourceRange, 4> SpellingRanges; 415ac31c8346f1ce3628b5a7fb862fefab5b94f8e82Richard Smith mapDiagnosticRanges(Loc, Ranges, SpellingRanges, &SM); 416ac31c8346f1ce3628b5a7fb862fefab5b94f8e82Richard Smith emitCodeContext(Loc, Level, SpellingRanges, Hints, SM); 417ac31c8346f1ce3628b5a7fb862fefab5b94f8e82Richard Smith} 418ac31c8346f1ce3628b5a7fb862fefab5b94f8e82Richard Smith 41987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \brief A helper function for emitMacroExpansion to print the 42087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// macro expansion message 42187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid DiagnosticRenderer::emitSingleMacroExpansion( 42287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SourceLocation Loc, 42387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar DiagnosticsEngine::Level Level, 42487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ArrayRef<CharSourceRange> Ranges, 42587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar const SourceManager &SM) { 42687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Find the spelling location for the macro definition. We must use the 42787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // spelling location here to avoid emitting a macro backtrace for the note. 42887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SourceLocation SpellingLoc = SM.getSpellingLoc(Loc); 42987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 43087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Map the ranges into the FileID of the diagnostic location. 43187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SmallVector<CharSourceRange, 4> SpellingRanges; 43287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar mapDiagnosticRanges(Loc, Ranges, SpellingRanges, &SM); 43387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 43487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SmallString<100> MessageStorage; 43587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::raw_svector_ostream Message(MessageStorage); 4364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar StringRef MacroName = 4374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Lexer::getImmediateMacroNameForDiagnostics(Loc, SM, LangOpts); 43887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (MacroName.empty()) 43987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Message << "expanded from here"; 44087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar else 44187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Message << "expanded from macro '" << MacroName << "'"; 44287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 44387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar emitDiagnostic(SpellingLoc, DiagnosticsEngine::Note, Message.str(), 44487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SpellingRanges, None, &SM); 44587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} 44687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 44787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// Check that the macro argument location of Loc starts with ArgumentLoc. 44887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// The starting location of the macro expansions is used to differeniate 44987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// different macro expansions. 45087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstatic bool checkLocForMacroArgExpansion(SourceLocation Loc, 45187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar const SourceManager &SM, 45287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SourceLocation ArgumentLoc) { 45387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SourceLocation MacroLoc; 45487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (SM.isMacroArgExpansion(Loc, &MacroLoc)) { 45587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (ArgumentLoc == MacroLoc) return true; 45687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 45787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 45887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return false; 45987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} 46087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 46187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// Check if all the locations in the range have the same macro argument 46287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// expansion, and that that expansion starts with ArgumentLoc. 46387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstatic bool checkRangeForMacroArgExpansion(CharSourceRange Range, 46487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar const SourceManager &SM, 46587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SourceLocation ArgumentLoc) { 46687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SourceLocation BegLoc = Range.getBegin(), EndLoc = Range.getEnd(); 46787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar while (BegLoc != EndLoc) { 46887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (!checkLocForMacroArgExpansion(BegLoc, SM, ArgumentLoc)) 46987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return false; 47087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar BegLoc.getLocWithOffset(1); 47187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 47287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 47387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return checkLocForMacroArgExpansion(BegLoc, SM, ArgumentLoc); 47487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} 47587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 47687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// A helper function to check if the current ranges are all inside the same 47787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// macro argument expansion as Loc. 47887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstatic bool checkRangesForMacroArgExpansion(SourceLocation Loc, 47987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ArrayRef<CharSourceRange> Ranges, 48087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar const SourceManager &SM) { 48187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar assert(Loc.isMacroID() && "Must be a macro expansion!"); 48287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 48387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SmallVector<CharSourceRange, 4> SpellingRanges; 48487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar mapDiagnosticRanges(Loc, Ranges, SpellingRanges, &SM); 48587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 48687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /// Count all valid ranges. 48787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar unsigned ValidCount = 0; 48887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (auto I : Ranges) 48987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (I.isValid()) ValidCount++; 49087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 49187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (ValidCount > SpellingRanges.size()) 49287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return false; 49387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 49487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /// To store the source location of the argument location. 49587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SourceLocation ArgumentLoc; 49687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 49787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /// Set the ArgumentLoc to the beginning location of the expansion of Loc 49887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /// so to check if the ranges expands to the same beginning location. 49987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (!SM.isMacroArgExpansion(Loc,&ArgumentLoc)) 50087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return false; 50187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 50287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (auto I = SpellingRanges.begin(), E = SpellingRanges.end(); I != E; ++I) { 50387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (!checkRangeForMacroArgExpansion(*I, SM, ArgumentLoc)) 50487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return false; 50587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 50687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 50787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return true; 50887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} 50987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 5102898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek/// \brief Recursively emit notes for each macro expansion and caret 5112898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek/// diagnostics where appropriate. 5122898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek/// 5132898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek/// Walks up the macro expansion stack printing expansion notes, the code 5142898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek/// snippet, caret, underlines and FixItHint display as appropriate at each 5152898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek/// level. 5162898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek/// 5172898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek/// \param Loc The location for this caret. 5182898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek/// \param Level The diagnostic level currently being emitted. 5192898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek/// \param Ranges The underlined ranges for this code snippet. 5202898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek/// \param Hints The FixIt hints active for this diagnostic. 521ac31c8346f1ce3628b5a7fb862fefab5b94f8e82Richard Smithvoid DiagnosticRenderer::emitMacroExpansions(SourceLocation Loc, 522ac31c8346f1ce3628b5a7fb862fefab5b94f8e82Richard Smith DiagnosticsEngine::Level Level, 523ac31c8346f1ce3628b5a7fb862fefab5b94f8e82Richard Smith ArrayRef<CharSourceRange> Ranges, 524ac31c8346f1ce3628b5a7fb862fefab5b94f8e82Richard Smith ArrayRef<FixItHint> Hints, 52587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar const SourceManager &SM) { 52687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar assert(Loc.isValid() && "must have a valid source location here"); 52787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 52887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Produce a stack of macro backtraces. 52987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SmallVector<SourceLocation, 8> LocationStack; 53087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar unsigned IgnoredEnd = 0; 53187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar while (Loc.isMacroID()) { 53287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // If this is the expansion of a macro argument, point the caret at the 53387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // use of the argument in the definition of the macro, not the expansion. 53487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (SM.isMacroArgExpansion(Loc)) 53587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar LocationStack.push_back(SM.getImmediateExpansionRange(Loc).first); 53687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar else 53787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar LocationStack.push_back(Loc); 53887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 53987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (checkRangesForMacroArgExpansion(Loc, Ranges, SM)) 54087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar IgnoredEnd = LocationStack.size(); 54187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 54287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Loc = SM.getImmediateMacroCallerLoc(Loc); 54387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 54487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Once the location no longer points into a macro, try stepping through 54587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // the last found location. This sometimes produces additional useful 54687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // backtraces. 54787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Loc.isFileID()) 54887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Loc = SM.getImmediateMacroCallerLoc(LocationStack.back()); 54987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar assert(Loc.isValid() && "must have a valid source location here"); 5502898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek } 551678839297204002df215e0be12bcd10b20a9a4a4Richard Smith 55287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar LocationStack.erase(LocationStack.begin(), 55387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar LocationStack.begin() + IgnoredEnd); 55487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 55587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar unsigned MacroDepth = LocationStack.size(); 55687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar unsigned MacroLimit = DiagOpts->MacroBacktraceLimit; 55787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (MacroDepth <= MacroLimit || MacroLimit == 0) { 55887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (auto I = LocationStack.rbegin(), E = LocationStack.rend(); 55987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar I != E; ++I) 56087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar emitSingleMacroExpansion(*I, Level, Ranges, SM); 5612898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek return; 5622898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek } 5639cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman 56487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar unsigned MacroStartMessages = MacroLimit / 2; 56587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar unsigned MacroEndMessages = MacroLimit / 2 + MacroLimit % 2; 566678839297204002df215e0be12bcd10b20a9a4a4Richard Smith 56787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (auto I = LocationStack.rbegin(), 56887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar E = LocationStack.rbegin() + MacroStartMessages; 56987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar I != E; ++I) 57087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar emitSingleMacroExpansion(*I, Level, Ranges, SM); 5719cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman 57287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SmallString<200> MessageStorage; 5732898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek llvm::raw_svector_ostream Message(MessageStorage); 57487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Message << "(skipping " << (MacroDepth - MacroLimit) 57587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar << " expansions in backtrace; use -fmacro-backtrace-limit=0 to " 57687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar "see all)"; 57787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar emitBasicNote(Message.str()); 57887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 57987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (auto I = LocationStack.rend() - MacroEndMessages, 58087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar E = LocationStack.rend(); 58187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar I != E; ++I) 58287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar emitSingleMacroExpansion(*I, Level, Ranges, SM); 5832898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek} 5842898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek 5858be51eab5ad34515d2a40dcdc8558128ca1800adTed KremenekDiagnosticNoteRenderer::~DiagnosticNoteRenderer() {} 5868be51eab5ad34515d2a40dcdc8558128ca1800adTed Kremenek 5878be51eab5ad34515d2a40dcdc8558128ca1800adTed Kremenekvoid DiagnosticNoteRenderer::emitIncludeLocation(SourceLocation Loc, 58816afdf76b6f12e41ff6f6e6828bfb1d4732523baArgyrios Kyrtzidis PresumedLoc PLoc, 58916afdf76b6f12e41ff6f6e6828bfb1d4732523baArgyrios Kyrtzidis const SourceManager &SM) { 5908be51eab5ad34515d2a40dcdc8558128ca1800adTed Kremenek // Generate a note indicating the include location. 5918be51eab5ad34515d2a40dcdc8558128ca1800adTed Kremenek SmallString<200> MessageStorage; 5928be51eab5ad34515d2a40dcdc8558128ca1800adTed Kremenek llvm::raw_svector_ostream Message(MessageStorage); 5938be51eab5ad34515d2a40dcdc8558128ca1800adTed Kremenek Message << "in file included from " << PLoc.getFilename() << ':' 5948be51eab5ad34515d2a40dcdc8558128ca1800adTed Kremenek << PLoc.getLine() << ":"; 59516afdf76b6f12e41ff6f6e6828bfb1d4732523baArgyrios Kyrtzidis emitNote(Loc, Message.str(), &SM); 5968be51eab5ad34515d2a40dcdc8558128ca1800adTed Kremenek} 5978be51eab5ad34515d2a40dcdc8558128ca1800adTed Kremenek 5986c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregorvoid DiagnosticNoteRenderer::emitImportLocation(SourceLocation Loc, 5996c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor PresumedLoc PLoc, 6006c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor StringRef ModuleName, 6016c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor const SourceManager &SM) { 6026c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor // Generate a note indicating the include location. 6036c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor SmallString<200> MessageStorage; 6046c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor llvm::raw_svector_ostream Message(MessageStorage); 60587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Message << "in module '" << ModuleName; 60687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (PLoc.isValid()) 60787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Message << "' imported from " << PLoc.getFilename() << ':' 60887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar << PLoc.getLine(); 60987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Message << ":"; 6106c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor emitNote(Loc, Message.str(), &SM); 6116c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor} 6126c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor 613830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregorvoid 614830ea5b7c75413526c19531f0180fa6e45b98919Douglas GregorDiagnosticNoteRenderer::emitBuildingModuleLocation(SourceLocation Loc, 615830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor PresumedLoc PLoc, 616830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor StringRef ModuleName, 617830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor const SourceManager &SM) { 618830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor // Generate a note indicating the include location. 619830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor SmallString<200> MessageStorage; 620830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor llvm::raw_svector_ostream Message(MessageStorage); 6214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (PLoc.isValid()) 622651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Message << "while building module '" << ModuleName << "' imported from " 623651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines << PLoc.getFilename() << ':' << PLoc.getLine() << ":"; 624651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines else 625176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Message << "while building module '" << ModuleName << "':"; 626830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor emitNote(Loc, Message.str(), &SM); 627830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor} 628