xref: /freebsd-src/contrib/llvm-project/clang/lib/Serialization/ASTCommon.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
10b57cec5SDimitry Andric //===--- ASTCommon.cpp - Common stuff for ASTReader/ASTWriter----*- C++ -*-===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric //  This file defines common functions that both ASTReader and ASTWriter use.
100b57cec5SDimitry Andric //
110b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
120b57cec5SDimitry Andric 
130b57cec5SDimitry Andric #include "ASTCommon.h"
140b57cec5SDimitry Andric #include "clang/AST/DeclCXX.h"
150b57cec5SDimitry Andric #include "clang/AST/DeclObjC.h"
160b57cec5SDimitry Andric #include "clang/Basic/IdentifierTable.h"
170b57cec5SDimitry Andric #include "clang/Serialization/ASTDeserializationListener.h"
180b57cec5SDimitry Andric #include "llvm/Support/DJB.h"
190b57cec5SDimitry Andric 
200b57cec5SDimitry Andric using namespace clang;
210b57cec5SDimitry Andric 
220b57cec5SDimitry Andric // Give ASTDeserializationListener's VTable a home.
230b57cec5SDimitry Andric ASTDeserializationListener::~ASTDeserializationListener() { }
240b57cec5SDimitry Andric 
250b57cec5SDimitry Andric serialization::TypeIdx
260b57cec5SDimitry Andric serialization::TypeIdxFromBuiltin(const BuiltinType *BT) {
270b57cec5SDimitry Andric   unsigned ID = 0;
280b57cec5SDimitry Andric   switch (BT->getKind()) {
290b57cec5SDimitry Andric   case BuiltinType::Void:
300b57cec5SDimitry Andric     ID = PREDEF_TYPE_VOID_ID;
310b57cec5SDimitry Andric     break;
320b57cec5SDimitry Andric   case BuiltinType::Bool:
330b57cec5SDimitry Andric     ID = PREDEF_TYPE_BOOL_ID;
340b57cec5SDimitry Andric     break;
350b57cec5SDimitry Andric   case BuiltinType::Char_U:
360b57cec5SDimitry Andric     ID = PREDEF_TYPE_CHAR_U_ID;
370b57cec5SDimitry Andric     break;
380b57cec5SDimitry Andric   case BuiltinType::UChar:
390b57cec5SDimitry Andric     ID = PREDEF_TYPE_UCHAR_ID;
400b57cec5SDimitry Andric     break;
410b57cec5SDimitry Andric   case BuiltinType::UShort:
420b57cec5SDimitry Andric     ID = PREDEF_TYPE_USHORT_ID;
430b57cec5SDimitry Andric     break;
440b57cec5SDimitry Andric   case BuiltinType::UInt:
450b57cec5SDimitry Andric     ID = PREDEF_TYPE_UINT_ID;
460b57cec5SDimitry Andric     break;
470b57cec5SDimitry Andric   case BuiltinType::ULong:
480b57cec5SDimitry Andric     ID = PREDEF_TYPE_ULONG_ID;
490b57cec5SDimitry Andric     break;
500b57cec5SDimitry Andric   case BuiltinType::ULongLong:
510b57cec5SDimitry Andric     ID = PREDEF_TYPE_ULONGLONG_ID;
520b57cec5SDimitry Andric     break;
530b57cec5SDimitry Andric   case BuiltinType::UInt128:
540b57cec5SDimitry Andric     ID = PREDEF_TYPE_UINT128_ID;
550b57cec5SDimitry Andric     break;
560b57cec5SDimitry Andric   case BuiltinType::Char_S:
570b57cec5SDimitry Andric     ID = PREDEF_TYPE_CHAR_S_ID;
580b57cec5SDimitry Andric     break;
590b57cec5SDimitry Andric   case BuiltinType::SChar:
600b57cec5SDimitry Andric     ID = PREDEF_TYPE_SCHAR_ID;
610b57cec5SDimitry Andric     break;
620b57cec5SDimitry Andric   case BuiltinType::WChar_S:
630b57cec5SDimitry Andric   case BuiltinType::WChar_U:
640b57cec5SDimitry Andric     ID = PREDEF_TYPE_WCHAR_ID;
650b57cec5SDimitry Andric     break;
660b57cec5SDimitry Andric   case BuiltinType::Short:
670b57cec5SDimitry Andric     ID = PREDEF_TYPE_SHORT_ID;
680b57cec5SDimitry Andric     break;
690b57cec5SDimitry Andric   case BuiltinType::Int:
700b57cec5SDimitry Andric     ID = PREDEF_TYPE_INT_ID;
710b57cec5SDimitry Andric     break;
720b57cec5SDimitry Andric   case BuiltinType::Long:
730b57cec5SDimitry Andric     ID = PREDEF_TYPE_LONG_ID;
740b57cec5SDimitry Andric     break;
750b57cec5SDimitry Andric   case BuiltinType::LongLong:
760b57cec5SDimitry Andric     ID = PREDEF_TYPE_LONGLONG_ID;
770b57cec5SDimitry Andric     break;
780b57cec5SDimitry Andric   case BuiltinType::Int128:
790b57cec5SDimitry Andric     ID = PREDEF_TYPE_INT128_ID;
800b57cec5SDimitry Andric     break;
810b57cec5SDimitry Andric   case BuiltinType::Half:
820b57cec5SDimitry Andric     ID = PREDEF_TYPE_HALF_ID;
830b57cec5SDimitry Andric     break;
840b57cec5SDimitry Andric   case BuiltinType::Float:
850b57cec5SDimitry Andric     ID = PREDEF_TYPE_FLOAT_ID;
860b57cec5SDimitry Andric     break;
870b57cec5SDimitry Andric   case BuiltinType::Double:
880b57cec5SDimitry Andric     ID = PREDEF_TYPE_DOUBLE_ID;
890b57cec5SDimitry Andric     break;
900b57cec5SDimitry Andric   case BuiltinType::LongDouble:
910b57cec5SDimitry Andric     ID = PREDEF_TYPE_LONGDOUBLE_ID;
920b57cec5SDimitry Andric     break;
930b57cec5SDimitry Andric   case BuiltinType::ShortAccum:
940b57cec5SDimitry Andric     ID = PREDEF_TYPE_SHORT_ACCUM_ID;
950b57cec5SDimitry Andric     break;
960b57cec5SDimitry Andric   case BuiltinType::Accum:
970b57cec5SDimitry Andric     ID = PREDEF_TYPE_ACCUM_ID;
980b57cec5SDimitry Andric     break;
990b57cec5SDimitry Andric   case BuiltinType::LongAccum:
1000b57cec5SDimitry Andric     ID = PREDEF_TYPE_LONG_ACCUM_ID;
1010b57cec5SDimitry Andric     break;
1020b57cec5SDimitry Andric   case BuiltinType::UShortAccum:
1030b57cec5SDimitry Andric     ID = PREDEF_TYPE_USHORT_ACCUM_ID;
1040b57cec5SDimitry Andric     break;
1050b57cec5SDimitry Andric   case BuiltinType::UAccum:
1060b57cec5SDimitry Andric     ID = PREDEF_TYPE_UACCUM_ID;
1070b57cec5SDimitry Andric     break;
1080b57cec5SDimitry Andric   case BuiltinType::ULongAccum:
1090b57cec5SDimitry Andric     ID = PREDEF_TYPE_ULONG_ACCUM_ID;
1100b57cec5SDimitry Andric     break;
1110b57cec5SDimitry Andric   case BuiltinType::ShortFract:
1120b57cec5SDimitry Andric     ID = PREDEF_TYPE_SHORT_FRACT_ID;
1130b57cec5SDimitry Andric     break;
1140b57cec5SDimitry Andric   case BuiltinType::Fract:
1150b57cec5SDimitry Andric     ID = PREDEF_TYPE_FRACT_ID;
1160b57cec5SDimitry Andric     break;
1170b57cec5SDimitry Andric   case BuiltinType::LongFract:
1180b57cec5SDimitry Andric     ID = PREDEF_TYPE_LONG_FRACT_ID;
1190b57cec5SDimitry Andric     break;
1200b57cec5SDimitry Andric   case BuiltinType::UShortFract:
1210b57cec5SDimitry Andric     ID = PREDEF_TYPE_USHORT_FRACT_ID;
1220b57cec5SDimitry Andric     break;
1230b57cec5SDimitry Andric   case BuiltinType::UFract:
1240b57cec5SDimitry Andric     ID = PREDEF_TYPE_UFRACT_ID;
1250b57cec5SDimitry Andric     break;
1260b57cec5SDimitry Andric   case BuiltinType::ULongFract:
1270b57cec5SDimitry Andric     ID = PREDEF_TYPE_ULONG_FRACT_ID;
1280b57cec5SDimitry Andric     break;
1290b57cec5SDimitry Andric   case BuiltinType::SatShortAccum:
1300b57cec5SDimitry Andric     ID = PREDEF_TYPE_SAT_SHORT_ACCUM_ID;
1310b57cec5SDimitry Andric     break;
1320b57cec5SDimitry Andric   case BuiltinType::SatAccum:
1330b57cec5SDimitry Andric     ID = PREDEF_TYPE_SAT_ACCUM_ID;
1340b57cec5SDimitry Andric     break;
1350b57cec5SDimitry Andric   case BuiltinType::SatLongAccum:
1360b57cec5SDimitry Andric     ID = PREDEF_TYPE_SAT_LONG_ACCUM_ID;
1370b57cec5SDimitry Andric     break;
1380b57cec5SDimitry Andric   case BuiltinType::SatUShortAccum:
1390b57cec5SDimitry Andric     ID = PREDEF_TYPE_SAT_USHORT_ACCUM_ID;
1400b57cec5SDimitry Andric     break;
1410b57cec5SDimitry Andric   case BuiltinType::SatUAccum:
1420b57cec5SDimitry Andric     ID = PREDEF_TYPE_SAT_UACCUM_ID;
1430b57cec5SDimitry Andric     break;
1440b57cec5SDimitry Andric   case BuiltinType::SatULongAccum:
1450b57cec5SDimitry Andric     ID = PREDEF_TYPE_SAT_ULONG_ACCUM_ID;
1460b57cec5SDimitry Andric     break;
1470b57cec5SDimitry Andric   case BuiltinType::SatShortFract:
1480b57cec5SDimitry Andric     ID = PREDEF_TYPE_SAT_SHORT_FRACT_ID;
1490b57cec5SDimitry Andric     break;
1500b57cec5SDimitry Andric   case BuiltinType::SatFract:
1510b57cec5SDimitry Andric     ID = PREDEF_TYPE_SAT_FRACT_ID;
1520b57cec5SDimitry Andric     break;
1530b57cec5SDimitry Andric   case BuiltinType::SatLongFract:
1540b57cec5SDimitry Andric     ID = PREDEF_TYPE_SAT_LONG_FRACT_ID;
1550b57cec5SDimitry Andric     break;
1560b57cec5SDimitry Andric   case BuiltinType::SatUShortFract:
1570b57cec5SDimitry Andric     ID = PREDEF_TYPE_SAT_USHORT_FRACT_ID;
1580b57cec5SDimitry Andric     break;
1590b57cec5SDimitry Andric   case BuiltinType::SatUFract:
1600b57cec5SDimitry Andric     ID = PREDEF_TYPE_SAT_UFRACT_ID;
1610b57cec5SDimitry Andric     break;
1620b57cec5SDimitry Andric   case BuiltinType::SatULongFract:
1630b57cec5SDimitry Andric     ID = PREDEF_TYPE_SAT_ULONG_FRACT_ID;
1640b57cec5SDimitry Andric     break;
1650b57cec5SDimitry Andric   case BuiltinType::Float16:
1660b57cec5SDimitry Andric     ID = PREDEF_TYPE_FLOAT16_ID;
1670b57cec5SDimitry Andric     break;
1680b57cec5SDimitry Andric   case BuiltinType::Float128:
1690b57cec5SDimitry Andric     ID = PREDEF_TYPE_FLOAT128_ID;
1700b57cec5SDimitry Andric     break;
171349cc55cSDimitry Andric   case BuiltinType::Ibm128:
172349cc55cSDimitry Andric     ID = PREDEF_TYPE_IBM128_ID;
173349cc55cSDimitry Andric     break;
1740b57cec5SDimitry Andric   case BuiltinType::NullPtr:
1750b57cec5SDimitry Andric     ID = PREDEF_TYPE_NULLPTR_ID;
1760b57cec5SDimitry Andric     break;
1770b57cec5SDimitry Andric   case BuiltinType::Char8:
1780b57cec5SDimitry Andric     ID = PREDEF_TYPE_CHAR8_ID;
1790b57cec5SDimitry Andric     break;
1800b57cec5SDimitry Andric   case BuiltinType::Char16:
1810b57cec5SDimitry Andric     ID = PREDEF_TYPE_CHAR16_ID;
1820b57cec5SDimitry Andric     break;
1830b57cec5SDimitry Andric   case BuiltinType::Char32:
1840b57cec5SDimitry Andric     ID = PREDEF_TYPE_CHAR32_ID;
1850b57cec5SDimitry Andric     break;
1860b57cec5SDimitry Andric   case BuiltinType::Overload:
1870b57cec5SDimitry Andric     ID = PREDEF_TYPE_OVERLOAD_ID;
1880b57cec5SDimitry Andric     break;
189*0fca6ea1SDimitry Andric   case BuiltinType::UnresolvedTemplate:
190*0fca6ea1SDimitry Andric     ID = PREDEF_TYPE_UNRESOLVED_TEMPLATE;
191*0fca6ea1SDimitry Andric     break;
1920b57cec5SDimitry Andric   case BuiltinType::BoundMember:
1930b57cec5SDimitry Andric     ID = PREDEF_TYPE_BOUND_MEMBER;
1940b57cec5SDimitry Andric     break;
1950b57cec5SDimitry Andric   case BuiltinType::PseudoObject:
1960b57cec5SDimitry Andric     ID = PREDEF_TYPE_PSEUDO_OBJECT;
1970b57cec5SDimitry Andric     break;
1980b57cec5SDimitry Andric   case BuiltinType::Dependent:
1990b57cec5SDimitry Andric     ID = PREDEF_TYPE_DEPENDENT_ID;
2000b57cec5SDimitry Andric     break;
2010b57cec5SDimitry Andric   case BuiltinType::UnknownAny:
2020b57cec5SDimitry Andric     ID = PREDEF_TYPE_UNKNOWN_ANY;
2030b57cec5SDimitry Andric     break;
2040b57cec5SDimitry Andric   case BuiltinType::ARCUnbridgedCast:
2050b57cec5SDimitry Andric     ID = PREDEF_TYPE_ARC_UNBRIDGED_CAST;
2060b57cec5SDimitry Andric     break;
2070b57cec5SDimitry Andric   case BuiltinType::ObjCId:
2080b57cec5SDimitry Andric     ID = PREDEF_TYPE_OBJC_ID;
2090b57cec5SDimitry Andric     break;
2100b57cec5SDimitry Andric   case BuiltinType::ObjCClass:
2110b57cec5SDimitry Andric     ID = PREDEF_TYPE_OBJC_CLASS;
2120b57cec5SDimitry Andric     break;
2130b57cec5SDimitry Andric   case BuiltinType::ObjCSel:
2140b57cec5SDimitry Andric     ID = PREDEF_TYPE_OBJC_SEL;
2150b57cec5SDimitry Andric     break;
2160b57cec5SDimitry Andric #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
2170b57cec5SDimitry Andric   case BuiltinType::Id: \
2180b57cec5SDimitry Andric     ID = PREDEF_TYPE_##Id##_ID; \
2190b57cec5SDimitry Andric     break;
2200b57cec5SDimitry Andric #include "clang/Basic/OpenCLImageTypes.def"
2210b57cec5SDimitry Andric #define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
2220b57cec5SDimitry Andric   case BuiltinType::Id: \
2230b57cec5SDimitry Andric     ID = PREDEF_TYPE_##Id##_ID; \
2240b57cec5SDimitry Andric     break;
2250b57cec5SDimitry Andric #include "clang/Basic/OpenCLExtensionTypes.def"
2260b57cec5SDimitry Andric   case BuiltinType::OCLSampler:
2270b57cec5SDimitry Andric     ID = PREDEF_TYPE_SAMPLER_ID;
2280b57cec5SDimitry Andric     break;
2290b57cec5SDimitry Andric   case BuiltinType::OCLEvent:
2300b57cec5SDimitry Andric     ID = PREDEF_TYPE_EVENT_ID;
2310b57cec5SDimitry Andric     break;
2320b57cec5SDimitry Andric   case BuiltinType::OCLClkEvent:
2330b57cec5SDimitry Andric     ID = PREDEF_TYPE_CLK_EVENT_ID;
2340b57cec5SDimitry Andric     break;
2350b57cec5SDimitry Andric   case BuiltinType::OCLQueue:
2360b57cec5SDimitry Andric     ID = PREDEF_TYPE_QUEUE_ID;
2370b57cec5SDimitry Andric     break;
2380b57cec5SDimitry Andric   case BuiltinType::OCLReserveID:
2390b57cec5SDimitry Andric     ID = PREDEF_TYPE_RESERVE_ID_ID;
2400b57cec5SDimitry Andric     break;
241a7dea167SDimitry Andric #define SVE_TYPE(Name, Id, SingletonId) \
242a7dea167SDimitry Andric   case BuiltinType::Id: \
243a7dea167SDimitry Andric     ID = PREDEF_TYPE_##Id##_ID; \
244a7dea167SDimitry Andric     break;
245a7dea167SDimitry Andric #include "clang/Basic/AArch64SVEACLETypes.def"
246e8d8bef9SDimitry Andric #define PPC_VECTOR_TYPE(Name, Id, Size) \
247e8d8bef9SDimitry Andric   case BuiltinType::Id: \
248e8d8bef9SDimitry Andric     ID = PREDEF_TYPE_##Id##_ID; \
249e8d8bef9SDimitry Andric     break;
250e8d8bef9SDimitry Andric #include "clang/Basic/PPCTypes.def"
251fe6060f1SDimitry Andric #define RVV_TYPE(Name, Id, SingletonId)                                        \
252fe6060f1SDimitry Andric   case BuiltinType::Id:                                                        \
253fe6060f1SDimitry Andric     ID = PREDEF_TYPE_##Id##_ID;                                                \
254fe6060f1SDimitry Andric     break;
255fe6060f1SDimitry Andric #include "clang/Basic/RISCVVTypes.def"
25606c3fb27SDimitry Andric #define WASM_TYPE(Name, Id, SingletonId)                                       \
25706c3fb27SDimitry Andric   case BuiltinType::Id:                                                        \
25806c3fb27SDimitry Andric     ID = PREDEF_TYPE_##Id##_ID;                                                \
25906c3fb27SDimitry Andric     break;
26006c3fb27SDimitry Andric #include "clang/Basic/WebAssemblyReferenceTypes.def"
261*0fca6ea1SDimitry Andric #define AMDGPU_TYPE(Name, Id, SingletonId)                                     \
262*0fca6ea1SDimitry Andric   case BuiltinType::Id:                                                        \
263*0fca6ea1SDimitry Andric     ID = PREDEF_TYPE_##Id##_ID;                                                \
264*0fca6ea1SDimitry Andric     break;
265*0fca6ea1SDimitry Andric #include "clang/Basic/AMDGPUTypes.def"
2660b57cec5SDimitry Andric   case BuiltinType::BuiltinFn:
2670b57cec5SDimitry Andric     ID = PREDEF_TYPE_BUILTIN_FN;
2680b57cec5SDimitry Andric     break;
2695ffd83dbSDimitry Andric   case BuiltinType::IncompleteMatrixIdx:
2705ffd83dbSDimitry Andric     ID = PREDEF_TYPE_INCOMPLETE_MATRIX_IDX;
2715ffd83dbSDimitry Andric     break;
272*0fca6ea1SDimitry Andric   case BuiltinType::ArraySection:
273*0fca6ea1SDimitry Andric     ID = PREDEF_TYPE_ARRAY_SECTION;
2740b57cec5SDimitry Andric     break;
2755ffd83dbSDimitry Andric   case BuiltinType::OMPArrayShaping:
2765ffd83dbSDimitry Andric     ID = PREDEF_TYPE_OMP_ARRAY_SHAPING;
2775ffd83dbSDimitry Andric     break;
2785ffd83dbSDimitry Andric   case BuiltinType::OMPIterator:
2795ffd83dbSDimitry Andric     ID = PREDEF_TYPE_OMP_ITERATOR;
2805ffd83dbSDimitry Andric     break;
2815ffd83dbSDimitry Andric   case BuiltinType::BFloat16:
2825ffd83dbSDimitry Andric     ID = PREDEF_TYPE_BFLOAT16_ID;
2835ffd83dbSDimitry Andric     break;
2840b57cec5SDimitry Andric   }
2850b57cec5SDimitry Andric 
286*0fca6ea1SDimitry Andric   return TypeIdx(0, ID);
2870b57cec5SDimitry Andric }
2880b57cec5SDimitry Andric 
2890b57cec5SDimitry Andric unsigned serialization::ComputeHash(Selector Sel) {
2900b57cec5SDimitry Andric   unsigned N = Sel.getNumArgs();
2910b57cec5SDimitry Andric   if (N == 0)
2920b57cec5SDimitry Andric     ++N;
2930b57cec5SDimitry Andric   unsigned R = 5381;
2940b57cec5SDimitry Andric   for (unsigned I = 0; I != N; ++I)
295*0fca6ea1SDimitry Andric     if (const IdentifierInfo *II = Sel.getIdentifierInfoForSlot(I))
2960b57cec5SDimitry Andric       R = llvm::djbHash(II->getName(), R);
2970b57cec5SDimitry Andric   return R;
2980b57cec5SDimitry Andric }
2990b57cec5SDimitry Andric 
3000b57cec5SDimitry Andric const DeclContext *
3010b57cec5SDimitry Andric serialization::getDefinitiveDeclContext(const DeclContext *DC) {
3020b57cec5SDimitry Andric   switch (DC->getDeclKind()) {
3030b57cec5SDimitry Andric   // These entities may have multiple definitions.
3040b57cec5SDimitry Andric   case Decl::TranslationUnit:
3050b57cec5SDimitry Andric   case Decl::ExternCContext:
3060b57cec5SDimitry Andric   case Decl::Namespace:
3070b57cec5SDimitry Andric   case Decl::LinkageSpec:
3080b57cec5SDimitry Andric   case Decl::Export:
3090b57cec5SDimitry Andric     return nullptr;
3100b57cec5SDimitry Andric 
3110b57cec5SDimitry Andric   // C/C++ tag types can only be defined in one place.
3120b57cec5SDimitry Andric   case Decl::Enum:
3130b57cec5SDimitry Andric   case Decl::Record:
3140b57cec5SDimitry Andric     if (const TagDecl *Def = cast<TagDecl>(DC)->getDefinition())
3150b57cec5SDimitry Andric       return Def;
3160b57cec5SDimitry Andric     return nullptr;
3170b57cec5SDimitry Andric 
3180b57cec5SDimitry Andric   // FIXME: These can be defined in one place... except special member
3190b57cec5SDimitry Andric   // functions and out-of-line definitions.
3200b57cec5SDimitry Andric   case Decl::CXXRecord:
3210b57cec5SDimitry Andric   case Decl::ClassTemplateSpecialization:
3220b57cec5SDimitry Andric   case Decl::ClassTemplatePartialSpecialization:
3230b57cec5SDimitry Andric     return nullptr;
3240b57cec5SDimitry Andric 
3250b57cec5SDimitry Andric   // Each function, method, and block declaration is its own DeclContext.
3260b57cec5SDimitry Andric   case Decl::Function:
3270b57cec5SDimitry Andric   case Decl::CXXMethod:
3280b57cec5SDimitry Andric   case Decl::CXXConstructor:
3290b57cec5SDimitry Andric   case Decl::CXXDestructor:
3300b57cec5SDimitry Andric   case Decl::CXXConversion:
3310b57cec5SDimitry Andric   case Decl::ObjCMethod:
3320b57cec5SDimitry Andric   case Decl::Block:
3330b57cec5SDimitry Andric   case Decl::Captured:
3340b57cec5SDimitry Andric     // Objective C categories, category implementations, and class
3350b57cec5SDimitry Andric     // implementations can only be defined in one place.
3360b57cec5SDimitry Andric   case Decl::ObjCCategory:
3370b57cec5SDimitry Andric   case Decl::ObjCCategoryImpl:
3380b57cec5SDimitry Andric   case Decl::ObjCImplementation:
3390b57cec5SDimitry Andric     return DC;
3400b57cec5SDimitry Andric 
3410b57cec5SDimitry Andric   case Decl::ObjCProtocol:
3420b57cec5SDimitry Andric     if (const ObjCProtocolDecl *Def
3430b57cec5SDimitry Andric           = cast<ObjCProtocolDecl>(DC)->getDefinition())
3440b57cec5SDimitry Andric       return Def;
3450b57cec5SDimitry Andric     return nullptr;
3460b57cec5SDimitry Andric 
3470b57cec5SDimitry Andric   // FIXME: These are defined in one place, but properties in class extensions
3480b57cec5SDimitry Andric   // end up being back-patched into the main interface. See
349*0fca6ea1SDimitry Andric   // SemaObjC::HandlePropertyInClassExtension for the offending code.
3500b57cec5SDimitry Andric   case Decl::ObjCInterface:
3510b57cec5SDimitry Andric     return nullptr;
3520b57cec5SDimitry Andric 
3530b57cec5SDimitry Andric   default:
3540b57cec5SDimitry Andric     llvm_unreachable("Unhandled DeclContext in AST reader");
3550b57cec5SDimitry Andric   }
3560b57cec5SDimitry Andric 
3570b57cec5SDimitry Andric   llvm_unreachable("Unhandled decl kind");
3580b57cec5SDimitry Andric }
3590b57cec5SDimitry Andric 
3600b57cec5SDimitry Andric bool serialization::isRedeclarableDeclKind(unsigned Kind) {
3610b57cec5SDimitry Andric   switch (static_cast<Decl::Kind>(Kind)) {
3620b57cec5SDimitry Andric   case Decl::TranslationUnit:
3630b57cec5SDimitry Andric   case Decl::ExternCContext:
3640b57cec5SDimitry Andric     // Special case of a "merged" declaration.
3650b57cec5SDimitry Andric     return true;
3660b57cec5SDimitry Andric 
3670b57cec5SDimitry Andric   case Decl::Namespace:
3680b57cec5SDimitry Andric   case Decl::NamespaceAlias:
3690b57cec5SDimitry Andric   case Decl::Typedef:
3700b57cec5SDimitry Andric   case Decl::TypeAlias:
3710b57cec5SDimitry Andric   case Decl::Enum:
3720b57cec5SDimitry Andric   case Decl::Record:
3730b57cec5SDimitry Andric   case Decl::CXXRecord:
3740b57cec5SDimitry Andric   case Decl::ClassTemplateSpecialization:
3750b57cec5SDimitry Andric   case Decl::ClassTemplatePartialSpecialization:
3760b57cec5SDimitry Andric   case Decl::VarTemplateSpecialization:
3770b57cec5SDimitry Andric   case Decl::VarTemplatePartialSpecialization:
3780b57cec5SDimitry Andric   case Decl::Function:
3790b57cec5SDimitry Andric   case Decl::CXXDeductionGuide:
3800b57cec5SDimitry Andric   case Decl::CXXMethod:
3810b57cec5SDimitry Andric   case Decl::CXXConstructor:
3820b57cec5SDimitry Andric   case Decl::CXXDestructor:
3830b57cec5SDimitry Andric   case Decl::CXXConversion:
3840b57cec5SDimitry Andric   case Decl::UsingShadow:
3850b57cec5SDimitry Andric   case Decl::ConstructorUsingShadow:
3860b57cec5SDimitry Andric   case Decl::Var:
3870b57cec5SDimitry Andric   case Decl::FunctionTemplate:
3880b57cec5SDimitry Andric   case Decl::ClassTemplate:
3890b57cec5SDimitry Andric   case Decl::VarTemplate:
3900b57cec5SDimitry Andric   case Decl::TypeAliasTemplate:
3910b57cec5SDimitry Andric   case Decl::ObjCProtocol:
3920b57cec5SDimitry Andric   case Decl::ObjCInterface:
3930b57cec5SDimitry Andric   case Decl::Empty:
3940b57cec5SDimitry Andric     return true;
3950b57cec5SDimitry Andric 
3960b57cec5SDimitry Andric   // Never redeclarable.
3970b57cec5SDimitry Andric   case Decl::UsingDirective:
3980b57cec5SDimitry Andric   case Decl::Label:
3990b57cec5SDimitry Andric   case Decl::UnresolvedUsingTypename:
4000b57cec5SDimitry Andric   case Decl::TemplateTypeParm:
4010b57cec5SDimitry Andric   case Decl::EnumConstant:
4020b57cec5SDimitry Andric   case Decl::UnresolvedUsingValue:
4030b57cec5SDimitry Andric   case Decl::IndirectField:
4040b57cec5SDimitry Andric   case Decl::Field:
4050b57cec5SDimitry Andric   case Decl::MSProperty:
4065ffd83dbSDimitry Andric   case Decl::MSGuid:
40781ad6265SDimitry Andric   case Decl::UnnamedGlobalConstant:
408e8d8bef9SDimitry Andric   case Decl::TemplateParamObject:
4090b57cec5SDimitry Andric   case Decl::ObjCIvar:
4100b57cec5SDimitry Andric   case Decl::ObjCAtDefsField:
4110b57cec5SDimitry Andric   case Decl::NonTypeTemplateParm:
4120b57cec5SDimitry Andric   case Decl::TemplateTemplateParm:
4130b57cec5SDimitry Andric   case Decl::Using:
414fe6060f1SDimitry Andric   case Decl::UsingEnum:
4150b57cec5SDimitry Andric   case Decl::UsingPack:
4160b57cec5SDimitry Andric   case Decl::ObjCMethod:
4170b57cec5SDimitry Andric   case Decl::ObjCCategory:
4180b57cec5SDimitry Andric   case Decl::ObjCCategoryImpl:
4190b57cec5SDimitry Andric   case Decl::ObjCImplementation:
4200b57cec5SDimitry Andric   case Decl::ObjCProperty:
4210b57cec5SDimitry Andric   case Decl::ObjCCompatibleAlias:
4220b57cec5SDimitry Andric   case Decl::LinkageSpec:
4230b57cec5SDimitry Andric   case Decl::Export:
4240b57cec5SDimitry Andric   case Decl::ObjCPropertyImpl:
4250b57cec5SDimitry Andric   case Decl::PragmaComment:
4260b57cec5SDimitry Andric   case Decl::PragmaDetectMismatch:
4270b57cec5SDimitry Andric   case Decl::FileScopeAsm:
428bdd1243dSDimitry Andric   case Decl::TopLevelStmt:
4290b57cec5SDimitry Andric   case Decl::AccessSpec:
4300b57cec5SDimitry Andric   case Decl::Friend:
4310b57cec5SDimitry Andric   case Decl::FriendTemplate:
4320b57cec5SDimitry Andric   case Decl::StaticAssert:
4330b57cec5SDimitry Andric   case Decl::Block:
4340b57cec5SDimitry Andric   case Decl::Captured:
4350b57cec5SDimitry Andric   case Decl::Import:
4360b57cec5SDimitry Andric   case Decl::OMPThreadPrivate:
4370b57cec5SDimitry Andric   case Decl::OMPAllocate:
4380b57cec5SDimitry Andric   case Decl::OMPRequires:
4390b57cec5SDimitry Andric   case Decl::OMPCapturedExpr:
4400b57cec5SDimitry Andric   case Decl::OMPDeclareReduction:
4410b57cec5SDimitry Andric   case Decl::OMPDeclareMapper:
4420b57cec5SDimitry Andric   case Decl::BuiltinTemplate:
4430b57cec5SDimitry Andric   case Decl::Decomposition:
4440b57cec5SDimitry Andric   case Decl::Binding:
4450b57cec5SDimitry Andric   case Decl::Concept:
446bdd1243dSDimitry Andric   case Decl::ImplicitConceptSpecialization:
447480093f4SDimitry Andric   case Decl::LifetimeExtendedTemporary:
44855e4f9d5SDimitry Andric   case Decl::RequiresExprBody:
449fe6060f1SDimitry Andric   case Decl::UnresolvedUsingIfExists:
450bdd1243dSDimitry Andric   case Decl::HLSLBuffer:
4510b57cec5SDimitry Andric     return false;
4520b57cec5SDimitry Andric 
4530b57cec5SDimitry Andric   // These indirectly derive from Redeclarable<T> but are not actually
4540b57cec5SDimitry Andric   // redeclarable.
4550b57cec5SDimitry Andric   case Decl::ImplicitParam:
4560b57cec5SDimitry Andric   case Decl::ParmVar:
4570b57cec5SDimitry Andric   case Decl::ObjCTypeParam:
4580b57cec5SDimitry Andric     return false;
4590b57cec5SDimitry Andric   }
4600b57cec5SDimitry Andric 
4610b57cec5SDimitry Andric   llvm_unreachable("Unhandled declaration kind");
4620b57cec5SDimitry Andric }
4630b57cec5SDimitry Andric 
4640b57cec5SDimitry Andric bool serialization::needsAnonymousDeclarationNumber(const NamedDecl *D) {
4650b57cec5SDimitry Andric   // Friend declarations in dependent contexts aren't anonymous in the usual
4660b57cec5SDimitry Andric   // sense, but they cannot be found by name lookup in their semantic context
4670b57cec5SDimitry Andric   // (or indeed in any context), so we treat them as anonymous.
4680b57cec5SDimitry Andric   //
4690b57cec5SDimitry Andric   // This doesn't apply to friend tag decls; Sema makes those available to name
4700b57cec5SDimitry Andric   // lookup in the surrounding context.
4710b57cec5SDimitry Andric   if (D->getFriendObjectKind() &&
4720b57cec5SDimitry Andric       D->getLexicalDeclContext()->isDependentContext() && !isa<TagDecl>(D)) {
4730b57cec5SDimitry Andric     // For function templates and class templates, the template is numbered and
4740b57cec5SDimitry Andric     // not its pattern.
4750b57cec5SDimitry Andric     if (auto *FD = dyn_cast<FunctionDecl>(D))
4760b57cec5SDimitry Andric       return !FD->getDescribedFunctionTemplate();
4770b57cec5SDimitry Andric     if (auto *RD = dyn_cast<CXXRecordDecl>(D))
4780b57cec5SDimitry Andric       return !RD->getDescribedClassTemplate();
4790b57cec5SDimitry Andric     return true;
4800b57cec5SDimitry Andric   }
4810b57cec5SDimitry Andric 
4820b57cec5SDimitry Andric   // At block scope, we number everything that we need to deduplicate, since we
4830b57cec5SDimitry Andric   // can't just use name matching to keep things lined up.
4840b57cec5SDimitry Andric   // FIXME: This is only necessary for an inline function or a template or
4850b57cec5SDimitry Andric   // similar.
4860b57cec5SDimitry Andric   if (D->getLexicalDeclContext()->isFunctionOrMethod()) {
4870b57cec5SDimitry Andric     if (auto *VD = dyn_cast<VarDecl>(D))
4880b57cec5SDimitry Andric       return VD->isStaticLocal();
4890b57cec5SDimitry Andric     // FIXME: What about CapturedDecls (and declarations nested within them)?
490bdd1243dSDimitry Andric     return isa<TagDecl, BlockDecl>(D);
4910b57cec5SDimitry Andric   }
4920b57cec5SDimitry Andric 
4930b57cec5SDimitry Andric   // Otherwise, we only care about anonymous class members / block-scope decls.
49406c3fb27SDimitry Andric   // FIXME: We need to handle blocks within inline / templated variables too.
49581ad6265SDimitry Andric   if (D->getDeclName())
49681ad6265SDimitry Andric     return false;
49781ad6265SDimitry Andric   if (!isa<RecordDecl, ObjCInterfaceDecl>(D->getLexicalDeclContext()))
4980b57cec5SDimitry Andric     return false;
499bdd1243dSDimitry Andric   return isa<TagDecl, FieldDecl>(D);
5000b57cec5SDimitry Andric }
501