]> granicus.if.org Git - clang/commitdiff
Introduce a constant for the number of predefined declarations in an
authorDouglas Gregor <dgregor@apple.com>
Wed, 3 Aug 2011 16:05:40 +0000 (16:05 +0000)
committerDouglas Gregor <dgregor@apple.com>
Wed, 3 Aug 2011 16:05:40 +0000 (16:05 +0000)
AST file, along with an enumeration naming those predefined
declarations. No functionality change, but this will make it easier to
introduce new predefined declarations, when/if we need them.

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

include/clang/Serialization/ASTBitCodes.h
lib/Serialization/ASTReader.cpp
lib/Serialization/ASTWriter.cpp

index 761de497c7307c8b8f13d1111e4ad5f2ca31bad5..70a323a5c3740a88414cae679e11889df27679f9 100644 (file)
@@ -56,8 +56,9 @@ namespace clang {
     /// \brief An ID number that refers to a declaration in an AST file.
     ///
     /// The ID numbers of declarations are consecutive (in order of
-    /// discovery) and start at 2. 0 is reserved for NULL, and 1 is
-    /// reserved for the translation unit declaration.
+    /// discovery), with values below NUM_PREDEF_DECL_IDS being reserved. 
+    /// At the start of a chain of precompiled headers, declaration ID 1 is 
+    /// used for the translation unit declaration.
     typedef uint32_t DeclID;
 
     /// \brief a Decl::Kind/DeclID pair.
@@ -661,6 +662,23 @@ namespace clang {
       SPECIAL_TYPE_AUTO_RREF_DEDUCT            = 18
     };
 
+    /// \brief Predefined declaration IDs.
+    ///
+    /// These declaration IDs correspond to predefined declarations in the AST
+    /// context, such as the NULL declaration ID. Such declarations are never
+    /// actually serialized, since they will be built by the AST context when 
+    /// it is created.
+    enum PredefinedDeclIDs {
+      /// \brief The NULL declaration.
+      PREDEF_DECL_NULL_ID       = 0,
+    };
+
+    /// \brief The number of declaration IDs that are predefined.
+    ///
+    /// For more information about predefined declarations, see the
+    /// \c PredefinedDeclIDs type and the PREDEF_DECL_*_ID constants.
+    const unsigned int NUM_PREDEF_DECL_IDS = 1;
+    
     /// \brief Record codes for each kind of declaration.
     ///
     /// These constants describe the declaration records that can occur within
index 95bc60260c521ac1c63403e39a6e573f05983f55..14094febe50f43b2a0363a9ee1efc437f7826eaa 100644 (file)
@@ -4119,26 +4119,32 @@ TranslationUnitDecl *ASTReader::GetTranslationUnitDecl() {
 
 serialization::DeclID 
 ASTReader::getGlobalDeclID(Module &F, unsigned LocalID) const {
-  if (LocalID == 0)
+  if (LocalID < NUM_PREDEF_DECL_IDS)
     return LocalID;
 
   ContinuousRangeMap<uint32_t, int, 2>::iterator I
-    = F.DeclRemap.find(LocalID - 1);
+    = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS);
   assert(I != F.DeclRemap.end() && "Invalid index into decl index remap");
   
   return LocalID + I->second;
 }
 
 Decl *ASTReader::GetDecl(DeclID ID) {
-  if (ID == 0)
+  if (ID < NUM_PREDEF_DECL_IDS) {    
+    switch ((PredefinedDeclIDs)ID) {
+    case serialization::PREDEF_DECL_NULL_ID:
+      return 0;
+    }
+    
     return 0;
-
+  }
+  
   if (ID > DeclsLoaded.size()) {
     Error("declaration ID out-of-range for AST file");
     return 0;
   }
 
-  unsigned Index = ID - 1;
+  unsigned Index = ID - NUM_PREDEF_DECL_IDS;
   if (!DeclsLoaded[Index]) {
     ReadDeclRecord(ID);
     if (DeserializationListener)
index c3bbecdb0e7f8f9204101429d5e3ab1e8cd0cd77..fe152b119468b7da5c0c754dda2de19eff6988ce 100644 (file)
@@ -2039,7 +2039,7 @@ void ASTWriter::WriteTypeDeclOffsets() {
   Record.clear();
   Record.push_back(DECL_OFFSET);
   Record.push_back(DeclOffsets.size());
-  Record.push_back(FirstDeclID - 1);
+  Record.push_back(FirstDeclID - NUM_PREDEF_DECL_IDS);
   Stream.EmitRecordWithBlob(DeclOffsetAbbrev, Record, data(DeclOffsets));
 }
 
@@ -2740,7 +2740,7 @@ void ASTWriter::SetSelectorOffset(Selector Sel, uint32_t Offset) {
 
 ASTWriter::ASTWriter(llvm::BitstreamWriter &Stream)
   : Stream(Stream), Chain(0), SerializationListener(0), 
-    FirstDeclID(1), NextDeclID(FirstDeclID),
+    FirstDeclID(NUM_PREDEF_DECL_IDS), NextDeclID(FirstDeclID),
     FirstTypeID(NUM_PREDEF_TYPE_IDS), NextTypeID(FirstTypeID),
     FirstIdentID(1), NextIdentID(FirstIdentID), FirstSelectorID(1),
     NextSelectorID(FirstSelectorID), FirstMacroID(1), NextMacroID(FirstMacroID),