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