Home | History | Annotate | Line # | Download | only in Serialization
      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-exception
      6 //
      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 
     20 using namespace clang;
     21 
     22 // Give ASTDeserializationListener's VTable a home.
     23 ASTDeserializationListener::~ASTDeserializationListener() { }
     24 
     25 serialization::TypeIdx
     26 serialization::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::NullPtr:
    172     ID = PREDEF_TYPE_NULLPTR_ID;
    173     break;
    174   case BuiltinType::Char8:
    175     ID = PREDEF_TYPE_CHAR8_ID;
    176     break;
    177   case BuiltinType::Char16:
    178     ID = PREDEF_TYPE_CHAR16_ID;
    179     break;
    180   case BuiltinType::Char32:
    181     ID = PREDEF_TYPE_CHAR32_ID;
    182     break;
    183   case BuiltinType::Overload:
    184     ID = PREDEF_TYPE_OVERLOAD_ID;
    185     break;
    186   case BuiltinType::BoundMember:
    187     ID = PREDEF_TYPE_BOUND_MEMBER;
    188     break;
    189   case BuiltinType::PseudoObject:
    190     ID = PREDEF_TYPE_PSEUDO_OBJECT;
    191     break;
    192   case BuiltinType::Dependent:
    193     ID = PREDEF_TYPE_DEPENDENT_ID;
    194     break;
    195   case BuiltinType::UnknownAny:
    196     ID = PREDEF_TYPE_UNKNOWN_ANY;
    197     break;
    198   case BuiltinType::ARCUnbridgedCast:
    199     ID = PREDEF_TYPE_ARC_UNBRIDGED_CAST;
    200     break;
    201   case BuiltinType::ObjCId:
    202     ID = PREDEF_TYPE_OBJC_ID;
    203     break;
    204   case BuiltinType::ObjCClass:
    205     ID = PREDEF_TYPE_OBJC_CLASS;
    206     break;
    207   case BuiltinType::ObjCSel:
    208     ID = PREDEF_TYPE_OBJC_SEL;
    209     break;
    210 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
    211   case BuiltinType::Id: \
    212     ID = PREDEF_TYPE_##Id##_ID; \
    213     break;
    214 #include "clang/Basic/OpenCLImageTypes.def"
    215 #define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
    216   case BuiltinType::Id: \
    217     ID = PREDEF_TYPE_##Id##_ID; \
    218     break;
    219 #include "clang/Basic/OpenCLExtensionTypes.def"
    220   case BuiltinType::OCLSampler:
    221     ID = PREDEF_TYPE_SAMPLER_ID;
    222     break;
    223   case BuiltinType::OCLEvent:
    224     ID = PREDEF_TYPE_EVENT_ID;
    225     break;
    226   case BuiltinType::OCLClkEvent:
    227     ID = PREDEF_TYPE_CLK_EVENT_ID;
    228     break;
    229   case BuiltinType::OCLQueue:
    230     ID = PREDEF_TYPE_QUEUE_ID;
    231     break;
    232   case BuiltinType::OCLReserveID:
    233     ID = PREDEF_TYPE_RESERVE_ID_ID;
    234     break;
    235 #define SVE_TYPE(Name, Id, SingletonId) \
    236   case BuiltinType::Id: \
    237     ID = PREDEF_TYPE_##Id##_ID; \
    238     break;
    239 #include "clang/Basic/AArch64SVEACLETypes.def"
    240 #define PPC_VECTOR_TYPE(Name, Id, Size) \
    241   case BuiltinType::Id: \
    242     ID = PREDEF_TYPE_##Id##_ID; \
    243     break;
    244 #include "clang/Basic/PPCTypes.def"
    245 #define RVV_TYPE(Name, Id, SingletonId)                                        \
    246   case BuiltinType::Id:                                                        \
    247     ID = PREDEF_TYPE_##Id##_ID;                                                \
    248     break;
    249 #include "clang/Basic/RISCVVTypes.def"
    250   case BuiltinType::BuiltinFn:
    251     ID = PREDEF_TYPE_BUILTIN_FN;
    252     break;
    253   case BuiltinType::IncompleteMatrixIdx:
    254     ID = PREDEF_TYPE_INCOMPLETE_MATRIX_IDX;
    255     break;
    256   case BuiltinType::OMPArraySection:
    257     ID = PREDEF_TYPE_OMP_ARRAY_SECTION;
    258     break;
    259   case BuiltinType::OMPArrayShaping:
    260     ID = PREDEF_TYPE_OMP_ARRAY_SHAPING;
    261     break;
    262   case BuiltinType::OMPIterator:
    263     ID = PREDEF_TYPE_OMP_ITERATOR;
    264     break;
    265   case BuiltinType::BFloat16:
    266     ID = PREDEF_TYPE_BFLOAT16_ID;
    267     break;
    268   }
    269 
    270   return TypeIdx(ID);
    271 }
    272 
    273 unsigned serialization::ComputeHash(Selector Sel) {
    274   unsigned N = Sel.getNumArgs();
    275   if (N == 0)
    276     ++N;
    277   unsigned R = 5381;
    278   for (unsigned I = 0; I != N; ++I)
    279     if (IdentifierInfo *II = Sel.getIdentifierInfoForSlot(I))
    280       R = llvm::djbHash(II->getName(), R);
    281   return R;
    282 }
    283 
    284 const DeclContext *
    285 serialization::getDefinitiveDeclContext(const DeclContext *DC) {
    286   switch (DC->getDeclKind()) {
    287   // These entities may have multiple definitions.
    288   case Decl::TranslationUnit:
    289   case Decl::ExternCContext:
    290   case Decl::Namespace:
    291   case Decl::LinkageSpec:
    292   case Decl::Export:
    293     return nullptr;
    294 
    295   // C/C++ tag types can only be defined in one place.
    296   case Decl::Enum:
    297   case Decl::Record:
    298     if (const TagDecl *Def = cast<TagDecl>(DC)->getDefinition())
    299       return Def;
    300     return nullptr;
    301 
    302   // FIXME: These can be defined in one place... except special member
    303   // functions and out-of-line definitions.
    304   case Decl::CXXRecord:
    305   case Decl::ClassTemplateSpecialization:
    306   case Decl::ClassTemplatePartialSpecialization:
    307     return nullptr;
    308 
    309   // Each function, method, and block declaration is its own DeclContext.
    310   case Decl::Function:
    311   case Decl::CXXMethod:
    312   case Decl::CXXConstructor:
    313   case Decl::CXXDestructor:
    314   case Decl::CXXConversion:
    315   case Decl::ObjCMethod:
    316   case Decl::Block:
    317   case Decl::Captured:
    318     // Objective C categories, category implementations, and class
    319     // implementations can only be defined in one place.
    320   case Decl::ObjCCategory:
    321   case Decl::ObjCCategoryImpl:
    322   case Decl::ObjCImplementation:
    323     return DC;
    324 
    325   case Decl::ObjCProtocol:
    326     if (const ObjCProtocolDecl *Def
    327           = cast<ObjCProtocolDecl>(DC)->getDefinition())
    328       return Def;
    329     return nullptr;
    330 
    331   // FIXME: These are defined in one place, but properties in class extensions
    332   // end up being back-patched into the main interface. See
    333   // Sema::HandlePropertyInClassExtension for the offending code.
    334   case Decl::ObjCInterface:
    335     return nullptr;
    336 
    337   default:
    338     llvm_unreachable("Unhandled DeclContext in AST reader");
    339   }
    340 
    341   llvm_unreachable("Unhandled decl kind");
    342 }
    343 
    344 bool serialization::isRedeclarableDeclKind(unsigned Kind) {
    345   switch (static_cast<Decl::Kind>(Kind)) {
    346   case Decl::TranslationUnit:
    347   case Decl::ExternCContext:
    348     // Special case of a "merged" declaration.
    349     return true;
    350 
    351   case Decl::Namespace:
    352   case Decl::NamespaceAlias:
    353   case Decl::Typedef:
    354   case Decl::TypeAlias:
    355   case Decl::Enum:
    356   case Decl::Record:
    357   case Decl::CXXRecord:
    358   case Decl::ClassTemplateSpecialization:
    359   case Decl::ClassTemplatePartialSpecialization:
    360   case Decl::VarTemplateSpecialization:
    361   case Decl::VarTemplatePartialSpecialization:
    362   case Decl::Function:
    363   case Decl::CXXDeductionGuide:
    364   case Decl::CXXMethod:
    365   case Decl::CXXConstructor:
    366   case Decl::CXXDestructor:
    367   case Decl::CXXConversion:
    368   case Decl::UsingShadow:
    369   case Decl::ConstructorUsingShadow:
    370   case Decl::Var:
    371   case Decl::FunctionTemplate:
    372   case Decl::ClassTemplate:
    373   case Decl::VarTemplate:
    374   case Decl::TypeAliasTemplate:
    375   case Decl::ObjCProtocol:
    376   case Decl::ObjCInterface:
    377   case Decl::Empty:
    378     return true;
    379 
    380   // Never redeclarable.
    381   case Decl::UsingDirective:
    382   case Decl::Label:
    383   case Decl::UnresolvedUsingTypename:
    384   case Decl::TemplateTypeParm:
    385   case Decl::EnumConstant:
    386   case Decl::UnresolvedUsingValue:
    387   case Decl::IndirectField:
    388   case Decl::Field:
    389   case Decl::MSProperty:
    390   case Decl::MSGuid:
    391   case Decl::TemplateParamObject:
    392   case Decl::ObjCIvar:
    393   case Decl::ObjCAtDefsField:
    394   case Decl::NonTypeTemplateParm:
    395   case Decl::TemplateTemplateParm:
    396   case Decl::Using:
    397   case Decl::UsingPack:
    398   case Decl::ObjCMethod:
    399   case Decl::ObjCCategory:
    400   case Decl::ObjCCategoryImpl:
    401   case Decl::ObjCImplementation:
    402   case Decl::ObjCProperty:
    403   case Decl::ObjCCompatibleAlias:
    404   case Decl::LinkageSpec:
    405   case Decl::Export:
    406   case Decl::ObjCPropertyImpl:
    407   case Decl::PragmaComment:
    408   case Decl::PragmaDetectMismatch:
    409   case Decl::FileScopeAsm:
    410   case Decl::AccessSpec:
    411   case Decl::Friend:
    412   case Decl::FriendTemplate:
    413   case Decl::StaticAssert:
    414   case Decl::Block:
    415   case Decl::Captured:
    416   case Decl::ClassScopeFunctionSpecialization:
    417   case Decl::Import:
    418   case Decl::OMPThreadPrivate:
    419   case Decl::OMPAllocate:
    420   case Decl::OMPRequires:
    421   case Decl::OMPCapturedExpr:
    422   case Decl::OMPDeclareReduction:
    423   case Decl::OMPDeclareMapper:
    424   case Decl::BuiltinTemplate:
    425   case Decl::Decomposition:
    426   case Decl::Binding:
    427   case Decl::Concept:
    428   case Decl::LifetimeExtendedTemporary:
    429   case Decl::RequiresExprBody:
    430     return false;
    431 
    432   // These indirectly derive from Redeclarable<T> but are not actually
    433   // redeclarable.
    434   case Decl::ImplicitParam:
    435   case Decl::ParmVar:
    436   case Decl::ObjCTypeParam:
    437     return false;
    438   }
    439 
    440   llvm_unreachable("Unhandled declaration kind");
    441 }
    442 
    443 bool serialization::needsAnonymousDeclarationNumber(const NamedDecl *D) {
    444   // Friend declarations in dependent contexts aren't anonymous in the usual
    445   // sense, but they cannot be found by name lookup in their semantic context
    446   // (or indeed in any context), so we treat them as anonymous.
    447   //
    448   // This doesn't apply to friend tag decls; Sema makes those available to name
    449   // lookup in the surrounding context.
    450   if (D->getFriendObjectKind() &&
    451       D->getLexicalDeclContext()->isDependentContext() && !isa<TagDecl>(D)) {
    452     // For function templates and class templates, the template is numbered and
    453     // not its pattern.
    454     if (auto *FD = dyn_cast<FunctionDecl>(D))
    455       return !FD->getDescribedFunctionTemplate();
    456     if (auto *RD = dyn_cast<CXXRecordDecl>(D))
    457       return !RD->getDescribedClassTemplate();
    458     return true;
    459   }
    460 
    461   // At block scope, we number everything that we need to deduplicate, since we
    462   // can't just use name matching to keep things lined up.
    463   // FIXME: This is only necessary for an inline function or a template or
    464   // similar.
    465   if (D->getLexicalDeclContext()->isFunctionOrMethod()) {
    466     if (auto *VD = dyn_cast<VarDecl>(D))
    467       return VD->isStaticLocal();
    468     // FIXME: What about CapturedDecls (and declarations nested within them)?
    469     return isa<TagDecl>(D) || isa<BlockDecl>(D);
    470   }
    471 
    472   // Otherwise, we only care about anonymous class members / block-scope decls.
    473   // FIXME: We need to handle lambdas and blocks within inline / templated
    474   // variables too.
    475   if (D->getDeclName() || !isa<CXXRecordDecl>(D->getLexicalDeclContext()))
    476     return false;
    477   return isa<TagDecl>(D) || isa<FieldDecl>(D);
    478 }
    479