diff options
| author | Douglas Gregor <dgregor@apple.com> | 2009-10-16 20:01:17 +0000 |
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2009-10-16 20:01:17 +0000 |
| commit | 16bef857d91ad9328874b85f59edd04155aa9579 (patch) | |
| tree | 7265faed669c0345a6881236ae2c6aa94cb5d175 /clang/include | |
| parent | 7d3c275526783f19b424257e3bab9ff7d0bf6995 (diff) | |
| download | bcm5719-llvm-16bef857d91ad9328874b85f59edd04155aa9579.tar.gz bcm5719-llvm-16bef857d91ad9328874b85f59edd04155aa9579.zip | |
Keep track of whether declararions were loaded from a precompiled
header or not via a new "PCHLevel" field in Decl. We currently use
this information to help CIndex filter out declarations that came from
a precompiled header (rather than from an AST file). Further down the
road, it can be used to help implement multi-level precompiled
headers.
llvm-svn: 84267
Diffstat (limited to 'clang/include')
| -rw-r--r-- | clang/include/clang-c/Index.h | 11 | ||||
| -rw-r--r-- | clang/include/clang/AST/DeclBase.h | 36 | ||||
| -rw-r--r-- | clang/include/clang/Frontend/ASTUnit.h | 10 |
3 files changed, 51 insertions, 6 deletions
diff --git a/clang/include/clang-c/Index.h b/clang/include/clang-c/Index.h index 3e7ceb3d794..b80cd47e01f 100644 --- a/clang/include/clang-c/Index.h +++ b/clang/include/clang-c/Index.h @@ -117,6 +117,17 @@ CXTranslationUnit clang_createTranslationUnitFromSourceFile( ); void clang_disposeTranslationUnit(CXTranslationUnit); +/** + * \brief Indicate to Clang that it should only enumerate "local" declarations + * when loading any new translation units. + * + * A "local" declaration is one that belongs in the translation unit itself and + * not in a precompiled header that was used by the translation unit. + * + * FIXME: Remove this hook. + */ +void clang_wantOnlyLocalDeclarations(CXIndex); + /* Usage: clang_loadTranslationUnit(). Will load the toplevel declarations within a translation unit, issuing a 'callback' for each one. diff --git a/clang/include/clang/AST/DeclBase.h b/clang/include/clang/AST/DeclBase.h index 9e88871565f..10db7030db1 100644 --- a/clang/include/clang/AST/DeclBase.h +++ b/clang/include/clang/AST/DeclBase.h @@ -166,6 +166,15 @@ private: bool Used : 1; protected: + /// Access - Used by C++ decls for the access specifier. + // NOTE: VC++ treats enums as signed, avoid using the AccessSpecifier enum + unsigned Access : 2; + friend class CXXClassMemberWrapper; + + // PCHLevel - the "level" of precompiled header/AST file from which this + // declaration was built. + unsigned PCHLevel : 2; + /// IdentifierNamespace - This specifies what IDNS_* namespace this lives in. unsigned IdentifierNamespace : 16; @@ -177,16 +186,13 @@ private: #endif protected: - /// Access - Used by C++ decls for the access specifier. - // NOTE: VC++ treats enums as signed, avoid using the AccessSpecifier enum - unsigned Access : 2; - friend class CXXClassMemberWrapper; Decl(Kind DK, DeclContext *DC, SourceLocation L) : NextDeclInContext(0), DeclCtx(DC), Loc(L), DeclKind(DK), InvalidDecl(0), HasAttrs(false), Implicit(false), Used(false), - IdentifierNamespace(getIdentifierNamespaceForKind(DK)), Access(AS_none) { + Access(AS_none), PCHLevel(0), + IdentifierNamespace(getIdentifierNamespaceForKind(DK)) { if (Decl::CollectingStats()) addDeclKind(DK); } @@ -274,6 +280,26 @@ public: bool isUsed() const { return Used; } void setUsed(bool U = true) { Used = U; } + /// \brief Retrieve the level of precompiled header from which this + /// declaration was generated. + /// + /// The PCH level of a declaration describes where the declaration originated + /// from. A PCH level of 0 indicates that the declaration was not from a + /// precompiled header. A PCH level of 1 indicates that the declaration was + /// from a top-level precompiled header; 2 indicates that the declaration + /// comes from a precompiled header on which the top-level precompiled header + /// depends, and so on. + unsigned getPCHLevel() const { return PCHLevel; } + + /// \brief The maximum PCH level that any declaration may have. + static const unsigned MaxPCHLevel = 3; + + /// \brief Set the PCH level of this declaration. + void setPCHLevel(unsigned Level) { + assert(Level < MaxPCHLevel && "PCH level exceeds the maximum"); + PCHLevel = Level; + } + unsigned getIdentifierNamespace() const { return IdentifierNamespace; } diff --git a/clang/include/clang/Frontend/ASTUnit.h b/clang/include/clang/Frontend/ASTUnit.h index c1a0ebb559c..0ce473f2af5 100644 --- a/clang/include/clang/Frontend/ASTUnit.h +++ b/clang/include/clang/Frontend/ASTUnit.h @@ -40,6 +40,11 @@ class ASTUnit { llvm::OwningPtr<ASTContext> Ctx; bool tempFile; + // OnlyLocalDecls - when true, walking this AST should only visit declarations + // that come from the AST itself, not from included precompiled headers. + // FIXME: This is temporary; eventually, CIndex will always do this. + bool OnlyLocalDecls; + ASTUnit(const ASTUnit&); // DO NOT IMPLEMENT ASTUnit &operator=(const ASTUnit &); // DO NOT IMPLEMENT ASTUnit(Diagnostic &_Diag); @@ -65,6 +70,8 @@ public: void unlinkTemporaryFile() { tempFile = true; } + bool getOnlyLocalDecls() const { return OnlyLocalDecls; } + /// \brief Create a ASTUnit from a PCH file. /// /// \param Filename - The PCH file to load. @@ -80,7 +87,8 @@ public: static ASTUnit *LoadFromPCHFile(const std::string &Filename, Diagnostic &Diags, FileManager &FileMgr, - std::string *ErrMsg = 0); + std::string *ErrMsg = 0, + bool OnlyLocalDecls = false); }; } // namespace clang |

