ASTCommon.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452
  1. //===--- ASTCommon.cpp - Common stuff for ASTReader/ASTWriter----*- C++ -*-===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. //
  9. // This file defines common functions that both ASTReader and ASTWriter use.
  10. //
  11. //===----------------------------------------------------------------------===//
  12. #include "ASTCommon.h"
  13. #include "clang/AST/DeclCXX.h"
  14. #include "clang/AST/DeclObjC.h"
  15. #include "clang/Basic/IdentifierTable.h"
  16. #include "clang/Serialization/ASTDeserializationListener.h"
  17. #include "llvm/Support/DJB.h"
  18. using namespace clang;
  19. // Give ASTDeserializationListener's VTable a home.
  20. ASTDeserializationListener::~ASTDeserializationListener() { }
  21. serialization::TypeIdx
  22. serialization::TypeIdxFromBuiltin(const BuiltinType *BT) {
  23. unsigned ID = 0;
  24. switch (BT->getKind()) {
  25. case BuiltinType::Void:
  26. ID = PREDEF_TYPE_VOID_ID;
  27. break;
  28. case BuiltinType::Bool:
  29. ID = PREDEF_TYPE_BOOL_ID;
  30. break;
  31. case BuiltinType::Char_U:
  32. ID = PREDEF_TYPE_CHAR_U_ID;
  33. break;
  34. case BuiltinType::UChar:
  35. ID = PREDEF_TYPE_UCHAR_ID;
  36. break;
  37. case BuiltinType::UShort:
  38. ID = PREDEF_TYPE_USHORT_ID;
  39. break;
  40. case BuiltinType::UInt:
  41. ID = PREDEF_TYPE_UINT_ID;
  42. break;
  43. case BuiltinType::ULong:
  44. ID = PREDEF_TYPE_ULONG_ID;
  45. break;
  46. case BuiltinType::ULongLong:
  47. ID = PREDEF_TYPE_ULONGLONG_ID;
  48. break;
  49. case BuiltinType::UInt128:
  50. ID = PREDEF_TYPE_UINT128_ID;
  51. break;
  52. case BuiltinType::Char_S:
  53. ID = PREDEF_TYPE_CHAR_S_ID;
  54. break;
  55. case BuiltinType::SChar:
  56. ID = PREDEF_TYPE_SCHAR_ID;
  57. break;
  58. case BuiltinType::WChar_S:
  59. case BuiltinType::WChar_U:
  60. ID = PREDEF_TYPE_WCHAR_ID;
  61. break;
  62. case BuiltinType::Short:
  63. ID = PREDEF_TYPE_SHORT_ID;
  64. break;
  65. case BuiltinType::Int:
  66. ID = PREDEF_TYPE_INT_ID;
  67. break;
  68. case BuiltinType::Long:
  69. ID = PREDEF_TYPE_LONG_ID;
  70. break;
  71. case BuiltinType::LongLong:
  72. ID = PREDEF_TYPE_LONGLONG_ID;
  73. break;
  74. case BuiltinType::Int128:
  75. ID = PREDEF_TYPE_INT128_ID;
  76. break;
  77. case BuiltinType::Half:
  78. ID = PREDEF_TYPE_HALF_ID;
  79. break;
  80. case BuiltinType::Float:
  81. ID = PREDEF_TYPE_FLOAT_ID;
  82. break;
  83. case BuiltinType::Double:
  84. ID = PREDEF_TYPE_DOUBLE_ID;
  85. break;
  86. case BuiltinType::LongDouble:
  87. ID = PREDEF_TYPE_LONGDOUBLE_ID;
  88. break;
  89. case BuiltinType::ShortAccum:
  90. ID = PREDEF_TYPE_SHORT_ACCUM_ID;
  91. break;
  92. case BuiltinType::Accum:
  93. ID = PREDEF_TYPE_ACCUM_ID;
  94. break;
  95. case BuiltinType::LongAccum:
  96. ID = PREDEF_TYPE_LONG_ACCUM_ID;
  97. break;
  98. case BuiltinType::UShortAccum:
  99. ID = PREDEF_TYPE_USHORT_ACCUM_ID;
  100. break;
  101. case BuiltinType::UAccum:
  102. ID = PREDEF_TYPE_UACCUM_ID;
  103. break;
  104. case BuiltinType::ULongAccum:
  105. ID = PREDEF_TYPE_ULONG_ACCUM_ID;
  106. break;
  107. case BuiltinType::ShortFract:
  108. ID = PREDEF_TYPE_SHORT_FRACT_ID;
  109. break;
  110. case BuiltinType::Fract:
  111. ID = PREDEF_TYPE_FRACT_ID;
  112. break;
  113. case BuiltinType::LongFract:
  114. ID = PREDEF_TYPE_LONG_FRACT_ID;
  115. break;
  116. case BuiltinType::UShortFract:
  117. ID = PREDEF_TYPE_USHORT_FRACT_ID;
  118. break;
  119. case BuiltinType::UFract:
  120. ID = PREDEF_TYPE_UFRACT_ID;
  121. break;
  122. case BuiltinType::ULongFract:
  123. ID = PREDEF_TYPE_ULONG_FRACT_ID;
  124. break;
  125. case BuiltinType::SatShortAccum:
  126. ID = PREDEF_TYPE_SAT_SHORT_ACCUM_ID;
  127. break;
  128. case BuiltinType::SatAccum:
  129. ID = PREDEF_TYPE_SAT_ACCUM_ID;
  130. break;
  131. case BuiltinType::SatLongAccum:
  132. ID = PREDEF_TYPE_SAT_LONG_ACCUM_ID;
  133. break;
  134. case BuiltinType::SatUShortAccum:
  135. ID = PREDEF_TYPE_SAT_USHORT_ACCUM_ID;
  136. break;
  137. case BuiltinType::SatUAccum:
  138. ID = PREDEF_TYPE_SAT_UACCUM_ID;
  139. break;
  140. case BuiltinType::SatULongAccum:
  141. ID = PREDEF_TYPE_SAT_ULONG_ACCUM_ID;
  142. break;
  143. case BuiltinType::SatShortFract:
  144. ID = PREDEF_TYPE_SAT_SHORT_FRACT_ID;
  145. break;
  146. case BuiltinType::SatFract:
  147. ID = PREDEF_TYPE_SAT_FRACT_ID;
  148. break;
  149. case BuiltinType::SatLongFract:
  150. ID = PREDEF_TYPE_SAT_LONG_FRACT_ID;
  151. break;
  152. case BuiltinType::SatUShortFract:
  153. ID = PREDEF_TYPE_SAT_USHORT_FRACT_ID;
  154. break;
  155. case BuiltinType::SatUFract:
  156. ID = PREDEF_TYPE_SAT_UFRACT_ID;
  157. break;
  158. case BuiltinType::SatULongFract:
  159. ID = PREDEF_TYPE_SAT_ULONG_FRACT_ID;
  160. break;
  161. case BuiltinType::Float16:
  162. ID = PREDEF_TYPE_FLOAT16_ID;
  163. break;
  164. case BuiltinType::Float128:
  165. ID = PREDEF_TYPE_FLOAT128_ID;
  166. break;
  167. case BuiltinType::NullPtr:
  168. ID = PREDEF_TYPE_NULLPTR_ID;
  169. break;
  170. case BuiltinType::Char8:
  171. ID = PREDEF_TYPE_CHAR8_ID;
  172. break;
  173. case BuiltinType::Char16:
  174. ID = PREDEF_TYPE_CHAR16_ID;
  175. break;
  176. case BuiltinType::Char32:
  177. ID = PREDEF_TYPE_CHAR32_ID;
  178. break;
  179. case BuiltinType::Overload:
  180. ID = PREDEF_TYPE_OVERLOAD_ID;
  181. break;
  182. case BuiltinType::BoundMember:
  183. ID = PREDEF_TYPE_BOUND_MEMBER;
  184. break;
  185. case BuiltinType::PseudoObject:
  186. ID = PREDEF_TYPE_PSEUDO_OBJECT;
  187. break;
  188. case BuiltinType::Dependent:
  189. ID = PREDEF_TYPE_DEPENDENT_ID;
  190. break;
  191. case BuiltinType::UnknownAny:
  192. ID = PREDEF_TYPE_UNKNOWN_ANY;
  193. break;
  194. case BuiltinType::ARCUnbridgedCast:
  195. ID = PREDEF_TYPE_ARC_UNBRIDGED_CAST;
  196. break;
  197. case BuiltinType::ObjCId:
  198. ID = PREDEF_TYPE_OBJC_ID;
  199. break;
  200. case BuiltinType::ObjCClass:
  201. ID = PREDEF_TYPE_OBJC_CLASS;
  202. break;
  203. case BuiltinType::ObjCSel:
  204. ID = PREDEF_TYPE_OBJC_SEL;
  205. break;
  206. #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
  207. case BuiltinType::Id: \
  208. ID = PREDEF_TYPE_##Id##_ID; \
  209. break;
  210. #include "clang/Basic/OpenCLImageTypes.def"
  211. #define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
  212. case BuiltinType::Id: \
  213. ID = PREDEF_TYPE_##Id##_ID; \
  214. break;
  215. #include "clang/Basic/OpenCLExtensionTypes.def"
  216. case BuiltinType::OCLSampler:
  217. ID = PREDEF_TYPE_SAMPLER_ID;
  218. break;
  219. case BuiltinType::OCLEvent:
  220. ID = PREDEF_TYPE_EVENT_ID;
  221. break;
  222. case BuiltinType::OCLClkEvent:
  223. ID = PREDEF_TYPE_CLK_EVENT_ID;
  224. break;
  225. case BuiltinType::OCLQueue:
  226. ID = PREDEF_TYPE_QUEUE_ID;
  227. break;
  228. case BuiltinType::OCLReserveID:
  229. ID = PREDEF_TYPE_RESERVE_ID_ID;
  230. break;
  231. #define SVE_TYPE(Name, Id, SingletonId) \
  232. case BuiltinType::Id: \
  233. ID = PREDEF_TYPE_##Id##_ID; \
  234. break;
  235. #include "clang/Basic/AArch64SVEACLETypes.def"
  236. case BuiltinType::BuiltinFn:
  237. ID = PREDEF_TYPE_BUILTIN_FN;
  238. break;
  239. case BuiltinType::OMPArraySection:
  240. ID = PREDEF_TYPE_OMP_ARRAY_SECTION;
  241. break;
  242. }
  243. return TypeIdx(ID);
  244. }
  245. unsigned serialization::ComputeHash(Selector Sel) {
  246. unsigned N = Sel.getNumArgs();
  247. if (N == 0)
  248. ++N;
  249. unsigned R = 5381;
  250. for (unsigned I = 0; I != N; ++I)
  251. if (IdentifierInfo *II = Sel.getIdentifierInfoForSlot(I))
  252. R = llvm::djbHash(II->getName(), R);
  253. return R;
  254. }
  255. const DeclContext *
  256. serialization::getDefinitiveDeclContext(const DeclContext *DC) {
  257. switch (DC->getDeclKind()) {
  258. // These entities may have multiple definitions.
  259. case Decl::TranslationUnit:
  260. case Decl::ExternCContext:
  261. case Decl::Namespace:
  262. case Decl::LinkageSpec:
  263. case Decl::Export:
  264. return nullptr;
  265. // C/C++ tag types can only be defined in one place.
  266. case Decl::Enum:
  267. case Decl::Record:
  268. if (const TagDecl *Def = cast<TagDecl>(DC)->getDefinition())
  269. return Def;
  270. return nullptr;
  271. // FIXME: These can be defined in one place... except special member
  272. // functions and out-of-line definitions.
  273. case Decl::CXXRecord:
  274. case Decl::ClassTemplateSpecialization:
  275. case Decl::ClassTemplatePartialSpecialization:
  276. return nullptr;
  277. // Each function, method, and block declaration is its own DeclContext.
  278. case Decl::Function:
  279. case Decl::CXXMethod:
  280. case Decl::CXXConstructor:
  281. case Decl::CXXDestructor:
  282. case Decl::CXXConversion:
  283. case Decl::ObjCMethod:
  284. case Decl::Block:
  285. case Decl::Captured:
  286. // Objective C categories, category implementations, and class
  287. // implementations can only be defined in one place.
  288. case Decl::ObjCCategory:
  289. case Decl::ObjCCategoryImpl:
  290. case Decl::ObjCImplementation:
  291. return DC;
  292. case Decl::ObjCProtocol:
  293. if (const ObjCProtocolDecl *Def
  294. = cast<ObjCProtocolDecl>(DC)->getDefinition())
  295. return Def;
  296. return nullptr;
  297. // FIXME: These are defined in one place, but properties in class extensions
  298. // end up being back-patched into the main interface. See
  299. // Sema::HandlePropertyInClassExtension for the offending code.
  300. case Decl::ObjCInterface:
  301. return nullptr;
  302. default:
  303. llvm_unreachable("Unhandled DeclContext in AST reader");
  304. }
  305. llvm_unreachable("Unhandled decl kind");
  306. }
  307. bool serialization::isRedeclarableDeclKind(unsigned Kind) {
  308. switch (static_cast<Decl::Kind>(Kind)) {
  309. case Decl::TranslationUnit:
  310. case Decl::ExternCContext:
  311. // Special case of a "merged" declaration.
  312. return true;
  313. case Decl::Namespace:
  314. case Decl::NamespaceAlias:
  315. case Decl::Typedef:
  316. case Decl::TypeAlias:
  317. case Decl::Enum:
  318. case Decl::Record:
  319. case Decl::CXXRecord:
  320. case Decl::ClassTemplateSpecialization:
  321. case Decl::ClassTemplatePartialSpecialization:
  322. case Decl::VarTemplateSpecialization:
  323. case Decl::VarTemplatePartialSpecialization:
  324. case Decl::Function:
  325. case Decl::CXXDeductionGuide:
  326. case Decl::CXXMethod:
  327. case Decl::CXXConstructor:
  328. case Decl::CXXDestructor:
  329. case Decl::CXXConversion:
  330. case Decl::UsingShadow:
  331. case Decl::ConstructorUsingShadow:
  332. case Decl::Var:
  333. case Decl::FunctionTemplate:
  334. case Decl::ClassTemplate:
  335. case Decl::VarTemplate:
  336. case Decl::TypeAliasTemplate:
  337. case Decl::ObjCProtocol:
  338. case Decl::ObjCInterface:
  339. case Decl::Empty:
  340. return true;
  341. // Never redeclarable.
  342. case Decl::UsingDirective:
  343. case Decl::Label:
  344. case Decl::UnresolvedUsingTypename:
  345. case Decl::TemplateTypeParm:
  346. case Decl::EnumConstant:
  347. case Decl::UnresolvedUsingValue:
  348. case Decl::IndirectField:
  349. case Decl::Field:
  350. case Decl::MSProperty:
  351. case Decl::ObjCIvar:
  352. case Decl::ObjCAtDefsField:
  353. case Decl::NonTypeTemplateParm:
  354. case Decl::TemplateTemplateParm:
  355. case Decl::Using:
  356. case Decl::UsingPack:
  357. case Decl::ObjCMethod:
  358. case Decl::ObjCCategory:
  359. case Decl::ObjCCategoryImpl:
  360. case Decl::ObjCImplementation:
  361. case Decl::ObjCProperty:
  362. case Decl::ObjCCompatibleAlias:
  363. case Decl::LinkageSpec:
  364. case Decl::Export:
  365. case Decl::ObjCPropertyImpl:
  366. case Decl::PragmaComment:
  367. case Decl::PragmaDetectMismatch:
  368. case Decl::FileScopeAsm:
  369. case Decl::AccessSpec:
  370. case Decl::Friend:
  371. case Decl::FriendTemplate:
  372. case Decl::StaticAssert:
  373. case Decl::Block:
  374. case Decl::Captured:
  375. case Decl::ClassScopeFunctionSpecialization:
  376. case Decl::Import:
  377. case Decl::OMPThreadPrivate:
  378. case Decl::OMPAllocate:
  379. case Decl::OMPRequires:
  380. case Decl::OMPCapturedExpr:
  381. case Decl::OMPDeclareReduction:
  382. case Decl::OMPDeclareMapper:
  383. case Decl::BuiltinTemplate:
  384. case Decl::Decomposition:
  385. case Decl::Binding:
  386. case Decl::Concept:
  387. return false;
  388. // These indirectly derive from Redeclarable<T> but are not actually
  389. // redeclarable.
  390. case Decl::ImplicitParam:
  391. case Decl::ParmVar:
  392. case Decl::ObjCTypeParam:
  393. return false;
  394. }
  395. llvm_unreachable("Unhandled declaration kind");
  396. }
  397. bool serialization::needsAnonymousDeclarationNumber(const NamedDecl *D) {
  398. // Friend declarations in dependent contexts aren't anonymous in the usual
  399. // sense, but they cannot be found by name lookup in their semantic context
  400. // (or indeed in any context), so we treat them as anonymous.
  401. //
  402. // This doesn't apply to friend tag decls; Sema makes those available to name
  403. // lookup in the surrounding context.
  404. if (D->getFriendObjectKind() &&
  405. D->getLexicalDeclContext()->isDependentContext() && !isa<TagDecl>(D)) {
  406. // For function templates and class templates, the template is numbered and
  407. // not its pattern.
  408. if (auto *FD = dyn_cast<FunctionDecl>(D))
  409. return !FD->getDescribedFunctionTemplate();
  410. if (auto *RD = dyn_cast<CXXRecordDecl>(D))
  411. return !RD->getDescribedClassTemplate();
  412. return true;
  413. }
  414. // At block scope, we number everything that we need to deduplicate, since we
  415. // can't just use name matching to keep things lined up.
  416. // FIXME: This is only necessary for an inline function or a template or
  417. // similar.
  418. if (D->getLexicalDeclContext()->isFunctionOrMethod()) {
  419. if (auto *VD = dyn_cast<VarDecl>(D))
  420. return VD->isStaticLocal();
  421. // FIXME: What about CapturedDecls (and declarations nested within them)?
  422. return isa<TagDecl>(D) || isa<BlockDecl>(D);
  423. }
  424. // Otherwise, we only care about anonymous class members / block-scope decls.
  425. // FIXME: We need to handle lambdas and blocks within inline / templated
  426. // variables too.
  427. if (D->getDeclName() || !isa<CXXRecordDecl>(D->getLexicalDeclContext()))
  428. return false;
  429. return isa<TagDecl>(D) || isa<FieldDecl>(D);
  430. }