From a5d2a49c342b82fe706bd05f931c48dee0f69420 Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Fri, 18 Jul 2014 04:54:02 +0000 Subject: [PATCH] Add dump() for MacroDirective and MacroInfo. llvm-svn: 213349 --- clang/include/clang/Lex/MacroInfo.h | 4 +++ clang/lib/Lex/MacroInfo.cpp | 72 +++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) diff --git a/clang/include/clang/Lex/MacroInfo.h b/clang/include/clang/Lex/MacroInfo.h index 7c04031..e9a66e8 100644 --- a/clang/include/clang/Lex/MacroInfo.h +++ b/clang/include/clang/Lex/MacroInfo.h @@ -299,6 +299,8 @@ public: return 0; } + void dump() const; + private: unsigned getDefinitionLengthSlow(SourceManager &SM) const; @@ -450,6 +452,8 @@ public: /// this macro was not defined there, return NULL. const DefInfo findDirectiveAtLoc(SourceLocation L, SourceManager &SM) const; + void dump() const; + static bool classof(const MacroDirective *) { return true; } }; diff --git a/clang/lib/Lex/MacroInfo.cpp b/clang/lib/Lex/MacroInfo.cpp index cb39456..f35d5a66 100644 --- a/clang/lib/Lex/MacroInfo.cpp +++ b/clang/lib/Lex/MacroInfo.cpp @@ -126,6 +126,49 @@ bool MacroInfo::isIdenticalTo(const MacroInfo &Other, Preprocessor &PP, return true; } +void MacroInfo::dump() const { + llvm::raw_ostream &Out = llvm::errs(); + + // FIXME: Dump locations. + Out << "MacroInfo " << this; + if (IsBuiltinMacro) Out << " builtin"; + if (IsDisabled) Out << " disabled"; + if (IsUsed) Out << " used"; + if (IsAllowRedefinitionsWithoutWarning) + Out << " allow_redefinitions_without_warning"; + if (IsWarnIfUnused) Out << " warn_if_unused"; + if (FromASTFile) Out << " imported"; + if (UsedForHeaderGuard) Out << " header_guard"; + + Out << "\n #define "; + if (IsFunctionLike) { + Out << "("; + for (unsigned I = 0; I != NumArguments; ++I) { + if (I) Out << ", "; + Out << ArgumentList[I]->getName(); + } + if (IsC99Varargs || IsGNUVarargs) { + if (NumArguments && IsC99Varargs) Out << ", "; + Out << "..."; + } + Out << ")"; + } + + for (const Token &Tok : ReplacementTokens) { + Out << " "; + if (const char *Punc = tok::getPunctuatorSpelling(Tok.getKind())) + Out << Punc; + else if (const char *Kwd = tok::getKeywordSpelling(Tok.getKind())) + Out << Kwd; + else if (Tok.is(tok::identifier)) + Out << Tok.getIdentifierInfo()->getName(); + else if (Tok.isLiteral() && Tok.getLiteralData()) + Out << StringRef(Tok.getLiteralData(), Tok.getLength()); + else + Out << Tok.getName(); + } +} + MacroDirective::DefInfo MacroDirective::getDefinition() { MacroDirective *MD = this; SourceLocation UndefLoc; @@ -161,3 +204,32 @@ MacroDirective::findDirectiveAtLoc(SourceLocation L, SourceManager &SM) const { } return DefInfo(); } + +void MacroDirective::dump() const { + llvm::raw_ostream &Out = llvm::errs(); + + switch (getKind()) { + case MD_Define: Out << "DefMacroDirective"; break; + case MD_Undefine: Out << "UndefMacroDirective"; break; + case MD_Visibility: Out << "VisibilityMacroDirective"; break; + } + Out << " " << this; + // FIXME: Dump SourceLocation. + if (auto *Prev = getPrevious()) + Out << " prev " << Prev; + if (IsFromPCH) Out << " from_pch"; + if (IsImported) Out << " imported"; + if (IsAmbiguous) Out << " ambiguous"; + + if (IsPublic) + Out << " public"; + else if (isa(this)) + Out << " private"; + + if (auto *DMD = dyn_cast(this)) { + if (auto *Info = DMD->getInfo()) { + Out << "\n "; + Info->dump(); + } + } +} -- 2.7.4