ASTCommon.cpp 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. //===--- ASTCommon.cpp - Common stuff for ASTReader/ASTWriter----*- C++ -*-===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. //
  10. // This file defines common functions that both ASTReader and ASTWriter use.
  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/ADT/StringExtras.h"
  19. using namespace clang;
  20. // Give ASTDeserializationListener's VTable a home.
  21. ASTDeserializationListener::~ASTDeserializationListener() { }
  22. serialization::TypeIdx
  23. serialization::TypeIdxFromBuiltin(const BuiltinType *BT) {
  24. unsigned ID = 0;
  25. switch (BT->getKind()) {
  26. case BuiltinType::Void: ID = PREDEF_TYPE_VOID_ID; break;
  27. case BuiltinType::Bool: ID = PREDEF_TYPE_BOOL_ID; break;
  28. case BuiltinType::Char_U: ID = PREDEF_TYPE_CHAR_U_ID; break;
  29. case BuiltinType::UChar: ID = PREDEF_TYPE_UCHAR_ID; break;
  30. case BuiltinType::UShort: ID = PREDEF_TYPE_USHORT_ID; break;
  31. case BuiltinType::UInt: ID = PREDEF_TYPE_UINT_ID; break;
  32. case BuiltinType::ULong: ID = PREDEF_TYPE_ULONG_ID; break;
  33. case BuiltinType::ULongLong: ID = PREDEF_TYPE_ULONGLONG_ID; break;
  34. case BuiltinType::UInt128: ID = PREDEF_TYPE_UINT128_ID; break;
  35. case BuiltinType::Char_S: ID = PREDEF_TYPE_CHAR_S_ID; break;
  36. case BuiltinType::SChar: ID = PREDEF_TYPE_SCHAR_ID; break;
  37. case BuiltinType::WChar_S:
  38. case BuiltinType::WChar_U: ID = PREDEF_TYPE_WCHAR_ID; break;
  39. case BuiltinType::Short: ID = PREDEF_TYPE_SHORT_ID; break;
  40. case BuiltinType::Int: ID = PREDEF_TYPE_INT_ID; break;
  41. case BuiltinType::Long: ID = PREDEF_TYPE_LONG_ID; break;
  42. case BuiltinType::LongLong: ID = PREDEF_TYPE_LONGLONG_ID; break;
  43. case BuiltinType::Int128: ID = PREDEF_TYPE_INT128_ID; break;
  44. case BuiltinType::Half: ID = PREDEF_TYPE_HALF_ID; break;
  45. case BuiltinType::Float: ID = PREDEF_TYPE_FLOAT_ID; break;
  46. case BuiltinType::Double: ID = PREDEF_TYPE_DOUBLE_ID; break;
  47. case BuiltinType::LongDouble: ID = PREDEF_TYPE_LONGDOUBLE_ID; break;
  48. case BuiltinType::NullPtr: ID = PREDEF_TYPE_NULLPTR_ID; break;
  49. case BuiltinType::Char16: ID = PREDEF_TYPE_CHAR16_ID; break;
  50. case BuiltinType::Char32: ID = PREDEF_TYPE_CHAR32_ID; break;
  51. case BuiltinType::Overload: ID = PREDEF_TYPE_OVERLOAD_ID; break;
  52. case BuiltinType::BoundMember:ID = PREDEF_TYPE_BOUND_MEMBER; break;
  53. case BuiltinType::PseudoObject:ID = PREDEF_TYPE_PSEUDO_OBJECT;break;
  54. case BuiltinType::Dependent: ID = PREDEF_TYPE_DEPENDENT_ID; break;
  55. case BuiltinType::UnknownAny: ID = PREDEF_TYPE_UNKNOWN_ANY; break;
  56. case BuiltinType::ARCUnbridgedCast:
  57. ID = PREDEF_TYPE_ARC_UNBRIDGED_CAST; break;
  58. case BuiltinType::ObjCId: ID = PREDEF_TYPE_OBJC_ID; break;
  59. case BuiltinType::ObjCClass: ID = PREDEF_TYPE_OBJC_CLASS; break;
  60. case BuiltinType::ObjCSel: ID = PREDEF_TYPE_OBJC_SEL; break;
  61. case BuiltinType::OCLImage1d: ID = PREDEF_TYPE_IMAGE1D_ID; break;
  62. case BuiltinType::OCLImage1dArray: ID = PREDEF_TYPE_IMAGE1D_ARR_ID; break;
  63. case BuiltinType::OCLImage1dBuffer: ID = PREDEF_TYPE_IMAGE1D_BUFF_ID; break;
  64. case BuiltinType::OCLImage2d: ID = PREDEF_TYPE_IMAGE2D_ID; break;
  65. case BuiltinType::OCLImage2dArray: ID = PREDEF_TYPE_IMAGE2D_ARR_ID; break;
  66. case BuiltinType::OCLImage3d: ID = PREDEF_TYPE_IMAGE3D_ID; break;
  67. case BuiltinType::OCLSampler: ID = PREDEF_TYPE_SAMPLER_ID; break;
  68. case BuiltinType::OCLEvent: ID = PREDEF_TYPE_EVENT_ID; break;
  69. case BuiltinType::BuiltinFn:
  70. ID = PREDEF_TYPE_BUILTIN_FN; break;
  71. }
  72. return TypeIdx(ID);
  73. }
  74. unsigned serialization::ComputeHash(Selector Sel) {
  75. unsigned N = Sel.getNumArgs();
  76. if (N == 0)
  77. ++N;
  78. unsigned R = 5381;
  79. for (unsigned I = 0; I != N; ++I)
  80. if (IdentifierInfo *II = Sel.getIdentifierInfoForSlot(I))
  81. R = llvm::HashString(II->getName(), R);
  82. return R;
  83. }
  84. const DeclContext *
  85. serialization::getDefinitiveDeclContext(const DeclContext *DC) {
  86. switch (DC->getDeclKind()) {
  87. // These entities may have multiple definitions.
  88. case Decl::TranslationUnit:
  89. case Decl::ExternCContext:
  90. case Decl::Namespace:
  91. case Decl::LinkageSpec:
  92. return nullptr;
  93. // C/C++ tag types can only be defined in one place.
  94. case Decl::Enum:
  95. case Decl::Record:
  96. if (const TagDecl *Def = cast<TagDecl>(DC)->getDefinition())
  97. return Def;
  98. return nullptr;
  99. // FIXME: These can be defined in one place... except special member
  100. // functions and out-of-line definitions.
  101. case Decl::CXXRecord:
  102. case Decl::ClassTemplateSpecialization:
  103. case Decl::ClassTemplatePartialSpecialization:
  104. return nullptr;
  105. // Each function, method, and block declaration is its own DeclContext.
  106. case Decl::Function:
  107. case Decl::CXXMethod:
  108. case Decl::CXXConstructor:
  109. case Decl::CXXDestructor:
  110. case Decl::CXXConversion:
  111. case Decl::ObjCMethod:
  112. case Decl::Block:
  113. case Decl::Captured:
  114. // Objective C categories, category implementations, and class
  115. // implementations can only be defined in one place.
  116. case Decl::ObjCCategory:
  117. case Decl::ObjCCategoryImpl:
  118. case Decl::ObjCImplementation:
  119. return DC;
  120. case Decl::ObjCProtocol:
  121. if (const ObjCProtocolDecl *Def
  122. = cast<ObjCProtocolDecl>(DC)->getDefinition())
  123. return Def;
  124. return nullptr;
  125. // FIXME: These are defined in one place, but properties in class extensions
  126. // end up being back-patched into the main interface. See
  127. // Sema::HandlePropertyInClassExtension for the offending code.
  128. case Decl::ObjCInterface:
  129. return nullptr;
  130. default:
  131. llvm_unreachable("Unhandled DeclContext in AST reader");
  132. }
  133. llvm_unreachable("Unhandled decl kind");
  134. }
  135. bool serialization::isRedeclarableDeclKind(unsigned Kind) {
  136. switch (static_cast<Decl::Kind>(Kind)) {
  137. case Decl::TranslationUnit:
  138. case Decl::ExternCContext:
  139. // Special case of a "merged" declaration.
  140. return true;
  141. case Decl::Namespace:
  142. case Decl::NamespaceAlias:
  143. case Decl::Typedef:
  144. case Decl::TypeAlias:
  145. case Decl::Enum:
  146. case Decl::Record:
  147. case Decl::CXXRecord:
  148. case Decl::ClassTemplateSpecialization:
  149. case Decl::ClassTemplatePartialSpecialization:
  150. case Decl::VarTemplateSpecialization:
  151. case Decl::VarTemplatePartialSpecialization:
  152. case Decl::Function:
  153. case Decl::CXXMethod:
  154. case Decl::CXXConstructor:
  155. case Decl::CXXDestructor:
  156. case Decl::CXXConversion:
  157. case Decl::UsingShadow:
  158. case Decl::Var:
  159. case Decl::FunctionTemplate:
  160. case Decl::ClassTemplate:
  161. case Decl::VarTemplate:
  162. case Decl::TypeAliasTemplate:
  163. case Decl::ObjCProtocol:
  164. case Decl::ObjCInterface:
  165. case Decl::Empty:
  166. return true;
  167. // Never redeclarable.
  168. case Decl::UsingDirective:
  169. case Decl::Label:
  170. case Decl::UnresolvedUsingTypename:
  171. case Decl::TemplateTypeParm:
  172. case Decl::EnumConstant:
  173. case Decl::UnresolvedUsingValue:
  174. case Decl::IndirectField:
  175. case Decl::Field:
  176. case Decl::MSProperty:
  177. case Decl::ObjCIvar:
  178. case Decl::ObjCAtDefsField:
  179. case Decl::NonTypeTemplateParm:
  180. case Decl::TemplateTemplateParm:
  181. case Decl::Using:
  182. case Decl::ObjCMethod:
  183. case Decl::ObjCCategory:
  184. case Decl::ObjCCategoryImpl:
  185. case Decl::ObjCImplementation:
  186. case Decl::ObjCProperty:
  187. case Decl::ObjCCompatibleAlias:
  188. case Decl::LinkageSpec:
  189. case Decl::ObjCPropertyImpl:
  190. case Decl::FileScopeAsm:
  191. case Decl::AccessSpec:
  192. case Decl::Friend:
  193. case Decl::FriendTemplate:
  194. case Decl::StaticAssert:
  195. case Decl::Block:
  196. case Decl::Captured:
  197. case Decl::ClassScopeFunctionSpecialization:
  198. case Decl::Import:
  199. case Decl::OMPThreadPrivate:
  200. return false;
  201. // These indirectly derive from Redeclarable<T> but are not actually
  202. // redeclarable.
  203. case Decl::ImplicitParam:
  204. case Decl::ParmVar:
  205. case Decl::ObjCTypeParam:
  206. return false;
  207. }
  208. llvm_unreachable("Unhandled declaration kind");
  209. }
  210. bool serialization::needsAnonymousDeclarationNumber(const NamedDecl *D) {
  211. // Friend declarations in dependent contexts aren't anonymous in the usual
  212. // sense, but they cannot be found by name lookup in their semantic context
  213. // (or indeed in any context), so we treat them as anonymous.
  214. //
  215. // This doesn't apply to friend tag decls; Sema makes those available to name
  216. // lookup in the surrounding context.
  217. if (D->getFriendObjectKind() &&
  218. D->getLexicalDeclContext()->isDependentContext() && !isa<TagDecl>(D)) {
  219. // For function templates and class templates, the template is numbered and
  220. // not its pattern.
  221. if (auto *FD = dyn_cast<FunctionDecl>(D))
  222. return !FD->getDescribedFunctionTemplate();
  223. if (auto *RD = dyn_cast<CXXRecordDecl>(D))
  224. return !RD->getDescribedClassTemplate();
  225. return true;
  226. }
  227. // Otherwise, we only care about anonymous class members.
  228. if (D->getDeclName() || !isa<CXXRecordDecl>(D->getLexicalDeclContext()))
  229. return false;
  230. return isa<TagDecl>(D) || isa<FieldDecl>(D);
  231. }