blob: c9941086c25f8091e5d96765bf6f8f085cea9103 [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"
Eric Christopherd61c34b2011-11-11 03:16:32 +000025#include "llvm/Support/Debug.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000026#include "llvm/Support/ErrorHandling.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)
38 : 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
Eric Christopher873cf0a2012-08-24 01:14:27 +0000101/// addFlag - Add a flag that is true.
Eric Christopher31667622013-08-08 01:41:00 +0000102void CompileUnit::addFlag(DIE *Die, uint16_t Attribute) {
Michael Gottesmandc42d032013-09-04 04:39:38 +0000103 if (DD->getDwarfVersion() >= 4)
Eric Christopher873cf0a2012-08-24 01:14:27 +0000104 Die->addValue(Attribute, dwarf::DW_FORM_flag_present,
105 DIEIntegerOne);
106 else
107 addUInt(Die, Attribute, dwarf::DW_FORM_flag, 1);
108}
109
Devang Patel161b2f42011-04-12 23:21:44 +0000110/// addUInt - Add an unsigned integer attribute data and value.
111///
Eric Christopher31667622013-08-08 01:41:00 +0000112void CompileUnit::addUInt(DIE *Die, uint16_t Attribute,
113 uint16_t Form, uint64_t Integer) {
Devang Patel161b2f42011-04-12 23:21:44 +0000114 if (!Form) Form = DIEInteger::BestForm(false, Integer);
115 DIEValue *Value = Integer == 1 ?
116 DIEIntegerOne : new (DIEValueAllocator) DIEInteger(Integer);
117 Die->addValue(Attribute, Form, Value);
118}
119
120/// addSInt - Add an signed integer attribute data and value.
121///
Eric Christopher31667622013-08-08 01:41:00 +0000122void CompileUnit::addSInt(DIE *Die, uint16_t Attribute,
123 uint16_t Form, int64_t Integer) {
Devang Patel161b2f42011-04-12 23:21:44 +0000124 if (!Form) Form = DIEInteger::BestForm(true, Integer);
125 DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
126 Die->addValue(Attribute, Form, Value);
127}
128
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000129/// addString - Add a string attribute data and value. We always emit a
130/// reference to the string pool instead of immediate strings so that DIEs have
Eric Christopher3cc42202013-01-07 19:32:45 +0000131/// more predictable sizes. In the case of split dwarf we emit an index
132/// into another table which gets us the static offset into the string
133/// table.
Eric Christopher31667622013-08-08 01:41:00 +0000134void CompileUnit::addString(DIE *Die, uint16_t Attribute, StringRef String) {
Eric Christopher3dee5752013-07-26 17:02:41 +0000135 DIEValue *Value;
Eric Christopher31667622013-08-08 01:41:00 +0000136 uint16_t Form;
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000137 if (!DD->useSplitDwarf()) {
138 MCSymbol *Symb = DU->getStringPoolEntry(String);
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000139 if (Asm->needsRelocationsForDwarfStringPool())
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000140 Value = new (DIEValueAllocator) DIELabel(Symb);
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000141 else {
142 MCSymbol *StringPool = DU->getStringPoolSym();
143 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
144 }
Eric Christopher3dee5752013-07-26 17:02:41 +0000145 Form = dwarf::DW_FORM_strp;
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000146 } else {
147 unsigned idx = DU->getStringPoolIndex(String);
Eric Christopher3dee5752013-07-26 17:02:41 +0000148 Value = new (DIEValueAllocator) DIEInteger(idx);
149 Form = dwarf::DW_FORM_GNU_str_index;
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000150 }
Eric Christopher3dee5752013-07-26 17:02:41 +0000151 DIEValue *Str = new (DIEValueAllocator) DIEString(Value, String);
152 Die->addValue(Attribute, Form, Str);
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000153}
154
155/// addLocalString - Add a string attribute data and value. This is guaranteed
156/// to be in the local string pool instead of indirected.
Eric Christopher31667622013-08-08 01:41:00 +0000157void CompileUnit::addLocalString(DIE *Die, uint16_t Attribute,
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000158 StringRef String) {
Eric Christopher2e5d8702012-12-20 21:58:36 +0000159 MCSymbol *Symb = DU->getStringPoolEntry(String);
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000160 DIEValue *Value;
161 if (Asm->needsRelocationsForDwarfStringPool())
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000162 Value = new (DIEValueAllocator) DIELabel(Symb);
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000163 else {
Eric Christopher2e5d8702012-12-20 21:58:36 +0000164 MCSymbol *StringPool = DU->getStringPoolSym();
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000165 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
Nick Lewycky390c40d2011-10-27 06:44:11 +0000166 }
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000167 Die->addValue(Attribute, dwarf::DW_FORM_strp, Value);
Devang Patel161b2f42011-04-12 23:21:44 +0000168}
169
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000170/// addExpr - Add a Dwarf expression attribute data and value.
Devang Patel161b2f42011-04-12 23:21:44 +0000171///
Eric Christopher31667622013-08-08 01:41:00 +0000172void CompileUnit::addExpr(DIE *Die, uint16_t Attribute, uint16_t Form,
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000173 const MCExpr *Expr) {
174 DIEValue *Value = new (DIEValueAllocator) DIEExpr(Expr);
Devang Patel161b2f42011-04-12 23:21:44 +0000175 Die->addValue(Attribute, Form, Value);
176}
177
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000178/// addLabel - Add a Dwarf label attribute data and value.
179///
Eric Christopher31667622013-08-08 01:41:00 +0000180void CompileUnit::addLabel(DIE *Die, uint16_t Attribute, uint16_t Form,
David Blaikie95e72c92013-06-28 20:05:04 +0000181 const MCSymbol *Label) {
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000182 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
183 Die->addValue(Attribute, Form, Value);
Richard Mitton5cc319a2013-09-19 23:21:01 +0000184
185 SymbolCU Entry;
186 Entry.CU = this;
187 Entry.Sym = Label;
188
189 DD->addLabel(Entry);
David Blaikie95e72c92013-06-28 20:05:04 +0000190}
191
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000192/// addLabelAddress - Add a dwarf label attribute data and value using
193/// DW_FORM_addr or DW_FORM_GNU_addr_index.
194///
Eric Christopher31667622013-08-08 01:41:00 +0000195void CompileUnit::addLabelAddress(DIE *Die, uint16_t Attribute,
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000196 MCSymbol *Label) {
Richard Mitton5cc319a2013-09-19 23:21:01 +0000197 if (Label) {
198 SymbolCU Entry;
199 Entry.CU = this;
200 Entry.Sym = Label;
201
202 DD->addLabel(Entry);
203 }
204
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000205 if (!DD->useSplitDwarf()) {
206 if (Label != NULL) {
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000207 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000208 Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
209 } else {
210 DIEValue *Value = new (DIEValueAllocator) DIEInteger(0);
211 Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
212 }
213 } else {
214 unsigned idx = DU->getAddrPoolIndex(Label);
215 DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx);
216 Die->addValue(Attribute, dwarf::DW_FORM_GNU_addr_index, Value);
217 }
218}
219
Eric Christopher0969ddf2013-01-18 22:11:33 +0000220/// addOpAddress - Add a dwarf op address data and value using the
221/// form given and an op of either DW_FORM_addr or DW_FORM_GNU_addr_index.
222///
David Blaikie95e72c92013-06-28 20:05:04 +0000223void CompileUnit::addOpAddress(DIE *Die, const MCSymbol *Sym) {
Eric Christopher0969ddf2013-01-18 22:11:33 +0000224 if (!DD->useSplitDwarf()) {
225 addUInt(Die, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
226 addLabel(Die, 0, dwarf::DW_FORM_udata, Sym);
227 } else {
Eric Christopher0969ddf2013-01-18 22:11:33 +0000228 addUInt(Die, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_addr_index);
David Blaikie8fed05e2013-07-01 23:55:52 +0000229 addUInt(Die, 0, dwarf::DW_FORM_GNU_addr_index, DU->getAddrPoolIndex(Sym));
Eric Christopher0969ddf2013-01-18 22:11:33 +0000230 }
231}
232
Devang Patel161b2f42011-04-12 23:21:44 +0000233/// addDelta - Add a label delta attribute data and value.
234///
Eric Christopher31667622013-08-08 01:41:00 +0000235void CompileUnit::addDelta(DIE *Die, uint16_t Attribute, uint16_t Form,
Devang Patel161b2f42011-04-12 23:21:44 +0000236 const MCSymbol *Hi, const MCSymbol *Lo) {
237 DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
238 Die->addValue(Attribute, Form, Value);
239}
240
241/// addDIEEntry - Add a DIE attribute data and value.
242///
Eric Christopher31667622013-08-08 01:41:00 +0000243void CompileUnit::addDIEEntry(DIE *Die, uint16_t Attribute, uint16_t Form,
Devang Patel161b2f42011-04-12 23:21:44 +0000244 DIE *Entry) {
Manman Ren620f4362013-10-01 19:52:23 +0000245 DD->addDIEEntry(Die, Attribute, Form, createDIEEntry(Entry));
Devang Patel161b2f42011-04-12 23:21:44 +0000246}
247
Devang Patel161b2f42011-04-12 23:21:44 +0000248/// addBlock - Add block data.
249///
Eric Christopher31667622013-08-08 01:41:00 +0000250void CompileUnit::addBlock(DIE *Die, uint16_t Attribute, uint16_t Form,
Devang Patel161b2f42011-04-12 23:21:44 +0000251 DIEBlock *Block) {
252 Block->ComputeSize(Asm);
253 DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
254 Die->addValue(Attribute, Block->BestForm(), Block);
255}
256
257/// addSourceLine - Add location information to specified debug information
258/// entry.
259void CompileUnit::addSourceLine(DIE *Die, DIVariable V) {
260 // Verify variable.
Manman Rend03d2b22013-07-08 18:33:29 +0000261 if (!V.isVariable())
Devang Patel161b2f42011-04-12 23:21:44 +0000262 return;
Eric Christopher8b4310b2012-11-21 00:34:38 +0000263
Devang Patel161b2f42011-04-12 23:21:44 +0000264 unsigned Line = V.getLineNumber();
265 if (Line == 0)
266 return;
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000267 unsigned FileID = DD->getOrCreateSourceID(V.getContext().getFilename(),
Manman Ren3de61b42013-03-07 01:42:00 +0000268 V.getContext().getDirectory(),
269 getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000270 assert(FileID && "Invalid file id");
271 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
272 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
273}
274
275/// addSourceLine - Add location information to specified debug information
276/// entry.
277void CompileUnit::addSourceLine(DIE *Die, DIGlobalVariable G) {
278 // Verify global variable.
Manman Rend03d2b22013-07-08 18:33:29 +0000279 if (!G.isGlobalVariable())
Devang Patel161b2f42011-04-12 23:21:44 +0000280 return;
281
282 unsigned Line = G.getLineNumber();
283 if (Line == 0)
284 return;
Manman Ren3de61b42013-03-07 01:42:00 +0000285 unsigned FileID = DD->getOrCreateSourceID(G.getFilename(), G.getDirectory(),
286 getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000287 assert(FileID && "Invalid file id");
288 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
289 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
290}
291
292/// addSourceLine - Add location information to specified debug information
293/// entry.
294void CompileUnit::addSourceLine(DIE *Die, DISubprogram SP) {
295 // Verify subprogram.
Manman Rend03d2b22013-07-08 18:33:29 +0000296 if (!SP.isSubprogram())
Devang Patel161b2f42011-04-12 23:21:44 +0000297 return;
Eric Christopher2125d5a2012-03-15 23:55:40 +0000298
Devang Patel161b2f42011-04-12 23:21:44 +0000299 // If the line number is 0, don't add it.
Eric Christopher2125d5a2012-03-15 23:55:40 +0000300 unsigned Line = SP.getLineNumber();
301 if (Line == 0)
Devang Patel161b2f42011-04-12 23:21:44 +0000302 return;
303
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000304 unsigned FileID = DD->getOrCreateSourceID(SP.getFilename(),
Manman Ren3de61b42013-03-07 01:42:00 +0000305 SP.getDirectory(), getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000306 assert(FileID && "Invalid file id");
307 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
308 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
309}
310
311/// addSourceLine - Add location information to specified debug information
312/// entry.
313void CompileUnit::addSourceLine(DIE *Die, DIType Ty) {
314 // Verify type.
Manman Rend03d2b22013-07-08 18:33:29 +0000315 if (!Ty.isType())
Devang Patel161b2f42011-04-12 23:21:44 +0000316 return;
317
318 unsigned Line = Ty.getLineNumber();
Eric Christopher2125d5a2012-03-15 23:55:40 +0000319 if (Line == 0)
Devang Patel161b2f42011-04-12 23:21:44 +0000320 return;
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000321 unsigned FileID = DD->getOrCreateSourceID(Ty.getFilename(),
Manman Ren3de61b42013-03-07 01:42:00 +0000322 Ty.getDirectory(), getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000323 assert(FileID && "Invalid file id");
324 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
325 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
326}
327
328/// addSourceLine - Add location information to specified debug information
329/// entry.
Eric Christopherb8ca9882012-03-29 08:42:56 +0000330void CompileUnit::addSourceLine(DIE *Die, DIObjCProperty Ty) {
331 // Verify type.
Manman Rend03d2b22013-07-08 18:33:29 +0000332 if (!Ty.isObjCProperty())
Eric Christopherb8ca9882012-03-29 08:42:56 +0000333 return;
334
335 unsigned Line = Ty.getLineNumber();
336 if (Line == 0)
337 return;
338 DIFile File = Ty.getFile();
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000339 unsigned FileID = DD->getOrCreateSourceID(File.getFilename(),
Manman Ren3de61b42013-03-07 01:42:00 +0000340 File.getDirectory(), getUniqueID());
Eric Christopherb8ca9882012-03-29 08:42:56 +0000341 assert(FileID && "Invalid file id");
342 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
343 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
344}
345
346/// addSourceLine - Add location information to specified debug information
347/// entry.
Devang Patel161b2f42011-04-12 23:21:44 +0000348void CompileUnit::addSourceLine(DIE *Die, DINameSpace NS) {
349 // Verify namespace.
350 if (!NS.Verify())
351 return;
352
353 unsigned Line = NS.getLineNumber();
354 if (Line == 0)
355 return;
356 StringRef FN = NS.getFilename();
357
Manman Ren3de61b42013-03-07 01:42:00 +0000358 unsigned FileID = DD->getOrCreateSourceID(FN, NS.getDirectory(),
359 getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000360 assert(FileID && "Invalid file id");
361 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
362 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
363}
364
Eric Christopher8b4310b2012-11-21 00:34:38 +0000365/// addVariableAddress - Add DW_AT_location attribute for a
Devang Patele1cdf842011-04-27 22:45:24 +0000366/// DbgVariable based on provided MachineLocation.
Eric Christopherf61dbc12013-06-24 21:07:27 +0000367void CompileUnit::addVariableAddress(const DbgVariable &DV, DIE *Die,
Devang Patele1cdf842011-04-27 22:45:24 +0000368 MachineLocation Location) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000369 if (DV.variableHasComplexAddress())
Devang Patel161b2f42011-04-12 23:21:44 +0000370 addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
Eric Christopherf61dbc12013-06-24 21:07:27 +0000371 else if (DV.isBlockByrefVariable())
Devang Patel161b2f42011-04-12 23:21:44 +0000372 addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location);
373 else
David Blaikie4532c282013-06-20 00:25:24 +0000374 addAddress(Die, dwarf::DW_AT_location, Location,
Eric Christopherf61dbc12013-06-24 21:07:27 +0000375 DV.getVariable().isIndirect());
Devang Patel161b2f42011-04-12 23:21:44 +0000376}
377
Devang Patel116da2f2011-04-26 19:06:18 +0000378/// addRegisterOp - Add register operand.
379void CompileUnit::addRegisterOp(DIE *TheDie, unsigned Reg) {
380 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
381 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
382 if (DWReg < 32)
383 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + DWReg);
384 else {
385 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
386 addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
387 }
388}
389
390/// addRegisterOffset - Add register offset.
391void CompileUnit::addRegisterOffset(DIE *TheDie, unsigned Reg,
392 int64_t Offset) {
393 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
394 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
395 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
396 if (Reg == TRI->getFrameRegister(*Asm->MF))
397 // If variable offset is based in frame register then use fbreg.
398 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
399 else if (DWReg < 32)
400 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DWReg);
401 else {
402 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
403 addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
404 }
405 addSInt(TheDie, 0, dwarf::DW_FORM_sdata, Offset);
406}
407
408/// addAddress - Add an address attribute to a die based on the location
409/// provided.
Eric Christopher31667622013-08-08 01:41:00 +0000410void CompileUnit::addAddress(DIE *Die, uint16_t Attribute,
David Blaikie4532c282013-06-20 00:25:24 +0000411 const MachineLocation &Location, bool Indirect) {
Devang Patel116da2f2011-04-26 19:06:18 +0000412 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
413
David Blaikie4532c282013-06-20 00:25:24 +0000414 if (Location.isReg() && !Indirect)
Devang Patel116da2f2011-04-26 19:06:18 +0000415 addRegisterOp(Block, Location.getReg());
David Blaikie4532c282013-06-20 00:25:24 +0000416 else {
Devang Patel116da2f2011-04-26 19:06:18 +0000417 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
David Blaikie4532c282013-06-20 00:25:24 +0000418 if (Indirect && !Location.isReg()) {
419 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
420 }
421 }
Devang Patel116da2f2011-04-26 19:06:18 +0000422
423 // Now attach the location information to the DIE.
424 addBlock(Die, Attribute, 0, Block);
425}
426
Devang Patel161b2f42011-04-12 23:21:44 +0000427/// addComplexAddress - Start with the address based on the location provided,
428/// and generate the DWARF information necessary to find the actual variable
429/// given the extra address information encoded in the DIVariable, starting from
430/// the starting location. Add the DWARF information to the die.
431///
Eric Christopherf61dbc12013-06-24 21:07:27 +0000432void CompileUnit::addComplexAddress(const DbgVariable &DV, DIE *Die,
Eric Christopher31667622013-08-08 01:41:00 +0000433 uint16_t Attribute,
Devang Patel161b2f42011-04-12 23:21:44 +0000434 const MachineLocation &Location) {
Devang Patel161b2f42011-04-12 23:21:44 +0000435 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Eric Christopherf61dbc12013-06-24 21:07:27 +0000436 unsigned N = DV.getNumAddrElements();
Devang Patelc26f5442011-04-28 02:22:40 +0000437 unsigned i = 0;
438 if (Location.isReg()) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000439 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
Devang Patelc26f5442011-04-28 02:22:40 +0000440 // If first address element is OpPlus then emit
441 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
Eric Christopherf61dbc12013-06-24 21:07:27 +0000442 addRegisterOffset(Block, Location.getReg(), DV.getAddrElement(1));
Devang Patelc26f5442011-04-28 02:22:40 +0000443 i = 2;
444 } else
445 addRegisterOp(Block, Location.getReg());
446 }
Devang Patel116da2f2011-04-26 19:06:18 +0000447 else
448 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel161b2f42011-04-12 23:21:44 +0000449
Devang Patelc26f5442011-04-28 02:22:40 +0000450 for (;i < N; ++i) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000451 uint64_t Element = DV.getAddrElement(i);
Devang Patel161b2f42011-04-12 23:21:44 +0000452 if (Element == DIBuilder::OpPlus) {
453 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
Eric Christopherf61dbc12013-06-24 21:07:27 +0000454 addUInt(Block, 0, dwarf::DW_FORM_udata, DV.getAddrElement(++i));
Devang Patel161b2f42011-04-12 23:21:44 +0000455 } else if (Element == DIBuilder::OpDeref) {
Eric Christopher50120762012-05-08 18:56:00 +0000456 if (!Location.isReg())
457 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Devang Patel161b2f42011-04-12 23:21:44 +0000458 } else llvm_unreachable("unknown DIBuilder Opcode");
459 }
460
461 // Now attach the location information to the DIE.
462 addBlock(Die, Attribute, 0, Block);
463}
464
465/* Byref variables, in Blocks, are declared by the programmer as "SomeType
466 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
467 gives the variable VarName either the struct, or a pointer to the struct, as
468 its type. This is necessary for various behind-the-scenes things the
469 compiler needs to do with by-reference variables in Blocks.
470
471 However, as far as the original *programmer* is concerned, the variable
472 should still have type 'SomeType', as originally declared.
473
474 The function getBlockByrefType dives into the __Block_byref_x_VarName
475 struct to find the original type of the variable, which is then assigned to
476 the variable's Debug Information Entry as its real type. So far, so good.
477 However now the debugger will expect the variable VarName to have the type
478 SomeType. So we need the location attribute for the variable to be an
479 expression that explains to the debugger how to navigate through the
480 pointers and struct to find the actual variable of type SomeType.
481
482 The following function does just that. We start by getting
483 the "normal" location for the variable. This will be the location
484 of either the struct __Block_byref_x_VarName or the pointer to the
485 struct __Block_byref_x_VarName.
486
487 The struct will look something like:
488
489 struct __Block_byref_x_VarName {
490 ... <various fields>
491 struct __Block_byref_x_VarName *forwarding;
492 ... <various other fields>
493 SomeType VarName;
494 ... <maybe more fields>
495 };
496
497 If we are given the struct directly (as our starting point) we
498 need to tell the debugger to:
499
500 1). Add the offset of the forwarding field.
501
502 2). Follow that pointer to get the real __Block_byref_x_VarName
503 struct to use (the real one may have been copied onto the heap).
504
505 3). Add the offset for the field VarName, to find the actual variable.
506
507 If we started with a pointer to the struct, then we need to
508 dereference that pointer first, before the other steps.
509 Translating this into DWARF ops, we will need to append the following
510 to the current location description for the variable:
511
512 DW_OP_deref -- optional, if we start with a pointer
513 DW_OP_plus_uconst <forward_fld_offset>
514 DW_OP_deref
515 DW_OP_plus_uconst <varName_fld_offset>
516
517 That is what this function does. */
518
519/// addBlockByrefAddress - Start with the address based on the location
520/// provided, and generate the DWARF information necessary to find the
521/// actual Block variable (navigating the Block struct) based on the
522/// starting location. Add the DWARF information to the die. For
523/// more information, read large comment just above here.
524///
Eric Christopherf61dbc12013-06-24 21:07:27 +0000525void CompileUnit::addBlockByrefAddress(const DbgVariable &DV, DIE *Die,
Eric Christopher31667622013-08-08 01:41:00 +0000526 uint16_t Attribute,
Devang Patel161b2f42011-04-12 23:21:44 +0000527 const MachineLocation &Location) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000528 DIType Ty = DV.getType();
Devang Patel161b2f42011-04-12 23:21:44 +0000529 DIType TmpTy = Ty;
Eric Christopher31667622013-08-08 01:41:00 +0000530 uint16_t Tag = Ty.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +0000531 bool isPointer = false;
532
Eric Christopherf61dbc12013-06-24 21:07:27 +0000533 StringRef varName = DV.getName();
Devang Patel161b2f42011-04-12 23:21:44 +0000534
535 if (Tag == dwarf::DW_TAG_pointer_type) {
536 DIDerivedType DTy = DIDerivedType(Ty);
Manman Ren2b530892013-10-01 23:45:54 +0000537 TmpTy = DD->resolve(DTy.getTypeDerivedFrom());
Devang Patel161b2f42011-04-12 23:21:44 +0000538 isPointer = true;
539 }
540
541 DICompositeType blockStruct = DICompositeType(TmpTy);
542
543 // Find the __forwarding field and the variable field in the __Block_byref
544 // struct.
545 DIArray Fields = blockStruct.getTypeArray();
546 DIDescriptor varField = DIDescriptor();
547 DIDescriptor forwardingField = DIDescriptor();
548
549 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
550 DIDescriptor Element = Fields.getElement(i);
551 DIDerivedType DT = DIDerivedType(Element);
552 StringRef fieldName = DT.getName();
553 if (fieldName == "__forwarding")
554 forwardingField = Element;
555 else if (fieldName == varName)
556 varField = Element;
557 }
558
559 // Get the offsets for the forwarding field and the variable field.
560 unsigned forwardingFieldOffset =
561 DIDerivedType(forwardingField).getOffsetInBits() >> 3;
562 unsigned varFieldOffset =
563 DIDerivedType(varField).getOffsetInBits() >> 3;
564
565 // Decode the original location, and use that as the start of the byref
566 // variable's location.
Devang Patel161b2f42011-04-12 23:21:44 +0000567 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
568
Eric Christophercaba2632012-07-04 02:02:18 +0000569 if (Location.isReg())
570 addRegisterOp(Block, Location.getReg());
571 else
572 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel161b2f42011-04-12 23:21:44 +0000573
574 // If we started with a pointer to the __Block_byref... struct, then
575 // the first thing we need to do is dereference the pointer (DW_OP_deref).
576 if (isPointer)
577 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
578
579 // Next add the offset for the '__forwarding' field:
580 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
581 // adding the offset if it's 0.
582 if (forwardingFieldOffset > 0) {
583 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
584 addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
585 }
586
587 // Now dereference the __forwarding field to get to the real __Block_byref
588 // struct: DW_OP_deref.
589 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
590
591 // Now that we've got the real __Block_byref... struct, add the offset
592 // for the variable's field to get to the location of the actual variable:
593 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
594 if (varFieldOffset > 0) {
595 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
596 addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
597 }
598
599 // Now attach the location information to the DIE.
600 addBlock(Die, Attribute, 0, Block);
601}
602
Devang Patel4ec14b02011-07-20 21:57:04 +0000603/// isTypeSigned - Return true if the type is signed.
Manman Ren2b530892013-10-01 23:45:54 +0000604static bool isTypeSigned(DwarfDebug *DD, DIType Ty, int *SizeInBits) {
Devang Patel4ec14b02011-07-20 21:57:04 +0000605 if (Ty.isDerivedType())
Manman Ren2b530892013-10-01 23:45:54 +0000606 return isTypeSigned(DD, DD->resolve(DIDerivedType(Ty).getTypeDerivedFrom()),
607 SizeInBits);
Devang Patel4ec14b02011-07-20 21:57:04 +0000608 if (Ty.isBasicType())
609 if (DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed
610 || DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed_char) {
611 *SizeInBits = Ty.getSizeInBits();
612 return true;
613 }
614 return false;
615}
616
Manman Ren2b530892013-10-01 23:45:54 +0000617/// Return true if type encoding is unsigned.
618static bool isUnsignedDIType(DwarfDebug *DD, DIType Ty) {
619 DIDerivedType DTy(Ty);
620 if (DTy.isDerivedType())
621 return isUnsignedDIType(DD, DD->resolve(DTy.getTypeDerivedFrom()));
622
623 DIBasicType BTy(Ty);
624 if (BTy.isBasicType()) {
625 unsigned Encoding = BTy.getEncoding();
626 if (Encoding == dwarf::DW_ATE_unsigned ||
627 Encoding == dwarf::DW_ATE_unsigned_char ||
628 Encoding == dwarf::DW_ATE_boolean)
629 return true;
630 }
631 return false;
632}
633
634/// If this type is derived from a base type then return base type size.
635static uint64_t getOriginalTypeSize(DwarfDebug *DD, DIDerivedType Ty) {
636 unsigned Tag = Ty.getTag();
637
638 if (Tag != dwarf::DW_TAG_member && Tag != dwarf::DW_TAG_typedef &&
639 Tag != dwarf::DW_TAG_const_type && Tag != dwarf::DW_TAG_volatile_type &&
640 Tag != dwarf::DW_TAG_restrict_type)
641 return Ty.getSizeInBits();
642
643 DIType BaseType = DD->resolve(Ty.getTypeDerivedFrom());
644
645 // If this type is not derived from any type then take conservative approach.
646 if (!BaseType.isValid())
647 return Ty.getSizeInBits();
648
649 // If this is a derived type, go ahead and get the base type, unless it's a
650 // reference then it's just the size of the field. Pointer types have no need
651 // of this since they're a different type of qualification on the type.
652 if (BaseType.getTag() == dwarf::DW_TAG_reference_type ||
653 BaseType.getTag() == dwarf::DW_TAG_rvalue_reference_type)
654 return Ty.getSizeInBits();
655
656 if (BaseType.isDerivedType())
657 return getOriginalTypeSize(DD, DIDerivedType(BaseType));
658
659 return BaseType.getSizeInBits();
660}
661
Devang Patel161b2f42011-04-12 23:21:44 +0000662/// addConstantValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000663void CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO,
Devang Patelb58128e2011-05-27 16:45:18 +0000664 DIType Ty) {
David Blaikie4de9d722013-05-10 21:52:07 +0000665 // FIXME: This is a bit conservative/simple - it emits negative values at
666 // their maximum bit width which is a bit unfortunate (& doesn't prefer
667 // udata/sdata over dataN as suggested by the DWARF spec)
Nick Lewycky746cb672011-10-26 22:55:33 +0000668 assert(MO.isImm() && "Invalid machine operand!");
Devang Patel4ec14b02011-07-20 21:57:04 +0000669 int SizeInBits = -1;
Manman Ren2b530892013-10-01 23:45:54 +0000670 bool SignedConstant = isTypeSigned(DD, Ty, &SizeInBits);
Eric Christopher7b2ee392013-08-27 23:49:04 +0000671 uint16_t Form;
Devang Patel72f0d9c2011-05-27 18:15:52 +0000672
Eric Christopher7b2ee392013-08-27 23:49:04 +0000673 // If we're a signed constant definitely use sdata.
674 if (SignedConstant) {
675 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, MO.getImm());
676 return;
677 }
678
679 // Else use data for now unless it's larger than we can deal with.
680 switch (SizeInBits) {
681 case 8:
682 Form = dwarf::DW_FORM_data1;
683 break;
684 case 16:
685 Form = dwarf::DW_FORM_data2;
686 break;
687 case 32:
688 Form = dwarf::DW_FORM_data4;
689 break;
690 case 64:
691 Form = dwarf::DW_FORM_data8;
692 break;
693 default:
694 Form = dwarf::DW_FORM_udata;
695 addUInt(Die, dwarf::DW_AT_const_value, Form, MO.getImm());
696 return;
697 }
698 addUInt(Die, dwarf::DW_AT_const_value, Form, MO.getImm());
Devang Patel161b2f42011-04-12 23:21:44 +0000699}
700
701/// addConstantFPValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000702void CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
Nick Lewycky390c40d2011-10-27 06:44:11 +0000703 assert (MO.isFPImm() && "Invalid machine operand!");
Devang Patel161b2f42011-04-12 23:21:44 +0000704 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
705 APFloat FPImm = MO.getFPImm()->getValueAPF();
706
707 // Get the raw data form of the floating point.
708 const APInt FltVal = FPImm.bitcastToAPInt();
709 const char *FltPtr = (const char*)FltVal.getRawData();
710
711 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
Micah Villmow3574eca2012-10-08 16:38:25 +0000712 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel161b2f42011-04-12 23:21:44 +0000713 int Incr = (LittleEndian ? 1 : -1);
714 int Start = (LittleEndian ? 0 : NumBytes - 1);
715 int Stop = (LittleEndian ? NumBytes : -1);
716
717 // Output the constant to DWARF one byte at a time.
718 for (; Start != Stop; Start += Incr)
719 addUInt(Block, 0, dwarf::DW_FORM_data1,
720 (unsigned char)0xFF & FltPtr[Start]);
721
722 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
Devang Patel161b2f42011-04-12 23:21:44 +0000723}
724
David Blaikie14268412013-01-20 01:18:01 +0000725/// addConstantFPValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000726void CompileUnit::addConstantFPValue(DIE *Die, const ConstantFP *CFP) {
Eric Christopher7b2ee392013-08-27 23:49:04 +0000727 // Pass this down to addConstantValue as an unsigned bag of bits.
728 addConstantValue(Die, CFP->getValueAPF().bitcastToAPInt(), true);
David Blaikie14268412013-01-20 01:18:01 +0000729}
730
Devang Patel161b2f42011-04-12 23:21:44 +0000731/// addConstantValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000732void CompileUnit::addConstantValue(DIE *Die, const ConstantInt *CI,
Devang Patel161b2f42011-04-12 23:21:44 +0000733 bool Unsigned) {
Eric Christophere4721492013-07-03 01:08:30 +0000734 addConstantValue(Die, CI->getValue(), Unsigned);
David Blaikie14268412013-01-20 01:18:01 +0000735}
736
737// addConstantValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000738void CompileUnit::addConstantValue(DIE *Die, const APInt &Val, bool Unsigned) {
David Blaikie14268412013-01-20 01:18:01 +0000739 unsigned CIBitWidth = Val.getBitWidth();
Devang Pateld6a81362011-05-28 00:39:18 +0000740 if (CIBitWidth <= 64) {
Eric Christopher7b2ee392013-08-27 23:49:04 +0000741 // If we're a signed constant definitely use sdata.
742 if (!Unsigned) {
743 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata,
744 Val.getSExtValue());
745 return;
Devang Pateld6a81362011-05-28 00:39:18 +0000746 }
Eric Christopher7b2ee392013-08-27 23:49:04 +0000747
748 // Else use data for now unless it's larger than we can deal with.
749 uint16_t Form;
750 switch (CIBitWidth) {
751 case 8:
752 Form = dwarf::DW_FORM_data1;
753 break;
754 case 16:
755 Form = dwarf::DW_FORM_data2;
756 break;
757 case 32:
758 Form = dwarf::DW_FORM_data4;
759 break;
760 case 64:
761 Form = dwarf::DW_FORM_data8;
762 break;
763 default:
764 addUInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
765 Val.getZExtValue());
766 return;
767 }
768 addUInt(Die, dwarf::DW_AT_const_value, Form, Val.getZExtValue());
Eric Christophere4721492013-07-03 01:08:30 +0000769 return;
Devang Patel161b2f42011-04-12 23:21:44 +0000770 }
771
772 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
773
774 // Get the raw data form of the large APInt.
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000775 const uint64_t *Ptr64 = Val.getRawData();
Devang Patel161b2f42011-04-12 23:21:44 +0000776
777 int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
Micah Villmow3574eca2012-10-08 16:38:25 +0000778 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel161b2f42011-04-12 23:21:44 +0000779
780 // Output the constant to DWARF one byte at a time.
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000781 for (int i = 0; i < NumBytes; i++) {
782 uint8_t c;
783 if (LittleEndian)
784 c = Ptr64[i / 8] >> (8 * (i & 7));
785 else
786 c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7));
787 addUInt(Block, 0, dwarf::DW_FORM_data1, c);
788 }
Devang Patel161b2f42011-04-12 23:21:44 +0000789
790 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
Devang Patel161b2f42011-04-12 23:21:44 +0000791}
792
Eric Christopher6c3bb942013-04-22 07:47:40 +0000793/// addTemplateParams - Add template parameters into buffer.
Devang Patel161b2f42011-04-12 23:21:44 +0000794void CompileUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
795 // Add template parameters.
796 for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) {
797 DIDescriptor Element = TParams.getElement(i);
798 if (Element.isTemplateTypeParameter())
799 Buffer.addChild(getOrCreateTemplateTypeParameterDIE(
800 DITemplateTypeParameter(Element)));
801 else if (Element.isTemplateValueParameter())
802 Buffer.addChild(getOrCreateTemplateValueParameterDIE(
803 DITemplateValueParameter(Element)));
804 }
Devang Patel161b2f42011-04-12 23:21:44 +0000805}
Nick Lewycky746cb672011-10-26 22:55:33 +0000806
Eric Christopher6b6061f2013-01-16 01:22:23 +0000807/// getOrCreateContextDIE - Get context owner's DIE.
808DIE *CompileUnit::getOrCreateContextDIE(DIDescriptor Context) {
809 if (Context.isType())
810 return getOrCreateTypeDIE(DIType(Context));
811 else if (Context.isNameSpace())
812 return getOrCreateNameSpace(DINameSpace(Context));
813 else if (Context.isSubprogram())
814 return getOrCreateSubprogramDIE(DISubprogram(Context));
Eric Christopher6c3bb942013-04-22 07:47:40 +0000815 else
Eric Christopher6b6061f2013-01-16 01:22:23 +0000816 return getDIE(Context);
817}
818
Devang Patel161b2f42011-04-12 23:21:44 +0000819/// addToContextOwner - Add Die into the list of its context owner's children.
820void CompileUnit::addToContextOwner(DIE *Die, DIDescriptor Context) {
Eric Christopher6b6061f2013-01-16 01:22:23 +0000821 if (DIE *ContextDIE = getOrCreateContextDIE(Context))
Devang Patel161b2f42011-04-12 23:21:44 +0000822 ContextDIE->addChild(Die);
823 else
824 addDie(Die);
825}
826
827/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
828/// given DIType.
Devang Patel94c7ddb2011-08-16 22:09:43 +0000829DIE *CompileUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
830 DIType Ty(TyNode);
Manman Rend03d2b22013-07-08 18:33:29 +0000831 if (!Ty.isType())
Devang Patel94c7ddb2011-08-16 22:09:43 +0000832 return NULL;
Manman Ren620f4362013-10-01 19:52:23 +0000833 DIE *TyDIE = DD->getTypeDIE(Ty);
Devang Patel161b2f42011-04-12 23:21:44 +0000834 if (TyDIE)
835 return TyDIE;
836
837 // Create new type.
838 TyDIE = new DIE(dwarf::DW_TAG_base_type);
Manman Ren620f4362013-10-01 19:52:23 +0000839 DD->insertTypeDIE(Ty, TyDIE);
Devang Patel161b2f42011-04-12 23:21:44 +0000840 if (Ty.isBasicType())
841 constructTypeDIE(*TyDIE, DIBasicType(Ty));
842 else if (Ty.isCompositeType())
843 constructTypeDIE(*TyDIE, DICompositeType(Ty));
844 else {
845 assert(Ty.isDerivedType() && "Unknown kind of DIType");
846 constructTypeDIE(*TyDIE, DIDerivedType(Ty));
847 }
Eric Christopher1b3f9192011-11-10 19:52:58 +0000848 // If this is a named finished type then include it in the list of types
849 // for the accelerator tables.
Eric Christopherc36145f2012-01-06 04:35:23 +0000850 if (!Ty.getName().empty() && !Ty.isForwardDecl()) {
851 bool IsImplementation = 0;
852 if (Ty.isCompositeType()) {
853 DICompositeType CT(Ty);
Eric Christophere0167892012-01-06 23:03:37 +0000854 // A runtime language of 0 actually means C/C++ and that any
855 // non-negative value is some version of Objective-C/C++.
Eric Christopherc36145f2012-01-06 04:35:23 +0000856 IsImplementation = (CT.getRunTimeLang() == 0) ||
Eric Christophere2dc9332012-02-22 08:46:02 +0000857 CT.isObjcClassComplete();
Eric Christopherc36145f2012-01-06 04:35:23 +0000858 }
Eric Christopher577056f2013-09-05 18:20:16 +0000859 unsigned Flags = IsImplementation ? dwarf::DW_FLAG_type_implementation : 0;
Eric Christophere0167892012-01-06 23:03:37 +0000860 addAccelType(Ty.getName(), std::make_pair(TyDIE, Flags));
Eric Christopherc36145f2012-01-06 04:35:23 +0000861 }
Eric Christopher8b4310b2012-11-21 00:34:38 +0000862
Manman Ren2c9905a2013-09-09 19:47:11 +0000863 addToContextOwner(TyDIE, DD->resolve(Ty.getContext()));
Devang Patel161b2f42011-04-12 23:21:44 +0000864 return TyDIE;
865}
866
867/// addType - Add a new type attribute to the specified entity.
Eric Christopher31667622013-08-08 01:41:00 +0000868void CompileUnit::addType(DIE *Entity, DIType Ty, uint16_t Attribute) {
Eric Christopherdc1363f2013-08-08 07:40:37 +0000869 assert(Ty && "Trying to add a type that doesn't exist?");
Devang Patel161b2f42011-04-12 23:21:44 +0000870
871 // Check for pre-existence.
872 DIEEntry *Entry = getDIEEntry(Ty);
873 // If it exists then use the existing value.
874 if (Entry) {
Manman Ren620f4362013-10-01 19:52:23 +0000875 DD->addDIEEntry(Entity, Attribute, dwarf::DW_FORM_ref4, Entry);
Devang Patel161b2f42011-04-12 23:21:44 +0000876 return;
877 }
878
879 // Construct type.
880 DIE *Buffer = getOrCreateTypeDIE(Ty);
881
882 // Set up proxy.
883 Entry = createDIEEntry(Buffer);
884 insertDIEEntry(Ty, Entry);
Manman Ren620f4362013-10-01 19:52:23 +0000885 DD->addDIEEntry(Entity, Attribute, dwarf::DW_FORM_ref4, Entry);
Devang Patele9ae06c2011-05-31 22:56:51 +0000886
887 // If this is a complete composite type then include it in the
888 // list of global types.
Devang Patelc20bdf12011-06-01 00:23:24 +0000889 addGlobalType(Ty);
Devang Patel66658e42011-05-31 23:30:30 +0000890}
891
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000892// Accelerator table mutators - add each name along with its companion
893// DIE to the proper table while ensuring that the name that we're going
894// to reference is in the string table. We do this since the names we
895// add may not only be identical to the names in the DIE.
896void CompileUnit::addAccelName(StringRef Name, DIE *Die) {
897 DU->getStringPoolEntry(Name);
Eric Christopher734334e2013-09-23 22:59:11 +0000898 std::vector<DIE *> &DIEs = AccelNames[Name];
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000899 DIEs.push_back(Die);
900}
901
902void CompileUnit::addAccelObjC(StringRef Name, DIE *Die) {
903 DU->getStringPoolEntry(Name);
Eric Christopher734334e2013-09-23 22:59:11 +0000904 std::vector<DIE *> &DIEs = AccelObjC[Name];
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000905 DIEs.push_back(Die);
906}
907
908void CompileUnit::addAccelNamespace(StringRef Name, DIE *Die) {
909 DU->getStringPoolEntry(Name);
Eric Christopher734334e2013-09-23 22:59:11 +0000910 std::vector<DIE *> &DIEs = AccelNamespace[Name];
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000911 DIEs.push_back(Die);
912}
913
914void CompileUnit::addAccelType(StringRef Name, std::pair<DIE *, unsigned> Die) {
915 DU->getStringPoolEntry(Name);
916 std::vector<std::pair<DIE *, unsigned> > &DIEs = AccelTypes[Name];
917 DIEs.push_back(Die);
918}
919
Eric Christopher50d37a42013-09-20 22:20:55 +0000920/// addGlobalName - Add a new global name to the compile unit.
921void CompileUnit::addGlobalName(StringRef Name, DIE *Die) {
922 GlobalNames[Name] = Die;
923}
924
Devang Patel66658e42011-05-31 23:30:30 +0000925/// addGlobalType - Add a new global type to the compile unit.
926///
Devang Patelc20bdf12011-06-01 00:23:24 +0000927void CompileUnit::addGlobalType(DIType Ty) {
Manman Ren2c9905a2013-09-09 19:47:11 +0000928 DIDescriptor Context = DD->resolve(Ty.getContext());
Eric Christopher5a634742013-09-23 23:15:58 +0000929 if (!Ty.getName().empty() && !Ty.isForwardDecl() &&
Eric Christopher734334e2013-09-23 22:59:11 +0000930 (!Context || Context.isCompileUnit() || Context.isFile() ||
931 Context.isNameSpace()))
Devang Patelc20bdf12011-06-01 00:23:24 +0000932 if (DIEEntry *Entry = getDIEEntry(Ty))
933 GlobalTypes[Ty.getName()] = Entry->getEntry();
Devang Patel161b2f42011-04-12 23:21:44 +0000934}
935
Devang Patel31c5d052011-05-06 16:57:54 +0000936/// addPubTypes - Add type for pubtypes section.
937void CompileUnit::addPubTypes(DISubprogram SP) {
938 DICompositeType SPTy = SP.getType();
Eric Christopher31667622013-08-08 01:41:00 +0000939 uint16_t SPTag = SPTy.getTag();
Devang Patel31c5d052011-05-06 16:57:54 +0000940 if (SPTag != dwarf::DW_TAG_subroutine_type)
941 return;
942
943 DIArray Args = SPTy.getTypeArray();
944 for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
945 DIType ATy(Args.getElement(i));
Manman Rend03d2b22013-07-08 18:33:29 +0000946 if (!ATy.isType())
Devang Patel31c5d052011-05-06 16:57:54 +0000947 continue;
Devang Patelc20bdf12011-06-01 00:23:24 +0000948 addGlobalType(ATy);
Devang Patel31c5d052011-05-06 16:57:54 +0000949 }
950}
951
Devang Patel161b2f42011-04-12 23:21:44 +0000952/// constructTypeDIE - Construct basic type die from DIBasicType.
953void CompileUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
954 // Get core information.
955 StringRef Name = BTy.getName();
Devang Patel161b2f42011-04-12 23:21:44 +0000956 // Add name if not anonymous or intermediate type.
957 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000958 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel734a67c2011-09-14 23:13:28 +0000959
960 if (BTy.getTag() == dwarf::DW_TAG_unspecified_type) {
961 Buffer.setTag(dwarf::DW_TAG_unspecified_type);
Eric Christopher61c91d52013-07-09 23:48:45 +0000962 // An unspecified type only has a name attribute.
Devang Patel734a67c2011-09-14 23:13:28 +0000963 return;
964 }
965
966 Buffer.setTag(dwarf::DW_TAG_base_type);
Nick Lewycky746cb672011-10-26 22:55:33 +0000967 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
Devang Patel30d409c2012-02-07 23:33:58 +0000968 BTy.getEncoding());
Devang Patel734a67c2011-09-14 23:13:28 +0000969
Devang Patel161b2f42011-04-12 23:21:44 +0000970 uint64_t Size = BTy.getSizeInBits() >> 3;
971 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
972}
973
974/// constructTypeDIE - Construct derived type die from DIDerivedType.
975void CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
976 // Get core information.
977 StringRef Name = DTy.getName();
978 uint64_t Size = DTy.getSizeInBits() >> 3;
Eric Christopher31667622013-08-08 01:41:00 +0000979 uint16_t Tag = DTy.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +0000980
981 // FIXME - Workaround for templates.
982 if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
983
984 Buffer.setTag(Tag);
985
986 // Map to main type, void will not have a type.
Manman Ren2b530892013-10-01 23:45:54 +0000987 DIType FromTy = DD->resolve(DTy.getTypeDerivedFrom());
Eric Christopherdc1363f2013-08-08 07:40:37 +0000988 if (FromTy)
989 addType(&Buffer, FromTy);
Devang Patel161b2f42011-04-12 23:21:44 +0000990
991 // Add name if not anonymous or intermediate type.
992 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000993 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +0000994
995 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopher35f225a2012-02-21 22:25:53 +0000996 if (Size && Tag != dwarf::DW_TAG_pointer_type)
Devang Patel161b2f42011-04-12 23:21:44 +0000997 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
998
David Blaikie62fdfb52013-01-07 05:51:15 +0000999 if (Tag == dwarf::DW_TAG_ptr_to_member_type)
1000 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
Manman Renbc660712013-09-05 18:48:31 +00001001 getOrCreateTypeDIE(DD->resolve(DTy.getClassType())));
Devang Patel161b2f42011-04-12 23:21:44 +00001002 // Add source line info if available and TyDesc is not a forward declaration.
1003 if (!DTy.isForwardDecl())
1004 addSourceLine(&Buffer, DTy);
1005}
1006
Eric Christopher3dee5752013-07-26 17:02:41 +00001007/// Return true if the type is appropriately scoped to be contained inside
1008/// its own type unit.
Manman Ren18eb2452013-09-09 19:23:58 +00001009static bool isTypeUnitScoped(DIType Ty, const DwarfDebug *DD) {
Manman Ren2c9905a2013-09-09 19:47:11 +00001010 DIScope Parent = DD->resolve(Ty.getContext());
Eric Christopher3dee5752013-07-26 17:02:41 +00001011 while (Parent) {
1012 // Don't generate a hash for anything scoped inside a function.
1013 if (Parent.isSubprogram())
1014 return false;
Manman Rene72aba92013-09-09 22:35:23 +00001015 Parent = DD->resolve(Parent.getContext());
Eric Christopher3dee5752013-07-26 17:02:41 +00001016 }
1017 return true;
1018}
1019
1020/// Return true if the type should be split out into a type unit.
Manman Ren18eb2452013-09-09 19:23:58 +00001021static bool shouldCreateTypeUnit(DICompositeType CTy, const DwarfDebug *DD) {
Eric Christopher31667622013-08-08 01:41:00 +00001022 uint16_t Tag = CTy.getTag();
Eric Christopher3dee5752013-07-26 17:02:41 +00001023
1024 switch (Tag) {
1025 case dwarf::DW_TAG_structure_type:
1026 case dwarf::DW_TAG_union_type:
1027 case dwarf::DW_TAG_enumeration_type:
1028 case dwarf::DW_TAG_class_type:
1029 // If this is a class, structure, union, or enumeration type
1030 // that is not a declaration, is a type definition, and not scoped
1031 // inside a function then separate this out as a type unit.
Manman Ren18eb2452013-09-09 19:23:58 +00001032 if (CTy.isForwardDecl() || !isTypeUnitScoped(CTy, DD))
Eric Christopher3dee5752013-07-26 17:02:41 +00001033 return 0;
1034 return 1;
1035 default:
1036 return 0;
1037 }
1038}
1039
Devang Patel161b2f42011-04-12 23:21:44 +00001040/// constructTypeDIE - Construct type DIE from DICompositeType.
1041void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
1042 // Get core information.
1043 StringRef Name = CTy.getName();
1044
1045 uint64_t Size = CTy.getSizeInBits() >> 3;
Eric Christopher31667622013-08-08 01:41:00 +00001046 uint16_t Tag = CTy.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +00001047 Buffer.setTag(Tag);
1048
1049 switch (Tag) {
Devang Patel161b2f42011-04-12 23:21:44 +00001050 case dwarf::DW_TAG_array_type:
1051 constructArrayTypeDIE(Buffer, &CTy);
1052 break;
1053 case dwarf::DW_TAG_enumeration_type: {
1054 DIArray Elements = CTy.getTypeArray();
1055
1056 // Add enumerators to enumeration type.
1057 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1058 DIE *ElemDie = NULL;
1059 DIDescriptor Enum(Elements.getElement(i));
1060 if (Enum.isEnumerator()) {
1061 ElemDie = constructEnumTypeDIE(DIEnumerator(Enum));
1062 Buffer.addChild(ElemDie);
1063 }
1064 }
Manman Ren2b530892013-10-01 23:45:54 +00001065 DIType DTy = DD->resolve(CTy.getTypeDerivedFrom());
Eric Christopher37c107b2013-08-08 07:40:42 +00001066 if (DTy) {
Eric Christopherbb0f6ea2012-05-23 00:09:20 +00001067 addType(&Buffer, DTy);
1068 addUInt(&Buffer, dwarf::DW_AT_enum_class, dwarf::DW_FORM_flag, 1);
1069 }
Devang Patel161b2f42011-04-12 23:21:44 +00001070 }
1071 break;
1072 case dwarf::DW_TAG_subroutine_type: {
Eric Christopherdc1363f2013-08-08 07:40:37 +00001073 // Add return type. A void return won't have a type.
Devang Patel161b2f42011-04-12 23:21:44 +00001074 DIArray Elements = CTy.getTypeArray();
1075 DIDescriptor RTy = Elements.getElement(0);
Eric Christopherdc1363f2013-08-08 07:40:37 +00001076 if (RTy)
1077 addType(&Buffer, DIType(RTy));
Devang Patel161b2f42011-04-12 23:21:44 +00001078
1079 bool isPrototyped = true;
1080 // Add arguments.
1081 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
1082 DIDescriptor Ty = Elements.getElement(i);
1083 if (Ty.isUnspecifiedParameter()) {
1084 DIE *Arg = new DIE(dwarf::DW_TAG_unspecified_parameters);
1085 Buffer.addChild(Arg);
1086 isPrototyped = false;
1087 } else {
1088 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1089 addType(Arg, DIType(Ty));
David Blaikieaaf2e632013-01-29 19:35:24 +00001090 if (DIType(Ty).isArtificial())
1091 addFlag(Arg, dwarf::DW_AT_artificial);
Devang Patel161b2f42011-04-12 23:21:44 +00001092 Buffer.addChild(Arg);
1093 }
1094 }
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001095 // Add prototype flag if we're dealing with a C language and the
1096 // function has been prototyped.
Eric Christopher7b878952013-08-26 23:50:38 +00001097 uint16_t Language = DICompileUnit(Node).getLanguage();
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001098 if (isPrototyped &&
Eric Christopher4d069bf2012-05-22 18:45:24 +00001099 (Language == dwarf::DW_LANG_C89 ||
1100 Language == dwarf::DW_LANG_C99 ||
1101 Language == dwarf::DW_LANG_ObjC))
Eric Christopher873cf0a2012-08-24 01:14:27 +00001102 addFlag(&Buffer, dwarf::DW_AT_prototyped);
Devang Patel161b2f42011-04-12 23:21:44 +00001103 }
1104 break;
1105 case dwarf::DW_TAG_structure_type:
1106 case dwarf::DW_TAG_union_type:
1107 case dwarf::DW_TAG_class_type: {
Devang Patel161b2f42011-04-12 23:21:44 +00001108 // Add elements to structure type.
David Blaikiec8b93552013-08-01 20:30:22 +00001109 DIArray Elements = CTy.getTypeArray();
1110 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
Devang Patel161b2f42011-04-12 23:21:44 +00001111 DIDescriptor Element = Elements.getElement(i);
1112 DIE *ElemDie = NULL;
1113 if (Element.isSubprogram()) {
1114 DISubprogram SP(Element);
Devang Pateldbc64af2011-08-15 17:24:54 +00001115 ElemDie = getOrCreateSubprogramDIE(DISubprogram(Element));
Devang Patel161b2f42011-04-12 23:21:44 +00001116 if (SP.isProtected())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001117 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001118 dwarf::DW_ACCESS_protected);
1119 else if (SP.isPrivate())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001120 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001121 dwarf::DW_ACCESS_private);
Eric Christopher8b4310b2012-11-21 00:34:38 +00001122 else
Nick Lewycky13aaca52011-12-13 05:09:11 +00001123 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001124 dwarf::DW_ACCESS_public);
1125 if (SP.isExplicit())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001126 addFlag(ElemDie, dwarf::DW_AT_explicit);
Eric Christopher663e0cf2012-03-28 07:34:31 +00001127 } else if (Element.isDerivedType()) {
Eric Christopher4d069bf2012-05-22 18:45:24 +00001128 DIDerivedType DDTy(Element);
1129 if (DDTy.getTag() == dwarf::DW_TAG_friend) {
1130 ElemDie = new DIE(dwarf::DW_TAG_friend);
Manman Ren2b530892013-10-01 23:45:54 +00001131 addType(ElemDie, DD->resolve(DDTy.getTypeDerivedFrom()),
1132 dwarf::DW_AT_friend);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001133 } else if (DDTy.isStaticMember())
1134 ElemDie = createStaticMemberDIE(DDTy);
1135 else
1136 ElemDie = createMemberDIE(DDTy);
Eric Christopher663e0cf2012-03-28 07:34:31 +00001137 } else if (Element.isObjCProperty()) {
Devang Patel30d409c2012-02-07 23:33:58 +00001138 DIObjCProperty Property(Element);
1139 ElemDie = new DIE(Property.getTag());
1140 StringRef PropertyName = Property.getObjCPropertyName();
1141 addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
Eric Christopher4d069bf2012-05-22 18:45:24 +00001142 addType(ElemDie, Property.getType());
1143 addSourceLine(ElemDie, Property);
Devang Patel30d409c2012-02-07 23:33:58 +00001144 StringRef GetterName = Property.getObjCPropertyGetterName();
1145 if (!GetterName.empty())
1146 addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
1147 StringRef SetterName = Property.getObjCPropertySetterName();
1148 if (!SetterName.empty())
1149 addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
1150 unsigned PropertyAttributes = 0;
Devang Patel9e11eb12012-02-04 01:30:32 +00001151 if (Property.isReadOnlyObjCProperty())
1152 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
1153 if (Property.isReadWriteObjCProperty())
1154 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
1155 if (Property.isAssignObjCProperty())
1156 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
1157 if (Property.isRetainObjCProperty())
1158 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
1159 if (Property.isCopyObjCProperty())
1160 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
1161 if (Property.isNonAtomicObjCProperty())
1162 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
1163 if (PropertyAttributes)
Eric Christopher8b4310b2012-11-21 00:34:38 +00001164 addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, 0,
Devang Patel9e11eb12012-02-04 01:30:32 +00001165 PropertyAttributes);
Devang Patel6588abf2012-02-06 17:49:43 +00001166
Devang Patel30d409c2012-02-07 23:33:58 +00001167 DIEEntry *Entry = getDIEEntry(Element);
1168 if (!Entry) {
1169 Entry = createDIEEntry(ElemDie);
1170 insertDIEEntry(Element, Entry);
1171 }
Devang Patel9e11eb12012-02-04 01:30:32 +00001172 } else
Devang Patel161b2f42011-04-12 23:21:44 +00001173 continue;
1174 Buffer.addChild(ElemDie);
1175 }
1176
1177 if (CTy.isAppleBlockExtension())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001178 addFlag(&Buffer, dwarf::DW_AT_APPLE_block);
Devang Patel161b2f42011-04-12 23:21:44 +00001179
Manman Rene42279c2013-09-06 18:46:00 +00001180 DICompositeType ContainingType(DD->resolve(CTy.getContainingType()));
Devang Patel161b2f42011-04-12 23:21:44 +00001181 if (DIDescriptor(ContainingType).isCompositeType())
1182 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
1183 getOrCreateTypeDIE(DIType(ContainingType)));
Eric Christopher010dbfd2013-07-14 21:46:51 +00001184 else
Manman Ren2c9905a2013-09-09 19:47:11 +00001185 addToContextOwner(&Buffer, DD->resolve(CTy.getContext()));
Devang Patel161b2f42011-04-12 23:21:44 +00001186
Devang Patel201e6cd2011-05-12 21:29:42 +00001187 if (CTy.isObjcClassComplete())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001188 addFlag(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type);
Devang Patelb11f80e2011-05-12 19:06:16 +00001189
Eric Christopher1a8e8862011-12-16 23:42:42 +00001190 // Add template parameters to a class, structure or union types.
1191 // FIXME: The support isn't in the metadata for this yet.
1192 if (Tag == dwarf::DW_TAG_class_type ||
1193 Tag == dwarf::DW_TAG_structure_type ||
1194 Tag == dwarf::DW_TAG_union_type)
Devang Patel161b2f42011-04-12 23:21:44 +00001195 addTemplateParams(Buffer, CTy.getTemplateParams());
1196
1197 break;
1198 }
1199 default:
1200 break;
1201 }
1202
1203 // Add name if not anonymous or intermediate type.
1204 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001205 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001206
Eric Christopher4a5d8392012-05-22 18:45:18 +00001207 if (Tag == dwarf::DW_TAG_enumeration_type ||
1208 Tag == dwarf::DW_TAG_class_type ||
1209 Tag == dwarf::DW_TAG_structure_type ||
1210 Tag == dwarf::DW_TAG_union_type) {
Devang Patel161b2f42011-04-12 23:21:44 +00001211 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopherfc4199b2012-06-01 00:22:32 +00001212 // TODO: Do we care about size for enum forward declarations?
Devang Patel161b2f42011-04-12 23:21:44 +00001213 if (Size)
1214 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
Eric Christopherfc4199b2012-06-01 00:22:32 +00001215 else if (!CTy.isForwardDecl())
Devang Patel161b2f42011-04-12 23:21:44 +00001216 // Add zero size if it is not a forward declaration.
Eric Christopherfc4199b2012-06-01 00:22:32 +00001217 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
1218
1219 // If we're a forward decl, say so.
1220 if (CTy.isForwardDecl())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001221 addFlag(&Buffer, dwarf::DW_AT_declaration);
Devang Patel161b2f42011-04-12 23:21:44 +00001222
1223 // Add source line info if available.
1224 if (!CTy.isForwardDecl())
1225 addSourceLine(&Buffer, CTy);
Eric Christopher89388952012-03-07 00:15:19 +00001226
1227 // No harm in adding the runtime language to the declaration.
1228 unsigned RLang = CTy.getRunTimeLang();
1229 if (RLang)
1230 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
1231 dwarf::DW_FORM_data1, RLang);
Devang Patel161b2f42011-04-12 23:21:44 +00001232 }
Eric Christopher3dee5752013-07-26 17:02:41 +00001233 // If this is a type applicable to a type unit it then add it to the
1234 // list of types we'll compute a hash for later.
Manman Ren18eb2452013-09-09 19:23:58 +00001235 if (shouldCreateTypeUnit(CTy, DD))
Eric Christopher3dee5752013-07-26 17:02:41 +00001236 DD->addTypeUnitType(&Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +00001237}
1238
Eric Christopher8b4310b2012-11-21 00:34:38 +00001239/// getOrCreateTemplateTypeParameterDIE - Find existing DIE or create new DIE
Devang Patel161b2f42011-04-12 23:21:44 +00001240/// for the given DITemplateTypeParameter.
1241DIE *
1242CompileUnit::getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP) {
1243 DIE *ParamDIE = getDIE(TP);
1244 if (ParamDIE)
1245 return ParamDIE;
1246
1247 ParamDIE = new DIE(dwarf::DW_TAG_template_type_parameter);
Eric Christopher76ef79f2013-08-08 08:09:43 +00001248 // Add the type if it exists, it could be void and therefore no type.
1249 if (TP.getType())
1250 addType(ParamDIE, TP.getType());
David Blaikiee88939c2013-06-22 18:59:11 +00001251 if (!TP.getName().empty())
1252 addString(ParamDIE, dwarf::DW_AT_name, TP.getName());
Devang Patel161b2f42011-04-12 23:21:44 +00001253 return ParamDIE;
1254}
1255
Eric Christopher8b4310b2012-11-21 00:34:38 +00001256/// getOrCreateTemplateValueParameterDIE - Find existing DIE or create new DIE
Devang Patel161b2f42011-04-12 23:21:44 +00001257/// for the given DITemplateValueParameter.
1258DIE *
Eric Christopherafdd1f82013-08-08 07:40:31 +00001259CompileUnit::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter VP) {
1260 DIE *ParamDIE = getDIE(VP);
Devang Patel161b2f42011-04-12 23:21:44 +00001261 if (ParamDIE)
1262 return ParamDIE;
1263
Eric Christopherafdd1f82013-08-08 07:40:31 +00001264 ParamDIE = new DIE(VP.getTag());
Eric Christopherdc1363f2013-08-08 07:40:37 +00001265
1266 // Add the type if there is one, template template and template parameter
1267 // packs will not have a type.
1268 if (VP.getType())
1269 addType(ParamDIE, VP.getType());
Eric Christopherafdd1f82013-08-08 07:40:31 +00001270 if (!VP.getName().empty())
1271 addString(ParamDIE, dwarf::DW_AT_name, VP.getName());
1272 if (Value *Val = VP.getValue()) {
David Blaikie4de9d722013-05-10 21:52:07 +00001273 if (ConstantInt *CI = dyn_cast<ConstantInt>(Val))
Manman Ren2b530892013-10-01 23:45:54 +00001274 addConstantValue(ParamDIE, CI, isUnsignedDIType(DD, VP.getType()));
David Blaikie4de9d722013-05-10 21:52:07 +00001275 else if (GlobalValue *GV = dyn_cast<GlobalValue>(Val)) {
1276 // For declaration non-type template parameters (such as global values and
1277 // functions)
1278 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1279 addOpAddress(Block, Asm->Mang->getSymbol(GV));
1280 // Emit DW_OP_stack_value to use the address as the immediate value of the
1281 // parameter, rather than a pointer to it.
1282 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value);
1283 addBlock(ParamDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopherafdd1f82013-08-08 07:40:31 +00001284 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_template_param) {
David Blaikiee88939c2013-06-22 18:59:11 +00001285 assert(isa<MDString>(Val));
1286 addString(ParamDIE, dwarf::DW_AT_GNU_template_name,
1287 cast<MDString>(Val)->getString());
Eric Christopherafdd1f82013-08-08 07:40:31 +00001288 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_parameter_pack) {
David Blaikiee88939c2013-06-22 18:59:11 +00001289 assert(isa<MDNode>(Val));
1290 DIArray A(cast<MDNode>(Val));
1291 addTemplateParams(*ParamDIE, A);
David Blaikie4de9d722013-05-10 21:52:07 +00001292 }
1293 }
1294
Devang Patel161b2f42011-04-12 23:21:44 +00001295 return ParamDIE;
1296}
1297
Devang Patel31c5d052011-05-06 16:57:54 +00001298/// getOrCreateNameSpace - Create a DIE for DINameSpace.
1299DIE *CompileUnit::getOrCreateNameSpace(DINameSpace NS) {
1300 DIE *NDie = getDIE(NS);
1301 if (NDie)
1302 return NDie;
1303 NDie = new DIE(dwarf::DW_TAG_namespace);
1304 insertDIE(NS, NDie);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001305 if (!NS.getName().empty()) {
Nick Lewycky390c40d2011-10-27 06:44:11 +00001306 addString(NDie, dwarf::DW_AT_name, NS.getName());
Eric Christopher09ac3d82011-11-07 09:24:32 +00001307 addAccelNamespace(NS.getName(), NDie);
Eric Christopher3d2c90f2013-09-24 00:17:57 +00001308 addGlobalName(NS.getName(), NDie);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001309 } else
1310 addAccelNamespace("(anonymous namespace)", NDie);
Devang Patel31c5d052011-05-06 16:57:54 +00001311 addSourceLine(NDie, NS);
1312 addToContextOwner(NDie, NS.getContext());
1313 return NDie;
1314}
1315
Devang Pateldbc64af2011-08-15 17:24:54 +00001316/// getOrCreateSubprogramDIE - Create new DIE using SP.
1317DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
Manman Ren620f4362013-10-01 19:52:23 +00001318 DIE *SPDie = DD->getSPDIE(SP);
Devang Pateldbc64af2011-08-15 17:24:54 +00001319 if (SPDie)
1320 return SPDie;
1321
Peter Collingbourne27302f02012-05-27 18:36:44 +00001322 SPDie = new DIE(dwarf::DW_TAG_subprogram);
1323
1324 // DW_TAG_inlined_subroutine may refer to this DIE.
Manman Ren620f4362013-10-01 19:52:23 +00001325 DD->insertSPDIE(SP, SPDie);
Peter Collingbourne27302f02012-05-27 18:36:44 +00001326
Rafael Espindola01b55b42011-11-10 22:34:29 +00001327 DISubprogram SPDecl = SP.getFunctionDeclaration();
1328 DIE *DeclDie = NULL;
1329 if (SPDecl.isSubprogram()) {
1330 DeclDie = getOrCreateSubprogramDIE(SPDecl);
1331 }
1332
Devang Pateldbc64af2011-08-15 17:24:54 +00001333 // Add to context owner.
1334 addToContextOwner(SPDie, SP.getContext());
1335
1336 // Add function template parameters.
1337 addTemplateParams(*SPDie, SP.getTemplateParams());
1338
Devang Pateldbc64af2011-08-15 17:24:54 +00001339 // If this DIE is going to refer declaration info using AT_specification
Eric Christopherc4968752013-05-09 00:42:33 +00001340 // then there is no need to add other attributes.
Rafael Espindola01b55b42011-11-10 22:34:29 +00001341 if (DeclDie) {
1342 // Refer function declaration directly.
1343 addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
1344 DeclDie);
1345
Devang Pateldbc64af2011-08-15 17:24:54 +00001346 return SPDie;
Rafael Espindola01b55b42011-11-10 22:34:29 +00001347 }
Devang Pateldbc64af2011-08-15 17:24:54 +00001348
Eric Christophercbbd5b12012-08-23 22:52:55 +00001349 // Add the linkage name if we have one.
Michael Gottesmandc42d032013-09-04 04:39:38 +00001350 StringRef LinkageName = SP.getLinkageName();
1351 if (!LinkageName.empty())
Eric Christophercbbd5b12012-08-23 22:52:55 +00001352 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c2b4be2013-06-01 17:51:14 +00001353 GlobalValue::getRealLinkageName(LinkageName));
Eric Christophercbbd5b12012-08-23 22:52:55 +00001354
Devang Pateldbc64af2011-08-15 17:24:54 +00001355 // Constructors and operators for anonymous aggregates do not have names.
1356 if (!SP.getName().empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001357 addString(SPDie, dwarf::DW_AT_name, SP.getName());
Devang Pateldbc64af2011-08-15 17:24:54 +00001358
1359 addSourceLine(SPDie, SP);
1360
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001361 // Add the prototype if we have a prototype and we have a C like
1362 // language.
Eric Christopher7b878952013-08-26 23:50:38 +00001363 uint16_t Language = DICompileUnit(Node).getLanguage();
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001364 if (SP.isPrototyped() &&
1365 (Language == dwarf::DW_LANG_C89 ||
1366 Language == dwarf::DW_LANG_C99 ||
1367 Language == dwarf::DW_LANG_ObjC))
Eric Christopher873cf0a2012-08-24 01:14:27 +00001368 addFlag(SPDie, dwarf::DW_AT_prototyped);
Devang Pateldbc64af2011-08-15 17:24:54 +00001369
Eric Christopherdc1363f2013-08-08 07:40:37 +00001370 // Add Return Type. A void return type will not have a type.
Devang Pateldbc64af2011-08-15 17:24:54 +00001371 DICompositeType SPTy = SP.getType();
David Blaikie3d331842013-05-22 23:22:18 +00001372 assert(SPTy.getTag() == dwarf::DW_TAG_subroutine_type &&
1373 "the type of a subprogram should be a subroutine");
Devang Pateldbc64af2011-08-15 17:24:54 +00001374
David Blaikie3d331842013-05-22 23:22:18 +00001375 DIArray Args = SPTy.getTypeArray();
Eric Christopherdc1363f2013-08-08 07:40:37 +00001376 if (Args.getElement(0))
1377 addType(SPDie, DIType(Args.getElement(0)));
Devang Pateldbc64af2011-08-15 17:24:54 +00001378
1379 unsigned VK = SP.getVirtuality();
1380 if (VK) {
Nick Lewycky798313d2011-12-14 00:56:07 +00001381 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
Devang Pateldbc64af2011-08-15 17:24:54 +00001382 DIEBlock *Block = getDIEBlock();
1383 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1384 addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex());
1385 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
1386 ContainingTypeMap.insert(std::make_pair(SPDie,
Manman Ren0e85f6e2013-09-07 00:04:05 +00001387 DD->resolve(SP.getContainingType())));
Devang Pateldbc64af2011-08-15 17:24:54 +00001388 }
1389
1390 if (!SP.isDefinition()) {
Eric Christopher873cf0a2012-08-24 01:14:27 +00001391 addFlag(SPDie, dwarf::DW_AT_declaration);
Eric Christopher8b4310b2012-11-21 00:34:38 +00001392
Devang Pateldbc64af2011-08-15 17:24:54 +00001393 // Add arguments. Do not add arguments for subprogram definition. They will
1394 // be handled while processing variables.
David Blaikie3d331842013-05-22 23:22:18 +00001395 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1396 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1397 DIType ATy = DIType(Args.getElement(i));
1398 addType(Arg, ATy);
1399 if (ATy.isArtificial())
1400 addFlag(Arg, dwarf::DW_AT_artificial);
1401 SPDie->addChild(Arg);
1402 }
Devang Pateldbc64af2011-08-15 17:24:54 +00001403 }
1404
1405 if (SP.isArtificial())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001406 addFlag(SPDie, dwarf::DW_AT_artificial);
Devang Pateldbc64af2011-08-15 17:24:54 +00001407
1408 if (!SP.isLocalToUnit())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001409 addFlag(SPDie, dwarf::DW_AT_external);
Devang Pateldbc64af2011-08-15 17:24:54 +00001410
1411 if (SP.isOptimized())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001412 addFlag(SPDie, dwarf::DW_AT_APPLE_optimized);
Devang Pateldbc64af2011-08-15 17:24:54 +00001413
1414 if (unsigned isa = Asm->getISAEncoding()) {
1415 addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1416 }
1417
1418 return SPDie;
1419}
1420
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001421// Return const expression if value is a GEP to access merged global
1422// constant. e.g.
1423// i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
1424static const ConstantExpr *getMergedGlobalExpr(const Value *V) {
1425 const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
1426 if (!CE || CE->getNumOperands() != 3 ||
1427 CE->getOpcode() != Instruction::GetElementPtr)
1428 return NULL;
1429
1430 // First operand points to a global struct.
1431 Value *Ptr = CE->getOperand(0);
1432 if (!isa<GlobalValue>(Ptr) ||
1433 !isa<StructType>(cast<PointerType>(Ptr->getType())->getElementType()))
1434 return NULL;
1435
1436 // Second operand is zero.
1437 const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
1438 if (!CI || !CI->isZero())
1439 return NULL;
1440
1441 // Third operand is offset.
1442 if (!isa<ConstantInt>(CE->getOperand(2)))
1443 return NULL;
1444
1445 return CE;
1446}
1447
1448/// createGlobalVariableDIE - create global variable DIE.
1449void CompileUnit::createGlobalVariableDIE(const MDNode *N) {
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001450 // Check for pre-existence.
Devang Patel49e2f032011-08-18 22:21:50 +00001451 if (getDIE(N))
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001452 return;
1453
Devang Patel49e2f032011-08-18 22:21:50 +00001454 DIGlobalVariable GV(N);
Manman Rend03d2b22013-07-08 18:33:29 +00001455 if (!GV.isGlobalVariable())
Devang Patel28bea082011-08-18 23:17:55 +00001456 return;
1457
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001458 DIDescriptor GVContext = GV.getContext();
Eric Christopher6b6061f2013-01-16 01:22:23 +00001459 DIType GTy = GV.getType();
1460
1461 // If this is a static data member definition, some attributes belong
1462 // to the declaration DIE.
1463 DIE *VariableDIE = NULL;
Manman Ren945e8282013-02-01 23:54:37 +00001464 bool IsStaticMember = false;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001465 DIDerivedType SDMDecl = GV.getStaticDataMemberDeclaration();
1466 if (SDMDecl.Verify()) {
1467 assert(SDMDecl.isStaticMember() && "Expected static member decl");
1468 // We need the declaration DIE that is in the static member's class.
1469 // But that class might not exist in the DWARF yet.
1470 // Creating the class will create the static member decl DIE.
Manman Ren2c9905a2013-09-09 19:47:11 +00001471 getOrCreateContextDIE(DD->resolve(SDMDecl.getContext()));
Manman Ren620f4362013-10-01 19:52:23 +00001472 VariableDIE = DD->getStaticMemberDIE(SDMDecl);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001473 assert(VariableDIE && "Static member decl has no context?");
Manman Ren945e8282013-02-01 23:54:37 +00001474 IsStaticMember = true;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001475 }
1476
1477 // If this is not a static data member definition, create the variable
1478 // DIE and add the initial set of attributes to it.
1479 if (!VariableDIE) {
1480 VariableDIE = new DIE(GV.getTag());
1481 // Add to map.
1482 insertDIE(N, VariableDIE);
1483
1484 // Add name and type.
1485 addString(VariableDIE, dwarf::DW_AT_name, GV.getDisplayName());
1486 addType(VariableDIE, GTy);
1487
1488 // Add scoping info.
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00001489 if (!GV.isLocalToUnit()) {
Eric Christopher6b6061f2013-01-16 01:22:23 +00001490 addFlag(VariableDIE, dwarf::DW_AT_external);
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00001491 addGlobalName(GV.getName(), VariableDIE);
1492 }
Eric Christopher6b6061f2013-01-16 01:22:23 +00001493
1494 // Add line number info.
1495 addSourceLine(VariableDIE, GV);
1496 // Add to context owner.
1497 addToContextOwner(VariableDIE, GVContext);
1498 }
1499
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001500 // Add location.
Eric Christopher09ac3d82011-11-07 09:24:32 +00001501 bool addToAccelTable = false;
Eric Christopherd61c34b2011-11-11 03:16:32 +00001502 DIE *VariableSpecDIE = NULL;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001503 bool isGlobalVariable = GV.getGlobal() != NULL;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001504 if (isGlobalVariable) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001505 addToAccelTable = true;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001506 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
David Blaikie59eaa382013-06-28 20:05:11 +00001507 const MCSymbol *Sym = Asm->Mang->getSymbol(GV.getGlobal());
1508 if (GV.getGlobal()->isThreadLocal()) {
1509 // FIXME: Make this work with -gsplit-dwarf.
1510 unsigned PointerSize = Asm->getDataLayout().getPointerSize();
1511 assert((PointerSize == 4 || PointerSize == 8) &&
1512 "Add support for other sizes if necessary");
Ulrich Weigand716a94f2013-07-02 18:47:09 +00001513 const MCExpr *Expr =
David Blaikie8fed05e2013-07-01 23:55:52 +00001514 Asm->getObjFileLowering().getDebugThreadLocalSymbol(Sym);
David Blaikie59eaa382013-06-28 20:05:11 +00001515 // Based on GCC's support for TLS:
David Blaikie8fed05e2013-07-01 23:55:52 +00001516 if (!DD->useSplitDwarf()) {
1517 // 1) Start with a constNu of the appropriate pointer size
1518 addUInt(Block, 0, dwarf::DW_FORM_data1,
1519 PointerSize == 4 ? dwarf::DW_OP_const4u : dwarf::DW_OP_const8u);
1520 // 2) containing the (relocated) address of the TLS variable
Ulrich Weigand716a94f2013-07-02 18:47:09 +00001521 addExpr(Block, 0, dwarf::DW_FORM_udata, Expr);
David Blaikie8fed05e2013-07-01 23:55:52 +00001522 } else {
1523 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_const_index);
Ulrich Weigand716a94f2013-07-02 18:47:09 +00001524 addUInt(Block, 0, dwarf::DW_FORM_udata, DU->getAddrPoolIndex(Expr));
David Blaikie8fed05e2013-07-01 23:55:52 +00001525 }
David Blaikie59eaa382013-06-28 20:05:11 +00001526 // 3) followed by a custom OP to tell the debugger about TLS (presumably)
1527 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_lo_user);
1528 } else
1529 addOpAddress(Block, Sym);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001530 // Do not create specification DIE if context is either compile unit
1531 // or a subprogram.
Devang Patel1dd4e562011-09-21 23:41:11 +00001532 if (GVContext && GV.isDefinition() && !GVContext.isCompileUnit() &&
Manman Ren02d29672013-09-09 19:05:21 +00001533 !GVContext.isFile() && !DD->isSubprogramContext(GVContext)) {
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001534 // Create specification DIE.
Eric Christopherd117fbb2011-11-11 01:55:22 +00001535 VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001536 addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
1537 dwarf::DW_FORM_ref4, VariableDIE);
1538 addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001539 // A static member's declaration is already flagged as such.
1540 if (!SDMDecl.Verify())
1541 addFlag(VariableDIE, dwarf::DW_AT_declaration);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001542 addDie(VariableSpecDIE);
1543 } else {
1544 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001545 }
Michael Gottesmandc42d032013-09-04 04:39:38 +00001546 // Add the linkage name.
Eric Christopher6b6061f2013-01-16 01:22:23 +00001547 StringRef LinkageName = GV.getLinkageName();
Michael Gottesmandc42d032013-09-04 04:39:38 +00001548 if (!LinkageName.empty())
Eric Christopher8d45a982013-02-27 23:49:47 +00001549 // From DWARF4: DIEs to which DW_AT_linkage_name may apply include:
1550 // TAG_common_block, TAG_constant, TAG_entry_point, TAG_subprogram and
1551 // TAG_variable.
Manman Ren21a08a12013-02-27 23:21:02 +00001552 addString(IsStaticMember && VariableSpecDIE ?
1553 VariableSpecDIE : VariableDIE, dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c2b4be2013-06-01 17:51:14 +00001554 GlobalValue::getRealLinkageName(LinkageName));
Eric Christopher8b4310b2012-11-21 00:34:38 +00001555 } else if (const ConstantInt *CI =
Manman Ren945e8282013-02-01 23:54:37 +00001556 dyn_cast_or_null<ConstantInt>(GV.getConstant())) {
Adrian Prantl2e892e42013-04-04 22:56:49 +00001557 // AT_const_value was added when the static member was created. To avoid
Manman Ren945e8282013-02-01 23:54:37 +00001558 // emitting AT_const_value multiple times, we only add AT_const_value when
1559 // it is not a static member.
1560 if (!IsStaticMember)
Manman Ren2b530892013-10-01 23:45:54 +00001561 addConstantValue(VariableDIE, CI, isUnsignedDIType(DD, GTy));
Manman Ren945e8282013-02-01 23:54:37 +00001562 } else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001563 addToAccelTable = true;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001564 // GV is a merged global.
1565 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1566 Value *Ptr = CE->getOperand(0);
Eric Christopher0969ddf2013-01-18 22:11:33 +00001567 addOpAddress(Block, Asm->Mang->getSymbol(cast<GlobalValue>(Ptr)));
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001568 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1569 SmallVector<Value*, 3> Idx(CE->op_begin()+1, CE->op_end());
Eric Christopher8b4310b2012-11-21 00:34:38 +00001570 addUInt(Block, 0, dwarf::DW_FORM_udata,
Micah Villmow3574eca2012-10-08 16:38:25 +00001571 Asm->getDataLayout().getIndexedOffset(Ptr->getType(), Idx));
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001572 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1573 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
1574 }
1575
Eric Christopherd117fbb2011-11-11 01:55:22 +00001576 if (addToAccelTable) {
1577 DIE *AddrDIE = VariableSpecDIE ? VariableSpecDIE : VariableDIE;
1578 addAccelName(GV.getName(), AddrDIE);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001579
Eric Christopherd117fbb2011-11-11 01:55:22 +00001580 // If the linkage name is different than the name, go ahead and output
1581 // that as well into the name table.
1582 if (GV.getLinkageName() != "" && GV.getName() != GV.getLinkageName())
1583 addAccelName(GV.getLinkageName(), AddrDIE);
1584 }
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001585}
1586
Devang Patel161b2f42011-04-12 23:21:44 +00001587/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
Eric Christopher4d069bf2012-05-22 18:45:24 +00001588void CompileUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR,
1589 DIE *IndexTy) {
Devang Patel161b2f42011-04-12 23:21:44 +00001590 DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
1591 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
Devang Patel161b2f42011-04-12 23:21:44 +00001592
Bill Wendling222c2fd2012-12-06 07:38:10 +00001593 // The LowerBound value defines the lower bounds which is typically zero for
1594 // C/C++. The Count value is the number of elements. Values are 64 bit. If
1595 // Count == -1 then the array is unbounded and we do not emit
1596 // DW_AT_lower_bound and DW_AT_upper_bound attributes. If LowerBound == 0 and
1597 // Count == 0, then the array has zero elements in which case we do not emit
1598 // an upper bound.
1599 int64_t LowerBound = SR.getLo();
Bill Wendling6afe4782012-12-06 07:55:19 +00001600 int64_t DefaultLowerBound = getDefaultLowerBound();
Bill Wendling9493dae2012-12-04 21:34:03 +00001601 int64_t Count = SR.getCount();
Devang Patel161b2f42011-04-12 23:21:44 +00001602
Bill Wendling6afe4782012-12-06 07:55:19 +00001603 if (DefaultLowerBound == -1 || LowerBound != DefaultLowerBound)
Bill Wendling222c2fd2012-12-06 07:38:10 +00001604 addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, LowerBound);
1605
1606 if (Count != -1 && Count != 0)
Bill Wendling9493dae2012-12-04 21:34:03 +00001607 // FIXME: An unbounded array should reference the expression that defines
1608 // the array.
Bill Wendling222c2fd2012-12-06 07:38:10 +00001609 addUInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, LowerBound + Count - 1);
Bill Wendling9493dae2012-12-04 21:34:03 +00001610
Devang Patel161b2f42011-04-12 23:21:44 +00001611 Buffer.addChild(DW_Subrange);
1612}
1613
1614/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
1615void CompileUnit::constructArrayTypeDIE(DIE &Buffer,
1616 DICompositeType *CTy) {
1617 Buffer.setTag(dwarf::DW_TAG_array_type);
Eric Christopher9a1e0e22013-01-08 01:53:52 +00001618 if (CTy->isVector())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001619 addFlag(&Buffer, dwarf::DW_AT_GNU_vector);
Devang Patel161b2f42011-04-12 23:21:44 +00001620
Eric Christopherdc1363f2013-08-08 07:40:37 +00001621 // Emit the element type.
Manman Ren2b530892013-10-01 23:45:54 +00001622 addType(&Buffer, DD->resolve(CTy->getTypeDerivedFrom()));
Devang Patel161b2f42011-04-12 23:21:44 +00001623
1624 // Get an anonymous type for index type.
Eric Christopher8cab6ed2013-01-04 21:51:53 +00001625 // FIXME: This type should be passed down from the front end
1626 // as different languages may have different sizes for indexes.
Devang Patel161b2f42011-04-12 23:21:44 +00001627 DIE *IdxTy = getIndexTyDie();
1628 if (!IdxTy) {
1629 // Construct an anonymous type for index type.
1630 IdxTy = new DIE(dwarf::DW_TAG_base_type);
Eric Christopher8cab6ed2013-01-04 21:51:53 +00001631 addString(IdxTy, dwarf::DW_AT_name, "int");
Devang Patel161b2f42011-04-12 23:21:44 +00001632 addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1633 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1634 dwarf::DW_ATE_signed);
1635 addDie(IdxTy);
1636 setIndexTyDie(IdxTy);
1637 }
1638
1639 // Add subranges to array type.
Eric Christopherdc1363f2013-08-08 07:40:37 +00001640 DIArray Elements = CTy->getTypeArray();
Devang Patel161b2f42011-04-12 23:21:44 +00001641 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1642 DIDescriptor Element = Elements.getElement(i);
1643 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1644 constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1645 }
1646}
1647
1648/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
1649DIE *CompileUnit::constructEnumTypeDIE(DIEnumerator ETy) {
1650 DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
1651 StringRef Name = ETy.getName();
Nick Lewycky390c40d2011-10-27 06:44:11 +00001652 addString(Enumerator, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001653 int64_t Value = ETy.getEnumValue();
1654 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
1655 return Enumerator;
1656}
1657
Devang Pateldbc64af2011-08-15 17:24:54 +00001658/// constructContainingTypeDIEs - Construct DIEs for types that contain
1659/// vtables.
1660void CompileUnit::constructContainingTypeDIEs() {
1661 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
1662 CE = ContainingTypeMap.end(); CI != CE; ++CI) {
1663 DIE *SPDie = CI->first;
1664 const MDNode *N = CI->second;
1665 if (!N) continue;
Manman Ren620f4362013-10-01 19:52:23 +00001666 DIE *NDie = DD->getTypeDIE(N);
Devang Pateldbc64af2011-08-15 17:24:54 +00001667 if (!NDie) continue;
1668 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
1669 }
1670}
1671
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001672/// constructVariableDIE - Construct a DIE for the given DbgVariable.
Eric Christopherf61dbc12013-06-24 21:07:27 +00001673DIE *CompileUnit::constructVariableDIE(DbgVariable *DV,
1674 bool isScopeAbstract) {
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001675 StringRef Name = DV->getName();
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001676
1677 // Translate tag to proper Dwarf tag.
Eric Christopher31667622013-08-08 01:41:00 +00001678 uint16_t Tag = DV->getTag();
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001679
1680 // Define variable debug information entry.
1681 DIE *VariableDie = new DIE(Tag);
1682 DbgVariable *AbsVar = DV->getAbstractVariable();
1683 DIE *AbsDIE = AbsVar ? AbsVar->getDIE() : NULL;
Manman Ren742671b2013-05-29 17:16:59 +00001684 if (AbsDIE)
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001685 addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
Manman Ren742671b2013-05-29 17:16:59 +00001686 dwarf::DW_FORM_ref4, AbsDIE);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001687 else {
David Blaikie2883fd42013-08-19 03:34:03 +00001688 if (!Name.empty())
1689 addString(VariableDie, dwarf::DW_AT_name, Name);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001690 addSourceLine(VariableDie, DV->getVariable());
1691 addType(VariableDie, DV->getType());
1692 }
1693
1694 if (DV->isArtificial())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001695 addFlag(VariableDie, dwarf::DW_AT_artificial);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001696
1697 if (isScopeAbstract) {
1698 DV->setDIE(VariableDie);
1699 return VariableDie;
1700 }
1701
1702 // Add variable address.
1703
1704 unsigned Offset = DV->getDotDebugLocOffset();
1705 if (Offset != ~0U) {
Eric Christopherafbe0e22013-06-24 21:34:55 +00001706 addLabel(VariableDie, dwarf::DW_AT_location, dwarf::DW_FORM_data4,
1707 Asm->GetTempSymbol("debug_loc", Offset));
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001708 DV->setDIE(VariableDie);
1709 return VariableDie;
1710 }
1711
Eric Christopher8cf5e742011-10-03 15:49:20 +00001712 // Check if variable is described by a DBG_VALUE instruction.
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001713 if (const MachineInstr *DVInsn = DV->getMInsn()) {
David Blaikie6d9dbd52013-06-16 20:34:15 +00001714 assert(DVInsn->getNumOperands() == 3);
1715 if (DVInsn->getOperand(0).isReg()) {
1716 const MachineOperand RegOp = DVInsn->getOperand(0);
Adrian Prantlb2754912013-07-09 21:44:06 +00001717 // If the second operand is an immediate, this is an indirect value.
Adrian Prantl35176402013-07-09 20:28:37 +00001718 if (DVInsn->getOperand(1).isImm()) {
1719 MachineLocation Location(RegOp.getReg(), DVInsn->getOperand(1).getImm());
Eric Christopherf61dbc12013-06-24 21:07:27 +00001720 addVariableAddress(*DV, VariableDie, Location);
David Blaikie6d9dbd52013-06-16 20:34:15 +00001721 } else if (RegOp.getReg())
Eric Christopherf61dbc12013-06-24 21:07:27 +00001722 addVariableAddress(*DV, VariableDie, MachineLocation(RegOp.getReg()));
David Blaikie6d9dbd52013-06-16 20:34:15 +00001723 } else if (DVInsn->getOperand(0).isImm())
Eric Christophere4721492013-07-03 01:08:30 +00001724 addConstantValue(VariableDie, DVInsn->getOperand(0), DV->getType());
David Blaikie6d9dbd52013-06-16 20:34:15 +00001725 else if (DVInsn->getOperand(0).isFPImm())
Eric Christophere4721492013-07-03 01:08:30 +00001726 addConstantFPValue(VariableDie, DVInsn->getOperand(0));
David Blaikie6d9dbd52013-06-16 20:34:15 +00001727 else if (DVInsn->getOperand(0).isCImm())
Eric Christophere4721492013-07-03 01:08:30 +00001728 addConstantValue(VariableDie, DVInsn->getOperand(0).getCImm(),
Manman Ren2b530892013-10-01 23:45:54 +00001729 isUnsignedDIType(DD, DV->getType()));
Eric Christophere4721492013-07-03 01:08:30 +00001730
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001731 DV->setDIE(VariableDie);
1732 return VariableDie;
1733 } else {
1734 // .. else use frame index.
1735 int FI = DV->getFrameIndex();
1736 if (FI != ~0) {
1737 unsigned FrameReg = 0;
1738 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
Eric Christopher8b4310b2012-11-21 00:34:38 +00001739 int Offset =
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001740 TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
1741 MachineLocation Location(FrameReg, Offset);
Eric Christopherf61dbc12013-06-24 21:07:27 +00001742 addVariableAddress(*DV, VariableDie, Location);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001743 }
1744 }
1745
1746 DV->setDIE(VariableDie);
1747 return VariableDie;
1748}
1749
Devang Patel161b2f42011-04-12 23:21:44 +00001750/// createMemberDIE - Create new member DIE.
1751DIE *CompileUnit::createMemberDIE(DIDerivedType DT) {
1752 DIE *MemberDie = new DIE(DT.getTag());
1753 StringRef Name = DT.getName();
1754 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001755 addString(MemberDie, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001756
Manman Ren2b530892013-10-01 23:45:54 +00001757 addType(MemberDie, DD->resolve(DT.getTypeDerivedFrom()));
Devang Patel161b2f42011-04-12 23:21:44 +00001758
1759 addSourceLine(MemberDie, DT);
1760
1761 DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
1762 addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1763
1764 uint64_t Size = DT.getSizeInBits();
Manman Ren2b530892013-10-01 23:45:54 +00001765 uint64_t FieldSize = getOriginalTypeSize(DD, DT);
Devang Patel161b2f42011-04-12 23:21:44 +00001766
1767 if (Size != FieldSize) {
1768 // Handle bitfield.
Manman Ren2b530892013-10-01 23:45:54 +00001769 addUInt(MemberDie, dwarf::DW_AT_byte_size, 0,
1770 getOriginalTypeSize(DD, DT)>>3);
Devang Patel161b2f42011-04-12 23:21:44 +00001771 addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1772
1773 uint64_t Offset = DT.getOffsetInBits();
1774 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1775 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1776 uint64_t FieldOffset = (HiMark - FieldSize);
1777 Offset -= FieldOffset;
1778
1779 // Maybe we need to work from the other end.
Micah Villmow3574eca2012-10-08 16:38:25 +00001780 if (Asm->getDataLayout().isLittleEndian())
Devang Patel161b2f42011-04-12 23:21:44 +00001781 Offset = FieldSize - (Offset + Size);
1782 addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
1783
1784 // Here WD_AT_data_member_location points to the anonymous
1785 // field that includes this bit field.
1786 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
1787
1788 } else
1789 // This is not a bitfield.
1790 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1791
1792 if (DT.getTag() == dwarf::DW_TAG_inheritance
1793 && DT.isVirtual()) {
1794
1795 // For C++, virtual base classes are not at fixed offset. Use following
1796 // expression to extract appropriate offset from vtable.
1797 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1798
1799 DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
1800 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1801 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1802 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1803 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1804 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1805 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1806 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1807
1808 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
1809 VBaseLocationDie);
1810 } else
1811 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
1812
1813 if (DT.isProtected())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001814 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001815 dwarf::DW_ACCESS_protected);
1816 else if (DT.isPrivate())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001817 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001818 dwarf::DW_ACCESS_private);
1819 // Otherwise C++ member and base classes are considered public.
Eric Christopher8b4310b2012-11-21 00:34:38 +00001820 else
Nick Lewycky13aaca52011-12-13 05:09:11 +00001821 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001822 dwarf::DW_ACCESS_public);
1823 if (DT.isVirtual())
Nick Lewycky798313d2011-12-14 00:56:07 +00001824 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001825 dwarf::DW_VIRTUALITY_virtual);
Devang Patele9db5e22011-04-16 00:11:51 +00001826
1827 // Objective-C properties.
Devang Patel6588abf2012-02-06 17:49:43 +00001828 if (MDNode *PNode = DT.getObjCProperty())
1829 if (DIEEntry *PropertyDie = getDIEEntry(PNode))
Eric Christopher8b4310b2012-11-21 00:34:38 +00001830 MemberDie->addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4,
Devang Patel6588abf2012-02-06 17:49:43 +00001831 PropertyDie);
1832
David Blaikie01bc2b32012-12-13 22:43:07 +00001833 if (DT.isArtificial())
1834 addFlag(MemberDie, dwarf::DW_AT_artificial);
1835
Devang Patel161b2f42011-04-12 23:21:44 +00001836 return MemberDie;
1837}
Eric Christopher6b6061f2013-01-16 01:22:23 +00001838
1839/// createStaticMemberDIE - Create new DIE for C++ static member.
1840DIE *CompileUnit::createStaticMemberDIE(const DIDerivedType DT) {
1841 if (!DT.Verify())
1842 return NULL;
1843
1844 DIE *StaticMemberDIE = new DIE(DT.getTag());
Manman Ren2b530892013-10-01 23:45:54 +00001845 DIType Ty = DD->resolve(DT.getTypeDerivedFrom());
Eric Christopher6b6061f2013-01-16 01:22:23 +00001846
1847 addString(StaticMemberDIE, dwarf::DW_AT_name, DT.getName());
1848 addType(StaticMemberDIE, Ty);
1849 addSourceLine(StaticMemberDIE, DT);
1850 addFlag(StaticMemberDIE, dwarf::DW_AT_external);
1851 addFlag(StaticMemberDIE, dwarf::DW_AT_declaration);
1852
1853 // FIXME: We could omit private if the parent is a class_type, and
1854 // public if the parent is something else.
1855 if (DT.isProtected())
1856 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1857 dwarf::DW_ACCESS_protected);
1858 else if (DT.isPrivate())
1859 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1860 dwarf::DW_ACCESS_private);
1861 else
1862 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1863 dwarf::DW_ACCESS_public);
1864
1865 if (const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(DT.getConstant()))
Manman Ren2b530892013-10-01 23:45:54 +00001866 addConstantValue(StaticMemberDIE, CI, isUnsignedDIType(DD, Ty));
David Blaikie14268412013-01-20 01:18:01 +00001867 if (const ConstantFP *CFP = dyn_cast_or_null<ConstantFP>(DT.getConstant()))
1868 addConstantFPValue(StaticMemberDIE, CFP);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001869
Manman Ren620f4362013-10-01 19:52:23 +00001870 DD->insertStaticMemberDIE(DT, StaticMemberDIE);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001871 return StaticMemberDIE;
1872}