blob: 2cb27cae1449d8ab2cb8c828c82928a41cd9dd17 [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));
Adrian Prantl9a804922015-02-11 17:45:08 +0000417 return R;
Devang Patel57c5a202010-11-04 15:01:38 +0000418}
419
Eric Christopher98f9c232013-10-15 23:31:31 +0000420DIDerivedType DIBuilder::createMemberType(DIDescriptor Scope, StringRef Name,
421 DIFile File, unsigned LineNumber,
422 uint64_t SizeInBits,
423 uint64_t AlignInBits,
424 uint64_t OffsetInBits, unsigned Flags,
425 DIType Ty) {
Benjamin Kramered8b7bf2010-11-04 18:45:27 +0000426 // TAG_member is encoded in DIDerivedType format.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000427 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_member)
428 .concat(Name)
429 .concat(LineNumber)
430 .concat(SizeInBits)
431 .concat(AlignInBits)
432 .concat(OffsetInBits)
433 .concat(Flags)
434 .get(VMContext),
435 File.getFileNode(),
436 DIScope(getNonCompileUnitScope(Scope)).getRef(),
437 Ty.getRef()};
David Blaikie5692e722013-03-28 02:44:59 +0000438 return DIDerivedType(MDNode::get(VMContext, Elts));
Devang Patel57c5a202010-11-04 15:01:38 +0000439}
440
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000441static Metadata *getConstantOrNull(Constant *C) {
442 if (C)
443 return ConstantAsMetadata::get(C);
444 return nullptr;
445}
446
Duncan P. N. Exon Smithdbf64acd2014-11-15 00:23:49 +0000447DIDerivedType DIBuilder::createStaticMemberType(DIDescriptor Scope,
448 StringRef Name, DIFile File,
449 unsigned LineNumber, DIType Ty,
450 unsigned Flags,
451 llvm::Constant *Val) {
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000452 // TAG_member is encoded in DIDerivedType format.
453 Flags |= DIDescriptor::FlagStaticMember;
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000454 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_member)
455 .concat(Name)
456 .concat(LineNumber)
457 .concat(0) // Size
458 .concat(0) // Align
459 .concat(0) // Offset
460 .concat(Flags)
461 .get(VMContext),
462 File.getFileNode(),
463 DIScope(getNonCompileUnitScope(Scope)).getRef(),
464 Ty.getRef(), getConstantOrNull(Val)};
Manman Ren3c6acec2013-06-07 18:35:53 +0000465 return DIDerivedType(MDNode::get(VMContext, Elts));
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000466}
467
Eric Christopher98f9c232013-10-15 23:31:31 +0000468DIDerivedType DIBuilder::createObjCIVar(StringRef Name, DIFile File,
469 unsigned LineNumber,
470 uint64_t SizeInBits,
471 uint64_t AlignInBits,
472 uint64_t OffsetInBits, unsigned Flags,
473 DIType Ty, MDNode *PropertyNode) {
Devang Patel44882172012-02-06 17:49:43 +0000474 // TAG_member is encoded in DIDerivedType format.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000475 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_member)
476 .concat(Name)
477 .concat(LineNumber)
478 .concat(SizeInBits)
479 .concat(AlignInBits)
480 .concat(OffsetInBits)
481 .concat(Flags)
482 .get(VMContext),
483 File.getFileNode(), getNonCompileUnitScope(File), Ty,
484 PropertyNode};
Manman Ren3c6acec2013-06-07 18:35:53 +0000485 return DIDerivedType(MDNode::get(VMContext, Elts));
Devang Patel44882172012-02-06 17:49:43 +0000486}
487
Eric Christopher98f9c232013-10-15 23:31:31 +0000488DIObjCProperty
489DIBuilder::createObjCProperty(StringRef Name, DIFile File, unsigned LineNumber,
490 StringRef GetterName, StringRef SetterName,
491 unsigned PropertyAttributes, DIType Ty) {
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000492 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_APPLE_property)
493 .concat(Name)
494 .concat(LineNumber)
495 .concat(GetterName)
496 .concat(SetterName)
497 .concat(PropertyAttributes)
498 .get(VMContext),
499 File, Ty};
David Blaikie5692e722013-03-28 02:44:59 +0000500 return DIObjCProperty(MDNode::get(VMContext, Elts));
Devang Patelcc481592012-02-04 00:59:25 +0000501}
502
Eric Christopher3cc90fe2011-08-26 21:02:40 +0000503DITemplateTypeParameter
Devang Patel9b412732011-02-22 18:56:12 +0000504DIBuilder::createTemplateTypeParameter(DIDescriptor Context, StringRef Name,
Duncan P. N. Exon Smithb4aa16f2015-02-13 03:35:29 +0000505 DIType Ty) {
Duncan P. N. Exon Smith89b075e2015-02-18 20:30:45 +0000506 assert(!DIScope(getNonCompileUnitScope(Context)).getRef() &&
507 "Expected compile unit");
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000508 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_template_type_parameter)
509 .concat(Name)
Duncan P. N. Exon Smithb4aa16f2015-02-13 03:35:29 +0000510 .concat(0)
511 .concat(0)
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000512 .get(VMContext),
Duncan P. N. Exon Smith89b075e2015-02-18 20:30:45 +0000513 nullptr, 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 Smith89b075e2015-02-18 20:30:45 +0000521 assert(!DIScope(getNonCompileUnitScope(Context)).getRef() &&
522 "Expected compile unit");
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000523 Metadata *Elts[] = {
Duncan P. N. Exon Smithb4aa16f2015-02-13 03:35:29 +0000524 HeaderBuilder::get(Tag).concat(Name).concat(0).concat(0).get(VMContext),
Duncan P. N. Exon Smith89b075e2015-02-18 20:30:45 +0000525 nullptr, Ty.getRef(), MD, nullptr};
David Blaikie5692e722013-03-28 02:44:59 +0000526 return DITemplateValueParameter(MDNode::get(VMContext, Elts));
Devang Patelbe933b42011-02-02 22:35:53 +0000527}
528
David Blaikie2b380232013-06-22 18:59:11 +0000529DITemplateValueParameter
530DIBuilder::createTemplateValueParameter(DIDescriptor Context, StringRef Name,
Duncan P. N. Exon Smithb4aa16f2015-02-13 03:35:29 +0000531 DIType Ty, Constant *Val) {
Duncan P. N. Exon Smith774951f2014-11-15 00:05:04 +0000532 return createTemplateValueParameterHelper(
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000533 VMContext, dwarf::DW_TAG_template_value_parameter, Context, Name, Ty,
Duncan P. N. Exon Smithb4aa16f2015-02-13 03:35:29 +0000534 getConstantOrNull(Val));
David Blaikie2b380232013-06-22 18:59:11 +0000535}
536
537DITemplateValueParameter
538DIBuilder::createTemplateTemplateParameter(DIDescriptor Context, StringRef Name,
Duncan P. N. Exon Smithb4aa16f2015-02-13 03:35:29 +0000539 DIType Ty, StringRef Val) {
Duncan P. N. Exon Smith774951f2014-11-15 00:05:04 +0000540 return createTemplateValueParameterHelper(
541 VMContext, dwarf::DW_TAG_GNU_template_template_param, Context, Name, Ty,
Duncan P. N. Exon Smithb4aa16f2015-02-13 03:35:29 +0000542 MDString::get(VMContext, Val));
David Blaikie2b380232013-06-22 18:59:11 +0000543}
544
545DITemplateValueParameter
546DIBuilder::createTemplateParameterPack(DIDescriptor Context, StringRef Name,
Duncan P. N. Exon Smithb4aa16f2015-02-13 03:35:29 +0000547 DIType Ty, DIArray Val) {
Duncan P. N. Exon Smith774951f2014-11-15 00:05:04 +0000548 return createTemplateValueParameterHelper(
549 VMContext, dwarf::DW_TAG_GNU_template_parameter_pack, Context, Name, Ty,
Duncan P. N. Exon Smithb4aa16f2015-02-13 03:35:29 +0000550 Val);
David Blaikie2b380232013-06-22 18:59:11 +0000551}
552
David Blaikiea7310a32013-03-26 23:46:39 +0000553DICompositeType DIBuilder::createClassType(DIDescriptor Context, StringRef Name,
554 DIFile File, unsigned LineNumber,
555 uint64_t SizeInBits,
556 uint64_t AlignInBits,
557 uint64_t OffsetInBits,
558 unsigned Flags, DIType DerivedFrom,
559 DIArray Elements,
Manman Ren27552062013-09-06 23:54:23 +0000560 DIType VTableHolder,
Manman Ren547467b2013-08-27 23:06:40 +0000561 MDNode *TemplateParams,
562 StringRef UniqueIdentifier) {
Manman Ren74c188f2013-07-01 21:02:01 +0000563 assert((!Context || Context.isScope() || Context.isType()) &&
David Blaikie085abe32013-03-11 23:21:19 +0000564 "createClassType should be called with a valid Context");
565 // TAG_class_type is encoded in DICompositeType format.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000566 Metadata *Elts[] = {
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000567 HeaderBuilder::get(dwarf::DW_TAG_class_type)
568 .concat(Name)
569 .concat(LineNumber)
570 .concat(SizeInBits)
571 .concat(AlignInBits)
572 .concat(OffsetInBits)
573 .concat(Flags)
574 .concat(0)
575 .get(VMContext),
576 File.getFileNode(), DIScope(getNonCompileUnitScope(Context)).getRef(),
577 DerivedFrom.getRef(), Elements, VTableHolder.getRef(), TemplateParams,
578 UniqueIdentifier.empty() ? nullptr
579 : MDString::get(VMContext, UniqueIdentifier)};
David Blaikiea7310a32013-03-26 23:46:39 +0000580 DICompositeType R(MDNode::get(VMContext, Elts));
Manman Ren74c188f2013-07-01 21:02:01 +0000581 assert(R.isCompositeType() &&
582 "createClassType should return a DICompositeType");
Manman Ren0b410402013-08-29 23:17:54 +0000583 if (!UniqueIdentifier.empty())
584 retainType(R);
Adrian Prantlea7f1c22015-02-17 19:17:39 +0000585 trackIfUnresolved(R);
David Blaikie085abe32013-03-11 23:21:19 +0000586 return R;
Eric Christopher17426692012-07-06 02:35:57 +0000587}
588
David Blaikiebbe0e1a2013-02-25 01:07:18 +0000589DICompositeType DIBuilder::createStructType(DIDescriptor Context,
590 StringRef Name, DIFile File,
591 unsigned LineNumber,
592 uint64_t SizeInBits,
593 uint64_t AlignInBits,
594 unsigned Flags, DIType DerivedFrom,
595 DIArray Elements,
596 unsigned RunTimeLang,
Manman Ren27552062013-09-06 23:54:23 +0000597 DIType VTableHolder,
Manman Ren547467b2013-08-27 23:06:40 +0000598 StringRef UniqueIdentifier) {
Devang Patel746660f2010-12-07 23:25:47 +0000599 // TAG_structure_type is encoded in DICompositeType format.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000600 Metadata *Elts[] = {
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000601 HeaderBuilder::get(dwarf::DW_TAG_structure_type)
602 .concat(Name)
603 .concat(LineNumber)
604 .concat(SizeInBits)
605 .concat(AlignInBits)
606 .concat(0)
607 .concat(Flags)
608 .concat(RunTimeLang)
609 .get(VMContext),
610 File.getFileNode(), DIScope(getNonCompileUnitScope(Context)).getRef(),
611 DerivedFrom.getRef(), Elements, VTableHolder.getRef(), nullptr,
612 UniqueIdentifier.empty() ? nullptr
613 : MDString::get(VMContext, UniqueIdentifier)};
David Blaikie085abe32013-03-11 23:21:19 +0000614 DICompositeType R(MDNode::get(VMContext, Elts));
Manman Ren74c188f2013-07-01 21:02:01 +0000615 assert(R.isCompositeType() &&
616 "createStructType should return a DICompositeType");
Manman Ren0b410402013-08-29 23:17:54 +0000617 if (!UniqueIdentifier.empty())
618 retainType(R);
Adrian Prantlea7f1c22015-02-17 19:17:39 +0000619 trackIfUnresolved(R);
David Blaikie085abe32013-03-11 23:21:19 +0000620 return R;
Devang Patel746660f2010-12-07 23:25:47 +0000621}
622
Eric Christopher17dd8f02013-04-02 22:55:52 +0000623DICompositeType DIBuilder::createUnionType(DIDescriptor Scope, StringRef Name,
624 DIFile File, unsigned LineNumber,
625 uint64_t SizeInBits,
626 uint64_t AlignInBits, unsigned Flags,
627 DIArray Elements,
Manman Ren547467b2013-08-27 23:06:40 +0000628 unsigned RunTimeLang,
629 StringRef UniqueIdentifier) {
Devang Patel89ea4f22010-12-08 01:50:15 +0000630 // TAG_union_type is encoded in DICompositeType format.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000631 Metadata *Elts[] = {
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000632 HeaderBuilder::get(dwarf::DW_TAG_union_type)
633 .concat(Name)
634 .concat(LineNumber)
635 .concat(SizeInBits)
636 .concat(AlignInBits)
637 .concat(0) // Offset
638 .concat(Flags)
639 .concat(RunTimeLang)
640 .get(VMContext),
641 File.getFileNode(), DIScope(getNonCompileUnitScope(Scope)).getRef(),
642 nullptr, Elements, nullptr, nullptr,
643 UniqueIdentifier.empty() ? nullptr
644 : MDString::get(VMContext, UniqueIdentifier)};
Manman Ren0b410402013-08-29 23:17:54 +0000645 DICompositeType R(MDNode::get(VMContext, Elts));
646 if (!UniqueIdentifier.empty())
647 retainType(R);
Adrian Prantlea7f1c22015-02-17 19:17:39 +0000648 trackIfUnresolved(R);
Manman Ren0b410402013-08-29 23:17:54 +0000649 return R;
Devang Patel89ea4f22010-12-08 01:50:15 +0000650}
651
Manman Renf8a19672014-07-28 22:24:06 +0000652DISubroutineType DIBuilder::createSubroutineType(DIFile File,
653 DITypeArray ParameterTypes,
654 unsigned Flags) {
Devang Patel89ea4f22010-12-08 01:50:15 +0000655 // TAG_subroutine_type is encoded in DICompositeType format.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000656 Metadata *Elts[] = {
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000657 HeaderBuilder::get(dwarf::DW_TAG_subroutine_type)
658 .concat(StringRef())
659 .concat(0) // Line
660 .concat(0) // Size
661 .concat(0) // Align
662 .concat(0) // Offset
663 .concat(Flags) // Flags
664 .concat(0)
665 .get(VMContext),
666 nullptr, nullptr, nullptr, ParameterTypes, nullptr, nullptr,
667 nullptr // Type Identifer
Devang Patel89ea4f22010-12-08 01:50:15 +0000668 };
Manman Renf8a19672014-07-28 22:24:06 +0000669 return DISubroutineType(MDNode::get(VMContext, Elts));
Devang Patel89ea4f22010-12-08 01:50:15 +0000670}
671
David Blaikief11de2f2013-02-18 06:41:57 +0000672DICompositeType DIBuilder::createEnumerationType(
673 DIDescriptor Scope, StringRef Name, DIFile File, unsigned LineNumber,
674 uint64_t SizeInBits, uint64_t AlignInBits, DIArray Elements,
Manman Ren547467b2013-08-27 23:06:40 +0000675 DIType UnderlyingType, StringRef UniqueIdentifier) {
Devang Patel89ea4f22010-12-08 01:50:15 +0000676 // TAG_enumeration_type is encoded in DICompositeType format.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000677 Metadata *Elts[] = {
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000678 HeaderBuilder::get(dwarf::DW_TAG_enumeration_type)
679 .concat(Name)
680 .concat(LineNumber)
681 .concat(SizeInBits)
682 .concat(AlignInBits)
683 .concat(0) // Offset
684 .concat(0) // Flags
685 .concat(0)
686 .get(VMContext),
687 File.getFileNode(), DIScope(getNonCompileUnitScope(Scope)).getRef(),
688 UnderlyingType.getRef(), Elements, nullptr, nullptr,
689 UniqueIdentifier.empty() ? nullptr
690 : MDString::get(VMContext, UniqueIdentifier)};
David Blaikie4f6bf27a2013-11-18 23:33:32 +0000691 DICompositeType CTy(MDNode::get(VMContext, Elts));
692 AllEnumTypes.push_back(CTy);
Manman Ren0b410402013-08-29 23:17:54 +0000693 if (!UniqueIdentifier.empty())
David Blaikie4f6bf27a2013-11-18 23:33:32 +0000694 retainType(CTy);
Adrian Prantlea7f1c22015-02-17 19:17:39 +0000695 trackIfUnresolved(CTy);
David Blaikie4f6bf27a2013-11-18 23:33:32 +0000696 return CTy;
Devang Patel89ea4f22010-12-08 01:50:15 +0000697}
698
David Blaikief11de2f2013-02-18 06:41:57 +0000699DICompositeType DIBuilder::createArrayType(uint64_t Size, uint64_t AlignInBits,
700 DIType Ty, DIArray Subscripts) {
Devang Patel89ea4f22010-12-08 01:50:15 +0000701 // TAG_array_type is encoded in DICompositeType format.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000702 Metadata *Elts[] = {
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000703 HeaderBuilder::get(dwarf::DW_TAG_array_type)
704 .concat(StringRef())
705 .concat(0) // Line
706 .concat(Size)
707 .concat(AlignInBits)
708 .concat(0) // Offset
709 .concat(0) // Flags
710 .concat(0)
711 .get(VMContext),
712 nullptr, // Filename/Directory,
713 nullptr, // Unused
714 Ty.getRef(), Subscripts, nullptr, nullptr,
715 nullptr // Type Identifer
Devang Patel89ea4f22010-12-08 01:50:15 +0000716 };
Adrian Prantlea7f1c22015-02-17 19:17:39 +0000717 DICompositeType R(MDNode::get(VMContext, Elts));
718 trackIfUnresolved(R);
719 return R;
Devang Patel89ea4f22010-12-08 01:50:15 +0000720}
721
Manman Ren60711602013-06-07 03:13:46 +0000722DICompositeType DIBuilder::createVectorType(uint64_t Size, uint64_t AlignInBits,
723 DIType Ty, DIArray Subscripts) {
Eric Christopher72a52952013-01-08 01:53:52 +0000724 // A vector is an array type with the FlagVector flag applied.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000725 Metadata *Elts[] = {
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000726 HeaderBuilder::get(dwarf::DW_TAG_array_type)
727 .concat("")
728 .concat(0) // Line
729 .concat(Size)
730 .concat(AlignInBits)
731 .concat(0) // Offset
732 .concat(DIType::FlagVector)
733 .concat(0)
734 .get(VMContext),
735 nullptr, // Filename/Directory,
736 nullptr, // Unused
737 Ty.getRef(), Subscripts, nullptr, nullptr,
738 nullptr // Type Identifer
Devang Patel89ea4f22010-12-08 01:50:15 +0000739 };
Adrian Prantlea7f1c22015-02-17 19:17:39 +0000740 DICompositeType R(MDNode::get(VMContext, Elts));
741 trackIfUnresolved(R);
742 return R;
Devang Patel89ea4f22010-12-08 01:50:15 +0000743}
Devang Patel746660f2010-12-07 23:25:47 +0000744
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000745static HeaderBuilder setTypeFlagsInHeader(StringRef Header,
746 unsigned FlagsToSet) {
747 DIHeaderFieldIterator I(Header);
748 std::advance(I, 6);
749
750 unsigned Flags;
751 if (I->getAsInteger(0, Flags))
752 Flags = 0;
753 Flags |= FlagsToSet;
754
Duncan P. N. Exon Smithaa687a32015-01-20 05:02:42 +0000755 return HeaderBuilder()
756 .concat(I.getPrefix())
757 .concat(Flags)
758 .concat(I.getSuffix());
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000759}
760
761static DIType createTypeWithFlags(LLVMContext &Context, DIType Ty,
762 unsigned FlagsToSet) {
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000763 SmallVector<Metadata *, 9> Elts;
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000764 MDNode *N = Ty;
765 assert(N && "Unexpected input DIType!");
766 // Update header field.
767 Elts.push_back(setTypeFlagsInHeader(Ty.getHeader(), FlagsToSet).get(Context));
Benjamin Kramer6cd780f2015-02-17 15:29:18 +0000768 Elts.append(N->op_begin() + 1, N->op_end());
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000769
770 return DIType(MDNode::get(Context, Elts));
771}
772
Devang Patel9b412732011-02-22 18:56:12 +0000773DIType DIBuilder::createArtificialType(DIType Ty) {
Devang Patel57c5a202010-11-04 15:01:38 +0000774 if (Ty.isArtificial())
775 return Ty;
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000776 return createTypeWithFlags(VMContext, Ty, DIType::FlagArtificial);
Devang Patel57c5a202010-11-04 15:01:38 +0000777}
Devang Patel746660f2010-12-07 23:25:47 +0000778
Eric Christophere3417762012-09-12 23:36:19 +0000779DIType DIBuilder::createObjectPointerType(DIType Ty) {
780 if (Ty.isObjectPointer())
781 return Ty;
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000782 unsigned Flags = DIType::FlagObjectPointer | DIType::FlagArtificial;
783 return createTypeWithFlags(VMContext, Ty, Flags);
Eric Christophere3417762012-09-12 23:36:19 +0000784}
785
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000786void DIBuilder::retainType(DIType T) { AllRetainTypes.emplace_back(T); }
Devang Patel89ea4f22010-12-08 01:50:15 +0000787
Manman Renf93ac4b2014-07-29 18:20:39 +0000788DIBasicType DIBuilder::createUnspecifiedParameter() {
Manman Ren72b07e82014-07-29 22:58:13 +0000789 return DIBasicType();
Devang Patel89ea4f22010-12-08 01:50:15 +0000790}
791
Eric Christopher98f9c232013-10-15 23:31:31 +0000792DICompositeType
793DIBuilder::createForwardDecl(unsigned Tag, StringRef Name, DIDescriptor Scope,
794 DIFile F, unsigned Line, unsigned RuntimeLang,
795 uint64_t SizeInBits, uint64_t AlignInBits,
796 StringRef UniqueIdentifier) {
Eric Christopherae56eec2012-02-08 00:22:26 +0000797 // Create a temporary MDNode.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000798 Metadata *Elts[] = {
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000799 HeaderBuilder::get(Tag)
800 .concat(Name)
801 .concat(Line)
802 .concat(SizeInBits)
803 .concat(AlignInBits)
804 .concat(0) // Offset
805 .concat(DIDescriptor::FlagFwdDecl)
806 .concat(RuntimeLang)
807 .get(VMContext),
808 F.getFileNode(), DIScope(getNonCompileUnitScope(Scope)).getRef(), nullptr,
809 DIArray(), nullptr,
810 nullptr, // TemplateParams
811 UniqueIdentifier.empty() ? nullptr
812 : MDString::get(VMContext, UniqueIdentifier)};
David Blaikied3f094a2014-05-06 03:41:57 +0000813 MDNode *Node = MDNode::get(VMContext, Elts);
814 DICompositeType RetTy(Node);
815 assert(RetTy.isCompositeType() &&
816 "createForwardDecl result should be a DIType");
817 if (!UniqueIdentifier.empty())
818 retainType(RetTy);
Adrian Prantlea7f1c22015-02-17 19:17:39 +0000819 trackIfUnresolved(RetTy);
David Blaikied3f094a2014-05-06 03:41:57 +0000820 return RetTy;
821}
822
Adrian Prantl534a81a2015-02-11 17:45:05 +0000823DICompositeType DIBuilder::createReplaceableCompositeType(
David Blaikied3f094a2014-05-06 03:41:57 +0000824 unsigned Tag, StringRef Name, DIDescriptor Scope, DIFile F, unsigned Line,
825 unsigned RuntimeLang, uint64_t SizeInBits, uint64_t AlignInBits,
Adrian Prantl534a81a2015-02-11 17:45:05 +0000826 unsigned Flags, StringRef UniqueIdentifier) {
David Blaikied3f094a2014-05-06 03:41:57 +0000827 // Create a temporary MDNode.
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000828 Metadata *Elts[] = {
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000829 HeaderBuilder::get(Tag)
830 .concat(Name)
831 .concat(Line)
832 .concat(SizeInBits)
833 .concat(AlignInBits)
834 .concat(0) // Offset
Adrian Prantl534a81a2015-02-11 17:45:05 +0000835 .concat(Flags)
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000836 .concat(RuntimeLang)
837 .get(VMContext),
838 F.getFileNode(), DIScope(getNonCompileUnitScope(Scope)).getRef(), nullptr,
839 DIArray(), nullptr,
840 nullptr, // TemplateParams
841 UniqueIdentifier.empty() ? nullptr
842 : MDString::get(VMContext, UniqueIdentifier)};
Duncan P. N. Exon Smith7d823132015-01-19 21:30:18 +0000843 DICompositeType RetTy(MDNode::getTemporary(VMContext, Elts).release());
David Blaikied4e106e2013-08-16 20:42:14 +0000844 assert(RetTy.isCompositeType() &&
Frederic Rissa8734142014-09-10 16:03:14 +0000845 "createReplaceableForwardDecl result should be a DIType");
Manman Ren0b410402013-08-29 23:17:54 +0000846 if (!UniqueIdentifier.empty())
847 retainType(RetTy);
Adrian Prantlea7f1c22015-02-17 19:17:39 +0000848 trackIfUnresolved(RetTy);
Manman Rend0e67aa2013-07-02 18:37:35 +0000849 return RetTy;
Eric Christopherae56eec2012-02-08 00:22:26 +0000850}
851
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000852DIArray DIBuilder::getOrCreateArray(ArrayRef<Metadata *> Elements) {
Jay Foaddbf81d82011-04-24 10:11:03 +0000853 return DIArray(MDNode::get(VMContext, Elements));
Devang Patel746660f2010-12-07 23:25:47 +0000854}
855
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000856DITypeArray DIBuilder::getOrCreateTypeArray(ArrayRef<Metadata *> Elements) {
857 SmallVector<llvm::Metadata *, 16> Elts;
Manman Ren1a125c92014-07-28 19:33:20 +0000858 for (unsigned i = 0, e = Elements.size(); i != e; ++i) {
859 if (Elements[i] && isa<MDNode>(Elements[i]))
860 Elts.push_back(DIType(cast<MDNode>(Elements[i])).getRef());
861 else
862 Elts.push_back(Elements[i]);
863 }
864 return DITypeArray(MDNode::get(VMContext, Elts));
865}
866
Bill Wendlingd7767122012-12-04 21:34:03 +0000867DISubrange DIBuilder::getOrCreateSubrange(int64_t Lo, int64_t Count) {
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000868 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_subrange_type)
869 .concat(Lo)
870 .concat(Count)
871 .get(VMContext)};
Devang Patel89ea4f22010-12-08 01:50:15 +0000872
Devang Patel0c773242011-04-18 23:51:03 +0000873 return DISubrange(MDNode::get(VMContext, Elts));
Devang Patel89ea4f22010-12-08 01:50:15 +0000874}
875
Duncan P. N. Exon Smithdbf64acd2014-11-15 00:23:49 +0000876static DIGlobalVariable createGlobalVariableHelper(
877 LLVMContext &VMContext, DIDescriptor Context, StringRef Name,
878 StringRef LinkageName, DIFile F, unsigned LineNumber, DITypeRef Ty,
879 bool isLocalToUnit, Constant *Val, MDNode *Decl, bool isDefinition,
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000880 std::function<MDNode *(ArrayRef<Metadata *>)> CreateFunc) {
Manman Renbfd2b8292014-11-21 19:47:48 +0000881
882 MDNode *TheCtx = getNonCompileUnitScope(Context);
883 if (DIScope(TheCtx).isCompositeType()) {
884 assert(!DICompositeType(TheCtx).getIdentifier() &&
885 "Context of a global variable should not be a type with identifier");
886 }
887
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000888 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_variable)
889 .concat(Name)
890 .concat(Name)
891 .concat(LinkageName)
892 .concat(LineNumber)
893 .concat(isLocalToUnit)
894 .concat(isDefinition)
895 .get(VMContext),
896 TheCtx, F, Ty, getConstantOrNull(Val),
897 DIDescriptor(Decl)};
Frederic Riss5e6bc9e2014-09-17 09:28:34 +0000898
899 return DIGlobalVariable(CreateFunc(Elts));
900}
901
Duncan P. N. Exon Smithdbf64acd2014-11-15 00:23:49 +0000902DIGlobalVariable DIBuilder::createGlobalVariable(
903 DIDescriptor Context, StringRef Name, StringRef LinkageName, DIFile F,
904 unsigned LineNumber, DITypeRef Ty, bool isLocalToUnit, Constant *Val,
905 MDNode *Decl) {
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000906 return createGlobalVariableHelper(
907 VMContext, Context, Name, LinkageName, F, LineNumber, Ty, isLocalToUnit,
908 Val, Decl, true, [&](ArrayRef<Metadata *> Elts) -> MDNode *{
909 MDNode *Node = MDNode::get(VMContext, Elts);
910 AllGVs.push_back(Node);
911 return Node;
912 });
Frederic Riss5e6bc9e2014-09-17 09:28:34 +0000913}
914
Duncan P. N. Exon Smithdbf64acd2014-11-15 00:23:49 +0000915DIGlobalVariable DIBuilder::createTempGlobalVariableFwdDecl(
916 DIDescriptor Context, StringRef Name, StringRef LinkageName, DIFile F,
917 unsigned LineNumber, DITypeRef Ty, bool isLocalToUnit, Constant *Val,
918 MDNode *Decl) {
Jyoti Allurb76b57f2014-09-29 06:32:54 +0000919 return createGlobalVariableHelper(VMContext, Context, Name, LinkageName, F,
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000920 LineNumber, Ty, isLocalToUnit, Val, Decl,
921 false, [&](ArrayRef<Metadata *> Elts) {
Duncan P. N. Exon Smith7d823132015-01-19 21:30:18 +0000922 return MDNode::getTemporary(VMContext, Elts).release();
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000923 });
Devang Patel746660f2010-12-07 23:25:47 +0000924}
925
Devang Patel9b412732011-02-22 18:56:12 +0000926DIVariable DIBuilder::createLocalVariable(unsigned Tag, DIDescriptor Scope,
Devang Patel63f83cd2010-12-07 23:58:00 +0000927 StringRef Name, DIFile File,
Adrian Prantl1a1647c2014-03-18 02:34:58 +0000928 unsigned LineNo, DITypeRef Ty,
Devang Patel40eee1e2011-03-01 22:58:13 +0000929 bool AlwaysPreserve, unsigned Flags,
930 unsigned ArgNo) {
David Blaikie085abe32013-03-11 23:21:19 +0000931 DIDescriptor Context(getNonCompileUnitScope(Scope));
Manman Ren74c188f2013-07-01 21:02:01 +0000932 assert((!Context || Context.isScope()) &&
David Blaikie085abe32013-03-11 23:21:19 +0000933 "createLocalVariable should be called with a valid Context");
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000934 Metadata *Elts[] = {HeaderBuilder::get(Tag)
935 .concat(Name)
936 .concat(LineNo | (ArgNo << 24))
937 .concat(Flags)
938 .get(VMContext),
939 getNonCompileUnitScope(Scope), File, Ty};
Devang Patel0c773242011-04-18 23:51:03 +0000940 MDNode *Node = MDNode::get(VMContext, Elts);
Devang Patel63f83cd2010-12-07 23:58:00 +0000941 if (AlwaysPreserve) {
942 // The optimizer may remove local variable. If there is an interest
943 // to preserve variable info in such situation then stash it in a
944 // named mdnode.
945 DISubprogram Fn(getDISubprogram(Scope));
Duncan P. N. Exon Smith3bfffde2014-10-15 16:11:41 +0000946 assert(Fn && "Missing subprogram for local variable");
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000947 PreservedVariables[Fn].emplace_back(Node);
Devang Patel63f83cd2010-12-07 23:58:00 +0000948 }
Manman Rend0e67aa2013-07-02 18:37:35 +0000949 DIVariable RetVar(Node);
950 assert(RetVar.isVariable() &&
Manman Ren74c188f2013-07-01 21:02:01 +0000951 "createLocalVariable should return a valid DIVariable");
Manman Rend0e67aa2013-07-02 18:37:35 +0000952 return RetVar;
Devang Patel63f83cd2010-12-07 23:58:00 +0000953}
954
Duncan P. N. Exon Smithbd75ad42015-02-09 22:13:27 +0000955DIExpression DIBuilder::createExpression(ArrayRef<uint64_t> Addr) {
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000956 auto Header = HeaderBuilder::get(DW_TAG_expression);
Duncan P. N. Exon Smithbd75ad42015-02-09 22:13:27 +0000957 for (uint64_t I : Addr)
Duncan P. N. Exon Smith176b6912014-10-03 20:01:09 +0000958 Header.concat(I);
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000959 Metadata *Elts[] = {Header.get(VMContext)};
Adrian Prantl87b7eb92014-10-01 18:55:02 +0000960 return DIExpression(MDNode::get(VMContext, Elts));
Devang Patel746660f2010-12-07 23:25:47 +0000961}
962
Duncan P. N. Exon Smithbd75ad42015-02-09 22:13:27 +0000963DIExpression DIBuilder::createExpression(ArrayRef<int64_t> Signed) {
964 // TODO: Remove the callers of this signed version and delete.
965 SmallVector<uint64_t, 8> Addr(Signed.begin(), Signed.end());
966 return createExpression(Addr);
967}
968
Adrian Prantl27bd01f2015-02-09 23:57:15 +0000969DIExpression DIBuilder::createBitPieceExpression(unsigned OffsetInBits,
970 unsigned SizeInBits) {
971 int64_t Addr[] = {dwarf::DW_OP_bit_piece, OffsetInBits, SizeInBits};
Duncan P. N. Exon Smith9affbba2014-10-01 21:32:12 +0000972 return createExpression(Addr);
973}
974
Eric Christopher98f9c232013-10-15 23:31:31 +0000975DISubprogram DIBuilder::createFunction(DIScopeRef Context, StringRef Name,
976 StringRef LinkageName, DIFile File,
977 unsigned LineNo, DICompositeType Ty,
Manman Renc50fa112013-10-10 18:40:01 +0000978 bool isLocalToUnit, bool isDefinition,
Eric Christopher98f9c232013-10-15 23:31:31 +0000979 unsigned ScopeLine, unsigned Flags,
980 bool isOptimized, Function *Fn,
981 MDNode *TParams, MDNode *Decl) {
Manman Renc50fa112013-10-10 18:40:01 +0000982 // dragonegg does not generate identifier for types, so using an empty map
983 // to resolve the context should be fine.
984 DITypeIdentifierMap EmptyMap;
985 return createFunction(Context.resolve(EmptyMap), Name, LinkageName, File,
986 LineNo, Ty, isLocalToUnit, isDefinition, ScopeLine,
987 Flags, isOptimized, Fn, TParams, Decl);
988}
989
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000990static DISubprogram createFunctionHelper(
991 LLVMContext &VMContext, DIDescriptor Context, StringRef Name,
992 StringRef LinkageName, DIFile File, unsigned LineNo, DICompositeType Ty,
993 bool isLocalToUnit, bool isDefinition, unsigned ScopeLine, unsigned Flags,
994 bool isOptimized, Function *Fn, MDNode *TParams, MDNode *Decl, MDNode *Vars,
995 std::function<MDNode *(ArrayRef<Metadata *>)> CreateFunc) {
David Blaikie5174c842013-05-22 23:22:18 +0000996 assert(Ty.getTag() == dwarf::DW_TAG_subroutine_type &&
997 "function types should be subroutines");
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000998 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_subprogram)
999 .concat(Name)
1000 .concat(Name)
1001 .concat(LinkageName)
1002 .concat(LineNo)
1003 .concat(isLocalToUnit)
1004 .concat(isDefinition)
1005 .concat(0)
1006 .concat(0)
1007 .concat(Flags)
1008 .concat(isOptimized)
1009 .concat(ScopeLine)
1010 .get(VMContext),
1011 File.getFileNode(),
1012 DIScope(getNonCompileUnitScope(Context)).getRef(), Ty,
1013 nullptr, getConstantOrNull(Fn), TParams, Decl, Vars};
Devang Patelb68c6232010-12-08 20:42:44 +00001014
Frederic Riss5e6bc9e2014-09-17 09:28:34 +00001015 DISubprogram S(CreateFunc(Elts));
Eric Christopher961959f2014-02-28 21:27:59 +00001016 assert(S.isSubprogram() &&
1017 "createFunction should return a valid DISubprogram");
David Blaikiecc8d0902013-03-21 20:28:52 +00001018 return S;
Devang Patelb68c6232010-12-08 20:42:44 +00001019}
1020
Frederic Riss5e6bc9e2014-09-17 09:28:34 +00001021
Frederic Riss5e6bc9e2014-09-17 09:28:34 +00001022DISubprogram DIBuilder::createFunction(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,
Duncan P. N. Exon Smith7d823132015-01-19 21:30:18 +00001032 MDNode::getTemporary(VMContext, None).release(),
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +00001033 [&](ArrayRef<Metadata *> Elts) -> MDNode *{
1034 MDNode *Node = MDNode::get(VMContext, Elts);
1035 // Create a named metadata so that we
1036 // do not lose this mdnode.
1037 if (isDefinition)
1038 AllSubprograms.push_back(Node);
Adrian Prantlea7f1c22015-02-17 19:17:39 +00001039 trackIfUnresolved(Node);
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +00001040 return Node;
1041 });
Frederic Riss5e6bc9e2014-09-17 09:28:34 +00001042}
1043
Frederic Riss5e6bc9e2014-09-17 09:28:34 +00001044DISubprogram
1045DIBuilder::createTempFunctionFwdDecl(DIDescriptor Context, StringRef Name,
1046 StringRef LinkageName, DIFile File,
1047 unsigned LineNo, DICompositeType Ty,
1048 bool isLocalToUnit, bool isDefinition,
1049 unsigned ScopeLine, unsigned Flags,
1050 bool isOptimized, Function *Fn,
1051 MDNode *TParams, MDNode *Decl) {
1052 return createFunctionHelper(VMContext, Context, Name, LinkageName, File,
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +00001053 LineNo, Ty, isLocalToUnit, isDefinition,
1054 ScopeLine, Flags, isOptimized, Fn, TParams, Decl,
1055 nullptr, [&](ArrayRef<Metadata *> Elts) {
Duncan P. N. Exon Smith7d823132015-01-19 21:30:18 +00001056 return MDNode::getTemporary(VMContext, Elts).release();
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +00001057 });
Frederic Riss5e6bc9e2014-09-17 09:28:34 +00001058}
1059
Eric Christopher98f9c232013-10-15 23:31:31 +00001060DISubprogram DIBuilder::createMethod(DIDescriptor Context, StringRef Name,
1061 StringRef LinkageName, DIFile F,
David Blaikie5174c842013-05-22 23:22:18 +00001062 unsigned LineNo, DICompositeType Ty,
Eric Christopher98f9c232013-10-15 23:31:31 +00001063 bool isLocalToUnit, bool isDefinition,
Devang Patelb68c6232010-12-08 20:42:44 +00001064 unsigned VK, unsigned VIndex,
Eric Christopher98f9c232013-10-15 23:31:31 +00001065 DIType VTableHolder, unsigned Flags,
1066 bool isOptimized, Function *Fn,
Devang Patel9f738842011-04-05 22:52:06 +00001067 MDNode *TParam) {
David Blaikie5174c842013-05-22 23:22:18 +00001068 assert(Ty.getTag() == dwarf::DW_TAG_subroutine_type &&
1069 "function types should be subroutines");
Eric Christopher5cb56322013-10-15 23:31:36 +00001070 assert(getNonCompileUnitScope(Context) &&
1071 "Methods should have both a Context and a context that isn't "
1072 "the compile unit.");
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +00001073 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_subprogram)
1074 .concat(Name)
1075 .concat(Name)
1076 .concat(LinkageName)
1077 .concat(LineNo)
1078 .concat(isLocalToUnit)
1079 .concat(isDefinition)
1080 .concat(VK)
1081 .concat(VIndex)
1082 .concat(Flags)
1083 .concat(isOptimized)
1084 .concat(LineNo)
1085 // FIXME: Do we want to use different scope/lines?
1086 .get(VMContext),
1087 F.getFileNode(), DIScope(Context).getRef(), Ty,
1088 VTableHolder.getRef(), getConstantOrNull(Fn), TParam,
1089 nullptr, nullptr};
Devang Patel0c773242011-04-18 23:51:03 +00001090 MDNode *Node = MDNode::get(VMContext, Elts);
David Blaikie595eb442013-02-18 07:10:22 +00001091 if (isDefinition)
1092 AllSubprograms.push_back(Node);
David Blaikiecc8d0902013-03-21 20:28:52 +00001093 DISubprogram S(Node);
Manman Ren74c188f2013-07-01 21:02:01 +00001094 assert(S.isSubprogram() && "createMethod should return a valid DISubprogram");
Adrian Prantlea7f1c22015-02-17 19:17:39 +00001095 trackIfUnresolved(S);
David Blaikiecc8d0902013-03-21 20:28:52 +00001096 return S;
Devang Patelb68c6232010-12-08 20:42:44 +00001097}
1098
Devang Patel9b412732011-02-22 18:56:12 +00001099DINameSpace DIBuilder::createNameSpace(DIDescriptor Scope, StringRef Name,
Devang Patel746660f2010-12-07 23:25:47 +00001100 DIFile File, unsigned LineNo) {
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +00001101 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_namespace)
1102 .concat(Name)
1103 .concat(LineNo)
1104 .get(VMContext),
1105 File.getFileNode(), getNonCompileUnitScope(Scope)};
David Blaikie085abe32013-03-11 23:21:19 +00001106 DINameSpace R(MDNode::get(VMContext, Elts));
1107 assert(R.Verify() &&
1108 "createNameSpace should return a verifiable DINameSpace");
1109 return R;
Devang Patel746660f2010-12-07 23:25:47 +00001110}
1111
Eric Christopher6647b832011-10-11 22:59:11 +00001112DILexicalBlockFile DIBuilder::createLexicalBlockFile(DIDescriptor Scope,
David Blaikie2f3f76f2014-08-21 22:45:21 +00001113 DIFile File,
1114 unsigned Discriminator) {
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +00001115 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_lexical_block)
1116 .concat(Discriminator)
1117 .get(VMContext),
1118 File.getFileNode(), Scope};
David Blaikie085abe32013-03-11 23:21:19 +00001119 DILexicalBlockFile R(MDNode::get(VMContext, Elts));
1120 assert(
1121 R.Verify() &&
1122 "createLexicalBlockFile should return a verifiable DILexicalBlockFile");
1123 return R;
Eric Christopher6647b832011-10-11 22:59:11 +00001124}
1125
Devang Patel9b412732011-02-22 18:56:12 +00001126DILexicalBlock DIBuilder::createLexicalBlock(DIDescriptor Scope, DIFile File,
David Blaikie2f3f76f2014-08-21 22:45:21 +00001127 unsigned Line, unsigned Col) {
David Blaikie6c217162014-05-15 20:09:55 +00001128 // FIXME: This isn't thread safe nor the right way to defeat MDNode uniquing.
1129 // I believe the right way is to have a self-referential element in the node.
1130 // Also: why do we bother with line/column - they're not used and the
1131 // documentation (SourceLevelDebugging.rst) claims the line/col are necessary
1132 // for uniquing, yet then we have this other solution (because line/col were
1133 // inadequate) anyway. Remove all 3 and replace them with a self-reference.
1134
Adrian Prantl21e8d4a2013-06-24 21:19:43 +00001135 // Defeat MDNode uniquing for lexical blocks by using unique id.
Devang Patel89ea4f22010-12-08 01:50:15 +00001136 static unsigned int unique_id = 0;
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +00001137 Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_lexical_block)
1138 .concat(Line)
1139 .concat(Col)
1140 .concat(unique_id++)
1141 .get(VMContext),
1142 File.getFileNode(), getNonCompileUnitScope(Scope)};
David Blaikie085abe32013-03-11 23:21:19 +00001143 DILexicalBlock R(MDNode::get(VMContext, Elts));
1144 assert(R.Verify() &&
1145 "createLexicalBlock should return a verifiable DILexicalBlock");
1146 return R;
Devang Patel89ea4f22010-12-08 01:50:15 +00001147}
1148
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +00001149static Value *getDbgIntrinsicValueImpl(LLVMContext &VMContext, Value *V) {
1150 assert(V && "no value passed to dbg intrinsic");
1151 return MetadataAsValue::get(VMContext, ValueAsMetadata::get(V));
1152}
1153
Devang Patel9b412732011-02-22 18:56:12 +00001154Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo,
Adrian Prantl87b7eb92014-10-01 18:55:02 +00001155 DIExpression Expr,
Devang Patel746660f2010-12-07 23:25:47 +00001156 Instruction *InsertBefore) {
Manman Ren9822a112013-06-29 05:01:19 +00001157 assert(VarInfo.isVariable() &&
1158 "empty or invalid DIVariable passed to dbg.declare");
Devang Patel746660f2010-12-07 23:25:47 +00001159 if (!DeclareFn)
1160 DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
1161
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +00001162 trackIfUnresolved(VarInfo);
1163 trackIfUnresolved(Expr);
1164 Value *Args[] = {getDbgIntrinsicValueImpl(VMContext, Storage),
1165 MetadataAsValue::get(VMContext, VarInfo),
1166 MetadataAsValue::get(VMContext, Expr)};
Jay Foad5bd375a2011-07-15 08:37:34 +00001167 return CallInst::Create(DeclareFn, Args, "", InsertBefore);
Devang Patel746660f2010-12-07 23:25:47 +00001168}
1169
Devang Patel9b412732011-02-22 18:56:12 +00001170Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo,
Adrian Prantl87b7eb92014-10-01 18:55:02 +00001171 DIExpression Expr,
Devang Patel746660f2010-12-07 23:25:47 +00001172 BasicBlock *InsertAtEnd) {
Manman Ren9822a112013-06-29 05:01:19 +00001173 assert(VarInfo.isVariable() &&
1174 "empty or invalid DIVariable passed to dbg.declare");
Devang Patel746660f2010-12-07 23:25:47 +00001175 if (!DeclareFn)
1176 DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
1177
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +00001178 trackIfUnresolved(VarInfo);
1179 trackIfUnresolved(Expr);
1180 Value *Args[] = {getDbgIntrinsicValueImpl(VMContext, Storage),
1181 MetadataAsValue::get(VMContext, VarInfo),
1182 MetadataAsValue::get(VMContext, Expr)};
Devang Patel746660f2010-12-07 23:25:47 +00001183
1184 // If this block already has a terminator then insert this intrinsic
1185 // before the terminator.
1186 if (TerminatorInst *T = InsertAtEnd->getTerminator())
Jay Foad5bd375a2011-07-15 08:37:34 +00001187 return CallInst::Create(DeclareFn, Args, "", T);
Devang Patel746660f2010-12-07 23:25:47 +00001188 else
Jay Foad5bd375a2011-07-15 08:37:34 +00001189 return CallInst::Create(DeclareFn, Args, "", InsertAtEnd);
Devang Patel746660f2010-12-07 23:25:47 +00001190}
1191
Devang Patel9b412732011-02-22 18:56:12 +00001192Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,
Devang Patel746660f2010-12-07 23:25:47 +00001193 DIVariable VarInfo,
Adrian Prantl87b7eb92014-10-01 18:55:02 +00001194 DIExpression Expr,
Devang Patel746660f2010-12-07 23:25:47 +00001195 Instruction *InsertBefore) {
1196 assert(V && "no value passed to dbg.value");
Manman Ren9822a112013-06-29 05:01:19 +00001197 assert(VarInfo.isVariable() &&
1198 "empty or invalid DIVariable passed to dbg.value");
Devang Patel746660f2010-12-07 23:25:47 +00001199 if (!ValueFn)
1200 ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value);
1201
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +00001202 trackIfUnresolved(VarInfo);
1203 trackIfUnresolved(Expr);
1204 Value *Args[] = {getDbgIntrinsicValueImpl(VMContext, V),
1205 ConstantInt::get(Type::getInt64Ty(VMContext), Offset),
1206 MetadataAsValue::get(VMContext, VarInfo),
1207 MetadataAsValue::get(VMContext, Expr)};
Jay Foad5bd375a2011-07-15 08:37:34 +00001208 return CallInst::Create(ValueFn, Args, "", InsertBefore);
Devang Patel746660f2010-12-07 23:25:47 +00001209}
1210
Devang Patel9b412732011-02-22 18:56:12 +00001211Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,
Devang Patel746660f2010-12-07 23:25:47 +00001212 DIVariable VarInfo,
Adrian Prantl87b7eb92014-10-01 18:55:02 +00001213 DIExpression Expr,
Devang Patel746660f2010-12-07 23:25:47 +00001214 BasicBlock *InsertAtEnd) {
1215 assert(V && "no value passed to dbg.value");
Manman Ren9822a112013-06-29 05:01:19 +00001216 assert(VarInfo.isVariable() &&
1217 "empty or invalid DIVariable passed to dbg.value");
Devang Patel746660f2010-12-07 23:25:47 +00001218 if (!ValueFn)
1219 ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value);
1220
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +00001221 trackIfUnresolved(VarInfo);
1222 trackIfUnresolved(Expr);
1223 Value *Args[] = {getDbgIntrinsicValueImpl(VMContext, V),
1224 ConstantInt::get(Type::getInt64Ty(VMContext), Offset),
1225 MetadataAsValue::get(VMContext, VarInfo),
1226 MetadataAsValue::get(VMContext, Expr)};
Jay Foad5bd375a2011-07-15 08:37:34 +00001227 return CallInst::Create(ValueFn, Args, "", InsertAtEnd);
Devang Patel746660f2010-12-07 23:25:47 +00001228}
Duncan P. N. Exon Smith97f07c22014-12-18 00:46:16 +00001229
1230void DIBuilder::replaceVTableHolder(DICompositeType &T, DICompositeType VTableHolder) {
1231 T.setContainingType(VTableHolder);
1232
1233 // If this didn't create a self-reference, just return.
1234 if (T != VTableHolder)
1235 return;
1236
Adrian Prantl18a25b02015-02-11 17:45:10 +00001237 // Look for unresolved operands. T will drop RAUW support, orphaning any
1238 // cycles underneath it.
1239 if (T->isResolved())
1240 for (const MDOperand &O : T->operands())
1241 if (auto *N = dyn_cast_or_null<MDNode>(O))
1242 trackIfUnresolved(N);
Duncan P. N. Exon Smith97f07c22014-12-18 00:46:16 +00001243}
1244
1245void DIBuilder::replaceArrays(DICompositeType &T, DIArray Elements,
1246 DIArray TParams) {
1247 T.setArrays(Elements, TParams);
1248
1249 // If T isn't resolved, there's no problem.
1250 if (!T->isResolved())
1251 return;
1252
1253 // If "T" is resolved, it may be due to a self-reference cycle. Track the
1254 // arrays explicitly if they're unresolved, or else the cycles will be
1255 // orphaned.
1256 if (Elements)
1257 trackIfUnresolved(Elements);
1258 if (TParams)
1259 trackIfUnresolved(TParams);
1260}