diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2014-07-18 04:54:02 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2014-07-18 04:54:02 +0000 |
commit | a5d2a49c342b82fe706bd05f931c48dee0f69420 (patch) | |
tree | 749ef0b5f54bb48700e5b80b82c9d0267dcc560e /clang/lib/Lex/MacroInfo.cpp | |
parent | 3965412f088ccdab52b897f89f29b937269e26fd (diff) | |
download | bcm5719-llvm-a5d2a49c342b82fe706bd05f931c48dee0f69420.tar.gz bcm5719-llvm-a5d2a49c342b82fe706bd05f931c48dee0f69420.zip |
Add dump() for MacroDirective and MacroInfo.
llvm-svn: 213349
Diffstat (limited to 'clang/lib/Lex/MacroInfo.cpp')
-rw-r--r-- | clang/lib/Lex/MacroInfo.cpp | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/clang/lib/Lex/MacroInfo.cpp b/clang/lib/Lex/MacroInfo.cpp index cb3945652fd..f35d5a660f2 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 <macro>"; + 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<VisibilityMacroDirective>(this)) + Out << " private"; + + if (auto *DMD = dyn_cast<DefMacroDirective>(this)) { + if (auto *Info = DMD->getInfo()) { + Out << "\n "; + Info->dump(); + } + } +} |