blob: c39320e149fefa0189cf7c11ef6fe71e82b6e06c [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"
Devang Patel6f9d8ff2011-08-15 17:57:41 +000025#include "llvm/Target/Mangler.h"
Devang Patel161b2f42011-04-12 23:21:44 +000026#include "llvm/Target/TargetFrameLowering.h"
27#include "llvm/Target/TargetMachine.h"
David Blaikie59eaa382013-06-28 20:05:11 +000028#include "llvm/Target/TargetLoweringObjectFile.h"
Devang Patel161b2f42011-04-12 23:21:44 +000029#include "llvm/Target/TargetRegisterInfo.h"
Devang Patel161b2f42011-04-12 23:21:44 +000030
31using namespace llvm;
32
33/// CompileUnit - Compile unit constructor.
Eric Christopher7b878952013-08-26 23:50:38 +000034CompileUnit::CompileUnit(unsigned UID, DIE *D, const MDNode *N, AsmPrinter *A,
35 DwarfDebug *DW, DwarfUnits *DWU)
Eric Christophere7099f62013-10-04 19:40:33 +000036 : UniqueID(UID), Node(N), CUDie(D), Asm(A), DD(DW), DU(DWU), IndexTyDie(0) {
Devang Patel161b2f42011-04-12 23:21:44 +000037 DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
Eric Christopher9c57ad22013-05-08 00:58:51 +000038 insertDIE(N, D);
Devang Patel161b2f42011-04-12 23:21:44 +000039}
40
41/// ~CompileUnit - Destructor for compile unit.
42CompileUnit::~CompileUnit() {
43 for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
44 DIEBlocks[j]->~DIEBlock();
45}
46
47/// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
48/// information entry.
49DIEEntry *CompileUnit::createDIEEntry(DIE *Entry) {
50 DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
51 return Value;
52}
53
Bill Wendling6afe4782012-12-06 07:55:19 +000054/// getDefaultLowerBound - Return the default lower bound for an array. If the
Bill Wendling222c2fd2012-12-06 07:38:10 +000055/// DWARF version doesn't handle the language, return -1.
Bill Wendling6afe4782012-12-06 07:55:19 +000056int64_t CompileUnit::getDefaultLowerBound() const {
Eric Christopher7b878952013-08-26 23:50:38 +000057 switch (DICompileUnit(Node).getLanguage()) {
Bill Wendling222c2fd2012-12-06 07:38:10 +000058 default:
59 break;
60
61 case dwarf::DW_LANG_C89:
62 case dwarf::DW_LANG_C99:
63 case dwarf::DW_LANG_C:
64 case dwarf::DW_LANG_C_plus_plus:
65 case dwarf::DW_LANG_ObjC:
66 case dwarf::DW_LANG_ObjC_plus_plus:
67 return 0;
68
69 case dwarf::DW_LANG_Fortran77:
70 case dwarf::DW_LANG_Fortran90:
71 case dwarf::DW_LANG_Fortran95:
72 return 1;
73
74 // The languages below have valid values only if the DWARF version >= 4.
75 case dwarf::DW_LANG_Java:
76 case dwarf::DW_LANG_Python:
77 case dwarf::DW_LANG_UPC:
78 case dwarf::DW_LANG_D:
79 if (dwarf::DWARF_VERSION >= 4)
80 return 0;
81 break;
82
83 case dwarf::DW_LANG_Ada83:
84 case dwarf::DW_LANG_Ada95:
85 case dwarf::DW_LANG_Cobol74:
86 case dwarf::DW_LANG_Cobol85:
87 case dwarf::DW_LANG_Modula2:
88 case dwarf::DW_LANG_Pascal83:
89 case dwarf::DW_LANG_PLI:
90 if (dwarf::DWARF_VERSION >= 4)
91 return 1;
92 break;
93 }
94
95 return -1;
96}
97
Eric Christopher873cf0a2012-08-24 01:14:27 +000098/// addFlag - Add a flag that is true.
Eric Christopher31667622013-08-08 01:41:00 +000099void CompileUnit::addFlag(DIE *Die, uint16_t Attribute) {
Michael Gottesmandc42d032013-09-04 04:39:38 +0000100 if (DD->getDwarfVersion() >= 4)
Eric Christopher9c0c9482013-10-04 22:40:05 +0000101 Die->addValue(Attribute, dwarf::DW_FORM_flag_present, DIEIntegerOne);
Eric Christopher873cf0a2012-08-24 01:14:27 +0000102 else
Eric Christopher9c0c9482013-10-04 22:40:05 +0000103 Die->addValue(Attribute, dwarf::DW_FORM_flag, DIEIntegerOne);
Eric Christopher873cf0a2012-08-24 01:14:27 +0000104}
105
Devang Patel161b2f42011-04-12 23:21:44 +0000106/// addUInt - Add an unsigned integer attribute data and value.
107///
Eric Christopher31667622013-08-08 01:41:00 +0000108void CompileUnit::addUInt(DIE *Die, uint16_t Attribute,
109 uint16_t Form, uint64_t Integer) {
Devang Patel161b2f42011-04-12 23:21:44 +0000110 if (!Form) Form = DIEInteger::BestForm(false, Integer);
111 DIEValue *Value = Integer == 1 ?
112 DIEIntegerOne : new (DIEValueAllocator) DIEInteger(Integer);
113 Die->addValue(Attribute, Form, Value);
114}
115
116/// addSInt - Add an signed integer attribute data and value.
117///
Eric Christopher31667622013-08-08 01:41:00 +0000118void CompileUnit::addSInt(DIE *Die, uint16_t Attribute,
119 uint16_t Form, int64_t Integer) {
Devang Patel161b2f42011-04-12 23:21:44 +0000120 if (!Form) Form = DIEInteger::BestForm(true, Integer);
121 DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
122 Die->addValue(Attribute, Form, Value);
123}
124
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000125/// addString - Add a string attribute data and value. We always emit a
126/// reference to the string pool instead of immediate strings so that DIEs have
Eric Christopher3cc42202013-01-07 19:32:45 +0000127/// more predictable sizes. In the case of split dwarf we emit an index
128/// into another table which gets us the static offset into the string
129/// table.
Eric Christopher31667622013-08-08 01:41:00 +0000130void CompileUnit::addString(DIE *Die, uint16_t Attribute, StringRef String) {
Eric Christopher3dee5752013-07-26 17:02:41 +0000131 DIEValue *Value;
Eric Christopher31667622013-08-08 01:41:00 +0000132 uint16_t Form;
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000133 if (!DD->useSplitDwarf()) {
134 MCSymbol *Symb = DU->getStringPoolEntry(String);
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000135 if (Asm->needsRelocationsForDwarfStringPool())
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000136 Value = new (DIEValueAllocator) DIELabel(Symb);
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000137 else {
138 MCSymbol *StringPool = DU->getStringPoolSym();
139 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
140 }
Eric Christopher3dee5752013-07-26 17:02:41 +0000141 Form = dwarf::DW_FORM_strp;
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000142 } else {
143 unsigned idx = DU->getStringPoolIndex(String);
Eric Christopher3dee5752013-07-26 17:02:41 +0000144 Value = new (DIEValueAllocator) DIEInteger(idx);
145 Form = dwarf::DW_FORM_GNU_str_index;
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000146 }
Eric Christopher3dee5752013-07-26 17:02:41 +0000147 DIEValue *Str = new (DIEValueAllocator) DIEString(Value, String);
148 Die->addValue(Attribute, Form, Str);
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000149}
150
151/// addLocalString - Add a string attribute data and value. This is guaranteed
152/// to be in the local string pool instead of indirected.
Eric Christopher31667622013-08-08 01:41:00 +0000153void CompileUnit::addLocalString(DIE *Die, uint16_t Attribute,
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000154 StringRef String) {
Eric Christopher2e5d8702012-12-20 21:58:36 +0000155 MCSymbol *Symb = DU->getStringPoolEntry(String);
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000156 DIEValue *Value;
157 if (Asm->needsRelocationsForDwarfStringPool())
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000158 Value = new (DIEValueAllocator) DIELabel(Symb);
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000159 else {
Eric Christopher2e5d8702012-12-20 21:58:36 +0000160 MCSymbol *StringPool = DU->getStringPoolSym();
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000161 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
Nick Lewycky390c40d2011-10-27 06:44:11 +0000162 }
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000163 Die->addValue(Attribute, dwarf::DW_FORM_strp, Value);
Devang Patel161b2f42011-04-12 23:21:44 +0000164}
165
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000166/// addExpr - Add a Dwarf expression attribute data and value.
Devang Patel161b2f42011-04-12 23:21:44 +0000167///
Eric Christopher31667622013-08-08 01:41:00 +0000168void CompileUnit::addExpr(DIE *Die, uint16_t Attribute, uint16_t Form,
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000169 const MCExpr *Expr) {
170 DIEValue *Value = new (DIEValueAllocator) DIEExpr(Expr);
Devang Patel161b2f42011-04-12 23:21:44 +0000171 Die->addValue(Attribute, Form, Value);
172}
173
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000174/// addLabel - Add a Dwarf label attribute data and value.
175///
Eric Christopher31667622013-08-08 01:41:00 +0000176void CompileUnit::addLabel(DIE *Die, uint16_t Attribute, uint16_t Form,
David Blaikie95e72c92013-06-28 20:05:04 +0000177 const MCSymbol *Label) {
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000178 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
179 Die->addValue(Attribute, Form, Value);
David Blaikie95e72c92013-06-28 20:05:04 +0000180}
181
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000182/// addLabelAddress - Add a dwarf label attribute data and value using
183/// DW_FORM_addr or DW_FORM_GNU_addr_index.
184///
Eric Christopher31667622013-08-08 01:41:00 +0000185void CompileUnit::addLabelAddress(DIE *Die, uint16_t Attribute,
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000186 MCSymbol *Label) {
Alexey Samsonov9d08d692013-10-03 08:54:43 +0000187 if (Label)
188 DD->addArangeLabel(SymbolCU(this, Label));
Richard Mitton5cc319a2013-09-19 23:21:01 +0000189
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000190 if (!DD->useSplitDwarf()) {
191 if (Label != NULL) {
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000192 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000193 Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
194 } else {
195 DIEValue *Value = new (DIEValueAllocator) DIEInteger(0);
196 Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
197 }
198 } else {
199 unsigned idx = DU->getAddrPoolIndex(Label);
200 DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx);
201 Die->addValue(Attribute, dwarf::DW_FORM_GNU_addr_index, Value);
202 }
203}
204
Eric Christopher0969ddf2013-01-18 22:11:33 +0000205/// addOpAddress - Add a dwarf op address data and value using the
206/// form given and an op of either DW_FORM_addr or DW_FORM_GNU_addr_index.
207///
David Blaikie95e72c92013-06-28 20:05:04 +0000208void CompileUnit::addOpAddress(DIE *Die, const MCSymbol *Sym) {
Alexey Samsonov9d08d692013-10-03 08:54:43 +0000209 DD->addArangeLabel(SymbolCU(this, Sym));
Eric Christopher0969ddf2013-01-18 22:11:33 +0000210 if (!DD->useSplitDwarf()) {
211 addUInt(Die, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
212 addLabel(Die, 0, dwarf::DW_FORM_udata, Sym);
213 } else {
Eric Christopher0969ddf2013-01-18 22:11:33 +0000214 addUInt(Die, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_addr_index);
David Blaikie8fed05e2013-07-01 23:55:52 +0000215 addUInt(Die, 0, dwarf::DW_FORM_GNU_addr_index, DU->getAddrPoolIndex(Sym));
Eric Christopher0969ddf2013-01-18 22:11:33 +0000216 }
217}
218
Devang Patel161b2f42011-04-12 23:21:44 +0000219/// addDelta - Add a label delta attribute data and value.
220///
Eric Christopher31667622013-08-08 01:41:00 +0000221void CompileUnit::addDelta(DIE *Die, uint16_t Attribute, uint16_t Form,
Devang Patel161b2f42011-04-12 23:21:44 +0000222 const MCSymbol *Hi, const MCSymbol *Lo) {
223 DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
224 Die->addValue(Attribute, Form, Value);
225}
226
227/// addDIEEntry - Add a DIE attribute data and value.
228///
Manman Ren87b110a2013-10-11 23:58:05 +0000229void CompileUnit::addDIEEntry(DIE *Die, uint16_t Attribute, DIE *Entry) {
230 // We currently only use ref4.
231 Die->addValue(Attribute, dwarf::DW_FORM_ref4, createDIEEntry(Entry));
Devang Patel161b2f42011-04-12 23:21:44 +0000232}
233
Devang Patel161b2f42011-04-12 23:21:44 +0000234/// addBlock - Add block data.
235///
Eric Christopher31667622013-08-08 01:41:00 +0000236void CompileUnit::addBlock(DIE *Die, uint16_t Attribute, uint16_t Form,
Devang Patel161b2f42011-04-12 23:21:44 +0000237 DIEBlock *Block) {
238 Block->ComputeSize(Asm);
239 DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
240 Die->addValue(Attribute, Block->BestForm(), Block);
241}
242
243/// addSourceLine - Add location information to specified debug information
244/// entry.
245void CompileUnit::addSourceLine(DIE *Die, DIVariable V) {
246 // Verify variable.
Manman Rend03d2b22013-07-08 18:33:29 +0000247 if (!V.isVariable())
Devang Patel161b2f42011-04-12 23:21:44 +0000248 return;
Eric Christopher8b4310b2012-11-21 00:34:38 +0000249
Devang Patel161b2f42011-04-12 23:21:44 +0000250 unsigned Line = V.getLineNumber();
251 if (Line == 0)
252 return;
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000253 unsigned FileID = DD->getOrCreateSourceID(V.getContext().getFilename(),
Manman Ren3de61b42013-03-07 01:42:00 +0000254 V.getContext().getDirectory(),
255 getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000256 assert(FileID && "Invalid file id");
257 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
258 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
259}
260
261/// addSourceLine - Add location information to specified debug information
262/// entry.
263void CompileUnit::addSourceLine(DIE *Die, DIGlobalVariable G) {
264 // Verify global variable.
Manman Rend03d2b22013-07-08 18:33:29 +0000265 if (!G.isGlobalVariable())
Devang Patel161b2f42011-04-12 23:21:44 +0000266 return;
267
268 unsigned Line = G.getLineNumber();
269 if (Line == 0)
270 return;
Manman Ren3de61b42013-03-07 01:42:00 +0000271 unsigned FileID = DD->getOrCreateSourceID(G.getFilename(), G.getDirectory(),
272 getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000273 assert(FileID && "Invalid file id");
274 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
275 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
276}
277
278/// addSourceLine - Add location information to specified debug information
279/// entry.
280void CompileUnit::addSourceLine(DIE *Die, DISubprogram SP) {
281 // Verify subprogram.
Manman Rend03d2b22013-07-08 18:33:29 +0000282 if (!SP.isSubprogram())
Devang Patel161b2f42011-04-12 23:21:44 +0000283 return;
Eric Christopher2125d5a2012-03-15 23:55:40 +0000284
Devang Patel161b2f42011-04-12 23:21:44 +0000285 // If the line number is 0, don't add it.
Eric Christopher2125d5a2012-03-15 23:55:40 +0000286 unsigned Line = SP.getLineNumber();
287 if (Line == 0)
Devang Patel161b2f42011-04-12 23:21:44 +0000288 return;
289
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000290 unsigned FileID = DD->getOrCreateSourceID(SP.getFilename(),
Manman Ren3de61b42013-03-07 01:42:00 +0000291 SP.getDirectory(), getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000292 assert(FileID && "Invalid file id");
293 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
294 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
295}
296
297/// addSourceLine - Add location information to specified debug information
298/// entry.
299void CompileUnit::addSourceLine(DIE *Die, DIType Ty) {
300 // Verify type.
Manman Rend03d2b22013-07-08 18:33:29 +0000301 if (!Ty.isType())
Devang Patel161b2f42011-04-12 23:21:44 +0000302 return;
303
304 unsigned Line = Ty.getLineNumber();
Eric Christopher2125d5a2012-03-15 23:55:40 +0000305 if (Line == 0)
Devang Patel161b2f42011-04-12 23:21:44 +0000306 return;
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000307 unsigned FileID = DD->getOrCreateSourceID(Ty.getFilename(),
Manman Ren3de61b42013-03-07 01:42:00 +0000308 Ty.getDirectory(), getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000309 assert(FileID && "Invalid file id");
310 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
311 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
312}
313
314/// addSourceLine - Add location information to specified debug information
315/// entry.
Eric Christopherb8ca9882012-03-29 08:42:56 +0000316void CompileUnit::addSourceLine(DIE *Die, DIObjCProperty Ty) {
317 // Verify type.
Manman Rend03d2b22013-07-08 18:33:29 +0000318 if (!Ty.isObjCProperty())
Eric Christopherb8ca9882012-03-29 08:42:56 +0000319 return;
320
321 unsigned Line = Ty.getLineNumber();
322 if (Line == 0)
323 return;
324 DIFile File = Ty.getFile();
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000325 unsigned FileID = DD->getOrCreateSourceID(File.getFilename(),
Manman Ren3de61b42013-03-07 01:42:00 +0000326 File.getDirectory(), getUniqueID());
Eric Christopherb8ca9882012-03-29 08:42:56 +0000327 assert(FileID && "Invalid file id");
328 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
329 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
330}
331
332/// addSourceLine - Add location information to specified debug information
333/// entry.
Devang Patel161b2f42011-04-12 23:21:44 +0000334void CompileUnit::addSourceLine(DIE *Die, DINameSpace NS) {
335 // Verify namespace.
336 if (!NS.Verify())
337 return;
338
339 unsigned Line = NS.getLineNumber();
340 if (Line == 0)
341 return;
342 StringRef FN = NS.getFilename();
343
Manman Ren3de61b42013-03-07 01:42:00 +0000344 unsigned FileID = DD->getOrCreateSourceID(FN, NS.getDirectory(),
345 getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000346 assert(FileID && "Invalid file id");
347 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
348 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
349}
350
Eric Christopher8b4310b2012-11-21 00:34:38 +0000351/// addVariableAddress - Add DW_AT_location attribute for a
Devang Patele1cdf842011-04-27 22:45:24 +0000352/// DbgVariable based on provided MachineLocation.
Eric Christopherf61dbc12013-06-24 21:07:27 +0000353void CompileUnit::addVariableAddress(const DbgVariable &DV, DIE *Die,
Devang Patele1cdf842011-04-27 22:45:24 +0000354 MachineLocation Location) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000355 if (DV.variableHasComplexAddress())
Devang Patel161b2f42011-04-12 23:21:44 +0000356 addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
Eric Christopherf61dbc12013-06-24 21:07:27 +0000357 else if (DV.isBlockByrefVariable())
Devang Patel161b2f42011-04-12 23:21:44 +0000358 addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location);
359 else
David Blaikie4532c282013-06-20 00:25:24 +0000360 addAddress(Die, dwarf::DW_AT_location, Location,
Eric Christopherf61dbc12013-06-24 21:07:27 +0000361 DV.getVariable().isIndirect());
Devang Patel161b2f42011-04-12 23:21:44 +0000362}
363
Devang Patel116da2f2011-04-26 19:06:18 +0000364/// addRegisterOp - Add register operand.
365void CompileUnit::addRegisterOp(DIE *TheDie, unsigned Reg) {
366 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
367 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
368 if (DWReg < 32)
369 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + DWReg);
370 else {
371 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
372 addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
373 }
374}
375
376/// addRegisterOffset - Add register offset.
377void CompileUnit::addRegisterOffset(DIE *TheDie, unsigned Reg,
378 int64_t Offset) {
379 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
380 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
381 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
382 if (Reg == TRI->getFrameRegister(*Asm->MF))
383 // If variable offset is based in frame register then use fbreg.
384 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
385 else if (DWReg < 32)
386 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DWReg);
387 else {
388 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
389 addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
390 }
391 addSInt(TheDie, 0, dwarf::DW_FORM_sdata, Offset);
392}
393
394/// addAddress - Add an address attribute to a die based on the location
395/// provided.
Eric Christopher31667622013-08-08 01:41:00 +0000396void CompileUnit::addAddress(DIE *Die, uint16_t Attribute,
David Blaikie4532c282013-06-20 00:25:24 +0000397 const MachineLocation &Location, bool Indirect) {
Devang Patel116da2f2011-04-26 19:06:18 +0000398 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
399
David Blaikie4532c282013-06-20 00:25:24 +0000400 if (Location.isReg() && !Indirect)
Devang Patel116da2f2011-04-26 19:06:18 +0000401 addRegisterOp(Block, Location.getReg());
David Blaikie4532c282013-06-20 00:25:24 +0000402 else {
Devang Patel116da2f2011-04-26 19:06:18 +0000403 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
David Blaikie4532c282013-06-20 00:25:24 +0000404 if (Indirect && !Location.isReg()) {
405 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
406 }
407 }
Devang Patel116da2f2011-04-26 19:06:18 +0000408
409 // Now attach the location information to the DIE.
410 addBlock(Die, Attribute, 0, Block);
411}
412
Devang Patel161b2f42011-04-12 23:21:44 +0000413/// addComplexAddress - Start with the address based on the location provided,
414/// and generate the DWARF information necessary to find the actual variable
415/// given the extra address information encoded in the DIVariable, starting from
416/// the starting location. Add the DWARF information to the die.
417///
Eric Christopherf61dbc12013-06-24 21:07:27 +0000418void CompileUnit::addComplexAddress(const DbgVariable &DV, DIE *Die,
Eric Christopher31667622013-08-08 01:41:00 +0000419 uint16_t Attribute,
Devang Patel161b2f42011-04-12 23:21:44 +0000420 const MachineLocation &Location) {
Devang Patel161b2f42011-04-12 23:21:44 +0000421 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Eric Christopherf61dbc12013-06-24 21:07:27 +0000422 unsigned N = DV.getNumAddrElements();
Devang Patelc26f5442011-04-28 02:22:40 +0000423 unsigned i = 0;
424 if (Location.isReg()) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000425 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
Devang Patelc26f5442011-04-28 02:22:40 +0000426 // If first address element is OpPlus then emit
427 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
Eric Christopherf61dbc12013-06-24 21:07:27 +0000428 addRegisterOffset(Block, Location.getReg(), DV.getAddrElement(1));
Devang Patelc26f5442011-04-28 02:22:40 +0000429 i = 2;
430 } else
431 addRegisterOp(Block, Location.getReg());
432 }
Devang Patel116da2f2011-04-26 19:06:18 +0000433 else
434 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel161b2f42011-04-12 23:21:44 +0000435
Devang Patelc26f5442011-04-28 02:22:40 +0000436 for (;i < N; ++i) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000437 uint64_t Element = DV.getAddrElement(i);
Devang Patel161b2f42011-04-12 23:21:44 +0000438 if (Element == DIBuilder::OpPlus) {
439 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
Eric Christopherf61dbc12013-06-24 21:07:27 +0000440 addUInt(Block, 0, dwarf::DW_FORM_udata, DV.getAddrElement(++i));
Devang Patel161b2f42011-04-12 23:21:44 +0000441 } else if (Element == DIBuilder::OpDeref) {
Eric Christopher50120762012-05-08 18:56:00 +0000442 if (!Location.isReg())
443 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Devang Patel161b2f42011-04-12 23:21:44 +0000444 } else llvm_unreachable("unknown DIBuilder Opcode");
445 }
446
447 // Now attach the location information to the DIE.
448 addBlock(Die, Attribute, 0, Block);
449}
450
451/* Byref variables, in Blocks, are declared by the programmer as "SomeType
452 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
453 gives the variable VarName either the struct, or a pointer to the struct, as
454 its type. This is necessary for various behind-the-scenes things the
455 compiler needs to do with by-reference variables in Blocks.
456
457 However, as far as the original *programmer* is concerned, the variable
458 should still have type 'SomeType', as originally declared.
459
460 The function getBlockByrefType dives into the __Block_byref_x_VarName
461 struct to find the original type of the variable, which is then assigned to
462 the variable's Debug Information Entry as its real type. So far, so good.
463 However now the debugger will expect the variable VarName to have the type
464 SomeType. So we need the location attribute for the variable to be an
465 expression that explains to the debugger how to navigate through the
466 pointers and struct to find the actual variable of type SomeType.
467
468 The following function does just that. We start by getting
469 the "normal" location for the variable. This will be the location
470 of either the struct __Block_byref_x_VarName or the pointer to the
471 struct __Block_byref_x_VarName.
472
473 The struct will look something like:
474
475 struct __Block_byref_x_VarName {
476 ... <various fields>
477 struct __Block_byref_x_VarName *forwarding;
478 ... <various other fields>
479 SomeType VarName;
480 ... <maybe more fields>
481 };
482
483 If we are given the struct directly (as our starting point) we
484 need to tell the debugger to:
485
486 1). Add the offset of the forwarding field.
487
488 2). Follow that pointer to get the real __Block_byref_x_VarName
489 struct to use (the real one may have been copied onto the heap).
490
491 3). Add the offset for the field VarName, to find the actual variable.
492
493 If we started with a pointer to the struct, then we need to
494 dereference that pointer first, before the other steps.
495 Translating this into DWARF ops, we will need to append the following
496 to the current location description for the variable:
497
498 DW_OP_deref -- optional, if we start with a pointer
499 DW_OP_plus_uconst <forward_fld_offset>
500 DW_OP_deref
501 DW_OP_plus_uconst <varName_fld_offset>
502
503 That is what this function does. */
504
505/// addBlockByrefAddress - Start with the address based on the location
506/// provided, and generate the DWARF information necessary to find the
507/// actual Block variable (navigating the Block struct) based on the
508/// starting location. Add the DWARF information to the die. For
509/// more information, read large comment just above here.
510///
Eric Christopherf61dbc12013-06-24 21:07:27 +0000511void CompileUnit::addBlockByrefAddress(const DbgVariable &DV, DIE *Die,
Eric Christopher31667622013-08-08 01:41:00 +0000512 uint16_t Attribute,
Devang Patel161b2f42011-04-12 23:21:44 +0000513 const MachineLocation &Location) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000514 DIType Ty = DV.getType();
Devang Patel161b2f42011-04-12 23:21:44 +0000515 DIType TmpTy = Ty;
Eric Christopher31667622013-08-08 01:41:00 +0000516 uint16_t Tag = Ty.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +0000517 bool isPointer = false;
518
Eric Christopherf61dbc12013-06-24 21:07:27 +0000519 StringRef varName = DV.getName();
Devang Patel161b2f42011-04-12 23:21:44 +0000520
521 if (Tag == dwarf::DW_TAG_pointer_type) {
522 DIDerivedType DTy = DIDerivedType(Ty);
Manman Ren017ceda2013-10-08 18:42:58 +0000523 TmpTy = resolve(DTy.getTypeDerivedFrom());
Devang Patel161b2f42011-04-12 23:21:44 +0000524 isPointer = true;
525 }
526
527 DICompositeType blockStruct = DICompositeType(TmpTy);
528
529 // Find the __forwarding field and the variable field in the __Block_byref
530 // struct.
531 DIArray Fields = blockStruct.getTypeArray();
532 DIDescriptor varField = DIDescriptor();
533 DIDescriptor forwardingField = DIDescriptor();
534
535 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
536 DIDescriptor Element = Fields.getElement(i);
537 DIDerivedType DT = DIDerivedType(Element);
538 StringRef fieldName = DT.getName();
539 if (fieldName == "__forwarding")
540 forwardingField = Element;
541 else if (fieldName == varName)
542 varField = Element;
543 }
544
545 // Get the offsets for the forwarding field and the variable field.
546 unsigned forwardingFieldOffset =
547 DIDerivedType(forwardingField).getOffsetInBits() >> 3;
548 unsigned varFieldOffset =
549 DIDerivedType(varField).getOffsetInBits() >> 3;
550
551 // Decode the original location, and use that as the start of the byref
552 // variable's location.
Devang Patel161b2f42011-04-12 23:21:44 +0000553 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
554
Eric Christophercaba2632012-07-04 02:02:18 +0000555 if (Location.isReg())
556 addRegisterOp(Block, Location.getReg());
557 else
558 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel161b2f42011-04-12 23:21:44 +0000559
560 // If we started with a pointer to the __Block_byref... struct, then
561 // the first thing we need to do is dereference the pointer (DW_OP_deref).
562 if (isPointer)
563 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
564
565 // Next add the offset for the '__forwarding' field:
566 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
567 // adding the offset if it's 0.
568 if (forwardingFieldOffset > 0) {
569 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
570 addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
571 }
572
573 // Now dereference the __forwarding field to get to the real __Block_byref
574 // struct: DW_OP_deref.
575 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
576
577 // Now that we've got the real __Block_byref... struct, add the offset
578 // for the variable's field to get to the location of the actual variable:
579 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
580 if (varFieldOffset > 0) {
581 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
582 addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
583 }
584
585 // Now attach the location information to the DIE.
586 addBlock(Die, Attribute, 0, Block);
587}
588
Devang Patel4ec14b02011-07-20 21:57:04 +0000589/// isTypeSigned - Return true if the type is signed.
Manman Renc664d762013-10-05 01:43:03 +0000590static bool isTypeSigned(DwarfDebug *DD, DIType Ty, int *SizeInBits) {
Devang Patel4ec14b02011-07-20 21:57:04 +0000591 if (Ty.isDerivedType())
Manman Renc664d762013-10-05 01:43:03 +0000592 return isTypeSigned(DD, DD->resolve(DIDerivedType(Ty).getTypeDerivedFrom()),
593 SizeInBits);
Devang Patel4ec14b02011-07-20 21:57:04 +0000594 if (Ty.isBasicType())
595 if (DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed
596 || DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed_char) {
597 *SizeInBits = Ty.getSizeInBits();
598 return true;
599 }
600 return false;
601}
602
Manman Renc664d762013-10-05 01:43:03 +0000603/// Return true if type encoding is unsigned.
604static bool isUnsignedDIType(DwarfDebug *DD, DIType Ty) {
605 DIDerivedType DTy(Ty);
606 if (DTy.isDerivedType())
607 return isUnsignedDIType(DD, DD->resolve(DTy.getTypeDerivedFrom()));
608
609 DIBasicType BTy(Ty);
610 if (BTy.isBasicType()) {
611 unsigned Encoding = BTy.getEncoding();
612 if (Encoding == dwarf::DW_ATE_unsigned ||
613 Encoding == dwarf::DW_ATE_unsigned_char ||
614 Encoding == dwarf::DW_ATE_boolean)
615 return true;
616 }
617 return false;
618}
619
620/// If this type is derived from a base type then return base type size.
Manman Ren43251002013-10-08 18:46:58 +0000621static uint64_t getBaseTypeSize(DwarfDebug *DD, DIDerivedType Ty) {
Manman Renc664d762013-10-05 01:43:03 +0000622 unsigned Tag = Ty.getTag();
623
624 if (Tag != dwarf::DW_TAG_member && Tag != dwarf::DW_TAG_typedef &&
625 Tag != dwarf::DW_TAG_const_type && Tag != dwarf::DW_TAG_volatile_type &&
626 Tag != dwarf::DW_TAG_restrict_type)
627 return Ty.getSizeInBits();
628
629 DIType BaseType = DD->resolve(Ty.getTypeDerivedFrom());
630
631 // If this type is not derived from any type then take conservative approach.
632 if (!BaseType.isValid())
633 return Ty.getSizeInBits();
634
635 // If this is a derived type, go ahead and get the base type, unless it's a
636 // reference then it's just the size of the field. Pointer types have no need
637 // of this since they're a different type of qualification on the type.
638 if (BaseType.getTag() == dwarf::DW_TAG_reference_type ||
639 BaseType.getTag() == dwarf::DW_TAG_rvalue_reference_type)
640 return Ty.getSizeInBits();
641
642 if (BaseType.isDerivedType())
Manman Ren43251002013-10-08 18:46:58 +0000643 return getBaseTypeSize(DD, DIDerivedType(BaseType));
Manman Renc664d762013-10-05 01:43:03 +0000644
645 return BaseType.getSizeInBits();
646}
647
Devang Patel161b2f42011-04-12 23:21:44 +0000648/// addConstantValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000649void CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO,
Devang Patelb58128e2011-05-27 16:45:18 +0000650 DIType Ty) {
David Blaikie4de9d722013-05-10 21:52:07 +0000651 // FIXME: This is a bit conservative/simple - it emits negative values at
652 // their maximum bit width which is a bit unfortunate (& doesn't prefer
653 // udata/sdata over dataN as suggested by the DWARF spec)
Nick Lewycky746cb672011-10-26 22:55:33 +0000654 assert(MO.isImm() && "Invalid machine operand!");
Devang Patel4ec14b02011-07-20 21:57:04 +0000655 int SizeInBits = -1;
Manman Renc664d762013-10-05 01:43:03 +0000656 bool SignedConstant = isTypeSigned(DD, Ty, &SizeInBits);
Eric Christopher7b2ee392013-08-27 23:49:04 +0000657 uint16_t Form;
Devang Patel72f0d9c2011-05-27 18:15:52 +0000658
Eric Christopher7b2ee392013-08-27 23:49:04 +0000659 // If we're a signed constant definitely use sdata.
660 if (SignedConstant) {
661 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, MO.getImm());
662 return;
663 }
664
665 // Else use data for now unless it's larger than we can deal with.
666 switch (SizeInBits) {
667 case 8:
668 Form = dwarf::DW_FORM_data1;
669 break;
670 case 16:
671 Form = dwarf::DW_FORM_data2;
672 break;
673 case 32:
674 Form = dwarf::DW_FORM_data4;
675 break;
676 case 64:
677 Form = dwarf::DW_FORM_data8;
678 break;
679 default:
680 Form = dwarf::DW_FORM_udata;
681 addUInt(Die, dwarf::DW_AT_const_value, Form, MO.getImm());
682 return;
683 }
684 addUInt(Die, dwarf::DW_AT_const_value, Form, MO.getImm());
Devang Patel161b2f42011-04-12 23:21:44 +0000685}
686
687/// addConstantFPValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000688void CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
Nick Lewycky390c40d2011-10-27 06:44:11 +0000689 assert (MO.isFPImm() && "Invalid machine operand!");
Devang Patel161b2f42011-04-12 23:21:44 +0000690 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
691 APFloat FPImm = MO.getFPImm()->getValueAPF();
692
693 // Get the raw data form of the floating point.
694 const APInt FltVal = FPImm.bitcastToAPInt();
695 const char *FltPtr = (const char*)FltVal.getRawData();
696
697 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
Micah Villmow3574eca2012-10-08 16:38:25 +0000698 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel161b2f42011-04-12 23:21:44 +0000699 int Incr = (LittleEndian ? 1 : -1);
700 int Start = (LittleEndian ? 0 : NumBytes - 1);
701 int Stop = (LittleEndian ? NumBytes : -1);
702
703 // Output the constant to DWARF one byte at a time.
704 for (; Start != Stop; Start += Incr)
705 addUInt(Block, 0, dwarf::DW_FORM_data1,
706 (unsigned char)0xFF & FltPtr[Start]);
707
708 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
Devang Patel161b2f42011-04-12 23:21:44 +0000709}
710
David Blaikie14268412013-01-20 01:18:01 +0000711/// addConstantFPValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000712void CompileUnit::addConstantFPValue(DIE *Die, const ConstantFP *CFP) {
Eric Christopher7b2ee392013-08-27 23:49:04 +0000713 // Pass this down to addConstantValue as an unsigned bag of bits.
714 addConstantValue(Die, CFP->getValueAPF().bitcastToAPInt(), true);
David Blaikie14268412013-01-20 01:18:01 +0000715}
716
Devang Patel161b2f42011-04-12 23:21:44 +0000717/// addConstantValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000718void CompileUnit::addConstantValue(DIE *Die, const ConstantInt *CI,
Devang Patel161b2f42011-04-12 23:21:44 +0000719 bool Unsigned) {
Eric Christophere4721492013-07-03 01:08:30 +0000720 addConstantValue(Die, CI->getValue(), Unsigned);
David Blaikie14268412013-01-20 01:18:01 +0000721}
722
723// addConstantValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000724void CompileUnit::addConstantValue(DIE *Die, const APInt &Val, bool Unsigned) {
David Blaikie14268412013-01-20 01:18:01 +0000725 unsigned CIBitWidth = Val.getBitWidth();
Devang Pateld6a81362011-05-28 00:39:18 +0000726 if (CIBitWidth <= 64) {
Eric Christopher7b2ee392013-08-27 23:49:04 +0000727 // If we're a signed constant definitely use sdata.
728 if (!Unsigned) {
729 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata,
730 Val.getSExtValue());
731 return;
Devang Pateld6a81362011-05-28 00:39:18 +0000732 }
Eric Christopher7b2ee392013-08-27 23:49:04 +0000733
734 // Else use data for now unless it's larger than we can deal with.
735 uint16_t Form;
736 switch (CIBitWidth) {
737 case 8:
738 Form = dwarf::DW_FORM_data1;
739 break;
740 case 16:
741 Form = dwarf::DW_FORM_data2;
742 break;
743 case 32:
744 Form = dwarf::DW_FORM_data4;
745 break;
746 case 64:
747 Form = dwarf::DW_FORM_data8;
748 break;
749 default:
750 addUInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
751 Val.getZExtValue());
752 return;
753 }
754 addUInt(Die, dwarf::DW_AT_const_value, Form, Val.getZExtValue());
Eric Christophere4721492013-07-03 01:08:30 +0000755 return;
Devang Patel161b2f42011-04-12 23:21:44 +0000756 }
757
758 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
759
760 // Get the raw data form of the large APInt.
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000761 const uint64_t *Ptr64 = Val.getRawData();
Devang Patel161b2f42011-04-12 23:21:44 +0000762
763 int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
Micah Villmow3574eca2012-10-08 16:38:25 +0000764 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel161b2f42011-04-12 23:21:44 +0000765
766 // Output the constant to DWARF one byte at a time.
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000767 for (int i = 0; i < NumBytes; i++) {
768 uint8_t c;
769 if (LittleEndian)
770 c = Ptr64[i / 8] >> (8 * (i & 7));
771 else
772 c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7));
773 addUInt(Block, 0, dwarf::DW_FORM_data1, c);
774 }
Devang Patel161b2f42011-04-12 23:21:44 +0000775
776 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
Devang Patel161b2f42011-04-12 23:21:44 +0000777}
778
Eric Christopher6c3bb942013-04-22 07:47:40 +0000779/// addTemplateParams - Add template parameters into buffer.
Devang Patel161b2f42011-04-12 23:21:44 +0000780void CompileUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
781 // Add template parameters.
782 for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) {
783 DIDescriptor Element = TParams.getElement(i);
784 if (Element.isTemplateTypeParameter())
Manman Ren630c3262013-10-18 21:14:19 +0000785 getOrCreateTemplateTypeParameterDIE(
786 DITemplateTypeParameter(Element), Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +0000787 else if (Element.isTemplateValueParameter())
Manman Ren630c3262013-10-18 21:14:19 +0000788 getOrCreateTemplateValueParameterDIE(
789 DITemplateValueParameter(Element), Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +0000790 }
Devang Patel161b2f42011-04-12 23:21:44 +0000791}
Nick Lewycky746cb672011-10-26 22:55:33 +0000792
Eric Christopher6b6061f2013-01-16 01:22:23 +0000793/// getOrCreateContextDIE - Get context owner's DIE.
Eric Christopherccb66362013-10-04 23:49:26 +0000794DIE *CompileUnit::getOrCreateContextDIE(DIScope Context) {
Eric Christopher6b6061f2013-01-16 01:22:23 +0000795 if (Context.isType())
796 return getOrCreateTypeDIE(DIType(Context));
797 else if (Context.isNameSpace())
798 return getOrCreateNameSpace(DINameSpace(Context));
799 else if (Context.isSubprogram())
800 return getOrCreateSubprogramDIE(DISubprogram(Context));
Eric Christopher6c3bb942013-04-22 07:47:40 +0000801 else
Eric Christopher6b6061f2013-01-16 01:22:23 +0000802 return getDIE(Context);
803}
804
Devang Patel161b2f42011-04-12 23:21:44 +0000805/// addToContextOwner - Add Die into the list of its context owner's children.
Eric Christopherccb66362013-10-04 23:49:26 +0000806void CompileUnit::addToContextOwner(DIE *Die, DIScope Context) {
David Blaikiee5830c42013-10-03 20:07:20 +0000807 assert(!Die->getParent());
808 if (DIE *ContextDIE = getOrCreateContextDIE(Context)) {
809 if (Die->getParent()) {
810 // While creating the context, if this is a type member, we will have
811 // added the child to the context already.
812 assert(Die->getParent() == ContextDIE);
813 return;
814 }
Devang Patel161b2f42011-04-12 23:21:44 +0000815 ContextDIE->addChild(Die);
David Blaikiee5830c42013-10-03 20:07:20 +0000816 } else
Devang Patel161b2f42011-04-12 23:21:44 +0000817 addDie(Die);
818}
819
820/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
821/// given DIType.
Devang Patel94c7ddb2011-08-16 22:09:43 +0000822DIE *CompileUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
823 DIType Ty(TyNode);
Manman Rend03d2b22013-07-08 18:33:29 +0000824 if (!Ty.isType())
Devang Patel94c7ddb2011-08-16 22:09:43 +0000825 return NULL;
Eric Christopher3f045002013-10-04 17:08:38 +0000826 DIE *TyDIE = getDIE(Ty);
Devang Patel161b2f42011-04-12 23:21:44 +0000827 if (TyDIE)
828 return TyDIE;
829
830 // Create new type.
David Blaikie916d49e2013-10-04 23:21:16 +0000831 TyDIE = new DIE(Ty.getTag());
Eric Christopher3f045002013-10-04 17:08:38 +0000832 insertDIE(Ty, TyDIE);
Devang Patel161b2f42011-04-12 23:21:44 +0000833 if (Ty.isBasicType())
834 constructTypeDIE(*TyDIE, DIBasicType(Ty));
835 else if (Ty.isCompositeType())
836 constructTypeDIE(*TyDIE, DICompositeType(Ty));
837 else {
838 assert(Ty.isDerivedType() && "Unknown kind of DIType");
839 constructTypeDIE(*TyDIE, DIDerivedType(Ty));
840 }
Eric Christopher1b3f9192011-11-10 19:52:58 +0000841 // If this is a named finished type then include it in the list of types
842 // for the accelerator tables.
Eric Christopherc36145f2012-01-06 04:35:23 +0000843 if (!Ty.getName().empty() && !Ty.isForwardDecl()) {
844 bool IsImplementation = 0;
845 if (Ty.isCompositeType()) {
846 DICompositeType CT(Ty);
Eric Christophere0167892012-01-06 23:03:37 +0000847 // A runtime language of 0 actually means C/C++ and that any
848 // non-negative value is some version of Objective-C/C++.
Eric Christopherc36145f2012-01-06 04:35:23 +0000849 IsImplementation = (CT.getRunTimeLang() == 0) ||
Eric Christophere2dc9332012-02-22 08:46:02 +0000850 CT.isObjcClassComplete();
Eric Christopherc36145f2012-01-06 04:35:23 +0000851 }
Eric Christopher577056f2013-09-05 18:20:16 +0000852 unsigned Flags = IsImplementation ? dwarf::DW_FLAG_type_implementation : 0;
Eric Christophere0167892012-01-06 23:03:37 +0000853 addAccelType(Ty.getName(), std::make_pair(TyDIE, Flags));
Eric Christopherc36145f2012-01-06 04:35:23 +0000854 }
Eric Christopher8b4310b2012-11-21 00:34:38 +0000855
Eric Christophereee74fb2013-10-05 00:27:02 +0000856 addToContextOwner(TyDIE, resolve(Ty.getContext()));
Devang Patel161b2f42011-04-12 23:21:44 +0000857 return TyDIE;
858}
859
860/// addType - Add a new type attribute to the specified entity.
Eric Christopher31667622013-08-08 01:41:00 +0000861void CompileUnit::addType(DIE *Entity, DIType Ty, uint16_t Attribute) {
Eric Christopherdc1363f2013-08-08 07:40:37 +0000862 assert(Ty && "Trying to add a type that doesn't exist?");
Devang Patel161b2f42011-04-12 23:21:44 +0000863
864 // Check for pre-existence.
865 DIEEntry *Entry = getDIEEntry(Ty);
866 // If it exists then use the existing value.
867 if (Entry) {
Eric Christopher3f045002013-10-04 17:08:38 +0000868 Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
Devang Patel161b2f42011-04-12 23:21:44 +0000869 return;
870 }
871
872 // Construct type.
873 DIE *Buffer = getOrCreateTypeDIE(Ty);
874
875 // Set up proxy.
876 Entry = createDIEEntry(Buffer);
877 insertDIEEntry(Ty, Entry);
Eric Christopher3f045002013-10-04 17:08:38 +0000878 Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
Devang Patele9ae06c2011-05-31 22:56:51 +0000879
880 // If this is a complete composite type then include it in the
881 // list of global types.
Devang Patelc20bdf12011-06-01 00:23:24 +0000882 addGlobalType(Ty);
Devang Patel66658e42011-05-31 23:30:30 +0000883}
884
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000885// Accelerator table mutators - add each name along with its companion
886// DIE to the proper table while ensuring that the name that we're going
887// to reference is in the string table. We do this since the names we
888// add may not only be identical to the names in the DIE.
889void CompileUnit::addAccelName(StringRef Name, DIE *Die) {
890 DU->getStringPoolEntry(Name);
Eric Christopher734334e2013-09-23 22:59:11 +0000891 std::vector<DIE *> &DIEs = AccelNames[Name];
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000892 DIEs.push_back(Die);
893}
894
895void CompileUnit::addAccelObjC(StringRef Name, DIE *Die) {
896 DU->getStringPoolEntry(Name);
Eric Christopher734334e2013-09-23 22:59:11 +0000897 std::vector<DIE *> &DIEs = AccelObjC[Name];
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000898 DIEs.push_back(Die);
899}
900
901void CompileUnit::addAccelNamespace(StringRef Name, DIE *Die) {
902 DU->getStringPoolEntry(Name);
Eric Christopher734334e2013-09-23 22:59:11 +0000903 std::vector<DIE *> &DIEs = AccelNamespace[Name];
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000904 DIEs.push_back(Die);
905}
906
907void CompileUnit::addAccelType(StringRef Name, std::pair<DIE *, unsigned> Die) {
908 DU->getStringPoolEntry(Name);
909 std::vector<std::pair<DIE *, unsigned> > &DIEs = AccelTypes[Name];
910 DIEs.push_back(Die);
911}
912
Eric Christopher50d37a42013-09-20 22:20:55 +0000913/// addGlobalName - Add a new global name to the compile unit.
Eric Christopher91986572013-10-17 02:06:06 +0000914void CompileUnit::addGlobalName(StringRef Name, DIE *Die, DIScope Context) {
915 std::string ContextString = getParentContextString(Context);
916 std::string FullName = ContextString + Name.str();
917 GlobalNames[FullName] = Die;
Eric Christopher50d37a42013-09-20 22:20:55 +0000918}
919
Devang Patel66658e42011-05-31 23:30:30 +0000920/// addGlobalType - Add a new global type to the compile unit.
921///
Devang Patelc20bdf12011-06-01 00:23:24 +0000922void CompileUnit::addGlobalType(DIType Ty) {
Eric Christophereee74fb2013-10-05 00:27:02 +0000923 DIScope Context = resolve(Ty.getContext());
Eric Christopher5a634742013-09-23 23:15:58 +0000924 if (!Ty.getName().empty() && !Ty.isForwardDecl() &&
Eric Christopher734334e2013-09-23 22:59:11 +0000925 (!Context || Context.isCompileUnit() || Context.isFile() ||
926 Context.isNameSpace()))
Eric Christopher91986572013-10-17 02:06:06 +0000927 if (DIEEntry *Entry = getDIEEntry(Ty)) {
928 std::string ContextString = getParentContextString(Context);
929 std::string FullName = ContextString + Ty.getName().str();
930 GlobalTypes[FullName] = Entry->getEntry();
931 }
932}
933
934/// getParentContextString - Walks the metadata parent chain in a language
935/// specific manner (using the compile unit language) and returns
936/// it as a string. This is done at the metadata level because DIEs may
937/// not currently have been added to the parent context and walking the
938/// DIEs looking for names is more expensive than walking the metadata.
939std::string CompileUnit::getParentContextString(DIScope Context) const {
940 if (!Context)
941 return "";
942
943 // FIXME: Decide whether to implement this for non-C++ languages.
944 if (getLanguage() != dwarf::DW_LANG_C_plus_plus)
945 return "";
946
947 std::string CS = "";
948 SmallVector<DIScope, 1> Parents;
949 while (!Context.isCompileUnit()) {
950 Parents.push_back(Context);
951 if (Context.getContext())
952 Context = resolve(Context.getContext());
953 else
954 // Structure, etc types will have a NULL context if they're at the top
955 // level.
956 break;
957 }
958
959 // Reverse iterate over our list to go from the outermost construct to the
960 // innermost.
961 for (SmallVectorImpl<DIScope>::reverse_iterator I = Parents.rbegin(),
962 E = Parents.rend();
963 I != E; ++I) {
964 DIScope Ctx = *I;
965 StringRef Name = Ctx.getName();
966 if (Name != "") {
967 CS += Name;
968 CS += "::";
969 }
970 }
971 return CS;
Devang Patel161b2f42011-04-12 23:21:44 +0000972}
973
Eric Christopher22852c72013-10-05 00:05:51 +0000974/// addPubTypes - Add subprogram argument types for pubtypes section.
Devang Patel31c5d052011-05-06 16:57:54 +0000975void CompileUnit::addPubTypes(DISubprogram SP) {
976 DICompositeType SPTy = SP.getType();
Eric Christopher31667622013-08-08 01:41:00 +0000977 uint16_t SPTag = SPTy.getTag();
Devang Patel31c5d052011-05-06 16:57:54 +0000978 if (SPTag != dwarf::DW_TAG_subroutine_type)
979 return;
980
981 DIArray Args = SPTy.getTypeArray();
982 for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
983 DIType ATy(Args.getElement(i));
Manman Rend03d2b22013-07-08 18:33:29 +0000984 if (!ATy.isType())
Devang Patel31c5d052011-05-06 16:57:54 +0000985 continue;
Devang Patelc20bdf12011-06-01 00:23:24 +0000986 addGlobalType(ATy);
Devang Patel31c5d052011-05-06 16:57:54 +0000987 }
988}
989
Devang Patel161b2f42011-04-12 23:21:44 +0000990/// constructTypeDIE - Construct basic type die from DIBasicType.
991void CompileUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
992 // Get core information.
993 StringRef Name = BTy.getName();
Devang Patel161b2f42011-04-12 23:21:44 +0000994 // Add name if not anonymous or intermediate type.
995 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000996 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel734a67c2011-09-14 23:13:28 +0000997
David Blaikie916d49e2013-10-04 23:21:16 +0000998 // An unspecified type only has a name attribute.
999 if (BTy.getTag() == dwarf::DW_TAG_unspecified_type)
Devang Patel734a67c2011-09-14 23:13:28 +00001000 return;
Devang Patel734a67c2011-09-14 23:13:28 +00001001
Nick Lewycky746cb672011-10-26 22:55:33 +00001002 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
Devang Patel30d409c2012-02-07 23:33:58 +00001003 BTy.getEncoding());
Devang Patel734a67c2011-09-14 23:13:28 +00001004
Devang Patel161b2f42011-04-12 23:21:44 +00001005 uint64_t Size = BTy.getSizeInBits() >> 3;
1006 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
1007}
1008
1009/// constructTypeDIE - Construct derived type die from DIDerivedType.
1010void CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
1011 // Get core information.
1012 StringRef Name = DTy.getName();
1013 uint64_t Size = DTy.getSizeInBits() >> 3;
David Blaikie916d49e2013-10-04 23:21:16 +00001014 uint16_t Tag = Buffer.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +00001015
1016 // Map to main type, void will not have a type.
Manman Ren017ceda2013-10-08 18:42:58 +00001017 DIType FromTy = resolve(DTy.getTypeDerivedFrom());
Eric Christopherdc1363f2013-08-08 07:40:37 +00001018 if (FromTy)
1019 addType(&Buffer, FromTy);
Devang Patel161b2f42011-04-12 23:21:44 +00001020
1021 // Add name if not anonymous or intermediate type.
1022 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001023 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001024
1025 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopher35f225a2012-02-21 22:25:53 +00001026 if (Size && Tag != dwarf::DW_TAG_pointer_type)
Devang Patel161b2f42011-04-12 23:21:44 +00001027 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
1028
David Blaikie62fdfb52013-01-07 05:51:15 +00001029 if (Tag == dwarf::DW_TAG_ptr_to_member_type)
Manman Ren87b110a2013-10-11 23:58:05 +00001030 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type,
Eric Christophereee74fb2013-10-05 00:27:02 +00001031 getOrCreateTypeDIE(resolve(DTy.getClassType())));
Devang Patel161b2f42011-04-12 23:21:44 +00001032 // Add source line info if available and TyDesc is not a forward declaration.
1033 if (!DTy.isForwardDecl())
1034 addSourceLine(&Buffer, DTy);
1035}
1036
Eric Christopher3dee5752013-07-26 17:02:41 +00001037/// Return true if the type is appropriately scoped to be contained inside
1038/// its own type unit.
Manman Ren18eb2452013-09-09 19:23:58 +00001039static bool isTypeUnitScoped(DIType Ty, const DwarfDebug *DD) {
Manman Ren2c9905a2013-09-09 19:47:11 +00001040 DIScope Parent = DD->resolve(Ty.getContext());
Eric Christopher3dee5752013-07-26 17:02:41 +00001041 while (Parent) {
1042 // Don't generate a hash for anything scoped inside a function.
1043 if (Parent.isSubprogram())
1044 return false;
Manman Rene72aba92013-09-09 22:35:23 +00001045 Parent = DD->resolve(Parent.getContext());
Eric Christopher3dee5752013-07-26 17:02:41 +00001046 }
1047 return true;
1048}
1049
1050/// Return true if the type should be split out into a type unit.
Manman Ren18eb2452013-09-09 19:23:58 +00001051static bool shouldCreateTypeUnit(DICompositeType CTy, const DwarfDebug *DD) {
Eric Christopher31667622013-08-08 01:41:00 +00001052 uint16_t Tag = CTy.getTag();
Eric Christopher3dee5752013-07-26 17:02:41 +00001053
1054 switch (Tag) {
1055 case dwarf::DW_TAG_structure_type:
1056 case dwarf::DW_TAG_union_type:
1057 case dwarf::DW_TAG_enumeration_type:
1058 case dwarf::DW_TAG_class_type:
1059 // If this is a class, structure, union, or enumeration type
David Blaikiec4eb3532013-10-04 23:52:02 +00001060 // that is a definition (not a declaration), and not scoped
Eric Christopher3dee5752013-07-26 17:02:41 +00001061 // inside a function then separate this out as a type unit.
David Blaikiec4eb3532013-10-04 23:52:02 +00001062 return !CTy.isForwardDecl() && isTypeUnitScoped(CTy, DD);
Eric Christopher3dee5752013-07-26 17:02:41 +00001063 default:
David Blaikiec4eb3532013-10-04 23:52:02 +00001064 return false;
Eric Christopher3dee5752013-07-26 17:02:41 +00001065 }
1066}
1067
Devang Patel161b2f42011-04-12 23:21:44 +00001068/// constructTypeDIE - Construct type DIE from DICompositeType.
1069void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
1070 // Get core information.
1071 StringRef Name = CTy.getName();
1072
1073 uint64_t Size = CTy.getSizeInBits() >> 3;
David Blaikie916d49e2013-10-04 23:21:16 +00001074 uint16_t Tag = Buffer.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +00001075
1076 switch (Tag) {
Devang Patel161b2f42011-04-12 23:21:44 +00001077 case dwarf::DW_TAG_array_type:
1078 constructArrayTypeDIE(Buffer, &CTy);
1079 break;
1080 case dwarf::DW_TAG_enumeration_type: {
1081 DIArray Elements = CTy.getTypeArray();
1082
1083 // Add enumerators to enumeration type.
1084 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1085 DIE *ElemDie = NULL;
1086 DIDescriptor Enum(Elements.getElement(i));
Manman Ren630c3262013-10-18 21:14:19 +00001087 if (Enum.isEnumerator())
1088 ElemDie = constructEnumTypeDIE(DIEnumerator(Enum), Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +00001089 }
Manman Ren017ceda2013-10-08 18:42:58 +00001090 DIType DTy = resolve(CTy.getTypeDerivedFrom());
Eric Christopher37c107b2013-08-08 07:40:42 +00001091 if (DTy) {
Eric Christopherbb0f6ea2012-05-23 00:09:20 +00001092 addType(&Buffer, DTy);
Eric Christopher371d9582013-10-04 22:40:10 +00001093 addFlag(&Buffer, dwarf::DW_AT_enum_class);
Eric Christopherbb0f6ea2012-05-23 00:09:20 +00001094 }
Devang Patel161b2f42011-04-12 23:21:44 +00001095 }
1096 break;
1097 case dwarf::DW_TAG_subroutine_type: {
Eric Christopherdc1363f2013-08-08 07:40:37 +00001098 // Add return type. A void return won't have a type.
Devang Patel161b2f42011-04-12 23:21:44 +00001099 DIArray Elements = CTy.getTypeArray();
1100 DIDescriptor RTy = Elements.getElement(0);
Eric Christopherdc1363f2013-08-08 07:40:37 +00001101 if (RTy)
1102 addType(&Buffer, DIType(RTy));
Devang Patel161b2f42011-04-12 23:21:44 +00001103
1104 bool isPrototyped = true;
1105 // Add arguments.
1106 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
1107 DIDescriptor Ty = Elements.getElement(i);
1108 if (Ty.isUnspecifiedParameter()) {
1109 DIE *Arg = new DIE(dwarf::DW_TAG_unspecified_parameters);
1110 Buffer.addChild(Arg);
1111 isPrototyped = false;
1112 } else {
1113 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1114 addType(Arg, DIType(Ty));
David Blaikieaaf2e632013-01-29 19:35:24 +00001115 if (DIType(Ty).isArtificial())
1116 addFlag(Arg, dwarf::DW_AT_artificial);
Devang Patel161b2f42011-04-12 23:21:44 +00001117 Buffer.addChild(Arg);
1118 }
1119 }
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001120 // Add prototype flag if we're dealing with a C language and the
1121 // function has been prototyped.
Eric Christopher7b878952013-08-26 23:50:38 +00001122 uint16_t Language = DICompileUnit(Node).getLanguage();
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001123 if (isPrototyped &&
Eric Christopher4d069bf2012-05-22 18:45:24 +00001124 (Language == dwarf::DW_LANG_C89 ||
1125 Language == dwarf::DW_LANG_C99 ||
1126 Language == dwarf::DW_LANG_ObjC))
Eric Christopher873cf0a2012-08-24 01:14:27 +00001127 addFlag(&Buffer, dwarf::DW_AT_prototyped);
Devang Patel161b2f42011-04-12 23:21:44 +00001128 }
1129 break;
1130 case dwarf::DW_TAG_structure_type:
1131 case dwarf::DW_TAG_union_type:
1132 case dwarf::DW_TAG_class_type: {
Devang Patel161b2f42011-04-12 23:21:44 +00001133 // Add elements to structure type.
David Blaikiec8b93552013-08-01 20:30:22 +00001134 DIArray Elements = CTy.getTypeArray();
1135 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
Devang Patel161b2f42011-04-12 23:21:44 +00001136 DIDescriptor Element = Elements.getElement(i);
1137 DIE *ElemDie = NULL;
1138 if (Element.isSubprogram()) {
1139 DISubprogram SP(Element);
Devang Pateldbc64af2011-08-15 17:24:54 +00001140 ElemDie = getOrCreateSubprogramDIE(DISubprogram(Element));
Devang Patel161b2f42011-04-12 23:21:44 +00001141 if (SP.isProtected())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001142 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001143 dwarf::DW_ACCESS_protected);
1144 else if (SP.isPrivate())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001145 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001146 dwarf::DW_ACCESS_private);
Eric Christopher8b4310b2012-11-21 00:34:38 +00001147 else
Nick Lewycky13aaca52011-12-13 05:09:11 +00001148 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001149 dwarf::DW_ACCESS_public);
1150 if (SP.isExplicit())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001151 addFlag(ElemDie, dwarf::DW_AT_explicit);
Eric Christopher663e0cf2012-03-28 07:34:31 +00001152 } else if (Element.isDerivedType()) {
Eric Christopher4d069bf2012-05-22 18:45:24 +00001153 DIDerivedType DDTy(Element);
1154 if (DDTy.getTag() == dwarf::DW_TAG_friend) {
1155 ElemDie = new DIE(dwarf::DW_TAG_friend);
Manman Ren017ceda2013-10-08 18:42:58 +00001156 addType(ElemDie, resolve(DDTy.getTypeDerivedFrom()),
Manman Renc664d762013-10-05 01:43:03 +00001157 dwarf::DW_AT_friend);
Manman Ren655a10d2013-10-14 20:33:57 +00001158 Buffer.addChild(ElemDie);
1159 } else if (DDTy.isStaticMember()) {
1160 ElemDie = getOrCreateStaticMemberDIE(DDTy);
1161 } else {
Manman Ren630c3262013-10-18 21:14:19 +00001162 ElemDie = createMemberDIE(DDTy, Buffer);
Manman Ren655a10d2013-10-14 20:33:57 +00001163 }
Eric Christopher663e0cf2012-03-28 07:34:31 +00001164 } else if (Element.isObjCProperty()) {
Devang Patel30d409c2012-02-07 23:33:58 +00001165 DIObjCProperty Property(Element);
1166 ElemDie = new DIE(Property.getTag());
1167 StringRef PropertyName = Property.getObjCPropertyName();
1168 addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
Eric Christopher4d069bf2012-05-22 18:45:24 +00001169 addType(ElemDie, Property.getType());
1170 addSourceLine(ElemDie, Property);
Devang Patel30d409c2012-02-07 23:33:58 +00001171 StringRef GetterName = Property.getObjCPropertyGetterName();
1172 if (!GetterName.empty())
1173 addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
1174 StringRef SetterName = Property.getObjCPropertySetterName();
1175 if (!SetterName.empty())
1176 addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
1177 unsigned PropertyAttributes = 0;
Devang Patel9e11eb12012-02-04 01:30:32 +00001178 if (Property.isReadOnlyObjCProperty())
1179 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
1180 if (Property.isReadWriteObjCProperty())
1181 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
1182 if (Property.isAssignObjCProperty())
1183 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
1184 if (Property.isRetainObjCProperty())
1185 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
1186 if (Property.isCopyObjCProperty())
1187 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
1188 if (Property.isNonAtomicObjCProperty())
1189 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
1190 if (PropertyAttributes)
Eric Christopher8b4310b2012-11-21 00:34:38 +00001191 addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, 0,
Devang Patel9e11eb12012-02-04 01:30:32 +00001192 PropertyAttributes);
Devang Patel6588abf2012-02-06 17:49:43 +00001193
Devang Patel30d409c2012-02-07 23:33:58 +00001194 DIEEntry *Entry = getDIEEntry(Element);
1195 if (!Entry) {
1196 Entry = createDIEEntry(ElemDie);
1197 insertDIEEntry(Element, Entry);
1198 }
David Blaikiee5830c42013-10-03 20:07:20 +00001199 Buffer.addChild(ElemDie);
Devang Patel9e11eb12012-02-04 01:30:32 +00001200 } else
Devang Patel161b2f42011-04-12 23:21:44 +00001201 continue;
Devang Patel161b2f42011-04-12 23:21:44 +00001202 }
1203
1204 if (CTy.isAppleBlockExtension())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001205 addFlag(&Buffer, dwarf::DW_AT_APPLE_block);
Devang Patel161b2f42011-04-12 23:21:44 +00001206
Eric Christophereee74fb2013-10-05 00:27:02 +00001207 DICompositeType ContainingType(resolve(CTy.getContainingType()));
Devang Patel161b2f42011-04-12 23:21:44 +00001208 if (DIDescriptor(ContainingType).isCompositeType())
Manman Ren87b110a2013-10-11 23:58:05 +00001209 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type,
Devang Patel161b2f42011-04-12 23:21:44 +00001210 getOrCreateTypeDIE(DIType(ContainingType)));
Devang Patel161b2f42011-04-12 23:21:44 +00001211
Devang Patel201e6cd2011-05-12 21:29:42 +00001212 if (CTy.isObjcClassComplete())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001213 addFlag(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type);
Devang Patelb11f80e2011-05-12 19:06:16 +00001214
Eric Christopher1a8e8862011-12-16 23:42:42 +00001215 // Add template parameters to a class, structure or union types.
1216 // FIXME: The support isn't in the metadata for this yet.
1217 if (Tag == dwarf::DW_TAG_class_type ||
1218 Tag == dwarf::DW_TAG_structure_type ||
1219 Tag == dwarf::DW_TAG_union_type)
Devang Patel161b2f42011-04-12 23:21:44 +00001220 addTemplateParams(Buffer, CTy.getTemplateParams());
1221
1222 break;
1223 }
1224 default:
1225 break;
1226 }
1227
1228 // Add name if not anonymous or intermediate type.
1229 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001230 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001231
Eric Christopher4a5d8392012-05-22 18:45:18 +00001232 if (Tag == dwarf::DW_TAG_enumeration_type ||
1233 Tag == dwarf::DW_TAG_class_type ||
1234 Tag == dwarf::DW_TAG_structure_type ||
1235 Tag == dwarf::DW_TAG_union_type) {
Devang Patel161b2f42011-04-12 23:21:44 +00001236 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopherfc4199b2012-06-01 00:22:32 +00001237 // TODO: Do we care about size for enum forward declarations?
Devang Patel161b2f42011-04-12 23:21:44 +00001238 if (Size)
1239 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
Eric Christopherfc4199b2012-06-01 00:22:32 +00001240 else if (!CTy.isForwardDecl())
Devang Patel161b2f42011-04-12 23:21:44 +00001241 // Add zero size if it is not a forward declaration.
Eric Christopherfc4199b2012-06-01 00:22:32 +00001242 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
1243
1244 // If we're a forward decl, say so.
1245 if (CTy.isForwardDecl())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001246 addFlag(&Buffer, dwarf::DW_AT_declaration);
Devang Patel161b2f42011-04-12 23:21:44 +00001247
1248 // Add source line info if available.
1249 if (!CTy.isForwardDecl())
1250 addSourceLine(&Buffer, CTy);
Eric Christopher89388952012-03-07 00:15:19 +00001251
1252 // No harm in adding the runtime language to the declaration.
1253 unsigned RLang = CTy.getRunTimeLang();
1254 if (RLang)
1255 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
1256 dwarf::DW_FORM_data1, RLang);
Devang Patel161b2f42011-04-12 23:21:44 +00001257 }
Eric Christopher3dee5752013-07-26 17:02:41 +00001258 // If this is a type applicable to a type unit it then add it to the
1259 // list of types we'll compute a hash for later.
Manman Ren18eb2452013-09-09 19:23:58 +00001260 if (shouldCreateTypeUnit(CTy, DD))
Eric Christopher3dee5752013-07-26 17:02:41 +00001261 DD->addTypeUnitType(&Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +00001262}
1263
Eric Christopher8b4310b2012-11-21 00:34:38 +00001264/// getOrCreateTemplateTypeParameterDIE - Find existing DIE or create new DIE
Devang Patel161b2f42011-04-12 23:21:44 +00001265/// for the given DITemplateTypeParameter.
1266DIE *
Manman Ren630c3262013-10-18 21:14:19 +00001267CompileUnit::getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP,
1268 DIE &Buffer) {
Devang Patel161b2f42011-04-12 23:21:44 +00001269 DIE *ParamDIE = getDIE(TP);
1270 if (ParamDIE)
1271 return ParamDIE;
1272
1273 ParamDIE = new DIE(dwarf::DW_TAG_template_type_parameter);
Manman Ren630c3262013-10-18 21:14:19 +00001274 Buffer.addChild(ParamDIE);
Eric Christopher76ef79f2013-08-08 08:09:43 +00001275 // Add the type if it exists, it could be void and therefore no type.
1276 if (TP.getType())
Manman Renb4d9c112013-10-09 19:46:28 +00001277 addType(ParamDIE, resolve(TP.getType()));
David Blaikiee88939c2013-06-22 18:59:11 +00001278 if (!TP.getName().empty())
1279 addString(ParamDIE, dwarf::DW_AT_name, TP.getName());
Devang Patel161b2f42011-04-12 23:21:44 +00001280 return ParamDIE;
1281}
1282
Eric Christopher8b4310b2012-11-21 00:34:38 +00001283/// getOrCreateTemplateValueParameterDIE - Find existing DIE or create new DIE
Devang Patel161b2f42011-04-12 23:21:44 +00001284/// for the given DITemplateValueParameter.
1285DIE *
Manman Ren630c3262013-10-18 21:14:19 +00001286CompileUnit::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter VP,
1287 DIE &Buffer) {
Eric Christopherafdd1f82013-08-08 07:40:31 +00001288 DIE *ParamDIE = getDIE(VP);
Devang Patel161b2f42011-04-12 23:21:44 +00001289 if (ParamDIE)
1290 return ParamDIE;
1291
Eric Christopherafdd1f82013-08-08 07:40:31 +00001292 ParamDIE = new DIE(VP.getTag());
Manman Ren630c3262013-10-18 21:14:19 +00001293 Buffer.addChild(ParamDIE);
Eric Christopherdc1363f2013-08-08 07:40:37 +00001294
1295 // Add the type if there is one, template template and template parameter
1296 // packs will not have a type.
1297 if (VP.getType())
Manman Renb4d9c112013-10-09 19:46:28 +00001298 addType(ParamDIE, resolve(VP.getType()));
Eric Christopherafdd1f82013-08-08 07:40:31 +00001299 if (!VP.getName().empty())
1300 addString(ParamDIE, dwarf::DW_AT_name, VP.getName());
1301 if (Value *Val = VP.getValue()) {
David Blaikie4de9d722013-05-10 21:52:07 +00001302 if (ConstantInt *CI = dyn_cast<ConstantInt>(Val))
Manman Renb4d9c112013-10-09 19:46:28 +00001303 addConstantValue(ParamDIE, CI,
1304 isUnsignedDIType(DD, resolve(VP.getType())));
David Blaikie4de9d722013-05-10 21:52:07 +00001305 else if (GlobalValue *GV = dyn_cast<GlobalValue>(Val)) {
1306 // For declaration non-type template parameters (such as global values and
1307 // functions)
1308 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1309 addOpAddress(Block, Asm->Mang->getSymbol(GV));
1310 // Emit DW_OP_stack_value to use the address as the immediate value of the
1311 // parameter, rather than a pointer to it.
1312 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value);
1313 addBlock(ParamDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopherafdd1f82013-08-08 07:40:31 +00001314 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_template_param) {
David Blaikiee88939c2013-06-22 18:59:11 +00001315 assert(isa<MDString>(Val));
1316 addString(ParamDIE, dwarf::DW_AT_GNU_template_name,
1317 cast<MDString>(Val)->getString());
Eric Christopherafdd1f82013-08-08 07:40:31 +00001318 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_parameter_pack) {
David Blaikiee88939c2013-06-22 18:59:11 +00001319 assert(isa<MDNode>(Val));
1320 DIArray A(cast<MDNode>(Val));
1321 addTemplateParams(*ParamDIE, A);
David Blaikie4de9d722013-05-10 21:52:07 +00001322 }
1323 }
1324
Devang Patel161b2f42011-04-12 23:21:44 +00001325 return ParamDIE;
1326}
1327
Devang Patel31c5d052011-05-06 16:57:54 +00001328/// getOrCreateNameSpace - Create a DIE for DINameSpace.
1329DIE *CompileUnit::getOrCreateNameSpace(DINameSpace NS) {
1330 DIE *NDie = getDIE(NS);
1331 if (NDie)
1332 return NDie;
1333 NDie = new DIE(dwarf::DW_TAG_namespace);
1334 insertDIE(NS, NDie);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001335 if (!NS.getName().empty()) {
Nick Lewycky390c40d2011-10-27 06:44:11 +00001336 addString(NDie, dwarf::DW_AT_name, NS.getName());
Eric Christopher09ac3d82011-11-07 09:24:32 +00001337 addAccelNamespace(NS.getName(), NDie);
Eric Christopher91986572013-10-17 02:06:06 +00001338 addGlobalName(NS.getName(), NDie, NS.getContext());
Eric Christopher09ac3d82011-11-07 09:24:32 +00001339 } else
1340 addAccelNamespace("(anonymous namespace)", NDie);
Devang Patel31c5d052011-05-06 16:57:54 +00001341 addSourceLine(NDie, NS);
1342 addToContextOwner(NDie, NS.getContext());
1343 return NDie;
1344}
1345
Devang Pateldbc64af2011-08-15 17:24:54 +00001346/// getOrCreateSubprogramDIE - Create new DIE using SP.
1347DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
David Blaikiec32f2332013-10-04 01:39:59 +00001348 // Construct the context before querying for the existence of the DIE in case
1349 // such construction creates the DIE (as is the case for member function
1350 // declarations).
Manman Renb8e48a62013-10-10 18:40:01 +00001351 DIE *ContextDIE = getOrCreateContextDIE(resolve(SP.getContext()));
David Blaikiec32f2332013-10-04 01:39:59 +00001352 if (!ContextDIE)
1353 ContextDIE = CUDie.get();
1354
Eric Christopher3f045002013-10-04 17:08:38 +00001355 DIE *SPDie = getDIE(SP);
Devang Pateldbc64af2011-08-15 17:24:54 +00001356 if (SPDie)
1357 return SPDie;
1358
Peter Collingbourne27302f02012-05-27 18:36:44 +00001359 SPDie = new DIE(dwarf::DW_TAG_subprogram);
1360
1361 // DW_TAG_inlined_subroutine may refer to this DIE.
Eric Christopher3f045002013-10-04 17:08:38 +00001362 insertDIE(SP, SPDie);
Peter Collingbourne27302f02012-05-27 18:36:44 +00001363
Rafael Espindola01b55b42011-11-10 22:34:29 +00001364 DISubprogram SPDecl = SP.getFunctionDeclaration();
1365 DIE *DeclDie = NULL;
1366 if (SPDecl.isSubprogram()) {
1367 DeclDie = getOrCreateSubprogramDIE(SPDecl);
1368 }
1369
Devang Pateldbc64af2011-08-15 17:24:54 +00001370 // Add function template parameters.
1371 addTemplateParams(*SPDie, SP.getTemplateParams());
1372
Devang Pateldbc64af2011-08-15 17:24:54 +00001373 // If this DIE is going to refer declaration info using AT_specification
Eric Christopherc4968752013-05-09 00:42:33 +00001374 // then there is no need to add other attributes.
Rafael Espindola01b55b42011-11-10 22:34:29 +00001375 if (DeclDie) {
1376 // Refer function declaration directly.
Manman Ren87b110a2013-10-11 23:58:05 +00001377 addDIEEntry(SPDie, dwarf::DW_AT_specification, DeclDie);
Rafael Espindola01b55b42011-11-10 22:34:29 +00001378
Eric Christopherbdfed162013-10-17 01:31:12 +00001379 // Add subprogram definitions to the CU die directly.
Manman Ren57a964b2013-10-18 20:52:22 +00001380 addDie(SPDie);
Eric Christopherbdfed162013-10-17 01:31:12 +00001381
Devang Pateldbc64af2011-08-15 17:24:54 +00001382 return SPDie;
Rafael Espindola01b55b42011-11-10 22:34:29 +00001383 }
Devang Pateldbc64af2011-08-15 17:24:54 +00001384
Eric Christopherbdfed162013-10-17 01:31:12 +00001385 // Add to context owner.
1386 ContextDIE->addChild(SPDie);
1387
Eric Christophercbbd5b12012-08-23 22:52:55 +00001388 // Add the linkage name if we have one.
Michael Gottesmandc42d032013-09-04 04:39:38 +00001389 StringRef LinkageName = SP.getLinkageName();
1390 if (!LinkageName.empty())
Eric Christophercbbd5b12012-08-23 22:52:55 +00001391 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c2b4be2013-06-01 17:51:14 +00001392 GlobalValue::getRealLinkageName(LinkageName));
Eric Christophercbbd5b12012-08-23 22:52:55 +00001393
Devang Pateldbc64af2011-08-15 17:24:54 +00001394 // Constructors and operators for anonymous aggregates do not have names.
1395 if (!SP.getName().empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001396 addString(SPDie, dwarf::DW_AT_name, SP.getName());
Devang Pateldbc64af2011-08-15 17:24:54 +00001397
1398 addSourceLine(SPDie, SP);
1399
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001400 // Add the prototype if we have a prototype and we have a C like
1401 // language.
Eric Christopher7b878952013-08-26 23:50:38 +00001402 uint16_t Language = DICompileUnit(Node).getLanguage();
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001403 if (SP.isPrototyped() &&
1404 (Language == dwarf::DW_LANG_C89 ||
1405 Language == dwarf::DW_LANG_C99 ||
1406 Language == dwarf::DW_LANG_ObjC))
Eric Christopher873cf0a2012-08-24 01:14:27 +00001407 addFlag(SPDie, dwarf::DW_AT_prototyped);
Devang Pateldbc64af2011-08-15 17:24:54 +00001408
Eric Christopherdc1363f2013-08-08 07:40:37 +00001409 // Add Return Type. A void return type will not have a type.
Devang Pateldbc64af2011-08-15 17:24:54 +00001410 DICompositeType SPTy = SP.getType();
David Blaikie3d331842013-05-22 23:22:18 +00001411 assert(SPTy.getTag() == dwarf::DW_TAG_subroutine_type &&
1412 "the type of a subprogram should be a subroutine");
Devang Pateldbc64af2011-08-15 17:24:54 +00001413
David Blaikie3d331842013-05-22 23:22:18 +00001414 DIArray Args = SPTy.getTypeArray();
Eric Christopherdc1363f2013-08-08 07:40:37 +00001415 if (Args.getElement(0))
1416 addType(SPDie, DIType(Args.getElement(0)));
Devang Pateldbc64af2011-08-15 17:24:54 +00001417
1418 unsigned VK = SP.getVirtuality();
1419 if (VK) {
Nick Lewycky798313d2011-12-14 00:56:07 +00001420 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
Devang Pateldbc64af2011-08-15 17:24:54 +00001421 DIEBlock *Block = getDIEBlock();
1422 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1423 addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex());
1424 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
1425 ContainingTypeMap.insert(std::make_pair(SPDie,
Eric Christophereee74fb2013-10-05 00:27:02 +00001426 resolve(SP.getContainingType())));
Devang Pateldbc64af2011-08-15 17:24:54 +00001427 }
1428
1429 if (!SP.isDefinition()) {
Eric Christopher873cf0a2012-08-24 01:14:27 +00001430 addFlag(SPDie, dwarf::DW_AT_declaration);
Eric Christopher8b4310b2012-11-21 00:34:38 +00001431
Devang Pateldbc64af2011-08-15 17:24:54 +00001432 // Add arguments. Do not add arguments for subprogram definition. They will
1433 // be handled while processing variables.
David Blaikie3d331842013-05-22 23:22:18 +00001434 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1435 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1436 DIType ATy = DIType(Args.getElement(i));
1437 addType(Arg, ATy);
1438 if (ATy.isArtificial())
1439 addFlag(Arg, dwarf::DW_AT_artificial);
1440 SPDie->addChild(Arg);
1441 }
Devang Pateldbc64af2011-08-15 17:24:54 +00001442 }
1443
1444 if (SP.isArtificial())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001445 addFlag(SPDie, dwarf::DW_AT_artificial);
Devang Pateldbc64af2011-08-15 17:24:54 +00001446
1447 if (!SP.isLocalToUnit())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001448 addFlag(SPDie, dwarf::DW_AT_external);
Devang Pateldbc64af2011-08-15 17:24:54 +00001449
1450 if (SP.isOptimized())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001451 addFlag(SPDie, dwarf::DW_AT_APPLE_optimized);
Devang Pateldbc64af2011-08-15 17:24:54 +00001452
1453 if (unsigned isa = Asm->getISAEncoding()) {
1454 addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1455 }
1456
1457 return SPDie;
1458}
1459
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001460// Return const expression if value is a GEP to access merged global
1461// constant. e.g.
1462// i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
1463static const ConstantExpr *getMergedGlobalExpr(const Value *V) {
1464 const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
1465 if (!CE || CE->getNumOperands() != 3 ||
1466 CE->getOpcode() != Instruction::GetElementPtr)
1467 return NULL;
1468
1469 // First operand points to a global struct.
1470 Value *Ptr = CE->getOperand(0);
1471 if (!isa<GlobalValue>(Ptr) ||
1472 !isa<StructType>(cast<PointerType>(Ptr->getType())->getElementType()))
1473 return NULL;
1474
1475 // Second operand is zero.
1476 const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
1477 if (!CI || !CI->isZero())
1478 return NULL;
1479
1480 // Third operand is offset.
1481 if (!isa<ConstantInt>(CE->getOperand(2)))
1482 return NULL;
1483
1484 return CE;
1485}
1486
1487/// createGlobalVariableDIE - create global variable DIE.
1488void CompileUnit::createGlobalVariableDIE(const MDNode *N) {
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001489 // Check for pre-existence.
Devang Patel49e2f032011-08-18 22:21:50 +00001490 if (getDIE(N))
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001491 return;
1492
Devang Patel49e2f032011-08-18 22:21:50 +00001493 DIGlobalVariable GV(N);
Manman Rend03d2b22013-07-08 18:33:29 +00001494 if (!GV.isGlobalVariable())
Devang Patel28bea082011-08-18 23:17:55 +00001495 return;
1496
Eric Christopherccb66362013-10-04 23:49:26 +00001497 DIScope GVContext = GV.getContext();
Eric Christopher6b6061f2013-01-16 01:22:23 +00001498 DIType GTy = GV.getType();
1499
1500 // If this is a static data member definition, some attributes belong
1501 // to the declaration DIE.
1502 DIE *VariableDIE = NULL;
Manman Ren945e8282013-02-01 23:54:37 +00001503 bool IsStaticMember = false;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001504 DIDerivedType SDMDecl = GV.getStaticDataMemberDeclaration();
1505 if (SDMDecl.Verify()) {
1506 assert(SDMDecl.isStaticMember() && "Expected static member decl");
1507 // We need the declaration DIE that is in the static member's class.
Manman Ren655a10d2013-10-14 20:33:57 +00001508 VariableDIE = getOrCreateStaticMemberDIE(SDMDecl);
Manman Ren945e8282013-02-01 23:54:37 +00001509 IsStaticMember = true;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001510 }
1511
1512 // If this is not a static data member definition, create the variable
1513 // DIE and add the initial set of attributes to it.
1514 if (!VariableDIE) {
1515 VariableDIE = new DIE(GV.getTag());
1516 // Add to map.
1517 insertDIE(N, VariableDIE);
1518
1519 // Add name and type.
1520 addString(VariableDIE, dwarf::DW_AT_name, GV.getDisplayName());
1521 addType(VariableDIE, GTy);
1522
1523 // Add scoping info.
Eric Christophera486f552013-10-16 01:37:49 +00001524 if (!GV.isLocalToUnit())
Eric Christopher6b6061f2013-01-16 01:22:23 +00001525 addFlag(VariableDIE, dwarf::DW_AT_external);
1526
1527 // Add line number info.
1528 addSourceLine(VariableDIE, GV);
1529 // Add to context owner.
1530 addToContextOwner(VariableDIE, GVContext);
1531 }
1532
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001533 // Add location.
Eric Christopher09ac3d82011-11-07 09:24:32 +00001534 bool addToAccelTable = false;
Eric Christopherd61c34b2011-11-11 03:16:32 +00001535 DIE *VariableSpecDIE = NULL;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001536 bool isGlobalVariable = GV.getGlobal() != NULL;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001537 if (isGlobalVariable) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001538 addToAccelTable = true;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001539 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
David Blaikie59eaa382013-06-28 20:05:11 +00001540 const MCSymbol *Sym = Asm->Mang->getSymbol(GV.getGlobal());
1541 if (GV.getGlobal()->isThreadLocal()) {
1542 // FIXME: Make this work with -gsplit-dwarf.
1543 unsigned PointerSize = Asm->getDataLayout().getPointerSize();
1544 assert((PointerSize == 4 || PointerSize == 8) &&
1545 "Add support for other sizes if necessary");
Ulrich Weigand716a94f2013-07-02 18:47:09 +00001546 const MCExpr *Expr =
David Blaikie8fed05e2013-07-01 23:55:52 +00001547 Asm->getObjFileLowering().getDebugThreadLocalSymbol(Sym);
David Blaikie59eaa382013-06-28 20:05:11 +00001548 // Based on GCC's support for TLS:
David Blaikie8fed05e2013-07-01 23:55:52 +00001549 if (!DD->useSplitDwarf()) {
1550 // 1) Start with a constNu of the appropriate pointer size
1551 addUInt(Block, 0, dwarf::DW_FORM_data1,
1552 PointerSize == 4 ? dwarf::DW_OP_const4u : dwarf::DW_OP_const8u);
Richard Mitton379f76e2013-10-07 18:39:18 +00001553 // 2) containing the (relocated) offset of the TLS variable
1554 // within the module's TLS block.
Ulrich Weigand716a94f2013-07-02 18:47:09 +00001555 addExpr(Block, 0, dwarf::DW_FORM_udata, Expr);
David Blaikie8fed05e2013-07-01 23:55:52 +00001556 } else {
1557 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_const_index);
Ulrich Weigand716a94f2013-07-02 18:47:09 +00001558 addUInt(Block, 0, dwarf::DW_FORM_udata, DU->getAddrPoolIndex(Expr));
David Blaikie8fed05e2013-07-01 23:55:52 +00001559 }
Richard Mitton379f76e2013-10-07 18:39:18 +00001560 // 3) followed by a custom OP to make the debugger do a TLS lookup.
1561 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_push_tls_address);
David Blaikie59eaa382013-06-28 20:05:11 +00001562 } else
1563 addOpAddress(Block, Sym);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001564 // Do not create specification DIE if context is either compile unit
1565 // or a subprogram.
Devang Patel1dd4e562011-09-21 23:41:11 +00001566 if (GVContext && GV.isDefinition() && !GVContext.isCompileUnit() &&
Manman Ren02d29672013-09-09 19:05:21 +00001567 !GVContext.isFile() && !DD->isSubprogramContext(GVContext)) {
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001568 // Create specification DIE.
Eric Christopherd117fbb2011-11-11 01:55:22 +00001569 VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
Manman Ren87b110a2013-10-11 23:58:05 +00001570 addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification, VariableDIE);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001571 addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001572 // A static member's declaration is already flagged as such.
1573 if (!SDMDecl.Verify())
1574 addFlag(VariableDIE, dwarf::DW_AT_declaration);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001575 addDie(VariableSpecDIE);
1576 } else {
1577 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001578 }
Michael Gottesmandc42d032013-09-04 04:39:38 +00001579 // Add the linkage name.
Eric Christopher6b6061f2013-01-16 01:22:23 +00001580 StringRef LinkageName = GV.getLinkageName();
Michael Gottesmandc42d032013-09-04 04:39:38 +00001581 if (!LinkageName.empty())
Eric Christopher8d45a982013-02-27 23:49:47 +00001582 // From DWARF4: DIEs to which DW_AT_linkage_name may apply include:
1583 // TAG_common_block, TAG_constant, TAG_entry_point, TAG_subprogram and
1584 // TAG_variable.
Manman Ren21a08a12013-02-27 23:21:02 +00001585 addString(IsStaticMember && VariableSpecDIE ?
1586 VariableSpecDIE : VariableDIE, dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c2b4be2013-06-01 17:51:14 +00001587 GlobalValue::getRealLinkageName(LinkageName));
Eric Christopher8b4310b2012-11-21 00:34:38 +00001588 } else if (const ConstantInt *CI =
Manman Ren945e8282013-02-01 23:54:37 +00001589 dyn_cast_or_null<ConstantInt>(GV.getConstant())) {
Adrian Prantl2e892e42013-04-04 22:56:49 +00001590 // AT_const_value was added when the static member was created. To avoid
Manman Ren945e8282013-02-01 23:54:37 +00001591 // emitting AT_const_value multiple times, we only add AT_const_value when
1592 // it is not a static member.
1593 if (!IsStaticMember)
Manman Renc664d762013-10-05 01:43:03 +00001594 addConstantValue(VariableDIE, CI, isUnsignedDIType(DD, GTy));
Manman Ren945e8282013-02-01 23:54:37 +00001595 } else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001596 addToAccelTable = true;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001597 // GV is a merged global.
1598 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1599 Value *Ptr = CE->getOperand(0);
Eric Christopher0969ddf2013-01-18 22:11:33 +00001600 addOpAddress(Block, Asm->Mang->getSymbol(cast<GlobalValue>(Ptr)));
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001601 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1602 SmallVector<Value*, 3> Idx(CE->op_begin()+1, CE->op_end());
Eric Christopher8b4310b2012-11-21 00:34:38 +00001603 addUInt(Block, 0, dwarf::DW_FORM_udata,
Micah Villmow3574eca2012-10-08 16:38:25 +00001604 Asm->getDataLayout().getIndexedOffset(Ptr->getType(), Idx));
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001605 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1606 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
1607 }
1608
Eric Christopherd117fbb2011-11-11 01:55:22 +00001609 if (addToAccelTable) {
1610 DIE *AddrDIE = VariableSpecDIE ? VariableSpecDIE : VariableDIE;
1611 addAccelName(GV.getName(), AddrDIE);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001612
Eric Christopherd117fbb2011-11-11 01:55:22 +00001613 // If the linkage name is different than the name, go ahead and output
1614 // that as well into the name table.
1615 if (GV.getLinkageName() != "" && GV.getName() != GV.getLinkageName())
1616 addAccelName(GV.getLinkageName(), AddrDIE);
1617 }
Eric Christophera486f552013-10-16 01:37:49 +00001618
1619 if (!GV.isLocalToUnit())
Eric Christopher91986572013-10-17 02:06:06 +00001620 addGlobalName(GV.getName(), VariableSpecDIE ? VariableSpecDIE : VariableDIE,
1621 GV.getContext());
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001622}
1623
Devang Patel161b2f42011-04-12 23:21:44 +00001624/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
Eric Christopher4d069bf2012-05-22 18:45:24 +00001625void CompileUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR,
1626 DIE *IndexTy) {
Devang Patel161b2f42011-04-12 23:21:44 +00001627 DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
Manman Ren87b110a2013-10-11 23:58:05 +00001628 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, IndexTy);
Devang Patel161b2f42011-04-12 23:21:44 +00001629
Bill Wendling222c2fd2012-12-06 07:38:10 +00001630 // The LowerBound value defines the lower bounds which is typically zero for
1631 // C/C++. The Count value is the number of elements. Values are 64 bit. If
1632 // Count == -1 then the array is unbounded and we do not emit
1633 // DW_AT_lower_bound and DW_AT_upper_bound attributes. If LowerBound == 0 and
1634 // Count == 0, then the array has zero elements in which case we do not emit
1635 // an upper bound.
1636 int64_t LowerBound = SR.getLo();
Bill Wendling6afe4782012-12-06 07:55:19 +00001637 int64_t DefaultLowerBound = getDefaultLowerBound();
Bill Wendling9493dae2012-12-04 21:34:03 +00001638 int64_t Count = SR.getCount();
Devang Patel161b2f42011-04-12 23:21:44 +00001639
Bill Wendling6afe4782012-12-06 07:55:19 +00001640 if (DefaultLowerBound == -1 || LowerBound != DefaultLowerBound)
Bill Wendling222c2fd2012-12-06 07:38:10 +00001641 addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, LowerBound);
1642
1643 if (Count != -1 && Count != 0)
Bill Wendling9493dae2012-12-04 21:34:03 +00001644 // FIXME: An unbounded array should reference the expression that defines
1645 // the array.
Bill Wendling222c2fd2012-12-06 07:38:10 +00001646 addUInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, LowerBound + Count - 1);
Bill Wendling9493dae2012-12-04 21:34:03 +00001647
Devang Patel161b2f42011-04-12 23:21:44 +00001648 Buffer.addChild(DW_Subrange);
1649}
1650
1651/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
1652void CompileUnit::constructArrayTypeDIE(DIE &Buffer,
1653 DICompositeType *CTy) {
Eric Christopher9a1e0e22013-01-08 01:53:52 +00001654 if (CTy->isVector())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001655 addFlag(&Buffer, dwarf::DW_AT_GNU_vector);
Devang Patel161b2f42011-04-12 23:21:44 +00001656
Eric Christopherdc1363f2013-08-08 07:40:37 +00001657 // Emit the element type.
Manman Ren017ceda2013-10-08 18:42:58 +00001658 addType(&Buffer, resolve(CTy->getTypeDerivedFrom()));
Devang Patel161b2f42011-04-12 23:21:44 +00001659
1660 // Get an anonymous type for index type.
Eric Christopher8cab6ed2013-01-04 21:51:53 +00001661 // FIXME: This type should be passed down from the front end
1662 // as different languages may have different sizes for indexes.
Devang Patel161b2f42011-04-12 23:21:44 +00001663 DIE *IdxTy = getIndexTyDie();
1664 if (!IdxTy) {
1665 // Construct an anonymous type for index type.
1666 IdxTy = new DIE(dwarf::DW_TAG_base_type);
Eric Christopher8cab6ed2013-01-04 21:51:53 +00001667 addString(IdxTy, dwarf::DW_AT_name, "int");
Devang Patel161b2f42011-04-12 23:21:44 +00001668 addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1669 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1670 dwarf::DW_ATE_signed);
1671 addDie(IdxTy);
1672 setIndexTyDie(IdxTy);
1673 }
1674
1675 // Add subranges to array type.
Eric Christopherdc1363f2013-08-08 07:40:37 +00001676 DIArray Elements = CTy->getTypeArray();
Devang Patel161b2f42011-04-12 23:21:44 +00001677 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1678 DIDescriptor Element = Elements.getElement(i);
1679 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1680 constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1681 }
1682}
1683
1684/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
Manman Ren630c3262013-10-18 21:14:19 +00001685DIE *CompileUnit::constructEnumTypeDIE(DIEnumerator ETy, DIE &Buffer) {
Devang Patel161b2f42011-04-12 23:21:44 +00001686 DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
Manman Ren630c3262013-10-18 21:14:19 +00001687 Buffer.addChild(Enumerator);
Devang Patel161b2f42011-04-12 23:21:44 +00001688 StringRef Name = ETy.getName();
Nick Lewycky390c40d2011-10-27 06:44:11 +00001689 addString(Enumerator, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001690 int64_t Value = ETy.getEnumValue();
1691 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
1692 return Enumerator;
1693}
1694
Devang Pateldbc64af2011-08-15 17:24:54 +00001695/// constructContainingTypeDIEs - Construct DIEs for types that contain
1696/// vtables.
1697void CompileUnit::constructContainingTypeDIEs() {
1698 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
1699 CE = ContainingTypeMap.end(); CI != CE; ++CI) {
1700 DIE *SPDie = CI->first;
1701 const MDNode *N = CI->second;
1702 if (!N) continue;
Eric Christopher3f045002013-10-04 17:08:38 +00001703 DIE *NDie = getDIE(N);
Devang Pateldbc64af2011-08-15 17:24:54 +00001704 if (!NDie) continue;
Manman Ren87b110a2013-10-11 23:58:05 +00001705 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, NDie);
Devang Pateldbc64af2011-08-15 17:24:54 +00001706 }
1707}
1708
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001709/// constructVariableDIE - Construct a DIE for the given DbgVariable.
Eric Christopherf61dbc12013-06-24 21:07:27 +00001710DIE *CompileUnit::constructVariableDIE(DbgVariable *DV,
1711 bool isScopeAbstract) {
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001712 StringRef Name = DV->getName();
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001713
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001714 // Define variable debug information entry.
David Blaikie916d49e2013-10-04 23:21:16 +00001715 DIE *VariableDie = new DIE(DV->getTag());
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001716 DbgVariable *AbsVar = DV->getAbstractVariable();
1717 DIE *AbsDIE = AbsVar ? AbsVar->getDIE() : NULL;
Manman Ren742671b2013-05-29 17:16:59 +00001718 if (AbsDIE)
Manman Ren87b110a2013-10-11 23:58:05 +00001719 addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin, AbsDIE);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001720 else {
David Blaikie2883fd42013-08-19 03:34:03 +00001721 if (!Name.empty())
1722 addString(VariableDie, dwarf::DW_AT_name, Name);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001723 addSourceLine(VariableDie, DV->getVariable());
1724 addType(VariableDie, DV->getType());
1725 }
1726
1727 if (DV->isArtificial())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001728 addFlag(VariableDie, dwarf::DW_AT_artificial);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001729
1730 if (isScopeAbstract) {
1731 DV->setDIE(VariableDie);
1732 return VariableDie;
1733 }
1734
1735 // Add variable address.
1736
1737 unsigned Offset = DV->getDotDebugLocOffset();
1738 if (Offset != ~0U) {
Eric Christopherafbe0e22013-06-24 21:34:55 +00001739 addLabel(VariableDie, dwarf::DW_AT_location, dwarf::DW_FORM_data4,
1740 Asm->GetTempSymbol("debug_loc", Offset));
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001741 DV->setDIE(VariableDie);
1742 return VariableDie;
1743 }
1744
Eric Christopher8cf5e742011-10-03 15:49:20 +00001745 // Check if variable is described by a DBG_VALUE instruction.
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001746 if (const MachineInstr *DVInsn = DV->getMInsn()) {
David Blaikie6d9dbd52013-06-16 20:34:15 +00001747 assert(DVInsn->getNumOperands() == 3);
1748 if (DVInsn->getOperand(0).isReg()) {
1749 const MachineOperand RegOp = DVInsn->getOperand(0);
Adrian Prantlb2754912013-07-09 21:44:06 +00001750 // If the second operand is an immediate, this is an indirect value.
Adrian Prantl35176402013-07-09 20:28:37 +00001751 if (DVInsn->getOperand(1).isImm()) {
1752 MachineLocation Location(RegOp.getReg(), DVInsn->getOperand(1).getImm());
Eric Christopherf61dbc12013-06-24 21:07:27 +00001753 addVariableAddress(*DV, VariableDie, Location);
David Blaikie6d9dbd52013-06-16 20:34:15 +00001754 } else if (RegOp.getReg())
Eric Christopherf61dbc12013-06-24 21:07:27 +00001755 addVariableAddress(*DV, VariableDie, MachineLocation(RegOp.getReg()));
David Blaikie6d9dbd52013-06-16 20:34:15 +00001756 } else if (DVInsn->getOperand(0).isImm())
Eric Christophere4721492013-07-03 01:08:30 +00001757 addConstantValue(VariableDie, DVInsn->getOperand(0), DV->getType());
David Blaikie6d9dbd52013-06-16 20:34:15 +00001758 else if (DVInsn->getOperand(0).isFPImm())
Eric Christophere4721492013-07-03 01:08:30 +00001759 addConstantFPValue(VariableDie, DVInsn->getOperand(0));
David Blaikie6d9dbd52013-06-16 20:34:15 +00001760 else if (DVInsn->getOperand(0).isCImm())
Eric Christophere4721492013-07-03 01:08:30 +00001761 addConstantValue(VariableDie, DVInsn->getOperand(0).getCImm(),
Manman Renc664d762013-10-05 01:43:03 +00001762 isUnsignedDIType(DD, DV->getType()));
Eric Christophere4721492013-07-03 01:08:30 +00001763
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001764 DV->setDIE(VariableDie);
1765 return VariableDie;
1766 } else {
1767 // .. else use frame index.
1768 int FI = DV->getFrameIndex();
1769 if (FI != ~0) {
1770 unsigned FrameReg = 0;
1771 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
Eric Christopher8b4310b2012-11-21 00:34:38 +00001772 int Offset =
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001773 TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
1774 MachineLocation Location(FrameReg, Offset);
Eric Christopherf61dbc12013-06-24 21:07:27 +00001775 addVariableAddress(*DV, VariableDie, Location);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001776 }
1777 }
1778
1779 DV->setDIE(VariableDie);
1780 return VariableDie;
1781}
1782
Devang Patel161b2f42011-04-12 23:21:44 +00001783/// createMemberDIE - Create new member DIE.
Manman Ren630c3262013-10-18 21:14:19 +00001784DIE *CompileUnit::createMemberDIE(DIDerivedType DT, DIE &Buffer) {
Devang Patel161b2f42011-04-12 23:21:44 +00001785 DIE *MemberDie = new DIE(DT.getTag());
Manman Ren630c3262013-10-18 21:14:19 +00001786 Buffer.addChild(MemberDie);
Devang Patel161b2f42011-04-12 23:21:44 +00001787 StringRef Name = DT.getName();
1788 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001789 addString(MemberDie, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001790
Manman Ren017ceda2013-10-08 18:42:58 +00001791 addType(MemberDie, resolve(DT.getTypeDerivedFrom()));
Devang Patel161b2f42011-04-12 23:21:44 +00001792
1793 addSourceLine(MemberDie, DT);
1794
1795 DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
1796 addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1797
1798 uint64_t Size = DT.getSizeInBits();
Manman Ren43251002013-10-08 18:46:58 +00001799 uint64_t FieldSize = getBaseTypeSize(DD, DT);
Devang Patel161b2f42011-04-12 23:21:44 +00001800
1801 if (Size != FieldSize) {
1802 // Handle bitfield.
Manman Renc664d762013-10-05 01:43:03 +00001803 addUInt(MemberDie, dwarf::DW_AT_byte_size, 0,
Manman Ren43251002013-10-08 18:46:58 +00001804 getBaseTypeSize(DD, DT)>>3);
Devang Patel161b2f42011-04-12 23:21:44 +00001805 addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1806
1807 uint64_t Offset = DT.getOffsetInBits();
1808 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1809 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1810 uint64_t FieldOffset = (HiMark - FieldSize);
1811 Offset -= FieldOffset;
1812
1813 // Maybe we need to work from the other end.
Micah Villmow3574eca2012-10-08 16:38:25 +00001814 if (Asm->getDataLayout().isLittleEndian())
Devang Patel161b2f42011-04-12 23:21:44 +00001815 Offset = FieldSize - (Offset + Size);
1816 addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
1817
1818 // Here WD_AT_data_member_location points to the anonymous
1819 // field that includes this bit field.
1820 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
1821
1822 } else
1823 // This is not a bitfield.
1824 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1825
1826 if (DT.getTag() == dwarf::DW_TAG_inheritance
1827 && DT.isVirtual()) {
1828
1829 // For C++, virtual base classes are not at fixed offset. Use following
1830 // expression to extract appropriate offset from vtable.
1831 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1832
1833 DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
1834 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1835 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1836 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1837 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1838 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1839 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1840 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1841
1842 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
1843 VBaseLocationDie);
1844 } else
1845 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
1846
1847 if (DT.isProtected())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001848 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001849 dwarf::DW_ACCESS_protected);
1850 else if (DT.isPrivate())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001851 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001852 dwarf::DW_ACCESS_private);
1853 // Otherwise C++ member and base classes are considered public.
Eric Christopher8b4310b2012-11-21 00:34:38 +00001854 else
Nick Lewycky13aaca52011-12-13 05:09:11 +00001855 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001856 dwarf::DW_ACCESS_public);
1857 if (DT.isVirtual())
Nick Lewycky798313d2011-12-14 00:56:07 +00001858 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001859 dwarf::DW_VIRTUALITY_virtual);
Devang Patele9db5e22011-04-16 00:11:51 +00001860
1861 // Objective-C properties.
Devang Patel6588abf2012-02-06 17:49:43 +00001862 if (MDNode *PNode = DT.getObjCProperty())
1863 if (DIEEntry *PropertyDie = getDIEEntry(PNode))
Eric Christopher8b4310b2012-11-21 00:34:38 +00001864 MemberDie->addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4,
Devang Patel6588abf2012-02-06 17:49:43 +00001865 PropertyDie);
1866
David Blaikie01bc2b32012-12-13 22:43:07 +00001867 if (DT.isArtificial())
1868 addFlag(MemberDie, dwarf::DW_AT_artificial);
1869
Devang Patel161b2f42011-04-12 23:21:44 +00001870 return MemberDie;
1871}
Eric Christopher6b6061f2013-01-16 01:22:23 +00001872
Manman Ren655a10d2013-10-14 20:33:57 +00001873/// getOrCreateStaticMemberDIE - Create new DIE for C++ static member.
1874DIE *CompileUnit::getOrCreateStaticMemberDIE(const DIDerivedType DT) {
Eric Christopher6b6061f2013-01-16 01:22:23 +00001875 if (!DT.Verify())
1876 return NULL;
1877
Manman Ren655a10d2013-10-14 20:33:57 +00001878 // Construct the context before querying for the existence of the DIE in case
1879 // such construction creates the DIE.
1880 DIE *ContextDIE = getOrCreateContextDIE(resolve(DT.getContext()));
1881 assert(ContextDIE && "Static member should belong to a non-CU context.");
1882
1883 DIE *StaticMemberDIE = getDIE(DT);
1884 if (StaticMemberDIE)
1885 return StaticMemberDIE;
1886
1887 StaticMemberDIE = new DIE(DT.getTag());
1888 // Add to context owner.
1889 ContextDIE->addChild(StaticMemberDIE);
1890
Manman Ren017ceda2013-10-08 18:42:58 +00001891 DIType Ty = resolve(DT.getTypeDerivedFrom());
Eric Christopher6b6061f2013-01-16 01:22:23 +00001892
1893 addString(StaticMemberDIE, dwarf::DW_AT_name, DT.getName());
1894 addType(StaticMemberDIE, Ty);
1895 addSourceLine(StaticMemberDIE, DT);
1896 addFlag(StaticMemberDIE, dwarf::DW_AT_external);
1897 addFlag(StaticMemberDIE, dwarf::DW_AT_declaration);
1898
1899 // FIXME: We could omit private if the parent is a class_type, and
1900 // public if the parent is something else.
1901 if (DT.isProtected())
1902 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1903 dwarf::DW_ACCESS_protected);
1904 else if (DT.isPrivate())
1905 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1906 dwarf::DW_ACCESS_private);
1907 else
1908 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1909 dwarf::DW_ACCESS_public);
1910
1911 if (const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(DT.getConstant()))
Manman Renc664d762013-10-05 01:43:03 +00001912 addConstantValue(StaticMemberDIE, CI, isUnsignedDIType(DD, Ty));
David Blaikie14268412013-01-20 01:18:01 +00001913 if (const ConstantFP *CFP = dyn_cast_or_null<ConstantFP>(DT.getConstant()))
1914 addConstantFPValue(StaticMemberDIE, CFP);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001915
Eric Christopher3f045002013-10-04 17:08:38 +00001916 insertDIE(DT, StaticMemberDIE);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001917 return StaticMemberDIE;
1918}