512 lines · cpp
1//===--- ASTCommon.cpp - 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-exception6//7//===----------------------------------------------------------------------===//8//9// This file defines common functions that both ASTReader and ASTWriter use.10//11//===----------------------------------------------------------------------===//12 13#include "ASTCommon.h"14#include "clang/AST/DeclCXX.h"15#include "clang/AST/DeclObjC.h"16#include "clang/Basic/IdentifierTable.h"17#include "clang/Serialization/ASTDeserializationListener.h"18#include "llvm/Support/DJB.h"19 20using namespace clang;21 22// Give ASTDeserializationListener's VTable a home.23ASTDeserializationListener::~ASTDeserializationListener() { }24 25serialization::TypeIdx26serialization::TypeIdxFromBuiltin(const BuiltinType *BT) {27 unsigned ID = 0;28 switch (BT->getKind()) {29 case BuiltinType::Void:30 ID = PREDEF_TYPE_VOID_ID;31 break;32 case BuiltinType::Bool:33 ID = PREDEF_TYPE_BOOL_ID;34 break;35 case BuiltinType::Char_U:36 ID = PREDEF_TYPE_CHAR_U_ID;37 break;38 case BuiltinType::UChar:39 ID = PREDEF_TYPE_UCHAR_ID;40 break;41 case BuiltinType::UShort:42 ID = PREDEF_TYPE_USHORT_ID;43 break;44 case BuiltinType::UInt:45 ID = PREDEF_TYPE_UINT_ID;46 break;47 case BuiltinType::ULong:48 ID = PREDEF_TYPE_ULONG_ID;49 break;50 case BuiltinType::ULongLong:51 ID = PREDEF_TYPE_ULONGLONG_ID;52 break;53 case BuiltinType::UInt128:54 ID = PREDEF_TYPE_UINT128_ID;55 break;56 case BuiltinType::Char_S:57 ID = PREDEF_TYPE_CHAR_S_ID;58 break;59 case BuiltinType::SChar:60 ID = PREDEF_TYPE_SCHAR_ID;61 break;62 case BuiltinType::WChar_S:63 case BuiltinType::WChar_U:64 ID = PREDEF_TYPE_WCHAR_ID;65 break;66 case BuiltinType::Short:67 ID = PREDEF_TYPE_SHORT_ID;68 break;69 case BuiltinType::Int:70 ID = PREDEF_TYPE_INT_ID;71 break;72 case BuiltinType::Long:73 ID = PREDEF_TYPE_LONG_ID;74 break;75 case BuiltinType::LongLong:76 ID = PREDEF_TYPE_LONGLONG_ID;77 break;78 case BuiltinType::Int128:79 ID = PREDEF_TYPE_INT128_ID;80 break;81 case BuiltinType::Half:82 ID = PREDEF_TYPE_HALF_ID;83 break;84 case BuiltinType::Float:85 ID = PREDEF_TYPE_FLOAT_ID;86 break;87 case BuiltinType::Double:88 ID = PREDEF_TYPE_DOUBLE_ID;89 break;90 case BuiltinType::LongDouble:91 ID = PREDEF_TYPE_LONGDOUBLE_ID;92 break;93 case BuiltinType::ShortAccum:94 ID = PREDEF_TYPE_SHORT_ACCUM_ID;95 break;96 case BuiltinType::Accum:97 ID = PREDEF_TYPE_ACCUM_ID;98 break;99 case BuiltinType::LongAccum:100 ID = PREDEF_TYPE_LONG_ACCUM_ID;101 break;102 case BuiltinType::UShortAccum:103 ID = PREDEF_TYPE_USHORT_ACCUM_ID;104 break;105 case BuiltinType::UAccum:106 ID = PREDEF_TYPE_UACCUM_ID;107 break;108 case BuiltinType::ULongAccum:109 ID = PREDEF_TYPE_ULONG_ACCUM_ID;110 break;111 case BuiltinType::ShortFract:112 ID = PREDEF_TYPE_SHORT_FRACT_ID;113 break;114 case BuiltinType::Fract:115 ID = PREDEF_TYPE_FRACT_ID;116 break;117 case BuiltinType::LongFract:118 ID = PREDEF_TYPE_LONG_FRACT_ID;119 break;120 case BuiltinType::UShortFract:121 ID = PREDEF_TYPE_USHORT_FRACT_ID;122 break;123 case BuiltinType::UFract:124 ID = PREDEF_TYPE_UFRACT_ID;125 break;126 case BuiltinType::ULongFract:127 ID = PREDEF_TYPE_ULONG_FRACT_ID;128 break;129 case BuiltinType::SatShortAccum:130 ID = PREDEF_TYPE_SAT_SHORT_ACCUM_ID;131 break;132 case BuiltinType::SatAccum:133 ID = PREDEF_TYPE_SAT_ACCUM_ID;134 break;135 case BuiltinType::SatLongAccum:136 ID = PREDEF_TYPE_SAT_LONG_ACCUM_ID;137 break;138 case BuiltinType::SatUShortAccum:139 ID = PREDEF_TYPE_SAT_USHORT_ACCUM_ID;140 break;141 case BuiltinType::SatUAccum:142 ID = PREDEF_TYPE_SAT_UACCUM_ID;143 break;144 case BuiltinType::SatULongAccum:145 ID = PREDEF_TYPE_SAT_ULONG_ACCUM_ID;146 break;147 case BuiltinType::SatShortFract:148 ID = PREDEF_TYPE_SAT_SHORT_FRACT_ID;149 break;150 case BuiltinType::SatFract:151 ID = PREDEF_TYPE_SAT_FRACT_ID;152 break;153 case BuiltinType::SatLongFract:154 ID = PREDEF_TYPE_SAT_LONG_FRACT_ID;155 break;156 case BuiltinType::SatUShortFract:157 ID = PREDEF_TYPE_SAT_USHORT_FRACT_ID;158 break;159 case BuiltinType::SatUFract:160 ID = PREDEF_TYPE_SAT_UFRACT_ID;161 break;162 case BuiltinType::SatULongFract:163 ID = PREDEF_TYPE_SAT_ULONG_FRACT_ID;164 break;165 case BuiltinType::Float16:166 ID = PREDEF_TYPE_FLOAT16_ID;167 break;168 case BuiltinType::Float128:169 ID = PREDEF_TYPE_FLOAT128_ID;170 break;171 case BuiltinType::Ibm128:172 ID = PREDEF_TYPE_IBM128_ID;173 break;174 case BuiltinType::NullPtr:175 ID = PREDEF_TYPE_NULLPTR_ID;176 break;177 case BuiltinType::Char8:178 ID = PREDEF_TYPE_CHAR8_ID;179 break;180 case BuiltinType::Char16:181 ID = PREDEF_TYPE_CHAR16_ID;182 break;183 case BuiltinType::Char32:184 ID = PREDEF_TYPE_CHAR32_ID;185 break;186 case BuiltinType::Overload:187 ID = PREDEF_TYPE_OVERLOAD_ID;188 break;189 case BuiltinType::UnresolvedTemplate:190 ID = PREDEF_TYPE_UNRESOLVED_TEMPLATE;191 break;192 case BuiltinType::BoundMember:193 ID = PREDEF_TYPE_BOUND_MEMBER;194 break;195 case BuiltinType::PseudoObject:196 ID = PREDEF_TYPE_PSEUDO_OBJECT;197 break;198 case BuiltinType::Dependent:199 ID = PREDEF_TYPE_DEPENDENT_ID;200 break;201 case BuiltinType::UnknownAny:202 ID = PREDEF_TYPE_UNKNOWN_ANY;203 break;204 case BuiltinType::ARCUnbridgedCast:205 ID = PREDEF_TYPE_ARC_UNBRIDGED_CAST;206 break;207 case BuiltinType::ObjCId:208 ID = PREDEF_TYPE_OBJC_ID;209 break;210 case BuiltinType::ObjCClass:211 ID = PREDEF_TYPE_OBJC_CLASS;212 break;213 case BuiltinType::ObjCSel:214 ID = PREDEF_TYPE_OBJC_SEL;215 break;216#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \217 case BuiltinType::Id: \218 ID = PREDEF_TYPE_##Id##_ID; \219 break;220#include "clang/Basic/OpenCLImageTypes.def"221#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \222 case BuiltinType::Id: \223 ID = PREDEF_TYPE_##Id##_ID; \224 break;225#include "clang/Basic/OpenCLExtensionTypes.def"226 case BuiltinType::OCLSampler:227 ID = PREDEF_TYPE_SAMPLER_ID;228 break;229 case BuiltinType::OCLEvent:230 ID = PREDEF_TYPE_EVENT_ID;231 break;232 case BuiltinType::OCLClkEvent:233 ID = PREDEF_TYPE_CLK_EVENT_ID;234 break;235 case BuiltinType::OCLQueue:236 ID = PREDEF_TYPE_QUEUE_ID;237 break;238 case BuiltinType::OCLReserveID:239 ID = PREDEF_TYPE_RESERVE_ID_ID;240 break;241#define SVE_TYPE(Name, Id, SingletonId) \242 case BuiltinType::Id: \243 ID = PREDEF_TYPE_##Id##_ID; \244 break;245#include "clang/Basic/AArch64ACLETypes.def"246#define PPC_VECTOR_TYPE(Name, Id, Size) \247 case BuiltinType::Id: \248 ID = PREDEF_TYPE_##Id##_ID; \249 break;250#include "clang/Basic/PPCTypes.def"251#define RVV_TYPE(Name, Id, SingletonId) \252 case BuiltinType::Id: \253 ID = PREDEF_TYPE_##Id##_ID; \254 break;255#include "clang/Basic/RISCVVTypes.def"256#define WASM_TYPE(Name, Id, SingletonId) \257 case BuiltinType::Id: \258 ID = PREDEF_TYPE_##Id##_ID; \259 break;260#include "clang/Basic/WebAssemblyReferenceTypes.def"261#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) \262 case BuiltinType::Id: \263 ID = PREDEF_TYPE_##Id##_ID; \264 break;265#include "clang/Basic/AMDGPUTypes.def"266#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \267 case BuiltinType::Id: \268 ID = PREDEF_TYPE_##Id##_ID; \269 break;270#include "clang/Basic/HLSLIntangibleTypes.def"271 case BuiltinType::BuiltinFn:272 ID = PREDEF_TYPE_BUILTIN_FN;273 break;274 case BuiltinType::IncompleteMatrixIdx:275 ID = PREDEF_TYPE_INCOMPLETE_MATRIX_IDX;276 break;277 case BuiltinType::ArraySection:278 ID = PREDEF_TYPE_ARRAY_SECTION;279 break;280 case BuiltinType::OMPArrayShaping:281 ID = PREDEF_TYPE_OMP_ARRAY_SHAPING;282 break;283 case BuiltinType::OMPIterator:284 ID = PREDEF_TYPE_OMP_ITERATOR;285 break;286 case BuiltinType::BFloat16:287 ID = PREDEF_TYPE_BFLOAT16_ID;288 break;289 }290 291 return TypeIdx(0, ID);292}293 294unsigned serialization::ComputeHash(Selector Sel) {295 unsigned N = Sel.getNumArgs();296 if (N == 0)297 ++N;298 unsigned R = 5381;299 for (unsigned I = 0; I != N; ++I)300 if (const IdentifierInfo *II = Sel.getIdentifierInfoForSlot(I))301 R = llvm::djbHash(II->getName(), R);302 return R;303}304 305const DeclContext *306serialization::getDefinitiveDeclContext(const DeclContext *DC) {307 switch (DC->getDeclKind()) {308 // These entities may have multiple definitions.309 case Decl::TranslationUnit:310 case Decl::ExternCContext:311 case Decl::Namespace:312 case Decl::LinkageSpec:313 case Decl::Export:314 return nullptr;315 316 // C/C++ tag types can only be defined in one place.317 case Decl::Enum:318 case Decl::Record:319 if (const TagDecl *Def = cast<TagDecl>(DC)->getDefinition())320 return Def;321 return nullptr;322 323 // FIXME: These can be defined in one place... except special member324 // functions and out-of-line definitions.325 case Decl::CXXRecord:326 case Decl::ClassTemplateSpecialization:327 case Decl::ClassTemplatePartialSpecialization:328 return nullptr;329 330 // Each function, method, and block declaration is its own DeclContext.331 case Decl::Function:332 case Decl::CXXMethod:333 case Decl::CXXConstructor:334 case Decl::CXXDestructor:335 case Decl::CXXConversion:336 case Decl::ObjCMethod:337 case Decl::Block:338 case Decl::OutlinedFunction:339 case Decl::Captured:340 // Objective C categories, category implementations, and class341 // implementations can only be defined in one place.342 case Decl::ObjCCategory:343 case Decl::ObjCCategoryImpl:344 case Decl::ObjCImplementation:345 return DC;346 347 case Decl::ObjCProtocol:348 if (const ObjCProtocolDecl *Def349 = cast<ObjCProtocolDecl>(DC)->getDefinition())350 return Def;351 return nullptr;352 353 // FIXME: These are defined in one place, but properties in class extensions354 // end up being back-patched into the main interface. See355 // SemaObjC::HandlePropertyInClassExtension for the offending code.356 case Decl::ObjCInterface:357 return nullptr;358 359 default:360 llvm_unreachable("Unhandled DeclContext in AST reader");361 }362 363 llvm_unreachable("Unhandled decl kind");364}365 366bool serialization::isRedeclarableDeclKind(unsigned Kind) {367 switch (static_cast<Decl::Kind>(Kind)) {368 case Decl::TranslationUnit:369 case Decl::ExternCContext:370 // Special case of a "merged" declaration.371 return true;372 373 case Decl::Namespace:374 case Decl::NamespaceAlias:375 case Decl::Typedef:376 case Decl::TypeAlias:377 case Decl::Enum:378 case Decl::Record:379 case Decl::CXXRecord:380 case Decl::ClassTemplateSpecialization:381 case Decl::ClassTemplatePartialSpecialization:382 case Decl::VarTemplateSpecialization:383 case Decl::VarTemplatePartialSpecialization:384 case Decl::Function:385 case Decl::CXXDeductionGuide:386 case Decl::CXXMethod:387 case Decl::CXXConstructor:388 case Decl::CXXDestructor:389 case Decl::CXXConversion:390 case Decl::UsingShadow:391 case Decl::ConstructorUsingShadow:392 case Decl::Var:393 case Decl::FunctionTemplate:394 case Decl::ClassTemplate:395 case Decl::VarTemplate:396 case Decl::TypeAliasTemplate:397 case Decl::ObjCProtocol:398 case Decl::ObjCInterface:399 case Decl::Empty:400 return true;401 402 // Never redeclarable.403 case Decl::UsingDirective:404 case Decl::Label:405 case Decl::UnresolvedUsingTypename:406 case Decl::TemplateTypeParm:407 case Decl::EnumConstant:408 case Decl::UnresolvedUsingValue:409 case Decl::IndirectField:410 case Decl::Field:411 case Decl::MSProperty:412 case Decl::MSGuid:413 case Decl::UnnamedGlobalConstant:414 case Decl::TemplateParamObject:415 case Decl::ObjCIvar:416 case Decl::ObjCAtDefsField:417 case Decl::NonTypeTemplateParm:418 case Decl::TemplateTemplateParm:419 case Decl::Using:420 case Decl::UsingEnum:421 case Decl::UsingPack:422 case Decl::ObjCMethod:423 case Decl::ObjCCategory:424 case Decl::ObjCCategoryImpl:425 case Decl::ObjCImplementation:426 case Decl::ObjCProperty:427 case Decl::ObjCCompatibleAlias:428 case Decl::LinkageSpec:429 case Decl::Export:430 case Decl::ObjCPropertyImpl:431 case Decl::PragmaComment:432 case Decl::PragmaDetectMismatch:433 case Decl::FileScopeAsm:434 case Decl::TopLevelStmt:435 case Decl::AccessSpec:436 case Decl::Friend:437 case Decl::FriendTemplate:438 case Decl::StaticAssert:439 case Decl::Block:440 case Decl::OutlinedFunction:441 case Decl::Captured:442 case Decl::Import:443 case Decl::OMPThreadPrivate:444 case Decl::OMPGroupPrivate:445 case Decl::OMPAllocate:446 case Decl::OMPRequires:447 case Decl::OMPCapturedExpr:448 case Decl::OMPDeclareReduction:449 case Decl::OMPDeclareMapper:450 case Decl::BuiltinTemplate:451 case Decl::Decomposition:452 case Decl::Binding:453 case Decl::Concept:454 case Decl::ImplicitConceptSpecialization:455 case Decl::LifetimeExtendedTemporary:456 case Decl::RequiresExprBody:457 case Decl::UnresolvedUsingIfExists:458 case Decl::HLSLBuffer:459 case Decl::HLSLRootSignature:460 case Decl::OpenACCDeclare:461 case Decl::OpenACCRoutine:462 return false;463 464 // These indirectly derive from Redeclarable<T> but are not actually465 // redeclarable.466 case Decl::ImplicitParam:467 case Decl::ParmVar:468 case Decl::ObjCTypeParam:469 return false;470 }471 472 llvm_unreachable("Unhandled declaration kind");473}474 475bool serialization::needsAnonymousDeclarationNumber(const NamedDecl *D) {476 // Friend declarations in dependent contexts aren't anonymous in the usual477 // sense, but they cannot be found by name lookup in their semantic context478 // (or indeed in any context), so we treat them as anonymous.479 //480 // This doesn't apply to friend tag decls; Sema makes those available to name481 // lookup in the surrounding context.482 if (D->getFriendObjectKind() &&483 D->getLexicalDeclContext()->isDependentContext() && !isa<TagDecl>(D)) {484 // For function templates and class templates, the template is numbered and485 // not its pattern.486 if (auto *FD = dyn_cast<FunctionDecl>(D))487 return !FD->getDescribedFunctionTemplate();488 if (auto *RD = dyn_cast<CXXRecordDecl>(D))489 return !RD->getDescribedClassTemplate();490 return true;491 }492 493 // At block scope, we number everything that we need to deduplicate, since we494 // can't just use name matching to keep things lined up.495 // FIXME: This is only necessary for an inline function or a template or496 // similar.497 if (D->getLexicalDeclContext()->isFunctionOrMethod()) {498 if (auto *VD = dyn_cast<VarDecl>(D))499 return VD->isStaticLocal();500 // FIXME: What about CapturedDecls (and declarations nested within them)?501 return isa<TagDecl, BlockDecl>(D);502 }503 504 // Otherwise, we only care about anonymous class members / block-scope decls.505 // FIXME: We need to handle blocks within inline / templated variables too.506 if (D->getDeclName())507 return false;508 if (!isa<RecordDecl, ObjCInterfaceDecl>(D->getLexicalDeclContext()))509 return false;510 return isa<TagDecl, FieldDecl>(D);511}512