ASTCommon.cpp revision 249423
1122207Sharti//===--- ASTCommon.cpp - Common stuff for ASTReader/ASTWriter----*- C++ -*-===// 2122207Sharti// 3122207Sharti// The LLVM Compiler Infrastructure 4122207Sharti// 5122207Sharti// This file is distributed under the University of Illinois Open Source 6122207Sharti// License. See LICENSE.TXT for details. 7122207Sharti// 8122207Sharti//===----------------------------------------------------------------------===// 9122207Sharti// 10122207Sharti// This file defines common functions that both ASTReader and ASTWriter use. 11122207Sharti// 12122207Sharti//===----------------------------------------------------------------------===// 13122207Sharti 14122207Sharti#include "ASTCommon.h" 15122207Sharti#include "clang/AST/DeclObjC.h" 16122207Sharti#include "clang/Basic/IdentifierTable.h" 17122207Sharti#include "clang/Serialization/ASTDeserializationListener.h" 18122207Sharti#include "llvm/ADT/StringExtras.h" 19122207Sharti 20122207Shartiusing namespace clang; 21122207Sharti 22122207Sharti// Give ASTDeserializationListener's VTable a home. 23122207ShartiASTDeserializationListener::~ASTDeserializationListener() { } 24122207Sharti 25122207Shartiserialization::TypeIdx 26122207Shartiserialization::TypeIdxFromBuiltin(const BuiltinType *BT) { 27122207Sharti unsigned ID = 0; 28122207Sharti switch (BT->getKind()) { 29122207Sharti case BuiltinType::Void: ID = PREDEF_TYPE_VOID_ID; break; 30122207Sharti case BuiltinType::Bool: ID = PREDEF_TYPE_BOOL_ID; break; 31122207Sharti case BuiltinType::Char_U: ID = PREDEF_TYPE_CHAR_U_ID; break; 32122207Sharti case BuiltinType::UChar: ID = PREDEF_TYPE_UCHAR_ID; break; 33122207Sharti case BuiltinType::UShort: ID = PREDEF_TYPE_USHORT_ID; break; 34122207Sharti case BuiltinType::UInt: ID = PREDEF_TYPE_UINT_ID; break; 35122207Sharti case BuiltinType::ULong: ID = PREDEF_TYPE_ULONG_ID; break; 36122207Sharti case BuiltinType::ULongLong: ID = PREDEF_TYPE_ULONGLONG_ID; break; 37122207Sharti case BuiltinType::UInt128: ID = PREDEF_TYPE_UINT128_ID; break; 38122207Sharti case BuiltinType::Char_S: ID = PREDEF_TYPE_CHAR_S_ID; break; 39122207Sharti case BuiltinType::SChar: ID = PREDEF_TYPE_SCHAR_ID; break; 40122207Sharti case BuiltinType::WChar_S: 41122207Sharti case BuiltinType::WChar_U: ID = PREDEF_TYPE_WCHAR_ID; break; 42122207Sharti case BuiltinType::Short: ID = PREDEF_TYPE_SHORT_ID; break; 43122207Sharti case BuiltinType::Int: ID = PREDEF_TYPE_INT_ID; break; 44122207Sharti case BuiltinType::Long: ID = PREDEF_TYPE_LONG_ID; break; 45122207Sharti case BuiltinType::LongLong: ID = PREDEF_TYPE_LONGLONG_ID; break; 46122207Sharti case BuiltinType::Int128: ID = PREDEF_TYPE_INT128_ID; break; 47122207Sharti case BuiltinType::Half: ID = PREDEF_TYPE_HALF_ID; break; 48122207Sharti case BuiltinType::Float: ID = PREDEF_TYPE_FLOAT_ID; break; 49122207Sharti case BuiltinType::Double: ID = PREDEF_TYPE_DOUBLE_ID; break; 50122207Sharti case BuiltinType::LongDouble: ID = PREDEF_TYPE_LONGDOUBLE_ID; break; 51122207Sharti case BuiltinType::NullPtr: ID = PREDEF_TYPE_NULLPTR_ID; break; 52122207Sharti case BuiltinType::Char16: ID = PREDEF_TYPE_CHAR16_ID; break; 53122207Sharti case BuiltinType::Char32: ID = PREDEF_TYPE_CHAR32_ID; break; 54122207Sharti case BuiltinType::Overload: ID = PREDEF_TYPE_OVERLOAD_ID; break; 55122207Sharti case BuiltinType::BoundMember:ID = PREDEF_TYPE_BOUND_MEMBER; break; 56122207Sharti case BuiltinType::PseudoObject:ID = PREDEF_TYPE_PSEUDO_OBJECT;break; 57122207Sharti case BuiltinType::Dependent: ID = PREDEF_TYPE_DEPENDENT_ID; break; 58122207Sharti case BuiltinType::UnknownAny: ID = PREDEF_TYPE_UNKNOWN_ANY; break; 59122207Sharti case BuiltinType::ARCUnbridgedCast: 60122207Sharti ID = PREDEF_TYPE_ARC_UNBRIDGED_CAST; break; 61122207Sharti case BuiltinType::ObjCId: ID = PREDEF_TYPE_OBJC_ID; break; 62122207Sharti case BuiltinType::ObjCClass: ID = PREDEF_TYPE_OBJC_CLASS; break; 63122207Sharti case BuiltinType::ObjCSel: ID = PREDEF_TYPE_OBJC_SEL; break; 64122207Sharti case BuiltinType::OCLImage1d: ID = PREDEF_TYPE_IMAGE1D_ID; break; 65122207Sharti case BuiltinType::OCLImage1dArray: ID = PREDEF_TYPE_IMAGE1D_ARR_ID; break; 66122207Sharti case BuiltinType::OCLImage1dBuffer: ID = PREDEF_TYPE_IMAGE1D_BUFF_ID; break; 67122207Sharti case BuiltinType::OCLImage2d: ID = PREDEF_TYPE_IMAGE2D_ID; break; 68122207Sharti case BuiltinType::OCLImage2dArray: ID = PREDEF_TYPE_IMAGE2D_ARR_ID; break; 69122207Sharti case BuiltinType::OCLImage3d: ID = PREDEF_TYPE_IMAGE3D_ID; break; 70122207Sharti case BuiltinType::OCLSampler: ID = PREDEF_TYPE_SAMPLER_ID; break; 71122207Sharti case BuiltinType::OCLEvent: ID = PREDEF_TYPE_EVENT_ID; break; 72122207Sharti case BuiltinType::BuiltinFn: 73122207Sharti ID = PREDEF_TYPE_BUILTIN_FN; break; 74122207Sharti 75122207Sharti } 76122207Sharti 77122207Sharti return TypeIdx(ID); 78122207Sharti} 79122207Sharti 80122207Shartiunsigned serialization::ComputeHash(Selector Sel) { 81122207Sharti unsigned N = Sel.getNumArgs(); 82122207Sharti if (N == 0) 83122207Sharti ++N; 84122207Sharti unsigned R = 5381; 85122207Sharti for (unsigned I = 0; I != N; ++I) 86122207Sharti if (IdentifierInfo *II = Sel.getIdentifierInfoForSlot(I)) 87122207Sharti R = llvm::HashString(II->getName(), R); 88122207Sharti return R; 89122207Sharti} 90122207Sharti 91122207Sharticonst DeclContext * 92122207Shartiserialization::getDefinitiveDeclContext(const DeclContext *DC) { 93122207Sharti switch (DC->getDeclKind()) { 94122207Sharti // These entities may have multiple definitions. 95122207Sharti case Decl::TranslationUnit: 96122207Sharti case Decl::Namespace: 97122207Sharti case Decl::LinkageSpec: 98122207Sharti return 0; 99122207Sharti 100122207Sharti // C/C++ tag types can only be defined in one place. 101122207Sharti case Decl::Enum: 102122207Sharti case Decl::Record: 103122207Sharti if (const TagDecl *Def = cast<TagDecl>(DC)->getDefinition()) 104122207Sharti return Def; 105122207Sharti return 0; 106122207Sharti 107122207Sharti // FIXME: These can be defined in one place... except special member 108122207Sharti // functions and out-of-line definitions. 109122207Sharti case Decl::CXXRecord: 110122207Sharti case Decl::ClassTemplateSpecialization: 111122207Sharti case Decl::ClassTemplatePartialSpecialization: 112122207Sharti return 0; 113122207Sharti 114122207Sharti // Each function, method, and block declaration is its own DeclContext. 115122207Sharti case Decl::Function: 116122207Sharti case Decl::CXXMethod: 117122207Sharti case Decl::CXXConstructor: 118122207Sharti case Decl::CXXDestructor: 119122207Sharti case Decl::CXXConversion: 120122207Sharti case Decl::ObjCMethod: 121122207Sharti case Decl::Block: 122122207Sharti // Objective C categories, category implementations, and class 123122207Sharti // implementations can only be defined in one place. 124122207Sharti case Decl::ObjCCategory: 125122207Sharti case Decl::ObjCCategoryImpl: 126122207Sharti case Decl::ObjCImplementation: 127122207Sharti return DC; 128122207Sharti 129122207Sharti case Decl::ObjCProtocol: 130122207Sharti if (const ObjCProtocolDecl *Def 131122207Sharti = cast<ObjCProtocolDecl>(DC)->getDefinition()) 132122207Sharti return Def; 133122207Sharti return 0; 134122207Sharti 135122207Sharti // FIXME: These are defined in one place, but properties in class extensions 136122207Sharti // end up being back-patched into the main interface. See 137122207Sharti // Sema::HandlePropertyInClassExtension for the offending code. 138122207Sharti case Decl::ObjCInterface: 139122207Sharti return 0; 140122207Sharti 141122207Sharti default: 142122207Sharti llvm_unreachable("Unhandled DeclContext in AST reader"); 143122207Sharti } 144122207Sharti 145122207Sharti llvm_unreachable("Unhandled decl kind"); 146122207Sharti} 147122207Sharti 148122207Shartibool serialization::isRedeclarableDeclKind(unsigned Kind) { 149122207Sharti switch (static_cast<Decl::Kind>(Kind)) { 150122207Sharti case Decl::TranslationUnit: // Special case of a "merged" declaration. 151122207Sharti case Decl::Namespace: 152122207Sharti case Decl::NamespaceAlias: // FIXME: Not yet redeclarable, but will be. 153122207Sharti case Decl::Typedef: 154122207Sharti case Decl::TypeAlias: 155122207Sharti case Decl::Enum: 156122207Sharti case Decl::Record: 157122207Sharti case Decl::CXXRecord: 158122207Sharti case Decl::ClassTemplateSpecialization: 159122207Sharti case Decl::ClassTemplatePartialSpecialization: 160122207Sharti case Decl::Function: 161122207Sharti case Decl::CXXMethod: 162122207Sharti case Decl::CXXConstructor: 163122207Sharti case Decl::CXXDestructor: 164122207Sharti case Decl::CXXConversion: 165122207Sharti case Decl::Var: 166122207Sharti case Decl::FunctionTemplate: 167122207Sharti case Decl::ClassTemplate: 168122207Sharti case Decl::TypeAliasTemplate: 169122207Sharti case Decl::ObjCProtocol: 170122207Sharti case Decl::ObjCInterface: 171122207Sharti case Decl::Empty: 172122207Sharti return true; 173122207Sharti 174122207Sharti // Never redeclarable. 175122207Sharti case Decl::UsingDirective: 176122207Sharti case Decl::Label: 177122207Sharti case Decl::UnresolvedUsingTypename: 178122207Sharti case Decl::TemplateTypeParm: 179122207Sharti case Decl::EnumConstant: 180122207Sharti case Decl::UnresolvedUsingValue: 181122207Sharti case Decl::IndirectField: 182122207Sharti case Decl::Field: 183122207Sharti case Decl::ObjCIvar: 184122207Sharti case Decl::ObjCAtDefsField: 185122207Sharti case Decl::ImplicitParam: 186122207Sharti case Decl::ParmVar: 187122207Sharti case Decl::NonTypeTemplateParm: 188122207Sharti case Decl::TemplateTemplateParm: 189122207Sharti case Decl::Using: 190122207Sharti case Decl::UsingShadow: 191122207Sharti case Decl::ObjCMethod: 192122207Sharti case Decl::ObjCCategory: 193122207Sharti case Decl::ObjCCategoryImpl: 194122207Sharti case Decl::ObjCImplementation: 195122207Sharti case Decl::ObjCProperty: 196122207Sharti case Decl::ObjCCompatibleAlias: 197122207Sharti case Decl::LinkageSpec: 198122207Sharti case Decl::ObjCPropertyImpl: 199122207Sharti case Decl::FileScopeAsm: 200122207Sharti case Decl::AccessSpec: 201122207Sharti case Decl::Friend: 202122207Sharti case Decl::FriendTemplate: 203122207Sharti case Decl::StaticAssert: 204122207Sharti case Decl::Block: 205122207Sharti case Decl::ClassScopeFunctionSpecialization: 206122207Sharti case Decl::Import: 207122207Sharti case Decl::OMPThreadPrivate: 208122207Sharti return false; 209122207Sharti } 210122207Sharti 211122207Sharti llvm_unreachable("Unhandled declaration kind"); 212122207Sharti} 213122207Sharti