Il 16/10/2011 11:39, Chandler Carruth ha scritto: > Author: chandlerc > Date: Sun Oct 16 04:39:09 2011 > New Revision: 142128 > > URL: http://llvm.org/viewvc/llvm-project?rev=142128&view=rev > Log: > Hoist the logic I added to compute the macro name into a helper > function. No functionality changed. > > Modified: > cfe/trunk/lib/Frontend/TextDiagnostic.cpp > > Modified: cfe/trunk/lib/Frontend/TextDiagnostic.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/TextDiagnostic.cpp?rev=142128&r1=142127&r2=142128&view=diff > ============================================================================== > --- cfe/trunk/lib/Frontend/TextDiagnostic.cpp (original) > +++ cfe/trunk/lib/Frontend/TextDiagnostic.cpp Sun Oct 16 04:39:09 2011 > @@ -389,6 +389,35 @@ > return Wrapped; > } > > +/// \brief Retrieve the name of the immediate macro expansion. > +/// > +/// This routine starts from a source location, and finds the name of the > macro > +/// responsible for its immediate expansion. It looks through any intervening > +/// macro argument expansions to compute this. It returns a StringRef which > +/// refers to the SourceManager-owned buffer of the source where that macro > +/// name is spelled. Thus, the result shouldn't out-live that SourceManager. > +/// > +static StringRef getImmediateMacroName(SourceLocation Loc, > + const SourceManager &SM, > + const LangOptions &LangOpts) { > + assert(Loc.isMacroID() && "Only reasonble to call this on macros"); > + // Walk past macro argument expanions. > + while (SM.isMacroArgExpansion(Loc)) > + Loc = SM.getImmediateExpansionRange(Loc).first; > + > + // Find the spelling location of the start of the non-argument expansion > + // range. This is where the macro name was spelled in order to begin > + // expanding this macro. > + Loc = SM.getSpellingLoc(SM.getImmediateExpansionRange(Loc).first); > + > + // Dig out the buffer where the macro name was spelled and the extents of > the > + // name so that we can render it into the expansion note. > + std::pair<FileID, unsigned> ExpansionInfo = SM.getDecomposedLoc(Loc); > + unsigned MacroTokenLength = Lexer::MeasureTokenLength(Loc, SM, LangOpts); > + StringRef ExpansionBuffer = SM.getBufferData(ExpansionInfo.first); > + return ExpansionBuffer.substr(ExpansionInfo.second, MacroTokenLength); > +} > +
Can you write this as a public SourceManager method? -- Abramo Bagnara Opera Unica Phone: +39.0546.656023 Via Borghesi, 16 48014 Castel Bolognese (RA) - Italy _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
