blob: fe4a729e96584d12a55149adb54cce205c4cdbc2 [file] [log] [blame]
Devang Patel161b2f42011-04-12 23:21:44 +00001//===-- llvm/CodeGen/DwarfCompileUnit.cpp - Dwarf Compile Unit ------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
Eric Christopher443c9ed2012-08-14 05:13:29 +000010// This file contains support for constructing a dwarf compile unit.
Devang Patel161b2f42011-04-12 23:21:44 +000011//
12//===----------------------------------------------------------------------===//
13
14#define DEBUG_TYPE "dwarfdebug"
15
16#include "DwarfCompileUnit.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000017#include "DwarfAccelTable.h"
Devang Patel161b2f42011-04-12 23:21:44 +000018#include "DwarfDebug.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000019#include "llvm/ADT/APFloat.h"
Bill Wendling16eeb6f2012-06-29 08:32:07 +000020#include "llvm/DIBuilder.h"
Chandler Carruth0b8c9a82013-01-02 11:36:10 +000021#include "llvm/IR/Constants.h"
22#include "llvm/IR/DataLayout.h"
23#include "llvm/IR/GlobalVariable.h"
24#include "llvm/IR/Instructions.h"
Eric Christopherd61c34b2011-11-11 03:16:32 +000025#include "llvm/Support/Debug.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000026#include "llvm/Support/ErrorHandling.h"
Devang Patel6f9d8ff2011-08-15 17:57:41 +000027#include "llvm/Target/Mangler.h"
Devang Patel161b2f42011-04-12 23:21:44 +000028#include "llvm/Target/TargetFrameLowering.h"
29#include "llvm/Target/TargetMachine.h"
David Blaikie59eaa382013-06-28 20:05:11 +000030#include "llvm/Target/TargetLoweringObjectFile.h"
Devang Patel161b2f42011-04-12 23:21:44 +000031#include "llvm/Target/TargetRegisterInfo.h"
Devang Patel161b2f42011-04-12 23:21:44 +000032
33using namespace llvm;
34
35/// CompileUnit - Compile unit constructor.
Eric Christopher7b878952013-08-26 23:50:38 +000036CompileUnit::CompileUnit(unsigned UID, DIE *D, const MDNode *N, AsmPrinter *A,
37 DwarfDebug *DW, DwarfUnits *DWU)
38 : UniqueID(UID), Node(N), CUDie(D), Asm(A), DD(DW), DU(DWU), IndexTyDie(0),
39 DebugInfoOffset(0) {
Devang Patel161b2f42011-04-12 23:21:44 +000040 DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
Eric Christopher9c57ad22013-05-08 00:58:51 +000041 insertDIE(N, D);
Devang Patel161b2f42011-04-12 23:21:44 +000042}
43
44/// ~CompileUnit - Destructor for compile unit.
45CompileUnit::~CompileUnit() {
46 for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
47 DIEBlocks[j]->~DIEBlock();
48}
49
50/// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
51/// information entry.
52DIEEntry *CompileUnit::createDIEEntry(DIE *Entry) {
53 DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
54 return Value;
55}
56
Bill Wendling6afe4782012-12-06 07:55:19 +000057/// getDefaultLowerBound - Return the default lower bound for an array. If the
Bill Wendling222c2fd2012-12-06 07:38:10 +000058/// DWARF version doesn't handle the language, return -1.
Bill Wendling6afe4782012-12-06 07:55:19 +000059int64_t CompileUnit::getDefaultLowerBound() const {
Eric Christopher7b878952013-08-26 23:50:38 +000060 switch (DICompileUnit(Node).getLanguage()) {
Bill Wendling222c2fd2012-12-06 07:38:10 +000061 default:
62 break;
63
64 case dwarf::DW_LANG_C89:
65 case dwarf::DW_LANG_C99:
66 case dwarf::DW_LANG_C:
67 case dwarf::DW_LANG_C_plus_plus:
68 case dwarf::DW_LANG_ObjC:
69 case dwarf::DW_LANG_ObjC_plus_plus:
70 return 0;
71
72 case dwarf::DW_LANG_Fortran77:
73 case dwarf::DW_LANG_Fortran90:
74 case dwarf::DW_LANG_Fortran95:
75 return 1;
76
77 // The languages below have valid values only if the DWARF version >= 4.
78 case dwarf::DW_LANG_Java:
79 case dwarf::DW_LANG_Python:
80 case dwarf::DW_LANG_UPC:
81 case dwarf::DW_LANG_D:
82 if (dwarf::DWARF_VERSION >= 4)
83 return 0;
84 break;
85
86 case dwarf::DW_LANG_Ada83:
87 case dwarf::DW_LANG_Ada95:
88 case dwarf::DW_LANG_Cobol74:
89 case dwarf::DW_LANG_Cobol85:
90 case dwarf::DW_LANG_Modula2:
91 case dwarf::DW_LANG_Pascal83:
92 case dwarf::DW_LANG_PLI:
93 if (dwarf::DWARF_VERSION >= 4)
94 return 1;
95 break;
96 }
97
98 return -1;
99}
100
Eric Christopher873cf0a2012-08-24 01:14:27 +0000101/// addFlag - Add a flag that is true.
Eric Christopher31667622013-08-08 01:41:00 +0000102void CompileUnit::addFlag(DIE *Die, uint16_t Attribute) {
Michael Gottesmandc42d032013-09-04 04:39:38 +0000103 if (DD->getDwarfVersion() >= 4)
Eric Christopher873cf0a2012-08-24 01:14:27 +0000104 Die->addValue(Attribute, dwarf::DW_FORM_flag_present,
105 DIEIntegerOne);
106 else
107 addUInt(Die, Attribute, dwarf::DW_FORM_flag, 1);
108}
109
Devang Patel161b2f42011-04-12 23:21:44 +0000110/// addUInt - Add an unsigned integer attribute data and value.
111///
Eric Christopher31667622013-08-08 01:41:00 +0000112void CompileUnit::addUInt(DIE *Die, uint16_t Attribute,
113 uint16_t Form, uint64_t Integer) {
Devang Patel161b2f42011-04-12 23:21:44 +0000114 if (!Form) Form = DIEInteger::BestForm(false, Integer);
115 DIEValue *Value = Integer == 1 ?
116 DIEIntegerOne : new (DIEValueAllocator) DIEInteger(Integer);
117 Die->addValue(Attribute, Form, Value);
118}
119
120/// addSInt - Add an signed integer attribute data and value.
121///
Eric Christopher31667622013-08-08 01:41:00 +0000122void CompileUnit::addSInt(DIE *Die, uint16_t Attribute,
123 uint16_t Form, int64_t Integer) {
Devang Patel161b2f42011-04-12 23:21:44 +0000124 if (!Form) Form = DIEInteger::BestForm(true, Integer);
125 DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
126 Die->addValue(Attribute, Form, Value);
127}
128
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000129/// addString - Add a string attribute data and value. We always emit a
130/// reference to the string pool instead of immediate strings so that DIEs have
Eric Christopher3cc42202013-01-07 19:32:45 +0000131/// more predictable sizes. In the case of split dwarf we emit an index
132/// into another table which gets us the static offset into the string
133/// table.
Eric Christopher31667622013-08-08 01:41:00 +0000134void CompileUnit::addString(DIE *Die, uint16_t Attribute, StringRef String) {
Eric Christopher3dee5752013-07-26 17:02:41 +0000135 DIEValue *Value;
Eric Christopher31667622013-08-08 01:41:00 +0000136 uint16_t Form;
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000137 if (!DD->useSplitDwarf()) {
138 MCSymbol *Symb = DU->getStringPoolEntry(String);
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000139 if (Asm->needsRelocationsForDwarfStringPool())
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000140 Value = new (DIEValueAllocator) DIELabel(Symb);
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000141 else {
142 MCSymbol *StringPool = DU->getStringPoolSym();
143 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
144 }
Eric Christopher3dee5752013-07-26 17:02:41 +0000145 Form = dwarf::DW_FORM_strp;
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000146 } else {
147 unsigned idx = DU->getStringPoolIndex(String);
Eric Christopher3dee5752013-07-26 17:02:41 +0000148 Value = new (DIEValueAllocator) DIEInteger(idx);
149 Form = dwarf::DW_FORM_GNU_str_index;
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000150 }
Eric Christopher3dee5752013-07-26 17:02:41 +0000151 DIEValue *Str = new (DIEValueAllocator) DIEString(Value, String);
152 Die->addValue(Attribute, Form, Str);
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000153}
154
155/// addLocalString - Add a string attribute data and value. This is guaranteed
156/// to be in the local string pool instead of indirected.
Eric Christopher31667622013-08-08 01:41:00 +0000157void CompileUnit::addLocalString(DIE *Die, uint16_t Attribute,
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000158 StringRef String) {
Eric Christopher2e5d8702012-12-20 21:58:36 +0000159 MCSymbol *Symb = DU->getStringPoolEntry(String);
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000160 DIEValue *Value;
161 if (Asm->needsRelocationsForDwarfStringPool())
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000162 Value = new (DIEValueAllocator) DIELabel(Symb);
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000163 else {
Eric Christopher2e5d8702012-12-20 21:58:36 +0000164 MCSymbol *StringPool = DU->getStringPoolSym();
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000165 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
Nick Lewycky390c40d2011-10-27 06:44:11 +0000166 }
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000167 Die->addValue(Attribute, dwarf::DW_FORM_strp, Value);
Devang Patel161b2f42011-04-12 23:21:44 +0000168}
169
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000170/// addExpr - Add a Dwarf expression attribute data and value.
Devang Patel161b2f42011-04-12 23:21:44 +0000171///
Eric Christopher31667622013-08-08 01:41:00 +0000172void CompileUnit::addExpr(DIE *Die, uint16_t Attribute, uint16_t Form,
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000173 const MCExpr *Expr) {
174 DIEValue *Value = new (DIEValueAllocator) DIEExpr(Expr);
Devang Patel161b2f42011-04-12 23:21:44 +0000175 Die->addValue(Attribute, Form, Value);
176}
177
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000178/// addLabel - Add a Dwarf label attribute data and value.
179///
Eric Christopher31667622013-08-08 01:41:00 +0000180void CompileUnit::addLabel(DIE *Die, uint16_t Attribute, uint16_t Form,
David Blaikie95e72c92013-06-28 20:05:04 +0000181 const MCSymbol *Label) {
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000182 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
183 Die->addValue(Attribute, Form, Value);
Richard Mitton5cc319a2013-09-19 23:21:01 +0000184
185 SymbolCU Entry;
186 Entry.CU = this;
187 Entry.Sym = Label;
188
189 DD->addLabel(Entry);
David Blaikie95e72c92013-06-28 20:05:04 +0000190}
191
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000192/// addLabelAddress - Add a dwarf label attribute data and value using
193/// DW_FORM_addr or DW_FORM_GNU_addr_index.
194///
Eric Christopher31667622013-08-08 01:41:00 +0000195void CompileUnit::addLabelAddress(DIE *Die, uint16_t Attribute,
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000196 MCSymbol *Label) {
Richard Mitton5cc319a2013-09-19 23:21:01 +0000197 if (Label) {
198 SymbolCU Entry;
199 Entry.CU = this;
200 Entry.Sym = Label;
201
202 DD->addLabel(Entry);
203 }
204
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000205 if (!DD->useSplitDwarf()) {
206 if (Label != NULL) {
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000207 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000208 Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
209 } else {
210 DIEValue *Value = new (DIEValueAllocator) DIEInteger(0);
211 Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
212 }
213 } else {
214 unsigned idx = DU->getAddrPoolIndex(Label);
215 DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx);
216 Die->addValue(Attribute, dwarf::DW_FORM_GNU_addr_index, Value);
217 }
218}
219
Eric Christopher0969ddf2013-01-18 22:11:33 +0000220/// addOpAddress - Add a dwarf op address data and value using the
221/// form given and an op of either DW_FORM_addr or DW_FORM_GNU_addr_index.
222///
David Blaikie95e72c92013-06-28 20:05:04 +0000223void CompileUnit::addOpAddress(DIE *Die, const MCSymbol *Sym) {
Eric Christopher0969ddf2013-01-18 22:11:33 +0000224 if (!DD->useSplitDwarf()) {
225 addUInt(Die, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
226 addLabel(Die, 0, dwarf::DW_FORM_udata, Sym);
227 } else {
Eric Christopher0969ddf2013-01-18 22:11:33 +0000228 addUInt(Die, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_addr_index);
David Blaikie8fed05e2013-07-01 23:55:52 +0000229 addUInt(Die, 0, dwarf::DW_FORM_GNU_addr_index, DU->getAddrPoolIndex(Sym));
Eric Christopher0969ddf2013-01-18 22:11:33 +0000230 }
231}
232
Devang Patel161b2f42011-04-12 23:21:44 +0000233/// addDelta - Add a label delta attribute data and value.
234///
Eric Christopher31667622013-08-08 01:41:00 +0000235void CompileUnit::addDelta(DIE *Die, uint16_t Attribute, uint16_t Form,
Devang Patel161b2f42011-04-12 23:21:44 +0000236 const MCSymbol *Hi, const MCSymbol *Lo) {
237 DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
238 Die->addValue(Attribute, Form, Value);
239}
240
241/// addDIEEntry - Add a DIE attribute data and value.
242///
Eric Christopher31667622013-08-08 01:41:00 +0000243void CompileUnit::addDIEEntry(DIE *Die, uint16_t Attribute, uint16_t Form,
Devang Patel161b2f42011-04-12 23:21:44 +0000244 DIE *Entry) {
245 Die->addValue(Attribute, Form, createDIEEntry(Entry));
246}
247
Devang Patel161b2f42011-04-12 23:21:44 +0000248/// addBlock - Add block data.
249///
Eric Christopher31667622013-08-08 01:41:00 +0000250void CompileUnit::addBlock(DIE *Die, uint16_t Attribute, uint16_t Form,
Devang Patel161b2f42011-04-12 23:21:44 +0000251 DIEBlock *Block) {
252 Block->ComputeSize(Asm);
253 DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
254 Die->addValue(Attribute, Block->BestForm(), Block);
255}
256
257/// addSourceLine - Add location information to specified debug information
258/// entry.
259void CompileUnit::addSourceLine(DIE *Die, DIVariable V) {
260 // Verify variable.
Manman Rend03d2b22013-07-08 18:33:29 +0000261 if (!V.isVariable())
Devang Patel161b2f42011-04-12 23:21:44 +0000262 return;
Eric Christopher8b4310b2012-11-21 00:34:38 +0000263
Devang Patel161b2f42011-04-12 23:21:44 +0000264 unsigned Line = V.getLineNumber();
265 if (Line == 0)
266 return;
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000267 unsigned FileID = DD->getOrCreateSourceID(V.getContext().getFilename(),
Manman Ren3de61b42013-03-07 01:42:00 +0000268 V.getContext().getDirectory(),
269 getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000270 assert(FileID && "Invalid file id");
271 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
272 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
273}
274
275/// addSourceLine - Add location information to specified debug information
276/// entry.
277void CompileUnit::addSourceLine(DIE *Die, DIGlobalVariable G) {
278 // Verify global variable.
Manman Rend03d2b22013-07-08 18:33:29 +0000279 if (!G.isGlobalVariable())
Devang Patel161b2f42011-04-12 23:21:44 +0000280 return;
281
282 unsigned Line = G.getLineNumber();
283 if (Line == 0)
284 return;
Manman Ren3de61b42013-03-07 01:42:00 +0000285 unsigned FileID = DD->getOrCreateSourceID(G.getFilename(), G.getDirectory(),
286 getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000287 assert(FileID && "Invalid file id");
288 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
289 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
290}
291
292/// addSourceLine - Add location information to specified debug information
293/// entry.
294void CompileUnit::addSourceLine(DIE *Die, DISubprogram SP) {
295 // Verify subprogram.
Manman Rend03d2b22013-07-08 18:33:29 +0000296 if (!SP.isSubprogram())
Devang Patel161b2f42011-04-12 23:21:44 +0000297 return;
Eric Christopher2125d5a2012-03-15 23:55:40 +0000298
Devang Patel161b2f42011-04-12 23:21:44 +0000299 // If the line number is 0, don't add it.
Eric Christopher2125d5a2012-03-15 23:55:40 +0000300 unsigned Line = SP.getLineNumber();
301 if (Line == 0)
Devang Patel161b2f42011-04-12 23:21:44 +0000302 return;
303
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000304 unsigned FileID = DD->getOrCreateSourceID(SP.getFilename(),
Manman Ren3de61b42013-03-07 01:42:00 +0000305 SP.getDirectory(), getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000306 assert(FileID && "Invalid file id");
307 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
308 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
309}
310
311/// addSourceLine - Add location information to specified debug information
312/// entry.
313void CompileUnit::addSourceLine(DIE *Die, DIType Ty) {
314 // Verify type.
Manman Rend03d2b22013-07-08 18:33:29 +0000315 if (!Ty.isType())
Devang Patel161b2f42011-04-12 23:21:44 +0000316 return;
317
318 unsigned Line = Ty.getLineNumber();
Eric Christopher2125d5a2012-03-15 23:55:40 +0000319 if (Line == 0)
Devang Patel161b2f42011-04-12 23:21:44 +0000320 return;
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000321 unsigned FileID = DD->getOrCreateSourceID(Ty.getFilename(),
Manman Ren3de61b42013-03-07 01:42:00 +0000322 Ty.getDirectory(), getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000323 assert(FileID && "Invalid file id");
324 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
325 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
326}
327
328/// addSourceLine - Add location information to specified debug information
329/// entry.
Eric Christopherb8ca9882012-03-29 08:42:56 +0000330void CompileUnit::addSourceLine(DIE *Die, DIObjCProperty Ty) {
331 // Verify type.
Manman Rend03d2b22013-07-08 18:33:29 +0000332 if (!Ty.isObjCProperty())
Eric Christopherb8ca9882012-03-29 08:42:56 +0000333 return;
334
335 unsigned Line = Ty.getLineNumber();
336 if (Line == 0)
337 return;
338 DIFile File = Ty.getFile();
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000339 unsigned FileID = DD->getOrCreateSourceID(File.getFilename(),
Manman Ren3de61b42013-03-07 01:42:00 +0000340 File.getDirectory(), getUniqueID());
Eric Christopherb8ca9882012-03-29 08:42:56 +0000341 assert(FileID && "Invalid file id");
342 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
343 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
344}
345
346/// addSourceLine - Add location information to specified debug information
347/// entry.
Devang Patel161b2f42011-04-12 23:21:44 +0000348void CompileUnit::addSourceLine(DIE *Die, DINameSpace NS) {
349 // Verify namespace.
350 if (!NS.Verify())
351 return;
352
353 unsigned Line = NS.getLineNumber();
354 if (Line == 0)
355 return;
356 StringRef FN = NS.getFilename();
357
Manman Ren3de61b42013-03-07 01:42:00 +0000358 unsigned FileID = DD->getOrCreateSourceID(FN, NS.getDirectory(),
359 getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000360 assert(FileID && "Invalid file id");
361 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
362 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
363}
364
Eric Christopher8b4310b2012-11-21 00:34:38 +0000365/// addVariableAddress - Add DW_AT_location attribute for a
Devang Patele1cdf842011-04-27 22:45:24 +0000366/// DbgVariable based on provided MachineLocation.
Eric Christopherf61dbc12013-06-24 21:07:27 +0000367void CompileUnit::addVariableAddress(const DbgVariable &DV, DIE *Die,
Devang Patele1cdf842011-04-27 22:45:24 +0000368 MachineLocation Location) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000369 if (DV.variableHasComplexAddress())
Devang Patel161b2f42011-04-12 23:21:44 +0000370 addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
Eric Christopherf61dbc12013-06-24 21:07:27 +0000371 else if (DV.isBlockByrefVariable())
Devang Patel161b2f42011-04-12 23:21:44 +0000372 addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location);
373 else
David Blaikie4532c282013-06-20 00:25:24 +0000374 addAddress(Die, dwarf::DW_AT_location, Location,
Eric Christopherf61dbc12013-06-24 21:07:27 +0000375 DV.getVariable().isIndirect());
Devang Patel161b2f42011-04-12 23:21:44 +0000376}
377
Devang Patel116da2f2011-04-26 19:06:18 +0000378/// addRegisterOp - Add register operand.
379void CompileUnit::addRegisterOp(DIE *TheDie, unsigned Reg) {
380 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
381 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
382 if (DWReg < 32)
383 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + DWReg);
384 else {
385 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
386 addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
387 }
388}
389
390/// addRegisterOffset - Add register offset.
391void CompileUnit::addRegisterOffset(DIE *TheDie, unsigned Reg,
392 int64_t Offset) {
393 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
394 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
395 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
396 if (Reg == TRI->getFrameRegister(*Asm->MF))
397 // If variable offset is based in frame register then use fbreg.
398 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
399 else if (DWReg < 32)
400 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DWReg);
401 else {
402 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
403 addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
404 }
405 addSInt(TheDie, 0, dwarf::DW_FORM_sdata, Offset);
406}
407
408/// addAddress - Add an address attribute to a die based on the location
409/// provided.
Eric Christopher31667622013-08-08 01:41:00 +0000410void CompileUnit::addAddress(DIE *Die, uint16_t Attribute,
David Blaikie4532c282013-06-20 00:25:24 +0000411 const MachineLocation &Location, bool Indirect) {
Devang Patel116da2f2011-04-26 19:06:18 +0000412 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
413
David Blaikie4532c282013-06-20 00:25:24 +0000414 if (Location.isReg() && !Indirect)
Devang Patel116da2f2011-04-26 19:06:18 +0000415 addRegisterOp(Block, Location.getReg());
David Blaikie4532c282013-06-20 00:25:24 +0000416 else {
Devang Patel116da2f2011-04-26 19:06:18 +0000417 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
David Blaikie4532c282013-06-20 00:25:24 +0000418 if (Indirect && !Location.isReg()) {
419 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
420 }
421 }
Devang Patel116da2f2011-04-26 19:06:18 +0000422
423 // Now attach the location information to the DIE.
424 addBlock(Die, Attribute, 0, Block);
425}
426
Devang Patel161b2f42011-04-12 23:21:44 +0000427/// addComplexAddress - Start with the address based on the location provided,
428/// and generate the DWARF information necessary to find the actual variable
429/// given the extra address information encoded in the DIVariable, starting from
430/// the starting location. Add the DWARF information to the die.
431///
Eric Christopherf61dbc12013-06-24 21:07:27 +0000432void CompileUnit::addComplexAddress(const DbgVariable &DV, DIE *Die,
Eric Christopher31667622013-08-08 01:41:00 +0000433 uint16_t Attribute,
Devang Patel161b2f42011-04-12 23:21:44 +0000434 const MachineLocation &Location) {
Devang Patel161b2f42011-04-12 23:21:44 +0000435 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Eric Christopherf61dbc12013-06-24 21:07:27 +0000436 unsigned N = DV.getNumAddrElements();
Devang Patelc26f5442011-04-28 02:22:40 +0000437 unsigned i = 0;
438 if (Location.isReg()) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000439 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
Devang Patelc26f5442011-04-28 02:22:40 +0000440 // If first address element is OpPlus then emit
441 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
Eric Christopherf61dbc12013-06-24 21:07:27 +0000442 addRegisterOffset(Block, Location.getReg(), DV.getAddrElement(1));
Devang Patelc26f5442011-04-28 02:22:40 +0000443 i = 2;
444 } else
445 addRegisterOp(Block, Location.getReg());
446 }
Devang Patel116da2f2011-04-26 19:06:18 +0000447 else
448 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel161b2f42011-04-12 23:21:44 +0000449
Devang Patelc26f5442011-04-28 02:22:40 +0000450 for (;i < N; ++i) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000451 uint64_t Element = DV.getAddrElement(i);
Devang Patel161b2f42011-04-12 23:21:44 +0000452 if (Element == DIBuilder::OpPlus) {
453 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
Eric Christopherf61dbc12013-06-24 21:07:27 +0000454 addUInt(Block, 0, dwarf::DW_FORM_udata, DV.getAddrElement(++i));
Devang Patel161b2f42011-04-12 23:21:44 +0000455 } else if (Element == DIBuilder::OpDeref) {
Eric Christopher50120762012-05-08 18:56:00 +0000456 if (!Location.isReg())
457 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Devang Patel161b2f42011-04-12 23:21:44 +0000458 } else llvm_unreachable("unknown DIBuilder Opcode");
459 }
460
461 // Now attach the location information to the DIE.
462 addBlock(Die, Attribute, 0, Block);
463}
464
465/* Byref variables, in Blocks, are declared by the programmer as "SomeType
466 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
467 gives the variable VarName either the struct, or a pointer to the struct, as
468 its type. This is necessary for various behind-the-scenes things the
469 compiler needs to do with by-reference variables in Blocks.
470
471 However, as far as the original *programmer* is concerned, the variable
472 should still have type 'SomeType', as originally declared.
473
474 The function getBlockByrefType dives into the __Block_byref_x_VarName
475 struct to find the original type of the variable, which is then assigned to
476 the variable's Debug Information Entry as its real type. So far, so good.
477 However now the debugger will expect the variable VarName to have the type
478 SomeType. So we need the location attribute for the variable to be an
479 expression that explains to the debugger how to navigate through the
480 pointers and struct to find the actual variable of type SomeType.
481
482 The following function does just that. We start by getting
483 the "normal" location for the variable. This will be the location
484 of either the struct __Block_byref_x_VarName or the pointer to the
485 struct __Block_byref_x_VarName.
486
487 The struct will look something like:
488
489 struct __Block_byref_x_VarName {
490 ... <various fields>
491 struct __Block_byref_x_VarName *forwarding;
492 ... <various other fields>
493 SomeType VarName;
494 ... <maybe more fields>
495 };
496
497 If we are given the struct directly (as our starting point) we
498 need to tell the debugger to:
499
500 1). Add the offset of the forwarding field.
501
502 2). Follow that pointer to get the real __Block_byref_x_VarName
503 struct to use (the real one may have been copied onto the heap).
504
505 3). Add the offset for the field VarName, to find the actual variable.
506
507 If we started with a pointer to the struct, then we need to
508 dereference that pointer first, before the other steps.
509 Translating this into DWARF ops, we will need to append the following
510 to the current location description for the variable:
511
512 DW_OP_deref -- optional, if we start with a pointer
513 DW_OP_plus_uconst <forward_fld_offset>
514 DW_OP_deref
515 DW_OP_plus_uconst <varName_fld_offset>
516
517 That is what this function does. */
518
519/// addBlockByrefAddress - Start with the address based on the location
520/// provided, and generate the DWARF information necessary to find the
521/// actual Block variable (navigating the Block struct) based on the
522/// starting location. Add the DWARF information to the die. For
523/// more information, read large comment just above here.
524///
Eric Christopherf61dbc12013-06-24 21:07:27 +0000525void CompileUnit::addBlockByrefAddress(const DbgVariable &DV, DIE *Die,
Eric Christopher31667622013-08-08 01:41:00 +0000526 uint16_t Attribute,
Devang Patel161b2f42011-04-12 23:21:44 +0000527 const MachineLocation &Location) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000528 DIType Ty = DV.getType();
Devang Patel161b2f42011-04-12 23:21:44 +0000529 DIType TmpTy = Ty;
Eric Christopher31667622013-08-08 01:41:00 +0000530 uint16_t Tag = Ty.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +0000531 bool isPointer = false;
532
Eric Christopherf61dbc12013-06-24 21:07:27 +0000533 StringRef varName = DV.getName();
Devang Patel161b2f42011-04-12 23:21:44 +0000534
535 if (Tag == dwarf::DW_TAG_pointer_type) {
536 DIDerivedType DTy = DIDerivedType(Ty);
537 TmpTy = DTy.getTypeDerivedFrom();
538 isPointer = true;
539 }
540
541 DICompositeType blockStruct = DICompositeType(TmpTy);
542
543 // Find the __forwarding field and the variable field in the __Block_byref
544 // struct.
545 DIArray Fields = blockStruct.getTypeArray();
546 DIDescriptor varField = DIDescriptor();
547 DIDescriptor forwardingField = DIDescriptor();
548
549 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
550 DIDescriptor Element = Fields.getElement(i);
551 DIDerivedType DT = DIDerivedType(Element);
552 StringRef fieldName = DT.getName();
553 if (fieldName == "__forwarding")
554 forwardingField = Element;
555 else if (fieldName == varName)
556 varField = Element;
557 }
558
559 // Get the offsets for the forwarding field and the variable field.
560 unsigned forwardingFieldOffset =
561 DIDerivedType(forwardingField).getOffsetInBits() >> 3;
562 unsigned varFieldOffset =
563 DIDerivedType(varField).getOffsetInBits() >> 3;
564
565 // Decode the original location, and use that as the start of the byref
566 // variable's location.
Devang Patel161b2f42011-04-12 23:21:44 +0000567 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
568
Eric Christophercaba2632012-07-04 02:02:18 +0000569 if (Location.isReg())
570 addRegisterOp(Block, Location.getReg());
571 else
572 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel161b2f42011-04-12 23:21:44 +0000573
574 // If we started with a pointer to the __Block_byref... struct, then
575 // the first thing we need to do is dereference the pointer (DW_OP_deref).
576 if (isPointer)
577 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
578
579 // Next add the offset for the '__forwarding' field:
580 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
581 // adding the offset if it's 0.
582 if (forwardingFieldOffset > 0) {
583 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
584 addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
585 }
586
587 // Now dereference the __forwarding field to get to the real __Block_byref
588 // struct: DW_OP_deref.
589 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
590
591 // Now that we've got the real __Block_byref... struct, add the offset
592 // for the variable's field to get to the location of the actual variable:
593 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
594 if (varFieldOffset > 0) {
595 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
596 addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
597 }
598
599 // Now attach the location information to the DIE.
600 addBlock(Die, Attribute, 0, Block);
601}
602
Devang Patel4ec14b02011-07-20 21:57:04 +0000603/// isTypeSigned - Return true if the type is signed.
604static bool isTypeSigned(DIType Ty, int *SizeInBits) {
605 if (Ty.isDerivedType())
606 return isTypeSigned(DIDerivedType(Ty).getTypeDerivedFrom(), SizeInBits);
607 if (Ty.isBasicType())
608 if (DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed
609 || DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed_char) {
610 *SizeInBits = Ty.getSizeInBits();
611 return true;
612 }
613 return false;
614}
615
Devang Patel161b2f42011-04-12 23:21:44 +0000616/// addConstantValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000617void CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO,
Devang Patelb58128e2011-05-27 16:45:18 +0000618 DIType Ty) {
David Blaikie4de9d722013-05-10 21:52:07 +0000619 // FIXME: This is a bit conservative/simple - it emits negative values at
620 // their maximum bit width which is a bit unfortunate (& doesn't prefer
621 // udata/sdata over dataN as suggested by the DWARF spec)
Nick Lewycky746cb672011-10-26 22:55:33 +0000622 assert(MO.isImm() && "Invalid machine operand!");
Devang Patel4ec14b02011-07-20 21:57:04 +0000623 int SizeInBits = -1;
624 bool SignedConstant = isTypeSigned(Ty, &SizeInBits);
Eric Christopher7b2ee392013-08-27 23:49:04 +0000625 uint16_t Form;
Devang Patel72f0d9c2011-05-27 18:15:52 +0000626
Eric Christopher7b2ee392013-08-27 23:49:04 +0000627 // If we're a signed constant definitely use sdata.
628 if (SignedConstant) {
629 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, MO.getImm());
630 return;
631 }
632
633 // Else use data for now unless it's larger than we can deal with.
634 switch (SizeInBits) {
635 case 8:
636 Form = dwarf::DW_FORM_data1;
637 break;
638 case 16:
639 Form = dwarf::DW_FORM_data2;
640 break;
641 case 32:
642 Form = dwarf::DW_FORM_data4;
643 break;
644 case 64:
645 Form = dwarf::DW_FORM_data8;
646 break;
647 default:
648 Form = dwarf::DW_FORM_udata;
649 addUInt(Die, dwarf::DW_AT_const_value, Form, MO.getImm());
650 return;
651 }
652 addUInt(Die, dwarf::DW_AT_const_value, Form, MO.getImm());
Devang Patel161b2f42011-04-12 23:21:44 +0000653}
654
655/// addConstantFPValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000656void CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
Nick Lewycky390c40d2011-10-27 06:44:11 +0000657 assert (MO.isFPImm() && "Invalid machine operand!");
Devang Patel161b2f42011-04-12 23:21:44 +0000658 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
659 APFloat FPImm = MO.getFPImm()->getValueAPF();
660
661 // Get the raw data form of the floating point.
662 const APInt FltVal = FPImm.bitcastToAPInt();
663 const char *FltPtr = (const char*)FltVal.getRawData();
664
665 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
Micah Villmow3574eca2012-10-08 16:38:25 +0000666 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel161b2f42011-04-12 23:21:44 +0000667 int Incr = (LittleEndian ? 1 : -1);
668 int Start = (LittleEndian ? 0 : NumBytes - 1);
669 int Stop = (LittleEndian ? NumBytes : -1);
670
671 // Output the constant to DWARF one byte at a time.
672 for (; Start != Stop; Start += Incr)
673 addUInt(Block, 0, dwarf::DW_FORM_data1,
674 (unsigned char)0xFF & FltPtr[Start]);
675
676 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
Devang Patel161b2f42011-04-12 23:21:44 +0000677}
678
David Blaikie14268412013-01-20 01:18:01 +0000679/// addConstantFPValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000680void CompileUnit::addConstantFPValue(DIE *Die, const ConstantFP *CFP) {
Eric Christopher7b2ee392013-08-27 23:49:04 +0000681 // Pass this down to addConstantValue as an unsigned bag of bits.
682 addConstantValue(Die, CFP->getValueAPF().bitcastToAPInt(), true);
David Blaikie14268412013-01-20 01:18:01 +0000683}
684
Devang Patel161b2f42011-04-12 23:21:44 +0000685/// addConstantValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000686void CompileUnit::addConstantValue(DIE *Die, const ConstantInt *CI,
Devang Patel161b2f42011-04-12 23:21:44 +0000687 bool Unsigned) {
Eric Christophere4721492013-07-03 01:08:30 +0000688 addConstantValue(Die, CI->getValue(), Unsigned);
David Blaikie14268412013-01-20 01:18:01 +0000689}
690
691// addConstantValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000692void CompileUnit::addConstantValue(DIE *Die, const APInt &Val, bool Unsigned) {
David Blaikie14268412013-01-20 01:18:01 +0000693 unsigned CIBitWidth = Val.getBitWidth();
Devang Pateld6a81362011-05-28 00:39:18 +0000694 if (CIBitWidth <= 64) {
Eric Christopher7b2ee392013-08-27 23:49:04 +0000695 // If we're a signed constant definitely use sdata.
696 if (!Unsigned) {
697 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata,
698 Val.getSExtValue());
699 return;
Devang Pateld6a81362011-05-28 00:39:18 +0000700 }
Eric Christopher7b2ee392013-08-27 23:49:04 +0000701
702 // Else use data for now unless it's larger than we can deal with.
703 uint16_t Form;
704 switch (CIBitWidth) {
705 case 8:
706 Form = dwarf::DW_FORM_data1;
707 break;
708 case 16:
709 Form = dwarf::DW_FORM_data2;
710 break;
711 case 32:
712 Form = dwarf::DW_FORM_data4;
713 break;
714 case 64:
715 Form = dwarf::DW_FORM_data8;
716 break;
717 default:
718 addUInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
719 Val.getZExtValue());
720 return;
721 }
722 addUInt(Die, dwarf::DW_AT_const_value, Form, Val.getZExtValue());
Eric Christophere4721492013-07-03 01:08:30 +0000723 return;
Devang Patel161b2f42011-04-12 23:21:44 +0000724 }
725
726 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
727
728 // Get the raw data form of the large APInt.
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000729 const uint64_t *Ptr64 = Val.getRawData();
Devang Patel161b2f42011-04-12 23:21:44 +0000730
731 int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
Micah Villmow3574eca2012-10-08 16:38:25 +0000732 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel161b2f42011-04-12 23:21:44 +0000733
734 // Output the constant to DWARF one byte at a time.
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000735 for (int i = 0; i < NumBytes; i++) {
736 uint8_t c;
737 if (LittleEndian)
738 c = Ptr64[i / 8] >> (8 * (i & 7));
739 else
740 c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7));
741 addUInt(Block, 0, dwarf::DW_FORM_data1, c);
742 }
Devang Patel161b2f42011-04-12 23:21:44 +0000743
744 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
Devang Patel161b2f42011-04-12 23:21:44 +0000745}
746
Eric Christopher6c3bb942013-04-22 07:47:40 +0000747/// addTemplateParams - Add template parameters into buffer.
Devang Patel161b2f42011-04-12 23:21:44 +0000748void CompileUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
749 // Add template parameters.
750 for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) {
751 DIDescriptor Element = TParams.getElement(i);
752 if (Element.isTemplateTypeParameter())
753 Buffer.addChild(getOrCreateTemplateTypeParameterDIE(
754 DITemplateTypeParameter(Element)));
755 else if (Element.isTemplateValueParameter())
756 Buffer.addChild(getOrCreateTemplateValueParameterDIE(
757 DITemplateValueParameter(Element)));
758 }
Devang Patel161b2f42011-04-12 23:21:44 +0000759}
Nick Lewycky746cb672011-10-26 22:55:33 +0000760
Eric Christopher6b6061f2013-01-16 01:22:23 +0000761/// getOrCreateContextDIE - Get context owner's DIE.
762DIE *CompileUnit::getOrCreateContextDIE(DIDescriptor Context) {
763 if (Context.isType())
764 return getOrCreateTypeDIE(DIType(Context));
765 else if (Context.isNameSpace())
766 return getOrCreateNameSpace(DINameSpace(Context));
767 else if (Context.isSubprogram())
768 return getOrCreateSubprogramDIE(DISubprogram(Context));
Eric Christopher6c3bb942013-04-22 07:47:40 +0000769 else
Eric Christopher6b6061f2013-01-16 01:22:23 +0000770 return getDIE(Context);
771}
772
Devang Patel161b2f42011-04-12 23:21:44 +0000773/// addToContextOwner - Add Die into the list of its context owner's children.
774void CompileUnit::addToContextOwner(DIE *Die, DIDescriptor Context) {
Eric Christopher6b6061f2013-01-16 01:22:23 +0000775 if (DIE *ContextDIE = getOrCreateContextDIE(Context))
Devang Patel161b2f42011-04-12 23:21:44 +0000776 ContextDIE->addChild(Die);
777 else
778 addDie(Die);
779}
780
781/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
782/// given DIType.
Devang Patel94c7ddb2011-08-16 22:09:43 +0000783DIE *CompileUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
784 DIType Ty(TyNode);
Manman Rend03d2b22013-07-08 18:33:29 +0000785 if (!Ty.isType())
Devang Patel94c7ddb2011-08-16 22:09:43 +0000786 return NULL;
Devang Patel161b2f42011-04-12 23:21:44 +0000787 DIE *TyDIE = getDIE(Ty);
788 if (TyDIE)
789 return TyDIE;
790
791 // Create new type.
792 TyDIE = new DIE(dwarf::DW_TAG_base_type);
793 insertDIE(Ty, TyDIE);
794 if (Ty.isBasicType())
795 constructTypeDIE(*TyDIE, DIBasicType(Ty));
796 else if (Ty.isCompositeType())
797 constructTypeDIE(*TyDIE, DICompositeType(Ty));
798 else {
799 assert(Ty.isDerivedType() && "Unknown kind of DIType");
800 constructTypeDIE(*TyDIE, DIDerivedType(Ty));
801 }
Eric Christopher1b3f9192011-11-10 19:52:58 +0000802 // If this is a named finished type then include it in the list of types
803 // for the accelerator tables.
Eric Christopherc36145f2012-01-06 04:35:23 +0000804 if (!Ty.getName().empty() && !Ty.isForwardDecl()) {
805 bool IsImplementation = 0;
806 if (Ty.isCompositeType()) {
807 DICompositeType CT(Ty);
Eric Christophere0167892012-01-06 23:03:37 +0000808 // A runtime language of 0 actually means C/C++ and that any
809 // non-negative value is some version of Objective-C/C++.
Eric Christopherc36145f2012-01-06 04:35:23 +0000810 IsImplementation = (CT.getRunTimeLang() == 0) ||
Eric Christophere2dc9332012-02-22 08:46:02 +0000811 CT.isObjcClassComplete();
Eric Christopherc36145f2012-01-06 04:35:23 +0000812 }
Eric Christopher577056f2013-09-05 18:20:16 +0000813 unsigned Flags = IsImplementation ? dwarf::DW_FLAG_type_implementation : 0;
Eric Christophere0167892012-01-06 23:03:37 +0000814 addAccelType(Ty.getName(), std::make_pair(TyDIE, Flags));
Eric Christopherc36145f2012-01-06 04:35:23 +0000815 }
Eric Christopher8b4310b2012-11-21 00:34:38 +0000816
Manman Ren2c9905a2013-09-09 19:47:11 +0000817 addToContextOwner(TyDIE, DD->resolve(Ty.getContext()));
Devang Patel161b2f42011-04-12 23:21:44 +0000818 return TyDIE;
819}
820
821/// addType - Add a new type attribute to the specified entity.
Eric Christopher31667622013-08-08 01:41:00 +0000822void CompileUnit::addType(DIE *Entity, DIType Ty, uint16_t Attribute) {
Eric Christopherdc1363f2013-08-08 07:40:37 +0000823 assert(Ty && "Trying to add a type that doesn't exist?");
Devang Patel161b2f42011-04-12 23:21:44 +0000824
825 // Check for pre-existence.
826 DIEEntry *Entry = getDIEEntry(Ty);
827 // If it exists then use the existing value.
828 if (Entry) {
Eric Christopher663e0cf2012-03-28 07:34:31 +0000829 Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
Devang Patel161b2f42011-04-12 23:21:44 +0000830 return;
831 }
832
833 // Construct type.
834 DIE *Buffer = getOrCreateTypeDIE(Ty);
835
836 // Set up proxy.
837 Entry = createDIEEntry(Buffer);
838 insertDIEEntry(Ty, Entry);
Eric Christopher663e0cf2012-03-28 07:34:31 +0000839 Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
Devang Patele9ae06c2011-05-31 22:56:51 +0000840
841 // If this is a complete composite type then include it in the
842 // list of global types.
Devang Patelc20bdf12011-06-01 00:23:24 +0000843 addGlobalType(Ty);
Devang Patel66658e42011-05-31 23:30:30 +0000844}
845
Eric Christopher50d37a42013-09-20 22:20:55 +0000846/// addGlobalName - Add a new global name to the compile unit.
847void CompileUnit::addGlobalName(StringRef Name, DIE *Die) {
848 GlobalNames[Name] = Die;
849}
850
Devang Patel66658e42011-05-31 23:30:30 +0000851/// addGlobalType - Add a new global type to the compile unit.
852///
Devang Patelc20bdf12011-06-01 00:23:24 +0000853void CompileUnit::addGlobalType(DIType Ty) {
Manman Ren2c9905a2013-09-09 19:47:11 +0000854 DIDescriptor Context = DD->resolve(Ty.getContext());
Eric Christopher8b4310b2012-11-21 00:34:38 +0000855 if (Ty.isCompositeType() && !Ty.getName().empty() && !Ty.isForwardDecl()
856 && (!Context || Context.isCompileUnit() || Context.isFile()
Devang Patel94c7ddb2011-08-16 22:09:43 +0000857 || Context.isNameSpace()))
Devang Patelc20bdf12011-06-01 00:23:24 +0000858 if (DIEEntry *Entry = getDIEEntry(Ty))
859 GlobalTypes[Ty.getName()] = Entry->getEntry();
Devang Patel161b2f42011-04-12 23:21:44 +0000860}
861
Devang Patel31c5d052011-05-06 16:57:54 +0000862/// addPubTypes - Add type for pubtypes section.
863void CompileUnit::addPubTypes(DISubprogram SP) {
864 DICompositeType SPTy = SP.getType();
Eric Christopher31667622013-08-08 01:41:00 +0000865 uint16_t SPTag = SPTy.getTag();
Devang Patel31c5d052011-05-06 16:57:54 +0000866 if (SPTag != dwarf::DW_TAG_subroutine_type)
867 return;
868
869 DIArray Args = SPTy.getTypeArray();
870 for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
871 DIType ATy(Args.getElement(i));
Manman Rend03d2b22013-07-08 18:33:29 +0000872 if (!ATy.isType())
Devang Patel31c5d052011-05-06 16:57:54 +0000873 continue;
Devang Patelc20bdf12011-06-01 00:23:24 +0000874 addGlobalType(ATy);
Devang Patel31c5d052011-05-06 16:57:54 +0000875 }
876}
877
Devang Patel161b2f42011-04-12 23:21:44 +0000878/// constructTypeDIE - Construct basic type die from DIBasicType.
879void CompileUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
880 // Get core information.
881 StringRef Name = BTy.getName();
Devang Patel161b2f42011-04-12 23:21:44 +0000882 // Add name if not anonymous or intermediate type.
883 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000884 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel734a67c2011-09-14 23:13:28 +0000885
886 if (BTy.getTag() == dwarf::DW_TAG_unspecified_type) {
887 Buffer.setTag(dwarf::DW_TAG_unspecified_type);
Eric Christopher61c91d52013-07-09 23:48:45 +0000888 // An unspecified type only has a name attribute.
Devang Patel734a67c2011-09-14 23:13:28 +0000889 return;
890 }
891
892 Buffer.setTag(dwarf::DW_TAG_base_type);
Nick Lewycky746cb672011-10-26 22:55:33 +0000893 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
Devang Patel30d409c2012-02-07 23:33:58 +0000894 BTy.getEncoding());
Devang Patel734a67c2011-09-14 23:13:28 +0000895
Devang Patel161b2f42011-04-12 23:21:44 +0000896 uint64_t Size = BTy.getSizeInBits() >> 3;
897 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
898}
899
900/// constructTypeDIE - Construct derived type die from DIDerivedType.
901void CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
902 // Get core information.
903 StringRef Name = DTy.getName();
904 uint64_t Size = DTy.getSizeInBits() >> 3;
Eric Christopher31667622013-08-08 01:41:00 +0000905 uint16_t Tag = DTy.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +0000906
907 // FIXME - Workaround for templates.
908 if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
909
910 Buffer.setTag(Tag);
911
912 // Map to main type, void will not have a type.
913 DIType FromTy = DTy.getTypeDerivedFrom();
Eric Christopherdc1363f2013-08-08 07:40:37 +0000914 if (FromTy)
915 addType(&Buffer, FromTy);
Devang Patel161b2f42011-04-12 23:21:44 +0000916
917 // Add name if not anonymous or intermediate type.
918 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000919 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +0000920
921 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopher35f225a2012-02-21 22:25:53 +0000922 if (Size && Tag != dwarf::DW_TAG_pointer_type)
Devang Patel161b2f42011-04-12 23:21:44 +0000923 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
924
David Blaikie62fdfb52013-01-07 05:51:15 +0000925 if (Tag == dwarf::DW_TAG_ptr_to_member_type)
926 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
Manman Renbc660712013-09-05 18:48:31 +0000927 getOrCreateTypeDIE(DD->resolve(DTy.getClassType())));
Devang Patel161b2f42011-04-12 23:21:44 +0000928 // Add source line info if available and TyDesc is not a forward declaration.
929 if (!DTy.isForwardDecl())
930 addSourceLine(&Buffer, DTy);
931}
932
Eric Christopher3dee5752013-07-26 17:02:41 +0000933/// Return true if the type is appropriately scoped to be contained inside
934/// its own type unit.
Manman Ren18eb2452013-09-09 19:23:58 +0000935static bool isTypeUnitScoped(DIType Ty, const DwarfDebug *DD) {
Manman Ren2c9905a2013-09-09 19:47:11 +0000936 DIScope Parent = DD->resolve(Ty.getContext());
Eric Christopher3dee5752013-07-26 17:02:41 +0000937 while (Parent) {
938 // Don't generate a hash for anything scoped inside a function.
939 if (Parent.isSubprogram())
940 return false;
Manman Rene72aba92013-09-09 22:35:23 +0000941 Parent = DD->resolve(Parent.getContext());
Eric Christopher3dee5752013-07-26 17:02:41 +0000942 }
943 return true;
944}
945
946/// Return true if the type should be split out into a type unit.
Manman Ren18eb2452013-09-09 19:23:58 +0000947static bool shouldCreateTypeUnit(DICompositeType CTy, const DwarfDebug *DD) {
Eric Christopher31667622013-08-08 01:41:00 +0000948 uint16_t Tag = CTy.getTag();
Eric Christopher3dee5752013-07-26 17:02:41 +0000949
950 switch (Tag) {
951 case dwarf::DW_TAG_structure_type:
952 case dwarf::DW_TAG_union_type:
953 case dwarf::DW_TAG_enumeration_type:
954 case dwarf::DW_TAG_class_type:
955 // If this is a class, structure, union, or enumeration type
956 // that is not a declaration, is a type definition, and not scoped
957 // inside a function then separate this out as a type unit.
Manman Ren18eb2452013-09-09 19:23:58 +0000958 if (CTy.isForwardDecl() || !isTypeUnitScoped(CTy, DD))
Eric Christopher3dee5752013-07-26 17:02:41 +0000959 return 0;
960 return 1;
961 default:
962 return 0;
963 }
964}
965
Devang Patel161b2f42011-04-12 23:21:44 +0000966/// constructTypeDIE - Construct type DIE from DICompositeType.
967void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
968 // Get core information.
969 StringRef Name = CTy.getName();
970
971 uint64_t Size = CTy.getSizeInBits() >> 3;
Eric Christopher31667622013-08-08 01:41:00 +0000972 uint16_t Tag = CTy.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +0000973 Buffer.setTag(Tag);
974
975 switch (Tag) {
Devang Patel161b2f42011-04-12 23:21:44 +0000976 case dwarf::DW_TAG_array_type:
977 constructArrayTypeDIE(Buffer, &CTy);
978 break;
979 case dwarf::DW_TAG_enumeration_type: {
980 DIArray Elements = CTy.getTypeArray();
981
982 // Add enumerators to enumeration type.
983 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
984 DIE *ElemDie = NULL;
985 DIDescriptor Enum(Elements.getElement(i));
986 if (Enum.isEnumerator()) {
987 ElemDie = constructEnumTypeDIE(DIEnumerator(Enum));
988 Buffer.addChild(ElemDie);
989 }
990 }
Eric Christopherbb0f6ea2012-05-23 00:09:20 +0000991 DIType DTy = CTy.getTypeDerivedFrom();
Eric Christopher37c107b2013-08-08 07:40:42 +0000992 if (DTy) {
Eric Christopherbb0f6ea2012-05-23 00:09:20 +0000993 addType(&Buffer, DTy);
994 addUInt(&Buffer, dwarf::DW_AT_enum_class, dwarf::DW_FORM_flag, 1);
995 }
Devang Patel161b2f42011-04-12 23:21:44 +0000996 }
997 break;
998 case dwarf::DW_TAG_subroutine_type: {
Eric Christopherdc1363f2013-08-08 07:40:37 +0000999 // Add return type. A void return won't have a type.
Devang Patel161b2f42011-04-12 23:21:44 +00001000 DIArray Elements = CTy.getTypeArray();
1001 DIDescriptor RTy = Elements.getElement(0);
Eric Christopherdc1363f2013-08-08 07:40:37 +00001002 if (RTy)
1003 addType(&Buffer, DIType(RTy));
Devang Patel161b2f42011-04-12 23:21:44 +00001004
1005 bool isPrototyped = true;
1006 // Add arguments.
1007 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
1008 DIDescriptor Ty = Elements.getElement(i);
1009 if (Ty.isUnspecifiedParameter()) {
1010 DIE *Arg = new DIE(dwarf::DW_TAG_unspecified_parameters);
1011 Buffer.addChild(Arg);
1012 isPrototyped = false;
1013 } else {
1014 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1015 addType(Arg, DIType(Ty));
David Blaikieaaf2e632013-01-29 19:35:24 +00001016 if (DIType(Ty).isArtificial())
1017 addFlag(Arg, dwarf::DW_AT_artificial);
Devang Patel161b2f42011-04-12 23:21:44 +00001018 Buffer.addChild(Arg);
1019 }
1020 }
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001021 // Add prototype flag if we're dealing with a C language and the
1022 // function has been prototyped.
Eric Christopher7b878952013-08-26 23:50:38 +00001023 uint16_t Language = DICompileUnit(Node).getLanguage();
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001024 if (isPrototyped &&
Eric Christopher4d069bf2012-05-22 18:45:24 +00001025 (Language == dwarf::DW_LANG_C89 ||
1026 Language == dwarf::DW_LANG_C99 ||
1027 Language == dwarf::DW_LANG_ObjC))
Eric Christopher873cf0a2012-08-24 01:14:27 +00001028 addFlag(&Buffer, dwarf::DW_AT_prototyped);
Devang Patel161b2f42011-04-12 23:21:44 +00001029 }
1030 break;
1031 case dwarf::DW_TAG_structure_type:
1032 case dwarf::DW_TAG_union_type:
1033 case dwarf::DW_TAG_class_type: {
Devang Patel161b2f42011-04-12 23:21:44 +00001034 // Add elements to structure type.
David Blaikiec8b93552013-08-01 20:30:22 +00001035 DIArray Elements = CTy.getTypeArray();
1036 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
Devang Patel161b2f42011-04-12 23:21:44 +00001037 DIDescriptor Element = Elements.getElement(i);
1038 DIE *ElemDie = NULL;
1039 if (Element.isSubprogram()) {
1040 DISubprogram SP(Element);
Devang Pateldbc64af2011-08-15 17:24:54 +00001041 ElemDie = getOrCreateSubprogramDIE(DISubprogram(Element));
Devang Patel161b2f42011-04-12 23:21:44 +00001042 if (SP.isProtected())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001043 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001044 dwarf::DW_ACCESS_protected);
1045 else if (SP.isPrivate())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001046 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001047 dwarf::DW_ACCESS_private);
Eric Christopher8b4310b2012-11-21 00:34:38 +00001048 else
Nick Lewycky13aaca52011-12-13 05:09:11 +00001049 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001050 dwarf::DW_ACCESS_public);
1051 if (SP.isExplicit())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001052 addFlag(ElemDie, dwarf::DW_AT_explicit);
Eric Christopher663e0cf2012-03-28 07:34:31 +00001053 } else if (Element.isDerivedType()) {
Eric Christopher4d069bf2012-05-22 18:45:24 +00001054 DIDerivedType DDTy(Element);
1055 if (DDTy.getTag() == dwarf::DW_TAG_friend) {
1056 ElemDie = new DIE(dwarf::DW_TAG_friend);
1057 addType(ElemDie, DDTy.getTypeDerivedFrom(), dwarf::DW_AT_friend);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001058 } else if (DDTy.isStaticMember())
1059 ElemDie = createStaticMemberDIE(DDTy);
1060 else
1061 ElemDie = createMemberDIE(DDTy);
Eric Christopher663e0cf2012-03-28 07:34:31 +00001062 } else if (Element.isObjCProperty()) {
Devang Patel30d409c2012-02-07 23:33:58 +00001063 DIObjCProperty Property(Element);
1064 ElemDie = new DIE(Property.getTag());
1065 StringRef PropertyName = Property.getObjCPropertyName();
1066 addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
Eric Christopher4d069bf2012-05-22 18:45:24 +00001067 addType(ElemDie, Property.getType());
1068 addSourceLine(ElemDie, Property);
Devang Patel30d409c2012-02-07 23:33:58 +00001069 StringRef GetterName = Property.getObjCPropertyGetterName();
1070 if (!GetterName.empty())
1071 addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
1072 StringRef SetterName = Property.getObjCPropertySetterName();
1073 if (!SetterName.empty())
1074 addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
1075 unsigned PropertyAttributes = 0;
Devang Patel9e11eb12012-02-04 01:30:32 +00001076 if (Property.isReadOnlyObjCProperty())
1077 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
1078 if (Property.isReadWriteObjCProperty())
1079 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
1080 if (Property.isAssignObjCProperty())
1081 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
1082 if (Property.isRetainObjCProperty())
1083 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
1084 if (Property.isCopyObjCProperty())
1085 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
1086 if (Property.isNonAtomicObjCProperty())
1087 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
1088 if (PropertyAttributes)
Eric Christopher8b4310b2012-11-21 00:34:38 +00001089 addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, 0,
Devang Patel9e11eb12012-02-04 01:30:32 +00001090 PropertyAttributes);
Devang Patel6588abf2012-02-06 17:49:43 +00001091
Devang Patel30d409c2012-02-07 23:33:58 +00001092 DIEEntry *Entry = getDIEEntry(Element);
1093 if (!Entry) {
1094 Entry = createDIEEntry(ElemDie);
1095 insertDIEEntry(Element, Entry);
1096 }
Devang Patel9e11eb12012-02-04 01:30:32 +00001097 } else
Devang Patel161b2f42011-04-12 23:21:44 +00001098 continue;
1099 Buffer.addChild(ElemDie);
1100 }
1101
1102 if (CTy.isAppleBlockExtension())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001103 addFlag(&Buffer, dwarf::DW_AT_APPLE_block);
Devang Patel161b2f42011-04-12 23:21:44 +00001104
Manman Rene42279c2013-09-06 18:46:00 +00001105 DICompositeType ContainingType(DD->resolve(CTy.getContainingType()));
Devang Patel161b2f42011-04-12 23:21:44 +00001106 if (DIDescriptor(ContainingType).isCompositeType())
1107 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
1108 getOrCreateTypeDIE(DIType(ContainingType)));
Eric Christopher010dbfd2013-07-14 21:46:51 +00001109 else
Manman Ren2c9905a2013-09-09 19:47:11 +00001110 addToContextOwner(&Buffer, DD->resolve(CTy.getContext()));
Devang Patel161b2f42011-04-12 23:21:44 +00001111
Devang Patel201e6cd2011-05-12 21:29:42 +00001112 if (CTy.isObjcClassComplete())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001113 addFlag(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type);
Devang Patelb11f80e2011-05-12 19:06:16 +00001114
Eric Christopher1a8e8862011-12-16 23:42:42 +00001115 // Add template parameters to a class, structure or union types.
1116 // FIXME: The support isn't in the metadata for this yet.
1117 if (Tag == dwarf::DW_TAG_class_type ||
1118 Tag == dwarf::DW_TAG_structure_type ||
1119 Tag == dwarf::DW_TAG_union_type)
Devang Patel161b2f42011-04-12 23:21:44 +00001120 addTemplateParams(Buffer, CTy.getTemplateParams());
1121
1122 break;
1123 }
1124 default:
1125 break;
1126 }
1127
1128 // Add name if not anonymous or intermediate type.
1129 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001130 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001131
Eric Christopher4a5d8392012-05-22 18:45:18 +00001132 if (Tag == dwarf::DW_TAG_enumeration_type ||
1133 Tag == dwarf::DW_TAG_class_type ||
1134 Tag == dwarf::DW_TAG_structure_type ||
1135 Tag == dwarf::DW_TAG_union_type) {
Devang Patel161b2f42011-04-12 23:21:44 +00001136 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopherfc4199b2012-06-01 00:22:32 +00001137 // TODO: Do we care about size for enum forward declarations?
Devang Patel161b2f42011-04-12 23:21:44 +00001138 if (Size)
1139 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
Eric Christopherfc4199b2012-06-01 00:22:32 +00001140 else if (!CTy.isForwardDecl())
Devang Patel161b2f42011-04-12 23:21:44 +00001141 // Add zero size if it is not a forward declaration.
Eric Christopherfc4199b2012-06-01 00:22:32 +00001142 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
1143
1144 // If we're a forward decl, say so.
1145 if (CTy.isForwardDecl())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001146 addFlag(&Buffer, dwarf::DW_AT_declaration);
Devang Patel161b2f42011-04-12 23:21:44 +00001147
1148 // Add source line info if available.
1149 if (!CTy.isForwardDecl())
1150 addSourceLine(&Buffer, CTy);
Eric Christopher89388952012-03-07 00:15:19 +00001151
1152 // No harm in adding the runtime language to the declaration.
1153 unsigned RLang = CTy.getRunTimeLang();
1154 if (RLang)
1155 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
1156 dwarf::DW_FORM_data1, RLang);
Devang Patel161b2f42011-04-12 23:21:44 +00001157 }
Eric Christopher3dee5752013-07-26 17:02:41 +00001158 // If this is a type applicable to a type unit it then add it to the
1159 // list of types we'll compute a hash for later.
Manman Ren18eb2452013-09-09 19:23:58 +00001160 if (shouldCreateTypeUnit(CTy, DD))
Eric Christopher3dee5752013-07-26 17:02:41 +00001161 DD->addTypeUnitType(&Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +00001162}
1163
Eric Christopher8b4310b2012-11-21 00:34:38 +00001164/// getOrCreateTemplateTypeParameterDIE - Find existing DIE or create new DIE
Devang Patel161b2f42011-04-12 23:21:44 +00001165/// for the given DITemplateTypeParameter.
1166DIE *
1167CompileUnit::getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP) {
1168 DIE *ParamDIE = getDIE(TP);
1169 if (ParamDIE)
1170 return ParamDIE;
1171
1172 ParamDIE = new DIE(dwarf::DW_TAG_template_type_parameter);
Eric Christopher76ef79f2013-08-08 08:09:43 +00001173 // Add the type if it exists, it could be void and therefore no type.
1174 if (TP.getType())
1175 addType(ParamDIE, TP.getType());
David Blaikiee88939c2013-06-22 18:59:11 +00001176 if (!TP.getName().empty())
1177 addString(ParamDIE, dwarf::DW_AT_name, TP.getName());
Devang Patel161b2f42011-04-12 23:21:44 +00001178 return ParamDIE;
1179}
1180
Eric Christopher8b4310b2012-11-21 00:34:38 +00001181/// getOrCreateTemplateValueParameterDIE - Find existing DIE or create new DIE
Devang Patel161b2f42011-04-12 23:21:44 +00001182/// for the given DITemplateValueParameter.
1183DIE *
Eric Christopherafdd1f82013-08-08 07:40:31 +00001184CompileUnit::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter VP) {
1185 DIE *ParamDIE = getDIE(VP);
Devang Patel161b2f42011-04-12 23:21:44 +00001186 if (ParamDIE)
1187 return ParamDIE;
1188
Eric Christopherafdd1f82013-08-08 07:40:31 +00001189 ParamDIE = new DIE(VP.getTag());
Eric Christopherdc1363f2013-08-08 07:40:37 +00001190
1191 // Add the type if there is one, template template and template parameter
1192 // packs will not have a type.
1193 if (VP.getType())
1194 addType(ParamDIE, VP.getType());
Eric Christopherafdd1f82013-08-08 07:40:31 +00001195 if (!VP.getName().empty())
1196 addString(ParamDIE, dwarf::DW_AT_name, VP.getName());
1197 if (Value *Val = VP.getValue()) {
David Blaikie4de9d722013-05-10 21:52:07 +00001198 if (ConstantInt *CI = dyn_cast<ConstantInt>(Val))
Eric Christopherafdd1f82013-08-08 07:40:31 +00001199 addConstantValue(ParamDIE, CI, VP.getType().isUnsignedDIType());
David Blaikie4de9d722013-05-10 21:52:07 +00001200 else if (GlobalValue *GV = dyn_cast<GlobalValue>(Val)) {
1201 // For declaration non-type template parameters (such as global values and
1202 // functions)
1203 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1204 addOpAddress(Block, Asm->Mang->getSymbol(GV));
1205 // Emit DW_OP_stack_value to use the address as the immediate value of the
1206 // parameter, rather than a pointer to it.
1207 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value);
1208 addBlock(ParamDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopherafdd1f82013-08-08 07:40:31 +00001209 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_template_param) {
David Blaikiee88939c2013-06-22 18:59:11 +00001210 assert(isa<MDString>(Val));
1211 addString(ParamDIE, dwarf::DW_AT_GNU_template_name,
1212 cast<MDString>(Val)->getString());
Eric Christopherafdd1f82013-08-08 07:40:31 +00001213 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_parameter_pack) {
David Blaikiee88939c2013-06-22 18:59:11 +00001214 assert(isa<MDNode>(Val));
1215 DIArray A(cast<MDNode>(Val));
1216 addTemplateParams(*ParamDIE, A);
David Blaikie4de9d722013-05-10 21:52:07 +00001217 }
1218 }
1219
Devang Patel161b2f42011-04-12 23:21:44 +00001220 return ParamDIE;
1221}
1222
Devang Patel31c5d052011-05-06 16:57:54 +00001223/// getOrCreateNameSpace - Create a DIE for DINameSpace.
1224DIE *CompileUnit::getOrCreateNameSpace(DINameSpace NS) {
1225 DIE *NDie = getDIE(NS);
1226 if (NDie)
1227 return NDie;
1228 NDie = new DIE(dwarf::DW_TAG_namespace);
1229 insertDIE(NS, NDie);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001230 if (!NS.getName().empty()) {
Nick Lewycky390c40d2011-10-27 06:44:11 +00001231 addString(NDie, dwarf::DW_AT_name, NS.getName());
Eric Christopher09ac3d82011-11-07 09:24:32 +00001232 addAccelNamespace(NS.getName(), NDie);
1233 } else
1234 addAccelNamespace("(anonymous namespace)", NDie);
Devang Patel31c5d052011-05-06 16:57:54 +00001235 addSourceLine(NDie, NS);
1236 addToContextOwner(NDie, NS.getContext());
1237 return NDie;
1238}
1239
Devang Pateldbc64af2011-08-15 17:24:54 +00001240/// getOrCreateSubprogramDIE - Create new DIE using SP.
1241DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
1242 DIE *SPDie = getDIE(SP);
1243 if (SPDie)
1244 return SPDie;
1245
Peter Collingbourne27302f02012-05-27 18:36:44 +00001246 SPDie = new DIE(dwarf::DW_TAG_subprogram);
1247
1248 // DW_TAG_inlined_subroutine may refer to this DIE.
1249 insertDIE(SP, SPDie);
1250
Rafael Espindola01b55b42011-11-10 22:34:29 +00001251 DISubprogram SPDecl = SP.getFunctionDeclaration();
1252 DIE *DeclDie = NULL;
1253 if (SPDecl.isSubprogram()) {
1254 DeclDie = getOrCreateSubprogramDIE(SPDecl);
1255 }
1256
Devang Pateldbc64af2011-08-15 17:24:54 +00001257 // Add to context owner.
1258 addToContextOwner(SPDie, SP.getContext());
1259
1260 // Add function template parameters.
1261 addTemplateParams(*SPDie, SP.getTemplateParams());
1262
Devang Pateldbc64af2011-08-15 17:24:54 +00001263 // If this DIE is going to refer declaration info using AT_specification
Eric Christopherc4968752013-05-09 00:42:33 +00001264 // then there is no need to add other attributes.
Rafael Espindola01b55b42011-11-10 22:34:29 +00001265 if (DeclDie) {
1266 // Refer function declaration directly.
1267 addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
1268 DeclDie);
1269
Devang Pateldbc64af2011-08-15 17:24:54 +00001270 return SPDie;
Rafael Espindola01b55b42011-11-10 22:34:29 +00001271 }
Devang Pateldbc64af2011-08-15 17:24:54 +00001272
Eric Christophercbbd5b12012-08-23 22:52:55 +00001273 // Add the linkage name if we have one.
Michael Gottesmandc42d032013-09-04 04:39:38 +00001274 StringRef LinkageName = SP.getLinkageName();
1275 if (!LinkageName.empty())
Eric Christophercbbd5b12012-08-23 22:52:55 +00001276 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c2b4be2013-06-01 17:51:14 +00001277 GlobalValue::getRealLinkageName(LinkageName));
Eric Christophercbbd5b12012-08-23 22:52:55 +00001278
Devang Pateldbc64af2011-08-15 17:24:54 +00001279 // Constructors and operators for anonymous aggregates do not have names.
1280 if (!SP.getName().empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001281 addString(SPDie, dwarf::DW_AT_name, SP.getName());
Devang Pateldbc64af2011-08-15 17:24:54 +00001282
1283 addSourceLine(SPDie, SP);
1284
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001285 // Add the prototype if we have a prototype and we have a C like
1286 // language.
Eric Christopher7b878952013-08-26 23:50:38 +00001287 uint16_t Language = DICompileUnit(Node).getLanguage();
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001288 if (SP.isPrototyped() &&
1289 (Language == dwarf::DW_LANG_C89 ||
1290 Language == dwarf::DW_LANG_C99 ||
1291 Language == dwarf::DW_LANG_ObjC))
Eric Christopher873cf0a2012-08-24 01:14:27 +00001292 addFlag(SPDie, dwarf::DW_AT_prototyped);
Devang Pateldbc64af2011-08-15 17:24:54 +00001293
Eric Christopherdc1363f2013-08-08 07:40:37 +00001294 // Add Return Type. A void return type will not have a type.
Devang Pateldbc64af2011-08-15 17:24:54 +00001295 DICompositeType SPTy = SP.getType();
David Blaikie3d331842013-05-22 23:22:18 +00001296 assert(SPTy.getTag() == dwarf::DW_TAG_subroutine_type &&
1297 "the type of a subprogram should be a subroutine");
Devang Pateldbc64af2011-08-15 17:24:54 +00001298
David Blaikie3d331842013-05-22 23:22:18 +00001299 DIArray Args = SPTy.getTypeArray();
Eric Christopherdc1363f2013-08-08 07:40:37 +00001300 if (Args.getElement(0))
1301 addType(SPDie, DIType(Args.getElement(0)));
Devang Pateldbc64af2011-08-15 17:24:54 +00001302
1303 unsigned VK = SP.getVirtuality();
1304 if (VK) {
Nick Lewycky798313d2011-12-14 00:56:07 +00001305 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
Devang Pateldbc64af2011-08-15 17:24:54 +00001306 DIEBlock *Block = getDIEBlock();
1307 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1308 addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex());
1309 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
1310 ContainingTypeMap.insert(std::make_pair(SPDie,
Manman Ren0e85f6e2013-09-07 00:04:05 +00001311 DD->resolve(SP.getContainingType())));
Devang Pateldbc64af2011-08-15 17:24:54 +00001312 }
1313
1314 if (!SP.isDefinition()) {
Eric Christopher873cf0a2012-08-24 01:14:27 +00001315 addFlag(SPDie, dwarf::DW_AT_declaration);
Eric Christopher8b4310b2012-11-21 00:34:38 +00001316
Devang Pateldbc64af2011-08-15 17:24:54 +00001317 // Add arguments. Do not add arguments for subprogram definition. They will
1318 // be handled while processing variables.
David Blaikie3d331842013-05-22 23:22:18 +00001319 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1320 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1321 DIType ATy = DIType(Args.getElement(i));
1322 addType(Arg, ATy);
1323 if (ATy.isArtificial())
1324 addFlag(Arg, dwarf::DW_AT_artificial);
1325 SPDie->addChild(Arg);
1326 }
Devang Pateldbc64af2011-08-15 17:24:54 +00001327 }
1328
1329 if (SP.isArtificial())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001330 addFlag(SPDie, dwarf::DW_AT_artificial);
Devang Pateldbc64af2011-08-15 17:24:54 +00001331
1332 if (!SP.isLocalToUnit())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001333 addFlag(SPDie, dwarf::DW_AT_external);
Devang Pateldbc64af2011-08-15 17:24:54 +00001334
1335 if (SP.isOptimized())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001336 addFlag(SPDie, dwarf::DW_AT_APPLE_optimized);
Devang Pateldbc64af2011-08-15 17:24:54 +00001337
1338 if (unsigned isa = Asm->getISAEncoding()) {
1339 addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1340 }
1341
1342 return SPDie;
1343}
1344
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001345// Return const expression if value is a GEP to access merged global
1346// constant. e.g.
1347// i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
1348static const ConstantExpr *getMergedGlobalExpr(const Value *V) {
1349 const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
1350 if (!CE || CE->getNumOperands() != 3 ||
1351 CE->getOpcode() != Instruction::GetElementPtr)
1352 return NULL;
1353
1354 // First operand points to a global struct.
1355 Value *Ptr = CE->getOperand(0);
1356 if (!isa<GlobalValue>(Ptr) ||
1357 !isa<StructType>(cast<PointerType>(Ptr->getType())->getElementType()))
1358 return NULL;
1359
1360 // Second operand is zero.
1361 const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
1362 if (!CI || !CI->isZero())
1363 return NULL;
1364
1365 // Third operand is offset.
1366 if (!isa<ConstantInt>(CE->getOperand(2)))
1367 return NULL;
1368
1369 return CE;
1370}
1371
1372/// createGlobalVariableDIE - create global variable DIE.
1373void CompileUnit::createGlobalVariableDIE(const MDNode *N) {
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001374 // Check for pre-existence.
Devang Patel49e2f032011-08-18 22:21:50 +00001375 if (getDIE(N))
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001376 return;
1377
Devang Patel49e2f032011-08-18 22:21:50 +00001378 DIGlobalVariable GV(N);
Manman Rend03d2b22013-07-08 18:33:29 +00001379 if (!GV.isGlobalVariable())
Devang Patel28bea082011-08-18 23:17:55 +00001380 return;
1381
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001382 DIDescriptor GVContext = GV.getContext();
Eric Christopher6b6061f2013-01-16 01:22:23 +00001383 DIType GTy = GV.getType();
1384
1385 // If this is a static data member definition, some attributes belong
1386 // to the declaration DIE.
1387 DIE *VariableDIE = NULL;
Manman Ren945e8282013-02-01 23:54:37 +00001388 bool IsStaticMember = false;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001389 DIDerivedType SDMDecl = GV.getStaticDataMemberDeclaration();
1390 if (SDMDecl.Verify()) {
1391 assert(SDMDecl.isStaticMember() && "Expected static member decl");
1392 // We need the declaration DIE that is in the static member's class.
1393 // But that class might not exist in the DWARF yet.
1394 // Creating the class will create the static member decl DIE.
Manman Ren2c9905a2013-09-09 19:47:11 +00001395 getOrCreateContextDIE(DD->resolve(SDMDecl.getContext()));
Eric Christopher6b6061f2013-01-16 01:22:23 +00001396 VariableDIE = getDIE(SDMDecl);
1397 assert(VariableDIE && "Static member decl has no context?");
Manman Ren945e8282013-02-01 23:54:37 +00001398 IsStaticMember = true;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001399 }
1400
1401 // If this is not a static data member definition, create the variable
1402 // DIE and add the initial set of attributes to it.
1403 if (!VariableDIE) {
1404 VariableDIE = new DIE(GV.getTag());
1405 // Add to map.
1406 insertDIE(N, VariableDIE);
1407
1408 // Add name and type.
1409 addString(VariableDIE, dwarf::DW_AT_name, GV.getDisplayName());
1410 addType(VariableDIE, GTy);
1411
1412 // Add scoping info.
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00001413 if (!GV.isLocalToUnit()) {
Eric Christopher6b6061f2013-01-16 01:22:23 +00001414 addFlag(VariableDIE, dwarf::DW_AT_external);
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00001415 addGlobalName(GV.getName(), VariableDIE);
1416 }
Eric Christopher6b6061f2013-01-16 01:22:23 +00001417
1418 // Add line number info.
1419 addSourceLine(VariableDIE, GV);
1420 // Add to context owner.
1421 addToContextOwner(VariableDIE, GVContext);
1422 }
1423
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001424 // Add location.
Eric Christopher09ac3d82011-11-07 09:24:32 +00001425 bool addToAccelTable = false;
Eric Christopherd61c34b2011-11-11 03:16:32 +00001426 DIE *VariableSpecDIE = NULL;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001427 bool isGlobalVariable = GV.getGlobal() != NULL;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001428 if (isGlobalVariable) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001429 addToAccelTable = true;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001430 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
David Blaikie59eaa382013-06-28 20:05:11 +00001431 const MCSymbol *Sym = Asm->Mang->getSymbol(GV.getGlobal());
1432 if (GV.getGlobal()->isThreadLocal()) {
1433 // FIXME: Make this work with -gsplit-dwarf.
1434 unsigned PointerSize = Asm->getDataLayout().getPointerSize();
1435 assert((PointerSize == 4 || PointerSize == 8) &&
1436 "Add support for other sizes if necessary");
Ulrich Weigand716a94f2013-07-02 18:47:09 +00001437 const MCExpr *Expr =
David Blaikie8fed05e2013-07-01 23:55:52 +00001438 Asm->getObjFileLowering().getDebugThreadLocalSymbol(Sym);
David Blaikie59eaa382013-06-28 20:05:11 +00001439 // Based on GCC's support for TLS:
David Blaikie8fed05e2013-07-01 23:55:52 +00001440 if (!DD->useSplitDwarf()) {
1441 // 1) Start with a constNu of the appropriate pointer size
1442 addUInt(Block, 0, dwarf::DW_FORM_data1,
1443 PointerSize == 4 ? dwarf::DW_OP_const4u : dwarf::DW_OP_const8u);
1444 // 2) containing the (relocated) address of the TLS variable
Ulrich Weigand716a94f2013-07-02 18:47:09 +00001445 addExpr(Block, 0, dwarf::DW_FORM_udata, Expr);
David Blaikie8fed05e2013-07-01 23:55:52 +00001446 } else {
1447 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_const_index);
Ulrich Weigand716a94f2013-07-02 18:47:09 +00001448 addUInt(Block, 0, dwarf::DW_FORM_udata, DU->getAddrPoolIndex(Expr));
David Blaikie8fed05e2013-07-01 23:55:52 +00001449 }
David Blaikie59eaa382013-06-28 20:05:11 +00001450 // 3) followed by a custom OP to tell the debugger about TLS (presumably)
1451 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_lo_user);
1452 } else
1453 addOpAddress(Block, Sym);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001454 // Do not create specification DIE if context is either compile unit
1455 // or a subprogram.
Devang Patel1dd4e562011-09-21 23:41:11 +00001456 if (GVContext && GV.isDefinition() && !GVContext.isCompileUnit() &&
Manman Ren02d29672013-09-09 19:05:21 +00001457 !GVContext.isFile() && !DD->isSubprogramContext(GVContext)) {
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001458 // Create specification DIE.
Eric Christopherd117fbb2011-11-11 01:55:22 +00001459 VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001460 addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
1461 dwarf::DW_FORM_ref4, VariableDIE);
1462 addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001463 // A static member's declaration is already flagged as such.
1464 if (!SDMDecl.Verify())
1465 addFlag(VariableDIE, dwarf::DW_AT_declaration);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001466 addDie(VariableSpecDIE);
1467 } else {
1468 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001469 }
Michael Gottesmandc42d032013-09-04 04:39:38 +00001470 // Add the linkage name.
Eric Christopher6b6061f2013-01-16 01:22:23 +00001471 StringRef LinkageName = GV.getLinkageName();
Michael Gottesmandc42d032013-09-04 04:39:38 +00001472 if (!LinkageName.empty())
Eric Christopher8d45a982013-02-27 23:49:47 +00001473 // From DWARF4: DIEs to which DW_AT_linkage_name may apply include:
1474 // TAG_common_block, TAG_constant, TAG_entry_point, TAG_subprogram and
1475 // TAG_variable.
Manman Ren21a08a12013-02-27 23:21:02 +00001476 addString(IsStaticMember && VariableSpecDIE ?
1477 VariableSpecDIE : VariableDIE, dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c2b4be2013-06-01 17:51:14 +00001478 GlobalValue::getRealLinkageName(LinkageName));
Eric Christopher8b4310b2012-11-21 00:34:38 +00001479 } else if (const ConstantInt *CI =
Manman Ren945e8282013-02-01 23:54:37 +00001480 dyn_cast_or_null<ConstantInt>(GV.getConstant())) {
Adrian Prantl2e892e42013-04-04 22:56:49 +00001481 // AT_const_value was added when the static member was created. To avoid
Manman Ren945e8282013-02-01 23:54:37 +00001482 // emitting AT_const_value multiple times, we only add AT_const_value when
1483 // it is not a static member.
1484 if (!IsStaticMember)
1485 addConstantValue(VariableDIE, CI, GTy.isUnsignedDIType());
1486 } else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001487 addToAccelTable = true;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001488 // GV is a merged global.
1489 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1490 Value *Ptr = CE->getOperand(0);
Eric Christopher0969ddf2013-01-18 22:11:33 +00001491 addOpAddress(Block, Asm->Mang->getSymbol(cast<GlobalValue>(Ptr)));
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001492 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1493 SmallVector<Value*, 3> Idx(CE->op_begin()+1, CE->op_end());
Eric Christopher8b4310b2012-11-21 00:34:38 +00001494 addUInt(Block, 0, dwarf::DW_FORM_udata,
Micah Villmow3574eca2012-10-08 16:38:25 +00001495 Asm->getDataLayout().getIndexedOffset(Ptr->getType(), Idx));
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001496 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1497 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
1498 }
1499
Eric Christopherd117fbb2011-11-11 01:55:22 +00001500 if (addToAccelTable) {
1501 DIE *AddrDIE = VariableSpecDIE ? VariableSpecDIE : VariableDIE;
1502 addAccelName(GV.getName(), AddrDIE);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001503
Eric Christopherd117fbb2011-11-11 01:55:22 +00001504 // If the linkage name is different than the name, go ahead and output
1505 // that as well into the name table.
1506 if (GV.getLinkageName() != "" && GV.getName() != GV.getLinkageName())
1507 addAccelName(GV.getLinkageName(), AddrDIE);
1508 }
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001509}
1510
Devang Patel161b2f42011-04-12 23:21:44 +00001511/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
Eric Christopher4d069bf2012-05-22 18:45:24 +00001512void CompileUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR,
1513 DIE *IndexTy) {
Devang Patel161b2f42011-04-12 23:21:44 +00001514 DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
1515 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
Devang Patel161b2f42011-04-12 23:21:44 +00001516
Bill Wendling222c2fd2012-12-06 07:38:10 +00001517 // The LowerBound value defines the lower bounds which is typically zero for
1518 // C/C++. The Count value is the number of elements. Values are 64 bit. If
1519 // Count == -1 then the array is unbounded and we do not emit
1520 // DW_AT_lower_bound and DW_AT_upper_bound attributes. If LowerBound == 0 and
1521 // Count == 0, then the array has zero elements in which case we do not emit
1522 // an upper bound.
1523 int64_t LowerBound = SR.getLo();
Bill Wendling6afe4782012-12-06 07:55:19 +00001524 int64_t DefaultLowerBound = getDefaultLowerBound();
Bill Wendling9493dae2012-12-04 21:34:03 +00001525 int64_t Count = SR.getCount();
Devang Patel161b2f42011-04-12 23:21:44 +00001526
Bill Wendling6afe4782012-12-06 07:55:19 +00001527 if (DefaultLowerBound == -1 || LowerBound != DefaultLowerBound)
Bill Wendling222c2fd2012-12-06 07:38:10 +00001528 addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, LowerBound);
1529
1530 if (Count != -1 && Count != 0)
Bill Wendling9493dae2012-12-04 21:34:03 +00001531 // FIXME: An unbounded array should reference the expression that defines
1532 // the array.
Bill Wendling222c2fd2012-12-06 07:38:10 +00001533 addUInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, LowerBound + Count - 1);
Bill Wendling9493dae2012-12-04 21:34:03 +00001534
Devang Patel161b2f42011-04-12 23:21:44 +00001535 Buffer.addChild(DW_Subrange);
1536}
1537
1538/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
1539void CompileUnit::constructArrayTypeDIE(DIE &Buffer,
1540 DICompositeType *CTy) {
1541 Buffer.setTag(dwarf::DW_TAG_array_type);
Eric Christopher9a1e0e22013-01-08 01:53:52 +00001542 if (CTy->isVector())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001543 addFlag(&Buffer, dwarf::DW_AT_GNU_vector);
Devang Patel161b2f42011-04-12 23:21:44 +00001544
Eric Christopherdc1363f2013-08-08 07:40:37 +00001545 // Emit the element type.
Devang Patel161b2f42011-04-12 23:21:44 +00001546 addType(&Buffer, CTy->getTypeDerivedFrom());
Devang Patel161b2f42011-04-12 23:21:44 +00001547
1548 // Get an anonymous type for index type.
Eric Christopher8cab6ed2013-01-04 21:51:53 +00001549 // FIXME: This type should be passed down from the front end
1550 // as different languages may have different sizes for indexes.
Devang Patel161b2f42011-04-12 23:21:44 +00001551 DIE *IdxTy = getIndexTyDie();
1552 if (!IdxTy) {
1553 // Construct an anonymous type for index type.
1554 IdxTy = new DIE(dwarf::DW_TAG_base_type);
Eric Christopher8cab6ed2013-01-04 21:51:53 +00001555 addString(IdxTy, dwarf::DW_AT_name, "int");
Devang Patel161b2f42011-04-12 23:21:44 +00001556 addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1557 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1558 dwarf::DW_ATE_signed);
1559 addDie(IdxTy);
1560 setIndexTyDie(IdxTy);
1561 }
1562
1563 // Add subranges to array type.
Eric Christopherdc1363f2013-08-08 07:40:37 +00001564 DIArray Elements = CTy->getTypeArray();
Devang Patel161b2f42011-04-12 23:21:44 +00001565 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1566 DIDescriptor Element = Elements.getElement(i);
1567 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1568 constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1569 }
1570}
1571
1572/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
1573DIE *CompileUnit::constructEnumTypeDIE(DIEnumerator ETy) {
1574 DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
1575 StringRef Name = ETy.getName();
Nick Lewycky390c40d2011-10-27 06:44:11 +00001576 addString(Enumerator, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001577 int64_t Value = ETy.getEnumValue();
1578 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
1579 return Enumerator;
1580}
1581
Devang Pateldbc64af2011-08-15 17:24:54 +00001582/// constructContainingTypeDIEs - Construct DIEs for types that contain
1583/// vtables.
1584void CompileUnit::constructContainingTypeDIEs() {
1585 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
1586 CE = ContainingTypeMap.end(); CI != CE; ++CI) {
1587 DIE *SPDie = CI->first;
1588 const MDNode *N = CI->second;
1589 if (!N) continue;
1590 DIE *NDie = getDIE(N);
1591 if (!NDie) continue;
1592 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
1593 }
1594}
1595
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001596/// constructVariableDIE - Construct a DIE for the given DbgVariable.
Eric Christopherf61dbc12013-06-24 21:07:27 +00001597DIE *CompileUnit::constructVariableDIE(DbgVariable *DV,
1598 bool isScopeAbstract) {
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001599 StringRef Name = DV->getName();
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001600
1601 // Translate tag to proper Dwarf tag.
Eric Christopher31667622013-08-08 01:41:00 +00001602 uint16_t Tag = DV->getTag();
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001603
1604 // Define variable debug information entry.
1605 DIE *VariableDie = new DIE(Tag);
1606 DbgVariable *AbsVar = DV->getAbstractVariable();
1607 DIE *AbsDIE = AbsVar ? AbsVar->getDIE() : NULL;
Manman Ren742671b2013-05-29 17:16:59 +00001608 if (AbsDIE)
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001609 addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
Manman Ren742671b2013-05-29 17:16:59 +00001610 dwarf::DW_FORM_ref4, AbsDIE);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001611 else {
David Blaikie2883fd42013-08-19 03:34:03 +00001612 if (!Name.empty())
1613 addString(VariableDie, dwarf::DW_AT_name, Name);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001614 addSourceLine(VariableDie, DV->getVariable());
1615 addType(VariableDie, DV->getType());
1616 }
1617
1618 if (DV->isArtificial())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001619 addFlag(VariableDie, dwarf::DW_AT_artificial);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001620
1621 if (isScopeAbstract) {
1622 DV->setDIE(VariableDie);
1623 return VariableDie;
1624 }
1625
1626 // Add variable address.
1627
1628 unsigned Offset = DV->getDotDebugLocOffset();
1629 if (Offset != ~0U) {
Eric Christopherafbe0e22013-06-24 21:34:55 +00001630 addLabel(VariableDie, dwarf::DW_AT_location, dwarf::DW_FORM_data4,
1631 Asm->GetTempSymbol("debug_loc", Offset));
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001632 DV->setDIE(VariableDie);
1633 return VariableDie;
1634 }
1635
Eric Christopher8cf5e742011-10-03 15:49:20 +00001636 // Check if variable is described by a DBG_VALUE instruction.
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001637 if (const MachineInstr *DVInsn = DV->getMInsn()) {
David Blaikie6d9dbd52013-06-16 20:34:15 +00001638 assert(DVInsn->getNumOperands() == 3);
1639 if (DVInsn->getOperand(0).isReg()) {
1640 const MachineOperand RegOp = DVInsn->getOperand(0);
Adrian Prantlb2754912013-07-09 21:44:06 +00001641 // If the second operand is an immediate, this is an indirect value.
Adrian Prantl35176402013-07-09 20:28:37 +00001642 if (DVInsn->getOperand(1).isImm()) {
1643 MachineLocation Location(RegOp.getReg(), DVInsn->getOperand(1).getImm());
Eric Christopherf61dbc12013-06-24 21:07:27 +00001644 addVariableAddress(*DV, VariableDie, Location);
David Blaikie6d9dbd52013-06-16 20:34:15 +00001645 } else if (RegOp.getReg())
Eric Christopherf61dbc12013-06-24 21:07:27 +00001646 addVariableAddress(*DV, VariableDie, MachineLocation(RegOp.getReg()));
David Blaikie6d9dbd52013-06-16 20:34:15 +00001647 } else if (DVInsn->getOperand(0).isImm())
Eric Christophere4721492013-07-03 01:08:30 +00001648 addConstantValue(VariableDie, DVInsn->getOperand(0), DV->getType());
David Blaikie6d9dbd52013-06-16 20:34:15 +00001649 else if (DVInsn->getOperand(0).isFPImm())
Eric Christophere4721492013-07-03 01:08:30 +00001650 addConstantFPValue(VariableDie, DVInsn->getOperand(0));
David Blaikie6d9dbd52013-06-16 20:34:15 +00001651 else if (DVInsn->getOperand(0).isCImm())
Eric Christophere4721492013-07-03 01:08:30 +00001652 addConstantValue(VariableDie, DVInsn->getOperand(0).getCImm(),
1653 DV->getType().isUnsignedDIType());
1654
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001655 DV->setDIE(VariableDie);
1656 return VariableDie;
1657 } else {
1658 // .. else use frame index.
1659 int FI = DV->getFrameIndex();
1660 if (FI != ~0) {
1661 unsigned FrameReg = 0;
1662 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
Eric Christopher8b4310b2012-11-21 00:34:38 +00001663 int Offset =
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001664 TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
1665 MachineLocation Location(FrameReg, Offset);
Eric Christopherf61dbc12013-06-24 21:07:27 +00001666 addVariableAddress(*DV, VariableDie, Location);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001667 }
1668 }
1669
1670 DV->setDIE(VariableDie);
1671 return VariableDie;
1672}
1673
Devang Patel161b2f42011-04-12 23:21:44 +00001674/// createMemberDIE - Create new member DIE.
1675DIE *CompileUnit::createMemberDIE(DIDerivedType DT) {
1676 DIE *MemberDie = new DIE(DT.getTag());
1677 StringRef Name = DT.getName();
1678 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001679 addString(MemberDie, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001680
1681 addType(MemberDie, DT.getTypeDerivedFrom());
1682
1683 addSourceLine(MemberDie, DT);
1684
1685 DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
1686 addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1687
1688 uint64_t Size = DT.getSizeInBits();
1689 uint64_t FieldSize = DT.getOriginalTypeSize();
1690
1691 if (Size != FieldSize) {
1692 // Handle bitfield.
1693 addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
1694 addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1695
1696 uint64_t Offset = DT.getOffsetInBits();
1697 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1698 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1699 uint64_t FieldOffset = (HiMark - FieldSize);
1700 Offset -= FieldOffset;
1701
1702 // Maybe we need to work from the other end.
Micah Villmow3574eca2012-10-08 16:38:25 +00001703 if (Asm->getDataLayout().isLittleEndian())
Devang Patel161b2f42011-04-12 23:21:44 +00001704 Offset = FieldSize - (Offset + Size);
1705 addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
1706
1707 // Here WD_AT_data_member_location points to the anonymous
1708 // field that includes this bit field.
1709 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
1710
1711 } else
1712 // This is not a bitfield.
1713 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1714
1715 if (DT.getTag() == dwarf::DW_TAG_inheritance
1716 && DT.isVirtual()) {
1717
1718 // For C++, virtual base classes are not at fixed offset. Use following
1719 // expression to extract appropriate offset from vtable.
1720 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1721
1722 DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
1723 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1724 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1725 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1726 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1727 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1728 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1729 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1730
1731 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
1732 VBaseLocationDie);
1733 } else
1734 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
1735
1736 if (DT.isProtected())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001737 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001738 dwarf::DW_ACCESS_protected);
1739 else if (DT.isPrivate())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001740 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001741 dwarf::DW_ACCESS_private);
1742 // Otherwise C++ member and base classes are considered public.
Eric Christopher8b4310b2012-11-21 00:34:38 +00001743 else
Nick Lewycky13aaca52011-12-13 05:09:11 +00001744 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001745 dwarf::DW_ACCESS_public);
1746 if (DT.isVirtual())
Nick Lewycky798313d2011-12-14 00:56:07 +00001747 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001748 dwarf::DW_VIRTUALITY_virtual);
Devang Patele9db5e22011-04-16 00:11:51 +00001749
1750 // Objective-C properties.
Devang Patel6588abf2012-02-06 17:49:43 +00001751 if (MDNode *PNode = DT.getObjCProperty())
1752 if (DIEEntry *PropertyDie = getDIEEntry(PNode))
Eric Christopher8b4310b2012-11-21 00:34:38 +00001753 MemberDie->addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4,
Devang Patel6588abf2012-02-06 17:49:43 +00001754 PropertyDie);
1755
David Blaikie01bc2b32012-12-13 22:43:07 +00001756 if (DT.isArtificial())
1757 addFlag(MemberDie, dwarf::DW_AT_artificial);
1758
Devang Patel161b2f42011-04-12 23:21:44 +00001759 return MemberDie;
1760}
Eric Christopher6b6061f2013-01-16 01:22:23 +00001761
1762/// createStaticMemberDIE - Create new DIE for C++ static member.
1763DIE *CompileUnit::createStaticMemberDIE(const DIDerivedType DT) {
1764 if (!DT.Verify())
1765 return NULL;
1766
1767 DIE *StaticMemberDIE = new DIE(DT.getTag());
1768 DIType Ty = DT.getTypeDerivedFrom();
1769
1770 addString(StaticMemberDIE, dwarf::DW_AT_name, DT.getName());
1771 addType(StaticMemberDIE, Ty);
1772 addSourceLine(StaticMemberDIE, DT);
1773 addFlag(StaticMemberDIE, dwarf::DW_AT_external);
1774 addFlag(StaticMemberDIE, dwarf::DW_AT_declaration);
1775
1776 // FIXME: We could omit private if the parent is a class_type, and
1777 // public if the parent is something else.
1778 if (DT.isProtected())
1779 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1780 dwarf::DW_ACCESS_protected);
1781 else if (DT.isPrivate())
1782 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1783 dwarf::DW_ACCESS_private);
1784 else
1785 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1786 dwarf::DW_ACCESS_public);
1787
1788 if (const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(DT.getConstant()))
1789 addConstantValue(StaticMemberDIE, CI, Ty.isUnsignedDIType());
David Blaikie14268412013-01-20 01:18:01 +00001790 if (const ConstantFP *CFP = dyn_cast_or_null<ConstantFP>(DT.getConstant()))
1791 addConstantFPValue(StaticMemberDIE, CFP);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001792
1793 insertDIE(DT, StaticMemberDIE);
1794 return StaticMemberDIE;
1795}