1212795Sdim//===--- ASTCommon.cpp - Common stuff for ASTReader/ASTWriter----*- C++ -*-===// 2212795Sdim// 3212795Sdim// The LLVM Compiler Infrastructure 4212795Sdim// 5212795Sdim// This file is distributed under the University of Illinois Open Source 6212795Sdim// License. See LICENSE.TXT for details. 7212795Sdim// 8212795Sdim//===----------------------------------------------------------------------===// 9212795Sdim// 10212795Sdim// This file defines common functions that both ASTReader and ASTWriter use. 11212795Sdim// 12212795Sdim//===----------------------------------------------------------------------===// 13212795Sdim 14212795Sdim#include "ASTCommon.h" 15252723Sdim#include "clang/AST/DeclObjC.h" 16252723Sdim#include "clang/Basic/IdentifierTable.h" 17218893Sdim#include "clang/Serialization/ASTDeserializationListener.h" 18212795Sdim#include "llvm/ADT/StringExtras.h" 19212795Sdim 20212795Sdimusing namespace clang; 21212795Sdim 22218893Sdim// Give ASTDeserializationListener's VTable a home. 23218893SdimASTDeserializationListener::~ASTDeserializationListener() { } 24218893Sdim 25212795Sdimserialization::TypeIdx 26212795Sdimserialization::TypeIdxFromBuiltin(const BuiltinType *BT) { 27212795Sdim unsigned ID = 0; 28212795Sdim switch (BT->getKind()) { 29212795Sdim case BuiltinType::Void: ID = PREDEF_TYPE_VOID_ID; break; 30212795Sdim case BuiltinType::Bool: ID = PREDEF_TYPE_BOOL_ID; break; 31212795Sdim case BuiltinType::Char_U: ID = PREDEF_TYPE_CHAR_U_ID; break; 32212795Sdim case BuiltinType::UChar: ID = PREDEF_TYPE_UCHAR_ID; break; 33212795Sdim case BuiltinType::UShort: ID = PREDEF_TYPE_USHORT_ID; break; 34212795Sdim case BuiltinType::UInt: ID = PREDEF_TYPE_UINT_ID; break; 35212795Sdim case BuiltinType::ULong: ID = PREDEF_TYPE_ULONG_ID; break; 36212795Sdim case BuiltinType::ULongLong: ID = PREDEF_TYPE_ULONGLONG_ID; break; 37212795Sdim case BuiltinType::UInt128: ID = PREDEF_TYPE_UINT128_ID; break; 38212795Sdim case BuiltinType::Char_S: ID = PREDEF_TYPE_CHAR_S_ID; break; 39212795Sdim case BuiltinType::SChar: ID = PREDEF_TYPE_SCHAR_ID; break; 40218893Sdim case BuiltinType::WChar_S: 41218893Sdim case BuiltinType::WChar_U: ID = PREDEF_TYPE_WCHAR_ID; break; 42212795Sdim case BuiltinType::Short: ID = PREDEF_TYPE_SHORT_ID; break; 43212795Sdim case BuiltinType::Int: ID = PREDEF_TYPE_INT_ID; break; 44212795Sdim case BuiltinType::Long: ID = PREDEF_TYPE_LONG_ID; break; 45212795Sdim case BuiltinType::LongLong: ID = PREDEF_TYPE_LONGLONG_ID; break; 46212795Sdim case BuiltinType::Int128: ID = PREDEF_TYPE_INT128_ID; break; 47226890Sdim case BuiltinType::Half: ID = PREDEF_TYPE_HALF_ID; break; 48212795Sdim case BuiltinType::Float: ID = PREDEF_TYPE_FLOAT_ID; break; 49212795Sdim case BuiltinType::Double: ID = PREDEF_TYPE_DOUBLE_ID; break; 50212795Sdim case BuiltinType::LongDouble: ID = PREDEF_TYPE_LONGDOUBLE_ID; break; 51212795Sdim case BuiltinType::NullPtr: ID = PREDEF_TYPE_NULLPTR_ID; break; 52212795Sdim case BuiltinType::Char16: ID = PREDEF_TYPE_CHAR16_ID; break; 53212795Sdim case BuiltinType::Char32: ID = PREDEF_TYPE_CHAR32_ID; break; 54212795Sdim case BuiltinType::Overload: ID = PREDEF_TYPE_OVERLOAD_ID; break; 55221345Sdim case BuiltinType::BoundMember:ID = PREDEF_TYPE_BOUND_MEMBER; break; 56235633Sdim case BuiltinType::PseudoObject:ID = PREDEF_TYPE_PSEUDO_OBJECT;break; 57212795Sdim case BuiltinType::Dependent: ID = PREDEF_TYPE_DEPENDENT_ID; break; 58221345Sdim case BuiltinType::UnknownAny: ID = PREDEF_TYPE_UNKNOWN_ANY; break; 59235633Sdim case BuiltinType::ARCUnbridgedCast: 60235633Sdim ID = PREDEF_TYPE_ARC_UNBRIDGED_CAST; break; 61212795Sdim case BuiltinType::ObjCId: ID = PREDEF_TYPE_OBJC_ID; break; 62212795Sdim case BuiltinType::ObjCClass: ID = PREDEF_TYPE_OBJC_CLASS; break; 63212795Sdim case BuiltinType::ObjCSel: ID = PREDEF_TYPE_OBJC_SEL; break; 64252723Sdim case BuiltinType::OCLImage1d: ID = PREDEF_TYPE_IMAGE1D_ID; break; 65252723Sdim case BuiltinType::OCLImage1dArray: ID = PREDEF_TYPE_IMAGE1D_ARR_ID; break; 66252723Sdim case BuiltinType::OCLImage1dBuffer: ID = PREDEF_TYPE_IMAGE1D_BUFF_ID; break; 67252723Sdim case BuiltinType::OCLImage2d: ID = PREDEF_TYPE_IMAGE2D_ID; break; 68252723Sdim case BuiltinType::OCLImage2dArray: ID = PREDEF_TYPE_IMAGE2D_ARR_ID; break; 69252723Sdim case BuiltinType::OCLImage3d: ID = PREDEF_TYPE_IMAGE3D_ID; break; 70252723Sdim case BuiltinType::OCLSampler: ID = PREDEF_TYPE_SAMPLER_ID; break; 71252723Sdim case BuiltinType::OCLEvent: ID = PREDEF_TYPE_EVENT_ID; break; 72245431Sdim case BuiltinType::BuiltinFn: 73245431Sdim ID = PREDEF_TYPE_BUILTIN_FN; break; 74245431Sdim 75212795Sdim } 76212795Sdim 77212795Sdim return TypeIdx(ID); 78212795Sdim} 79212795Sdim 80212795Sdimunsigned serialization::ComputeHash(Selector Sel) { 81212795Sdim unsigned N = Sel.getNumArgs(); 82212795Sdim if (N == 0) 83212795Sdim ++N; 84212795Sdim unsigned R = 5381; 85212795Sdim for (unsigned I = 0; I != N; ++I) 86212795Sdim if (IdentifierInfo *II = Sel.getIdentifierInfoForSlot(I)) 87212795Sdim R = llvm::HashString(II->getName(), R); 88212795Sdim return R; 89212795Sdim} 90252723Sdim 91252723Sdimconst DeclContext * 92252723Sdimserialization::getDefinitiveDeclContext(const DeclContext *DC) { 93252723Sdim switch (DC->getDeclKind()) { 94252723Sdim // These entities may have multiple definitions. 95252723Sdim case Decl::TranslationUnit: 96252723Sdim case Decl::Namespace: 97252723Sdim case Decl::LinkageSpec: 98252723Sdim return 0; 99252723Sdim 100252723Sdim // C/C++ tag types can only be defined in one place. 101252723Sdim case Decl::Enum: 102252723Sdim case Decl::Record: 103252723Sdim if (const TagDecl *Def = cast<TagDecl>(DC)->getDefinition()) 104252723Sdim return Def; 105252723Sdim return 0; 106252723Sdim 107252723Sdim // FIXME: These can be defined in one place... except special member 108252723Sdim // functions and out-of-line definitions. 109252723Sdim case Decl::CXXRecord: 110252723Sdim case Decl::ClassTemplateSpecialization: 111252723Sdim case Decl::ClassTemplatePartialSpecialization: 112252723Sdim return 0; 113252723Sdim 114252723Sdim // Each function, method, and block declaration is its own DeclContext. 115252723Sdim case Decl::Function: 116252723Sdim case Decl::CXXMethod: 117252723Sdim case Decl::CXXConstructor: 118252723Sdim case Decl::CXXDestructor: 119252723Sdim case Decl::CXXConversion: 120252723Sdim case Decl::ObjCMethod: 121252723Sdim case Decl::Block: 122252723Sdim case Decl::Captured: 123252723Sdim // Objective C categories, category implementations, and class 124252723Sdim // implementations can only be defined in one place. 125252723Sdim case Decl::ObjCCategory: 126252723Sdim case Decl::ObjCCategoryImpl: 127252723Sdim case Decl::ObjCImplementation: 128252723Sdim return DC; 129252723Sdim 130252723Sdim case Decl::ObjCProtocol: 131252723Sdim if (const ObjCProtocolDecl *Def 132252723Sdim = cast<ObjCProtocolDecl>(DC)->getDefinition()) 133252723Sdim return Def; 134252723Sdim return 0; 135252723Sdim 136252723Sdim // FIXME: These are defined in one place, but properties in class extensions 137252723Sdim // end up being back-patched into the main interface. See 138252723Sdim // Sema::HandlePropertyInClassExtension for the offending code. 139252723Sdim case Decl::ObjCInterface: 140252723Sdim return 0; 141252723Sdim 142252723Sdim default: 143252723Sdim llvm_unreachable("Unhandled DeclContext in AST reader"); 144252723Sdim } 145252723Sdim 146252723Sdim llvm_unreachable("Unhandled decl kind"); 147252723Sdim} 148252723Sdim 149252723Sdimbool serialization::isRedeclarableDeclKind(unsigned Kind) { 150252723Sdim switch (static_cast<Decl::Kind>(Kind)) { 151252723Sdim case Decl::TranslationUnit: // Special case of a "merged" declaration. 152252723Sdim case Decl::Namespace: 153252723Sdim case Decl::NamespaceAlias: // FIXME: Not yet redeclarable, but will be. 154252723Sdim case Decl::Typedef: 155252723Sdim case Decl::TypeAlias: 156252723Sdim case Decl::Enum: 157252723Sdim case Decl::Record: 158252723Sdim case Decl::CXXRecord: 159252723Sdim case Decl::ClassTemplateSpecialization: 160252723Sdim case Decl::ClassTemplatePartialSpecialization: 161263509Sdim case Decl::VarTemplateSpecialization: 162263509Sdim case Decl::VarTemplatePartialSpecialization: 163252723Sdim case Decl::Function: 164252723Sdim case Decl::CXXMethod: 165252723Sdim case Decl::CXXConstructor: 166252723Sdim case Decl::CXXDestructor: 167252723Sdim case Decl::CXXConversion: 168263509Sdim case Decl::UsingShadow: 169252723Sdim case Decl::Var: 170252723Sdim case Decl::FunctionTemplate: 171252723Sdim case Decl::ClassTemplate: 172263509Sdim case Decl::VarTemplate: 173252723Sdim case Decl::TypeAliasTemplate: 174252723Sdim case Decl::ObjCProtocol: 175252723Sdim case Decl::ObjCInterface: 176252723Sdim case Decl::Empty: 177252723Sdim return true; 178252723Sdim 179252723Sdim // Never redeclarable. 180252723Sdim case Decl::UsingDirective: 181252723Sdim case Decl::Label: 182252723Sdim case Decl::UnresolvedUsingTypename: 183252723Sdim case Decl::TemplateTypeParm: 184252723Sdim case Decl::EnumConstant: 185252723Sdim case Decl::UnresolvedUsingValue: 186252723Sdim case Decl::IndirectField: 187252723Sdim case Decl::Field: 188252723Sdim case Decl::MSProperty: 189252723Sdim case Decl::ObjCIvar: 190252723Sdim case Decl::ObjCAtDefsField: 191252723Sdim case Decl::ImplicitParam: 192252723Sdim case Decl::ParmVar: 193252723Sdim case Decl::NonTypeTemplateParm: 194252723Sdim case Decl::TemplateTemplateParm: 195252723Sdim case Decl::Using: 196252723Sdim case Decl::ObjCMethod: 197252723Sdim case Decl::ObjCCategory: 198252723Sdim case Decl::ObjCCategoryImpl: 199252723Sdim case Decl::ObjCImplementation: 200252723Sdim case Decl::ObjCProperty: 201252723Sdim case Decl::ObjCCompatibleAlias: 202252723Sdim case Decl::LinkageSpec: 203252723Sdim case Decl::ObjCPropertyImpl: 204252723Sdim case Decl::FileScopeAsm: 205252723Sdim case Decl::AccessSpec: 206252723Sdim case Decl::Friend: 207252723Sdim case Decl::FriendTemplate: 208252723Sdim case Decl::StaticAssert: 209252723Sdim case Decl::Block: 210252723Sdim case Decl::Captured: 211252723Sdim case Decl::ClassScopeFunctionSpecialization: 212252723Sdim case Decl::Import: 213252723Sdim case Decl::OMPThreadPrivate: 214252723Sdim return false; 215252723Sdim } 216252723Sdim 217252723Sdim llvm_unreachable("Unhandled declaration kind"); 218252723Sdim} 219