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