DIBuilder.cpp 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853
  1. //===--- DIBuilder.cpp - Debug Information Builder ------------------------===//
  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 implements the DIBuilder.
  11. //
  12. //===----------------------------------------------------------------------===//
  13. #include "llvm/IR/DIBuilder.h"
  14. #include "llvm/ADT/STLExtras.h"
  15. #include "llvm/IR/Constants.h"
  16. #include "llvm/IR/DebugInfo.h"
  17. #include "llvm/IR/IntrinsicInst.h"
  18. #include "llvm/IR/Module.h"
  19. #include "llvm/Support/Debug.h"
  20. #include "llvm/Support/Dwarf.h"
  21. #include "LLVMContextImpl.h"
  22. using namespace llvm;
  23. using namespace llvm::dwarf;
  24. DIBuilder::DIBuilder(Module &m, bool AllowUnresolvedNodes)
  25. : M(m), VMContext(M.getContext()), CUNode(nullptr),
  26. DeclareFn(nullptr), ValueFn(nullptr),
  27. AllowUnresolvedNodes(AllowUnresolvedNodes) {}
  28. void DIBuilder::trackIfUnresolved(MDNode *N) {
  29. if (!N)
  30. return;
  31. if (N->isResolved())
  32. return;
  33. assert(AllowUnresolvedNodes && "Cannot handle unresolved nodes");
  34. UnresolvedNodes.emplace_back(N);
  35. }
  36. void DIBuilder::finalize() {
  37. if (!CUNode) {
  38. assert(!AllowUnresolvedNodes &&
  39. "creating type nodes without a CU is not supported");
  40. return;
  41. }
  42. CUNode->replaceEnumTypes(MDTuple::get(VMContext, AllEnumTypes));
  43. SmallVector<Metadata *, 16> RetainValues;
  44. // Declarations and definitions of the same type may be retained. Some
  45. // clients RAUW these pairs, leaving duplicates in the retained types
  46. // list. Use a set to remove the duplicates while we transform the
  47. // TrackingVHs back into Values.
  48. SmallPtrSet<Metadata *, 16> RetainSet;
  49. for (unsigned I = 0, E = AllRetainTypes.size(); I < E; I++)
  50. if (RetainSet.insert(AllRetainTypes[I]).second)
  51. RetainValues.push_back(AllRetainTypes[I]);
  52. if (!RetainValues.empty())
  53. CUNode->replaceRetainedTypes(MDTuple::get(VMContext, RetainValues));
  54. DISubprogramArray SPs = MDTuple::get(VMContext, AllSubprograms);
  55. auto resolveVariables = [&](DISubprogram *SP) {
  56. MDTuple *Temp = SP->getVariables().get();
  57. if (!Temp)
  58. return;
  59. SmallVector<Metadata *, 4> Variables;
  60. auto PV = PreservedVariables.find(SP);
  61. if (PV != PreservedVariables.end())
  62. Variables.append(PV->second.begin(), PV->second.end());
  63. DINodeArray AV = getOrCreateArray(Variables);
  64. TempMDTuple(Temp)->replaceAllUsesWith(AV.get());
  65. };
  66. for (auto *SP : SPs)
  67. resolveVariables(SP);
  68. for (auto *N : RetainValues)
  69. if (auto *SP = dyn_cast<DISubprogram>(N))
  70. resolveVariables(SP);
  71. if (!AllGVs.empty())
  72. CUNode->replaceGlobalVariables(MDTuple::get(VMContext, AllGVs));
  73. if (!AllImportedModules.empty())
  74. CUNode->replaceImportedEntities(MDTuple::get(
  75. VMContext, SmallVector<Metadata *, 16>(AllImportedModules.begin(),
  76. AllImportedModules.end())));
  77. // Now that all temp nodes have been replaced or deleted, resolve remaining
  78. // cycles.
  79. for (const auto &N : UnresolvedNodes)
  80. if (N && !N->isResolved())
  81. N->resolveCycles();
  82. UnresolvedNodes.clear();
  83. // Can't handle unresolved nodes anymore.
  84. AllowUnresolvedNodes = false;
  85. }
  86. /// If N is compile unit return NULL otherwise return N.
  87. static DIScope *getNonCompileUnitScope(DIScope *N) {
  88. if (!N || isa<DICompileUnit>(N))
  89. return nullptr;
  90. return cast<DIScope>(N);
  91. }
  92. DICompileUnit *DIBuilder::createCompileUnit(
  93. unsigned Lang, StringRef Filename, StringRef Directory, StringRef Producer,
  94. bool isOptimized, StringRef Flags, unsigned RunTimeVer, StringRef SplitName,
  95. DICompileUnit::DebugEmissionKind Kind, uint64_t DWOId,
  96. bool SplitDebugInlining) {
  97. assert(((Lang <= dwarf::DW_LANG_Fortran08 && Lang >= dwarf::DW_LANG_C89) ||
  98. (Lang <= dwarf::DW_LANG_hi_user && Lang >= dwarf::DW_LANG_lo_user)) &&
  99. "Invalid Language tag");
  100. assert(!Filename.empty() &&
  101. "Unable to create compile unit without filename");
  102. assert(!CUNode && "Can only make one compile unit per DIBuilder instance");
  103. CUNode = DICompileUnit::getDistinct(
  104. VMContext, Lang, DIFile::get(VMContext, Filename, Directory), Producer,
  105. isOptimized, Flags, RunTimeVer, SplitName, Kind, nullptr, nullptr,
  106. nullptr, nullptr, nullptr, DWOId, SplitDebugInlining);
  107. // Create a named metadata so that it is easier to find cu in a module.
  108. NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.cu");
  109. NMD->addOperand(CUNode);
  110. trackIfUnresolved(CUNode);
  111. return CUNode;
  112. }
  113. static DIImportedEntity *
  114. createImportedModule(LLVMContext &C, dwarf::Tag Tag, DIScope *Context,
  115. Metadata *NS, unsigned Line, StringRef Name,
  116. SmallVectorImpl<TrackingMDNodeRef> &AllImportedModules) {
  117. unsigned EntitiesCount = C.pImpl->DIImportedEntitys.size();
  118. auto *M = DIImportedEntity::get(C, Tag, Context, DINodeRef(NS), Line, Name);
  119. if (EntitiesCount < C.pImpl->DIImportedEntitys.size())
  120. // A new Imported Entity was just added to the context.
  121. // Add it to the Imported Modules list.
  122. AllImportedModules.emplace_back(M);
  123. return M;
  124. }
  125. DIImportedEntity *DIBuilder::createImportedModule(DIScope *Context,
  126. DINamespace *NS,
  127. unsigned Line) {
  128. return ::createImportedModule(VMContext, dwarf::DW_TAG_imported_module,
  129. Context, NS, Line, StringRef(), AllImportedModules);
  130. }
  131. DIImportedEntity *DIBuilder::createImportedModule(DIScope *Context,
  132. DIImportedEntity *NS,
  133. unsigned Line) {
  134. return ::createImportedModule(VMContext, dwarf::DW_TAG_imported_module,
  135. Context, NS, Line, StringRef(), AllImportedModules);
  136. }
  137. DIImportedEntity *DIBuilder::createImportedModule(DIScope *Context, DIModule *M,
  138. unsigned Line) {
  139. return ::createImportedModule(VMContext, dwarf::DW_TAG_imported_module,
  140. Context, M, Line, StringRef(), AllImportedModules);
  141. }
  142. DIImportedEntity *DIBuilder::createImportedDeclaration(DIScope *Context,
  143. DINode *Decl,
  144. unsigned Line,
  145. StringRef Name) {
  146. // Make sure to use the unique identifier based metadata reference for
  147. // types that have one.
  148. return ::createImportedModule(VMContext, dwarf::DW_TAG_imported_declaration,
  149. Context, Decl, Line, Name, AllImportedModules);
  150. }
  151. DIFile *DIBuilder::createFile(StringRef Filename, StringRef Directory) {
  152. return DIFile::get(VMContext, Filename, Directory);
  153. }
  154. DIEnumerator *DIBuilder::createEnumerator(StringRef Name, int64_t Val) {
  155. assert(!Name.empty() && "Unable to create enumerator without name");
  156. return DIEnumerator::get(VMContext, Val, Name);
  157. }
  158. DIBasicType *DIBuilder::createUnspecifiedType(StringRef Name) {
  159. assert(!Name.empty() && "Unable to create type without name");
  160. return DIBasicType::get(VMContext, dwarf::DW_TAG_unspecified_type, Name);
  161. }
  162. DIBasicType *DIBuilder::createNullPtrType() {
  163. return createUnspecifiedType("decltype(nullptr)");
  164. }
  165. DIBasicType *DIBuilder::createBasicType(StringRef Name, uint64_t SizeInBits,
  166. uint64_t AlignInBits,
  167. unsigned Encoding) {
  168. assert(!Name.empty() && "Unable to create type without name");
  169. return DIBasicType::get(VMContext, dwarf::DW_TAG_base_type, Name, SizeInBits,
  170. AlignInBits, Encoding);
  171. }
  172. DIDerivedType *DIBuilder::createQualifiedType(unsigned Tag, DIType *FromTy) {
  173. return DIDerivedType::get(VMContext, Tag, "", nullptr, 0, nullptr, FromTy, 0,
  174. 0, 0, DINode::FlagZero);
  175. }
  176. DIDerivedType *DIBuilder::createPointerType(DIType *PointeeTy,
  177. uint64_t SizeInBits,
  178. uint64_t AlignInBits,
  179. StringRef Name) {
  180. // FIXME: Why is there a name here?
  181. return DIDerivedType::get(VMContext, dwarf::DW_TAG_pointer_type, Name,
  182. nullptr, 0, nullptr, PointeeTy, SizeInBits,
  183. AlignInBits, 0, DINode::FlagZero);
  184. }
  185. DIDerivedType *DIBuilder::createMemberPointerType(DIType *PointeeTy,
  186. DIType *Base,
  187. uint64_t SizeInBits,
  188. uint64_t AlignInBits,
  189. DINode::DIFlags Flags) {
  190. return DIDerivedType::get(VMContext, dwarf::DW_TAG_ptr_to_member_type, "",
  191. nullptr, 0, nullptr, PointeeTy, SizeInBits,
  192. AlignInBits, 0, Flags, Base);
  193. }
  194. DIDerivedType *DIBuilder::createReferenceType(unsigned Tag, DIType *RTy,
  195. uint64_t SizeInBits,
  196. uint64_t AlignInBits) {
  197. assert(RTy && "Unable to create reference type");
  198. return DIDerivedType::get(VMContext, Tag, "", nullptr, 0, nullptr, RTy,
  199. SizeInBits, AlignInBits, 0, DINode::FlagZero);
  200. }
  201. DIDerivedType *DIBuilder::createTypedef(DIType *Ty, StringRef Name,
  202. DIFile *File, unsigned LineNo,
  203. DIScope *Context) {
  204. return DIDerivedType::get(VMContext, dwarf::DW_TAG_typedef, Name, File,
  205. LineNo, getNonCompileUnitScope(Context), Ty, 0, 0,
  206. 0, DINode::FlagZero);
  207. }
  208. DIDerivedType *DIBuilder::createFriend(DIType *Ty, DIType *FriendTy) {
  209. assert(Ty && "Invalid type!");
  210. assert(FriendTy && "Invalid friend type!");
  211. return DIDerivedType::get(VMContext, dwarf::DW_TAG_friend, "", nullptr, 0, Ty,
  212. FriendTy, 0, 0, 0, DINode::FlagZero);
  213. }
  214. DIDerivedType *DIBuilder::createInheritance(DIType *Ty, DIType *BaseTy,
  215. uint64_t BaseOffset,
  216. DINode::DIFlags Flags) {
  217. assert(Ty && "Unable to create inheritance");
  218. return DIDerivedType::get(VMContext, dwarf::DW_TAG_inheritance, "", nullptr,
  219. 0, Ty, BaseTy, 0, 0, BaseOffset, Flags);
  220. }
  221. DIDerivedType *DIBuilder::createMemberType(DIScope *Scope, StringRef Name,
  222. DIFile *File, unsigned LineNumber,
  223. uint64_t SizeInBits,
  224. uint64_t AlignInBits,
  225. uint64_t OffsetInBits,
  226. DINode::DIFlags Flags, DIType *Ty) {
  227. return DIDerivedType::get(VMContext, dwarf::DW_TAG_member, Name, File,
  228. LineNumber, getNonCompileUnitScope(Scope), Ty,
  229. SizeInBits, AlignInBits, OffsetInBits, Flags);
  230. }
  231. static ConstantAsMetadata *getConstantOrNull(Constant *C) {
  232. if (C)
  233. return ConstantAsMetadata::get(C);
  234. return nullptr;
  235. }
  236. DIDerivedType *DIBuilder::createBitFieldMemberType(
  237. DIScope *Scope, StringRef Name, DIFile *File, unsigned LineNumber,
  238. uint64_t SizeInBits, uint64_t AlignInBits, uint64_t OffsetInBits,
  239. uint64_t StorageOffsetInBits, DINode::DIFlags Flags, DIType *Ty) {
  240. Flags |= DINode::FlagBitField;
  241. return DIDerivedType::get(
  242. VMContext, dwarf::DW_TAG_member, Name, File, LineNumber,
  243. getNonCompileUnitScope(Scope), Ty, SizeInBits, AlignInBits, OffsetInBits,
  244. Flags, ConstantAsMetadata::get(ConstantInt::get(
  245. IntegerType::get(VMContext, 64), StorageOffsetInBits)));
  246. }
  247. DIDerivedType *
  248. DIBuilder::createStaticMemberType(DIScope *Scope, StringRef Name, DIFile *File,
  249. unsigned LineNumber, DIType *Ty,
  250. DINode::DIFlags Flags, llvm::Constant *Val) {
  251. Flags |= DINode::FlagStaticMember;
  252. return DIDerivedType::get(VMContext, dwarf::DW_TAG_member, Name, File,
  253. LineNumber, getNonCompileUnitScope(Scope), Ty, 0, 0,
  254. 0, Flags, getConstantOrNull(Val));
  255. }
  256. DIDerivedType *
  257. DIBuilder::createObjCIVar(StringRef Name, DIFile *File, unsigned LineNumber,
  258. uint64_t SizeInBits, uint64_t AlignInBits,
  259. uint64_t OffsetInBits, DINode::DIFlags Flags,
  260. DIType *Ty, MDNode *PropertyNode) {
  261. return DIDerivedType::get(VMContext, dwarf::DW_TAG_member, Name, File,
  262. LineNumber, getNonCompileUnitScope(File), Ty,
  263. SizeInBits, AlignInBits, OffsetInBits, Flags,
  264. PropertyNode);
  265. }
  266. DIObjCProperty *
  267. DIBuilder::createObjCProperty(StringRef Name, DIFile *File, unsigned LineNumber,
  268. StringRef GetterName, StringRef SetterName,
  269. unsigned PropertyAttributes, DIType *Ty) {
  270. return DIObjCProperty::get(VMContext, Name, File, LineNumber, GetterName,
  271. SetterName, PropertyAttributes, Ty);
  272. }
  273. DITemplateTypeParameter *
  274. DIBuilder::createTemplateTypeParameter(DIScope *Context, StringRef Name,
  275. DIType *Ty) {
  276. assert((!Context || isa<DICompileUnit>(Context)) && "Expected compile unit");
  277. return DITemplateTypeParameter::get(VMContext, Name, Ty);
  278. }
  279. static DITemplateValueParameter *
  280. createTemplateValueParameterHelper(LLVMContext &VMContext, unsigned Tag,
  281. DIScope *Context, StringRef Name, DIType *Ty,
  282. Metadata *MD) {
  283. assert((!Context || isa<DICompileUnit>(Context)) && "Expected compile unit");
  284. return DITemplateValueParameter::get(VMContext, Tag, Name, Ty, MD);
  285. }
  286. DITemplateValueParameter *
  287. DIBuilder::createTemplateValueParameter(DIScope *Context, StringRef Name,
  288. DIType *Ty, Constant *Val) {
  289. return createTemplateValueParameterHelper(
  290. VMContext, dwarf::DW_TAG_template_value_parameter, Context, Name, Ty,
  291. getConstantOrNull(Val));
  292. }
  293. DITemplateValueParameter *
  294. DIBuilder::createTemplateTemplateParameter(DIScope *Context, StringRef Name,
  295. DIType *Ty, StringRef Val) {
  296. return createTemplateValueParameterHelper(
  297. VMContext, dwarf::DW_TAG_GNU_template_template_param, Context, Name, Ty,
  298. MDString::get(VMContext, Val));
  299. }
  300. DITemplateValueParameter *
  301. DIBuilder::createTemplateParameterPack(DIScope *Context, StringRef Name,
  302. DIType *Ty, DINodeArray Val) {
  303. return createTemplateValueParameterHelper(
  304. VMContext, dwarf::DW_TAG_GNU_template_parameter_pack, Context, Name, Ty,
  305. Val.get());
  306. }
  307. DICompositeType *DIBuilder::createClassType(
  308. DIScope *Context, StringRef Name, DIFile *File, unsigned LineNumber,
  309. uint64_t SizeInBits, uint64_t AlignInBits, uint64_t OffsetInBits,
  310. DINode::DIFlags Flags, DIType *DerivedFrom, DINodeArray Elements,
  311. DIType *VTableHolder, MDNode *TemplateParams, StringRef UniqueIdentifier) {
  312. assert((!Context || isa<DIScope>(Context)) &&
  313. "createClassType should be called with a valid Context");
  314. auto *R = DICompositeType::get(
  315. VMContext, dwarf::DW_TAG_structure_type, Name, File, LineNumber,
  316. getNonCompileUnitScope(Context), DerivedFrom, SizeInBits, AlignInBits,
  317. OffsetInBits, Flags, Elements, 0, VTableHolder,
  318. cast_or_null<MDTuple>(TemplateParams), UniqueIdentifier);
  319. trackIfUnresolved(R);
  320. return R;
  321. }
  322. DICompositeType *DIBuilder::createStructType(
  323. DIScope *Context, StringRef Name, DIFile *File, unsigned LineNumber,
  324. uint64_t SizeInBits, uint64_t AlignInBits, DINode::DIFlags Flags,
  325. DIType *DerivedFrom, DINodeArray Elements, unsigned RunTimeLang,
  326. DIType *VTableHolder, StringRef UniqueIdentifier) {
  327. auto *R = DICompositeType::get(
  328. VMContext, dwarf::DW_TAG_structure_type, Name, File, LineNumber,
  329. getNonCompileUnitScope(Context), DerivedFrom, SizeInBits, AlignInBits, 0,
  330. Flags, Elements, RunTimeLang, VTableHolder, nullptr, UniqueIdentifier);
  331. trackIfUnresolved(R);
  332. return R;
  333. }
  334. DICompositeType *DIBuilder::createUnionType(
  335. DIScope *Scope, StringRef Name, DIFile *File, unsigned LineNumber,
  336. uint64_t SizeInBits, uint64_t AlignInBits, DINode::DIFlags Flags,
  337. DINodeArray Elements, unsigned RunTimeLang, StringRef UniqueIdentifier) {
  338. auto *R = DICompositeType::get(
  339. VMContext, dwarf::DW_TAG_union_type, Name, File, LineNumber,
  340. getNonCompileUnitScope(Scope), nullptr, SizeInBits, AlignInBits, 0, Flags,
  341. Elements, RunTimeLang, nullptr, nullptr, UniqueIdentifier);
  342. trackIfUnresolved(R);
  343. return R;
  344. }
  345. DISubroutineType *DIBuilder::createSubroutineType(DITypeRefArray ParameterTypes,
  346. DINode::DIFlags Flags,
  347. unsigned CC) {
  348. return DISubroutineType::get(VMContext, Flags, CC, ParameterTypes);
  349. }
  350. DICompositeType *DIBuilder::createExternalTypeRef(unsigned Tag, DIFile *File,
  351. StringRef UniqueIdentifier) {
  352. assert(!UniqueIdentifier.empty() && "external type ref without uid");
  353. return DICompositeType::get(VMContext, Tag, "", nullptr, 0, nullptr, nullptr,
  354. 0, 0, 0, DINode::FlagExternalTypeRef, nullptr, 0,
  355. nullptr, nullptr, UniqueIdentifier);
  356. }
  357. DICompositeType *DIBuilder::createEnumerationType(
  358. DIScope *Scope, StringRef Name, DIFile *File, unsigned LineNumber,
  359. uint64_t SizeInBits, uint64_t AlignInBits, DINodeArray Elements,
  360. DIType *UnderlyingType, StringRef UniqueIdentifier) {
  361. auto *CTy = DICompositeType::get(
  362. VMContext, dwarf::DW_TAG_enumeration_type, Name, File, LineNumber,
  363. getNonCompileUnitScope(Scope), UnderlyingType, SizeInBits, AlignInBits, 0,
  364. DINode::FlagZero, Elements, 0, nullptr, nullptr, UniqueIdentifier);
  365. AllEnumTypes.push_back(CTy);
  366. trackIfUnresolved(CTy);
  367. return CTy;
  368. }
  369. DICompositeType *DIBuilder::createArrayType(uint64_t Size, uint64_t AlignInBits,
  370. DIType *Ty,
  371. DINodeArray Subscripts) {
  372. auto *R = DICompositeType::get(VMContext, dwarf::DW_TAG_array_type, "",
  373. nullptr, 0, nullptr, Ty, Size, AlignInBits, 0,
  374. DINode::FlagZero, Subscripts, 0, nullptr);
  375. trackIfUnresolved(R);
  376. return R;
  377. }
  378. DICompositeType *DIBuilder::createVectorType(uint64_t Size,
  379. uint64_t AlignInBits, DIType *Ty,
  380. DINodeArray Subscripts) {
  381. auto *R = DICompositeType::get(VMContext, dwarf::DW_TAG_array_type, "",
  382. nullptr, 0, nullptr, Ty, Size, AlignInBits, 0,
  383. DINode::FlagVector, Subscripts, 0, nullptr);
  384. trackIfUnresolved(R);
  385. return R;
  386. }
  387. static DIType *createTypeWithFlags(LLVMContext &Context, DIType *Ty,
  388. DINode::DIFlags FlagsToSet) {
  389. auto NewTy = Ty->clone();
  390. NewTy->setFlags(NewTy->getFlags() | FlagsToSet);
  391. return MDNode::replaceWithUniqued(std::move(NewTy));
  392. }
  393. DIType *DIBuilder::createArtificialType(DIType *Ty) {
  394. // FIXME: Restrict this to the nodes where it's valid.
  395. if (Ty->isArtificial())
  396. return Ty;
  397. return createTypeWithFlags(VMContext, Ty, DINode::FlagArtificial);
  398. }
  399. DIType *DIBuilder::createObjectPointerType(DIType *Ty) {
  400. // FIXME: Restrict this to the nodes where it's valid.
  401. if (Ty->isObjectPointer())
  402. return Ty;
  403. DINode::DIFlags Flags = DINode::FlagObjectPointer | DINode::FlagArtificial;
  404. return createTypeWithFlags(VMContext, Ty, Flags);
  405. }
  406. void DIBuilder::retainType(DIScope *T) {
  407. assert(T && "Expected non-null type");
  408. assert((isa<DIType>(T) || (isa<DISubprogram>(T) &&
  409. cast<DISubprogram>(T)->isDefinition() == false)) &&
  410. "Expected type or subprogram declaration");
  411. AllRetainTypes.emplace_back(T);
  412. }
  413. DIBasicType *DIBuilder::createUnspecifiedParameter() { return nullptr; }
  414. DICompositeType *
  415. DIBuilder::createForwardDecl(unsigned Tag, StringRef Name, DIScope *Scope,
  416. DIFile *F, unsigned Line, unsigned RuntimeLang,
  417. uint64_t SizeInBits, uint64_t AlignInBits,
  418. StringRef UniqueIdentifier) {
  419. // FIXME: Define in terms of createReplaceableForwardDecl() by calling
  420. // replaceWithUniqued().
  421. auto *RetTy = DICompositeType::get(
  422. VMContext, Tag, Name, F, Line, getNonCompileUnitScope(Scope), nullptr,
  423. SizeInBits, AlignInBits, 0, DINode::FlagFwdDecl, nullptr, RuntimeLang,
  424. nullptr, nullptr, UniqueIdentifier);
  425. trackIfUnresolved(RetTy);
  426. return RetTy;
  427. }
  428. DICompositeType *DIBuilder::createReplaceableCompositeType(
  429. unsigned Tag, StringRef Name, DIScope *Scope, DIFile *F, unsigned Line,
  430. unsigned RuntimeLang, uint64_t SizeInBits, uint64_t AlignInBits,
  431. DINode::DIFlags Flags, StringRef UniqueIdentifier) {
  432. auto *RetTy =
  433. DICompositeType::getTemporary(
  434. VMContext, Tag, Name, F, Line, getNonCompileUnitScope(Scope), nullptr,
  435. SizeInBits, AlignInBits, 0, Flags, nullptr, RuntimeLang, nullptr,
  436. nullptr, UniqueIdentifier)
  437. .release();
  438. trackIfUnresolved(RetTy);
  439. return RetTy;
  440. }
  441. DINodeArray DIBuilder::getOrCreateArray(ArrayRef<Metadata *> Elements) {
  442. return MDTuple::get(VMContext, Elements);
  443. }
  444. DITypeRefArray DIBuilder::getOrCreateTypeArray(ArrayRef<Metadata *> Elements) {
  445. SmallVector<llvm::Metadata *, 16> Elts;
  446. for (unsigned i = 0, e = Elements.size(); i != e; ++i) {
  447. if (Elements[i] && isa<MDNode>(Elements[i]))
  448. Elts.push_back(cast<DIType>(Elements[i]));
  449. else
  450. Elts.push_back(Elements[i]);
  451. }
  452. return DITypeRefArray(MDNode::get(VMContext, Elts));
  453. }
  454. DISubrange *DIBuilder::getOrCreateSubrange(int64_t Lo, int64_t Count) {
  455. return DISubrange::get(VMContext, Count, Lo);
  456. }
  457. static void checkGlobalVariableScope(DIScope *Context) {
  458. #ifndef NDEBUG
  459. if (auto *CT =
  460. dyn_cast_or_null<DICompositeType>(getNonCompileUnitScope(Context)))
  461. assert(CT->getIdentifier().empty() &&
  462. "Context of a global variable should not be a type with identifier");
  463. #endif
  464. }
  465. DIGlobalVariable *DIBuilder::createGlobalVariable(
  466. DIScope *Context, StringRef Name, StringRef LinkageName, DIFile *F,
  467. unsigned LineNumber, DIType *Ty, bool isLocalToUnit, DIExpression *Expr,
  468. MDNode *Decl) {
  469. checkGlobalVariableScope(Context);
  470. auto *N = DIGlobalVariable::getDistinct(
  471. VMContext, cast_or_null<DIScope>(Context), Name, LinkageName, F,
  472. LineNumber, Ty, isLocalToUnit, true, Expr,
  473. cast_or_null<DIDerivedType>(Decl));
  474. AllGVs.push_back(N);
  475. return N;
  476. }
  477. DIGlobalVariable *DIBuilder::createTempGlobalVariableFwdDecl(
  478. DIScope *Context, StringRef Name, StringRef LinkageName, DIFile *F,
  479. unsigned LineNumber, DIType *Ty, bool isLocalToUnit, DIExpression *Expr,
  480. MDNode *Decl) {
  481. checkGlobalVariableScope(Context);
  482. return DIGlobalVariable::getTemporary(
  483. VMContext, cast_or_null<DIScope>(Context), Name, LinkageName, F,
  484. LineNumber, Ty, isLocalToUnit, false, Expr,
  485. cast_or_null<DIDerivedType>(Decl))
  486. .release();
  487. }
  488. static DILocalVariable *createLocalVariable(
  489. LLVMContext &VMContext,
  490. DenseMap<MDNode *, SmallVector<TrackingMDNodeRef, 1>> &PreservedVariables,
  491. DIScope *Scope, StringRef Name, unsigned ArgNo, DIFile *File,
  492. unsigned LineNo, DIType *Ty, bool AlwaysPreserve, DINode::DIFlags Flags) {
  493. // FIXME: Why getNonCompileUnitScope()?
  494. // FIXME: Why is "!Context" okay here?
  495. // FIXME: Why doesn't this check for a subprogram or lexical block (AFAICT
  496. // the only valid scopes)?
  497. DIScope *Context = getNonCompileUnitScope(Scope);
  498. auto *Node =
  499. DILocalVariable::get(VMContext, cast_or_null<DILocalScope>(Context), Name,
  500. File, LineNo, Ty, ArgNo, Flags);
  501. if (AlwaysPreserve) {
  502. // The optimizer may remove local variables. If there is an interest
  503. // to preserve variable info in such situation then stash it in a
  504. // named mdnode.
  505. DISubprogram *Fn = getDISubprogram(Scope);
  506. assert(Fn && "Missing subprogram for local variable");
  507. PreservedVariables[Fn].emplace_back(Node);
  508. }
  509. return Node;
  510. }
  511. DILocalVariable *DIBuilder::createAutoVariable(DIScope *Scope, StringRef Name,
  512. DIFile *File, unsigned LineNo,
  513. DIType *Ty, bool AlwaysPreserve,
  514. DINode::DIFlags Flags) {
  515. return createLocalVariable(VMContext, PreservedVariables, Scope, Name,
  516. /* ArgNo */ 0, File, LineNo, Ty, AlwaysPreserve,
  517. Flags);
  518. }
  519. DILocalVariable *DIBuilder::createParameterVariable(
  520. DIScope *Scope, StringRef Name, unsigned ArgNo, DIFile *File,
  521. unsigned LineNo, DIType *Ty, bool AlwaysPreserve, DINode::DIFlags Flags) {
  522. assert(ArgNo && "Expected non-zero argument number for parameter");
  523. return createLocalVariable(VMContext, PreservedVariables, Scope, Name, ArgNo,
  524. File, LineNo, Ty, AlwaysPreserve, Flags);
  525. }
  526. DIExpression *DIBuilder::createExpression(ArrayRef<uint64_t> Addr) {
  527. return DIExpression::get(VMContext, Addr);
  528. }
  529. DIExpression *DIBuilder::createExpression(ArrayRef<int64_t> Signed) {
  530. // TODO: Remove the callers of this signed version and delete.
  531. SmallVector<uint64_t, 8> Addr(Signed.begin(), Signed.end());
  532. return createExpression(Addr);
  533. }
  534. DIExpression *DIBuilder::createBitPieceExpression(unsigned OffsetInBytes,
  535. unsigned SizeInBytes) {
  536. uint64_t Addr[] = {dwarf::DW_OP_bit_piece, OffsetInBytes, SizeInBytes};
  537. return DIExpression::get(VMContext, Addr);
  538. }
  539. template <class... Ts>
  540. static DISubprogram *getSubprogram(bool IsDistinct, Ts &&... Args) {
  541. if (IsDistinct)
  542. return DISubprogram::getDistinct(std::forward<Ts>(Args)...);
  543. return DISubprogram::get(std::forward<Ts>(Args)...);
  544. }
  545. DISubprogram *DIBuilder::createFunction(
  546. DIScope *Context, StringRef Name, StringRef LinkageName, DIFile *File,
  547. unsigned LineNo, DISubroutineType *Ty, bool isLocalToUnit,
  548. bool isDefinition, unsigned ScopeLine, DINode::DIFlags Flags,
  549. bool isOptimized, DITemplateParameterArray TParams, DISubprogram *Decl) {
  550. auto *Node = getSubprogram(
  551. /* IsDistinct = */ isDefinition, VMContext,
  552. getNonCompileUnitScope(Context), Name, LinkageName, File, LineNo, Ty,
  553. isLocalToUnit, isDefinition, ScopeLine, nullptr, 0, 0, 0, Flags,
  554. isOptimized, isDefinition ? CUNode : nullptr, TParams, Decl,
  555. MDTuple::getTemporary(VMContext, None).release());
  556. if (isDefinition)
  557. AllSubprograms.push_back(Node);
  558. trackIfUnresolved(Node);
  559. return Node;
  560. }
  561. DISubprogram *DIBuilder::createTempFunctionFwdDecl(
  562. DIScope *Context, StringRef Name, StringRef LinkageName, DIFile *File,
  563. unsigned LineNo, DISubroutineType *Ty, bool isLocalToUnit,
  564. bool isDefinition, unsigned ScopeLine, DINode::DIFlags Flags,
  565. bool isOptimized, DITemplateParameterArray TParams, DISubprogram *Decl) {
  566. return DISubprogram::getTemporary(
  567. VMContext, getNonCompileUnitScope(Context), Name, LinkageName,
  568. File, LineNo, Ty, isLocalToUnit, isDefinition, ScopeLine, nullptr,
  569. 0, 0, 0, Flags, isOptimized, isDefinition ? CUNode : nullptr,
  570. TParams, Decl, nullptr)
  571. .release();
  572. }
  573. DISubprogram *DIBuilder::createMethod(DIScope *Context, StringRef Name,
  574. StringRef LinkageName, DIFile *F,
  575. unsigned LineNo, DISubroutineType *Ty,
  576. bool isLocalToUnit, bool isDefinition,
  577. unsigned VK, unsigned VIndex,
  578. int ThisAdjustment, DIType *VTableHolder,
  579. DINode::DIFlags Flags, bool isOptimized,
  580. DITemplateParameterArray TParams) {
  581. assert(getNonCompileUnitScope(Context) &&
  582. "Methods should have both a Context and a context that isn't "
  583. "the compile unit.");
  584. // FIXME: Do we want to use different scope/lines?
  585. auto *SP = getSubprogram(
  586. /* IsDistinct = */ isDefinition, VMContext, cast<DIScope>(Context), Name,
  587. LinkageName, F, LineNo, Ty, isLocalToUnit, isDefinition, LineNo,
  588. VTableHolder, VK, VIndex, ThisAdjustment, Flags, isOptimized,
  589. isDefinition ? CUNode : nullptr, TParams, nullptr, nullptr);
  590. if (isDefinition)
  591. AllSubprograms.push_back(SP);
  592. trackIfUnresolved(SP);
  593. return SP;
  594. }
  595. DINamespace *DIBuilder::createNameSpace(DIScope *Scope, StringRef Name,
  596. DIFile *File, unsigned LineNo) {
  597. return DINamespace::get(VMContext, getNonCompileUnitScope(Scope), File, Name,
  598. LineNo);
  599. }
  600. DIModule *DIBuilder::createModule(DIScope *Scope, StringRef Name,
  601. StringRef ConfigurationMacros,
  602. StringRef IncludePath,
  603. StringRef ISysRoot) {
  604. return DIModule::get(VMContext, getNonCompileUnitScope(Scope), Name,
  605. ConfigurationMacros, IncludePath, ISysRoot);
  606. }
  607. DILexicalBlockFile *DIBuilder::createLexicalBlockFile(DIScope *Scope,
  608. DIFile *File,
  609. unsigned Discriminator) {
  610. return DILexicalBlockFile::get(VMContext, Scope, File, Discriminator);
  611. }
  612. DILexicalBlock *DIBuilder::createLexicalBlock(DIScope *Scope, DIFile *File,
  613. unsigned Line, unsigned Col) {
  614. // Make these distinct, to avoid merging two lexical blocks on the same
  615. // file/line/column.
  616. return DILexicalBlock::getDistinct(VMContext, getNonCompileUnitScope(Scope),
  617. File, Line, Col);
  618. }
  619. static Value *getDbgIntrinsicValueImpl(LLVMContext &VMContext, Value *V) {
  620. assert(V && "no value passed to dbg intrinsic");
  621. return MetadataAsValue::get(VMContext, ValueAsMetadata::get(V));
  622. }
  623. static Instruction *withDebugLoc(Instruction *I, const DILocation *DL) {
  624. I->setDebugLoc(const_cast<DILocation *>(DL));
  625. return I;
  626. }
  627. Instruction *DIBuilder::insertDeclare(Value *Storage, DILocalVariable *VarInfo,
  628. DIExpression *Expr, const DILocation *DL,
  629. Instruction *InsertBefore) {
  630. assert(VarInfo && "empty or invalid DILocalVariable* passed to dbg.declare");
  631. assert(DL && "Expected debug loc");
  632. assert(DL->getScope()->getSubprogram() ==
  633. VarInfo->getScope()->getSubprogram() &&
  634. "Expected matching subprograms");
  635. if (!DeclareFn)
  636. DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
  637. trackIfUnresolved(VarInfo);
  638. trackIfUnresolved(Expr);
  639. Value *Args[] = {getDbgIntrinsicValueImpl(VMContext, Storage),
  640. MetadataAsValue::get(VMContext, VarInfo),
  641. MetadataAsValue::get(VMContext, Expr)};
  642. return withDebugLoc(CallInst::Create(DeclareFn, Args, "", InsertBefore), DL);
  643. }
  644. Instruction *DIBuilder::insertDeclare(Value *Storage, DILocalVariable *VarInfo,
  645. DIExpression *Expr, const DILocation *DL,
  646. BasicBlock *InsertAtEnd) {
  647. assert(VarInfo && "empty or invalid DILocalVariable* passed to dbg.declare");
  648. assert(DL && "Expected debug loc");
  649. assert(DL->getScope()->getSubprogram() ==
  650. VarInfo->getScope()->getSubprogram() &&
  651. "Expected matching subprograms");
  652. if (!DeclareFn)
  653. DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
  654. trackIfUnresolved(VarInfo);
  655. trackIfUnresolved(Expr);
  656. Value *Args[] = {getDbgIntrinsicValueImpl(VMContext, Storage),
  657. MetadataAsValue::get(VMContext, VarInfo),
  658. MetadataAsValue::get(VMContext, Expr)};
  659. // If this block already has a terminator then insert this intrinsic
  660. // before the terminator.
  661. if (TerminatorInst *T = InsertAtEnd->getTerminator())
  662. return withDebugLoc(CallInst::Create(DeclareFn, Args, "", T), DL);
  663. return withDebugLoc(CallInst::Create(DeclareFn, Args, "", InsertAtEnd), DL);
  664. }
  665. Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,
  666. DILocalVariable *VarInfo,
  667. DIExpression *Expr,
  668. const DILocation *DL,
  669. Instruction *InsertBefore) {
  670. assert(V && "no value passed to dbg.value");
  671. assert(VarInfo && "empty or invalid DILocalVariable* passed to dbg.value");
  672. assert(DL && "Expected debug loc");
  673. assert(DL->getScope()->getSubprogram() ==
  674. VarInfo->getScope()->getSubprogram() &&
  675. "Expected matching subprograms");
  676. if (!ValueFn)
  677. ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value);
  678. trackIfUnresolved(VarInfo);
  679. trackIfUnresolved(Expr);
  680. Value *Args[] = {getDbgIntrinsicValueImpl(VMContext, V),
  681. ConstantInt::get(Type::getInt64Ty(VMContext), Offset),
  682. MetadataAsValue::get(VMContext, VarInfo),
  683. MetadataAsValue::get(VMContext, Expr)};
  684. return withDebugLoc(CallInst::Create(ValueFn, Args, "", InsertBefore), DL);
  685. }
  686. Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,
  687. DILocalVariable *VarInfo,
  688. DIExpression *Expr,
  689. const DILocation *DL,
  690. BasicBlock *InsertAtEnd) {
  691. assert(V && "no value passed to dbg.value");
  692. assert(VarInfo && "empty or invalid DILocalVariable* passed to dbg.value");
  693. assert(DL && "Expected debug loc");
  694. assert(DL->getScope()->getSubprogram() ==
  695. VarInfo->getScope()->getSubprogram() &&
  696. "Expected matching subprograms");
  697. if (!ValueFn)
  698. ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value);
  699. trackIfUnresolved(VarInfo);
  700. trackIfUnresolved(Expr);
  701. Value *Args[] = {getDbgIntrinsicValueImpl(VMContext, V),
  702. ConstantInt::get(Type::getInt64Ty(VMContext), Offset),
  703. MetadataAsValue::get(VMContext, VarInfo),
  704. MetadataAsValue::get(VMContext, Expr)};
  705. return withDebugLoc(CallInst::Create(ValueFn, Args, "", InsertAtEnd), DL);
  706. }
  707. void DIBuilder::replaceVTableHolder(DICompositeType *&T,
  708. DICompositeType *VTableHolder) {
  709. {
  710. TypedTrackingMDRef<DICompositeType> N(T);
  711. N->replaceVTableHolder(VTableHolder);
  712. T = N.get();
  713. }
  714. // If this didn't create a self-reference, just return.
  715. if (T != VTableHolder)
  716. return;
  717. // Look for unresolved operands. T will drop RAUW support, orphaning any
  718. // cycles underneath it.
  719. if (T->isResolved())
  720. for (const MDOperand &O : T->operands())
  721. if (auto *N = dyn_cast_or_null<MDNode>(O))
  722. trackIfUnresolved(N);
  723. }
  724. void DIBuilder::replaceArrays(DICompositeType *&T, DINodeArray Elements,
  725. DINodeArray TParams) {
  726. {
  727. TypedTrackingMDRef<DICompositeType> N(T);
  728. if (Elements)
  729. N->replaceElements(Elements);
  730. if (TParams)
  731. N->replaceTemplateParams(DITemplateParameterArray(TParams));
  732. T = N.get();
  733. }
  734. // If T isn't resolved, there's no problem.
  735. if (!T->isResolved())
  736. return;
  737. // If T is resolved, it may be due to a self-reference cycle. Track the
  738. // arrays explicitly if they're unresolved, or else the cycles will be
  739. // orphaned.
  740. if (Elements)
  741. trackIfUnresolved(Elements.get());
  742. if (TParams)
  743. trackIfUnresolved(TParams.get());
  744. }