blob: c9941086c25f8091e5d96765bf6f8f085cea9103 [file] [log] [blame]
Devang Patel0e821f42011-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 Christopher160522c2012-08-14 05:13:29 +000010// This file contains support for constructing a dwarf compile unit.
Devang Patel0e821f42011-04-12 23:21:44 +000011//
12//===----------------------------------------------------------------------===//
13
14#define DEBUG_TYPE "dwarfdebug"
15
16#include "DwarfCompileUnit.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000017#include "DwarfAccelTable.h"
Devang Patel0e821f42011-04-12 23:21:44 +000018#include "DwarfDebug.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000019#include "llvm/ADT/APFloat.h"
Bill Wendlingf799efd2012-06-29 08:32:07 +000020#include "llvm/DIBuilder.h"
Chandler Carruth9fb823b2013-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 Christopher0a917b72011-11-11 03:16:32 +000025#include "llvm/Support/Debug.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000026#include "llvm/Support/ErrorHandling.h"
Devang Pateldfd6ec32011-08-15 17:57:41 +000027#include "llvm/Target/Mangler.h"
Devang Patel0e821f42011-04-12 23:21:44 +000028#include "llvm/Target/TargetFrameLowering.h"
29#include "llvm/Target/TargetMachine.h"
David Blaikief2694972013-06-28 20:05:11 +000030#include "llvm/Target/TargetLoweringObjectFile.h"
Devang Patel0e821f42011-04-12 23:21:44 +000031#include "llvm/Target/TargetRegisterInfo.h"
Devang Patel0e821f42011-04-12 23:21:44 +000032
33using namespace llvm;
34
35/// CompileUnit - Compile unit constructor.
Eric Christopherbfceb2f2013-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 Patel0e821f42011-04-12 23:21:44 +000040 DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
Eric Christopherc57baee2013-05-08 00:58:51 +000041 insertDIE(N, D);
Devang Patel0e821f42011-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 Wendling3495f9b2012-12-06 07:55:19 +000057/// getDefaultLowerBound - Return the default lower bound for an array. If the
Bill Wendling28fe9e72012-12-06 07:38:10 +000058/// DWARF version doesn't handle the language, return -1.
Bill Wendling3495f9b2012-12-06 07:55:19 +000059int64_t CompileUnit::getDefaultLowerBound() const {
Eric Christopherbfceb2f2013-08-26 23:50:38 +000060 switch (DICompileUnit(Node).getLanguage()) {
Bill Wendling28fe9e72012-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 Christopherbb69a272012-08-24 01:14:27 +0000101/// addFlag - Add a flag that is true.
Eric Christopher31b05762013-08-08 01:41:00 +0000102void CompileUnit::addFlag(DIE *Die, uint16_t Attribute) {
Michael Gottesmanc89466f2013-09-04 04:39:38 +0000103 if (DD->getDwarfVersion() >= 4)
Eric Christopherbb69a272012-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 Patel0e821f42011-04-12 23:21:44 +0000110/// addUInt - Add an unsigned integer attribute data and value.
111///
Eric Christopher31b05762013-08-08 01:41:00 +0000112void CompileUnit::addUInt(DIE *Die, uint16_t Attribute,
113 uint16_t Form, uint64_t Integer) {
Devang Patel0e821f42011-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 Christopher31b05762013-08-08 01:41:00 +0000122void CompileUnit::addSInt(DIE *Die, uint16_t Attribute,
123 uint16_t Form, int64_t Integer) {
Devang Patel0e821f42011-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 Lewyckycc64ae12011-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 Christopherfba22602013-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 Christopher31b05762013-08-08 01:41:00 +0000134void CompileUnit::addString(DIE *Die, uint16_t Attribute, StringRef String) {
Eric Christopher67646432013-07-26 17:02:41 +0000135 DIEValue *Value;
Eric Christopher31b05762013-08-08 01:41:00 +0000136 uint16_t Form;
Eric Christopher2cbd5762013-01-07 19:32:41 +0000137 if (!DD->useSplitDwarf()) {
138 MCSymbol *Symb = DU->getStringPoolEntry(String);
Eric Christopher2cbd5762013-01-07 19:32:41 +0000139 if (Asm->needsRelocationsForDwarfStringPool())
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000140 Value = new (DIEValueAllocator) DIELabel(Symb);
Eric Christopher2cbd5762013-01-07 19:32:41 +0000141 else {
142 MCSymbol *StringPool = DU->getStringPoolSym();
143 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
144 }
Eric Christopher67646432013-07-26 17:02:41 +0000145 Form = dwarf::DW_FORM_strp;
Eric Christopher2cbd5762013-01-07 19:32:41 +0000146 } else {
147 unsigned idx = DU->getStringPoolIndex(String);
Eric Christopher67646432013-07-26 17:02:41 +0000148 Value = new (DIEValueAllocator) DIEInteger(idx);
149 Form = dwarf::DW_FORM_GNU_str_index;
Eric Christopher2cbd5762013-01-07 19:32:41 +0000150 }
Eric Christopher67646432013-07-26 17:02:41 +0000151 DIEValue *Str = new (DIEValueAllocator) DIEString(Value, String);
152 Die->addValue(Attribute, Form, Str);
Eric Christopher2cbd5762013-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 Christopher31b05762013-08-08 01:41:00 +0000157void CompileUnit::addLocalString(DIE *Die, uint16_t Attribute,
Eric Christopher2cbd5762013-01-07 19:32:41 +0000158 StringRef String) {
Eric Christophere698f532012-12-20 21:58:36 +0000159 MCSymbol *Symb = DU->getStringPoolEntry(String);
Nick Lewyckycc64ae12011-10-28 05:29:47 +0000160 DIEValue *Value;
161 if (Asm->needsRelocationsForDwarfStringPool())
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000162 Value = new (DIEValueAllocator) DIELabel(Symb);
Nick Lewyckycc64ae12011-10-28 05:29:47 +0000163 else {
Eric Christophere698f532012-12-20 21:58:36 +0000164 MCSymbol *StringPool = DU->getStringPoolSym();
Nick Lewyckycc64ae12011-10-28 05:29:47 +0000165 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +0000166 }
Nick Lewyckycc64ae12011-10-28 05:29:47 +0000167 Die->addValue(Attribute, dwarf::DW_FORM_strp, Value);
Devang Patel0e821f42011-04-12 23:21:44 +0000168}
169
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000170/// addExpr - Add a Dwarf expression attribute data and value.
Devang Patel0e821f42011-04-12 23:21:44 +0000171///
Eric Christopher31b05762013-08-08 01:41:00 +0000172void CompileUnit::addExpr(DIE *Die, uint16_t Attribute, uint16_t Form,
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000173 const MCExpr *Expr) {
174 DIEValue *Value = new (DIEValueAllocator) DIEExpr(Expr);
Devang Patel0e821f42011-04-12 23:21:44 +0000175 Die->addValue(Attribute, Form, Value);
176}
177
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000178/// addLabel - Add a Dwarf label attribute data and value.
179///
Eric Christopher31b05762013-08-08 01:41:00 +0000180void CompileUnit::addLabel(DIE *Die, uint16_t Attribute, uint16_t Form,
David Blaikief3cd7c52013-06-28 20:05:04 +0000181 const MCSymbol *Label) {
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000182 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
183 Die->addValue(Attribute, Form, Value);
Richard Mitton21101b32013-09-19 23:21:01 +0000184
185 SymbolCU Entry;
186 Entry.CU = this;
187 Entry.Sym = Label;
188
189 DD->addLabel(Entry);
David Blaikief3cd7c52013-06-28 20:05:04 +0000190}
191
Eric Christopher962c9082013-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 Christopher31b05762013-08-08 01:41:00 +0000195void CompileUnit::addLabelAddress(DIE *Die, uint16_t Attribute,
Eric Christopher962c9082013-01-15 23:56:56 +0000196 MCSymbol *Label) {
Richard Mitton21101b32013-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 Christopher962c9082013-01-15 23:56:56 +0000205 if (!DD->useSplitDwarf()) {
206 if (Label != NULL) {
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000207 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
Eric Christopher962c9082013-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 Christophere9ec2452013-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 Blaikief3cd7c52013-06-28 20:05:04 +0000223void CompileUnit::addOpAddress(DIE *Die, const MCSymbol *Sym) {
Eric Christophere9ec2452013-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 Christophere9ec2452013-01-18 22:11:33 +0000228 addUInt(Die, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_addr_index);
David Blaikie8466ca82013-07-01 23:55:52 +0000229 addUInt(Die, 0, dwarf::DW_FORM_GNU_addr_index, DU->getAddrPoolIndex(Sym));
Eric Christophere9ec2452013-01-18 22:11:33 +0000230 }
231}
232
Devang Patel0e821f42011-04-12 23:21:44 +0000233/// addDelta - Add a label delta attribute data and value.
234///
Eric Christopher31b05762013-08-08 01:41:00 +0000235void CompileUnit::addDelta(DIE *Die, uint16_t Attribute, uint16_t Form,
Devang Patel0e821f42011-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 Christopher31b05762013-08-08 01:41:00 +0000243void CompileUnit::addDIEEntry(DIE *Die, uint16_t Attribute, uint16_t Form,
Devang Patel0e821f42011-04-12 23:21:44 +0000244 DIE *Entry) {
Manman Ren8990d7e2013-10-01 19:52:23 +0000245 DD->addDIEEntry(Die, Attribute, Form, createDIEEntry(Entry));
Devang Patel0e821f42011-04-12 23:21:44 +0000246}
247
Devang Patel0e821f42011-04-12 23:21:44 +0000248/// addBlock - Add block data.
249///
Eric Christopher31b05762013-08-08 01:41:00 +0000250void CompileUnit::addBlock(DIE *Die, uint16_t Attribute, uint16_t Form,
Devang Patel0e821f42011-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 Ren7504ed42013-07-08 18:33:29 +0000261 if (!V.isVariable())
Devang Patel0e821f42011-04-12 23:21:44 +0000262 return;
Eric Christopher92331fd2012-11-21 00:34:38 +0000263
Devang Patel0e821f42011-04-12 23:21:44 +0000264 unsigned Line = V.getLineNumber();
265 if (Line == 0)
266 return;
Eric Christopher7b30f2e42012-11-21 00:34:35 +0000267 unsigned FileID = DD->getOrCreateSourceID(V.getContext().getFilename(),
Manman Ren1e427202013-03-07 01:42:00 +0000268 V.getContext().getDirectory(),
269 getUniqueID());
Devang Patel0e821f42011-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 Ren7504ed42013-07-08 18:33:29 +0000279 if (!G.isGlobalVariable())
Devang Patel0e821f42011-04-12 23:21:44 +0000280 return;
281
282 unsigned Line = G.getLineNumber();
283 if (Line == 0)
284 return;
Manman Ren1e427202013-03-07 01:42:00 +0000285 unsigned FileID = DD->getOrCreateSourceID(G.getFilename(), G.getDirectory(),
286 getUniqueID());
Devang Patel0e821f42011-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 Ren7504ed42013-07-08 18:33:29 +0000296 if (!SP.isSubprogram())
Devang Patel0e821f42011-04-12 23:21:44 +0000297 return;
Eric Christopher7734ca22012-03-15 23:55:40 +0000298
Devang Patel0e821f42011-04-12 23:21:44 +0000299 // If the line number is 0, don't add it.
Eric Christopher7734ca22012-03-15 23:55:40 +0000300 unsigned Line = SP.getLineNumber();
301 if (Line == 0)
Devang Patel0e821f42011-04-12 23:21:44 +0000302 return;
303
Eric Christopher7b30f2e42012-11-21 00:34:35 +0000304 unsigned FileID = DD->getOrCreateSourceID(SP.getFilename(),
Manman Ren1e427202013-03-07 01:42:00 +0000305 SP.getDirectory(), getUniqueID());
Devang Patel0e821f42011-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 Ren7504ed42013-07-08 18:33:29 +0000315 if (!Ty.isType())
Devang Patel0e821f42011-04-12 23:21:44 +0000316 return;
317
318 unsigned Line = Ty.getLineNumber();
Eric Christopher7734ca22012-03-15 23:55:40 +0000319 if (Line == 0)
Devang Patel0e821f42011-04-12 23:21:44 +0000320 return;
Eric Christopher7b30f2e42012-11-21 00:34:35 +0000321 unsigned FileID = DD->getOrCreateSourceID(Ty.getFilename(),
Manman Ren1e427202013-03-07 01:42:00 +0000322 Ty.getDirectory(), getUniqueID());
Devang Patel0e821f42011-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 Christopher70e1bd82012-03-29 08:42:56 +0000330void CompileUnit::addSourceLine(DIE *Die, DIObjCProperty Ty) {
331 // Verify type.
Manman Ren7504ed42013-07-08 18:33:29 +0000332 if (!Ty.isObjCProperty())
Eric Christopher70e1bd82012-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 Christopher7b30f2e42012-11-21 00:34:35 +0000339 unsigned FileID = DD->getOrCreateSourceID(File.getFilename(),
Manman Ren1e427202013-03-07 01:42:00 +0000340 File.getDirectory(), getUniqueID());
Eric Christopher70e1bd82012-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 Patel0e821f42011-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 Ren1e427202013-03-07 01:42:00 +0000358 unsigned FileID = DD->getOrCreateSourceID(FN, NS.getDirectory(),
359 getUniqueID());
Devang Patel0e821f42011-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 Christopher92331fd2012-11-21 00:34:38 +0000365/// addVariableAddress - Add DW_AT_location attribute for a
Devang Patel77dc5412011-04-27 22:45:24 +0000366/// DbgVariable based on provided MachineLocation.
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000367void CompileUnit::addVariableAddress(const DbgVariable &DV, DIE *Die,
Devang Patel77dc5412011-04-27 22:45:24 +0000368 MachineLocation Location) {
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000369 if (DV.variableHasComplexAddress())
Devang Patel0e821f42011-04-12 23:21:44 +0000370 addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000371 else if (DV.isBlockByrefVariable())
Devang Patel0e821f42011-04-12 23:21:44 +0000372 addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location);
373 else
David Blaikieea2605d2013-06-20 00:25:24 +0000374 addAddress(Die, dwarf::DW_AT_location, Location,
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000375 DV.getVariable().isIndirect());
Devang Patel0e821f42011-04-12 23:21:44 +0000376}
377
Devang Patelba5fbf12011-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 Christopher31b05762013-08-08 01:41:00 +0000410void CompileUnit::addAddress(DIE *Die, uint16_t Attribute,
David Blaikieea2605d2013-06-20 00:25:24 +0000411 const MachineLocation &Location, bool Indirect) {
Devang Patelba5fbf12011-04-26 19:06:18 +0000412 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
413
David Blaikieea2605d2013-06-20 00:25:24 +0000414 if (Location.isReg() && !Indirect)
Devang Patelba5fbf12011-04-26 19:06:18 +0000415 addRegisterOp(Block, Location.getReg());
David Blaikieea2605d2013-06-20 00:25:24 +0000416 else {
Devang Patelba5fbf12011-04-26 19:06:18 +0000417 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
David Blaikieea2605d2013-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 Patelba5fbf12011-04-26 19:06:18 +0000422
423 // Now attach the location information to the DIE.
424 addBlock(Die, Attribute, 0, Block);
425}
426
Devang Patel0e821f42011-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 Christopherbf2d23c2013-06-24 21:07:27 +0000432void CompileUnit::addComplexAddress(const DbgVariable &DV, DIE *Die,
Eric Christopher31b05762013-08-08 01:41:00 +0000433 uint16_t Attribute,
Devang Patel0e821f42011-04-12 23:21:44 +0000434 const MachineLocation &Location) {
Devang Patel0e821f42011-04-12 23:21:44 +0000435 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000436 unsigned N = DV.getNumAddrElements();
Devang Patel3e021532011-04-28 02:22:40 +0000437 unsigned i = 0;
438 if (Location.isReg()) {
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000439 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
Devang Patel3e021532011-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 Christopherbf2d23c2013-06-24 21:07:27 +0000442 addRegisterOffset(Block, Location.getReg(), DV.getAddrElement(1));
Devang Patel3e021532011-04-28 02:22:40 +0000443 i = 2;
444 } else
445 addRegisterOp(Block, Location.getReg());
446 }
Devang Patelba5fbf12011-04-26 19:06:18 +0000447 else
448 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel0e821f42011-04-12 23:21:44 +0000449
Devang Patel3e021532011-04-28 02:22:40 +0000450 for (;i < N; ++i) {
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000451 uint64_t Element = DV.getAddrElement(i);
Devang Patel0e821f42011-04-12 23:21:44 +0000452 if (Element == DIBuilder::OpPlus) {
453 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000454 addUInt(Block, 0, dwarf::DW_FORM_udata, DV.getAddrElement(++i));
Devang Patel0e821f42011-04-12 23:21:44 +0000455 } else if (Element == DIBuilder::OpDeref) {
Eric Christopher4d250522012-05-08 18:56:00 +0000456 if (!Location.isReg())
457 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Devang Patel0e821f42011-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 Christopherbf2d23c2013-06-24 21:07:27 +0000525void CompileUnit::addBlockByrefAddress(const DbgVariable &DV, DIE *Die,
Eric Christopher31b05762013-08-08 01:41:00 +0000526 uint16_t Attribute,
Devang Patel0e821f42011-04-12 23:21:44 +0000527 const MachineLocation &Location) {
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000528 DIType Ty = DV.getType();
Devang Patel0e821f42011-04-12 23:21:44 +0000529 DIType TmpTy = Ty;
Eric Christopher31b05762013-08-08 01:41:00 +0000530 uint16_t Tag = Ty.getTag();
Devang Patel0e821f42011-04-12 23:21:44 +0000531 bool isPointer = false;
532
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000533 StringRef varName = DV.getName();
Devang Patel0e821f42011-04-12 23:21:44 +0000534
535 if (Tag == dwarf::DW_TAG_pointer_type) {
536 DIDerivedType DTy = DIDerivedType(Ty);
Manman Ren9a0a6702013-10-01 23:45:54 +0000537 TmpTy = DD->resolve(DTy.getTypeDerivedFrom());
Devang Patel0e821f42011-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 Patel0e821f42011-04-12 23:21:44 +0000567 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
568
Eric Christopheref9d7102012-07-04 02:02:18 +0000569 if (Location.isReg())
570 addRegisterOp(Block, Location.getReg());
571 else
572 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel0e821f42011-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 Patelbcd50a12011-07-20 21:57:04 +0000603/// isTypeSigned - Return true if the type is signed.
Manman Ren9a0a6702013-10-01 23:45:54 +0000604static bool isTypeSigned(DwarfDebug *DD, DIType Ty, int *SizeInBits) {
Devang Patelbcd50a12011-07-20 21:57:04 +0000605 if (Ty.isDerivedType())
Manman Ren9a0a6702013-10-01 23:45:54 +0000606 return isTypeSigned(DD, DD->resolve(DIDerivedType(Ty).getTypeDerivedFrom()),
607 SizeInBits);
Devang Patelbcd50a12011-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 Ren9a0a6702013-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 Patel0e821f42011-04-12 23:21:44 +0000662/// addConstantValue - Add constant value entry in variable DIE.
Eric Christopher78fcf4902013-07-03 01:08:30 +0000663void CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO,
Devang Patel3c6aed22011-05-27 16:45:18 +0000664 DIType Ty) {
David Blaikiea1e813d2013-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 Lewycky654f5ce2011-10-26 22:55:33 +0000668 assert(MO.isImm() && "Invalid machine operand!");
Devang Patelbcd50a12011-07-20 21:57:04 +0000669 int SizeInBits = -1;
Manman Ren9a0a6702013-10-01 23:45:54 +0000670 bool SignedConstant = isTypeSigned(DD, Ty, &SizeInBits);
Eric Christopher9d1daa82013-08-27 23:49:04 +0000671 uint16_t Form;
Devang Patelf1d04702011-05-27 18:15:52 +0000672
Eric Christopher9d1daa82013-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 Patel0e821f42011-04-12 23:21:44 +0000699}
700
701/// addConstantFPValue - Add constant value entry in variable DIE.
Eric Christopher78fcf4902013-07-03 01:08:30 +0000702void CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +0000703 assert (MO.isFPImm() && "Invalid machine operand!");
Devang Patel0e821f42011-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 Villmowcdfe20b2012-10-08 16:38:25 +0000712 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel0e821f42011-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 Patel0e821f42011-04-12 23:21:44 +0000723}
724
David Blaikiea39a76e2013-01-20 01:18:01 +0000725/// addConstantFPValue - Add constant value entry in variable DIE.
Eric Christopher78fcf4902013-07-03 01:08:30 +0000726void CompileUnit::addConstantFPValue(DIE *Die, const ConstantFP *CFP) {
Eric Christopher9d1daa82013-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 Blaikiea39a76e2013-01-20 01:18:01 +0000729}
730
Devang Patel0e821f42011-04-12 23:21:44 +0000731/// addConstantValue - Add constant value entry in variable DIE.
Eric Christopher78fcf4902013-07-03 01:08:30 +0000732void CompileUnit::addConstantValue(DIE *Die, const ConstantInt *CI,
Devang Patel0e821f42011-04-12 23:21:44 +0000733 bool Unsigned) {
Eric Christopher78fcf4902013-07-03 01:08:30 +0000734 addConstantValue(Die, CI->getValue(), Unsigned);
David Blaikiea39a76e2013-01-20 01:18:01 +0000735}
736
737// addConstantValue - Add constant value entry in variable DIE.
Eric Christopher78fcf4902013-07-03 01:08:30 +0000738void CompileUnit::addConstantValue(DIE *Die, const APInt &Val, bool Unsigned) {
David Blaikiea39a76e2013-01-20 01:18:01 +0000739 unsigned CIBitWidth = Val.getBitWidth();
Devang Patel8816bbc2011-05-28 00:39:18 +0000740 if (CIBitWidth <= 64) {
Eric Christopher9d1daa82013-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 Patel8816bbc2011-05-28 00:39:18 +0000746 }
Eric Christopher9d1daa82013-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 Christopher78fcf4902013-07-03 01:08:30 +0000769 return;
Devang Patel0e821f42011-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 Takumi29ccdd82011-10-28 14:12:22 +0000775 const uint64_t *Ptr64 = Val.getRawData();
Devang Patel0e821f42011-04-12 23:21:44 +0000776
777 int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
Micah Villmowcdfe20b2012-10-08 16:38:25 +0000778 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel0e821f42011-04-12 23:21:44 +0000779
780 // Output the constant to DWARF one byte at a time.
NAKAMURA Takumi29ccdd82011-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 Patel0e821f42011-04-12 23:21:44 +0000789
790 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
Devang Patel0e821f42011-04-12 23:21:44 +0000791}
792
Eric Christopher25e35092013-04-22 07:47:40 +0000793/// addTemplateParams - Add template parameters into buffer.
Devang Patel0e821f42011-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 Patel0e821f42011-04-12 23:21:44 +0000805}
Nick Lewycky654f5ce2011-10-26 22:55:33 +0000806
Eric Christopher4d23a4a2013-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 Christopher25e35092013-04-22 07:47:40 +0000815 else
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000816 return getDIE(Context);
817}
818
Devang Patel0e821f42011-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 Christopher4d23a4a2013-01-16 01:22:23 +0000821 if (DIE *ContextDIE = getOrCreateContextDIE(Context))
Devang Patel0e821f42011-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 Pateleb1bb4e2011-08-16 22:09:43 +0000829DIE *CompileUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
830 DIType Ty(TyNode);
Manman Ren7504ed42013-07-08 18:33:29 +0000831 if (!Ty.isType())
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000832 return NULL;
Manman Ren8990d7e2013-10-01 19:52:23 +0000833 DIE *TyDIE = DD->getTypeDIE(Ty);
Devang Patel0e821f42011-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 Ren8990d7e2013-10-01 19:52:23 +0000839 DD->insertTypeDIE(Ty, TyDIE);
Devang Patel0e821f42011-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 Christophere2887932011-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 Christopher21bde872012-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 Christopher8ea8e4f2012-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 Christopher21bde872012-01-06 04:35:23 +0000856 IsImplementation = (CT.getRunTimeLang() == 0) ||
Eric Christopheref64b462012-02-22 08:46:02 +0000857 CT.isObjcClassComplete();
Eric Christopher21bde872012-01-06 04:35:23 +0000858 }
Eric Christophercf7289f2013-09-05 18:20:16 +0000859 unsigned Flags = IsImplementation ? dwarf::DW_FLAG_type_implementation : 0;
Eric Christopher8ea8e4f2012-01-06 23:03:37 +0000860 addAccelType(Ty.getName(), std::make_pair(TyDIE, Flags));
Eric Christopher21bde872012-01-06 04:35:23 +0000861 }
Eric Christopher92331fd2012-11-21 00:34:38 +0000862
Manman Ren116868e2013-09-09 19:47:11 +0000863 addToContextOwner(TyDIE, DD->resolve(Ty.getContext()));
Devang Patel0e821f42011-04-12 23:21:44 +0000864 return TyDIE;
865}
866
867/// addType - Add a new type attribute to the specified entity.
Eric Christopher31b05762013-08-08 01:41:00 +0000868void CompileUnit::addType(DIE *Entity, DIType Ty, uint16_t Attribute) {
Eric Christopher0df08e22013-08-08 07:40:37 +0000869 assert(Ty && "Trying to add a type that doesn't exist?");
Devang Patel0e821f42011-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 Ren8990d7e2013-10-01 19:52:23 +0000875 DD->addDIEEntry(Entity, Attribute, dwarf::DW_FORM_ref4, Entry);
Devang Patel0e821f42011-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 Ren8990d7e2013-10-01 19:52:23 +0000885 DD->addDIEEntry(Entity, Attribute, dwarf::DW_FORM_ref4, Entry);
Devang Patele9853f22011-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 Patel562c7422011-06-01 00:23:24 +0000889 addGlobalType(Ty);
Devang Patel1cb8ab42011-05-31 23:30:30 +0000890}
891
Eric Christopher9cd26af2013-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 Christopherb0fc0b92013-09-23 22:59:11 +0000898 std::vector<DIE *> &DIEs = AccelNames[Name];
Eric Christopher9cd26af2013-09-20 23:22:52 +0000899 DIEs.push_back(Die);
900}
901
902void CompileUnit::addAccelObjC(StringRef Name, DIE *Die) {
903 DU->getStringPoolEntry(Name);
Eric Christopherb0fc0b92013-09-23 22:59:11 +0000904 std::vector<DIE *> &DIEs = AccelObjC[Name];
Eric Christopher9cd26af2013-09-20 23:22:52 +0000905 DIEs.push_back(Die);
906}
907
908void CompileUnit::addAccelNamespace(StringRef Name, DIE *Die) {
909 DU->getStringPoolEntry(Name);
Eric Christopherb0fc0b92013-09-23 22:59:11 +0000910 std::vector<DIE *> &DIEs = AccelNamespace[Name];
Eric Christopher9cd26af2013-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 Christopher9c58f312013-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 Patel1cb8ab42011-05-31 23:30:30 +0000925/// addGlobalType - Add a new global type to the compile unit.
926///
Devang Patel562c7422011-06-01 00:23:24 +0000927void CompileUnit::addGlobalType(DIType Ty) {
Manman Ren116868e2013-09-09 19:47:11 +0000928 DIDescriptor Context = DD->resolve(Ty.getContext());
Eric Christopher6d0f1e62013-09-23 23:15:58 +0000929 if (!Ty.getName().empty() && !Ty.isForwardDecl() &&
Eric Christopherb0fc0b92013-09-23 22:59:11 +0000930 (!Context || Context.isCompileUnit() || Context.isFile() ||
931 Context.isNameSpace()))
Devang Patel562c7422011-06-01 00:23:24 +0000932 if (DIEEntry *Entry = getDIEEntry(Ty))
933 GlobalTypes[Ty.getName()] = Entry->getEntry();
Devang Patel0e821f42011-04-12 23:21:44 +0000934}
935
Devang Patel17b53272011-05-06 16:57:54 +0000936/// addPubTypes - Add type for pubtypes section.
937void CompileUnit::addPubTypes(DISubprogram SP) {
938 DICompositeType SPTy = SP.getType();
Eric Christopher31b05762013-08-08 01:41:00 +0000939 uint16_t SPTag = SPTy.getTag();
Devang Patel17b53272011-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 Ren7504ed42013-07-08 18:33:29 +0000946 if (!ATy.isType())
Devang Patel17b53272011-05-06 16:57:54 +0000947 continue;
Devang Patel562c7422011-06-01 00:23:24 +0000948 addGlobalType(ATy);
Devang Patel17b53272011-05-06 16:57:54 +0000949 }
950}
951
Devang Patel0e821f42011-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 Patel0e821f42011-04-12 23:21:44 +0000956 // Add name if not anonymous or intermediate type.
957 if (!Name.empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +0000958 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel04d6d472011-09-14 23:13:28 +0000959
960 if (BTy.getTag() == dwarf::DW_TAG_unspecified_type) {
961 Buffer.setTag(dwarf::DW_TAG_unspecified_type);
Eric Christopher93ebdd72013-07-09 23:48:45 +0000962 // An unspecified type only has a name attribute.
Devang Patel04d6d472011-09-14 23:13:28 +0000963 return;
964 }
965
966 Buffer.setTag(dwarf::DW_TAG_base_type);
Nick Lewycky654f5ce2011-10-26 22:55:33 +0000967 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
Devang Pateld925d1a2012-02-07 23:33:58 +0000968 BTy.getEncoding());
Devang Patel04d6d472011-09-14 23:13:28 +0000969
Devang Patel0e821f42011-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 Christopher31b05762013-08-08 01:41:00 +0000979 uint16_t Tag = DTy.getTag();
Devang Patel0e821f42011-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 Ren9a0a6702013-10-01 23:45:54 +0000987 DIType FromTy = DD->resolve(DTy.getTypeDerivedFrom());
Eric Christopher0df08e22013-08-08 07:40:37 +0000988 if (FromTy)
989 addType(&Buffer, FromTy);
Devang Patel0e821f42011-04-12 23:21:44 +0000990
991 // Add name if not anonymous or intermediate type.
992 if (!Name.empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +0000993 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel0e821f42011-04-12 23:21:44 +0000994
995 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopher85757902012-02-21 22:25:53 +0000996 if (Size && Tag != dwarf::DW_TAG_pointer_type)
Devang Patel0e821f42011-04-12 23:21:44 +0000997 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
998
David Blaikie5d3249b2013-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 Ren60352032013-09-05 18:48:31 +00001001 getOrCreateTypeDIE(DD->resolve(DTy.getClassType())));
Devang Patel0e821f42011-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 Christopher67646432013-07-26 17:02:41 +00001007/// Return true if the type is appropriately scoped to be contained inside
1008/// its own type unit.
Manman Ren33796c52013-09-09 19:23:58 +00001009static bool isTypeUnitScoped(DIType Ty, const DwarfDebug *DD) {
Manman Ren116868e2013-09-09 19:47:11 +00001010 DIScope Parent = DD->resolve(Ty.getContext());
Eric Christopher67646432013-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 Rende897a362013-09-09 22:35:23 +00001015 Parent = DD->resolve(Parent.getContext());
Eric Christopher67646432013-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 Ren33796c52013-09-09 19:23:58 +00001021static bool shouldCreateTypeUnit(DICompositeType CTy, const DwarfDebug *DD) {
Eric Christopher31b05762013-08-08 01:41:00 +00001022 uint16_t Tag = CTy.getTag();
Eric Christopher67646432013-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 Ren33796c52013-09-09 19:23:58 +00001032 if (CTy.isForwardDecl() || !isTypeUnitScoped(CTy, DD))
Eric Christopher67646432013-07-26 17:02:41 +00001033 return 0;
1034 return 1;
1035 default:
1036 return 0;
1037 }
1038}
1039
Devang Patel0e821f42011-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 Christopher31b05762013-08-08 01:41:00 +00001046 uint16_t Tag = CTy.getTag();
Devang Patel0e821f42011-04-12 23:21:44 +00001047 Buffer.setTag(Tag);
1048
1049 switch (Tag) {
Devang Patel0e821f42011-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 Ren9a0a6702013-10-01 23:45:54 +00001065 DIType DTy = DD->resolve(CTy.getTypeDerivedFrom());
Eric Christopher49e17b22013-08-08 07:40:42 +00001066 if (DTy) {
Eric Christopherc4964352012-05-23 00:09:20 +00001067 addType(&Buffer, DTy);
1068 addUInt(&Buffer, dwarf::DW_AT_enum_class, dwarf::DW_FORM_flag, 1);
1069 }
Devang Patel0e821f42011-04-12 23:21:44 +00001070 }
1071 break;
1072 case dwarf::DW_TAG_subroutine_type: {
Eric Christopher0df08e22013-08-08 07:40:37 +00001073 // Add return type. A void return won't have a type.
Devang Patel0e821f42011-04-12 23:21:44 +00001074 DIArray Elements = CTy.getTypeArray();
1075 DIDescriptor RTy = Elements.getElement(0);
Eric Christopher0df08e22013-08-08 07:40:37 +00001076 if (RTy)
1077 addType(&Buffer, DIType(RTy));
Devang Patel0e821f42011-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 Blaikie9a7a7a92013-01-29 19:35:24 +00001090 if (DIType(Ty).isArtificial())
1091 addFlag(Arg, dwarf::DW_AT_artificial);
Devang Patel0e821f42011-04-12 23:21:44 +00001092 Buffer.addChild(Arg);
1093 }
1094 }
Eric Christopher5cd2a9d2012-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 Christopherbfceb2f2013-08-26 23:50:38 +00001097 uint16_t Language = DICompileUnit(Node).getLanguage();
Eric Christopher5cd2a9d2012-02-22 08:46:21 +00001098 if (isPrototyped &&
Eric Christopherd42b92f2012-05-22 18:45:24 +00001099 (Language == dwarf::DW_LANG_C89 ||
1100 Language == dwarf::DW_LANG_C99 ||
1101 Language == dwarf::DW_LANG_ObjC))
Eric Christopherbb69a272012-08-24 01:14:27 +00001102 addFlag(&Buffer, dwarf::DW_AT_prototyped);
Devang Patel0e821f42011-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 Patel0e821f42011-04-12 23:21:44 +00001108 // Add elements to structure type.
David Blaikiea1ae0e62013-08-01 20:30:22 +00001109 DIArray Elements = CTy.getTypeArray();
1110 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
Devang Patel0e821f42011-04-12 23:21:44 +00001111 DIDescriptor Element = Elements.getElement(i);
1112 DIE *ElemDie = NULL;
1113 if (Element.isSubprogram()) {
1114 DISubprogram SP(Element);
Devang Patel89543712011-08-15 17:24:54 +00001115 ElemDie = getOrCreateSubprogramDIE(DISubprogram(Element));
Devang Patel0e821f42011-04-12 23:21:44 +00001116 if (SP.isProtected())
Nick Lewyckycb918492011-12-13 05:09:11 +00001117 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001118 dwarf::DW_ACCESS_protected);
1119 else if (SP.isPrivate())
Nick Lewyckycb918492011-12-13 05:09:11 +00001120 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001121 dwarf::DW_ACCESS_private);
Eric Christopher92331fd2012-11-21 00:34:38 +00001122 else
Nick Lewyckycb918492011-12-13 05:09:11 +00001123 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001124 dwarf::DW_ACCESS_public);
1125 if (SP.isExplicit())
Eric Christopherbb69a272012-08-24 01:14:27 +00001126 addFlag(ElemDie, dwarf::DW_AT_explicit);
Eric Christopher7285c7d2012-03-28 07:34:31 +00001127 } else if (Element.isDerivedType()) {
Eric Christopherd42b92f2012-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 Ren9a0a6702013-10-01 23:45:54 +00001131 addType(ElemDie, DD->resolve(DDTy.getTypeDerivedFrom()),
1132 dwarf::DW_AT_friend);
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001133 } else if (DDTy.isStaticMember())
1134 ElemDie = createStaticMemberDIE(DDTy);
1135 else
1136 ElemDie = createMemberDIE(DDTy);
Eric Christopher7285c7d2012-03-28 07:34:31 +00001137 } else if (Element.isObjCProperty()) {
Devang Pateld925d1a2012-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 Christopherd42b92f2012-05-22 18:45:24 +00001142 addType(ElemDie, Property.getType());
1143 addSourceLine(ElemDie, Property);
Devang Pateld925d1a2012-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 Patel403e8192012-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 Christopher92331fd2012-11-21 00:34:38 +00001164 addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, 0,
Devang Patel403e8192012-02-04 01:30:32 +00001165 PropertyAttributes);
Devang Patel44882172012-02-06 17:49:43 +00001166
Devang Pateld925d1a2012-02-07 23:33:58 +00001167 DIEEntry *Entry = getDIEEntry(Element);
1168 if (!Entry) {
1169 Entry = createDIEEntry(ElemDie);
1170 insertDIEEntry(Element, Entry);
1171 }
Devang Patel403e8192012-02-04 01:30:32 +00001172 } else
Devang Patel0e821f42011-04-12 23:21:44 +00001173 continue;
1174 Buffer.addChild(ElemDie);
1175 }
1176
1177 if (CTy.isAppleBlockExtension())
Eric Christopherbb69a272012-08-24 01:14:27 +00001178 addFlag(&Buffer, dwarf::DW_AT_APPLE_block);
Devang Patel0e821f42011-04-12 23:21:44 +00001179
Manman Rend8f798e2013-09-06 18:46:00 +00001180 DICompositeType ContainingType(DD->resolve(CTy.getContainingType()));
Devang Patel0e821f42011-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 Christopher666dc632013-07-14 21:46:51 +00001184 else
Manman Ren116868e2013-09-09 19:47:11 +00001185 addToContextOwner(&Buffer, DD->resolve(CTy.getContext()));
Devang Patel0e821f42011-04-12 23:21:44 +00001186
Devang Patel12419ae2011-05-12 21:29:42 +00001187 if (CTy.isObjcClassComplete())
Eric Christopherbb69a272012-08-24 01:14:27 +00001188 addFlag(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type);
Devang Patel2409e782011-05-12 19:06:16 +00001189
Eric Christopherda011dd2011-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 Patel0e821f42011-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 Lewyckyd59c0ca2011-10-27 06:44:11 +00001205 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel0e821f42011-04-12 23:21:44 +00001206
Eric Christopher775cbd22012-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 Patel0e821f42011-04-12 23:21:44 +00001211 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopher1cf33382012-06-01 00:22:32 +00001212 // TODO: Do we care about size for enum forward declarations?
Devang Patel0e821f42011-04-12 23:21:44 +00001213 if (Size)
1214 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
Eric Christopher1cf33382012-06-01 00:22:32 +00001215 else if (!CTy.isForwardDecl())
Devang Patel0e821f42011-04-12 23:21:44 +00001216 // Add zero size if it is not a forward declaration.
Eric Christopher1cf33382012-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 Christopherbb69a272012-08-24 01:14:27 +00001221 addFlag(&Buffer, dwarf::DW_AT_declaration);
Devang Patel0e821f42011-04-12 23:21:44 +00001222
1223 // Add source line info if available.
1224 if (!CTy.isForwardDecl())
1225 addSourceLine(&Buffer, CTy);
Eric Christopher54cf8ff2012-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 Patel0e821f42011-04-12 23:21:44 +00001232 }
Eric Christopher67646432013-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 Ren33796c52013-09-09 19:23:58 +00001235 if (shouldCreateTypeUnit(CTy, DD))
Eric Christopher67646432013-07-26 17:02:41 +00001236 DD->addTypeUnitType(&Buffer);
Devang Patel0e821f42011-04-12 23:21:44 +00001237}
1238
Eric Christopher92331fd2012-11-21 00:34:38 +00001239/// getOrCreateTemplateTypeParameterDIE - Find existing DIE or create new DIE
Devang Patel0e821f42011-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 Christopher056b6472013-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 Blaikie2b380232013-06-22 18:59:11 +00001251 if (!TP.getName().empty())
1252 addString(ParamDIE, dwarf::DW_AT_name, TP.getName());
Devang Patel0e821f42011-04-12 23:21:44 +00001253 return ParamDIE;
1254}
1255
Eric Christopher92331fd2012-11-21 00:34:38 +00001256/// getOrCreateTemplateValueParameterDIE - Find existing DIE or create new DIE
Devang Patel0e821f42011-04-12 23:21:44 +00001257/// for the given DITemplateValueParameter.
1258DIE *
Eric Christopherafb2c412013-08-08 07:40:31 +00001259CompileUnit::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter VP) {
1260 DIE *ParamDIE = getDIE(VP);
Devang Patel0e821f42011-04-12 23:21:44 +00001261 if (ParamDIE)
1262 return ParamDIE;
1263
Eric Christopherafb2c412013-08-08 07:40:31 +00001264 ParamDIE = new DIE(VP.getTag());
Eric Christopher0df08e22013-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 Christopherafb2c412013-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 Blaikiea1e813d2013-05-10 21:52:07 +00001273 if (ConstantInt *CI = dyn_cast<ConstantInt>(Val))
Manman Ren9a0a6702013-10-01 23:45:54 +00001274 addConstantValue(ParamDIE, CI, isUnsignedDIType(DD, VP.getType()));
David Blaikiea1e813d2013-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 Christopherafb2c412013-08-08 07:40:31 +00001284 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_template_param) {
David Blaikie2b380232013-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 Christopherafb2c412013-08-08 07:40:31 +00001288 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_parameter_pack) {
David Blaikie2b380232013-06-22 18:59:11 +00001289 assert(isa<MDNode>(Val));
1290 DIArray A(cast<MDNode>(Val));
1291 addTemplateParams(*ParamDIE, A);
David Blaikiea1e813d2013-05-10 21:52:07 +00001292 }
1293 }
1294
Devang Patel0e821f42011-04-12 23:21:44 +00001295 return ParamDIE;
1296}
1297
Devang Patel17b53272011-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 Christopher4996c702011-11-07 09:24:32 +00001305 if (!NS.getName().empty()) {
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +00001306 addString(NDie, dwarf::DW_AT_name, NS.getName());
Eric Christopher4996c702011-11-07 09:24:32 +00001307 addAccelNamespace(NS.getName(), NDie);
Eric Christopher55364d72013-09-24 00:17:57 +00001308 addGlobalName(NS.getName(), NDie);
Eric Christopher4996c702011-11-07 09:24:32 +00001309 } else
1310 addAccelNamespace("(anonymous namespace)", NDie);
Devang Patel17b53272011-05-06 16:57:54 +00001311 addSourceLine(NDie, NS);
1312 addToContextOwner(NDie, NS.getContext());
1313 return NDie;
1314}
1315
Devang Patel89543712011-08-15 17:24:54 +00001316/// getOrCreateSubprogramDIE - Create new DIE using SP.
1317DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
Manman Ren8990d7e2013-10-01 19:52:23 +00001318 DIE *SPDie = DD->getSPDIE(SP);
Devang Patel89543712011-08-15 17:24:54 +00001319 if (SPDie)
1320 return SPDie;
1321
Peter Collingbourne4d358b52012-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 Ren8990d7e2013-10-01 19:52:23 +00001325 DD->insertSPDIE(SP, SPDie);
Peter Collingbourne4d358b52012-05-27 18:36:44 +00001326
Rafael Espindola79278362011-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 Patel89543712011-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 Patel89543712011-08-15 17:24:54 +00001339 // If this DIE is going to refer declaration info using AT_specification
Eric Christopherf20ff972013-05-09 00:42:33 +00001340 // then there is no need to add other attributes.
Rafael Espindola79278362011-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 Patel89543712011-08-15 17:24:54 +00001346 return SPDie;
Rafael Espindola79278362011-11-10 22:34:29 +00001347 }
Devang Patel89543712011-08-15 17:24:54 +00001348
Eric Christopheracb71152012-08-23 22:52:55 +00001349 // Add the linkage name if we have one.
Michael Gottesmanc89466f2013-09-04 04:39:38 +00001350 StringRef LinkageName = SP.getLinkageName();
1351 if (!LinkageName.empty())
Eric Christopheracb71152012-08-23 22:52:55 +00001352 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c275642013-06-01 17:51:14 +00001353 GlobalValue::getRealLinkageName(LinkageName));
Eric Christopheracb71152012-08-23 22:52:55 +00001354
Devang Patel89543712011-08-15 17:24:54 +00001355 // Constructors and operators for anonymous aggregates do not have names.
1356 if (!SP.getName().empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +00001357 addString(SPDie, dwarf::DW_AT_name, SP.getName());
Devang Patel89543712011-08-15 17:24:54 +00001358
1359 addSourceLine(SPDie, SP);
1360
Eric Christopher5cd2a9d2012-02-22 08:46:21 +00001361 // Add the prototype if we have a prototype and we have a C like
1362 // language.
Eric Christopherbfceb2f2013-08-26 23:50:38 +00001363 uint16_t Language = DICompileUnit(Node).getLanguage();
Eric Christopher5cd2a9d2012-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 Christopherbb69a272012-08-24 01:14:27 +00001368 addFlag(SPDie, dwarf::DW_AT_prototyped);
Devang Patel89543712011-08-15 17:24:54 +00001369
Eric Christopher0df08e22013-08-08 07:40:37 +00001370 // Add Return Type. A void return type will not have a type.
Devang Patel89543712011-08-15 17:24:54 +00001371 DICompositeType SPTy = SP.getType();
David Blaikie5174c842013-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 Patel89543712011-08-15 17:24:54 +00001374
David Blaikie5174c842013-05-22 23:22:18 +00001375 DIArray Args = SPTy.getTypeArray();
Eric Christopher0df08e22013-08-08 07:40:37 +00001376 if (Args.getElement(0))
1377 addType(SPDie, DIType(Args.getElement(0)));
Devang Patel89543712011-08-15 17:24:54 +00001378
1379 unsigned VK = SP.getVirtuality();
1380 if (VK) {
Nick Lewyckycfde1a22011-12-14 00:56:07 +00001381 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
Devang Patel89543712011-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 Renc4ae9b32013-09-07 00:04:05 +00001387 DD->resolve(SP.getContainingType())));
Devang Patel89543712011-08-15 17:24:54 +00001388 }
1389
1390 if (!SP.isDefinition()) {
Eric Christopherbb69a272012-08-24 01:14:27 +00001391 addFlag(SPDie, dwarf::DW_AT_declaration);
Eric Christopher92331fd2012-11-21 00:34:38 +00001392
Devang Patel89543712011-08-15 17:24:54 +00001393 // Add arguments. Do not add arguments for subprogram definition. They will
1394 // be handled while processing variables.
David Blaikie5174c842013-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 Patel89543712011-08-15 17:24:54 +00001403 }
1404
1405 if (SP.isArtificial())
Eric Christopherbb69a272012-08-24 01:14:27 +00001406 addFlag(SPDie, dwarf::DW_AT_artificial);
Devang Patel89543712011-08-15 17:24:54 +00001407
1408 if (!SP.isLocalToUnit())
Eric Christopherbb69a272012-08-24 01:14:27 +00001409 addFlag(SPDie, dwarf::DW_AT_external);
Devang Patel89543712011-08-15 17:24:54 +00001410
1411 if (SP.isOptimized())
Eric Christopherbb69a272012-08-24 01:14:27 +00001412 addFlag(SPDie, dwarf::DW_AT_APPLE_optimized);
Devang Patel89543712011-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 Pateldfd6ec32011-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 Pateldfd6ec32011-08-15 17:57:41 +00001450 // Check for pre-existence.
Devang Patela6576a12011-08-18 22:21:50 +00001451 if (getDIE(N))
Devang Pateldfd6ec32011-08-15 17:57:41 +00001452 return;
1453
Devang Patela6576a12011-08-18 22:21:50 +00001454 DIGlobalVariable GV(N);
Manman Ren7504ed42013-07-08 18:33:29 +00001455 if (!GV.isGlobalVariable())
Devang Patel0ecbcbd2011-08-18 23:17:55 +00001456 return;
1457
Devang Pateldfd6ec32011-08-15 17:57:41 +00001458 DIDescriptor GVContext = GV.getContext();
Eric Christopher4d23a4a2013-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 Rene697d3c2013-02-01 23:54:37 +00001464 bool IsStaticMember = false;
Eric Christopher4d23a4a2013-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 Ren116868e2013-09-09 19:47:11 +00001471 getOrCreateContextDIE(DD->resolve(SDMDecl.getContext()));
Manman Ren8990d7e2013-10-01 19:52:23 +00001472 VariableDIE = DD->getStaticMemberDIE(SDMDecl);
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001473 assert(VariableDIE && "Static member decl has no context?");
Manman Rene697d3c2013-02-01 23:54:37 +00001474 IsStaticMember = true;
Eric Christopher4d23a4a2013-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 Parzyszek228daa62013-02-12 18:00:14 +00001489 if (!GV.isLocalToUnit()) {
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001490 addFlag(VariableDIE, dwarf::DW_AT_external);
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00001491 addGlobalName(GV.getName(), VariableDIE);
1492 }
Eric Christopher4d23a4a2013-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 Pateldfd6ec32011-08-15 17:57:41 +00001500 // Add location.
Eric Christopher4996c702011-11-07 09:24:32 +00001501 bool addToAccelTable = false;
Eric Christopher0a917b72011-11-11 03:16:32 +00001502 DIE *VariableSpecDIE = NULL;
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001503 bool isGlobalVariable = GV.getGlobal() != NULL;
Devang Pateldfd6ec32011-08-15 17:57:41 +00001504 if (isGlobalVariable) {
Eric Christopher4996c702011-11-07 09:24:32 +00001505 addToAccelTable = true;
Devang Pateldfd6ec32011-08-15 17:57:41 +00001506 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
David Blaikief2694972013-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 Weigand2b6fc8d2013-07-02 18:47:09 +00001513 const MCExpr *Expr =
David Blaikie8466ca82013-07-01 23:55:52 +00001514 Asm->getObjFileLowering().getDebugThreadLocalSymbol(Sym);
David Blaikief2694972013-06-28 20:05:11 +00001515 // Based on GCC's support for TLS:
David Blaikie8466ca82013-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 Weigand2b6fc8d2013-07-02 18:47:09 +00001521 addExpr(Block, 0, dwarf::DW_FORM_udata, Expr);
David Blaikie8466ca82013-07-01 23:55:52 +00001522 } else {
1523 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_const_index);
Ulrich Weigand2b6fc8d2013-07-02 18:47:09 +00001524 addUInt(Block, 0, dwarf::DW_FORM_udata, DU->getAddrPoolIndex(Expr));
David Blaikie8466ca82013-07-01 23:55:52 +00001525 }
David Blaikief2694972013-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 Pateldfd6ec32011-08-15 17:57:41 +00001530 // Do not create specification DIE if context is either compile unit
1531 // or a subprogram.
Devang Patel5e6b65c2011-09-21 23:41:11 +00001532 if (GVContext && GV.isDefinition() && !GVContext.isCompileUnit() &&
Manman Ren3eb9dff2013-09-09 19:05:21 +00001533 !GVContext.isFile() && !DD->isSubprogramContext(GVContext)) {
Devang Pateldfd6ec32011-08-15 17:57:41 +00001534 // Create specification DIE.
Eric Christopherc12c2112011-11-11 01:55:22 +00001535 VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
Devang Pateldfd6ec32011-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 Christopher4d23a4a2013-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 Pateldfd6ec32011-08-15 17:57:41 +00001542 addDie(VariableSpecDIE);
1543 } else {
1544 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopher4996c702011-11-07 09:24:32 +00001545 }
Michael Gottesmanc89466f2013-09-04 04:39:38 +00001546 // Add the linkage name.
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001547 StringRef LinkageName = GV.getLinkageName();
Michael Gottesmanc89466f2013-09-04 04:39:38 +00001548 if (!LinkageName.empty())
Eric Christopher3f79b8c2013-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 Ren584e4c02013-02-27 23:21:02 +00001552 addString(IsStaticMember && VariableSpecDIE ?
1553 VariableSpecDIE : VariableDIE, dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c275642013-06-01 17:51:14 +00001554 GlobalValue::getRealLinkageName(LinkageName));
Eric Christopher92331fd2012-11-21 00:34:38 +00001555 } else if (const ConstantInt *CI =
Manman Rene697d3c2013-02-01 23:54:37 +00001556 dyn_cast_or_null<ConstantInt>(GV.getConstant())) {
Adrian Prantl322f41d2013-04-04 22:56:49 +00001557 // AT_const_value was added when the static member was created. To avoid
Manman Rene697d3c2013-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 Ren9a0a6702013-10-01 23:45:54 +00001561 addConstantValue(VariableDIE, CI, isUnsignedDIType(DD, GTy));
Manman Rene697d3c2013-02-01 23:54:37 +00001562 } else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
Eric Christopher4996c702011-11-07 09:24:32 +00001563 addToAccelTable = true;
Devang Pateldfd6ec32011-08-15 17:57:41 +00001564 // GV is a merged global.
1565 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1566 Value *Ptr = CE->getOperand(0);
Eric Christophere9ec2452013-01-18 22:11:33 +00001567 addOpAddress(Block, Asm->Mang->getSymbol(cast<GlobalValue>(Ptr)));
Devang Pateldfd6ec32011-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 Christopher92331fd2012-11-21 00:34:38 +00001570 addUInt(Block, 0, dwarf::DW_FORM_udata,
Micah Villmowcdfe20b2012-10-08 16:38:25 +00001571 Asm->getDataLayout().getIndexedOffset(Ptr->getType(), Idx));
Devang Pateldfd6ec32011-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 Christopherc12c2112011-11-11 01:55:22 +00001576 if (addToAccelTable) {
1577 DIE *AddrDIE = VariableSpecDIE ? VariableSpecDIE : VariableDIE;
1578 addAccelName(GV.getName(), AddrDIE);
Eric Christopher4996c702011-11-07 09:24:32 +00001579
Eric Christopherc12c2112011-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 Pateldfd6ec32011-08-15 17:57:41 +00001585}
1586
Devang Patel0e821f42011-04-12 23:21:44 +00001587/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
Eric Christopherd42b92f2012-05-22 18:45:24 +00001588void CompileUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR,
1589 DIE *IndexTy) {
Devang Patel0e821f42011-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 Patel0e821f42011-04-12 23:21:44 +00001592
Bill Wendling28fe9e72012-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 Wendling3495f9b2012-12-06 07:55:19 +00001600 int64_t DefaultLowerBound = getDefaultLowerBound();
Bill Wendlingd7767122012-12-04 21:34:03 +00001601 int64_t Count = SR.getCount();
Devang Patel0e821f42011-04-12 23:21:44 +00001602
Bill Wendling3495f9b2012-12-06 07:55:19 +00001603 if (DefaultLowerBound == -1 || LowerBound != DefaultLowerBound)
Bill Wendling28fe9e72012-12-06 07:38:10 +00001604 addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, LowerBound);
1605
1606 if (Count != -1 && Count != 0)
Bill Wendlingd7767122012-12-04 21:34:03 +00001607 // FIXME: An unbounded array should reference the expression that defines
1608 // the array.
Bill Wendling28fe9e72012-12-06 07:38:10 +00001609 addUInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, LowerBound + Count - 1);
Bill Wendlingd7767122012-12-04 21:34:03 +00001610
Devang Patel0e821f42011-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 Christopher72a52952013-01-08 01:53:52 +00001618 if (CTy->isVector())
Eric Christopherbb69a272012-08-24 01:14:27 +00001619 addFlag(&Buffer, dwarf::DW_AT_GNU_vector);
Devang Patel0e821f42011-04-12 23:21:44 +00001620
Eric Christopher0df08e22013-08-08 07:40:37 +00001621 // Emit the element type.
Manman Ren9a0a6702013-10-01 23:45:54 +00001622 addType(&Buffer, DD->resolve(CTy->getTypeDerivedFrom()));
Devang Patel0e821f42011-04-12 23:21:44 +00001623
1624 // Get an anonymous type for index type.
Eric Christophercad9b532013-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 Patel0e821f42011-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 Christophercad9b532013-01-04 21:51:53 +00001631 addString(IdxTy, dwarf::DW_AT_name, "int");
Devang Patel0e821f42011-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 Christopher0df08e22013-08-08 07:40:37 +00001640 DIArray Elements = CTy->getTypeArray();
Devang Patel0e821f42011-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 Lewyckyd59c0ca2011-10-27 06:44:11 +00001652 addString(Enumerator, dwarf::DW_AT_name, Name);
Devang Patel0e821f42011-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 Patel89543712011-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 Ren8990d7e2013-10-01 19:52:23 +00001666 DIE *NDie = DD->getTypeDIE(N);
Devang Patel89543712011-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 Patel3acc70e2011-08-15 22:04:40 +00001672/// constructVariableDIE - Construct a DIE for the given DbgVariable.
Eric Christopherbf2d23c2013-06-24 21:07:27 +00001673DIE *CompileUnit::constructVariableDIE(DbgVariable *DV,
1674 bool isScopeAbstract) {
Devang Patel3acc70e2011-08-15 22:04:40 +00001675 StringRef Name = DV->getName();
Devang Patel3acc70e2011-08-15 22:04:40 +00001676
1677 // Translate tag to proper Dwarf tag.
Eric Christopher31b05762013-08-08 01:41:00 +00001678 uint16_t Tag = DV->getTag();
Devang Patel3acc70e2011-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 Ren4213c392013-05-29 17:16:59 +00001684 if (AbsDIE)
Devang Patel3acc70e2011-08-15 22:04:40 +00001685 addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
Manman Ren4213c392013-05-29 17:16:59 +00001686 dwarf::DW_FORM_ref4, AbsDIE);
Devang Patel3acc70e2011-08-15 22:04:40 +00001687 else {
David Blaikie715528b2013-08-19 03:34:03 +00001688 if (!Name.empty())
1689 addString(VariableDie, dwarf::DW_AT_name, Name);
Devang Patel3acc70e2011-08-15 22:04:40 +00001690 addSourceLine(VariableDie, DV->getVariable());
1691 addType(VariableDie, DV->getType());
1692 }
1693
1694 if (DV->isArtificial())
Eric Christopherbb69a272012-08-24 01:14:27 +00001695 addFlag(VariableDie, dwarf::DW_AT_artificial);
Devang Patel3acc70e2011-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 Christopher40b6bf62013-06-24 21:34:55 +00001706 addLabel(VariableDie, dwarf::DW_AT_location, dwarf::DW_FORM_data4,
1707 Asm->GetTempSymbol("debug_loc", Offset));
Devang Patel3acc70e2011-08-15 22:04:40 +00001708 DV->setDIE(VariableDie);
1709 return VariableDie;
1710 }
1711
Eric Christophercead0332011-10-03 15:49:20 +00001712 // Check if variable is described by a DBG_VALUE instruction.
Devang Patel3acc70e2011-08-15 22:04:40 +00001713 if (const MachineInstr *DVInsn = DV->getMInsn()) {
David Blaikie0252265b2013-06-16 20:34:15 +00001714 assert(DVInsn->getNumOperands() == 3);
1715 if (DVInsn->getOperand(0).isReg()) {
1716 const MachineOperand RegOp = DVInsn->getOperand(0);
Adrian Prantl19942882013-07-09 21:44:06 +00001717 // If the second operand is an immediate, this is an indirect value.
Adrian Prantl418d1d12013-07-09 20:28:37 +00001718 if (DVInsn->getOperand(1).isImm()) {
1719 MachineLocation Location(RegOp.getReg(), DVInsn->getOperand(1).getImm());
Eric Christopherbf2d23c2013-06-24 21:07:27 +00001720 addVariableAddress(*DV, VariableDie, Location);
David Blaikie0252265b2013-06-16 20:34:15 +00001721 } else if (RegOp.getReg())
Eric Christopherbf2d23c2013-06-24 21:07:27 +00001722 addVariableAddress(*DV, VariableDie, MachineLocation(RegOp.getReg()));
David Blaikie0252265b2013-06-16 20:34:15 +00001723 } else if (DVInsn->getOperand(0).isImm())
Eric Christopher78fcf4902013-07-03 01:08:30 +00001724 addConstantValue(VariableDie, DVInsn->getOperand(0), DV->getType());
David Blaikie0252265b2013-06-16 20:34:15 +00001725 else if (DVInsn->getOperand(0).isFPImm())
Eric Christopher78fcf4902013-07-03 01:08:30 +00001726 addConstantFPValue(VariableDie, DVInsn->getOperand(0));
David Blaikie0252265b2013-06-16 20:34:15 +00001727 else if (DVInsn->getOperand(0).isCImm())
Eric Christopher78fcf4902013-07-03 01:08:30 +00001728 addConstantValue(VariableDie, DVInsn->getOperand(0).getCImm(),
Manman Ren9a0a6702013-10-01 23:45:54 +00001729 isUnsignedDIType(DD, DV->getType()));
Eric Christopher78fcf4902013-07-03 01:08:30 +00001730
Devang Patel3acc70e2011-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 Christopher92331fd2012-11-21 00:34:38 +00001739 int Offset =
Devang Patel3acc70e2011-08-15 22:04:40 +00001740 TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
1741 MachineLocation Location(FrameReg, Offset);
Eric Christopherbf2d23c2013-06-24 21:07:27 +00001742 addVariableAddress(*DV, VariableDie, Location);
Devang Patel3acc70e2011-08-15 22:04:40 +00001743 }
1744 }
1745
1746 DV->setDIE(VariableDie);
1747 return VariableDie;
1748}
1749
Devang Patel0e821f42011-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 Lewyckyd59c0ca2011-10-27 06:44:11 +00001755 addString(MemberDie, dwarf::DW_AT_name, Name);
Devang Patel0e821f42011-04-12 23:21:44 +00001756
Manman Ren9a0a6702013-10-01 23:45:54 +00001757 addType(MemberDie, DD->resolve(DT.getTypeDerivedFrom()));
Devang Patel0e821f42011-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 Ren9a0a6702013-10-01 23:45:54 +00001765 uint64_t FieldSize = getOriginalTypeSize(DD, DT);
Devang Patel0e821f42011-04-12 23:21:44 +00001766
1767 if (Size != FieldSize) {
1768 // Handle bitfield.
Manman Ren9a0a6702013-10-01 23:45:54 +00001769 addUInt(MemberDie, dwarf::DW_AT_byte_size, 0,
1770 getOriginalTypeSize(DD, DT)>>3);
Devang Patel0e821f42011-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 Villmowcdfe20b2012-10-08 16:38:25 +00001780 if (Asm->getDataLayout().isLittleEndian())
Devang Patel0e821f42011-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 Lewyckycb918492011-12-13 05:09:11 +00001814 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001815 dwarf::DW_ACCESS_protected);
1816 else if (DT.isPrivate())
Nick Lewyckycb918492011-12-13 05:09:11 +00001817 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001818 dwarf::DW_ACCESS_private);
1819 // Otherwise C++ member and base classes are considered public.
Eric Christopher92331fd2012-11-21 00:34:38 +00001820 else
Nick Lewyckycb918492011-12-13 05:09:11 +00001821 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001822 dwarf::DW_ACCESS_public);
1823 if (DT.isVirtual())
Nick Lewyckycfde1a22011-12-14 00:56:07 +00001824 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001825 dwarf::DW_VIRTUALITY_virtual);
Devang Patel514b4002011-04-16 00:11:51 +00001826
1827 // Objective-C properties.
Devang Patel44882172012-02-06 17:49:43 +00001828 if (MDNode *PNode = DT.getObjCProperty())
1829 if (DIEEntry *PropertyDie = getDIEEntry(PNode))
Eric Christopher92331fd2012-11-21 00:34:38 +00001830 MemberDie->addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4,
Devang Patel44882172012-02-06 17:49:43 +00001831 PropertyDie);
1832
David Blaikie37fefc32012-12-13 22:43:07 +00001833 if (DT.isArtificial())
1834 addFlag(MemberDie, dwarf::DW_AT_artificial);
1835
Devang Patel0e821f42011-04-12 23:21:44 +00001836 return MemberDie;
1837}
Eric Christopher4d23a4a2013-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 Ren9a0a6702013-10-01 23:45:54 +00001845 DIType Ty = DD->resolve(DT.getTypeDerivedFrom());
Eric Christopher4d23a4a2013-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 Ren9a0a6702013-10-01 23:45:54 +00001866 addConstantValue(StaticMemberDIE, CI, isUnsignedDIType(DD, Ty));
David Blaikiea39a76e2013-01-20 01:18:01 +00001867 if (const ConstantFP *CFP = dyn_cast_or_null<ConstantFP>(DT.getConstant()))
1868 addConstantFPValue(StaticMemberDIE, CFP);
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001869
Manman Ren8990d7e2013-10-01 19:52:23 +00001870 DD->insertStaticMemberDIE(DT, StaticMemberDIE);
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001871 return StaticMemberDIE;
1872}