Hi Richard, FTR, this caused http://bugs.llvm.org/show_bug.cgi?id=32693
Any suggestions on how to approach this? On Fri, Feb 5, 2016 at 11:03 AM, Richard Smith via cfe-commits <cfe-commits@lists.llvm.org> wrote: > Author: rsmith > Date: Fri Feb 5 13:03:40 2016 > New Revision: 259901 > > URL: http://llvm.org/viewvc/llvm-project?rev=259901&view=rev > Log: > [modules] Separately track whether an identifier's preprocessor information > and > name lookup information have changed since deserialization. For a C++ modules > build, we do not need to re-emit the identifier into the serialized identifier > table if only the name lookup information has changed (and in all cases, we > don't need to re-emit the macro information if only the name lookup > information > has changed). > > Added: > cfe/trunk/test/Modules/minimal-identifier-tables.cpp > Modified: > cfe/trunk/include/clang/Basic/IdentifierTable.h > cfe/trunk/lib/Basic/IdentifierTable.cpp > cfe/trunk/lib/Sema/IdentifierResolver.cpp > cfe/trunk/lib/Serialization/ASTWriter.cpp > > Modified: cfe/trunk/include/clang/Basic/IdentifierTable.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/IdentifierTable.h?rev=259901&r1=259900&r2=259901&view=diff > ============================================================================== > --- cfe/trunk/include/clang/Basic/IdentifierTable.h (original) > +++ cfe/trunk/include/clang/Basic/IdentifierTable.h Fri Feb 5 13:03:40 2016 > @@ -62,6 +62,9 @@ class IdentifierInfo { > // partially) from an AST file. > bool ChangedAfterLoad : 1; // True if identifier has changed from the > // definition loaded from an AST file. > + bool FEChangedAfterLoad : 1; // True if identifier's frontend > information > + // has changed from the definition loaded > + // from an AST file. > bool RevertedTokenID : 1; // True if revertTokenIDToIdentifier was > // called. > bool OutOfDate : 1; // True if there may be additional > @@ -69,7 +72,7 @@ class IdentifierInfo { > // stored externally. > bool IsModulesImport : 1; // True if this is the 'import' contextual > // keyword. > - // 30 bit left in 64-bit word. > + // 29 bit left in 64-bit word. > > void *FETokenInfo; // Managed by the language front-end. > llvm::StringMapEntry<IdentifierInfo*> *Entry; > @@ -303,6 +306,18 @@ public: > ChangedAfterLoad = true; > } > > + /// \brief Determine whether the frontend token information for this > + /// identifier has changed since it was loaded from an AST file. > + bool hasFETokenInfoChangedSinceDeserialization() const { > + return FEChangedAfterLoad; > + } > + > + /// \brief Note that the frontend token information for this identifier has > + /// changed since it was loaded from an AST file. > + void setFETokenInfoChangedSinceDeserialization() { > + FEChangedAfterLoad = true; > + } > + > /// \brief Determine whether the information for this identifier is out of > /// date with respect to the external source. > bool isOutOfDate() const { return OutOfDate; } > > Modified: cfe/trunk/lib/Basic/IdentifierTable.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/IdentifierTable.cpp?rev=259901&r1=259900&r2=259901&view=diff > ============================================================================== > --- cfe/trunk/lib/Basic/IdentifierTable.cpp (original) > +++ cfe/trunk/lib/Basic/IdentifierTable.cpp Fri Feb 5 13:03:40 2016 > @@ -42,6 +42,7 @@ IdentifierInfo::IdentifierInfo() { > NeedsHandleIdentifier = false; > IsFromAST = false; > ChangedAfterLoad = false; > + FEChangedAfterLoad = false; > RevertedTokenID = false; > OutOfDate = false; > IsModulesImport = false; > > Modified: cfe/trunk/lib/Sema/IdentifierResolver.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/IdentifierResolver.cpp?rev=259901&r1=259900&r2=259901&view=diff > ============================================================================== > --- cfe/trunk/lib/Sema/IdentifierResolver.cpp (original) > +++ cfe/trunk/lib/Sema/IdentifierResolver.cpp Fri Feb 5 13:03:40 2016 > @@ -381,7 +381,7 @@ void IdentifierResolver::updatingIdentif > PP.getExternalSource()->updateOutOfDateIdentifier(II); > > if (II.isFromAST()) > - II.setChangedSinceDeserialization(); > + II.setFETokenInfoChangedSinceDeserialization(); > } > > > //===----------------------------------------------------------------------===// > > Modified: cfe/trunk/lib/Serialization/ASTWriter.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriter.cpp?rev=259901&r1=259900&r2=259901&view=diff > ============================================================================== > --- cfe/trunk/lib/Serialization/ASTWriter.cpp (original) > +++ cfe/trunk/lib/Serialization/ASTWriter.cpp Fri Feb 5 13:03:40 2016 > @@ -3162,6 +3162,8 @@ public: > NeedDecls(!IsModule || !Writer.getLangOpts().CPlusPlus), > InterestingIdentifierOffsets(InterestingIdentifierOffsets) {} > > + bool needDecls() const { return NeedDecls; } > + > static hash_value_type ComputeHash(const IdentifierInfo* II) { > return llvm::HashString(II->getName()); > } > @@ -3307,7 +3309,9 @@ void ASTWriter::WriteIdentifierTable(Pre > auto *II = const_cast<IdentifierInfo *>(IdentIDPair.first); > IdentID ID = IdentIDPair.second; > assert(II && "NULL identifier in identifier table"); > - if (!Chain || !II->isFromAST() || II->hasChangedSinceDeserialization()) > + if (!Chain || !II->isFromAST() || II->hasChangedSinceDeserialization() > || > + (Trait.needDecls() && > + II->hasFETokenInfoChangedSinceDeserialization())) > Generator.insert(II, ID, Trait); > } > > > Added: cfe/trunk/test/Modules/minimal-identifier-tables.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/minimal-identifier-tables.cpp?rev=259901&view=auto > ============================================================================== > --- cfe/trunk/test/Modules/minimal-identifier-tables.cpp (added) > +++ cfe/trunk/test/Modules/minimal-identifier-tables.cpp Fri Feb 5 13:03:40 > 2016 > @@ -0,0 +1,10 @@ > +// RUN: rm -rf %t > +// RUN: mkdir %t > +// RUN: echo 'extern int some_long_variable_name;' > %t/x.h > +// RUN: echo 'extern int some_long_variable_name;' > %t/y.h > +// RUN: echo 'module X { header "x.h" } module Y { header "y.h" }' > %t/map > +// RUN: %clang_cc1 -fmodules -x c++ -fmodule-name=X %t/map -emit-module -o > %t/x.pcm > +// RUN: %clang_cc1 -fmodules -x c++ -fmodule-name=Y %t/map > -fmodule-file=%t/x.pcm -emit-module -o %t/y.pcm > +// RUN: cat %t/y.pcm | FileCheck %s > +// > +// CHECK-NOT: some_long_variable_name > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits -- Bruno Cardoso Lopes http://www.brunocardoso.cc _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits