blob: 7ff7c3848b232d0e0569a2552591f7577022dfc8 [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 {
Duncan P. N. Exon Smithaa687a32015-01-20 05:02:42 +000028 /// \brief Whether there are any fields yet.
29 ///
30 /// Note that this is not equivalent to \c Chars.empty(), since \a concat()
31 /// may have been called already with an empty string.
32 bool IsEmpty;
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +000033 SmallVector<char, 256> Chars;
34
35public:
Duncan P. N. Exon Smithaa687a32015-01-20 05:02:42 +000036 HeaderBuilder() : IsEmpty(true) {}
37 HeaderBuilder(const HeaderBuilder &X) : IsEmpty(X.IsEmpty), Chars(X.Chars) {}
38 HeaderBuilder(HeaderBuilder &&X)
39 : IsEmpty(X.IsEmpty), Chars(std::move(X.Chars)) {}
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +000040
41 template <class Twineable> HeaderBuilder &concat(Twineable &&X) {
Duncan P. N. Exon Smithaa687a32015-01-20 05:02:42 +000042 if (IsEmpty)
43 IsEmpty = false;
44 else
45 Chars.push_back(0);
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +000046 Twine(X).toVector(Chars);
47 return *this;
48 }
49
50 MDString *get(LLVMContext &Context) const {
51 return MDString::get(Context, StringRef(Chars.begin(), Chars.size()));
52 }
53
54 static HeaderBuilder get(unsigned Tag) {
Duncan P. N. Exon Smithaa687a32015-01-20 05:02:42 +000055 return HeaderBuilder().concat("0x" + Twine::utohexstr(Tag));
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +000056 }
57};
Devang Patel57c5a202010-11-04 15:01:38 +000058}
Devang Patel63f83cd2010-12-07 23:58:00 +000059
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +000060DIBuilder::DIBuilder(Module &m, bool AllowUnresolvedNodes)
Craig Topperc6207612014-04-09 06:08:46 +000061 : M(m), VMContext(M.getContext()), TempEnumTypes(nullptr),
62 TempRetainTypes(nullptr), TempSubprograms(nullptr), TempGVs(nullptr),
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +000063 DeclareFn(nullptr), ValueFn(nullptr),
64 AllowUnresolvedNodes(AllowUnresolvedNodes) {}
65
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +000066void DIBuilder::trackIfUnresolved(MDNode *N) {
Duncan P. N. Exon Smith9b1c6d32015-01-19 19:09:14 +000067 if (!N)
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +000068 return;
Duncan P. N. Exon Smith9b1c6d32015-01-19 19:09:14 +000069 if (N->isResolved())
70 return;
71
72 assert(AllowUnresolvedNodes && "Cannot handle unresolved nodes");
73 UnresolvedNodes.emplace_back(N);
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +000074}
Devang Patel57c5a202010-11-04 15:01:38 +000075
Devang Patel2b8acaf2011-08-15 23:00:00 +000076void DIBuilder::finalize() {
Devang Pateleb1bb4e2011-08-16 22:09:43 +000077 DIArray Enums = getOrCreateArray(AllEnumTypes);
78 DIType(TempEnumTypes).replaceAllUsesWith(Enums);
79
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +000080 SmallVector<Metadata *, 16> RetainValues;
Manman Ren0b410402013-08-29 23:17:54 +000081 // Declarations and definitions of the same type may be retained. Some
82 // clients RAUW these pairs, leaving duplicates in the retained types
83 // list. Use a set to remove the duplicates while we transform the
84 // TrackingVHs back into Values.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +000085 SmallPtrSet<Metadata *, 16> RetainSet;
Manman Ren0b410402013-08-29 23:17:54 +000086 for (unsigned I = 0, E = AllRetainTypes.size(); I < E; I++)
David Blaikie70573dc2014-11-19 07:49:26 +000087 if (RetainSet.insert(AllRetainTypes[I]).second)
Manman Ren0b410402013-08-29 23:17:54 +000088 RetainValues.push_back(AllRetainTypes[I]);
89 DIArray RetainTypes = getOrCreateArray(RetainValues);
Devang Pateleb1bb4e2011-08-16 22:09:43 +000090 DIType(TempRetainTypes).replaceAllUsesWith(RetainTypes);
91
92 DIArray SPs = getOrCreateArray(AllSubprograms);
93 DIType(TempSubprograms).replaceAllUsesWith(SPs);
Devang Patel59e27c52011-08-19 23:28:12 +000094 for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i) {
95 DISubprogram SP(SPs.getElement(i));
Eric Christopher27deb262012-04-23 19:00:11 +000096 if (MDNode *Temp = SP.getVariablesNodes()) {
Benjamin Kramer6cd780f2015-02-17 15:29:18 +000097 const auto &PV = PreservedVariables.lookup(SP);
98 SmallVector<Metadata *, 4> Variables(PV.begin(), PV.end());
Eric Christopher27deb262012-04-23 19:00:11 +000099 DIArray AV = getOrCreateArray(Variables);
100 DIType(Temp).replaceAllUsesWith(AV);
101 }
Devang Patel59e27c52011-08-19 23:28:12 +0000102 }
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000103
104 DIArray GVs = getOrCreateArray(AllGVs);
105 DIType(TempGVs).replaceAllUsesWith(GVs);
David Blaikief55abea2013-04-22 06:12:31 +0000106
Benjamin Kramer6cd780f2015-02-17 15:29:18 +0000107 SmallVector<Metadata *, 16> RetainValuesI(AllImportedModules.begin(),
108 AllImportedModules.end());
Eric Christopher2c3a6dc2014-02-28 21:27:57 +0000109 DIArray IMs = getOrCreateArray(RetainValuesI);
David Blaikief55abea2013-04-22 06:12:31 +0000110 DIType(TempImportedModules).replaceAllUsesWith(IMs);
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000111
112 // Now that all temp nodes have been replaced or deleted, resolve remaining
113 // cycles.
114 for (const auto &N : UnresolvedNodes)
Duncan P. N. Exon Smith2bc00f42015-01-19 23:13:14 +0000115 if (N && !N->isResolved())
116 N->resolveCycles();
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000117 UnresolvedNodes.clear();
118
119 // Can't handle unresolved nodes anymore.
120 AllowUnresolvedNodes = false;
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000121}
122
Duncan P. N. Exon Smith379e3752014-10-01 21:32:15 +0000123/// If N is compile unit return NULL otherwise return N.
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000124static MDNode *getNonCompileUnitScope(MDNode *N) {
125 if (DIDescriptor(N).isCompileUnit())
Craig Topperc6207612014-04-09 06:08:46 +0000126 return nullptr;
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000127 return N;
Devang Patel2b8acaf2011-08-15 23:00:00 +0000128}
129
David Blaikieefb0d652013-03-20 23:58:12 +0000130static MDNode *createFilePathPair(LLVMContext &VMContext, StringRef Filename,
131 StringRef Directory) {
132 assert(!Filename.empty() && "Unable to create file without name");
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000133 Metadata *Pair[] = {MDString::get(VMContext, Filename),
134 MDString::get(VMContext, Directory)};
David Blaikieefb0d652013-03-20 23:58:12 +0000135 return MDNode::get(VMContext, Pair);
136}
137
Eric Christopher03b3e112013-07-19 00:51:47 +0000138DICompileUnit DIBuilder::createCompileUnit(unsigned Lang, StringRef Filename,
139 StringRef Directory,
140 StringRef Producer, bool isOptimized,
141 StringRef Flags, unsigned RunTimeVer,
Eric Christopher75d49db2014-02-27 01:24:56 +0000142 StringRef SplitName,
Diego Novillo56653fd2014-06-24 17:02:03 +0000143 DebugEmissionKind Kind,
144 bool EmitDebugInfo) {
Eric Christopher75d49db2014-02-27 01:24:56 +0000145
Bruce Mitchener7e575ed2015-02-07 06:35:30 +0000146 assert(((Lang <= dwarf::DW_LANG_Fortran08 && Lang >= dwarf::DW_LANG_C89) ||
Chandler Carruth4c0ee742012-01-10 18:18:52 +0000147 (Lang <= dwarf::DW_LANG_hi_user && Lang >= dwarf::DW_LANG_lo_user)) &&
148 "Invalid Language tag");
149 assert(!Filename.empty() &&
150 "Unable to create compile unit without filename");
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000151
Duncan P. N. Exon Smithb93569d2015-02-12 21:52:11 +0000152 // TODO: Once we make MDCompileUnit distinct, stop using temporaries here
153 // (just start with operands assigned to nullptr).
154 TempEnumTypes = MDTuple::getTemporary(VMContext, None).release();
155 TempRetainTypes = MDTuple::getTemporary(VMContext, None).release();
156 TempSubprograms = MDTuple::getTemporary(VMContext, None).release();
157 TempGVs = MDTuple::getTemporary(VMContext, None).release();
158 TempImportedModules = MDTuple::getTemporary(VMContext, None).release();
David Blaikief55abea2013-04-22 06:12:31 +0000159
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000160 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_compile_unit)
161 .concat(Lang)
162 .concat(Producer)
163 .concat(isOptimized)
164 .concat(Flags)
165 .concat(RunTimeVer)
166 .concat(SplitName)
167 .concat(Kind)
168 .get(VMContext),
169 createFilePathPair(VMContext, Filename, Directory),
170 TempEnumTypes, TempRetainTypes, TempSubprograms, TempGVs,
171 TempImportedModules};
Eric Christopher03b3e112013-07-19 00:51:47 +0000172
Duncan P. N. Exon Smithb93569d2015-02-12 21:52:11 +0000173 // TODO: Switch to getDistinct(). We never want to merge compile units based
174 // on contents.
Eric Christopher03b3e112013-07-19 00:51:47 +0000175 MDNode *CUNode = MDNode::get(VMContext, Elts);
Devang Patel09fa69e2011-05-03 16:18:28 +0000176
177 // Create a named metadata so that it is easier to find cu in a module.
Diego Novillo56653fd2014-06-24 17:02:03 +0000178 // Note that we only generate this when the caller wants to actually
179 // emit debug information. When we are only interested in tracking
180 // source line locations throughout the backend, we prevent codegen from
181 // emitting debug info in the final output by not generating llvm.dbg.cu.
182 if (EmitDebugInfo) {
183 NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.cu");
184 NMD->addOperand(CUNode);
185 }
Eric Christopher03b3e112013-07-19 00:51:47 +0000186
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000187 trackIfUnresolved(CUNode);
Eric Christopher03b3e112013-07-19 00:51:47 +0000188 return DICompileUnit(CUNode);
Devang Patel57c5a202010-11-04 15:01:38 +0000189}
190
David Blaikiee63d5d12013-05-20 22:50:35 +0000191static DIImportedEntity
David Blaikie2a40c142014-04-06 06:29:01 +0000192createImportedModule(LLVMContext &C, dwarf::Tag Tag, DIScope Context,
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000193 Metadata *NS, unsigned Line, StringRef Name,
194 SmallVectorImpl<TrackingMDNodeRef> &AllImportedModules) {
David Blaikiee63d5d12013-05-20 22:50:35 +0000195 const MDNode *R;
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000196 Metadata *Elts[] = {HeaderBuilder::get(Tag).concat(Line).concat(Name).get(C),
197 Context, NS};
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000198 R = MDNode::get(C, Elts);
David Blaikiee63d5d12013-05-20 22:50:35 +0000199 DIImportedEntity M(R);
David Blaikie1fd43652013-05-07 21:35:53 +0000200 assert(M.Verify() && "Imported module should be valid");
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000201 AllImportedModules.emplace_back(M.get());
David Blaikie1fd43652013-05-07 21:35:53 +0000202 return M;
203}
204
David Blaikiee63d5d12013-05-20 22:50:35 +0000205DIImportedEntity DIBuilder::createImportedModule(DIScope Context,
David Blaikie2a40c142014-04-06 06:29:01 +0000206 DINameSpace NS,
207 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
212DIImportedEntity DIBuilder::createImportedModule(DIScope Context,
213 DIImportedEntity NS,
David Blaikie2a40c142014-04-06 06:29:01 +0000214 unsigned Line) {
215 return ::createImportedModule(VMContext, dwarf::DW_TAG_imported_module,
216 Context, NS, Line, StringRef(), AllImportedModules);
David Blaikiee63d5d12013-05-20 22:50:35 +0000217}
218
David Blaikie1fd43652013-05-07 21:35:53 +0000219DIImportedEntity DIBuilder::createImportedDeclaration(DIScope Context,
Frederic Riss4aa51ae2014-11-06 17:46:55 +0000220 DIDescriptor Decl,
David Blaikie2a40c142014-04-06 06:29:01 +0000221 unsigned Line, StringRef Name) {
Frederic Riss4aa51ae2014-11-06 17:46:55 +0000222 // Make sure to use the unique identifier based metadata reference for
223 // types that have one.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000224 Metadata *V =
225 Decl.isType() ? static_cast<Metadata *>(DIType(Decl).getRef()) : Decl;
David Blaikie2a40c142014-04-06 06:29:01 +0000226 return ::createImportedModule(VMContext, dwarf::DW_TAG_imported_declaration,
Frederic Riss4aa51ae2014-11-06 17:46:55 +0000227 Context, V, Line, Name,
David Blaikie2a40c142014-04-06 06:29:01 +0000228 AllImportedModules);
229}
230
231DIImportedEntity DIBuilder::createImportedDeclaration(DIScope Context,
232 DIImportedEntity Imp,
233 unsigned Line, StringRef Name) {
234 return ::createImportedModule(VMContext, dwarf::DW_TAG_imported_declaration,
235 Context, Imp, Line, Name, AllImportedModules);
David Blaikief55abea2013-04-22 06:12:31 +0000236}
237
Devang Patel9b412732011-02-22 18:56:12 +0000238DIFile DIBuilder::createFile(StringRef Filename, StringRef Directory) {
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000239 Metadata *Elts[] = {
240 HeaderBuilder::get(dwarf::DW_TAG_file_type).get(VMContext),
241 createFilePathPair(VMContext, Filename, Directory)};
David Blaikie5692e722013-03-28 02:44:59 +0000242 return DIFile(MDNode::get(VMContext, Elts));
Devang Patel57c5a202010-11-04 15:01:38 +0000243}
244
David Blaikieb7619002013-06-24 17:34:33 +0000245DIEnumerator DIBuilder::createEnumerator(StringRef Name, int64_t Val) {
Devang Patel1ad1abe2011-09-12 18:26:08 +0000246 assert(!Name.empty() && "Unable to create enumerator without name");
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000247 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_enumerator)
248 .concat(Name)
249 .concat(Val)
250 .get(VMContext)};
David Blaikie5692e722013-03-28 02:44:59 +0000251 return DIEnumerator(MDNode::get(VMContext, Elts));
Devang Patel57c5a202010-11-04 15:01:38 +0000252}
253
Peter Collingbournea4a47cb2013-06-27 22:50:59 +0000254DIBasicType DIBuilder::createUnspecifiedType(StringRef Name) {
Devang Patel04d6d472011-09-14 23:13:28 +0000255 assert(!Name.empty() && "Unable to create type without name");
Peter Collingbournea4a47cb2013-06-27 22:50:59 +0000256 // Unspecified types are encoded in DIBasicType format. Line number, filename,
257 // size, alignment, offset and flags are always empty here.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000258 Metadata *Elts[] = {
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000259 HeaderBuilder::get(dwarf::DW_TAG_unspecified_type)
260 .concat(Name)
261 .concat(0)
262 .concat(0)
263 .concat(0)
264 .concat(0)
265 .concat(0)
266 .concat(0)
267 .get(VMContext),
268 nullptr, // Filename
269 nullptr // Unused
Devang Patel04d6d472011-09-14 23:13:28 +0000270 };
Manman Ren3c6acec2013-06-07 18:35:53 +0000271 return DIBasicType(MDNode::get(VMContext, Elts));
Devang Patel04d6d472011-09-14 23:13:28 +0000272}
273
Peter Collingbournea4a47cb2013-06-27 22:50:59 +0000274DIBasicType DIBuilder::createNullPtrType() {
275 return createUnspecifiedType("decltype(nullptr)");
276}
277
David Blaikie209d63a2013-02-12 00:40:41 +0000278DIBasicType
279DIBuilder::createBasicType(StringRef Name, uint64_t SizeInBits,
280 uint64_t AlignInBits, unsigned Encoding) {
Devang Patel1ad1abe2011-09-12 18:26:08 +0000281 assert(!Name.empty() && "Unable to create type without name");
Devang Patel57c5a202010-11-04 15:01:38 +0000282 // Basic types are encoded in DIBasicType format. Line number, filename,
283 // offset and flags are always empty here.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000284 Metadata *Elts[] = {
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000285 HeaderBuilder::get(dwarf::DW_TAG_base_type)
286 .concat(Name)
287 .concat(0) // Line
288 .concat(SizeInBits)
289 .concat(AlignInBits)
290 .concat(0) // Offset
291 .concat(0) // Flags
292 .concat(Encoding)
293 .get(VMContext),
294 nullptr, // Filename
295 nullptr // Unused
Benjamin Kramered8b7bf2010-11-04 18:45:27 +0000296 };
David Blaikie5692e722013-03-28 02:44:59 +0000297 return DIBasicType(MDNode::get(VMContext, Elts));
Devang Patel57c5a202010-11-04 15:01:38 +0000298}
299
David Blaikief11de2f2013-02-18 06:41:57 +0000300DIDerivedType DIBuilder::createQualifiedType(unsigned Tag, DIType FromTy) {
Benjamin Kramered8b7bf2010-11-04 18:45:27 +0000301 // Qualified types are encoded in DIDerivedType format.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000302 Metadata *Elts[] = {HeaderBuilder::get(Tag)
303 .concat(StringRef()) // Name
304 .concat(0) // Line
305 .concat(0) // Size
306 .concat(0) // Align
307 .concat(0) // Offset
308 .concat(0) // Flags
309 .get(VMContext),
310 nullptr, // Filename
311 nullptr, // Unused
312 FromTy.getRef()};
David Blaikie5692e722013-03-28 02:44:59 +0000313 return DIDerivedType(MDNode::get(VMContext, Elts));
Devang Patel57c5a202010-11-04 15:01:38 +0000314}
315
David Blaikief11de2f2013-02-18 06:41:57 +0000316DIDerivedType
317DIBuilder::createPointerType(DIType PointeeTy, uint64_t SizeInBits,
318 uint64_t AlignInBits, StringRef Name) {
Benjamin Kramered8b7bf2010-11-04 18:45:27 +0000319 // Pointer types are encoded in DIDerivedType format.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000320 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_pointer_type)
321 .concat(Name)
322 .concat(0) // Line
323 .concat(SizeInBits)
324 .concat(AlignInBits)
325 .concat(0) // Offset
326 .concat(0) // Flags
327 .get(VMContext),
328 nullptr, // Filename
329 nullptr, // Unused
330 PointeeTy.getRef()};
David Blaikie5692e722013-03-28 02:44:59 +0000331 return DIDerivedType(MDNode::get(VMContext, Elts));
Devang Patel57c5a202010-11-04 15:01:38 +0000332}
333
Adrian Prantl48af2ef2014-12-23 19:11:47 +0000334DIDerivedType
335DIBuilder::createMemberPointerType(DIType PointeeTy, DIType Base,
336 uint64_t SizeInBits, uint64_t AlignInBits) {
David Blaikie5d3249b2013-01-07 05:51:15 +0000337 // Pointer types are encoded in DIDerivedType format.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000338 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_ptr_to_member_type)
339 .concat(StringRef())
340 .concat(0) // Line
Adrian Prantl48af2ef2014-12-23 19:11:47 +0000341 .concat(SizeInBits) // Size
342 .concat(AlignInBits) // Align
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000343 .concat(0) // Offset
344 .concat(0) // Flags
345 .get(VMContext),
346 nullptr, // Filename
347 nullptr, // Unused
348 PointeeTy.getRef(), Base.getRef()};
David Blaikie5692e722013-03-28 02:44:59 +0000349 return DIDerivedType(MDNode::get(VMContext, Elts));
David Blaikie5d3249b2013-01-07 05:51:15 +0000350}
351
David Blaikief11de2f2013-02-18 06:41:57 +0000352DIDerivedType DIBuilder::createReferenceType(unsigned Tag, DIType RTy) {
Manman Ren74c188f2013-07-01 21:02:01 +0000353 assert(RTy.isType() && "Unable to create reference type");
Benjamin Kramered8b7bf2010-11-04 18:45:27 +0000354 // References are encoded in DIDerivedType format.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000355 Metadata *Elts[] = {HeaderBuilder::get(Tag)
356 .concat(StringRef()) // Name
357 .concat(0) // Line
358 .concat(0) // Size
359 .concat(0) // Align
360 .concat(0) // Offset
361 .concat(0) // Flags
362 .get(VMContext),
363 nullptr, // Filename
364 nullptr, // TheCU,
365 RTy.getRef()};
David Blaikie5692e722013-03-28 02:44:59 +0000366 return DIDerivedType(MDNode::get(VMContext, Elts));
Devang Patel57c5a202010-11-04 15:01:38 +0000367}
368
David Blaikief11de2f2013-02-18 06:41:57 +0000369DIDerivedType DIBuilder::createTypedef(DIType Ty, StringRef Name, DIFile File,
370 unsigned LineNo, DIDescriptor Context) {
Benjamin Kramered8b7bf2010-11-04 18:45:27 +0000371 // typedefs are encoded in DIDerivedType format.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000372 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_typedef)
373 .concat(Name)
374 .concat(LineNo)
375 .concat(0) // Size
376 .concat(0) // Align
377 .concat(0) // Offset
378 .concat(0) // Flags
379 .get(VMContext),
380 File.getFileNode(),
381 DIScope(getNonCompileUnitScope(Context)).getRef(),
382 Ty.getRef()};
David Blaikie5692e722013-03-28 02:44:59 +0000383 return DIDerivedType(MDNode::get(VMContext, Elts));
Devang Patel57c5a202010-11-04 15:01:38 +0000384}
385
Manman Ren3c6acec2013-06-07 18:35:53 +0000386DIDerivedType DIBuilder::createFriend(DIType Ty, DIType FriendTy) {
Benjamin Kramered8b7bf2010-11-04 18:45:27 +0000387 // typedefs are encoded in DIDerivedType format.
Manman Ren74c188f2013-07-01 21:02:01 +0000388 assert(Ty.isType() && "Invalid type!");
389 assert(FriendTy.isType() && "Invalid friend type!");
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000390 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_friend)
391 .concat(StringRef()) // Name
392 .concat(0) // Line
393 .concat(0) // Size
394 .concat(0) // Align
395 .concat(0) // Offset
396 .concat(0) // Flags
397 .get(VMContext),
398 nullptr, Ty.getRef(), FriendTy.getRef()};
Manman Ren3c6acec2013-06-07 18:35:53 +0000399 return DIDerivedType(MDNode::get(VMContext, Elts));
Devang Patel57c5a202010-11-04 15:01:38 +0000400}
401
Eric Christopher98f9c232013-10-15 23:31:31 +0000402DIDerivedType DIBuilder::createInheritance(DIType Ty, DIType BaseTy,
403 uint64_t BaseOffset,
404 unsigned Flags) {
Manman Ren74c188f2013-07-01 21:02:01 +0000405 assert(Ty.isType() && "Unable to create inheritance");
Benjamin Kramered8b7bf2010-11-04 18:45:27 +0000406 // TAG_inheritance is encoded in DIDerivedType format.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000407 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_inheritance)
408 .concat(StringRef()) // Name
409 .concat(0) // Line
410 .concat(0) // Size
411 .concat(0) // Align
412 .concat(BaseOffset)
413 .concat(Flags)
414 .get(VMContext),
415 nullptr, Ty.getRef(), BaseTy.getRef()};
Adrian Prantl9a804922015-02-11 17:45:08 +0000416 auto R = DIDerivedType(MDNode::get(VMContext, Elts));
417 trackIfUnresolved(R);
418 return R;
Devang Patel57c5a202010-11-04 15:01:38 +0000419}
420
Eric Christopher98f9c232013-10-15 23:31:31 +0000421DIDerivedType DIBuilder::createMemberType(DIDescriptor Scope, StringRef Name,
422 DIFile File, unsigned LineNumber,
423 uint64_t SizeInBits,
424 uint64_t AlignInBits,
425 uint64_t OffsetInBits, unsigned Flags,
426 DIType Ty) {
Benjamin Kramered8b7bf2010-11-04 18:45:27 +0000427 // TAG_member is encoded in DIDerivedType format.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000428 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_member)
429 .concat(Name)
430 .concat(LineNumber)
431 .concat(SizeInBits)
432 .concat(AlignInBits)
433 .concat(OffsetInBits)
434 .concat(Flags)
435 .get(VMContext),
436 File.getFileNode(),
437 DIScope(getNonCompileUnitScope(Scope)).getRef(),
438 Ty.getRef()};
David Blaikie5692e722013-03-28 02:44:59 +0000439 return DIDerivedType(MDNode::get(VMContext, Elts));
Devang Patel57c5a202010-11-04 15:01:38 +0000440}
441
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000442static Metadata *getConstantOrNull(Constant *C) {
443 if (C)
444 return ConstantAsMetadata::get(C);
445 return nullptr;
446}
447
Duncan P. N. Exon Smithdbf64acd2014-11-15 00:23:49 +0000448DIDerivedType DIBuilder::createStaticMemberType(DIDescriptor Scope,
449 StringRef Name, DIFile File,
450 unsigned LineNumber, DIType Ty,
451 unsigned Flags,
452 llvm::Constant *Val) {
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000453 // TAG_member is encoded in DIDerivedType format.
454 Flags |= DIDescriptor::FlagStaticMember;
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000455 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_member)
456 .concat(Name)
457 .concat(LineNumber)
458 .concat(0) // Size
459 .concat(0) // Align
460 .concat(0) // Offset
461 .concat(Flags)
462 .get(VMContext),
463 File.getFileNode(),
464 DIScope(getNonCompileUnitScope(Scope)).getRef(),
465 Ty.getRef(), getConstantOrNull(Val)};
Manman Ren3c6acec2013-06-07 18:35:53 +0000466 return DIDerivedType(MDNode::get(VMContext, Elts));
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000467}
468
Eric Christopher98f9c232013-10-15 23:31:31 +0000469DIDerivedType DIBuilder::createObjCIVar(StringRef Name, DIFile File,
470 unsigned LineNumber,
471 uint64_t SizeInBits,
472 uint64_t AlignInBits,
473 uint64_t OffsetInBits, unsigned Flags,
474 DIType Ty, MDNode *PropertyNode) {
Devang Patel44882172012-02-06 17:49:43 +0000475 // TAG_member is encoded in DIDerivedType format.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000476 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_member)
477 .concat(Name)
478 .concat(LineNumber)
479 .concat(SizeInBits)
480 .concat(AlignInBits)
481 .concat(OffsetInBits)
482 .concat(Flags)
483 .get(VMContext),
484 File.getFileNode(), getNonCompileUnitScope(File), Ty,
485 PropertyNode};
Manman Ren3c6acec2013-06-07 18:35:53 +0000486 return DIDerivedType(MDNode::get(VMContext, Elts));
Devang Patel44882172012-02-06 17:49:43 +0000487}
488
Eric Christopher98f9c232013-10-15 23:31:31 +0000489DIObjCProperty
490DIBuilder::createObjCProperty(StringRef Name, DIFile File, unsigned LineNumber,
491 StringRef GetterName, StringRef SetterName,
492 unsigned PropertyAttributes, DIType Ty) {
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000493 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_APPLE_property)
494 .concat(Name)
495 .concat(LineNumber)
496 .concat(GetterName)
497 .concat(SetterName)
498 .concat(PropertyAttributes)
499 .get(VMContext),
500 File, Ty};
David Blaikie5692e722013-03-28 02:44:59 +0000501 return DIObjCProperty(MDNode::get(VMContext, Elts));
Devang Patelcc481592012-02-04 00:59:25 +0000502}
503
Eric Christopher3cc90fe2011-08-26 21:02:40 +0000504DITemplateTypeParameter
Devang Patel9b412732011-02-22 18:56:12 +0000505DIBuilder::createTemplateTypeParameter(DIDescriptor Context, StringRef Name,
Duncan P. N. Exon Smithb4aa16f2015-02-13 03:35:29 +0000506 DIType Ty) {
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000507 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_template_type_parameter)
508 .concat(Name)
Duncan P. N. Exon Smithb4aa16f2015-02-13 03:35:29 +0000509 .concat(0)
510 .concat(0)
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000511 .get(VMContext),
512 DIScope(getNonCompileUnitScope(Context)).getRef(),
Duncan P. N. Exon Smithb4aa16f2015-02-13 03:35:29 +0000513 Ty.getRef(), nullptr};
David Blaikie5692e722013-03-28 02:44:59 +0000514 return DITemplateTypeParameter(MDNode::get(VMContext, Elts));
Devang Patel3a9e65e2011-02-02 21:38:25 +0000515}
516
Duncan P. N. Exon Smithb4aa16f2015-02-13 03:35:29 +0000517static DITemplateValueParameter
518createTemplateValueParameterHelper(LLVMContext &VMContext, unsigned Tag,
519 DIDescriptor Context, StringRef Name,
520 DIType Ty, Metadata *MD) {
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000521 Metadata *Elts[] = {
Duncan P. N. Exon Smithb4aa16f2015-02-13 03:35:29 +0000522 HeaderBuilder::get(Tag).concat(Name).concat(0).concat(0).get(VMContext),
523 DIScope(getNonCompileUnitScope(Context)).getRef(), Ty.getRef(), MD,
524 nullptr};
David Blaikie5692e722013-03-28 02:44:59 +0000525 return DITemplateValueParameter(MDNode::get(VMContext, Elts));
Devang Patelbe933b42011-02-02 22:35:53 +0000526}
527
David Blaikie2b380232013-06-22 18:59:11 +0000528DITemplateValueParameter
529DIBuilder::createTemplateValueParameter(DIDescriptor Context, StringRef Name,
Duncan P. N. Exon Smithb4aa16f2015-02-13 03:35:29 +0000530 DIType Ty, Constant *Val) {
Duncan P. N. Exon Smith774951f2014-11-15 00:05:04 +0000531 return createTemplateValueParameterHelper(
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000532 VMContext, dwarf::DW_TAG_template_value_parameter, Context, Name, Ty,
Duncan P. N. Exon Smithb4aa16f2015-02-13 03:35:29 +0000533 getConstantOrNull(Val));
David Blaikie2b380232013-06-22 18:59:11 +0000534}
535
536DITemplateValueParameter
537DIBuilder::createTemplateTemplateParameter(DIDescriptor Context, StringRef Name,
Duncan P. N. Exon Smithb4aa16f2015-02-13 03:35:29 +0000538 DIType Ty, StringRef Val) {
Duncan P. N. Exon Smith774951f2014-11-15 00:05:04 +0000539 return createTemplateValueParameterHelper(
540 VMContext, dwarf::DW_TAG_GNU_template_template_param, Context, Name, Ty,
Duncan P. N. Exon Smithb4aa16f2015-02-13 03:35:29 +0000541 MDString::get(VMContext, Val));
David Blaikie2b380232013-06-22 18:59:11 +0000542}
543
544DITemplateValueParameter
545DIBuilder::createTemplateParameterPack(DIDescriptor Context, StringRef Name,
Duncan P. N. Exon Smithb4aa16f2015-02-13 03:35:29 +0000546 DIType Ty, DIArray Val) {
Duncan P. N. Exon Smith774951f2014-11-15 00:05:04 +0000547 return createTemplateValueParameterHelper(
548 VMContext, dwarf::DW_TAG_GNU_template_parameter_pack, Context, Name, Ty,
Duncan P. N. Exon Smithb4aa16f2015-02-13 03:35:29 +0000549 Val);
David Blaikie2b380232013-06-22 18:59:11 +0000550}
551
David Blaikiea7310a32013-03-26 23:46:39 +0000552DICompositeType DIBuilder::createClassType(DIDescriptor Context, StringRef Name,
553 DIFile File, unsigned LineNumber,
554 uint64_t SizeInBits,
555 uint64_t AlignInBits,
556 uint64_t OffsetInBits,
557 unsigned Flags, DIType DerivedFrom,
558 DIArray Elements,
Manman Ren27552062013-09-06 23:54:23 +0000559 DIType VTableHolder,
Manman Ren547467b2013-08-27 23:06:40 +0000560 MDNode *TemplateParams,
561 StringRef UniqueIdentifier) {
Manman Ren74c188f2013-07-01 21:02:01 +0000562 assert((!Context || Context.isScope() || Context.isType()) &&
David Blaikie085abe32013-03-11 23:21:19 +0000563 "createClassType should be called with a valid Context");
564 // TAG_class_type is encoded in DICompositeType format.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000565 Metadata *Elts[] = {
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000566 HeaderBuilder::get(dwarf::DW_TAG_class_type)
567 .concat(Name)
568 .concat(LineNumber)
569 .concat(SizeInBits)
570 .concat(AlignInBits)
571 .concat(OffsetInBits)
572 .concat(Flags)
573 .concat(0)
574 .get(VMContext),
575 File.getFileNode(), DIScope(getNonCompileUnitScope(Context)).getRef(),
576 DerivedFrom.getRef(), Elements, VTableHolder.getRef(), TemplateParams,
577 UniqueIdentifier.empty() ? nullptr
578 : MDString::get(VMContext, UniqueIdentifier)};
David Blaikiea7310a32013-03-26 23:46:39 +0000579 DICompositeType R(MDNode::get(VMContext, Elts));
Manman Ren74c188f2013-07-01 21:02:01 +0000580 assert(R.isCompositeType() &&
581 "createClassType should return a DICompositeType");
Manman Ren0b410402013-08-29 23:17:54 +0000582 if (!UniqueIdentifier.empty())
583 retainType(R);
David Blaikie085abe32013-03-11 23:21:19 +0000584 return R;
Eric Christopher17426692012-07-06 02:35:57 +0000585}
586
David Blaikiebbe0e1a2013-02-25 01:07:18 +0000587DICompositeType DIBuilder::createStructType(DIDescriptor Context,
588 StringRef Name, DIFile File,
589 unsigned LineNumber,
590 uint64_t SizeInBits,
591 uint64_t AlignInBits,
592 unsigned Flags, DIType DerivedFrom,
593 DIArray Elements,
594 unsigned RunTimeLang,
Manman Ren27552062013-09-06 23:54:23 +0000595 DIType VTableHolder,
Manman Ren547467b2013-08-27 23:06:40 +0000596 StringRef UniqueIdentifier) {
Devang Patel746660f2010-12-07 23:25:47 +0000597 // TAG_structure_type is encoded in DICompositeType format.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000598 Metadata *Elts[] = {
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000599 HeaderBuilder::get(dwarf::DW_TAG_structure_type)
600 .concat(Name)
601 .concat(LineNumber)
602 .concat(SizeInBits)
603 .concat(AlignInBits)
604 .concat(0)
605 .concat(Flags)
606 .concat(RunTimeLang)
607 .get(VMContext),
608 File.getFileNode(), DIScope(getNonCompileUnitScope(Context)).getRef(),
609 DerivedFrom.getRef(), Elements, VTableHolder.getRef(), nullptr,
610 UniqueIdentifier.empty() ? nullptr
611 : MDString::get(VMContext, UniqueIdentifier)};
David Blaikie085abe32013-03-11 23:21:19 +0000612 DICompositeType R(MDNode::get(VMContext, Elts));
Manman Ren74c188f2013-07-01 21:02:01 +0000613 assert(R.isCompositeType() &&
614 "createStructType should return a DICompositeType");
Manman Ren0b410402013-08-29 23:17:54 +0000615 if (!UniqueIdentifier.empty())
616 retainType(R);
David Blaikie085abe32013-03-11 23:21:19 +0000617 return R;
Devang Patel746660f2010-12-07 23:25:47 +0000618}
619
Eric Christopher17dd8f02013-04-02 22:55:52 +0000620DICompositeType DIBuilder::createUnionType(DIDescriptor Scope, StringRef Name,
621 DIFile File, unsigned LineNumber,
622 uint64_t SizeInBits,
623 uint64_t AlignInBits, unsigned Flags,
624 DIArray Elements,
Manman Ren547467b2013-08-27 23:06:40 +0000625 unsigned RunTimeLang,
626 StringRef UniqueIdentifier) {
Devang Patel89ea4f22010-12-08 01:50:15 +0000627 // TAG_union_type is encoded in DICompositeType format.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000628 Metadata *Elts[] = {
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000629 HeaderBuilder::get(dwarf::DW_TAG_union_type)
630 .concat(Name)
631 .concat(LineNumber)
632 .concat(SizeInBits)
633 .concat(AlignInBits)
634 .concat(0) // Offset
635 .concat(Flags)
636 .concat(RunTimeLang)
637 .get(VMContext),
638 File.getFileNode(), DIScope(getNonCompileUnitScope(Scope)).getRef(),
639 nullptr, Elements, nullptr, nullptr,
640 UniqueIdentifier.empty() ? nullptr
641 : MDString::get(VMContext, UniqueIdentifier)};
Manman Ren0b410402013-08-29 23:17:54 +0000642 DICompositeType R(MDNode::get(VMContext, Elts));
643 if (!UniqueIdentifier.empty())
644 retainType(R);
645 return R;
Devang Patel89ea4f22010-12-08 01:50:15 +0000646}
647
Manman Renf8a19672014-07-28 22:24:06 +0000648DISubroutineType DIBuilder::createSubroutineType(DIFile File,
649 DITypeArray ParameterTypes,
650 unsigned Flags) {
Devang Patel89ea4f22010-12-08 01:50:15 +0000651 // TAG_subroutine_type is encoded in DICompositeType format.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000652 Metadata *Elts[] = {
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000653 HeaderBuilder::get(dwarf::DW_TAG_subroutine_type)
654 .concat(StringRef())
655 .concat(0) // Line
656 .concat(0) // Size
657 .concat(0) // Align
658 .concat(0) // Offset
659 .concat(Flags) // Flags
660 .concat(0)
661 .get(VMContext),
662 nullptr, nullptr, nullptr, ParameterTypes, nullptr, nullptr,
663 nullptr // Type Identifer
Devang Patel89ea4f22010-12-08 01:50:15 +0000664 };
Manman Renf8a19672014-07-28 22:24:06 +0000665 return DISubroutineType(MDNode::get(VMContext, Elts));
Devang Patel89ea4f22010-12-08 01:50:15 +0000666}
667
David Blaikief11de2f2013-02-18 06:41:57 +0000668DICompositeType DIBuilder::createEnumerationType(
669 DIDescriptor Scope, StringRef Name, DIFile File, unsigned LineNumber,
670 uint64_t SizeInBits, uint64_t AlignInBits, DIArray Elements,
Manman Ren547467b2013-08-27 23:06:40 +0000671 DIType UnderlyingType, StringRef UniqueIdentifier) {
Devang Patel89ea4f22010-12-08 01:50:15 +0000672 // TAG_enumeration_type is encoded in DICompositeType format.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000673 Metadata *Elts[] = {
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000674 HeaderBuilder::get(dwarf::DW_TAG_enumeration_type)
675 .concat(Name)
676 .concat(LineNumber)
677 .concat(SizeInBits)
678 .concat(AlignInBits)
679 .concat(0) // Offset
680 .concat(0) // Flags
681 .concat(0)
682 .get(VMContext),
683 File.getFileNode(), DIScope(getNonCompileUnitScope(Scope)).getRef(),
684 UnderlyingType.getRef(), Elements, nullptr, nullptr,
685 UniqueIdentifier.empty() ? nullptr
686 : MDString::get(VMContext, UniqueIdentifier)};
David Blaikie4f6bf27a2013-11-18 23:33:32 +0000687 DICompositeType CTy(MDNode::get(VMContext, Elts));
688 AllEnumTypes.push_back(CTy);
Manman Ren0b410402013-08-29 23:17:54 +0000689 if (!UniqueIdentifier.empty())
David Blaikie4f6bf27a2013-11-18 23:33:32 +0000690 retainType(CTy);
691 return CTy;
Devang Patel89ea4f22010-12-08 01:50:15 +0000692}
693
David Blaikief11de2f2013-02-18 06:41:57 +0000694DICompositeType DIBuilder::createArrayType(uint64_t Size, uint64_t AlignInBits,
695 DIType Ty, DIArray Subscripts) {
Devang Patel89ea4f22010-12-08 01:50:15 +0000696 // TAG_array_type is encoded in DICompositeType format.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000697 Metadata *Elts[] = {
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000698 HeaderBuilder::get(dwarf::DW_TAG_array_type)
699 .concat(StringRef())
700 .concat(0) // Line
701 .concat(Size)
702 .concat(AlignInBits)
703 .concat(0) // Offset
704 .concat(0) // Flags
705 .concat(0)
706 .get(VMContext),
707 nullptr, // Filename/Directory,
708 nullptr, // Unused
709 Ty.getRef(), Subscripts, nullptr, nullptr,
710 nullptr // Type Identifer
Devang Patel89ea4f22010-12-08 01:50:15 +0000711 };
David Blaikie5692e722013-03-28 02:44:59 +0000712 return DICompositeType(MDNode::get(VMContext, Elts));
Devang Patel89ea4f22010-12-08 01:50:15 +0000713}
714
Manman Ren60711602013-06-07 03:13:46 +0000715DICompositeType DIBuilder::createVectorType(uint64_t Size, uint64_t AlignInBits,
716 DIType Ty, DIArray Subscripts) {
Eric Christopher72a52952013-01-08 01:53:52 +0000717 // A vector is an array type with the FlagVector flag applied.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000718 Metadata *Elts[] = {
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000719 HeaderBuilder::get(dwarf::DW_TAG_array_type)
720 .concat("")
721 .concat(0) // Line
722 .concat(Size)
723 .concat(AlignInBits)
724 .concat(0) // Offset
725 .concat(DIType::FlagVector)
726 .concat(0)
727 .get(VMContext),
728 nullptr, // Filename/Directory,
729 nullptr, // Unused
730 Ty.getRef(), Subscripts, nullptr, nullptr,
731 nullptr // Type Identifer
Devang Patel89ea4f22010-12-08 01:50:15 +0000732 };
Manman Ren60711602013-06-07 03:13:46 +0000733 return DICompositeType(MDNode::get(VMContext, Elts));
Devang Patel89ea4f22010-12-08 01:50:15 +0000734}
Devang Patel746660f2010-12-07 23:25:47 +0000735
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000736static HeaderBuilder setTypeFlagsInHeader(StringRef Header,
737 unsigned FlagsToSet) {
738 DIHeaderFieldIterator I(Header);
739 std::advance(I, 6);
740
741 unsigned Flags;
742 if (I->getAsInteger(0, Flags))
743 Flags = 0;
744 Flags |= FlagsToSet;
745
Duncan P. N. Exon Smithaa687a32015-01-20 05:02:42 +0000746 return HeaderBuilder()
747 .concat(I.getPrefix())
748 .concat(Flags)
749 .concat(I.getSuffix());
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000750}
751
752static DIType createTypeWithFlags(LLVMContext &Context, DIType Ty,
753 unsigned FlagsToSet) {
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000754 SmallVector<Metadata *, 9> Elts;
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000755 MDNode *N = Ty;
756 assert(N && "Unexpected input DIType!");
757 // Update header field.
758 Elts.push_back(setTypeFlagsInHeader(Ty.getHeader(), FlagsToSet).get(Context));
Benjamin Kramer6cd780f2015-02-17 15:29:18 +0000759 Elts.append(N->op_begin() + 1, N->op_end());
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000760
761 return DIType(MDNode::get(Context, Elts));
762}
763
Devang Patel9b412732011-02-22 18:56:12 +0000764DIType DIBuilder::createArtificialType(DIType Ty) {
Devang Patel57c5a202010-11-04 15:01:38 +0000765 if (Ty.isArtificial())
766 return Ty;
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000767 return createTypeWithFlags(VMContext, Ty, DIType::FlagArtificial);
Devang Patel57c5a202010-11-04 15:01:38 +0000768}
Devang Patel746660f2010-12-07 23:25:47 +0000769
Eric Christophere3417762012-09-12 23:36:19 +0000770DIType DIBuilder::createObjectPointerType(DIType Ty) {
771 if (Ty.isObjectPointer())
772 return Ty;
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000773 unsigned Flags = DIType::FlagObjectPointer | DIType::FlagArtificial;
774 return createTypeWithFlags(VMContext, Ty, Flags);
Eric Christophere3417762012-09-12 23:36:19 +0000775}
776
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000777void DIBuilder::retainType(DIType T) { AllRetainTypes.emplace_back(T); }
Devang Patel89ea4f22010-12-08 01:50:15 +0000778
Manman Renf93ac4b2014-07-29 18:20:39 +0000779DIBasicType DIBuilder::createUnspecifiedParameter() {
Manman Ren72b07e82014-07-29 22:58:13 +0000780 return DIBasicType();
Devang Patel89ea4f22010-12-08 01:50:15 +0000781}
782
Eric Christopher98f9c232013-10-15 23:31:31 +0000783DICompositeType
784DIBuilder::createForwardDecl(unsigned Tag, StringRef Name, DIDescriptor Scope,
785 DIFile F, unsigned Line, unsigned RuntimeLang,
786 uint64_t SizeInBits, uint64_t AlignInBits,
787 StringRef UniqueIdentifier) {
Eric Christopherae56eec2012-02-08 00:22:26 +0000788 // Create a temporary MDNode.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000789 Metadata *Elts[] = {
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000790 HeaderBuilder::get(Tag)
791 .concat(Name)
792 .concat(Line)
793 .concat(SizeInBits)
794 .concat(AlignInBits)
795 .concat(0) // Offset
796 .concat(DIDescriptor::FlagFwdDecl)
797 .concat(RuntimeLang)
798 .get(VMContext),
799 F.getFileNode(), DIScope(getNonCompileUnitScope(Scope)).getRef(), nullptr,
800 DIArray(), nullptr,
801 nullptr, // TemplateParams
802 UniqueIdentifier.empty() ? nullptr
803 : MDString::get(VMContext, UniqueIdentifier)};
David Blaikied3f094a2014-05-06 03:41:57 +0000804 MDNode *Node = MDNode::get(VMContext, Elts);
805 DICompositeType RetTy(Node);
806 assert(RetTy.isCompositeType() &&
807 "createForwardDecl result should be a DIType");
808 if (!UniqueIdentifier.empty())
809 retainType(RetTy);
810 return RetTy;
811}
812
Adrian Prantl534a81a2015-02-11 17:45:05 +0000813DICompositeType DIBuilder::createReplaceableCompositeType(
David Blaikied3f094a2014-05-06 03:41:57 +0000814 unsigned Tag, StringRef Name, DIDescriptor Scope, DIFile F, unsigned Line,
815 unsigned RuntimeLang, uint64_t SizeInBits, uint64_t AlignInBits,
Adrian Prantl534a81a2015-02-11 17:45:05 +0000816 unsigned Flags, StringRef UniqueIdentifier) {
David Blaikied3f094a2014-05-06 03:41:57 +0000817 // Create a temporary MDNode.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000818 Metadata *Elts[] = {
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000819 HeaderBuilder::get(Tag)
820 .concat(Name)
821 .concat(Line)
822 .concat(SizeInBits)
823 .concat(AlignInBits)
824 .concat(0) // Offset
Adrian Prantl534a81a2015-02-11 17:45:05 +0000825 .concat(Flags)
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000826 .concat(RuntimeLang)
827 .get(VMContext),
828 F.getFileNode(), DIScope(getNonCompileUnitScope(Scope)).getRef(), nullptr,
829 DIArray(), nullptr,
830 nullptr, // TemplateParams
831 UniqueIdentifier.empty() ? nullptr
832 : MDString::get(VMContext, UniqueIdentifier)};
Duncan P. N. Exon Smith7d823132015-01-19 21:30:18 +0000833 DICompositeType RetTy(MDNode::getTemporary(VMContext, Elts).release());
David Blaikied4e106e2013-08-16 20:42:14 +0000834 assert(RetTy.isCompositeType() &&
Frederic Rissa8734142014-09-10 16:03:14 +0000835 "createReplaceableForwardDecl result should be a DIType");
Manman Ren0b410402013-08-29 23:17:54 +0000836 if (!UniqueIdentifier.empty())
837 retainType(RetTy);
Manman Rend0e67aa2013-07-02 18:37:35 +0000838 return RetTy;
Eric Christopherae56eec2012-02-08 00:22:26 +0000839}
840
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000841DIArray DIBuilder::getOrCreateArray(ArrayRef<Metadata *> Elements) {
Jay Foaddbf81d82011-04-24 10:11:03 +0000842 return DIArray(MDNode::get(VMContext, Elements));
Devang Patel746660f2010-12-07 23:25:47 +0000843}
844
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000845DITypeArray DIBuilder::getOrCreateTypeArray(ArrayRef<Metadata *> Elements) {
846 SmallVector<llvm::Metadata *, 16> Elts;
Manman Ren1a125c92014-07-28 19:33:20 +0000847 for (unsigned i = 0, e = Elements.size(); i != e; ++i) {
848 if (Elements[i] && isa<MDNode>(Elements[i]))
849 Elts.push_back(DIType(cast<MDNode>(Elements[i])).getRef());
850 else
851 Elts.push_back(Elements[i]);
852 }
853 return DITypeArray(MDNode::get(VMContext, Elts));
854}
855
Bill Wendlingd7767122012-12-04 21:34:03 +0000856DISubrange DIBuilder::getOrCreateSubrange(int64_t Lo, int64_t Count) {
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000857 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_subrange_type)
858 .concat(Lo)
859 .concat(Count)
860 .get(VMContext)};
Devang Patel89ea4f22010-12-08 01:50:15 +0000861
Devang Patel0c773242011-04-18 23:51:03 +0000862 return DISubrange(MDNode::get(VMContext, Elts));
Devang Patel89ea4f22010-12-08 01:50:15 +0000863}
864
Duncan P. N. Exon Smithdbf64acd2014-11-15 00:23:49 +0000865static DIGlobalVariable createGlobalVariableHelper(
866 LLVMContext &VMContext, DIDescriptor Context, StringRef Name,
867 StringRef LinkageName, DIFile F, unsigned LineNumber, DITypeRef Ty,
868 bool isLocalToUnit, Constant *Val, MDNode *Decl, bool isDefinition,
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000869 std::function<MDNode *(ArrayRef<Metadata *>)> CreateFunc) {
Manman Renbfd2b8292014-11-21 19:47:48 +0000870
871 MDNode *TheCtx = getNonCompileUnitScope(Context);
872 if (DIScope(TheCtx).isCompositeType()) {
873 assert(!DICompositeType(TheCtx).getIdentifier() &&
874 "Context of a global variable should not be a type with identifier");
875 }
876
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000877 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_variable)
878 .concat(Name)
879 .concat(Name)
880 .concat(LinkageName)
881 .concat(LineNumber)
882 .concat(isLocalToUnit)
883 .concat(isDefinition)
884 .get(VMContext),
885 TheCtx, F, Ty, getConstantOrNull(Val),
886 DIDescriptor(Decl)};
Frederic Riss5e6bc9e2014-09-17 09:28:34 +0000887
888 return DIGlobalVariable(CreateFunc(Elts));
889}
890
Duncan P. N. Exon Smithdbf64acd2014-11-15 00:23:49 +0000891DIGlobalVariable DIBuilder::createGlobalVariable(
892 DIDescriptor Context, StringRef Name, StringRef LinkageName, DIFile F,
893 unsigned LineNumber, DITypeRef Ty, bool isLocalToUnit, Constant *Val,
894 MDNode *Decl) {
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000895 return createGlobalVariableHelper(
896 VMContext, Context, Name, LinkageName, F, LineNumber, Ty, isLocalToUnit,
897 Val, Decl, true, [&](ArrayRef<Metadata *> Elts) -> MDNode *{
898 MDNode *Node = MDNode::get(VMContext, Elts);
899 AllGVs.push_back(Node);
900 return Node;
901 });
Frederic Riss5e6bc9e2014-09-17 09:28:34 +0000902}
903
Duncan P. N. Exon Smithdbf64acd2014-11-15 00:23:49 +0000904DIGlobalVariable DIBuilder::createTempGlobalVariableFwdDecl(
905 DIDescriptor Context, StringRef Name, StringRef LinkageName, DIFile F,
906 unsigned LineNumber, DITypeRef Ty, bool isLocalToUnit, Constant *Val,
907 MDNode *Decl) {
Jyoti Allurb76b57f2014-09-29 06:32:54 +0000908 return createGlobalVariableHelper(VMContext, Context, Name, LinkageName, F,
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000909 LineNumber, Ty, isLocalToUnit, Val, Decl,
910 false, [&](ArrayRef<Metadata *> Elts) {
Duncan P. N. Exon Smith7d823132015-01-19 21:30:18 +0000911 return MDNode::getTemporary(VMContext, Elts).release();
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000912 });
Devang Patel746660f2010-12-07 23:25:47 +0000913}
914
Devang Patel9b412732011-02-22 18:56:12 +0000915DIVariable DIBuilder::createLocalVariable(unsigned Tag, DIDescriptor Scope,
Devang Patel63f83cd2010-12-07 23:58:00 +0000916 StringRef Name, DIFile File,
Adrian Prantl1a1647c2014-03-18 02:34:58 +0000917 unsigned LineNo, DITypeRef Ty,
Devang Patel40eee1e2011-03-01 22:58:13 +0000918 bool AlwaysPreserve, unsigned Flags,
919 unsigned ArgNo) {
David Blaikie085abe32013-03-11 23:21:19 +0000920 DIDescriptor Context(getNonCompileUnitScope(Scope));
Manman Ren74c188f2013-07-01 21:02:01 +0000921 assert((!Context || Context.isScope()) &&
David Blaikie085abe32013-03-11 23:21:19 +0000922 "createLocalVariable should be called with a valid Context");
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000923 Metadata *Elts[] = {HeaderBuilder::get(Tag)
924 .concat(Name)
925 .concat(LineNo | (ArgNo << 24))
926 .concat(Flags)
927 .get(VMContext),
928 getNonCompileUnitScope(Scope), File, Ty};
Devang Patel0c773242011-04-18 23:51:03 +0000929 MDNode *Node = MDNode::get(VMContext, Elts);
Devang Patel63f83cd2010-12-07 23:58:00 +0000930 if (AlwaysPreserve) {
931 // The optimizer may remove local variable. If there is an interest
932 // to preserve variable info in such situation then stash it in a
933 // named mdnode.
934 DISubprogram Fn(getDISubprogram(Scope));
Duncan P. N. Exon Smith3bfffde2014-10-15 16:11:41 +0000935 assert(Fn && "Missing subprogram for local variable");
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000936 PreservedVariables[Fn].emplace_back(Node);
Devang Patel63f83cd2010-12-07 23:58:00 +0000937 }
Manman Rend0e67aa2013-07-02 18:37:35 +0000938 DIVariable RetVar(Node);
939 assert(RetVar.isVariable() &&
Manman Ren74c188f2013-07-01 21:02:01 +0000940 "createLocalVariable should return a valid DIVariable");
Manman Rend0e67aa2013-07-02 18:37:35 +0000941 return RetVar;
Devang Patel63f83cd2010-12-07 23:58:00 +0000942}
943
Duncan P. N. Exon Smithbd75ad42015-02-09 22:13:27 +0000944DIExpression DIBuilder::createExpression(ArrayRef<uint64_t> Addr) {
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000945 auto Header = HeaderBuilder::get(DW_TAG_expression);
Duncan P. N. Exon Smithbd75ad42015-02-09 22:13:27 +0000946 for (uint64_t I : Addr)
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000947 Header.concat(I);
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000948 Metadata *Elts[] = {Header.get(VMContext)};
Adrian Prantl87b7eb92014-10-01 18:55:02 +0000949 return DIExpression(MDNode::get(VMContext, Elts));
Devang Patel746660f2010-12-07 23:25:47 +0000950}
951
Duncan P. N. Exon Smithbd75ad42015-02-09 22:13:27 +0000952DIExpression DIBuilder::createExpression(ArrayRef<int64_t> Signed) {
953 // TODO: Remove the callers of this signed version and delete.
954 SmallVector<uint64_t, 8> Addr(Signed.begin(), Signed.end());
955 return createExpression(Addr);
956}
957
Adrian Prantl27bd01f2015-02-09 23:57:15 +0000958DIExpression DIBuilder::createBitPieceExpression(unsigned OffsetInBits,
959 unsigned SizeInBits) {
960 int64_t Addr[] = {dwarf::DW_OP_bit_piece, OffsetInBits, SizeInBits};
Duncan P. N. Exon Smith9affbba2014-10-01 21:32:12 +0000961 return createExpression(Addr);
962}
963
Eric Christopher98f9c232013-10-15 23:31:31 +0000964DISubprogram DIBuilder::createFunction(DIScopeRef Context, StringRef Name,
965 StringRef LinkageName, DIFile File,
966 unsigned LineNo, DICompositeType Ty,
Manman Renc50fa112013-10-10 18:40:01 +0000967 bool isLocalToUnit, bool isDefinition,
Eric Christopher98f9c232013-10-15 23:31:31 +0000968 unsigned ScopeLine, unsigned Flags,
969 bool isOptimized, Function *Fn,
970 MDNode *TParams, MDNode *Decl) {
Manman Renc50fa112013-10-10 18:40:01 +0000971 // dragonegg does not generate identifier for types, so using an empty map
972 // to resolve the context should be fine.
973 DITypeIdentifierMap EmptyMap;
974 return createFunction(Context.resolve(EmptyMap), Name, LinkageName, File,
975 LineNo, Ty, isLocalToUnit, isDefinition, ScopeLine,
976 Flags, isOptimized, Fn, TParams, Decl);
977}
978
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000979static DISubprogram createFunctionHelper(
980 LLVMContext &VMContext, DIDescriptor Context, StringRef Name,
981 StringRef LinkageName, DIFile File, unsigned LineNo, DICompositeType Ty,
982 bool isLocalToUnit, bool isDefinition, unsigned ScopeLine, unsigned Flags,
983 bool isOptimized, Function *Fn, MDNode *TParams, MDNode *Decl, MDNode *Vars,
984 std::function<MDNode *(ArrayRef<Metadata *>)> CreateFunc) {
David Blaikie5174c842013-05-22 23:22:18 +0000985 assert(Ty.getTag() == dwarf::DW_TAG_subroutine_type &&
986 "function types should be subroutines");
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000987 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_subprogram)
988 .concat(Name)
989 .concat(Name)
990 .concat(LinkageName)
991 .concat(LineNo)
992 .concat(isLocalToUnit)
993 .concat(isDefinition)
994 .concat(0)
995 .concat(0)
996 .concat(Flags)
997 .concat(isOptimized)
998 .concat(ScopeLine)
999 .get(VMContext),
1000 File.getFileNode(),
1001 DIScope(getNonCompileUnitScope(Context)).getRef(), Ty,
1002 nullptr, getConstantOrNull(Fn), TParams, Decl, Vars};
Devang Patelb68c6232010-12-08 20:42:44 +00001003
Frederic Riss5e6bc9e2014-09-17 09:28:34 +00001004 DISubprogram S(CreateFunc(Elts));
Eric Christopher961959f2014-02-28 21:27:59 +00001005 assert(S.isSubprogram() &&
1006 "createFunction should return a valid DISubprogram");
David Blaikiecc8d0902013-03-21 20:28:52 +00001007 return S;
Devang Patelb68c6232010-12-08 20:42:44 +00001008}
1009
Frederic Riss5e6bc9e2014-09-17 09:28:34 +00001010
Frederic Riss5e6bc9e2014-09-17 09:28:34 +00001011DISubprogram DIBuilder::createFunction(DIDescriptor Context, StringRef Name,
1012 StringRef LinkageName, DIFile File,
1013 unsigned LineNo, DICompositeType Ty,
1014 bool isLocalToUnit, bool isDefinition,
1015 unsigned ScopeLine, unsigned Flags,
1016 bool isOptimized, Function *Fn,
1017 MDNode *TParams, MDNode *Decl) {
1018 return createFunctionHelper(VMContext, Context, Name, LinkageName, File,
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +00001019 LineNo, Ty, isLocalToUnit, isDefinition,
1020 ScopeLine, Flags, isOptimized, Fn, TParams, Decl,
Duncan P. N. Exon Smith7d823132015-01-19 21:30:18 +00001021 MDNode::getTemporary(VMContext, None).release(),
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +00001022 [&](ArrayRef<Metadata *> Elts) -> MDNode *{
1023 MDNode *Node = MDNode::get(VMContext, Elts);
1024 // Create a named metadata so that we
1025 // do not lose this mdnode.
1026 if (isDefinition)
1027 AllSubprograms.push_back(Node);
1028 return Node;
1029 });
Frederic Riss5e6bc9e2014-09-17 09:28:34 +00001030}
1031
Frederic Riss5e6bc9e2014-09-17 09:28:34 +00001032DISubprogram
1033DIBuilder::createTempFunctionFwdDecl(DIDescriptor Context, StringRef Name,
1034 StringRef LinkageName, DIFile File,
1035 unsigned LineNo, DICompositeType Ty,
1036 bool isLocalToUnit, bool isDefinition,
1037 unsigned ScopeLine, unsigned Flags,
1038 bool isOptimized, Function *Fn,
1039 MDNode *TParams, MDNode *Decl) {
1040 return createFunctionHelper(VMContext, Context, Name, LinkageName, File,
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +00001041 LineNo, Ty, isLocalToUnit, isDefinition,
1042 ScopeLine, Flags, isOptimized, Fn, TParams, Decl,
1043 nullptr, [&](ArrayRef<Metadata *> Elts) {
Duncan P. N. Exon Smith7d823132015-01-19 21:30:18 +00001044 return MDNode::getTemporary(VMContext, Elts).release();
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +00001045 });
Frederic Riss5e6bc9e2014-09-17 09:28:34 +00001046}
1047
Eric Christopher98f9c232013-10-15 23:31:31 +00001048DISubprogram DIBuilder::createMethod(DIDescriptor Context, StringRef Name,
1049 StringRef LinkageName, DIFile F,
David Blaikie5174c842013-05-22 23:22:18 +00001050 unsigned LineNo, DICompositeType Ty,
Eric Christopher98f9c232013-10-15 23:31:31 +00001051 bool isLocalToUnit, bool isDefinition,
Devang Patelb68c6232010-12-08 20:42:44 +00001052 unsigned VK, unsigned VIndex,
Eric Christopher98f9c232013-10-15 23:31:31 +00001053 DIType VTableHolder, unsigned Flags,
1054 bool isOptimized, Function *Fn,
Devang Patel9f738842011-04-05 22:52:06 +00001055 MDNode *TParam) {
David Blaikie5174c842013-05-22 23:22:18 +00001056 assert(Ty.getTag() == dwarf::DW_TAG_subroutine_type &&
1057 "function types should be subroutines");
Eric Christopher5cb56322013-10-15 23:31:36 +00001058 assert(getNonCompileUnitScope(Context) &&
1059 "Methods should have both a Context and a context that isn't "
1060 "the compile unit.");
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +00001061 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_subprogram)
1062 .concat(Name)
1063 .concat(Name)
1064 .concat(LinkageName)
1065 .concat(LineNo)
1066 .concat(isLocalToUnit)
1067 .concat(isDefinition)
1068 .concat(VK)
1069 .concat(VIndex)
1070 .concat(Flags)
1071 .concat(isOptimized)
1072 .concat(LineNo)
1073 // FIXME: Do we want to use different scope/lines?
1074 .get(VMContext),
1075 F.getFileNode(), DIScope(Context).getRef(), Ty,
1076 VTableHolder.getRef(), getConstantOrNull(Fn), TParam,
1077 nullptr, nullptr};
Devang Patel0c773242011-04-18 23:51:03 +00001078 MDNode *Node = MDNode::get(VMContext, Elts);
David Blaikie595eb442013-02-18 07:10:22 +00001079 if (isDefinition)
1080 AllSubprograms.push_back(Node);
David Blaikiecc8d0902013-03-21 20:28:52 +00001081 DISubprogram S(Node);
Manman Ren74c188f2013-07-01 21:02:01 +00001082 assert(S.isSubprogram() && "createMethod should return a valid DISubprogram");
David Blaikiecc8d0902013-03-21 20:28:52 +00001083 return S;
Devang Patelb68c6232010-12-08 20:42:44 +00001084}
1085
Devang Patel9b412732011-02-22 18:56:12 +00001086DINameSpace DIBuilder::createNameSpace(DIDescriptor Scope, StringRef Name,
Devang Patel746660f2010-12-07 23:25:47 +00001087 DIFile File, unsigned LineNo) {
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +00001088 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_namespace)
1089 .concat(Name)
1090 .concat(LineNo)
1091 .get(VMContext),
1092 File.getFileNode(), getNonCompileUnitScope(Scope)};
David Blaikie085abe32013-03-11 23:21:19 +00001093 DINameSpace R(MDNode::get(VMContext, Elts));
1094 assert(R.Verify() &&
1095 "createNameSpace should return a verifiable DINameSpace");
1096 return R;
Devang Patel746660f2010-12-07 23:25:47 +00001097}
1098
Eric Christopher6647b832011-10-11 22:59:11 +00001099DILexicalBlockFile DIBuilder::createLexicalBlockFile(DIDescriptor Scope,
David Blaikie2f3f76f2014-08-21 22:45:21 +00001100 DIFile File,
1101 unsigned Discriminator) {
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +00001102 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_lexical_block)
1103 .concat(Discriminator)
1104 .get(VMContext),
1105 File.getFileNode(), Scope};
David Blaikie085abe32013-03-11 23:21:19 +00001106 DILexicalBlockFile R(MDNode::get(VMContext, Elts));
1107 assert(
1108 R.Verify() &&
1109 "createLexicalBlockFile should return a verifiable DILexicalBlockFile");
1110 return R;
Eric Christopher6647b832011-10-11 22:59:11 +00001111}
1112
Devang Patel9b412732011-02-22 18:56:12 +00001113DILexicalBlock DIBuilder::createLexicalBlock(DIDescriptor Scope, DIFile File,
David Blaikie2f3f76f2014-08-21 22:45:21 +00001114 unsigned Line, unsigned Col) {
David Blaikie6c217162014-05-15 20:09:55 +00001115 // FIXME: This isn't thread safe nor the right way to defeat MDNode uniquing.
1116 // I believe the right way is to have a self-referential element in the node.
1117 // Also: why do we bother with line/column - they're not used and the
1118 // documentation (SourceLevelDebugging.rst) claims the line/col are necessary
1119 // for uniquing, yet then we have this other solution (because line/col were
1120 // inadequate) anyway. Remove all 3 and replace them with a self-reference.
1121
Adrian Prantl21e8d4a2013-06-24 21:19:43 +00001122 // Defeat MDNode uniquing for lexical blocks by using unique id.
Devang Patel89ea4f22010-12-08 01:50:15 +00001123 static unsigned int unique_id = 0;
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +00001124 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_lexical_block)
1125 .concat(Line)
1126 .concat(Col)
1127 .concat(unique_id++)
1128 .get(VMContext),
1129 File.getFileNode(), getNonCompileUnitScope(Scope)};
David Blaikie085abe32013-03-11 23:21:19 +00001130 DILexicalBlock R(MDNode::get(VMContext, Elts));
1131 assert(R.Verify() &&
1132 "createLexicalBlock should return a verifiable DILexicalBlock");
1133 return R;
Devang Patel89ea4f22010-12-08 01:50:15 +00001134}
1135
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +00001136static Value *getDbgIntrinsicValueImpl(LLVMContext &VMContext, Value *V) {
1137 assert(V && "no value passed to dbg intrinsic");
1138 return MetadataAsValue::get(VMContext, ValueAsMetadata::get(V));
1139}
1140
Devang Patel9b412732011-02-22 18:56:12 +00001141Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo,
Adrian Prantl87b7eb92014-10-01 18:55:02 +00001142 DIExpression Expr,
Devang Patel746660f2010-12-07 23:25:47 +00001143 Instruction *InsertBefore) {
Manman Ren9822a112013-06-29 05:01:19 +00001144 assert(VarInfo.isVariable() &&
1145 "empty or invalid DIVariable passed to dbg.declare");
Devang Patel746660f2010-12-07 23:25:47 +00001146 if (!DeclareFn)
1147 DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
1148
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +00001149 trackIfUnresolved(VarInfo);
1150 trackIfUnresolved(Expr);
1151 Value *Args[] = {getDbgIntrinsicValueImpl(VMContext, Storage),
1152 MetadataAsValue::get(VMContext, VarInfo),
1153 MetadataAsValue::get(VMContext, Expr)};
Jay Foad5bd375a2011-07-15 08:37:34 +00001154 return CallInst::Create(DeclareFn, Args, "", InsertBefore);
Devang Patel746660f2010-12-07 23:25:47 +00001155}
1156
Devang Patel9b412732011-02-22 18:56:12 +00001157Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo,
Adrian Prantl87b7eb92014-10-01 18:55:02 +00001158 DIExpression Expr,
Devang Patel746660f2010-12-07 23:25:47 +00001159 BasicBlock *InsertAtEnd) {
Manman Ren9822a112013-06-29 05:01:19 +00001160 assert(VarInfo.isVariable() &&
1161 "empty or invalid DIVariable passed to dbg.declare");
Devang Patel746660f2010-12-07 23:25:47 +00001162 if (!DeclareFn)
1163 DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
1164
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +00001165 trackIfUnresolved(VarInfo);
1166 trackIfUnresolved(Expr);
1167 Value *Args[] = {getDbgIntrinsicValueImpl(VMContext, Storage),
1168 MetadataAsValue::get(VMContext, VarInfo),
1169 MetadataAsValue::get(VMContext, Expr)};
Devang Patel746660f2010-12-07 23:25:47 +00001170
1171 // If this block already has a terminator then insert this intrinsic
1172 // before the terminator.
1173 if (TerminatorInst *T = InsertAtEnd->getTerminator())
Jay Foad5bd375a2011-07-15 08:37:34 +00001174 return CallInst::Create(DeclareFn, Args, "", T);
Devang Patel746660f2010-12-07 23:25:47 +00001175 else
Jay Foad5bd375a2011-07-15 08:37:34 +00001176 return CallInst::Create(DeclareFn, Args, "", InsertAtEnd);
Devang Patel746660f2010-12-07 23:25:47 +00001177}
1178
Devang Patel9b412732011-02-22 18:56:12 +00001179Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,
Devang Patel746660f2010-12-07 23:25:47 +00001180 DIVariable VarInfo,
Adrian Prantl87b7eb92014-10-01 18:55:02 +00001181 DIExpression Expr,
Devang Patel746660f2010-12-07 23:25:47 +00001182 Instruction *InsertBefore) {
1183 assert(V && "no value passed to dbg.value");
Manman Ren9822a112013-06-29 05:01:19 +00001184 assert(VarInfo.isVariable() &&
1185 "empty or invalid DIVariable passed to dbg.value");
Devang Patel746660f2010-12-07 23:25:47 +00001186 if (!ValueFn)
1187 ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value);
1188
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +00001189 trackIfUnresolved(VarInfo);
1190 trackIfUnresolved(Expr);
1191 Value *Args[] = {getDbgIntrinsicValueImpl(VMContext, V),
1192 ConstantInt::get(Type::getInt64Ty(VMContext), Offset),
1193 MetadataAsValue::get(VMContext, VarInfo),
1194 MetadataAsValue::get(VMContext, Expr)};
Jay Foad5bd375a2011-07-15 08:37:34 +00001195 return CallInst::Create(ValueFn, Args, "", InsertBefore);
Devang Patel746660f2010-12-07 23:25:47 +00001196}
1197
Devang Patel9b412732011-02-22 18:56:12 +00001198Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,
Devang Patel746660f2010-12-07 23:25:47 +00001199 DIVariable VarInfo,
Adrian Prantl87b7eb92014-10-01 18:55:02 +00001200 DIExpression Expr,
Devang Patel746660f2010-12-07 23:25:47 +00001201 BasicBlock *InsertAtEnd) {
1202 assert(V && "no value passed to dbg.value");
Manman Ren9822a112013-06-29 05:01:19 +00001203 assert(VarInfo.isVariable() &&
1204 "empty or invalid DIVariable passed to dbg.value");
Devang Patel746660f2010-12-07 23:25:47 +00001205 if (!ValueFn)
1206 ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value);
1207
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +00001208 trackIfUnresolved(VarInfo);
1209 trackIfUnresolved(Expr);
1210 Value *Args[] = {getDbgIntrinsicValueImpl(VMContext, V),
1211 ConstantInt::get(Type::getInt64Ty(VMContext), Offset),
1212 MetadataAsValue::get(VMContext, VarInfo),
1213 MetadataAsValue::get(VMContext, Expr)};
Jay Foad5bd375a2011-07-15 08:37:34 +00001214 return CallInst::Create(ValueFn, Args, "", InsertAtEnd);
Devang Patel746660f2010-12-07 23:25:47 +00001215}
Duncan P. N. Exon Smith97f07c22014-12-18 00:46:16 +00001216
1217void DIBuilder::replaceVTableHolder(DICompositeType &T, DICompositeType VTableHolder) {
1218 T.setContainingType(VTableHolder);
1219
1220 // If this didn't create a self-reference, just return.
1221 if (T != VTableHolder)
1222 return;
1223
Adrian Prantl18a25b02015-02-11 17:45:10 +00001224 // Look for unresolved operands. T will drop RAUW support, orphaning any
1225 // cycles underneath it.
1226 if (T->isResolved())
1227 for (const MDOperand &O : T->operands())
1228 if (auto *N = dyn_cast_or_null<MDNode>(O))
1229 trackIfUnresolved(N);
Duncan P. N. Exon Smith97f07c22014-12-18 00:46:16 +00001230}
1231
1232void DIBuilder::replaceArrays(DICompositeType &T, DIArray Elements,
1233 DIArray TParams) {
1234 T.setArrays(Elements, TParams);
1235
1236 // If T isn't resolved, there's no problem.
1237 if (!T->isResolved())
1238 return;
1239
1240 // If "T" is resolved, it may be due to a self-reference cycle. Track the
1241 // arrays explicitly if they're unresolved, or else the cycles will be
1242 // orphaned.
1243 if (Elements)
1244 trackIfUnresolved(Elements);
1245 if (TParams)
1246 trackIfUnresolved(TParams);
1247}