brintos

brintos / llvm-project-archived public Read only

0
0
Text · 14.9 KiB · 69db02f Raw
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