]> granicus.if.org Git - clang/commitdiff
When we deserialize a declaration from a module file, allocate extra
authorDouglas Gregor <dgregor@apple.com>
Thu, 5 Jan 2012 22:27:05 +0000 (22:27 +0000)
committerDouglas Gregor <dgregor@apple.com>
Thu, 5 Jan 2012 22:27:05 +0000 (22:27 +0000)
storage for the global declaration ID. Declarations that are parsed
(rather than deserialized) are unaffected, so the number of
declarations that pay this cost tends to be relatively small (since
relatively few declarations are ever deserialized).

This replaces a largish DenseMap within the AST reader. It's not
strictly a win in terms of memory use---not every declaration was
added to that DenseMap in the first place---but it's cleaner to have
this information available for every deserialized declaration, so that
future clients can rely on it.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@147617 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/DeclBase.h
include/clang/Serialization/ASTReader.h
lib/AST/DeclBase.cpp
lib/Serialization/ASTReaderDecl.cpp
lib/Serialization/ASTWriter.cpp

index 12f37e53e98bad66e3a842ecaa871b81c10f1a49..09e1fdcd63a5e9cdad67ea36e6c28b255481d733 100644 (file)
@@ -532,6 +532,14 @@ public:
   /// a precompiled header or module) rather than having been parsed.
   bool isFromASTFile() const { return FromASTFile; }
 
+  /// \brief Retrieve the global declaration ID associated with this 
+  /// declaration, which specifies where in the 
+  unsigned getGlobalID() const { 
+    if (isFromASTFile())
+      return *((const unsigned*)this - 1);
+    return 0;
+  }
+              
   unsigned getIdentifierNamespace() const {
     return IdentifierNamespace;
   }
index f808b962e113876fec77357dbd8376307cb4c2f5..4a704d0c35c532688a563d065bf5de654d515cb0 100644 (file)
@@ -675,13 +675,6 @@ private:
   /// \brief Keeps track of the elements added to PendingDeclChains.
   llvm::SmallSet<serialization::DeclID, 16> PendingDeclChainsKnown;
 
-  /// \brief Reverse mapping from declarations to their global declaration IDs.
-  /// 
-  /// FIXME: This data structure is currently only used for ObjCInterfaceDecls
-  /// and ObjCProtocolDecls to support declaration merging. If we must have 
-  /// this for other declarations, allocate it along with the Decl itself.
-  llvm::DenseMap<Decl *, serialization::GlobalDeclID> DeclToID;
-  
   typedef llvm::DenseMap<Decl *, llvm::SmallVector<serialization::DeclID, 2> >
     MergedDeclsMap;
     
