blob: 2de109b86cf9aa7d75f1e72f8093ba9640febdcd [file] [log] [blame]
Devang Patel57c5a202010-11-04 15:01:38 +00001//===--- 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
Chandler Carruth12664a02014-03-06 00:22:06 +000014#include "llvm/IR/DIBuilder.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000015#include "llvm/ADT/STLExtras.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000016#include "llvm/IR/Constants.h"
Chandler Carruth9a4c9e52014-03-06 00:46:21 +000017#include "llvm/IR/DebugInfo.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000018#include "llvm/IR/IntrinsicInst.h"
19#include "llvm/IR/Module.h"
Eric Christopher34164192012-04-03 00:43:49 +000020#include "llvm/Support/Debug.h"
Devang Patel57c5a202010-11-04 15:01:38 +000021#include "llvm/Support/Dwarf.h"
22
23using namespace llvm;
24using namespace llvm::dwarf;
25
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +000026namespace {
27class HeaderBuilder {
28 SmallVector<char, 256> Chars;
29
30public:
31 explicit HeaderBuilder(Twine T) { T.toVector(Chars); }
32 HeaderBuilder(const HeaderBuilder &X) : Chars(X.Chars) {}
33 HeaderBuilder(HeaderBuilder &&X) : Chars(std::move(X.Chars)) {}
34
35 template <class Twineable> HeaderBuilder &concat(Twineable &&X) {
36 Chars.push_back(0);
37 Twine(X).toVector(Chars);
38 return *this;
39 }
40
41 MDString *get(LLVMContext &Context) const {
42 return MDString::get(Context, StringRef(Chars.begin(), Chars.size()));
43 }
44
45 static HeaderBuilder get(unsigned Tag) {
46 return HeaderBuilder("0x" + Twine::utohexstr(Tag));
47 }
48};
Devang Patel57c5a202010-11-04 15:01:38 +000049}
Devang Patel63f83cd2010-12-07 23:58:00 +000050
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +000051DIBuilder::DIBuilder(Module &m, bool AllowUnresolvedNodes)
Craig Topperc6207612014-04-09 06:08:46 +000052 : M(m), VMContext(M.getContext()), TempEnumTypes(nullptr),
53 TempRetainTypes(nullptr), TempSubprograms(nullptr), TempGVs(nullptr),
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +000054 DeclareFn(nullptr), ValueFn(nullptr),
55 AllowUnresolvedNodes(AllowUnresolvedNodes) {}
56
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +000057void DIBuilder::trackIfUnresolved(MDNode *N) {
Duncan P. N. Exon Smith9b1c6d32015-01-19 19:09:14 +000058 if (!N)
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +000059 return;
Duncan P. N. Exon Smith9b1c6d32015-01-19 19:09:14 +000060 if (N->isResolved())
61 return;
62
63 assert(AllowUnresolvedNodes && "Cannot handle unresolved nodes");
64 UnresolvedNodes.emplace_back(N);
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +000065}
Devang Patel57c5a202010-11-04 15:01:38 +000066
Devang Patel2b8acaf2011-08-15 23:00:00 +000067void DIBuilder::finalize() {
Devang Pateleb1bb4e2011-08-16 22:09:43 +000068 DIArray Enums = getOrCreateArray(AllEnumTypes);
69 DIType(TempEnumTypes).replaceAllUsesWith(Enums);
70
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +000071 SmallVector<Metadata *, 16> RetainValues;
Manman Ren0b410402013-08-29 23:17:54 +000072 // Declarations and definitions of the same type may be retained. Some
73 // clients RAUW these pairs, leaving duplicates in the retained types
74 // list. Use a set to remove the duplicates while we transform the
75 // TrackingVHs back into Values.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +000076 SmallPtrSet<Metadata *, 16> RetainSet;
Manman Ren0b410402013-08-29 23:17:54 +000077 for (unsigned I = 0, E = AllRetainTypes.size(); I < E; I++)
David Blaikie70573dc2014-11-19 07:49:26 +000078 if (RetainSet.insert(AllRetainTypes[I]).second)
Manman Ren0b410402013-08-29 23:17:54 +000079 RetainValues.push_back(AllRetainTypes[I]);
80 DIArray RetainTypes = getOrCreateArray(RetainValues);
Devang Pateleb1bb4e2011-08-16 22:09:43 +000081 DIType(TempRetainTypes).replaceAllUsesWith(RetainTypes);
82
83 DIArray SPs = getOrCreateArray(AllSubprograms);
84 DIType(TempSubprograms).replaceAllUsesWith(SPs);
Devang Patel59e27c52011-08-19 23:28:12 +000085 for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i) {
86 DISubprogram SP(SPs.getElement(i));
Eric Christopher27deb262012-04-23 19:00:11 +000087 if (MDNode *Temp = SP.getVariablesNodes()) {
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +000088 SmallVector<Metadata *, 4> Variables;
89 for (Metadata *V : PreservedVariables.lookup(SP))
Duncan P. N. Exon Smith3bfffde2014-10-15 16:11:41 +000090 Variables.push_back(V);
Eric Christopher27deb262012-04-23 19:00:11 +000091 DIArray AV = getOrCreateArray(Variables);
92 DIType(Temp).replaceAllUsesWith(AV);
93 }
Devang Patel59e27c52011-08-19 23:28:12 +000094 }
Devang Pateleb1bb4e2011-08-16 22:09:43 +000095
96 DIArray GVs = getOrCreateArray(AllGVs);
97 DIType(TempGVs).replaceAllUsesWith(GVs);
David Blaikief55abea2013-04-22 06:12:31 +000098
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +000099 SmallVector<Metadata *, 16> RetainValuesI;
Eric Christopher2c3a6dc2014-02-28 21:27:57 +0000100 for (unsigned I = 0, E = AllImportedModules.size(); I < E; I++)
101 RetainValuesI.push_back(AllImportedModules[I]);
102 DIArray IMs = getOrCreateArray(RetainValuesI);
David Blaikief55abea2013-04-22 06:12:31 +0000103 DIType(TempImportedModules).replaceAllUsesWith(IMs);
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000104
105 // Now that all temp nodes have been replaced or deleted, resolve remaining
106 // cycles.
107 for (const auto &N : UnresolvedNodes)
108 if (N)
Duncan P. N. Exon Smith118632d2015-01-12 20:09:34 +0000109 cast<UniquableMDNode>(N)->resolveCycles();
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000110 UnresolvedNodes.clear();
111
112 // Can't handle unresolved nodes anymore.
113 AllowUnresolvedNodes = false;
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000114}
115
Duncan P. N. Exon Smith379e3752014-10-01 21:32:15 +0000116/// If N is compile unit return NULL otherwise return N.
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000117static MDNode *getNonCompileUnitScope(MDNode *N) {
118 if (DIDescriptor(N).isCompileUnit())
Craig Topperc6207612014-04-09 06:08:46 +0000119 return nullptr;
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000120 return N;
Devang Patel2b8acaf2011-08-15 23:00:00 +0000121}
122
David Blaikieefb0d652013-03-20 23:58:12 +0000123static MDNode *createFilePathPair(LLVMContext &VMContext, StringRef Filename,
124 StringRef Directory) {
125 assert(!Filename.empty() && "Unable to create file without name");
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000126 Metadata *Pair[] = {MDString::get(VMContext, Filename),
127 MDString::get(VMContext, Directory)};
David Blaikieefb0d652013-03-20 23:58:12 +0000128 return MDNode::get(VMContext, Pair);
129}
130
Eric Christopher03b3e112013-07-19 00:51:47 +0000131DICompileUnit DIBuilder::createCompileUnit(unsigned Lang, StringRef Filename,
132 StringRef Directory,
133 StringRef Producer, bool isOptimized,
134 StringRef Flags, unsigned RunTimeVer,
Eric Christopher75d49db2014-02-27 01:24:56 +0000135 StringRef SplitName,
Diego Novillo56653fd2014-06-24 17:02:03 +0000136 DebugEmissionKind Kind,
137 bool EmitDebugInfo) {
Eric Christopher75d49db2014-02-27 01:24:56 +0000138
Peter Collingbourneb2f70c72014-04-28 18:11:01 +0000139 assert(((Lang <= dwarf::DW_LANG_OCaml && Lang >= dwarf::DW_LANG_C89) ||
Chandler Carruth4c0ee742012-01-10 18:18:52 +0000140 (Lang <= dwarf::DW_LANG_hi_user && Lang >= dwarf::DW_LANG_lo_user)) &&
141 "Invalid Language tag");
142 assert(!Filename.empty() &&
143 "Unable to create compile unit without filename");
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000144 Metadata *TElts[] = {HeaderBuilder::get(DW_TAG_base_type).get(VMContext)};
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000145 TempEnumTypes = MDNode::getTemporary(VMContext, TElts);
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000146
147 TempRetainTypes = MDNode::getTemporary(VMContext, TElts);
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000148
149 TempSubprograms = MDNode::getTemporary(VMContext, TElts);
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000150
151 TempGVs = MDNode::getTemporary(VMContext, TElts);
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000152
David Blaikief55abea2013-04-22 06:12:31 +0000153 TempImportedModules = MDNode::getTemporary(VMContext, TElts);
154
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000155 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_compile_unit)
156 .concat(Lang)
157 .concat(Producer)
158 .concat(isOptimized)
159 .concat(Flags)
160 .concat(RunTimeVer)
161 .concat(SplitName)
162 .concat(Kind)
163 .get(VMContext),
164 createFilePathPair(VMContext, Filename, Directory),
165 TempEnumTypes, TempRetainTypes, TempSubprograms, TempGVs,
166 TempImportedModules};
Eric Christopher03b3e112013-07-19 00:51:47 +0000167
168 MDNode *CUNode = MDNode::get(VMContext, Elts);
Devang Patel09fa69e2011-05-03 16:18:28 +0000169
170 // Create a named metadata so that it is easier to find cu in a module.
Diego Novillo56653fd2014-06-24 17:02:03 +0000171 // Note that we only generate this when the caller wants to actually
172 // emit debug information. When we are only interested in tracking
173 // source line locations throughout the backend, we prevent codegen from
174 // emitting debug info in the final output by not generating llvm.dbg.cu.
175 if (EmitDebugInfo) {
176 NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.cu");
177 NMD->addOperand(CUNode);
178 }
Eric Christopher03b3e112013-07-19 00:51:47 +0000179
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000180 trackIfUnresolved(CUNode);
Eric Christopher03b3e112013-07-19 00:51:47 +0000181 return DICompileUnit(CUNode);
Devang Patel57c5a202010-11-04 15:01:38 +0000182}
183
David Blaikiee63d5d12013-05-20 22:50:35 +0000184static DIImportedEntity
David Blaikie2a40c142014-04-06 06:29:01 +0000185createImportedModule(LLVMContext &C, dwarf::Tag Tag, DIScope Context,
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000186 Metadata *NS, unsigned Line, StringRef Name,
187 SmallVectorImpl<TrackingMDNodeRef> &AllImportedModules) {
David Blaikiee63d5d12013-05-20 22:50:35 +0000188 const MDNode *R;
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000189 Metadata *Elts[] = {HeaderBuilder::get(Tag).concat(Line).concat(Name).get(C),
190 Context, NS};
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000191 R = MDNode::get(C, Elts);
David Blaikiee63d5d12013-05-20 22:50:35 +0000192 DIImportedEntity M(R);
David Blaikie1fd43652013-05-07 21:35:53 +0000193 assert(M.Verify() && "Imported module should be valid");
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000194 AllImportedModules.emplace_back(M.get());
David Blaikie1fd43652013-05-07 21:35:53 +0000195 return M;
196}
197
David Blaikiee63d5d12013-05-20 22:50:35 +0000198DIImportedEntity DIBuilder::createImportedModule(DIScope Context,
David Blaikie2a40c142014-04-06 06:29:01 +0000199 DINameSpace NS,
200 unsigned Line) {
201 return ::createImportedModule(VMContext, dwarf::DW_TAG_imported_module,
202 Context, NS, Line, StringRef(), AllImportedModules);
David Blaikiee63d5d12013-05-20 22:50:35 +0000203}
204
205DIImportedEntity DIBuilder::createImportedModule(DIScope Context,
206 DIImportedEntity NS,
David Blaikie2a40c142014-04-06 06:29:01 +0000207 unsigned Line) {
208 return ::createImportedModule(VMContext, dwarf::DW_TAG_imported_module,
209 Context, NS, Line, StringRef(), AllImportedModules);
David Blaikiee63d5d12013-05-20 22:50:35 +0000210}
211
David Blaikie1fd43652013-05-07 21:35:53 +0000212DIImportedEntity DIBuilder::createImportedDeclaration(DIScope Context,
Frederic Riss4aa51ae2014-11-06 17:46:55 +0000213 DIDescriptor Decl,
David Blaikie2a40c142014-04-06 06:29:01 +0000214 unsigned Line, StringRef Name) {
Frederic Riss4aa51ae2014-11-06 17:46:55 +0000215 // Make sure to use the unique identifier based metadata reference for
216 // types that have one.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000217 Metadata *V =
218 Decl.isType() ? static_cast<Metadata *>(DIType(Decl).getRef()) : Decl;
David Blaikie2a40c142014-04-06 06:29:01 +0000219 return ::createImportedModule(VMContext, dwarf::DW_TAG_imported_declaration,
Frederic Riss4aa51ae2014-11-06 17:46:55 +0000220 Context, V, Line, Name,
David Blaikie2a40c142014-04-06 06:29:01 +0000221 AllImportedModules);
222}
223
224DIImportedEntity DIBuilder::createImportedDeclaration(DIScope Context,
225 DIImportedEntity Imp,
226 unsigned Line, StringRef Name) {
227 return ::createImportedModule(VMContext, dwarf::DW_TAG_imported_declaration,
228 Context, Imp, Line, Name, AllImportedModules);
David Blaikief55abea2013-04-22 06:12:31 +0000229}
230
Devang Patel9b412732011-02-22 18:56:12 +0000231DIFile DIBuilder::createFile(StringRef Filename, StringRef Directory) {
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000232 Metadata *Elts[] = {
233 HeaderBuilder::get(dwarf::DW_TAG_file_type).get(VMContext),
234 createFilePathPair(VMContext, Filename, Directory)};
David Blaikie5692e722013-03-28 02:44:59 +0000235 return DIFile(MDNode::get(VMContext, Elts));
Devang Patel57c5a202010-11-04 15:01:38 +0000236}
237
David Blaikieb7619002013-06-24 17:34:33 +0000238DIEnumerator DIBuilder::createEnumerator(StringRef Name, int64_t Val) {
Devang Patel1ad1abe2011-09-12 18:26:08 +0000239 assert(!Name.empty() && "Unable to create enumerator without name");
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000240 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_enumerator)
241 .concat(Name)
242 .concat(Val)
243 .get(VMContext)};
David Blaikie5692e722013-03-28 02:44:59 +0000244 return DIEnumerator(MDNode::get(VMContext, Elts));
Devang Patel57c5a202010-11-04 15:01:38 +0000245}
246
Peter Collingbournea4a47cb2013-06-27 22:50:59 +0000247DIBasicType DIBuilder::createUnspecifiedType(StringRef Name) {
Devang Patel04d6d472011-09-14 23:13:28 +0000248 assert(!Name.empty() && "Unable to create type without name");
Peter Collingbournea4a47cb2013-06-27 22:50:59 +0000249 // Unspecified types are encoded in DIBasicType format. Line number, filename,
250 // size, alignment, offset and flags are always empty here.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000251 Metadata *Elts[] = {
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000252 HeaderBuilder::get(dwarf::DW_TAG_unspecified_type)
253 .concat(Name)
254 .concat(0)
255 .concat(0)
256 .concat(0)
257 .concat(0)
258 .concat(0)
259 .concat(0)
260 .get(VMContext),
261 nullptr, // Filename
262 nullptr // Unused
Devang Patel04d6d472011-09-14 23:13:28 +0000263 };
Manman Ren3c6acec2013-06-07 18:35:53 +0000264 return DIBasicType(MDNode::get(VMContext, Elts));
Devang Patel04d6d472011-09-14 23:13:28 +0000265}
266
Peter Collingbournea4a47cb2013-06-27 22:50:59 +0000267DIBasicType DIBuilder::createNullPtrType() {
268 return createUnspecifiedType("decltype(nullptr)");
269}
270
David Blaikie209d63a2013-02-12 00:40:41 +0000271DIBasicType
272DIBuilder::createBasicType(StringRef Name, uint64_t SizeInBits,
273 uint64_t AlignInBits, unsigned Encoding) {
Devang Patel1ad1abe2011-09-12 18:26:08 +0000274 assert(!Name.empty() && "Unable to create type without name");
Devang Patel57c5a202010-11-04 15:01:38 +0000275 // Basic types are encoded in DIBasicType format. Line number, filename,
276 // offset and flags are always empty here.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000277 Metadata *Elts[] = {
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000278 HeaderBuilder::get(dwarf::DW_TAG_base_type)
279 .concat(Name)
280 .concat(0) // Line
281 .concat(SizeInBits)
282 .concat(AlignInBits)
283 .concat(0) // Offset
284 .concat(0) // Flags
285 .concat(Encoding)
286 .get(VMContext),
287 nullptr, // Filename
288 nullptr // Unused
Benjamin Kramered8b7bf2010-11-04 18:45:27 +0000289 };
David Blaikie5692e722013-03-28 02:44:59 +0000290 return DIBasicType(MDNode::get(VMContext, Elts));
Devang Patel57c5a202010-11-04 15:01:38 +0000291}
292
David Blaikief11de2f2013-02-18 06:41:57 +0000293DIDerivedType DIBuilder::createQualifiedType(unsigned Tag, DIType FromTy) {
Benjamin Kramered8b7bf2010-11-04 18:45:27 +0000294 // Qualified types are encoded in DIDerivedType format.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000295 Metadata *Elts[] = {HeaderBuilder::get(Tag)
296 .concat(StringRef()) // Name
297 .concat(0) // Line
298 .concat(0) // Size
299 .concat(0) // Align
300 .concat(0) // Offset
301 .concat(0) // Flags
302 .get(VMContext),
303 nullptr, // Filename
304 nullptr, // Unused
305 FromTy.getRef()};
David Blaikie5692e722013-03-28 02:44:59 +0000306 return DIDerivedType(MDNode::get(VMContext, Elts));
Devang Patel57c5a202010-11-04 15:01:38 +0000307}
308
David Blaikief11de2f2013-02-18 06:41:57 +0000309DIDerivedType
310DIBuilder::createPointerType(DIType PointeeTy, uint64_t SizeInBits,
311 uint64_t AlignInBits, StringRef Name) {
Benjamin Kramered8b7bf2010-11-04 18:45:27 +0000312 // Pointer types are encoded in DIDerivedType format.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000313 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_pointer_type)
314 .concat(Name)
315 .concat(0) // Line
316 .concat(SizeInBits)
317 .concat(AlignInBits)
318 .concat(0) // Offset
319 .concat(0) // Flags
320 .get(VMContext),
321 nullptr, // Filename
322 nullptr, // Unused
323 PointeeTy.getRef()};
David Blaikie5692e722013-03-28 02:44:59 +0000324 return DIDerivedType(MDNode::get(VMContext, Elts));
Devang Patel57c5a202010-11-04 15:01:38 +0000325}
326
Adrian Prantl48af2ef2014-12-23 19:11:47 +0000327DIDerivedType
328DIBuilder::createMemberPointerType(DIType PointeeTy, DIType Base,
329 uint64_t SizeInBits, uint64_t AlignInBits) {
David Blaikie5d3249b2013-01-07 05:51:15 +0000330 // Pointer types are encoded in DIDerivedType format.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000331 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_ptr_to_member_type)
332 .concat(StringRef())
333 .concat(0) // Line
Adrian Prantl48af2ef2014-12-23 19:11:47 +0000334 .concat(SizeInBits) // Size
335 .concat(AlignInBits) // Align
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000336 .concat(0) // Offset
337 .concat(0) // Flags
338 .get(VMContext),
339 nullptr, // Filename
340 nullptr, // Unused
341 PointeeTy.getRef(), Base.getRef()};
David Blaikie5692e722013-03-28 02:44:59 +0000342 return DIDerivedType(MDNode::get(VMContext, Elts));
David Blaikie5d3249b2013-01-07 05:51:15 +0000343}
344
David Blaikief11de2f2013-02-18 06:41:57 +0000345DIDerivedType DIBuilder::createReferenceType(unsigned Tag, DIType RTy) {
Manman Ren74c188f2013-07-01 21:02:01 +0000346 assert(RTy.isType() && "Unable to create reference type");
Benjamin Kramered8b7bf2010-11-04 18:45:27 +0000347 // References are encoded in DIDerivedType format.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000348 Metadata *Elts[] = {HeaderBuilder::get(Tag)
349 .concat(StringRef()) // Name
350 .concat(0) // Line
351 .concat(0) // Size
352 .concat(0) // Align
353 .concat(0) // Offset
354 .concat(0) // Flags
355 .get(VMContext),
356 nullptr, // Filename
357 nullptr, // TheCU,
358 RTy.getRef()};
David Blaikie5692e722013-03-28 02:44:59 +0000359 return DIDerivedType(MDNode::get(VMContext, Elts));
Devang Patel57c5a202010-11-04 15:01:38 +0000360}
361
David Blaikief11de2f2013-02-18 06:41:57 +0000362DIDerivedType DIBuilder::createTypedef(DIType Ty, StringRef Name, DIFile File,
363 unsigned LineNo, DIDescriptor Context) {
Benjamin Kramered8b7bf2010-11-04 18:45:27 +0000364 // typedefs are encoded in DIDerivedType format.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000365 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_typedef)
366 .concat(Name)
367 .concat(LineNo)
368 .concat(0) // Size
369 .concat(0) // Align
370 .concat(0) // Offset
371 .concat(0) // Flags
372 .get(VMContext),
373 File.getFileNode(),
374 DIScope(getNonCompileUnitScope(Context)).getRef(),
375 Ty.getRef()};
David Blaikie5692e722013-03-28 02:44:59 +0000376 return DIDerivedType(MDNode::get(VMContext, Elts));
Devang Patel57c5a202010-11-04 15:01:38 +0000377}
378
Manman Ren3c6acec2013-06-07 18:35:53 +0000379DIDerivedType DIBuilder::createFriend(DIType Ty, DIType FriendTy) {
Benjamin Kramered8b7bf2010-11-04 18:45:27 +0000380 // typedefs are encoded in DIDerivedType format.
Manman Ren74c188f2013-07-01 21:02:01 +0000381 assert(Ty.isType() && "Invalid type!");
382 assert(FriendTy.isType() && "Invalid friend type!");
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000383 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_friend)
384 .concat(StringRef()) // Name
385 .concat(0) // Line
386 .concat(0) // Size
387 .concat(0) // Align
388 .concat(0) // Offset
389 .concat(0) // Flags
390 .get(VMContext),
391 nullptr, Ty.getRef(), FriendTy.getRef()};
Manman Ren3c6acec2013-06-07 18:35:53 +0000392 return DIDerivedType(MDNode::get(VMContext, Elts));
Devang Patel57c5a202010-11-04 15:01:38 +0000393}
394
Eric Christopher98f9c232013-10-15 23:31:31 +0000395DIDerivedType DIBuilder::createInheritance(DIType Ty, DIType BaseTy,
396 uint64_t BaseOffset,
397 unsigned Flags) {
Manman Ren74c188f2013-07-01 21:02:01 +0000398 assert(Ty.isType() && "Unable to create inheritance");
Benjamin Kramered8b7bf2010-11-04 18:45:27 +0000399 // TAG_inheritance is encoded in DIDerivedType format.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000400 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_inheritance)
401 .concat(StringRef()) // Name
402 .concat(0) // Line
403 .concat(0) // Size
404 .concat(0) // Align
405 .concat(BaseOffset)
406 .concat(Flags)
407 .get(VMContext),
408 nullptr, Ty.getRef(), BaseTy.getRef()};
David Blaikie5692e722013-03-28 02:44:59 +0000409 return DIDerivedType(MDNode::get(VMContext, Elts));
Devang Patel57c5a202010-11-04 15:01:38 +0000410}
411
Eric Christopher98f9c232013-10-15 23:31:31 +0000412DIDerivedType DIBuilder::createMemberType(DIDescriptor Scope, StringRef Name,
413 DIFile File, unsigned LineNumber,
414 uint64_t SizeInBits,
415 uint64_t AlignInBits,
416 uint64_t OffsetInBits, unsigned Flags,
417 DIType Ty) {
Benjamin Kramered8b7bf2010-11-04 18:45:27 +0000418 // TAG_member is encoded in DIDerivedType format.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000419 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_member)
420 .concat(Name)
421 .concat(LineNumber)
422 .concat(SizeInBits)
423 .concat(AlignInBits)
424 .concat(OffsetInBits)
425 .concat(Flags)
426 .get(VMContext),
427 File.getFileNode(),
428 DIScope(getNonCompileUnitScope(Scope)).getRef(),
429 Ty.getRef()};
David Blaikie5692e722013-03-28 02:44:59 +0000430 return DIDerivedType(MDNode::get(VMContext, Elts));
Devang Patel57c5a202010-11-04 15:01:38 +0000431}
432
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000433static Metadata *getConstantOrNull(Constant *C) {
434 if (C)
435 return ConstantAsMetadata::get(C);
436 return nullptr;
437}
438
Duncan P. N. Exon Smithdbf64acd2014-11-15 00:23:49 +0000439DIDerivedType DIBuilder::createStaticMemberType(DIDescriptor Scope,
440 StringRef Name, DIFile File,
441 unsigned LineNumber, DIType Ty,
442 unsigned Flags,
443 llvm::Constant *Val) {
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000444 // TAG_member is encoded in DIDerivedType format.
445 Flags |= DIDescriptor::FlagStaticMember;
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000446 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_member)
447 .concat(Name)
448 .concat(LineNumber)
449 .concat(0) // Size
450 .concat(0) // Align
451 .concat(0) // Offset
452 .concat(Flags)
453 .get(VMContext),
454 File.getFileNode(),
455 DIScope(getNonCompileUnitScope(Scope)).getRef(),
456 Ty.getRef(), getConstantOrNull(Val)};
Manman Ren3c6acec2013-06-07 18:35:53 +0000457 return DIDerivedType(MDNode::get(VMContext, Elts));
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000458}
459
Eric Christopher98f9c232013-10-15 23:31:31 +0000460DIDerivedType DIBuilder::createObjCIVar(StringRef Name, DIFile File,
461 unsigned LineNumber,
462 uint64_t SizeInBits,
463 uint64_t AlignInBits,
464 uint64_t OffsetInBits, unsigned Flags,
465 DIType Ty, MDNode *PropertyNode) {
Devang Patel44882172012-02-06 17:49:43 +0000466 // TAG_member is encoded in DIDerivedType format.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000467 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_member)
468 .concat(Name)
469 .concat(LineNumber)
470 .concat(SizeInBits)
471 .concat(AlignInBits)
472 .concat(OffsetInBits)
473 .concat(Flags)
474 .get(VMContext),
475 File.getFileNode(), getNonCompileUnitScope(File), Ty,
476 PropertyNode};
Manman Ren3c6acec2013-06-07 18:35:53 +0000477 return DIDerivedType(MDNode::get(VMContext, Elts));
Devang Patel44882172012-02-06 17:49:43 +0000478}
479
Eric Christopher98f9c232013-10-15 23:31:31 +0000480DIObjCProperty
481DIBuilder::createObjCProperty(StringRef Name, DIFile File, unsigned LineNumber,
482 StringRef GetterName, StringRef SetterName,
483 unsigned PropertyAttributes, DIType Ty) {
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000484 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_APPLE_property)
485 .concat(Name)
486 .concat(LineNumber)
487 .concat(GetterName)
488 .concat(SetterName)
489 .concat(PropertyAttributes)
490 .get(VMContext),
491 File, Ty};
David Blaikie5692e722013-03-28 02:44:59 +0000492 return DIObjCProperty(MDNode::get(VMContext, Elts));
Devang Patelcc481592012-02-04 00:59:25 +0000493}
494
Eric Christopher3cc90fe2011-08-26 21:02:40 +0000495DITemplateTypeParameter
Devang Patel9b412732011-02-22 18:56:12 +0000496DIBuilder::createTemplateTypeParameter(DIDescriptor Context, StringRef Name,
Devang Patel3a9e65e2011-02-02 21:38:25 +0000497 DIType Ty, MDNode *File, unsigned LineNo,
498 unsigned ColumnNo) {
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000499 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_template_type_parameter)
500 .concat(Name)
501 .concat(LineNo)
502 .concat(ColumnNo)
503 .get(VMContext),
504 DIScope(getNonCompileUnitScope(Context)).getRef(),
505 Ty.getRef(), File};
David Blaikie5692e722013-03-28 02:44:59 +0000506 return DITemplateTypeParameter(MDNode::get(VMContext, Elts));
Devang Patel3a9e65e2011-02-02 21:38:25 +0000507}
508
Duncan P. N. Exon Smith774951f2014-11-15 00:05:04 +0000509static DITemplateValueParameter createTemplateValueParameterHelper(
510 LLVMContext &VMContext, unsigned Tag, DIDescriptor Context, StringRef Name,
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000511 DIType Ty, Metadata *MD, MDNode *File, unsigned LineNo, unsigned ColumnNo) {
512 Metadata *Elts[] = {
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000513 HeaderBuilder::get(Tag).concat(Name).concat(LineNo).concat(ColumnNo).get(
514 VMContext),
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000515 DIScope(getNonCompileUnitScope(Context)).getRef(), Ty.getRef(), MD, File};
David Blaikie5692e722013-03-28 02:44:59 +0000516 return DITemplateValueParameter(MDNode::get(VMContext, Elts));
Devang Patelbe933b42011-02-02 22:35:53 +0000517}
518
David Blaikie2b380232013-06-22 18:59:11 +0000519DITemplateValueParameter
520DIBuilder::createTemplateValueParameter(DIDescriptor Context, StringRef Name,
Duncan P. N. Exon Smithdbf64acd2014-11-15 00:23:49 +0000521 DIType Ty, Constant *Val, MDNode *File,
522 unsigned LineNo, unsigned ColumnNo) {
Duncan P. N. Exon Smith774951f2014-11-15 00:05:04 +0000523 return createTemplateValueParameterHelper(
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000524 VMContext, dwarf::DW_TAG_template_value_parameter, Context, Name, Ty,
525 getConstantOrNull(Val), File, LineNo, ColumnNo);
David Blaikie2b380232013-06-22 18:59:11 +0000526}
527
528DITemplateValueParameter
529DIBuilder::createTemplateTemplateParameter(DIDescriptor Context, StringRef Name,
530 DIType Ty, StringRef Val,
531 MDNode *File, unsigned LineNo,
532 unsigned ColumnNo) {
Duncan P. N. Exon Smith774951f2014-11-15 00:05:04 +0000533 return createTemplateValueParameterHelper(
534 VMContext, dwarf::DW_TAG_GNU_template_template_param, Context, Name, Ty,
David Blaikie2b380232013-06-22 18:59:11 +0000535 MDString::get(VMContext, Val), File, LineNo, ColumnNo);
536}
537
538DITemplateValueParameter
539DIBuilder::createTemplateParameterPack(DIDescriptor Context, StringRef Name,
540 DIType Ty, DIArray Val,
541 MDNode *File, unsigned LineNo,
542 unsigned ColumnNo) {
Duncan P. N. Exon Smith774951f2014-11-15 00:05:04 +0000543 return createTemplateValueParameterHelper(
544 VMContext, dwarf::DW_TAG_GNU_template_parameter_pack, Context, Name, Ty,
545 Val, File, LineNo, ColumnNo);
David Blaikie2b380232013-06-22 18:59:11 +0000546}
547
David Blaikiea7310a32013-03-26 23:46:39 +0000548DICompositeType DIBuilder::createClassType(DIDescriptor Context, StringRef Name,
549 DIFile File, unsigned LineNumber,
550 uint64_t SizeInBits,
551 uint64_t AlignInBits,
552 uint64_t OffsetInBits,
553 unsigned Flags, DIType DerivedFrom,
554 DIArray Elements,
Manman Ren27552062013-09-06 23:54:23 +0000555 DIType VTableHolder,
Manman Ren547467b2013-08-27 23:06:40 +0000556 MDNode *TemplateParams,
557 StringRef UniqueIdentifier) {
Manman Ren74c188f2013-07-01 21:02:01 +0000558 assert((!Context || Context.isScope() || Context.isType()) &&
David Blaikie085abe32013-03-11 23:21:19 +0000559 "createClassType should be called with a valid Context");
560 // TAG_class_type is encoded in DICompositeType format.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000561 Metadata *Elts[] = {
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000562 HeaderBuilder::get(dwarf::DW_TAG_class_type)
563 .concat(Name)
564 .concat(LineNumber)
565 .concat(SizeInBits)
566 .concat(AlignInBits)
567 .concat(OffsetInBits)
568 .concat(Flags)
569 .concat(0)
570 .get(VMContext),
571 File.getFileNode(), DIScope(getNonCompileUnitScope(Context)).getRef(),
572 DerivedFrom.getRef(), Elements, VTableHolder.getRef(), TemplateParams,
573 UniqueIdentifier.empty() ? nullptr
574 : MDString::get(VMContext, UniqueIdentifier)};
David Blaikiea7310a32013-03-26 23:46:39 +0000575 DICompositeType R(MDNode::get(VMContext, Elts));
Manman Ren74c188f2013-07-01 21:02:01 +0000576 assert(R.isCompositeType() &&
577 "createClassType should return a DICompositeType");
Manman Ren0b410402013-08-29 23:17:54 +0000578 if (!UniqueIdentifier.empty())
579 retainType(R);
David Blaikie085abe32013-03-11 23:21:19 +0000580 return R;
Eric Christopher17426692012-07-06 02:35:57 +0000581}
582
David Blaikiebbe0e1a2013-02-25 01:07:18 +0000583DICompositeType DIBuilder::createStructType(DIDescriptor Context,
584 StringRef Name, DIFile File,
585 unsigned LineNumber,
586 uint64_t SizeInBits,
587 uint64_t AlignInBits,
588 unsigned Flags, DIType DerivedFrom,
589 DIArray Elements,
590 unsigned RunTimeLang,
Manman Ren27552062013-09-06 23:54:23 +0000591 DIType VTableHolder,
Manman Ren547467b2013-08-27 23:06:40 +0000592 StringRef UniqueIdentifier) {
Devang Patel746660f2010-12-07 23:25:47 +0000593 // TAG_structure_type is encoded in DICompositeType format.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000594 Metadata *Elts[] = {
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000595 HeaderBuilder::get(dwarf::DW_TAG_structure_type)
596 .concat(Name)
597 .concat(LineNumber)
598 .concat(SizeInBits)
599 .concat(AlignInBits)
600 .concat(0)
601 .concat(Flags)
602 .concat(RunTimeLang)
603 .get(VMContext),
604 File.getFileNode(), DIScope(getNonCompileUnitScope(Context)).getRef(),
605 DerivedFrom.getRef(), Elements, VTableHolder.getRef(), nullptr,
606 UniqueIdentifier.empty() ? nullptr
607 : MDString::get(VMContext, UniqueIdentifier)};
David Blaikie085abe32013-03-11 23:21:19 +0000608 DICompositeType R(MDNode::get(VMContext, Elts));
Manman Ren74c188f2013-07-01 21:02:01 +0000609 assert(R.isCompositeType() &&
610 "createStructType should return a DICompositeType");
Manman Ren0b410402013-08-29 23:17:54 +0000611 if (!UniqueIdentifier.empty())
612 retainType(R);
David Blaikie085abe32013-03-11 23:21:19 +0000613 return R;
Devang Patel746660f2010-12-07 23:25:47 +0000614}
615
Eric Christopher17dd8f02013-04-02 22:55:52 +0000616DICompositeType DIBuilder::createUnionType(DIDescriptor Scope, StringRef Name,
617 DIFile File, unsigned LineNumber,
618 uint64_t SizeInBits,
619 uint64_t AlignInBits, unsigned Flags,
620 DIArray Elements,
Manman Ren547467b2013-08-27 23:06:40 +0000621 unsigned RunTimeLang,
622 StringRef UniqueIdentifier) {
Devang Patel89ea4f22010-12-08 01:50:15 +0000623 // TAG_union_type is encoded in DICompositeType format.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000624 Metadata *Elts[] = {
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000625 HeaderBuilder::get(dwarf::DW_TAG_union_type)
626 .concat(Name)
627 .concat(LineNumber)
628 .concat(SizeInBits)
629 .concat(AlignInBits)
630 .concat(0) // Offset
631 .concat(Flags)
632 .concat(RunTimeLang)
633 .get(VMContext),
634 File.getFileNode(), DIScope(getNonCompileUnitScope(Scope)).getRef(),
635 nullptr, Elements, nullptr, nullptr,
636 UniqueIdentifier.empty() ? nullptr
637 : MDString::get(VMContext, UniqueIdentifier)};
Manman Ren0b410402013-08-29 23:17:54 +0000638 DICompositeType R(MDNode::get(VMContext, Elts));
639 if (!UniqueIdentifier.empty())
640 retainType(R);
641 return R;
Devang Patel89ea4f22010-12-08 01:50:15 +0000642}
643
Manman Renf8a19672014-07-28 22:24:06 +0000644DISubroutineType DIBuilder::createSubroutineType(DIFile File,
645 DITypeArray ParameterTypes,
646 unsigned Flags) {
Devang Patel89ea4f22010-12-08 01:50:15 +0000647 // TAG_subroutine_type is encoded in DICompositeType format.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000648 Metadata *Elts[] = {
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000649 HeaderBuilder::get(dwarf::DW_TAG_subroutine_type)
650 .concat(StringRef())
651 .concat(0) // Line
652 .concat(0) // Size
653 .concat(0) // Align
654 .concat(0) // Offset
655 .concat(Flags) // Flags
656 .concat(0)
657 .get(VMContext),
658 nullptr, nullptr, nullptr, ParameterTypes, nullptr, nullptr,
659 nullptr // Type Identifer
Devang Patel89ea4f22010-12-08 01:50:15 +0000660 };
Manman Renf8a19672014-07-28 22:24:06 +0000661 return DISubroutineType(MDNode::get(VMContext, Elts));
Devang Patel89ea4f22010-12-08 01:50:15 +0000662}
663
David Blaikief11de2f2013-02-18 06:41:57 +0000664DICompositeType DIBuilder::createEnumerationType(
665 DIDescriptor Scope, StringRef Name, DIFile File, unsigned LineNumber,
666 uint64_t SizeInBits, uint64_t AlignInBits, DIArray Elements,
Manman Ren547467b2013-08-27 23:06:40 +0000667 DIType UnderlyingType, StringRef UniqueIdentifier) {
Devang Patel89ea4f22010-12-08 01:50:15 +0000668 // TAG_enumeration_type is encoded in DICompositeType format.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000669 Metadata *Elts[] = {
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000670 HeaderBuilder::get(dwarf::DW_TAG_enumeration_type)
671 .concat(Name)
672 .concat(LineNumber)
673 .concat(SizeInBits)
674 .concat(AlignInBits)
675 .concat(0) // Offset
676 .concat(0) // Flags
677 .concat(0)
678 .get(VMContext),
679 File.getFileNode(), DIScope(getNonCompileUnitScope(Scope)).getRef(),
680 UnderlyingType.getRef(), Elements, nullptr, nullptr,
681 UniqueIdentifier.empty() ? nullptr
682 : MDString::get(VMContext, UniqueIdentifier)};
David Blaikie4f6bf27a2013-11-18 23:33:32 +0000683 DICompositeType CTy(MDNode::get(VMContext, Elts));
684 AllEnumTypes.push_back(CTy);
Manman Ren0b410402013-08-29 23:17:54 +0000685 if (!UniqueIdentifier.empty())
David Blaikie4f6bf27a2013-11-18 23:33:32 +0000686 retainType(CTy);
687 return CTy;
Devang Patel89ea4f22010-12-08 01:50:15 +0000688}
689
David Blaikief11de2f2013-02-18 06:41:57 +0000690DICompositeType DIBuilder::createArrayType(uint64_t Size, uint64_t AlignInBits,
691 DIType Ty, DIArray Subscripts) {
Devang Patel89ea4f22010-12-08 01:50:15 +0000692 // TAG_array_type is encoded in DICompositeType format.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000693 Metadata *Elts[] = {
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000694 HeaderBuilder::get(dwarf::DW_TAG_array_type)
695 .concat(StringRef())
696 .concat(0) // Line
697 .concat(Size)
698 .concat(AlignInBits)
699 .concat(0) // Offset
700 .concat(0) // Flags
701 .concat(0)
702 .get(VMContext),
703 nullptr, // Filename/Directory,
704 nullptr, // Unused
705 Ty.getRef(), Subscripts, nullptr, nullptr,
706 nullptr // Type Identifer
Devang Patel89ea4f22010-12-08 01:50:15 +0000707 };
David Blaikie5692e722013-03-28 02:44:59 +0000708 return DICompositeType(MDNode::get(VMContext, Elts));
Devang Patel89ea4f22010-12-08 01:50:15 +0000709}
710
Manman Ren60711602013-06-07 03:13:46 +0000711DICompositeType DIBuilder::createVectorType(uint64_t Size, uint64_t AlignInBits,
712 DIType Ty, DIArray Subscripts) {
Eric Christopher72a52952013-01-08 01:53:52 +0000713 // A vector is an array type with the FlagVector flag applied.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000714 Metadata *Elts[] = {
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000715 HeaderBuilder::get(dwarf::DW_TAG_array_type)
716 .concat("")
717 .concat(0) // Line
718 .concat(Size)
719 .concat(AlignInBits)
720 .concat(0) // Offset
721 .concat(DIType::FlagVector)
722 .concat(0)
723 .get(VMContext),
724 nullptr, // Filename/Directory,
725 nullptr, // Unused
726 Ty.getRef(), Subscripts, nullptr, nullptr,
727 nullptr // Type Identifer
Devang Patel89ea4f22010-12-08 01:50:15 +0000728 };
Manman Ren60711602013-06-07 03:13:46 +0000729 return DICompositeType(MDNode::get(VMContext, Elts));
Devang Patel89ea4f22010-12-08 01:50:15 +0000730}
Devang Patel746660f2010-12-07 23:25:47 +0000731
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000732static HeaderBuilder setTypeFlagsInHeader(StringRef Header,
733 unsigned FlagsToSet) {
734 DIHeaderFieldIterator I(Header);
735 std::advance(I, 6);
736
737 unsigned Flags;
738 if (I->getAsInteger(0, Flags))
739 Flags = 0;
740 Flags |= FlagsToSet;
741
742 return HeaderBuilder(Twine(I.getPrefix())).concat(Flags).concat(
743 I.getSuffix());
744}
745
746static DIType createTypeWithFlags(LLVMContext &Context, DIType Ty,
747 unsigned FlagsToSet) {
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000748 SmallVector<Metadata *, 9> Elts;
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000749 MDNode *N = Ty;
750 assert(N && "Unexpected input DIType!");
751 // Update header field.
752 Elts.push_back(setTypeFlagsInHeader(Ty.getHeader(), FlagsToSet).get(Context));
753 for (unsigned I = 1, E = N->getNumOperands(); I != E; ++I)
754 Elts.push_back(N->getOperand(I));
755
756 return DIType(MDNode::get(Context, Elts));
757}
758
Devang Patel9b412732011-02-22 18:56:12 +0000759DIType DIBuilder::createArtificialType(DIType Ty) {
Devang Patel57c5a202010-11-04 15:01:38 +0000760 if (Ty.isArtificial())
761 return Ty;
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000762 return createTypeWithFlags(VMContext, Ty, DIType::FlagArtificial);
Devang Patel57c5a202010-11-04 15:01:38 +0000763}
Devang Patel746660f2010-12-07 23:25:47 +0000764
Eric Christophere3417762012-09-12 23:36:19 +0000765DIType DIBuilder::createObjectPointerType(DIType Ty) {
766 if (Ty.isObjectPointer())
767 return Ty;
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000768 unsigned Flags = DIType::FlagObjectPointer | DIType::FlagArtificial;
769 return createTypeWithFlags(VMContext, Ty, Flags);
Eric Christophere3417762012-09-12 23:36:19 +0000770}
771
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000772void DIBuilder::retainType(DIType T) { AllRetainTypes.emplace_back(T); }
Devang Patel89ea4f22010-12-08 01:50:15 +0000773
Manman Renf93ac4b2014-07-29 18:20:39 +0000774DIBasicType DIBuilder::createUnspecifiedParameter() {
Manman Ren72b07e82014-07-29 22:58:13 +0000775 return DIBasicType();
Devang Patel89ea4f22010-12-08 01:50:15 +0000776}
777
Eric Christopher98f9c232013-10-15 23:31:31 +0000778DICompositeType
779DIBuilder::createForwardDecl(unsigned Tag, StringRef Name, DIDescriptor Scope,
780 DIFile F, unsigned Line, unsigned RuntimeLang,
781 uint64_t SizeInBits, uint64_t AlignInBits,
782 StringRef UniqueIdentifier) {
Eric Christopherae56eec2012-02-08 00:22:26 +0000783 // Create a temporary MDNode.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000784 Metadata *Elts[] = {
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000785 HeaderBuilder::get(Tag)
786 .concat(Name)
787 .concat(Line)
788 .concat(SizeInBits)
789 .concat(AlignInBits)
790 .concat(0) // Offset
791 .concat(DIDescriptor::FlagFwdDecl)
792 .concat(RuntimeLang)
793 .get(VMContext),
794 F.getFileNode(), DIScope(getNonCompileUnitScope(Scope)).getRef(), nullptr,
795 DIArray(), nullptr,
796 nullptr, // TemplateParams
797 UniqueIdentifier.empty() ? nullptr
798 : MDString::get(VMContext, UniqueIdentifier)};
David Blaikied3f094a2014-05-06 03:41:57 +0000799 MDNode *Node = MDNode::get(VMContext, Elts);
800 DICompositeType RetTy(Node);
801 assert(RetTy.isCompositeType() &&
802 "createForwardDecl result should be a DIType");
803 if (!UniqueIdentifier.empty())
804 retainType(RetTy);
805 return RetTy;
806}
807
David Blaikied3f094a2014-05-06 03:41:57 +0000808DICompositeType DIBuilder::createReplaceableForwardDecl(
809 unsigned Tag, StringRef Name, DIDescriptor Scope, DIFile F, unsigned Line,
810 unsigned RuntimeLang, uint64_t SizeInBits, uint64_t AlignInBits,
811 StringRef UniqueIdentifier) {
812 // Create a temporary MDNode.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000813 Metadata *Elts[] = {
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000814 HeaderBuilder::get(Tag)
815 .concat(Name)
816 .concat(Line)
817 .concat(SizeInBits)
818 .concat(AlignInBits)
819 .concat(0) // Offset
820 .concat(DIDescriptor::FlagFwdDecl)
821 .concat(RuntimeLang)
822 .get(VMContext),
823 F.getFileNode(), DIScope(getNonCompileUnitScope(Scope)).getRef(), nullptr,
824 DIArray(), nullptr,
825 nullptr, // TemplateParams
826 UniqueIdentifier.empty() ? nullptr
827 : MDString::get(VMContext, UniqueIdentifier)};
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000828 DICompositeType RetTy(MDNode::getTemporary(VMContext, Elts));
David Blaikied4e106e2013-08-16 20:42:14 +0000829 assert(RetTy.isCompositeType() &&
Frederic Rissa8734142014-09-10 16:03:14 +0000830 "createReplaceableForwardDecl result should be a DIType");
Manman Ren0b410402013-08-29 23:17:54 +0000831 if (!UniqueIdentifier.empty())
832 retainType(RetTy);
Manman Rend0e67aa2013-07-02 18:37:35 +0000833 return RetTy;
Eric Christopherae56eec2012-02-08 00:22:26 +0000834}
835
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000836DIArray DIBuilder::getOrCreateArray(ArrayRef<Metadata *> Elements) {
Jay Foaddbf81d82011-04-24 10:11:03 +0000837 return DIArray(MDNode::get(VMContext, Elements));
Devang Patel746660f2010-12-07 23:25:47 +0000838}
839
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000840DITypeArray DIBuilder::getOrCreateTypeArray(ArrayRef<Metadata *> Elements) {
841 SmallVector<llvm::Metadata *, 16> Elts;
Manman Ren1a125c92014-07-28 19:33:20 +0000842 for (unsigned i = 0, e = Elements.size(); i != e; ++i) {
843 if (Elements[i] && isa<MDNode>(Elements[i]))
844 Elts.push_back(DIType(cast<MDNode>(Elements[i])).getRef());
845 else
846 Elts.push_back(Elements[i]);
847 }
848 return DITypeArray(MDNode::get(VMContext, Elts));
849}
850
Bill Wendlingd7767122012-12-04 21:34:03 +0000851DISubrange DIBuilder::getOrCreateSubrange(int64_t Lo, int64_t Count) {
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000852 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_subrange_type)
853 .concat(Lo)
854 .concat(Count)
855 .get(VMContext)};
Devang Patel89ea4f22010-12-08 01:50:15 +0000856
Devang Patel0c773242011-04-18 23:51:03 +0000857 return DISubrange(MDNode::get(VMContext, Elts));
Devang Patel89ea4f22010-12-08 01:50:15 +0000858}
859
Duncan P. N. Exon Smithdbf64acd2014-11-15 00:23:49 +0000860static DIGlobalVariable createGlobalVariableHelper(
861 LLVMContext &VMContext, DIDescriptor Context, StringRef Name,
862 StringRef LinkageName, DIFile F, unsigned LineNumber, DITypeRef Ty,
863 bool isLocalToUnit, Constant *Val, MDNode *Decl, bool isDefinition,
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000864 std::function<MDNode *(ArrayRef<Metadata *>)> CreateFunc) {
Manman Renbfd2b8292014-11-21 19:47:48 +0000865
866 MDNode *TheCtx = getNonCompileUnitScope(Context);
867 if (DIScope(TheCtx).isCompositeType()) {
868 assert(!DICompositeType(TheCtx).getIdentifier() &&
869 "Context of a global variable should not be a type with identifier");
870 }
871
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000872 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_variable)
873 .concat(Name)
874 .concat(Name)
875 .concat(LinkageName)
876 .concat(LineNumber)
877 .concat(isLocalToUnit)
878 .concat(isDefinition)
879 .get(VMContext),
880 TheCtx, F, Ty, getConstantOrNull(Val),
881 DIDescriptor(Decl)};
Frederic Riss5e6bc9e2014-09-17 09:28:34 +0000882
883 return DIGlobalVariable(CreateFunc(Elts));
884}
885
Duncan P. N. Exon Smithdbf64acd2014-11-15 00:23:49 +0000886DIGlobalVariable DIBuilder::createGlobalVariable(
887 DIDescriptor Context, StringRef Name, StringRef LinkageName, DIFile F,
888 unsigned LineNumber, DITypeRef Ty, bool isLocalToUnit, Constant *Val,
889 MDNode *Decl) {
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000890 return createGlobalVariableHelper(
891 VMContext, Context, Name, LinkageName, F, LineNumber, Ty, isLocalToUnit,
892 Val, Decl, true, [&](ArrayRef<Metadata *> Elts) -> MDNode *{
893 MDNode *Node = MDNode::get(VMContext, Elts);
894 AllGVs.push_back(Node);
895 return Node;
896 });
Frederic Riss5e6bc9e2014-09-17 09:28:34 +0000897}
898
Duncan P. N. Exon Smithdbf64acd2014-11-15 00:23:49 +0000899DIGlobalVariable DIBuilder::createTempGlobalVariableFwdDecl(
900 DIDescriptor Context, StringRef Name, StringRef LinkageName, DIFile F,
901 unsigned LineNumber, DITypeRef Ty, bool isLocalToUnit, Constant *Val,
902 MDNode *Decl) {
Jyoti Allurb76b57f2014-09-29 06:32:54 +0000903 return createGlobalVariableHelper(VMContext, Context, Name, LinkageName, F,
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000904 LineNumber, Ty, isLocalToUnit, Val, Decl,
905 false, [&](ArrayRef<Metadata *> Elts) {
906 return MDNode::getTemporary(VMContext, Elts);
907 });
Devang Patel746660f2010-12-07 23:25:47 +0000908}
909
Devang Patel9b412732011-02-22 18:56:12 +0000910DIVariable DIBuilder::createLocalVariable(unsigned Tag, DIDescriptor Scope,
Devang Patel63f83cd2010-12-07 23:58:00 +0000911 StringRef Name, DIFile File,
Adrian Prantl1a1647c2014-03-18 02:34:58 +0000912 unsigned LineNo, DITypeRef Ty,
Devang Patel40eee1e2011-03-01 22:58:13 +0000913 bool AlwaysPreserve, unsigned Flags,
914 unsigned ArgNo) {
David Blaikie085abe32013-03-11 23:21:19 +0000915 DIDescriptor Context(getNonCompileUnitScope(Scope));
Manman Ren74c188f2013-07-01 21:02:01 +0000916 assert((!Context || Context.isScope()) &&
David Blaikie085abe32013-03-11 23:21:19 +0000917 "createLocalVariable should be called with a valid Context");
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000918 Metadata *Elts[] = {HeaderBuilder::get(Tag)
919 .concat(Name)
920 .concat(LineNo | (ArgNo << 24))
921 .concat(Flags)
922 .get(VMContext),
923 getNonCompileUnitScope(Scope), File, Ty};
Devang Patel0c773242011-04-18 23:51:03 +0000924 MDNode *Node = MDNode::get(VMContext, Elts);
Devang Patel63f83cd2010-12-07 23:58:00 +0000925 if (AlwaysPreserve) {
926 // The optimizer may remove local variable. If there is an interest
927 // to preserve variable info in such situation then stash it in a
928 // named mdnode.
929 DISubprogram Fn(getDISubprogram(Scope));
Duncan P. N. Exon Smith3bfffde2014-10-15 16:11:41 +0000930 assert(Fn && "Missing subprogram for local variable");
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000931 PreservedVariables[Fn].emplace_back(Node);
Devang Patel63f83cd2010-12-07 23:58:00 +0000932 }
Manman Rend0e67aa2013-07-02 18:37:35 +0000933 DIVariable RetVar(Node);
934 assert(RetVar.isVariable() &&
Manman Ren74c188f2013-07-01 21:02:01 +0000935 "createLocalVariable should return a valid DIVariable");
Manman Rend0e67aa2013-07-02 18:37:35 +0000936 return RetVar;
Devang Patel63f83cd2010-12-07 23:58:00 +0000937}
938
Duncan P. N. Exon Smith611afb22014-10-01 20:26:08 +0000939DIExpression DIBuilder::createExpression(ArrayRef<int64_t> Addr) {
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000940 auto Header = HeaderBuilder::get(DW_TAG_expression);
Duncan P. N. Exon Smith611afb22014-10-01 20:26:08 +0000941 for (int64_t I : Addr)
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000942 Header.concat(I);
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000943 Metadata *Elts[] = {Header.get(VMContext)};
Adrian Prantl87b7eb92014-10-01 18:55:02 +0000944 return DIExpression(MDNode::get(VMContext, Elts));
Devang Patel746660f2010-12-07 23:25:47 +0000945}
946
Duncan P. N. Exon Smith9affbba2014-10-01 21:32:12 +0000947DIExpression DIBuilder::createPieceExpression(unsigned OffsetInBytes,
948 unsigned SizeInBytes) {
949 int64_t Addr[] = {dwarf::DW_OP_piece, OffsetInBytes, SizeInBytes};
950 return createExpression(Addr);
951}
952
Eric Christopher98f9c232013-10-15 23:31:31 +0000953DISubprogram DIBuilder::createFunction(DIScopeRef Context, StringRef Name,
954 StringRef LinkageName, DIFile File,
955 unsigned LineNo, DICompositeType Ty,
Manman Renc50fa112013-10-10 18:40:01 +0000956 bool isLocalToUnit, bool isDefinition,
Eric Christopher98f9c232013-10-15 23:31:31 +0000957 unsigned ScopeLine, unsigned Flags,
958 bool isOptimized, Function *Fn,
959 MDNode *TParams, MDNode *Decl) {
Manman Renc50fa112013-10-10 18:40:01 +0000960 // dragonegg does not generate identifier for types, so using an empty map
961 // to resolve the context should be fine.
962 DITypeIdentifierMap EmptyMap;
963 return createFunction(Context.resolve(EmptyMap), Name, LinkageName, File,
964 LineNo, Ty, isLocalToUnit, isDefinition, ScopeLine,
965 Flags, isOptimized, Fn, TParams, Decl);
966}
967
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000968static DISubprogram createFunctionHelper(
969 LLVMContext &VMContext, DIDescriptor Context, StringRef Name,
970 StringRef LinkageName, DIFile File, unsigned LineNo, DICompositeType Ty,
971 bool isLocalToUnit, bool isDefinition, unsigned ScopeLine, unsigned Flags,
972 bool isOptimized, Function *Fn, MDNode *TParams, MDNode *Decl, MDNode *Vars,
973 std::function<MDNode *(ArrayRef<Metadata *>)> CreateFunc) {
David Blaikie5174c842013-05-22 23:22:18 +0000974 assert(Ty.getTag() == dwarf::DW_TAG_subroutine_type &&
975 "function types should be subroutines");
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000976 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_subprogram)
977 .concat(Name)
978 .concat(Name)
979 .concat(LinkageName)
980 .concat(LineNo)
981 .concat(isLocalToUnit)
982 .concat(isDefinition)
983 .concat(0)
984 .concat(0)
985 .concat(Flags)
986 .concat(isOptimized)
987 .concat(ScopeLine)
988 .get(VMContext),
989 File.getFileNode(),
990 DIScope(getNonCompileUnitScope(Context)).getRef(), Ty,
991 nullptr, getConstantOrNull(Fn), TParams, Decl, Vars};
Devang Patelb68c6232010-12-08 20:42:44 +0000992
Frederic Riss5e6bc9e2014-09-17 09:28:34 +0000993 DISubprogram S(CreateFunc(Elts));
Eric Christopher961959f2014-02-28 21:27:59 +0000994 assert(S.isSubprogram() &&
995 "createFunction should return a valid DISubprogram");
David Blaikiecc8d0902013-03-21 20:28:52 +0000996 return S;
Devang Patelb68c6232010-12-08 20:42:44 +0000997}
998
Frederic Riss5e6bc9e2014-09-17 09:28:34 +0000999
Frederic Riss5e6bc9e2014-09-17 09:28:34 +00001000DISubprogram DIBuilder::createFunction(DIDescriptor Context, StringRef Name,
1001 StringRef LinkageName, DIFile File,
1002 unsigned LineNo, DICompositeType Ty,
1003 bool isLocalToUnit, bool isDefinition,
1004 unsigned ScopeLine, unsigned Flags,
1005 bool isOptimized, Function *Fn,
1006 MDNode *TParams, MDNode *Decl) {
1007 return createFunctionHelper(VMContext, Context, Name, LinkageName, File,
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +00001008 LineNo, Ty, isLocalToUnit, isDefinition,
1009 ScopeLine, Flags, isOptimized, Fn, TParams, Decl,
Frederic Risse10ba6d2014-11-20 15:52:34 +00001010 MDNode::getTemporary(VMContext, None),
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +00001011 [&](ArrayRef<Metadata *> Elts) -> MDNode *{
1012 MDNode *Node = MDNode::get(VMContext, Elts);
1013 // Create a named metadata so that we
1014 // do not lose this mdnode.
1015 if (isDefinition)
1016 AllSubprograms.push_back(Node);
1017 return Node;
1018 });
Frederic Riss5e6bc9e2014-09-17 09:28:34 +00001019}
1020
Frederic Riss5e6bc9e2014-09-17 09:28:34 +00001021DISubprogram
1022DIBuilder::createTempFunctionFwdDecl(DIDescriptor Context, StringRef Name,
1023 StringRef LinkageName, DIFile File,
1024 unsigned LineNo, DICompositeType Ty,
1025 bool isLocalToUnit, bool isDefinition,
1026 unsigned ScopeLine, unsigned Flags,
1027 bool isOptimized, Function *Fn,
1028 MDNode *TParams, MDNode *Decl) {
1029 return createFunctionHelper(VMContext, Context, Name, LinkageName, File,
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +00001030 LineNo, Ty, isLocalToUnit, isDefinition,
1031 ScopeLine, Flags, isOptimized, Fn, TParams, Decl,
1032 nullptr, [&](ArrayRef<Metadata *> Elts) {
1033 return MDNode::getTemporary(VMContext, Elts);
1034 });
Frederic Riss5e6bc9e2014-09-17 09:28:34 +00001035}
1036
Eric Christopher98f9c232013-10-15 23:31:31 +00001037DISubprogram DIBuilder::createMethod(DIDescriptor Context, StringRef Name,
1038 StringRef LinkageName, DIFile F,
David Blaikie5174c842013-05-22 23:22:18 +00001039 unsigned LineNo, DICompositeType Ty,
Eric Christopher98f9c232013-10-15 23:31:31 +00001040 bool isLocalToUnit, bool isDefinition,
Devang Patelb68c6232010-12-08 20:42:44 +00001041 unsigned VK, unsigned VIndex,
Eric Christopher98f9c232013-10-15 23:31:31 +00001042 DIType VTableHolder, unsigned Flags,
1043 bool isOptimized, Function *Fn,
Devang Patel9f738842011-04-05 22:52:06 +00001044 MDNode *TParam) {
David Blaikie5174c842013-05-22 23:22:18 +00001045 assert(Ty.getTag() == dwarf::DW_TAG_subroutine_type &&
1046 "function types should be subroutines");
Eric Christopher5cb56322013-10-15 23:31:36 +00001047 assert(getNonCompileUnitScope(Context) &&
1048 "Methods should have both a Context and a context that isn't "
1049 "the compile unit.");
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +00001050 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_subprogram)
1051 .concat(Name)
1052 .concat(Name)
1053 .concat(LinkageName)
1054 .concat(LineNo)
1055 .concat(isLocalToUnit)
1056 .concat(isDefinition)
1057 .concat(VK)
1058 .concat(VIndex)
1059 .concat(Flags)
1060 .concat(isOptimized)
1061 .concat(LineNo)
1062 // FIXME: Do we want to use different scope/lines?
1063 .get(VMContext),
1064 F.getFileNode(), DIScope(Context).getRef(), Ty,
1065 VTableHolder.getRef(), getConstantOrNull(Fn), TParam,
1066 nullptr, nullptr};
Devang Patel0c773242011-04-18 23:51:03 +00001067 MDNode *Node = MDNode::get(VMContext, Elts);
David Blaikie595eb442013-02-18 07:10:22 +00001068 if (isDefinition)
1069 AllSubprograms.push_back(Node);
David Blaikiecc8d0902013-03-21 20:28:52 +00001070 DISubprogram S(Node);
Manman Ren74c188f2013-07-01 21:02:01 +00001071 assert(S.isSubprogram() && "createMethod should return a valid DISubprogram");
David Blaikiecc8d0902013-03-21 20:28:52 +00001072 return S;
Devang Patelb68c6232010-12-08 20:42:44 +00001073}
1074
Devang Patel9b412732011-02-22 18:56:12 +00001075DINameSpace DIBuilder::createNameSpace(DIDescriptor Scope, StringRef Name,
Devang Patel746660f2010-12-07 23:25:47 +00001076 DIFile File, unsigned LineNo) {
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +00001077 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_namespace)
1078 .concat(Name)
1079 .concat(LineNo)
1080 .get(VMContext),
1081 File.getFileNode(), getNonCompileUnitScope(Scope)};
David Blaikie085abe32013-03-11 23:21:19 +00001082 DINameSpace R(MDNode::get(VMContext, Elts));
1083 assert(R.Verify() &&
1084 "createNameSpace should return a verifiable DINameSpace");
1085 return R;
Devang Patel746660f2010-12-07 23:25:47 +00001086}
1087
Eric Christopher6647b832011-10-11 22:59:11 +00001088DILexicalBlockFile DIBuilder::createLexicalBlockFile(DIDescriptor Scope,
David Blaikie2f3f76f2014-08-21 22:45:21 +00001089 DIFile File,
1090 unsigned Discriminator) {
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +00001091 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_lexical_block)
1092 .concat(Discriminator)
1093 .get(VMContext),
1094 File.getFileNode(), Scope};
David Blaikie085abe32013-03-11 23:21:19 +00001095 DILexicalBlockFile R(MDNode::get(VMContext, Elts));
1096 assert(
1097 R.Verify() &&
1098 "createLexicalBlockFile should return a verifiable DILexicalBlockFile");
1099 return R;
Eric Christopher6647b832011-10-11 22:59:11 +00001100}
1101
Devang Patel9b412732011-02-22 18:56:12 +00001102DILexicalBlock DIBuilder::createLexicalBlock(DIDescriptor Scope, DIFile File,
David Blaikie2f3f76f2014-08-21 22:45:21 +00001103 unsigned Line, unsigned Col) {
David Blaikie6c217162014-05-15 20:09:55 +00001104 // FIXME: This isn't thread safe nor the right way to defeat MDNode uniquing.
1105 // I believe the right way is to have a self-referential element in the node.
1106 // Also: why do we bother with line/column - they're not used and the
1107 // documentation (SourceLevelDebugging.rst) claims the line/col are necessary
1108 // for uniquing, yet then we have this other solution (because line/col were
1109 // inadequate) anyway. Remove all 3 and replace them with a self-reference.
1110
Adrian Prantl21e8d4a2013-06-24 21:19:43 +00001111 // Defeat MDNode uniquing for lexical blocks by using unique id.
Devang Patel89ea4f22010-12-08 01:50:15 +00001112 static unsigned int unique_id = 0;
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +00001113 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_lexical_block)
1114 .concat(Line)
1115 .concat(Col)
1116 .concat(unique_id++)
1117 .get(VMContext),
1118 File.getFileNode(), getNonCompileUnitScope(Scope)};
David Blaikie085abe32013-03-11 23:21:19 +00001119 DILexicalBlock R(MDNode::get(VMContext, Elts));
1120 assert(R.Verify() &&
1121 "createLexicalBlock should return a verifiable DILexicalBlock");
1122 return R;
Devang Patel89ea4f22010-12-08 01:50:15 +00001123}
1124
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +00001125static Value *getDbgIntrinsicValueImpl(LLVMContext &VMContext, Value *V) {
1126 assert(V && "no value passed to dbg intrinsic");
1127 return MetadataAsValue::get(VMContext, ValueAsMetadata::get(V));
1128}
1129
Devang Patel9b412732011-02-22 18:56:12 +00001130Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo,
Adrian Prantl87b7eb92014-10-01 18:55:02 +00001131 DIExpression Expr,
Devang Patel746660f2010-12-07 23:25:47 +00001132 Instruction *InsertBefore) {
Manman Ren9822a112013-06-29 05:01:19 +00001133 assert(VarInfo.isVariable() &&
1134 "empty or invalid DIVariable passed to dbg.declare");
Devang Patel746660f2010-12-07 23:25:47 +00001135 if (!DeclareFn)
1136 DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
1137
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +00001138 trackIfUnresolved(VarInfo);
1139 trackIfUnresolved(Expr);
1140 Value *Args[] = {getDbgIntrinsicValueImpl(VMContext, Storage),
1141 MetadataAsValue::get(VMContext, VarInfo),
1142 MetadataAsValue::get(VMContext, Expr)};
Jay Foad5bd375a2011-07-15 08:37:34 +00001143 return CallInst::Create(DeclareFn, Args, "", InsertBefore);
Devang Patel746660f2010-12-07 23:25:47 +00001144}
1145
Devang Patel9b412732011-02-22 18:56:12 +00001146Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo,
Adrian Prantl87b7eb92014-10-01 18:55:02 +00001147 DIExpression Expr,
Devang Patel746660f2010-12-07 23:25:47 +00001148 BasicBlock *InsertAtEnd) {
Manman Ren9822a112013-06-29 05:01:19 +00001149 assert(VarInfo.isVariable() &&
1150 "empty or invalid DIVariable passed to dbg.declare");
Devang Patel746660f2010-12-07 23:25:47 +00001151 if (!DeclareFn)
1152 DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
1153
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +00001154 trackIfUnresolved(VarInfo);
1155 trackIfUnresolved(Expr);
1156 Value *Args[] = {getDbgIntrinsicValueImpl(VMContext, Storage),
1157 MetadataAsValue::get(VMContext, VarInfo),
1158 MetadataAsValue::get(VMContext, Expr)};
Devang Patel746660f2010-12-07 23:25:47 +00001159
1160 // If this block already has a terminator then insert this intrinsic
1161 // before the terminator.
1162 if (TerminatorInst *T = InsertAtEnd->getTerminator())
Jay Foad5bd375a2011-07-15 08:37:34 +00001163 return CallInst::Create(DeclareFn, Args, "", T);
Devang Patel746660f2010-12-07 23:25:47 +00001164 else
Jay Foad5bd375a2011-07-15 08:37:34 +00001165 return CallInst::Create(DeclareFn, Args, "", InsertAtEnd);
Devang Patel746660f2010-12-07 23:25:47 +00001166}
1167
Devang Patel9b412732011-02-22 18:56:12 +00001168Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,
Devang Patel746660f2010-12-07 23:25:47 +00001169 DIVariable VarInfo,
Adrian Prantl87b7eb92014-10-01 18:55:02 +00001170 DIExpression Expr,
Devang Patel746660f2010-12-07 23:25:47 +00001171 Instruction *InsertBefore) {
1172 assert(V && "no value passed to dbg.value");
Manman Ren9822a112013-06-29 05:01:19 +00001173 assert(VarInfo.isVariable() &&
1174 "empty or invalid DIVariable passed to dbg.value");
Devang Patel746660f2010-12-07 23:25:47 +00001175 if (!ValueFn)
1176 ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value);
1177
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +00001178 trackIfUnresolved(VarInfo);
1179 trackIfUnresolved(Expr);
1180 Value *Args[] = {getDbgIntrinsicValueImpl(VMContext, V),
1181 ConstantInt::get(Type::getInt64Ty(VMContext), Offset),
1182 MetadataAsValue::get(VMContext, VarInfo),
1183 MetadataAsValue::get(VMContext, Expr)};
Jay Foad5bd375a2011-07-15 08:37:34 +00001184 return CallInst::Create(ValueFn, Args, "", InsertBefore);
Devang Patel746660f2010-12-07 23:25:47 +00001185}
1186
Devang Patel9b412732011-02-22 18:56:12 +00001187Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,
Devang Patel746660f2010-12-07 23:25:47 +00001188 DIVariable VarInfo,
Adrian Prantl87b7eb92014-10-01 18:55:02 +00001189 DIExpression Expr,
Devang Patel746660f2010-12-07 23:25:47 +00001190 BasicBlock *InsertAtEnd) {
1191 assert(V && "no value passed to dbg.value");
Manman Ren9822a112013-06-29 05:01:19 +00001192 assert(VarInfo.isVariable() &&
1193 "empty or invalid DIVariable passed to dbg.value");
Devang Patel746660f2010-12-07 23:25:47 +00001194 if (!ValueFn)
1195 ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value);
1196
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +00001197 trackIfUnresolved(VarInfo);
1198 trackIfUnresolved(Expr);
1199 Value *Args[] = {getDbgIntrinsicValueImpl(VMContext, V),
1200 ConstantInt::get(Type::getInt64Ty(VMContext), Offset),
1201 MetadataAsValue::get(VMContext, VarInfo),
1202 MetadataAsValue::get(VMContext, Expr)};
Jay Foad5bd375a2011-07-15 08:37:34 +00001203 return CallInst::Create(ValueFn, Args, "", InsertAtEnd);
Devang Patel746660f2010-12-07 23:25:47 +00001204}
Duncan P. N. Exon Smith97f07c22014-12-18 00:46:16 +00001205
1206void DIBuilder::replaceVTableHolder(DICompositeType &T, DICompositeType VTableHolder) {
1207 T.setContainingType(VTableHolder);
1208
1209 // If this didn't create a self-reference, just return.
1210 if (T != VTableHolder)
1211 return;
1212
1213 // Look for unresolved operands. T has dropped RAUW support and is already
1214 // marked resolved, orphaning any cycles underneath it.
1215 assert(T->isResolved() && "Expected self-reference to be resolved");
1216 for (const MDOperand &O : T->operands())
1217 if (auto *N = dyn_cast_or_null<MDNode>(O))
1218 trackIfUnresolved(N);
1219}
1220
1221void DIBuilder::replaceArrays(DICompositeType &T, DIArray Elements,
1222 DIArray TParams) {
1223 T.setArrays(Elements, TParams);
1224
1225 // If T isn't resolved, there's no problem.
1226 if (!T->isResolved())
1227 return;
1228
1229 // If "T" is resolved, it may be due to a self-reference cycle. Track the
1230 // arrays explicitly if they're unresolved, or else the cycles will be
1231 // orphaned.
1232 if (Elements)
1233 trackIfUnresolved(Elements);
1234 if (TParams)
1235 trackIfUnresolved(TParams);
1236}