[cfe-commits] r140337 - in /cfe/trunk/lib: Lex/PreprocessingRecord.cpp Serialization/ASTReader.cpp
Argyrios Kyrtzidis
akyrtzi at gmail.com
Thu Sep 22 21:36:19 PDT 2011
On Sep 22, 2011, at 7:43 PM, Ahmed Charles wrote:
> 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
The point was to avoid lower_bound because the collection can be unordered in certain cases and this triggers an MSVC assertion.
> 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