[cfe-commits] r140337 - in /cfe/trunk/lib: Lex/PreprocessingRecord.cpp Serialization/ASTReader.cpp
Ahmed Charles
ahmedcharles at gmail.com
Thu Sep 22 19:43:50 PDT 2011
Provide a different fourth parameter to lower_bound. It was
PPEntityComp, below and it seems like what you really want is a
comparison function which only considers a subset of what PPEntityComp
does. From: Argyrios Kyrtzidis
Sent: Thursday, September 22, 2011 7:35 PM
To: Ahmed Charles
Cc: cfe-commits at cs.uiuc.edu
Subject: Re: [cfe-commits] r140337 - in /cfe/trunk/lib:
Lex/PreprocessingRecord.cpp Serialization/ASTReader.cpp
On Sep 22, 2011, at 7:16 PM, Ahmed Charles wrote:
> Why not change the comparison function rather than write your own
> binary search in two different places?
How should I change the comparison function, could you elaborate ?
> From: Argyrios Kyrtzidis
> Sent: Thursday, September 22, 2011 2:20 PM
> To: cfe-commits at cs.uiuc.edu
> Subject: [cfe-commits] r140337 - in /cfe/trunk/lib:
> Lex/PreprocessingRecord.cpp Serialization/ASTReader.cpp
> Author: akirtzidis
> Date: Thu Sep 22 16:17:02 2011
> New Revision: 140337
>
> URL: http://llvm.org/viewvc/llvm-project?rev=140337&view=rev
> Log:
> Do manual binary search for preprocessing entities because their end locations
> may be unordered and MSVC's debug-mode doesn't like it.
>
> Modified:
> cfe/trunk/lib/Lex/PreprocessingRecord.cpp
> cfe/trunk/lib/Serialization/ASTReader.cpp
>
> Modified: cfe/trunk/lib/Lex/PreprocessingRecord.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/PreprocessingRecord.cpp?rev=140337&r1=140336&r2=140337&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Lex/PreprocessingRecord.cpp (original)
> +++ cfe/trunk/lib/Lex/PreprocessingRecord.cpp Thu Sep 22 16:17:02 2011
> @@ -129,12 +129,30 @@
> if (SourceMgr.isLoadedSourceLocation(Loc))
> return 0;
>
> + size_t Count = PreprocessedEntities.size();
> + size_t Half;
> std::vector<PreprocessedEntity *>::const_iterator
> - I = std::lower_bound(PreprocessedEntities.begin(),
> - PreprocessedEntities.end(),
> - Loc,
> - PPEntityComp<&SourceRange::getEnd>(SourceMgr));
> - return I - PreprocessedEntities.begin();
> + First = PreprocessedEntities.begin();
> + std::vector<PreprocessedEntity *>::const_iterator I;
> +
> + // Do a binary search manually instead of using std::lower_bound because
> + // The end locations of entities may be unordered (when a macro expansion
> + // is inside another macro argument), but for this case it is not important
> + // whether we get the first macro expansion or its containing macro.
> + while (Count > 0) {
> + Half = Count/2;
> + I = First;
> + std::advance(I, Half);
> + if (SourceMgr.isBeforeInTranslationUnit((*I)->getSourceRange().getEnd(),
> + Loc)){
> + First = I;
> + ++First;
> + Count = Count - Half - 1;
> + } else
> + Count = Half;
> + }
> +
> + return First - PreprocessedEntities.begin();
> }
>
> unsigned PreprocessingRecord::findEndLocalPreprocessedEntity(
>
> Modified: cfe/trunk/lib/Serialization/ASTReader.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReader.cpp?rev=140337&r1=140336&r2=140337&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Serialization/ASTReader.cpp (original)
> +++ cfe/trunk/lib/Serialization/ASTReader.cpp Thu Sep 22 16:17:02 2011
> @@ -2947,9 +2947,28 @@
> typedef const PPEntityOffset *pp_iterator;
> pp_iterator pp_begin = M.PreprocessedEntityOffsets;
> pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities;
> - pp_iterator PPI =
> - std::lower_bound(pp_begin, pp_end, BLoc,
> - PPEntityComp<&PPEntityOffset::End>(*this, M));
> +
> + size_t Count = M.NumPreprocessedEntities;
> + size_t Half;
> + pp_iterator First = pp_begin;
> + pp_iterator PPI;
> +
> + // Do a binary search manually instead of using std::lower_bound because
> + // The end locations of entities may be unordered (when a macro expansion
> + // is inside another macro argument), but for this case it is not important
> + // whether we get the first macro expansion or its containing macro.
> + while (Count > 0) {
> + Half = Count/2;
> + PPI = First;
> + std::advance(PPI, Half);
> + if (SourceMgr.isBeforeInTranslationUnit(ReadSourceLocation(M, PPI->End),
> + BLoc)){
> + First = PPI;
> + ++First;
> + Count = Count - Half - 1;
> + } else
> + Count = Half;
> + }
>
> if (PPI == pp_end)
> return findNextPreprocessedEntity(SLocMapI);
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list