r179730 - [Modules] Use global index to improve typo correction performance
Argyrios Kyrtzidis
akyrtzi at gmail.com
Wed Apr 17 17:07:05 PDT 2013
On Apr 17, 2013, at 4:07 PM, David Blaikie <dblaikie at gmail.com> wrote:
> On Wed, Apr 17, 2013 at 3:10 PM, Argyrios Kyrtzidis <akyrtzi at gmail.com> wrote:
>> Author: akirtzidis
>> Date: Wed Apr 17 17:10:55 2013
>> New Revision: 179730
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=179730&view=rev
>> Log:
>> [Modules] Use global index to improve typo correction performance
>>
>> Typo correction for an unqualified name needs to walk through all of the identifier tables of all modules.
>> When we have a global index, just walk its identifier table only.
>>
>> rdar://13425732
>>
>> Modified:
>> cfe/trunk/include/clang/Basic/IdentifierTable.h
>> cfe/trunk/include/clang/Serialization/ASTReader.h
>> cfe/trunk/include/clang/Serialization/GlobalModuleIndex.h
>> cfe/trunk/lib/Basic/IdentifierTable.cpp
>> cfe/trunk/lib/Serialization/ASTReader.cpp
>> cfe/trunk/lib/Serialization/GlobalModuleIndex.cpp
>>
>> Modified: cfe/trunk/include/clang/Basic/IdentifierTable.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/IdentifierTable.h?rev=179730&r1=179729&r2=179730&view=diff
>> ==============================================================================
>> --- cfe/trunk/include/clang/Basic/IdentifierTable.h (original)
>> +++ cfe/trunk/include/clang/Basic/IdentifierTable.h Wed Apr 17 17:10:55 2013
>> @@ -394,7 +394,7 @@ public:
>> ///
>> /// \returns A new iterator into the set of known identifiers. The
>> /// caller is responsible for deleting this iterator.
>> - virtual IdentifierIterator *getIdentifiers() const;
>> + virtual IdentifierIterator *getIdentifiers();
>> };
>>
>> /// \brief An abstract class used to resolve numerical identifier
>>
>> Modified: cfe/trunk/include/clang/Serialization/ASTReader.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTReader.h?rev=179730&r1=179729&r2=179730&view=diff
>> ==============================================================================
>> --- cfe/trunk/include/clang/Serialization/ASTReader.h (original)
>> +++ cfe/trunk/include/clang/Serialization/ASTReader.h Wed Apr 17 17:10:55 2013
>> @@ -1558,7 +1558,7 @@ public:
>>
>> /// \brief Retrieve an iterator into the set of all identifiers
>> /// in all loaded AST files.
>> - virtual IdentifierIterator *getIdentifiers() const;
>> + virtual IdentifierIterator *getIdentifiers();
>>
>> /// \brief Load the contents of the global method pool for a given
>> /// selector.
>>
>> Modified: cfe/trunk/include/clang/Serialization/GlobalModuleIndex.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/GlobalModuleIndex.h?rev=179730&r1=179729&r2=179730&view=diff
>> ==============================================================================
>> --- cfe/trunk/include/clang/Serialization/GlobalModuleIndex.h (original)
>> +++ cfe/trunk/include/clang/Serialization/GlobalModuleIndex.h Wed Apr 17 17:10:55 2013
>> @@ -146,6 +146,11 @@ public:
>> static std::pair<GlobalModuleIndex *, ErrorCode>
>> readIndex(StringRef Path);
>>
>> + /// \brief Returns an iterator for identifiers stored in the index table.
>> + ///
>> + /// The caller accepts ownership of the returned object.
>> + IdentifierIterator *createIdentifierIterator() const;
>> +
>> /// \brief Retrieve the set of modules that have up-to-date indexes.
>> ///
>> /// \param ModuleFiles Will be populated with the set of module files that
>>
>> Modified: cfe/trunk/lib/Basic/IdentifierTable.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/IdentifierTable.cpp?rev=179730&r1=179729&r2=179730&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Basic/IdentifierTable.cpp (original)
>> +++ cfe/trunk/lib/Basic/IdentifierTable.cpp Wed Apr 17 17:10:55 2013
>> @@ -65,7 +65,7 @@ namespace {
>> };
>> }
>>
>> -IdentifierIterator *IdentifierInfoLookup::getIdentifiers() const {
>> +IdentifierIterator *IdentifierInfoLookup::getIdentifiers() {
>> return new EmptyLookupIterator();
>> }
>>
>>
>> Modified: cfe/trunk/lib/Serialization/ASTReader.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReader.cpp?rev=179730&r1=179729&r2=179730&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Serialization/ASTReader.cpp (original)
>> +++ cfe/trunk/lib/Serialization/ASTReader.cpp Wed Apr 17 17:10:55 2013
>> @@ -6109,7 +6109,10 @@ StringRef ASTIdentifierIterator::Next()
>> return Result;
>> }
>>
>> -IdentifierIterator *ASTReader::getIdentifiers() const {
>> +IdentifierIterator *ASTReader::getIdentifiers() {
>> + if (!loadGlobalIndex())
>> + return GlobalIndex->createIdentifierIterator();
>
> This sort of feels like it still ought to be conceptually const,
> perhaps? (ie: loading the global index (I haven't actually looked at
> the implementation details of that function) is an implementation
> detail that doesn't change the "state" of the ASTReader, does it?
> Well, I suppose it's a 'reader' so its constness is non-obvious to
> begin with). Just a thought.
This is implementing the method from the abstract class IdentifierInfoLookup (ASTReader is an implementation of it).
Not a strong opinion but I'm leaning towards that IdentifierInfoLookup should not dictate to its implementations that the "getIdentifiers()" method implementation ought to be const. It did not for the "get()" method.
>
>> +
>> return new ASTIdentifierIterator(*this);
>> }
>>
>>
>> Modified: cfe/trunk/lib/Serialization/GlobalModuleIndex.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/GlobalModuleIndex.cpp?rev=179730&r1=179729&r2=179730&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Serialization/GlobalModuleIndex.cpp (original)
>> +++ cfe/trunk/lib/Serialization/GlobalModuleIndex.cpp Wed Apr 17 17:10:55 2013
>> @@ -818,3 +818,34 @@ GlobalModuleIndex::writeIndex(FileManage
>> // We're done.
>> return EC_None;
>> }
>> +
>> +namespace {
>> + class GlobalIndexIdentifierIterator : public IdentifierIterator {
>> + /// \brief The current position within the identifier lookup table.
>> + IdentifierIndexTable::key_iterator Current;
>> +
>> + /// \brief The end position within the identifier lookup table.
>> + IdentifierIndexTable::key_iterator End;
>> +
>> + public:
>> + explicit GlobalIndexIdentifierIterator(IdentifierIndexTable &Idx) {
>> + Current = Idx.key_begin();
>> + End = Idx.key_end();
>> + }
>> +
>> + virtual StringRef Next() {
>> + if (Current == End)
>> + return StringRef();
>> +
>> + StringRef Result = *Current;
>> + ++Current;
>> + return Result;
>> + }
>> + };
>> +}
>> +
>> +IdentifierIterator *GlobalModuleIndex::createIdentifierIterator() const {
>> + IdentifierIndexTable &Table =
>> + *static_cast<IdentifierIndexTable *>(IdentifierIndex);
>> + return new GlobalIndexIdentifierIterator(Table);
>> +}
>>
>>
>> _______________________________________________
>> 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