On Sun, Aug 23, 2015 at 8:33 PM, Richard Smith via cfe-commits < cfe-commits@lists.llvm.org> wrote:
> Author: rsmith > Date: Sun Aug 23 22:33:22 2015 > New Revision: 245821 > > URL: http://llvm.org/viewvc/llvm-project?rev=245821&view=rev > Log: > [modules] Stop updating all identifiers when writing a module. This is > unnecessary in C++ modules (where we don't need the identifiers for their > Decls) and expensive. > Why specifically C++ modules? -- Sean Silva > > Modified: > cfe/trunk/lib/Serialization/ASTReader.cpp > cfe/trunk/lib/Serialization/ASTReaderInternals.h > cfe/trunk/lib/Serialization/ASTWriter.cpp > cfe/trunk/test/Modules/macros.c > > Modified: cfe/trunk/lib/Serialization/ASTReader.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReader.cpp?rev=245821&r1=245820&r2=245821&view=diff > > ============================================================================== > --- cfe/trunk/lib/Serialization/ASTReader.cpp (original) > +++ cfe/trunk/lib/Serialization/ASTReader.cpp Sun Aug 23 22:33:22 2015 > @@ -755,6 +755,12 @@ static bool readBit(unsigned &Bits) { > return Value; > } > > +IdentID ASTIdentifierLookupTrait::ReadIdentifierID(const unsigned char > *d) { > + using namespace llvm::support; > + unsigned RawID = endian::readNext<uint32_t, little, unaligned>(d); > + return Reader.getGlobalIdentifierID(F, RawID >> 1); > +} > + > IdentifierInfo *ASTIdentifierLookupTrait::ReadData(const > internal_key_type& k, > const unsigned char* d, > unsigned DataLen) { > @@ -3455,7 +3461,20 @@ ASTReader::ASTReadResult ASTReader::Read > ASTIdentifierLookupTrait Trait(*this, F); > auto KeyDataLen = Trait.ReadKeyDataLength(Data); > auto Key = Trait.ReadKey(Data, KeyDataLen.first); > - PP.getIdentifierTable().getOwn(Key).setOutOfDate(true); > + auto &II = PP.getIdentifierTable().getOwn(Key); > + II.setOutOfDate(true); > + > + // Mark this identifier as being from an AST file so that we can > track > + // whether we need to serialize it. > + if (!II.isFromAST()) { > + II.setIsFromAST(); > + if (isInterestingIdentifier(*this, II, F.isModule())) > + II.setChangedSinceDeserialization(); > + } > + > + // Associate the ID with the identifier so that the writer can > reuse it. > + auto ID = Trait.ReadIdentifierID(Data + KeyDataLen.first); > + SetIdentifierInfo(ID, &II); > } > } > > > Modified: cfe/trunk/lib/Serialization/ASTReaderInternals.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderInternals.h?rev=245821&r1=245820&r2=245821&view=diff > > ============================================================================== > --- cfe/trunk/lib/Serialization/ASTReaderInternals.h (original) > +++ cfe/trunk/lib/Serialization/ASTReaderInternals.h Sun Aug 23 22:33:22 > 2015 > @@ -137,6 +137,8 @@ public: > const unsigned char* d, > unsigned DataLen); > > + IdentID ReadIdentifierID(const unsigned char *d); > + > ASTReader &getReader() const { return Reader; } > }; > > > Modified: cfe/trunk/lib/Serialization/ASTWriter.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriter.cpp?rev=245821&r1=245820&r2=245821&view=diff > > ============================================================================== > --- cfe/trunk/lib/Serialization/ASTWriter.cpp (original) > +++ cfe/trunk/lib/Serialization/ASTWriter.cpp Sun Aug 23 22:33:22 2015 > @@ -4273,22 +4273,24 @@ void ASTWriter::WriteASTCore(Sema &SemaR > } > > // Make sure all decls associated with an identifier are registered for > - // serialization. > - llvm::SmallVector<const IdentifierInfo*, 256> IIs; > - for (IdentifierTable::iterator ID = PP.getIdentifierTable().begin(), > - IDEnd = PP.getIdentifierTable().end(); > - ID != IDEnd; ++ID) { > - const IdentifierInfo *II = ID->second; > - if (!Chain || !II->isFromAST() || > II->hasChangedSinceDeserialization()) > - IIs.push_back(II); > - } > - // Sort the identifiers to visit based on their name. > - std::sort(IIs.begin(), IIs.end(), llvm::less_ptr<IdentifierInfo>()); > - for (const IdentifierInfo *II : IIs) { > - for (IdentifierResolver::iterator D = SemaRef.IdResolver.begin(II), > - DEnd = SemaRef.IdResolver.end(); > - D != DEnd; ++D) { > - GetDeclRef(*D); > + // serialization, if we're storing decls with identifiers. > + if (!WritingModule || !getLangOpts().CPlusPlus) { > + llvm::SmallVector<const IdentifierInfo*, 256> IIs; > + for (IdentifierTable::iterator ID = PP.getIdentifierTable().begin(), > + IDEnd = PP.getIdentifierTable().end(); > + ID != IDEnd; ++ID) { > + const IdentifierInfo *II = ID->second; > + if (!Chain || !II->isFromAST() || > II->hasChangedSinceDeserialization()) > + IIs.push_back(II); > + } > + // Sort the identifiers to visit based on their name. > + std::sort(IIs.begin(), IIs.end(), llvm::less_ptr<IdentifierInfo>()); > + for (const IdentifierInfo *II : IIs) { > + for (IdentifierResolver::iterator D = SemaRef.IdResolver.begin(II), > + DEnd = SemaRef.IdResolver.end(); > + D != DEnd; ++D) { > + GetDeclRef(*D); > + } > } > } > > > Modified: cfe/trunk/test/Modules/macros.c > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/macros.c?rev=245821&r1=245820&r2=245821&view=diff > > ============================================================================== > --- cfe/trunk/test/Modules/macros.c (original) > +++ cfe/trunk/test/Modules/macros.c Sun Aug 23 22:33:22 2015 > @@ -2,8 +2,14 @@ > // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -x objective-c > -verify -fmodules-cache-path=%t -I %S/Inputs %s > // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -x objective-c > -verify -fmodules-cache-path=%t -I %S/Inputs %s -DALT > // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -x objective-c > -verify -fmodules-cache-path=%t -I %S/Inputs %s > -detailed-preprocessing-record > -// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -DLOCAL_VISIBILITY > -fmodules-local-submodule-visibility -x objective-c++ -verify > -fmodules-cache-path=%t -I %S/Inputs %s > // RUN: not %clang_cc1 -E -fmodules -fimplicit-module-maps -x objective-c > -fmodules-cache-path=%t -I %S/Inputs %s | FileCheck -check-prefix > CHECK-PREPROCESSED %s > +// > +// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -x objective-c++ > -verify -fmodules-cache-path=%t -I %S/Inputs %s > +// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -x objective-c++ > -verify -fmodules-cache-path=%t -I %S/Inputs %s -DALT > +// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -x objective-c++ > -verify -fmodules-cache-path=%t -I %S/Inputs %s > -detailed-preprocessing-record > +// RUN: not %clang_cc1 -E -fmodules -fimplicit-module-maps -x > objective-c++ -fmodules-cache-path=%t -I %S/Inputs %s | FileCheck > -check-prefix CHECK-PREPROCESSED %s > +// > +// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -DLOCAL_VISIBILITY > -fmodules-local-submodule-visibility -x objective-c++ -verify > -fmodules-cache-path=%t -I %S/Inputs %s > // FIXME: When we have a syntax for modules in C, use that. > // These notes come from headers in modules, and are bogus. > > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits