14bd97102SArgyrios Kyrtzidis //===--- ASTCommon.cpp - Common stuff for ASTReader/ASTWriter----*- C++ -*-===//
24bd97102SArgyrios Kyrtzidis //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
64bd97102SArgyrios Kyrtzidis //
74bd97102SArgyrios Kyrtzidis //===----------------------------------------------------------------------===//
84bd97102SArgyrios Kyrtzidis //
94bd97102SArgyrios Kyrtzidis //  This file defines common functions that both ASTReader and ASTWriter use.
104bd97102SArgyrios Kyrtzidis //
114bd97102SArgyrios Kyrtzidis //===----------------------------------------------------------------------===//
124bd97102SArgyrios Kyrtzidis 
134bd97102SArgyrios Kyrtzidis #include "ASTCommon.h"
14d08aeb6bSRichard Smith #include "clang/AST/DeclCXX.h"
159f782890SDouglas Gregor #include "clang/AST/DeclObjC.h"
164bd97102SArgyrios Kyrtzidis #include "clang/Basic/IdentifierTable.h"
173a02247dSChandler Carruth #include "clang/Serialization/ASTDeserializationListener.h"
18560ce2c7SJonas Devlieghere #include "llvm/Support/DJB.h"
194bd97102SArgyrios Kyrtzidis 
204bd97102SArgyrios Kyrtzidis using namespace clang;
214bd97102SArgyrios Kyrtzidis 
2255d1fc2dSArgyrios Kyrtzidis // Give ASTDeserializationListener's VTable a home.
~ASTDeserializationListener()23637d1e66SAngel Garcia Gomez ASTDeserializationListener::~ASTDeserializationListener() { }
2455d1fc2dSArgyrios Kyrtzidis 
25082e4613SArgyrios Kyrtzidis serialization::TypeIdx
TypeIdxFromBuiltin(const BuiltinType * BT)26082e4613SArgyrios Kyrtzidis serialization::TypeIdxFromBuiltin(const BuiltinType *BT) {
27082e4613SArgyrios Kyrtzidis   unsigned ID = 0;
28082e4613SArgyrios Kyrtzidis   switch (BT->getKind()) {
29bdf7c846SAlexey Bader   case BuiltinType::Void:
30bdf7c846SAlexey Bader     ID = PREDEF_TYPE_VOID_ID;
31bdf7c846SAlexey Bader     break;
32bdf7c846SAlexey Bader   case BuiltinType::Bool:
33bdf7c846SAlexey Bader     ID = PREDEF_TYPE_BOOL_ID;
34bdf7c846SAlexey Bader     break;
35bdf7c846SAlexey Bader   case BuiltinType::Char_U:
36bdf7c846SAlexey Bader     ID = PREDEF_TYPE_CHAR_U_ID;
37bdf7c846SAlexey Bader     break;
38bdf7c846SAlexey Bader   case BuiltinType::UChar:
39bdf7c846SAlexey Bader     ID = PREDEF_TYPE_UCHAR_ID;
40bdf7c846SAlexey Bader     break;
41bdf7c846SAlexey Bader   case BuiltinType::UShort:
42bdf7c846SAlexey Bader     ID = PREDEF_TYPE_USHORT_ID;
43bdf7c846SAlexey Bader     break;
44bdf7c846SAlexey Bader   case BuiltinType::UInt:
45bdf7c846SAlexey Bader     ID = PREDEF_TYPE_UINT_ID;
46bdf7c846SAlexey Bader     break;
47bdf7c846SAlexey Bader   case BuiltinType::ULong:
48bdf7c846SAlexey Bader     ID = PREDEF_TYPE_ULONG_ID;
49bdf7c846SAlexey Bader     break;
50bdf7c846SAlexey Bader   case BuiltinType::ULongLong:
51bdf7c846SAlexey Bader     ID = PREDEF_TYPE_ULONGLONG_ID;
52bdf7c846SAlexey Bader     break;
53bdf7c846SAlexey Bader   case BuiltinType::UInt128:
54bdf7c846SAlexey Bader     ID = PREDEF_TYPE_UINT128_ID;
55bdf7c846SAlexey Bader     break;
56bdf7c846SAlexey Bader   case BuiltinType::Char_S:
57bdf7c846SAlexey Bader     ID = PREDEF_TYPE_CHAR_S_ID;
58bdf7c846SAlexey Bader     break;
59bdf7c846SAlexey Bader   case BuiltinType::SChar:
60bdf7c846SAlexey Bader     ID = PREDEF_TYPE_SCHAR_ID;
61bdf7c846SAlexey Bader     break;
62ad3467eeSChris Lattner   case BuiltinType::WChar_S:
63bdf7c846SAlexey Bader   case BuiltinType::WChar_U:
64bdf7c846SAlexey Bader     ID = PREDEF_TYPE_WCHAR_ID;
65bdf7c846SAlexey Bader     break;
66bdf7c846SAlexey Bader   case BuiltinType::Short:
67bdf7c846SAlexey Bader     ID = PREDEF_TYPE_SHORT_ID;
68bdf7c846SAlexey Bader     break;
69bdf7c846SAlexey Bader   case BuiltinType::Int:
70bdf7c846SAlexey Bader     ID = PREDEF_TYPE_INT_ID;
71bdf7c846SAlexey Bader     break;
72bdf7c846SAlexey Bader   case BuiltinType::Long:
73bdf7c846SAlexey Bader     ID = PREDEF_TYPE_LONG_ID;
74bdf7c846SAlexey Bader     break;
75bdf7c846SAlexey Bader   case BuiltinType::LongLong:
76bdf7c846SAlexey Bader     ID = PREDEF_TYPE_LONGLONG_ID;
77bdf7c846SAlexey Bader     break;
78bdf7c846SAlexey Bader   case BuiltinType::Int128:
79bdf7c846SAlexey Bader     ID = PREDEF_TYPE_INT128_ID;
80bdf7c846SAlexey Bader     break;
81bdf7c846SAlexey Bader   case BuiltinType::Half:
82bdf7c846SAlexey Bader     ID = PREDEF_TYPE_HALF_ID;
83bdf7c846SAlexey Bader     break;
84bdf7c846SAlexey Bader   case BuiltinType::Float:
85bdf7c846SAlexey Bader     ID = PREDEF_TYPE_FLOAT_ID;
86bdf7c846SAlexey Bader     break;
87bdf7c846SAlexey Bader   case BuiltinType::Double:
88bdf7c846SAlexey Bader     ID = PREDEF_TYPE_DOUBLE_ID;
89bdf7c846SAlexey Bader     break;
90bdf7c846SAlexey Bader   case BuiltinType::LongDouble:
91bdf7c846SAlexey Bader     ID = PREDEF_TYPE_LONGDOUBLE_ID;
92bdf7c846SAlexey Bader     break;
93f921d854SLeonard Chan   case BuiltinType::ShortAccum:
94f921d854SLeonard Chan     ID = PREDEF_TYPE_SHORT_ACCUM_ID;
95f921d854SLeonard Chan     break;
96f921d854SLeonard Chan   case BuiltinType::Accum:
97f921d854SLeonard Chan     ID = PREDEF_TYPE_ACCUM_ID;
98f921d854SLeonard Chan     break;
99f921d854SLeonard Chan   case BuiltinType::LongAccum:
100f921d854SLeonard Chan     ID = PREDEF_TYPE_LONG_ACCUM_ID;
101f921d854SLeonard Chan     break;
102f921d854SLeonard Chan   case BuiltinType::UShortAccum:
103f921d854SLeonard Chan     ID = PREDEF_TYPE_USHORT_ACCUM_ID;
104f921d854SLeonard Chan     break;
105f921d854SLeonard Chan   case BuiltinType::UAccum:
106f921d854SLeonard Chan     ID = PREDEF_TYPE_UACCUM_ID;
107f921d854SLeonard Chan     break;
108f921d854SLeonard Chan   case BuiltinType::ULongAccum:
109f921d854SLeonard Chan     ID = PREDEF_TYPE_ULONG_ACCUM_ID;
110f921d854SLeonard Chan     break;
111ab80f3c8SLeonard Chan   case BuiltinType::ShortFract:
112ab80f3c8SLeonard Chan     ID = PREDEF_TYPE_SHORT_FRACT_ID;
113ab80f3c8SLeonard Chan     break;
114ab80f3c8SLeonard Chan   case BuiltinType::Fract:
115ab80f3c8SLeonard Chan     ID = PREDEF_TYPE_FRACT_ID;
116ab80f3c8SLeonard Chan     break;
117ab80f3c8SLeonard Chan   case BuiltinType::LongFract:
118ab80f3c8SLeonard Chan     ID = PREDEF_TYPE_LONG_FRACT_ID;
119ab80f3c8SLeonard Chan     break;
120ab80f3c8SLeonard Chan   case BuiltinType::UShortFract:
121ab80f3c8SLeonard Chan     ID = PREDEF_TYPE_USHORT_FRACT_ID;
122ab80f3c8SLeonard Chan     break;
123ab80f3c8SLeonard Chan   case BuiltinType::UFract:
124ab80f3c8SLeonard Chan     ID = PREDEF_TYPE_UFRACT_ID;
125ab80f3c8SLeonard Chan     break;
126ab80f3c8SLeonard Chan   case BuiltinType::ULongFract:
127ab80f3c8SLeonard Chan     ID = PREDEF_TYPE_ULONG_FRACT_ID;
128ab80f3c8SLeonard Chan     break;
129ab80f3c8SLeonard Chan   case BuiltinType::SatShortAccum:
130ab80f3c8SLeonard Chan     ID = PREDEF_TYPE_SAT_SHORT_ACCUM_ID;
131ab80f3c8SLeonard Chan     break;
132ab80f3c8SLeonard Chan   case BuiltinType::SatAccum:
133ab80f3c8SLeonard Chan     ID = PREDEF_TYPE_SAT_ACCUM_ID;
134ab80f3c8SLeonard Chan     break;
135ab80f3c8SLeonard Chan   case BuiltinType::SatLongAccum:
136ab80f3c8SLeonard Chan     ID = PREDEF_TYPE_SAT_LONG_ACCUM_ID;
137ab80f3c8SLeonard Chan     break;
138ab80f3c8SLeonard Chan   case BuiltinType::SatUShortAccum:
139ab80f3c8SLeonard Chan     ID = PREDEF_TYPE_SAT_USHORT_ACCUM_ID;
140ab80f3c8SLeonard Chan     break;
141ab80f3c8SLeonard Chan   case BuiltinType::SatUAccum:
142ab80f3c8SLeonard Chan     ID = PREDEF_TYPE_SAT_UACCUM_ID;
143ab80f3c8SLeonard Chan     break;
144ab80f3c8SLeonard Chan   case BuiltinType::SatULongAccum:
145ab80f3c8SLeonard Chan     ID = PREDEF_TYPE_SAT_ULONG_ACCUM_ID;
146ab80f3c8SLeonard Chan     break;
147ab80f3c8SLeonard Chan   case BuiltinType::SatShortFract:
148ab80f3c8SLeonard Chan     ID = PREDEF_TYPE_SAT_SHORT_FRACT_ID;
149ab80f3c8SLeonard Chan     break;
150ab80f3c8SLeonard Chan   case BuiltinType::SatFract:
151ab80f3c8SLeonard Chan     ID = PREDEF_TYPE_SAT_FRACT_ID;
152ab80f3c8SLeonard Chan     break;
153ab80f3c8SLeonard Chan   case BuiltinType::SatLongFract:
154ab80f3c8SLeonard Chan     ID = PREDEF_TYPE_SAT_LONG_FRACT_ID;
155ab80f3c8SLeonard Chan     break;
156ab80f3c8SLeonard Chan   case BuiltinType::SatUShortFract:
157ab80f3c8SLeonard Chan     ID = PREDEF_TYPE_SAT_USHORT_FRACT_ID;
158ab80f3c8SLeonard Chan     break;
159ab80f3c8SLeonard Chan   case BuiltinType::SatUFract:
160ab80f3c8SLeonard Chan     ID = PREDEF_TYPE_SAT_UFRACT_ID;
161ab80f3c8SLeonard Chan     break;
162ab80f3c8SLeonard Chan   case BuiltinType::SatULongFract:
163ab80f3c8SLeonard Chan     ID = PREDEF_TYPE_SAT_ULONG_FRACT_ID;
164ab80f3c8SLeonard Chan     break;
165cc623ad0SSjoerd Meijer   case BuiltinType::Float16:
166cc623ad0SSjoerd Meijer     ID = PREDEF_TYPE_FLOAT16_ID;
167cc623ad0SSjoerd Meijer     break;
168bb1ea2d6SNemanja Ivanovic   case BuiltinType::Float128:
169bb1ea2d6SNemanja Ivanovic     ID = PREDEF_TYPE_FLOAT128_ID;
170bb1ea2d6SNemanja Ivanovic     break;
171fae0dfa6SQiu Chaofan   case BuiltinType::Ibm128:
172fae0dfa6SQiu Chaofan     ID = PREDEF_TYPE_IBM128_ID;
173fae0dfa6SQiu Chaofan     break;
174bdf7c846SAlexey Bader   case BuiltinType::NullPtr:
175bdf7c846SAlexey Bader     ID = PREDEF_TYPE_NULLPTR_ID;
176bdf7c846SAlexey Bader     break;
1773a8244dfSRichard Smith   case BuiltinType::Char8:
1783a8244dfSRichard Smith     ID = PREDEF_TYPE_CHAR8_ID;
1793a8244dfSRichard Smith     break;
180bdf7c846SAlexey Bader   case BuiltinType::Char16:
181bdf7c846SAlexey Bader     ID = PREDEF_TYPE_CHAR16_ID;
182bdf7c846SAlexey Bader     break;
183bdf7c846SAlexey Bader   case BuiltinType::Char32:
184bdf7c846SAlexey Bader     ID = PREDEF_TYPE_CHAR32_ID;
185bdf7c846SAlexey Bader     break;
186bdf7c846SAlexey Bader   case BuiltinType::Overload:
187bdf7c846SAlexey Bader     ID = PREDEF_TYPE_OVERLOAD_ID;
188bdf7c846SAlexey Bader     break;
189bdf7c846SAlexey Bader   case BuiltinType::BoundMember:
190bdf7c846SAlexey Bader     ID = PREDEF_TYPE_BOUND_MEMBER;
191bdf7c846SAlexey Bader     break;
192bdf7c846SAlexey Bader   case BuiltinType::PseudoObject:
193bdf7c846SAlexey Bader     ID = PREDEF_TYPE_PSEUDO_OBJECT;
194bdf7c846SAlexey Bader     break;
195bdf7c846SAlexey Bader   case BuiltinType::Dependent:
196bdf7c846SAlexey Bader     ID = PREDEF_TYPE_DEPENDENT_ID;
197bdf7c846SAlexey Bader     break;
198bdf7c846SAlexey Bader   case BuiltinType::UnknownAny:
199bdf7c846SAlexey Bader     ID = PREDEF_TYPE_UNKNOWN_ANY;
200bdf7c846SAlexey Bader     break;
2018a6b59adSJohn McCall   case BuiltinType::ARCUnbridgedCast:
202bdf7c846SAlexey Bader     ID = PREDEF_TYPE_ARC_UNBRIDGED_CAST;
203bdf7c846SAlexey Bader     break;
204bdf7c846SAlexey Bader   case BuiltinType::ObjCId:
205bdf7c846SAlexey Bader     ID = PREDEF_TYPE_OBJC_ID;
206bdf7c846SAlexey Bader     break;
207bdf7c846SAlexey Bader   case BuiltinType::ObjCClass:
208bdf7c846SAlexey Bader     ID = PREDEF_TYPE_OBJC_CLASS;
209bdf7c846SAlexey Bader     break;
210bdf7c846SAlexey Bader   case BuiltinType::ObjCSel:
211bdf7c846SAlexey Bader     ID = PREDEF_TYPE_OBJC_SEL;
212bdf7c846SAlexey Bader     break;
213954ba21fSAlexey Bader #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
214954ba21fSAlexey Bader   case BuiltinType::Id: \
215954ba21fSAlexey Bader     ID = PREDEF_TYPE_##Id##_ID; \
216bdf7c846SAlexey Bader     break;
217b62f1440SAlexey Bader #include "clang/Basic/OpenCLImageTypes.def"
2183fee3518SAndrew Savonichev #define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
2193fee3518SAndrew Savonichev   case BuiltinType::Id: \
2203fee3518SAndrew Savonichev     ID = PREDEF_TYPE_##Id##_ID; \
2213fee3518SAndrew Savonichev     break;
2223fee3518SAndrew Savonichev #include "clang/Basic/OpenCLExtensionTypes.def"
223bdf7c846SAlexey Bader   case BuiltinType::OCLSampler:
224bdf7c846SAlexey Bader     ID = PREDEF_TYPE_SAMPLER_ID;
225bdf7c846SAlexey Bader     break;
226bdf7c846SAlexey Bader   case BuiltinType::OCLEvent:
227bdf7c846SAlexey Bader     ID = PREDEF_TYPE_EVENT_ID;
228bdf7c846SAlexey Bader     break;
2299c8453fbSAlexey Bader   case BuiltinType::OCLClkEvent:
2309c8453fbSAlexey Bader     ID = PREDEF_TYPE_CLK_EVENT_ID;
2319c8453fbSAlexey Bader     break;
2329c8453fbSAlexey Bader   case BuiltinType::OCLQueue:
2339c8453fbSAlexey Bader     ID = PREDEF_TYPE_QUEUE_ID;
2349c8453fbSAlexey Bader     break;
2359c8453fbSAlexey Bader   case BuiltinType::OCLReserveID:
2369c8453fbSAlexey Bader     ID = PREDEF_TYPE_RESERVE_ID_ID;
2379c8453fbSAlexey Bader     break;
238eb485fbcSRichard Sandiford #define SVE_TYPE(Name, Id, SingletonId) \
239eb485fbcSRichard Sandiford   case BuiltinType::Id: \
240eb485fbcSRichard Sandiford     ID = PREDEF_TYPE_##Id##_ID; \
241eb485fbcSRichard Sandiford     break;
242eb485fbcSRichard Sandiford #include "clang/Basic/AArch64SVEACLETypes.def"
24357d83c3aSBaptiste Saleil #define PPC_VECTOR_TYPE(Name, Id, Size) \
24440dd4d52SBaptiste Saleil   case BuiltinType::Id: \
24540dd4d52SBaptiste Saleil     ID = PREDEF_TYPE_##Id##_ID; \
24640dd4d52SBaptiste Saleil     break;
24740dd4d52SBaptiste Saleil #include "clang/Basic/PPCTypes.def"
248766ee109SHsiangkai Wang #define RVV_TYPE(Name, Id, SingletonId)                                        \
249766ee109SHsiangkai Wang   case BuiltinType::Id:                                                        \
250766ee109SHsiangkai Wang     ID = PREDEF_TYPE_##Id##_ID;                                                \
251766ee109SHsiangkai Wang     break;
252766ee109SHsiangkai Wang #include "clang/Basic/RISCVVTypes.def"
25334866c77SEli Friedman   case BuiltinType::BuiltinFn:
254bdf7c846SAlexey Bader     ID = PREDEF_TYPE_BUILTIN_FN;
255bdf7c846SAlexey Bader     break;
2568f3f88d2SFlorian Hahn   case BuiltinType::IncompleteMatrixIdx:
2578f3f88d2SFlorian Hahn     ID = PREDEF_TYPE_INCOMPLETE_MATRIX_IDX;
2588f3f88d2SFlorian Hahn     break;
259bdf7c846SAlexey Bader   case BuiltinType::OMPArraySection:
260bdf7c846SAlexey Bader     ID = PREDEF_TYPE_OMP_ARRAY_SECTION;
261bdf7c846SAlexey Bader     break;
2627ac9efb0SAlexey Bataev   case BuiltinType::OMPArrayShaping:
2637ac9efb0SAlexey Bataev     ID = PREDEF_TYPE_OMP_ARRAY_SHAPING;
2647ac9efb0SAlexey Bataev     break;
26513a1504fSAlexey Bataev   case BuiltinType::OMPIterator:
26613a1504fSAlexey Bataev     ID = PREDEF_TYPE_OMP_ITERATOR;
26713a1504fSAlexey Bataev     break;
268ecd682bbSTies Stuij   case BuiltinType::BFloat16:
269ecd682bbSTies Stuij     ID = PREDEF_TYPE_BFLOAT16_ID;
270ecd682bbSTies Stuij     break;
271082e4613SArgyrios Kyrtzidis   }
272082e4613SArgyrios Kyrtzidis 
273082e4613SArgyrios Kyrtzidis   return TypeIdx(ID);
274082e4613SArgyrios Kyrtzidis }
275082e4613SArgyrios Kyrtzidis 
ComputeHash(Selector Sel)2764bd97102SArgyrios Kyrtzidis unsigned serialization::ComputeHash(Selector Sel) {
2774bd97102SArgyrios Kyrtzidis   unsigned N = Sel.getNumArgs();
2784bd97102SArgyrios Kyrtzidis   if (N == 0)
2794bd97102SArgyrios Kyrtzidis     ++N;
2804bd97102SArgyrios Kyrtzidis   unsigned R = 5381;
2814bd97102SArgyrios Kyrtzidis   for (unsigned I = 0; I != N; ++I)
2824bd97102SArgyrios Kyrtzidis     if (IdentifierInfo *II = Sel.getIdentifierInfoForSlot(I))
283560ce2c7SJonas Devlieghere       R = llvm::djbHash(II->getName(), R);
2844bd97102SArgyrios Kyrtzidis   return R;
2854bd97102SArgyrios Kyrtzidis }
2869f782890SDouglas Gregor 
2877a6e2007SDouglas Gregor const DeclContext *
getDefinitiveDeclContext(const DeclContext * DC)2887a6e2007SDouglas Gregor serialization::getDefinitiveDeclContext(const DeclContext *DC) {
2899f782890SDouglas Gregor   switch (DC->getDeclKind()) {
2909f782890SDouglas Gregor   // These entities may have multiple definitions.
2919f782890SDouglas Gregor   case Decl::TranslationUnit:
292f19e1279SRichard Smith   case Decl::ExternCContext:
2939f782890SDouglas Gregor   case Decl::Namespace:
2949f782890SDouglas Gregor   case Decl::LinkageSpec:
2958df390f9SRichard Smith   case Decl::Export:
296a13603a2SCraig Topper     return nullptr;
2979f782890SDouglas Gregor 
2989f782890SDouglas Gregor   // C/C++ tag types can only be defined in one place.
2999f782890SDouglas Gregor   case Decl::Enum:
3009f782890SDouglas Gregor   case Decl::Record:
3019f782890SDouglas Gregor     if (const TagDecl *Def = cast<TagDecl>(DC)->getDefinition())
3029f782890SDouglas Gregor       return Def;
303a13603a2SCraig Topper     return nullptr;
3049f782890SDouglas Gregor 
3059f782890SDouglas Gregor   // FIXME: These can be defined in one place... except special member
3069f782890SDouglas Gregor   // functions and out-of-line definitions.
3079f782890SDouglas Gregor   case Decl::CXXRecord:
3089f782890SDouglas Gregor   case Decl::ClassTemplateSpecialization:
3099f782890SDouglas Gregor   case Decl::ClassTemplatePartialSpecialization:
310a13603a2SCraig Topper     return nullptr;
3119f782890SDouglas Gregor 
3129f782890SDouglas Gregor   // Each function, method, and block declaration is its own DeclContext.
3139f782890SDouglas Gregor   case Decl::Function:
3149f782890SDouglas Gregor   case Decl::CXXMethod:
3159f782890SDouglas Gregor   case Decl::CXXConstructor:
3169f782890SDouglas Gregor   case Decl::CXXDestructor:
3179f782890SDouglas Gregor   case Decl::CXXConversion:
3189f782890SDouglas Gregor   case Decl::ObjCMethod:
3199f782890SDouglas Gregor   case Decl::Block:
3206dfa25a1STareq A. Siraj   case Decl::Captured:
3219f782890SDouglas Gregor     // Objective C categories, category implementations, and class
3229f782890SDouglas Gregor     // implementations can only be defined in one place.
3239f782890SDouglas Gregor   case Decl::ObjCCategory:
3249f782890SDouglas Gregor   case Decl::ObjCCategoryImpl:
3259f782890SDouglas Gregor   case Decl::ObjCImplementation:
3267a6e2007SDouglas Gregor     return DC;
3279f782890SDouglas Gregor 
3289f782890SDouglas Gregor   case Decl::ObjCProtocol:
3299f782890SDouglas Gregor     if (const ObjCProtocolDecl *Def
3309f782890SDouglas Gregor           = cast<ObjCProtocolDecl>(DC)->getDefinition())
3319f782890SDouglas Gregor       return Def;
332a13603a2SCraig Topper     return nullptr;
3339f782890SDouglas Gregor 
3349f782890SDouglas Gregor   // FIXME: These are defined in one place, but properties in class extensions
3359f782890SDouglas Gregor   // end up being back-patched into the main interface. See
3369f782890SDouglas Gregor   // Sema::HandlePropertyInClassExtension for the offending code.
3379f782890SDouglas Gregor   case Decl::ObjCInterface:
338a13603a2SCraig Topper     return nullptr;
3399f782890SDouglas Gregor 
3409f782890SDouglas Gregor   default:
3419f782890SDouglas Gregor     llvm_unreachable("Unhandled DeclContext in AST reader");
3429f782890SDouglas Gregor   }
3439f782890SDouglas Gregor 
3447a6e2007SDouglas Gregor   llvm_unreachable("Unhandled decl kind");
345fe732d53SDouglas Gregor }
3469f782890SDouglas Gregor 
isRedeclarableDeclKind(unsigned Kind)347fe732d53SDouglas Gregor bool serialization::isRedeclarableDeclKind(unsigned Kind) {
348fe732d53SDouglas Gregor   switch (static_cast<Decl::Kind>(Kind)) {
349f19e1279SRichard Smith   case Decl::TranslationUnit:
350f19e1279SRichard Smith   case Decl::ExternCContext:
351f19e1279SRichard Smith     // Special case of a "merged" declaration.
352f19e1279SRichard Smith     return true;
353f19e1279SRichard Smith 
354fe732d53SDouglas Gregor   case Decl::Namespace:
355f463436dSRichard Smith   case Decl::NamespaceAlias:
356fe732d53SDouglas Gregor   case Decl::Typedef:
357fe732d53SDouglas Gregor   case Decl::TypeAlias:
358fe732d53SDouglas Gregor   case Decl::Enum:
359fe732d53SDouglas Gregor   case Decl::Record:
360fe732d53SDouglas Gregor   case Decl::CXXRecord:
361fe732d53SDouglas Gregor   case Decl::ClassTemplateSpecialization:
362fe732d53SDouglas Gregor   case Decl::ClassTemplatePartialSpecialization:
36339a1e507SLarisse Voufo   case Decl::VarTemplateSpecialization:
36439a1e507SLarisse Voufo   case Decl::VarTemplatePartialSpecialization:
365fe732d53SDouglas Gregor   case Decl::Function:
366bc491203SRichard Smith   case Decl::CXXDeductionGuide:
367fe732d53SDouglas Gregor   case Decl::CXXMethod:
368fe732d53SDouglas Gregor   case Decl::CXXConstructor:
369fe732d53SDouglas Gregor   case Decl::CXXDestructor:
370fe732d53SDouglas Gregor   case Decl::CXXConversion:
371fd8634a0SRichard Smith   case Decl::UsingShadow:
3725179eb78SRichard Smith   case Decl::ConstructorUsingShadow:
373fe732d53SDouglas Gregor   case Decl::Var:
374fe732d53SDouglas Gregor   case Decl::FunctionTemplate:
375fe732d53SDouglas Gregor   case Decl::ClassTemplate:
37639a1e507SLarisse Voufo   case Decl::VarTemplate:
377fe732d53SDouglas Gregor   case Decl::TypeAliasTemplate:
378fe732d53SDouglas Gregor   case Decl::ObjCProtocol:
379fe732d53SDouglas Gregor   case Decl::ObjCInterface:
38084324357SMichael Han   case Decl::Empty:
381fe732d53SDouglas Gregor     return true;
382fe732d53SDouglas Gregor 
383fe732d53SDouglas Gregor   // Never redeclarable.
384fe732d53SDouglas Gregor   case Decl::UsingDirective:
385fe732d53SDouglas Gregor   case Decl::Label:
386fe732d53SDouglas Gregor   case Decl::UnresolvedUsingTypename:
387fe732d53SDouglas Gregor   case Decl::TemplateTypeParm:
388fe732d53SDouglas Gregor   case Decl::EnumConstant:
389fe732d53SDouglas Gregor   case Decl::UnresolvedUsingValue:
390fe732d53SDouglas Gregor   case Decl::IndirectField:
391fe732d53SDouglas Gregor   case Decl::Field:
3925e77d76cSJohn McCall   case Decl::MSProperty:
393bab6df86SRichard Smith   case Decl::MSGuid:
394d6148749SJames Y Knight   case Decl::UnnamedGlobalConstant:
395ba4768c9SRichard Smith   case Decl::TemplateParamObject:
396fe732d53SDouglas Gregor   case Decl::ObjCIvar:
397fe732d53SDouglas Gregor   case Decl::ObjCAtDefsField:
398fe732d53SDouglas Gregor   case Decl::NonTypeTemplateParm:
399fe732d53SDouglas Gregor   case Decl::TemplateTemplateParm:
400fe732d53SDouglas Gregor   case Decl::Using:
401b2d0c16eSNathan Sidwell   case Decl::UsingEnum:
402151c4568SRichard Smith   case Decl::UsingPack:
403fe732d53SDouglas Gregor   case Decl::ObjCMethod:
404fe732d53SDouglas Gregor   case Decl::ObjCCategory:
405fe732d53SDouglas Gregor   case Decl::ObjCCategoryImpl:
406fe732d53SDouglas Gregor   case Decl::ObjCImplementation:
407fe732d53SDouglas Gregor   case Decl::ObjCProperty:
408fe732d53SDouglas Gregor   case Decl::ObjCCompatibleAlias:
409fe732d53SDouglas Gregor   case Decl::LinkageSpec:
4108df390f9SRichard Smith   case Decl::Export:
411fe732d53SDouglas Gregor   case Decl::ObjCPropertyImpl:
4126622029dSNico Weber   case Decl::PragmaComment:
413cbbaeb13SNico Weber   case Decl::PragmaDetectMismatch:
414fe732d53SDouglas Gregor   case Decl::FileScopeAsm:
415fe732d53SDouglas Gregor   case Decl::AccessSpec:
416fe732d53SDouglas Gregor   case Decl::Friend:
417fe732d53SDouglas Gregor   case Decl::FriendTemplate:
418fe732d53SDouglas Gregor   case Decl::StaticAssert:
419fe732d53SDouglas Gregor   case Decl::Block:
4206dfa25a1STareq A. Siraj   case Decl::Captured:
421fe732d53SDouglas Gregor   case Decl::ClassScopeFunctionSpecialization:
422fe732d53SDouglas Gregor   case Decl::Import:
423a769e072SAlexey Bataev   case Decl::OMPThreadPrivate:
42425ed0c07SAlexey Bataev   case Decl::OMPAllocate:
4251408f91aSKelvin Li   case Decl::OMPRequires:
4264244be25SAlexey Bataev   case Decl::OMPCapturedExpr:
42794a4f0cbSAlexey Bataev   case Decl::OMPDeclareReduction:
428251e1488SMichael Kruse   case Decl::OMPDeclareMapper:
429d9b1a4fbSDavid Majnemer   case Decl::BuiltinTemplate:
430bdb84f37SRichard Smith   case Decl::Decomposition:
431bdb84f37SRichard Smith   case Decl::Binding:
432d7aae33aSSaar Raz   case Decl::Concept:
433b0561b33STyker   case Decl::LifetimeExtendedTemporary:
434a0f50d73SSaar Raz   case Decl::RequiresExprBody:
435369c6483SErik Pilkington   case Decl::UnresolvedUsingIfExists:
436fe732d53SDouglas Gregor     return false;
437f463436dSRichard Smith 
438f463436dSRichard Smith   // These indirectly derive from Redeclarable<T> but are not actually
439f463436dSRichard Smith   // redeclarable.
440f463436dSRichard Smith   case Decl::ImplicitParam:
441f463436dSRichard Smith   case Decl::ParmVar:
44285f3f951SDouglas Gregor   case Decl::ObjCTypeParam:
443f463436dSRichard Smith     return false;
444fe732d53SDouglas Gregor   }
445fe732d53SDouglas Gregor 
446fe732d53SDouglas Gregor   llvm_unreachable("Unhandled declaration kind");
4479f782890SDouglas Gregor }
448d08aeb6bSRichard Smith 
needsAnonymousDeclarationNumber(const NamedDecl * D)449d08aeb6bSRichard Smith bool serialization::needsAnonymousDeclarationNumber(const NamedDecl *D) {
4502b560575SRichard Smith   // Friend declarations in dependent contexts aren't anonymous in the usual
4512b560575SRichard Smith   // sense, but they cannot be found by name lookup in their semantic context
4522b560575SRichard Smith   // (or indeed in any context), so we treat them as anonymous.
4532b560575SRichard Smith   //
4542b560575SRichard Smith   // This doesn't apply to friend tag decls; Sema makes those available to name
4552b560575SRichard Smith   // lookup in the surrounding context.
4562b560575SRichard Smith   if (D->getFriendObjectKind() &&
4572b560575SRichard Smith       D->getLexicalDeclContext()->isDependentContext() && !isa<TagDecl>(D)) {
4582b560575SRichard Smith     // For function templates and class templates, the template is numbered and
4592b560575SRichard Smith     // not its pattern.
4602b560575SRichard Smith     if (auto *FD = dyn_cast<FunctionDecl>(D))
4612b560575SRichard Smith       return !FD->getDescribedFunctionTemplate();
4622b560575SRichard Smith     if (auto *RD = dyn_cast<CXXRecordDecl>(D))
4632b560575SRichard Smith       return !RD->getDescribedClassTemplate();
4642b560575SRichard Smith     return true;
4652b560575SRichard Smith   }
4662b560575SRichard Smith 
467600adef3SRichard Smith   // At block scope, we number everything that we need to deduplicate, since we
468600adef3SRichard Smith   // can't just use name matching to keep things lined up.
469600adef3SRichard Smith   // FIXME: This is only necessary for an inline function or a template or
470600adef3SRichard Smith   // similar.
471600adef3SRichard Smith   if (D->getLexicalDeclContext()->isFunctionOrMethod()) {
472600adef3SRichard Smith     if (auto *VD = dyn_cast<VarDecl>(D))
473600adef3SRichard Smith       return VD->isStaticLocal();
474600adef3SRichard Smith     // FIXME: What about CapturedDecls (and declarations nested within them)?
475600adef3SRichard Smith     return isa<TagDecl>(D) || isa<BlockDecl>(D);
476600adef3SRichard Smith   }
477600adef3SRichard Smith 
478600adef3SRichard Smith   // Otherwise, we only care about anonymous class members / block-scope decls.
479600adef3SRichard Smith   // FIXME: We need to handle lambdas and blocks within inline / templated
480600adef3SRichard Smith   // variables too.
481*29444f04SVolodymyr Sapsai   if (D->getDeclName())
482*29444f04SVolodymyr Sapsai     return false;
483*29444f04SVolodymyr Sapsai   if (!isa<RecordDecl, ObjCInterfaceDecl>(D->getLexicalDeclContext()))
484d08aeb6bSRichard Smith     return false;
485d08aeb6bSRichard Smith   return isa<TagDecl>(D) || isa<FieldDecl>(D);
486d08aeb6bSRichard Smith }
487