summaryrefslogtreecommitdiffstats
path: root/clang/lib/Serialization/ASTWriter.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2012-01-01 19:51:50 +0000
committerDouglas Gregor <dgregor@apple.com>2012-01-01 19:51:50 +0000
commita715bfff98cbe13c31303c19829bc20226b38a1d (patch)
tree8cb54beae387712d5c1ed97464be27206bdbfc22 /clang/lib/Serialization/ASTWriter.cpp
parent1c064e0a896451b8083bf2b66c11d7222bc2f3e2 (diff)
downloadbcm5719-llvm-a715bfff98cbe13c31303c19829bc20226b38a1d.tar.gz
bcm5719-llvm-a715bfff98cbe13c31303c19829bc20226b38a1d.zip
Introduce the core infrastructure needed to model redeclaration chains
for Objective-C protocols, including: - Using the first declaration as the canonical declaration - Using the definition as the primary DeclContext - Making sure that all declarations have a pointer to the definition data, and that we know which declaration is the definition - Serialization support for redeclaration chains and for adding definitions to already-serialized declarations. However, note that we're not taking advantage of much of this code yet, because we're still re-using ObjCProtocolDecls. llvm-svn: 147410
Diffstat (limited to 'clang/lib/Serialization/ASTWriter.cpp')
-rw-r--r--clang/lib/Serialization/ASTWriter.cpp19
1 files changed, 19 insertions, 0 deletions
diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp
index cfc83f7bc0a..e59a3d39d16 100644
--- a/clang/lib/Serialization/ASTWriter.cpp
+++ b/clang/lib/Serialization/ASTWriter.cpp
@@ -3483,6 +3483,7 @@ void ASTWriter::ResolveDeclUpdatesBlocks() {
case UPD_CXX_ADDED_TEMPLATE_SPECIALIZATION:
case UPD_CXX_ADDED_ANONYMOUS_NAMESPACE:
case UPD_OBJC_SET_CLASS_DEFINITIONDATA:
+ case UPD_OBJC_SET_PROTOCOL_DEFINITIONDATA:
URec[Idx] = GetDeclRef(reinterpret_cast<Decl *>(URec[Idx]));
++Idx;
break;
@@ -4447,6 +4448,24 @@ void ASTWriter::CompletedObjCForwardRef(const ObjCContainerDecl *D) {
}
}
}
+
+ if (const ObjCProtocolDecl *PD = dyn_cast<ObjCProtocolDecl>(D)) {
+ for (ObjCProtocolDecl::redecl_iterator I = PD->redecls_begin(),
+ E = PD->redecls_end();
+ I != E; ++I) {
+ if (*I == PD)
+ continue;
+
+ // We are interested when a PCH decl is modified.
+ if (I->isFromASTFile()) {
+ UpdateRecord &Record = DeclUpdates[*I];
+ Record.push_back(UPD_OBJC_SET_PROTOCOL_DEFINITIONDATA);
+ assert((*I)->hasDefinition());
+ assert((*I)->getDefinition() == D);
+ Record.push_back(reinterpret_cast<uint64_t>(D)); // the DefinitionDecl
+ }
+ }
+ }
}
void ASTWriter::AddedObjCPropertyInClassExtension(const ObjCPropertyDecl *Prop,
OpenPOWER on IntegriCloud