clang 19.0.0git
ASTCommon.h
Go to the documentation of this file.
1//===- ASTCommon.h - Common stuff for ASTReader/ASTWriter -*- C++ -*-=========//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines common functions that both ASTReader and ASTWriter use.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_CLANG_LIB_SERIALIZATION_ASTCOMMON_H
14#define LLVM_CLANG_LIB_SERIALIZATION_ASTCOMMON_H
15
19
20namespace clang {
21
22namespace serialization {
23
45};
46
47TypeIdx TypeIdxFromBuiltin(const BuiltinType *BT);
48
49template <typename IdxForTypeTy>
50TypeID MakeTypeID(ASTContext &Context, QualType T, IdxForTypeTy IdxForType) {
51 if (T.isNull())
53
54 unsigned FastQuals = T.getLocalFastQualifiers();
55 T.removeLocalFastQualifiers();
56
57 if (T.hasLocalNonFastQualifiers())
58 return IdxForType(T).asTypeID(FastQuals);
59
60 assert(!T.hasLocalQualifiers());
61
62 if (const BuiltinType *BT = dyn_cast<BuiltinType>(T.getTypePtr()))
63 return TypeIdxFromBuiltin(BT).asTypeID(FastQuals);
64
65 if (T == Context.AutoDeductTy)
66 return TypeIdx(PREDEF_TYPE_AUTO_DEDUCT).asTypeID(FastQuals);
67 if (T == Context.AutoRRefDeductTy)
69
70 return IdxForType(T).asTypeID(FastQuals);
71}
72
73unsigned ComputeHash(Selector Sel);
74
75/// Retrieve the "definitive" declaration that provides all of the
76/// visible entries for the given declaration context, if there is one.
77///
78/// The "definitive" declaration is the only place where we need to look to
79/// find information about the declarations within the given declaration
80/// context. For example, C++ and Objective-C classes, C structs/unions, and
81/// Objective-C protocols, categories, and extensions are all defined in a
82/// single place in the source code, so they have definitive declarations
83/// associated with them. C++ namespaces, on the other hand, can have
84/// multiple definitions.
86
87/// Determine whether the given declaration kind is redeclarable.
88bool isRedeclarableDeclKind(unsigned Kind);
89
90/// Determine whether the given declaration needs an anonymous
91/// declaration number.
93
94/// Visit each declaration within \c DC that needs an anonymous
95/// declaration number and call \p Visit with the declaration and its number.
96template<typename Fn> void numberAnonymousDeclsWithin(const DeclContext *DC,
97 Fn Visit) {
98 unsigned Index = 0;
99 for (Decl *LexicalD : DC->decls()) {
100 // For a friend decl, we care about the declaration within it, if any.
101 if (auto *FD = dyn_cast<FriendDecl>(LexicalD))
102 LexicalD = FD->getFriendDecl();
103
104 auto *ND = dyn_cast_or_null<NamedDecl>(LexicalD);
105 if (!ND || !needsAnonymousDeclarationNumber(ND))
106 continue;
107
108 Visit(ND, Index++);
109 }
110}
111
112/// Determine whether the given declaration will be included in the per-module
113/// initializer if it needs to be eagerly handed to the AST consumer. If so, we
114/// should not hand it to the consumer when deserializing it, nor include it in
115/// the list of eagerly deserialized declarations.
116inline bool isPartOfPerModuleInitializer(const Decl *D) {
117 if (isa<ImportDecl>(D))
118 return true;
119 // Template instantiations are notionally in an "instantiation unit" rather
120 // than in any particular translation unit, so they need not be part of any
121 // particular (sub)module's per-module initializer.
122 if (auto *VD = dyn_cast<VarDecl>(D))
123 return !isTemplateInstantiation(VD->getTemplateSpecializationKind());
124 return false;
125}
126
127} // namespace serialization
128
129} // namespace clang
130
131#endif
Defines the clang::ASTContext interface.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition: ASTContext.h:182
This class is used for builtin types like 'int'.
Definition: Type.h:2977
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Definition: DeclBase.h:1436
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
Definition: DeclBase.h:2322
Decl - This represents one declaration (or definition), e.g.
Definition: DeclBase.h:86
This represents a decl that may have a name.
Definition: Decl.h:249
A (possibly-)qualified type.
Definition: Type.h:940
Smart pointer class that efficiently represents Objective-C method names.
A type index; the type ID with the qualifier bits removed.
Definition: ASTBitCodes.h:80
TypeID asTypeID(unsigned FastQuals) const
Definition: ASTBitCodes.h:89
@ PREDEF_TYPE_AUTO_RREF_DEDUCT
The "auto &&" deduction type.
Definition: ASTBitCodes.h:947
@ PREDEF_TYPE_NULL_ID
The NULL type.
Definition: ASTBitCodes.h:851
@ PREDEF_TYPE_AUTO_DEDUCT
The "auto" deduction type.
Definition: ASTBitCodes.h:944
uint32_t TypeID
An ID number that refers to a type in an AST file.
Definition: ASTBitCodes.h:77
bool isRedeclarableDeclKind(unsigned Kind)
Determine whether the given declaration kind is redeclarable.
Definition: ASTCommon.cpp:352
TypeIdx TypeIdxFromBuiltin(const BuiltinType *BT)
Definition: ASTCommon.cpp:26
bool needsAnonymousDeclarationNumber(const NamedDecl *D)
Determine whether the given declaration needs an anonymous declaration number.
Definition: ASTCommon.cpp:456
TypeID MakeTypeID(ASTContext &Context, QualType T, IdxForTypeTy IdxForType)
Definition: ASTCommon.h:50
void numberAnonymousDeclsWithin(const DeclContext *DC, Fn Visit)
Visit each declaration within DC that needs an anonymous declaration number and call Visit with the d...
Definition: ASTCommon.h:96
const DeclContext * getDefinitiveDeclContext(const DeclContext *DC)
Retrieve the "definitive" declaration that provides all of the visible entries for the given declarat...
Definition: ASTCommon.cpp:293
unsigned ComputeHash(Selector Sel)
Definition: ASTCommon.cpp:281
bool isPartOfPerModuleInitializer(const Decl *D)
Determine whether the given declaration will be included in the per-module initializer if it needs to...
Definition: ASTCommon.h:116
@ UPD_CXX_INSTANTIATED_DEFAULT_MEMBER_INITIALIZER
Definition: ASTCommon.h:33
@ UPD_CXX_ADDED_TEMPLATE_SPECIALIZATION
Definition: ASTCommon.h:26
@ UPD_DECL_MARKED_OPENMP_DECLARETARGET
Definition: ASTCommon.h:42
@ UPD_CXX_POINT_OF_INSTANTIATION
Definition: ASTCommon.h:30
@ UPD_CXX_RESOLVED_EXCEPTION_SPEC
Definition: ASTCommon.h:35
@ UPD_CXX_ADDED_FUNCTION_DEFINITION
Definition: ASTCommon.h:28
@ UPD_DECL_MARKED_OPENMP_THREADPRIVATE
Definition: ASTCommon.h:40
@ UPD_CXX_INSTANTIATED_DEFAULT_ARGUMENT
Definition: ASTCommon.h:32
@ UPD_DECL_MARKED_OPENMP_ALLOCATE
Definition: ASTCommon.h:41
@ UPD_CXX_ADDED_ANONYMOUS_NAMESPACE
Definition: ASTCommon.h:27
@ UPD_CXX_INSTANTIATED_CLASS_DEFINITION
Definition: ASTCommon.h:31
The JSON file list parser is used to communicate input to InstallAPI.
bool isTemplateInstantiation(TemplateSpecializationKind Kind)
Determine whether this template specialization kind refers to an instantiation of an entity (as oppos...
Definition: Specifiers.h:209
const FunctionProtoType * T