ASTCommon.cpp revision 251662
1185377Ssam//===--- ASTCommon.cpp - Common stuff for ASTReader/ASTWriter----*- C++ -*-===// 2185377Ssam// 3185377Ssam// The LLVM Compiler Infrastructure 4185377Ssam// 5185377Ssam// This file is distributed under the University of Illinois Open Source 6185377Ssam// License. See LICENSE.TXT for details. 7185377Ssam// 8185377Ssam//===----------------------------------------------------------------------===// 9185377Ssam// 10185377Ssam// This file defines common functions that both ASTReader and ASTWriter use. 11185377Ssam// 12185377Ssam//===----------------------------------------------------------------------===// 13185377Ssam 14185377Ssam#include "ASTCommon.h" 15185377Ssam#include "clang/AST/DeclObjC.h" 16185377Ssam#include "clang/Basic/IdentifierTable.h" 17204644Srpaulo#include "clang/Serialization/ASTDeserializationListener.h" 18185377Ssam#include "llvm/ADT/StringExtras.h" 19185377Ssam 20185377Ssamusing namespace clang; 21185377Ssam 22185377Ssam// Give ASTDeserializationListener's VTable a home. 23185377SsamASTDeserializationListener::~ASTDeserializationListener() { } 24185377Ssam 25185377Ssamserialization::TypeIdx 26185377Ssamserialization::TypeIdxFromBuiltin(const BuiltinType *BT) { 27185377Ssam unsigned ID = 0; 28185377Ssam switch (BT->getKind()) { 29185377Ssam case BuiltinType::Void: ID = PREDEF_TYPE_VOID_ID; break; 30185377Ssam case BuiltinType::Bool: ID = PREDEF_TYPE_BOOL_ID; break; 31185377Ssam case BuiltinType::Char_U: ID = PREDEF_TYPE_CHAR_U_ID; break; 32185377Ssam case BuiltinType::UChar: ID = PREDEF_TYPE_UCHAR_ID; break; 33185377Ssam case BuiltinType::UShort: ID = PREDEF_TYPE_USHORT_ID; break; 34185377Ssam case BuiltinType::UInt: ID = PREDEF_TYPE_UINT_ID; break; 35185377Ssam case BuiltinType::ULong: ID = PREDEF_TYPE_ULONG_ID; break; 36185377Ssam case BuiltinType::ULongLong: ID = PREDEF_TYPE_ULONGLONG_ID; break; 37185377Ssam case BuiltinType::UInt128: ID = PREDEF_TYPE_UINT128_ID; break; 38185377Ssam case BuiltinType::Char_S: ID = PREDEF_TYPE_CHAR_S_ID; break; 39185377Ssam case BuiltinType::SChar: ID = PREDEF_TYPE_SCHAR_ID; break; 40185377Ssam case BuiltinType::WChar_S: 41185377Ssam case BuiltinType::WChar_U: ID = PREDEF_TYPE_WCHAR_ID; break; 42185377Ssam case BuiltinType::Short: ID = PREDEF_TYPE_SHORT_ID; break; 43185377Ssam case BuiltinType::Int: ID = PREDEF_TYPE_INT_ID; break; 44185377Ssam case BuiltinType::Long: ID = PREDEF_TYPE_LONG_ID; break; 45185377Ssam case BuiltinType::LongLong: ID = PREDEF_TYPE_LONGLONG_ID; break; 46185377Ssam case BuiltinType::Int128: ID = PREDEF_TYPE_INT128_ID; break; 47185377Ssam case BuiltinType::Half: ID = PREDEF_TYPE_HALF_ID; break; 48185377Ssam case BuiltinType::Float: ID = PREDEF_TYPE_FLOAT_ID; break; 49185377Ssam case BuiltinType::Double: ID = PREDEF_TYPE_DOUBLE_ID; break; 50185377Ssam case BuiltinType::LongDouble: ID = PREDEF_TYPE_LONGDOUBLE_ID; break; 51185377Ssam case BuiltinType::NullPtr: ID = PREDEF_TYPE_NULLPTR_ID; break; 52185377Ssam case BuiltinType::Char16: ID = PREDEF_TYPE_CHAR16_ID; break; 53185377Ssam case BuiltinType::Char32: ID = PREDEF_TYPE_CHAR32_ID; break; 54185377Ssam case BuiltinType::Overload: ID = PREDEF_TYPE_OVERLOAD_ID; break; 55185377Ssam case BuiltinType::BoundMember:ID = PREDEF_TYPE_BOUND_MEMBER; break; 56185377Ssam case BuiltinType::PseudoObject:ID = PREDEF_TYPE_PSEUDO_OBJECT;break; 57185377Ssam case BuiltinType::Dependent: ID = PREDEF_TYPE_DEPENDENT_ID; break; 58185377Ssam case BuiltinType::UnknownAny: ID = PREDEF_TYPE_UNKNOWN_ANY; break; 59185377Ssam case BuiltinType::ARCUnbridgedCast: 60185377Ssam ID = PREDEF_TYPE_ARC_UNBRIDGED_CAST; break; 61185377Ssam case BuiltinType::ObjCId: ID = PREDEF_TYPE_OBJC_ID; break; 62185377Ssam case BuiltinType::ObjCClass: ID = PREDEF_TYPE_OBJC_CLASS; break; 63185377Ssam case BuiltinType::ObjCSel: ID = PREDEF_TYPE_OBJC_SEL; break; 64185377Ssam case BuiltinType::OCLImage1d: ID = PREDEF_TYPE_IMAGE1D_ID; break; 65185377Ssam case BuiltinType::OCLImage1dArray: ID = PREDEF_TYPE_IMAGE1D_ARR_ID; break; 66185377Ssam case BuiltinType::OCLImage1dBuffer: ID = PREDEF_TYPE_IMAGE1D_BUFF_ID; break; 67185377Ssam case BuiltinType::OCLImage2d: ID = PREDEF_TYPE_IMAGE2D_ID; break; 68185377Ssam case BuiltinType::OCLImage2dArray: ID = PREDEF_TYPE_IMAGE2D_ARR_ID; break; 69185377Ssam case BuiltinType::OCLImage3d: ID = PREDEF_TYPE_IMAGE3D_ID; break; 70185377Ssam case BuiltinType::OCLSampler: ID = PREDEF_TYPE_SAMPLER_ID; break; 71185377Ssam case BuiltinType::OCLEvent: ID = PREDEF_TYPE_EVENT_ID; break; 72185377Ssam case BuiltinType::BuiltinFn: 73185377Ssam ID = PREDEF_TYPE_BUILTIN_FN; break; 74185377Ssam 75185377Ssam } 76185377Ssam 77185377Ssam return TypeIdx(ID); 78185377Ssam} 79185377Ssam 80185377Ssamunsigned serialization::ComputeHash(Selector Sel) { 81185377Ssam unsigned N = Sel.getNumArgs(); 82185377Ssam if (N == 0) 83185377Ssam ++N; 84185377Ssam unsigned R = 5381; 85185377Ssam for (unsigned I = 0; I != N; ++I) 86185377Ssam if (IdentifierInfo *II = Sel.getIdentifierInfoForSlot(I)) 87185377Ssam R = llvm::HashString(II->getName(), R); 88185377Ssam return R; 89185377Ssam} 90185377Ssam 91185377Ssamconst DeclContext * 92185377Ssamserialization::getDefinitiveDeclContext(const DeclContext *DC) { 93185377Ssam switch (DC->getDeclKind()) { 94185377Ssam // These entities may have multiple definitions. 95185377Ssam case Decl::TranslationUnit: 96185377Ssam case Decl::Namespace: 97185377Ssam case Decl::LinkageSpec: 98185377Ssam return 0; 99185377Ssam 100185377Ssam // C/C++ tag types can only be defined in one place. 101185377Ssam case Decl::Enum: 102185377Ssam case Decl::Record: 103185377Ssam if (const TagDecl *Def = cast<TagDecl>(DC)->getDefinition()) 104185377Ssam return Def; 105185377Ssam return 0; 106185377Ssam 107185377Ssam // FIXME: These can be defined in one place... except special member 108185377Ssam // functions and out-of-line definitions. 109185377Ssam case Decl::CXXRecord: 110185377Ssam case Decl::ClassTemplateSpecialization: 111185377Ssam case Decl::ClassTemplatePartialSpecialization: 112185377Ssam return 0; 113185377Ssam 114185377Ssam // Each function, method, and block declaration is its own DeclContext. 115185377Ssam case Decl::Function: 116185377Ssam case Decl::CXXMethod: 117185377Ssam case Decl::CXXConstructor: 118185377Ssam case Decl::CXXDestructor: 119185377Ssam case Decl::CXXConversion: 120185377Ssam case Decl::ObjCMethod: 121185377Ssam case Decl::Block: 122185377Ssam case Decl::Captured: 123185377Ssam // Objective C categories, category implementations, and class 124185377Ssam // implementations can only be defined in one place. 125185377Ssam case Decl::ObjCCategory: 126185377Ssam case Decl::ObjCCategoryImpl: 127185377Ssam case Decl::ObjCImplementation: 128185377Ssam return DC; 129185377Ssam 130185377Ssam case Decl::ObjCProtocol: 131185377Ssam if (const ObjCProtocolDecl *Def 132185377Ssam = cast<ObjCProtocolDecl>(DC)->getDefinition()) 133185377Ssam return Def; 134185377Ssam return 0; 135185377Ssam 136185377Ssam // FIXME: These are defined in one place, but properties in class extensions 137185377Ssam // end up being back-patched into the main interface. See 138185377Ssam // Sema::HandlePropertyInClassExtension for the offending code. 139185377Ssam case Decl::ObjCInterface: 140185377Ssam return 0; 141185377Ssam 142185377Ssam default: 143185377Ssam llvm_unreachable("Unhandled DeclContext in AST reader"); 144185377Ssam } 145185377Ssam 146185377Ssam llvm_unreachable("Unhandled decl kind"); 147185377Ssam} 148185377Ssam 149185377Ssambool serialization::isRedeclarableDeclKind(unsigned Kind) { 150185377Ssam switch (static_cast<Decl::Kind>(Kind)) { 151185377Ssam case Decl::TranslationUnit: // Special case of a "merged" declaration. 152185377Ssam case Decl::Namespace: 153185377Ssam case Decl::NamespaceAlias: // FIXME: Not yet redeclarable, but will be. 154185377Ssam case Decl::Typedef: 155185377Ssam case Decl::TypeAlias: 156185377Ssam case Decl::Enum: 157185377Ssam case Decl::Record: 158185377Ssam case Decl::CXXRecord: 159185377Ssam case Decl::ClassTemplateSpecialization: 160185377Ssam case Decl::ClassTemplatePartialSpecialization: 161185377Ssam case Decl::Function: 162185377Ssam case Decl::CXXMethod: 163185377Ssam case Decl::CXXConstructor: 164185377Ssam case Decl::CXXDestructor: 165185377Ssam case Decl::CXXConversion: 166185377Ssam case Decl::Var: 167185377Ssam case Decl::FunctionTemplate: 168185377Ssam case Decl::ClassTemplate: 169185377Ssam case Decl::TypeAliasTemplate: 170185377Ssam case Decl::ObjCProtocol: 171185377Ssam case Decl::ObjCInterface: 172185377Ssam case Decl::Empty: 173185377Ssam return true; 174185377Ssam 175185377Ssam // Never redeclarable. 176185377Ssam case Decl::UsingDirective: 177185377Ssam case Decl::Label: 178185377Ssam case Decl::UnresolvedUsingTypename: 179185377Ssam case Decl::TemplateTypeParm: 180185377Ssam case Decl::EnumConstant: 181185377Ssam case Decl::UnresolvedUsingValue: 182185377Ssam case Decl::IndirectField: 183185377Ssam case Decl::Field: 184185377Ssam case Decl::MSProperty: 185185377Ssam case Decl::ObjCIvar: 186185377Ssam case Decl::ObjCAtDefsField: 187185377Ssam case Decl::ImplicitParam: 188185377Ssam case Decl::ParmVar: 189185377Ssam case Decl::NonTypeTemplateParm: 190185377Ssam case Decl::TemplateTemplateParm: 191185377Ssam case Decl::Using: 192185377Ssam case Decl::UsingShadow: 193185377Ssam case Decl::ObjCMethod: 194185377Ssam case Decl::ObjCCategory: 195185377Ssam case Decl::ObjCCategoryImpl: 196185377Ssam case Decl::ObjCImplementation: 197185377Ssam case Decl::ObjCProperty: 198185377Ssam case Decl::ObjCCompatibleAlias: 199185377Ssam case Decl::LinkageSpec: 200185377Ssam case Decl::ObjCPropertyImpl: 201185377Ssam case Decl::FileScopeAsm: 202185377Ssam case Decl::AccessSpec: 203185377Ssam case Decl::Friend: 204185377Ssam case Decl::FriendTemplate: 205185377Ssam case Decl::StaticAssert: 206185377Ssam case Decl::Block: 207185377Ssam case Decl::Captured: 208185377Ssam case Decl::ClassScopeFunctionSpecialization: 209185377Ssam case Decl::Import: 210185377Ssam case Decl::OMPThreadPrivate: 211185377Ssam return false; 212185377Ssam } 213185377Ssam 214185377Ssam llvm_unreachable("Unhandled declaration kind"); 215185377Ssam} 216185377Ssam