blob: 4c2dfa3e27e019f7968a0d4907423eaf205df520 [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.
Eric Christopher62af0c22013-11-11 18:52:33 +0000173void CompileUnit::addString(DIE *Die, dwarf::Attribute Attribute,
174 StringRef String) {
Eric Christopher3dee5752013-07-26 17:02:41 +0000175 DIEValue *Value;
David Blaikie770530b2013-10-21 17:28:37 +0000176 dwarf::Form Form;
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000177 if (!DD->useSplitDwarf()) {
178 MCSymbol *Symb = DU->getStringPoolEntry(String);
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000179 if (Asm->needsRelocationsForDwarfStringPool())
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000180 Value = new (DIEValueAllocator) DIELabel(Symb);
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000181 else {
182 MCSymbol *StringPool = DU->getStringPoolSym();
183 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
184 }
Eric Christopher3dee5752013-07-26 17:02:41 +0000185 Form = dwarf::DW_FORM_strp;
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000186 } else {
187 unsigned idx = DU->getStringPoolIndex(String);
Eric Christopher3dee5752013-07-26 17:02:41 +0000188 Value = new (DIEValueAllocator) DIEInteger(idx);
189 Form = dwarf::DW_FORM_GNU_str_index;
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000190 }
Eric Christopher3dee5752013-07-26 17:02:41 +0000191 DIEValue *Str = new (DIEValueAllocator) DIEString(Value, String);
192 Die->addValue(Attribute, Form, Str);
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000193}
194
195/// addLocalString - Add a string attribute data and value. This is guaranteed
196/// to be in the local string pool instead of indirected.
David Blaikie770530b2013-10-21 17:28:37 +0000197void CompileUnit::addLocalString(DIE *Die, dwarf::Attribute Attribute,
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000198 StringRef String) {
Eric Christopher2e5d8702012-12-20 21:58:36 +0000199 MCSymbol *Symb = DU->getStringPoolEntry(String);
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000200 DIEValue *Value;
201 if (Asm->needsRelocationsForDwarfStringPool())
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000202 Value = new (DIEValueAllocator) DIELabel(Symb);
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000203 else {
Eric Christopher2e5d8702012-12-20 21:58:36 +0000204 MCSymbol *StringPool = DU->getStringPoolSym();
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000205 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
Nick Lewycky390c40d2011-10-27 06:44:11 +0000206 }
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000207 Die->addValue(Attribute, dwarf::DW_FORM_strp, Value);
Devang Patel161b2f42011-04-12 23:21:44 +0000208}
209
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000210/// addExpr - Add a Dwarf expression attribute data and value.
Devang Patel161b2f42011-04-12 23:21:44 +0000211///
David Blaikie770530b2013-10-21 17:28:37 +0000212void CompileUnit::addExpr(DIEBlock *Die, dwarf::Form Form, const MCExpr *Expr) {
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000213 DIEValue *Value = new (DIEValueAllocator) DIEExpr(Expr);
David Blaikie770530b2013-10-21 17:28:37 +0000214 Die->addValue((dwarf::Attribute)0, Form, Value);
Devang Patel161b2f42011-04-12 23:21:44 +0000215}
216
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000217/// addLabel - Add a Dwarf label attribute data and value.
218///
Eric Christopher62af0c22013-11-11 18:52:33 +0000219void CompileUnit::addLabel(DIE *Die, dwarf::Attribute Attribute,
220 dwarf::Form Form, const MCSymbol *Label) {
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000221 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
222 Die->addValue(Attribute, Form, Value);
David Blaikie95e72c92013-06-28 20:05:04 +0000223}
224
David Blaikie770530b2013-10-21 17:28:37 +0000225void CompileUnit::addLabel(DIEBlock *Die, dwarf::Form Form,
226 const MCSymbol *Label) {
227 addLabel(Die, (dwarf::Attribute)0, Form, Label);
228}
229
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000230/// addLabelAddress - Add a dwarf label attribute data and value using
231/// DW_FORM_addr or DW_FORM_GNU_addr_index.
232///
David Blaikie770530b2013-10-21 17:28:37 +0000233void CompileUnit::addLabelAddress(DIE *Die, dwarf::Attribute Attribute,
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000234 MCSymbol *Label) {
Alexey Samsonov9d08d692013-10-03 08:54:43 +0000235 if (Label)
236 DD->addArangeLabel(SymbolCU(this, Label));
Richard Mitton5cc319a2013-09-19 23:21:01 +0000237
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000238 if (!DD->useSplitDwarf()) {
239 if (Label != NULL) {
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000240 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000241 Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
242 } else {
243 DIEValue *Value = new (DIEValueAllocator) DIEInteger(0);
244 Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
245 }
246 } else {
247 unsigned idx = DU->getAddrPoolIndex(Label);
248 DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx);
249 Die->addValue(Attribute, dwarf::DW_FORM_GNU_addr_index, Value);
250 }
251}
252
Eric Christopher0969ddf2013-01-18 22:11:33 +0000253/// addOpAddress - Add a dwarf op address data and value using the
254/// form given and an op of either DW_FORM_addr or DW_FORM_GNU_addr_index.
255///
David Blaikie770530b2013-10-21 17:28:37 +0000256void CompileUnit::addOpAddress(DIEBlock *Die, const MCSymbol *Sym) {
Alexey Samsonov9d08d692013-10-03 08:54:43 +0000257 DD->addArangeLabel(SymbolCU(this, Sym));
Eric Christopher0969ddf2013-01-18 22:11:33 +0000258 if (!DD->useSplitDwarf()) {
David Blaikie770530b2013-10-21 17:28:37 +0000259 addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
260 addLabel(Die, dwarf::DW_FORM_udata, Sym);
Eric Christopher0969ddf2013-01-18 22:11:33 +0000261 } else {
David Blaikie770530b2013-10-21 17:28:37 +0000262 addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_addr_index);
263 addUInt(Die, dwarf::DW_FORM_GNU_addr_index, DU->getAddrPoolIndex(Sym));
Eric Christopher0969ddf2013-01-18 22:11:33 +0000264 }
265}
266
Devang Patel161b2f42011-04-12 23:21:44 +0000267/// addDelta - Add a label delta attribute data and value.
268///
Eric Christopher62af0c22013-11-11 18:52:33 +0000269void CompileUnit::addDelta(DIE *Die, dwarf::Attribute Attribute,
270 dwarf::Form Form, const MCSymbol *Hi,
271 const MCSymbol *Lo) {
Devang Patel161b2f42011-04-12 23:21:44 +0000272 DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
273 Die->addValue(Attribute, Form, Value);
274}
275
276/// addDIEEntry - Add a DIE attribute data and value.
277///
David Blaikie770530b2013-10-21 17:28:37 +0000278void CompileUnit::addDIEEntry(DIE *Die, dwarf::Attribute Attribute, DIE *Entry) {
Manman Renb8b70e12013-10-31 17:54:35 +0000279 addDIEEntry(Die, Attribute, createDIEEntry(Entry));
280}
281
282void CompileUnit::addDIEEntry(DIE *Die, dwarf::Attribute Attribute,
283 DIEEntry *Entry) {
284 const DIE *DieCU = Die->getCompileUnitOrNull();
285 const DIE *EntryCU = Entry->getEntry()->getCompileUnitOrNull();
286 if (!DieCU)
287 // We assume that Die belongs to this CU, if it is not linked to any CU yet.
288 DieCU = getCUDie();
289 if (!EntryCU)
290 EntryCU = getCUDie();
291 Die->addValue(Attribute, EntryCU == DieCU ? dwarf::DW_FORM_ref4
292 : dwarf::DW_FORM_ref_addr,
293 Entry);
Devang Patel161b2f42011-04-12 23:21:44 +0000294}
295
Manman Ren1a5e7872013-10-29 00:53:03 +0000296/// Create a DIE with the given Tag, add the DIE to its parent, and
297/// call insertDIE if MD is not null.
298DIE *CompileUnit::createAndAddDIE(unsigned Tag, DIE &Parent, const MDNode *MD) {
299 DIE *Die = new DIE(Tag);
300 Parent.addChild(Die);
301 if (MD)
302 insertDIE(MD, Die);
303 return Die;
304}
305
Devang Patel161b2f42011-04-12 23:21:44 +0000306/// addBlock - Add block data.
307///
David Blaikie770530b2013-10-21 17:28:37 +0000308void CompileUnit::addBlock(DIE *Die, dwarf::Attribute Attribute,
Devang Patel161b2f42011-04-12 23:21:44 +0000309 DIEBlock *Block) {
310 Block->ComputeSize(Asm);
311 DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
312 Die->addValue(Attribute, Block->BestForm(), Block);
313}
314
315/// addSourceLine - Add location information to specified debug information
316/// entry.
317void CompileUnit::addSourceLine(DIE *Die, DIVariable V) {
318 // Verify variable.
Manman Rend03d2b22013-07-08 18:33:29 +0000319 if (!V.isVariable())
Devang Patel161b2f42011-04-12 23:21:44 +0000320 return;
Eric Christopher8b4310b2012-11-21 00:34:38 +0000321
Devang Patel161b2f42011-04-12 23:21:44 +0000322 unsigned Line = V.getLineNumber();
323 if (Line == 0)
324 return;
Eric Christopher6efc0432013-10-19 01:04:47 +0000325 unsigned FileID =
326 DD->getOrCreateSourceID(V.getContext().getFilename(),
327 V.getContext().getDirectory(), getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000328 assert(FileID && "Invalid file id");
David Blaikie770530b2013-10-21 17:28:37 +0000329 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
330 addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
Devang Patel161b2f42011-04-12 23:21:44 +0000331}
332
333/// addSourceLine - Add location information to specified debug information
334/// entry.
335void CompileUnit::addSourceLine(DIE *Die, DIGlobalVariable G) {
336 // Verify global variable.
Manman Rend03d2b22013-07-08 18:33:29 +0000337 if (!G.isGlobalVariable())
Devang Patel161b2f42011-04-12 23:21:44 +0000338 return;
339
340 unsigned Line = G.getLineNumber();
341 if (Line == 0)
342 return;
Eric Christopher6efc0432013-10-19 01:04:47 +0000343 unsigned FileID =
344 DD->getOrCreateSourceID(G.getFilename(), G.getDirectory(), getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000345 assert(FileID && "Invalid file id");
David Blaikie770530b2013-10-21 17:28:37 +0000346 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
347 addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
Devang Patel161b2f42011-04-12 23:21:44 +0000348}
349
350/// addSourceLine - Add location information to specified debug information
351/// entry.
352void CompileUnit::addSourceLine(DIE *Die, DISubprogram SP) {
353 // Verify subprogram.
Manman Rend03d2b22013-07-08 18:33:29 +0000354 if (!SP.isSubprogram())
Devang Patel161b2f42011-04-12 23:21:44 +0000355 return;
Eric Christopher2125d5a2012-03-15 23:55:40 +0000356
Devang Patel161b2f42011-04-12 23:21:44 +0000357 // If the line number is 0, don't add it.
Eric Christopher2125d5a2012-03-15 23:55:40 +0000358 unsigned Line = SP.getLineNumber();
359 if (Line == 0)
Devang Patel161b2f42011-04-12 23:21:44 +0000360 return;
361
Eric Christopher6efc0432013-10-19 01:04:47 +0000362 unsigned FileID = DD->getOrCreateSourceID(SP.getFilename(), SP.getDirectory(),
363 getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000364 assert(FileID && "Invalid file id");
David Blaikie770530b2013-10-21 17:28:37 +0000365 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
366 addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
Devang Patel161b2f42011-04-12 23:21:44 +0000367}
368
369/// addSourceLine - Add location information to specified debug information
370/// entry.
371void CompileUnit::addSourceLine(DIE *Die, DIType Ty) {
372 // Verify type.
Manman Rend03d2b22013-07-08 18:33:29 +0000373 if (!Ty.isType())
Devang Patel161b2f42011-04-12 23:21:44 +0000374 return;
375
376 unsigned Line = Ty.getLineNumber();
Eric Christopher2125d5a2012-03-15 23:55:40 +0000377 if (Line == 0)
Devang Patel161b2f42011-04-12 23:21:44 +0000378 return;
Eric Christopher6efc0432013-10-19 01:04:47 +0000379 unsigned FileID = DD->getOrCreateSourceID(Ty.getFilename(), Ty.getDirectory(),
380 getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000381 assert(FileID && "Invalid file id");
David Blaikie770530b2013-10-21 17:28:37 +0000382 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
383 addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
Devang Patel161b2f42011-04-12 23:21:44 +0000384}
385
386/// addSourceLine - Add location information to specified debug information
387/// entry.
Eric Christopherb8ca9882012-03-29 08:42:56 +0000388void CompileUnit::addSourceLine(DIE *Die, DIObjCProperty Ty) {
389 // Verify type.
Manman Rend03d2b22013-07-08 18:33:29 +0000390 if (!Ty.isObjCProperty())
Eric Christopherb8ca9882012-03-29 08:42:56 +0000391 return;
392
393 unsigned Line = Ty.getLineNumber();
394 if (Line == 0)
395 return;
396 DIFile File = Ty.getFile();
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000397 unsigned FileID = DD->getOrCreateSourceID(File.getFilename(),
Manman Ren3de61b42013-03-07 01:42:00 +0000398 File.getDirectory(), getUniqueID());
Eric Christopherb8ca9882012-03-29 08:42:56 +0000399 assert(FileID && "Invalid file id");
David Blaikie770530b2013-10-21 17:28:37 +0000400 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
401 addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
Eric Christopherb8ca9882012-03-29 08:42:56 +0000402}
403
404/// addSourceLine - Add location information to specified debug information
405/// entry.
Devang Patel161b2f42011-04-12 23:21:44 +0000406void CompileUnit::addSourceLine(DIE *Die, DINameSpace NS) {
407 // Verify namespace.
408 if (!NS.Verify())
409 return;
410
411 unsigned Line = NS.getLineNumber();
412 if (Line == 0)
413 return;
414 StringRef FN = NS.getFilename();
415
Eric Christopher6efc0432013-10-19 01:04:47 +0000416 unsigned FileID =
417 DD->getOrCreateSourceID(FN, NS.getDirectory(), getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000418 assert(FileID && "Invalid file id");
David Blaikie770530b2013-10-21 17:28:37 +0000419 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
420 addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
Devang Patel161b2f42011-04-12 23:21:44 +0000421}
422
Eric Christopher8b4310b2012-11-21 00:34:38 +0000423/// addVariableAddress - Add DW_AT_location attribute for a
Devang Patele1cdf842011-04-27 22:45:24 +0000424/// DbgVariable based on provided MachineLocation.
Eric Christopherf61dbc12013-06-24 21:07:27 +0000425void CompileUnit::addVariableAddress(const DbgVariable &DV, DIE *Die,
Devang Patele1cdf842011-04-27 22:45:24 +0000426 MachineLocation Location) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000427 if (DV.variableHasComplexAddress())
Devang Patel161b2f42011-04-12 23:21:44 +0000428 addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
Eric Christopherf61dbc12013-06-24 21:07:27 +0000429 else if (DV.isBlockByrefVariable())
Devang Patel161b2f42011-04-12 23:21:44 +0000430 addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location);
431 else
David Blaikie4532c282013-06-20 00:25:24 +0000432 addAddress(Die, dwarf::DW_AT_location, Location,
Eric Christopherf61dbc12013-06-24 21:07:27 +0000433 DV.getVariable().isIndirect());
Devang Patel161b2f42011-04-12 23:21:44 +0000434}
435
Devang Patel116da2f2011-04-26 19:06:18 +0000436/// addRegisterOp - Add register operand.
David Blaikie770530b2013-10-21 17:28:37 +0000437void CompileUnit::addRegisterOp(DIEBlock *TheDie, unsigned Reg) {
Devang Patel116da2f2011-04-26 19:06:18 +0000438 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
439 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
440 if (DWReg < 32)
David Blaikie770530b2013-10-21 17:28:37 +0000441 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + DWReg);
Devang Patel116da2f2011-04-26 19:06:18 +0000442 else {
David Blaikie770530b2013-10-21 17:28:37 +0000443 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
444 addUInt(TheDie, dwarf::DW_FORM_udata, DWReg);
Devang Patel116da2f2011-04-26 19:06:18 +0000445 }
446}
447
448/// addRegisterOffset - Add register offset.
David Blaikie770530b2013-10-21 17:28:37 +0000449void CompileUnit::addRegisterOffset(DIEBlock *TheDie, unsigned Reg,
450 int64_t Offset) {
Devang Patel116da2f2011-04-26 19:06:18 +0000451 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
452 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
453 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
454 if (Reg == TRI->getFrameRegister(*Asm->MF))
455 // If variable offset is based in frame register then use fbreg.
David Blaikie770530b2013-10-21 17:28:37 +0000456 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
Devang Patel116da2f2011-04-26 19:06:18 +0000457 else if (DWReg < 32)
David Blaikie770530b2013-10-21 17:28:37 +0000458 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DWReg);
Devang Patel116da2f2011-04-26 19:06:18 +0000459 else {
David Blaikie770530b2013-10-21 17:28:37 +0000460 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
461 addUInt(TheDie, dwarf::DW_FORM_udata, DWReg);
Devang Patel116da2f2011-04-26 19:06:18 +0000462 }
David Blaikie770530b2013-10-21 17:28:37 +0000463 addSInt(TheDie, dwarf::DW_FORM_sdata, Offset);
Devang Patel116da2f2011-04-26 19:06:18 +0000464}
465
466/// addAddress - Add an address attribute to a die based on the location
467/// provided.
David Blaikie770530b2013-10-21 17:28:37 +0000468void CompileUnit::addAddress(DIE *Die, dwarf::Attribute Attribute,
David Blaikie4532c282013-06-20 00:25:24 +0000469 const MachineLocation &Location, bool Indirect) {
Devang Patel116da2f2011-04-26 19:06:18 +0000470 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
471
David Blaikie4532c282013-06-20 00:25:24 +0000472 if (Location.isReg() && !Indirect)
Devang Patel116da2f2011-04-26 19:06:18 +0000473 addRegisterOp(Block, Location.getReg());
David Blaikie4532c282013-06-20 00:25:24 +0000474 else {
Devang Patel116da2f2011-04-26 19:06:18 +0000475 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
David Blaikie4532c282013-06-20 00:25:24 +0000476 if (Indirect && !Location.isReg()) {
David Blaikie770530b2013-10-21 17:28:37 +0000477 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
David Blaikie4532c282013-06-20 00:25:24 +0000478 }
479 }
Devang Patel116da2f2011-04-26 19:06:18 +0000480
481 // Now attach the location information to the DIE.
David Blaikie770530b2013-10-21 17:28:37 +0000482 addBlock(Die, Attribute, Block);
Devang Patel116da2f2011-04-26 19:06:18 +0000483}
484
Devang Patel161b2f42011-04-12 23:21:44 +0000485/// addComplexAddress - Start with the address based on the location provided,
486/// and generate the DWARF information necessary to find the actual variable
487/// given the extra address information encoded in the DIVariable, starting from
488/// the starting location. Add the DWARF information to the die.
489///
Eric Christopherf61dbc12013-06-24 21:07:27 +0000490void CompileUnit::addComplexAddress(const DbgVariable &DV, DIE *Die,
David Blaikie770530b2013-10-21 17:28:37 +0000491 dwarf::Attribute Attribute,
Devang Patel161b2f42011-04-12 23:21:44 +0000492 const MachineLocation &Location) {
Devang Patel161b2f42011-04-12 23:21:44 +0000493 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Eric Christopherf61dbc12013-06-24 21:07:27 +0000494 unsigned N = DV.getNumAddrElements();
Devang Patelc26f5442011-04-28 02:22:40 +0000495 unsigned i = 0;
496 if (Location.isReg()) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000497 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
Devang Patelc26f5442011-04-28 02:22:40 +0000498 // If first address element is OpPlus then emit
499 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
Eric Christopherf61dbc12013-06-24 21:07:27 +0000500 addRegisterOffset(Block, Location.getReg(), DV.getAddrElement(1));
Devang Patelc26f5442011-04-28 02:22:40 +0000501 i = 2;
502 } else
503 addRegisterOp(Block, Location.getReg());
Eric Christopher6efc0432013-10-19 01:04:47 +0000504 } else
Devang Patel116da2f2011-04-26 19:06:18 +0000505 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel161b2f42011-04-12 23:21:44 +0000506
Eric Christopher6efc0432013-10-19 01:04:47 +0000507 for (; i < N; ++i) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000508 uint64_t Element = DV.getAddrElement(i);
Devang Patel161b2f42011-04-12 23:21:44 +0000509 if (Element == DIBuilder::OpPlus) {
David Blaikie770530b2013-10-21 17:28:37 +0000510 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
511 addUInt(Block, dwarf::DW_FORM_udata, DV.getAddrElement(++i));
Devang Patel161b2f42011-04-12 23:21:44 +0000512 } else if (Element == DIBuilder::OpDeref) {
Eric Christopher50120762012-05-08 18:56:00 +0000513 if (!Location.isReg())
David Blaikie770530b2013-10-21 17:28:37 +0000514 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Eric Christopher6efc0432013-10-19 01:04:47 +0000515 } else
516 llvm_unreachable("unknown DIBuilder Opcode");
Devang Patel161b2f42011-04-12 23:21:44 +0000517 }
518
519 // Now attach the location information to the DIE.
David Blaikie770530b2013-10-21 17:28:37 +0000520 addBlock(Die, Attribute, Block);
Devang Patel161b2f42011-04-12 23:21:44 +0000521}
522
523/* Byref variables, in Blocks, are declared by the programmer as "SomeType
524 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
525 gives the variable VarName either the struct, or a pointer to the struct, as
526 its type. This is necessary for various behind-the-scenes things the
527 compiler needs to do with by-reference variables in Blocks.
528
529 However, as far as the original *programmer* is concerned, the variable
530 should still have type 'SomeType', as originally declared.
531
532 The function getBlockByrefType dives into the __Block_byref_x_VarName
533 struct to find the original type of the variable, which is then assigned to
534 the variable's Debug Information Entry as its real type. So far, so good.
535 However now the debugger will expect the variable VarName to have the type
536 SomeType. So we need the location attribute for the variable to be an
537 expression that explains to the debugger how to navigate through the
538 pointers and struct to find the actual variable of type SomeType.
539
540 The following function does just that. We start by getting
541 the "normal" location for the variable. This will be the location
542 of either the struct __Block_byref_x_VarName or the pointer to the
543 struct __Block_byref_x_VarName.
544
545 The struct will look something like:
546
547 struct __Block_byref_x_VarName {
548 ... <various fields>
549 struct __Block_byref_x_VarName *forwarding;
550 ... <various other fields>
551 SomeType VarName;
552 ... <maybe more fields>
553 };
554
555 If we are given the struct directly (as our starting point) we
556 need to tell the debugger to:
557
558 1). Add the offset of the forwarding field.
559
560 2). Follow that pointer to get the real __Block_byref_x_VarName
561 struct to use (the real one may have been copied onto the heap).
562
563 3). Add the offset for the field VarName, to find the actual variable.
564
565 If we started with a pointer to the struct, then we need to
566 dereference that pointer first, before the other steps.
567 Translating this into DWARF ops, we will need to append the following
568 to the current location description for the variable:
569
570 DW_OP_deref -- optional, if we start with a pointer
571 DW_OP_plus_uconst <forward_fld_offset>
572 DW_OP_deref
573 DW_OP_plus_uconst <varName_fld_offset>
574
575 That is what this function does. */
576
577/// addBlockByrefAddress - Start with the address based on the location
578/// provided, and generate the DWARF information necessary to find the
579/// actual Block variable (navigating the Block struct) based on the
580/// starting location. Add the DWARF information to the die. For
581/// more information, read large comment just above here.
582///
Eric Christopherf61dbc12013-06-24 21:07:27 +0000583void CompileUnit::addBlockByrefAddress(const DbgVariable &DV, DIE *Die,
David Blaikie770530b2013-10-21 17:28:37 +0000584 dwarf::Attribute Attribute,
Devang Patel161b2f42011-04-12 23:21:44 +0000585 const MachineLocation &Location) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000586 DIType Ty = DV.getType();
Devang Patel161b2f42011-04-12 23:21:44 +0000587 DIType TmpTy = Ty;
Eric Christopher31667622013-08-08 01:41:00 +0000588 uint16_t Tag = Ty.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +0000589 bool isPointer = false;
590
Eric Christopherf61dbc12013-06-24 21:07:27 +0000591 StringRef varName = DV.getName();
Devang Patel161b2f42011-04-12 23:21:44 +0000592
593 if (Tag == dwarf::DW_TAG_pointer_type) {
594 DIDerivedType DTy = DIDerivedType(Ty);
Manman Ren017ceda2013-10-08 18:42:58 +0000595 TmpTy = resolve(DTy.getTypeDerivedFrom());
Devang Patel161b2f42011-04-12 23:21:44 +0000596 isPointer = true;
597 }
598
599 DICompositeType blockStruct = DICompositeType(TmpTy);
600
601 // Find the __forwarding field and the variable field in the __Block_byref
602 // struct.
603 DIArray Fields = blockStruct.getTypeArray();
604 DIDescriptor varField = DIDescriptor();
605 DIDescriptor forwardingField = DIDescriptor();
606
607 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
608 DIDescriptor Element = Fields.getElement(i);
609 DIDerivedType DT = DIDerivedType(Element);
610 StringRef fieldName = DT.getName();
611 if (fieldName == "__forwarding")
612 forwardingField = Element;
613 else if (fieldName == varName)
614 varField = Element;
615 }
616
617 // Get the offsets for the forwarding field and the variable field.
618 unsigned forwardingFieldOffset =
Eric Christopher6efc0432013-10-19 01:04:47 +0000619 DIDerivedType(forwardingField).getOffsetInBits() >> 3;
620 unsigned varFieldOffset = DIDerivedType(varField).getOffsetInBits() >> 3;
Devang Patel161b2f42011-04-12 23:21:44 +0000621
622 // Decode the original location, and use that as the start of the byref
623 // variable's location.
Devang Patel161b2f42011-04-12 23:21:44 +0000624 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
625
Eric Christophercaba2632012-07-04 02:02:18 +0000626 if (Location.isReg())
627 addRegisterOp(Block, Location.getReg());
628 else
629 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel161b2f42011-04-12 23:21:44 +0000630
631 // If we started with a pointer to the __Block_byref... struct, then
632 // the first thing we need to do is dereference the pointer (DW_OP_deref).
633 if (isPointer)
David Blaikie770530b2013-10-21 17:28:37 +0000634 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Devang Patel161b2f42011-04-12 23:21:44 +0000635
636 // Next add the offset for the '__forwarding' field:
637 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
638 // adding the offset if it's 0.
639 if (forwardingFieldOffset > 0) {
David Blaikie770530b2013-10-21 17:28:37 +0000640 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
641 addUInt(Block, dwarf::DW_FORM_udata, forwardingFieldOffset);
Devang Patel161b2f42011-04-12 23:21:44 +0000642 }
643
644 // Now dereference the __forwarding field to get to the real __Block_byref
645 // struct: DW_OP_deref.
David Blaikie770530b2013-10-21 17:28:37 +0000646 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Devang Patel161b2f42011-04-12 23:21:44 +0000647
648 // Now that we've got the real __Block_byref... struct, add the offset
649 // for the variable's field to get to the location of the actual variable:
650 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
651 if (varFieldOffset > 0) {
David Blaikie770530b2013-10-21 17:28:37 +0000652 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
653 addUInt(Block, dwarf::DW_FORM_udata, varFieldOffset);
Devang Patel161b2f42011-04-12 23:21:44 +0000654 }
655
656 // Now attach the location information to the DIE.
David Blaikie770530b2013-10-21 17:28:37 +0000657 addBlock(Die, Attribute, Block);
Devang Patel161b2f42011-04-12 23:21:44 +0000658}
659
Devang Patel4ec14b02011-07-20 21:57:04 +0000660/// isTypeSigned - Return true if the type is signed.
Manman Renc664d762013-10-05 01:43:03 +0000661static bool isTypeSigned(DwarfDebug *DD, DIType Ty, int *SizeInBits) {
Devang Patel4ec14b02011-07-20 21:57:04 +0000662 if (Ty.isDerivedType())
Manman Renc664d762013-10-05 01:43:03 +0000663 return isTypeSigned(DD, DD->resolve(DIDerivedType(Ty).getTypeDerivedFrom()),
664 SizeInBits);
Devang Patel4ec14b02011-07-20 21:57:04 +0000665 if (Ty.isBasicType())
Eric Christopher6efc0432013-10-19 01:04:47 +0000666 if (DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed ||
667 DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed_char) {
Devang Patel4ec14b02011-07-20 21:57:04 +0000668 *SizeInBits = Ty.getSizeInBits();
669 return true;
670 }
671 return false;
672}
673
Manman Renc664d762013-10-05 01:43:03 +0000674/// Return true if type encoding is unsigned.
675static bool isUnsignedDIType(DwarfDebug *DD, DIType Ty) {
676 DIDerivedType DTy(Ty);
677 if (DTy.isDerivedType())
678 return isUnsignedDIType(DD, DD->resolve(DTy.getTypeDerivedFrom()));
679
680 DIBasicType BTy(Ty);
681 if (BTy.isBasicType()) {
682 unsigned Encoding = BTy.getEncoding();
683 if (Encoding == dwarf::DW_ATE_unsigned ||
684 Encoding == dwarf::DW_ATE_unsigned_char ||
685 Encoding == dwarf::DW_ATE_boolean)
686 return true;
687 }
688 return false;
689}
690
691/// If this type is derived from a base type then return base type size.
Manman Ren43251002013-10-08 18:46:58 +0000692static uint64_t getBaseTypeSize(DwarfDebug *DD, DIDerivedType Ty) {
Manman Renc664d762013-10-05 01:43:03 +0000693 unsigned Tag = Ty.getTag();
694
695 if (Tag != dwarf::DW_TAG_member && Tag != dwarf::DW_TAG_typedef &&
696 Tag != dwarf::DW_TAG_const_type && Tag != dwarf::DW_TAG_volatile_type &&
697 Tag != dwarf::DW_TAG_restrict_type)
698 return Ty.getSizeInBits();
699
700 DIType BaseType = DD->resolve(Ty.getTypeDerivedFrom());
701
702 // If this type is not derived from any type then take conservative approach.
703 if (!BaseType.isValid())
704 return Ty.getSizeInBits();
705
706 // If this is a derived type, go ahead and get the base type, unless it's a
707 // reference then it's just the size of the field. Pointer types have no need
708 // of this since they're a different type of qualification on the type.
709 if (BaseType.getTag() == dwarf::DW_TAG_reference_type ||
710 BaseType.getTag() == dwarf::DW_TAG_rvalue_reference_type)
711 return Ty.getSizeInBits();
712
713 if (BaseType.isDerivedType())
Manman Ren43251002013-10-08 18:46:58 +0000714 return getBaseTypeSize(DD, DIDerivedType(BaseType));
Manman Renc664d762013-10-05 01:43:03 +0000715
716 return BaseType.getSizeInBits();
717}
718
Devang Patel161b2f42011-04-12 23:21:44 +0000719/// addConstantValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000720void CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO,
Devang Patelb58128e2011-05-27 16:45:18 +0000721 DIType Ty) {
David Blaikie4de9d722013-05-10 21:52:07 +0000722 // FIXME: This is a bit conservative/simple - it emits negative values at
723 // their maximum bit width which is a bit unfortunate (& doesn't prefer
724 // udata/sdata over dataN as suggested by the DWARF spec)
Nick Lewycky746cb672011-10-26 22:55:33 +0000725 assert(MO.isImm() && "Invalid machine operand!");
Devang Patel4ec14b02011-07-20 21:57:04 +0000726 int SizeInBits = -1;
Manman Renc664d762013-10-05 01:43:03 +0000727 bool SignedConstant = isTypeSigned(DD, Ty, &SizeInBits);
David Blaikie770530b2013-10-21 17:28:37 +0000728 dwarf::Form Form;
Devang Patel72f0d9c2011-05-27 18:15:52 +0000729
Eric Christopher7b2ee392013-08-27 23:49:04 +0000730 // If we're a signed constant definitely use sdata.
731 if (SignedConstant) {
732 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, MO.getImm());
733 return;
734 }
735
736 // Else use data for now unless it's larger than we can deal with.
737 switch (SizeInBits) {
738 case 8:
739 Form = dwarf::DW_FORM_data1;
740 break;
741 case 16:
742 Form = dwarf::DW_FORM_data2;
743 break;
744 case 32:
745 Form = dwarf::DW_FORM_data4;
746 break;
747 case 64:
748 Form = dwarf::DW_FORM_data8;
749 break;
750 default:
751 Form = dwarf::DW_FORM_udata;
752 addUInt(Die, dwarf::DW_AT_const_value, Form, MO.getImm());
753 return;
754 }
755 addUInt(Die, dwarf::DW_AT_const_value, Form, MO.getImm());
Devang Patel161b2f42011-04-12 23:21:44 +0000756}
757
758/// addConstantFPValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000759void CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
Eric Christopher6efc0432013-10-19 01:04:47 +0000760 assert(MO.isFPImm() && "Invalid machine operand!");
Devang Patel161b2f42011-04-12 23:21:44 +0000761 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
762 APFloat FPImm = MO.getFPImm()->getValueAPF();
763
764 // Get the raw data form of the floating point.
765 const APInt FltVal = FPImm.bitcastToAPInt();
Eric Christopher6efc0432013-10-19 01:04:47 +0000766 const char *FltPtr = (const char *)FltVal.getRawData();
Devang Patel161b2f42011-04-12 23:21:44 +0000767
768 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
Micah Villmow3574eca2012-10-08 16:38:25 +0000769 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel161b2f42011-04-12 23:21:44 +0000770 int Incr = (LittleEndian ? 1 : -1);
771 int Start = (LittleEndian ? 0 : NumBytes - 1);
772 int Stop = (LittleEndian ? NumBytes : -1);
773
774 // Output the constant to DWARF one byte at a time.
775 for (; Start != Stop; Start += Incr)
David Blaikie770530b2013-10-21 17:28:37 +0000776 addUInt(Block, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +0000777 (unsigned char)0xFF & FltPtr[Start]);
778
David Blaikie770530b2013-10-21 17:28:37 +0000779 addBlock(Die, dwarf::DW_AT_const_value, Block);
Devang Patel161b2f42011-04-12 23:21:44 +0000780}
781
David Blaikie14268412013-01-20 01:18:01 +0000782/// addConstantFPValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000783void CompileUnit::addConstantFPValue(DIE *Die, const ConstantFP *CFP) {
Eric Christopher7b2ee392013-08-27 23:49:04 +0000784 // Pass this down to addConstantValue as an unsigned bag of bits.
785 addConstantValue(Die, CFP->getValueAPF().bitcastToAPInt(), true);
David Blaikie14268412013-01-20 01:18:01 +0000786}
787
Devang Patel161b2f42011-04-12 23:21:44 +0000788/// addConstantValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000789void CompileUnit::addConstantValue(DIE *Die, const ConstantInt *CI,
Devang Patel161b2f42011-04-12 23:21:44 +0000790 bool Unsigned) {
Eric Christophere4721492013-07-03 01:08:30 +0000791 addConstantValue(Die, CI->getValue(), Unsigned);
David Blaikie14268412013-01-20 01:18:01 +0000792}
793
794// addConstantValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000795void CompileUnit::addConstantValue(DIE *Die, const APInt &Val, bool Unsigned) {
David Blaikie14268412013-01-20 01:18:01 +0000796 unsigned CIBitWidth = Val.getBitWidth();
Devang Pateld6a81362011-05-28 00:39:18 +0000797 if (CIBitWidth <= 64) {
Eric Christopher7b2ee392013-08-27 23:49:04 +0000798 // If we're a signed constant definitely use sdata.
799 if (!Unsigned) {
800 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata,
801 Val.getSExtValue());
802 return;
Devang Pateld6a81362011-05-28 00:39:18 +0000803 }
Eric Christopher7b2ee392013-08-27 23:49:04 +0000804
805 // Else use data for now unless it's larger than we can deal with.
David Blaikie770530b2013-10-21 17:28:37 +0000806 dwarf::Form Form;
Eric Christopher7b2ee392013-08-27 23:49:04 +0000807 switch (CIBitWidth) {
808 case 8:
809 Form = dwarf::DW_FORM_data1;
810 break;
811 case 16:
812 Form = dwarf::DW_FORM_data2;
813 break;
814 case 32:
815 Form = dwarf::DW_FORM_data4;
816 break;
817 case 64:
818 Form = dwarf::DW_FORM_data8;
819 break;
820 default:
821 addUInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
822 Val.getZExtValue());
823 return;
824 }
825 addUInt(Die, dwarf::DW_AT_const_value, Form, Val.getZExtValue());
Eric Christophere4721492013-07-03 01:08:30 +0000826 return;
Devang Patel161b2f42011-04-12 23:21:44 +0000827 }
828
829 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
830
831 // Get the raw data form of the large APInt.
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000832 const uint64_t *Ptr64 = Val.getRawData();
Devang Patel161b2f42011-04-12 23:21:44 +0000833
834 int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
Micah Villmow3574eca2012-10-08 16:38:25 +0000835 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel161b2f42011-04-12 23:21:44 +0000836
837 // Output the constant to DWARF one byte at a time.
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000838 for (int i = 0; i < NumBytes; i++) {
839 uint8_t c;
840 if (LittleEndian)
841 c = Ptr64[i / 8] >> (8 * (i & 7));
842 else
843 c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7));
David Blaikie770530b2013-10-21 17:28:37 +0000844 addUInt(Block, dwarf::DW_FORM_data1, c);
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000845 }
Devang Patel161b2f42011-04-12 23:21:44 +0000846
David Blaikie770530b2013-10-21 17:28:37 +0000847 addBlock(Die, dwarf::DW_AT_const_value, Block);
Devang Patel161b2f42011-04-12 23:21:44 +0000848}
849
Eric Christopher6c3bb942013-04-22 07:47:40 +0000850/// addTemplateParams - Add template parameters into buffer.
Devang Patel161b2f42011-04-12 23:21:44 +0000851void CompileUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
852 // Add template parameters.
853 for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) {
854 DIDescriptor Element = TParams.getElement(i);
855 if (Element.isTemplateTypeParameter())
Manman Renbe87b692013-10-23 23:05:28 +0000856 constructTemplateTypeParameterDIE(Buffer,
857 DITemplateTypeParameter(Element));
Devang Patel161b2f42011-04-12 23:21:44 +0000858 else if (Element.isTemplateValueParameter())
Manman Renbe87b692013-10-23 23:05:28 +0000859 constructTemplateValueParameterDIE(Buffer,
860 DITemplateValueParameter(Element));
Devang Patel161b2f42011-04-12 23:21:44 +0000861 }
Devang Patel161b2f42011-04-12 23:21:44 +0000862}
Nick Lewycky746cb672011-10-26 22:55:33 +0000863
Eric Christopher6b6061f2013-01-16 01:22:23 +0000864/// getOrCreateContextDIE - Get context owner's DIE.
Eric Christopherccb66362013-10-04 23:49:26 +0000865DIE *CompileUnit::getOrCreateContextDIE(DIScope Context) {
Eric Christopher6b6061f2013-01-16 01:22:23 +0000866 if (Context.isType())
867 return getOrCreateTypeDIE(DIType(Context));
868 else if (Context.isNameSpace())
869 return getOrCreateNameSpace(DINameSpace(Context));
870 else if (Context.isSubprogram())
871 return getOrCreateSubprogramDIE(DISubprogram(Context));
Eric Christopher6c3bb942013-04-22 07:47:40 +0000872 else
Eric Christopher6b6061f2013-01-16 01:22:23 +0000873 return getDIE(Context);
874}
875
Devang Patel161b2f42011-04-12 23:21:44 +0000876/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
877/// given DIType.
Devang Patel94c7ddb2011-08-16 22:09:43 +0000878DIE *CompileUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
879 DIType Ty(TyNode);
Manman Rend03d2b22013-07-08 18:33:29 +0000880 if (!Ty.isType())
Devang Patel94c7ddb2011-08-16 22:09:43 +0000881 return NULL;
Manman Rend498e5e2013-10-29 22:49:29 +0000882
883 // Construct the context before querying for the existence of the DIE in case
884 // such construction creates the DIE.
885 DIE *ContextDIE = getOrCreateContextDIE(resolve(Ty.getContext()));
886 if (!ContextDIE)
887 ContextDIE = CUDie.get();
888
Eric Christopher3f045002013-10-04 17:08:38 +0000889 DIE *TyDIE = getDIE(Ty);
Devang Patel161b2f42011-04-12 23:21:44 +0000890 if (TyDIE)
891 return TyDIE;
892
893 // Create new type.
Manman Rend498e5e2013-10-29 22:49:29 +0000894 TyDIE = createAndAddDIE(Ty.getTag(), *ContextDIE, Ty);
895
Devang Patel161b2f42011-04-12 23:21:44 +0000896 if (Ty.isBasicType())
897 constructTypeDIE(*TyDIE, DIBasicType(Ty));
898 else if (Ty.isCompositeType())
899 constructTypeDIE(*TyDIE, DICompositeType(Ty));
900 else {
901 assert(Ty.isDerivedType() && "Unknown kind of DIType");
902 constructTypeDIE(*TyDIE, DIDerivedType(Ty));
903 }
Eric Christopher1b3f9192011-11-10 19:52:58 +0000904 // If this is a named finished type then include it in the list of types
905 // for the accelerator tables.
Eric Christopherc36145f2012-01-06 04:35:23 +0000906 if (!Ty.getName().empty() && !Ty.isForwardDecl()) {
907 bool IsImplementation = 0;
908 if (Ty.isCompositeType()) {
909 DICompositeType CT(Ty);
Eric Christophere0167892012-01-06 23:03:37 +0000910 // A runtime language of 0 actually means C/C++ and that any
911 // non-negative value is some version of Objective-C/C++.
Eric Christopher6efc0432013-10-19 01:04:47 +0000912 IsImplementation = (CT.getRunTimeLang() == 0) || CT.isObjcClassComplete();
Eric Christopherc36145f2012-01-06 04:35:23 +0000913 }
Eric Christopher577056f2013-09-05 18:20:16 +0000914 unsigned Flags = IsImplementation ? dwarf::DW_FLAG_type_implementation : 0;
Eric Christophere0167892012-01-06 23:03:37 +0000915 addAccelType(Ty.getName(), std::make_pair(TyDIE, Flags));
Eric Christopherc36145f2012-01-06 04:35:23 +0000916 }
Eric Christopher8b4310b2012-11-21 00:34:38 +0000917
Devang Patel161b2f42011-04-12 23:21:44 +0000918 return TyDIE;
919}
920
921/// addType - Add a new type attribute to the specified entity.
David Blaikie770530b2013-10-21 17:28:37 +0000922void CompileUnit::addType(DIE *Entity, DIType Ty, dwarf::Attribute Attribute) {
Eric Christopherdc1363f2013-08-08 07:40:37 +0000923 assert(Ty && "Trying to add a type that doesn't exist?");
Devang Patel161b2f42011-04-12 23:21:44 +0000924
925 // Check for pre-existence.
926 DIEEntry *Entry = getDIEEntry(Ty);
927 // If it exists then use the existing value.
928 if (Entry) {
Manman Renb8b70e12013-10-31 17:54:35 +0000929 addDIEEntry(Entity, Attribute, Entry);
Devang Patel161b2f42011-04-12 23:21:44 +0000930 return;
931 }
932
933 // Construct type.
934 DIE *Buffer = getOrCreateTypeDIE(Ty);
935
936 // Set up proxy.
937 Entry = createDIEEntry(Buffer);
938 insertDIEEntry(Ty, Entry);
Manman Renb8b70e12013-10-31 17:54:35 +0000939 addDIEEntry(Entity, Attribute, Entry);
Devang Patele9ae06c2011-05-31 22:56:51 +0000940
941 // If this is a complete composite type then include it in the
942 // list of global types.
Devang Patelc20bdf12011-06-01 00:23:24 +0000943 addGlobalType(Ty);
Devang Patel66658e42011-05-31 23:30:30 +0000944}
945
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000946// Accelerator table mutators - add each name along with its companion
947// DIE to the proper table while ensuring that the name that we're going
948// to reference is in the string table. We do this since the names we
949// add may not only be identical to the names in the DIE.
950void CompileUnit::addAccelName(StringRef Name, DIE *Die) {
951 DU->getStringPoolEntry(Name);
Eric Christopher734334e2013-09-23 22:59:11 +0000952 std::vector<DIE *> &DIEs = AccelNames[Name];
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000953 DIEs.push_back(Die);
954}
955
956void CompileUnit::addAccelObjC(StringRef Name, DIE *Die) {
957 DU->getStringPoolEntry(Name);
Eric Christopher734334e2013-09-23 22:59:11 +0000958 std::vector<DIE *> &DIEs = AccelObjC[Name];
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000959 DIEs.push_back(Die);
960}
961
962void CompileUnit::addAccelNamespace(StringRef Name, DIE *Die) {
963 DU->getStringPoolEntry(Name);
Eric Christopher734334e2013-09-23 22:59:11 +0000964 std::vector<DIE *> &DIEs = AccelNamespace[Name];
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000965 DIEs.push_back(Die);
966}
967
968void CompileUnit::addAccelType(StringRef Name, std::pair<DIE *, unsigned> Die) {
969 DU->getStringPoolEntry(Name);
970 std::vector<std::pair<DIE *, unsigned> > &DIEs = AccelTypes[Name];
971 DIEs.push_back(Die);
972}
973
Eric Christopher50d37a42013-09-20 22:20:55 +0000974/// addGlobalName - Add a new global name to the compile unit.
Eric Christopher91986572013-10-17 02:06:06 +0000975void CompileUnit::addGlobalName(StringRef Name, DIE *Die, DIScope Context) {
Eric Christopher0ab64392013-10-19 01:04:42 +0000976 std::string FullName = getParentContextString(Context) + Name.str();
Eric Christopher91986572013-10-17 02:06:06 +0000977 GlobalNames[FullName] = Die;
Eric Christopher50d37a42013-09-20 22:20:55 +0000978}
979
Devang Patel66658e42011-05-31 23:30:30 +0000980/// addGlobalType - Add a new global type to the compile unit.
981///
Devang Patelc20bdf12011-06-01 00:23:24 +0000982void CompileUnit::addGlobalType(DIType Ty) {
Eric Christophereee74fb2013-10-05 00:27:02 +0000983 DIScope Context = resolve(Ty.getContext());
Eric Christopher5a634742013-09-23 23:15:58 +0000984 if (!Ty.getName().empty() && !Ty.isForwardDecl() &&
Eric Christopher734334e2013-09-23 22:59:11 +0000985 (!Context || Context.isCompileUnit() || Context.isFile() ||
986 Context.isNameSpace()))
Eric Christopher91986572013-10-17 02:06:06 +0000987 if (DIEEntry *Entry = getDIEEntry(Ty)) {
Eric Christopher0ab64392013-10-19 01:04:42 +0000988 std::string FullName =
989 getParentContextString(Context) + Ty.getName().str();
Eric Christopher6efc0432013-10-19 01:04:47 +0000990 GlobalTypes[FullName] = Entry->getEntry();
Eric Christopher91986572013-10-17 02:06:06 +0000991 }
992}
993
994/// getParentContextString - Walks the metadata parent chain in a language
995/// specific manner (using the compile unit language) and returns
996/// it as a string. This is done at the metadata level because DIEs may
997/// not currently have been added to the parent context and walking the
998/// DIEs looking for names is more expensive than walking the metadata.
999std::string CompileUnit::getParentContextString(DIScope Context) const {
1000 if (!Context)
1001 return "";
1002
1003 // FIXME: Decide whether to implement this for non-C++ languages.
1004 if (getLanguage() != dwarf::DW_LANG_C_plus_plus)
1005 return "";
1006
Eric Christopher0ab64392013-10-19 01:04:42 +00001007 std::string CS;
Eric Christopher91986572013-10-17 02:06:06 +00001008 SmallVector<DIScope, 1> Parents;
1009 while (!Context.isCompileUnit()) {
1010 Parents.push_back(Context);
1011 if (Context.getContext())
1012 Context = resolve(Context.getContext());
1013 else
1014 // Structure, etc types will have a NULL context if they're at the top
1015 // level.
1016 break;
1017 }
1018
1019 // Reverse iterate over our list to go from the outermost construct to the
1020 // innermost.
1021 for (SmallVectorImpl<DIScope>::reverse_iterator I = Parents.rbegin(),
1022 E = Parents.rend();
1023 I != E; ++I) {
1024 DIScope Ctx = *I;
1025 StringRef Name = Ctx.getName();
Eric Christopher0ab64392013-10-19 01:04:42 +00001026 if (!Name.empty()) {
Eric Christopher91986572013-10-17 02:06:06 +00001027 CS += Name;
1028 CS += "::";
1029 }
1030 }
1031 return CS;
Devang Patel161b2f42011-04-12 23:21:44 +00001032}
1033
Eric Christopher22852c72013-10-05 00:05:51 +00001034/// addPubTypes - Add subprogram argument types for pubtypes section.
Devang Patel31c5d052011-05-06 16:57:54 +00001035void CompileUnit::addPubTypes(DISubprogram SP) {
1036 DICompositeType SPTy = SP.getType();
Eric Christopher31667622013-08-08 01:41:00 +00001037 uint16_t SPTag = SPTy.getTag();
Devang Patel31c5d052011-05-06 16:57:54 +00001038 if (SPTag != dwarf::DW_TAG_subroutine_type)
1039 return;
1040
1041 DIArray Args = SPTy.getTypeArray();
1042 for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
1043 DIType ATy(Args.getElement(i));
Manman Rend03d2b22013-07-08 18:33:29 +00001044 if (!ATy.isType())
Devang Patel31c5d052011-05-06 16:57:54 +00001045 continue;
Devang Patelc20bdf12011-06-01 00:23:24 +00001046 addGlobalType(ATy);
Devang Patel31c5d052011-05-06 16:57:54 +00001047 }
1048}
1049
Devang Patel161b2f42011-04-12 23:21:44 +00001050/// constructTypeDIE - Construct basic type die from DIBasicType.
1051void CompileUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
1052 // Get core information.
1053 StringRef Name = BTy.getName();
Devang Patel161b2f42011-04-12 23:21:44 +00001054 // Add name if not anonymous or intermediate type.
1055 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001056 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel734a67c2011-09-14 23:13:28 +00001057
David Blaikie916d49e2013-10-04 23:21:16 +00001058 // An unspecified type only has a name attribute.
1059 if (BTy.getTag() == dwarf::DW_TAG_unspecified_type)
Devang Patel734a67c2011-09-14 23:13:28 +00001060 return;
Devang Patel734a67c2011-09-14 23:13:28 +00001061
Nick Lewycky746cb672011-10-26 22:55:33 +00001062 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
Devang Patel30d409c2012-02-07 23:33:58 +00001063 BTy.getEncoding());
Devang Patel734a67c2011-09-14 23:13:28 +00001064
Devang Patel161b2f42011-04-12 23:21:44 +00001065 uint64_t Size = BTy.getSizeInBits() >> 3;
David Blaikie770530b2013-10-21 17:28:37 +00001066 addUInt(&Buffer, dwarf::DW_AT_byte_size, None, Size);
Devang Patel161b2f42011-04-12 23:21:44 +00001067}
1068
1069/// constructTypeDIE - Construct derived type die from DIDerivedType.
1070void CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
1071 // Get core information.
1072 StringRef Name = DTy.getName();
1073 uint64_t Size = DTy.getSizeInBits() >> 3;
David Blaikie916d49e2013-10-04 23:21:16 +00001074 uint16_t Tag = Buffer.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +00001075
1076 // Map to main type, void will not have a type.
Manman Ren017ceda2013-10-08 18:42:58 +00001077 DIType FromTy = resolve(DTy.getTypeDerivedFrom());
Eric Christopherdc1363f2013-08-08 07:40:37 +00001078 if (FromTy)
1079 addType(&Buffer, FromTy);
Devang Patel161b2f42011-04-12 23:21:44 +00001080
1081 // Add name if not anonymous or intermediate type.
1082 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001083 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001084
1085 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopher35f225a2012-02-21 22:25:53 +00001086 if (Size && Tag != dwarf::DW_TAG_pointer_type)
David Blaikie770530b2013-10-21 17:28:37 +00001087 addUInt(&Buffer, dwarf::DW_AT_byte_size, None, Size);
Devang Patel161b2f42011-04-12 23:21:44 +00001088
David Blaikie62fdfb52013-01-07 05:51:15 +00001089 if (Tag == dwarf::DW_TAG_ptr_to_member_type)
Eric Christopher6efc0432013-10-19 01:04:47 +00001090 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type,
1091 getOrCreateTypeDIE(resolve(DTy.getClassType())));
Devang Patel161b2f42011-04-12 23:21:44 +00001092 // Add source line info if available and TyDesc is not a forward declaration.
1093 if (!DTy.isForwardDecl())
1094 addSourceLine(&Buffer, DTy);
1095}
1096
Eric Christopher3dee5752013-07-26 17:02:41 +00001097/// Return true if the type is appropriately scoped to be contained inside
1098/// its own type unit.
Manman Ren18eb2452013-09-09 19:23:58 +00001099static bool isTypeUnitScoped(DIType Ty, const DwarfDebug *DD) {
Manman Ren2c9905a2013-09-09 19:47:11 +00001100 DIScope Parent = DD->resolve(Ty.getContext());
Eric Christopher3dee5752013-07-26 17:02:41 +00001101 while (Parent) {
1102 // Don't generate a hash for anything scoped inside a function.
1103 if (Parent.isSubprogram())
1104 return false;
Manman Rene72aba92013-09-09 22:35:23 +00001105 Parent = DD->resolve(Parent.getContext());
Eric Christopher3dee5752013-07-26 17:02:41 +00001106 }
1107 return true;
1108}
1109
1110/// Return true if the type should be split out into a type unit.
Manman Ren18eb2452013-09-09 19:23:58 +00001111static bool shouldCreateTypeUnit(DICompositeType CTy, const DwarfDebug *DD) {
Eric Christopher31667622013-08-08 01:41:00 +00001112 uint16_t Tag = CTy.getTag();
Eric Christopher3dee5752013-07-26 17:02:41 +00001113
1114 switch (Tag) {
1115 case dwarf::DW_TAG_structure_type:
1116 case dwarf::DW_TAG_union_type:
1117 case dwarf::DW_TAG_enumeration_type:
1118 case dwarf::DW_TAG_class_type:
1119 // If this is a class, structure, union, or enumeration type
David Blaikiec4eb3532013-10-04 23:52:02 +00001120 // that is a definition (not a declaration), and not scoped
Eric Christopher3dee5752013-07-26 17:02:41 +00001121 // inside a function then separate this out as a type unit.
David Blaikiec4eb3532013-10-04 23:52:02 +00001122 return !CTy.isForwardDecl() && isTypeUnitScoped(CTy, DD);
Eric Christopher3dee5752013-07-26 17:02:41 +00001123 default:
David Blaikiec4eb3532013-10-04 23:52:02 +00001124 return false;
Eric Christopher3dee5752013-07-26 17:02:41 +00001125 }
1126}
1127
Devang Patel161b2f42011-04-12 23:21:44 +00001128/// constructTypeDIE - Construct type DIE from DICompositeType.
1129void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
1130 // Get core information.
1131 StringRef Name = CTy.getName();
1132
1133 uint64_t Size = CTy.getSizeInBits() >> 3;
David Blaikie916d49e2013-10-04 23:21:16 +00001134 uint16_t Tag = Buffer.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +00001135
1136 switch (Tag) {
Devang Patel161b2f42011-04-12 23:21:44 +00001137 case dwarf::DW_TAG_array_type:
Eric Christopher883ed6b2013-11-11 18:52:31 +00001138 constructArrayTypeDIE(Buffer, CTy);
Devang Patel161b2f42011-04-12 23:21:44 +00001139 break;
1140 case dwarf::DW_TAG_enumeration_type: {
1141 DIArray Elements = CTy.getTypeArray();
1142
1143 // Add enumerators to enumeration type.
1144 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
Devang Patel161b2f42011-04-12 23:21:44 +00001145 DIDescriptor Enum(Elements.getElement(i));
Manman Ren630c3262013-10-18 21:14:19 +00001146 if (Enum.isEnumerator())
Manman Ren950f4e82013-10-23 22:52:22 +00001147 constructEnumTypeDIE(Buffer, DIEnumerator(Enum));
Devang Patel161b2f42011-04-12 23:21:44 +00001148 }
Manman Ren017ceda2013-10-08 18:42:58 +00001149 DIType DTy = resolve(CTy.getTypeDerivedFrom());
Eric Christopher37c107b2013-08-08 07:40:42 +00001150 if (DTy) {
Eric Christopherbb0f6ea2012-05-23 00:09:20 +00001151 addType(&Buffer, DTy);
Eric Christopher371d9582013-10-04 22:40:10 +00001152 addFlag(&Buffer, dwarf::DW_AT_enum_class);
Eric Christopherbb0f6ea2012-05-23 00:09:20 +00001153 }
Eric Christopher6efc0432013-10-19 01:04:47 +00001154 } break;
Devang Patel161b2f42011-04-12 23:21:44 +00001155 case dwarf::DW_TAG_subroutine_type: {
Eric Christopherdc1363f2013-08-08 07:40:37 +00001156 // Add return type. A void return won't have a type.
Devang Patel161b2f42011-04-12 23:21:44 +00001157 DIArray Elements = CTy.getTypeArray();
1158 DIDescriptor RTy = Elements.getElement(0);
Eric Christopherdc1363f2013-08-08 07:40:37 +00001159 if (RTy)
1160 addType(&Buffer, DIType(RTy));
Devang Patel161b2f42011-04-12 23:21:44 +00001161
1162 bool isPrototyped = true;
1163 // Add arguments.
1164 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
1165 DIDescriptor Ty = Elements.getElement(i);
1166 if (Ty.isUnspecifiedParameter()) {
Manman Ren1a5e7872013-10-29 00:53:03 +00001167 createAndAddDIE(dwarf::DW_TAG_unspecified_parameters, Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +00001168 isPrototyped = false;
1169 } else {
Manman Ren1a5e7872013-10-29 00:53:03 +00001170 DIE *Arg = createAndAddDIE(dwarf::DW_TAG_formal_parameter, Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +00001171 addType(Arg, DIType(Ty));
David Blaikieaaf2e632013-01-29 19:35:24 +00001172 if (DIType(Ty).isArtificial())
1173 addFlag(Arg, dwarf::DW_AT_artificial);
Devang Patel161b2f42011-04-12 23:21:44 +00001174 }
1175 }
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001176 // Add prototype flag if we're dealing with a C language and the
1177 // function has been prototyped.
Eric Christopher7b878952013-08-26 23:50:38 +00001178 uint16_t Language = DICompileUnit(Node).getLanguage();
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001179 if (isPrototyped &&
Eric Christopher6efc0432013-10-19 01:04:47 +00001180 (Language == dwarf::DW_LANG_C89 || Language == dwarf::DW_LANG_C99 ||
Eric Christopher4d069bf2012-05-22 18:45:24 +00001181 Language == dwarf::DW_LANG_ObjC))
Eric Christopher873cf0a2012-08-24 01:14:27 +00001182 addFlag(&Buffer, dwarf::DW_AT_prototyped);
Eric Christopher6efc0432013-10-19 01:04:47 +00001183 } break;
Devang Patel161b2f42011-04-12 23:21:44 +00001184 case dwarf::DW_TAG_structure_type:
1185 case dwarf::DW_TAG_union_type:
1186 case dwarf::DW_TAG_class_type: {
Devang Patel161b2f42011-04-12 23:21:44 +00001187 // Add elements to structure type.
David Blaikiec8b93552013-08-01 20:30:22 +00001188 DIArray Elements = CTy.getTypeArray();
1189 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
Devang Patel161b2f42011-04-12 23:21:44 +00001190 DIDescriptor Element = Elements.getElement(i);
1191 DIE *ElemDie = NULL;
1192 if (Element.isSubprogram()) {
1193 DISubprogram SP(Element);
Devang Pateldbc64af2011-08-15 17:24:54 +00001194 ElemDie = getOrCreateSubprogramDIE(DISubprogram(Element));
Devang Patel161b2f42011-04-12 23:21:44 +00001195 if (SP.isProtected())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001196 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001197 dwarf::DW_ACCESS_protected);
1198 else if (SP.isPrivate())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001199 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001200 dwarf::DW_ACCESS_private);
Eric Christopher8b4310b2012-11-21 00:34:38 +00001201 else
Nick Lewycky13aaca52011-12-13 05:09:11 +00001202 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Eric Christopher6efc0432013-10-19 01:04:47 +00001203 dwarf::DW_ACCESS_public);
Devang Patel161b2f42011-04-12 23:21:44 +00001204 if (SP.isExplicit())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001205 addFlag(ElemDie, dwarf::DW_AT_explicit);
Eric Christopher663e0cf2012-03-28 07:34:31 +00001206 } else if (Element.isDerivedType()) {
Eric Christopher4d069bf2012-05-22 18:45:24 +00001207 DIDerivedType DDTy(Element);
1208 if (DDTy.getTag() == dwarf::DW_TAG_friend) {
Manman Ren1a5e7872013-10-29 00:53:03 +00001209 ElemDie = createAndAddDIE(dwarf::DW_TAG_friend, Buffer);
Manman Ren017ceda2013-10-08 18:42:58 +00001210 addType(ElemDie, resolve(DDTy.getTypeDerivedFrom()),
Manman Renc664d762013-10-05 01:43:03 +00001211 dwarf::DW_AT_friend);
Manman Ren655a10d2013-10-14 20:33:57 +00001212 } else if (DDTy.isStaticMember()) {
Manman Ren99addee2013-10-23 22:57:12 +00001213 getOrCreateStaticMemberDIE(DDTy);
Manman Ren655a10d2013-10-14 20:33:57 +00001214 } else {
Manman Rena1d25b62013-10-23 23:00:44 +00001215 constructMemberDIE(Buffer, DDTy);
Manman Ren655a10d2013-10-14 20:33:57 +00001216 }
Eric Christopher663e0cf2012-03-28 07:34:31 +00001217 } else if (Element.isObjCProperty()) {
Devang Patel30d409c2012-02-07 23:33:58 +00001218 DIObjCProperty Property(Element);
Manman Ren1a5e7872013-10-29 00:53:03 +00001219 ElemDie = createAndAddDIE(Property.getTag(), Buffer);
Devang Patel30d409c2012-02-07 23:33:58 +00001220 StringRef PropertyName = Property.getObjCPropertyName();
1221 addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
Eric Christopher4d069bf2012-05-22 18:45:24 +00001222 addType(ElemDie, Property.getType());
1223 addSourceLine(ElemDie, Property);
Devang Patel30d409c2012-02-07 23:33:58 +00001224 StringRef GetterName = Property.getObjCPropertyGetterName();
1225 if (!GetterName.empty())
1226 addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
1227 StringRef SetterName = Property.getObjCPropertySetterName();
1228 if (!SetterName.empty())
1229 addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
1230 unsigned PropertyAttributes = 0;
Devang Patel9e11eb12012-02-04 01:30:32 +00001231 if (Property.isReadOnlyObjCProperty())
1232 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
1233 if (Property.isReadWriteObjCProperty())
1234 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
1235 if (Property.isAssignObjCProperty())
1236 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
1237 if (Property.isRetainObjCProperty())
1238 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
1239 if (Property.isCopyObjCProperty())
1240 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
1241 if (Property.isNonAtomicObjCProperty())
1242 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
1243 if (PropertyAttributes)
David Blaikie770530b2013-10-21 17:28:37 +00001244 addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, None,
Eric Christopher6efc0432013-10-19 01:04:47 +00001245 PropertyAttributes);
Devang Patel6588abf2012-02-06 17:49:43 +00001246
Devang Patel30d409c2012-02-07 23:33:58 +00001247 DIEEntry *Entry = getDIEEntry(Element);
1248 if (!Entry) {
1249 Entry = createDIEEntry(ElemDie);
1250 insertDIEEntry(Element, Entry);
1251 }
Devang Patel9e11eb12012-02-04 01:30:32 +00001252 } else
Devang Patel161b2f42011-04-12 23:21:44 +00001253 continue;
Devang Patel161b2f42011-04-12 23:21:44 +00001254 }
1255
1256 if (CTy.isAppleBlockExtension())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001257 addFlag(&Buffer, dwarf::DW_AT_APPLE_block);
Devang Patel161b2f42011-04-12 23:21:44 +00001258
Eric Christophereee74fb2013-10-05 00:27:02 +00001259 DICompositeType ContainingType(resolve(CTy.getContainingType()));
Devang Patel161b2f42011-04-12 23:21:44 +00001260 if (DIDescriptor(ContainingType).isCompositeType())
Manman Ren87b110a2013-10-11 23:58:05 +00001261 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type,
Devang Patel161b2f42011-04-12 23:21:44 +00001262 getOrCreateTypeDIE(DIType(ContainingType)));
Devang Patel161b2f42011-04-12 23:21:44 +00001263
Devang Patel201e6cd2011-05-12 21:29:42 +00001264 if (CTy.isObjcClassComplete())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001265 addFlag(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type);
Devang Patelb11f80e2011-05-12 19:06:16 +00001266
Eric Christopher1a8e8862011-12-16 23:42:42 +00001267 // Add template parameters to a class, structure or union types.
1268 // FIXME: The support isn't in the metadata for this yet.
1269 if (Tag == dwarf::DW_TAG_class_type ||
Eric Christopher6efc0432013-10-19 01:04:47 +00001270 Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type)
Devang Patel161b2f42011-04-12 23:21:44 +00001271 addTemplateParams(Buffer, CTy.getTemplateParams());
1272
1273 break;
1274 }
1275 default:
1276 break;
1277 }
1278
1279 // Add name if not anonymous or intermediate type.
1280 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001281 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001282
Eric Christopher4a5d8392012-05-22 18:45:18 +00001283 if (Tag == dwarf::DW_TAG_enumeration_type ||
Eric Christopher6efc0432013-10-19 01:04:47 +00001284 Tag == dwarf::DW_TAG_class_type || Tag == dwarf::DW_TAG_structure_type ||
Eric Christopher4a5d8392012-05-22 18:45:18 +00001285 Tag == dwarf::DW_TAG_union_type) {
Devang Patel161b2f42011-04-12 23:21:44 +00001286 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopherfc4199b2012-06-01 00:22:32 +00001287 // TODO: Do we care about size for enum forward declarations?
Devang Patel161b2f42011-04-12 23:21:44 +00001288 if (Size)
David Blaikie770530b2013-10-21 17:28:37 +00001289 addUInt(&Buffer, dwarf::DW_AT_byte_size, None, Size);
Eric Christopherfc4199b2012-06-01 00:22:32 +00001290 else if (!CTy.isForwardDecl())
Devang Patel161b2f42011-04-12 23:21:44 +00001291 // Add zero size if it is not a forward declaration.
David Blaikie770530b2013-10-21 17:28:37 +00001292 addUInt(&Buffer, dwarf::DW_AT_byte_size, None, 0);
Eric Christopherfc4199b2012-06-01 00:22:32 +00001293
1294 // If we're a forward decl, say so.
1295 if (CTy.isForwardDecl())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001296 addFlag(&Buffer, dwarf::DW_AT_declaration);
Devang Patel161b2f42011-04-12 23:21:44 +00001297
1298 // Add source line info if available.
1299 if (!CTy.isForwardDecl())
1300 addSourceLine(&Buffer, CTy);
Eric Christopher89388952012-03-07 00:15:19 +00001301
1302 // No harm in adding the runtime language to the declaration.
1303 unsigned RLang = CTy.getRunTimeLang();
1304 if (RLang)
Eric Christopher6efc0432013-10-19 01:04:47 +00001305 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class, dwarf::DW_FORM_data1,
1306 RLang);
Devang Patel161b2f42011-04-12 23:21:44 +00001307 }
Eric Christopher3dee5752013-07-26 17:02:41 +00001308 // If this is a type applicable to a type unit it then add it to the
1309 // list of types we'll compute a hash for later.
Manman Ren18eb2452013-09-09 19:23:58 +00001310 if (shouldCreateTypeUnit(CTy, DD))
Eric Christopher3dee5752013-07-26 17:02:41 +00001311 DD->addTypeUnitType(&Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +00001312}
1313
Manman Renbe87b692013-10-23 23:05:28 +00001314/// constructTemplateTypeParameterDIE - Construct new DIE for the given
1315/// DITemplateTypeParameter.
Manman Ren99addee2013-10-23 22:57:12 +00001316void
Manman Renbe87b692013-10-23 23:05:28 +00001317CompileUnit::constructTemplateTypeParameterDIE(DIE &Buffer,
1318 DITemplateTypeParameter TP) {
Manman Ren1a5e7872013-10-29 00:53:03 +00001319 DIE *ParamDIE =
1320 createAndAddDIE(dwarf::DW_TAG_template_type_parameter, Buffer);
Eric Christopher76ef79f2013-08-08 08:09:43 +00001321 // Add the type if it exists, it could be void and therefore no type.
1322 if (TP.getType())
Manman Renb4d9c112013-10-09 19:46:28 +00001323 addType(ParamDIE, resolve(TP.getType()));
David Blaikiee88939c2013-06-22 18:59:11 +00001324 if (!TP.getName().empty())
1325 addString(ParamDIE, dwarf::DW_AT_name, TP.getName());
Devang Patel161b2f42011-04-12 23:21:44 +00001326}
1327
Manman Renbe87b692013-10-23 23:05:28 +00001328/// constructTemplateValueParameterDIE - Construct new DIE for the given
1329/// DITemplateValueParameter.
Manman Ren99addee2013-10-23 22:57:12 +00001330void
Manman Renbe87b692013-10-23 23:05:28 +00001331CompileUnit::constructTemplateValueParameterDIE(DIE &Buffer,
1332 DITemplateValueParameter VP) {
Manman Ren1a5e7872013-10-29 00:53:03 +00001333 DIE *ParamDIE = createAndAddDIE(VP.getTag(), Buffer);
Eric Christopherdc1363f2013-08-08 07:40:37 +00001334
1335 // Add the type if there is one, template template and template parameter
1336 // packs will not have a type.
Eric Christopheref2d9192013-10-21 17:48:51 +00001337 if (VP.getTag() == dwarf::DW_TAG_template_value_parameter)
Manman Renb4d9c112013-10-09 19:46:28 +00001338 addType(ParamDIE, resolve(VP.getType()));
Eric Christopherafdd1f82013-08-08 07:40:31 +00001339 if (!VP.getName().empty())
1340 addString(ParamDIE, dwarf::DW_AT_name, VP.getName());
1341 if (Value *Val = VP.getValue()) {
David Blaikie4de9d722013-05-10 21:52:07 +00001342 if (ConstantInt *CI = dyn_cast<ConstantInt>(Val))
Manman Renb4d9c112013-10-09 19:46:28 +00001343 addConstantValue(ParamDIE, CI,
1344 isUnsignedDIType(DD, resolve(VP.getType())));
David Blaikie4de9d722013-05-10 21:52:07 +00001345 else if (GlobalValue *GV = dyn_cast<GlobalValue>(Val)) {
1346 // For declaration non-type template parameters (such as global values and
1347 // functions)
1348 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Rafael Espindolaffc7dca2013-10-29 17:07:16 +00001349 addOpAddress(Block, Asm->getSymbol(GV));
David Blaikie4de9d722013-05-10 21:52:07 +00001350 // Emit DW_OP_stack_value to use the address as the immediate value of the
1351 // parameter, rather than a pointer to it.
David Blaikie770530b2013-10-21 17:28:37 +00001352 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value);
1353 addBlock(ParamDIE, dwarf::DW_AT_location, Block);
Eric Christopherafdd1f82013-08-08 07:40:31 +00001354 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_template_param) {
David Blaikiee88939c2013-06-22 18:59:11 +00001355 assert(isa<MDString>(Val));
1356 addString(ParamDIE, dwarf::DW_AT_GNU_template_name,
1357 cast<MDString>(Val)->getString());
Eric Christopherafdd1f82013-08-08 07:40:31 +00001358 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_parameter_pack) {
David Blaikiee88939c2013-06-22 18:59:11 +00001359 assert(isa<MDNode>(Val));
1360 DIArray A(cast<MDNode>(Val));
1361 addTemplateParams(*ParamDIE, A);
David Blaikie4de9d722013-05-10 21:52:07 +00001362 }
1363 }
Devang Patel161b2f42011-04-12 23:21:44 +00001364}
1365
Devang Patel31c5d052011-05-06 16:57:54 +00001366/// getOrCreateNameSpace - Create a DIE for DINameSpace.
1367DIE *CompileUnit::getOrCreateNameSpace(DINameSpace NS) {
Manman Ren6b713802013-10-29 05:49:41 +00001368 // Construct the context before querying for the existence of the DIE in case
1369 // such construction creates the DIE.
1370 DIE *ContextDIE = getOrCreateContextDIE(NS.getContext());
1371 if (!ContextDIE)
1372 // If the context is null, DIE should belong to the CU we call construct
1373 // function on.
1374 ContextDIE = CUDie.get();
1375
Devang Patel31c5d052011-05-06 16:57:54 +00001376 DIE *NDie = getDIE(NS);
1377 if (NDie)
1378 return NDie;
Manman Ren6b713802013-10-29 05:49:41 +00001379 NDie = createAndAddDIE(dwarf::DW_TAG_namespace, *ContextDIE, NS);
1380
Eric Christopher09ac3d82011-11-07 09:24:32 +00001381 if (!NS.getName().empty()) {
Nick Lewycky390c40d2011-10-27 06:44:11 +00001382 addString(NDie, dwarf::DW_AT_name, NS.getName());
Eric Christopher09ac3d82011-11-07 09:24:32 +00001383 addAccelNamespace(NS.getName(), NDie);
Eric Christopher91986572013-10-17 02:06:06 +00001384 addGlobalName(NS.getName(), NDie, NS.getContext());
Eric Christopher09ac3d82011-11-07 09:24:32 +00001385 } else
1386 addAccelNamespace("(anonymous namespace)", NDie);
Devang Patel31c5d052011-05-06 16:57:54 +00001387 addSourceLine(NDie, NS);
Devang Patel31c5d052011-05-06 16:57:54 +00001388 return NDie;
1389}
1390
Devang Pateldbc64af2011-08-15 17:24:54 +00001391/// getOrCreateSubprogramDIE - Create new DIE using SP.
1392DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
David Blaikiec32f2332013-10-04 01:39:59 +00001393 // Construct the context before querying for the existence of the DIE in case
1394 // such construction creates the DIE (as is the case for member function
1395 // declarations).
Manman Renb8e48a62013-10-10 18:40:01 +00001396 DIE *ContextDIE = getOrCreateContextDIE(resolve(SP.getContext()));
David Blaikiec32f2332013-10-04 01:39:59 +00001397 if (!ContextDIE)
1398 ContextDIE = CUDie.get();
1399
Eric Christopher3f045002013-10-04 17:08:38 +00001400 DIE *SPDie = getDIE(SP);
Devang Pateldbc64af2011-08-15 17:24:54 +00001401 if (SPDie)
1402 return SPDie;
1403
Manman Renbbdd02c2013-10-29 00:58:04 +00001404 DISubprogram SPDecl = SP.getFunctionDeclaration();
1405 if (SPDecl.isSubprogram())
1406 // Add subprogram definitions to the CU die directly.
1407 ContextDIE = CUDie.get();
Peter Collingbourne27302f02012-05-27 18:36:44 +00001408
1409 // DW_TAG_inlined_subroutine may refer to this DIE.
Manman Renbbdd02c2013-10-29 00:58:04 +00001410 SPDie = createAndAddDIE(dwarf::DW_TAG_subprogram, *ContextDIE, SP);
Peter Collingbourne27302f02012-05-27 18:36:44 +00001411
Rafael Espindola01b55b42011-11-10 22:34:29 +00001412 DIE *DeclDie = NULL;
Manman Ren250f4e82013-10-23 22:12:26 +00001413 if (SPDecl.isSubprogram())
Rafael Espindola01b55b42011-11-10 22:34:29 +00001414 DeclDie = getOrCreateSubprogramDIE(SPDecl);
Rafael Espindola01b55b42011-11-10 22:34:29 +00001415
Devang Pateldbc64af2011-08-15 17:24:54 +00001416 // Add function template parameters.
1417 addTemplateParams(*SPDie, SP.getTemplateParams());
1418
Devang Pateldbc64af2011-08-15 17:24:54 +00001419 // If this DIE is going to refer declaration info using AT_specification
Eric Christopherc4968752013-05-09 00:42:33 +00001420 // then there is no need to add other attributes.
Rafael Espindola01b55b42011-11-10 22:34:29 +00001421 if (DeclDie) {
1422 // Refer function declaration directly.
Manman Ren87b110a2013-10-11 23:58:05 +00001423 addDIEEntry(SPDie, dwarf::DW_AT_specification, DeclDie);
Rafael Espindola01b55b42011-11-10 22:34:29 +00001424
Devang Pateldbc64af2011-08-15 17:24:54 +00001425 return SPDie;
Rafael Espindola01b55b42011-11-10 22:34:29 +00001426 }
Devang Pateldbc64af2011-08-15 17:24:54 +00001427
Eric Christophercbbd5b12012-08-23 22:52:55 +00001428 // Add the linkage name if we have one.
Michael Gottesmandc42d032013-09-04 04:39:38 +00001429 StringRef LinkageName = SP.getLinkageName();
1430 if (!LinkageName.empty())
Eric Christophercbbd5b12012-08-23 22:52:55 +00001431 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c2b4be2013-06-01 17:51:14 +00001432 GlobalValue::getRealLinkageName(LinkageName));
Eric Christophercbbd5b12012-08-23 22:52:55 +00001433
Devang Pateldbc64af2011-08-15 17:24:54 +00001434 // Constructors and operators for anonymous aggregates do not have names.
1435 if (!SP.getName().empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001436 addString(SPDie, dwarf::DW_AT_name, SP.getName());
Devang Pateldbc64af2011-08-15 17:24:54 +00001437
1438 addSourceLine(SPDie, SP);
1439
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001440 // Add the prototype if we have a prototype and we have a C like
1441 // language.
Eric Christopher7b878952013-08-26 23:50:38 +00001442 uint16_t Language = DICompileUnit(Node).getLanguage();
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001443 if (SP.isPrototyped() &&
Eric Christopher6efc0432013-10-19 01:04:47 +00001444 (Language == dwarf::DW_LANG_C89 || Language == dwarf::DW_LANG_C99 ||
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001445 Language == dwarf::DW_LANG_ObjC))
Eric Christopher873cf0a2012-08-24 01:14:27 +00001446 addFlag(SPDie, dwarf::DW_AT_prototyped);
Devang Pateldbc64af2011-08-15 17:24:54 +00001447
Devang Pateldbc64af2011-08-15 17:24:54 +00001448 DICompositeType SPTy = SP.getType();
David Blaikie3d331842013-05-22 23:22:18 +00001449 assert(SPTy.getTag() == dwarf::DW_TAG_subroutine_type &&
1450 "the type of a subprogram should be a subroutine");
Devang Pateldbc64af2011-08-15 17:24:54 +00001451
David Blaikie3d331842013-05-22 23:22:18 +00001452 DIArray Args = SPTy.getTypeArray();
Eric Christopheref2d9192013-10-21 17:48:51 +00001453 // Add a return type. If this is a type like a C/C++ void type we don't add a
1454 // return type.
Eric Christopherdc1363f2013-08-08 07:40:37 +00001455 if (Args.getElement(0))
1456 addType(SPDie, DIType(Args.getElement(0)));
Devang Pateldbc64af2011-08-15 17:24:54 +00001457
1458 unsigned VK = SP.getVirtuality();
1459 if (VK) {
Nick Lewycky798313d2011-12-14 00:56:07 +00001460 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
Devang Pateldbc64af2011-08-15 17:24:54 +00001461 DIEBlock *Block = getDIEBlock();
David Blaikie770530b2013-10-21 17:28:37 +00001462 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1463 addUInt(Block, dwarf::DW_FORM_udata, SP.getVirtualIndex());
1464 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, Block);
Devang Pateldbc64af2011-08-15 17:24:54 +00001465 ContainingTypeMap.insert(std::make_pair(SPDie,
Eric Christophereee74fb2013-10-05 00:27:02 +00001466 resolve(SP.getContainingType())));
Devang Pateldbc64af2011-08-15 17:24:54 +00001467 }
1468
1469 if (!SP.isDefinition()) {
Eric Christopher873cf0a2012-08-24 01:14:27 +00001470 addFlag(SPDie, dwarf::DW_AT_declaration);
Eric Christopher8b4310b2012-11-21 00:34:38 +00001471
Devang Pateldbc64af2011-08-15 17:24:54 +00001472 // Add arguments. Do not add arguments for subprogram definition. They will
1473 // be handled while processing variables.
Eric Christopher6efc0432013-10-19 01:04:47 +00001474 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
Manman Ren1a5e7872013-10-29 00:53:03 +00001475 DIE *Arg = createAndAddDIE(dwarf::DW_TAG_formal_parameter, *SPDie);
David Blaikie3d331842013-05-22 23:22:18 +00001476 DIType ATy = DIType(Args.getElement(i));
1477 addType(Arg, ATy);
1478 if (ATy.isArtificial())
1479 addFlag(Arg, dwarf::DW_AT_artificial);
David Blaikie3d331842013-05-22 23:22:18 +00001480 }
Devang Pateldbc64af2011-08-15 17:24:54 +00001481 }
1482
1483 if (SP.isArtificial())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001484 addFlag(SPDie, dwarf::DW_AT_artificial);
Devang Pateldbc64af2011-08-15 17:24:54 +00001485
1486 if (!SP.isLocalToUnit())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001487 addFlag(SPDie, dwarf::DW_AT_external);
Devang Pateldbc64af2011-08-15 17:24:54 +00001488
1489 if (SP.isOptimized())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001490 addFlag(SPDie, dwarf::DW_AT_APPLE_optimized);
Devang Pateldbc64af2011-08-15 17:24:54 +00001491
1492 if (unsigned isa = Asm->getISAEncoding()) {
1493 addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1494 }
1495
1496 return SPDie;
1497}
1498
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001499// Return const expression if value is a GEP to access merged global
1500// constant. e.g.
1501// i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
1502static const ConstantExpr *getMergedGlobalExpr(const Value *V) {
1503 const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
1504 if (!CE || CE->getNumOperands() != 3 ||
1505 CE->getOpcode() != Instruction::GetElementPtr)
1506 return NULL;
1507
1508 // First operand points to a global struct.
1509 Value *Ptr = CE->getOperand(0);
1510 if (!isa<GlobalValue>(Ptr) ||
1511 !isa<StructType>(cast<PointerType>(Ptr->getType())->getElementType()))
1512 return NULL;
1513
1514 // Second operand is zero.
1515 const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
1516 if (!CI || !CI->isZero())
1517 return NULL;
1518
1519 // Third operand is offset.
1520 if (!isa<ConstantInt>(CE->getOperand(2)))
1521 return NULL;
1522
1523 return CE;
1524}
1525
1526/// createGlobalVariableDIE - create global variable DIE.
1527void CompileUnit::createGlobalVariableDIE(const MDNode *N) {
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001528 // Check for pre-existence.
Devang Patel49e2f032011-08-18 22:21:50 +00001529 if (getDIE(N))
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001530 return;
1531
Devang Patel49e2f032011-08-18 22:21:50 +00001532 DIGlobalVariable GV(N);
Manman Rend03d2b22013-07-08 18:33:29 +00001533 if (!GV.isGlobalVariable())
Devang Patel28bea082011-08-18 23:17:55 +00001534 return;
1535
Eric Christopherccb66362013-10-04 23:49:26 +00001536 DIScope GVContext = GV.getContext();
Eric Christopher6b6061f2013-01-16 01:22:23 +00001537 DIType GTy = GV.getType();
1538
1539 // If this is a static data member definition, some attributes belong
1540 // to the declaration DIE.
1541 DIE *VariableDIE = NULL;
Manman Ren945e8282013-02-01 23:54:37 +00001542 bool IsStaticMember = false;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001543 DIDerivedType SDMDecl = GV.getStaticDataMemberDeclaration();
1544 if (SDMDecl.Verify()) {
1545 assert(SDMDecl.isStaticMember() && "Expected static member decl");
1546 // We need the declaration DIE that is in the static member's class.
Manman Ren655a10d2013-10-14 20:33:57 +00001547 VariableDIE = getOrCreateStaticMemberDIE(SDMDecl);
Manman Ren945e8282013-02-01 23:54:37 +00001548 IsStaticMember = true;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001549 }
1550
1551 // If this is not a static data member definition, create the variable
1552 // DIE and add the initial set of attributes to it.
1553 if (!VariableDIE) {
Manman Ren6b713802013-10-29 05:49:41 +00001554 // Construct the context before querying for the existence of the DIE in
1555 // case such construction creates the DIE.
1556 DIE *ContextDIE = getOrCreateContextDIE(GVContext);
1557 if (!ContextDIE)
1558 ContextDIE = CUDie.get();
1559
Eric Christopher6b6061f2013-01-16 01:22:23 +00001560 // Add to map.
Manman Ren6b713802013-10-29 05:49:41 +00001561 VariableDIE = createAndAddDIE(GV.getTag(), *ContextDIE, N);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001562
1563 // Add name and type.
1564 addString(VariableDIE, dwarf::DW_AT_name, GV.getDisplayName());
1565 addType(VariableDIE, GTy);
1566
1567 // Add scoping info.
Eric Christophera486f552013-10-16 01:37:49 +00001568 if (!GV.isLocalToUnit())
Eric Christopher6b6061f2013-01-16 01:22:23 +00001569 addFlag(VariableDIE, dwarf::DW_AT_external);
1570
1571 // Add line number info.
1572 addSourceLine(VariableDIE, GV);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001573 }
1574
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001575 // Add location.
Eric Christopher09ac3d82011-11-07 09:24:32 +00001576 bool addToAccelTable = false;
Eric Christopherd61c34b2011-11-11 03:16:32 +00001577 DIE *VariableSpecDIE = NULL;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001578 bool isGlobalVariable = GV.getGlobal() != NULL;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001579 if (isGlobalVariable) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001580 addToAccelTable = true;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001581 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Rafael Espindolaffc7dca2013-10-29 17:07:16 +00001582 const MCSymbol *Sym = Asm->getSymbol(GV.getGlobal());
David Blaikie59eaa382013-06-28 20:05:11 +00001583 if (GV.getGlobal()->isThreadLocal()) {
1584 // FIXME: Make this work with -gsplit-dwarf.
1585 unsigned PointerSize = Asm->getDataLayout().getPointerSize();
1586 assert((PointerSize == 4 || PointerSize == 8) &&
1587 "Add support for other sizes if necessary");
Ulrich Weigand716a94f2013-07-02 18:47:09 +00001588 const MCExpr *Expr =
David Blaikie8fed05e2013-07-01 23:55:52 +00001589 Asm->getObjFileLowering().getDebugThreadLocalSymbol(Sym);
David Blaikie59eaa382013-06-28 20:05:11 +00001590 // Based on GCC's support for TLS:
David Blaikie8fed05e2013-07-01 23:55:52 +00001591 if (!DD->useSplitDwarf()) {
1592 // 1) Start with a constNu of the appropriate pointer size
David Blaikie770530b2013-10-21 17:28:37 +00001593 addUInt(Block, dwarf::DW_FORM_data1,
David Blaikie8fed05e2013-07-01 23:55:52 +00001594 PointerSize == 4 ? dwarf::DW_OP_const4u : dwarf::DW_OP_const8u);
Richard Mitton379f76e2013-10-07 18:39:18 +00001595 // 2) containing the (relocated) offset of the TLS variable
1596 // within the module's TLS block.
David Blaikie770530b2013-10-21 17:28:37 +00001597 addExpr(Block, dwarf::DW_FORM_udata, Expr);
David Blaikie8fed05e2013-07-01 23:55:52 +00001598 } else {
David Blaikie770530b2013-10-21 17:28:37 +00001599 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_const_index);
1600 addUInt(Block, dwarf::DW_FORM_udata, DU->getAddrPoolIndex(Expr));
David Blaikie8fed05e2013-07-01 23:55:52 +00001601 }
Richard Mitton379f76e2013-10-07 18:39:18 +00001602 // 3) followed by a custom OP to make the debugger do a TLS lookup.
David Blaikie770530b2013-10-21 17:28:37 +00001603 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_push_tls_address);
David Blaikie59eaa382013-06-28 20:05:11 +00001604 } else
1605 addOpAddress(Block, Sym);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001606 // Do not create specification DIE if context is either compile unit
1607 // or a subprogram.
Devang Patel1dd4e562011-09-21 23:41:11 +00001608 if (GVContext && GV.isDefinition() && !GVContext.isCompileUnit() &&
Manman Ren02d29672013-09-09 19:05:21 +00001609 !GVContext.isFile() && !DD->isSubprogramContext(GVContext)) {
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001610 // Create specification DIE.
Manman Ren1a5e7872013-10-29 00:53:03 +00001611 VariableSpecDIE = createAndAddDIE(dwarf::DW_TAG_variable, *CUDie.get());
Manman Ren87b110a2013-10-11 23:58:05 +00001612 addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification, VariableDIE);
David Blaikie770530b2013-10-21 17:28:37 +00001613 addBlock(VariableSpecDIE, dwarf::DW_AT_location, Block);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001614 // A static member's declaration is already flagged as such.
1615 if (!SDMDecl.Verify())
1616 addFlag(VariableDIE, dwarf::DW_AT_declaration);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001617 } else {
David Blaikie770530b2013-10-21 17:28:37 +00001618 addBlock(VariableDIE, dwarf::DW_AT_location, Block);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001619 }
Michael Gottesmandc42d032013-09-04 04:39:38 +00001620 // Add the linkage name.
Eric Christopher6b6061f2013-01-16 01:22:23 +00001621 StringRef LinkageName = GV.getLinkageName();
Michael Gottesmandc42d032013-09-04 04:39:38 +00001622 if (!LinkageName.empty())
Eric Christopher8d45a982013-02-27 23:49:47 +00001623 // From DWARF4: DIEs to which DW_AT_linkage_name may apply include:
1624 // TAG_common_block, TAG_constant, TAG_entry_point, TAG_subprogram and
1625 // TAG_variable.
Eric Christopher6efc0432013-10-19 01:04:47 +00001626 addString(IsStaticMember && VariableSpecDIE ? VariableSpecDIE
1627 : VariableDIE,
1628 dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c2b4be2013-06-01 17:51:14 +00001629 GlobalValue::getRealLinkageName(LinkageName));
Eric Christopher8b4310b2012-11-21 00:34:38 +00001630 } else if (const ConstantInt *CI =
Eric Christopher6efc0432013-10-19 01:04:47 +00001631 dyn_cast_or_null<ConstantInt>(GV.getConstant())) {
Adrian Prantl2e892e42013-04-04 22:56:49 +00001632 // AT_const_value was added when the static member was created. To avoid
Manman Ren945e8282013-02-01 23:54:37 +00001633 // emitting AT_const_value multiple times, we only add AT_const_value when
1634 // it is not a static member.
1635 if (!IsStaticMember)
Manman Renc664d762013-10-05 01:43:03 +00001636 addConstantValue(VariableDIE, CI, isUnsignedDIType(DD, GTy));
Manman Ren945e8282013-02-01 23:54:37 +00001637 } else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001638 addToAccelTable = true;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001639 // GV is a merged global.
1640 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1641 Value *Ptr = CE->getOperand(0);
Rafael Espindolaffc7dca2013-10-29 17:07:16 +00001642 addOpAddress(Block, Asm->getSymbol(cast<GlobalValue>(Ptr)));
David Blaikie770530b2013-10-21 17:28:37 +00001643 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
Eric Christopher6efc0432013-10-19 01:04:47 +00001644 SmallVector<Value *, 3> Idx(CE->op_begin() + 1, CE->op_end());
David Blaikie770530b2013-10-21 17:28:37 +00001645 addUInt(Block, dwarf::DW_FORM_udata,
Eric Christopher6efc0432013-10-19 01:04:47 +00001646 Asm->getDataLayout().getIndexedOffset(Ptr->getType(), Idx));
David Blaikie770530b2013-10-21 17:28:37 +00001647 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1648 addBlock(VariableDIE, dwarf::DW_AT_location, Block);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001649 }
1650
Eric Christopherd117fbb2011-11-11 01:55:22 +00001651 if (addToAccelTable) {
1652 DIE *AddrDIE = VariableSpecDIE ? VariableSpecDIE : VariableDIE;
1653 addAccelName(GV.getName(), AddrDIE);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001654
Eric Christopherd117fbb2011-11-11 01:55:22 +00001655 // If the linkage name is different than the name, go ahead and output
1656 // that as well into the name table.
1657 if (GV.getLinkageName() != "" && GV.getName() != GV.getLinkageName())
1658 addAccelName(GV.getLinkageName(), AddrDIE);
1659 }
Eric Christophera486f552013-10-16 01:37:49 +00001660
1661 if (!GV.isLocalToUnit())
Eric Christopher91986572013-10-17 02:06:06 +00001662 addGlobalName(GV.getName(), VariableSpecDIE ? VariableSpecDIE : VariableDIE,
1663 GV.getContext());
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001664}
1665
Devang Patel161b2f42011-04-12 23:21:44 +00001666/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
Eric Christopher4d069bf2012-05-22 18:45:24 +00001667void CompileUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR,
1668 DIE *IndexTy) {
Manman Ren1a5e7872013-10-29 00:53:03 +00001669 DIE *DW_Subrange = createAndAddDIE(dwarf::DW_TAG_subrange_type, Buffer);
Manman Ren87b110a2013-10-11 23:58:05 +00001670 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, IndexTy);
Devang Patel161b2f42011-04-12 23:21:44 +00001671
Bill Wendling222c2fd2012-12-06 07:38:10 +00001672 // The LowerBound value defines the lower bounds which is typically zero for
1673 // C/C++. The Count value is the number of elements. Values are 64 bit. If
1674 // Count == -1 then the array is unbounded and we do not emit
1675 // DW_AT_lower_bound and DW_AT_upper_bound attributes. If LowerBound == 0 and
1676 // Count == 0, then the array has zero elements in which case we do not emit
1677 // an upper bound.
1678 int64_t LowerBound = SR.getLo();
Bill Wendling6afe4782012-12-06 07:55:19 +00001679 int64_t DefaultLowerBound = getDefaultLowerBound();
Bill Wendling9493dae2012-12-04 21:34:03 +00001680 int64_t Count = SR.getCount();
Devang Patel161b2f42011-04-12 23:21:44 +00001681
Bill Wendling6afe4782012-12-06 07:55:19 +00001682 if (DefaultLowerBound == -1 || LowerBound != DefaultLowerBound)
David Blaikie770530b2013-10-21 17:28:37 +00001683 addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, None, LowerBound);
Bill Wendling222c2fd2012-12-06 07:38:10 +00001684
1685 if (Count != -1 && Count != 0)
Bill Wendling9493dae2012-12-04 21:34:03 +00001686 // FIXME: An unbounded array should reference the expression that defines
1687 // the array.
David Blaikie770530b2013-10-21 17:28:37 +00001688 addUInt(DW_Subrange, dwarf::DW_AT_upper_bound, None, LowerBound + Count - 1);
Devang Patel161b2f42011-04-12 23:21:44 +00001689}
1690
1691/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
Eric Christopher883ed6b2013-11-11 18:52:31 +00001692void CompileUnit::constructArrayTypeDIE(DIE &Buffer, DICompositeType CTy) {
1693 if (CTy.isVector())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001694 addFlag(&Buffer, dwarf::DW_AT_GNU_vector);
Devang Patel161b2f42011-04-12 23:21:44 +00001695
Eric Christopherdc1363f2013-08-08 07:40:37 +00001696 // Emit the element type.
Eric Christopher883ed6b2013-11-11 18:52:31 +00001697 addType(&Buffer, resolve(CTy.getTypeDerivedFrom()));
Devang Patel161b2f42011-04-12 23:21:44 +00001698
1699 // Get an anonymous type for index type.
Eric Christopher8cab6ed2013-01-04 21:51:53 +00001700 // FIXME: This type should be passed down from the front end
1701 // as different languages may have different sizes for indexes.
Devang Patel161b2f42011-04-12 23:21:44 +00001702 DIE *IdxTy = getIndexTyDie();
1703 if (!IdxTy) {
1704 // Construct an anonymous type for index type.
Manman Ren1a5e7872013-10-29 00:53:03 +00001705 IdxTy = createAndAddDIE(dwarf::DW_TAG_base_type, *CUDie.get());
Eric Christopher8cab6ed2013-01-04 21:51:53 +00001706 addString(IdxTy, dwarf::DW_AT_name, "int");
David Blaikie770530b2013-10-21 17:28:37 +00001707 addUInt(IdxTy, dwarf::DW_AT_byte_size, None, sizeof(int32_t));
Devang Patel161b2f42011-04-12 23:21:44 +00001708 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1709 dwarf::DW_ATE_signed);
Devang Patel161b2f42011-04-12 23:21:44 +00001710 setIndexTyDie(IdxTy);
1711 }
1712
1713 // Add subranges to array type.
Eric Christopher883ed6b2013-11-11 18:52:31 +00001714 DIArray Elements = CTy.getTypeArray();
Devang Patel161b2f42011-04-12 23:21:44 +00001715 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1716 DIDescriptor Element = Elements.getElement(i);
1717 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1718 constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1719 }
1720}
1721
1722/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
Manman Ren99addee2013-10-23 22:57:12 +00001723void CompileUnit::constructEnumTypeDIE(DIE &Buffer, DIEnumerator ETy) {
Manman Ren1a5e7872013-10-29 00:53:03 +00001724 DIE *Enumerator = createAndAddDIE(dwarf::DW_TAG_enumerator, Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +00001725 StringRef Name = ETy.getName();
Nick Lewycky390c40d2011-10-27 06:44:11 +00001726 addString(Enumerator, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001727 int64_t Value = ETy.getEnumValue();
1728 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
Devang Patel161b2f42011-04-12 23:21:44 +00001729}
1730
Devang Pateldbc64af2011-08-15 17:24:54 +00001731/// constructContainingTypeDIEs - Construct DIEs for types that contain
1732/// vtables.
1733void CompileUnit::constructContainingTypeDIEs() {
1734 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
Eric Christopher6efc0432013-10-19 01:04:47 +00001735 CE = ContainingTypeMap.end();
1736 CI != CE; ++CI) {
Devang Pateldbc64af2011-08-15 17:24:54 +00001737 DIE *SPDie = CI->first;
1738 const MDNode *N = CI->second;
Eric Christopher6efc0432013-10-19 01:04:47 +00001739 if (!N)
1740 continue;
Eric Christopher3f045002013-10-04 17:08:38 +00001741 DIE *NDie = getDIE(N);
Eric Christopher6efc0432013-10-19 01:04:47 +00001742 if (!NDie)
1743 continue;
Manman Ren87b110a2013-10-11 23:58:05 +00001744 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, NDie);
Devang Pateldbc64af2011-08-15 17:24:54 +00001745 }
1746}
1747
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001748/// constructVariableDIE - Construct a DIE for the given DbgVariable.
Eric Christopher6efc0432013-10-19 01:04:47 +00001749DIE *CompileUnit::constructVariableDIE(DbgVariable *DV, bool isScopeAbstract) {
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001750 StringRef Name = DV->getName();
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001751
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001752 // Define variable debug information entry.
David Blaikie916d49e2013-10-04 23:21:16 +00001753 DIE *VariableDie = new DIE(DV->getTag());
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001754 DbgVariable *AbsVar = DV->getAbstractVariable();
1755 DIE *AbsDIE = AbsVar ? AbsVar->getDIE() : NULL;
Manman Ren742671b2013-05-29 17:16:59 +00001756 if (AbsDIE)
Manman Ren87b110a2013-10-11 23:58:05 +00001757 addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin, AbsDIE);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001758 else {
David Blaikie2883fd42013-08-19 03:34:03 +00001759 if (!Name.empty())
1760 addString(VariableDie, dwarf::DW_AT_name, Name);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001761 addSourceLine(VariableDie, DV->getVariable());
1762 addType(VariableDie, DV->getType());
1763 }
1764
1765 if (DV->isArtificial())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001766 addFlag(VariableDie, dwarf::DW_AT_artificial);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001767
1768 if (isScopeAbstract) {
1769 DV->setDIE(VariableDie);
1770 return VariableDie;
1771 }
1772
1773 // Add variable address.
1774
1775 unsigned Offset = DV->getDotDebugLocOffset();
1776 if (Offset != ~0U) {
Eric Christopherafbe0e22013-06-24 21:34:55 +00001777 addLabel(VariableDie, dwarf::DW_AT_location, dwarf::DW_FORM_data4,
1778 Asm->GetTempSymbol("debug_loc", Offset));
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001779 DV->setDIE(VariableDie);
1780 return VariableDie;
1781 }
1782
Eric Christopher8cf5e742011-10-03 15:49:20 +00001783 // Check if variable is described by a DBG_VALUE instruction.
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001784 if (const MachineInstr *DVInsn = DV->getMInsn()) {
David Blaikie6d9dbd52013-06-16 20:34:15 +00001785 assert(DVInsn->getNumOperands() == 3);
1786 if (DVInsn->getOperand(0).isReg()) {
1787 const MachineOperand RegOp = DVInsn->getOperand(0);
Adrian Prantlb2754912013-07-09 21:44:06 +00001788 // If the second operand is an immediate, this is an indirect value.
Adrian Prantl35176402013-07-09 20:28:37 +00001789 if (DVInsn->getOperand(1).isImm()) {
Eric Christopher6efc0432013-10-19 01:04:47 +00001790 MachineLocation Location(RegOp.getReg(),
1791 DVInsn->getOperand(1).getImm());
Eric Christopherf61dbc12013-06-24 21:07:27 +00001792 addVariableAddress(*DV, VariableDie, Location);
David Blaikie6d9dbd52013-06-16 20:34:15 +00001793 } else if (RegOp.getReg())
Eric Christopherf61dbc12013-06-24 21:07:27 +00001794 addVariableAddress(*DV, VariableDie, MachineLocation(RegOp.getReg()));
David Blaikie6d9dbd52013-06-16 20:34:15 +00001795 } else if (DVInsn->getOperand(0).isImm())
Eric Christophere4721492013-07-03 01:08:30 +00001796 addConstantValue(VariableDie, DVInsn->getOperand(0), DV->getType());
David Blaikie6d9dbd52013-06-16 20:34:15 +00001797 else if (DVInsn->getOperand(0).isFPImm())
Eric Christophere4721492013-07-03 01:08:30 +00001798 addConstantFPValue(VariableDie, DVInsn->getOperand(0));
David Blaikie6d9dbd52013-06-16 20:34:15 +00001799 else if (DVInsn->getOperand(0).isCImm())
Eric Christophere4721492013-07-03 01:08:30 +00001800 addConstantValue(VariableDie, DVInsn->getOperand(0).getCImm(),
Manman Renc664d762013-10-05 01:43:03 +00001801 isUnsignedDIType(DD, DV->getType()));
Eric Christophere4721492013-07-03 01:08:30 +00001802
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001803 DV->setDIE(VariableDie);
1804 return VariableDie;
1805 } else {
1806 // .. else use frame index.
1807 int FI = DV->getFrameIndex();
1808 if (FI != ~0) {
1809 unsigned FrameReg = 0;
1810 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
Eric Christopher6efc0432013-10-19 01:04:47 +00001811 int Offset = TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001812 MachineLocation Location(FrameReg, Offset);
Eric Christopherf61dbc12013-06-24 21:07:27 +00001813 addVariableAddress(*DV, VariableDie, Location);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001814 }
1815 }
1816
1817 DV->setDIE(VariableDie);
1818 return VariableDie;
1819}
1820
Manman Rena1d25b62013-10-23 23:00:44 +00001821/// constructMemberDIE - Construct member DIE from DIDerivedType.
1822void CompileUnit::constructMemberDIE(DIE &Buffer, DIDerivedType DT) {
Manman Ren1a5e7872013-10-29 00:53:03 +00001823 DIE *MemberDie = createAndAddDIE(DT.getTag(), Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +00001824 StringRef Name = DT.getName();
1825 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001826 addString(MemberDie, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001827
Manman Ren017ceda2013-10-08 18:42:58 +00001828 addType(MemberDie, resolve(DT.getTypeDerivedFrom()));
Devang Patel161b2f42011-04-12 23:21:44 +00001829
1830 addSourceLine(MemberDie, DT);
1831
1832 DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
David Blaikie770530b2013-10-21 17:28:37 +00001833 addUInt(MemLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
Devang Patel161b2f42011-04-12 23:21:44 +00001834
Devang Patel161b2f42011-04-12 23:21:44 +00001835
Eric Christopher6efc0432013-10-19 01:04:47 +00001836 if (DT.getTag() == dwarf::DW_TAG_inheritance && DT.isVirtual()) {
Devang Patel161b2f42011-04-12 23:21:44 +00001837
1838 // For C++, virtual base classes are not at fixed offset. Use following
1839 // expression to extract appropriate offset from vtable.
1840 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1841
1842 DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
David Blaikie770530b2013-10-21 17:28:37 +00001843 addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1844 addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1845 addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1846 addUInt(VBaseLocationDie, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1847 addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1848 addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1849 addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
Devang Patel161b2f42011-04-12 23:21:44 +00001850
David Blaikie770530b2013-10-21 17:28:37 +00001851 addBlock(MemberDie, dwarf::DW_AT_data_member_location, VBaseLocationDie);
David Blaikie9b933922013-11-01 00:25:45 +00001852 } else {
1853 uint64_t Size = DT.getSizeInBits();
1854 uint64_t FieldSize = getBaseTypeSize(DD, DT);
1855 uint64_t OffsetInBytes;
1856
1857 if (Size != FieldSize) {
1858 // Handle bitfield.
1859 addUInt(MemberDie, dwarf::DW_AT_byte_size, None,
1860 getBaseTypeSize(DD, DT) >> 3);
1861 addUInt(MemberDie, dwarf::DW_AT_bit_size, None, DT.getSizeInBits());
1862
1863 uint64_t Offset = DT.getOffsetInBits();
1864 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1865 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1866 uint64_t FieldOffset = (HiMark - FieldSize);
1867 Offset -= FieldOffset;
1868
1869 // Maybe we need to work from the other end.
1870 if (Asm->getDataLayout().isLittleEndian())
1871 Offset = FieldSize - (Offset + Size);
1872 addUInt(MemberDie, dwarf::DW_AT_bit_offset, None, Offset);
1873
1874 // Here WD_AT_data_member_location points to the anonymous
1875 // field that includes this bit field.
1876 OffsetInBytes = FieldOffset >> 3;
1877 } else
1878 // This is not a bitfield.
1879 OffsetInBytes = DT.getOffsetInBits() >> 3;
1880 addUInt(MemberDie, dwarf::DW_AT_data_member_location, None,
1881 OffsetInBytes);
1882 }
Devang Patel161b2f42011-04-12 23:21:44 +00001883
1884 if (DT.isProtected())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001885 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001886 dwarf::DW_ACCESS_protected);
1887 else if (DT.isPrivate())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001888 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001889 dwarf::DW_ACCESS_private);
1890 // Otherwise C++ member and base classes are considered public.
Eric Christopher8b4310b2012-11-21 00:34:38 +00001891 else
Nick Lewycky13aaca52011-12-13 05:09:11 +00001892 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001893 dwarf::DW_ACCESS_public);
1894 if (DT.isVirtual())
Nick Lewycky798313d2011-12-14 00:56:07 +00001895 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001896 dwarf::DW_VIRTUALITY_virtual);
Devang Patele9db5e22011-04-16 00:11:51 +00001897
1898 // Objective-C properties.
Devang Patel6588abf2012-02-06 17:49:43 +00001899 if (MDNode *PNode = DT.getObjCProperty())
1900 if (DIEEntry *PropertyDie = getDIEEntry(PNode))
Eric Christopher8b4310b2012-11-21 00:34:38 +00001901 MemberDie->addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4,
Devang Patel6588abf2012-02-06 17:49:43 +00001902 PropertyDie);
1903
David Blaikie01bc2b32012-12-13 22:43:07 +00001904 if (DT.isArtificial())
1905 addFlag(MemberDie, dwarf::DW_AT_artificial);
Devang Patel161b2f42011-04-12 23:21:44 +00001906}
Eric Christopher6b6061f2013-01-16 01:22:23 +00001907
Manman Ren655a10d2013-10-14 20:33:57 +00001908/// getOrCreateStaticMemberDIE - Create new DIE for C++ static member.
1909DIE *CompileUnit::getOrCreateStaticMemberDIE(const DIDerivedType DT) {
Eric Christopher6b6061f2013-01-16 01:22:23 +00001910 if (!DT.Verify())
1911 return NULL;
1912
Manman Ren655a10d2013-10-14 20:33:57 +00001913 // Construct the context before querying for the existence of the DIE in case
1914 // such construction creates the DIE.
1915 DIE *ContextDIE = getOrCreateContextDIE(resolve(DT.getContext()));
1916 assert(ContextDIE && "Static member should belong to a non-CU context.");
1917
1918 DIE *StaticMemberDIE = getDIE(DT);
1919 if (StaticMemberDIE)
1920 return StaticMemberDIE;
1921
Manman Ren1a5e7872013-10-29 00:53:03 +00001922 StaticMemberDIE = createAndAddDIE(DT.getTag(), *ContextDIE, DT);
Manman Ren655a10d2013-10-14 20:33:57 +00001923
Manman Ren017ceda2013-10-08 18:42:58 +00001924 DIType Ty = resolve(DT.getTypeDerivedFrom());
Eric Christopher6b6061f2013-01-16 01:22:23 +00001925
1926 addString(StaticMemberDIE, dwarf::DW_AT_name, DT.getName());
1927 addType(StaticMemberDIE, Ty);
1928 addSourceLine(StaticMemberDIE, DT);
1929 addFlag(StaticMemberDIE, dwarf::DW_AT_external);
1930 addFlag(StaticMemberDIE, dwarf::DW_AT_declaration);
1931
1932 // FIXME: We could omit private if the parent is a class_type, and
1933 // public if the parent is something else.
1934 if (DT.isProtected())
1935 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1936 dwarf::DW_ACCESS_protected);
1937 else if (DT.isPrivate())
1938 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1939 dwarf::DW_ACCESS_private);
1940 else
1941 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1942 dwarf::DW_ACCESS_public);
1943
1944 if (const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(DT.getConstant()))
Manman Renc664d762013-10-05 01:43:03 +00001945 addConstantValue(StaticMemberDIE, CI, isUnsignedDIType(DD, Ty));
David Blaikie14268412013-01-20 01:18:01 +00001946 if (const ConstantFP *CFP = dyn_cast_or_null<ConstantFP>(DT.getConstant()))
1947 addConstantFPValue(StaticMemberDIE, CFP);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001948
Eric Christopher6b6061f2013-01-16 01:22:23 +00001949 return StaticMemberDIE;
1950}
David Blaikie1d361132013-10-30 20:42:41 +00001951
1952void CompileUnit::emitHeader(const MCSection *ASection,
1953 const MCSymbol *ASectionSym) {
1954 Asm->OutStreamer.AddComment("DWARF version number");
1955 Asm->EmitInt16(DD->getDwarfVersion());
1956 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
1957 Asm->EmitSectionOffset(Asm->GetTempSymbol(ASection->getLabelBeginName()),
1958 ASectionSym);
1959 Asm->OutStreamer.AddComment("Address Size (in bytes)");
1960 Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
1961}