From: Argyrios Kyrtzidis Date: Tue, 4 Dec 2012 07:26:53 +0000 (+0000) Subject: In the PreprocessingRecord, to identify the different conditional directive regions X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=df1059cac42d613547d86b4e44c5e364bfc03073;p=clang In the PreprocessingRecord, to identify the different conditional directive regions use the SourceLocation at the start of the respective region, instead of a unique integer. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@169228 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Lex/PreprocessingRecord.h b/include/clang/Lex/PreprocessingRecord.h index 57e51b754e..6189ee23ba 100644 --- a/include/clang/Lex/PreprocessingRecord.h +++ b/include/clang/Lex/PreprocessingRecord.h @@ -304,18 +304,18 @@ namespace clang { std::vector LoadedPreprocessedEntities; bool RecordCondDirectives; - unsigned CondDirectiveNextIdx; - SmallVector CondDirectiveStack; + SmallVector CondDirectiveStack; class CondDirectiveLoc { SourceLocation Loc; - unsigned Idx; + SourceLocation RegionLoc; public: - CondDirectiveLoc(SourceLocation Loc, unsigned Idx) : Loc(Loc), Idx(Idx) {} + CondDirectiveLoc(SourceLocation Loc, SourceLocation RegionLoc) + : Loc(Loc), RegionLoc(RegionLoc) {} SourceLocation getLoc() const { return Loc; } - unsigned getIdx() const { return Idx; } + SourceLocation getRegionLoc() const { return RegionLoc; } class Comp { SourceManager &SM; @@ -339,7 +339,7 @@ namespace clang { CondDirectiveLocsTy CondDirectiveLocs; void addCondDirectiveLoc(CondDirectiveLoc DirLoc); - unsigned findCondDirectiveIdx(SourceLocation Loc) const; + SourceLocation findCondDirectiveRegionLoc(SourceLocation Loc) const; /// \brief Global (loaded or local) ID for a preprocessed entity. /// Negative values are used to indicate preprocessed entities @@ -597,7 +597,7 @@ namespace clang { /// separated by conditional directive blocks. bool areInDifferentConditionalDirectiveRegion(SourceLocation LHS, SourceLocation RHS) const { - return findCondDirectiveIdx(LHS) != findCondDirectiveIdx(RHS); + return findCondDirectiveRegionLoc(LHS) != findCondDirectiveRegionLoc(RHS); } /// \brief Set the external source for preprocessed entities. diff --git a/lib/Lex/PreprocessingRecord.cpp b/lib/Lex/PreprocessingRecord.cpp index 01f3665e76..0376e449ae 100644 --- a/lib/Lex/PreprocessingRecord.cpp +++ b/lib/Lex/PreprocessingRecord.cpp @@ -41,11 +41,11 @@ InclusionDirective::InclusionDirective(PreprocessingRecord &PPRec, PreprocessingRecord::PreprocessingRecord(SourceManager &SM, bool RecordConditionalDirectives) : SourceMgr(SM), - RecordCondDirectives(RecordConditionalDirectives), CondDirectiveNextIdx(0), + RecordCondDirectives(RecordConditionalDirectives), ExternalSource(0) { if (RecordCondDirectives) - CondDirectiveStack.push_back(CondDirectiveNextIdx++); + CondDirectiveStack.push_back(SourceLocation()); } /// \brief Returns a pair of [Begin, End) iterators of preprocessed entities @@ -455,25 +455,24 @@ bool PreprocessingRecord::rangeIntersectsConditionalDirective( CondDirectiveLocsTy::const_iterator upp = std::upper_bound(low, CondDirectiveLocs.end(), Range.getEnd(), CondDirectiveLoc::Comp(SourceMgr)); - unsigned uppIdx; + SourceLocation uppRegion; if (upp != CondDirectiveLocs.end()) - uppIdx = upp->getIdx(); - else - uppIdx = 0; + uppRegion = upp->getRegionLoc(); - return low->getIdx() != uppIdx; + return low->getRegionLoc() != uppRegion; } -unsigned PreprocessingRecord::findCondDirectiveIdx(SourceLocation Loc) const { +SourceLocation +PreprocessingRecord::findCondDirectiveRegionLoc(SourceLocation Loc) const { if (Loc.isInvalid()) - return 0; + return SourceLocation(); CondDirectiveLocsTy::const_iterator low = std::lower_bound(CondDirectiveLocs.begin(), CondDirectiveLocs.end(), Loc, CondDirectiveLoc::Comp(SourceMgr)); if (low == CondDirectiveLocs.end()) - return 0; - return low->getIdx(); + return SourceLocation(); + return low->getRegionLoc(); } void PreprocessingRecord::addCondDirectiveLoc(CondDirectiveLoc DirLoc) { @@ -490,33 +489,37 @@ void PreprocessingRecord::addCondDirectiveLoc(CondDirectiveLoc DirLoc) { void PreprocessingRecord::If(SourceLocation Loc, SourceRange ConditionRange) { if (RecordCondDirectives) { addCondDirectiveLoc(CondDirectiveLoc(Loc, CondDirectiveStack.back())); - CondDirectiveStack.push_back(CondDirectiveNextIdx++); + CondDirectiveStack.push_back(Loc); } } void PreprocessingRecord::Ifdef(SourceLocation Loc, const Token &MacroNameTok) { if (RecordCondDirectives) { addCondDirectiveLoc(CondDirectiveLoc(Loc, CondDirectiveStack.back())); - CondDirectiveStack.push_back(CondDirectiveNextIdx++); + CondDirectiveStack.push_back(Loc); } } void PreprocessingRecord::Ifndef(SourceLocation Loc,const Token &MacroNameTok) { if (RecordCondDirectives) { addCondDirectiveLoc(CondDirectiveLoc(Loc, CondDirectiveStack.back())); - CondDirectiveStack.push_back(CondDirectiveNextIdx++); + CondDirectiveStack.push_back(Loc); } } void PreprocessingRecord::Elif(SourceLocation Loc, SourceRange ConditionRange, SourceLocation IfLoc) { - if (RecordCondDirectives) + if (RecordCondDirectives) { addCondDirectiveLoc(CondDirectiveLoc(Loc, CondDirectiveStack.back())); + CondDirectiveStack.back() = Loc; + } } void PreprocessingRecord::Else(SourceLocation Loc, SourceLocation IfLoc) { - if (RecordCondDirectives) + if (RecordCondDirectives) { addCondDirectiveLoc(CondDirectiveLoc(Loc, CondDirectiveStack.back())); + CondDirectiveStack.back() = Loc; + } } void PreprocessingRecord::Endif(SourceLocation Loc, SourceLocation IfLoc) {