blob: 37eedc27e5aafd95e96dec09a20b46358f0ab30e [file] [log] [blame]
Devang Patel0e821f42011-04-12 23:21:44 +00001//===-- llvm/CodeGen/DwarfCompileUnit.cpp - Dwarf Compile Unit ------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
Eric Christopher160522c2012-08-14 05:13:29 +000010// This file contains support for constructing a dwarf compile unit.
Devang Patel0e821f42011-04-12 23:21:44 +000011//
12//===----------------------------------------------------------------------===//
13
14#define DEBUG_TYPE "dwarfdebug"
15
16#include "DwarfCompileUnit.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000017#include "DwarfAccelTable.h"
Devang Patel0e821f42011-04-12 23:21:44 +000018#include "DwarfDebug.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000019#include "llvm/ADT/APFloat.h"
Bill Wendlingf799efd2012-06-29 08:32:07 +000020#include "llvm/DIBuilder.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000021#include "llvm/IR/Constants.h"
22#include "llvm/IR/DataLayout.h"
23#include "llvm/IR/GlobalVariable.h"
24#include "llvm/IR/Instructions.h"
Eric Christopher0a917b72011-11-11 03:16:32 +000025#include "llvm/Support/Debug.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000026#include "llvm/Support/ErrorHandling.h"
Devang Pateldfd6ec32011-08-15 17:57:41 +000027#include "llvm/Target/Mangler.h"
Devang Patel0e821f42011-04-12 23:21:44 +000028#include "llvm/Target/TargetFrameLowering.h"
29#include "llvm/Target/TargetMachine.h"
David Blaikief2694972013-06-28 20:05:11 +000030#include "llvm/Target/TargetLoweringObjectFile.h"
Devang Patel0e821f42011-04-12 23:21:44 +000031#include "llvm/Target/TargetRegisterInfo.h"
Devang Patel0e821f42011-04-12 23:21:44 +000032
33using namespace llvm;
34
35/// CompileUnit - Compile unit constructor.
Eric Christopherc57baee2013-05-08 00:58:51 +000036CompileUnit::CompileUnit(unsigned UID, unsigned L, DIE *D, const MDNode *N,
Eric Christopher1e1c7f12013-05-30 00:43:32 +000037 AsmPrinter *A, DwarfDebug *DW, DwarfUnits *DWU)
Eric Christophere698f532012-12-20 21:58:36 +000038 : UniqueID(UID), Language(L), CUDie(D), Asm(A), DD(DW), DU(DWU),
Manman Ren14a029d2013-03-12 18:27:15 +000039 IndexTyDie(0), DebugInfoOffset(0) {
Devang Patel0e821f42011-04-12 23:21:44 +000040 DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
Eric Christopherc57baee2013-05-08 00:58:51 +000041 insertDIE(N, D);
Devang Patel0e821f42011-04-12 23:21:44 +000042}
43
44/// ~CompileUnit - Destructor for compile unit.
45CompileUnit::~CompileUnit() {
46 for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
47 DIEBlocks[j]->~DIEBlock();
48}
49
50/// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
51/// information entry.
52DIEEntry *CompileUnit::createDIEEntry(DIE *Entry) {
53 DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
54 return Value;
55}
56
Bill Wendling3495f9b2012-12-06 07:55:19 +000057/// getDefaultLowerBound - Return the default lower bound for an array. If the
Bill Wendling28fe9e72012-12-06 07:38:10 +000058/// DWARF version doesn't handle the language, return -1.
Bill Wendling3495f9b2012-12-06 07:55:19 +000059int64_t CompileUnit::getDefaultLowerBound() const {
Bill Wendling28fe9e72012-12-06 07:38:10 +000060 switch (Language) {
61 default:
62 break;
63
64 case dwarf::DW_LANG_C89:
65 case dwarf::DW_LANG_C99:
66 case dwarf::DW_LANG_C:
67 case dwarf::DW_LANG_C_plus_plus:
68 case dwarf::DW_LANG_ObjC:
69 case dwarf::DW_LANG_ObjC_plus_plus:
70 return 0;
71
72 case dwarf::DW_LANG_Fortran77:
73 case dwarf::DW_LANG_Fortran90:
74 case dwarf::DW_LANG_Fortran95:
75 return 1;
76
77 // The languages below have valid values only if the DWARF version >= 4.
78 case dwarf::DW_LANG_Java:
79 case dwarf::DW_LANG_Python:
80 case dwarf::DW_LANG_UPC:
81 case dwarf::DW_LANG_D:
82 if (dwarf::DWARF_VERSION >= 4)
83 return 0;
84 break;
85
86 case dwarf::DW_LANG_Ada83:
87 case dwarf::DW_LANG_Ada95:
88 case dwarf::DW_LANG_Cobol74:
89 case dwarf::DW_LANG_Cobol85:
90 case dwarf::DW_LANG_Modula2:
91 case dwarf::DW_LANG_Pascal83:
92 case dwarf::DW_LANG_PLI:
93 if (dwarf::DWARF_VERSION >= 4)
94 return 1;
95 break;
96 }
97
98 return -1;
99}
100
Eric Christopherbb69a272012-08-24 01:14:27 +0000101/// addFlag - Add a flag that is true.
102void CompileUnit::addFlag(DIE *Die, unsigned Attribute) {
103 if (!DD->useDarwinGDBCompat())
104 Die->addValue(Attribute, dwarf::DW_FORM_flag_present,
105 DIEIntegerOne);
106 else
107 addUInt(Die, Attribute, dwarf::DW_FORM_flag, 1);
108}
109
Devang Patel0e821f42011-04-12 23:21:44 +0000110/// addUInt - Add an unsigned integer attribute data and value.
111///
112void CompileUnit::addUInt(DIE *Die, unsigned Attribute,
113 unsigned Form, uint64_t Integer) {
114 if (!Form) Form = DIEInteger::BestForm(false, Integer);
115 DIEValue *Value = Integer == 1 ?
116 DIEIntegerOne : new (DIEValueAllocator) DIEInteger(Integer);
117 Die->addValue(Attribute, Form, Value);
118}
119
120/// addSInt - Add an signed integer attribute data and value.
121///
122void CompileUnit::addSInt(DIE *Die, unsigned Attribute,
123 unsigned Form, int64_t Integer) {
124 if (!Form) Form = DIEInteger::BestForm(true, Integer);
125 DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
126 Die->addValue(Attribute, Form, Value);
127}
128
Nick Lewyckycc64ae12011-10-28 05:29:47 +0000129/// addString - Add a string attribute data and value. We always emit a
130/// reference to the string pool instead of immediate strings so that DIEs have
Eric Christopherfba22602013-01-07 19:32:45 +0000131/// more predictable sizes. In the case of split dwarf we emit an index
132/// into another table which gets us the static offset into the string
133/// table.
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +0000134void CompileUnit::addString(DIE *Die, unsigned Attribute, StringRef String) {
Eric Christopher2cbd5762013-01-07 19:32:41 +0000135 if (!DD->useSplitDwarf()) {
136 MCSymbol *Symb = DU->getStringPoolEntry(String);
137 DIEValue *Value;
138 if (Asm->needsRelocationsForDwarfStringPool())
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000139 Value = new (DIEValueAllocator) DIELabel(Symb);
Eric Christopher2cbd5762013-01-07 19:32:41 +0000140 else {
141 MCSymbol *StringPool = DU->getStringPoolSym();
142 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
143 }
144 Die->addValue(Attribute, dwarf::DW_FORM_strp, Value);
145 } else {
146 unsigned idx = DU->getStringPoolIndex(String);
147 DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx);
148 Die->addValue(Attribute, dwarf::DW_FORM_GNU_str_index, Value);
149 }
150}
151
152/// addLocalString - Add a string attribute data and value. This is guaranteed
153/// to be in the local string pool instead of indirected.
154void CompileUnit::addLocalString(DIE *Die, unsigned Attribute,
155 StringRef String) {
Eric Christophere698f532012-12-20 21:58:36 +0000156 MCSymbol *Symb = DU->getStringPoolEntry(String);
Nick Lewyckycc64ae12011-10-28 05:29:47 +0000157 DIEValue *Value;
158 if (Asm->needsRelocationsForDwarfStringPool())
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000159 Value = new (DIEValueAllocator) DIELabel(Symb);
Nick Lewyckycc64ae12011-10-28 05:29:47 +0000160 else {
Eric Christophere698f532012-12-20 21:58:36 +0000161 MCSymbol *StringPool = DU->getStringPoolSym();
Nick Lewyckycc64ae12011-10-28 05:29:47 +0000162 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +0000163 }
Nick Lewyckycc64ae12011-10-28 05:29:47 +0000164 Die->addValue(Attribute, dwarf::DW_FORM_strp, Value);
Devang Patel0e821f42011-04-12 23:21:44 +0000165}
166
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000167/// addExpr - Add a Dwarf expression attribute data and value.
Devang Patel0e821f42011-04-12 23:21:44 +0000168///
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000169void CompileUnit::addExpr(DIE *Die, unsigned Attribute, unsigned Form,
170 const MCExpr *Expr) {
171 DIEValue *Value = new (DIEValueAllocator) DIEExpr(Expr);
Devang Patel0e821f42011-04-12 23:21:44 +0000172 Die->addValue(Attribute, Form, Value);
173}
174
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000175/// addLabel - Add a Dwarf label attribute data and value.
176///
David Blaikief3cd7c52013-06-28 20:05:04 +0000177void CompileUnit::addLabel(DIE *Die, unsigned Attribute, unsigned Form,
178 const MCSymbol *Label) {
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000179 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
180 Die->addValue(Attribute, Form, Value);
David Blaikief3cd7c52013-06-28 20:05:04 +0000181}
182
Eric Christopher962c9082013-01-15 23:56:56 +0000183/// addLabelAddress - Add a dwarf label attribute data and value using
184/// DW_FORM_addr or DW_FORM_GNU_addr_index.
185///
186void CompileUnit::addLabelAddress(DIE *Die, unsigned Attribute,
187 MCSymbol *Label) {
188 if (!DD->useSplitDwarf()) {
189 if (Label != NULL) {
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000190 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
Eric Christopher962c9082013-01-15 23:56:56 +0000191 Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
192 } else {
193 DIEValue *Value = new (DIEValueAllocator) DIEInteger(0);
194 Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
195 }
196 } else {
197 unsigned idx = DU->getAddrPoolIndex(Label);
198 DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx);
199 Die->addValue(Attribute, dwarf::DW_FORM_GNU_addr_index, Value);
200 }
201}
202
Eric Christophere9ec2452013-01-18 22:11:33 +0000203/// addOpAddress - Add a dwarf op address data and value using the
204/// form given and an op of either DW_FORM_addr or DW_FORM_GNU_addr_index.
205///
David Blaikief3cd7c52013-06-28 20:05:04 +0000206void CompileUnit::addOpAddress(DIE *Die, const MCSymbol *Sym) {
Eric Christophere9ec2452013-01-18 22:11:33 +0000207 if (!DD->useSplitDwarf()) {
208 addUInt(Die, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
209 addLabel(Die, 0, dwarf::DW_FORM_udata, Sym);
210 } else {
Eric Christophere9ec2452013-01-18 22:11:33 +0000211 addUInt(Die, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_addr_index);
David Blaikie8466ca82013-07-01 23:55:52 +0000212 addUInt(Die, 0, dwarf::DW_FORM_GNU_addr_index, DU->getAddrPoolIndex(Sym));
Eric Christophere9ec2452013-01-18 22:11:33 +0000213 }
214}
215
Devang Patel0e821f42011-04-12 23:21:44 +0000216/// addDelta - Add a label delta attribute data and value.
217///
218void CompileUnit::addDelta(DIE *Die, unsigned Attribute, unsigned Form,
219 const MCSymbol *Hi, const MCSymbol *Lo) {
220 DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
221 Die->addValue(Attribute, Form, Value);
222}
223
224/// addDIEEntry - Add a DIE attribute data and value.
225///
226void CompileUnit::addDIEEntry(DIE *Die, unsigned Attribute, unsigned Form,
227 DIE *Entry) {
228 Die->addValue(Attribute, Form, createDIEEntry(Entry));
229}
230
Devang Patel0e821f42011-04-12 23:21:44 +0000231/// addBlock - Add block data.
232///
233void CompileUnit::addBlock(DIE *Die, unsigned Attribute, unsigned Form,
234 DIEBlock *Block) {
235 Block->ComputeSize(Asm);
236 DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
237 Die->addValue(Attribute, Block->BestForm(), Block);
238}
239
240/// addSourceLine - Add location information to specified debug information
241/// entry.
242void CompileUnit::addSourceLine(DIE *Die, DIVariable V) {
243 // Verify variable.
Manman Ren7504ed42013-07-08 18:33:29 +0000244 if (!V.isVariable())
Devang Patel0e821f42011-04-12 23:21:44 +0000245 return;
Eric Christopher92331fd2012-11-21 00:34:38 +0000246
Devang Patel0e821f42011-04-12 23:21:44 +0000247 unsigned Line = V.getLineNumber();
248 if (Line == 0)
249 return;
Eric Christopher7b30f2e42012-11-21 00:34:35 +0000250 unsigned FileID = DD->getOrCreateSourceID(V.getContext().getFilename(),
Manman Ren1e427202013-03-07 01:42:00 +0000251 V.getContext().getDirectory(),
252 getUniqueID());
Devang Patel0e821f42011-04-12 23:21:44 +0000253 assert(FileID && "Invalid file id");
254 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
255 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
256}
257
258/// addSourceLine - Add location information to specified debug information
259/// entry.
260void CompileUnit::addSourceLine(DIE *Die, DIGlobalVariable G) {
261 // Verify global variable.
Manman Ren7504ed42013-07-08 18:33:29 +0000262 if (!G.isGlobalVariable())
Devang Patel0e821f42011-04-12 23:21:44 +0000263 return;
264
265 unsigned Line = G.getLineNumber();
266 if (Line == 0)
267 return;
Manman Ren1e427202013-03-07 01:42:00 +0000268 unsigned FileID = DD->getOrCreateSourceID(G.getFilename(), G.getDirectory(),
269 getUniqueID());
Devang Patel0e821f42011-04-12 23:21:44 +0000270 assert(FileID && "Invalid file id");
271 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
272 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
273}
274
275/// addSourceLine - Add location information to specified debug information
276/// entry.
277void CompileUnit::addSourceLine(DIE *Die, DISubprogram SP) {
278 // Verify subprogram.
Manman Ren7504ed42013-07-08 18:33:29 +0000279 if (!SP.isSubprogram())
Devang Patel0e821f42011-04-12 23:21:44 +0000280 return;
Eric Christopher7734ca22012-03-15 23:55:40 +0000281
Devang Patel0e821f42011-04-12 23:21:44 +0000282 // If the line number is 0, don't add it.
Eric Christopher7734ca22012-03-15 23:55:40 +0000283 unsigned Line = SP.getLineNumber();
284 if (Line == 0)
Devang Patel0e821f42011-04-12 23:21:44 +0000285 return;
286
Eric Christopher7b30f2e42012-11-21 00:34:35 +0000287 unsigned FileID = DD->getOrCreateSourceID(SP.getFilename(),
Manman Ren1e427202013-03-07 01:42:00 +0000288 SP.getDirectory(), getUniqueID());
Devang Patel0e821f42011-04-12 23:21:44 +0000289 assert(FileID && "Invalid file id");
290 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
291 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
292}
293
294/// addSourceLine - Add location information to specified debug information
295/// entry.
296void CompileUnit::addSourceLine(DIE *Die, DIType Ty) {
297 // Verify type.
Manman Ren7504ed42013-07-08 18:33:29 +0000298 if (!Ty.isType())
Devang Patel0e821f42011-04-12 23:21:44 +0000299 return;
300
301 unsigned Line = Ty.getLineNumber();
Eric Christopher7734ca22012-03-15 23:55:40 +0000302 if (Line == 0)
Devang Patel0e821f42011-04-12 23:21:44 +0000303 return;
Eric Christopher7b30f2e42012-11-21 00:34:35 +0000304 unsigned FileID = DD->getOrCreateSourceID(Ty.getFilename(),
Manman Ren1e427202013-03-07 01:42:00 +0000305 Ty.getDirectory(), getUniqueID());
Devang Patel0e821f42011-04-12 23:21:44 +0000306 assert(FileID && "Invalid file id");
307 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
308 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
309}
310
311/// addSourceLine - Add location information to specified debug information
312/// entry.
Eric Christopher70e1bd82012-03-29 08:42:56 +0000313void CompileUnit::addSourceLine(DIE *Die, DIObjCProperty Ty) {
314 // Verify type.
Manman Ren7504ed42013-07-08 18:33:29 +0000315 if (!Ty.isObjCProperty())
Eric Christopher70e1bd82012-03-29 08:42:56 +0000316 return;
317
318 unsigned Line = Ty.getLineNumber();
319 if (Line == 0)
320 return;
321 DIFile File = Ty.getFile();
Eric Christopher7b30f2e42012-11-21 00:34:35 +0000322 unsigned FileID = DD->getOrCreateSourceID(File.getFilename(),
Manman Ren1e427202013-03-07 01:42:00 +0000323 File.getDirectory(), getUniqueID());
Eric Christopher70e1bd82012-03-29 08:42:56 +0000324 assert(FileID && "Invalid file id");
325 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
326 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
327}
328
329/// addSourceLine - Add location information to specified debug information
330/// entry.
Devang Patel0e821f42011-04-12 23:21:44 +0000331void CompileUnit::addSourceLine(DIE *Die, DINameSpace NS) {
332 // Verify namespace.
333 if (!NS.Verify())
334 return;
335
336 unsigned Line = NS.getLineNumber();
337 if (Line == 0)
338 return;
339 StringRef FN = NS.getFilename();
340
Manman Ren1e427202013-03-07 01:42:00 +0000341 unsigned FileID = DD->getOrCreateSourceID(FN, NS.getDirectory(),
342 getUniqueID());
Devang Patel0e821f42011-04-12 23:21:44 +0000343 assert(FileID && "Invalid file id");
344 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
345 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
346}
347
Eric Christopher92331fd2012-11-21 00:34:38 +0000348/// addVariableAddress - Add DW_AT_location attribute for a
Devang Patel77dc5412011-04-27 22:45:24 +0000349/// DbgVariable based on provided MachineLocation.
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000350void CompileUnit::addVariableAddress(const DbgVariable &DV, DIE *Die,
Devang Patel77dc5412011-04-27 22:45:24 +0000351 MachineLocation Location) {
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000352 if (DV.variableHasComplexAddress())
Devang Patel0e821f42011-04-12 23:21:44 +0000353 addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000354 else if (DV.isBlockByrefVariable())
Devang Patel0e821f42011-04-12 23:21:44 +0000355 addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location);
356 else
David Blaikieea2605d2013-06-20 00:25:24 +0000357 addAddress(Die, dwarf::DW_AT_location, Location,
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000358 DV.getVariable().isIndirect());
Devang Patel0e821f42011-04-12 23:21:44 +0000359}
360
Devang Patelba5fbf12011-04-26 19:06:18 +0000361/// addRegisterOp - Add register operand.
362void CompileUnit::addRegisterOp(DIE *TheDie, unsigned Reg) {
363 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
364 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
365 if (DWReg < 32)
366 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + DWReg);
367 else {
368 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
369 addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
370 }
371}
372
373/// addRegisterOffset - Add register offset.
374void CompileUnit::addRegisterOffset(DIE *TheDie, unsigned Reg,
375 int64_t Offset) {
376 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
377 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
378 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
379 if (Reg == TRI->getFrameRegister(*Asm->MF))
380 // If variable offset is based in frame register then use fbreg.
381 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
382 else if (DWReg < 32)
383 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DWReg);
384 else {
385 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
386 addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
387 }
388 addSInt(TheDie, 0, dwarf::DW_FORM_sdata, Offset);
389}
390
391/// addAddress - Add an address attribute to a die based on the location
392/// provided.
393void CompileUnit::addAddress(DIE *Die, unsigned Attribute,
David Blaikieea2605d2013-06-20 00:25:24 +0000394 const MachineLocation &Location, bool Indirect) {
Devang Patelba5fbf12011-04-26 19:06:18 +0000395 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
396
David Blaikieea2605d2013-06-20 00:25:24 +0000397 if (Location.isReg() && !Indirect)
Devang Patelba5fbf12011-04-26 19:06:18 +0000398 addRegisterOp(Block, Location.getReg());
David Blaikieea2605d2013-06-20 00:25:24 +0000399 else {
Devang Patelba5fbf12011-04-26 19:06:18 +0000400 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
David Blaikieea2605d2013-06-20 00:25:24 +0000401 if (Indirect && !Location.isReg()) {
402 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
403 }
404 }
Devang Patelba5fbf12011-04-26 19:06:18 +0000405
406 // Now attach the location information to the DIE.
407 addBlock(Die, Attribute, 0, Block);
408}
409
Devang Patel0e821f42011-04-12 23:21:44 +0000410/// addComplexAddress - Start with the address based on the location provided,
411/// and generate the DWARF information necessary to find the actual variable
412/// given the extra address information encoded in the DIVariable, starting from
413/// the starting location. Add the DWARF information to the die.
414///
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000415void CompileUnit::addComplexAddress(const DbgVariable &DV, DIE *Die,
Devang Patel0e821f42011-04-12 23:21:44 +0000416 unsigned Attribute,
417 const MachineLocation &Location) {
Devang Patel0e821f42011-04-12 23:21:44 +0000418 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000419 unsigned N = DV.getNumAddrElements();
Devang Patel3e021532011-04-28 02:22:40 +0000420 unsigned i = 0;
421 if (Location.isReg()) {
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000422 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
Devang Patel3e021532011-04-28 02:22:40 +0000423 // If first address element is OpPlus then emit
424 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000425 addRegisterOffset(Block, Location.getReg(), DV.getAddrElement(1));
Devang Patel3e021532011-04-28 02:22:40 +0000426 i = 2;
427 } else
428 addRegisterOp(Block, Location.getReg());
429 }
Devang Patelba5fbf12011-04-26 19:06:18 +0000430 else
431 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel0e821f42011-04-12 23:21:44 +0000432
Devang Patel3e021532011-04-28 02:22:40 +0000433 for (;i < N; ++i) {
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000434 uint64_t Element = DV.getAddrElement(i);
Devang Patel0e821f42011-04-12 23:21:44 +0000435 if (Element == DIBuilder::OpPlus) {
436 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000437 addUInt(Block, 0, dwarf::DW_FORM_udata, DV.getAddrElement(++i));
Devang Patel0e821f42011-04-12 23:21:44 +0000438 } else if (Element == DIBuilder::OpDeref) {
Eric Christopher4d250522012-05-08 18:56:00 +0000439 if (!Location.isReg())
440 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Devang Patel0e821f42011-04-12 23:21:44 +0000441 } else llvm_unreachable("unknown DIBuilder Opcode");
442 }
443
444 // Now attach the location information to the DIE.
445 addBlock(Die, Attribute, 0, Block);
446}
447
448/* Byref variables, in Blocks, are declared by the programmer as "SomeType
449 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
450 gives the variable VarName either the struct, or a pointer to the struct, as
451 its type. This is necessary for various behind-the-scenes things the
452 compiler needs to do with by-reference variables in Blocks.
453
454 However, as far as the original *programmer* is concerned, the variable
455 should still have type 'SomeType', as originally declared.
456
457 The function getBlockByrefType dives into the __Block_byref_x_VarName
458 struct to find the original type of the variable, which is then assigned to
459 the variable's Debug Information Entry as its real type. So far, so good.
460 However now the debugger will expect the variable VarName to have the type
461 SomeType. So we need the location attribute for the variable to be an
462 expression that explains to the debugger how to navigate through the
463 pointers and struct to find the actual variable of type SomeType.
464
465 The following function does just that. We start by getting
466 the "normal" location for the variable. This will be the location
467 of either the struct __Block_byref_x_VarName or the pointer to the
468 struct __Block_byref_x_VarName.
469
470 The struct will look something like:
471
472 struct __Block_byref_x_VarName {
473 ... <various fields>
474 struct __Block_byref_x_VarName *forwarding;
475 ... <various other fields>
476 SomeType VarName;
477 ... <maybe more fields>
478 };
479
480 If we are given the struct directly (as our starting point) we
481 need to tell the debugger to:
482
483 1). Add the offset of the forwarding field.
484
485 2). Follow that pointer to get the real __Block_byref_x_VarName
486 struct to use (the real one may have been copied onto the heap).
487
488 3). Add the offset for the field VarName, to find the actual variable.
489
490 If we started with a pointer to the struct, then we need to
491 dereference that pointer first, before the other steps.
492 Translating this into DWARF ops, we will need to append the following
493 to the current location description for the variable:
494
495 DW_OP_deref -- optional, if we start with a pointer
496 DW_OP_plus_uconst <forward_fld_offset>
497 DW_OP_deref
498 DW_OP_plus_uconst <varName_fld_offset>
499
500 That is what this function does. */
501
502/// addBlockByrefAddress - Start with the address based on the location
503/// provided, and generate the DWARF information necessary to find the
504/// actual Block variable (navigating the Block struct) based on the
505/// starting location. Add the DWARF information to the die. For
506/// more information, read large comment just above here.
507///
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000508void CompileUnit::addBlockByrefAddress(const DbgVariable &DV, DIE *Die,
Devang Patel0e821f42011-04-12 23:21:44 +0000509 unsigned Attribute,
510 const MachineLocation &Location) {
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000511 DIType Ty = DV.getType();
Devang Patel0e821f42011-04-12 23:21:44 +0000512 DIType TmpTy = Ty;
513 unsigned Tag = Ty.getTag();
514 bool isPointer = false;
515
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000516 StringRef varName = DV.getName();
Devang Patel0e821f42011-04-12 23:21:44 +0000517
518 if (Tag == dwarf::DW_TAG_pointer_type) {
519 DIDerivedType DTy = DIDerivedType(Ty);
520 TmpTy = DTy.getTypeDerivedFrom();
521 isPointer = true;
522 }
523
524 DICompositeType blockStruct = DICompositeType(TmpTy);
525
526 // Find the __forwarding field and the variable field in the __Block_byref
527 // struct.
528 DIArray Fields = blockStruct.getTypeArray();
529 DIDescriptor varField = DIDescriptor();
530 DIDescriptor forwardingField = DIDescriptor();
531
532 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
533 DIDescriptor Element = Fields.getElement(i);
534 DIDerivedType DT = DIDerivedType(Element);
535 StringRef fieldName = DT.getName();
536 if (fieldName == "__forwarding")
537 forwardingField = Element;
538 else if (fieldName == varName)
539 varField = Element;
540 }
541
542 // Get the offsets for the forwarding field and the variable field.
543 unsigned forwardingFieldOffset =
544 DIDerivedType(forwardingField).getOffsetInBits() >> 3;
545 unsigned varFieldOffset =
546 DIDerivedType(varField).getOffsetInBits() >> 3;
547
548 // Decode the original location, and use that as the start of the byref
549 // variable's location.
Devang Patel0e821f42011-04-12 23:21:44 +0000550 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
551
Eric Christopheref9d7102012-07-04 02:02:18 +0000552 if (Location.isReg())
553 addRegisterOp(Block, Location.getReg());
554 else
555 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel0e821f42011-04-12 23:21:44 +0000556
557 // If we started with a pointer to the __Block_byref... struct, then
558 // the first thing we need to do is dereference the pointer (DW_OP_deref).
559 if (isPointer)
560 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
561
562 // Next add the offset for the '__forwarding' field:
563 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
564 // adding the offset if it's 0.
565 if (forwardingFieldOffset > 0) {
566 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
567 addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
568 }
569
570 // Now dereference the __forwarding field to get to the real __Block_byref
571 // struct: DW_OP_deref.
572 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
573
574 // Now that we've got the real __Block_byref... struct, add the offset
575 // for the variable's field to get to the location of the actual variable:
576 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
577 if (varFieldOffset > 0) {
578 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
579 addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
580 }
581
582 // Now attach the location information to the DIE.
583 addBlock(Die, Attribute, 0, Block);
584}
585
Devang Patelbcd50a12011-07-20 21:57:04 +0000586/// isTypeSigned - Return true if the type is signed.
587static bool isTypeSigned(DIType Ty, int *SizeInBits) {
588 if (Ty.isDerivedType())
589 return isTypeSigned(DIDerivedType(Ty).getTypeDerivedFrom(), SizeInBits);
590 if (Ty.isBasicType())
591 if (DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed
592 || DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed_char) {
593 *SizeInBits = Ty.getSizeInBits();
594 return true;
595 }
596 return false;
597}
598
Devang Patel0e821f42011-04-12 23:21:44 +0000599/// addConstantValue - Add constant value entry in variable DIE.
Eric Christopher78fcf4902013-07-03 01:08:30 +0000600void CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO,
Devang Patel3c6aed22011-05-27 16:45:18 +0000601 DIType Ty) {
David Blaikiea1e813d2013-05-10 21:52:07 +0000602 // FIXME: This is a bit conservative/simple - it emits negative values at
603 // their maximum bit width which is a bit unfortunate (& doesn't prefer
604 // udata/sdata over dataN as suggested by the DWARF spec)
Nick Lewycky654f5ce2011-10-26 22:55:33 +0000605 assert(MO.isImm() && "Invalid machine operand!");
Devang Patel0e821f42011-04-12 23:21:44 +0000606 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Devang Patelbcd50a12011-07-20 21:57:04 +0000607 int SizeInBits = -1;
608 bool SignedConstant = isTypeSigned(Ty, &SizeInBits);
609 unsigned Form = SignedConstant ? dwarf::DW_FORM_sdata : dwarf::DW_FORM_udata;
610 switch (SizeInBits) {
611 case 8: Form = dwarf::DW_FORM_data1; break;
612 case 16: Form = dwarf::DW_FORM_data2; break;
613 case 32: Form = dwarf::DW_FORM_data4; break;
614 case 64: Form = dwarf::DW_FORM_data8; break;
Devang Patel39e22ea2011-05-27 19:13:26 +0000615 default: break;
616 }
Eric Christopher92331fd2012-11-21 00:34:38 +0000617 SignedConstant ? addSInt(Block, 0, Form, MO.getImm())
Devang Patelbcd50a12011-07-20 21:57:04 +0000618 : addUInt(Block, 0, Form, MO.getImm());
Devang Patelf1d04702011-05-27 18:15:52 +0000619
Devang Patel0e821f42011-04-12 23:21:44 +0000620 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
Devang Patel0e821f42011-04-12 23:21:44 +0000621}
622
623/// addConstantFPValue - Add constant value entry in variable DIE.
Eric Christopher78fcf4902013-07-03 01:08:30 +0000624void CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +0000625 assert (MO.isFPImm() && "Invalid machine operand!");
Devang Patel0e821f42011-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 Villmowcdfe20b2012-10-08 16:38:25 +0000634 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel0e821f42011-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);
Devang Patel0e821f42011-04-12 23:21:44 +0000645}
646
David Blaikiea39a76e2013-01-20 01:18:01 +0000647/// addConstantFPValue - Add constant value entry in variable DIE.
Eric Christopher78fcf4902013-07-03 01:08:30 +0000648void CompileUnit::addConstantFPValue(DIE *Die, const ConstantFP *CFP) {
649 addConstantValue(Die, CFP->getValueAPF().bitcastToAPInt(), false);
David Blaikiea39a76e2013-01-20 01:18:01 +0000650}
651
Devang Patel0e821f42011-04-12 23:21:44 +0000652/// addConstantValue - Add constant value entry in variable DIE.
Eric Christopher78fcf4902013-07-03 01:08:30 +0000653void CompileUnit::addConstantValue(DIE *Die, const ConstantInt *CI,
Devang Patel0e821f42011-04-12 23:21:44 +0000654 bool Unsigned) {
Eric Christopher78fcf4902013-07-03 01:08:30 +0000655 addConstantValue(Die, CI->getValue(), Unsigned);
David Blaikiea39a76e2013-01-20 01:18:01 +0000656}
657
658// addConstantValue - Add constant value entry in variable DIE.
Eric Christopher78fcf4902013-07-03 01:08:30 +0000659void CompileUnit::addConstantValue(DIE *Die, const APInt &Val, bool Unsigned) {
David Blaikiea39a76e2013-01-20 01:18:01 +0000660 unsigned CIBitWidth = Val.getBitWidth();
Devang Patel8816bbc2011-05-28 00:39:18 +0000661 if (CIBitWidth <= 64) {
662 unsigned form = 0;
663 switch (CIBitWidth) {
664 case 8: form = dwarf::DW_FORM_data1; break;
665 case 16: form = dwarf::DW_FORM_data2; break;
666 case 32: form = dwarf::DW_FORM_data4; break;
667 case 64: form = dwarf::DW_FORM_data8; break;
Eric Christopher92331fd2012-11-21 00:34:38 +0000668 default:
Devang Patel8816bbc2011-05-28 00:39:18 +0000669 form = Unsigned ? dwarf::DW_FORM_udata : dwarf::DW_FORM_sdata;
670 }
Devang Patel0e821f42011-04-12 23:21:44 +0000671 if (Unsigned)
David Blaikiea39a76e2013-01-20 01:18:01 +0000672 addUInt(Die, dwarf::DW_AT_const_value, form, Val.getZExtValue());
Devang Patel0e821f42011-04-12 23:21:44 +0000673 else
David Blaikiea39a76e2013-01-20 01:18:01 +0000674 addSInt(Die, dwarf::DW_AT_const_value, form, Val.getSExtValue());
Eric Christopher78fcf4902013-07-03 01:08:30 +0000675 return;
Devang Patel0e821f42011-04-12 23:21:44 +0000676 }
677
678 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
679
680 // Get the raw data form of the large APInt.
NAKAMURA Takumi29ccdd82011-10-28 14:12:22 +0000681 const uint64_t *Ptr64 = Val.getRawData();
Devang Patel0e821f42011-04-12 23:21:44 +0000682
683 int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
Micah Villmowcdfe20b2012-10-08 16:38:25 +0000684 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel0e821f42011-04-12 23:21:44 +0000685
686 // Output the constant to DWARF one byte at a time.
NAKAMURA Takumi29ccdd82011-10-28 14:12:22 +0000687 for (int i = 0; i < NumBytes; i++) {
688 uint8_t c;
689 if (LittleEndian)
690 c = Ptr64[i / 8] >> (8 * (i & 7));
691 else
692 c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7));
693 addUInt(Block, 0, dwarf::DW_FORM_data1, c);
694 }
Devang Patel0e821f42011-04-12 23:21:44 +0000695
696 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
Devang Patel0e821f42011-04-12 23:21:44 +0000697}
698
Eric Christopher25e35092013-04-22 07:47:40 +0000699/// addTemplateParams - Add template parameters into buffer.
Devang Patel0e821f42011-04-12 23:21:44 +0000700void CompileUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
701 // Add template parameters.
702 for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) {
703 DIDescriptor Element = TParams.getElement(i);
704 if (Element.isTemplateTypeParameter())
705 Buffer.addChild(getOrCreateTemplateTypeParameterDIE(
706 DITemplateTypeParameter(Element)));
707 else if (Element.isTemplateValueParameter())
708 Buffer.addChild(getOrCreateTemplateValueParameterDIE(
709 DITemplateValueParameter(Element)));
710 }
Devang Patel0e821f42011-04-12 23:21:44 +0000711}
Nick Lewycky654f5ce2011-10-26 22:55:33 +0000712
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000713/// getOrCreateContextDIE - Get context owner's DIE.
714DIE *CompileUnit::getOrCreateContextDIE(DIDescriptor Context) {
715 if (Context.isType())
716 return getOrCreateTypeDIE(DIType(Context));
717 else if (Context.isNameSpace())
718 return getOrCreateNameSpace(DINameSpace(Context));
719 else if (Context.isSubprogram())
720 return getOrCreateSubprogramDIE(DISubprogram(Context));
Eric Christopher25e35092013-04-22 07:47:40 +0000721 else
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000722 return getDIE(Context);
723}
724
Devang Patel0e821f42011-04-12 23:21:44 +0000725/// addToContextOwner - Add Die into the list of its context owner's children.
726void CompileUnit::addToContextOwner(DIE *Die, DIDescriptor Context) {
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000727 if (DIE *ContextDIE = getOrCreateContextDIE(Context))
Devang Patel0e821f42011-04-12 23:21:44 +0000728 ContextDIE->addChild(Die);
729 else
730 addDie(Die);
731}
732
733/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
734/// given DIType.
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000735DIE *CompileUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
736 DIType Ty(TyNode);
Manman Ren7504ed42013-07-08 18:33:29 +0000737 if (!Ty.isType())
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000738 return NULL;
Devang Patel0e821f42011-04-12 23:21:44 +0000739 DIE *TyDIE = getDIE(Ty);
740 if (TyDIE)
741 return TyDIE;
742
743 // Create new type.
744 TyDIE = new DIE(dwarf::DW_TAG_base_type);
745 insertDIE(Ty, TyDIE);
746 if (Ty.isBasicType())
747 constructTypeDIE(*TyDIE, DIBasicType(Ty));
748 else if (Ty.isCompositeType())
749 constructTypeDIE(*TyDIE, DICompositeType(Ty));
750 else {
751 assert(Ty.isDerivedType() && "Unknown kind of DIType");
752 constructTypeDIE(*TyDIE, DIDerivedType(Ty));
753 }
Eric Christophere2887932011-11-10 19:52:58 +0000754 // If this is a named finished type then include it in the list of types
755 // for the accelerator tables.
Eric Christopher21bde872012-01-06 04:35:23 +0000756 if (!Ty.getName().empty() && !Ty.isForwardDecl()) {
757 bool IsImplementation = 0;
758 if (Ty.isCompositeType()) {
759 DICompositeType CT(Ty);
Eric Christopher8ea8e4f2012-01-06 23:03:37 +0000760 // A runtime language of 0 actually means C/C++ and that any
761 // non-negative value is some version of Objective-C/C++.
Eric Christopher21bde872012-01-06 04:35:23 +0000762 IsImplementation = (CT.getRunTimeLang() == 0) ||
Eric Christopheref64b462012-02-22 08:46:02 +0000763 CT.isObjcClassComplete();
Eric Christopher21bde872012-01-06 04:35:23 +0000764 }
Eric Christopher8ea8e4f2012-01-06 23:03:37 +0000765 unsigned Flags = IsImplementation ?
766 DwarfAccelTable::eTypeFlagClassIsImplementation : 0;
767 addAccelType(Ty.getName(), std::make_pair(TyDIE, Flags));
Eric Christopher21bde872012-01-06 04:35:23 +0000768 }
Eric Christopher92331fd2012-11-21 00:34:38 +0000769
Devang Patel0e821f42011-04-12 23:21:44 +0000770 addToContextOwner(TyDIE, Ty.getContext());
771 return TyDIE;
772}
773
774/// addType - Add a new type attribute to the specified entity.
Eric Christopherd42b92f2012-05-22 18:45:24 +0000775void CompileUnit::addType(DIE *Entity, DIType Ty, unsigned Attribute) {
Manman Ren7504ed42013-07-08 18:33:29 +0000776 if (!Ty.isType())
Devang Patel0e821f42011-04-12 23:21:44 +0000777 return;
778
779 // Check for pre-existence.
780 DIEEntry *Entry = getDIEEntry(Ty);
781 // If it exists then use the existing value.
782 if (Entry) {
Eric Christopher7285c7d2012-03-28 07:34:31 +0000783 Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
Devang Patel0e821f42011-04-12 23:21:44 +0000784 return;
785 }
786
787 // Construct type.
788 DIE *Buffer = getOrCreateTypeDIE(Ty);
789
790 // Set up proxy.
791 Entry = createDIEEntry(Buffer);
792 insertDIEEntry(Ty, Entry);
Eric Christopher7285c7d2012-03-28 07:34:31 +0000793 Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
Devang Patele9853f22011-05-31 22:56:51 +0000794
795 // If this is a complete composite type then include it in the
796 // list of global types.
Devang Patel562c7422011-06-01 00:23:24 +0000797 addGlobalType(Ty);
Devang Patel1cb8ab42011-05-31 23:30:30 +0000798}
799
800/// addGlobalType - Add a new global type to the compile unit.
801///
Devang Patel562c7422011-06-01 00:23:24 +0000802void CompileUnit::addGlobalType(DIType Ty) {
Devang Patele9853f22011-05-31 22:56:51 +0000803 DIDescriptor Context = Ty.getContext();
Eric Christopher92331fd2012-11-21 00:34:38 +0000804 if (Ty.isCompositeType() && !Ty.getName().empty() && !Ty.isForwardDecl()
805 && (!Context || Context.isCompileUnit() || Context.isFile()
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000806 || Context.isNameSpace()))
Devang Patel562c7422011-06-01 00:23:24 +0000807 if (DIEEntry *Entry = getDIEEntry(Ty))
808 GlobalTypes[Ty.getName()] = Entry->getEntry();
Devang Patel0e821f42011-04-12 23:21:44 +0000809}
810
Devang Patel17b53272011-05-06 16:57:54 +0000811/// addPubTypes - Add type for pubtypes section.
812void CompileUnit::addPubTypes(DISubprogram SP) {
813 DICompositeType SPTy = SP.getType();
814 unsigned SPTag = SPTy.getTag();
815 if (SPTag != dwarf::DW_TAG_subroutine_type)
816 return;
817
818 DIArray Args = SPTy.getTypeArray();
819 for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
820 DIType ATy(Args.getElement(i));
Manman Ren7504ed42013-07-08 18:33:29 +0000821 if (!ATy.isType())
Devang Patel17b53272011-05-06 16:57:54 +0000822 continue;
Devang Patel562c7422011-06-01 00:23:24 +0000823 addGlobalType(ATy);
Devang Patel17b53272011-05-06 16:57:54 +0000824 }
825}
826
Devang Patel0e821f42011-04-12 23:21:44 +0000827/// constructTypeDIE - Construct basic type die from DIBasicType.
828void CompileUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
829 // Get core information.
830 StringRef Name = BTy.getName();
Devang Patel0e821f42011-04-12 23:21:44 +0000831 // Add name if not anonymous or intermediate type.
832 if (!Name.empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +0000833 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel04d6d472011-09-14 23:13:28 +0000834
835 if (BTy.getTag() == dwarf::DW_TAG_unspecified_type) {
836 Buffer.setTag(dwarf::DW_TAG_unspecified_type);
Eric Christopher93ebdd72013-07-09 23:48:45 +0000837 // An unspecified type only has a name attribute.
Devang Patel04d6d472011-09-14 23:13:28 +0000838 return;
839 }
840
841 Buffer.setTag(dwarf::DW_TAG_base_type);
Nick Lewycky654f5ce2011-10-26 22:55:33 +0000842 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
Devang Pateld925d1a2012-02-07 23:33:58 +0000843 BTy.getEncoding());
Devang Patel04d6d472011-09-14 23:13:28 +0000844
Devang Patel0e821f42011-04-12 23:21:44 +0000845 uint64_t Size = BTy.getSizeInBits() >> 3;
846 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
847}
848
849/// constructTypeDIE - Construct derived type die from DIDerivedType.
850void CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
851 // Get core information.
852 StringRef Name = DTy.getName();
853 uint64_t Size = DTy.getSizeInBits() >> 3;
854 unsigned Tag = DTy.getTag();
855
856 // FIXME - Workaround for templates.
857 if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
858
859 Buffer.setTag(Tag);
860
861 // Map to main type, void will not have a type.
862 DIType FromTy = DTy.getTypeDerivedFrom();
863 addType(&Buffer, FromTy);
864
865 // Add name if not anonymous or intermediate type.
866 if (!Name.empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +0000867 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel0e821f42011-04-12 23:21:44 +0000868
869 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopher85757902012-02-21 22:25:53 +0000870 if (Size && Tag != dwarf::DW_TAG_pointer_type)
Devang Patel0e821f42011-04-12 23:21:44 +0000871 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
872
David Blaikie5d3249b2013-01-07 05:51:15 +0000873 if (Tag == dwarf::DW_TAG_ptr_to_member_type)
874 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
875 getOrCreateTypeDIE(DTy.getClassType()));
Devang Patel0e821f42011-04-12 23:21:44 +0000876 // Add source line info if available and TyDesc is not a forward declaration.
877 if (!DTy.isForwardDecl())
878 addSourceLine(&Buffer, DTy);
879}
880
881/// constructTypeDIE - Construct type DIE from DICompositeType.
882void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
883 // Get core information.
884 StringRef Name = CTy.getName();
885
886 uint64_t Size = CTy.getSizeInBits() >> 3;
887 unsigned Tag = CTy.getTag();
888 Buffer.setTag(Tag);
889
890 switch (Tag) {
Devang Patel0e821f42011-04-12 23:21:44 +0000891 case dwarf::DW_TAG_array_type:
892 constructArrayTypeDIE(Buffer, &CTy);
893 break;
894 case dwarf::DW_TAG_enumeration_type: {
895 DIArray Elements = CTy.getTypeArray();
896
897 // Add enumerators to enumeration type.
898 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
899 DIE *ElemDie = NULL;
900 DIDescriptor Enum(Elements.getElement(i));
901 if (Enum.isEnumerator()) {
902 ElemDie = constructEnumTypeDIE(DIEnumerator(Enum));
903 Buffer.addChild(ElemDie);
904 }
905 }
Eric Christopherc4964352012-05-23 00:09:20 +0000906 DIType DTy = CTy.getTypeDerivedFrom();
Manman Ren7504ed42013-07-08 18:33:29 +0000907 if (DTy.isType()) {
Eric Christopherc4964352012-05-23 00:09:20 +0000908 addType(&Buffer, DTy);
909 addUInt(&Buffer, dwarf::DW_AT_enum_class, dwarf::DW_FORM_flag, 1);
910 }
Devang Patel0e821f42011-04-12 23:21:44 +0000911 }
912 break;
913 case dwarf::DW_TAG_subroutine_type: {
914 // Add return type.
915 DIArray Elements = CTy.getTypeArray();
916 DIDescriptor RTy = Elements.getElement(0);
917 addType(&Buffer, DIType(RTy));
918
919 bool isPrototyped = true;
920 // Add arguments.
921 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
922 DIDescriptor Ty = Elements.getElement(i);
923 if (Ty.isUnspecifiedParameter()) {
924 DIE *Arg = new DIE(dwarf::DW_TAG_unspecified_parameters);
925 Buffer.addChild(Arg);
926 isPrototyped = false;
927 } else {
928 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
929 addType(Arg, DIType(Ty));
David Blaikie9a7a7a92013-01-29 19:35:24 +0000930 if (DIType(Ty).isArtificial())
931 addFlag(Arg, dwarf::DW_AT_artificial);
Devang Patel0e821f42011-04-12 23:21:44 +0000932 Buffer.addChild(Arg);
933 }
934 }
Eric Christopher5cd2a9d2012-02-22 08:46:21 +0000935 // Add prototype flag if we're dealing with a C language and the
936 // function has been prototyped.
937 if (isPrototyped &&
Eric Christopherd42b92f2012-05-22 18:45:24 +0000938 (Language == dwarf::DW_LANG_C89 ||
939 Language == dwarf::DW_LANG_C99 ||
940 Language == dwarf::DW_LANG_ObjC))
Eric Christopherbb69a272012-08-24 01:14:27 +0000941 addFlag(&Buffer, dwarf::DW_AT_prototyped);
Devang Patel0e821f42011-04-12 23:21:44 +0000942 }
943 break;
944 case dwarf::DW_TAG_structure_type:
945 case dwarf::DW_TAG_union_type:
946 case dwarf::DW_TAG_class_type: {
947 // Add elements to structure type.
948 DIArray Elements = CTy.getTypeArray();
949
950 // A forward struct declared type may not have elements available.
951 unsigned N = Elements.getNumElements();
952 if (N == 0)
953 break;
954
955 // Add elements to structure type.
956 for (unsigned i = 0; i < N; ++i) {
957 DIDescriptor Element = Elements.getElement(i);
958 DIE *ElemDie = NULL;
959 if (Element.isSubprogram()) {
960 DISubprogram SP(Element);
Devang Patel89543712011-08-15 17:24:54 +0000961 ElemDie = getOrCreateSubprogramDIE(DISubprogram(Element));
Devang Patel0e821f42011-04-12 23:21:44 +0000962 if (SP.isProtected())
Nick Lewyckycb918492011-12-13 05:09:11 +0000963 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +0000964 dwarf::DW_ACCESS_protected);
965 else if (SP.isPrivate())
Nick Lewyckycb918492011-12-13 05:09:11 +0000966 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +0000967 dwarf::DW_ACCESS_private);
Eric Christopher92331fd2012-11-21 00:34:38 +0000968 else
Nick Lewyckycb918492011-12-13 05:09:11 +0000969 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +0000970 dwarf::DW_ACCESS_public);
971 if (SP.isExplicit())
Eric Christopherbb69a272012-08-24 01:14:27 +0000972 addFlag(ElemDie, dwarf::DW_AT_explicit);
Eric Christopher7285c7d2012-03-28 07:34:31 +0000973 } else if (Element.isDerivedType()) {
Eric Christopherd42b92f2012-05-22 18:45:24 +0000974 DIDerivedType DDTy(Element);
975 if (DDTy.getTag() == dwarf::DW_TAG_friend) {
976 ElemDie = new DIE(dwarf::DW_TAG_friend);
977 addType(ElemDie, DDTy.getTypeDerivedFrom(), dwarf::DW_AT_friend);
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000978 } else if (DDTy.isStaticMember())
979 ElemDie = createStaticMemberDIE(DDTy);
980 else
981 ElemDie = createMemberDIE(DDTy);
Eric Christopher7285c7d2012-03-28 07:34:31 +0000982 } else if (Element.isObjCProperty()) {
Devang Pateld925d1a2012-02-07 23:33:58 +0000983 DIObjCProperty Property(Element);
984 ElemDie = new DIE(Property.getTag());
985 StringRef PropertyName = Property.getObjCPropertyName();
986 addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
Eric Christopherd42b92f2012-05-22 18:45:24 +0000987 addType(ElemDie, Property.getType());
988 addSourceLine(ElemDie, Property);
Devang Pateld925d1a2012-02-07 23:33:58 +0000989 StringRef GetterName = Property.getObjCPropertyGetterName();
990 if (!GetterName.empty())
991 addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
992 StringRef SetterName = Property.getObjCPropertySetterName();
993 if (!SetterName.empty())
994 addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
995 unsigned PropertyAttributes = 0;
Devang Patel403e8192012-02-04 01:30:32 +0000996 if (Property.isReadOnlyObjCProperty())
997 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
998 if (Property.isReadWriteObjCProperty())
999 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
1000 if (Property.isAssignObjCProperty())
1001 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
1002 if (Property.isRetainObjCProperty())
1003 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
1004 if (Property.isCopyObjCProperty())
1005 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
1006 if (Property.isNonAtomicObjCProperty())
1007 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
1008 if (PropertyAttributes)
Eric Christopher92331fd2012-11-21 00:34:38 +00001009 addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, 0,
Devang Patel403e8192012-02-04 01:30:32 +00001010 PropertyAttributes);
Devang Patel44882172012-02-06 17:49:43 +00001011
Devang Pateld925d1a2012-02-07 23:33:58 +00001012 DIEEntry *Entry = getDIEEntry(Element);
1013 if (!Entry) {
1014 Entry = createDIEEntry(ElemDie);
1015 insertDIEEntry(Element, Entry);
1016 }
Devang Patel403e8192012-02-04 01:30:32 +00001017 } else
Devang Patel0e821f42011-04-12 23:21:44 +00001018 continue;
1019 Buffer.addChild(ElemDie);
1020 }
1021
1022 if (CTy.isAppleBlockExtension())
Eric Christopherbb69a272012-08-24 01:14:27 +00001023 addFlag(&Buffer, dwarf::DW_AT_APPLE_block);
Devang Patel0e821f42011-04-12 23:21:44 +00001024
Devang Patel0e821f42011-04-12 23:21:44 +00001025 DICompositeType ContainingType = CTy.getContainingType();
1026 if (DIDescriptor(ContainingType).isCompositeType())
1027 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
1028 getOrCreateTypeDIE(DIType(ContainingType)));
Eric Christopher666dc632013-07-14 21:46:51 +00001029 else
1030 addToContextOwner(&Buffer, CTy.getContext());
Devang Patel0e821f42011-04-12 23:21:44 +00001031
Devang Patel12419ae2011-05-12 21:29:42 +00001032 if (CTy.isObjcClassComplete())
Eric Christopherbb69a272012-08-24 01:14:27 +00001033 addFlag(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type);
Devang Patel2409e782011-05-12 19:06:16 +00001034
Eric Christopherda011dd2011-12-16 23:42:42 +00001035 // Add template parameters to a class, structure or union types.
1036 // FIXME: The support isn't in the metadata for this yet.
1037 if (Tag == dwarf::DW_TAG_class_type ||
1038 Tag == dwarf::DW_TAG_structure_type ||
1039 Tag == dwarf::DW_TAG_union_type)
Devang Patel0e821f42011-04-12 23:21:44 +00001040 addTemplateParams(Buffer, CTy.getTemplateParams());
1041
1042 break;
1043 }
1044 default:
1045 break;
1046 }
1047
1048 // Add name if not anonymous or intermediate type.
1049 if (!Name.empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +00001050 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel0e821f42011-04-12 23:21:44 +00001051
Eric Christopher775cbd22012-05-22 18:45:18 +00001052 if (Tag == dwarf::DW_TAG_enumeration_type ||
1053 Tag == dwarf::DW_TAG_class_type ||
1054 Tag == dwarf::DW_TAG_structure_type ||
1055 Tag == dwarf::DW_TAG_union_type) {
Devang Patel0e821f42011-04-12 23:21:44 +00001056 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopher1cf33382012-06-01 00:22:32 +00001057 // TODO: Do we care about size for enum forward declarations?
Devang Patel0e821f42011-04-12 23:21:44 +00001058 if (Size)
1059 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
Eric Christopher1cf33382012-06-01 00:22:32 +00001060 else if (!CTy.isForwardDecl())
Devang Patel0e821f42011-04-12 23:21:44 +00001061 // Add zero size if it is not a forward declaration.
Eric Christopher1cf33382012-06-01 00:22:32 +00001062 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
1063
1064 // If we're a forward decl, say so.
1065 if (CTy.isForwardDecl())
Eric Christopherbb69a272012-08-24 01:14:27 +00001066 addFlag(&Buffer, dwarf::DW_AT_declaration);
Devang Patel0e821f42011-04-12 23:21:44 +00001067
1068 // Add source line info if available.
1069 if (!CTy.isForwardDecl())
1070 addSourceLine(&Buffer, CTy);
Eric Christopher54cf8ff2012-03-07 00:15:19 +00001071
1072 // No harm in adding the runtime language to the declaration.
1073 unsigned RLang = CTy.getRunTimeLang();
1074 if (RLang)
1075 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
1076 dwarf::DW_FORM_data1, RLang);
Devang Patel0e821f42011-04-12 23:21:44 +00001077 }
1078}
1079
Eric Christopher92331fd2012-11-21 00:34:38 +00001080/// getOrCreateTemplateTypeParameterDIE - Find existing DIE or create new DIE
Devang Patel0e821f42011-04-12 23:21:44 +00001081/// for the given DITemplateTypeParameter.
1082DIE *
1083CompileUnit::getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP) {
1084 DIE *ParamDIE = getDIE(TP);
1085 if (ParamDIE)
1086 return ParamDIE;
1087
1088 ParamDIE = new DIE(dwarf::DW_TAG_template_type_parameter);
1089 addType(ParamDIE, TP.getType());
David Blaikie2b380232013-06-22 18:59:11 +00001090 if (!TP.getName().empty())
1091 addString(ParamDIE, dwarf::DW_AT_name, TP.getName());
Devang Patel0e821f42011-04-12 23:21:44 +00001092 return ParamDIE;
1093}
1094
Eric Christopher92331fd2012-11-21 00:34:38 +00001095/// getOrCreateTemplateValueParameterDIE - Find existing DIE or create new DIE
Devang Patel0e821f42011-04-12 23:21:44 +00001096/// for the given DITemplateValueParameter.
1097DIE *
Eric Christopherd42b92f2012-05-22 18:45:24 +00001098CompileUnit::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter TPV){
Devang Patel0e821f42011-04-12 23:21:44 +00001099 DIE *ParamDIE = getDIE(TPV);
1100 if (ParamDIE)
1101 return ParamDIE;
1102
David Blaikie2b380232013-06-22 18:59:11 +00001103 ParamDIE = new DIE(TPV.getTag());
Devang Patel0e821f42011-04-12 23:21:44 +00001104 addType(ParamDIE, TPV.getType());
1105 if (!TPV.getName().empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +00001106 addString(ParamDIE, dwarf::DW_AT_name, TPV.getName());
David Blaikiea1e813d2013-05-10 21:52:07 +00001107 if (Value *Val = TPV.getValue()) {
1108 if (ConstantInt *CI = dyn_cast<ConstantInt>(Val))
1109 addConstantValue(ParamDIE, CI, TPV.getType().isUnsignedDIType());
1110 else if (GlobalValue *GV = dyn_cast<GlobalValue>(Val)) {
1111 // For declaration non-type template parameters (such as global values and
1112 // functions)
1113 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1114 addOpAddress(Block, Asm->Mang->getSymbol(GV));
1115 // Emit DW_OP_stack_value to use the address as the immediate value of the
1116 // parameter, rather than a pointer to it.
1117 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value);
1118 addBlock(ParamDIE, dwarf::DW_AT_location, 0, Block);
David Blaikie2b380232013-06-22 18:59:11 +00001119 } else if (TPV.getTag() == dwarf::DW_TAG_GNU_template_template_param) {
1120 assert(isa<MDString>(Val));
1121 addString(ParamDIE, dwarf::DW_AT_GNU_template_name,
1122 cast<MDString>(Val)->getString());
1123 } else if (TPV.getTag() == dwarf::DW_TAG_GNU_template_parameter_pack) {
1124 assert(isa<MDNode>(Val));
1125 DIArray A(cast<MDNode>(Val));
1126 addTemplateParams(*ParamDIE, A);
David Blaikiea1e813d2013-05-10 21:52:07 +00001127 }
1128 }
1129
Devang Patel0e821f42011-04-12 23:21:44 +00001130 return ParamDIE;
1131}
1132
Devang Patel17b53272011-05-06 16:57:54 +00001133/// getOrCreateNameSpace - Create a DIE for DINameSpace.
1134DIE *CompileUnit::getOrCreateNameSpace(DINameSpace NS) {
1135 DIE *NDie = getDIE(NS);
1136 if (NDie)
1137 return NDie;
1138 NDie = new DIE(dwarf::DW_TAG_namespace);
1139 insertDIE(NS, NDie);
Eric Christopher4996c702011-11-07 09:24:32 +00001140 if (!NS.getName().empty()) {
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +00001141 addString(NDie, dwarf::DW_AT_name, NS.getName());
Eric Christopher4996c702011-11-07 09:24:32 +00001142 addAccelNamespace(NS.getName(), NDie);
1143 } else
1144 addAccelNamespace("(anonymous namespace)", NDie);
Devang Patel17b53272011-05-06 16:57:54 +00001145 addSourceLine(NDie, NS);
1146 addToContextOwner(NDie, NS.getContext());
1147 return NDie;
1148}
1149
Devang Patel89543712011-08-15 17:24:54 +00001150/// getOrCreateSubprogramDIE - Create new DIE using SP.
1151DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
1152 DIE *SPDie = getDIE(SP);
1153 if (SPDie)
1154 return SPDie;
1155
Peter Collingbourne4d358b52012-05-27 18:36:44 +00001156 SPDie = new DIE(dwarf::DW_TAG_subprogram);
1157
1158 // DW_TAG_inlined_subroutine may refer to this DIE.
1159 insertDIE(SP, SPDie);
1160
Rafael Espindola79278362011-11-10 22:34:29 +00001161 DISubprogram SPDecl = SP.getFunctionDeclaration();
1162 DIE *DeclDie = NULL;
1163 if (SPDecl.isSubprogram()) {
1164 DeclDie = getOrCreateSubprogramDIE(SPDecl);
1165 }
1166
Devang Patel89543712011-08-15 17:24:54 +00001167 // Add to context owner.
1168 addToContextOwner(SPDie, SP.getContext());
1169
1170 // Add function template parameters.
1171 addTemplateParams(*SPDie, SP.getTemplateParams());
1172
Eric Christopherf20ff972013-05-09 00:42:33 +00001173 // Unfortunately this code needs to stay here instead of below the
1174 // AT_specification code in order to work around a bug in older
1175 // gdbs that requires the linkage name to resolve multiple template
1176 // functions.
1177 // TODO: Remove this set of code when we get rid of the old gdb
1178 // compatibility.
Eric Christopher7dd54fb2012-03-15 08:19:33 +00001179 StringRef LinkageName = SP.getLinkageName();
Eric Christopherf20ff972013-05-09 00:42:33 +00001180 if (!LinkageName.empty() && DD->useDarwinGDBCompat())
1181 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c275642013-06-01 17:51:14 +00001182 GlobalValue::getRealLinkageName(LinkageName));
Eric Christopher7dd54fb2012-03-15 08:19:33 +00001183
Devang Patel89543712011-08-15 17:24:54 +00001184 // If this DIE is going to refer declaration info using AT_specification
Eric Christopherf20ff972013-05-09 00:42:33 +00001185 // then there is no need to add other attributes.
Rafael Espindola79278362011-11-10 22:34:29 +00001186 if (DeclDie) {
1187 // Refer function declaration directly.
1188 addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
1189 DeclDie);
1190
Devang Patel89543712011-08-15 17:24:54 +00001191 return SPDie;
Rafael Espindola79278362011-11-10 22:34:29 +00001192 }
Devang Patel89543712011-08-15 17:24:54 +00001193
Eric Christopheracb71152012-08-23 22:52:55 +00001194 // Add the linkage name if we have one.
Eric Christopherf20ff972013-05-09 00:42:33 +00001195 if (!LinkageName.empty() && !DD->useDarwinGDBCompat())
Eric Christopheracb71152012-08-23 22:52:55 +00001196 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c275642013-06-01 17:51:14 +00001197 GlobalValue::getRealLinkageName(LinkageName));
Eric Christopheracb71152012-08-23 22:52:55 +00001198
Devang Patel89543712011-08-15 17:24:54 +00001199 // Constructors and operators for anonymous aggregates do not have names.
1200 if (!SP.getName().empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +00001201 addString(SPDie, dwarf::DW_AT_name, SP.getName());
Devang Patel89543712011-08-15 17:24:54 +00001202
1203 addSourceLine(SPDie, SP);
1204
Eric Christopher5cd2a9d2012-02-22 08:46:21 +00001205 // Add the prototype if we have a prototype and we have a C like
1206 // language.
1207 if (SP.isPrototyped() &&
1208 (Language == dwarf::DW_LANG_C89 ||
1209 Language == dwarf::DW_LANG_C99 ||
1210 Language == dwarf::DW_LANG_ObjC))
Eric Christopherbb69a272012-08-24 01:14:27 +00001211 addFlag(SPDie, dwarf::DW_AT_prototyped);
Devang Patel89543712011-08-15 17:24:54 +00001212
1213 // Add Return Type.
1214 DICompositeType SPTy = SP.getType();
David Blaikie5174c842013-05-22 23:22:18 +00001215 assert(SPTy.getTag() == dwarf::DW_TAG_subroutine_type &&
1216 "the type of a subprogram should be a subroutine");
Devang Patel89543712011-08-15 17:24:54 +00001217
David Blaikie5174c842013-05-22 23:22:18 +00001218 DIArray Args = SPTy.getTypeArray();
1219 addType(SPDie, DIType(Args.getElement(0)));
Devang Patel89543712011-08-15 17:24:54 +00001220
1221 unsigned VK = SP.getVirtuality();
1222 if (VK) {
Nick Lewyckycfde1a22011-12-14 00:56:07 +00001223 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
Devang Patel89543712011-08-15 17:24:54 +00001224 DIEBlock *Block = getDIEBlock();
1225 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1226 addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex());
1227 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
1228 ContainingTypeMap.insert(std::make_pair(SPDie,
1229 SP.getContainingType()));
1230 }
1231
1232 if (!SP.isDefinition()) {
Eric Christopherbb69a272012-08-24 01:14:27 +00001233 addFlag(SPDie, dwarf::DW_AT_declaration);
Eric Christopher92331fd2012-11-21 00:34:38 +00001234
Devang Patel89543712011-08-15 17:24:54 +00001235 // Add arguments. Do not add arguments for subprogram definition. They will
1236 // be handled while processing variables.
David Blaikie5174c842013-05-22 23:22:18 +00001237 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1238 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1239 DIType ATy = DIType(Args.getElement(i));
1240 addType(Arg, ATy);
1241 if (ATy.isArtificial())
1242 addFlag(Arg, dwarf::DW_AT_artificial);
1243 SPDie->addChild(Arg);
1244 }
Devang Patel89543712011-08-15 17:24:54 +00001245 }
1246
1247 if (SP.isArtificial())
Eric Christopherbb69a272012-08-24 01:14:27 +00001248 addFlag(SPDie, dwarf::DW_AT_artificial);
Devang Patel89543712011-08-15 17:24:54 +00001249
1250 if (!SP.isLocalToUnit())
Eric Christopherbb69a272012-08-24 01:14:27 +00001251 addFlag(SPDie, dwarf::DW_AT_external);
Devang Patel89543712011-08-15 17:24:54 +00001252
1253 if (SP.isOptimized())
Eric Christopherbb69a272012-08-24 01:14:27 +00001254 addFlag(SPDie, dwarf::DW_AT_APPLE_optimized);
Devang Patel89543712011-08-15 17:24:54 +00001255
1256 if (unsigned isa = Asm->getISAEncoding()) {
1257 addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1258 }
1259
1260 return SPDie;
1261}
1262
Devang Pateldfd6ec32011-08-15 17:57:41 +00001263// Return const expression if value is a GEP to access merged global
1264// constant. e.g.
1265// i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
1266static const ConstantExpr *getMergedGlobalExpr(const Value *V) {
1267 const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
1268 if (!CE || CE->getNumOperands() != 3 ||
1269 CE->getOpcode() != Instruction::GetElementPtr)
1270 return NULL;
1271
1272 // First operand points to a global struct.
1273 Value *Ptr = CE->getOperand(0);
1274 if (!isa<GlobalValue>(Ptr) ||
1275 !isa<StructType>(cast<PointerType>(Ptr->getType())->getElementType()))
1276 return NULL;
1277
1278 // Second operand is zero.
1279 const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
1280 if (!CI || !CI->isZero())
1281 return NULL;
1282
1283 // Third operand is offset.
1284 if (!isa<ConstantInt>(CE->getOperand(2)))
1285 return NULL;
1286
1287 return CE;
1288}
1289
1290/// createGlobalVariableDIE - create global variable DIE.
1291void CompileUnit::createGlobalVariableDIE(const MDNode *N) {
Devang Pateldfd6ec32011-08-15 17:57:41 +00001292 // Check for pre-existence.
Devang Patela6576a12011-08-18 22:21:50 +00001293 if (getDIE(N))
Devang Pateldfd6ec32011-08-15 17:57:41 +00001294 return;
1295
Devang Patela6576a12011-08-18 22:21:50 +00001296 DIGlobalVariable GV(N);
Manman Ren7504ed42013-07-08 18:33:29 +00001297 if (!GV.isGlobalVariable())
Devang Patel0ecbcbd2011-08-18 23:17:55 +00001298 return;
1299
Devang Pateldfd6ec32011-08-15 17:57:41 +00001300 DIDescriptor GVContext = GV.getContext();
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001301 DIType GTy = GV.getType();
1302
1303 // If this is a static data member definition, some attributes belong
1304 // to the declaration DIE.
1305 DIE *VariableDIE = NULL;
Manman Rene697d3c2013-02-01 23:54:37 +00001306 bool IsStaticMember = false;
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001307 DIDerivedType SDMDecl = GV.getStaticDataMemberDeclaration();
1308 if (SDMDecl.Verify()) {
1309 assert(SDMDecl.isStaticMember() && "Expected static member decl");
1310 // We need the declaration DIE that is in the static member's class.
1311 // But that class might not exist in the DWARF yet.
1312 // Creating the class will create the static member decl DIE.
1313 getOrCreateContextDIE(SDMDecl.getContext());
1314 VariableDIE = getDIE(SDMDecl);
1315 assert(VariableDIE && "Static member decl has no context?");
Manman Rene697d3c2013-02-01 23:54:37 +00001316 IsStaticMember = true;
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001317 }
1318
1319 // If this is not a static data member definition, create the variable
1320 // DIE and add the initial set of attributes to it.
1321 if (!VariableDIE) {
1322 VariableDIE = new DIE(GV.getTag());
1323 // Add to map.
1324 insertDIE(N, VariableDIE);
1325
1326 // Add name and type.
1327 addString(VariableDIE, dwarf::DW_AT_name, GV.getDisplayName());
1328 addType(VariableDIE, GTy);
1329
1330 // Add scoping info.
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00001331 if (!GV.isLocalToUnit()) {
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001332 addFlag(VariableDIE, dwarf::DW_AT_external);
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00001333 addGlobalName(GV.getName(), VariableDIE);
1334 }
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001335
1336 // Add line number info.
1337 addSourceLine(VariableDIE, GV);
1338 // Add to context owner.
1339 addToContextOwner(VariableDIE, GVContext);
1340 }
1341
Devang Pateldfd6ec32011-08-15 17:57:41 +00001342 // Add location.
Eric Christopher4996c702011-11-07 09:24:32 +00001343 bool addToAccelTable = false;
Eric Christopher0a917b72011-11-11 03:16:32 +00001344 DIE *VariableSpecDIE = NULL;
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001345 bool isGlobalVariable = GV.getGlobal() != NULL;
Devang Pateldfd6ec32011-08-15 17:57:41 +00001346 if (isGlobalVariable) {
Eric Christopher4996c702011-11-07 09:24:32 +00001347 addToAccelTable = true;
Devang Pateldfd6ec32011-08-15 17:57:41 +00001348 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
David Blaikief2694972013-06-28 20:05:11 +00001349 const MCSymbol *Sym = Asm->Mang->getSymbol(GV.getGlobal());
1350 if (GV.getGlobal()->isThreadLocal()) {
1351 // FIXME: Make this work with -gsplit-dwarf.
1352 unsigned PointerSize = Asm->getDataLayout().getPointerSize();
1353 assert((PointerSize == 4 || PointerSize == 8) &&
1354 "Add support for other sizes if necessary");
Ulrich Weigand2b6fc8d2013-07-02 18:47:09 +00001355 const MCExpr *Expr =
David Blaikie8466ca82013-07-01 23:55:52 +00001356 Asm->getObjFileLowering().getDebugThreadLocalSymbol(Sym);
David Blaikief2694972013-06-28 20:05:11 +00001357 // Based on GCC's support for TLS:
David Blaikie8466ca82013-07-01 23:55:52 +00001358 if (!DD->useSplitDwarf()) {
1359 // 1) Start with a constNu of the appropriate pointer size
1360 addUInt(Block, 0, dwarf::DW_FORM_data1,
1361 PointerSize == 4 ? dwarf::DW_OP_const4u : dwarf::DW_OP_const8u);
1362 // 2) containing the (relocated) address of the TLS variable
Ulrich Weigand2b6fc8d2013-07-02 18:47:09 +00001363 addExpr(Block, 0, dwarf::DW_FORM_udata, Expr);
David Blaikie8466ca82013-07-01 23:55:52 +00001364 } else {
1365 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_const_index);
Ulrich Weigand2b6fc8d2013-07-02 18:47:09 +00001366 addUInt(Block, 0, dwarf::DW_FORM_udata, DU->getAddrPoolIndex(Expr));
David Blaikie8466ca82013-07-01 23:55:52 +00001367 }
David Blaikief2694972013-06-28 20:05:11 +00001368 // 3) followed by a custom OP to tell the debugger about TLS (presumably)
1369 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_lo_user);
1370 } else
1371 addOpAddress(Block, Sym);
Devang Pateldfd6ec32011-08-15 17:57:41 +00001372 // Do not create specification DIE if context is either compile unit
1373 // or a subprogram.
Devang Patel5e6b65c2011-09-21 23:41:11 +00001374 if (GVContext && GV.isDefinition() && !GVContext.isCompileUnit() &&
Devang Pateldfd6ec32011-08-15 17:57:41 +00001375 !GVContext.isFile() && !isSubprogramContext(GVContext)) {
1376 // Create specification DIE.
Eric Christopherc12c2112011-11-11 01:55:22 +00001377 VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
Devang Pateldfd6ec32011-08-15 17:57:41 +00001378 addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
1379 dwarf::DW_FORM_ref4, VariableDIE);
1380 addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001381 // A static member's declaration is already flagged as such.
1382 if (!SDMDecl.Verify())
1383 addFlag(VariableDIE, dwarf::DW_AT_declaration);
Devang Pateldfd6ec32011-08-15 17:57:41 +00001384 addDie(VariableSpecDIE);
1385 } else {
1386 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopher4996c702011-11-07 09:24:32 +00001387 }
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001388 // Add linkage name.
1389 StringRef LinkageName = GV.getLinkageName();
Eric Christopher5958b462013-02-27 23:49:50 +00001390 if (!LinkageName.empty()) {
Eric Christopher3f79b8c2013-02-27 23:49:47 +00001391 // From DWARF4: DIEs to which DW_AT_linkage_name may apply include:
1392 // TAG_common_block, TAG_constant, TAG_entry_point, TAG_subprogram and
1393 // TAG_variable.
Manman Ren584e4c02013-02-27 23:21:02 +00001394 addString(IsStaticMember && VariableSpecDIE ?
1395 VariableSpecDIE : VariableDIE, dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c275642013-06-01 17:51:14 +00001396 GlobalValue::getRealLinkageName(LinkageName));
Eric Christopher3f79b8c2013-02-27 23:49:47 +00001397 // In compatibility mode with older gdbs we put the linkage name on both
1398 // the TAG_variable DIE and on the TAG_member DIE.
Manman Ren584e4c02013-02-27 23:21:02 +00001399 if (IsStaticMember && VariableSpecDIE && DD->useDarwinGDBCompat())
1400 addString(VariableDIE, dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c275642013-06-01 17:51:14 +00001401 GlobalValue::getRealLinkageName(LinkageName));
Manman Ren5ae44d22013-02-27 00:02:32 +00001402 }
Eric Christopher92331fd2012-11-21 00:34:38 +00001403 } else if (const ConstantInt *CI =
Manman Rene697d3c2013-02-01 23:54:37 +00001404 dyn_cast_or_null<ConstantInt>(GV.getConstant())) {
Adrian Prantl322f41d2013-04-04 22:56:49 +00001405 // AT_const_value was added when the static member was created. To avoid
Manman Rene697d3c2013-02-01 23:54:37 +00001406 // emitting AT_const_value multiple times, we only add AT_const_value when
1407 // it is not a static member.
1408 if (!IsStaticMember)
1409 addConstantValue(VariableDIE, CI, GTy.isUnsignedDIType());
1410 } else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
Eric Christopher4996c702011-11-07 09:24:32 +00001411 addToAccelTable = true;
Devang Pateldfd6ec32011-08-15 17:57:41 +00001412 // GV is a merged global.
1413 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1414 Value *Ptr = CE->getOperand(0);
Eric Christophere9ec2452013-01-18 22:11:33 +00001415 addOpAddress(Block, Asm->Mang->getSymbol(cast<GlobalValue>(Ptr)));
Devang Pateldfd6ec32011-08-15 17:57:41 +00001416 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1417 SmallVector<Value*, 3> Idx(CE->op_begin()+1, CE->op_end());
Eric Christopher92331fd2012-11-21 00:34:38 +00001418 addUInt(Block, 0, dwarf::DW_FORM_udata,
Micah Villmowcdfe20b2012-10-08 16:38:25 +00001419 Asm->getDataLayout().getIndexedOffset(Ptr->getType(), Idx));
Devang Pateldfd6ec32011-08-15 17:57:41 +00001420 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1421 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
1422 }
1423
Eric Christopherc12c2112011-11-11 01:55:22 +00001424 if (addToAccelTable) {
1425 DIE *AddrDIE = VariableSpecDIE ? VariableSpecDIE : VariableDIE;
1426 addAccelName(GV.getName(), AddrDIE);
Eric Christopher4996c702011-11-07 09:24:32 +00001427
Eric Christopherc12c2112011-11-11 01:55:22 +00001428 // If the linkage name is different than the name, go ahead and output
1429 // that as well into the name table.
1430 if (GV.getLinkageName() != "" && GV.getName() != GV.getLinkageName())
1431 addAccelName(GV.getLinkageName(), AddrDIE);
1432 }
Devang Pateldfd6ec32011-08-15 17:57:41 +00001433}
1434
Devang Patel0e821f42011-04-12 23:21:44 +00001435/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
Eric Christopherd42b92f2012-05-22 18:45:24 +00001436void CompileUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR,
1437 DIE *IndexTy) {
Devang Patel0e821f42011-04-12 23:21:44 +00001438 DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
1439 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
Devang Patel0e821f42011-04-12 23:21:44 +00001440
Bill Wendling28fe9e72012-12-06 07:38:10 +00001441 // The LowerBound value defines the lower bounds which is typically zero for
1442 // C/C++. The Count value is the number of elements. Values are 64 bit. If
1443 // Count == -1 then the array is unbounded and we do not emit
1444 // DW_AT_lower_bound and DW_AT_upper_bound attributes. If LowerBound == 0 and
1445 // Count == 0, then the array has zero elements in which case we do not emit
1446 // an upper bound.
1447 int64_t LowerBound = SR.getLo();
Bill Wendling3495f9b2012-12-06 07:55:19 +00001448 int64_t DefaultLowerBound = getDefaultLowerBound();
Bill Wendlingd7767122012-12-04 21:34:03 +00001449 int64_t Count = SR.getCount();
Devang Patel0e821f42011-04-12 23:21:44 +00001450
Bill Wendling3495f9b2012-12-06 07:55:19 +00001451 if (DefaultLowerBound == -1 || LowerBound != DefaultLowerBound)
Bill Wendling28fe9e72012-12-06 07:38:10 +00001452 addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, LowerBound);
1453
1454 if (Count != -1 && Count != 0)
Bill Wendlingd7767122012-12-04 21:34:03 +00001455 // FIXME: An unbounded array should reference the expression that defines
1456 // the array.
Bill Wendling28fe9e72012-12-06 07:38:10 +00001457 addUInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, LowerBound + Count - 1);
Bill Wendlingd7767122012-12-04 21:34:03 +00001458
Devang Patel0e821f42011-04-12 23:21:44 +00001459 Buffer.addChild(DW_Subrange);
1460}
1461
1462/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
1463void CompileUnit::constructArrayTypeDIE(DIE &Buffer,
1464 DICompositeType *CTy) {
1465 Buffer.setTag(dwarf::DW_TAG_array_type);
Eric Christopher72a52952013-01-08 01:53:52 +00001466 if (CTy->isVector())
Eric Christopherbb69a272012-08-24 01:14:27 +00001467 addFlag(&Buffer, dwarf::DW_AT_GNU_vector);
Devang Patel0e821f42011-04-12 23:21:44 +00001468
1469 // Emit derived type.
1470 addType(&Buffer, CTy->getTypeDerivedFrom());
1471 DIArray Elements = CTy->getTypeArray();
1472
1473 // Get an anonymous type for index type.
Eric Christophercad9b532013-01-04 21:51:53 +00001474 // FIXME: This type should be passed down from the front end
1475 // as different languages may have different sizes for indexes.
Devang Patel0e821f42011-04-12 23:21:44 +00001476 DIE *IdxTy = getIndexTyDie();
1477 if (!IdxTy) {
1478 // Construct an anonymous type for index type.
1479 IdxTy = new DIE(dwarf::DW_TAG_base_type);
Eric Christophercad9b532013-01-04 21:51:53 +00001480 addString(IdxTy, dwarf::DW_AT_name, "int");
Devang Patel0e821f42011-04-12 23:21:44 +00001481 addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1482 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1483 dwarf::DW_ATE_signed);
1484 addDie(IdxTy);
1485 setIndexTyDie(IdxTy);
1486 }
1487
1488 // Add subranges to array type.
1489 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1490 DIDescriptor Element = Elements.getElement(i);
1491 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1492 constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1493 }
1494}
1495
1496/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
1497DIE *CompileUnit::constructEnumTypeDIE(DIEnumerator ETy) {
1498 DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
1499 StringRef Name = ETy.getName();
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +00001500 addString(Enumerator, dwarf::DW_AT_name, Name);
Devang Patel0e821f42011-04-12 23:21:44 +00001501 int64_t Value = ETy.getEnumValue();
1502 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
1503 return Enumerator;
1504}
1505
Devang Patel89543712011-08-15 17:24:54 +00001506/// constructContainingTypeDIEs - Construct DIEs for types that contain
1507/// vtables.
1508void CompileUnit::constructContainingTypeDIEs() {
1509 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
1510 CE = ContainingTypeMap.end(); CI != CE; ++CI) {
1511 DIE *SPDie = CI->first;
1512 const MDNode *N = CI->second;
1513 if (!N) continue;
1514 DIE *NDie = getDIE(N);
1515 if (!NDie) continue;
1516 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
1517 }
1518}
1519
Devang Patel3acc70e2011-08-15 22:04:40 +00001520/// constructVariableDIE - Construct a DIE for the given DbgVariable.
Eric Christopherbf2d23c2013-06-24 21:07:27 +00001521DIE *CompileUnit::constructVariableDIE(DbgVariable *DV,
1522 bool isScopeAbstract) {
Devang Patel3acc70e2011-08-15 22:04:40 +00001523 StringRef Name = DV->getName();
Devang Patel3acc70e2011-08-15 22:04:40 +00001524
1525 // Translate tag to proper Dwarf tag.
1526 unsigned Tag = DV->getTag();
1527
1528 // Define variable debug information entry.
1529 DIE *VariableDie = new DIE(Tag);
1530 DbgVariable *AbsVar = DV->getAbstractVariable();
1531 DIE *AbsDIE = AbsVar ? AbsVar->getDIE() : NULL;
Manman Ren4213c392013-05-29 17:16:59 +00001532 if (AbsDIE)
Devang Patel3acc70e2011-08-15 22:04:40 +00001533 addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
Manman Ren4213c392013-05-29 17:16:59 +00001534 dwarf::DW_FORM_ref4, AbsDIE);
Devang Patel3acc70e2011-08-15 22:04:40 +00001535 else {
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +00001536 addString(VariableDie, dwarf::DW_AT_name, Name);
Devang Patel3acc70e2011-08-15 22:04:40 +00001537 addSourceLine(VariableDie, DV->getVariable());
1538 addType(VariableDie, DV->getType());
1539 }
1540
1541 if (DV->isArtificial())
Eric Christopherbb69a272012-08-24 01:14:27 +00001542 addFlag(VariableDie, dwarf::DW_AT_artificial);
Devang Patel3acc70e2011-08-15 22:04:40 +00001543
1544 if (isScopeAbstract) {
1545 DV->setDIE(VariableDie);
1546 return VariableDie;
1547 }
1548
1549 // Add variable address.
1550
1551 unsigned Offset = DV->getDotDebugLocOffset();
1552 if (Offset != ~0U) {
Eric Christopher40b6bf62013-06-24 21:34:55 +00001553 addLabel(VariableDie, dwarf::DW_AT_location, dwarf::DW_FORM_data4,
1554 Asm->GetTempSymbol("debug_loc", Offset));
Devang Patel3acc70e2011-08-15 22:04:40 +00001555 DV->setDIE(VariableDie);
1556 return VariableDie;
1557 }
1558
Eric Christophercead0332011-10-03 15:49:20 +00001559 // Check if variable is described by a DBG_VALUE instruction.
Devang Patel3acc70e2011-08-15 22:04:40 +00001560 if (const MachineInstr *DVInsn = DV->getMInsn()) {
David Blaikie0252265b2013-06-16 20:34:15 +00001561 assert(DVInsn->getNumOperands() == 3);
1562 if (DVInsn->getOperand(0).isReg()) {
1563 const MachineOperand RegOp = DVInsn->getOperand(0);
Adrian Prantl19942882013-07-09 21:44:06 +00001564 // If the second operand is an immediate, this is an indirect value.
Adrian Prantl418d1d12013-07-09 20:28:37 +00001565 if (DVInsn->getOperand(1).isImm()) {
1566 MachineLocation Location(RegOp.getReg(), DVInsn->getOperand(1).getImm());
Eric Christopherbf2d23c2013-06-24 21:07:27 +00001567 addVariableAddress(*DV, VariableDie, Location);
David Blaikie0252265b2013-06-16 20:34:15 +00001568 } else if (RegOp.getReg())
Eric Christopherbf2d23c2013-06-24 21:07:27 +00001569 addVariableAddress(*DV, VariableDie, MachineLocation(RegOp.getReg()));
David Blaikie0252265b2013-06-16 20:34:15 +00001570 } else if (DVInsn->getOperand(0).isImm())
Eric Christopher78fcf4902013-07-03 01:08:30 +00001571 addConstantValue(VariableDie, DVInsn->getOperand(0), DV->getType());
David Blaikie0252265b2013-06-16 20:34:15 +00001572 else if (DVInsn->getOperand(0).isFPImm())
Eric Christopher78fcf4902013-07-03 01:08:30 +00001573 addConstantFPValue(VariableDie, DVInsn->getOperand(0));
David Blaikie0252265b2013-06-16 20:34:15 +00001574 else if (DVInsn->getOperand(0).isCImm())
Eric Christopher78fcf4902013-07-03 01:08:30 +00001575 addConstantValue(VariableDie, DVInsn->getOperand(0).getCImm(),
1576 DV->getType().isUnsignedDIType());
1577
Devang Patel3acc70e2011-08-15 22:04:40 +00001578 DV->setDIE(VariableDie);
1579 return VariableDie;
1580 } else {
1581 // .. else use frame index.
1582 int FI = DV->getFrameIndex();
1583 if (FI != ~0) {
1584 unsigned FrameReg = 0;
1585 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
Eric Christopher92331fd2012-11-21 00:34:38 +00001586 int Offset =
Devang Patel3acc70e2011-08-15 22:04:40 +00001587 TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
1588 MachineLocation Location(FrameReg, Offset);
Eric Christopherbf2d23c2013-06-24 21:07:27 +00001589 addVariableAddress(*DV, VariableDie, Location);
Devang Patel3acc70e2011-08-15 22:04:40 +00001590 }
1591 }
1592
1593 DV->setDIE(VariableDie);
1594 return VariableDie;
1595}
1596
Devang Patel0e821f42011-04-12 23:21:44 +00001597/// createMemberDIE - Create new member DIE.
1598DIE *CompileUnit::createMemberDIE(DIDerivedType DT) {
1599 DIE *MemberDie = new DIE(DT.getTag());
1600 StringRef Name = DT.getName();
1601 if (!Name.empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +00001602 addString(MemberDie, dwarf::DW_AT_name, Name);
Devang Patel0e821f42011-04-12 23:21:44 +00001603
1604 addType(MemberDie, DT.getTypeDerivedFrom());
1605
1606 addSourceLine(MemberDie, DT);
1607
1608 DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
1609 addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1610
1611 uint64_t Size = DT.getSizeInBits();
1612 uint64_t FieldSize = DT.getOriginalTypeSize();
1613
1614 if (Size != FieldSize) {
1615 // Handle bitfield.
1616 addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
1617 addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1618
1619 uint64_t Offset = DT.getOffsetInBits();
1620 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1621 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1622 uint64_t FieldOffset = (HiMark - FieldSize);
1623 Offset -= FieldOffset;
1624
1625 // Maybe we need to work from the other end.
Micah Villmowcdfe20b2012-10-08 16:38:25 +00001626 if (Asm->getDataLayout().isLittleEndian())
Devang Patel0e821f42011-04-12 23:21:44 +00001627 Offset = FieldSize - (Offset + Size);
1628 addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
1629
1630 // Here WD_AT_data_member_location points to the anonymous
1631 // field that includes this bit field.
1632 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
1633
1634 } else
1635 // This is not a bitfield.
1636 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1637
1638 if (DT.getTag() == dwarf::DW_TAG_inheritance
1639 && DT.isVirtual()) {
1640
1641 // For C++, virtual base classes are not at fixed offset. Use following
1642 // expression to extract appropriate offset from vtable.
1643 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1644
1645 DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
1646 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1647 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1648 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1649 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1650 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1651 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1652 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1653
1654 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
1655 VBaseLocationDie);
1656 } else
1657 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
1658
1659 if (DT.isProtected())
Nick Lewyckycb918492011-12-13 05:09:11 +00001660 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001661 dwarf::DW_ACCESS_protected);
1662 else if (DT.isPrivate())
Nick Lewyckycb918492011-12-13 05:09:11 +00001663 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001664 dwarf::DW_ACCESS_private);
1665 // Otherwise C++ member and base classes are considered public.
Eric Christopher92331fd2012-11-21 00:34:38 +00001666 else
Nick Lewyckycb918492011-12-13 05:09:11 +00001667 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001668 dwarf::DW_ACCESS_public);
1669 if (DT.isVirtual())
Nick Lewyckycfde1a22011-12-14 00:56:07 +00001670 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001671 dwarf::DW_VIRTUALITY_virtual);
Devang Patel514b4002011-04-16 00:11:51 +00001672
1673 // Objective-C properties.
Devang Patel44882172012-02-06 17:49:43 +00001674 if (MDNode *PNode = DT.getObjCProperty())
1675 if (DIEEntry *PropertyDie = getDIEEntry(PNode))
Eric Christopher92331fd2012-11-21 00:34:38 +00001676 MemberDie->addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4,
Devang Patel44882172012-02-06 17:49:43 +00001677 PropertyDie);
1678
David Blaikie37fefc32012-12-13 22:43:07 +00001679 if (DT.isArtificial())
1680 addFlag(MemberDie, dwarf::DW_AT_artificial);
1681
Devang Patel0e821f42011-04-12 23:21:44 +00001682 return MemberDie;
1683}
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001684
1685/// createStaticMemberDIE - Create new DIE for C++ static member.
1686DIE *CompileUnit::createStaticMemberDIE(const DIDerivedType DT) {
1687 if (!DT.Verify())
1688 return NULL;
1689
1690 DIE *StaticMemberDIE = new DIE(DT.getTag());
1691 DIType Ty = DT.getTypeDerivedFrom();
1692
1693 addString(StaticMemberDIE, dwarf::DW_AT_name, DT.getName());
1694 addType(StaticMemberDIE, Ty);
1695 addSourceLine(StaticMemberDIE, DT);
1696 addFlag(StaticMemberDIE, dwarf::DW_AT_external);
1697 addFlag(StaticMemberDIE, dwarf::DW_AT_declaration);
1698
1699 // FIXME: We could omit private if the parent is a class_type, and
1700 // public if the parent is something else.
1701 if (DT.isProtected())
1702 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1703 dwarf::DW_ACCESS_protected);
1704 else if (DT.isPrivate())
1705 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1706 dwarf::DW_ACCESS_private);
1707 else
1708 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1709 dwarf::DW_ACCESS_public);
1710
1711 if (const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(DT.getConstant()))
1712 addConstantValue(StaticMemberDIE, CI, Ty.isUnsignedDIType());
David Blaikiea39a76e2013-01-20 01:18:01 +00001713 if (const ConstantFP *CFP = dyn_cast_or_null<ConstantFP>(DT.getConstant()))
1714 addConstantFPValue(StaticMemberDIE, CFP);
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001715
1716 insertDIE(DT, StaticMemberDIE);
1717 return StaticMemberDIE;
1718}