blob: 732db20943edda2f5d310fa6122b03fe1b91a3d2 [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"
Devang Pateldfd6ec32011-08-15 17:57:41 +000025#include "llvm/Target/Mangler.h"
Devang Patel0e821f42011-04-12 23:21:44 +000026#include "llvm/Target/TargetFrameLowering.h"
27#include "llvm/Target/TargetMachine.h"
David Blaikief2694972013-06-28 20:05:11 +000028#include "llvm/Target/TargetLoweringObjectFile.h"
Devang Patel0e821f42011-04-12 23:21:44 +000029#include "llvm/Target/TargetRegisterInfo.h"
Devang Patel0e821f42011-04-12 23:21:44 +000030
31using namespace llvm;
32
33/// CompileUnit - Compile unit constructor.
Eric Christopherbfceb2f2013-08-26 23:50:38 +000034CompileUnit::CompileUnit(unsigned UID, DIE *D, const MDNode *N, AsmPrinter *A,
35 DwarfDebug *DW, DwarfUnits *DWU)
Eric Christopherc19d6f02013-10-04 19:40:33 +000036 : UniqueID(UID), Node(N), CUDie(D), Asm(A), DD(DW), DU(DWU), IndexTyDie(0) {
Devang Patel0e821f42011-04-12 23:21:44 +000037 DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
Eric Christopherc57baee2013-05-08 00:58:51 +000038 insertDIE(N, D);
Devang Patel0e821f42011-04-12 23:21:44 +000039}
40
41/// ~CompileUnit - Destructor for compile unit.
42CompileUnit::~CompileUnit() {
43 for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
44 DIEBlocks[j]->~DIEBlock();
45}
46
47/// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
48/// information entry.
49DIEEntry *CompileUnit::createDIEEntry(DIE *Entry) {
50 DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
51 return Value;
52}
53
Bill Wendling3495f9b2012-12-06 07:55:19 +000054/// getDefaultLowerBound - Return the default lower bound for an array. If the
Bill Wendling28fe9e72012-12-06 07:38:10 +000055/// DWARF version doesn't handle the language, return -1.
Bill Wendling3495f9b2012-12-06 07:55:19 +000056int64_t CompileUnit::getDefaultLowerBound() const {
Eric Christopherbfceb2f2013-08-26 23:50:38 +000057 switch (DICompileUnit(Node).getLanguage()) {
Bill Wendling28fe9e72012-12-06 07:38:10 +000058 default:
59 break;
60
61 case dwarf::DW_LANG_C89:
62 case dwarf::DW_LANG_C99:
63 case dwarf::DW_LANG_C:
64 case dwarf::DW_LANG_C_plus_plus:
65 case dwarf::DW_LANG_ObjC:
66 case dwarf::DW_LANG_ObjC_plus_plus:
67 return 0;
68
69 case dwarf::DW_LANG_Fortran77:
70 case dwarf::DW_LANG_Fortran90:
71 case dwarf::DW_LANG_Fortran95:
72 return 1;
73
74 // The languages below have valid values only if the DWARF version >= 4.
75 case dwarf::DW_LANG_Java:
76 case dwarf::DW_LANG_Python:
77 case dwarf::DW_LANG_UPC:
78 case dwarf::DW_LANG_D:
79 if (dwarf::DWARF_VERSION >= 4)
80 return 0;
81 break;
82
83 case dwarf::DW_LANG_Ada83:
84 case dwarf::DW_LANG_Ada95:
85 case dwarf::DW_LANG_Cobol74:
86 case dwarf::DW_LANG_Cobol85:
87 case dwarf::DW_LANG_Modula2:
88 case dwarf::DW_LANG_Pascal83:
89 case dwarf::DW_LANG_PLI:
90 if (dwarf::DWARF_VERSION >= 4)
91 return 1;
92 break;
93 }
94
95 return -1;
96}
97
Eric Christopherbb69a272012-08-24 01:14:27 +000098/// addFlag - Add a flag that is true.
Eric Christopher31b05762013-08-08 01:41:00 +000099void CompileUnit::addFlag(DIE *Die, uint16_t Attribute) {
Michael Gottesmanc89466f2013-09-04 04:39:38 +0000100 if (DD->getDwarfVersion() >= 4)
Eric Christopherdccd3282013-10-04 22:40:05 +0000101 Die->addValue(Attribute, dwarf::DW_FORM_flag_present, DIEIntegerOne);
Eric Christopherbb69a272012-08-24 01:14:27 +0000102 else
Eric Christopherdccd3282013-10-04 22:40:05 +0000103 Die->addValue(Attribute, dwarf::DW_FORM_flag, DIEIntegerOne);
Eric Christopherbb69a272012-08-24 01:14:27 +0000104}
105
Devang Patel0e821f42011-04-12 23:21:44 +0000106/// addUInt - Add an unsigned integer attribute data and value.
107///
Eric Christopher31b05762013-08-08 01:41:00 +0000108void CompileUnit::addUInt(DIE *Die, uint16_t Attribute,
109 uint16_t Form, uint64_t Integer) {
Devang Patel0e821f42011-04-12 23:21:44 +0000110 if (!Form) Form = DIEInteger::BestForm(false, Integer);
111 DIEValue *Value = Integer == 1 ?
112 DIEIntegerOne : new (DIEValueAllocator) DIEInteger(Integer);
113 Die->addValue(Attribute, Form, Value);
114}
115
116/// addSInt - Add an signed integer attribute data and value.
117///
Eric Christopher31b05762013-08-08 01:41:00 +0000118void CompileUnit::addSInt(DIE *Die, uint16_t Attribute,
119 uint16_t Form, int64_t Integer) {
Devang Patel0e821f42011-04-12 23:21:44 +0000120 if (!Form) Form = DIEInteger::BestForm(true, Integer);
121 DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
122 Die->addValue(Attribute, Form, Value);
123}
124
Nick Lewyckycc64ae12011-10-28 05:29:47 +0000125/// addString - Add a string attribute data and value. We always emit a
126/// reference to the string pool instead of immediate strings so that DIEs have
Eric Christopherfba22602013-01-07 19:32:45 +0000127/// more predictable sizes. In the case of split dwarf we emit an index
128/// into another table which gets us the static offset into the string
129/// table.
Eric Christopher31b05762013-08-08 01:41:00 +0000130void CompileUnit::addString(DIE *Die, uint16_t Attribute, StringRef String) {
Eric Christopher67646432013-07-26 17:02:41 +0000131 DIEValue *Value;
Eric Christopher31b05762013-08-08 01:41:00 +0000132 uint16_t Form;
Eric Christopher2cbd5762013-01-07 19:32:41 +0000133 if (!DD->useSplitDwarf()) {
134 MCSymbol *Symb = DU->getStringPoolEntry(String);
Eric Christopher2cbd5762013-01-07 19:32:41 +0000135 if (Asm->needsRelocationsForDwarfStringPool())
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000136 Value = new (DIEValueAllocator) DIELabel(Symb);
Eric Christopher2cbd5762013-01-07 19:32:41 +0000137 else {
138 MCSymbol *StringPool = DU->getStringPoolSym();
139 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
140 }
Eric Christopher67646432013-07-26 17:02:41 +0000141 Form = dwarf::DW_FORM_strp;
Eric Christopher2cbd5762013-01-07 19:32:41 +0000142 } else {
143 unsigned idx = DU->getStringPoolIndex(String);
Eric Christopher67646432013-07-26 17:02:41 +0000144 Value = new (DIEValueAllocator) DIEInteger(idx);
145 Form = dwarf::DW_FORM_GNU_str_index;
Eric Christopher2cbd5762013-01-07 19:32:41 +0000146 }
Eric Christopher67646432013-07-26 17:02:41 +0000147 DIEValue *Str = new (DIEValueAllocator) DIEString(Value, String);
148 Die->addValue(Attribute, Form, Str);
Eric Christopher2cbd5762013-01-07 19:32:41 +0000149}
150
151/// addLocalString - Add a string attribute data and value. This is guaranteed
152/// to be in the local string pool instead of indirected.
Eric Christopher31b05762013-08-08 01:41:00 +0000153void CompileUnit::addLocalString(DIE *Die, uint16_t Attribute,
Eric Christopher2cbd5762013-01-07 19:32:41 +0000154 StringRef String) {
Eric Christophere698f532012-12-20 21:58:36 +0000155 MCSymbol *Symb = DU->getStringPoolEntry(String);
Nick Lewyckycc64ae12011-10-28 05:29:47 +0000156 DIEValue *Value;
157 if (Asm->needsRelocationsForDwarfStringPool())
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000158 Value = new (DIEValueAllocator) DIELabel(Symb);
Nick Lewyckycc64ae12011-10-28 05:29:47 +0000159 else {
Eric Christophere698f532012-12-20 21:58:36 +0000160 MCSymbol *StringPool = DU->getStringPoolSym();
Nick Lewyckycc64ae12011-10-28 05:29:47 +0000161 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +0000162 }
Nick Lewyckycc64ae12011-10-28 05:29:47 +0000163 Die->addValue(Attribute, dwarf::DW_FORM_strp, Value);
Devang Patel0e821f42011-04-12 23:21:44 +0000164}
165
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000166/// addExpr - Add a Dwarf expression attribute data and value.
Devang Patel0e821f42011-04-12 23:21:44 +0000167///
Eric Christopher31b05762013-08-08 01:41:00 +0000168void CompileUnit::addExpr(DIE *Die, uint16_t Attribute, uint16_t Form,
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000169 const MCExpr *Expr) {
170 DIEValue *Value = new (DIEValueAllocator) DIEExpr(Expr);
Devang Patel0e821f42011-04-12 23:21:44 +0000171 Die->addValue(Attribute, Form, Value);
172}
173
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000174/// addLabel - Add a Dwarf label attribute data and value.
175///
Eric Christopher31b05762013-08-08 01:41:00 +0000176void CompileUnit::addLabel(DIE *Die, uint16_t Attribute, uint16_t Form,
David Blaikief3cd7c52013-06-28 20:05:04 +0000177 const MCSymbol *Label) {
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000178 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
179 Die->addValue(Attribute, Form, Value);
David Blaikief3cd7c52013-06-28 20:05:04 +0000180}
181
Eric Christopher962c9082013-01-15 23:56:56 +0000182/// addLabelAddress - Add a dwarf label attribute data and value using
183/// DW_FORM_addr or DW_FORM_GNU_addr_index.
184///
Eric Christopher31b05762013-08-08 01:41:00 +0000185void CompileUnit::addLabelAddress(DIE *Die, uint16_t Attribute,
Eric Christopher962c9082013-01-15 23:56:56 +0000186 MCSymbol *Label) {
Alexey Samsonov4436bf02013-10-03 08:54:43 +0000187 if (Label)
188 DD->addArangeLabel(SymbolCU(this, Label));
Richard Mitton21101b32013-09-19 23:21:01 +0000189
Eric Christopher962c9082013-01-15 23:56:56 +0000190 if (!DD->useSplitDwarf()) {
191 if (Label != NULL) {
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000192 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
Eric Christopher962c9082013-01-15 23:56:56 +0000193 Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
194 } else {
195 DIEValue *Value = new (DIEValueAllocator) DIEInteger(0);
196 Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
197 }
198 } else {
199 unsigned idx = DU->getAddrPoolIndex(Label);
200 DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx);
201 Die->addValue(Attribute, dwarf::DW_FORM_GNU_addr_index, Value);
202 }
203}
204
Eric Christophere9ec2452013-01-18 22:11:33 +0000205/// addOpAddress - Add a dwarf op address data and value using the
206/// form given and an op of either DW_FORM_addr or DW_FORM_GNU_addr_index.
207///
David Blaikief3cd7c52013-06-28 20:05:04 +0000208void CompileUnit::addOpAddress(DIE *Die, const MCSymbol *Sym) {
Alexey Samsonov4436bf02013-10-03 08:54:43 +0000209 DD->addArangeLabel(SymbolCU(this, Sym));
Eric Christophere9ec2452013-01-18 22:11:33 +0000210 if (!DD->useSplitDwarf()) {
211 addUInt(Die, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
212 addLabel(Die, 0, dwarf::DW_FORM_udata, Sym);
213 } else {
Eric Christophere9ec2452013-01-18 22:11:33 +0000214 addUInt(Die, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_addr_index);
David Blaikie8466ca82013-07-01 23:55:52 +0000215 addUInt(Die, 0, dwarf::DW_FORM_GNU_addr_index, DU->getAddrPoolIndex(Sym));
Eric Christophere9ec2452013-01-18 22:11:33 +0000216 }
217}
218
Devang Patel0e821f42011-04-12 23:21:44 +0000219/// addDelta - Add a label delta attribute data and value.
220///
Eric Christopher31b05762013-08-08 01:41:00 +0000221void CompileUnit::addDelta(DIE *Die, uint16_t Attribute, uint16_t Form,
Devang Patel0e821f42011-04-12 23:21:44 +0000222 const MCSymbol *Hi, const MCSymbol *Lo) {
223 DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
224 Die->addValue(Attribute, Form, Value);
225}
226
227/// addDIEEntry - Add a DIE attribute data and value.
228///
Manman Ren4c4b69c2013-10-11 23:58:05 +0000229void CompileUnit::addDIEEntry(DIE *Die, uint16_t Attribute, DIE *Entry) {
230 // We currently only use ref4.
231 Die->addValue(Attribute, dwarf::DW_FORM_ref4, createDIEEntry(Entry));
Devang Patel0e821f42011-04-12 23:21:44 +0000232}
233
Devang Patel0e821f42011-04-12 23:21:44 +0000234/// addBlock - Add block data.
235///
Eric Christopher31b05762013-08-08 01:41:00 +0000236void CompileUnit::addBlock(DIE *Die, uint16_t Attribute, uint16_t Form,
Devang Patel0e821f42011-04-12 23:21:44 +0000237 DIEBlock *Block) {
238 Block->ComputeSize(Asm);
239 DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
240 Die->addValue(Attribute, Block->BestForm(), Block);
241}
242
243/// addSourceLine - Add location information to specified debug information
244/// entry.
245void CompileUnit::addSourceLine(DIE *Die, DIVariable V) {
246 // Verify variable.
Manman Ren7504ed42013-07-08 18:33:29 +0000247 if (!V.isVariable())
Devang Patel0e821f42011-04-12 23:21:44 +0000248 return;
Eric Christopher92331fd2012-11-21 00:34:38 +0000249
Devang Patel0e821f42011-04-12 23:21:44 +0000250 unsigned Line = V.getLineNumber();
251 if (Line == 0)
252 return;
Eric Christopher7b30f2e42012-11-21 00:34:35 +0000253 unsigned FileID = DD->getOrCreateSourceID(V.getContext().getFilename(),
Manman Ren1e427202013-03-07 01:42:00 +0000254 V.getContext().getDirectory(),
255 getUniqueID());
Devang Patel0e821f42011-04-12 23:21:44 +0000256 assert(FileID && "Invalid file id");
257 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
258 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
259}
260
261/// addSourceLine - Add location information to specified debug information
262/// entry.
263void CompileUnit::addSourceLine(DIE *Die, DIGlobalVariable G) {
264 // Verify global variable.
Manman Ren7504ed42013-07-08 18:33:29 +0000265 if (!G.isGlobalVariable())
Devang Patel0e821f42011-04-12 23:21:44 +0000266 return;
267
268 unsigned Line = G.getLineNumber();
269 if (Line == 0)
270 return;
Manman Ren1e427202013-03-07 01:42:00 +0000271 unsigned FileID = DD->getOrCreateSourceID(G.getFilename(), G.getDirectory(),
272 getUniqueID());
Devang Patel0e821f42011-04-12 23:21:44 +0000273 assert(FileID && "Invalid file id");
274 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
275 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
276}
277
278/// addSourceLine - Add location information to specified debug information
279/// entry.
280void CompileUnit::addSourceLine(DIE *Die, DISubprogram SP) {
281 // Verify subprogram.
Manman Ren7504ed42013-07-08 18:33:29 +0000282 if (!SP.isSubprogram())
Devang Patel0e821f42011-04-12 23:21:44 +0000283 return;
Eric Christopher7734ca22012-03-15 23:55:40 +0000284
Devang Patel0e821f42011-04-12 23:21:44 +0000285 // If the line number is 0, don't add it.
Eric Christopher7734ca22012-03-15 23:55:40 +0000286 unsigned Line = SP.getLineNumber();
287 if (Line == 0)
Devang Patel0e821f42011-04-12 23:21:44 +0000288 return;
289
Eric Christopher7b30f2e42012-11-21 00:34:35 +0000290 unsigned FileID = DD->getOrCreateSourceID(SP.getFilename(),
Manman Ren1e427202013-03-07 01:42:00 +0000291 SP.getDirectory(), getUniqueID());
Devang Patel0e821f42011-04-12 23:21:44 +0000292 assert(FileID && "Invalid file id");
293 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
294 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
295}
296
297/// addSourceLine - Add location information to specified debug information
298/// entry.
299void CompileUnit::addSourceLine(DIE *Die, DIType Ty) {
300 // Verify type.
Manman Ren7504ed42013-07-08 18:33:29 +0000301 if (!Ty.isType())
Devang Patel0e821f42011-04-12 23:21:44 +0000302 return;
303
304 unsigned Line = Ty.getLineNumber();
Eric Christopher7734ca22012-03-15 23:55:40 +0000305 if (Line == 0)
Devang Patel0e821f42011-04-12 23:21:44 +0000306 return;
Eric Christopher7b30f2e42012-11-21 00:34:35 +0000307 unsigned FileID = DD->getOrCreateSourceID(Ty.getFilename(),
Manman Ren1e427202013-03-07 01:42:00 +0000308 Ty.getDirectory(), getUniqueID());
Devang Patel0e821f42011-04-12 23:21:44 +0000309 assert(FileID && "Invalid file id");
310 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
311 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
312}
313
314/// addSourceLine - Add location information to specified debug information
315/// entry.
Eric Christopher70e1bd82012-03-29 08:42:56 +0000316void CompileUnit::addSourceLine(DIE *Die, DIObjCProperty Ty) {
317 // Verify type.
Manman Ren7504ed42013-07-08 18:33:29 +0000318 if (!Ty.isObjCProperty())
Eric Christopher70e1bd82012-03-29 08:42:56 +0000319 return;
320
321 unsigned Line = Ty.getLineNumber();
322 if (Line == 0)
323 return;
324 DIFile File = Ty.getFile();
Eric Christopher7b30f2e42012-11-21 00:34:35 +0000325 unsigned FileID = DD->getOrCreateSourceID(File.getFilename(),
Manman Ren1e427202013-03-07 01:42:00 +0000326 File.getDirectory(), getUniqueID());
Eric Christopher70e1bd82012-03-29 08:42:56 +0000327 assert(FileID && "Invalid file id");
328 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
329 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
330}
331
332/// addSourceLine - Add location information to specified debug information
333/// entry.
Devang Patel0e821f42011-04-12 23:21:44 +0000334void CompileUnit::addSourceLine(DIE *Die, DINameSpace NS) {
335 // Verify namespace.
336 if (!NS.Verify())
337 return;
338
339 unsigned Line = NS.getLineNumber();
340 if (Line == 0)
341 return;
342 StringRef FN = NS.getFilename();
343
Manman Ren1e427202013-03-07 01:42:00 +0000344 unsigned FileID = DD->getOrCreateSourceID(FN, NS.getDirectory(),
345 getUniqueID());
Devang Patel0e821f42011-04-12 23:21:44 +0000346 assert(FileID && "Invalid file id");
347 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
348 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
349}
350
Eric Christopher92331fd2012-11-21 00:34:38 +0000351/// addVariableAddress - Add DW_AT_location attribute for a
Devang Patel77dc5412011-04-27 22:45:24 +0000352/// DbgVariable based on provided MachineLocation.
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000353void CompileUnit::addVariableAddress(const DbgVariable &DV, DIE *Die,
Devang Patel77dc5412011-04-27 22:45:24 +0000354 MachineLocation Location) {
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000355 if (DV.variableHasComplexAddress())
Devang Patel0e821f42011-04-12 23:21:44 +0000356 addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000357 else if (DV.isBlockByrefVariable())
Devang Patel0e821f42011-04-12 23:21:44 +0000358 addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location);
359 else
David Blaikieea2605d2013-06-20 00:25:24 +0000360 addAddress(Die, dwarf::DW_AT_location, Location,
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000361 DV.getVariable().isIndirect());
Devang Patel0e821f42011-04-12 23:21:44 +0000362}
363
Devang Patelba5fbf12011-04-26 19:06:18 +0000364/// addRegisterOp - Add register operand.
365void CompileUnit::addRegisterOp(DIE *TheDie, unsigned Reg) {
366 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
367 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
368 if (DWReg < 32)
369 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + DWReg);
370 else {
371 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
372 addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
373 }
374}
375
376/// addRegisterOffset - Add register offset.
377void CompileUnit::addRegisterOffset(DIE *TheDie, unsigned Reg,
378 int64_t Offset) {
379 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
380 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
381 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
382 if (Reg == TRI->getFrameRegister(*Asm->MF))
383 // If variable offset is based in frame register then use fbreg.
384 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
385 else if (DWReg < 32)
386 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DWReg);
387 else {
388 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
389 addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
390 }
391 addSInt(TheDie, 0, dwarf::DW_FORM_sdata, Offset);
392}
393
394/// addAddress - Add an address attribute to a die based on the location
395/// provided.
Eric Christopher31b05762013-08-08 01:41:00 +0000396void CompileUnit::addAddress(DIE *Die, uint16_t Attribute,
David Blaikieea2605d2013-06-20 00:25:24 +0000397 const MachineLocation &Location, bool Indirect) {
Devang Patelba5fbf12011-04-26 19:06:18 +0000398 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
399
David Blaikieea2605d2013-06-20 00:25:24 +0000400 if (Location.isReg() && !Indirect)
Devang Patelba5fbf12011-04-26 19:06:18 +0000401 addRegisterOp(Block, Location.getReg());
David Blaikieea2605d2013-06-20 00:25:24 +0000402 else {
Devang Patelba5fbf12011-04-26 19:06:18 +0000403 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
David Blaikieea2605d2013-06-20 00:25:24 +0000404 if (Indirect && !Location.isReg()) {
405 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
406 }
407 }
Devang Patelba5fbf12011-04-26 19:06:18 +0000408
409 // Now attach the location information to the DIE.
410 addBlock(Die, Attribute, 0, Block);
411}
412
Devang Patel0e821f42011-04-12 23:21:44 +0000413/// addComplexAddress - Start with the address based on the location provided,
414/// and generate the DWARF information necessary to find the actual variable
415/// given the extra address information encoded in the DIVariable, starting from
416/// the starting location. Add the DWARF information to the die.
417///
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000418void CompileUnit::addComplexAddress(const DbgVariable &DV, DIE *Die,
Eric Christopher31b05762013-08-08 01:41:00 +0000419 uint16_t Attribute,
Devang Patel0e821f42011-04-12 23:21:44 +0000420 const MachineLocation &Location) {
Devang Patel0e821f42011-04-12 23:21:44 +0000421 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000422 unsigned N = DV.getNumAddrElements();
Devang Patel3e021532011-04-28 02:22:40 +0000423 unsigned i = 0;
424 if (Location.isReg()) {
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000425 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
Devang Patel3e021532011-04-28 02:22:40 +0000426 // If first address element is OpPlus then emit
427 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000428 addRegisterOffset(Block, Location.getReg(), DV.getAddrElement(1));
Devang Patel3e021532011-04-28 02:22:40 +0000429 i = 2;
430 } else
431 addRegisterOp(Block, Location.getReg());
432 }
Devang Patelba5fbf12011-04-26 19:06:18 +0000433 else
434 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel0e821f42011-04-12 23:21:44 +0000435
Devang Patel3e021532011-04-28 02:22:40 +0000436 for (;i < N; ++i) {
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000437 uint64_t Element = DV.getAddrElement(i);
Devang Patel0e821f42011-04-12 23:21:44 +0000438 if (Element == DIBuilder::OpPlus) {
439 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000440 addUInt(Block, 0, dwarf::DW_FORM_udata, DV.getAddrElement(++i));
Devang Patel0e821f42011-04-12 23:21:44 +0000441 } else if (Element == DIBuilder::OpDeref) {
Eric Christopher4d250522012-05-08 18:56:00 +0000442 if (!Location.isReg())
443 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Devang Patel0e821f42011-04-12 23:21:44 +0000444 } else llvm_unreachable("unknown DIBuilder Opcode");
445 }
446
447 // Now attach the location information to the DIE.
448 addBlock(Die, Attribute, 0, Block);
449}
450
451/* Byref variables, in Blocks, are declared by the programmer as "SomeType
452 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
453 gives the variable VarName either the struct, or a pointer to the struct, as
454 its type. This is necessary for various behind-the-scenes things the
455 compiler needs to do with by-reference variables in Blocks.
456
457 However, as far as the original *programmer* is concerned, the variable
458 should still have type 'SomeType', as originally declared.
459
460 The function getBlockByrefType dives into the __Block_byref_x_VarName
461 struct to find the original type of the variable, which is then assigned to
462 the variable's Debug Information Entry as its real type. So far, so good.
463 However now the debugger will expect the variable VarName to have the type
464 SomeType. So we need the location attribute for the variable to be an
465 expression that explains to the debugger how to navigate through the
466 pointers and struct to find the actual variable of type SomeType.
467
468 The following function does just that. We start by getting
469 the "normal" location for the variable. This will be the location
470 of either the struct __Block_byref_x_VarName or the pointer to the
471 struct __Block_byref_x_VarName.
472
473 The struct will look something like:
474
475 struct __Block_byref_x_VarName {
476 ... <various fields>
477 struct __Block_byref_x_VarName *forwarding;
478 ... <various other fields>
479 SomeType VarName;
480 ... <maybe more fields>
481 };
482
483 If we are given the struct directly (as our starting point) we
484 need to tell the debugger to:
485
486 1). Add the offset of the forwarding field.
487
488 2). Follow that pointer to get the real __Block_byref_x_VarName
489 struct to use (the real one may have been copied onto the heap).
490
491 3). Add the offset for the field VarName, to find the actual variable.
492
493 If we started with a pointer to the struct, then we need to
494 dereference that pointer first, before the other steps.
495 Translating this into DWARF ops, we will need to append the following
496 to the current location description for the variable:
497
498 DW_OP_deref -- optional, if we start with a pointer
499 DW_OP_plus_uconst <forward_fld_offset>
500 DW_OP_deref
501 DW_OP_plus_uconst <varName_fld_offset>
502
503 That is what this function does. */
504
505/// addBlockByrefAddress - Start with the address based on the location
506/// provided, and generate the DWARF information necessary to find the
507/// actual Block variable (navigating the Block struct) based on the
508/// starting location. Add the DWARF information to the die. For
509/// more information, read large comment just above here.
510///
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000511void CompileUnit::addBlockByrefAddress(const DbgVariable &DV, DIE *Die,
Eric Christopher31b05762013-08-08 01:41:00 +0000512 uint16_t Attribute,
Devang Patel0e821f42011-04-12 23:21:44 +0000513 const MachineLocation &Location) {
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000514 DIType Ty = DV.getType();
Devang Patel0e821f42011-04-12 23:21:44 +0000515 DIType TmpTy = Ty;
Eric Christopher31b05762013-08-08 01:41:00 +0000516 uint16_t Tag = Ty.getTag();
Devang Patel0e821f42011-04-12 23:21:44 +0000517 bool isPointer = false;
518
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000519 StringRef varName = DV.getName();
Devang Patel0e821f42011-04-12 23:21:44 +0000520
521 if (Tag == dwarf::DW_TAG_pointer_type) {
522 DIDerivedType DTy = DIDerivedType(Ty);
Manman Ren93b30902013-10-08 18:42:58 +0000523 TmpTy = resolve(DTy.getTypeDerivedFrom());
Devang Patel0e821f42011-04-12 23:21:44 +0000524 isPointer = true;
525 }
526
527 DICompositeType blockStruct = DICompositeType(TmpTy);
528
529 // Find the __forwarding field and the variable field in the __Block_byref
530 // struct.
531 DIArray Fields = blockStruct.getTypeArray();
532 DIDescriptor varField = DIDescriptor();
533 DIDescriptor forwardingField = DIDescriptor();
534
535 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
536 DIDescriptor Element = Fields.getElement(i);
537 DIDerivedType DT = DIDerivedType(Element);
538 StringRef fieldName = DT.getName();
539 if (fieldName == "__forwarding")
540 forwardingField = Element;
541 else if (fieldName == varName)
542 varField = Element;
543 }
544
545 // Get the offsets for the forwarding field and the variable field.
546 unsigned forwardingFieldOffset =
547 DIDerivedType(forwardingField).getOffsetInBits() >> 3;
548 unsigned varFieldOffset =
549 DIDerivedType(varField).getOffsetInBits() >> 3;
550
551 // Decode the original location, and use that as the start of the byref
552 // variable's location.
Devang Patel0e821f42011-04-12 23:21:44 +0000553 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
554
Eric Christopheref9d7102012-07-04 02:02:18 +0000555 if (Location.isReg())
556 addRegisterOp(Block, Location.getReg());
557 else
558 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel0e821f42011-04-12 23:21:44 +0000559
560 // If we started with a pointer to the __Block_byref... struct, then
561 // the first thing we need to do is dereference the pointer (DW_OP_deref).
562 if (isPointer)
563 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
564
565 // Next add the offset for the '__forwarding' field:
566 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
567 // adding the offset if it's 0.
568 if (forwardingFieldOffset > 0) {
569 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
570 addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
571 }
572
573 // Now dereference the __forwarding field to get to the real __Block_byref
574 // struct: DW_OP_deref.
575 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
576
577 // Now that we've got the real __Block_byref... struct, add the offset
578 // for the variable's field to get to the location of the actual variable:
579 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
580 if (varFieldOffset > 0) {
581 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
582 addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
583 }
584
585 // Now attach the location information to the DIE.
586 addBlock(Die, Attribute, 0, Block);
587}
588
Devang Patelbcd50a12011-07-20 21:57:04 +0000589/// isTypeSigned - Return true if the type is signed.
Manman Renb3388602013-10-05 01:43:03 +0000590static bool isTypeSigned(DwarfDebug *DD, DIType Ty, int *SizeInBits) {
Devang Patelbcd50a12011-07-20 21:57:04 +0000591 if (Ty.isDerivedType())
Manman Renb3388602013-10-05 01:43:03 +0000592 return isTypeSigned(DD, DD->resolve(DIDerivedType(Ty).getTypeDerivedFrom()),
593 SizeInBits);
Devang Patelbcd50a12011-07-20 21:57:04 +0000594 if (Ty.isBasicType())
595 if (DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed
596 || DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed_char) {
597 *SizeInBits = Ty.getSizeInBits();
598 return true;
599 }
600 return false;
601}
602
Manman Renb3388602013-10-05 01:43:03 +0000603/// Return true if type encoding is unsigned.
604static bool isUnsignedDIType(DwarfDebug *DD, DIType Ty) {
605 DIDerivedType DTy(Ty);
606 if (DTy.isDerivedType())
607 return isUnsignedDIType(DD, DD->resolve(DTy.getTypeDerivedFrom()));
608
609 DIBasicType BTy(Ty);
610 if (BTy.isBasicType()) {
611 unsigned Encoding = BTy.getEncoding();
612 if (Encoding == dwarf::DW_ATE_unsigned ||
613 Encoding == dwarf::DW_ATE_unsigned_char ||
614 Encoding == dwarf::DW_ATE_boolean)
615 return true;
616 }
617 return false;
618}
619
620/// If this type is derived from a base type then return base type size.
Manman Renbda410f2013-10-08 18:46:58 +0000621static uint64_t getBaseTypeSize(DwarfDebug *DD, DIDerivedType Ty) {
Manman Renb3388602013-10-05 01:43:03 +0000622 unsigned Tag = Ty.getTag();
623
624 if (Tag != dwarf::DW_TAG_member && Tag != dwarf::DW_TAG_typedef &&
625 Tag != dwarf::DW_TAG_const_type && Tag != dwarf::DW_TAG_volatile_type &&
626 Tag != dwarf::DW_TAG_restrict_type)
627 return Ty.getSizeInBits();
628
629 DIType BaseType = DD->resolve(Ty.getTypeDerivedFrom());
630
631 // If this type is not derived from any type then take conservative approach.
632 if (!BaseType.isValid())
633 return Ty.getSizeInBits();
634
635 // If this is a derived type, go ahead and get the base type, unless it's a
636 // reference then it's just the size of the field. Pointer types have no need
637 // of this since they're a different type of qualification on the type.
638 if (BaseType.getTag() == dwarf::DW_TAG_reference_type ||
639 BaseType.getTag() == dwarf::DW_TAG_rvalue_reference_type)
640 return Ty.getSizeInBits();
641
642 if (BaseType.isDerivedType())
Manman Renbda410f2013-10-08 18:46:58 +0000643 return getBaseTypeSize(DD, DIDerivedType(BaseType));
Manman Renb3388602013-10-05 01:43:03 +0000644
645 return BaseType.getSizeInBits();
646}
647
Devang Patel0e821f42011-04-12 23:21:44 +0000648/// addConstantValue - Add constant value entry in variable DIE.
Eric Christopher78fcf4902013-07-03 01:08:30 +0000649void CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO,
Devang Patel3c6aed22011-05-27 16:45:18 +0000650 DIType Ty) {
David Blaikiea1e813d2013-05-10 21:52:07 +0000651 // FIXME: This is a bit conservative/simple - it emits negative values at
652 // their maximum bit width which is a bit unfortunate (& doesn't prefer
653 // udata/sdata over dataN as suggested by the DWARF spec)
Nick Lewycky654f5ce2011-10-26 22:55:33 +0000654 assert(MO.isImm() && "Invalid machine operand!");
Devang Patelbcd50a12011-07-20 21:57:04 +0000655 int SizeInBits = -1;
Manman Renb3388602013-10-05 01:43:03 +0000656 bool SignedConstant = isTypeSigned(DD, Ty, &SizeInBits);
Eric Christopher9d1daa82013-08-27 23:49:04 +0000657 uint16_t Form;
Devang Patelf1d04702011-05-27 18:15:52 +0000658
Eric Christopher9d1daa82013-08-27 23:49:04 +0000659 // If we're a signed constant definitely use sdata.
660 if (SignedConstant) {
661 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, MO.getImm());
662 return;
663 }
664
665 // Else use data for now unless it's larger than we can deal with.
666 switch (SizeInBits) {
667 case 8:
668 Form = dwarf::DW_FORM_data1;
669 break;
670 case 16:
671 Form = dwarf::DW_FORM_data2;
672 break;
673 case 32:
674 Form = dwarf::DW_FORM_data4;
675 break;
676 case 64:
677 Form = dwarf::DW_FORM_data8;
678 break;
679 default:
680 Form = dwarf::DW_FORM_udata;
681 addUInt(Die, dwarf::DW_AT_const_value, Form, MO.getImm());
682 return;
683 }
684 addUInt(Die, dwarf::DW_AT_const_value, Form, MO.getImm());
Devang Patel0e821f42011-04-12 23:21:44 +0000685}
686
687/// addConstantFPValue - Add constant value entry in variable DIE.
Eric Christopher78fcf4902013-07-03 01:08:30 +0000688void CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +0000689 assert (MO.isFPImm() && "Invalid machine operand!");
Devang Patel0e821f42011-04-12 23:21:44 +0000690 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
691 APFloat FPImm = MO.getFPImm()->getValueAPF();
692
693 // Get the raw data form of the floating point.
694 const APInt FltVal = FPImm.bitcastToAPInt();
695 const char *FltPtr = (const char*)FltVal.getRawData();
696
697 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
Micah Villmowcdfe20b2012-10-08 16:38:25 +0000698 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel0e821f42011-04-12 23:21:44 +0000699 int Incr = (LittleEndian ? 1 : -1);
700 int Start = (LittleEndian ? 0 : NumBytes - 1);
701 int Stop = (LittleEndian ? NumBytes : -1);
702
703 // Output the constant to DWARF one byte at a time.
704 for (; Start != Stop; Start += Incr)
705 addUInt(Block, 0, dwarf::DW_FORM_data1,
706 (unsigned char)0xFF & FltPtr[Start]);
707
708 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
Devang Patel0e821f42011-04-12 23:21:44 +0000709}
710
David Blaikiea39a76e2013-01-20 01:18:01 +0000711/// addConstantFPValue - Add constant value entry in variable DIE.
Eric Christopher78fcf4902013-07-03 01:08:30 +0000712void CompileUnit::addConstantFPValue(DIE *Die, const ConstantFP *CFP) {
Eric Christopher9d1daa82013-08-27 23:49:04 +0000713 // Pass this down to addConstantValue as an unsigned bag of bits.
714 addConstantValue(Die, CFP->getValueAPF().bitcastToAPInt(), true);
David Blaikiea39a76e2013-01-20 01:18:01 +0000715}
716
Devang Patel0e821f42011-04-12 23:21:44 +0000717/// addConstantValue - Add constant value entry in variable DIE.
Eric Christopher78fcf4902013-07-03 01:08:30 +0000718void CompileUnit::addConstantValue(DIE *Die, const ConstantInt *CI,
Devang Patel0e821f42011-04-12 23:21:44 +0000719 bool Unsigned) {
Eric Christopher78fcf4902013-07-03 01:08:30 +0000720 addConstantValue(Die, CI->getValue(), Unsigned);
David Blaikiea39a76e2013-01-20 01:18:01 +0000721}
722
723// addConstantValue - Add constant value entry in variable DIE.
Eric Christopher78fcf4902013-07-03 01:08:30 +0000724void CompileUnit::addConstantValue(DIE *Die, const APInt &Val, bool Unsigned) {
David Blaikiea39a76e2013-01-20 01:18:01 +0000725 unsigned CIBitWidth = Val.getBitWidth();
Devang Patel8816bbc2011-05-28 00:39:18 +0000726 if (CIBitWidth <= 64) {
Eric Christopher9d1daa82013-08-27 23:49:04 +0000727 // If we're a signed constant definitely use sdata.
728 if (!Unsigned) {
729 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata,
730 Val.getSExtValue());
731 return;
Devang Patel8816bbc2011-05-28 00:39:18 +0000732 }
Eric Christopher9d1daa82013-08-27 23:49:04 +0000733
734 // Else use data for now unless it's larger than we can deal with.
735 uint16_t Form;
736 switch (CIBitWidth) {
737 case 8:
738 Form = dwarf::DW_FORM_data1;
739 break;
740 case 16:
741 Form = dwarf::DW_FORM_data2;
742 break;
743 case 32:
744 Form = dwarf::DW_FORM_data4;
745 break;
746 case 64:
747 Form = dwarf::DW_FORM_data8;
748 break;
749 default:
750 addUInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
751 Val.getZExtValue());
752 return;
753 }
754 addUInt(Die, dwarf::DW_AT_const_value, Form, Val.getZExtValue());
Eric Christopher78fcf4902013-07-03 01:08:30 +0000755 return;
Devang Patel0e821f42011-04-12 23:21:44 +0000756 }
757
758 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
759
760 // Get the raw data form of the large APInt.
NAKAMURA Takumi29ccdd82011-10-28 14:12:22 +0000761 const uint64_t *Ptr64 = Val.getRawData();
Devang Patel0e821f42011-04-12 23:21:44 +0000762
763 int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
Micah Villmowcdfe20b2012-10-08 16:38:25 +0000764 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel0e821f42011-04-12 23:21:44 +0000765
766 // Output the constant to DWARF one byte at a time.
NAKAMURA Takumi29ccdd82011-10-28 14:12:22 +0000767 for (int i = 0; i < NumBytes; i++) {
768 uint8_t c;
769 if (LittleEndian)
770 c = Ptr64[i / 8] >> (8 * (i & 7));
771 else
772 c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7));
773 addUInt(Block, 0, dwarf::DW_FORM_data1, c);
774 }
Devang Patel0e821f42011-04-12 23:21:44 +0000775
776 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
Devang Patel0e821f42011-04-12 23:21:44 +0000777}
778
Eric Christopher25e35092013-04-22 07:47:40 +0000779/// addTemplateParams - Add template parameters into buffer.
Devang Patel0e821f42011-04-12 23:21:44 +0000780void CompileUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
781 // Add template parameters.
782 for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) {
783 DIDescriptor Element = TParams.getElement(i);
784 if (Element.isTemplateTypeParameter())
785 Buffer.addChild(getOrCreateTemplateTypeParameterDIE(
786 DITemplateTypeParameter(Element)));
787 else if (Element.isTemplateValueParameter())
788 Buffer.addChild(getOrCreateTemplateValueParameterDIE(
789 DITemplateValueParameter(Element)));
790 }
Devang Patel0e821f42011-04-12 23:21:44 +0000791}
Nick Lewycky654f5ce2011-10-26 22:55:33 +0000792
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000793/// getOrCreateContextDIE - Get context owner's DIE.
Eric Christopher08f7c8f2013-10-04 23:49:26 +0000794DIE *CompileUnit::getOrCreateContextDIE(DIScope Context) {
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000795 if (Context.isType())
796 return getOrCreateTypeDIE(DIType(Context));
797 else if (Context.isNameSpace())
798 return getOrCreateNameSpace(DINameSpace(Context));
799 else if (Context.isSubprogram())
800 return getOrCreateSubprogramDIE(DISubprogram(Context));
Eric Christopher25e35092013-04-22 07:47:40 +0000801 else
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000802 return getDIE(Context);
803}
804
Devang Patel0e821f42011-04-12 23:21:44 +0000805/// addToContextOwner - Add Die into the list of its context owner's children.
Eric Christopher08f7c8f2013-10-04 23:49:26 +0000806void CompileUnit::addToContextOwner(DIE *Die, DIScope Context) {
David Blaikie811bfe62013-10-03 20:07:20 +0000807 assert(!Die->getParent());
808 if (DIE *ContextDIE = getOrCreateContextDIE(Context)) {
809 if (Die->getParent()) {
810 // While creating the context, if this is a type member, we will have
811 // added the child to the context already.
812 assert(Die->getParent() == ContextDIE);
813 return;
814 }
Devang Patel0e821f42011-04-12 23:21:44 +0000815 ContextDIE->addChild(Die);
David Blaikie811bfe62013-10-03 20:07:20 +0000816 } else
Devang Patel0e821f42011-04-12 23:21:44 +0000817 addDie(Die);
818}
819
820/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
821/// given DIType.
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000822DIE *CompileUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
823 DIType Ty(TyNode);
Manman Ren7504ed42013-07-08 18:33:29 +0000824 if (!Ty.isType())
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000825 return NULL;
Eric Christophere595bae2013-10-04 17:08:38 +0000826 DIE *TyDIE = getDIE(Ty);
Devang Patel0e821f42011-04-12 23:21:44 +0000827 if (TyDIE)
828 return TyDIE;
829
830 // Create new type.
David Blaikiefac56122013-10-04 23:21:16 +0000831 TyDIE = new DIE(Ty.getTag());
Eric Christophere595bae2013-10-04 17:08:38 +0000832 insertDIE(Ty, TyDIE);
Devang Patel0e821f42011-04-12 23:21:44 +0000833 if (Ty.isBasicType())
834 constructTypeDIE(*TyDIE, DIBasicType(Ty));
835 else if (Ty.isCompositeType())
836 constructTypeDIE(*TyDIE, DICompositeType(Ty));
837 else {
838 assert(Ty.isDerivedType() && "Unknown kind of DIType");
839 constructTypeDIE(*TyDIE, DIDerivedType(Ty));
840 }
Eric Christophere2887932011-11-10 19:52:58 +0000841 // If this is a named finished type then include it in the list of types
842 // for the accelerator tables.
Eric Christopher21bde872012-01-06 04:35:23 +0000843 if (!Ty.getName().empty() && !Ty.isForwardDecl()) {
844 bool IsImplementation = 0;
845 if (Ty.isCompositeType()) {
846 DICompositeType CT(Ty);
Eric Christopher8ea8e4f2012-01-06 23:03:37 +0000847 // A runtime language of 0 actually means C/C++ and that any
848 // non-negative value is some version of Objective-C/C++.
Eric Christopher21bde872012-01-06 04:35:23 +0000849 IsImplementation = (CT.getRunTimeLang() == 0) ||
Eric Christopheref64b462012-02-22 08:46:02 +0000850 CT.isObjcClassComplete();
Eric Christopher21bde872012-01-06 04:35:23 +0000851 }
Eric Christophercf7289f2013-09-05 18:20:16 +0000852 unsigned Flags = IsImplementation ? dwarf::DW_FLAG_type_implementation : 0;
Eric Christopher8ea8e4f2012-01-06 23:03:37 +0000853 addAccelType(Ty.getName(), std::make_pair(TyDIE, Flags));
Eric Christopher21bde872012-01-06 04:35:23 +0000854 }
Eric Christopher92331fd2012-11-21 00:34:38 +0000855
Eric Christopher9e429ae2013-10-05 00:27:02 +0000856 addToContextOwner(TyDIE, resolve(Ty.getContext()));
Devang Patel0e821f42011-04-12 23:21:44 +0000857 return TyDIE;
858}
859
860/// addType - Add a new type attribute to the specified entity.
Eric Christopher31b05762013-08-08 01:41:00 +0000861void CompileUnit::addType(DIE *Entity, DIType Ty, uint16_t Attribute) {
Eric Christopher0df08e22013-08-08 07:40:37 +0000862 assert(Ty && "Trying to add a type that doesn't exist?");
Devang Patel0e821f42011-04-12 23:21:44 +0000863
864 // Check for pre-existence.
865 DIEEntry *Entry = getDIEEntry(Ty);
866 // If it exists then use the existing value.
867 if (Entry) {
Eric Christophere595bae2013-10-04 17:08:38 +0000868 Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
Devang Patel0e821f42011-04-12 23:21:44 +0000869 return;
870 }
871
872 // Construct type.
873 DIE *Buffer = getOrCreateTypeDIE(Ty);
874
875 // Set up proxy.
876 Entry = createDIEEntry(Buffer);
877 insertDIEEntry(Ty, Entry);
Eric Christophere595bae2013-10-04 17:08:38 +0000878 Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
Devang Patele9853f22011-05-31 22:56:51 +0000879
880 // If this is a complete composite type then include it in the
881 // list of global types.
Devang Patel562c7422011-06-01 00:23:24 +0000882 addGlobalType(Ty);
Devang Patel1cb8ab42011-05-31 23:30:30 +0000883}
884
Eric Christopher9cd26af2013-09-20 23:22:52 +0000885// Accelerator table mutators - add each name along with its companion
886// DIE to the proper table while ensuring that the name that we're going
887// to reference is in the string table. We do this since the names we
888// add may not only be identical to the names in the DIE.
889void CompileUnit::addAccelName(StringRef Name, DIE *Die) {
890 DU->getStringPoolEntry(Name);
Eric Christopherb0fc0b92013-09-23 22:59:11 +0000891 std::vector<DIE *> &DIEs = AccelNames[Name];
Eric Christopher9cd26af2013-09-20 23:22:52 +0000892 DIEs.push_back(Die);
893}
894
895void CompileUnit::addAccelObjC(StringRef Name, DIE *Die) {
896 DU->getStringPoolEntry(Name);
Eric Christopherb0fc0b92013-09-23 22:59:11 +0000897 std::vector<DIE *> &DIEs = AccelObjC[Name];
Eric Christopher9cd26af2013-09-20 23:22:52 +0000898 DIEs.push_back(Die);
899}
900
901void CompileUnit::addAccelNamespace(StringRef Name, DIE *Die) {
902 DU->getStringPoolEntry(Name);
Eric Christopherb0fc0b92013-09-23 22:59:11 +0000903 std::vector<DIE *> &DIEs = AccelNamespace[Name];
Eric Christopher9cd26af2013-09-20 23:22:52 +0000904 DIEs.push_back(Die);
905}
906
907void CompileUnit::addAccelType(StringRef Name, std::pair<DIE *, unsigned> Die) {
908 DU->getStringPoolEntry(Name);
909 std::vector<std::pair<DIE *, unsigned> > &DIEs = AccelTypes[Name];
910 DIEs.push_back(Die);
911}
912
Eric Christopher9c58f312013-09-20 22:20:55 +0000913/// addGlobalName - Add a new global name to the compile unit.
914void CompileUnit::addGlobalName(StringRef Name, DIE *Die) {
915 GlobalNames[Name] = Die;
916}
917
Devang Patel1cb8ab42011-05-31 23:30:30 +0000918/// addGlobalType - Add a new global type to the compile unit.
919///
Devang Patel562c7422011-06-01 00:23:24 +0000920void CompileUnit::addGlobalType(DIType Ty) {
Eric Christopher9e429ae2013-10-05 00:27:02 +0000921 DIScope Context = resolve(Ty.getContext());
Eric Christopher6d0f1e62013-09-23 23:15:58 +0000922 if (!Ty.getName().empty() && !Ty.isForwardDecl() &&
Eric Christopherb0fc0b92013-09-23 22:59:11 +0000923 (!Context || Context.isCompileUnit() || Context.isFile() ||
924 Context.isNameSpace()))
Devang Patel562c7422011-06-01 00:23:24 +0000925 if (DIEEntry *Entry = getDIEEntry(Ty))
926 GlobalTypes[Ty.getName()] = Entry->getEntry();
Devang Patel0e821f42011-04-12 23:21:44 +0000927}
928
Eric Christopherfa205ca2013-10-05 00:05:51 +0000929/// addPubTypes - Add subprogram argument types for pubtypes section.
Devang Patel17b53272011-05-06 16:57:54 +0000930void CompileUnit::addPubTypes(DISubprogram SP) {
931 DICompositeType SPTy = SP.getType();
Eric Christopher31b05762013-08-08 01:41:00 +0000932 uint16_t SPTag = SPTy.getTag();
Devang Patel17b53272011-05-06 16:57:54 +0000933 if (SPTag != dwarf::DW_TAG_subroutine_type)
934 return;
935
936 DIArray Args = SPTy.getTypeArray();
937 for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
938 DIType ATy(Args.getElement(i));
Manman Ren7504ed42013-07-08 18:33:29 +0000939 if (!ATy.isType())
Devang Patel17b53272011-05-06 16:57:54 +0000940 continue;
Devang Patel562c7422011-06-01 00:23:24 +0000941 addGlobalType(ATy);
Devang Patel17b53272011-05-06 16:57:54 +0000942 }
943}
944
Devang Patel0e821f42011-04-12 23:21:44 +0000945/// constructTypeDIE - Construct basic type die from DIBasicType.
946void CompileUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
947 // Get core information.
948 StringRef Name = BTy.getName();
Devang Patel0e821f42011-04-12 23:21:44 +0000949 // Add name if not anonymous or intermediate type.
950 if (!Name.empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +0000951 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel04d6d472011-09-14 23:13:28 +0000952
David Blaikiefac56122013-10-04 23:21:16 +0000953 // An unspecified type only has a name attribute.
954 if (BTy.getTag() == dwarf::DW_TAG_unspecified_type)
Devang Patel04d6d472011-09-14 23:13:28 +0000955 return;
Devang Patel04d6d472011-09-14 23:13:28 +0000956
Nick Lewycky654f5ce2011-10-26 22:55:33 +0000957 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
Devang Pateld925d1a2012-02-07 23:33:58 +0000958 BTy.getEncoding());
Devang Patel04d6d472011-09-14 23:13:28 +0000959
Devang Patel0e821f42011-04-12 23:21:44 +0000960 uint64_t Size = BTy.getSizeInBits() >> 3;
961 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
962}
963
964/// constructTypeDIE - Construct derived type die from DIDerivedType.
965void CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
966 // Get core information.
967 StringRef Name = DTy.getName();
968 uint64_t Size = DTy.getSizeInBits() >> 3;
David Blaikiefac56122013-10-04 23:21:16 +0000969 uint16_t Tag = Buffer.getTag();
Devang Patel0e821f42011-04-12 23:21:44 +0000970
971 // Map to main type, void will not have a type.
Manman Ren93b30902013-10-08 18:42:58 +0000972 DIType FromTy = resolve(DTy.getTypeDerivedFrom());
Eric Christopher0df08e22013-08-08 07:40:37 +0000973 if (FromTy)
974 addType(&Buffer, FromTy);
Devang Patel0e821f42011-04-12 23:21:44 +0000975
976 // Add name if not anonymous or intermediate type.
977 if (!Name.empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +0000978 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel0e821f42011-04-12 23:21:44 +0000979
980 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopher85757902012-02-21 22:25:53 +0000981 if (Size && Tag != dwarf::DW_TAG_pointer_type)
Devang Patel0e821f42011-04-12 23:21:44 +0000982 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
983
David Blaikie5d3249b2013-01-07 05:51:15 +0000984 if (Tag == dwarf::DW_TAG_ptr_to_member_type)
Manman Ren4c4b69c2013-10-11 23:58:05 +0000985 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type,
Eric Christopher9e429ae2013-10-05 00:27:02 +0000986 getOrCreateTypeDIE(resolve(DTy.getClassType())));
Devang Patel0e821f42011-04-12 23:21:44 +0000987 // Add source line info if available and TyDesc is not a forward declaration.
988 if (!DTy.isForwardDecl())
989 addSourceLine(&Buffer, DTy);
990}
991
Eric Christopher67646432013-07-26 17:02:41 +0000992/// Return true if the type is appropriately scoped to be contained inside
993/// its own type unit.
Manman Ren33796c52013-09-09 19:23:58 +0000994static bool isTypeUnitScoped(DIType Ty, const DwarfDebug *DD) {
Manman Ren116868e2013-09-09 19:47:11 +0000995 DIScope Parent = DD->resolve(Ty.getContext());
Eric Christopher67646432013-07-26 17:02:41 +0000996 while (Parent) {
997 // Don't generate a hash for anything scoped inside a function.
998 if (Parent.isSubprogram())
999 return false;
Manman Rende897a362013-09-09 22:35:23 +00001000 Parent = DD->resolve(Parent.getContext());
Eric Christopher67646432013-07-26 17:02:41 +00001001 }
1002 return true;
1003}
1004
1005/// Return true if the type should be split out into a type unit.
Manman Ren33796c52013-09-09 19:23:58 +00001006static bool shouldCreateTypeUnit(DICompositeType CTy, const DwarfDebug *DD) {
Eric Christopher31b05762013-08-08 01:41:00 +00001007 uint16_t Tag = CTy.getTag();
Eric Christopher67646432013-07-26 17:02:41 +00001008
1009 switch (Tag) {
1010 case dwarf::DW_TAG_structure_type:
1011 case dwarf::DW_TAG_union_type:
1012 case dwarf::DW_TAG_enumeration_type:
1013 case dwarf::DW_TAG_class_type:
1014 // If this is a class, structure, union, or enumeration type
David Blaikie93ff1eb2013-10-04 23:52:02 +00001015 // that is a definition (not a declaration), and not scoped
Eric Christopher67646432013-07-26 17:02:41 +00001016 // inside a function then separate this out as a type unit.
David Blaikie93ff1eb2013-10-04 23:52:02 +00001017 return !CTy.isForwardDecl() && isTypeUnitScoped(CTy, DD);
Eric Christopher67646432013-07-26 17:02:41 +00001018 default:
David Blaikie93ff1eb2013-10-04 23:52:02 +00001019 return false;
Eric Christopher67646432013-07-26 17:02:41 +00001020 }
1021}
1022
Devang Patel0e821f42011-04-12 23:21:44 +00001023/// constructTypeDIE - Construct type DIE from DICompositeType.
1024void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
1025 // Get core information.
1026 StringRef Name = CTy.getName();
1027
1028 uint64_t Size = CTy.getSizeInBits() >> 3;
David Blaikiefac56122013-10-04 23:21:16 +00001029 uint16_t Tag = Buffer.getTag();
Devang Patel0e821f42011-04-12 23:21:44 +00001030
1031 switch (Tag) {
Devang Patel0e821f42011-04-12 23:21:44 +00001032 case dwarf::DW_TAG_array_type:
1033 constructArrayTypeDIE(Buffer, &CTy);
1034 break;
1035 case dwarf::DW_TAG_enumeration_type: {
1036 DIArray Elements = CTy.getTypeArray();
1037
1038 // Add enumerators to enumeration type.
1039 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1040 DIE *ElemDie = NULL;
1041 DIDescriptor Enum(Elements.getElement(i));
1042 if (Enum.isEnumerator()) {
1043 ElemDie = constructEnumTypeDIE(DIEnumerator(Enum));
1044 Buffer.addChild(ElemDie);
1045 }
1046 }
Manman Ren93b30902013-10-08 18:42:58 +00001047 DIType DTy = resolve(CTy.getTypeDerivedFrom());
Eric Christopher49e17b22013-08-08 07:40:42 +00001048 if (DTy) {
Eric Christopherc4964352012-05-23 00:09:20 +00001049 addType(&Buffer, DTy);
Eric Christopher6b8209b2013-10-04 22:40:10 +00001050 addFlag(&Buffer, dwarf::DW_AT_enum_class);
Eric Christopherc4964352012-05-23 00:09:20 +00001051 }
Devang Patel0e821f42011-04-12 23:21:44 +00001052 }
1053 break;
1054 case dwarf::DW_TAG_subroutine_type: {
Eric Christopher0df08e22013-08-08 07:40:37 +00001055 // Add return type. A void return won't have a type.
Devang Patel0e821f42011-04-12 23:21:44 +00001056 DIArray Elements = CTy.getTypeArray();
1057 DIDescriptor RTy = Elements.getElement(0);
Eric Christopher0df08e22013-08-08 07:40:37 +00001058 if (RTy)
1059 addType(&Buffer, DIType(RTy));
Devang Patel0e821f42011-04-12 23:21:44 +00001060
1061 bool isPrototyped = true;
1062 // Add arguments.
1063 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
1064 DIDescriptor Ty = Elements.getElement(i);
1065 if (Ty.isUnspecifiedParameter()) {
1066 DIE *Arg = new DIE(dwarf::DW_TAG_unspecified_parameters);
1067 Buffer.addChild(Arg);
1068 isPrototyped = false;
1069 } else {
1070 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1071 addType(Arg, DIType(Ty));
David Blaikie9a7a7a92013-01-29 19:35:24 +00001072 if (DIType(Ty).isArtificial())
1073 addFlag(Arg, dwarf::DW_AT_artificial);
Devang Patel0e821f42011-04-12 23:21:44 +00001074 Buffer.addChild(Arg);
1075 }
1076 }
Eric Christopher5cd2a9d2012-02-22 08:46:21 +00001077 // Add prototype flag if we're dealing with a C language and the
1078 // function has been prototyped.
Eric Christopherbfceb2f2013-08-26 23:50:38 +00001079 uint16_t Language = DICompileUnit(Node).getLanguage();
Eric Christopher5cd2a9d2012-02-22 08:46:21 +00001080 if (isPrototyped &&
Eric Christopherd42b92f2012-05-22 18:45:24 +00001081 (Language == dwarf::DW_LANG_C89 ||
1082 Language == dwarf::DW_LANG_C99 ||
1083 Language == dwarf::DW_LANG_ObjC))
Eric Christopherbb69a272012-08-24 01:14:27 +00001084 addFlag(&Buffer, dwarf::DW_AT_prototyped);
Devang Patel0e821f42011-04-12 23:21:44 +00001085 }
1086 break;
1087 case dwarf::DW_TAG_structure_type:
1088 case dwarf::DW_TAG_union_type:
1089 case dwarf::DW_TAG_class_type: {
Devang Patel0e821f42011-04-12 23:21:44 +00001090 // Add elements to structure type.
David Blaikiea1ae0e62013-08-01 20:30:22 +00001091 DIArray Elements = CTy.getTypeArray();
1092 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
Devang Patel0e821f42011-04-12 23:21:44 +00001093 DIDescriptor Element = Elements.getElement(i);
1094 DIE *ElemDie = NULL;
1095 if (Element.isSubprogram()) {
1096 DISubprogram SP(Element);
Devang Patel89543712011-08-15 17:24:54 +00001097 ElemDie = getOrCreateSubprogramDIE(DISubprogram(Element));
Devang Patel0e821f42011-04-12 23:21:44 +00001098 if (SP.isProtected())
Nick Lewyckycb918492011-12-13 05:09:11 +00001099 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001100 dwarf::DW_ACCESS_protected);
1101 else if (SP.isPrivate())
Nick Lewyckycb918492011-12-13 05:09:11 +00001102 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001103 dwarf::DW_ACCESS_private);
Eric Christopher92331fd2012-11-21 00:34:38 +00001104 else
Nick Lewyckycb918492011-12-13 05:09:11 +00001105 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001106 dwarf::DW_ACCESS_public);
1107 if (SP.isExplicit())
Eric Christopherbb69a272012-08-24 01:14:27 +00001108 addFlag(ElemDie, dwarf::DW_AT_explicit);
Eric Christopher7285c7d2012-03-28 07:34:31 +00001109 } else if (Element.isDerivedType()) {
Eric Christopherd42b92f2012-05-22 18:45:24 +00001110 DIDerivedType DDTy(Element);
1111 if (DDTy.getTag() == dwarf::DW_TAG_friend) {
1112 ElemDie = new DIE(dwarf::DW_TAG_friend);
Manman Ren93b30902013-10-08 18:42:58 +00001113 addType(ElemDie, resolve(DDTy.getTypeDerivedFrom()),
Manman Renb3388602013-10-05 01:43:03 +00001114 dwarf::DW_AT_friend);
Manman Renc6b63922013-10-14 20:33:57 +00001115 Buffer.addChild(ElemDie);
1116 } else if (DDTy.isStaticMember()) {
1117 ElemDie = getOrCreateStaticMemberDIE(DDTy);
1118 } else {
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001119 ElemDie = createMemberDIE(DDTy);
Manman Renc6b63922013-10-14 20:33:57 +00001120 Buffer.addChild(ElemDie);
1121 }
Eric Christopher7285c7d2012-03-28 07:34:31 +00001122 } else if (Element.isObjCProperty()) {
Devang Pateld925d1a2012-02-07 23:33:58 +00001123 DIObjCProperty Property(Element);
1124 ElemDie = new DIE(Property.getTag());
1125 StringRef PropertyName = Property.getObjCPropertyName();
1126 addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
Eric Christopherd42b92f2012-05-22 18:45:24 +00001127 addType(ElemDie, Property.getType());
1128 addSourceLine(ElemDie, Property);
Devang Pateld925d1a2012-02-07 23:33:58 +00001129 StringRef GetterName = Property.getObjCPropertyGetterName();
1130 if (!GetterName.empty())
1131 addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
1132 StringRef SetterName = Property.getObjCPropertySetterName();
1133 if (!SetterName.empty())
1134 addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
1135 unsigned PropertyAttributes = 0;
Devang Patel403e8192012-02-04 01:30:32 +00001136 if (Property.isReadOnlyObjCProperty())
1137 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
1138 if (Property.isReadWriteObjCProperty())
1139 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
1140 if (Property.isAssignObjCProperty())
1141 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
1142 if (Property.isRetainObjCProperty())
1143 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
1144 if (Property.isCopyObjCProperty())
1145 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
1146 if (Property.isNonAtomicObjCProperty())
1147 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
1148 if (PropertyAttributes)
Eric Christopher92331fd2012-11-21 00:34:38 +00001149 addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, 0,
Devang Patel403e8192012-02-04 01:30:32 +00001150 PropertyAttributes);
Devang Patel44882172012-02-06 17:49:43 +00001151
Devang Pateld925d1a2012-02-07 23:33:58 +00001152 DIEEntry *Entry = getDIEEntry(Element);
1153 if (!Entry) {
1154 Entry = createDIEEntry(ElemDie);
1155 insertDIEEntry(Element, Entry);
1156 }
David Blaikie811bfe62013-10-03 20:07:20 +00001157 Buffer.addChild(ElemDie);
Devang Patel403e8192012-02-04 01:30:32 +00001158 } else
Devang Patel0e821f42011-04-12 23:21:44 +00001159 continue;
Devang Patel0e821f42011-04-12 23:21:44 +00001160 }
1161
1162 if (CTy.isAppleBlockExtension())
Eric Christopherbb69a272012-08-24 01:14:27 +00001163 addFlag(&Buffer, dwarf::DW_AT_APPLE_block);
Devang Patel0e821f42011-04-12 23:21:44 +00001164
Eric Christopher9e429ae2013-10-05 00:27:02 +00001165 DICompositeType ContainingType(resolve(CTy.getContainingType()));
Devang Patel0e821f42011-04-12 23:21:44 +00001166 if (DIDescriptor(ContainingType).isCompositeType())
Manman Ren4c4b69c2013-10-11 23:58:05 +00001167 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type,
Devang Patel0e821f42011-04-12 23:21:44 +00001168 getOrCreateTypeDIE(DIType(ContainingType)));
Devang Patel0e821f42011-04-12 23:21:44 +00001169
Devang Patel12419ae2011-05-12 21:29:42 +00001170 if (CTy.isObjcClassComplete())
Eric Christopherbb69a272012-08-24 01:14:27 +00001171 addFlag(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type);
Devang Patel2409e782011-05-12 19:06:16 +00001172
Eric Christopherda011dd2011-12-16 23:42:42 +00001173 // Add template parameters to a class, structure or union types.
1174 // FIXME: The support isn't in the metadata for this yet.
1175 if (Tag == dwarf::DW_TAG_class_type ||
1176 Tag == dwarf::DW_TAG_structure_type ||
1177 Tag == dwarf::DW_TAG_union_type)
Devang Patel0e821f42011-04-12 23:21:44 +00001178 addTemplateParams(Buffer, CTy.getTemplateParams());
1179
1180 break;
1181 }
1182 default:
1183 break;
1184 }
1185
1186 // Add name if not anonymous or intermediate type.
1187 if (!Name.empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +00001188 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel0e821f42011-04-12 23:21:44 +00001189
Eric Christopher775cbd22012-05-22 18:45:18 +00001190 if (Tag == dwarf::DW_TAG_enumeration_type ||
1191 Tag == dwarf::DW_TAG_class_type ||
1192 Tag == dwarf::DW_TAG_structure_type ||
1193 Tag == dwarf::DW_TAG_union_type) {
Devang Patel0e821f42011-04-12 23:21:44 +00001194 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopher1cf33382012-06-01 00:22:32 +00001195 // TODO: Do we care about size for enum forward declarations?
Devang Patel0e821f42011-04-12 23:21:44 +00001196 if (Size)
1197 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
Eric Christopher1cf33382012-06-01 00:22:32 +00001198 else if (!CTy.isForwardDecl())
Devang Patel0e821f42011-04-12 23:21:44 +00001199 // Add zero size if it is not a forward declaration.
Eric Christopher1cf33382012-06-01 00:22:32 +00001200 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
1201
1202 // If we're a forward decl, say so.
1203 if (CTy.isForwardDecl())
Eric Christopherbb69a272012-08-24 01:14:27 +00001204 addFlag(&Buffer, dwarf::DW_AT_declaration);
Devang Patel0e821f42011-04-12 23:21:44 +00001205
1206 // Add source line info if available.
1207 if (!CTy.isForwardDecl())
1208 addSourceLine(&Buffer, CTy);
Eric Christopher54cf8ff2012-03-07 00:15:19 +00001209
1210 // No harm in adding the runtime language to the declaration.
1211 unsigned RLang = CTy.getRunTimeLang();
1212 if (RLang)
1213 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
1214 dwarf::DW_FORM_data1, RLang);
Devang Patel0e821f42011-04-12 23:21:44 +00001215 }
Eric Christopher67646432013-07-26 17:02:41 +00001216 // If this is a type applicable to a type unit it then add it to the
1217 // list of types we'll compute a hash for later.
Manman Ren33796c52013-09-09 19:23:58 +00001218 if (shouldCreateTypeUnit(CTy, DD))
Eric Christopher67646432013-07-26 17:02:41 +00001219 DD->addTypeUnitType(&Buffer);
Devang Patel0e821f42011-04-12 23:21:44 +00001220}
1221
Eric Christopher92331fd2012-11-21 00:34:38 +00001222/// getOrCreateTemplateTypeParameterDIE - Find existing DIE or create new DIE
Devang Patel0e821f42011-04-12 23:21:44 +00001223/// for the given DITemplateTypeParameter.
1224DIE *
1225CompileUnit::getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP) {
1226 DIE *ParamDIE = getDIE(TP);
1227 if (ParamDIE)
1228 return ParamDIE;
1229
1230 ParamDIE = new DIE(dwarf::DW_TAG_template_type_parameter);
Eric Christopher056b6472013-08-08 08:09:43 +00001231 // Add the type if it exists, it could be void and therefore no type.
1232 if (TP.getType())
Manman Ren88b0f942013-10-09 19:46:28 +00001233 addType(ParamDIE, resolve(TP.getType()));
David Blaikie2b380232013-06-22 18:59:11 +00001234 if (!TP.getName().empty())
1235 addString(ParamDIE, dwarf::DW_AT_name, TP.getName());
Devang Patel0e821f42011-04-12 23:21:44 +00001236 return ParamDIE;
1237}
1238
Eric Christopher92331fd2012-11-21 00:34:38 +00001239/// getOrCreateTemplateValueParameterDIE - Find existing DIE or create new DIE
Devang Patel0e821f42011-04-12 23:21:44 +00001240/// for the given DITemplateValueParameter.
1241DIE *
Eric Christopherafb2c412013-08-08 07:40:31 +00001242CompileUnit::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter VP) {
1243 DIE *ParamDIE = getDIE(VP);
Devang Patel0e821f42011-04-12 23:21:44 +00001244 if (ParamDIE)
1245 return ParamDIE;
1246
Eric Christopherafb2c412013-08-08 07:40:31 +00001247 ParamDIE = new DIE(VP.getTag());
Eric Christopher0df08e22013-08-08 07:40:37 +00001248
1249 // Add the type if there is one, template template and template parameter
1250 // packs will not have a type.
1251 if (VP.getType())
Manman Ren88b0f942013-10-09 19:46:28 +00001252 addType(ParamDIE, resolve(VP.getType()));
Eric Christopherafb2c412013-08-08 07:40:31 +00001253 if (!VP.getName().empty())
1254 addString(ParamDIE, dwarf::DW_AT_name, VP.getName());
1255 if (Value *Val = VP.getValue()) {
David Blaikiea1e813d2013-05-10 21:52:07 +00001256 if (ConstantInt *CI = dyn_cast<ConstantInt>(Val))
Manman Ren88b0f942013-10-09 19:46:28 +00001257 addConstantValue(ParamDIE, CI,
1258 isUnsignedDIType(DD, resolve(VP.getType())));
David Blaikiea1e813d2013-05-10 21:52:07 +00001259 else if (GlobalValue *GV = dyn_cast<GlobalValue>(Val)) {
1260 // For declaration non-type template parameters (such as global values and
1261 // functions)
1262 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1263 addOpAddress(Block, Asm->Mang->getSymbol(GV));
1264 // Emit DW_OP_stack_value to use the address as the immediate value of the
1265 // parameter, rather than a pointer to it.
1266 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value);
1267 addBlock(ParamDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopherafb2c412013-08-08 07:40:31 +00001268 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_template_param) {
David Blaikie2b380232013-06-22 18:59:11 +00001269 assert(isa<MDString>(Val));
1270 addString(ParamDIE, dwarf::DW_AT_GNU_template_name,
1271 cast<MDString>(Val)->getString());
Eric Christopherafb2c412013-08-08 07:40:31 +00001272 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_parameter_pack) {
David Blaikie2b380232013-06-22 18:59:11 +00001273 assert(isa<MDNode>(Val));
1274 DIArray A(cast<MDNode>(Val));
1275 addTemplateParams(*ParamDIE, A);
David Blaikiea1e813d2013-05-10 21:52:07 +00001276 }
1277 }
1278
Devang Patel0e821f42011-04-12 23:21:44 +00001279 return ParamDIE;
1280}
1281
Devang Patel17b53272011-05-06 16:57:54 +00001282/// getOrCreateNameSpace - Create a DIE for DINameSpace.
1283DIE *CompileUnit::getOrCreateNameSpace(DINameSpace NS) {
1284 DIE *NDie = getDIE(NS);
1285 if (NDie)
1286 return NDie;
1287 NDie = new DIE(dwarf::DW_TAG_namespace);
1288 insertDIE(NS, NDie);
Eric Christopher4996c702011-11-07 09:24:32 +00001289 if (!NS.getName().empty()) {
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +00001290 addString(NDie, dwarf::DW_AT_name, NS.getName());
Eric Christopher4996c702011-11-07 09:24:32 +00001291 addAccelNamespace(NS.getName(), NDie);
Eric Christopher55364d72013-09-24 00:17:57 +00001292 addGlobalName(NS.getName(), NDie);
Eric Christopher4996c702011-11-07 09:24:32 +00001293 } else
1294 addAccelNamespace("(anonymous namespace)", NDie);
Devang Patel17b53272011-05-06 16:57:54 +00001295 addSourceLine(NDie, NS);
1296 addToContextOwner(NDie, NS.getContext());
1297 return NDie;
1298}
1299
Devang Patel89543712011-08-15 17:24:54 +00001300/// getOrCreateSubprogramDIE - Create new DIE using SP.
1301DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
David Blaikie309ffe42013-10-04 01:39:59 +00001302 // Construct the context before querying for the existence of the DIE in case
1303 // such construction creates the DIE (as is the case for member function
1304 // declarations).
Manman Renc50fa112013-10-10 18:40:01 +00001305 DIE *ContextDIE = getOrCreateContextDIE(resolve(SP.getContext()));
David Blaikie309ffe42013-10-04 01:39:59 +00001306 if (!ContextDIE)
1307 ContextDIE = CUDie.get();
1308
Eric Christophere595bae2013-10-04 17:08:38 +00001309 DIE *SPDie = getDIE(SP);
Devang Patel89543712011-08-15 17:24:54 +00001310 if (SPDie)
1311 return SPDie;
1312
Peter Collingbourne4d358b52012-05-27 18:36:44 +00001313 SPDie = new DIE(dwarf::DW_TAG_subprogram);
1314
1315 // DW_TAG_inlined_subroutine may refer to this DIE.
Eric Christophere595bae2013-10-04 17:08:38 +00001316 insertDIE(SP, SPDie);
Peter Collingbourne4d358b52012-05-27 18:36:44 +00001317
Rafael Espindola79278362011-11-10 22:34:29 +00001318 DISubprogram SPDecl = SP.getFunctionDeclaration();
1319 DIE *DeclDie = NULL;
1320 if (SPDecl.isSubprogram()) {
1321 DeclDie = getOrCreateSubprogramDIE(SPDecl);
1322 }
1323
Devang Patel89543712011-08-15 17:24:54 +00001324 // Add to context owner.
David Blaikie309ffe42013-10-04 01:39:59 +00001325 ContextDIE->addChild(SPDie);
Devang Patel89543712011-08-15 17:24:54 +00001326
1327 // Add function template parameters.
1328 addTemplateParams(*SPDie, SP.getTemplateParams());
1329
Devang Patel89543712011-08-15 17:24:54 +00001330 // If this DIE is going to refer declaration info using AT_specification
Eric Christopherf20ff972013-05-09 00:42:33 +00001331 // then there is no need to add other attributes.
Rafael Espindola79278362011-11-10 22:34:29 +00001332 if (DeclDie) {
1333 // Refer function declaration directly.
Manman Ren4c4b69c2013-10-11 23:58:05 +00001334 addDIEEntry(SPDie, dwarf::DW_AT_specification, DeclDie);
Rafael Espindola79278362011-11-10 22:34:29 +00001335
Devang Patel89543712011-08-15 17:24:54 +00001336 return SPDie;
Rafael Espindola79278362011-11-10 22:34:29 +00001337 }
Devang Patel89543712011-08-15 17:24:54 +00001338
Eric Christopheracb71152012-08-23 22:52:55 +00001339 // Add the linkage name if we have one.
Michael Gottesmanc89466f2013-09-04 04:39:38 +00001340 StringRef LinkageName = SP.getLinkageName();
1341 if (!LinkageName.empty())
Eric Christopheracb71152012-08-23 22:52:55 +00001342 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c275642013-06-01 17:51:14 +00001343 GlobalValue::getRealLinkageName(LinkageName));
Eric Christopheracb71152012-08-23 22:52:55 +00001344
Devang Patel89543712011-08-15 17:24:54 +00001345 // Constructors and operators for anonymous aggregates do not have names.
1346 if (!SP.getName().empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +00001347 addString(SPDie, dwarf::DW_AT_name, SP.getName());
Devang Patel89543712011-08-15 17:24:54 +00001348
1349 addSourceLine(SPDie, SP);
1350
Eric Christopher5cd2a9d2012-02-22 08:46:21 +00001351 // Add the prototype if we have a prototype and we have a C like
1352 // language.
Eric Christopherbfceb2f2013-08-26 23:50:38 +00001353 uint16_t Language = DICompileUnit(Node).getLanguage();
Eric Christopher5cd2a9d2012-02-22 08:46:21 +00001354 if (SP.isPrototyped() &&
1355 (Language == dwarf::DW_LANG_C89 ||
1356 Language == dwarf::DW_LANG_C99 ||
1357 Language == dwarf::DW_LANG_ObjC))
Eric Christopherbb69a272012-08-24 01:14:27 +00001358 addFlag(SPDie, dwarf::DW_AT_prototyped);
Devang Patel89543712011-08-15 17:24:54 +00001359
Eric Christopher0df08e22013-08-08 07:40:37 +00001360 // Add Return Type. A void return type will not have a type.
Devang Patel89543712011-08-15 17:24:54 +00001361 DICompositeType SPTy = SP.getType();
David Blaikie5174c842013-05-22 23:22:18 +00001362 assert(SPTy.getTag() == dwarf::DW_TAG_subroutine_type &&
1363 "the type of a subprogram should be a subroutine");
Devang Patel89543712011-08-15 17:24:54 +00001364
David Blaikie5174c842013-05-22 23:22:18 +00001365 DIArray Args = SPTy.getTypeArray();
Eric Christopher0df08e22013-08-08 07:40:37 +00001366 if (Args.getElement(0))
1367 addType(SPDie, DIType(Args.getElement(0)));
Devang Patel89543712011-08-15 17:24:54 +00001368
1369 unsigned VK = SP.getVirtuality();
1370 if (VK) {
Nick Lewyckycfde1a22011-12-14 00:56:07 +00001371 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
Devang Patel89543712011-08-15 17:24:54 +00001372 DIEBlock *Block = getDIEBlock();
1373 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1374 addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex());
1375 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
1376 ContainingTypeMap.insert(std::make_pair(SPDie,
Eric Christopher9e429ae2013-10-05 00:27:02 +00001377 resolve(SP.getContainingType())));
Devang Patel89543712011-08-15 17:24:54 +00001378 }
1379
1380 if (!SP.isDefinition()) {
Eric Christopherbb69a272012-08-24 01:14:27 +00001381 addFlag(SPDie, dwarf::DW_AT_declaration);
Eric Christopher92331fd2012-11-21 00:34:38 +00001382
Devang Patel89543712011-08-15 17:24:54 +00001383 // Add arguments. Do not add arguments for subprogram definition. They will
1384 // be handled while processing variables.
David Blaikie5174c842013-05-22 23:22:18 +00001385 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1386 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1387 DIType ATy = DIType(Args.getElement(i));
1388 addType(Arg, ATy);
1389 if (ATy.isArtificial())
1390 addFlag(Arg, dwarf::DW_AT_artificial);
1391 SPDie->addChild(Arg);
1392 }
Devang Patel89543712011-08-15 17:24:54 +00001393 }
1394
1395 if (SP.isArtificial())
Eric Christopherbb69a272012-08-24 01:14:27 +00001396 addFlag(SPDie, dwarf::DW_AT_artificial);
Devang Patel89543712011-08-15 17:24:54 +00001397
1398 if (!SP.isLocalToUnit())
Eric Christopherbb69a272012-08-24 01:14:27 +00001399 addFlag(SPDie, dwarf::DW_AT_external);
Devang Patel89543712011-08-15 17:24:54 +00001400
1401 if (SP.isOptimized())
Eric Christopherbb69a272012-08-24 01:14:27 +00001402 addFlag(SPDie, dwarf::DW_AT_APPLE_optimized);
Devang Patel89543712011-08-15 17:24:54 +00001403
1404 if (unsigned isa = Asm->getISAEncoding()) {
1405 addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1406 }
1407
1408 return SPDie;
1409}
1410
Devang Pateldfd6ec32011-08-15 17:57:41 +00001411// Return const expression if value is a GEP to access merged global
1412// constant. e.g.
1413// i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
1414static const ConstantExpr *getMergedGlobalExpr(const Value *V) {
1415 const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
1416 if (!CE || CE->getNumOperands() != 3 ||
1417 CE->getOpcode() != Instruction::GetElementPtr)
1418 return NULL;
1419
1420 // First operand points to a global struct.
1421 Value *Ptr = CE->getOperand(0);
1422 if (!isa<GlobalValue>(Ptr) ||
1423 !isa<StructType>(cast<PointerType>(Ptr->getType())->getElementType()))
1424 return NULL;
1425
1426 // Second operand is zero.
1427 const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
1428 if (!CI || !CI->isZero())
1429 return NULL;
1430
1431 // Third operand is offset.
1432 if (!isa<ConstantInt>(CE->getOperand(2)))
1433 return NULL;
1434
1435 return CE;
1436}
1437
1438/// createGlobalVariableDIE - create global variable DIE.
1439void CompileUnit::createGlobalVariableDIE(const MDNode *N) {
Devang Pateldfd6ec32011-08-15 17:57:41 +00001440 // Check for pre-existence.
Devang Patela6576a12011-08-18 22:21:50 +00001441 if (getDIE(N))
Devang Pateldfd6ec32011-08-15 17:57:41 +00001442 return;
1443
Devang Patela6576a12011-08-18 22:21:50 +00001444 DIGlobalVariable GV(N);
Manman Ren7504ed42013-07-08 18:33:29 +00001445 if (!GV.isGlobalVariable())
Devang Patel0ecbcbd2011-08-18 23:17:55 +00001446 return;
1447
Eric Christopher08f7c8f2013-10-04 23:49:26 +00001448 DIScope GVContext = GV.getContext();
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001449 DIType GTy = GV.getType();
1450
1451 // If this is a static data member definition, some attributes belong
1452 // to the declaration DIE.
1453 DIE *VariableDIE = NULL;
Manman Rene697d3c2013-02-01 23:54:37 +00001454 bool IsStaticMember = false;
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001455 DIDerivedType SDMDecl = GV.getStaticDataMemberDeclaration();
1456 if (SDMDecl.Verify()) {
1457 assert(SDMDecl.isStaticMember() && "Expected static member decl");
1458 // We need the declaration DIE that is in the static member's class.
Manman Renc6b63922013-10-14 20:33:57 +00001459 VariableDIE = getOrCreateStaticMemberDIE(SDMDecl);
Manman Rene697d3c2013-02-01 23:54:37 +00001460 IsStaticMember = true;
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001461 }
1462
1463 // If this is not a static data member definition, create the variable
1464 // DIE and add the initial set of attributes to it.
1465 if (!VariableDIE) {
1466 VariableDIE = new DIE(GV.getTag());
1467 // Add to map.
1468 insertDIE(N, VariableDIE);
1469
1470 // Add name and type.
1471 addString(VariableDIE, dwarf::DW_AT_name, GV.getDisplayName());
1472 addType(VariableDIE, GTy);
1473
1474 // Add scoping info.
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00001475 if (!GV.isLocalToUnit()) {
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001476 addFlag(VariableDIE, dwarf::DW_AT_external);
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00001477 addGlobalName(GV.getName(), VariableDIE);
1478 }
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001479
1480 // Add line number info.
1481 addSourceLine(VariableDIE, GV);
1482 // Add to context owner.
1483 addToContextOwner(VariableDIE, GVContext);
1484 }
1485
Devang Pateldfd6ec32011-08-15 17:57:41 +00001486 // Add location.
Eric Christopher4996c702011-11-07 09:24:32 +00001487 bool addToAccelTable = false;
Eric Christopher0a917b72011-11-11 03:16:32 +00001488 DIE *VariableSpecDIE = NULL;
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001489 bool isGlobalVariable = GV.getGlobal() != NULL;
Devang Pateldfd6ec32011-08-15 17:57:41 +00001490 if (isGlobalVariable) {
Eric Christopher4996c702011-11-07 09:24:32 +00001491 addToAccelTable = true;
Devang Pateldfd6ec32011-08-15 17:57:41 +00001492 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
David Blaikief2694972013-06-28 20:05:11 +00001493 const MCSymbol *Sym = Asm->Mang->getSymbol(GV.getGlobal());
1494 if (GV.getGlobal()->isThreadLocal()) {
1495 // FIXME: Make this work with -gsplit-dwarf.
1496 unsigned PointerSize = Asm->getDataLayout().getPointerSize();
1497 assert((PointerSize == 4 || PointerSize == 8) &&
1498 "Add support for other sizes if necessary");
Ulrich Weigand2b6fc8d2013-07-02 18:47:09 +00001499 const MCExpr *Expr =
David Blaikie8466ca82013-07-01 23:55:52 +00001500 Asm->getObjFileLowering().getDebugThreadLocalSymbol(Sym);
David Blaikief2694972013-06-28 20:05:11 +00001501 // Based on GCC's support for TLS:
David Blaikie8466ca82013-07-01 23:55:52 +00001502 if (!DD->useSplitDwarf()) {
1503 // 1) Start with a constNu of the appropriate pointer size
1504 addUInt(Block, 0, dwarf::DW_FORM_data1,
1505 PointerSize == 4 ? dwarf::DW_OP_const4u : dwarf::DW_OP_const8u);
Richard Mitton0aafb582013-10-07 18:39:18 +00001506 // 2) containing the (relocated) offset of the TLS variable
1507 // within the module's TLS block.
Ulrich Weigand2b6fc8d2013-07-02 18:47:09 +00001508 addExpr(Block, 0, dwarf::DW_FORM_udata, Expr);
David Blaikie8466ca82013-07-01 23:55:52 +00001509 } else {
1510 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_const_index);
Ulrich Weigand2b6fc8d2013-07-02 18:47:09 +00001511 addUInt(Block, 0, dwarf::DW_FORM_udata, DU->getAddrPoolIndex(Expr));
David Blaikie8466ca82013-07-01 23:55:52 +00001512 }
Richard Mitton0aafb582013-10-07 18:39:18 +00001513 // 3) followed by a custom OP to make the debugger do a TLS lookup.
1514 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_push_tls_address);
David Blaikief2694972013-06-28 20:05:11 +00001515 } else
1516 addOpAddress(Block, Sym);
Devang Pateldfd6ec32011-08-15 17:57:41 +00001517 // Do not create specification DIE if context is either compile unit
1518 // or a subprogram.
Devang Patel5e6b65c2011-09-21 23:41:11 +00001519 if (GVContext && GV.isDefinition() && !GVContext.isCompileUnit() &&
Manman Ren3eb9dff2013-09-09 19:05:21 +00001520 !GVContext.isFile() && !DD->isSubprogramContext(GVContext)) {
Devang Pateldfd6ec32011-08-15 17:57:41 +00001521 // Create specification DIE.
Eric Christopherc12c2112011-11-11 01:55:22 +00001522 VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
Manman Ren4c4b69c2013-10-11 23:58:05 +00001523 addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification, VariableDIE);
Devang Pateldfd6ec32011-08-15 17:57:41 +00001524 addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001525 // A static member's declaration is already flagged as such.
1526 if (!SDMDecl.Verify())
1527 addFlag(VariableDIE, dwarf::DW_AT_declaration);
Devang Pateldfd6ec32011-08-15 17:57:41 +00001528 addDie(VariableSpecDIE);
1529 } else {
1530 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopher4996c702011-11-07 09:24:32 +00001531 }
Michael Gottesmanc89466f2013-09-04 04:39:38 +00001532 // Add the linkage name.
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001533 StringRef LinkageName = GV.getLinkageName();
Michael Gottesmanc89466f2013-09-04 04:39:38 +00001534 if (!LinkageName.empty())
Eric Christopher3f79b8c2013-02-27 23:49:47 +00001535 // From DWARF4: DIEs to which DW_AT_linkage_name may apply include:
1536 // TAG_common_block, TAG_constant, TAG_entry_point, TAG_subprogram and
1537 // TAG_variable.
Manman Ren584e4c02013-02-27 23:21:02 +00001538 addString(IsStaticMember && VariableSpecDIE ?
1539 VariableSpecDIE : VariableDIE, dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c275642013-06-01 17:51:14 +00001540 GlobalValue::getRealLinkageName(LinkageName));
Eric Christopher92331fd2012-11-21 00:34:38 +00001541 } else if (const ConstantInt *CI =
Manman Rene697d3c2013-02-01 23:54:37 +00001542 dyn_cast_or_null<ConstantInt>(GV.getConstant())) {
Adrian Prantl322f41d2013-04-04 22:56:49 +00001543 // AT_const_value was added when the static member was created. To avoid
Manman Rene697d3c2013-02-01 23:54:37 +00001544 // emitting AT_const_value multiple times, we only add AT_const_value when
1545 // it is not a static member.
1546 if (!IsStaticMember)
Manman Renb3388602013-10-05 01:43:03 +00001547 addConstantValue(VariableDIE, CI, isUnsignedDIType(DD, GTy));
Manman Rene697d3c2013-02-01 23:54:37 +00001548 } else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
Eric Christopher4996c702011-11-07 09:24:32 +00001549 addToAccelTable = true;
Devang Pateldfd6ec32011-08-15 17:57:41 +00001550 // GV is a merged global.
1551 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1552 Value *Ptr = CE->getOperand(0);
Eric Christophere9ec2452013-01-18 22:11:33 +00001553 addOpAddress(Block, Asm->Mang->getSymbol(cast<GlobalValue>(Ptr)));
Devang Pateldfd6ec32011-08-15 17:57:41 +00001554 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1555 SmallVector<Value*, 3> Idx(CE->op_begin()+1, CE->op_end());
Eric Christopher92331fd2012-11-21 00:34:38 +00001556 addUInt(Block, 0, dwarf::DW_FORM_udata,
Micah Villmowcdfe20b2012-10-08 16:38:25 +00001557 Asm->getDataLayout().getIndexedOffset(Ptr->getType(), Idx));
Devang Pateldfd6ec32011-08-15 17:57:41 +00001558 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1559 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
1560 }
1561
Eric Christopherc12c2112011-11-11 01:55:22 +00001562 if (addToAccelTable) {
1563 DIE *AddrDIE = VariableSpecDIE ? VariableSpecDIE : VariableDIE;
1564 addAccelName(GV.getName(), AddrDIE);
Eric Christopher4996c702011-11-07 09:24:32 +00001565
Eric Christopherc12c2112011-11-11 01:55:22 +00001566 // If the linkage name is different than the name, go ahead and output
1567 // that as well into the name table.
1568 if (GV.getLinkageName() != "" && GV.getName() != GV.getLinkageName())
1569 addAccelName(GV.getLinkageName(), AddrDIE);
1570 }
Devang Pateldfd6ec32011-08-15 17:57:41 +00001571}
1572
Devang Patel0e821f42011-04-12 23:21:44 +00001573/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
Eric Christopherd42b92f2012-05-22 18:45:24 +00001574void CompileUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR,
1575 DIE *IndexTy) {
Devang Patel0e821f42011-04-12 23:21:44 +00001576 DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
Manman Ren4c4b69c2013-10-11 23:58:05 +00001577 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, IndexTy);
Devang Patel0e821f42011-04-12 23:21:44 +00001578
Bill Wendling28fe9e72012-12-06 07:38:10 +00001579 // The LowerBound value defines the lower bounds which is typically zero for
1580 // C/C++. The Count value is the number of elements. Values are 64 bit. If
1581 // Count == -1 then the array is unbounded and we do not emit
1582 // DW_AT_lower_bound and DW_AT_upper_bound attributes. If LowerBound == 0 and
1583 // Count == 0, then the array has zero elements in which case we do not emit
1584 // an upper bound.
1585 int64_t LowerBound = SR.getLo();
Bill Wendling3495f9b2012-12-06 07:55:19 +00001586 int64_t DefaultLowerBound = getDefaultLowerBound();
Bill Wendlingd7767122012-12-04 21:34:03 +00001587 int64_t Count = SR.getCount();
Devang Patel0e821f42011-04-12 23:21:44 +00001588
Bill Wendling3495f9b2012-12-06 07:55:19 +00001589 if (DefaultLowerBound == -1 || LowerBound != DefaultLowerBound)
Bill Wendling28fe9e72012-12-06 07:38:10 +00001590 addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, LowerBound);
1591
1592 if (Count != -1 && Count != 0)
Bill Wendlingd7767122012-12-04 21:34:03 +00001593 // FIXME: An unbounded array should reference the expression that defines
1594 // the array.
Bill Wendling28fe9e72012-12-06 07:38:10 +00001595 addUInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, LowerBound + Count - 1);
Bill Wendlingd7767122012-12-04 21:34:03 +00001596
Devang Patel0e821f42011-04-12 23:21:44 +00001597 Buffer.addChild(DW_Subrange);
1598}
1599
1600/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
1601void CompileUnit::constructArrayTypeDIE(DIE &Buffer,
1602 DICompositeType *CTy) {
Eric Christopher72a52952013-01-08 01:53:52 +00001603 if (CTy->isVector())
Eric Christopherbb69a272012-08-24 01:14:27 +00001604 addFlag(&Buffer, dwarf::DW_AT_GNU_vector);
Devang Patel0e821f42011-04-12 23:21:44 +00001605
Eric Christopher0df08e22013-08-08 07:40:37 +00001606 // Emit the element type.
Manman Ren93b30902013-10-08 18:42:58 +00001607 addType(&Buffer, resolve(CTy->getTypeDerivedFrom()));
Devang Patel0e821f42011-04-12 23:21:44 +00001608
1609 // Get an anonymous type for index type.
Eric Christophercad9b532013-01-04 21:51:53 +00001610 // FIXME: This type should be passed down from the front end
1611 // as different languages may have different sizes for indexes.
Devang Patel0e821f42011-04-12 23:21:44 +00001612 DIE *IdxTy = getIndexTyDie();
1613 if (!IdxTy) {
1614 // Construct an anonymous type for index type.
1615 IdxTy = new DIE(dwarf::DW_TAG_base_type);
Eric Christophercad9b532013-01-04 21:51:53 +00001616 addString(IdxTy, dwarf::DW_AT_name, "int");
Devang Patel0e821f42011-04-12 23:21:44 +00001617 addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1618 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1619 dwarf::DW_ATE_signed);
1620 addDie(IdxTy);
1621 setIndexTyDie(IdxTy);
1622 }
1623
1624 // Add subranges to array type.
Eric Christopher0df08e22013-08-08 07:40:37 +00001625 DIArray Elements = CTy->getTypeArray();
Devang Patel0e821f42011-04-12 23:21:44 +00001626 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1627 DIDescriptor Element = Elements.getElement(i);
1628 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1629 constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1630 }
1631}
1632
1633/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
1634DIE *CompileUnit::constructEnumTypeDIE(DIEnumerator ETy) {
1635 DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
1636 StringRef Name = ETy.getName();
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +00001637 addString(Enumerator, dwarf::DW_AT_name, Name);
Devang Patel0e821f42011-04-12 23:21:44 +00001638 int64_t Value = ETy.getEnumValue();
1639 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
1640 return Enumerator;
1641}
1642
Devang Patel89543712011-08-15 17:24:54 +00001643/// constructContainingTypeDIEs - Construct DIEs for types that contain
1644/// vtables.
1645void CompileUnit::constructContainingTypeDIEs() {
1646 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
1647 CE = ContainingTypeMap.end(); CI != CE; ++CI) {
1648 DIE *SPDie = CI->first;
1649 const MDNode *N = CI->second;
1650 if (!N) continue;
Eric Christophere595bae2013-10-04 17:08:38 +00001651 DIE *NDie = getDIE(N);
Devang Patel89543712011-08-15 17:24:54 +00001652 if (!NDie) continue;
Manman Ren4c4b69c2013-10-11 23:58:05 +00001653 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, NDie);
Devang Patel89543712011-08-15 17:24:54 +00001654 }
1655}
1656
Devang Patel3acc70e2011-08-15 22:04:40 +00001657/// constructVariableDIE - Construct a DIE for the given DbgVariable.
Eric Christopherbf2d23c2013-06-24 21:07:27 +00001658DIE *CompileUnit::constructVariableDIE(DbgVariable *DV,
1659 bool isScopeAbstract) {
Devang Patel3acc70e2011-08-15 22:04:40 +00001660 StringRef Name = DV->getName();
Devang Patel3acc70e2011-08-15 22:04:40 +00001661
Devang Patel3acc70e2011-08-15 22:04:40 +00001662 // Define variable debug information entry.
David Blaikiefac56122013-10-04 23:21:16 +00001663 DIE *VariableDie = new DIE(DV->getTag());
Devang Patel3acc70e2011-08-15 22:04:40 +00001664 DbgVariable *AbsVar = DV->getAbstractVariable();
1665 DIE *AbsDIE = AbsVar ? AbsVar->getDIE() : NULL;
Manman Ren4213c392013-05-29 17:16:59 +00001666 if (AbsDIE)
Manman Ren4c4b69c2013-10-11 23:58:05 +00001667 addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin, AbsDIE);
Devang Patel3acc70e2011-08-15 22:04:40 +00001668 else {
David Blaikie715528b2013-08-19 03:34:03 +00001669 if (!Name.empty())
1670 addString(VariableDie, dwarf::DW_AT_name, Name);
Devang Patel3acc70e2011-08-15 22:04:40 +00001671 addSourceLine(VariableDie, DV->getVariable());
1672 addType(VariableDie, DV->getType());
1673 }
1674
1675 if (DV->isArtificial())
Eric Christopherbb69a272012-08-24 01:14:27 +00001676 addFlag(VariableDie, dwarf::DW_AT_artificial);
Devang Patel3acc70e2011-08-15 22:04:40 +00001677
1678 if (isScopeAbstract) {
1679 DV->setDIE(VariableDie);
1680 return VariableDie;
1681 }
1682
1683 // Add variable address.
1684
1685 unsigned Offset = DV->getDotDebugLocOffset();
1686 if (Offset != ~0U) {
Eric Christopher40b6bf62013-06-24 21:34:55 +00001687 addLabel(VariableDie, dwarf::DW_AT_location, dwarf::DW_FORM_data4,
1688 Asm->GetTempSymbol("debug_loc", Offset));
Devang Patel3acc70e2011-08-15 22:04:40 +00001689 DV->setDIE(VariableDie);
1690 return VariableDie;
1691 }
1692
Eric Christophercead0332011-10-03 15:49:20 +00001693 // Check if variable is described by a DBG_VALUE instruction.
Devang Patel3acc70e2011-08-15 22:04:40 +00001694 if (const MachineInstr *DVInsn = DV->getMInsn()) {
David Blaikie0252265b2013-06-16 20:34:15 +00001695 assert(DVInsn->getNumOperands() == 3);
1696 if (DVInsn->getOperand(0).isReg()) {
1697 const MachineOperand RegOp = DVInsn->getOperand(0);
Adrian Prantl19942882013-07-09 21:44:06 +00001698 // If the second operand is an immediate, this is an indirect value.
Adrian Prantl418d1d12013-07-09 20:28:37 +00001699 if (DVInsn->getOperand(1).isImm()) {
1700 MachineLocation Location(RegOp.getReg(), DVInsn->getOperand(1).getImm());
Eric Christopherbf2d23c2013-06-24 21:07:27 +00001701 addVariableAddress(*DV, VariableDie, Location);
David Blaikie0252265b2013-06-16 20:34:15 +00001702 } else if (RegOp.getReg())
Eric Christopherbf2d23c2013-06-24 21:07:27 +00001703 addVariableAddress(*DV, VariableDie, MachineLocation(RegOp.getReg()));
David Blaikie0252265b2013-06-16 20:34:15 +00001704 } else if (DVInsn->getOperand(0).isImm())
Eric Christopher78fcf4902013-07-03 01:08:30 +00001705 addConstantValue(VariableDie, DVInsn->getOperand(0), DV->getType());
David Blaikie0252265b2013-06-16 20:34:15 +00001706 else if (DVInsn->getOperand(0).isFPImm())
Eric Christopher78fcf4902013-07-03 01:08:30 +00001707 addConstantFPValue(VariableDie, DVInsn->getOperand(0));
David Blaikie0252265b2013-06-16 20:34:15 +00001708 else if (DVInsn->getOperand(0).isCImm())
Eric Christopher78fcf4902013-07-03 01:08:30 +00001709 addConstantValue(VariableDie, DVInsn->getOperand(0).getCImm(),
Manman Renb3388602013-10-05 01:43:03 +00001710 isUnsignedDIType(DD, DV->getType()));
Eric Christopher78fcf4902013-07-03 01:08:30 +00001711
Devang Patel3acc70e2011-08-15 22:04:40 +00001712 DV->setDIE(VariableDie);
1713 return VariableDie;
1714 } else {
1715 // .. else use frame index.
1716 int FI = DV->getFrameIndex();
1717 if (FI != ~0) {
1718 unsigned FrameReg = 0;
1719 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
Eric Christopher92331fd2012-11-21 00:34:38 +00001720 int Offset =
Devang Patel3acc70e2011-08-15 22:04:40 +00001721 TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
1722 MachineLocation Location(FrameReg, Offset);
Eric Christopherbf2d23c2013-06-24 21:07:27 +00001723 addVariableAddress(*DV, VariableDie, Location);
Devang Patel3acc70e2011-08-15 22:04:40 +00001724 }
1725 }
1726
1727 DV->setDIE(VariableDie);
1728 return VariableDie;
1729}
1730
Devang Patel0e821f42011-04-12 23:21:44 +00001731/// createMemberDIE - Create new member DIE.
1732DIE *CompileUnit::createMemberDIE(DIDerivedType DT) {
1733 DIE *MemberDie = new DIE(DT.getTag());
1734 StringRef Name = DT.getName();
1735 if (!Name.empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +00001736 addString(MemberDie, dwarf::DW_AT_name, Name);
Devang Patel0e821f42011-04-12 23:21:44 +00001737
Manman Ren93b30902013-10-08 18:42:58 +00001738 addType(MemberDie, resolve(DT.getTypeDerivedFrom()));
Devang Patel0e821f42011-04-12 23:21:44 +00001739
1740 addSourceLine(MemberDie, DT);
1741
1742 DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
1743 addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1744
1745 uint64_t Size = DT.getSizeInBits();
Manman Renbda410f2013-10-08 18:46:58 +00001746 uint64_t FieldSize = getBaseTypeSize(DD, DT);
Devang Patel0e821f42011-04-12 23:21:44 +00001747
1748 if (Size != FieldSize) {
1749 // Handle bitfield.
Manman Renb3388602013-10-05 01:43:03 +00001750 addUInt(MemberDie, dwarf::DW_AT_byte_size, 0,
Manman Renbda410f2013-10-08 18:46:58 +00001751 getBaseTypeSize(DD, DT)>>3);
Devang Patel0e821f42011-04-12 23:21:44 +00001752 addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1753
1754 uint64_t Offset = DT.getOffsetInBits();
1755 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1756 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1757 uint64_t FieldOffset = (HiMark - FieldSize);
1758 Offset -= FieldOffset;
1759
1760 // Maybe we need to work from the other end.
Micah Villmowcdfe20b2012-10-08 16:38:25 +00001761 if (Asm->getDataLayout().isLittleEndian())
Devang Patel0e821f42011-04-12 23:21:44 +00001762 Offset = FieldSize - (Offset + Size);
1763 addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
1764
1765 // Here WD_AT_data_member_location points to the anonymous
1766 // field that includes this bit field.
1767 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
1768
1769 } else
1770 // This is not a bitfield.
1771 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1772
1773 if (DT.getTag() == dwarf::DW_TAG_inheritance
1774 && DT.isVirtual()) {
1775
1776 // For C++, virtual base classes are not at fixed offset. Use following
1777 // expression to extract appropriate offset from vtable.
1778 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1779
1780 DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
1781 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1782 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1783 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1784 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1785 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1786 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1787 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1788
1789 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
1790 VBaseLocationDie);
1791 } else
1792 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
1793
1794 if (DT.isProtected())
Nick Lewyckycb918492011-12-13 05:09:11 +00001795 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001796 dwarf::DW_ACCESS_protected);
1797 else if (DT.isPrivate())
Nick Lewyckycb918492011-12-13 05:09:11 +00001798 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001799 dwarf::DW_ACCESS_private);
1800 // Otherwise C++ member and base classes are considered public.
Eric Christopher92331fd2012-11-21 00:34:38 +00001801 else
Nick Lewyckycb918492011-12-13 05:09:11 +00001802 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001803 dwarf::DW_ACCESS_public);
1804 if (DT.isVirtual())
Nick Lewyckycfde1a22011-12-14 00:56:07 +00001805 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001806 dwarf::DW_VIRTUALITY_virtual);
Devang Patel514b4002011-04-16 00:11:51 +00001807
1808 // Objective-C properties.
Devang Patel44882172012-02-06 17:49:43 +00001809 if (MDNode *PNode = DT.getObjCProperty())
1810 if (DIEEntry *PropertyDie = getDIEEntry(PNode))
Eric Christopher92331fd2012-11-21 00:34:38 +00001811 MemberDie->addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4,
Devang Patel44882172012-02-06 17:49:43 +00001812 PropertyDie);
1813
David Blaikie37fefc32012-12-13 22:43:07 +00001814 if (DT.isArtificial())
1815 addFlag(MemberDie, dwarf::DW_AT_artificial);
1816
Devang Patel0e821f42011-04-12 23:21:44 +00001817 return MemberDie;
1818}
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001819
Manman Renc6b63922013-10-14 20:33:57 +00001820/// getOrCreateStaticMemberDIE - Create new DIE for C++ static member.
1821DIE *CompileUnit::getOrCreateStaticMemberDIE(const DIDerivedType DT) {
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001822 if (!DT.Verify())
1823 return NULL;
1824
Manman Renc6b63922013-10-14 20:33:57 +00001825 // Construct the context before querying for the existence of the DIE in case
1826 // such construction creates the DIE.
1827 DIE *ContextDIE = getOrCreateContextDIE(resolve(DT.getContext()));
1828 assert(ContextDIE && "Static member should belong to a non-CU context.");
1829
1830 DIE *StaticMemberDIE = getDIE(DT);
1831 if (StaticMemberDIE)
1832 return StaticMemberDIE;
1833
1834 StaticMemberDIE = new DIE(DT.getTag());
1835 // Add to context owner.
1836 ContextDIE->addChild(StaticMemberDIE);
1837
Manman Ren93b30902013-10-08 18:42:58 +00001838 DIType Ty = resolve(DT.getTypeDerivedFrom());
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001839
1840 addString(StaticMemberDIE, dwarf::DW_AT_name, DT.getName());
1841 addType(StaticMemberDIE, Ty);
1842 addSourceLine(StaticMemberDIE, DT);
1843 addFlag(StaticMemberDIE, dwarf::DW_AT_external);
1844 addFlag(StaticMemberDIE, dwarf::DW_AT_declaration);
1845
1846 // FIXME: We could omit private if the parent is a class_type, and
1847 // public if the parent is something else.
1848 if (DT.isProtected())
1849 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1850 dwarf::DW_ACCESS_protected);
1851 else if (DT.isPrivate())
1852 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1853 dwarf::DW_ACCESS_private);
1854 else
1855 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1856 dwarf::DW_ACCESS_public);
1857
1858 if (const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(DT.getConstant()))
Manman Renb3388602013-10-05 01:43:03 +00001859 addConstantValue(StaticMemberDIE, CI, isUnsignedDIType(DD, Ty));
David Blaikiea39a76e2013-01-20 01:18:01 +00001860 if (const ConstantFP *CFP = dyn_cast_or_null<ConstantFP>(DT.getConstant()))
1861 addConstantFPValue(StaticMemberDIE, CFP);
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001862
Eric Christophere595bae2013-10-04 17:08:38 +00001863 insertDIE(DT, StaticMemberDIE);
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001864 return StaticMemberDIE;
1865}