blob: 6bd4f08604044e4c280ac9eb6fb899586b8851c6 [file] [log] [blame]
Devang Patel161b2f42011-04-12 23:21:44 +00001//===-- llvm/CodeGen/DwarfCompileUnit.cpp - Dwarf Compile Unit ------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
Eric Christopher443c9ed2012-08-14 05:13:29 +000010// This file contains support for constructing a dwarf compile unit.
Devang Patel161b2f42011-04-12 23:21:44 +000011//
12//===----------------------------------------------------------------------===//
13
14#define DEBUG_TYPE "dwarfdebug"
15
16#include "DwarfCompileUnit.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000017#include "DwarfAccelTable.h"
Devang Patel161b2f42011-04-12 23:21:44 +000018#include "DwarfDebug.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000019#include "llvm/ADT/APFloat.h"
Bill Wendling16eeb6f2012-06-29 08:32:07 +000020#include "llvm/DIBuilder.h"
Chandler Carruth0b8c9a82013-01-02 11:36:10 +000021#include "llvm/IR/Constants.h"
22#include "llvm/IR/DataLayout.h"
23#include "llvm/IR/GlobalVariable.h"
24#include "llvm/IR/Instructions.h"
Eric Christopherd61c34b2011-11-11 03:16:32 +000025#include "llvm/Support/Debug.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000026#include "llvm/Support/ErrorHandling.h"
Devang Patel6f9d8ff2011-08-15 17:57:41 +000027#include "llvm/Target/Mangler.h"
Devang Patel161b2f42011-04-12 23:21:44 +000028#include "llvm/Target/TargetFrameLowering.h"
29#include "llvm/Target/TargetMachine.h"
30#include "llvm/Target/TargetRegisterInfo.h"
Devang Patel161b2f42011-04-12 23:21:44 +000031
32using namespace llvm;
33
34/// CompileUnit - Compile unit constructor.
Eric Christopher9c57ad22013-05-08 00:58:51 +000035CompileUnit::CompileUnit(unsigned UID, unsigned L, DIE *D, const MDNode *N,
Eric Christopher5592ba42013-05-30 00:43:32 +000036 AsmPrinter *A, DwarfDebug *DW, DwarfUnits *DWU)
Eric Christopher2e5d8702012-12-20 21:58:36 +000037 : UniqueID(UID), Language(L), CUDie(D), Asm(A), DD(DW), DU(DWU),
Manman Renbc3e96f2013-03-12 18:27:15 +000038 IndexTyDie(0), DebugInfoOffset(0) {
Devang Patel161b2f42011-04-12 23:21:44 +000039 DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
Eric Christopher9c57ad22013-05-08 00:58:51 +000040 insertDIE(N, D);
Devang Patel161b2f42011-04-12 23:21:44 +000041}
42
43/// ~CompileUnit - Destructor for compile unit.
44CompileUnit::~CompileUnit() {
45 for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
46 DIEBlocks[j]->~DIEBlock();
47}
48
49/// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
50/// information entry.
51DIEEntry *CompileUnit::createDIEEntry(DIE *Entry) {
52 DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
53 return Value;
54}
55
Bill Wendling6afe4782012-12-06 07:55:19 +000056/// getDefaultLowerBound - Return the default lower bound for an array. If the
Bill Wendling222c2fd2012-12-06 07:38:10 +000057/// DWARF version doesn't handle the language, return -1.
Bill Wendling6afe4782012-12-06 07:55:19 +000058int64_t CompileUnit::getDefaultLowerBound() const {
Bill Wendling222c2fd2012-12-06 07:38:10 +000059 switch (Language) {
60 default:
61 break;
62
63 case dwarf::DW_LANG_C89:
64 case dwarf::DW_LANG_C99:
65 case dwarf::DW_LANG_C:
66 case dwarf::DW_LANG_C_plus_plus:
67 case dwarf::DW_LANG_ObjC:
68 case dwarf::DW_LANG_ObjC_plus_plus:
69 return 0;
70
71 case dwarf::DW_LANG_Fortran77:
72 case dwarf::DW_LANG_Fortran90:
73 case dwarf::DW_LANG_Fortran95:
74 return 1;
75
76 // The languages below have valid values only if the DWARF version >= 4.
77 case dwarf::DW_LANG_Java:
78 case dwarf::DW_LANG_Python:
79 case dwarf::DW_LANG_UPC:
80 case dwarf::DW_LANG_D:
81 if (dwarf::DWARF_VERSION >= 4)
82 return 0;
83 break;
84
85 case dwarf::DW_LANG_Ada83:
86 case dwarf::DW_LANG_Ada95:
87 case dwarf::DW_LANG_Cobol74:
88 case dwarf::DW_LANG_Cobol85:
89 case dwarf::DW_LANG_Modula2:
90 case dwarf::DW_LANG_Pascal83:
91 case dwarf::DW_LANG_PLI:
92 if (dwarf::DWARF_VERSION >= 4)
93 return 1;
94 break;
95 }
96
97 return -1;
98}
99
Eric Christopher873cf0a2012-08-24 01:14:27 +0000100/// addFlag - Add a flag that is true.
101void CompileUnit::addFlag(DIE *Die, unsigned Attribute) {
102 if (!DD->useDarwinGDBCompat())
103 Die->addValue(Attribute, dwarf::DW_FORM_flag_present,
104 DIEIntegerOne);
105 else
106 addUInt(Die, Attribute, dwarf::DW_FORM_flag, 1);
107}
108
Devang Patel161b2f42011-04-12 23:21:44 +0000109/// addUInt - Add an unsigned integer attribute data and value.
110///
111void CompileUnit::addUInt(DIE *Die, unsigned Attribute,
112 unsigned Form, uint64_t Integer) {
113 if (!Form) Form = DIEInteger::BestForm(false, Integer);
114 DIEValue *Value = Integer == 1 ?
115 DIEIntegerOne : new (DIEValueAllocator) DIEInteger(Integer);
116 Die->addValue(Attribute, Form, Value);
117}
118
119/// addSInt - Add an signed integer attribute data and value.
120///
121void CompileUnit::addSInt(DIE *Die, unsigned Attribute,
122 unsigned Form, int64_t Integer) {
123 if (!Form) Form = DIEInteger::BestForm(true, Integer);
124 DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
125 Die->addValue(Attribute, Form, Value);
126}
127
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000128/// addString - Add a string attribute data and value. We always emit a
129/// reference to the string pool instead of immediate strings so that DIEs have
Eric Christopher3cc42202013-01-07 19:32:45 +0000130/// more predictable sizes. In the case of split dwarf we emit an index
131/// into another table which gets us the static offset into the string
132/// table.
Nick Lewycky390c40d2011-10-27 06:44:11 +0000133void CompileUnit::addString(DIE *Die, unsigned Attribute, StringRef String) {
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000134 if (!DD->useSplitDwarf()) {
135 MCSymbol *Symb = DU->getStringPoolEntry(String);
136 DIEValue *Value;
137 if (Asm->needsRelocationsForDwarfStringPool())
David Blaikie95e72c92013-06-28 20:05:04 +0000138 Value = new (DIEValueAllocator) DIELabel(Symb, Asm->OutContext);
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000139 else {
140 MCSymbol *StringPool = DU->getStringPoolSym();
141 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
142 }
143 Die->addValue(Attribute, dwarf::DW_FORM_strp, Value);
144 } else {
145 unsigned idx = DU->getStringPoolIndex(String);
146 DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx);
147 Die->addValue(Attribute, dwarf::DW_FORM_GNU_str_index, Value);
148 }
149}
150
151/// addLocalString - Add a string attribute data and value. This is guaranteed
152/// to be in the local string pool instead of indirected.
153void CompileUnit::addLocalString(DIE *Die, unsigned Attribute,
154 StringRef String) {
Eric Christopher2e5d8702012-12-20 21:58:36 +0000155 MCSymbol *Symb = DU->getStringPoolEntry(String);
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000156 DIEValue *Value;
157 if (Asm->needsRelocationsForDwarfStringPool())
David Blaikie95e72c92013-06-28 20:05:04 +0000158 Value = new (DIEValueAllocator) DIELabel(Symb, Asm->OutContext);
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000159 else {
Eric Christopher2e5d8702012-12-20 21:58:36 +0000160 MCSymbol *StringPool = DU->getStringPoolSym();
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000161 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
Nick Lewycky390c40d2011-10-27 06:44:11 +0000162 }
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000163 Die->addValue(Attribute, dwarf::DW_FORM_strp, Value);
Devang Patel161b2f42011-04-12 23:21:44 +0000164}
165
166/// addLabel - Add a Dwarf label attribute data and value.
167///
168void CompileUnit::addLabel(DIE *Die, unsigned Attribute, unsigned Form,
David Blaikie95e72c92013-06-28 20:05:04 +0000169 const MCSymbolRefExpr *Label) {
Devang Patel161b2f42011-04-12 23:21:44 +0000170 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
171 Die->addValue(Attribute, Form, Value);
172}
173
David Blaikie95e72c92013-06-28 20:05:04 +0000174void CompileUnit::addLabel(DIE *Die, unsigned Attribute, unsigned Form,
175 const MCSymbol *Label) {
176 addLabel(Die, Attribute, Form, MCSymbolRefExpr::Create(Label, Asm->OutContext));
177}
178
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000179/// addLabelAddress - Add a dwarf label attribute data and value using
180/// DW_FORM_addr or DW_FORM_GNU_addr_index.
181///
182void CompileUnit::addLabelAddress(DIE *Die, unsigned Attribute,
183 MCSymbol *Label) {
184 if (!DD->useSplitDwarf()) {
185 if (Label != NULL) {
David Blaikie95e72c92013-06-28 20:05:04 +0000186 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label, Asm->OutContext);
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000187 Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
188 } else {
189 DIEValue *Value = new (DIEValueAllocator) DIEInteger(0);
190 Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
191 }
192 } else {
193 unsigned idx = DU->getAddrPoolIndex(Label);
194 DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx);
195 Die->addValue(Attribute, dwarf::DW_FORM_GNU_addr_index, Value);
196 }
197}
198
Eric Christopher0969ddf2013-01-18 22:11:33 +0000199/// addOpAddress - Add a dwarf op address data and value using the
200/// form given and an op of either DW_FORM_addr or DW_FORM_GNU_addr_index.
201///
David Blaikie95e72c92013-06-28 20:05:04 +0000202void CompileUnit::addOpAddress(DIE *Die, const MCSymbol *Sym) {
Eric Christopher0969ddf2013-01-18 22:11:33 +0000203
204 if (!DD->useSplitDwarf()) {
205 addUInt(Die, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
206 addLabel(Die, 0, dwarf::DW_FORM_udata, Sym);
207 } else {
208 unsigned idx = DU->getAddrPoolIndex(Sym);
209 DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx);
210 addUInt(Die, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_addr_index);
211 Die->addValue(0, dwarf::DW_FORM_GNU_addr_index, Value);
212 }
213}
214
Devang Patel161b2f42011-04-12 23:21:44 +0000215/// addDelta - Add a label delta attribute data and value.
216///
217void CompileUnit::addDelta(DIE *Die, unsigned Attribute, unsigned Form,
218 const MCSymbol *Hi, const MCSymbol *Lo) {
219 DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
220 Die->addValue(Attribute, Form, Value);
221}
222
223/// addDIEEntry - Add a DIE attribute data and value.
224///
225void CompileUnit::addDIEEntry(DIE *Die, unsigned Attribute, unsigned Form,
226 DIE *Entry) {
227 Die->addValue(Attribute, Form, createDIEEntry(Entry));
228}
229
Devang Patel161b2f42011-04-12 23:21:44 +0000230/// addBlock - Add block data.
231///
232void CompileUnit::addBlock(DIE *Die, unsigned Attribute, unsigned Form,
233 DIEBlock *Block) {
234 Block->ComputeSize(Asm);
235 DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
236 Die->addValue(Attribute, Block->BestForm(), Block);
237}
238
239/// addSourceLine - Add location information to specified debug information
240/// entry.
241void CompileUnit::addSourceLine(DIE *Die, DIVariable V) {
242 // Verify variable.
243 if (!V.Verify())
244 return;
Eric Christopher8b4310b2012-11-21 00:34:38 +0000245
Devang Patel161b2f42011-04-12 23:21:44 +0000246 unsigned Line = V.getLineNumber();
247 if (Line == 0)
248 return;
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000249 unsigned FileID = DD->getOrCreateSourceID(V.getContext().getFilename(),
Manman Ren3de61b42013-03-07 01:42:00 +0000250 V.getContext().getDirectory(),
251 getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000252 assert(FileID && "Invalid file id");
253 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
254 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
255}
256
257/// addSourceLine - Add location information to specified debug information
258/// entry.
259void CompileUnit::addSourceLine(DIE *Die, DIGlobalVariable G) {
260 // Verify global variable.
261 if (!G.Verify())
262 return;
263
264 unsigned Line = G.getLineNumber();
265 if (Line == 0)
266 return;
Manman Ren3de61b42013-03-07 01:42:00 +0000267 unsigned FileID = DD->getOrCreateSourceID(G.getFilename(), G.getDirectory(),
268 getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000269 assert(FileID && "Invalid file id");
270 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
271 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
272}
273
274/// addSourceLine - Add location information to specified debug information
275/// entry.
276void CompileUnit::addSourceLine(DIE *Die, DISubprogram SP) {
277 // Verify subprogram.
278 if (!SP.Verify())
279 return;
Eric Christopher2125d5a2012-03-15 23:55:40 +0000280
Devang Patel161b2f42011-04-12 23:21:44 +0000281 // If the line number is 0, don't add it.
Eric Christopher2125d5a2012-03-15 23:55:40 +0000282 unsigned Line = SP.getLineNumber();
283 if (Line == 0)
Devang Patel161b2f42011-04-12 23:21:44 +0000284 return;
285
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000286 unsigned FileID = DD->getOrCreateSourceID(SP.getFilename(),
Manman Ren3de61b42013-03-07 01:42:00 +0000287 SP.getDirectory(), getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000288 assert(FileID && "Invalid file id");
289 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
290 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
291}
292
293/// addSourceLine - Add location information to specified debug information
294/// entry.
295void CompileUnit::addSourceLine(DIE *Die, DIType Ty) {
296 // Verify type.
297 if (!Ty.Verify())
298 return;
299
300 unsigned Line = Ty.getLineNumber();
Eric Christopher2125d5a2012-03-15 23:55:40 +0000301 if (Line == 0)
Devang Patel161b2f42011-04-12 23:21:44 +0000302 return;
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000303 unsigned FileID = DD->getOrCreateSourceID(Ty.getFilename(),
Manman Ren3de61b42013-03-07 01:42:00 +0000304 Ty.getDirectory(), getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000305 assert(FileID && "Invalid file id");
306 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
307 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
308}
309
310/// addSourceLine - Add location information to specified debug information
311/// entry.
Eric Christopherb8ca9882012-03-29 08:42:56 +0000312void CompileUnit::addSourceLine(DIE *Die, DIObjCProperty Ty) {
313 // Verify type.
314 if (!Ty.Verify())
315 return;
316
317 unsigned Line = Ty.getLineNumber();
318 if (Line == 0)
319 return;
320 DIFile File = Ty.getFile();
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000321 unsigned FileID = DD->getOrCreateSourceID(File.getFilename(),
Manman Ren3de61b42013-03-07 01:42:00 +0000322 File.getDirectory(), getUniqueID());
Eric Christopherb8ca9882012-03-29 08:42:56 +0000323 assert(FileID && "Invalid file id");
324 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
325 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
326}
327
328/// addSourceLine - Add location information to specified debug information
329/// entry.
Devang Patel161b2f42011-04-12 23:21:44 +0000330void CompileUnit::addSourceLine(DIE *Die, DINameSpace NS) {
331 // Verify namespace.
332 if (!NS.Verify())
333 return;
334
335 unsigned Line = NS.getLineNumber();
336 if (Line == 0)
337 return;
338 StringRef FN = NS.getFilename();
339
Manman Ren3de61b42013-03-07 01:42:00 +0000340 unsigned FileID = DD->getOrCreateSourceID(FN, NS.getDirectory(),
341 getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000342 assert(FileID && "Invalid file id");
343 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
344 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
345}
346
Eric Christopher8b4310b2012-11-21 00:34:38 +0000347/// addVariableAddress - Add DW_AT_location attribute for a
Devang Patele1cdf842011-04-27 22:45:24 +0000348/// DbgVariable based on provided MachineLocation.
Eric Christopherf61dbc12013-06-24 21:07:27 +0000349void CompileUnit::addVariableAddress(const DbgVariable &DV, DIE *Die,
Devang Patele1cdf842011-04-27 22:45:24 +0000350 MachineLocation Location) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000351 if (DV.variableHasComplexAddress())
Devang Patel161b2f42011-04-12 23:21:44 +0000352 addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
Eric Christopherf61dbc12013-06-24 21:07:27 +0000353 else if (DV.isBlockByrefVariable())
Devang Patel161b2f42011-04-12 23:21:44 +0000354 addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location);
355 else
David Blaikie4532c282013-06-20 00:25:24 +0000356 addAddress(Die, dwarf::DW_AT_location, Location,
Eric Christopherf61dbc12013-06-24 21:07:27 +0000357 DV.getVariable().isIndirect());
Devang Patel161b2f42011-04-12 23:21:44 +0000358}
359
Devang Patel116da2f2011-04-26 19:06:18 +0000360/// addRegisterOp - Add register operand.
361void CompileUnit::addRegisterOp(DIE *TheDie, unsigned Reg) {
362 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
363 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
364 if (DWReg < 32)
365 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + DWReg);
366 else {
367 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
368 addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
369 }
370}
371
372/// addRegisterOffset - Add register offset.
373void CompileUnit::addRegisterOffset(DIE *TheDie, unsigned Reg,
374 int64_t Offset) {
375 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
376 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
377 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
378 if (Reg == TRI->getFrameRegister(*Asm->MF))
379 // If variable offset is based in frame register then use fbreg.
380 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
381 else if (DWReg < 32)
382 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DWReg);
383 else {
384 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
385 addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
386 }
387 addSInt(TheDie, 0, dwarf::DW_FORM_sdata, Offset);
388}
389
390/// addAddress - Add an address attribute to a die based on the location
391/// provided.
392void CompileUnit::addAddress(DIE *Die, unsigned Attribute,
David Blaikie4532c282013-06-20 00:25:24 +0000393 const MachineLocation &Location, bool Indirect) {
Devang Patel116da2f2011-04-26 19:06:18 +0000394 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
395
David Blaikie4532c282013-06-20 00:25:24 +0000396 if (Location.isReg() && !Indirect)
Devang Patel116da2f2011-04-26 19:06:18 +0000397 addRegisterOp(Block, Location.getReg());
David Blaikie4532c282013-06-20 00:25:24 +0000398 else {
Devang Patel116da2f2011-04-26 19:06:18 +0000399 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
David Blaikie4532c282013-06-20 00:25:24 +0000400 if (Indirect && !Location.isReg()) {
401 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
402 }
403 }
Devang Patel116da2f2011-04-26 19:06:18 +0000404
405 // Now attach the location information to the DIE.
406 addBlock(Die, Attribute, 0, Block);
407}
408
Devang Patel161b2f42011-04-12 23:21:44 +0000409/// addComplexAddress - Start with the address based on the location provided,
410/// and generate the DWARF information necessary to find the actual variable
411/// given the extra address information encoded in the DIVariable, starting from
412/// the starting location. Add the DWARF information to the die.
413///
Eric Christopherf61dbc12013-06-24 21:07:27 +0000414void CompileUnit::addComplexAddress(const DbgVariable &DV, DIE *Die,
Devang Patel161b2f42011-04-12 23:21:44 +0000415 unsigned Attribute,
416 const MachineLocation &Location) {
Devang Patel161b2f42011-04-12 23:21:44 +0000417 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Eric Christopherf61dbc12013-06-24 21:07:27 +0000418 unsigned N = DV.getNumAddrElements();
Devang Patelc26f5442011-04-28 02:22:40 +0000419 unsigned i = 0;
420 if (Location.isReg()) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000421 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
Devang Patelc26f5442011-04-28 02:22:40 +0000422 // If first address element is OpPlus then emit
423 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
Eric Christopherf61dbc12013-06-24 21:07:27 +0000424 addRegisterOffset(Block, Location.getReg(), DV.getAddrElement(1));
Devang Patelc26f5442011-04-28 02:22:40 +0000425 i = 2;
426 } else
427 addRegisterOp(Block, Location.getReg());
428 }
Devang Patel116da2f2011-04-26 19:06:18 +0000429 else
430 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel161b2f42011-04-12 23:21:44 +0000431
Devang Patelc26f5442011-04-28 02:22:40 +0000432 for (;i < N; ++i) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000433 uint64_t Element = DV.getAddrElement(i);
Devang Patel161b2f42011-04-12 23:21:44 +0000434 if (Element == DIBuilder::OpPlus) {
435 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
Eric Christopherf61dbc12013-06-24 21:07:27 +0000436 addUInt(Block, 0, dwarf::DW_FORM_udata, DV.getAddrElement(++i));
Devang Patel161b2f42011-04-12 23:21:44 +0000437 } else if (Element == DIBuilder::OpDeref) {
Eric Christopher50120762012-05-08 18:56:00 +0000438 if (!Location.isReg())
439 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Devang Patel161b2f42011-04-12 23:21:44 +0000440 } else llvm_unreachable("unknown DIBuilder Opcode");
441 }
442
443 // Now attach the location information to the DIE.
444 addBlock(Die, Attribute, 0, Block);
445}
446
447/* Byref variables, in Blocks, are declared by the programmer as "SomeType
448 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
449 gives the variable VarName either the struct, or a pointer to the struct, as
450 its type. This is necessary for various behind-the-scenes things the
451 compiler needs to do with by-reference variables in Blocks.
452
453 However, as far as the original *programmer* is concerned, the variable
454 should still have type 'SomeType', as originally declared.
455
456 The function getBlockByrefType dives into the __Block_byref_x_VarName
457 struct to find the original type of the variable, which is then assigned to
458 the variable's Debug Information Entry as its real type. So far, so good.
459 However now the debugger will expect the variable VarName to have the type
460 SomeType. So we need the location attribute for the variable to be an
461 expression that explains to the debugger how to navigate through the
462 pointers and struct to find the actual variable of type SomeType.
463
464 The following function does just that. We start by getting
465 the "normal" location for the variable. This will be the location
466 of either the struct __Block_byref_x_VarName or the pointer to the
467 struct __Block_byref_x_VarName.
468
469 The struct will look something like:
470
471 struct __Block_byref_x_VarName {
472 ... <various fields>
473 struct __Block_byref_x_VarName *forwarding;
474 ... <various other fields>
475 SomeType VarName;
476 ... <maybe more fields>
477 };
478
479 If we are given the struct directly (as our starting point) we
480 need to tell the debugger to:
481
482 1). Add the offset of the forwarding field.
483
484 2). Follow that pointer to get the real __Block_byref_x_VarName
485 struct to use (the real one may have been copied onto the heap).
486
487 3). Add the offset for the field VarName, to find the actual variable.
488
489 If we started with a pointer to the struct, then we need to
490 dereference that pointer first, before the other steps.
491 Translating this into DWARF ops, we will need to append the following
492 to the current location description for the variable:
493
494 DW_OP_deref -- optional, if we start with a pointer
495 DW_OP_plus_uconst <forward_fld_offset>
496 DW_OP_deref
497 DW_OP_plus_uconst <varName_fld_offset>
498
499 That is what this function does. */
500
501/// addBlockByrefAddress - Start with the address based on the location
502/// provided, and generate the DWARF information necessary to find the
503/// actual Block variable (navigating the Block struct) based on the
504/// starting location. Add the DWARF information to the die. For
505/// more information, read large comment just above here.
506///
Eric Christopherf61dbc12013-06-24 21:07:27 +0000507void CompileUnit::addBlockByrefAddress(const DbgVariable &DV, DIE *Die,
Devang Patel161b2f42011-04-12 23:21:44 +0000508 unsigned Attribute,
509 const MachineLocation &Location) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000510 DIType Ty = DV.getType();
Devang Patel161b2f42011-04-12 23:21:44 +0000511 DIType TmpTy = Ty;
512 unsigned Tag = Ty.getTag();
513 bool isPointer = false;
514
Eric Christopherf61dbc12013-06-24 21:07:27 +0000515 StringRef varName = DV.getName();
Devang Patel161b2f42011-04-12 23:21:44 +0000516
517 if (Tag == dwarf::DW_TAG_pointer_type) {
518 DIDerivedType DTy = DIDerivedType(Ty);
519 TmpTy = DTy.getTypeDerivedFrom();
520 isPointer = true;
521 }
522
523 DICompositeType blockStruct = DICompositeType(TmpTy);
524
525 // Find the __forwarding field and the variable field in the __Block_byref
526 // struct.
527 DIArray Fields = blockStruct.getTypeArray();
528 DIDescriptor varField = DIDescriptor();
529 DIDescriptor forwardingField = DIDescriptor();
530
531 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
532 DIDescriptor Element = Fields.getElement(i);
533 DIDerivedType DT = DIDerivedType(Element);
534 StringRef fieldName = DT.getName();
535 if (fieldName == "__forwarding")
536 forwardingField = Element;
537 else if (fieldName == varName)
538 varField = Element;
539 }
540
541 // Get the offsets for the forwarding field and the variable field.
542 unsigned forwardingFieldOffset =
543 DIDerivedType(forwardingField).getOffsetInBits() >> 3;
544 unsigned varFieldOffset =
545 DIDerivedType(varField).getOffsetInBits() >> 3;
546
547 // Decode the original location, and use that as the start of the byref
548 // variable's location.
Devang Patel161b2f42011-04-12 23:21:44 +0000549 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
550
Eric Christophercaba2632012-07-04 02:02:18 +0000551 if (Location.isReg())
552 addRegisterOp(Block, Location.getReg());
553 else
554 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel161b2f42011-04-12 23:21:44 +0000555
556 // If we started with a pointer to the __Block_byref... struct, then
557 // the first thing we need to do is dereference the pointer (DW_OP_deref).
558 if (isPointer)
559 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
560
561 // Next add the offset for the '__forwarding' field:
562 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
563 // adding the offset if it's 0.
564 if (forwardingFieldOffset > 0) {
565 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
566 addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
567 }
568
569 // Now dereference the __forwarding field to get to the real __Block_byref
570 // struct: DW_OP_deref.
571 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
572
573 // Now that we've got the real __Block_byref... struct, add the offset
574 // for the variable's field to get to the location of the actual variable:
575 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
576 if (varFieldOffset > 0) {
577 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
578 addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
579 }
580
581 // Now attach the location information to the DIE.
582 addBlock(Die, Attribute, 0, Block);
583}
584
Devang Patel4ec14b02011-07-20 21:57:04 +0000585/// isTypeSigned - Return true if the type is signed.
586static bool isTypeSigned(DIType Ty, int *SizeInBits) {
587 if (Ty.isDerivedType())
588 return isTypeSigned(DIDerivedType(Ty).getTypeDerivedFrom(), SizeInBits);
589 if (Ty.isBasicType())
590 if (DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed
591 || DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed_char) {
592 *SizeInBits = Ty.getSizeInBits();
593 return true;
594 }
595 return false;
596}
597
Devang Patel161b2f42011-04-12 23:21:44 +0000598/// addConstantValue - Add constant value entry in variable DIE.
Devang Patelb58128e2011-05-27 16:45:18 +0000599bool CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO,
600 DIType Ty) {
David Blaikie4de9d722013-05-10 21:52:07 +0000601 // FIXME: This is a bit conservative/simple - it emits negative values at
602 // their maximum bit width which is a bit unfortunate (& doesn't prefer
603 // udata/sdata over dataN as suggested by the DWARF spec)
Nick Lewycky746cb672011-10-26 22:55:33 +0000604 assert(MO.isImm() && "Invalid machine operand!");
Devang Patel161b2f42011-04-12 23:21:44 +0000605 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Devang Patel4ec14b02011-07-20 21:57:04 +0000606 int SizeInBits = -1;
607 bool SignedConstant = isTypeSigned(Ty, &SizeInBits);
608 unsigned Form = SignedConstant ? dwarf::DW_FORM_sdata : dwarf::DW_FORM_udata;
609 switch (SizeInBits) {
610 case 8: Form = dwarf::DW_FORM_data1; break;
611 case 16: Form = dwarf::DW_FORM_data2; break;
612 case 32: Form = dwarf::DW_FORM_data4; break;
613 case 64: Form = dwarf::DW_FORM_data8; break;
Devang Patel045c1d42011-05-27 19:13:26 +0000614 default: break;
615 }
Eric Christopher8b4310b2012-11-21 00:34:38 +0000616 SignedConstant ? addSInt(Block, 0, Form, MO.getImm())
Devang Patel4ec14b02011-07-20 21:57:04 +0000617 : addUInt(Block, 0, Form, MO.getImm());
Devang Patel72f0d9c2011-05-27 18:15:52 +0000618
Devang Patel161b2f42011-04-12 23:21:44 +0000619 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
620 return true;
621}
622
623/// addConstantFPValue - Add constant value entry in variable DIE.
624bool CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
Nick Lewycky390c40d2011-10-27 06:44:11 +0000625 assert (MO.isFPImm() && "Invalid machine operand!");
Devang Patel161b2f42011-04-12 23:21:44 +0000626 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
627 APFloat FPImm = MO.getFPImm()->getValueAPF();
628
629 // Get the raw data form of the floating point.
630 const APInt FltVal = FPImm.bitcastToAPInt();
631 const char *FltPtr = (const char*)FltVal.getRawData();
632
633 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
Micah Villmow3574eca2012-10-08 16:38:25 +0000634 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel161b2f42011-04-12 23:21:44 +0000635 int Incr = (LittleEndian ? 1 : -1);
636 int Start = (LittleEndian ? 0 : NumBytes - 1);
637 int Stop = (LittleEndian ? NumBytes : -1);
638
639 // Output the constant to DWARF one byte at a time.
640 for (; Start != Stop; Start += Incr)
641 addUInt(Block, 0, dwarf::DW_FORM_data1,
642 (unsigned char)0xFF & FltPtr[Start]);
643
644 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
645 return true;
646}
647
David Blaikie14268412013-01-20 01:18:01 +0000648/// addConstantFPValue - Add constant value entry in variable DIE.
649bool CompileUnit::addConstantFPValue(DIE *Die, const ConstantFP *CFP) {
650 return addConstantValue(Die, CFP->getValueAPF().bitcastToAPInt(), false);
651}
652
Devang Patel161b2f42011-04-12 23:21:44 +0000653/// addConstantValue - Add constant value entry in variable DIE.
Devang Patel8594d422011-06-24 20:46:11 +0000654bool CompileUnit::addConstantValue(DIE *Die, const ConstantInt *CI,
Devang Patel161b2f42011-04-12 23:21:44 +0000655 bool Unsigned) {
David Blaikie14268412013-01-20 01:18:01 +0000656 return addConstantValue(Die, CI->getValue(), Unsigned);
657}
658
659// addConstantValue - Add constant value entry in variable DIE.
660bool CompileUnit::addConstantValue(DIE *Die, const APInt &Val,
661 bool Unsigned) {
662 unsigned CIBitWidth = Val.getBitWidth();
Devang Pateld6a81362011-05-28 00:39:18 +0000663 if (CIBitWidth <= 64) {
664 unsigned form = 0;
665 switch (CIBitWidth) {
666 case 8: form = dwarf::DW_FORM_data1; break;
667 case 16: form = dwarf::DW_FORM_data2; break;
668 case 32: form = dwarf::DW_FORM_data4; break;
669 case 64: form = dwarf::DW_FORM_data8; break;
Eric Christopher8b4310b2012-11-21 00:34:38 +0000670 default:
Devang Pateld6a81362011-05-28 00:39:18 +0000671 form = Unsigned ? dwarf::DW_FORM_udata : dwarf::DW_FORM_sdata;
672 }
Devang Patel161b2f42011-04-12 23:21:44 +0000673 if (Unsigned)
David Blaikie14268412013-01-20 01:18:01 +0000674 addUInt(Die, dwarf::DW_AT_const_value, form, Val.getZExtValue());
Devang Patel161b2f42011-04-12 23:21:44 +0000675 else
David Blaikie14268412013-01-20 01:18:01 +0000676 addSInt(Die, dwarf::DW_AT_const_value, form, Val.getSExtValue());
Devang Patel161b2f42011-04-12 23:21:44 +0000677 return true;
678 }
679
680 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
681
682 // Get the raw data form of the large APInt.
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000683 const uint64_t *Ptr64 = Val.getRawData();
Devang Patel161b2f42011-04-12 23:21:44 +0000684
685 int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
Micah Villmow3574eca2012-10-08 16:38:25 +0000686 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel161b2f42011-04-12 23:21:44 +0000687
688 // Output the constant to DWARF one byte at a time.
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000689 for (int i = 0; i < NumBytes; i++) {
690 uint8_t c;
691 if (LittleEndian)
692 c = Ptr64[i / 8] >> (8 * (i & 7));
693 else
694 c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7));
695 addUInt(Block, 0, dwarf::DW_FORM_data1, c);
696 }
Devang Patel161b2f42011-04-12 23:21:44 +0000697
698 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
699 return true;
700}
701
Eric Christopher6c3bb942013-04-22 07:47:40 +0000702/// addTemplateParams - Add template parameters into buffer.
Devang Patel161b2f42011-04-12 23:21:44 +0000703void CompileUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
704 // Add template parameters.
705 for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) {
706 DIDescriptor Element = TParams.getElement(i);
707 if (Element.isTemplateTypeParameter())
708 Buffer.addChild(getOrCreateTemplateTypeParameterDIE(
709 DITemplateTypeParameter(Element)));
710 else if (Element.isTemplateValueParameter())
711 Buffer.addChild(getOrCreateTemplateValueParameterDIE(
712 DITemplateValueParameter(Element)));
713 }
Devang Patel161b2f42011-04-12 23:21:44 +0000714}
Nick Lewycky746cb672011-10-26 22:55:33 +0000715
Eric Christopher6b6061f2013-01-16 01:22:23 +0000716/// getOrCreateContextDIE - Get context owner's DIE.
717DIE *CompileUnit::getOrCreateContextDIE(DIDescriptor Context) {
718 if (Context.isType())
719 return getOrCreateTypeDIE(DIType(Context));
720 else if (Context.isNameSpace())
721 return getOrCreateNameSpace(DINameSpace(Context));
722 else if (Context.isSubprogram())
723 return getOrCreateSubprogramDIE(DISubprogram(Context));
Eric Christopher6c3bb942013-04-22 07:47:40 +0000724 else
Eric Christopher6b6061f2013-01-16 01:22:23 +0000725 return getDIE(Context);
726}
727
Devang Patel161b2f42011-04-12 23:21:44 +0000728/// addToContextOwner - Add Die into the list of its context owner's children.
729void CompileUnit::addToContextOwner(DIE *Die, DIDescriptor Context) {
Eric Christopher6b6061f2013-01-16 01:22:23 +0000730 if (DIE *ContextDIE = getOrCreateContextDIE(Context))
Devang Patel161b2f42011-04-12 23:21:44 +0000731 ContextDIE->addChild(Die);
732 else
733 addDie(Die);
734}
735
736/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
737/// given DIType.
Devang Patel94c7ddb2011-08-16 22:09:43 +0000738DIE *CompileUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
739 DIType Ty(TyNode);
740 if (!Ty.Verify())
741 return NULL;
Devang Patel161b2f42011-04-12 23:21:44 +0000742 DIE *TyDIE = getDIE(Ty);
743 if (TyDIE)
744 return TyDIE;
745
746 // Create new type.
747 TyDIE = new DIE(dwarf::DW_TAG_base_type);
748 insertDIE(Ty, TyDIE);
749 if (Ty.isBasicType())
750 constructTypeDIE(*TyDIE, DIBasicType(Ty));
751 else if (Ty.isCompositeType())
752 constructTypeDIE(*TyDIE, DICompositeType(Ty));
753 else {
754 assert(Ty.isDerivedType() && "Unknown kind of DIType");
755 constructTypeDIE(*TyDIE, DIDerivedType(Ty));
756 }
Eric Christopher1b3f9192011-11-10 19:52:58 +0000757 // If this is a named finished type then include it in the list of types
758 // for the accelerator tables.
Eric Christopherc36145f2012-01-06 04:35:23 +0000759 if (!Ty.getName().empty() && !Ty.isForwardDecl()) {
760 bool IsImplementation = 0;
761 if (Ty.isCompositeType()) {
762 DICompositeType CT(Ty);
Eric Christophere0167892012-01-06 23:03:37 +0000763 // A runtime language of 0 actually means C/C++ and that any
764 // non-negative value is some version of Objective-C/C++.
Eric Christopherc36145f2012-01-06 04:35:23 +0000765 IsImplementation = (CT.getRunTimeLang() == 0) ||
Eric Christophere2dc9332012-02-22 08:46:02 +0000766 CT.isObjcClassComplete();
Eric Christopherc36145f2012-01-06 04:35:23 +0000767 }
Eric Christophere0167892012-01-06 23:03:37 +0000768 unsigned Flags = IsImplementation ?
769 DwarfAccelTable::eTypeFlagClassIsImplementation : 0;
770 addAccelType(Ty.getName(), std::make_pair(TyDIE, Flags));
Eric Christopherc36145f2012-01-06 04:35:23 +0000771 }
Eric Christopher8b4310b2012-11-21 00:34:38 +0000772
Devang Patel161b2f42011-04-12 23:21:44 +0000773 addToContextOwner(TyDIE, Ty.getContext());
774 return TyDIE;
775}
776
777/// addType - Add a new type attribute to the specified entity.
Eric Christopher4d069bf2012-05-22 18:45:24 +0000778void CompileUnit::addType(DIE *Entity, DIType Ty, unsigned Attribute) {
Devang Patel161b2f42011-04-12 23:21:44 +0000779 if (!Ty.Verify())
780 return;
781
782 // Check for pre-existence.
783 DIEEntry *Entry = getDIEEntry(Ty);
784 // If it exists then use the existing value.
785 if (Entry) {
Eric Christopher663e0cf2012-03-28 07:34:31 +0000786 Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
Devang Patel161b2f42011-04-12 23:21:44 +0000787 return;
788 }
789
790 // Construct type.
791 DIE *Buffer = getOrCreateTypeDIE(Ty);
792
793 // Set up proxy.
794 Entry = createDIEEntry(Buffer);
795 insertDIEEntry(Ty, Entry);
Eric Christopher663e0cf2012-03-28 07:34:31 +0000796 Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
Devang Patele9ae06c2011-05-31 22:56:51 +0000797
798 // If this is a complete composite type then include it in the
799 // list of global types.
Devang Patelc20bdf12011-06-01 00:23:24 +0000800 addGlobalType(Ty);
Devang Patel66658e42011-05-31 23:30:30 +0000801}
802
803/// addGlobalType - Add a new global type to the compile unit.
804///
Devang Patelc20bdf12011-06-01 00:23:24 +0000805void CompileUnit::addGlobalType(DIType Ty) {
Devang Patele9ae06c2011-05-31 22:56:51 +0000806 DIDescriptor Context = Ty.getContext();
Eric Christopher8b4310b2012-11-21 00:34:38 +0000807 if (Ty.isCompositeType() && !Ty.getName().empty() && !Ty.isForwardDecl()
808 && (!Context || Context.isCompileUnit() || Context.isFile()
Devang Patel94c7ddb2011-08-16 22:09:43 +0000809 || Context.isNameSpace()))
Devang Patelc20bdf12011-06-01 00:23:24 +0000810 if (DIEEntry *Entry = getDIEEntry(Ty))
811 GlobalTypes[Ty.getName()] = Entry->getEntry();
Devang Patel161b2f42011-04-12 23:21:44 +0000812}
813
Devang Patel31c5d052011-05-06 16:57:54 +0000814/// addPubTypes - Add type for pubtypes section.
815void CompileUnit::addPubTypes(DISubprogram SP) {
816 DICompositeType SPTy = SP.getType();
817 unsigned SPTag = SPTy.getTag();
818 if (SPTag != dwarf::DW_TAG_subroutine_type)
819 return;
820
821 DIArray Args = SPTy.getTypeArray();
822 for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
823 DIType ATy(Args.getElement(i));
824 if (!ATy.Verify())
825 continue;
Devang Patelc20bdf12011-06-01 00:23:24 +0000826 addGlobalType(ATy);
Devang Patel31c5d052011-05-06 16:57:54 +0000827 }
828}
829
Devang Patel161b2f42011-04-12 23:21:44 +0000830/// constructTypeDIE - Construct basic type die from DIBasicType.
831void CompileUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
832 // Get core information.
833 StringRef Name = BTy.getName();
Devang Patel161b2f42011-04-12 23:21:44 +0000834 // Add name if not anonymous or intermediate type.
835 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000836 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel734a67c2011-09-14 23:13:28 +0000837
838 if (BTy.getTag() == dwarf::DW_TAG_unspecified_type) {
839 Buffer.setTag(dwarf::DW_TAG_unspecified_type);
840 // Unspecified types has only name, nothing else.
841 return;
842 }
843
844 Buffer.setTag(dwarf::DW_TAG_base_type);
Nick Lewycky746cb672011-10-26 22:55:33 +0000845 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
Devang Patel30d409c2012-02-07 23:33:58 +0000846 BTy.getEncoding());
Devang Patel734a67c2011-09-14 23:13:28 +0000847
Devang Patel161b2f42011-04-12 23:21:44 +0000848 uint64_t Size = BTy.getSizeInBits() >> 3;
849 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
850}
851
852/// constructTypeDIE - Construct derived type die from DIDerivedType.
853void CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
854 // Get core information.
855 StringRef Name = DTy.getName();
856 uint64_t Size = DTy.getSizeInBits() >> 3;
857 unsigned Tag = DTy.getTag();
858
859 // FIXME - Workaround for templates.
860 if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
861
862 Buffer.setTag(Tag);
863
864 // Map to main type, void will not have a type.
865 DIType FromTy = DTy.getTypeDerivedFrom();
866 addType(&Buffer, FromTy);
867
868 // Add name if not anonymous or intermediate type.
869 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000870 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +0000871
872 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopher35f225a2012-02-21 22:25:53 +0000873 if (Size && Tag != dwarf::DW_TAG_pointer_type)
Devang Patel161b2f42011-04-12 23:21:44 +0000874 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
875
David Blaikie62fdfb52013-01-07 05:51:15 +0000876 if (Tag == dwarf::DW_TAG_ptr_to_member_type)
877 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
878 getOrCreateTypeDIE(DTy.getClassType()));
Devang Patel161b2f42011-04-12 23:21:44 +0000879 // Add source line info if available and TyDesc is not a forward declaration.
880 if (!DTy.isForwardDecl())
881 addSourceLine(&Buffer, DTy);
882}
883
884/// constructTypeDIE - Construct type DIE from DICompositeType.
885void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
886 // Get core information.
887 StringRef Name = CTy.getName();
888
889 uint64_t Size = CTy.getSizeInBits() >> 3;
890 unsigned Tag = CTy.getTag();
891 Buffer.setTag(Tag);
892
893 switch (Tag) {
Devang Patel161b2f42011-04-12 23:21:44 +0000894 case dwarf::DW_TAG_array_type:
895 constructArrayTypeDIE(Buffer, &CTy);
896 break;
897 case dwarf::DW_TAG_enumeration_type: {
898 DIArray Elements = CTy.getTypeArray();
899
900 // Add enumerators to enumeration type.
901 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
902 DIE *ElemDie = NULL;
903 DIDescriptor Enum(Elements.getElement(i));
904 if (Enum.isEnumerator()) {
905 ElemDie = constructEnumTypeDIE(DIEnumerator(Enum));
906 Buffer.addChild(ElemDie);
907 }
908 }
Eric Christopherbb0f6ea2012-05-23 00:09:20 +0000909 DIType DTy = CTy.getTypeDerivedFrom();
910 if (DTy.Verify()) {
911 addType(&Buffer, DTy);
912 addUInt(&Buffer, dwarf::DW_AT_enum_class, dwarf::DW_FORM_flag, 1);
913 }
Devang Patel161b2f42011-04-12 23:21:44 +0000914 }
915 break;
916 case dwarf::DW_TAG_subroutine_type: {
917 // Add return type.
918 DIArray Elements = CTy.getTypeArray();
919 DIDescriptor RTy = Elements.getElement(0);
920 addType(&Buffer, DIType(RTy));
921
922 bool isPrototyped = true;
923 // Add arguments.
924 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
925 DIDescriptor Ty = Elements.getElement(i);
926 if (Ty.isUnspecifiedParameter()) {
927 DIE *Arg = new DIE(dwarf::DW_TAG_unspecified_parameters);
928 Buffer.addChild(Arg);
929 isPrototyped = false;
930 } else {
931 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
932 addType(Arg, DIType(Ty));
David Blaikieaaf2e632013-01-29 19:35:24 +0000933 if (DIType(Ty).isArtificial())
934 addFlag(Arg, dwarf::DW_AT_artificial);
Devang Patel161b2f42011-04-12 23:21:44 +0000935 Buffer.addChild(Arg);
936 }
937 }
Eric Christopher8b6fe6b2012-02-22 08:46:21 +0000938 // Add prototype flag if we're dealing with a C language and the
939 // function has been prototyped.
940 if (isPrototyped &&
Eric Christopher4d069bf2012-05-22 18:45:24 +0000941 (Language == dwarf::DW_LANG_C89 ||
942 Language == dwarf::DW_LANG_C99 ||
943 Language == dwarf::DW_LANG_ObjC))
Eric Christopher873cf0a2012-08-24 01:14:27 +0000944 addFlag(&Buffer, dwarf::DW_AT_prototyped);
Devang Patel161b2f42011-04-12 23:21:44 +0000945 }
946 break;
947 case dwarf::DW_TAG_structure_type:
948 case dwarf::DW_TAG_union_type:
949 case dwarf::DW_TAG_class_type: {
950 // Add elements to structure type.
951 DIArray Elements = CTy.getTypeArray();
952
953 // A forward struct declared type may not have elements available.
954 unsigned N = Elements.getNumElements();
955 if (N == 0)
956 break;
957
958 // Add elements to structure type.
959 for (unsigned i = 0; i < N; ++i) {
960 DIDescriptor Element = Elements.getElement(i);
961 DIE *ElemDie = NULL;
962 if (Element.isSubprogram()) {
963 DISubprogram SP(Element);
Devang Pateldbc64af2011-08-15 17:24:54 +0000964 ElemDie = getOrCreateSubprogramDIE(DISubprogram(Element));
Devang Patel161b2f42011-04-12 23:21:44 +0000965 if (SP.isProtected())
Nick Lewycky13aaca52011-12-13 05:09:11 +0000966 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +0000967 dwarf::DW_ACCESS_protected);
968 else if (SP.isPrivate())
Nick Lewycky13aaca52011-12-13 05:09:11 +0000969 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +0000970 dwarf::DW_ACCESS_private);
Eric Christopher8b4310b2012-11-21 00:34:38 +0000971 else
Nick Lewycky13aaca52011-12-13 05:09:11 +0000972 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +0000973 dwarf::DW_ACCESS_public);
974 if (SP.isExplicit())
Eric Christopher873cf0a2012-08-24 01:14:27 +0000975 addFlag(ElemDie, dwarf::DW_AT_explicit);
Eric Christopher663e0cf2012-03-28 07:34:31 +0000976 } else if (Element.isDerivedType()) {
Eric Christopher4d069bf2012-05-22 18:45:24 +0000977 DIDerivedType DDTy(Element);
978 if (DDTy.getTag() == dwarf::DW_TAG_friend) {
979 ElemDie = new DIE(dwarf::DW_TAG_friend);
980 addType(ElemDie, DDTy.getTypeDerivedFrom(), dwarf::DW_AT_friend);
Eric Christopher6b6061f2013-01-16 01:22:23 +0000981 } else if (DDTy.isStaticMember())
982 ElemDie = createStaticMemberDIE(DDTy);
983 else
984 ElemDie = createMemberDIE(DDTy);
Eric Christopher663e0cf2012-03-28 07:34:31 +0000985 } else if (Element.isObjCProperty()) {
Devang Patel30d409c2012-02-07 23:33:58 +0000986 DIObjCProperty Property(Element);
987 ElemDie = new DIE(Property.getTag());
988 StringRef PropertyName = Property.getObjCPropertyName();
989 addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
Eric Christopher4d069bf2012-05-22 18:45:24 +0000990 addType(ElemDie, Property.getType());
991 addSourceLine(ElemDie, Property);
Devang Patel30d409c2012-02-07 23:33:58 +0000992 StringRef GetterName = Property.getObjCPropertyGetterName();
993 if (!GetterName.empty())
994 addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
995 StringRef SetterName = Property.getObjCPropertySetterName();
996 if (!SetterName.empty())
997 addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
998 unsigned PropertyAttributes = 0;
Devang Patel9e11eb12012-02-04 01:30:32 +0000999 if (Property.isReadOnlyObjCProperty())
1000 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
1001 if (Property.isReadWriteObjCProperty())
1002 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
1003 if (Property.isAssignObjCProperty())
1004 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
1005 if (Property.isRetainObjCProperty())
1006 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
1007 if (Property.isCopyObjCProperty())
1008 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
1009 if (Property.isNonAtomicObjCProperty())
1010 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
1011 if (PropertyAttributes)
Eric Christopher8b4310b2012-11-21 00:34:38 +00001012 addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, 0,
Devang Patel9e11eb12012-02-04 01:30:32 +00001013 PropertyAttributes);
Devang Patel6588abf2012-02-06 17:49:43 +00001014
Devang Patel30d409c2012-02-07 23:33:58 +00001015 DIEEntry *Entry = getDIEEntry(Element);
1016 if (!Entry) {
1017 Entry = createDIEEntry(ElemDie);
1018 insertDIEEntry(Element, Entry);
1019 }
Devang Patel9e11eb12012-02-04 01:30:32 +00001020 } else
Devang Patel161b2f42011-04-12 23:21:44 +00001021 continue;
1022 Buffer.addChild(ElemDie);
1023 }
1024
1025 if (CTy.isAppleBlockExtension())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001026 addFlag(&Buffer, dwarf::DW_AT_APPLE_block);
Devang Patel161b2f42011-04-12 23:21:44 +00001027
Devang Patel161b2f42011-04-12 23:21:44 +00001028 DICompositeType ContainingType = CTy.getContainingType();
1029 if (DIDescriptor(ContainingType).isCompositeType())
1030 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
1031 getOrCreateTypeDIE(DIType(ContainingType)));
1032 else {
1033 DIDescriptor Context = CTy.getContext();
1034 addToContextOwner(&Buffer, Context);
1035 }
1036
Devang Patel201e6cd2011-05-12 21:29:42 +00001037 if (CTy.isObjcClassComplete())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001038 addFlag(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type);
Devang Patelb11f80e2011-05-12 19:06:16 +00001039
Eric Christopher1a8e8862011-12-16 23:42:42 +00001040 // Add template parameters to a class, structure or union types.
1041 // FIXME: The support isn't in the metadata for this yet.
1042 if (Tag == dwarf::DW_TAG_class_type ||
1043 Tag == dwarf::DW_TAG_structure_type ||
1044 Tag == dwarf::DW_TAG_union_type)
Devang Patel161b2f42011-04-12 23:21:44 +00001045 addTemplateParams(Buffer, CTy.getTemplateParams());
1046
1047 break;
1048 }
1049 default:
1050 break;
1051 }
1052
1053 // Add name if not anonymous or intermediate type.
1054 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001055 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001056
Eric Christopher4a5d8392012-05-22 18:45:18 +00001057 if (Tag == dwarf::DW_TAG_enumeration_type ||
1058 Tag == dwarf::DW_TAG_class_type ||
1059 Tag == dwarf::DW_TAG_structure_type ||
1060 Tag == dwarf::DW_TAG_union_type) {
Devang Patel161b2f42011-04-12 23:21:44 +00001061 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopherfc4199b2012-06-01 00:22:32 +00001062 // TODO: Do we care about size for enum forward declarations?
Devang Patel161b2f42011-04-12 23:21:44 +00001063 if (Size)
1064 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
Eric Christopherfc4199b2012-06-01 00:22:32 +00001065 else if (!CTy.isForwardDecl())
Devang Patel161b2f42011-04-12 23:21:44 +00001066 // Add zero size if it is not a forward declaration.
Eric Christopherfc4199b2012-06-01 00:22:32 +00001067 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
1068
1069 // If we're a forward decl, say so.
1070 if (CTy.isForwardDecl())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001071 addFlag(&Buffer, dwarf::DW_AT_declaration);
Devang Patel161b2f42011-04-12 23:21:44 +00001072
1073 // Add source line info if available.
1074 if (!CTy.isForwardDecl())
1075 addSourceLine(&Buffer, CTy);
Eric Christopher89388952012-03-07 00:15:19 +00001076
1077 // No harm in adding the runtime language to the declaration.
1078 unsigned RLang = CTy.getRunTimeLang();
1079 if (RLang)
1080 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
1081 dwarf::DW_FORM_data1, RLang);
Devang Patel161b2f42011-04-12 23:21:44 +00001082 }
1083}
1084
Eric Christopher8b4310b2012-11-21 00:34:38 +00001085/// getOrCreateTemplateTypeParameterDIE - Find existing DIE or create new DIE
Devang Patel161b2f42011-04-12 23:21:44 +00001086/// for the given DITemplateTypeParameter.
1087DIE *
1088CompileUnit::getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP) {
1089 DIE *ParamDIE = getDIE(TP);
1090 if (ParamDIE)
1091 return ParamDIE;
1092
1093 ParamDIE = new DIE(dwarf::DW_TAG_template_type_parameter);
1094 addType(ParamDIE, TP.getType());
David Blaikiee88939c2013-06-22 18:59:11 +00001095 if (!TP.getName().empty())
1096 addString(ParamDIE, dwarf::DW_AT_name, TP.getName());
Devang Patel161b2f42011-04-12 23:21:44 +00001097 return ParamDIE;
1098}
1099
Eric Christopher8b4310b2012-11-21 00:34:38 +00001100/// getOrCreateTemplateValueParameterDIE - Find existing DIE or create new DIE
Devang Patel161b2f42011-04-12 23:21:44 +00001101/// for the given DITemplateValueParameter.
1102DIE *
Eric Christopher4d069bf2012-05-22 18:45:24 +00001103CompileUnit::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter TPV){
Devang Patel161b2f42011-04-12 23:21:44 +00001104 DIE *ParamDIE = getDIE(TPV);
1105 if (ParamDIE)
1106 return ParamDIE;
1107
David Blaikiee88939c2013-06-22 18:59:11 +00001108 ParamDIE = new DIE(TPV.getTag());
Devang Patel161b2f42011-04-12 23:21:44 +00001109 addType(ParamDIE, TPV.getType());
1110 if (!TPV.getName().empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001111 addString(ParamDIE, dwarf::DW_AT_name, TPV.getName());
David Blaikie4de9d722013-05-10 21:52:07 +00001112 if (Value *Val = TPV.getValue()) {
1113 if (ConstantInt *CI = dyn_cast<ConstantInt>(Val))
1114 addConstantValue(ParamDIE, CI, TPV.getType().isUnsignedDIType());
1115 else if (GlobalValue *GV = dyn_cast<GlobalValue>(Val)) {
1116 // For declaration non-type template parameters (such as global values and
1117 // functions)
1118 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1119 addOpAddress(Block, Asm->Mang->getSymbol(GV));
1120 // Emit DW_OP_stack_value to use the address as the immediate value of the
1121 // parameter, rather than a pointer to it.
1122 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value);
1123 addBlock(ParamDIE, dwarf::DW_AT_location, 0, Block);
David Blaikiee88939c2013-06-22 18:59:11 +00001124 } else if (TPV.getTag() == dwarf::DW_TAG_GNU_template_template_param) {
1125 assert(isa<MDString>(Val));
1126 addString(ParamDIE, dwarf::DW_AT_GNU_template_name,
1127 cast<MDString>(Val)->getString());
1128 } else if (TPV.getTag() == dwarf::DW_TAG_GNU_template_parameter_pack) {
1129 assert(isa<MDNode>(Val));
1130 DIArray A(cast<MDNode>(Val));
1131 addTemplateParams(*ParamDIE, A);
David Blaikie4de9d722013-05-10 21:52:07 +00001132 }
1133 }
1134
Devang Patel161b2f42011-04-12 23:21:44 +00001135 return ParamDIE;
1136}
1137
Devang Patel31c5d052011-05-06 16:57:54 +00001138/// getOrCreateNameSpace - Create a DIE for DINameSpace.
1139DIE *CompileUnit::getOrCreateNameSpace(DINameSpace NS) {
1140 DIE *NDie = getDIE(NS);
1141 if (NDie)
1142 return NDie;
1143 NDie = new DIE(dwarf::DW_TAG_namespace);
1144 insertDIE(NS, NDie);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001145 if (!NS.getName().empty()) {
Nick Lewycky390c40d2011-10-27 06:44:11 +00001146 addString(NDie, dwarf::DW_AT_name, NS.getName());
Eric Christopher09ac3d82011-11-07 09:24:32 +00001147 addAccelNamespace(NS.getName(), NDie);
1148 } else
1149 addAccelNamespace("(anonymous namespace)", NDie);
Devang Patel31c5d052011-05-06 16:57:54 +00001150 addSourceLine(NDie, NS);
1151 addToContextOwner(NDie, NS.getContext());
1152 return NDie;
1153}
1154
Devang Pateldbc64af2011-08-15 17:24:54 +00001155/// getOrCreateSubprogramDIE - Create new DIE using SP.
1156DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
1157 DIE *SPDie = getDIE(SP);
1158 if (SPDie)
1159 return SPDie;
1160
Peter Collingbourne27302f02012-05-27 18:36:44 +00001161 SPDie = new DIE(dwarf::DW_TAG_subprogram);
1162
1163 // DW_TAG_inlined_subroutine may refer to this DIE.
1164 insertDIE(SP, SPDie);
1165
Rafael Espindola01b55b42011-11-10 22:34:29 +00001166 DISubprogram SPDecl = SP.getFunctionDeclaration();
1167 DIE *DeclDie = NULL;
1168 if (SPDecl.isSubprogram()) {
1169 DeclDie = getOrCreateSubprogramDIE(SPDecl);
1170 }
1171
Devang Pateldbc64af2011-08-15 17:24:54 +00001172 // Add to context owner.
1173 addToContextOwner(SPDie, SP.getContext());
1174
1175 // Add function template parameters.
1176 addTemplateParams(*SPDie, SP.getTemplateParams());
1177
Eric Christopherc4968752013-05-09 00:42:33 +00001178 // Unfortunately this code needs to stay here instead of below the
1179 // AT_specification code in order to work around a bug in older
1180 // gdbs that requires the linkage name to resolve multiple template
1181 // functions.
1182 // TODO: Remove this set of code when we get rid of the old gdb
1183 // compatibility.
Eric Christopher8d101c32012-03-15 08:19:33 +00001184 StringRef LinkageName = SP.getLinkageName();
Eric Christopherc4968752013-05-09 00:42:33 +00001185 if (!LinkageName.empty() && DD->useDarwinGDBCompat())
1186 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c2b4be2013-06-01 17:51:14 +00001187 GlobalValue::getRealLinkageName(LinkageName));
Eric Christopher8d101c32012-03-15 08:19:33 +00001188
Devang Pateldbc64af2011-08-15 17:24:54 +00001189 // If this DIE is going to refer declaration info using AT_specification
Eric Christopherc4968752013-05-09 00:42:33 +00001190 // then there is no need to add other attributes.
Rafael Espindola01b55b42011-11-10 22:34:29 +00001191 if (DeclDie) {
1192 // Refer function declaration directly.
1193 addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
1194 DeclDie);
1195
Devang Pateldbc64af2011-08-15 17:24:54 +00001196 return SPDie;
Rafael Espindola01b55b42011-11-10 22:34:29 +00001197 }
Devang Pateldbc64af2011-08-15 17:24:54 +00001198
Eric Christophercbbd5b12012-08-23 22:52:55 +00001199 // Add the linkage name if we have one.
Eric Christopherc4968752013-05-09 00:42:33 +00001200 if (!LinkageName.empty() && !DD->useDarwinGDBCompat())
Eric Christophercbbd5b12012-08-23 22:52:55 +00001201 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c2b4be2013-06-01 17:51:14 +00001202 GlobalValue::getRealLinkageName(LinkageName));
Eric Christophercbbd5b12012-08-23 22:52:55 +00001203
Devang Pateldbc64af2011-08-15 17:24:54 +00001204 // Constructors and operators for anonymous aggregates do not have names.
1205 if (!SP.getName().empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001206 addString(SPDie, dwarf::DW_AT_name, SP.getName());
Devang Pateldbc64af2011-08-15 17:24:54 +00001207
1208 addSourceLine(SPDie, SP);
1209
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001210 // Add the prototype if we have a prototype and we have a C like
1211 // language.
1212 if (SP.isPrototyped() &&
1213 (Language == dwarf::DW_LANG_C89 ||
1214 Language == dwarf::DW_LANG_C99 ||
1215 Language == dwarf::DW_LANG_ObjC))
Eric Christopher873cf0a2012-08-24 01:14:27 +00001216 addFlag(SPDie, dwarf::DW_AT_prototyped);
Devang Pateldbc64af2011-08-15 17:24:54 +00001217
1218 // Add Return Type.
1219 DICompositeType SPTy = SP.getType();
David Blaikie3d331842013-05-22 23:22:18 +00001220 assert(SPTy.getTag() == dwarf::DW_TAG_subroutine_type &&
1221 "the type of a subprogram should be a subroutine");
Devang Pateldbc64af2011-08-15 17:24:54 +00001222
David Blaikie3d331842013-05-22 23:22:18 +00001223 DIArray Args = SPTy.getTypeArray();
1224 addType(SPDie, DIType(Args.getElement(0)));
Devang Pateldbc64af2011-08-15 17:24:54 +00001225
1226 unsigned VK = SP.getVirtuality();
1227 if (VK) {
Nick Lewycky798313d2011-12-14 00:56:07 +00001228 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
Devang Pateldbc64af2011-08-15 17:24:54 +00001229 DIEBlock *Block = getDIEBlock();
1230 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1231 addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex());
1232 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
1233 ContainingTypeMap.insert(std::make_pair(SPDie,
1234 SP.getContainingType()));
1235 }
1236
1237 if (!SP.isDefinition()) {
Eric Christopher873cf0a2012-08-24 01:14:27 +00001238 addFlag(SPDie, dwarf::DW_AT_declaration);
Eric Christopher8b4310b2012-11-21 00:34:38 +00001239
Devang Pateldbc64af2011-08-15 17:24:54 +00001240 // Add arguments. Do not add arguments for subprogram definition. They will
1241 // be handled while processing variables.
David Blaikie3d331842013-05-22 23:22:18 +00001242 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1243 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1244 DIType ATy = DIType(Args.getElement(i));
1245 addType(Arg, ATy);
1246 if (ATy.isArtificial())
1247 addFlag(Arg, dwarf::DW_AT_artificial);
1248 SPDie->addChild(Arg);
1249 }
Devang Pateldbc64af2011-08-15 17:24:54 +00001250 }
1251
1252 if (SP.isArtificial())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001253 addFlag(SPDie, dwarf::DW_AT_artificial);
Devang Pateldbc64af2011-08-15 17:24:54 +00001254
1255 if (!SP.isLocalToUnit())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001256 addFlag(SPDie, dwarf::DW_AT_external);
Devang Pateldbc64af2011-08-15 17:24:54 +00001257
1258 if (SP.isOptimized())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001259 addFlag(SPDie, dwarf::DW_AT_APPLE_optimized);
Devang Pateldbc64af2011-08-15 17:24:54 +00001260
1261 if (unsigned isa = Asm->getISAEncoding()) {
1262 addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1263 }
1264
1265 return SPDie;
1266}
1267
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001268// Return const expression if value is a GEP to access merged global
1269// constant. e.g.
1270// i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
1271static const ConstantExpr *getMergedGlobalExpr(const Value *V) {
1272 const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
1273 if (!CE || CE->getNumOperands() != 3 ||
1274 CE->getOpcode() != Instruction::GetElementPtr)
1275 return NULL;
1276
1277 // First operand points to a global struct.
1278 Value *Ptr = CE->getOperand(0);
1279 if (!isa<GlobalValue>(Ptr) ||
1280 !isa<StructType>(cast<PointerType>(Ptr->getType())->getElementType()))
1281 return NULL;
1282
1283 // Second operand is zero.
1284 const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
1285 if (!CI || !CI->isZero())
1286 return NULL;
1287
1288 // Third operand is offset.
1289 if (!isa<ConstantInt>(CE->getOperand(2)))
1290 return NULL;
1291
1292 return CE;
1293}
1294
1295/// createGlobalVariableDIE - create global variable DIE.
1296void CompileUnit::createGlobalVariableDIE(const MDNode *N) {
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001297 // Check for pre-existence.
Devang Patel49e2f032011-08-18 22:21:50 +00001298 if (getDIE(N))
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001299 return;
1300
Devang Patel49e2f032011-08-18 22:21:50 +00001301 DIGlobalVariable GV(N);
Devang Patel28bea082011-08-18 23:17:55 +00001302 if (!GV.Verify())
1303 return;
1304
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001305 DIDescriptor GVContext = GV.getContext();
Eric Christopher6b6061f2013-01-16 01:22:23 +00001306 DIType GTy = GV.getType();
1307
1308 // If this is a static data member definition, some attributes belong
1309 // to the declaration DIE.
1310 DIE *VariableDIE = NULL;
Manman Ren945e8282013-02-01 23:54:37 +00001311 bool IsStaticMember = false;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001312 DIDerivedType SDMDecl = GV.getStaticDataMemberDeclaration();
1313 if (SDMDecl.Verify()) {
1314 assert(SDMDecl.isStaticMember() && "Expected static member decl");
1315 // We need the declaration DIE that is in the static member's class.
1316 // But that class might not exist in the DWARF yet.
1317 // Creating the class will create the static member decl DIE.
1318 getOrCreateContextDIE(SDMDecl.getContext());
1319 VariableDIE = getDIE(SDMDecl);
1320 assert(VariableDIE && "Static member decl has no context?");
Manman Ren945e8282013-02-01 23:54:37 +00001321 IsStaticMember = true;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001322 }
1323
1324 // If this is not a static data member definition, create the variable
1325 // DIE and add the initial set of attributes to it.
1326 if (!VariableDIE) {
1327 VariableDIE = new DIE(GV.getTag());
1328 // Add to map.
1329 insertDIE(N, VariableDIE);
1330
1331 // Add name and type.
1332 addString(VariableDIE, dwarf::DW_AT_name, GV.getDisplayName());
1333 addType(VariableDIE, GTy);
1334
1335 // Add scoping info.
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00001336 if (!GV.isLocalToUnit()) {
Eric Christopher6b6061f2013-01-16 01:22:23 +00001337 addFlag(VariableDIE, dwarf::DW_AT_external);
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00001338 addGlobalName(GV.getName(), VariableDIE);
1339 }
Eric Christopher6b6061f2013-01-16 01:22:23 +00001340
1341 // Add line number info.
1342 addSourceLine(VariableDIE, GV);
1343 // Add to context owner.
1344 addToContextOwner(VariableDIE, GVContext);
1345 }
1346
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001347 // Add location.
Eric Christopher09ac3d82011-11-07 09:24:32 +00001348 bool addToAccelTable = false;
Eric Christopherd61c34b2011-11-11 03:16:32 +00001349 DIE *VariableSpecDIE = NULL;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001350 bool isGlobalVariable = GV.getGlobal() != NULL;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001351 if (isGlobalVariable) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001352 addToAccelTable = true;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001353 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Eric Christopher0969ddf2013-01-18 22:11:33 +00001354 addOpAddress(Block, Asm->Mang->getSymbol(GV.getGlobal()));
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001355 // Do not create specification DIE if context is either compile unit
1356 // or a subprogram.
Devang Patel1dd4e562011-09-21 23:41:11 +00001357 if (GVContext && GV.isDefinition() && !GVContext.isCompileUnit() &&
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001358 !GVContext.isFile() && !isSubprogramContext(GVContext)) {
1359 // Create specification DIE.
Eric Christopherd117fbb2011-11-11 01:55:22 +00001360 VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001361 addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
1362 dwarf::DW_FORM_ref4, VariableDIE);
1363 addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001364 // A static member's declaration is already flagged as such.
1365 if (!SDMDecl.Verify())
1366 addFlag(VariableDIE, dwarf::DW_AT_declaration);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001367 addDie(VariableSpecDIE);
1368 } else {
1369 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001370 }
Eric Christopher6b6061f2013-01-16 01:22:23 +00001371 // Add linkage name.
1372 StringRef LinkageName = GV.getLinkageName();
Eric Christophera8ada252013-02-27 23:49:50 +00001373 if (!LinkageName.empty()) {
Eric Christopher8d45a982013-02-27 23:49:47 +00001374 // From DWARF4: DIEs to which DW_AT_linkage_name may apply include:
1375 // TAG_common_block, TAG_constant, TAG_entry_point, TAG_subprogram and
1376 // TAG_variable.
Manman Ren21a08a12013-02-27 23:21:02 +00001377 addString(IsStaticMember && VariableSpecDIE ?
1378 VariableSpecDIE : VariableDIE, dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c2b4be2013-06-01 17:51:14 +00001379 GlobalValue::getRealLinkageName(LinkageName));
Eric Christopher8d45a982013-02-27 23:49:47 +00001380 // In compatibility mode with older gdbs we put the linkage name on both
1381 // the TAG_variable DIE and on the TAG_member DIE.
Manman Ren21a08a12013-02-27 23:21:02 +00001382 if (IsStaticMember && VariableSpecDIE && DD->useDarwinGDBCompat())
1383 addString(VariableDIE, dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c2b4be2013-06-01 17:51:14 +00001384 GlobalValue::getRealLinkageName(LinkageName));
Manman Ren06df83c2013-02-27 00:02:32 +00001385 }
Eric Christopher8b4310b2012-11-21 00:34:38 +00001386 } else if (const ConstantInt *CI =
Manman Ren945e8282013-02-01 23:54:37 +00001387 dyn_cast_or_null<ConstantInt>(GV.getConstant())) {
Adrian Prantl2e892e42013-04-04 22:56:49 +00001388 // AT_const_value was added when the static member was created. To avoid
Manman Ren945e8282013-02-01 23:54:37 +00001389 // emitting AT_const_value multiple times, we only add AT_const_value when
1390 // it is not a static member.
1391 if (!IsStaticMember)
1392 addConstantValue(VariableDIE, CI, GTy.isUnsignedDIType());
1393 } else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001394 addToAccelTable = true;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001395 // GV is a merged global.
1396 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1397 Value *Ptr = CE->getOperand(0);
Eric Christopher0969ddf2013-01-18 22:11:33 +00001398 addOpAddress(Block, Asm->Mang->getSymbol(cast<GlobalValue>(Ptr)));
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001399 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1400 SmallVector<Value*, 3> Idx(CE->op_begin()+1, CE->op_end());
Eric Christopher8b4310b2012-11-21 00:34:38 +00001401 addUInt(Block, 0, dwarf::DW_FORM_udata,
Micah Villmow3574eca2012-10-08 16:38:25 +00001402 Asm->getDataLayout().getIndexedOffset(Ptr->getType(), Idx));
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001403 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1404 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
1405 }
1406
Eric Christopherd117fbb2011-11-11 01:55:22 +00001407 if (addToAccelTable) {
1408 DIE *AddrDIE = VariableSpecDIE ? VariableSpecDIE : VariableDIE;
1409 addAccelName(GV.getName(), AddrDIE);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001410
Eric Christopherd117fbb2011-11-11 01:55:22 +00001411 // If the linkage name is different than the name, go ahead and output
1412 // that as well into the name table.
1413 if (GV.getLinkageName() != "" && GV.getName() != GV.getLinkageName())
1414 addAccelName(GV.getLinkageName(), AddrDIE);
1415 }
Eric Christopher74d8a872011-11-08 21:56:23 +00001416
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001417 return;
1418}
1419
Devang Patel161b2f42011-04-12 23:21:44 +00001420/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
Eric Christopher4d069bf2012-05-22 18:45:24 +00001421void CompileUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR,
1422 DIE *IndexTy) {
Devang Patel161b2f42011-04-12 23:21:44 +00001423 DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
1424 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
Devang Patel161b2f42011-04-12 23:21:44 +00001425
Bill Wendling222c2fd2012-12-06 07:38:10 +00001426 // The LowerBound value defines the lower bounds which is typically zero for
1427 // C/C++. The Count value is the number of elements. Values are 64 bit. If
1428 // Count == -1 then the array is unbounded and we do not emit
1429 // DW_AT_lower_bound and DW_AT_upper_bound attributes. If LowerBound == 0 and
1430 // Count == 0, then the array has zero elements in which case we do not emit
1431 // an upper bound.
1432 int64_t LowerBound = SR.getLo();
Bill Wendling6afe4782012-12-06 07:55:19 +00001433 int64_t DefaultLowerBound = getDefaultLowerBound();
Bill Wendling9493dae2012-12-04 21:34:03 +00001434 int64_t Count = SR.getCount();
Devang Patel161b2f42011-04-12 23:21:44 +00001435
Bill Wendling6afe4782012-12-06 07:55:19 +00001436 if (DefaultLowerBound == -1 || LowerBound != DefaultLowerBound)
Bill Wendling222c2fd2012-12-06 07:38:10 +00001437 addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, LowerBound);
1438
1439 if (Count != -1 && Count != 0)
Bill Wendling9493dae2012-12-04 21:34:03 +00001440 // FIXME: An unbounded array should reference the expression that defines
1441 // the array.
Bill Wendling222c2fd2012-12-06 07:38:10 +00001442 addUInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, LowerBound + Count - 1);
Bill Wendling9493dae2012-12-04 21:34:03 +00001443
Devang Patel161b2f42011-04-12 23:21:44 +00001444 Buffer.addChild(DW_Subrange);
1445}
1446
1447/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
1448void CompileUnit::constructArrayTypeDIE(DIE &Buffer,
1449 DICompositeType *CTy) {
1450 Buffer.setTag(dwarf::DW_TAG_array_type);
Eric Christopher9a1e0e22013-01-08 01:53:52 +00001451 if (CTy->isVector())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001452 addFlag(&Buffer, dwarf::DW_AT_GNU_vector);
Devang Patel161b2f42011-04-12 23:21:44 +00001453
1454 // Emit derived type.
1455 addType(&Buffer, CTy->getTypeDerivedFrom());
1456 DIArray Elements = CTy->getTypeArray();
1457
1458 // Get an anonymous type for index type.
Eric Christopher8cab6ed2013-01-04 21:51:53 +00001459 // FIXME: This type should be passed down from the front end
1460 // as different languages may have different sizes for indexes.
Devang Patel161b2f42011-04-12 23:21:44 +00001461 DIE *IdxTy = getIndexTyDie();
1462 if (!IdxTy) {
1463 // Construct an anonymous type for index type.
1464 IdxTy = new DIE(dwarf::DW_TAG_base_type);
Eric Christopher8cab6ed2013-01-04 21:51:53 +00001465 addString(IdxTy, dwarf::DW_AT_name, "int");
Devang Patel161b2f42011-04-12 23:21:44 +00001466 addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1467 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1468 dwarf::DW_ATE_signed);
1469 addDie(IdxTy);
1470 setIndexTyDie(IdxTy);
1471 }
1472
1473 // Add subranges to array type.
1474 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1475 DIDescriptor Element = Elements.getElement(i);
1476 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1477 constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1478 }
1479}
1480
1481/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
1482DIE *CompileUnit::constructEnumTypeDIE(DIEnumerator ETy) {
1483 DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
1484 StringRef Name = ETy.getName();
Nick Lewycky390c40d2011-10-27 06:44:11 +00001485 addString(Enumerator, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001486 int64_t Value = ETy.getEnumValue();
1487 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
1488 return Enumerator;
1489}
1490
Devang Pateldbc64af2011-08-15 17:24:54 +00001491/// constructContainingTypeDIEs - Construct DIEs for types that contain
1492/// vtables.
1493void CompileUnit::constructContainingTypeDIEs() {
1494 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
1495 CE = ContainingTypeMap.end(); CI != CE; ++CI) {
1496 DIE *SPDie = CI->first;
1497 const MDNode *N = CI->second;
1498 if (!N) continue;
1499 DIE *NDie = getDIE(N);
1500 if (!NDie) continue;
1501 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
1502 }
1503}
1504
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001505/// constructVariableDIE - Construct a DIE for the given DbgVariable.
Eric Christopherf61dbc12013-06-24 21:07:27 +00001506DIE *CompileUnit::constructVariableDIE(DbgVariable *DV,
1507 bool isScopeAbstract) {
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001508 StringRef Name = DV->getName();
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001509
1510 // Translate tag to proper Dwarf tag.
1511 unsigned Tag = DV->getTag();
1512
1513 // Define variable debug information entry.
1514 DIE *VariableDie = new DIE(Tag);
1515 DbgVariable *AbsVar = DV->getAbstractVariable();
1516 DIE *AbsDIE = AbsVar ? AbsVar->getDIE() : NULL;
Manman Ren742671b2013-05-29 17:16:59 +00001517 if (AbsDIE)
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001518 addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
Manman Ren742671b2013-05-29 17:16:59 +00001519 dwarf::DW_FORM_ref4, AbsDIE);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001520 else {
Nick Lewycky390c40d2011-10-27 06:44:11 +00001521 addString(VariableDie, dwarf::DW_AT_name, Name);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001522 addSourceLine(VariableDie, DV->getVariable());
1523 addType(VariableDie, DV->getType());
1524 }
1525
1526 if (DV->isArtificial())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001527 addFlag(VariableDie, dwarf::DW_AT_artificial);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001528
1529 if (isScopeAbstract) {
1530 DV->setDIE(VariableDie);
1531 return VariableDie;
1532 }
1533
1534 // Add variable address.
1535
1536 unsigned Offset = DV->getDotDebugLocOffset();
1537 if (Offset != ~0U) {
Eric Christopherafbe0e22013-06-24 21:34:55 +00001538 addLabel(VariableDie, dwarf::DW_AT_location, dwarf::DW_FORM_data4,
1539 Asm->GetTempSymbol("debug_loc", Offset));
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001540 DV->setDIE(VariableDie);
1541 return VariableDie;
1542 }
1543
Eric Christopher8cf5e742011-10-03 15:49:20 +00001544 // Check if variable is described by a DBG_VALUE instruction.
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001545 if (const MachineInstr *DVInsn = DV->getMInsn()) {
1546 bool updated = false;
David Blaikie6d9dbd52013-06-16 20:34:15 +00001547 assert(DVInsn->getNumOperands() == 3);
1548 if (DVInsn->getOperand(0).isReg()) {
1549 const MachineOperand RegOp = DVInsn->getOperand(0);
1550 if (int64_t Offset = DVInsn->getOperand(1).getImm()) {
1551 MachineLocation Location(RegOp.getReg(), Offset);
Eric Christopherf61dbc12013-06-24 21:07:27 +00001552 addVariableAddress(*DV, VariableDie, Location);
David Blaikie6d9dbd52013-06-16 20:34:15 +00001553 } else if (RegOp.getReg())
Eric Christopherf61dbc12013-06-24 21:07:27 +00001554 addVariableAddress(*DV, VariableDie, MachineLocation(RegOp.getReg()));
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001555 updated = true;
David Blaikie6d9dbd52013-06-16 20:34:15 +00001556 } else if (DVInsn->getOperand(0).isImm())
1557 updated =
1558 addConstantValue(VariableDie, DVInsn->getOperand(0), DV->getType());
1559 else if (DVInsn->getOperand(0).isFPImm())
1560 updated = addConstantFPValue(VariableDie, DVInsn->getOperand(0));
1561 else if (DVInsn->getOperand(0).isCImm())
1562 updated = addConstantValue(VariableDie, DVInsn->getOperand(0).getCImm(),
1563 DV->getType().isUnsignedDIType());
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001564 if (!updated) {
1565 // If variableDie is not updated then DBG_VALUE instruction does not
1566 // have valid variable info.
1567 delete VariableDie;
1568 return NULL;
1569 }
1570 DV->setDIE(VariableDie);
1571 return VariableDie;
1572 } else {
1573 // .. else use frame index.
1574 int FI = DV->getFrameIndex();
1575 if (FI != ~0) {
1576 unsigned FrameReg = 0;
1577 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
Eric Christopher8b4310b2012-11-21 00:34:38 +00001578 int Offset =
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001579 TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
1580 MachineLocation Location(FrameReg, Offset);
Eric Christopherf61dbc12013-06-24 21:07:27 +00001581 addVariableAddress(*DV, VariableDie, Location);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001582 }
1583 }
1584
1585 DV->setDIE(VariableDie);
1586 return VariableDie;
1587}
1588
Devang Patel161b2f42011-04-12 23:21:44 +00001589/// createMemberDIE - Create new member DIE.
1590DIE *CompileUnit::createMemberDIE(DIDerivedType DT) {
1591 DIE *MemberDie = new DIE(DT.getTag());
1592 StringRef Name = DT.getName();
1593 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001594 addString(MemberDie, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001595
1596 addType(MemberDie, DT.getTypeDerivedFrom());
1597
1598 addSourceLine(MemberDie, DT);
1599
1600 DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
1601 addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1602
1603 uint64_t Size = DT.getSizeInBits();
1604 uint64_t FieldSize = DT.getOriginalTypeSize();
1605
1606 if (Size != FieldSize) {
1607 // Handle bitfield.
1608 addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
1609 addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1610
1611 uint64_t Offset = DT.getOffsetInBits();
1612 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1613 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1614 uint64_t FieldOffset = (HiMark - FieldSize);
1615 Offset -= FieldOffset;
1616
1617 // Maybe we need to work from the other end.
Micah Villmow3574eca2012-10-08 16:38:25 +00001618 if (Asm->getDataLayout().isLittleEndian())
Devang Patel161b2f42011-04-12 23:21:44 +00001619 Offset = FieldSize - (Offset + Size);
1620 addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
1621
1622 // Here WD_AT_data_member_location points to the anonymous
1623 // field that includes this bit field.
1624 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
1625
1626 } else
1627 // This is not a bitfield.
1628 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1629
1630 if (DT.getTag() == dwarf::DW_TAG_inheritance
1631 && DT.isVirtual()) {
1632
1633 // For C++, virtual base classes are not at fixed offset. Use following
1634 // expression to extract appropriate offset from vtable.
1635 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1636
1637 DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
1638 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1639 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1640 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1641 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1642 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1643 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1644 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1645
1646 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
1647 VBaseLocationDie);
1648 } else
1649 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
1650
1651 if (DT.isProtected())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001652 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001653 dwarf::DW_ACCESS_protected);
1654 else if (DT.isPrivate())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001655 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001656 dwarf::DW_ACCESS_private);
1657 // Otherwise C++ member and base classes are considered public.
Eric Christopher8b4310b2012-11-21 00:34:38 +00001658 else
Nick Lewycky13aaca52011-12-13 05:09:11 +00001659 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001660 dwarf::DW_ACCESS_public);
1661 if (DT.isVirtual())
Nick Lewycky798313d2011-12-14 00:56:07 +00001662 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001663 dwarf::DW_VIRTUALITY_virtual);
Devang Patele9db5e22011-04-16 00:11:51 +00001664
1665 // Objective-C properties.
Devang Patel6588abf2012-02-06 17:49:43 +00001666 if (MDNode *PNode = DT.getObjCProperty())
1667 if (DIEEntry *PropertyDie = getDIEEntry(PNode))
Eric Christopher8b4310b2012-11-21 00:34:38 +00001668 MemberDie->addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4,
Devang Patel6588abf2012-02-06 17:49:43 +00001669 PropertyDie);
1670
David Blaikie01bc2b32012-12-13 22:43:07 +00001671 if (DT.isArtificial())
1672 addFlag(MemberDie, dwarf::DW_AT_artificial);
1673
Devang Patel161b2f42011-04-12 23:21:44 +00001674 return MemberDie;
1675}
Eric Christopher6b6061f2013-01-16 01:22:23 +00001676
1677/// createStaticMemberDIE - Create new DIE for C++ static member.
1678DIE *CompileUnit::createStaticMemberDIE(const DIDerivedType DT) {
1679 if (!DT.Verify())
1680 return NULL;
1681
1682 DIE *StaticMemberDIE = new DIE(DT.getTag());
1683 DIType Ty = DT.getTypeDerivedFrom();
1684
1685 addString(StaticMemberDIE, dwarf::DW_AT_name, DT.getName());
1686 addType(StaticMemberDIE, Ty);
1687 addSourceLine(StaticMemberDIE, DT);
1688 addFlag(StaticMemberDIE, dwarf::DW_AT_external);
1689 addFlag(StaticMemberDIE, dwarf::DW_AT_declaration);
1690
1691 // FIXME: We could omit private if the parent is a class_type, and
1692 // public if the parent is something else.
1693 if (DT.isProtected())
1694 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1695 dwarf::DW_ACCESS_protected);
1696 else if (DT.isPrivate())
1697 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1698 dwarf::DW_ACCESS_private);
1699 else
1700 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1701 dwarf::DW_ACCESS_public);
1702
1703 if (const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(DT.getConstant()))
1704 addConstantValue(StaticMemberDIE, CI, Ty.isUnsignedDIType());
David Blaikie14268412013-01-20 01:18:01 +00001705 if (const ConstantFP *CFP = dyn_cast_or_null<ConstantFP>(DT.getConstant()))
1706 addConstantFPValue(StaticMemberDIE, CFP);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001707
1708 insertDIE(DT, StaticMemberDIE);
1709 return StaticMemberDIE;
1710}