index 55484188c869f2a49bcbdeaafc8aec419898a8c4..f4e5d43ee6c46fbd36dc0c25fef83711a9265be1 100644 (file)
@@ -44,7 +44,20 @@ static bool StatSwitch = false;
 void *Decl::AllocateDeserializedDecl(const ASTContext &Context, 
                                      unsigned ID,
                                      unsigned Size) {
-  return Context.Allocate(Size);
+  // Allocate an extra pointer's worth of storage, which ensures that 
+  //   (1) We have enough storage to stash the global declaration ID, and
+  //   (2) We maintain pointer alignment.
+  //
+  // Note that this wastes 4 bytes on x86-64, which we'll undoubtedly end up
+  // finding a use for later.
+  void *Start = Context.Allocate(Size + sizeof(void*));
+  void *Result = (char*)Start + sizeof(void*);
+  
+  // Store the global declaration ID 
+  unsigned *IDPtr = (unsigned*)Result - 1;
+  *IDPtr = ID;
+  
+  return Result;
 }
 
 const char *Decl::getDeclKindName() const {
index cff8667f4b5fcf50122410a3013966ecb27feb8c..0672129f1e8e1cb784d1bd481148cd24fe24fec0 100644 (file)
@@ -402,9 +402,6 @@ void ASTDeclReader::VisitTypeDecl(TypeDecl *TD) {
 }
 
 void ASTDeclReader::VisitTypedefNameDecl(TypedefNameDecl *TD) {
-  // Record the declaration -> global ID mapping.
-  Reader.DeclToID[TD] = ThisDeclID;
-  
   RedeclarableResult Redecl = VisitRedeclarable(TD);
   VisitTypeDecl(TD);
   
@@ -421,9 +418,6 @@ void ASTDeclReader::VisitTypeAliasDecl(TypeAliasDecl *TD) {
 }
 
 void ASTDeclReader::VisitTagDecl(TagDecl *TD) {
-  // Record the declaration -> global ID mapping.
-  Reader.DeclToID[TD] = ThisDeclID;
-    
   RedeclarableResult Redecl = VisitRedeclarable(TD);
   VisitTypeDecl(TD);
   
@@ -490,9 +484,6 @@ void ASTDeclReader::VisitDeclaratorDecl(DeclaratorDecl *DD) {
 }
 
 void ASTDeclReader::VisitFunctionDecl(FunctionDecl *FD) {
-  // Record the declaration -> global ID mapping.
-  Reader.DeclToID[FD] = ThisDeclID;
-  
   RedeclarableResult Redecl = VisitRedeclarable(FD);
   VisitDeclaratorDecl(FD);
 
@@ -673,9 +664,6 @@ void ASTDeclReader::VisitObjCContainerDecl(ObjCContainerDecl *CD) {
 }
 
 void ASTDeclReader::VisitObjCInterfaceDecl(ObjCInterfaceDecl *ID) {
-  // Record the declaration -> global ID mapping.
-  Reader.DeclToID[ID] = ThisDeclID;
-  
   RedeclarableResult Redecl = VisitRedeclarable(ID);
   VisitObjCContainerDecl(ID);
   TypeIDForTypeDecl = Reader.getGlobalTypeID(F, Record[Idx++]);
@@ -746,9 +734,6 @@ void ASTDeclReader::VisitObjCIvarDecl(ObjCIvarDecl *IVD) {
 }
 
 void ASTDeclReader::VisitObjCProtocolDecl(ObjCProtocolDecl *PD) {
-  // Record the declaration -> global ID mapping.
-  Reader.DeclToID[PD] = ThisDeclID;
-  
   RedeclarableResult Redecl = VisitRedeclarable(PD);
   VisitObjCContainerDecl(PD);
   mergeRedeclarable(PD, Redecl);
@@ -880,9 +865,6 @@ void ASTDeclReader::VisitIndirectFieldDecl(IndirectFieldDecl *FD) {
 }
 
 void ASTDeclReader::VisitVarDecl(VarDecl *VD) {
-  // Record the declaration -> global ID mapping.
-  Reader.DeclToID[VD] = ThisDeclID;
-  
   RedeclarableResult Redecl = VisitRedeclarable(VD);
   VisitDeclaratorDecl(VD);
   
@@ -1561,7 +1543,7 @@ void ASTDeclReader::mergeRedeclarable(Redeclarable<T> *D,
         // Introduce ExistingCanon into the set of pending declaration chains,
         // if in fact it came from a module file.
         if (ExistingCanon->isFromASTFile()) {
-          GlobalDeclID ExistingCanonID = Reader.DeclToID[ExistingCanon];
+          GlobalDeclID ExistingCanonID = ExistingCanon->getGlobalID();
           assert(ExistingCanonID && "Unrecorded canonical declaration ID?");
           if (Reader.PendingDeclChainsKnown.insert(ExistingCanonID))
             Reader.PendingDeclChains.push_back(ExistingCanonID);
index 1317525c27d9186cd4e21a3b8c3e7e2fd137bc0f..52578599ea912b9ecc82273140851614a5f17b9b 100644 (file)
@@ -2914,7 +2914,7 @@ void ASTWriter::WriteMergedDecls() {
   for (ASTReader::MergedDeclsMap::iterator I = Chain->MergedDecls.begin(),
                                         IEnd = Chain->MergedDecls.end();
        I != IEnd; ++I) {
-    DeclID CanonID = I->first->isFromASTFile()? Chain->DeclToID[I->first]
+    DeclID CanonID = I->first->isFromASTFile()? I->first->getGlobalID()
                                               : getDeclID(I->first);
     assert(CanonID && "Merged declaration not known?");