blob: a6ff953809147b5cb3bb5b7ba5499f9edfb09fb2 [file] [log] [blame]
Devang Patel161b2f42011-04-12 23:21:44 +00001//===-- llvm/CodeGen/DwarfCompileUnit.cpp - Dwarf Compile Unit ------------===//
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//
Eric Christopher443c9ed2012-08-14 05:13:29 +000010// This file contains support for constructing a dwarf compile unit.
Devang Patel161b2f42011-04-12 23:21:44 +000011//
12//===----------------------------------------------------------------------===//
13
14#define DEBUG_TYPE "dwarfdebug"
15
16#include "DwarfCompileUnit.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000017#include "DwarfAccelTable.h"
Devang Patel161b2f42011-04-12 23:21:44 +000018#include "DwarfDebug.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000019#include "llvm/ADT/APFloat.h"
Bill Wendling16eeb6f2012-06-29 08:32:07 +000020#include "llvm/DIBuilder.h"
Chandler Carruth0b8c9a82013-01-02 11:36:10 +000021#include "llvm/IR/Constants.h"
22#include "llvm/IR/DataLayout.h"
23#include "llvm/IR/GlobalVariable.h"
24#include "llvm/IR/Instructions.h"
David Blaikie1d361132013-10-30 20:42:41 +000025#include "llvm/MC/MCSection.h"
26#include "llvm/MC/MCStreamer.h"
Devang Patel6f9d8ff2011-08-15 17:57:41 +000027#include "llvm/Target/Mangler.h"
Devang Patel161b2f42011-04-12 23:21:44 +000028#include "llvm/Target/TargetFrameLowering.h"
29#include "llvm/Target/TargetMachine.h"
David Blaikie59eaa382013-06-28 20:05:11 +000030#include "llvm/Target/TargetLoweringObjectFile.h"
Devang Patel161b2f42011-04-12 23:21:44 +000031#include "llvm/Target/TargetRegisterInfo.h"
Devang Patel161b2f42011-04-12 23:21:44 +000032
33using namespace llvm;
34
35/// CompileUnit - Compile unit constructor.
David Blaikie942431f2013-11-15 23:52:02 +000036CompileUnit::CompileUnit(unsigned UID, DIE *D, DICompileUnit Node,
37 AsmPrinter *A, DwarfDebug *DW, DwarfUnits *DWU)
38 : UniqueID(UID), Node(Node), CUDie(D), Asm(A), DD(DW), DU(DWU),
39 IndexTyDie(0), DebugInfoOffset(0) {
Devang Patel161b2f42011-04-12 23:21:44 +000040 DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
David Blaikie942431f2013-11-15 23:52:02 +000041 insertDIE(Node, D);
Devang Patel161b2f42011-04-12 23:21:44 +000042}
43
44/// ~CompileUnit - Destructor for compile unit.
45CompileUnit::~CompileUnit() {
46 for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
47 DIEBlocks[j]->~DIEBlock();
48}
49
50/// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
51/// information entry.
52DIEEntry *CompileUnit::createDIEEntry(DIE *Entry) {
53 DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
54 return Value;
55}
56
Bill Wendling6afe4782012-12-06 07:55:19 +000057/// getDefaultLowerBound - Return the default lower bound for an array. If the
Bill Wendling222c2fd2012-12-06 07:38:10 +000058/// DWARF version doesn't handle the language, return -1.
Bill Wendling6afe4782012-12-06 07:55:19 +000059int64_t CompileUnit::getDefaultLowerBound() const {
David Blaikieaedaa722013-11-15 23:50:53 +000060 switch (getLanguage()) {
Bill Wendling222c2fd2012-12-06 07:38:10 +000061 default:
62 break;
63
64 case dwarf::DW_LANG_C89:
65 case dwarf::DW_LANG_C99:
66 case dwarf::DW_LANG_C:
67 case dwarf::DW_LANG_C_plus_plus:
68 case dwarf::DW_LANG_ObjC:
69 case dwarf::DW_LANG_ObjC_plus_plus:
70 return 0;
71
72 case dwarf::DW_LANG_Fortran77:
73 case dwarf::DW_LANG_Fortran90:
74 case dwarf::DW_LANG_Fortran95:
75 return 1;
76
77 // The languages below have valid values only if the DWARF version >= 4.
78 case dwarf::DW_LANG_Java:
79 case dwarf::DW_LANG_Python:
80 case dwarf::DW_LANG_UPC:
81 case dwarf::DW_LANG_D:
82 if (dwarf::DWARF_VERSION >= 4)
83 return 0;
84 break;
85
86 case dwarf::DW_LANG_Ada83:
87 case dwarf::DW_LANG_Ada95:
88 case dwarf::DW_LANG_Cobol74:
89 case dwarf::DW_LANG_Cobol85:
90 case dwarf::DW_LANG_Modula2:
91 case dwarf::DW_LANG_Pascal83:
92 case dwarf::DW_LANG_PLI:
93 if (dwarf::DWARF_VERSION >= 4)
94 return 1;
95 break;
96 }
97
98 return -1;
99}
100
Manman Renb8b70e12013-10-31 17:54:35 +0000101/// Check whether the DIE for this MDNode can be shared across CUs.
David Blaikie86a33482013-11-15 22:59:36 +0000102static bool isShareableAcrossCUs(DIDescriptor D) {
Manman Renb8b70e12013-10-31 17:54:35 +0000103 // When the MDNode can be part of the type system, the DIE can be
104 // shared across CUs.
David Blaikie86a33482013-11-15 22:59:36 +0000105 return D.isType() ||
106 (D.isSubprogram() && !DISubprogram(D).isDefinition());
Manman Renb8b70e12013-10-31 17:54:35 +0000107}
108
109/// getDIE - Returns the debug information entry map slot for the
110/// specified debug variable. We delegate the request to DwarfDebug
111/// when the DIE for this MDNode can be shared across CUs. The mappings
112/// will be kept in DwarfDebug for shareable DIEs.
David Blaikiecbc85a22013-11-15 23:09:13 +0000113DIE *CompileUnit::getDIE(DIDescriptor D) const {
114 if (isShareableAcrossCUs(D))
115 return DD->getDIE(D);
116 return MDNodeToDieMap.lookup(D);
Manman Renb8b70e12013-10-31 17:54:35 +0000117}
118
119/// insertDIE - Insert DIE into the map. We delegate the request to DwarfDebug
120/// when the DIE for this MDNode can be shared across CUs. The mappings
121/// will be kept in DwarfDebug for shareable DIEs.
David Blaikiecbc85a22013-11-15 23:09:13 +0000122void CompileUnit::insertDIE(DIDescriptor Desc, DIE *D) {
123 if (isShareableAcrossCUs(Desc)) {
124 DD->insertDIE(Desc, D);
Manman Renb8b70e12013-10-31 17:54:35 +0000125 return;
126 }
David Blaikiecbc85a22013-11-15 23:09:13 +0000127 MDNodeToDieMap.insert(std::make_pair(Desc, D));
Manman Renb8b70e12013-10-31 17:54:35 +0000128}
129
Eric Christopher873cf0a2012-08-24 01:14:27 +0000130/// addFlag - Add a flag that is true.
David Blaikie770530b2013-10-21 17:28:37 +0000131void CompileUnit::addFlag(DIE *Die, dwarf::Attribute Attribute) {
Michael Gottesmandc42d032013-09-04 04:39:38 +0000132 if (DD->getDwarfVersion() >= 4)
Eric Christopher9c0c9482013-10-04 22:40:05 +0000133 Die->addValue(Attribute, dwarf::DW_FORM_flag_present, DIEIntegerOne);
Eric Christopher873cf0a2012-08-24 01:14:27 +0000134 else
Eric Christopher9c0c9482013-10-04 22:40:05 +0000135 Die->addValue(Attribute, dwarf::DW_FORM_flag, DIEIntegerOne);
Eric Christopher873cf0a2012-08-24 01:14:27 +0000136}
137
Devang Patel161b2f42011-04-12 23:21:44 +0000138/// addUInt - Add an unsigned integer attribute data and value.
139///
David Blaikie770530b2013-10-21 17:28:37 +0000140void CompileUnit::addUInt(DIE *Die, dwarf::Attribute Attribute,
141 Optional<dwarf::Form> Form, uint64_t Integer) {
Eric Christopher6efc0432013-10-19 01:04:47 +0000142 if (!Form)
143 Form = DIEInteger::BestForm(false, Integer);
144 DIEValue *Value = Integer == 1 ? DIEIntegerOne : new (DIEValueAllocator)
145 DIEInteger(Integer);
David Blaikie770530b2013-10-21 17:28:37 +0000146 Die->addValue(Attribute, *Form, Value);
147}
148
149void CompileUnit::addUInt(DIEBlock *Block, dwarf::Form Form, uint64_t Integer) {
150 addUInt(Block, (dwarf::Attribute)0, Form, Integer);
Devang Patel161b2f42011-04-12 23:21:44 +0000151}
152
153/// addSInt - Add an signed integer attribute data and value.
154///
David Blaikie770530b2013-10-21 17:28:37 +0000155void CompileUnit::addSInt(DIE *Die, dwarf::Attribute Attribute,
156 Optional<dwarf::Form> Form, int64_t Integer) {
Eric Christopher6efc0432013-10-19 01:04:47 +0000157 if (!Form)
158 Form = DIEInteger::BestForm(true, Integer);
Devang Patel161b2f42011-04-12 23:21:44 +0000159 DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
David Blaikie770530b2013-10-21 17:28:37 +0000160 Die->addValue(Attribute, *Form, Value);
161}
162
163void CompileUnit::addSInt(DIEBlock *Die, Optional<dwarf::Form> Form,
164 int64_t Integer) {
165 addSInt(Die, (dwarf::Attribute)0, Form, Integer);
Devang Patel161b2f42011-04-12 23:21:44 +0000166}
167
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000168/// addString - Add a string attribute data and value. We always emit a
169/// reference to the string pool instead of immediate strings so that DIEs have
Eric Christopher3cc42202013-01-07 19:32:45 +0000170/// more predictable sizes. In the case of split dwarf we emit an index
171/// into another table which gets us the static offset into the string
172/// table.
Eric Christopher62af0c22013-11-11 18:52:33 +0000173void CompileUnit::addString(DIE *Die, dwarf::Attribute Attribute,
174 StringRef String) {
Eric Christopher3dee5752013-07-26 17:02:41 +0000175 DIEValue *Value;
David Blaikie770530b2013-10-21 17:28:37 +0000176 dwarf::Form Form;
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000177 if (!DD->useSplitDwarf()) {
178 MCSymbol *Symb = DU->getStringPoolEntry(String);
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000179 if (Asm->needsRelocationsForDwarfStringPool())
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000180 Value = new (DIEValueAllocator) DIELabel(Symb);
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000181 else {
182 MCSymbol *StringPool = DU->getStringPoolSym();
183 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
184 }
Eric Christopher3dee5752013-07-26 17:02:41 +0000185 Form = dwarf::DW_FORM_strp;
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000186 } else {
187 unsigned idx = DU->getStringPoolIndex(String);
Eric Christopher3dee5752013-07-26 17:02:41 +0000188 Value = new (DIEValueAllocator) DIEInteger(idx);
189 Form = dwarf::DW_FORM_GNU_str_index;
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000190 }
Eric Christopher3dee5752013-07-26 17:02:41 +0000191 DIEValue *Str = new (DIEValueAllocator) DIEString(Value, String);
192 Die->addValue(Attribute, Form, Str);
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000193}
194
195/// addLocalString - Add a string attribute data and value. This is guaranteed
196/// to be in the local string pool instead of indirected.
David Blaikie770530b2013-10-21 17:28:37 +0000197void CompileUnit::addLocalString(DIE *Die, dwarf::Attribute Attribute,
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000198 StringRef String) {
Eric Christopher2e5d8702012-12-20 21:58:36 +0000199 MCSymbol *Symb = DU->getStringPoolEntry(String);
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000200 DIEValue *Value;
201 if (Asm->needsRelocationsForDwarfStringPool())
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000202 Value = new (DIEValueAllocator) DIELabel(Symb);
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000203 else {
Eric Christopher2e5d8702012-12-20 21:58:36 +0000204 MCSymbol *StringPool = DU->getStringPoolSym();
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000205 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
Nick Lewycky390c40d2011-10-27 06:44:11 +0000206 }
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000207 Die->addValue(Attribute, dwarf::DW_FORM_strp, Value);
Devang Patel161b2f42011-04-12 23:21:44 +0000208}
209
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000210/// addExpr - Add a Dwarf expression attribute data and value.
Devang Patel161b2f42011-04-12 23:21:44 +0000211///
David Blaikie770530b2013-10-21 17:28:37 +0000212void CompileUnit::addExpr(DIEBlock *Die, dwarf::Form Form, const MCExpr *Expr) {
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000213 DIEValue *Value = new (DIEValueAllocator) DIEExpr(Expr);
David Blaikie770530b2013-10-21 17:28:37 +0000214 Die->addValue((dwarf::Attribute)0, Form, Value);
Devang Patel161b2f42011-04-12 23:21:44 +0000215}
216
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000217/// addLabel - Add a Dwarf label attribute data and value.
218///
Eric Christopher62af0c22013-11-11 18:52:33 +0000219void CompileUnit::addLabel(DIE *Die, dwarf::Attribute Attribute,
220 dwarf::Form Form, const MCSymbol *Label) {
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000221 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
222 Die->addValue(Attribute, Form, Value);
David Blaikie95e72c92013-06-28 20:05:04 +0000223}
224
David Blaikie770530b2013-10-21 17:28:37 +0000225void CompileUnit::addLabel(DIEBlock *Die, dwarf::Form Form,
226 const MCSymbol *Label) {
227 addLabel(Die, (dwarf::Attribute)0, Form, Label);
228}
229
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000230/// addLabelAddress - Add a dwarf label attribute data and value using
231/// DW_FORM_addr or DW_FORM_GNU_addr_index.
232///
David Blaikie770530b2013-10-21 17:28:37 +0000233void CompileUnit::addLabelAddress(DIE *Die, dwarf::Attribute Attribute,
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000234 MCSymbol *Label) {
Alexey Samsonov9d08d692013-10-03 08:54:43 +0000235 if (Label)
236 DD->addArangeLabel(SymbolCU(this, Label));
Richard Mitton5cc319a2013-09-19 23:21:01 +0000237
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000238 if (!DD->useSplitDwarf()) {
239 if (Label != NULL) {
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000240 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000241 Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
242 } else {
243 DIEValue *Value = new (DIEValueAllocator) DIEInteger(0);
244 Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
245 }
246 } else {
247 unsigned idx = DU->getAddrPoolIndex(Label);
248 DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx);
249 Die->addValue(Attribute, dwarf::DW_FORM_GNU_addr_index, Value);
250 }
251}
252
Eric Christopher0969ddf2013-01-18 22:11:33 +0000253/// addOpAddress - Add a dwarf op address data and value using the
254/// form given and an op of either DW_FORM_addr or DW_FORM_GNU_addr_index.
255///
David Blaikie770530b2013-10-21 17:28:37 +0000256void CompileUnit::addOpAddress(DIEBlock *Die, const MCSymbol *Sym) {
Alexey Samsonov9d08d692013-10-03 08:54:43 +0000257 DD->addArangeLabel(SymbolCU(this, Sym));
Eric Christopher0969ddf2013-01-18 22:11:33 +0000258 if (!DD->useSplitDwarf()) {
David Blaikie770530b2013-10-21 17:28:37 +0000259 addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
260 addLabel(Die, dwarf::DW_FORM_udata, Sym);
Eric Christopher0969ddf2013-01-18 22:11:33 +0000261 } else {
David Blaikie770530b2013-10-21 17:28:37 +0000262 addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_addr_index);
263 addUInt(Die, dwarf::DW_FORM_GNU_addr_index, DU->getAddrPoolIndex(Sym));
Eric Christopher0969ddf2013-01-18 22:11:33 +0000264 }
265}
266
Devang Patel161b2f42011-04-12 23:21:44 +0000267/// addDelta - Add a label delta attribute data and value.
268///
Eric Christopher62af0c22013-11-11 18:52:33 +0000269void CompileUnit::addDelta(DIE *Die, dwarf::Attribute Attribute,
270 dwarf::Form Form, const MCSymbol *Hi,
271 const MCSymbol *Lo) {
Devang Patel161b2f42011-04-12 23:21:44 +0000272 DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
273 Die->addValue(Attribute, Form, Value);
274}
275
276/// addDIEEntry - Add a DIE attribute data and value.
277///
Eric Christopher61290022013-11-11 18:52:36 +0000278void CompileUnit::addDIEEntry(DIE *Die, dwarf::Attribute Attribute,
279 DIE *Entry) {
Manman Renb8b70e12013-10-31 17:54:35 +0000280 addDIEEntry(Die, Attribute, createDIEEntry(Entry));
281}
282
283void CompileUnit::addDIEEntry(DIE *Die, dwarf::Attribute Attribute,
284 DIEEntry *Entry) {
285 const DIE *DieCU = Die->getCompileUnitOrNull();
286 const DIE *EntryCU = Entry->getEntry()->getCompileUnitOrNull();
287 if (!DieCU)
288 // We assume that Die belongs to this CU, if it is not linked to any CU yet.
289 DieCU = getCUDie();
290 if (!EntryCU)
291 EntryCU = getCUDie();
292 Die->addValue(Attribute, EntryCU == DieCU ? dwarf::DW_FORM_ref4
293 : dwarf::DW_FORM_ref_addr,
294 Entry);
Devang Patel161b2f42011-04-12 23:21:44 +0000295}
296
Manman Ren1a5e7872013-10-29 00:53:03 +0000297/// Create a DIE with the given Tag, add the DIE to its parent, and
298/// call insertDIE if MD is not null.
David Blaikie1dc27232013-11-16 00:29:01 +0000299DIE *CompileUnit::createAndAddDIE(unsigned Tag, DIE &Parent, DIDescriptor N) {
Manman Ren1a5e7872013-10-29 00:53:03 +0000300 DIE *Die = new DIE(Tag);
301 Parent.addChild(Die);
David Blaikie1dc27232013-11-16 00:29:01 +0000302 if (N)
303 insertDIE(N, Die);
Manman Ren1a5e7872013-10-29 00:53:03 +0000304 return Die;
305}
306
Devang Patel161b2f42011-04-12 23:21:44 +0000307/// addBlock - Add block data.
308///
David Blaikie770530b2013-10-21 17:28:37 +0000309void CompileUnit::addBlock(DIE *Die, dwarf::Attribute Attribute,
Devang Patel161b2f42011-04-12 23:21:44 +0000310 DIEBlock *Block) {
311 Block->ComputeSize(Asm);
312 DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
313 Die->addValue(Attribute, Block->BestForm(), Block);
314}
315
316/// addSourceLine - Add location information to specified debug information
317/// entry.
318void CompileUnit::addSourceLine(DIE *Die, DIVariable V) {
319 // Verify variable.
Manman Rend03d2b22013-07-08 18:33:29 +0000320 if (!V.isVariable())
Devang Patel161b2f42011-04-12 23:21:44 +0000321 return;
Eric Christopher8b4310b2012-11-21 00:34:38 +0000322
Devang Patel161b2f42011-04-12 23:21:44 +0000323 unsigned Line = V.getLineNumber();
324 if (Line == 0)
325 return;
Eric Christopher6efc0432013-10-19 01:04:47 +0000326 unsigned FileID =
327 DD->getOrCreateSourceID(V.getContext().getFilename(),
328 V.getContext().getDirectory(), getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000329 assert(FileID && "Invalid file id");
David Blaikie770530b2013-10-21 17:28:37 +0000330 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
331 addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
Devang Patel161b2f42011-04-12 23:21:44 +0000332}
333
334/// addSourceLine - Add location information to specified debug information
335/// entry.
336void CompileUnit::addSourceLine(DIE *Die, DIGlobalVariable G) {
337 // Verify global variable.
Manman Rend03d2b22013-07-08 18:33:29 +0000338 if (!G.isGlobalVariable())
Devang Patel161b2f42011-04-12 23:21:44 +0000339 return;
340
341 unsigned Line = G.getLineNumber();
342 if (Line == 0)
343 return;
Eric Christopher6efc0432013-10-19 01:04:47 +0000344 unsigned FileID =
345 DD->getOrCreateSourceID(G.getFilename(), G.getDirectory(), getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000346 assert(FileID && "Invalid file id");
David Blaikie770530b2013-10-21 17:28:37 +0000347 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
348 addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
Devang Patel161b2f42011-04-12 23:21:44 +0000349}
350
351/// addSourceLine - Add location information to specified debug information
352/// entry.
353void CompileUnit::addSourceLine(DIE *Die, DISubprogram SP) {
354 // Verify subprogram.
Manman Rend03d2b22013-07-08 18:33:29 +0000355 if (!SP.isSubprogram())
Devang Patel161b2f42011-04-12 23:21:44 +0000356 return;
Eric Christopher2125d5a2012-03-15 23:55:40 +0000357
Devang Patel161b2f42011-04-12 23:21:44 +0000358 // If the line number is 0, don't add it.
Eric Christopher2125d5a2012-03-15 23:55:40 +0000359 unsigned Line = SP.getLineNumber();
360 if (Line == 0)
Devang Patel161b2f42011-04-12 23:21:44 +0000361 return;
362
Eric Christopher6efc0432013-10-19 01:04:47 +0000363 unsigned FileID = DD->getOrCreateSourceID(SP.getFilename(), SP.getDirectory(),
364 getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000365 assert(FileID && "Invalid file id");
David Blaikie770530b2013-10-21 17:28:37 +0000366 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
367 addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
Devang Patel161b2f42011-04-12 23:21:44 +0000368}
369
370/// addSourceLine - Add location information to specified debug information
371/// entry.
372void CompileUnit::addSourceLine(DIE *Die, DIType Ty) {
373 // Verify type.
Manman Rend03d2b22013-07-08 18:33:29 +0000374 if (!Ty.isType())
Devang Patel161b2f42011-04-12 23:21:44 +0000375 return;
376
377 unsigned Line = Ty.getLineNumber();
Eric Christopher2125d5a2012-03-15 23:55:40 +0000378 if (Line == 0)
Devang Patel161b2f42011-04-12 23:21:44 +0000379 return;
Eric Christopher6efc0432013-10-19 01:04:47 +0000380 unsigned FileID = DD->getOrCreateSourceID(Ty.getFilename(), Ty.getDirectory(),
381 getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000382 assert(FileID && "Invalid file id");
David Blaikie770530b2013-10-21 17:28:37 +0000383 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
384 addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
Devang Patel161b2f42011-04-12 23:21:44 +0000385}
386
387/// addSourceLine - Add location information to specified debug information
388/// entry.
Eric Christopherb8ca9882012-03-29 08:42:56 +0000389void CompileUnit::addSourceLine(DIE *Die, DIObjCProperty Ty) {
390 // Verify type.
Manman Rend03d2b22013-07-08 18:33:29 +0000391 if (!Ty.isObjCProperty())
Eric Christopherb8ca9882012-03-29 08:42:56 +0000392 return;
393
394 unsigned Line = Ty.getLineNumber();
395 if (Line == 0)
396 return;
397 DIFile File = Ty.getFile();
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000398 unsigned FileID = DD->getOrCreateSourceID(File.getFilename(),
Manman Ren3de61b42013-03-07 01:42:00 +0000399 File.getDirectory(), getUniqueID());
Eric Christopherb8ca9882012-03-29 08:42:56 +0000400 assert(FileID && "Invalid file id");
David Blaikie770530b2013-10-21 17:28:37 +0000401 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
402 addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
Eric Christopherb8ca9882012-03-29 08:42:56 +0000403}
404
405/// addSourceLine - Add location information to specified debug information
406/// entry.
Devang Patel161b2f42011-04-12 23:21:44 +0000407void CompileUnit::addSourceLine(DIE *Die, DINameSpace NS) {
408 // Verify namespace.
409 if (!NS.Verify())
410 return;
411
412 unsigned Line = NS.getLineNumber();
413 if (Line == 0)
414 return;
415 StringRef FN = NS.getFilename();
416
Eric Christopher6efc0432013-10-19 01:04:47 +0000417 unsigned FileID =
418 DD->getOrCreateSourceID(FN, NS.getDirectory(), getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000419 assert(FileID && "Invalid file id");
David Blaikie770530b2013-10-21 17:28:37 +0000420 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
421 addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
Devang Patel161b2f42011-04-12 23:21:44 +0000422}
423
Eric Christopher8b4310b2012-11-21 00:34:38 +0000424/// addVariableAddress - Add DW_AT_location attribute for a
Devang Patele1cdf842011-04-27 22:45:24 +0000425/// DbgVariable based on provided MachineLocation.
Eric Christopherf61dbc12013-06-24 21:07:27 +0000426void CompileUnit::addVariableAddress(const DbgVariable &DV, DIE *Die,
Devang Patele1cdf842011-04-27 22:45:24 +0000427 MachineLocation Location) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000428 if (DV.variableHasComplexAddress())
Devang Patel161b2f42011-04-12 23:21:44 +0000429 addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
Eric Christopherf61dbc12013-06-24 21:07:27 +0000430 else if (DV.isBlockByrefVariable())
Devang Patel161b2f42011-04-12 23:21:44 +0000431 addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location);
432 else
David Blaikie4532c282013-06-20 00:25:24 +0000433 addAddress(Die, dwarf::DW_AT_location, Location,
Eric Christopherf61dbc12013-06-24 21:07:27 +0000434 DV.getVariable().isIndirect());
Devang Patel161b2f42011-04-12 23:21:44 +0000435}
436
Devang Patel116da2f2011-04-26 19:06:18 +0000437/// addRegisterOp - Add register operand.
David Blaikie770530b2013-10-21 17:28:37 +0000438void CompileUnit::addRegisterOp(DIEBlock *TheDie, unsigned Reg) {
Devang Patel116da2f2011-04-26 19:06:18 +0000439 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
440 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
441 if (DWReg < 32)
David Blaikie770530b2013-10-21 17:28:37 +0000442 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + DWReg);
Devang Patel116da2f2011-04-26 19:06:18 +0000443 else {
David Blaikie770530b2013-10-21 17:28:37 +0000444 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
445 addUInt(TheDie, dwarf::DW_FORM_udata, DWReg);
Devang Patel116da2f2011-04-26 19:06:18 +0000446 }
447}
448
449/// addRegisterOffset - Add register offset.
David Blaikie770530b2013-10-21 17:28:37 +0000450void CompileUnit::addRegisterOffset(DIEBlock *TheDie, unsigned Reg,
451 int64_t Offset) {
Devang Patel116da2f2011-04-26 19:06:18 +0000452 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
453 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
454 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
455 if (Reg == TRI->getFrameRegister(*Asm->MF))
456 // If variable offset is based in frame register then use fbreg.
David Blaikie770530b2013-10-21 17:28:37 +0000457 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
Devang Patel116da2f2011-04-26 19:06:18 +0000458 else if (DWReg < 32)
David Blaikie770530b2013-10-21 17:28:37 +0000459 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DWReg);
Devang Patel116da2f2011-04-26 19:06:18 +0000460 else {
David Blaikie770530b2013-10-21 17:28:37 +0000461 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
462 addUInt(TheDie, dwarf::DW_FORM_udata, DWReg);
Devang Patel116da2f2011-04-26 19:06:18 +0000463 }
David Blaikie770530b2013-10-21 17:28:37 +0000464 addSInt(TheDie, dwarf::DW_FORM_sdata, Offset);
Devang Patel116da2f2011-04-26 19:06:18 +0000465}
466
467/// addAddress - Add an address attribute to a die based on the location
468/// provided.
David Blaikie770530b2013-10-21 17:28:37 +0000469void CompileUnit::addAddress(DIE *Die, dwarf::Attribute Attribute,
David Blaikie4532c282013-06-20 00:25:24 +0000470 const MachineLocation &Location, bool Indirect) {
Devang Patel116da2f2011-04-26 19:06:18 +0000471 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
472
David Blaikie4532c282013-06-20 00:25:24 +0000473 if (Location.isReg() && !Indirect)
Devang Patel116da2f2011-04-26 19:06:18 +0000474 addRegisterOp(Block, Location.getReg());
David Blaikie4532c282013-06-20 00:25:24 +0000475 else {
Devang Patel116da2f2011-04-26 19:06:18 +0000476 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
David Blaikie4532c282013-06-20 00:25:24 +0000477 if (Indirect && !Location.isReg()) {
David Blaikie770530b2013-10-21 17:28:37 +0000478 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
David Blaikie4532c282013-06-20 00:25:24 +0000479 }
480 }
Devang Patel116da2f2011-04-26 19:06:18 +0000481
482 // Now attach the location information to the DIE.
David Blaikie770530b2013-10-21 17:28:37 +0000483 addBlock(Die, Attribute, Block);
Devang Patel116da2f2011-04-26 19:06:18 +0000484}
485
Devang Patel161b2f42011-04-12 23:21:44 +0000486/// addComplexAddress - Start with the address based on the location provided,
487/// and generate the DWARF information necessary to find the actual variable
488/// given the extra address information encoded in the DIVariable, starting from
489/// the starting location. Add the DWARF information to the die.
490///
Eric Christopherf61dbc12013-06-24 21:07:27 +0000491void CompileUnit::addComplexAddress(const DbgVariable &DV, DIE *Die,
David Blaikie770530b2013-10-21 17:28:37 +0000492 dwarf::Attribute Attribute,
Devang Patel161b2f42011-04-12 23:21:44 +0000493 const MachineLocation &Location) {
Devang Patel161b2f42011-04-12 23:21:44 +0000494 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Eric Christopherf61dbc12013-06-24 21:07:27 +0000495 unsigned N = DV.getNumAddrElements();
Devang Patelc26f5442011-04-28 02:22:40 +0000496 unsigned i = 0;
497 if (Location.isReg()) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000498 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
Devang Patelc26f5442011-04-28 02:22:40 +0000499 // If first address element is OpPlus then emit
500 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
Eric Christopherf61dbc12013-06-24 21:07:27 +0000501 addRegisterOffset(Block, Location.getReg(), DV.getAddrElement(1));
Devang Patelc26f5442011-04-28 02:22:40 +0000502 i = 2;
503 } else
504 addRegisterOp(Block, Location.getReg());
Eric Christopher6efc0432013-10-19 01:04:47 +0000505 } else
Devang Patel116da2f2011-04-26 19:06:18 +0000506 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel161b2f42011-04-12 23:21:44 +0000507
Eric Christopher6efc0432013-10-19 01:04:47 +0000508 for (; i < N; ++i) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000509 uint64_t Element = DV.getAddrElement(i);
Devang Patel161b2f42011-04-12 23:21:44 +0000510 if (Element == DIBuilder::OpPlus) {
David Blaikie770530b2013-10-21 17:28:37 +0000511 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
512 addUInt(Block, dwarf::DW_FORM_udata, DV.getAddrElement(++i));
Devang Patel161b2f42011-04-12 23:21:44 +0000513 } else if (Element == DIBuilder::OpDeref) {
Eric Christopher50120762012-05-08 18:56:00 +0000514 if (!Location.isReg())
David Blaikie770530b2013-10-21 17:28:37 +0000515 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Eric Christopher6efc0432013-10-19 01:04:47 +0000516 } else
517 llvm_unreachable("unknown DIBuilder Opcode");
Devang Patel161b2f42011-04-12 23:21:44 +0000518 }
519
520 // Now attach the location information to the DIE.
David Blaikie770530b2013-10-21 17:28:37 +0000521 addBlock(Die, Attribute, Block);
Devang Patel161b2f42011-04-12 23:21:44 +0000522}
523
524/* Byref variables, in Blocks, are declared by the programmer as "SomeType
525 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
526 gives the variable VarName either the struct, or a pointer to the struct, as
527 its type. This is necessary for various behind-the-scenes things the
528 compiler needs to do with by-reference variables in Blocks.
529
530 However, as far as the original *programmer* is concerned, the variable
531 should still have type 'SomeType', as originally declared.
532
533 The function getBlockByrefType dives into the __Block_byref_x_VarName
534 struct to find the original type of the variable, which is then assigned to
535 the variable's Debug Information Entry as its real type. So far, so good.
536 However now the debugger will expect the variable VarName to have the type
537 SomeType. So we need the location attribute for the variable to be an
538 expression that explains to the debugger how to navigate through the
539 pointers and struct to find the actual variable of type SomeType.
540
541 The following function does just that. We start by getting
542 the "normal" location for the variable. This will be the location
543 of either the struct __Block_byref_x_VarName or the pointer to the
544 struct __Block_byref_x_VarName.
545
546 The struct will look something like:
547
548 struct __Block_byref_x_VarName {
549 ... <various fields>
550 struct __Block_byref_x_VarName *forwarding;
551 ... <various other fields>
552 SomeType VarName;
553 ... <maybe more fields>
554 };
555
556 If we are given the struct directly (as our starting point) we
557 need to tell the debugger to:
558
559 1). Add the offset of the forwarding field.
560
561 2). Follow that pointer to get the real __Block_byref_x_VarName
562 struct to use (the real one may have been copied onto the heap).
563
564 3). Add the offset for the field VarName, to find the actual variable.
565
566 If we started with a pointer to the struct, then we need to
567 dereference that pointer first, before the other steps.
568 Translating this into DWARF ops, we will need to append the following
569 to the current location description for the variable:
570
571 DW_OP_deref -- optional, if we start with a pointer
572 DW_OP_plus_uconst <forward_fld_offset>
573 DW_OP_deref
574 DW_OP_plus_uconst <varName_fld_offset>
575
576 That is what this function does. */
577
578/// addBlockByrefAddress - Start with the address based on the location
579/// provided, and generate the DWARF information necessary to find the
580/// actual Block variable (navigating the Block struct) based on the
581/// starting location. Add the DWARF information to the die. For
582/// more information, read large comment just above here.
583///
Eric Christopherf61dbc12013-06-24 21:07:27 +0000584void CompileUnit::addBlockByrefAddress(const DbgVariable &DV, DIE *Die,
David Blaikie770530b2013-10-21 17:28:37 +0000585 dwarf::Attribute Attribute,
Devang Patel161b2f42011-04-12 23:21:44 +0000586 const MachineLocation &Location) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000587 DIType Ty = DV.getType();
Devang Patel161b2f42011-04-12 23:21:44 +0000588 DIType TmpTy = Ty;
Eric Christopher31667622013-08-08 01:41:00 +0000589 uint16_t Tag = Ty.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +0000590 bool isPointer = false;
591
Eric Christopherf61dbc12013-06-24 21:07:27 +0000592 StringRef varName = DV.getName();
Devang Patel161b2f42011-04-12 23:21:44 +0000593
594 if (Tag == dwarf::DW_TAG_pointer_type) {
David Blaikie4adba522013-11-18 23:33:32 +0000595 DIDerivedType DTy(Ty);
Manman Ren017ceda2013-10-08 18:42:58 +0000596 TmpTy = resolve(DTy.getTypeDerivedFrom());
Devang Patel161b2f42011-04-12 23:21:44 +0000597 isPointer = true;
598 }
599
David Blaikie4adba522013-11-18 23:33:32 +0000600 DICompositeType blockStruct(TmpTy);
Devang Patel161b2f42011-04-12 23:21:44 +0000601
602 // Find the __forwarding field and the variable field in the __Block_byref
603 // struct.
604 DIArray Fields = blockStruct.getTypeArray();
David Blaikie4adba522013-11-18 23:33:32 +0000605 DIDerivedType varField;
606 DIDerivedType forwardingField;
Devang Patel161b2f42011-04-12 23:21:44 +0000607
608 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
David Blaikie4adba522013-11-18 23:33:32 +0000609 DIDerivedType DT(Fields.getElement(i));
Devang Patel161b2f42011-04-12 23:21:44 +0000610 StringRef fieldName = DT.getName();
611 if (fieldName == "__forwarding")
David Blaikie4adba522013-11-18 23:33:32 +0000612 forwardingField = DT;
Devang Patel161b2f42011-04-12 23:21:44 +0000613 else if (fieldName == varName)
David Blaikie4adba522013-11-18 23:33:32 +0000614 varField = DT;
Devang Patel161b2f42011-04-12 23:21:44 +0000615 }
616
617 // Get the offsets for the forwarding field and the variable field.
David Blaikie4adba522013-11-18 23:33:32 +0000618 unsigned forwardingFieldOffset = forwardingField.getOffsetInBits() >> 3;
619 unsigned varFieldOffset = varField.getOffsetInBits() >> 2;
Devang Patel161b2f42011-04-12 23:21:44 +0000620
621 // Decode the original location, and use that as the start of the byref
622 // variable's location.
Devang Patel161b2f42011-04-12 23:21:44 +0000623 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
624
Eric Christophercaba2632012-07-04 02:02:18 +0000625 if (Location.isReg())
626 addRegisterOp(Block, Location.getReg());
627 else
628 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel161b2f42011-04-12 23:21:44 +0000629
630 // If we started with a pointer to the __Block_byref... struct, then
631 // the first thing we need to do is dereference the pointer (DW_OP_deref).
632 if (isPointer)
David Blaikie770530b2013-10-21 17:28:37 +0000633 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Devang Patel161b2f42011-04-12 23:21:44 +0000634
635 // Next add the offset for the '__forwarding' field:
636 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
637 // adding the offset if it's 0.
638 if (forwardingFieldOffset > 0) {
David Blaikie770530b2013-10-21 17:28:37 +0000639 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
640 addUInt(Block, dwarf::DW_FORM_udata, forwardingFieldOffset);
Devang Patel161b2f42011-04-12 23:21:44 +0000641 }
642
643 // Now dereference the __forwarding field to get to the real __Block_byref
644 // struct: DW_OP_deref.
David Blaikie770530b2013-10-21 17:28:37 +0000645 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Devang Patel161b2f42011-04-12 23:21:44 +0000646
647 // Now that we've got the real __Block_byref... struct, add the offset
648 // for the variable's field to get to the location of the actual variable:
649 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
650 if (varFieldOffset > 0) {
David Blaikie770530b2013-10-21 17:28:37 +0000651 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
652 addUInt(Block, dwarf::DW_FORM_udata, varFieldOffset);
Devang Patel161b2f42011-04-12 23:21:44 +0000653 }
654
655 // Now attach the location information to the DIE.
David Blaikie770530b2013-10-21 17:28:37 +0000656 addBlock(Die, Attribute, Block);
Devang Patel161b2f42011-04-12 23:21:44 +0000657}
658
Devang Patel4ec14b02011-07-20 21:57:04 +0000659/// isTypeSigned - Return true if the type is signed.
Manman Renc664d762013-10-05 01:43:03 +0000660static bool isTypeSigned(DwarfDebug *DD, DIType Ty, int *SizeInBits) {
Devang Patel4ec14b02011-07-20 21:57:04 +0000661 if (Ty.isDerivedType())
Manman Renc664d762013-10-05 01:43:03 +0000662 return isTypeSigned(DD, DD->resolve(DIDerivedType(Ty).getTypeDerivedFrom()),
663 SizeInBits);
Devang Patel4ec14b02011-07-20 21:57:04 +0000664 if (Ty.isBasicType())
Eric Christopher6efc0432013-10-19 01:04:47 +0000665 if (DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed ||
666 DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed_char) {
Devang Patel4ec14b02011-07-20 21:57:04 +0000667 *SizeInBits = Ty.getSizeInBits();
668 return true;
669 }
670 return false;
671}
672
Manman Renc664d762013-10-05 01:43:03 +0000673/// Return true if type encoding is unsigned.
674static bool isUnsignedDIType(DwarfDebug *DD, DIType Ty) {
675 DIDerivedType DTy(Ty);
676 if (DTy.isDerivedType())
677 return isUnsignedDIType(DD, DD->resolve(DTy.getTypeDerivedFrom()));
678
679 DIBasicType BTy(Ty);
680 if (BTy.isBasicType()) {
681 unsigned Encoding = BTy.getEncoding();
682 if (Encoding == dwarf::DW_ATE_unsigned ||
683 Encoding == dwarf::DW_ATE_unsigned_char ||
684 Encoding == dwarf::DW_ATE_boolean)
685 return true;
686 }
687 return false;
688}
689
690/// If this type is derived from a base type then return base type size.
Manman Ren43251002013-10-08 18:46:58 +0000691static uint64_t getBaseTypeSize(DwarfDebug *DD, DIDerivedType Ty) {
Manman Renc664d762013-10-05 01:43:03 +0000692 unsigned Tag = Ty.getTag();
693
694 if (Tag != dwarf::DW_TAG_member && Tag != dwarf::DW_TAG_typedef &&
695 Tag != dwarf::DW_TAG_const_type && Tag != dwarf::DW_TAG_volatile_type &&
696 Tag != dwarf::DW_TAG_restrict_type)
697 return Ty.getSizeInBits();
698
699 DIType BaseType = DD->resolve(Ty.getTypeDerivedFrom());
700
701 // If this type is not derived from any type then take conservative approach.
702 if (!BaseType.isValid())
703 return Ty.getSizeInBits();
704
705 // If this is a derived type, go ahead and get the base type, unless it's a
706 // reference then it's just the size of the field. Pointer types have no need
707 // of this since they're a different type of qualification on the type.
708 if (BaseType.getTag() == dwarf::DW_TAG_reference_type ||
709 BaseType.getTag() == dwarf::DW_TAG_rvalue_reference_type)
710 return Ty.getSizeInBits();
711
712 if (BaseType.isDerivedType())
Manman Ren43251002013-10-08 18:46:58 +0000713 return getBaseTypeSize(DD, DIDerivedType(BaseType));
Manman Renc664d762013-10-05 01:43:03 +0000714
715 return BaseType.getSizeInBits();
716}
717
Devang Patel161b2f42011-04-12 23:21:44 +0000718/// addConstantValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000719void CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO,
Devang Patelb58128e2011-05-27 16:45:18 +0000720 DIType Ty) {
David Blaikie4de9d722013-05-10 21:52:07 +0000721 // FIXME: This is a bit conservative/simple - it emits negative values at
722 // their maximum bit width which is a bit unfortunate (& doesn't prefer
723 // udata/sdata over dataN as suggested by the DWARF spec)
Nick Lewycky746cb672011-10-26 22:55:33 +0000724 assert(MO.isImm() && "Invalid machine operand!");
Devang Patel4ec14b02011-07-20 21:57:04 +0000725 int SizeInBits = -1;
Manman Renc664d762013-10-05 01:43:03 +0000726 bool SignedConstant = isTypeSigned(DD, Ty, &SizeInBits);
David Blaikie770530b2013-10-21 17:28:37 +0000727 dwarf::Form Form;
Devang Patel72f0d9c2011-05-27 18:15:52 +0000728
Eric Christopher7b2ee392013-08-27 23:49:04 +0000729 // If we're a signed constant definitely use sdata.
730 if (SignedConstant) {
731 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, MO.getImm());
732 return;
733 }
734
735 // Else use data for now unless it's larger than we can deal with.
736 switch (SizeInBits) {
737 case 8:
738 Form = dwarf::DW_FORM_data1;
739 break;
740 case 16:
741 Form = dwarf::DW_FORM_data2;
742 break;
743 case 32:
744 Form = dwarf::DW_FORM_data4;
745 break;
746 case 64:
747 Form = dwarf::DW_FORM_data8;
748 break;
749 default:
750 Form = dwarf::DW_FORM_udata;
751 addUInt(Die, dwarf::DW_AT_const_value, Form, MO.getImm());
752 return;
753 }
754 addUInt(Die, dwarf::DW_AT_const_value, Form, MO.getImm());
Devang Patel161b2f42011-04-12 23:21:44 +0000755}
756
757/// addConstantFPValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000758void CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
Eric Christopher6efc0432013-10-19 01:04:47 +0000759 assert(MO.isFPImm() && "Invalid machine operand!");
Devang Patel161b2f42011-04-12 23:21:44 +0000760 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
761 APFloat FPImm = MO.getFPImm()->getValueAPF();
762
763 // Get the raw data form of the floating point.
764 const APInt FltVal = FPImm.bitcastToAPInt();
Eric Christopher6efc0432013-10-19 01:04:47 +0000765 const char *FltPtr = (const char *)FltVal.getRawData();
Devang Patel161b2f42011-04-12 23:21:44 +0000766
767 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
Micah Villmow3574eca2012-10-08 16:38:25 +0000768 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel161b2f42011-04-12 23:21:44 +0000769 int Incr = (LittleEndian ? 1 : -1);
770 int Start = (LittleEndian ? 0 : NumBytes - 1);
771 int Stop = (LittleEndian ? NumBytes : -1);
772
773 // Output the constant to DWARF one byte at a time.
774 for (; Start != Stop; Start += Incr)
Eric Christopher61290022013-11-11 18:52:36 +0000775 addUInt(Block, dwarf::DW_FORM_data1, (unsigned char)0xFF & FltPtr[Start]);
Devang Patel161b2f42011-04-12 23:21:44 +0000776
David Blaikie770530b2013-10-21 17:28:37 +0000777 addBlock(Die, dwarf::DW_AT_const_value, Block);
Devang Patel161b2f42011-04-12 23:21:44 +0000778}
779
David Blaikie14268412013-01-20 01:18:01 +0000780/// addConstantFPValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000781void CompileUnit::addConstantFPValue(DIE *Die, const ConstantFP *CFP) {
Eric Christopher7b2ee392013-08-27 23:49:04 +0000782 // Pass this down to addConstantValue as an unsigned bag of bits.
783 addConstantValue(Die, CFP->getValueAPF().bitcastToAPInt(), true);
David Blaikie14268412013-01-20 01:18:01 +0000784}
785
Devang Patel161b2f42011-04-12 23:21:44 +0000786/// addConstantValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000787void CompileUnit::addConstantValue(DIE *Die, const ConstantInt *CI,
Devang Patel161b2f42011-04-12 23:21:44 +0000788 bool Unsigned) {
Eric Christophere4721492013-07-03 01:08:30 +0000789 addConstantValue(Die, CI->getValue(), Unsigned);
David Blaikie14268412013-01-20 01:18:01 +0000790}
791
792// addConstantValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000793void CompileUnit::addConstantValue(DIE *Die, const APInt &Val, bool Unsigned) {
David Blaikie14268412013-01-20 01:18:01 +0000794 unsigned CIBitWidth = Val.getBitWidth();
Devang Pateld6a81362011-05-28 00:39:18 +0000795 if (CIBitWidth <= 64) {
Eric Christopher7b2ee392013-08-27 23:49:04 +0000796 // If we're a signed constant definitely use sdata.
797 if (!Unsigned) {
798 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata,
799 Val.getSExtValue());
800 return;
Devang Pateld6a81362011-05-28 00:39:18 +0000801 }
Eric Christopher7b2ee392013-08-27 23:49:04 +0000802
803 // Else use data for now unless it's larger than we can deal with.
David Blaikie770530b2013-10-21 17:28:37 +0000804 dwarf::Form Form;
Eric Christopher7b2ee392013-08-27 23:49:04 +0000805 switch (CIBitWidth) {
806 case 8:
807 Form = dwarf::DW_FORM_data1;
808 break;
809 case 16:
810 Form = dwarf::DW_FORM_data2;
811 break;
812 case 32:
813 Form = dwarf::DW_FORM_data4;
814 break;
815 case 64:
816 Form = dwarf::DW_FORM_data8;
817 break;
818 default:
819 addUInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
820 Val.getZExtValue());
821 return;
822 }
823 addUInt(Die, dwarf::DW_AT_const_value, Form, Val.getZExtValue());
Eric Christophere4721492013-07-03 01:08:30 +0000824 return;
Devang Patel161b2f42011-04-12 23:21:44 +0000825 }
826
827 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
828
829 // Get the raw data form of the large APInt.
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000830 const uint64_t *Ptr64 = Val.getRawData();
Devang Patel161b2f42011-04-12 23:21:44 +0000831
832 int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
Micah Villmow3574eca2012-10-08 16:38:25 +0000833 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel161b2f42011-04-12 23:21:44 +0000834
835 // Output the constant to DWARF one byte at a time.
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000836 for (int i = 0; i < NumBytes; i++) {
837 uint8_t c;
838 if (LittleEndian)
839 c = Ptr64[i / 8] >> (8 * (i & 7));
840 else
841 c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7));
David Blaikie770530b2013-10-21 17:28:37 +0000842 addUInt(Block, dwarf::DW_FORM_data1, c);
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000843 }
Devang Patel161b2f42011-04-12 23:21:44 +0000844
David Blaikie770530b2013-10-21 17:28:37 +0000845 addBlock(Die, dwarf::DW_AT_const_value, Block);
Devang Patel161b2f42011-04-12 23:21:44 +0000846}
847
Eric Christopher6c3bb942013-04-22 07:47:40 +0000848/// addTemplateParams - Add template parameters into buffer.
Devang Patel161b2f42011-04-12 23:21:44 +0000849void CompileUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
850 // Add template parameters.
851 for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) {
852 DIDescriptor Element = TParams.getElement(i);
853 if (Element.isTemplateTypeParameter())
Manman Renbe87b692013-10-23 23:05:28 +0000854 constructTemplateTypeParameterDIE(Buffer,
855 DITemplateTypeParameter(Element));
Devang Patel161b2f42011-04-12 23:21:44 +0000856 else if (Element.isTemplateValueParameter())
Manman Renbe87b692013-10-23 23:05:28 +0000857 constructTemplateValueParameterDIE(Buffer,
858 DITemplateValueParameter(Element));
Devang Patel161b2f42011-04-12 23:21:44 +0000859 }
Devang Patel161b2f42011-04-12 23:21:44 +0000860}
Nick Lewycky746cb672011-10-26 22:55:33 +0000861
Eric Christopher6b6061f2013-01-16 01:22:23 +0000862/// getOrCreateContextDIE - Get context owner's DIE.
Eric Christopherccb66362013-10-04 23:49:26 +0000863DIE *CompileUnit::getOrCreateContextDIE(DIScope Context) {
David Blaikie8c0fecc2013-11-14 21:24:34 +0000864 if (!Context || Context.isFile())
865 return getCUDie();
Eric Christopher6b6061f2013-01-16 01:22:23 +0000866 if (Context.isType())
867 return getOrCreateTypeDIE(DIType(Context));
David Blaikief4837be2013-11-14 19:37:56 +0000868 if (Context.isNameSpace())
Eric Christopher6b6061f2013-01-16 01:22:23 +0000869 return getOrCreateNameSpace(DINameSpace(Context));
David Blaikief4837be2013-11-14 19:37:56 +0000870 if (Context.isSubprogram())
Eric Christopher6b6061f2013-01-16 01:22:23 +0000871 return getOrCreateSubprogramDIE(DISubprogram(Context));
Adrian Prantl0cbdb812013-11-15 21:05:09 +0000872 return getDIE(Context);
Eric Christopher6b6061f2013-01-16 01:22:23 +0000873}
874
Devang Patel161b2f42011-04-12 23:21:44 +0000875/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
876/// given DIType.
Devang Patel94c7ddb2011-08-16 22:09:43 +0000877DIE *CompileUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
David Blaikie41e1a182013-11-14 22:25:02 +0000878 if (!TyNode)
Devang Patel94c7ddb2011-08-16 22:09:43 +0000879 return NULL;
Manman Rend498e5e2013-10-29 22:49:29 +0000880
David Blaikie41e1a182013-11-14 22:25:02 +0000881 DIType Ty(TyNode);
882 assert(Ty.isType());
883
Manman Rend498e5e2013-10-29 22:49:29 +0000884 // Construct the context before querying for the existence of the DIE in case
885 // such construction creates the DIE.
886 DIE *ContextDIE = getOrCreateContextDIE(resolve(Ty.getContext()));
Adrian Prantl6bc810a2013-11-15 23:21:39 +0000887 assert(ContextDIE);
Manman Rend498e5e2013-10-29 22:49:29 +0000888
Eric Christopher3f045002013-10-04 17:08:38 +0000889 DIE *TyDIE = getDIE(Ty);
Devang Patel161b2f42011-04-12 23:21:44 +0000890 if (TyDIE)
891 return TyDIE;
892
893 // Create new type.
Manman Rend498e5e2013-10-29 22:49:29 +0000894 TyDIE = createAndAddDIE(Ty.getTag(), *ContextDIE, Ty);
895
Devang Patel161b2f42011-04-12 23:21:44 +0000896 if (Ty.isBasicType())
897 constructTypeDIE(*TyDIE, DIBasicType(Ty));
898 else if (Ty.isCompositeType())
899 constructTypeDIE(*TyDIE, DICompositeType(Ty));
900 else {
901 assert(Ty.isDerivedType() && "Unknown kind of DIType");
902 constructTypeDIE(*TyDIE, DIDerivedType(Ty));
903 }
Eric Christopher1b3f9192011-11-10 19:52:58 +0000904 // If this is a named finished type then include it in the list of types
905 // for the accelerator tables.
Eric Christopherc36145f2012-01-06 04:35:23 +0000906 if (!Ty.getName().empty() && !Ty.isForwardDecl()) {
907 bool IsImplementation = 0;
908 if (Ty.isCompositeType()) {
909 DICompositeType CT(Ty);
Eric Christophere0167892012-01-06 23:03:37 +0000910 // A runtime language of 0 actually means C/C++ and that any
911 // non-negative value is some version of Objective-C/C++.
Eric Christopher6efc0432013-10-19 01:04:47 +0000912 IsImplementation = (CT.getRunTimeLang() == 0) || CT.isObjcClassComplete();
Eric Christopherc36145f2012-01-06 04:35:23 +0000913 }
Eric Christopher577056f2013-09-05 18:20:16 +0000914 unsigned Flags = IsImplementation ? dwarf::DW_FLAG_type_implementation : 0;
Eric Christophere0167892012-01-06 23:03:37 +0000915 addAccelType(Ty.getName(), std::make_pair(TyDIE, Flags));
Eric Christopherc36145f2012-01-06 04:35:23 +0000916 }
Eric Christopher8b4310b2012-11-21 00:34:38 +0000917
Devang Patel161b2f42011-04-12 23:21:44 +0000918 return TyDIE;
919}
920
921/// addType - Add a new type attribute to the specified entity.
David Blaikie770530b2013-10-21 17:28:37 +0000922void CompileUnit::addType(DIE *Entity, DIType Ty, dwarf::Attribute Attribute) {
Eric Christopherdc1363f2013-08-08 07:40:37 +0000923 assert(Ty && "Trying to add a type that doesn't exist?");
Devang Patel161b2f42011-04-12 23:21:44 +0000924
925 // Check for pre-existence.
926 DIEEntry *Entry = getDIEEntry(Ty);
927 // If it exists then use the existing value.
928 if (Entry) {
Manman Renb8b70e12013-10-31 17:54:35 +0000929 addDIEEntry(Entity, Attribute, Entry);
Devang Patel161b2f42011-04-12 23:21:44 +0000930 return;
931 }
932
933 // Construct type.
934 DIE *Buffer = getOrCreateTypeDIE(Ty);
935
936 // Set up proxy.
937 Entry = createDIEEntry(Buffer);
938 insertDIEEntry(Ty, Entry);
Manman Renb8b70e12013-10-31 17:54:35 +0000939 addDIEEntry(Entity, Attribute, Entry);
Devang Patele9ae06c2011-05-31 22:56:51 +0000940
941 // If this is a complete composite type then include it in the
942 // list of global types.
Devang Patelc20bdf12011-06-01 00:23:24 +0000943 addGlobalType(Ty);
Devang Patel66658e42011-05-31 23:30:30 +0000944}
945
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000946// Accelerator table mutators - add each name along with its companion
947// DIE to the proper table while ensuring that the name that we're going
948// to reference is in the string table. We do this since the names we
949// add may not only be identical to the names in the DIE.
950void CompileUnit::addAccelName(StringRef Name, DIE *Die) {
951 DU->getStringPoolEntry(Name);
Eric Christopher734334e2013-09-23 22:59:11 +0000952 std::vector<DIE *> &DIEs = AccelNames[Name];
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000953 DIEs.push_back(Die);
954}
955
956void CompileUnit::addAccelObjC(StringRef Name, DIE *Die) {
957 DU->getStringPoolEntry(Name);
Eric Christopher734334e2013-09-23 22:59:11 +0000958 std::vector<DIE *> &DIEs = AccelObjC[Name];
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000959 DIEs.push_back(Die);
960}
961
962void CompileUnit::addAccelNamespace(StringRef Name, DIE *Die) {
963 DU->getStringPoolEntry(Name);
Eric Christopher734334e2013-09-23 22:59:11 +0000964 std::vector<DIE *> &DIEs = AccelNamespace[Name];
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000965 DIEs.push_back(Die);
966}
967
968void CompileUnit::addAccelType(StringRef Name, std::pair<DIE *, unsigned> Die) {
969 DU->getStringPoolEntry(Name);
970 std::vector<std::pair<DIE *, unsigned> > &DIEs = AccelTypes[Name];
971 DIEs.push_back(Die);
972}
973
Eric Christopher50d37a42013-09-20 22:20:55 +0000974/// addGlobalName - Add a new global name to the compile unit.
Eric Christopher91986572013-10-17 02:06:06 +0000975void CompileUnit::addGlobalName(StringRef Name, DIE *Die, DIScope Context) {
Eric Christopher0ab64392013-10-19 01:04:42 +0000976 std::string FullName = getParentContextString(Context) + Name.str();
Eric Christopher91986572013-10-17 02:06:06 +0000977 GlobalNames[FullName] = Die;
Eric Christopher50d37a42013-09-20 22:20:55 +0000978}
979
Devang Patel66658e42011-05-31 23:30:30 +0000980/// addGlobalType - Add a new global type to the compile unit.
981///
Devang Patelc20bdf12011-06-01 00:23:24 +0000982void CompileUnit::addGlobalType(DIType Ty) {
Eric Christophereee74fb2013-10-05 00:27:02 +0000983 DIScope Context = resolve(Ty.getContext());
Eric Christopher5a634742013-09-23 23:15:58 +0000984 if (!Ty.getName().empty() && !Ty.isForwardDecl() &&
Eric Christopher734334e2013-09-23 22:59:11 +0000985 (!Context || Context.isCompileUnit() || Context.isFile() ||
986 Context.isNameSpace()))
Eric Christopher91986572013-10-17 02:06:06 +0000987 if (DIEEntry *Entry = getDIEEntry(Ty)) {
Eric Christopher0ab64392013-10-19 01:04:42 +0000988 std::string FullName =
989 getParentContextString(Context) + Ty.getName().str();
Eric Christopher6efc0432013-10-19 01:04:47 +0000990 GlobalTypes[FullName] = Entry->getEntry();
Eric Christopher91986572013-10-17 02:06:06 +0000991 }
992}
993
994/// getParentContextString - Walks the metadata parent chain in a language
995/// specific manner (using the compile unit language) and returns
996/// it as a string. This is done at the metadata level because DIEs may
997/// not currently have been added to the parent context and walking the
998/// DIEs looking for names is more expensive than walking the metadata.
999std::string CompileUnit::getParentContextString(DIScope Context) const {
1000 if (!Context)
1001 return "";
1002
1003 // FIXME: Decide whether to implement this for non-C++ languages.
1004 if (getLanguage() != dwarf::DW_LANG_C_plus_plus)
1005 return "";
1006
Eric Christopher0ab64392013-10-19 01:04:42 +00001007 std::string CS;
Eric Christopher91986572013-10-17 02:06:06 +00001008 SmallVector<DIScope, 1> Parents;
1009 while (!Context.isCompileUnit()) {
1010 Parents.push_back(Context);
1011 if (Context.getContext())
1012 Context = resolve(Context.getContext());
1013 else
1014 // Structure, etc types will have a NULL context if they're at the top
1015 // level.
1016 break;
1017 }
1018
1019 // Reverse iterate over our list to go from the outermost construct to the
1020 // innermost.
1021 for (SmallVectorImpl<DIScope>::reverse_iterator I = Parents.rbegin(),
1022 E = Parents.rend();
1023 I != E; ++I) {
1024 DIScope Ctx = *I;
1025 StringRef Name = Ctx.getName();
Eric Christopher0ab64392013-10-19 01:04:42 +00001026 if (!Name.empty()) {
Eric Christopher91986572013-10-17 02:06:06 +00001027 CS += Name;
1028 CS += "::";
1029 }
1030 }
1031 return CS;
Devang Patel161b2f42011-04-12 23:21:44 +00001032}
1033
Eric Christopher22852c72013-10-05 00:05:51 +00001034/// addPubTypes - Add subprogram argument types for pubtypes section.
Devang Patel31c5d052011-05-06 16:57:54 +00001035void CompileUnit::addPubTypes(DISubprogram SP) {
1036 DICompositeType SPTy = SP.getType();
Eric Christopher31667622013-08-08 01:41:00 +00001037 uint16_t SPTag = SPTy.getTag();
Devang Patel31c5d052011-05-06 16:57:54 +00001038 if (SPTag != dwarf::DW_TAG_subroutine_type)
1039 return;
1040
1041 DIArray Args = SPTy.getTypeArray();
1042 for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
1043 DIType ATy(Args.getElement(i));
Manman Rend03d2b22013-07-08 18:33:29 +00001044 if (!ATy.isType())
Devang Patel31c5d052011-05-06 16:57:54 +00001045 continue;
Devang Patelc20bdf12011-06-01 00:23:24 +00001046 addGlobalType(ATy);
Devang Patel31c5d052011-05-06 16:57:54 +00001047 }
1048}
1049
Devang Patel161b2f42011-04-12 23:21:44 +00001050/// constructTypeDIE - Construct basic type die from DIBasicType.
1051void CompileUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
1052 // Get core information.
1053 StringRef Name = BTy.getName();
Devang Patel161b2f42011-04-12 23:21:44 +00001054 // Add name if not anonymous or intermediate type.
1055 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001056 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel734a67c2011-09-14 23:13:28 +00001057
David Blaikie916d49e2013-10-04 23:21:16 +00001058 // An unspecified type only has a name attribute.
1059 if (BTy.getTag() == dwarf::DW_TAG_unspecified_type)
Devang Patel734a67c2011-09-14 23:13:28 +00001060 return;
Devang Patel734a67c2011-09-14 23:13:28 +00001061
Nick Lewycky746cb672011-10-26 22:55:33 +00001062 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
Devang Patel30d409c2012-02-07 23:33:58 +00001063 BTy.getEncoding());
Devang Patel734a67c2011-09-14 23:13:28 +00001064
Devang Patel161b2f42011-04-12 23:21:44 +00001065 uint64_t Size = BTy.getSizeInBits() >> 3;
David Blaikie770530b2013-10-21 17:28:37 +00001066 addUInt(&Buffer, dwarf::DW_AT_byte_size, None, Size);
Devang Patel161b2f42011-04-12 23:21:44 +00001067}
1068
1069/// constructTypeDIE - Construct derived type die from DIDerivedType.
1070void CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
1071 // Get core information.
1072 StringRef Name = DTy.getName();
1073 uint64_t Size = DTy.getSizeInBits() >> 3;
David Blaikie916d49e2013-10-04 23:21:16 +00001074 uint16_t Tag = Buffer.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +00001075
1076 // Map to main type, void will not have a type.
Manman Ren017ceda2013-10-08 18:42:58 +00001077 DIType FromTy = resolve(DTy.getTypeDerivedFrom());
Eric Christopherdc1363f2013-08-08 07:40:37 +00001078 if (FromTy)
1079 addType(&Buffer, FromTy);
Devang Patel161b2f42011-04-12 23:21:44 +00001080
1081 // Add name if not anonymous or intermediate type.
1082 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001083 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001084
1085 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopher35f225a2012-02-21 22:25:53 +00001086 if (Size && Tag != dwarf::DW_TAG_pointer_type)
David Blaikie770530b2013-10-21 17:28:37 +00001087 addUInt(&Buffer, dwarf::DW_AT_byte_size, None, Size);
Devang Patel161b2f42011-04-12 23:21:44 +00001088
David Blaikie62fdfb52013-01-07 05:51:15 +00001089 if (Tag == dwarf::DW_TAG_ptr_to_member_type)
Eric Christopher6efc0432013-10-19 01:04:47 +00001090 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type,
1091 getOrCreateTypeDIE(resolve(DTy.getClassType())));
Devang Patel161b2f42011-04-12 23:21:44 +00001092 // Add source line info if available and TyDesc is not a forward declaration.
1093 if (!DTy.isForwardDecl())
1094 addSourceLine(&Buffer, DTy);
1095}
1096
Eric Christopher3dee5752013-07-26 17:02:41 +00001097/// Return true if the type is appropriately scoped to be contained inside
1098/// its own type unit.
Manman Ren18eb2452013-09-09 19:23:58 +00001099static bool isTypeUnitScoped(DIType Ty, const DwarfDebug *DD) {
Manman Ren2c9905a2013-09-09 19:47:11 +00001100 DIScope Parent = DD->resolve(Ty.getContext());
Eric Christopher3dee5752013-07-26 17:02:41 +00001101 while (Parent) {
1102 // Don't generate a hash for anything scoped inside a function.
1103 if (Parent.isSubprogram())
1104 return false;
Manman Rene72aba92013-09-09 22:35:23 +00001105 Parent = DD->resolve(Parent.getContext());
Eric Christopher3dee5752013-07-26 17:02:41 +00001106 }
1107 return true;
1108}
1109
1110/// Return true if the type should be split out into a type unit.
Manman Ren18eb2452013-09-09 19:23:58 +00001111static bool shouldCreateTypeUnit(DICompositeType CTy, const DwarfDebug *DD) {
Eric Christopher31667622013-08-08 01:41:00 +00001112 uint16_t Tag = CTy.getTag();
Eric Christopher3dee5752013-07-26 17:02:41 +00001113
1114 switch (Tag) {
1115 case dwarf::DW_TAG_structure_type:
1116 case dwarf::DW_TAG_union_type:
1117 case dwarf::DW_TAG_enumeration_type:
1118 case dwarf::DW_TAG_class_type:
1119 // If this is a class, structure, union, or enumeration type
David Blaikiec4eb3532013-10-04 23:52:02 +00001120 // that is a definition (not a declaration), and not scoped
Eric Christopher3dee5752013-07-26 17:02:41 +00001121 // inside a function then separate this out as a type unit.
David Blaikiec4eb3532013-10-04 23:52:02 +00001122 return !CTy.isForwardDecl() && isTypeUnitScoped(CTy, DD);
Eric Christopher3dee5752013-07-26 17:02:41 +00001123 default:
David Blaikiec4eb3532013-10-04 23:52:02 +00001124 return false;
Eric Christopher3dee5752013-07-26 17:02:41 +00001125 }
1126}
1127
Devang Patel161b2f42011-04-12 23:21:44 +00001128/// constructTypeDIE - Construct type DIE from DICompositeType.
1129void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
1130 // Get core information.
1131 StringRef Name = CTy.getName();
1132
1133 uint64_t Size = CTy.getSizeInBits() >> 3;
David Blaikie916d49e2013-10-04 23:21:16 +00001134 uint16_t Tag = Buffer.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +00001135
1136 switch (Tag) {
Devang Patel161b2f42011-04-12 23:21:44 +00001137 case dwarf::DW_TAG_array_type:
Eric Christopher883ed6b2013-11-11 18:52:31 +00001138 constructArrayTypeDIE(Buffer, CTy);
Devang Patel161b2f42011-04-12 23:21:44 +00001139 break;
Eric Christopher95339892013-11-11 18:52:39 +00001140 case dwarf::DW_TAG_enumeration_type:
1141 constructEnumTypeDIE(Buffer, CTy);
1142 break;
Devang Patel161b2f42011-04-12 23:21:44 +00001143 case dwarf::DW_TAG_subroutine_type: {
Eric Christopherdc1363f2013-08-08 07:40:37 +00001144 // Add return type. A void return won't have a type.
Devang Patel161b2f42011-04-12 23:21:44 +00001145 DIArray Elements = CTy.getTypeArray();
David Blaikie4adba522013-11-18 23:33:32 +00001146 DIType RTy(Elements.getElement(0));
Eric Christopherdc1363f2013-08-08 07:40:37 +00001147 if (RTy)
David Blaikie4adba522013-11-18 23:33:32 +00001148 addType(&Buffer, RTy);
Devang Patel161b2f42011-04-12 23:21:44 +00001149
1150 bool isPrototyped = true;
1151 // Add arguments.
1152 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
1153 DIDescriptor Ty = Elements.getElement(i);
1154 if (Ty.isUnspecifiedParameter()) {
Manman Ren1a5e7872013-10-29 00:53:03 +00001155 createAndAddDIE(dwarf::DW_TAG_unspecified_parameters, Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +00001156 isPrototyped = false;
1157 } else {
Manman Ren1a5e7872013-10-29 00:53:03 +00001158 DIE *Arg = createAndAddDIE(dwarf::DW_TAG_formal_parameter, Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +00001159 addType(Arg, DIType(Ty));
David Blaikieaaf2e632013-01-29 19:35:24 +00001160 if (DIType(Ty).isArtificial())
1161 addFlag(Arg, dwarf::DW_AT_artificial);
Devang Patel161b2f42011-04-12 23:21:44 +00001162 }
1163 }
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001164 // Add prototype flag if we're dealing with a C language and the
1165 // function has been prototyped.
David Blaikieaedaa722013-11-15 23:50:53 +00001166 uint16_t Language = getLanguage();
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001167 if (isPrototyped &&
Eric Christopher6efc0432013-10-19 01:04:47 +00001168 (Language == dwarf::DW_LANG_C89 || Language == dwarf::DW_LANG_C99 ||
Eric Christopher4d069bf2012-05-22 18:45:24 +00001169 Language == dwarf::DW_LANG_ObjC))
Eric Christopher873cf0a2012-08-24 01:14:27 +00001170 addFlag(&Buffer, dwarf::DW_AT_prototyped);
Eric Christopher6efc0432013-10-19 01:04:47 +00001171 } break;
Devang Patel161b2f42011-04-12 23:21:44 +00001172 case dwarf::DW_TAG_structure_type:
1173 case dwarf::DW_TAG_union_type:
1174 case dwarf::DW_TAG_class_type: {
Devang Patel161b2f42011-04-12 23:21:44 +00001175 // Add elements to structure type.
David Blaikiec8b93552013-08-01 20:30:22 +00001176 DIArray Elements = CTy.getTypeArray();
1177 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
Devang Patel161b2f42011-04-12 23:21:44 +00001178 DIDescriptor Element = Elements.getElement(i);
1179 DIE *ElemDie = NULL;
1180 if (Element.isSubprogram()) {
1181 DISubprogram SP(Element);
David Blaikie4adba522013-11-18 23:33:32 +00001182 ElemDie = getOrCreateSubprogramDIE(SP);
Devang Patel161b2f42011-04-12 23:21:44 +00001183 if (SP.isProtected())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001184 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001185 dwarf::DW_ACCESS_protected);
1186 else if (SP.isPrivate())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001187 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001188 dwarf::DW_ACCESS_private);
Eric Christopher8b4310b2012-11-21 00:34:38 +00001189 else
Nick Lewycky13aaca52011-12-13 05:09:11 +00001190 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Eric Christopher6efc0432013-10-19 01:04:47 +00001191 dwarf::DW_ACCESS_public);
Devang Patel161b2f42011-04-12 23:21:44 +00001192 if (SP.isExplicit())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001193 addFlag(ElemDie, dwarf::DW_AT_explicit);
Eric Christopher663e0cf2012-03-28 07:34:31 +00001194 } else if (Element.isDerivedType()) {
Eric Christopher4d069bf2012-05-22 18:45:24 +00001195 DIDerivedType DDTy(Element);
1196 if (DDTy.getTag() == dwarf::DW_TAG_friend) {
Manman Ren1a5e7872013-10-29 00:53:03 +00001197 ElemDie = createAndAddDIE(dwarf::DW_TAG_friend, Buffer);
Manman Ren017ceda2013-10-08 18:42:58 +00001198 addType(ElemDie, resolve(DDTy.getTypeDerivedFrom()),
Manman Renc664d762013-10-05 01:43:03 +00001199 dwarf::DW_AT_friend);
Manman Ren655a10d2013-10-14 20:33:57 +00001200 } else if (DDTy.isStaticMember()) {
Manman Ren99addee2013-10-23 22:57:12 +00001201 getOrCreateStaticMemberDIE(DDTy);
Manman Ren655a10d2013-10-14 20:33:57 +00001202 } else {
Manman Rena1d25b62013-10-23 23:00:44 +00001203 constructMemberDIE(Buffer, DDTy);
Manman Ren655a10d2013-10-14 20:33:57 +00001204 }
Eric Christopher663e0cf2012-03-28 07:34:31 +00001205 } else if (Element.isObjCProperty()) {
Devang Patel30d409c2012-02-07 23:33:58 +00001206 DIObjCProperty Property(Element);
Manman Ren1a5e7872013-10-29 00:53:03 +00001207 ElemDie = createAndAddDIE(Property.getTag(), Buffer);
Devang Patel30d409c2012-02-07 23:33:58 +00001208 StringRef PropertyName = Property.getObjCPropertyName();
1209 addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
Eric Christopher4d069bf2012-05-22 18:45:24 +00001210 addType(ElemDie, Property.getType());
1211 addSourceLine(ElemDie, Property);
Devang Patel30d409c2012-02-07 23:33:58 +00001212 StringRef GetterName = Property.getObjCPropertyGetterName();
1213 if (!GetterName.empty())
1214 addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
1215 StringRef SetterName = Property.getObjCPropertySetterName();
1216 if (!SetterName.empty())
1217 addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
1218 unsigned PropertyAttributes = 0;
Devang Patel9e11eb12012-02-04 01:30:32 +00001219 if (Property.isReadOnlyObjCProperty())
1220 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
1221 if (Property.isReadWriteObjCProperty())
1222 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
1223 if (Property.isAssignObjCProperty())
1224 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
1225 if (Property.isRetainObjCProperty())
1226 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
1227 if (Property.isCopyObjCProperty())
1228 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
1229 if (Property.isNonAtomicObjCProperty())
1230 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
1231 if (PropertyAttributes)
David Blaikie770530b2013-10-21 17:28:37 +00001232 addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, None,
Eric Christopher6efc0432013-10-19 01:04:47 +00001233 PropertyAttributes);
Devang Patel6588abf2012-02-06 17:49:43 +00001234
Devang Patel30d409c2012-02-07 23:33:58 +00001235 DIEEntry *Entry = getDIEEntry(Element);
1236 if (!Entry) {
1237 Entry = createDIEEntry(ElemDie);
1238 insertDIEEntry(Element, Entry);
1239 }
Devang Patel9e11eb12012-02-04 01:30:32 +00001240 } else
Devang Patel161b2f42011-04-12 23:21:44 +00001241 continue;
Devang Patel161b2f42011-04-12 23:21:44 +00001242 }
1243
1244 if (CTy.isAppleBlockExtension())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001245 addFlag(&Buffer, dwarf::DW_AT_APPLE_block);
Devang Patel161b2f42011-04-12 23:21:44 +00001246
Eric Christophereee74fb2013-10-05 00:27:02 +00001247 DICompositeType ContainingType(resolve(CTy.getContainingType()));
David Blaikie4adba522013-11-18 23:33:32 +00001248 if (ContainingType)
Manman Ren87b110a2013-10-11 23:58:05 +00001249 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type,
David Blaikie4adba522013-11-18 23:33:32 +00001250 getOrCreateTypeDIE(ContainingType));
Devang Patel161b2f42011-04-12 23:21:44 +00001251
Devang Patel201e6cd2011-05-12 21:29:42 +00001252 if (CTy.isObjcClassComplete())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001253 addFlag(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type);
Devang Patelb11f80e2011-05-12 19:06:16 +00001254
Eric Christopher1a8e8862011-12-16 23:42:42 +00001255 // Add template parameters to a class, structure or union types.
1256 // FIXME: The support isn't in the metadata for this yet.
1257 if (Tag == dwarf::DW_TAG_class_type ||
Eric Christopher6efc0432013-10-19 01:04:47 +00001258 Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type)
Devang Patel161b2f42011-04-12 23:21:44 +00001259 addTemplateParams(Buffer, CTy.getTemplateParams());
1260
1261 break;
1262 }
1263 default:
1264 break;
1265 }
1266
1267 // Add name if not anonymous or intermediate type.
1268 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001269 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001270
Eric Christopher4a5d8392012-05-22 18:45:18 +00001271 if (Tag == dwarf::DW_TAG_enumeration_type ||
Eric Christopher6efc0432013-10-19 01:04:47 +00001272 Tag == dwarf::DW_TAG_class_type || Tag == dwarf::DW_TAG_structure_type ||
Eric Christopher4a5d8392012-05-22 18:45:18 +00001273 Tag == dwarf::DW_TAG_union_type) {
Devang Patel161b2f42011-04-12 23:21:44 +00001274 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopherfc4199b2012-06-01 00:22:32 +00001275 // TODO: Do we care about size for enum forward declarations?
Devang Patel161b2f42011-04-12 23:21:44 +00001276 if (Size)
David Blaikie770530b2013-10-21 17:28:37 +00001277 addUInt(&Buffer, dwarf::DW_AT_byte_size, None, Size);
Eric Christopherfc4199b2012-06-01 00:22:32 +00001278 else if (!CTy.isForwardDecl())
Devang Patel161b2f42011-04-12 23:21:44 +00001279 // Add zero size if it is not a forward declaration.
David Blaikie770530b2013-10-21 17:28:37 +00001280 addUInt(&Buffer, dwarf::DW_AT_byte_size, None, 0);
Eric Christopherfc4199b2012-06-01 00:22:32 +00001281
1282 // If we're a forward decl, say so.
1283 if (CTy.isForwardDecl())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001284 addFlag(&Buffer, dwarf::DW_AT_declaration);
Devang Patel161b2f42011-04-12 23:21:44 +00001285
1286 // Add source line info if available.
1287 if (!CTy.isForwardDecl())
1288 addSourceLine(&Buffer, CTy);
Eric Christopher89388952012-03-07 00:15:19 +00001289
1290 // No harm in adding the runtime language to the declaration.
1291 unsigned RLang = CTy.getRunTimeLang();
1292 if (RLang)
Eric Christopher6efc0432013-10-19 01:04:47 +00001293 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class, dwarf::DW_FORM_data1,
1294 RLang);
Devang Patel161b2f42011-04-12 23:21:44 +00001295 }
Eric Christopher3dee5752013-07-26 17:02:41 +00001296 // If this is a type applicable to a type unit it then add it to the
1297 // list of types we'll compute a hash for later.
Manman Ren18eb2452013-09-09 19:23:58 +00001298 if (shouldCreateTypeUnit(CTy, DD))
Eric Christopher3dee5752013-07-26 17:02:41 +00001299 DD->addTypeUnitType(&Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +00001300}
1301
Manman Renbe87b692013-10-23 23:05:28 +00001302/// constructTemplateTypeParameterDIE - Construct new DIE for the given
1303/// DITemplateTypeParameter.
Manman Ren99addee2013-10-23 22:57:12 +00001304void
Manman Renbe87b692013-10-23 23:05:28 +00001305CompileUnit::constructTemplateTypeParameterDIE(DIE &Buffer,
1306 DITemplateTypeParameter TP) {
Manman Ren1a5e7872013-10-29 00:53:03 +00001307 DIE *ParamDIE =
1308 createAndAddDIE(dwarf::DW_TAG_template_type_parameter, Buffer);
Eric Christopher76ef79f2013-08-08 08:09:43 +00001309 // Add the type if it exists, it could be void and therefore no type.
1310 if (TP.getType())
Manman Renb4d9c112013-10-09 19:46:28 +00001311 addType(ParamDIE, resolve(TP.getType()));
David Blaikiee88939c2013-06-22 18:59:11 +00001312 if (!TP.getName().empty())
1313 addString(ParamDIE, dwarf::DW_AT_name, TP.getName());
Devang Patel161b2f42011-04-12 23:21:44 +00001314}
1315
Manman Renbe87b692013-10-23 23:05:28 +00001316/// constructTemplateValueParameterDIE - Construct new DIE for the given
1317/// DITemplateValueParameter.
Manman Ren99addee2013-10-23 22:57:12 +00001318void
Manman Renbe87b692013-10-23 23:05:28 +00001319CompileUnit::constructTemplateValueParameterDIE(DIE &Buffer,
1320 DITemplateValueParameter VP) {
Manman Ren1a5e7872013-10-29 00:53:03 +00001321 DIE *ParamDIE = createAndAddDIE(VP.getTag(), Buffer);
Eric Christopherdc1363f2013-08-08 07:40:37 +00001322
1323 // Add the type if there is one, template template and template parameter
1324 // packs will not have a type.
Eric Christopheref2d9192013-10-21 17:48:51 +00001325 if (VP.getTag() == dwarf::DW_TAG_template_value_parameter)
Manman Renb4d9c112013-10-09 19:46:28 +00001326 addType(ParamDIE, resolve(VP.getType()));
Eric Christopherafdd1f82013-08-08 07:40:31 +00001327 if (!VP.getName().empty())
1328 addString(ParamDIE, dwarf::DW_AT_name, VP.getName());
1329 if (Value *Val = VP.getValue()) {
David Blaikie4de9d722013-05-10 21:52:07 +00001330 if (ConstantInt *CI = dyn_cast<ConstantInt>(Val))
Manman Renb4d9c112013-10-09 19:46:28 +00001331 addConstantValue(ParamDIE, CI,
1332 isUnsignedDIType(DD, resolve(VP.getType())));
David Blaikie4de9d722013-05-10 21:52:07 +00001333 else if (GlobalValue *GV = dyn_cast<GlobalValue>(Val)) {
1334 // For declaration non-type template parameters (such as global values and
1335 // functions)
1336 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Rafael Espindolaffc7dca2013-10-29 17:07:16 +00001337 addOpAddress(Block, Asm->getSymbol(GV));
David Blaikie4de9d722013-05-10 21:52:07 +00001338 // Emit DW_OP_stack_value to use the address as the immediate value of the
1339 // parameter, rather than a pointer to it.
David Blaikie770530b2013-10-21 17:28:37 +00001340 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value);
1341 addBlock(ParamDIE, dwarf::DW_AT_location, Block);
Eric Christopherafdd1f82013-08-08 07:40:31 +00001342 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_template_param) {
David Blaikiee88939c2013-06-22 18:59:11 +00001343 assert(isa<MDString>(Val));
1344 addString(ParamDIE, dwarf::DW_AT_GNU_template_name,
1345 cast<MDString>(Val)->getString());
Eric Christopherafdd1f82013-08-08 07:40:31 +00001346 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_parameter_pack) {
David Blaikiee88939c2013-06-22 18:59:11 +00001347 assert(isa<MDNode>(Val));
1348 DIArray A(cast<MDNode>(Val));
1349 addTemplateParams(*ParamDIE, A);
David Blaikie4de9d722013-05-10 21:52:07 +00001350 }
1351 }
Devang Patel161b2f42011-04-12 23:21:44 +00001352}
1353
Devang Patel31c5d052011-05-06 16:57:54 +00001354/// getOrCreateNameSpace - Create a DIE for DINameSpace.
1355DIE *CompileUnit::getOrCreateNameSpace(DINameSpace NS) {
Manman Ren6b713802013-10-29 05:49:41 +00001356 // Construct the context before querying for the existence of the DIE in case
1357 // such construction creates the DIE.
1358 DIE *ContextDIE = getOrCreateContextDIE(NS.getContext());
Manman Ren6b713802013-10-29 05:49:41 +00001359
Devang Patel31c5d052011-05-06 16:57:54 +00001360 DIE *NDie = getDIE(NS);
1361 if (NDie)
1362 return NDie;
Manman Ren6b713802013-10-29 05:49:41 +00001363 NDie = createAndAddDIE(dwarf::DW_TAG_namespace, *ContextDIE, NS);
1364
Eric Christopher09ac3d82011-11-07 09:24:32 +00001365 if (!NS.getName().empty()) {
Nick Lewycky390c40d2011-10-27 06:44:11 +00001366 addString(NDie, dwarf::DW_AT_name, NS.getName());
Eric Christopher09ac3d82011-11-07 09:24:32 +00001367 addAccelNamespace(NS.getName(), NDie);
Eric Christopher91986572013-10-17 02:06:06 +00001368 addGlobalName(NS.getName(), NDie, NS.getContext());
Eric Christopher09ac3d82011-11-07 09:24:32 +00001369 } else
1370 addAccelNamespace("(anonymous namespace)", NDie);
Devang Patel31c5d052011-05-06 16:57:54 +00001371 addSourceLine(NDie, NS);
Devang Patel31c5d052011-05-06 16:57:54 +00001372 return NDie;
1373}
1374
Devang Pateldbc64af2011-08-15 17:24:54 +00001375/// getOrCreateSubprogramDIE - Create new DIE using SP.
1376DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
David Blaikiec32f2332013-10-04 01:39:59 +00001377 // Construct the context before querying for the existence of the DIE in case
1378 // such construction creates the DIE (as is the case for member function
1379 // declarations).
Manman Renb8e48a62013-10-10 18:40:01 +00001380 DIE *ContextDIE = getOrCreateContextDIE(resolve(SP.getContext()));
David Blaikiec32f2332013-10-04 01:39:59 +00001381
Eric Christopher3f045002013-10-04 17:08:38 +00001382 DIE *SPDie = getDIE(SP);
Devang Pateldbc64af2011-08-15 17:24:54 +00001383 if (SPDie)
1384 return SPDie;
1385
Manman Renbbdd02c2013-10-29 00:58:04 +00001386 DISubprogram SPDecl = SP.getFunctionDeclaration();
1387 if (SPDecl.isSubprogram())
1388 // Add subprogram definitions to the CU die directly.
1389 ContextDIE = CUDie.get();
Peter Collingbourne27302f02012-05-27 18:36:44 +00001390
1391 // DW_TAG_inlined_subroutine may refer to this DIE.
Manman Renbbdd02c2013-10-29 00:58:04 +00001392 SPDie = createAndAddDIE(dwarf::DW_TAG_subprogram, *ContextDIE, SP);
Peter Collingbourne27302f02012-05-27 18:36:44 +00001393
Rafael Espindola01b55b42011-11-10 22:34:29 +00001394 DIE *DeclDie = NULL;
Manman Ren250f4e82013-10-23 22:12:26 +00001395 if (SPDecl.isSubprogram())
Rafael Espindola01b55b42011-11-10 22:34:29 +00001396 DeclDie = getOrCreateSubprogramDIE(SPDecl);
Rafael Espindola01b55b42011-11-10 22:34:29 +00001397
Devang Pateldbc64af2011-08-15 17:24:54 +00001398 // Add function template parameters.
1399 addTemplateParams(*SPDie, SP.getTemplateParams());
1400
Devang Pateldbc64af2011-08-15 17:24:54 +00001401 // If this DIE is going to refer declaration info using AT_specification
Eric Christopherc4968752013-05-09 00:42:33 +00001402 // then there is no need to add other attributes.
Rafael Espindola01b55b42011-11-10 22:34:29 +00001403 if (DeclDie) {
1404 // Refer function declaration directly.
Manman Ren87b110a2013-10-11 23:58:05 +00001405 addDIEEntry(SPDie, dwarf::DW_AT_specification, DeclDie);
Rafael Espindola01b55b42011-11-10 22:34:29 +00001406
Devang Pateldbc64af2011-08-15 17:24:54 +00001407 return SPDie;
Rafael Espindola01b55b42011-11-10 22:34:29 +00001408 }
Devang Pateldbc64af2011-08-15 17:24:54 +00001409
Eric Christophercbbd5b12012-08-23 22:52:55 +00001410 // Add the linkage name if we have one.
Michael Gottesmandc42d032013-09-04 04:39:38 +00001411 StringRef LinkageName = SP.getLinkageName();
1412 if (!LinkageName.empty())
Eric Christophercbbd5b12012-08-23 22:52:55 +00001413 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c2b4be2013-06-01 17:51:14 +00001414 GlobalValue::getRealLinkageName(LinkageName));
Eric Christophercbbd5b12012-08-23 22:52:55 +00001415
Devang Pateldbc64af2011-08-15 17:24:54 +00001416 // Constructors and operators for anonymous aggregates do not have names.
1417 if (!SP.getName().empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001418 addString(SPDie, dwarf::DW_AT_name, SP.getName());
Devang Pateldbc64af2011-08-15 17:24:54 +00001419
1420 addSourceLine(SPDie, SP);
1421
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001422 // Add the prototype if we have a prototype and we have a C like
1423 // language.
David Blaikieaedaa722013-11-15 23:50:53 +00001424 uint16_t Language = getLanguage();
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001425 if (SP.isPrototyped() &&
Eric Christopher6efc0432013-10-19 01:04:47 +00001426 (Language == dwarf::DW_LANG_C89 || Language == dwarf::DW_LANG_C99 ||
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001427 Language == dwarf::DW_LANG_ObjC))
Eric Christopher873cf0a2012-08-24 01:14:27 +00001428 addFlag(SPDie, dwarf::DW_AT_prototyped);
Devang Pateldbc64af2011-08-15 17:24:54 +00001429
Devang Pateldbc64af2011-08-15 17:24:54 +00001430 DICompositeType SPTy = SP.getType();
David Blaikie3d331842013-05-22 23:22:18 +00001431 assert(SPTy.getTag() == dwarf::DW_TAG_subroutine_type &&
1432 "the type of a subprogram should be a subroutine");
Devang Pateldbc64af2011-08-15 17:24:54 +00001433
David Blaikie3d331842013-05-22 23:22:18 +00001434 DIArray Args = SPTy.getTypeArray();
Eric Christopheref2d9192013-10-21 17:48:51 +00001435 // Add a return type. If this is a type like a C/C++ void type we don't add a
1436 // return type.
Eric Christopherdc1363f2013-08-08 07:40:37 +00001437 if (Args.getElement(0))
1438 addType(SPDie, DIType(Args.getElement(0)));
Devang Pateldbc64af2011-08-15 17:24:54 +00001439
1440 unsigned VK = SP.getVirtuality();
1441 if (VK) {
Nick Lewycky798313d2011-12-14 00:56:07 +00001442 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
Devang Pateldbc64af2011-08-15 17:24:54 +00001443 DIEBlock *Block = getDIEBlock();
David Blaikie770530b2013-10-21 17:28:37 +00001444 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1445 addUInt(Block, dwarf::DW_FORM_udata, SP.getVirtualIndex());
1446 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, Block);
Eric Christopher61290022013-11-11 18:52:36 +00001447 ContainingTypeMap.insert(
1448 std::make_pair(SPDie, resolve(SP.getContainingType())));
Devang Pateldbc64af2011-08-15 17:24:54 +00001449 }
1450
1451 if (!SP.isDefinition()) {
Eric Christopher873cf0a2012-08-24 01:14:27 +00001452 addFlag(SPDie, dwarf::DW_AT_declaration);
Eric Christopher8b4310b2012-11-21 00:34:38 +00001453
Devang Pateldbc64af2011-08-15 17:24:54 +00001454 // Add arguments. Do not add arguments for subprogram definition. They will
1455 // be handled while processing variables.
Eric Christopher6efc0432013-10-19 01:04:47 +00001456 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
Manman Ren1a5e7872013-10-29 00:53:03 +00001457 DIE *Arg = createAndAddDIE(dwarf::DW_TAG_formal_parameter, *SPDie);
David Blaikie4adba522013-11-18 23:33:32 +00001458 DIType ATy(Args.getElement(i));
David Blaikie3d331842013-05-22 23:22:18 +00001459 addType(Arg, ATy);
1460 if (ATy.isArtificial())
1461 addFlag(Arg, dwarf::DW_AT_artificial);
David Blaikie3d331842013-05-22 23:22:18 +00001462 }
Devang Pateldbc64af2011-08-15 17:24:54 +00001463 }
1464
1465 if (SP.isArtificial())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001466 addFlag(SPDie, dwarf::DW_AT_artificial);
Devang Pateldbc64af2011-08-15 17:24:54 +00001467
1468 if (!SP.isLocalToUnit())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001469 addFlag(SPDie, dwarf::DW_AT_external);
Devang Pateldbc64af2011-08-15 17:24:54 +00001470
1471 if (SP.isOptimized())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001472 addFlag(SPDie, dwarf::DW_AT_APPLE_optimized);
Devang Pateldbc64af2011-08-15 17:24:54 +00001473
1474 if (unsigned isa = Asm->getISAEncoding()) {
1475 addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1476 }
1477
1478 return SPDie;
1479}
1480
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001481// Return const expression if value is a GEP to access merged global
1482// constant. e.g.
1483// i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
1484static const ConstantExpr *getMergedGlobalExpr(const Value *V) {
1485 const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
1486 if (!CE || CE->getNumOperands() != 3 ||
1487 CE->getOpcode() != Instruction::GetElementPtr)
1488 return NULL;
1489
1490 // First operand points to a global struct.
1491 Value *Ptr = CE->getOperand(0);
1492 if (!isa<GlobalValue>(Ptr) ||
1493 !isa<StructType>(cast<PointerType>(Ptr->getType())->getElementType()))
1494 return NULL;
1495
1496 // Second operand is zero.
1497 const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
1498 if (!CI || !CI->isZero())
1499 return NULL;
1500
1501 // Third operand is offset.
1502 if (!isa<ConstantInt>(CE->getOperand(2)))
1503 return NULL;
1504
1505 return CE;
1506}
1507
1508/// createGlobalVariableDIE - create global variable DIE.
David Blaikie08e51e12013-11-17 21:55:13 +00001509void CompileUnit::createGlobalVariableDIE(DIGlobalVariable GV) {
David Blaikiecbc85a22013-11-15 23:09:13 +00001510
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001511 // Check for pre-existence.
David Blaikiecbc85a22013-11-15 23:09:13 +00001512 if (getDIE(GV))
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001513 return;
1514
Manman Rend03d2b22013-07-08 18:33:29 +00001515 if (!GV.isGlobalVariable())
Devang Patel28bea082011-08-18 23:17:55 +00001516 return;
1517
Eric Christopherccb66362013-10-04 23:49:26 +00001518 DIScope GVContext = GV.getContext();
Eric Christopher6b6061f2013-01-16 01:22:23 +00001519 DIType GTy = GV.getType();
1520
1521 // If this is a static data member definition, some attributes belong
1522 // to the declaration DIE.
1523 DIE *VariableDIE = NULL;
Manman Ren945e8282013-02-01 23:54:37 +00001524 bool IsStaticMember = false;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001525 DIDerivedType SDMDecl = GV.getStaticDataMemberDeclaration();
1526 if (SDMDecl.Verify()) {
1527 assert(SDMDecl.isStaticMember() && "Expected static member decl");
1528 // We need the declaration DIE that is in the static member's class.
Manman Ren655a10d2013-10-14 20:33:57 +00001529 VariableDIE = getOrCreateStaticMemberDIE(SDMDecl);
Manman Ren945e8282013-02-01 23:54:37 +00001530 IsStaticMember = true;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001531 }
1532
1533 // If this is not a static data member definition, create the variable
1534 // DIE and add the initial set of attributes to it.
1535 if (!VariableDIE) {
Manman Ren6b713802013-10-29 05:49:41 +00001536 // Construct the context before querying for the existence of the DIE in
1537 // case such construction creates the DIE.
1538 DIE *ContextDIE = getOrCreateContextDIE(GVContext);
Manman Ren6b713802013-10-29 05:49:41 +00001539
Eric Christopher6b6061f2013-01-16 01:22:23 +00001540 // Add to map.
David Blaikie1dc27232013-11-16 00:29:01 +00001541 VariableDIE = createAndAddDIE(GV.getTag(), *ContextDIE, GV);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001542
1543 // Add name and type.
1544 addString(VariableDIE, dwarf::DW_AT_name, GV.getDisplayName());
1545 addType(VariableDIE, GTy);
1546
1547 // Add scoping info.
Eric Christophera486f552013-10-16 01:37:49 +00001548 if (!GV.isLocalToUnit())
Eric Christopher6b6061f2013-01-16 01:22:23 +00001549 addFlag(VariableDIE, dwarf::DW_AT_external);
1550
1551 // Add line number info.
1552 addSourceLine(VariableDIE, GV);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001553 }
1554
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001555 // Add location.
Eric Christopher09ac3d82011-11-07 09:24:32 +00001556 bool addToAccelTable = false;
Eric Christopherd61c34b2011-11-11 03:16:32 +00001557 DIE *VariableSpecDIE = NULL;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001558 bool isGlobalVariable = GV.getGlobal() != NULL;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001559 if (isGlobalVariable) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001560 addToAccelTable = true;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001561 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Rafael Espindolaffc7dca2013-10-29 17:07:16 +00001562 const MCSymbol *Sym = Asm->getSymbol(GV.getGlobal());
David Blaikie59eaa382013-06-28 20:05:11 +00001563 if (GV.getGlobal()->isThreadLocal()) {
1564 // FIXME: Make this work with -gsplit-dwarf.
1565 unsigned PointerSize = Asm->getDataLayout().getPointerSize();
1566 assert((PointerSize == 4 || PointerSize == 8) &&
1567 "Add support for other sizes if necessary");
Ulrich Weigand716a94f2013-07-02 18:47:09 +00001568 const MCExpr *Expr =
David Blaikie8fed05e2013-07-01 23:55:52 +00001569 Asm->getObjFileLowering().getDebugThreadLocalSymbol(Sym);
David Blaikie59eaa382013-06-28 20:05:11 +00001570 // Based on GCC's support for TLS:
David Blaikie8fed05e2013-07-01 23:55:52 +00001571 if (!DD->useSplitDwarf()) {
1572 // 1) Start with a constNu of the appropriate pointer size
David Blaikie770530b2013-10-21 17:28:37 +00001573 addUInt(Block, dwarf::DW_FORM_data1,
David Blaikie8fed05e2013-07-01 23:55:52 +00001574 PointerSize == 4 ? dwarf::DW_OP_const4u : dwarf::DW_OP_const8u);
Richard Mitton379f76e2013-10-07 18:39:18 +00001575 // 2) containing the (relocated) offset of the TLS variable
1576 // within the module's TLS block.
David Blaikie770530b2013-10-21 17:28:37 +00001577 addExpr(Block, dwarf::DW_FORM_udata, Expr);
David Blaikie8fed05e2013-07-01 23:55:52 +00001578 } else {
David Blaikie770530b2013-10-21 17:28:37 +00001579 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_const_index);
1580 addUInt(Block, dwarf::DW_FORM_udata, DU->getAddrPoolIndex(Expr));
David Blaikie8fed05e2013-07-01 23:55:52 +00001581 }
Richard Mitton379f76e2013-10-07 18:39:18 +00001582 // 3) followed by a custom OP to make the debugger do a TLS lookup.
David Blaikie770530b2013-10-21 17:28:37 +00001583 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_push_tls_address);
David Blaikie59eaa382013-06-28 20:05:11 +00001584 } else
1585 addOpAddress(Block, Sym);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001586 // Do not create specification DIE if context is either compile unit
1587 // or a subprogram.
Devang Patel1dd4e562011-09-21 23:41:11 +00001588 if (GVContext && GV.isDefinition() && !GVContext.isCompileUnit() &&
Manman Ren02d29672013-09-09 19:05:21 +00001589 !GVContext.isFile() && !DD->isSubprogramContext(GVContext)) {
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001590 // Create specification DIE.
David Blaikie21c97082013-11-16 00:28:15 +00001591 VariableSpecDIE = createAndAddDIE(dwarf::DW_TAG_variable, *CUDie);
Manman Ren87b110a2013-10-11 23:58:05 +00001592 addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification, VariableDIE);
David Blaikie770530b2013-10-21 17:28:37 +00001593 addBlock(VariableSpecDIE, dwarf::DW_AT_location, Block);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001594 // A static member's declaration is already flagged as such.
1595 if (!SDMDecl.Verify())
1596 addFlag(VariableDIE, dwarf::DW_AT_declaration);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001597 } else {
David Blaikie770530b2013-10-21 17:28:37 +00001598 addBlock(VariableDIE, dwarf::DW_AT_location, Block);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001599 }
Michael Gottesmandc42d032013-09-04 04:39:38 +00001600 // Add the linkage name.
Eric Christopher6b6061f2013-01-16 01:22:23 +00001601 StringRef LinkageName = GV.getLinkageName();
Michael Gottesmandc42d032013-09-04 04:39:38 +00001602 if (!LinkageName.empty())
Eric Christopher8d45a982013-02-27 23:49:47 +00001603 // From DWARF4: DIEs to which DW_AT_linkage_name may apply include:
1604 // TAG_common_block, TAG_constant, TAG_entry_point, TAG_subprogram and
1605 // TAG_variable.
Eric Christopher6efc0432013-10-19 01:04:47 +00001606 addString(IsStaticMember && VariableSpecDIE ? VariableSpecDIE
1607 : VariableDIE,
1608 dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c2b4be2013-06-01 17:51:14 +00001609 GlobalValue::getRealLinkageName(LinkageName));
Eric Christopher8b4310b2012-11-21 00:34:38 +00001610 } else if (const ConstantInt *CI =
Eric Christopher6efc0432013-10-19 01:04:47 +00001611 dyn_cast_or_null<ConstantInt>(GV.getConstant())) {
Adrian Prantl2e892e42013-04-04 22:56:49 +00001612 // AT_const_value was added when the static member was created. To avoid
Manman Ren945e8282013-02-01 23:54:37 +00001613 // emitting AT_const_value multiple times, we only add AT_const_value when
1614 // it is not a static member.
1615 if (!IsStaticMember)
Manman Renc664d762013-10-05 01:43:03 +00001616 addConstantValue(VariableDIE, CI, isUnsignedDIType(DD, GTy));
David Blaikie08e51e12013-11-17 21:55:13 +00001617 } else if (const ConstantExpr *CE = getMergedGlobalExpr(GV->getOperand(11))) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001618 addToAccelTable = true;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001619 // GV is a merged global.
1620 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1621 Value *Ptr = CE->getOperand(0);
Rafael Espindolaffc7dca2013-10-29 17:07:16 +00001622 addOpAddress(Block, Asm->getSymbol(cast<GlobalValue>(Ptr)));
David Blaikie770530b2013-10-21 17:28:37 +00001623 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
Eric Christopher6efc0432013-10-19 01:04:47 +00001624 SmallVector<Value *, 3> Idx(CE->op_begin() + 1, CE->op_end());
David Blaikie770530b2013-10-21 17:28:37 +00001625 addUInt(Block, dwarf::DW_FORM_udata,
Eric Christopher6efc0432013-10-19 01:04:47 +00001626 Asm->getDataLayout().getIndexedOffset(Ptr->getType(), Idx));
David Blaikie770530b2013-10-21 17:28:37 +00001627 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1628 addBlock(VariableDIE, dwarf::DW_AT_location, Block);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001629 }
1630
Eric Christopherd117fbb2011-11-11 01:55:22 +00001631 if (addToAccelTable) {
1632 DIE *AddrDIE = VariableSpecDIE ? VariableSpecDIE : VariableDIE;
1633 addAccelName(GV.getName(), AddrDIE);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001634
Eric Christopherd117fbb2011-11-11 01:55:22 +00001635 // If the linkage name is different than the name, go ahead and output
1636 // that as well into the name table.
1637 if (GV.getLinkageName() != "" && GV.getName() != GV.getLinkageName())
1638 addAccelName(GV.getLinkageName(), AddrDIE);
1639 }
Eric Christophera486f552013-10-16 01:37:49 +00001640
1641 if (!GV.isLocalToUnit())
Eric Christopher91986572013-10-17 02:06:06 +00001642 addGlobalName(GV.getName(), VariableSpecDIE ? VariableSpecDIE : VariableDIE,
1643 GV.getContext());
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001644}
1645
Devang Patel161b2f42011-04-12 23:21:44 +00001646/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
Eric Christopher4d069bf2012-05-22 18:45:24 +00001647void CompileUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR,
1648 DIE *IndexTy) {
Manman Ren1a5e7872013-10-29 00:53:03 +00001649 DIE *DW_Subrange = createAndAddDIE(dwarf::DW_TAG_subrange_type, Buffer);
Manman Ren87b110a2013-10-11 23:58:05 +00001650 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, IndexTy);
Devang Patel161b2f42011-04-12 23:21:44 +00001651
Bill Wendling222c2fd2012-12-06 07:38:10 +00001652 // The LowerBound value defines the lower bounds which is typically zero for
1653 // C/C++. The Count value is the number of elements. Values are 64 bit. If
1654 // Count == -1 then the array is unbounded and we do not emit
1655 // DW_AT_lower_bound and DW_AT_upper_bound attributes. If LowerBound == 0 and
1656 // Count == 0, then the array has zero elements in which case we do not emit
1657 // an upper bound.
1658 int64_t LowerBound = SR.getLo();
Bill Wendling6afe4782012-12-06 07:55:19 +00001659 int64_t DefaultLowerBound = getDefaultLowerBound();
Bill Wendling9493dae2012-12-04 21:34:03 +00001660 int64_t Count = SR.getCount();
Devang Patel161b2f42011-04-12 23:21:44 +00001661
Bill Wendling6afe4782012-12-06 07:55:19 +00001662 if (DefaultLowerBound == -1 || LowerBound != DefaultLowerBound)
David Blaikie770530b2013-10-21 17:28:37 +00001663 addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, None, LowerBound);
Bill Wendling222c2fd2012-12-06 07:38:10 +00001664
1665 if (Count != -1 && Count != 0)
Bill Wendling9493dae2012-12-04 21:34:03 +00001666 // FIXME: An unbounded array should reference the expression that defines
1667 // the array.
Eric Christopher61290022013-11-11 18:52:36 +00001668 addUInt(DW_Subrange, dwarf::DW_AT_upper_bound, None,
1669 LowerBound + Count - 1);
Devang Patel161b2f42011-04-12 23:21:44 +00001670}
1671
1672/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
Eric Christopher883ed6b2013-11-11 18:52:31 +00001673void CompileUnit::constructArrayTypeDIE(DIE &Buffer, DICompositeType CTy) {
1674 if (CTy.isVector())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001675 addFlag(&Buffer, dwarf::DW_AT_GNU_vector);
Devang Patel161b2f42011-04-12 23:21:44 +00001676
Eric Christopherdc1363f2013-08-08 07:40:37 +00001677 // Emit the element type.
Eric Christopher883ed6b2013-11-11 18:52:31 +00001678 addType(&Buffer, resolve(CTy.getTypeDerivedFrom()));
Devang Patel161b2f42011-04-12 23:21:44 +00001679
1680 // Get an anonymous type for index type.
Eric Christopher8cab6ed2013-01-04 21:51:53 +00001681 // FIXME: This type should be passed down from the front end
1682 // as different languages may have different sizes for indexes.
Devang Patel161b2f42011-04-12 23:21:44 +00001683 DIE *IdxTy = getIndexTyDie();
1684 if (!IdxTy) {
1685 // Construct an anonymous type for index type.
Manman Ren1a5e7872013-10-29 00:53:03 +00001686 IdxTy = createAndAddDIE(dwarf::DW_TAG_base_type, *CUDie.get());
Eric Christopher8cab6ed2013-01-04 21:51:53 +00001687 addString(IdxTy, dwarf::DW_AT_name, "int");
David Blaikie770530b2013-10-21 17:28:37 +00001688 addUInt(IdxTy, dwarf::DW_AT_byte_size, None, sizeof(int32_t));
Devang Patel161b2f42011-04-12 23:21:44 +00001689 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1690 dwarf::DW_ATE_signed);
Devang Patel161b2f42011-04-12 23:21:44 +00001691 setIndexTyDie(IdxTy);
1692 }
1693
1694 // Add subranges to array type.
Eric Christopher883ed6b2013-11-11 18:52:31 +00001695 DIArray Elements = CTy.getTypeArray();
Devang Patel161b2f42011-04-12 23:21:44 +00001696 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1697 DIDescriptor Element = Elements.getElement(i);
1698 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1699 constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1700 }
1701}
1702
Eric Christopher95339892013-11-11 18:52:39 +00001703/// constructEnumTypeDIE - Construct an enum type DIE from DICompositeType.
1704void CompileUnit::constructEnumTypeDIE(DIE &Buffer, DICompositeType CTy) {
1705 DIArray Elements = CTy.getTypeArray();
1706
1707 // Add enumerators to enumeration type.
1708 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
David Blaikie4adba522013-11-18 23:33:32 +00001709 DIEnumerator Enum(Elements.getElement(i));
Eric Christopher95339892013-11-11 18:52:39 +00001710 if (Enum.isEnumerator()) {
1711 DIE *Enumerator = createAndAddDIE(dwarf::DW_TAG_enumerator, Buffer);
David Blaikie4adba522013-11-18 23:33:32 +00001712 StringRef Name = Enum.getName();
Eric Christopher95339892013-11-11 18:52:39 +00001713 addString(Enumerator, dwarf::DW_AT_name, Name);
David Blaikie4adba522013-11-18 23:33:32 +00001714 int64_t Value = Enum.getEnumValue();
Eric Christopher95339892013-11-11 18:52:39 +00001715 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
1716 }
1717 }
1718 DIType DTy = resolve(CTy.getTypeDerivedFrom());
1719 if (DTy) {
1720 addType(&Buffer, DTy);
1721 addFlag(&Buffer, dwarf::DW_AT_enum_class);
1722 }
Devang Patel161b2f42011-04-12 23:21:44 +00001723}
1724
Devang Pateldbc64af2011-08-15 17:24:54 +00001725/// constructContainingTypeDIEs - Construct DIEs for types that contain
1726/// vtables.
1727void CompileUnit::constructContainingTypeDIEs() {
1728 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
Eric Christopher6efc0432013-10-19 01:04:47 +00001729 CE = ContainingTypeMap.end();
1730 CI != CE; ++CI) {
Devang Pateldbc64af2011-08-15 17:24:54 +00001731 DIE *SPDie = CI->first;
David Blaikiecbc85a22013-11-15 23:09:13 +00001732 DIDescriptor D(CI->second);
1733 if (!D)
Eric Christopher6efc0432013-10-19 01:04:47 +00001734 continue;
David Blaikiecbc85a22013-11-15 23:09:13 +00001735 DIE *NDie = getDIE(D);
Eric Christopher6efc0432013-10-19 01:04:47 +00001736 if (!NDie)
1737 continue;
Manman Ren87b110a2013-10-11 23:58:05 +00001738 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, NDie);
Devang Pateldbc64af2011-08-15 17:24:54 +00001739 }
1740}
1741
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001742/// constructVariableDIE - Construct a DIE for the given DbgVariable.
Eric Christopher7b641812013-11-15 01:43:19 +00001743DIE *CompileUnit::constructVariableDIE(DbgVariable &DV, bool isScopeAbstract) {
1744 StringRef Name = DV.getName();
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001745
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001746 // Define variable debug information entry.
Eric Christopher7b641812013-11-15 01:43:19 +00001747 DIE *VariableDie = new DIE(DV.getTag());
1748 DbgVariable *AbsVar = DV.getAbstractVariable();
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001749 DIE *AbsDIE = AbsVar ? AbsVar->getDIE() : NULL;
Manman Ren742671b2013-05-29 17:16:59 +00001750 if (AbsDIE)
Manman Ren87b110a2013-10-11 23:58:05 +00001751 addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin, AbsDIE);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001752 else {
David Blaikie2883fd42013-08-19 03:34:03 +00001753 if (!Name.empty())
1754 addString(VariableDie, dwarf::DW_AT_name, Name);
Eric Christopher7b641812013-11-15 01:43:19 +00001755 addSourceLine(VariableDie, DV.getVariable());
1756 addType(VariableDie, DV.getType());
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001757 }
1758
Eric Christopher7b641812013-11-15 01:43:19 +00001759 if (DV.isArtificial())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001760 addFlag(VariableDie, dwarf::DW_AT_artificial);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001761
1762 if (isScopeAbstract) {
Eric Christopher7b641812013-11-15 01:43:19 +00001763 DV.setDIE(VariableDie);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001764 return VariableDie;
1765 }
1766
1767 // Add variable address.
1768
Eric Christopher7b641812013-11-15 01:43:19 +00001769 unsigned Offset = DV.getDotDebugLocOffset();
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001770 if (Offset != ~0U) {
Eric Christopher87fd14d2013-11-16 00:18:40 +00001771 addLabel(VariableDie, dwarf::DW_AT_location,
1772 DD->getDwarfVersion() >= 4 ? dwarf::DW_FORM_sec_offset
1773 : dwarf::DW_FORM_data4,
Eric Christopherafbe0e22013-06-24 21:34:55 +00001774 Asm->GetTempSymbol("debug_loc", Offset));
Eric Christopher7b641812013-11-15 01:43:19 +00001775 DV.setDIE(VariableDie);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001776 return VariableDie;
1777 }
1778
Eric Christopher8cf5e742011-10-03 15:49:20 +00001779 // Check if variable is described by a DBG_VALUE instruction.
Eric Christopher7b641812013-11-15 01:43:19 +00001780 if (const MachineInstr *DVInsn = DV.getMInsn()) {
David Blaikie6d9dbd52013-06-16 20:34:15 +00001781 assert(DVInsn->getNumOperands() == 3);
1782 if (DVInsn->getOperand(0).isReg()) {
1783 const MachineOperand RegOp = DVInsn->getOperand(0);
Adrian Prantlb2754912013-07-09 21:44:06 +00001784 // If the second operand is an immediate, this is an indirect value.
Adrian Prantl35176402013-07-09 20:28:37 +00001785 if (DVInsn->getOperand(1).isImm()) {
Eric Christopher6efc0432013-10-19 01:04:47 +00001786 MachineLocation Location(RegOp.getReg(),
1787 DVInsn->getOperand(1).getImm());
Eric Christopher7b641812013-11-15 01:43:19 +00001788 addVariableAddress(DV, VariableDie, Location);
David Blaikie6d9dbd52013-06-16 20:34:15 +00001789 } else if (RegOp.getReg())
Eric Christopher7b641812013-11-15 01:43:19 +00001790 addVariableAddress(DV, VariableDie, MachineLocation(RegOp.getReg()));
David Blaikie6d9dbd52013-06-16 20:34:15 +00001791 } else if (DVInsn->getOperand(0).isImm())
Eric Christopher7b641812013-11-15 01:43:19 +00001792 addConstantValue(VariableDie, DVInsn->getOperand(0), DV.getType());
David Blaikie6d9dbd52013-06-16 20:34:15 +00001793 else if (DVInsn->getOperand(0).isFPImm())
Eric Christophere4721492013-07-03 01:08:30 +00001794 addConstantFPValue(VariableDie, DVInsn->getOperand(0));
David Blaikie6d9dbd52013-06-16 20:34:15 +00001795 else if (DVInsn->getOperand(0).isCImm())
Eric Christophere4721492013-07-03 01:08:30 +00001796 addConstantValue(VariableDie, DVInsn->getOperand(0).getCImm(),
Eric Christopher7b641812013-11-15 01:43:19 +00001797 isUnsignedDIType(DD, DV.getType()));
Eric Christophere4721492013-07-03 01:08:30 +00001798
Eric Christopher7b641812013-11-15 01:43:19 +00001799 DV.setDIE(VariableDie);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001800 return VariableDie;
1801 } else {
1802 // .. else use frame index.
Eric Christopher7b641812013-11-15 01:43:19 +00001803 int FI = DV.getFrameIndex();
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001804 if (FI != ~0) {
1805 unsigned FrameReg = 0;
1806 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
Eric Christopher6efc0432013-10-19 01:04:47 +00001807 int Offset = TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001808 MachineLocation Location(FrameReg, Offset);
Eric Christopher7b641812013-11-15 01:43:19 +00001809 addVariableAddress(DV, VariableDie, Location);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001810 }
1811 }
1812
Eric Christopher7b641812013-11-15 01:43:19 +00001813 DV.setDIE(VariableDie);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001814 return VariableDie;
1815}
1816
Manman Rena1d25b62013-10-23 23:00:44 +00001817/// constructMemberDIE - Construct member DIE from DIDerivedType.
1818void CompileUnit::constructMemberDIE(DIE &Buffer, DIDerivedType DT) {
Manman Ren1a5e7872013-10-29 00:53:03 +00001819 DIE *MemberDie = createAndAddDIE(DT.getTag(), Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +00001820 StringRef Name = DT.getName();
1821 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001822 addString(MemberDie, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001823
Manman Ren017ceda2013-10-08 18:42:58 +00001824 addType(MemberDie, resolve(DT.getTypeDerivedFrom()));
Devang Patel161b2f42011-04-12 23:21:44 +00001825
1826 addSourceLine(MemberDie, DT);
1827
1828 DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
David Blaikie770530b2013-10-21 17:28:37 +00001829 addUInt(MemLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
Devang Patel161b2f42011-04-12 23:21:44 +00001830
Eric Christopher6efc0432013-10-19 01:04:47 +00001831 if (DT.getTag() == dwarf::DW_TAG_inheritance && DT.isVirtual()) {
Devang Patel161b2f42011-04-12 23:21:44 +00001832
1833 // For C++, virtual base classes are not at fixed offset. Use following
1834 // expression to extract appropriate offset from vtable.
1835 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1836
1837 DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
David Blaikie770530b2013-10-21 17:28:37 +00001838 addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1839 addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1840 addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1841 addUInt(VBaseLocationDie, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1842 addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1843 addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1844 addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
Devang Patel161b2f42011-04-12 23:21:44 +00001845
David Blaikie770530b2013-10-21 17:28:37 +00001846 addBlock(MemberDie, dwarf::DW_AT_data_member_location, VBaseLocationDie);
David Blaikie9b933922013-11-01 00:25:45 +00001847 } else {
1848 uint64_t Size = DT.getSizeInBits();
1849 uint64_t FieldSize = getBaseTypeSize(DD, DT);
1850 uint64_t OffsetInBytes;
1851
1852 if (Size != FieldSize) {
1853 // Handle bitfield.
1854 addUInt(MemberDie, dwarf::DW_AT_byte_size, None,
1855 getBaseTypeSize(DD, DT) >> 3);
1856 addUInt(MemberDie, dwarf::DW_AT_bit_size, None, DT.getSizeInBits());
1857
1858 uint64_t Offset = DT.getOffsetInBits();
1859 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1860 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1861 uint64_t FieldOffset = (HiMark - FieldSize);
1862 Offset -= FieldOffset;
1863
1864 // Maybe we need to work from the other end.
1865 if (Asm->getDataLayout().isLittleEndian())
1866 Offset = FieldSize - (Offset + Size);
1867 addUInt(MemberDie, dwarf::DW_AT_bit_offset, None, Offset);
1868
1869 // Here WD_AT_data_member_location points to the anonymous
1870 // field that includes this bit field.
1871 OffsetInBytes = FieldOffset >> 3;
1872 } else
1873 // This is not a bitfield.
1874 OffsetInBytes = DT.getOffsetInBits() >> 3;
Eric Christopher61290022013-11-11 18:52:36 +00001875 addUInt(MemberDie, dwarf::DW_AT_data_member_location, None, OffsetInBytes);
David Blaikie9b933922013-11-01 00:25:45 +00001876 }
Devang Patel161b2f42011-04-12 23:21:44 +00001877
1878 if (DT.isProtected())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001879 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001880 dwarf::DW_ACCESS_protected);
1881 else if (DT.isPrivate())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001882 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001883 dwarf::DW_ACCESS_private);
1884 // Otherwise C++ member and base classes are considered public.
Eric Christopher8b4310b2012-11-21 00:34:38 +00001885 else
Nick Lewycky13aaca52011-12-13 05:09:11 +00001886 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001887 dwarf::DW_ACCESS_public);
1888 if (DT.isVirtual())
Nick Lewycky798313d2011-12-14 00:56:07 +00001889 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001890 dwarf::DW_VIRTUALITY_virtual);
Devang Patele9db5e22011-04-16 00:11:51 +00001891
1892 // Objective-C properties.
Devang Patel6588abf2012-02-06 17:49:43 +00001893 if (MDNode *PNode = DT.getObjCProperty())
1894 if (DIEEntry *PropertyDie = getDIEEntry(PNode))
Eric Christopher8b4310b2012-11-21 00:34:38 +00001895 MemberDie->addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4,
Devang Patel6588abf2012-02-06 17:49:43 +00001896 PropertyDie);
1897
David Blaikie01bc2b32012-12-13 22:43:07 +00001898 if (DT.isArtificial())
1899 addFlag(MemberDie, dwarf::DW_AT_artificial);
Devang Patel161b2f42011-04-12 23:21:44 +00001900}
Eric Christopher6b6061f2013-01-16 01:22:23 +00001901
Manman Ren655a10d2013-10-14 20:33:57 +00001902/// getOrCreateStaticMemberDIE - Create new DIE for C++ static member.
David Blaikiecbc85a22013-11-15 23:09:13 +00001903DIE *CompileUnit::getOrCreateStaticMemberDIE(DIDerivedType DT) {
Eric Christopher6b6061f2013-01-16 01:22:23 +00001904 if (!DT.Verify())
1905 return NULL;
1906
Manman Ren655a10d2013-10-14 20:33:57 +00001907 // Construct the context before querying for the existence of the DIE in case
1908 // such construction creates the DIE.
1909 DIE *ContextDIE = getOrCreateContextDIE(resolve(DT.getContext()));
David Blaikie8c0fecc2013-11-14 21:24:34 +00001910 assert(dwarf::isType(ContextDIE->getTag()) &&
1911 "Static member should belong to a type.");
Manman Ren655a10d2013-10-14 20:33:57 +00001912
1913 DIE *StaticMemberDIE = getDIE(DT);
1914 if (StaticMemberDIE)
1915 return StaticMemberDIE;
1916
Manman Ren1a5e7872013-10-29 00:53:03 +00001917 StaticMemberDIE = createAndAddDIE(DT.getTag(), *ContextDIE, DT);
Manman Ren655a10d2013-10-14 20:33:57 +00001918
Manman Ren017ceda2013-10-08 18:42:58 +00001919 DIType Ty = resolve(DT.getTypeDerivedFrom());
Eric Christopher6b6061f2013-01-16 01:22:23 +00001920
1921 addString(StaticMemberDIE, dwarf::DW_AT_name, DT.getName());
1922 addType(StaticMemberDIE, Ty);
1923 addSourceLine(StaticMemberDIE, DT);
1924 addFlag(StaticMemberDIE, dwarf::DW_AT_external);
1925 addFlag(StaticMemberDIE, dwarf::DW_AT_declaration);
1926
1927 // FIXME: We could omit private if the parent is a class_type, and
1928 // public if the parent is something else.
1929 if (DT.isProtected())
1930 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1931 dwarf::DW_ACCESS_protected);
1932 else if (DT.isPrivate())
1933 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1934 dwarf::DW_ACCESS_private);
1935 else
1936 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1937 dwarf::DW_ACCESS_public);
1938
1939 if (const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(DT.getConstant()))
Manman Renc664d762013-10-05 01:43:03 +00001940 addConstantValue(StaticMemberDIE, CI, isUnsignedDIType(DD, Ty));
David Blaikie14268412013-01-20 01:18:01 +00001941 if (const ConstantFP *CFP = dyn_cast_or_null<ConstantFP>(DT.getConstant()))
1942 addConstantFPValue(StaticMemberDIE, CFP);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001943
Eric Christopher6b6061f2013-01-16 01:22:23 +00001944 return StaticMemberDIE;
1945}
David Blaikie1d361132013-10-30 20:42:41 +00001946
1947void CompileUnit::emitHeader(const MCSection *ASection,
1948 const MCSymbol *ASectionSym) {
1949 Asm->OutStreamer.AddComment("DWARF version number");
1950 Asm->EmitInt16(DD->getDwarfVersion());
1951 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
1952 Asm->EmitSectionOffset(Asm->GetTempSymbol(ASection->getLabelBeginName()),
1953 ASectionSym);
1954 Asm->OutStreamer.AddComment("Address Size (in bytes)");
1955 Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
1956}