[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. llvm-svn: 245821
This commit is contained in:
parent
d134a67ce9
commit
79bf920552
|
@ -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::ReadAST(const std::string &FileName,
|
|||
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -137,6 +137,8 @@ public:
|
|||
const unsigned char* d,
|
||||
unsigned DataLen);
|
||||
|
||||
IdentID ReadIdentifierID(const unsigned char *d);
|
||||
|
||||
ASTReader &getReader() const { return Reader; }
|
||||
};
|
||||
|
||||
|
|
|
@ -4273,22 +4273,24 @@ void ASTWriter::WriteASTCore(Sema &SemaRef,
|
|||
}
|
||||
|
||||
// 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
Loading…
Reference in New Issue