diff options
Diffstat (limited to 'include/clang/Serialization')
-rw-r--r-- | include/clang/Serialization/ASTBitCodes.h | 11 | ||||
-rw-r--r-- | include/clang/Serialization/ASTReader.h | 11 | ||||
-rw-r--r-- | include/clang/Serialization/ASTWriter.h | 16 | ||||
-rw-r--r-- | include/clang/Serialization/Module.h | 9 |
4 files changed, 46 insertions, 1 deletions
diff --git a/include/clang/Serialization/ASTBitCodes.h b/include/clang/Serialization/ASTBitCodes.h index 166a7b9a93..4c8eb28f79 100644 --- a/include/clang/Serialization/ASTBitCodes.h +++ b/include/clang/Serialization/ASTBitCodes.h @@ -64,6 +64,11 @@ namespace clang { /// \brief a Decl::Kind/DeclID pair. typedef std::pair<uint32_t, DeclID> KindDeclIDPair; + // FIXME: Turn these into classes so we can have some type safety when + // we go from local ID to global and vice-versa. + typedef DeclID LocalDeclID; + typedef DeclID GlobalDeclID; + /// \brief An ID number that refers to a type in an AST file. /// /// The ID of a type is partitioned into two parts: the lower @@ -402,7 +407,11 @@ namespace clang { /// \brief Record code for the source manager line table information, /// which stores information about #line directives. - SOURCE_MANAGER_LINE_TABLE = 48 + SOURCE_MANAGER_LINE_TABLE = 48, + + /// \brief Record code for ObjC categories in a module that are chained to + /// an interface. + OBJC_CHAINED_CATEGORIES }; /// \brief Record types used within a source manager block. diff --git a/include/clang/Serialization/ASTReader.h b/include/clang/Serialization/ASTReader.h index 7eb512a51a..0cec2f455b 100644 --- a/include/clang/Serialization/ASTReader.h +++ b/include/clang/Serialization/ASTReader.h @@ -36,6 +36,7 @@ #include "llvm/ADT/OwningPtr.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringRef.h" +#include "llvm/ADT/DenseSet.h" #include "llvm/Bitcode/BitstreamReader.h" #include "llvm/Support/DataTypes.h" #include <deque> @@ -315,6 +316,10 @@ private: /// most recent declarations in another AST file. FirstLatestDeclIDMap FirstLatestDeclIDs; + /// \brief Set of ObjC interfaces that have categories chained to them in + /// other modules. + llvm::DenseSet<serialization::GlobalDeclID> ObjCChainedCategoriesInterfaces; + /// \brief Read the records that describe the contents of declcontexts. bool ReadDeclContextStorage(Module &M, llvm::BitstreamCursor &Cursor, @@ -681,6 +686,8 @@ private: Decl *ReadDeclRecord(serialization::DeclID ID); RecordLocation DeclCursorForID(serialization::DeclID ID); void loadDeclUpdateRecords(serialization::DeclID ID, Decl *D); + void loadObjCChainedCategories(serialization::GlobalDeclID ID, + ObjCInterfaceDecl *D); RecordLocation getLocalBitOffset(uint64_t GlobalOffset); uint64_t getGlobalBitOffset(Module &M, uint32_t LocalOffset); @@ -899,6 +906,10 @@ public: /// \brief Map from a local declaration ID within a given module to a /// global declaration ID. serialization::DeclID getGlobalDeclID(Module &F, unsigned LocalID) const; + + /// \brief Returns true if global DeclID \arg ID originated from module + /// \arg M. + bool isDeclIDFromModule(serialization::GlobalDeclID ID, Module &M) const; /// \brief Resolve a declaration ID into a declaration, potentially /// building a new declaration. diff --git a/include/clang/Serialization/ASTWriter.h b/include/clang/Serialization/ASTWriter.h index a3a5b433b5..cb71415d34 100644 --- a/include/clang/Serialization/ASTWriter.h +++ b/include/clang/Serialization/ASTWriter.h @@ -258,6 +258,19 @@ private: /// \brief Decls that will be replaced in the current dependent AST file. DeclsToRewriteTy DeclsToRewrite; + struct ChainedObjCCategoriesData { + /// \brief The interface in the imported module. + const ObjCInterfaceDecl *Interface; + /// \brief ID of the interface. + serialization::DeclID InterfaceID; + /// \brief ID of the locally tail category ID that got chained to the + /// imported interface. + serialization::DeclID TailCatID; + }; + /// \brief ObjC categories that got chained to an interface imported from + /// another module. + SmallVector<ChainedObjCCategoriesData, 16> LocalChainedObjCCategories; + /// \brief Decls that have been replaced in the current dependent AST file. /// /// When a decl changes fundamentally after being deserialized (this shouldn't @@ -350,6 +363,7 @@ private: void WriteAttributes(const AttrVec &Attrs, RecordDataImpl &Record); void WriteDeclUpdatesBlocks(); void WriteDeclReplacementsBlock(); + void WriteChainedObjCCategories(); void WriteDeclContextVisibleUpdate(const DeclContext *DC); void WriteFPPragmaOptions(const FPOptions &Opts); void WriteOpenCLExtensions(Sema &SemaRef); @@ -620,6 +634,8 @@ public: const FunctionDecl *D); virtual void CompletedImplicitDefinition(const FunctionDecl *D); virtual void StaticDataMemberInstantiated(const VarDecl *D); + virtual void AddedObjCCategoryToInterface(const ObjCCategoryDecl *CatD, + const ObjCInterfaceDecl *IFD); }; /// \brief AST and semantic-analysis consumer that generates a diff --git a/include/clang/Serialization/Module.h b/include/clang/Serialization/Module.h index b3c3bc3271..c35a4f0096 100644 --- a/include/clang/Serialization/Module.h +++ b/include/clang/Serialization/Module.h @@ -273,6 +273,15 @@ public: /// \brief Information about the lexical and visible declarations /// for each DeclContext. DeclContextInfosMap DeclContextInfos; + + typedef llvm::DenseMap<serialization::GlobalDeclID, + std::pair<serialization::LocalDeclID, serialization::LocalDeclID> > + ChainedObjCCategoriesMap; + /// \brief ObjC categories that got chained to an interface from another + /// module. + /// Key is the ID of the interface. + /// Value is a pair of linked category DeclIDs (head category, tail category). + ChainedObjCCategoriesMap ChainedObjCCategories; // === Types === |