blob: 282b69cd6ad3f27db57a775e981053b9a0b6928a [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.
Eric Christopher7b878952013-08-26 23:50:38 +000036CompileUnit::CompileUnit(unsigned UID, DIE *D, const MDNode *N, AsmPrinter *A,
37 DwarfDebug *DW, DwarfUnits *DWU)
Manman Ren3eabc2a2013-10-29 22:57:10 +000038 : UniqueID(UID), Node(N), CUDie(D), Asm(A), DD(DW), DU(DWU), IndexTyDie(0),
39 DebugInfoOffset(0) {
Devang Patel161b2f42011-04-12 23:21:44 +000040 DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
Eric Christopher9c57ad22013-05-08 00:58:51 +000041 insertDIE(N, 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 {
Eric Christopher7b878952013-08-26 23:50:38 +000060 switch (DICompileUnit(Node).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.
102static bool isShareableAcrossCUs(const MDNode *N) {
103 // When the MDNode can be part of the type system, the DIE can be
104 // shared across CUs.
105 return DIDescriptor(N).isType() ||
106 (DIDescriptor(N).isSubprogram() && !DISubprogram(N).isDefinition());
107}
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.
113DIE *CompileUnit::getDIE(const MDNode *N) const {
114 if (isShareableAcrossCUs(N))
115 return DD->getDIE(N);
116 return MDNodeToDieMap.lookup(N);
117}
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.
122void CompileUnit::insertDIE(const MDNode *N, DIE *D) {
123 if (isShareableAcrossCUs(N)) {
124 DD->insertDIE(N, D);
125 return;
126 }
127 MDNodeToDieMap.insert(std::make_pair(N, D));
128}
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.
David Blaikie770530b2013-10-21 17:28:37 +0000173void CompileUnit::addString(DIE *Die, dwarf::Attribute Attribute, StringRef String) {
Eric Christopher3dee5752013-07-26 17:02:41 +0000174 DIEValue *Value;
David Blaikie770530b2013-10-21 17:28:37 +0000175 dwarf::Form Form;
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000176 if (!DD->useSplitDwarf()) {
177 MCSymbol *Symb = DU->getStringPoolEntry(String);
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000178 if (Asm->needsRelocationsForDwarfStringPool())
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000179 Value = new (DIEValueAllocator) DIELabel(Symb);
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000180 else {
181 MCSymbol *StringPool = DU->getStringPoolSym();
182 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
183 }
Eric Christopher3dee5752013-07-26 17:02:41 +0000184 Form = dwarf::DW_FORM_strp;
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000185 } else {
186 unsigned idx = DU->getStringPoolIndex(String);
Eric Christopher3dee5752013-07-26 17:02:41 +0000187 Value = new (DIEValueAllocator) DIEInteger(idx);
188 Form = dwarf::DW_FORM_GNU_str_index;
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000189 }
Eric Christopher3dee5752013-07-26 17:02:41 +0000190 DIEValue *Str = new (DIEValueAllocator) DIEString(Value, String);
191 Die->addValue(Attribute, Form, Str);
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000192}
193
194/// addLocalString - Add a string attribute data and value. This is guaranteed
195/// to be in the local string pool instead of indirected.
David Blaikie770530b2013-10-21 17:28:37 +0000196void CompileUnit::addLocalString(DIE *Die, dwarf::Attribute Attribute,
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000197 StringRef String) {
Eric Christopher2e5d8702012-12-20 21:58:36 +0000198 MCSymbol *Symb = DU->getStringPoolEntry(String);
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000199 DIEValue *Value;
200 if (Asm->needsRelocationsForDwarfStringPool())
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000201 Value = new (DIEValueAllocator) DIELabel(Symb);
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000202 else {
Eric Christopher2e5d8702012-12-20 21:58:36 +0000203 MCSymbol *StringPool = DU->getStringPoolSym();
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000204 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
Nick Lewycky390c40d2011-10-27 06:44:11 +0000205 }
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000206 Die->addValue(Attribute, dwarf::DW_FORM_strp, Value);
Devang Patel161b2f42011-04-12 23:21:44 +0000207}
208
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000209/// addExpr - Add a Dwarf expression attribute data and value.
Devang Patel161b2f42011-04-12 23:21:44 +0000210///
David Blaikie770530b2013-10-21 17:28:37 +0000211void CompileUnit::addExpr(DIEBlock *Die, dwarf::Form Form, const MCExpr *Expr) {
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000212 DIEValue *Value = new (DIEValueAllocator) DIEExpr(Expr);
David Blaikie770530b2013-10-21 17:28:37 +0000213 Die->addValue((dwarf::Attribute)0, Form, Value);
Devang Patel161b2f42011-04-12 23:21:44 +0000214}
215
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000216/// addLabel - Add a Dwarf label attribute data and value.
217///
David Blaikie770530b2013-10-21 17:28:37 +0000218void CompileUnit::addLabel(DIE *Die, dwarf::Attribute Attribute, dwarf::Form Form,
David Blaikie95e72c92013-06-28 20:05:04 +0000219 const MCSymbol *Label) {
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000220 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
221 Die->addValue(Attribute, Form, Value);
David Blaikie95e72c92013-06-28 20:05:04 +0000222}
223
David Blaikie770530b2013-10-21 17:28:37 +0000224void CompileUnit::addLabel(DIEBlock *Die, dwarf::Form Form,
225 const MCSymbol *Label) {
226 addLabel(Die, (dwarf::Attribute)0, Form, Label);
227}
228
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000229/// addLabelAddress - Add a dwarf label attribute data and value using
230/// DW_FORM_addr or DW_FORM_GNU_addr_index.
231///
David Blaikie770530b2013-10-21 17:28:37 +0000232void CompileUnit::addLabelAddress(DIE *Die, dwarf::Attribute Attribute,
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000233 MCSymbol *Label) {
Alexey Samsonov9d08d692013-10-03 08:54:43 +0000234 if (Label)
235 DD->addArangeLabel(SymbolCU(this, Label));
Richard Mitton5cc319a2013-09-19 23:21:01 +0000236
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000237 if (!DD->useSplitDwarf()) {
238 if (Label != NULL) {
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000239 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000240 Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
241 } else {
242 DIEValue *Value = new (DIEValueAllocator) DIEInteger(0);
243 Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
244 }
245 } else {
246 unsigned idx = DU->getAddrPoolIndex(Label);
247 DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx);
248 Die->addValue(Attribute, dwarf::DW_FORM_GNU_addr_index, Value);
249 }
250}
251
Eric Christopher0969ddf2013-01-18 22:11:33 +0000252/// addOpAddress - Add a dwarf op address data and value using the
253/// form given and an op of either DW_FORM_addr or DW_FORM_GNU_addr_index.
254///
David Blaikie770530b2013-10-21 17:28:37 +0000255void CompileUnit::addOpAddress(DIEBlock *Die, const MCSymbol *Sym) {
Alexey Samsonov9d08d692013-10-03 08:54:43 +0000256 DD->addArangeLabel(SymbolCU(this, Sym));
Eric Christopher0969ddf2013-01-18 22:11:33 +0000257 if (!DD->useSplitDwarf()) {
David Blaikie770530b2013-10-21 17:28:37 +0000258 addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
259 addLabel(Die, dwarf::DW_FORM_udata, Sym);
Eric Christopher0969ddf2013-01-18 22:11:33 +0000260 } else {
David Blaikie770530b2013-10-21 17:28:37 +0000261 addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_addr_index);
262 addUInt(Die, dwarf::DW_FORM_GNU_addr_index, DU->getAddrPoolIndex(Sym));
Eric Christopher0969ddf2013-01-18 22:11:33 +0000263 }
264}
265
Devang Patel161b2f42011-04-12 23:21:44 +0000266/// addDelta - Add a label delta attribute data and value.
267///
David Blaikie770530b2013-10-21 17:28:37 +0000268void CompileUnit::addDelta(DIE *Die, dwarf::Attribute Attribute, dwarf::Form Form,
Devang Patel161b2f42011-04-12 23:21:44 +0000269 const MCSymbol *Hi, const MCSymbol *Lo) {
270 DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
271 Die->addValue(Attribute, Form, Value);
272}
273
274/// addDIEEntry - Add a DIE attribute data and value.
275///
David Blaikie770530b2013-10-21 17:28:37 +0000276void CompileUnit::addDIEEntry(DIE *Die, dwarf::Attribute Attribute, DIE *Entry) {
Manman Renb8b70e12013-10-31 17:54:35 +0000277 addDIEEntry(Die, Attribute, createDIEEntry(Entry));
278}
279
280void CompileUnit::addDIEEntry(DIE *Die, dwarf::Attribute Attribute,
281 DIEEntry *Entry) {
282 const DIE *DieCU = Die->getCompileUnitOrNull();
283 const DIE *EntryCU = Entry->getEntry()->getCompileUnitOrNull();
284 if (!DieCU)
285 // We assume that Die belongs to this CU, if it is not linked to any CU yet.
286 DieCU = getCUDie();
287 if (!EntryCU)
288 EntryCU = getCUDie();
289 Die->addValue(Attribute, EntryCU == DieCU ? dwarf::DW_FORM_ref4
290 : dwarf::DW_FORM_ref_addr,
291 Entry);
Devang Patel161b2f42011-04-12 23:21:44 +0000292}
293
Manman Ren1a5e7872013-10-29 00:53:03 +0000294/// Create a DIE with the given Tag, add the DIE to its parent, and
295/// call insertDIE if MD is not null.
296DIE *CompileUnit::createAndAddDIE(unsigned Tag, DIE &Parent, const MDNode *MD) {
297 DIE *Die = new DIE(Tag);
298 Parent.addChild(Die);
299 if (MD)
300 insertDIE(MD, Die);
301 return Die;
302}
303
Devang Patel161b2f42011-04-12 23:21:44 +0000304/// addBlock - Add block data.
305///
David Blaikie770530b2013-10-21 17:28:37 +0000306void CompileUnit::addBlock(DIE *Die, dwarf::Attribute Attribute,
Devang Patel161b2f42011-04-12 23:21:44 +0000307 DIEBlock *Block) {
308 Block->ComputeSize(Asm);
309 DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
310 Die->addValue(Attribute, Block->BestForm(), Block);
311}
312
313/// addSourceLine - Add location information to specified debug information
314/// entry.
315void CompileUnit::addSourceLine(DIE *Die, DIVariable V) {
316 // Verify variable.
Manman Rend03d2b22013-07-08 18:33:29 +0000317 if (!V.isVariable())
Devang Patel161b2f42011-04-12 23:21:44 +0000318 return;
Eric Christopher8b4310b2012-11-21 00:34:38 +0000319
Devang Patel161b2f42011-04-12 23:21:44 +0000320 unsigned Line = V.getLineNumber();
321 if (Line == 0)
322 return;
Eric Christopher6efc0432013-10-19 01:04:47 +0000323 unsigned FileID =
324 DD->getOrCreateSourceID(V.getContext().getFilename(),
325 V.getContext().getDirectory(), getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000326 assert(FileID && "Invalid file id");
David Blaikie770530b2013-10-21 17:28:37 +0000327 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
328 addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
Devang Patel161b2f42011-04-12 23:21:44 +0000329}
330
331/// addSourceLine - Add location information to specified debug information
332/// entry.
333void CompileUnit::addSourceLine(DIE *Die, DIGlobalVariable G) {
334 // Verify global variable.
Manman Rend03d2b22013-07-08 18:33:29 +0000335 if (!G.isGlobalVariable())
Devang Patel161b2f42011-04-12 23:21:44 +0000336 return;
337
338 unsigned Line = G.getLineNumber();
339 if (Line == 0)
340 return;
Eric Christopher6efc0432013-10-19 01:04:47 +0000341 unsigned FileID =
342 DD->getOrCreateSourceID(G.getFilename(), G.getDirectory(), getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000343 assert(FileID && "Invalid file id");
David Blaikie770530b2013-10-21 17:28:37 +0000344 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
345 addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
Devang Patel161b2f42011-04-12 23:21:44 +0000346}
347
348/// addSourceLine - Add location information to specified debug information
349/// entry.
350void CompileUnit::addSourceLine(DIE *Die, DISubprogram SP) {
351 // Verify subprogram.
Manman Rend03d2b22013-07-08 18:33:29 +0000352 if (!SP.isSubprogram())
Devang Patel161b2f42011-04-12 23:21:44 +0000353 return;
Eric Christopher2125d5a2012-03-15 23:55:40 +0000354
Devang Patel161b2f42011-04-12 23:21:44 +0000355 // If the line number is 0, don't add it.
Eric Christopher2125d5a2012-03-15 23:55:40 +0000356 unsigned Line = SP.getLineNumber();
357 if (Line == 0)
Devang Patel161b2f42011-04-12 23:21:44 +0000358 return;
359
Eric Christopher6efc0432013-10-19 01:04:47 +0000360 unsigned FileID = DD->getOrCreateSourceID(SP.getFilename(), SP.getDirectory(),
361 getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000362 assert(FileID && "Invalid file id");
David Blaikie770530b2013-10-21 17:28:37 +0000363 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
364 addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
Devang Patel161b2f42011-04-12 23:21:44 +0000365}
366
367/// addSourceLine - Add location information to specified debug information
368/// entry.
369void CompileUnit::addSourceLine(DIE *Die, DIType Ty) {
370 // Verify type.
Manman Rend03d2b22013-07-08 18:33:29 +0000371 if (!Ty.isType())
Devang Patel161b2f42011-04-12 23:21:44 +0000372 return;
373
374 unsigned Line = Ty.getLineNumber();
Eric Christopher2125d5a2012-03-15 23:55:40 +0000375 if (Line == 0)
Devang Patel161b2f42011-04-12 23:21:44 +0000376 return;
Eric Christopher6efc0432013-10-19 01:04:47 +0000377 unsigned FileID = DD->getOrCreateSourceID(Ty.getFilename(), Ty.getDirectory(),
378 getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000379 assert(FileID && "Invalid file id");
David Blaikie770530b2013-10-21 17:28:37 +0000380 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
381 addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
Devang Patel161b2f42011-04-12 23:21:44 +0000382}
383
384/// addSourceLine - Add location information to specified debug information
385/// entry.
Eric Christopherb8ca9882012-03-29 08:42:56 +0000386void CompileUnit::addSourceLine(DIE *Die, DIObjCProperty Ty) {
387 // Verify type.
Manman Rend03d2b22013-07-08 18:33:29 +0000388 if (!Ty.isObjCProperty())
Eric Christopherb8ca9882012-03-29 08:42:56 +0000389 return;
390
391 unsigned Line = Ty.getLineNumber();
392 if (Line == 0)
393 return;
394 DIFile File = Ty.getFile();
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000395 unsigned FileID = DD->getOrCreateSourceID(File.getFilename(),
Manman Ren3de61b42013-03-07 01:42:00 +0000396 File.getDirectory(), getUniqueID());
Eric Christopherb8ca9882012-03-29 08:42:56 +0000397 assert(FileID && "Invalid file id");
David Blaikie770530b2013-10-21 17:28:37 +0000398 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
399 addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
Eric Christopherb8ca9882012-03-29 08:42:56 +0000400}
401
402/// addSourceLine - Add location information to specified debug information
403/// entry.
Devang Patel161b2f42011-04-12 23:21:44 +0000404void CompileUnit::addSourceLine(DIE *Die, DINameSpace NS) {
405 // Verify namespace.
406 if (!NS.Verify())
407 return;
408
409 unsigned Line = NS.getLineNumber();
410 if (Line == 0)
411 return;
412 StringRef FN = NS.getFilename();
413
Eric Christopher6efc0432013-10-19 01:04:47 +0000414 unsigned FileID =
415 DD->getOrCreateSourceID(FN, NS.getDirectory(), getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000416 assert(FileID && "Invalid file id");
David Blaikie770530b2013-10-21 17:28:37 +0000417 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
418 addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
Devang Patel161b2f42011-04-12 23:21:44 +0000419}
420
Eric Christopher8b4310b2012-11-21 00:34:38 +0000421/// addVariableAddress - Add DW_AT_location attribute for a
Devang Patele1cdf842011-04-27 22:45:24 +0000422/// DbgVariable based on provided MachineLocation.
Eric Christopherf61dbc12013-06-24 21:07:27 +0000423void CompileUnit::addVariableAddress(const DbgVariable &DV, DIE *Die,
Devang Patele1cdf842011-04-27 22:45:24 +0000424 MachineLocation Location) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000425 if (DV.variableHasComplexAddress())
Devang Patel161b2f42011-04-12 23:21:44 +0000426 addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
Eric Christopherf61dbc12013-06-24 21:07:27 +0000427 else if (DV.isBlockByrefVariable())
Devang Patel161b2f42011-04-12 23:21:44 +0000428 addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location);
429 else
David Blaikie4532c282013-06-20 00:25:24 +0000430 addAddress(Die, dwarf::DW_AT_location, Location,
Eric Christopherf61dbc12013-06-24 21:07:27 +0000431 DV.getVariable().isIndirect());
Devang Patel161b2f42011-04-12 23:21:44 +0000432}
433
Devang Patel116da2f2011-04-26 19:06:18 +0000434/// addRegisterOp - Add register operand.
David Blaikie770530b2013-10-21 17:28:37 +0000435void CompileUnit::addRegisterOp(DIEBlock *TheDie, unsigned Reg) {
Devang Patel116da2f2011-04-26 19:06:18 +0000436 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
437 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
438 if (DWReg < 32)
David Blaikie770530b2013-10-21 17:28:37 +0000439 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + DWReg);
Devang Patel116da2f2011-04-26 19:06:18 +0000440 else {
David Blaikie770530b2013-10-21 17:28:37 +0000441 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
442 addUInt(TheDie, dwarf::DW_FORM_udata, DWReg);
Devang Patel116da2f2011-04-26 19:06:18 +0000443 }
444}
445
446/// addRegisterOffset - Add register offset.
David Blaikie770530b2013-10-21 17:28:37 +0000447void CompileUnit::addRegisterOffset(DIEBlock *TheDie, unsigned Reg,
448 int64_t Offset) {
Devang Patel116da2f2011-04-26 19:06:18 +0000449 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
450 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
451 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
452 if (Reg == TRI->getFrameRegister(*Asm->MF))
453 // If variable offset is based in frame register then use fbreg.
David Blaikie770530b2013-10-21 17:28:37 +0000454 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
Devang Patel116da2f2011-04-26 19:06:18 +0000455 else if (DWReg < 32)
David Blaikie770530b2013-10-21 17:28:37 +0000456 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DWReg);
Devang Patel116da2f2011-04-26 19:06:18 +0000457 else {
David Blaikie770530b2013-10-21 17:28:37 +0000458 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
459 addUInt(TheDie, dwarf::DW_FORM_udata, DWReg);
Devang Patel116da2f2011-04-26 19:06:18 +0000460 }
David Blaikie770530b2013-10-21 17:28:37 +0000461 addSInt(TheDie, dwarf::DW_FORM_sdata, Offset);
Devang Patel116da2f2011-04-26 19:06:18 +0000462}
463
464/// addAddress - Add an address attribute to a die based on the location
465/// provided.
David Blaikie770530b2013-10-21 17:28:37 +0000466void CompileUnit::addAddress(DIE *Die, dwarf::Attribute Attribute,
David Blaikie4532c282013-06-20 00:25:24 +0000467 const MachineLocation &Location, bool Indirect) {
Devang Patel116da2f2011-04-26 19:06:18 +0000468 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
469
David Blaikie4532c282013-06-20 00:25:24 +0000470 if (Location.isReg() && !Indirect)
Devang Patel116da2f2011-04-26 19:06:18 +0000471 addRegisterOp(Block, Location.getReg());
David Blaikie4532c282013-06-20 00:25:24 +0000472 else {
Devang Patel116da2f2011-04-26 19:06:18 +0000473 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
David Blaikie4532c282013-06-20 00:25:24 +0000474 if (Indirect && !Location.isReg()) {
David Blaikie770530b2013-10-21 17:28:37 +0000475 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
David Blaikie4532c282013-06-20 00:25:24 +0000476 }
477 }
Devang Patel116da2f2011-04-26 19:06:18 +0000478
479 // Now attach the location information to the DIE.
David Blaikie770530b2013-10-21 17:28:37 +0000480 addBlock(Die, Attribute, Block);
Devang Patel116da2f2011-04-26 19:06:18 +0000481}
482
Devang Patel161b2f42011-04-12 23:21:44 +0000483/// addComplexAddress - Start with the address based on the location provided,
484/// and generate the DWARF information necessary to find the actual variable
485/// given the extra address information encoded in the DIVariable, starting from
486/// the starting location. Add the DWARF information to the die.
487///
Eric Christopherf61dbc12013-06-24 21:07:27 +0000488void CompileUnit::addComplexAddress(const DbgVariable &DV, DIE *Die,
David Blaikie770530b2013-10-21 17:28:37 +0000489 dwarf::Attribute Attribute,
Devang Patel161b2f42011-04-12 23:21:44 +0000490 const MachineLocation &Location) {
Devang Patel161b2f42011-04-12 23:21:44 +0000491 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Eric Christopherf61dbc12013-06-24 21:07:27 +0000492 unsigned N = DV.getNumAddrElements();
Devang Patelc26f5442011-04-28 02:22:40 +0000493 unsigned i = 0;
494 if (Location.isReg()) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000495 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
Devang Patelc26f5442011-04-28 02:22:40 +0000496 // If first address element is OpPlus then emit
497 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
Eric Christopherf61dbc12013-06-24 21:07:27 +0000498 addRegisterOffset(Block, Location.getReg(), DV.getAddrElement(1));
Devang Patelc26f5442011-04-28 02:22:40 +0000499 i = 2;
500 } else
501 addRegisterOp(Block, Location.getReg());
Eric Christopher6efc0432013-10-19 01:04:47 +0000502 } else
Devang Patel116da2f2011-04-26 19:06:18 +0000503 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel161b2f42011-04-12 23:21:44 +0000504
Eric Christopher6efc0432013-10-19 01:04:47 +0000505 for (; i < N; ++i) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000506 uint64_t Element = DV.getAddrElement(i);
Devang Patel161b2f42011-04-12 23:21:44 +0000507 if (Element == DIBuilder::OpPlus) {
David Blaikie770530b2013-10-21 17:28:37 +0000508 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
509 addUInt(Block, dwarf::DW_FORM_udata, DV.getAddrElement(++i));
Devang Patel161b2f42011-04-12 23:21:44 +0000510 } else if (Element == DIBuilder::OpDeref) {
Eric Christopher50120762012-05-08 18:56:00 +0000511 if (!Location.isReg())
David Blaikie770530b2013-10-21 17:28:37 +0000512 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Eric Christopher6efc0432013-10-19 01:04:47 +0000513 } else
514 llvm_unreachable("unknown DIBuilder Opcode");
Devang Patel161b2f42011-04-12 23:21:44 +0000515 }
516
517 // Now attach the location information to the DIE.
David Blaikie770530b2013-10-21 17:28:37 +0000518 addBlock(Die, Attribute, Block);
Devang Patel161b2f42011-04-12 23:21:44 +0000519}
520
521/* Byref variables, in Blocks, are declared by the programmer as "SomeType
522 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
523 gives the variable VarName either the struct, or a pointer to the struct, as
524 its type. This is necessary for various behind-the-scenes things the
525 compiler needs to do with by-reference variables in Blocks.
526
527 However, as far as the original *programmer* is concerned, the variable
528 should still have type 'SomeType', as originally declared.
529
530 The function getBlockByrefType dives into the __Block_byref_x_VarName
531 struct to find the original type of the variable, which is then assigned to
532 the variable's Debug Information Entry as its real type. So far, so good.
533 However now the debugger will expect the variable VarName to have the type
534 SomeType. So we need the location attribute for the variable to be an
535 expression that explains to the debugger how to navigate through the
536 pointers and struct to find the actual variable of type SomeType.
537
538 The following function does just that. We start by getting
539 the "normal" location for the variable. This will be the location
540 of either the struct __Block_byref_x_VarName or the pointer to the
541 struct __Block_byref_x_VarName.
542
543 The struct will look something like:
544
545 struct __Block_byref_x_VarName {
546 ... <various fields>
547 struct __Block_byref_x_VarName *forwarding;
548 ... <various other fields>
549 SomeType VarName;
550 ... <maybe more fields>
551 };
552
553 If we are given the struct directly (as our starting point) we
554 need to tell the debugger to:
555
556 1). Add the offset of the forwarding field.
557
558 2). Follow that pointer to get the real __Block_byref_x_VarName
559 struct to use (the real one may have been copied onto the heap).
560
561 3). Add the offset for the field VarName, to find the actual variable.
562
563 If we started with a pointer to the struct, then we need to
564 dereference that pointer first, before the other steps.
565 Translating this into DWARF ops, we will need to append the following
566 to the current location description for the variable:
567
568 DW_OP_deref -- optional, if we start with a pointer
569 DW_OP_plus_uconst <forward_fld_offset>
570 DW_OP_deref
571 DW_OP_plus_uconst <varName_fld_offset>
572
573 That is what this function does. */
574
575/// addBlockByrefAddress - Start with the address based on the location
576/// provided, and generate the DWARF information necessary to find the
577/// actual Block variable (navigating the Block struct) based on the
578/// starting location. Add the DWARF information to the die. For
579/// more information, read large comment just above here.
580///
Eric Christopherf61dbc12013-06-24 21:07:27 +0000581void CompileUnit::addBlockByrefAddress(const DbgVariable &DV, DIE *Die,
David Blaikie770530b2013-10-21 17:28:37 +0000582 dwarf::Attribute Attribute,
Devang Patel161b2f42011-04-12 23:21:44 +0000583 const MachineLocation &Location) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000584 DIType Ty = DV.getType();
Devang Patel161b2f42011-04-12 23:21:44 +0000585 DIType TmpTy = Ty;
Eric Christopher31667622013-08-08 01:41:00 +0000586 uint16_t Tag = Ty.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +0000587 bool isPointer = false;
588
Eric Christopherf61dbc12013-06-24 21:07:27 +0000589 StringRef varName = DV.getName();
Devang Patel161b2f42011-04-12 23:21:44 +0000590
591 if (Tag == dwarf::DW_TAG_pointer_type) {
592 DIDerivedType DTy = DIDerivedType(Ty);
Manman Ren017ceda2013-10-08 18:42:58 +0000593 TmpTy = resolve(DTy.getTypeDerivedFrom());
Devang Patel161b2f42011-04-12 23:21:44 +0000594 isPointer = true;
595 }
596
597 DICompositeType blockStruct = DICompositeType(TmpTy);
598
599 // Find the __forwarding field and the variable field in the __Block_byref
600 // struct.
601 DIArray Fields = blockStruct.getTypeArray();
602 DIDescriptor varField = DIDescriptor();
603 DIDescriptor forwardingField = DIDescriptor();
604
605 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
606 DIDescriptor Element = Fields.getElement(i);
607 DIDerivedType DT = DIDerivedType(Element);
608 StringRef fieldName = DT.getName();
609 if (fieldName == "__forwarding")
610 forwardingField = Element;
611 else if (fieldName == varName)
612 varField = Element;
613 }
614
615 // Get the offsets for the forwarding field and the variable field.
616 unsigned forwardingFieldOffset =
Eric Christopher6efc0432013-10-19 01:04:47 +0000617 DIDerivedType(forwardingField).getOffsetInBits() >> 3;
618 unsigned varFieldOffset = DIDerivedType(varField).getOffsetInBits() >> 3;
Devang Patel161b2f42011-04-12 23:21:44 +0000619
620 // Decode the original location, and use that as the start of the byref
621 // variable's location.
Devang Patel161b2f42011-04-12 23:21:44 +0000622 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
623
Eric Christophercaba2632012-07-04 02:02:18 +0000624 if (Location.isReg())
625 addRegisterOp(Block, Location.getReg());
626 else
627 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel161b2f42011-04-12 23:21:44 +0000628
629 // If we started with a pointer to the __Block_byref... struct, then
630 // the first thing we need to do is dereference the pointer (DW_OP_deref).
631 if (isPointer)
David Blaikie770530b2013-10-21 17:28:37 +0000632 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Devang Patel161b2f42011-04-12 23:21:44 +0000633
634 // Next add the offset for the '__forwarding' field:
635 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
636 // adding the offset if it's 0.
637 if (forwardingFieldOffset > 0) {
David Blaikie770530b2013-10-21 17:28:37 +0000638 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
639 addUInt(Block, dwarf::DW_FORM_udata, forwardingFieldOffset);
Devang Patel161b2f42011-04-12 23:21:44 +0000640 }
641
642 // Now dereference the __forwarding field to get to the real __Block_byref
643 // struct: DW_OP_deref.
David Blaikie770530b2013-10-21 17:28:37 +0000644 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Devang Patel161b2f42011-04-12 23:21:44 +0000645
646 // Now that we've got the real __Block_byref... struct, add the offset
647 // for the variable's field to get to the location of the actual variable:
648 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
649 if (varFieldOffset > 0) {
David Blaikie770530b2013-10-21 17:28:37 +0000650 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
651 addUInt(Block, dwarf::DW_FORM_udata, varFieldOffset);
Devang Patel161b2f42011-04-12 23:21:44 +0000652 }
653
654 // Now attach the location information to the DIE.
David Blaikie770530b2013-10-21 17:28:37 +0000655 addBlock(Die, Attribute, Block);
Devang Patel161b2f42011-04-12 23:21:44 +0000656}
657
Devang Patel4ec14b02011-07-20 21:57:04 +0000658/// isTypeSigned - Return true if the type is signed.
Manman Renc664d762013-10-05 01:43:03 +0000659static bool isTypeSigned(DwarfDebug *DD, DIType Ty, int *SizeInBits) {
Devang Patel4ec14b02011-07-20 21:57:04 +0000660 if (Ty.isDerivedType())
Manman Renc664d762013-10-05 01:43:03 +0000661 return isTypeSigned(DD, DD->resolve(DIDerivedType(Ty).getTypeDerivedFrom()),
662 SizeInBits);
Devang Patel4ec14b02011-07-20 21:57:04 +0000663 if (Ty.isBasicType())
Eric Christopher6efc0432013-10-19 01:04:47 +0000664 if (DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed ||
665 DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed_char) {
Devang Patel4ec14b02011-07-20 21:57:04 +0000666 *SizeInBits = Ty.getSizeInBits();
667 return true;
668 }
669 return false;
670}
671
Manman Renc664d762013-10-05 01:43:03 +0000672/// Return true if type encoding is unsigned.
673static bool isUnsignedDIType(DwarfDebug *DD, DIType Ty) {
674 DIDerivedType DTy(Ty);
675 if (DTy.isDerivedType())
676 return isUnsignedDIType(DD, DD->resolve(DTy.getTypeDerivedFrom()));
677
678 DIBasicType BTy(Ty);
679 if (BTy.isBasicType()) {
680 unsigned Encoding = BTy.getEncoding();
681 if (Encoding == dwarf::DW_ATE_unsigned ||
682 Encoding == dwarf::DW_ATE_unsigned_char ||
683 Encoding == dwarf::DW_ATE_boolean)
684 return true;
685 }
686 return false;
687}
688
689/// If this type is derived from a base type then return base type size.
Manman Ren43251002013-10-08 18:46:58 +0000690static uint64_t getBaseTypeSize(DwarfDebug *DD, DIDerivedType Ty) {
Manman Renc664d762013-10-05 01:43:03 +0000691 unsigned Tag = Ty.getTag();
692
693 if (Tag != dwarf::DW_TAG_member && Tag != dwarf::DW_TAG_typedef &&
694 Tag != dwarf::DW_TAG_const_type && Tag != dwarf::DW_TAG_volatile_type &&
695 Tag != dwarf::DW_TAG_restrict_type)
696 return Ty.getSizeInBits();
697
698 DIType BaseType = DD->resolve(Ty.getTypeDerivedFrom());
699
700 // If this type is not derived from any type then take conservative approach.
701 if (!BaseType.isValid())
702 return Ty.getSizeInBits();
703
704 // If this is a derived type, go ahead and get the base type, unless it's a
705 // reference then it's just the size of the field. Pointer types have no need
706 // of this since they're a different type of qualification on the type.
707 if (BaseType.getTag() == dwarf::DW_TAG_reference_type ||
708 BaseType.getTag() == dwarf::DW_TAG_rvalue_reference_type)
709 return Ty.getSizeInBits();
710
711 if (BaseType.isDerivedType())
Manman Ren43251002013-10-08 18:46:58 +0000712 return getBaseTypeSize(DD, DIDerivedType(BaseType));
Manman Renc664d762013-10-05 01:43:03 +0000713
714 return BaseType.getSizeInBits();
715}
716
Devang Patel161b2f42011-04-12 23:21:44 +0000717/// addConstantValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000718void CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO,
Devang Patelb58128e2011-05-27 16:45:18 +0000719 DIType Ty) {
David Blaikie4de9d722013-05-10 21:52:07 +0000720 // FIXME: This is a bit conservative/simple - it emits negative values at
721 // their maximum bit width which is a bit unfortunate (& doesn't prefer
722 // udata/sdata over dataN as suggested by the DWARF spec)
Nick Lewycky746cb672011-10-26 22:55:33 +0000723 assert(MO.isImm() && "Invalid machine operand!");
Devang Patel4ec14b02011-07-20 21:57:04 +0000724 int SizeInBits = -1;
Manman Renc664d762013-10-05 01:43:03 +0000725 bool SignedConstant = isTypeSigned(DD, Ty, &SizeInBits);
David Blaikie770530b2013-10-21 17:28:37 +0000726 dwarf::Form Form;
Devang Patel72f0d9c2011-05-27 18:15:52 +0000727
Eric Christopher7b2ee392013-08-27 23:49:04 +0000728 // If we're a signed constant definitely use sdata.
729 if (SignedConstant) {
730 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, MO.getImm());
731 return;
732 }
733
734 // Else use data for now unless it's larger than we can deal with.
735 switch (SizeInBits) {
736 case 8:
737 Form = dwarf::DW_FORM_data1;
738 break;
739 case 16:
740 Form = dwarf::DW_FORM_data2;
741 break;
742 case 32:
743 Form = dwarf::DW_FORM_data4;
744 break;
745 case 64:
746 Form = dwarf::DW_FORM_data8;
747 break;
748 default:
749 Form = dwarf::DW_FORM_udata;
750 addUInt(Die, dwarf::DW_AT_const_value, Form, MO.getImm());
751 return;
752 }
753 addUInt(Die, dwarf::DW_AT_const_value, Form, MO.getImm());
Devang Patel161b2f42011-04-12 23:21:44 +0000754}
755
756/// addConstantFPValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000757void CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
Eric Christopher6efc0432013-10-19 01:04:47 +0000758 assert(MO.isFPImm() && "Invalid machine operand!");
Devang Patel161b2f42011-04-12 23:21:44 +0000759 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
760 APFloat FPImm = MO.getFPImm()->getValueAPF();
761
762 // Get the raw data form of the floating point.
763 const APInt FltVal = FPImm.bitcastToAPInt();
Eric Christopher6efc0432013-10-19 01:04:47 +0000764 const char *FltPtr = (const char *)FltVal.getRawData();
Devang Patel161b2f42011-04-12 23:21:44 +0000765
766 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
Micah Villmow3574eca2012-10-08 16:38:25 +0000767 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel161b2f42011-04-12 23:21:44 +0000768 int Incr = (LittleEndian ? 1 : -1);
769 int Start = (LittleEndian ? 0 : NumBytes - 1);
770 int Stop = (LittleEndian ? NumBytes : -1);
771
772 // Output the constant to DWARF one byte at a time.
773 for (; Start != Stop; Start += Incr)
David Blaikie770530b2013-10-21 17:28:37 +0000774 addUInt(Block, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +0000775 (unsigned char)0xFF & FltPtr[Start]);
776
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) {
Eric Christopher6b6061f2013-01-16 01:22:23 +0000864 if (Context.isType())
865 return getOrCreateTypeDIE(DIType(Context));
866 else if (Context.isNameSpace())
867 return getOrCreateNameSpace(DINameSpace(Context));
868 else if (Context.isSubprogram())
869 return getOrCreateSubprogramDIE(DISubprogram(Context));
Eric Christopher6c3bb942013-04-22 07:47:40 +0000870 else
Eric Christopher6b6061f2013-01-16 01:22:23 +0000871 return getDIE(Context);
872}
873
Devang Patel161b2f42011-04-12 23:21:44 +0000874/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
875/// given DIType.
Devang Patel94c7ddb2011-08-16 22:09:43 +0000876DIE *CompileUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
877 DIType Ty(TyNode);
Manman Rend03d2b22013-07-08 18:33:29 +0000878 if (!Ty.isType())
Devang Patel94c7ddb2011-08-16 22:09:43 +0000879 return NULL;
Manman Rend498e5e2013-10-29 22:49:29 +0000880
881 // Construct the context before querying for the existence of the DIE in case
882 // such construction creates the DIE.
883 DIE *ContextDIE = getOrCreateContextDIE(resolve(Ty.getContext()));
884 if (!ContextDIE)
885 ContextDIE = CUDie.get();
886
Eric Christopher3f045002013-10-04 17:08:38 +0000887 DIE *TyDIE = getDIE(Ty);
Devang Patel161b2f42011-04-12 23:21:44 +0000888 if (TyDIE)
889 return TyDIE;
890
891 // Create new type.
Manman Rend498e5e2013-10-29 22:49:29 +0000892 TyDIE = createAndAddDIE(Ty.getTag(), *ContextDIE, Ty);
893
Devang Patel161b2f42011-04-12 23:21:44 +0000894 if (Ty.isBasicType())
895 constructTypeDIE(*TyDIE, DIBasicType(Ty));
896 else if (Ty.isCompositeType())
897 constructTypeDIE(*TyDIE, DICompositeType(Ty));
898 else {
899 assert(Ty.isDerivedType() && "Unknown kind of DIType");
900 constructTypeDIE(*TyDIE, DIDerivedType(Ty));
901 }
Eric Christopher1b3f9192011-11-10 19:52:58 +0000902 // If this is a named finished type then include it in the list of types
903 // for the accelerator tables.
Eric Christopherc36145f2012-01-06 04:35:23 +0000904 if (!Ty.getName().empty() && !Ty.isForwardDecl()) {
905 bool IsImplementation = 0;
906 if (Ty.isCompositeType()) {
907 DICompositeType CT(Ty);
Eric Christophere0167892012-01-06 23:03:37 +0000908 // A runtime language of 0 actually means C/C++ and that any
909 // non-negative value is some version of Objective-C/C++.
Eric Christopher6efc0432013-10-19 01:04:47 +0000910 IsImplementation = (CT.getRunTimeLang() == 0) || CT.isObjcClassComplete();
Eric Christopherc36145f2012-01-06 04:35:23 +0000911 }
Eric Christopher577056f2013-09-05 18:20:16 +0000912 unsigned Flags = IsImplementation ? dwarf::DW_FLAG_type_implementation : 0;
Eric Christophere0167892012-01-06 23:03:37 +0000913 addAccelType(Ty.getName(), std::make_pair(TyDIE, Flags));
Eric Christopherc36145f2012-01-06 04:35:23 +0000914 }
Eric Christopher8b4310b2012-11-21 00:34:38 +0000915
Devang Patel161b2f42011-04-12 23:21:44 +0000916 return TyDIE;
917}
918
919/// addType - Add a new type attribute to the specified entity.
David Blaikie770530b2013-10-21 17:28:37 +0000920void CompileUnit::addType(DIE *Entity, DIType Ty, dwarf::Attribute Attribute) {
Eric Christopherdc1363f2013-08-08 07:40:37 +0000921 assert(Ty && "Trying to add a type that doesn't exist?");
Devang Patel161b2f42011-04-12 23:21:44 +0000922
923 // Check for pre-existence.
924 DIEEntry *Entry = getDIEEntry(Ty);
925 // If it exists then use the existing value.
926 if (Entry) {
Manman Renb8b70e12013-10-31 17:54:35 +0000927 addDIEEntry(Entity, Attribute, Entry);
Devang Patel161b2f42011-04-12 23:21:44 +0000928 return;
929 }
930
931 // Construct type.
932 DIE *Buffer = getOrCreateTypeDIE(Ty);
933
934 // Set up proxy.
935 Entry = createDIEEntry(Buffer);
936 insertDIEEntry(Ty, Entry);
Manman Renb8b70e12013-10-31 17:54:35 +0000937 addDIEEntry(Entity, Attribute, Entry);
Devang Patele9ae06c2011-05-31 22:56:51 +0000938
939 // If this is a complete composite type then include it in the
940 // list of global types.
Devang Patelc20bdf12011-06-01 00:23:24 +0000941 addGlobalType(Ty);
Devang Patel66658e42011-05-31 23:30:30 +0000942}
943
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000944// Accelerator table mutators - add each name along with its companion
945// DIE to the proper table while ensuring that the name that we're going
946// to reference is in the string table. We do this since the names we
947// add may not only be identical to the names in the DIE.
948void CompileUnit::addAccelName(StringRef Name, DIE *Die) {
949 DU->getStringPoolEntry(Name);
Eric Christopher734334e2013-09-23 22:59:11 +0000950 std::vector<DIE *> &DIEs = AccelNames[Name];
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000951 DIEs.push_back(Die);
952}
953
954void CompileUnit::addAccelObjC(StringRef Name, DIE *Die) {
955 DU->getStringPoolEntry(Name);
Eric Christopher734334e2013-09-23 22:59:11 +0000956 std::vector<DIE *> &DIEs = AccelObjC[Name];
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000957 DIEs.push_back(Die);
958}
959
960void CompileUnit::addAccelNamespace(StringRef Name, DIE *Die) {
961 DU->getStringPoolEntry(Name);
Eric Christopher734334e2013-09-23 22:59:11 +0000962 std::vector<DIE *> &DIEs = AccelNamespace[Name];
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000963 DIEs.push_back(Die);
964}
965
966void CompileUnit::addAccelType(StringRef Name, std::pair<DIE *, unsigned> Die) {
967 DU->getStringPoolEntry(Name);
968 std::vector<std::pair<DIE *, unsigned> > &DIEs = AccelTypes[Name];
969 DIEs.push_back(Die);
970}
971
Eric Christopher50d37a42013-09-20 22:20:55 +0000972/// addGlobalName - Add a new global name to the compile unit.
Eric Christopher91986572013-10-17 02:06:06 +0000973void CompileUnit::addGlobalName(StringRef Name, DIE *Die, DIScope Context) {
Eric Christopher0ab64392013-10-19 01:04:42 +0000974 std::string FullName = getParentContextString(Context) + Name.str();
Eric Christopher91986572013-10-17 02:06:06 +0000975 GlobalNames[FullName] = Die;
Eric Christopher50d37a42013-09-20 22:20:55 +0000976}
977
Devang Patel66658e42011-05-31 23:30:30 +0000978/// addGlobalType - Add a new global type to the compile unit.
979///
Devang Patelc20bdf12011-06-01 00:23:24 +0000980void CompileUnit::addGlobalType(DIType Ty) {
Eric Christophereee74fb2013-10-05 00:27:02 +0000981 DIScope Context = resolve(Ty.getContext());
Eric Christopher5a634742013-09-23 23:15:58 +0000982 if (!Ty.getName().empty() && !Ty.isForwardDecl() &&
Eric Christopher734334e2013-09-23 22:59:11 +0000983 (!Context || Context.isCompileUnit() || Context.isFile() ||
984 Context.isNameSpace()))
Eric Christopher91986572013-10-17 02:06:06 +0000985 if (DIEEntry *Entry = getDIEEntry(Ty)) {
Eric Christopher0ab64392013-10-19 01:04:42 +0000986 std::string FullName =
987 getParentContextString(Context) + Ty.getName().str();
Eric Christopher6efc0432013-10-19 01:04:47 +0000988 GlobalTypes[FullName] = Entry->getEntry();
Eric Christopher91986572013-10-17 02:06:06 +0000989 }
990}
991
992/// getParentContextString - Walks the metadata parent chain in a language
993/// specific manner (using the compile unit language) and returns
994/// it as a string. This is done at the metadata level because DIEs may
995/// not currently have been added to the parent context and walking the
996/// DIEs looking for names is more expensive than walking the metadata.
997std::string CompileUnit::getParentContextString(DIScope Context) const {
998 if (!Context)
999 return "";
1000
1001 // FIXME: Decide whether to implement this for non-C++ languages.
1002 if (getLanguage() != dwarf::DW_LANG_C_plus_plus)
1003 return "";
1004
Eric Christopher0ab64392013-10-19 01:04:42 +00001005 std::string CS;
Eric Christopher91986572013-10-17 02:06:06 +00001006 SmallVector<DIScope, 1> Parents;
1007 while (!Context.isCompileUnit()) {
1008 Parents.push_back(Context);
1009 if (Context.getContext())
1010 Context = resolve(Context.getContext());
1011 else
1012 // Structure, etc types will have a NULL context if they're at the top
1013 // level.
1014 break;
1015 }
1016
1017 // Reverse iterate over our list to go from the outermost construct to the
1018 // innermost.
1019 for (SmallVectorImpl<DIScope>::reverse_iterator I = Parents.rbegin(),
1020 E = Parents.rend();
1021 I != E; ++I) {
1022 DIScope Ctx = *I;
1023 StringRef Name = Ctx.getName();
Eric Christopher0ab64392013-10-19 01:04:42 +00001024 if (!Name.empty()) {
Eric Christopher91986572013-10-17 02:06:06 +00001025 CS += Name;
1026 CS += "::";
1027 }
1028 }
1029 return CS;
Devang Patel161b2f42011-04-12 23:21:44 +00001030}
1031
Eric Christopher22852c72013-10-05 00:05:51 +00001032/// addPubTypes - Add subprogram argument types for pubtypes section.
Devang Patel31c5d052011-05-06 16:57:54 +00001033void CompileUnit::addPubTypes(DISubprogram SP) {
1034 DICompositeType SPTy = SP.getType();
Eric Christopher31667622013-08-08 01:41:00 +00001035 uint16_t SPTag = SPTy.getTag();
Devang Patel31c5d052011-05-06 16:57:54 +00001036 if (SPTag != dwarf::DW_TAG_subroutine_type)
1037 return;
1038
1039 DIArray Args = SPTy.getTypeArray();
1040 for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
1041 DIType ATy(Args.getElement(i));
Manman Rend03d2b22013-07-08 18:33:29 +00001042 if (!ATy.isType())
Devang Patel31c5d052011-05-06 16:57:54 +00001043 continue;
Devang Patelc20bdf12011-06-01 00:23:24 +00001044 addGlobalType(ATy);
Devang Patel31c5d052011-05-06 16:57:54 +00001045 }
1046}
1047
Devang Patel161b2f42011-04-12 23:21:44 +00001048/// constructTypeDIE - Construct basic type die from DIBasicType.
1049void CompileUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
1050 // Get core information.
1051 StringRef Name = BTy.getName();
Devang Patel161b2f42011-04-12 23:21:44 +00001052 // Add name if not anonymous or intermediate type.
1053 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001054 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel734a67c2011-09-14 23:13:28 +00001055
David Blaikie916d49e2013-10-04 23:21:16 +00001056 // An unspecified type only has a name attribute.
1057 if (BTy.getTag() == dwarf::DW_TAG_unspecified_type)
Devang Patel734a67c2011-09-14 23:13:28 +00001058 return;
Devang Patel734a67c2011-09-14 23:13:28 +00001059
Nick Lewycky746cb672011-10-26 22:55:33 +00001060 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
Devang Patel30d409c2012-02-07 23:33:58 +00001061 BTy.getEncoding());
Devang Patel734a67c2011-09-14 23:13:28 +00001062
Devang Patel161b2f42011-04-12 23:21:44 +00001063 uint64_t Size = BTy.getSizeInBits() >> 3;
David Blaikie770530b2013-10-21 17:28:37 +00001064 addUInt(&Buffer, dwarf::DW_AT_byte_size, None, Size);
Devang Patel161b2f42011-04-12 23:21:44 +00001065}
1066
1067/// constructTypeDIE - Construct derived type die from DIDerivedType.
1068void CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
1069 // Get core information.
1070 StringRef Name = DTy.getName();
1071 uint64_t Size = DTy.getSizeInBits() >> 3;
David Blaikie916d49e2013-10-04 23:21:16 +00001072 uint16_t Tag = Buffer.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +00001073
1074 // Map to main type, void will not have a type.
Manman Ren017ceda2013-10-08 18:42:58 +00001075 DIType FromTy = resolve(DTy.getTypeDerivedFrom());
Eric Christopherdc1363f2013-08-08 07:40:37 +00001076 if (FromTy)
1077 addType(&Buffer, FromTy);
Devang Patel161b2f42011-04-12 23:21:44 +00001078
1079 // Add name if not anonymous or intermediate type.
1080 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001081 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001082
1083 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopher35f225a2012-02-21 22:25:53 +00001084 if (Size && Tag != dwarf::DW_TAG_pointer_type)
David Blaikie770530b2013-10-21 17:28:37 +00001085 addUInt(&Buffer, dwarf::DW_AT_byte_size, None, Size);
Devang Patel161b2f42011-04-12 23:21:44 +00001086
David Blaikie62fdfb52013-01-07 05:51:15 +00001087 if (Tag == dwarf::DW_TAG_ptr_to_member_type)
Eric Christopher6efc0432013-10-19 01:04:47 +00001088 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type,
1089 getOrCreateTypeDIE(resolve(DTy.getClassType())));
Devang Patel161b2f42011-04-12 23:21:44 +00001090 // Add source line info if available and TyDesc is not a forward declaration.
1091 if (!DTy.isForwardDecl())
1092 addSourceLine(&Buffer, DTy);
1093}
1094
Eric Christopher3dee5752013-07-26 17:02:41 +00001095/// Return true if the type is appropriately scoped to be contained inside
1096/// its own type unit.
Manman Ren18eb2452013-09-09 19:23:58 +00001097static bool isTypeUnitScoped(DIType Ty, const DwarfDebug *DD) {
Manman Ren2c9905a2013-09-09 19:47:11 +00001098 DIScope Parent = DD->resolve(Ty.getContext());
Eric Christopher3dee5752013-07-26 17:02:41 +00001099 while (Parent) {
1100 // Don't generate a hash for anything scoped inside a function.
1101 if (Parent.isSubprogram())
1102 return false;
Manman Rene72aba92013-09-09 22:35:23 +00001103 Parent = DD->resolve(Parent.getContext());
Eric Christopher3dee5752013-07-26 17:02:41 +00001104 }
1105 return true;
1106}
1107
1108/// Return true if the type should be split out into a type unit.
Manman Ren18eb2452013-09-09 19:23:58 +00001109static bool shouldCreateTypeUnit(DICompositeType CTy, const DwarfDebug *DD) {
Eric Christopher31667622013-08-08 01:41:00 +00001110 uint16_t Tag = CTy.getTag();
Eric Christopher3dee5752013-07-26 17:02:41 +00001111
1112 switch (Tag) {
1113 case dwarf::DW_TAG_structure_type:
1114 case dwarf::DW_TAG_union_type:
1115 case dwarf::DW_TAG_enumeration_type:
1116 case dwarf::DW_TAG_class_type:
1117 // If this is a class, structure, union, or enumeration type
David Blaikiec4eb3532013-10-04 23:52:02 +00001118 // that is a definition (not a declaration), and not scoped
Eric Christopher3dee5752013-07-26 17:02:41 +00001119 // inside a function then separate this out as a type unit.
David Blaikiec4eb3532013-10-04 23:52:02 +00001120 return !CTy.isForwardDecl() && isTypeUnitScoped(CTy, DD);
Eric Christopher3dee5752013-07-26 17:02:41 +00001121 default:
David Blaikiec4eb3532013-10-04 23:52:02 +00001122 return false;
Eric Christopher3dee5752013-07-26 17:02:41 +00001123 }
1124}
1125
Devang Patel161b2f42011-04-12 23:21:44 +00001126/// constructTypeDIE - Construct type DIE from DICompositeType.
1127void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
1128 // Get core information.
1129 StringRef Name = CTy.getName();
1130
1131 uint64_t Size = CTy.getSizeInBits() >> 3;
David Blaikie916d49e2013-10-04 23:21:16 +00001132 uint16_t Tag = Buffer.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +00001133
1134 switch (Tag) {
Devang Patel161b2f42011-04-12 23:21:44 +00001135 case dwarf::DW_TAG_array_type:
Eric Christopher883ed6b2013-11-11 18:52:31 +00001136 constructArrayTypeDIE(Buffer, CTy);
Devang Patel161b2f42011-04-12 23:21:44 +00001137 break;
1138 case dwarf::DW_TAG_enumeration_type: {
1139 DIArray Elements = CTy.getTypeArray();
1140
1141 // Add enumerators to enumeration type.
1142 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
Devang Patel161b2f42011-04-12 23:21:44 +00001143 DIDescriptor Enum(Elements.getElement(i));
Manman Ren630c3262013-10-18 21:14:19 +00001144 if (Enum.isEnumerator())
Manman Ren950f4e82013-10-23 22:52:22 +00001145 constructEnumTypeDIE(Buffer, DIEnumerator(Enum));
Devang Patel161b2f42011-04-12 23:21:44 +00001146 }
Manman Ren017ceda2013-10-08 18:42:58 +00001147 DIType DTy = resolve(CTy.getTypeDerivedFrom());
Eric Christopher37c107b2013-08-08 07:40:42 +00001148 if (DTy) {
Eric Christopherbb0f6ea2012-05-23 00:09:20 +00001149 addType(&Buffer, DTy);
Eric Christopher371d9582013-10-04 22:40:10 +00001150 addFlag(&Buffer, dwarf::DW_AT_enum_class);
Eric Christopherbb0f6ea2012-05-23 00:09:20 +00001151 }
Eric Christopher6efc0432013-10-19 01:04:47 +00001152 } break;
Devang Patel161b2f42011-04-12 23:21:44 +00001153 case dwarf::DW_TAG_subroutine_type: {
Eric Christopherdc1363f2013-08-08 07:40:37 +00001154 // Add return type. A void return won't have a type.
Devang Patel161b2f42011-04-12 23:21:44 +00001155 DIArray Elements = CTy.getTypeArray();
1156 DIDescriptor RTy = Elements.getElement(0);
Eric Christopherdc1363f2013-08-08 07:40:37 +00001157 if (RTy)
1158 addType(&Buffer, DIType(RTy));
Devang Patel161b2f42011-04-12 23:21:44 +00001159
1160 bool isPrototyped = true;
1161 // Add arguments.
1162 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
1163 DIDescriptor Ty = Elements.getElement(i);
1164 if (Ty.isUnspecifiedParameter()) {
Manman Ren1a5e7872013-10-29 00:53:03 +00001165 createAndAddDIE(dwarf::DW_TAG_unspecified_parameters, Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +00001166 isPrototyped = false;
1167 } else {
Manman Ren1a5e7872013-10-29 00:53:03 +00001168 DIE *Arg = createAndAddDIE(dwarf::DW_TAG_formal_parameter, Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +00001169 addType(Arg, DIType(Ty));
David Blaikieaaf2e632013-01-29 19:35:24 +00001170 if (DIType(Ty).isArtificial())
1171 addFlag(Arg, dwarf::DW_AT_artificial);
Devang Patel161b2f42011-04-12 23:21:44 +00001172 }
1173 }
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001174 // Add prototype flag if we're dealing with a C language and the
1175 // function has been prototyped.
Eric Christopher7b878952013-08-26 23:50:38 +00001176 uint16_t Language = DICompileUnit(Node).getLanguage();
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001177 if (isPrototyped &&
Eric Christopher6efc0432013-10-19 01:04:47 +00001178 (Language == dwarf::DW_LANG_C89 || Language == dwarf::DW_LANG_C99 ||
Eric Christopher4d069bf2012-05-22 18:45:24 +00001179 Language == dwarf::DW_LANG_ObjC))
Eric Christopher873cf0a2012-08-24 01:14:27 +00001180 addFlag(&Buffer, dwarf::DW_AT_prototyped);
Eric Christopher6efc0432013-10-19 01:04:47 +00001181 } break;
Devang Patel161b2f42011-04-12 23:21:44 +00001182 case dwarf::DW_TAG_structure_type:
1183 case dwarf::DW_TAG_union_type:
1184 case dwarf::DW_TAG_class_type: {
Devang Patel161b2f42011-04-12 23:21:44 +00001185 // Add elements to structure type.
David Blaikiec8b93552013-08-01 20:30:22 +00001186 DIArray Elements = CTy.getTypeArray();
1187 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
Devang Patel161b2f42011-04-12 23:21:44 +00001188 DIDescriptor Element = Elements.getElement(i);
1189 DIE *ElemDie = NULL;
1190 if (Element.isSubprogram()) {
1191 DISubprogram SP(Element);
Devang Pateldbc64af2011-08-15 17:24:54 +00001192 ElemDie = getOrCreateSubprogramDIE(DISubprogram(Element));
Devang Patel161b2f42011-04-12 23:21:44 +00001193 if (SP.isProtected())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001194 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001195 dwarf::DW_ACCESS_protected);
1196 else if (SP.isPrivate())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001197 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001198 dwarf::DW_ACCESS_private);
Eric Christopher8b4310b2012-11-21 00:34:38 +00001199 else
Nick Lewycky13aaca52011-12-13 05:09:11 +00001200 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Eric Christopher6efc0432013-10-19 01:04:47 +00001201 dwarf::DW_ACCESS_public);
Devang Patel161b2f42011-04-12 23:21:44 +00001202 if (SP.isExplicit())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001203 addFlag(ElemDie, dwarf::DW_AT_explicit);
Eric Christopher663e0cf2012-03-28 07:34:31 +00001204 } else if (Element.isDerivedType()) {
Eric Christopher4d069bf2012-05-22 18:45:24 +00001205 DIDerivedType DDTy(Element);
1206 if (DDTy.getTag() == dwarf::DW_TAG_friend) {
Manman Ren1a5e7872013-10-29 00:53:03 +00001207 ElemDie = createAndAddDIE(dwarf::DW_TAG_friend, Buffer);
Manman Ren017ceda2013-10-08 18:42:58 +00001208 addType(ElemDie, resolve(DDTy.getTypeDerivedFrom()),
Manman Renc664d762013-10-05 01:43:03 +00001209 dwarf::DW_AT_friend);
Manman Ren655a10d2013-10-14 20:33:57 +00001210 } else if (DDTy.isStaticMember()) {
Manman Ren99addee2013-10-23 22:57:12 +00001211 getOrCreateStaticMemberDIE(DDTy);
Manman Ren655a10d2013-10-14 20:33:57 +00001212 } else {
Manman Rena1d25b62013-10-23 23:00:44 +00001213 constructMemberDIE(Buffer, DDTy);
Manman Ren655a10d2013-10-14 20:33:57 +00001214 }
Eric Christopher663e0cf2012-03-28 07:34:31 +00001215 } else if (Element.isObjCProperty()) {
Devang Patel30d409c2012-02-07 23:33:58 +00001216 DIObjCProperty Property(Element);
Manman Ren1a5e7872013-10-29 00:53:03 +00001217 ElemDie = createAndAddDIE(Property.getTag(), Buffer);
Devang Patel30d409c2012-02-07 23:33:58 +00001218 StringRef PropertyName = Property.getObjCPropertyName();
1219 addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
Eric Christopher4d069bf2012-05-22 18:45:24 +00001220 addType(ElemDie, Property.getType());
1221 addSourceLine(ElemDie, Property);
Devang Patel30d409c2012-02-07 23:33:58 +00001222 StringRef GetterName = Property.getObjCPropertyGetterName();
1223 if (!GetterName.empty())
1224 addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
1225 StringRef SetterName = Property.getObjCPropertySetterName();
1226 if (!SetterName.empty())
1227 addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
1228 unsigned PropertyAttributes = 0;
Devang Patel9e11eb12012-02-04 01:30:32 +00001229 if (Property.isReadOnlyObjCProperty())
1230 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
1231 if (Property.isReadWriteObjCProperty())
1232 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
1233 if (Property.isAssignObjCProperty())
1234 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
1235 if (Property.isRetainObjCProperty())
1236 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
1237 if (Property.isCopyObjCProperty())
1238 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
1239 if (Property.isNonAtomicObjCProperty())
1240 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
1241 if (PropertyAttributes)
David Blaikie770530b2013-10-21 17:28:37 +00001242 addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, None,
Eric Christopher6efc0432013-10-19 01:04:47 +00001243 PropertyAttributes);
Devang Patel6588abf2012-02-06 17:49:43 +00001244
Devang Patel30d409c2012-02-07 23:33:58 +00001245 DIEEntry *Entry = getDIEEntry(Element);
1246 if (!Entry) {
1247 Entry = createDIEEntry(ElemDie);
1248 insertDIEEntry(Element, Entry);
1249 }
Devang Patel9e11eb12012-02-04 01:30:32 +00001250 } else
Devang Patel161b2f42011-04-12 23:21:44 +00001251 continue;
Devang Patel161b2f42011-04-12 23:21:44 +00001252 }
1253
1254 if (CTy.isAppleBlockExtension())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001255 addFlag(&Buffer, dwarf::DW_AT_APPLE_block);
Devang Patel161b2f42011-04-12 23:21:44 +00001256
Eric Christophereee74fb2013-10-05 00:27:02 +00001257 DICompositeType ContainingType(resolve(CTy.getContainingType()));
Devang Patel161b2f42011-04-12 23:21:44 +00001258 if (DIDescriptor(ContainingType).isCompositeType())
Manman Ren87b110a2013-10-11 23:58:05 +00001259 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type,
Devang Patel161b2f42011-04-12 23:21:44 +00001260 getOrCreateTypeDIE(DIType(ContainingType)));
Devang Patel161b2f42011-04-12 23:21:44 +00001261
Devang Patel201e6cd2011-05-12 21:29:42 +00001262 if (CTy.isObjcClassComplete())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001263 addFlag(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type);
Devang Patelb11f80e2011-05-12 19:06:16 +00001264
Eric Christopher1a8e8862011-12-16 23:42:42 +00001265 // Add template parameters to a class, structure or union types.
1266 // FIXME: The support isn't in the metadata for this yet.
1267 if (Tag == dwarf::DW_TAG_class_type ||
Eric Christopher6efc0432013-10-19 01:04:47 +00001268 Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type)
Devang Patel161b2f42011-04-12 23:21:44 +00001269 addTemplateParams(Buffer, CTy.getTemplateParams());
1270
1271 break;
1272 }
1273 default:
1274 break;
1275 }
1276
1277 // Add name if not anonymous or intermediate type.
1278 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001279 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001280
Eric Christopher4a5d8392012-05-22 18:45:18 +00001281 if (Tag == dwarf::DW_TAG_enumeration_type ||
Eric Christopher6efc0432013-10-19 01:04:47 +00001282 Tag == dwarf::DW_TAG_class_type || Tag == dwarf::DW_TAG_structure_type ||
Eric Christopher4a5d8392012-05-22 18:45:18 +00001283 Tag == dwarf::DW_TAG_union_type) {
Devang Patel161b2f42011-04-12 23:21:44 +00001284 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopherfc4199b2012-06-01 00:22:32 +00001285 // TODO: Do we care about size for enum forward declarations?
Devang Patel161b2f42011-04-12 23:21:44 +00001286 if (Size)
David Blaikie770530b2013-10-21 17:28:37 +00001287 addUInt(&Buffer, dwarf::DW_AT_byte_size, None, Size);
Eric Christopherfc4199b2012-06-01 00:22:32 +00001288 else if (!CTy.isForwardDecl())
Devang Patel161b2f42011-04-12 23:21:44 +00001289 // Add zero size if it is not a forward declaration.
David Blaikie770530b2013-10-21 17:28:37 +00001290 addUInt(&Buffer, dwarf::DW_AT_byte_size, None, 0);
Eric Christopherfc4199b2012-06-01 00:22:32 +00001291
1292 // If we're a forward decl, say so.
1293 if (CTy.isForwardDecl())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001294 addFlag(&Buffer, dwarf::DW_AT_declaration);
Devang Patel161b2f42011-04-12 23:21:44 +00001295
1296 // Add source line info if available.
1297 if (!CTy.isForwardDecl())
1298 addSourceLine(&Buffer, CTy);
Eric Christopher89388952012-03-07 00:15:19 +00001299
1300 // No harm in adding the runtime language to the declaration.
1301 unsigned RLang = CTy.getRunTimeLang();
1302 if (RLang)
Eric Christopher6efc0432013-10-19 01:04:47 +00001303 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class, dwarf::DW_FORM_data1,
1304 RLang);
Devang Patel161b2f42011-04-12 23:21:44 +00001305 }
Eric Christopher3dee5752013-07-26 17:02:41 +00001306 // If this is a type applicable to a type unit it then add it to the
1307 // list of types we'll compute a hash for later.
Manman Ren18eb2452013-09-09 19:23:58 +00001308 if (shouldCreateTypeUnit(CTy, DD))
Eric Christopher3dee5752013-07-26 17:02:41 +00001309 DD->addTypeUnitType(&Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +00001310}
1311
Manman Renbe87b692013-10-23 23:05:28 +00001312/// constructTemplateTypeParameterDIE - Construct new DIE for the given
1313/// DITemplateTypeParameter.
Manman Ren99addee2013-10-23 22:57:12 +00001314void
Manman Renbe87b692013-10-23 23:05:28 +00001315CompileUnit::constructTemplateTypeParameterDIE(DIE &Buffer,
1316 DITemplateTypeParameter TP) {
Manman Ren1a5e7872013-10-29 00:53:03 +00001317 DIE *ParamDIE =
1318 createAndAddDIE(dwarf::DW_TAG_template_type_parameter, Buffer);
Eric Christopher76ef79f2013-08-08 08:09:43 +00001319 // Add the type if it exists, it could be void and therefore no type.
1320 if (TP.getType())
Manman Renb4d9c112013-10-09 19:46:28 +00001321 addType(ParamDIE, resolve(TP.getType()));
David Blaikiee88939c2013-06-22 18:59:11 +00001322 if (!TP.getName().empty())
1323 addString(ParamDIE, dwarf::DW_AT_name, TP.getName());
Devang Patel161b2f42011-04-12 23:21:44 +00001324}
1325
Manman Renbe87b692013-10-23 23:05:28 +00001326/// constructTemplateValueParameterDIE - Construct new DIE for the given
1327/// DITemplateValueParameter.
Manman Ren99addee2013-10-23 22:57:12 +00001328void
Manman Renbe87b692013-10-23 23:05:28 +00001329CompileUnit::constructTemplateValueParameterDIE(DIE &Buffer,
1330 DITemplateValueParameter VP) {
Manman Ren1a5e7872013-10-29 00:53:03 +00001331 DIE *ParamDIE = createAndAddDIE(VP.getTag(), Buffer);
Eric Christopherdc1363f2013-08-08 07:40:37 +00001332
1333 // Add the type if there is one, template template and template parameter
1334 // packs will not have a type.
Eric Christopheref2d9192013-10-21 17:48:51 +00001335 if (VP.getTag() == dwarf::DW_TAG_template_value_parameter)
Manman Renb4d9c112013-10-09 19:46:28 +00001336 addType(ParamDIE, resolve(VP.getType()));
Eric Christopherafdd1f82013-08-08 07:40:31 +00001337 if (!VP.getName().empty())
1338 addString(ParamDIE, dwarf::DW_AT_name, VP.getName());
1339 if (Value *Val = VP.getValue()) {
David Blaikie4de9d722013-05-10 21:52:07 +00001340 if (ConstantInt *CI = dyn_cast<ConstantInt>(Val))
Manman Renb4d9c112013-10-09 19:46:28 +00001341 addConstantValue(ParamDIE, CI,
1342 isUnsignedDIType(DD, resolve(VP.getType())));
David Blaikie4de9d722013-05-10 21:52:07 +00001343 else if (GlobalValue *GV = dyn_cast<GlobalValue>(Val)) {
1344 // For declaration non-type template parameters (such as global values and
1345 // functions)
1346 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Rafael Espindolaffc7dca2013-10-29 17:07:16 +00001347 addOpAddress(Block, Asm->getSymbol(GV));
David Blaikie4de9d722013-05-10 21:52:07 +00001348 // Emit DW_OP_stack_value to use the address as the immediate value of the
1349 // parameter, rather than a pointer to it.
David Blaikie770530b2013-10-21 17:28:37 +00001350 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value);
1351 addBlock(ParamDIE, dwarf::DW_AT_location, Block);
Eric Christopherafdd1f82013-08-08 07:40:31 +00001352 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_template_param) {
David Blaikiee88939c2013-06-22 18:59:11 +00001353 assert(isa<MDString>(Val));
1354 addString(ParamDIE, dwarf::DW_AT_GNU_template_name,
1355 cast<MDString>(Val)->getString());
Eric Christopherafdd1f82013-08-08 07:40:31 +00001356 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_parameter_pack) {
David Blaikiee88939c2013-06-22 18:59:11 +00001357 assert(isa<MDNode>(Val));
1358 DIArray A(cast<MDNode>(Val));
1359 addTemplateParams(*ParamDIE, A);
David Blaikie4de9d722013-05-10 21:52:07 +00001360 }
1361 }
Devang Patel161b2f42011-04-12 23:21:44 +00001362}
1363
Devang Patel31c5d052011-05-06 16:57:54 +00001364/// getOrCreateNameSpace - Create a DIE for DINameSpace.
1365DIE *CompileUnit::getOrCreateNameSpace(DINameSpace NS) {
Manman Ren6b713802013-10-29 05:49:41 +00001366 // Construct the context before querying for the existence of the DIE in case
1367 // such construction creates the DIE.
1368 DIE *ContextDIE = getOrCreateContextDIE(NS.getContext());
1369 if (!ContextDIE)
1370 // If the context is null, DIE should belong to the CU we call construct
1371 // function on.
1372 ContextDIE = CUDie.get();
1373
Devang Patel31c5d052011-05-06 16:57:54 +00001374 DIE *NDie = getDIE(NS);
1375 if (NDie)
1376 return NDie;
Manman Ren6b713802013-10-29 05:49:41 +00001377 NDie = createAndAddDIE(dwarf::DW_TAG_namespace, *ContextDIE, NS);
1378
Eric Christopher09ac3d82011-11-07 09:24:32 +00001379 if (!NS.getName().empty()) {
Nick Lewycky390c40d2011-10-27 06:44:11 +00001380 addString(NDie, dwarf::DW_AT_name, NS.getName());
Eric Christopher09ac3d82011-11-07 09:24:32 +00001381 addAccelNamespace(NS.getName(), NDie);
Eric Christopher91986572013-10-17 02:06:06 +00001382 addGlobalName(NS.getName(), NDie, NS.getContext());
Eric Christopher09ac3d82011-11-07 09:24:32 +00001383 } else
1384 addAccelNamespace("(anonymous namespace)", NDie);
Devang Patel31c5d052011-05-06 16:57:54 +00001385 addSourceLine(NDie, NS);
Devang Patel31c5d052011-05-06 16:57:54 +00001386 return NDie;
1387}
1388
Devang Pateldbc64af2011-08-15 17:24:54 +00001389/// getOrCreateSubprogramDIE - Create new DIE using SP.
1390DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
David Blaikiec32f2332013-10-04 01:39:59 +00001391 // Construct the context before querying for the existence of the DIE in case
1392 // such construction creates the DIE (as is the case for member function
1393 // declarations).
Manman Renb8e48a62013-10-10 18:40:01 +00001394 DIE *ContextDIE = getOrCreateContextDIE(resolve(SP.getContext()));
David Blaikiec32f2332013-10-04 01:39:59 +00001395 if (!ContextDIE)
1396 ContextDIE = CUDie.get();
1397
Eric Christopher3f045002013-10-04 17:08:38 +00001398 DIE *SPDie = getDIE(SP);
Devang Pateldbc64af2011-08-15 17:24:54 +00001399 if (SPDie)
1400 return SPDie;
1401
Manman Renbbdd02c2013-10-29 00:58:04 +00001402 DISubprogram SPDecl = SP.getFunctionDeclaration();
1403 if (SPDecl.isSubprogram())
1404 // Add subprogram definitions to the CU die directly.
1405 ContextDIE = CUDie.get();
Peter Collingbourne27302f02012-05-27 18:36:44 +00001406
1407 // DW_TAG_inlined_subroutine may refer to this DIE.
Manman Renbbdd02c2013-10-29 00:58:04 +00001408 SPDie = createAndAddDIE(dwarf::DW_TAG_subprogram, *ContextDIE, SP);
Peter Collingbourne27302f02012-05-27 18:36:44 +00001409
Rafael Espindola01b55b42011-11-10 22:34:29 +00001410 DIE *DeclDie = NULL;
Manman Ren250f4e82013-10-23 22:12:26 +00001411 if (SPDecl.isSubprogram())
Rafael Espindola01b55b42011-11-10 22:34:29 +00001412 DeclDie = getOrCreateSubprogramDIE(SPDecl);
Rafael Espindola01b55b42011-11-10 22:34:29 +00001413
Devang Pateldbc64af2011-08-15 17:24:54 +00001414 // Add function template parameters.
1415 addTemplateParams(*SPDie, SP.getTemplateParams());
1416
Devang Pateldbc64af2011-08-15 17:24:54 +00001417 // If this DIE is going to refer declaration info using AT_specification
Eric Christopherc4968752013-05-09 00:42:33 +00001418 // then there is no need to add other attributes.
Rafael Espindola01b55b42011-11-10 22:34:29 +00001419 if (DeclDie) {
1420 // Refer function declaration directly.
Manman Ren87b110a2013-10-11 23:58:05 +00001421 addDIEEntry(SPDie, dwarf::DW_AT_specification, DeclDie);
Rafael Espindola01b55b42011-11-10 22:34:29 +00001422
Devang Pateldbc64af2011-08-15 17:24:54 +00001423 return SPDie;
Rafael Espindola01b55b42011-11-10 22:34:29 +00001424 }
Devang Pateldbc64af2011-08-15 17:24:54 +00001425
Eric Christophercbbd5b12012-08-23 22:52:55 +00001426 // Add the linkage name if we have one.
Michael Gottesmandc42d032013-09-04 04:39:38 +00001427 StringRef LinkageName = SP.getLinkageName();
1428 if (!LinkageName.empty())
Eric Christophercbbd5b12012-08-23 22:52:55 +00001429 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c2b4be2013-06-01 17:51:14 +00001430 GlobalValue::getRealLinkageName(LinkageName));
Eric Christophercbbd5b12012-08-23 22:52:55 +00001431
Devang Pateldbc64af2011-08-15 17:24:54 +00001432 // Constructors and operators for anonymous aggregates do not have names.
1433 if (!SP.getName().empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001434 addString(SPDie, dwarf::DW_AT_name, SP.getName());
Devang Pateldbc64af2011-08-15 17:24:54 +00001435
1436 addSourceLine(SPDie, SP);
1437
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001438 // Add the prototype if we have a prototype and we have a C like
1439 // language.
Eric Christopher7b878952013-08-26 23:50:38 +00001440 uint16_t Language = DICompileUnit(Node).getLanguage();
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001441 if (SP.isPrototyped() &&
Eric Christopher6efc0432013-10-19 01:04:47 +00001442 (Language == dwarf::DW_LANG_C89 || Language == dwarf::DW_LANG_C99 ||
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001443 Language == dwarf::DW_LANG_ObjC))
Eric Christopher873cf0a2012-08-24 01:14:27 +00001444 addFlag(SPDie, dwarf::DW_AT_prototyped);
Devang Pateldbc64af2011-08-15 17:24:54 +00001445
Devang Pateldbc64af2011-08-15 17:24:54 +00001446 DICompositeType SPTy = SP.getType();
David Blaikie3d331842013-05-22 23:22:18 +00001447 assert(SPTy.getTag() == dwarf::DW_TAG_subroutine_type &&
1448 "the type of a subprogram should be a subroutine");
Devang Pateldbc64af2011-08-15 17:24:54 +00001449
David Blaikie3d331842013-05-22 23:22:18 +00001450 DIArray Args = SPTy.getTypeArray();
Eric Christopheref2d9192013-10-21 17:48:51 +00001451 // Add a return type. If this is a type like a C/C++ void type we don't add a
1452 // return type.
Eric Christopherdc1363f2013-08-08 07:40:37 +00001453 if (Args.getElement(0))
1454 addType(SPDie, DIType(Args.getElement(0)));
Devang Pateldbc64af2011-08-15 17:24:54 +00001455
1456 unsigned VK = SP.getVirtuality();
1457 if (VK) {
Nick Lewycky798313d2011-12-14 00:56:07 +00001458 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
Devang Pateldbc64af2011-08-15 17:24:54 +00001459 DIEBlock *Block = getDIEBlock();
David Blaikie770530b2013-10-21 17:28:37 +00001460 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1461 addUInt(Block, dwarf::DW_FORM_udata, SP.getVirtualIndex());
1462 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, Block);
Devang Pateldbc64af2011-08-15 17:24:54 +00001463 ContainingTypeMap.insert(std::make_pair(SPDie,
Eric Christophereee74fb2013-10-05 00:27:02 +00001464 resolve(SP.getContainingType())));
Devang Pateldbc64af2011-08-15 17:24:54 +00001465 }
1466
1467 if (!SP.isDefinition()) {
Eric Christopher873cf0a2012-08-24 01:14:27 +00001468 addFlag(SPDie, dwarf::DW_AT_declaration);
Eric Christopher8b4310b2012-11-21 00:34:38 +00001469
Devang Pateldbc64af2011-08-15 17:24:54 +00001470 // Add arguments. Do not add arguments for subprogram definition. They will
1471 // be handled while processing variables.
Eric Christopher6efc0432013-10-19 01:04:47 +00001472 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
Manman Ren1a5e7872013-10-29 00:53:03 +00001473 DIE *Arg = createAndAddDIE(dwarf::DW_TAG_formal_parameter, *SPDie);
David Blaikie3d331842013-05-22 23:22:18 +00001474 DIType ATy = DIType(Args.getElement(i));
1475 addType(Arg, ATy);
1476 if (ATy.isArtificial())
1477 addFlag(Arg, dwarf::DW_AT_artificial);
David Blaikie3d331842013-05-22 23:22:18 +00001478 }
Devang Pateldbc64af2011-08-15 17:24:54 +00001479 }
1480
1481 if (SP.isArtificial())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001482 addFlag(SPDie, dwarf::DW_AT_artificial);
Devang Pateldbc64af2011-08-15 17:24:54 +00001483
1484 if (!SP.isLocalToUnit())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001485 addFlag(SPDie, dwarf::DW_AT_external);
Devang Pateldbc64af2011-08-15 17:24:54 +00001486
1487 if (SP.isOptimized())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001488 addFlag(SPDie, dwarf::DW_AT_APPLE_optimized);
Devang Pateldbc64af2011-08-15 17:24:54 +00001489
1490 if (unsigned isa = Asm->getISAEncoding()) {
1491 addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1492 }
1493
1494 return SPDie;
1495}
1496
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001497// Return const expression if value is a GEP to access merged global
1498// constant. e.g.
1499// i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
1500static const ConstantExpr *getMergedGlobalExpr(const Value *V) {
1501 const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
1502 if (!CE || CE->getNumOperands() != 3 ||
1503 CE->getOpcode() != Instruction::GetElementPtr)
1504 return NULL;
1505
1506 // First operand points to a global struct.
1507 Value *Ptr = CE->getOperand(0);
1508 if (!isa<GlobalValue>(Ptr) ||
1509 !isa<StructType>(cast<PointerType>(Ptr->getType())->getElementType()))
1510 return NULL;
1511
1512 // Second operand is zero.
1513 const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
1514 if (!CI || !CI->isZero())
1515 return NULL;
1516
1517 // Third operand is offset.
1518 if (!isa<ConstantInt>(CE->getOperand(2)))
1519 return NULL;
1520
1521 return CE;
1522}
1523
1524/// createGlobalVariableDIE - create global variable DIE.
1525void CompileUnit::createGlobalVariableDIE(const MDNode *N) {
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001526 // Check for pre-existence.
Devang Patel49e2f032011-08-18 22:21:50 +00001527 if (getDIE(N))
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001528 return;
1529
Devang Patel49e2f032011-08-18 22:21:50 +00001530 DIGlobalVariable GV(N);
Manman Rend03d2b22013-07-08 18:33:29 +00001531 if (!GV.isGlobalVariable())
Devang Patel28bea082011-08-18 23:17:55 +00001532 return;
1533
Eric Christopherccb66362013-10-04 23:49:26 +00001534 DIScope GVContext = GV.getContext();
Eric Christopher6b6061f2013-01-16 01:22:23 +00001535 DIType GTy = GV.getType();
1536
1537 // If this is a static data member definition, some attributes belong
1538 // to the declaration DIE.
1539 DIE *VariableDIE = NULL;
Manman Ren945e8282013-02-01 23:54:37 +00001540 bool IsStaticMember = false;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001541 DIDerivedType SDMDecl = GV.getStaticDataMemberDeclaration();
1542 if (SDMDecl.Verify()) {
1543 assert(SDMDecl.isStaticMember() && "Expected static member decl");
1544 // We need the declaration DIE that is in the static member's class.
Manman Ren655a10d2013-10-14 20:33:57 +00001545 VariableDIE = getOrCreateStaticMemberDIE(SDMDecl);
Manman Ren945e8282013-02-01 23:54:37 +00001546 IsStaticMember = true;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001547 }
1548
1549 // If this is not a static data member definition, create the variable
1550 // DIE and add the initial set of attributes to it.
1551 if (!VariableDIE) {
Manman Ren6b713802013-10-29 05:49:41 +00001552 // Construct the context before querying for the existence of the DIE in
1553 // case such construction creates the DIE.
1554 DIE *ContextDIE = getOrCreateContextDIE(GVContext);
1555 if (!ContextDIE)
1556 ContextDIE = CUDie.get();
1557
Eric Christopher6b6061f2013-01-16 01:22:23 +00001558 // Add to map.
Manman Ren6b713802013-10-29 05:49:41 +00001559 VariableDIE = createAndAddDIE(GV.getTag(), *ContextDIE, N);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001560
1561 // Add name and type.
1562 addString(VariableDIE, dwarf::DW_AT_name, GV.getDisplayName());
1563 addType(VariableDIE, GTy);
1564
1565 // Add scoping info.
Eric Christophera486f552013-10-16 01:37:49 +00001566 if (!GV.isLocalToUnit())
Eric Christopher6b6061f2013-01-16 01:22:23 +00001567 addFlag(VariableDIE, dwarf::DW_AT_external);
1568
1569 // Add line number info.
1570 addSourceLine(VariableDIE, GV);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001571 }
1572
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001573 // Add location.
Eric Christopher09ac3d82011-11-07 09:24:32 +00001574 bool addToAccelTable = false;
Eric Christopherd61c34b2011-11-11 03:16:32 +00001575 DIE *VariableSpecDIE = NULL;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001576 bool isGlobalVariable = GV.getGlobal() != NULL;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001577 if (isGlobalVariable) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001578 addToAccelTable = true;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001579 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Rafael Espindolaffc7dca2013-10-29 17:07:16 +00001580 const MCSymbol *Sym = Asm->getSymbol(GV.getGlobal());
David Blaikie59eaa382013-06-28 20:05:11 +00001581 if (GV.getGlobal()->isThreadLocal()) {
1582 // FIXME: Make this work with -gsplit-dwarf.
1583 unsigned PointerSize = Asm->getDataLayout().getPointerSize();
1584 assert((PointerSize == 4 || PointerSize == 8) &&
1585 "Add support for other sizes if necessary");
Ulrich Weigand716a94f2013-07-02 18:47:09 +00001586 const MCExpr *Expr =
David Blaikie8fed05e2013-07-01 23:55:52 +00001587 Asm->getObjFileLowering().getDebugThreadLocalSymbol(Sym);
David Blaikie59eaa382013-06-28 20:05:11 +00001588 // Based on GCC's support for TLS:
David Blaikie8fed05e2013-07-01 23:55:52 +00001589 if (!DD->useSplitDwarf()) {
1590 // 1) Start with a constNu of the appropriate pointer size
David Blaikie770530b2013-10-21 17:28:37 +00001591 addUInt(Block, dwarf::DW_FORM_data1,
David Blaikie8fed05e2013-07-01 23:55:52 +00001592 PointerSize == 4 ? dwarf::DW_OP_const4u : dwarf::DW_OP_const8u);
Richard Mitton379f76e2013-10-07 18:39:18 +00001593 // 2) containing the (relocated) offset of the TLS variable
1594 // within the module's TLS block.
David Blaikie770530b2013-10-21 17:28:37 +00001595 addExpr(Block, dwarf::DW_FORM_udata, Expr);
David Blaikie8fed05e2013-07-01 23:55:52 +00001596 } else {
David Blaikie770530b2013-10-21 17:28:37 +00001597 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_const_index);
1598 addUInt(Block, dwarf::DW_FORM_udata, DU->getAddrPoolIndex(Expr));
David Blaikie8fed05e2013-07-01 23:55:52 +00001599 }
Richard Mitton379f76e2013-10-07 18:39:18 +00001600 // 3) followed by a custom OP to make the debugger do a TLS lookup.
David Blaikie770530b2013-10-21 17:28:37 +00001601 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_push_tls_address);
David Blaikie59eaa382013-06-28 20:05:11 +00001602 } else
1603 addOpAddress(Block, Sym);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001604 // Do not create specification DIE if context is either compile unit
1605 // or a subprogram.
Devang Patel1dd4e562011-09-21 23:41:11 +00001606 if (GVContext && GV.isDefinition() && !GVContext.isCompileUnit() &&
Manman Ren02d29672013-09-09 19:05:21 +00001607 !GVContext.isFile() && !DD->isSubprogramContext(GVContext)) {
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001608 // Create specification DIE.
Manman Ren1a5e7872013-10-29 00:53:03 +00001609 VariableSpecDIE = createAndAddDIE(dwarf::DW_TAG_variable, *CUDie.get());
Manman Ren87b110a2013-10-11 23:58:05 +00001610 addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification, VariableDIE);
David Blaikie770530b2013-10-21 17:28:37 +00001611 addBlock(VariableSpecDIE, dwarf::DW_AT_location, Block);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001612 // A static member's declaration is already flagged as such.
1613 if (!SDMDecl.Verify())
1614 addFlag(VariableDIE, dwarf::DW_AT_declaration);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001615 } else {
David Blaikie770530b2013-10-21 17:28:37 +00001616 addBlock(VariableDIE, dwarf::DW_AT_location, Block);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001617 }
Michael Gottesmandc42d032013-09-04 04:39:38 +00001618 // Add the linkage name.
Eric Christopher6b6061f2013-01-16 01:22:23 +00001619 StringRef LinkageName = GV.getLinkageName();
Michael Gottesmandc42d032013-09-04 04:39:38 +00001620 if (!LinkageName.empty())
Eric Christopher8d45a982013-02-27 23:49:47 +00001621 // From DWARF4: DIEs to which DW_AT_linkage_name may apply include:
1622 // TAG_common_block, TAG_constant, TAG_entry_point, TAG_subprogram and
1623 // TAG_variable.
Eric Christopher6efc0432013-10-19 01:04:47 +00001624 addString(IsStaticMember && VariableSpecDIE ? VariableSpecDIE
1625 : VariableDIE,
1626 dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c2b4be2013-06-01 17:51:14 +00001627 GlobalValue::getRealLinkageName(LinkageName));
Eric Christopher8b4310b2012-11-21 00:34:38 +00001628 } else if (const ConstantInt *CI =
Eric Christopher6efc0432013-10-19 01:04:47 +00001629 dyn_cast_or_null<ConstantInt>(GV.getConstant())) {
Adrian Prantl2e892e42013-04-04 22:56:49 +00001630 // AT_const_value was added when the static member was created. To avoid
Manman Ren945e8282013-02-01 23:54:37 +00001631 // emitting AT_const_value multiple times, we only add AT_const_value when
1632 // it is not a static member.
1633 if (!IsStaticMember)
Manman Renc664d762013-10-05 01:43:03 +00001634 addConstantValue(VariableDIE, CI, isUnsignedDIType(DD, GTy));
Manman Ren945e8282013-02-01 23:54:37 +00001635 } else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001636 addToAccelTable = true;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001637 // GV is a merged global.
1638 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1639 Value *Ptr = CE->getOperand(0);
Rafael Espindolaffc7dca2013-10-29 17:07:16 +00001640 addOpAddress(Block, Asm->getSymbol(cast<GlobalValue>(Ptr)));
David Blaikie770530b2013-10-21 17:28:37 +00001641 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
Eric Christopher6efc0432013-10-19 01:04:47 +00001642 SmallVector<Value *, 3> Idx(CE->op_begin() + 1, CE->op_end());
David Blaikie770530b2013-10-21 17:28:37 +00001643 addUInt(Block, dwarf::DW_FORM_udata,
Eric Christopher6efc0432013-10-19 01:04:47 +00001644 Asm->getDataLayout().getIndexedOffset(Ptr->getType(), Idx));
David Blaikie770530b2013-10-21 17:28:37 +00001645 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1646 addBlock(VariableDIE, dwarf::DW_AT_location, Block);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001647 }
1648
Eric Christopherd117fbb2011-11-11 01:55:22 +00001649 if (addToAccelTable) {
1650 DIE *AddrDIE = VariableSpecDIE ? VariableSpecDIE : VariableDIE;
1651 addAccelName(GV.getName(), AddrDIE);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001652
Eric Christopherd117fbb2011-11-11 01:55:22 +00001653 // If the linkage name is different than the name, go ahead and output
1654 // that as well into the name table.
1655 if (GV.getLinkageName() != "" && GV.getName() != GV.getLinkageName())
1656 addAccelName(GV.getLinkageName(), AddrDIE);
1657 }
Eric Christophera486f552013-10-16 01:37:49 +00001658
1659 if (!GV.isLocalToUnit())
Eric Christopher91986572013-10-17 02:06:06 +00001660 addGlobalName(GV.getName(), VariableSpecDIE ? VariableSpecDIE : VariableDIE,
1661 GV.getContext());
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001662}
1663
Devang Patel161b2f42011-04-12 23:21:44 +00001664/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
Eric Christopher4d069bf2012-05-22 18:45:24 +00001665void CompileUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR,
1666 DIE *IndexTy) {
Manman Ren1a5e7872013-10-29 00:53:03 +00001667 DIE *DW_Subrange = createAndAddDIE(dwarf::DW_TAG_subrange_type, Buffer);
Manman Ren87b110a2013-10-11 23:58:05 +00001668 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, IndexTy);
Devang Patel161b2f42011-04-12 23:21:44 +00001669
Bill Wendling222c2fd2012-12-06 07:38:10 +00001670 // The LowerBound value defines the lower bounds which is typically zero for
1671 // C/C++. The Count value is the number of elements. Values are 64 bit. If
1672 // Count == -1 then the array is unbounded and we do not emit
1673 // DW_AT_lower_bound and DW_AT_upper_bound attributes. If LowerBound == 0 and
1674 // Count == 0, then the array has zero elements in which case we do not emit
1675 // an upper bound.
1676 int64_t LowerBound = SR.getLo();
Bill Wendling6afe4782012-12-06 07:55:19 +00001677 int64_t DefaultLowerBound = getDefaultLowerBound();
Bill Wendling9493dae2012-12-04 21:34:03 +00001678 int64_t Count = SR.getCount();
Devang Patel161b2f42011-04-12 23:21:44 +00001679
Bill Wendling6afe4782012-12-06 07:55:19 +00001680 if (DefaultLowerBound == -1 || LowerBound != DefaultLowerBound)
David Blaikie770530b2013-10-21 17:28:37 +00001681 addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, None, LowerBound);
Bill Wendling222c2fd2012-12-06 07:38:10 +00001682
1683 if (Count != -1 && Count != 0)
Bill Wendling9493dae2012-12-04 21:34:03 +00001684 // FIXME: An unbounded array should reference the expression that defines
1685 // the array.
David Blaikie770530b2013-10-21 17:28:37 +00001686 addUInt(DW_Subrange, dwarf::DW_AT_upper_bound, None, LowerBound + Count - 1);
Devang Patel161b2f42011-04-12 23:21:44 +00001687}
1688
1689/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
Eric Christopher883ed6b2013-11-11 18:52:31 +00001690void CompileUnit::constructArrayTypeDIE(DIE &Buffer, DICompositeType CTy) {
1691 if (CTy.isVector())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001692 addFlag(&Buffer, dwarf::DW_AT_GNU_vector);
Devang Patel161b2f42011-04-12 23:21:44 +00001693
Eric Christopherdc1363f2013-08-08 07:40:37 +00001694 // Emit the element type.
Eric Christopher883ed6b2013-11-11 18:52:31 +00001695 addType(&Buffer, resolve(CTy.getTypeDerivedFrom()));
Devang Patel161b2f42011-04-12 23:21:44 +00001696
1697 // Get an anonymous type for index type.
Eric Christopher8cab6ed2013-01-04 21:51:53 +00001698 // FIXME: This type should be passed down from the front end
1699 // as different languages may have different sizes for indexes.
Devang Patel161b2f42011-04-12 23:21:44 +00001700 DIE *IdxTy = getIndexTyDie();
1701 if (!IdxTy) {
1702 // Construct an anonymous type for index type.
Manman Ren1a5e7872013-10-29 00:53:03 +00001703 IdxTy = createAndAddDIE(dwarf::DW_TAG_base_type, *CUDie.get());
Eric Christopher8cab6ed2013-01-04 21:51:53 +00001704 addString(IdxTy, dwarf::DW_AT_name, "int");
David Blaikie770530b2013-10-21 17:28:37 +00001705 addUInt(IdxTy, dwarf::DW_AT_byte_size, None, sizeof(int32_t));
Devang Patel161b2f42011-04-12 23:21:44 +00001706 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1707 dwarf::DW_ATE_signed);
Devang Patel161b2f42011-04-12 23:21:44 +00001708 setIndexTyDie(IdxTy);
1709 }
1710
1711 // Add subranges to array type.
Eric Christopher883ed6b2013-11-11 18:52:31 +00001712 DIArray Elements = CTy.getTypeArray();
Devang Patel161b2f42011-04-12 23:21:44 +00001713 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1714 DIDescriptor Element = Elements.getElement(i);
1715 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1716 constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1717 }
1718}
1719
1720/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
Manman Ren99addee2013-10-23 22:57:12 +00001721void CompileUnit::constructEnumTypeDIE(DIE &Buffer, DIEnumerator ETy) {
Manman Ren1a5e7872013-10-29 00:53:03 +00001722 DIE *Enumerator = createAndAddDIE(dwarf::DW_TAG_enumerator, Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +00001723 StringRef Name = ETy.getName();
Nick Lewycky390c40d2011-10-27 06:44:11 +00001724 addString(Enumerator, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001725 int64_t Value = ETy.getEnumValue();
1726 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
Devang Patel161b2f42011-04-12 23:21:44 +00001727}
1728
Devang Pateldbc64af2011-08-15 17:24:54 +00001729/// constructContainingTypeDIEs - Construct DIEs for types that contain
1730/// vtables.
1731void CompileUnit::constructContainingTypeDIEs() {
1732 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
Eric Christopher6efc0432013-10-19 01:04:47 +00001733 CE = ContainingTypeMap.end();
1734 CI != CE; ++CI) {
Devang Pateldbc64af2011-08-15 17:24:54 +00001735 DIE *SPDie = CI->first;
1736 const MDNode *N = CI->second;
Eric Christopher6efc0432013-10-19 01:04:47 +00001737 if (!N)
1738 continue;
Eric Christopher3f045002013-10-04 17:08:38 +00001739 DIE *NDie = getDIE(N);
Eric Christopher6efc0432013-10-19 01:04:47 +00001740 if (!NDie)
1741 continue;
Manman Ren87b110a2013-10-11 23:58:05 +00001742 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, NDie);
Devang Pateldbc64af2011-08-15 17:24:54 +00001743 }
1744}
1745
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001746/// constructVariableDIE - Construct a DIE for the given DbgVariable.
Eric Christopher6efc0432013-10-19 01:04:47 +00001747DIE *CompileUnit::constructVariableDIE(DbgVariable *DV, bool isScopeAbstract) {
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001748 StringRef Name = DV->getName();
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001749
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001750 // Define variable debug information entry.
David Blaikie916d49e2013-10-04 23:21:16 +00001751 DIE *VariableDie = new DIE(DV->getTag());
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001752 DbgVariable *AbsVar = DV->getAbstractVariable();
1753 DIE *AbsDIE = AbsVar ? AbsVar->getDIE() : NULL;
Manman Ren742671b2013-05-29 17:16:59 +00001754 if (AbsDIE)
Manman Ren87b110a2013-10-11 23:58:05 +00001755 addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin, AbsDIE);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001756 else {
David Blaikie2883fd42013-08-19 03:34:03 +00001757 if (!Name.empty())
1758 addString(VariableDie, dwarf::DW_AT_name, Name);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001759 addSourceLine(VariableDie, DV->getVariable());
1760 addType(VariableDie, DV->getType());
1761 }
1762
1763 if (DV->isArtificial())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001764 addFlag(VariableDie, dwarf::DW_AT_artificial);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001765
1766 if (isScopeAbstract) {
1767 DV->setDIE(VariableDie);
1768 return VariableDie;
1769 }
1770
1771 // Add variable address.
1772
1773 unsigned Offset = DV->getDotDebugLocOffset();
1774 if (Offset != ~0U) {
Eric Christopherafbe0e22013-06-24 21:34:55 +00001775 addLabel(VariableDie, dwarf::DW_AT_location, dwarf::DW_FORM_data4,
1776 Asm->GetTempSymbol("debug_loc", Offset));
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001777 DV->setDIE(VariableDie);
1778 return VariableDie;
1779 }
1780
Eric Christopher8cf5e742011-10-03 15:49:20 +00001781 // Check if variable is described by a DBG_VALUE instruction.
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001782 if (const MachineInstr *DVInsn = DV->getMInsn()) {
David Blaikie6d9dbd52013-06-16 20:34:15 +00001783 assert(DVInsn->getNumOperands() == 3);
1784 if (DVInsn->getOperand(0).isReg()) {
1785 const MachineOperand RegOp = DVInsn->getOperand(0);
Adrian Prantlb2754912013-07-09 21:44:06 +00001786 // If the second operand is an immediate, this is an indirect value.
Adrian Prantl35176402013-07-09 20:28:37 +00001787 if (DVInsn->getOperand(1).isImm()) {
Eric Christopher6efc0432013-10-19 01:04:47 +00001788 MachineLocation Location(RegOp.getReg(),
1789 DVInsn->getOperand(1).getImm());
Eric Christopherf61dbc12013-06-24 21:07:27 +00001790 addVariableAddress(*DV, VariableDie, Location);
David Blaikie6d9dbd52013-06-16 20:34:15 +00001791 } else if (RegOp.getReg())
Eric Christopherf61dbc12013-06-24 21:07:27 +00001792 addVariableAddress(*DV, VariableDie, MachineLocation(RegOp.getReg()));
David Blaikie6d9dbd52013-06-16 20:34:15 +00001793 } else if (DVInsn->getOperand(0).isImm())
Eric Christophere4721492013-07-03 01:08:30 +00001794 addConstantValue(VariableDie, DVInsn->getOperand(0), DV->getType());
David Blaikie6d9dbd52013-06-16 20:34:15 +00001795 else if (DVInsn->getOperand(0).isFPImm())
Eric Christophere4721492013-07-03 01:08:30 +00001796 addConstantFPValue(VariableDie, DVInsn->getOperand(0));
David Blaikie6d9dbd52013-06-16 20:34:15 +00001797 else if (DVInsn->getOperand(0).isCImm())
Eric Christophere4721492013-07-03 01:08:30 +00001798 addConstantValue(VariableDie, DVInsn->getOperand(0).getCImm(),
Manman Renc664d762013-10-05 01:43:03 +00001799 isUnsignedDIType(DD, DV->getType()));
Eric Christophere4721492013-07-03 01:08:30 +00001800
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001801 DV->setDIE(VariableDie);
1802 return VariableDie;
1803 } else {
1804 // .. else use frame index.
1805 int FI = DV->getFrameIndex();
1806 if (FI != ~0) {
1807 unsigned FrameReg = 0;
1808 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
Eric Christopher6efc0432013-10-19 01:04:47 +00001809 int Offset = TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001810 MachineLocation Location(FrameReg, Offset);
Eric Christopherf61dbc12013-06-24 21:07:27 +00001811 addVariableAddress(*DV, VariableDie, Location);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001812 }
1813 }
1814
1815 DV->setDIE(VariableDie);
1816 return VariableDie;
1817}
1818
Manman Rena1d25b62013-10-23 23:00:44 +00001819/// constructMemberDIE - Construct member DIE from DIDerivedType.
1820void CompileUnit::constructMemberDIE(DIE &Buffer, DIDerivedType DT) {
Manman Ren1a5e7872013-10-29 00:53:03 +00001821 DIE *MemberDie = createAndAddDIE(DT.getTag(), Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +00001822 StringRef Name = DT.getName();
1823 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001824 addString(MemberDie, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001825
Manman Ren017ceda2013-10-08 18:42:58 +00001826 addType(MemberDie, resolve(DT.getTypeDerivedFrom()));
Devang Patel161b2f42011-04-12 23:21:44 +00001827
1828 addSourceLine(MemberDie, DT);
1829
1830 DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
David Blaikie770530b2013-10-21 17:28:37 +00001831 addUInt(MemLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
Devang Patel161b2f42011-04-12 23:21:44 +00001832
Devang Patel161b2f42011-04-12 23:21:44 +00001833
Eric Christopher6efc0432013-10-19 01:04:47 +00001834 if (DT.getTag() == dwarf::DW_TAG_inheritance && DT.isVirtual()) {
Devang Patel161b2f42011-04-12 23:21:44 +00001835
1836 // For C++, virtual base classes are not at fixed offset. Use following
1837 // expression to extract appropriate offset from vtable.
1838 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1839
1840 DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
David Blaikie770530b2013-10-21 17:28:37 +00001841 addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1842 addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1843 addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1844 addUInt(VBaseLocationDie, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1845 addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1846 addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1847 addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
Devang Patel161b2f42011-04-12 23:21:44 +00001848
David Blaikie770530b2013-10-21 17:28:37 +00001849 addBlock(MemberDie, dwarf::DW_AT_data_member_location, VBaseLocationDie);
David Blaikie9b933922013-11-01 00:25:45 +00001850 } else {
1851 uint64_t Size = DT.getSizeInBits();
1852 uint64_t FieldSize = getBaseTypeSize(DD, DT);
1853 uint64_t OffsetInBytes;
1854
1855 if (Size != FieldSize) {
1856 // Handle bitfield.
1857 addUInt(MemberDie, dwarf::DW_AT_byte_size, None,
1858 getBaseTypeSize(DD, DT) >> 3);
1859 addUInt(MemberDie, dwarf::DW_AT_bit_size, None, DT.getSizeInBits());
1860
1861 uint64_t Offset = DT.getOffsetInBits();
1862 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1863 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1864 uint64_t FieldOffset = (HiMark - FieldSize);
1865 Offset -= FieldOffset;
1866
1867 // Maybe we need to work from the other end.
1868 if (Asm->getDataLayout().isLittleEndian())
1869 Offset = FieldSize - (Offset + Size);
1870 addUInt(MemberDie, dwarf::DW_AT_bit_offset, None, Offset);
1871
1872 // Here WD_AT_data_member_location points to the anonymous
1873 // field that includes this bit field.
1874 OffsetInBytes = FieldOffset >> 3;
1875 } else
1876 // This is not a bitfield.
1877 OffsetInBytes = DT.getOffsetInBits() >> 3;
1878 addUInt(MemberDie, dwarf::DW_AT_data_member_location, None,
1879 OffsetInBytes);
1880 }
Devang Patel161b2f42011-04-12 23:21:44 +00001881
1882 if (DT.isProtected())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001883 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001884 dwarf::DW_ACCESS_protected);
1885 else if (DT.isPrivate())
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_private);
1888 // Otherwise C++ member and base classes are considered public.
Eric Christopher8b4310b2012-11-21 00:34:38 +00001889 else
Nick Lewycky13aaca52011-12-13 05:09:11 +00001890 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001891 dwarf::DW_ACCESS_public);
1892 if (DT.isVirtual())
Nick Lewycky798313d2011-12-14 00:56:07 +00001893 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001894 dwarf::DW_VIRTUALITY_virtual);
Devang Patele9db5e22011-04-16 00:11:51 +00001895
1896 // Objective-C properties.
Devang Patel6588abf2012-02-06 17:49:43 +00001897 if (MDNode *PNode = DT.getObjCProperty())
1898 if (DIEEntry *PropertyDie = getDIEEntry(PNode))
Eric Christopher8b4310b2012-11-21 00:34:38 +00001899 MemberDie->addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4,
Devang Patel6588abf2012-02-06 17:49:43 +00001900 PropertyDie);
1901
David Blaikie01bc2b32012-12-13 22:43:07 +00001902 if (DT.isArtificial())
1903 addFlag(MemberDie, dwarf::DW_AT_artificial);
Devang Patel161b2f42011-04-12 23:21:44 +00001904}
Eric Christopher6b6061f2013-01-16 01:22:23 +00001905
Manman Ren655a10d2013-10-14 20:33:57 +00001906/// getOrCreateStaticMemberDIE - Create new DIE for C++ static member.
1907DIE *CompileUnit::getOrCreateStaticMemberDIE(const DIDerivedType DT) {
Eric Christopher6b6061f2013-01-16 01:22:23 +00001908 if (!DT.Verify())
1909 return NULL;
1910
Manman Ren655a10d2013-10-14 20:33:57 +00001911 // Construct the context before querying for the existence of the DIE in case
1912 // such construction creates the DIE.
1913 DIE *ContextDIE = getOrCreateContextDIE(resolve(DT.getContext()));
1914 assert(ContextDIE && "Static member should belong to a non-CU context.");
1915
1916 DIE *StaticMemberDIE = getDIE(DT);
1917 if (StaticMemberDIE)
1918 return StaticMemberDIE;
1919
Manman Ren1a5e7872013-10-29 00:53:03 +00001920 StaticMemberDIE = createAndAddDIE(DT.getTag(), *ContextDIE, DT);
Manman Ren655a10d2013-10-14 20:33:57 +00001921
Manman Ren017ceda2013-10-08 18:42:58 +00001922 DIType Ty = resolve(DT.getTypeDerivedFrom());
Eric Christopher6b6061f2013-01-16 01:22:23 +00001923
1924 addString(StaticMemberDIE, dwarf::DW_AT_name, DT.getName());
1925 addType(StaticMemberDIE, Ty);
1926 addSourceLine(StaticMemberDIE, DT);
1927 addFlag(StaticMemberDIE, dwarf::DW_AT_external);
1928 addFlag(StaticMemberDIE, dwarf::DW_AT_declaration);
1929
1930 // FIXME: We could omit private if the parent is a class_type, and
1931 // public if the parent is something else.
1932 if (DT.isProtected())
1933 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1934 dwarf::DW_ACCESS_protected);
1935 else if (DT.isPrivate())
1936 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1937 dwarf::DW_ACCESS_private);
1938 else
1939 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1940 dwarf::DW_ACCESS_public);
1941
1942 if (const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(DT.getConstant()))
Manman Renc664d762013-10-05 01:43:03 +00001943 addConstantValue(StaticMemberDIE, CI, isUnsignedDIType(DD, Ty));
David Blaikie14268412013-01-20 01:18:01 +00001944 if (const ConstantFP *CFP = dyn_cast_or_null<ConstantFP>(DT.getConstant()))
1945 addConstantFPValue(StaticMemberDIE, CFP);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001946
Eric Christopher6b6061f2013-01-16 01:22:23 +00001947 return StaticMemberDIE;
1948}
David Blaikie1d361132013-10-30 20:42:41 +00001949
1950void CompileUnit::emitHeader(const MCSection *ASection,
1951 const MCSymbol *ASectionSym) {
1952 Asm->OutStreamer.AddComment("DWARF version number");
1953 Asm->EmitInt16(DD->getDwarfVersion());
1954 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
1955 Asm->EmitSectionOffset(Asm->GetTempSymbol(ASection->getLabelBeginName()),
1956 ASectionSym);
1957 Asm->OutStreamer.AddComment("Address Size (in bytes)");
1958 Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
1959}