blob: 554e7f66f57788aa366172ff20fc5d40e16ab050 [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///
Eric Christopher31667622013-08-08 01:41:00 +0000229void CompileUnit::addDIEEntry(DIE *Die, uint16_t Attribute, uint16_t Form,
Devang Patel161b2f42011-04-12 23:21:44 +0000230 DIE *Entry) {
Eric Christopher3f045002013-10-04 17:08:38 +0000231 Die->addValue(Attribute, Form, 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);
Eric Christopher3f045002013-10-04 17:08:38 +0000523 TmpTy = 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.
Eric Christopher3f045002013-10-04 17:08:38 +0000590static bool isTypeSigned(DIType Ty, int *SizeInBits) {
Devang Patel4ec14b02011-07-20 21:57:04 +0000591 if (Ty.isDerivedType())
Eric Christopher3f045002013-10-04 17:08:38 +0000592 return isTypeSigned(DIDerivedType(Ty).getTypeDerivedFrom(), SizeInBits);
Devang Patel4ec14b02011-07-20 21:57:04 +0000593 if (Ty.isBasicType())
594 if (DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed
595 || DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed_char) {
596 *SizeInBits = Ty.getSizeInBits();
597 return true;
598 }
599 return false;
600}
601
Devang Patel161b2f42011-04-12 23:21:44 +0000602/// addConstantValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000603void CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO,
Devang Patelb58128e2011-05-27 16:45:18 +0000604 DIType Ty) {
David Blaikie4de9d722013-05-10 21:52:07 +0000605 // FIXME: This is a bit conservative/simple - it emits negative values at
606 // their maximum bit width which is a bit unfortunate (& doesn't prefer
607 // udata/sdata over dataN as suggested by the DWARF spec)
Nick Lewycky746cb672011-10-26 22:55:33 +0000608 assert(MO.isImm() && "Invalid machine operand!");
Devang Patel4ec14b02011-07-20 21:57:04 +0000609 int SizeInBits = -1;
Eric Christopher3f045002013-10-04 17:08:38 +0000610 bool SignedConstant = isTypeSigned(Ty, &SizeInBits);
Eric Christopher7b2ee392013-08-27 23:49:04 +0000611 uint16_t Form;
Devang Patel72f0d9c2011-05-27 18:15:52 +0000612
Eric Christopher7b2ee392013-08-27 23:49:04 +0000613 // If we're a signed constant definitely use sdata.
614 if (SignedConstant) {
615 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, MO.getImm());
616 return;
617 }
618
619 // Else use data for now unless it's larger than we can deal with.
620 switch (SizeInBits) {
621 case 8:
622 Form = dwarf::DW_FORM_data1;
623 break;
624 case 16:
625 Form = dwarf::DW_FORM_data2;
626 break;
627 case 32:
628 Form = dwarf::DW_FORM_data4;
629 break;
630 case 64:
631 Form = dwarf::DW_FORM_data8;
632 break;
633 default:
634 Form = dwarf::DW_FORM_udata;
635 addUInt(Die, dwarf::DW_AT_const_value, Form, MO.getImm());
636 return;
637 }
638 addUInt(Die, dwarf::DW_AT_const_value, Form, MO.getImm());
Devang Patel161b2f42011-04-12 23:21:44 +0000639}
640
641/// addConstantFPValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000642void CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
Nick Lewycky390c40d2011-10-27 06:44:11 +0000643 assert (MO.isFPImm() && "Invalid machine operand!");
Devang Patel161b2f42011-04-12 23:21:44 +0000644 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
645 APFloat FPImm = MO.getFPImm()->getValueAPF();
646
647 // Get the raw data form of the floating point.
648 const APInt FltVal = FPImm.bitcastToAPInt();
649 const char *FltPtr = (const char*)FltVal.getRawData();
650
651 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
Micah Villmow3574eca2012-10-08 16:38:25 +0000652 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel161b2f42011-04-12 23:21:44 +0000653 int Incr = (LittleEndian ? 1 : -1);
654 int Start = (LittleEndian ? 0 : NumBytes - 1);
655 int Stop = (LittleEndian ? NumBytes : -1);
656
657 // Output the constant to DWARF one byte at a time.
658 for (; Start != Stop; Start += Incr)
659 addUInt(Block, 0, dwarf::DW_FORM_data1,
660 (unsigned char)0xFF & FltPtr[Start]);
661
662 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
Devang Patel161b2f42011-04-12 23:21:44 +0000663}
664
David Blaikie14268412013-01-20 01:18:01 +0000665/// addConstantFPValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000666void CompileUnit::addConstantFPValue(DIE *Die, const ConstantFP *CFP) {
Eric Christopher7b2ee392013-08-27 23:49:04 +0000667 // Pass this down to addConstantValue as an unsigned bag of bits.
668 addConstantValue(Die, CFP->getValueAPF().bitcastToAPInt(), true);
David Blaikie14268412013-01-20 01:18:01 +0000669}
670
Devang Patel161b2f42011-04-12 23:21:44 +0000671/// addConstantValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000672void CompileUnit::addConstantValue(DIE *Die, const ConstantInt *CI,
Devang Patel161b2f42011-04-12 23:21:44 +0000673 bool Unsigned) {
Eric Christophere4721492013-07-03 01:08:30 +0000674 addConstantValue(Die, CI->getValue(), Unsigned);
David Blaikie14268412013-01-20 01:18:01 +0000675}
676
677// addConstantValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000678void CompileUnit::addConstantValue(DIE *Die, const APInt &Val, bool Unsigned) {
David Blaikie14268412013-01-20 01:18:01 +0000679 unsigned CIBitWidth = Val.getBitWidth();
Devang Pateld6a81362011-05-28 00:39:18 +0000680 if (CIBitWidth <= 64) {
Eric Christopher7b2ee392013-08-27 23:49:04 +0000681 // If we're a signed constant definitely use sdata.
682 if (!Unsigned) {
683 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata,
684 Val.getSExtValue());
685 return;
Devang Pateld6a81362011-05-28 00:39:18 +0000686 }
Eric Christopher7b2ee392013-08-27 23:49:04 +0000687
688 // Else use data for now unless it's larger than we can deal with.
689 uint16_t Form;
690 switch (CIBitWidth) {
691 case 8:
692 Form = dwarf::DW_FORM_data1;
693 break;
694 case 16:
695 Form = dwarf::DW_FORM_data2;
696 break;
697 case 32:
698 Form = dwarf::DW_FORM_data4;
699 break;
700 case 64:
701 Form = dwarf::DW_FORM_data8;
702 break;
703 default:
704 addUInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
705 Val.getZExtValue());
706 return;
707 }
708 addUInt(Die, dwarf::DW_AT_const_value, Form, Val.getZExtValue());
Eric Christophere4721492013-07-03 01:08:30 +0000709 return;
Devang Patel161b2f42011-04-12 23:21:44 +0000710 }
711
712 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
713
714 // Get the raw data form of the large APInt.
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000715 const uint64_t *Ptr64 = Val.getRawData();
Devang Patel161b2f42011-04-12 23:21:44 +0000716
717 int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
Micah Villmow3574eca2012-10-08 16:38:25 +0000718 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel161b2f42011-04-12 23:21:44 +0000719
720 // Output the constant to DWARF one byte at a time.
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000721 for (int i = 0; i < NumBytes; i++) {
722 uint8_t c;
723 if (LittleEndian)
724 c = Ptr64[i / 8] >> (8 * (i & 7));
725 else
726 c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7));
727 addUInt(Block, 0, dwarf::DW_FORM_data1, c);
728 }
Devang Patel161b2f42011-04-12 23:21:44 +0000729
730 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
Devang Patel161b2f42011-04-12 23:21:44 +0000731}
732
Eric Christopher6c3bb942013-04-22 07:47:40 +0000733/// addTemplateParams - Add template parameters into buffer.
Devang Patel161b2f42011-04-12 23:21:44 +0000734void CompileUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
735 // Add template parameters.
736 for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) {
737 DIDescriptor Element = TParams.getElement(i);
738 if (Element.isTemplateTypeParameter())
739 Buffer.addChild(getOrCreateTemplateTypeParameterDIE(
740 DITemplateTypeParameter(Element)));
741 else if (Element.isTemplateValueParameter())
742 Buffer.addChild(getOrCreateTemplateValueParameterDIE(
743 DITemplateValueParameter(Element)));
744 }
Devang Patel161b2f42011-04-12 23:21:44 +0000745}
Nick Lewycky746cb672011-10-26 22:55:33 +0000746
Eric Christopher6b6061f2013-01-16 01:22:23 +0000747/// getOrCreateContextDIE - Get context owner's DIE.
748DIE *CompileUnit::getOrCreateContextDIE(DIDescriptor Context) {
749 if (Context.isType())
750 return getOrCreateTypeDIE(DIType(Context));
751 else if (Context.isNameSpace())
752 return getOrCreateNameSpace(DINameSpace(Context));
753 else if (Context.isSubprogram())
754 return getOrCreateSubprogramDIE(DISubprogram(Context));
Eric Christopher6c3bb942013-04-22 07:47:40 +0000755 else
Eric Christopher6b6061f2013-01-16 01:22:23 +0000756 return getDIE(Context);
757}
758
Devang Patel161b2f42011-04-12 23:21:44 +0000759/// addToContextOwner - Add Die into the list of its context owner's children.
760void CompileUnit::addToContextOwner(DIE *Die, DIDescriptor Context) {
David Blaikiee5830c42013-10-03 20:07:20 +0000761 assert(!Die->getParent());
762 if (DIE *ContextDIE = getOrCreateContextDIE(Context)) {
763 if (Die->getParent()) {
764 // While creating the context, if this is a type member, we will have
765 // added the child to the context already.
766 assert(Die->getParent() == ContextDIE);
767 return;
768 }
Devang Patel161b2f42011-04-12 23:21:44 +0000769 ContextDIE->addChild(Die);
David Blaikiee5830c42013-10-03 20:07:20 +0000770 } else
Devang Patel161b2f42011-04-12 23:21:44 +0000771 addDie(Die);
772}
773
774/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
775/// given DIType.
Devang Patel94c7ddb2011-08-16 22:09:43 +0000776DIE *CompileUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
777 DIType Ty(TyNode);
Manman Rend03d2b22013-07-08 18:33:29 +0000778 if (!Ty.isType())
Devang Patel94c7ddb2011-08-16 22:09:43 +0000779 return NULL;
Eric Christopher3f045002013-10-04 17:08:38 +0000780 DIE *TyDIE = getDIE(Ty);
Devang Patel161b2f42011-04-12 23:21:44 +0000781 if (TyDIE)
782 return TyDIE;
783
784 // Create new type.
David Blaikie916d49e2013-10-04 23:21:16 +0000785 TyDIE = new DIE(Ty.getTag());
Eric Christopher3f045002013-10-04 17:08:38 +0000786 insertDIE(Ty, TyDIE);
Devang Patel161b2f42011-04-12 23:21:44 +0000787 if (Ty.isBasicType())
788 constructTypeDIE(*TyDIE, DIBasicType(Ty));
789 else if (Ty.isCompositeType())
790 constructTypeDIE(*TyDIE, DICompositeType(Ty));
791 else {
792 assert(Ty.isDerivedType() && "Unknown kind of DIType");
793 constructTypeDIE(*TyDIE, DIDerivedType(Ty));
794 }
Eric Christopher1b3f9192011-11-10 19:52:58 +0000795 // If this is a named finished type then include it in the list of types
796 // for the accelerator tables.
Eric Christopherc36145f2012-01-06 04:35:23 +0000797 if (!Ty.getName().empty() && !Ty.isForwardDecl()) {
798 bool IsImplementation = 0;
799 if (Ty.isCompositeType()) {
800 DICompositeType CT(Ty);
Eric Christophere0167892012-01-06 23:03:37 +0000801 // A runtime language of 0 actually means C/C++ and that any
802 // non-negative value is some version of Objective-C/C++.
Eric Christopherc36145f2012-01-06 04:35:23 +0000803 IsImplementation = (CT.getRunTimeLang() == 0) ||
Eric Christophere2dc9332012-02-22 08:46:02 +0000804 CT.isObjcClassComplete();
Eric Christopherc36145f2012-01-06 04:35:23 +0000805 }
Eric Christopher577056f2013-09-05 18:20:16 +0000806 unsigned Flags = IsImplementation ? dwarf::DW_FLAG_type_implementation : 0;
Eric Christophere0167892012-01-06 23:03:37 +0000807 addAccelType(Ty.getName(), std::make_pair(TyDIE, Flags));
Eric Christopherc36145f2012-01-06 04:35:23 +0000808 }
Eric Christopher8b4310b2012-11-21 00:34:38 +0000809
Manman Ren2c9905a2013-09-09 19:47:11 +0000810 addToContextOwner(TyDIE, DD->resolve(Ty.getContext()));
Devang Patel161b2f42011-04-12 23:21:44 +0000811 return TyDIE;
812}
813
814/// addType - Add a new type attribute to the specified entity.
Eric Christopher31667622013-08-08 01:41:00 +0000815void CompileUnit::addType(DIE *Entity, DIType Ty, uint16_t Attribute) {
Eric Christopherdc1363f2013-08-08 07:40:37 +0000816 assert(Ty && "Trying to add a type that doesn't exist?");
Devang Patel161b2f42011-04-12 23:21:44 +0000817
818 // Check for pre-existence.
819 DIEEntry *Entry = getDIEEntry(Ty);
820 // If it exists then use the existing value.
821 if (Entry) {
Eric Christopher3f045002013-10-04 17:08:38 +0000822 Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
Devang Patel161b2f42011-04-12 23:21:44 +0000823 return;
824 }
825
826 // Construct type.
827 DIE *Buffer = getOrCreateTypeDIE(Ty);
828
829 // Set up proxy.
830 Entry = createDIEEntry(Buffer);
831 insertDIEEntry(Ty, Entry);
Eric Christopher3f045002013-10-04 17:08:38 +0000832 Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
Devang Patele9ae06c2011-05-31 22:56:51 +0000833
834 // If this is a complete composite type then include it in the
835 // list of global types.
Devang Patelc20bdf12011-06-01 00:23:24 +0000836 addGlobalType(Ty);
Devang Patel66658e42011-05-31 23:30:30 +0000837}
838
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000839// Accelerator table mutators - add each name along with its companion
840// DIE to the proper table while ensuring that the name that we're going
841// to reference is in the string table. We do this since the names we
842// add may not only be identical to the names in the DIE.
843void CompileUnit::addAccelName(StringRef Name, DIE *Die) {
844 DU->getStringPoolEntry(Name);
Eric Christopher734334e2013-09-23 22:59:11 +0000845 std::vector<DIE *> &DIEs = AccelNames[Name];
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000846 DIEs.push_back(Die);
847}
848
849void CompileUnit::addAccelObjC(StringRef Name, DIE *Die) {
850 DU->getStringPoolEntry(Name);
Eric Christopher734334e2013-09-23 22:59:11 +0000851 std::vector<DIE *> &DIEs = AccelObjC[Name];
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000852 DIEs.push_back(Die);
853}
854
855void CompileUnit::addAccelNamespace(StringRef Name, DIE *Die) {
856 DU->getStringPoolEntry(Name);
Eric Christopher734334e2013-09-23 22:59:11 +0000857 std::vector<DIE *> &DIEs = AccelNamespace[Name];
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000858 DIEs.push_back(Die);
859}
860
861void CompileUnit::addAccelType(StringRef Name, std::pair<DIE *, unsigned> Die) {
862 DU->getStringPoolEntry(Name);
863 std::vector<std::pair<DIE *, unsigned> > &DIEs = AccelTypes[Name];
864 DIEs.push_back(Die);
865}
866
Eric Christopher50d37a42013-09-20 22:20:55 +0000867/// addGlobalName - Add a new global name to the compile unit.
868void CompileUnit::addGlobalName(StringRef Name, DIE *Die) {
869 GlobalNames[Name] = Die;
870}
871
Devang Patel66658e42011-05-31 23:30:30 +0000872/// addGlobalType - Add a new global type to the compile unit.
873///
Devang Patelc20bdf12011-06-01 00:23:24 +0000874void CompileUnit::addGlobalType(DIType Ty) {
Manman Ren2c9905a2013-09-09 19:47:11 +0000875 DIDescriptor Context = DD->resolve(Ty.getContext());
Eric Christopher5a634742013-09-23 23:15:58 +0000876 if (!Ty.getName().empty() && !Ty.isForwardDecl() &&
Eric Christopher734334e2013-09-23 22:59:11 +0000877 (!Context || Context.isCompileUnit() || Context.isFile() ||
878 Context.isNameSpace()))
Devang Patelc20bdf12011-06-01 00:23:24 +0000879 if (DIEEntry *Entry = getDIEEntry(Ty))
880 GlobalTypes[Ty.getName()] = Entry->getEntry();
Devang Patel161b2f42011-04-12 23:21:44 +0000881}
882
Devang Patel31c5d052011-05-06 16:57:54 +0000883/// addPubTypes - Add type for pubtypes section.
884void CompileUnit::addPubTypes(DISubprogram SP) {
885 DICompositeType SPTy = SP.getType();
Eric Christopher31667622013-08-08 01:41:00 +0000886 uint16_t SPTag = SPTy.getTag();
Devang Patel31c5d052011-05-06 16:57:54 +0000887 if (SPTag != dwarf::DW_TAG_subroutine_type)
888 return;
889
890 DIArray Args = SPTy.getTypeArray();
891 for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
892 DIType ATy(Args.getElement(i));
Manman Rend03d2b22013-07-08 18:33:29 +0000893 if (!ATy.isType())
Devang Patel31c5d052011-05-06 16:57:54 +0000894 continue;
Devang Patelc20bdf12011-06-01 00:23:24 +0000895 addGlobalType(ATy);
Devang Patel31c5d052011-05-06 16:57:54 +0000896 }
897}
898
Devang Patel161b2f42011-04-12 23:21:44 +0000899/// constructTypeDIE - Construct basic type die from DIBasicType.
900void CompileUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
901 // Get core information.
902 StringRef Name = BTy.getName();
Devang Patel161b2f42011-04-12 23:21:44 +0000903 // Add name if not anonymous or intermediate type.
904 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000905 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel734a67c2011-09-14 23:13:28 +0000906
David Blaikie916d49e2013-10-04 23:21:16 +0000907 // An unspecified type only has a name attribute.
908 if (BTy.getTag() == dwarf::DW_TAG_unspecified_type)
Devang Patel734a67c2011-09-14 23:13:28 +0000909 return;
Devang Patel734a67c2011-09-14 23:13:28 +0000910
Nick Lewycky746cb672011-10-26 22:55:33 +0000911 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
Devang Patel30d409c2012-02-07 23:33:58 +0000912 BTy.getEncoding());
Devang Patel734a67c2011-09-14 23:13:28 +0000913
Devang Patel161b2f42011-04-12 23:21:44 +0000914 uint64_t Size = BTy.getSizeInBits() >> 3;
915 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
916}
917
918/// constructTypeDIE - Construct derived type die from DIDerivedType.
919void CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
920 // Get core information.
921 StringRef Name = DTy.getName();
922 uint64_t Size = DTy.getSizeInBits() >> 3;
Devang Patel161b2f42011-04-12 23:21:44 +0000923
924 // FIXME - Workaround for templates.
David Blaikie916d49e2013-10-04 23:21:16 +0000925 if (Buffer.getTag() == dwarf::DW_TAG_inheritance)
926 Buffer.setTag(dwarf::DW_TAG_reference_type);
Devang Patel161b2f42011-04-12 23:21:44 +0000927
David Blaikie916d49e2013-10-04 23:21:16 +0000928 uint16_t Tag = Buffer.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +0000929
930 // Map to main type, void will not have a type.
Eric Christopher3f045002013-10-04 17:08:38 +0000931 DIType FromTy = DTy.getTypeDerivedFrom();
Eric Christopherdc1363f2013-08-08 07:40:37 +0000932 if (FromTy)
933 addType(&Buffer, FromTy);
Devang Patel161b2f42011-04-12 23:21:44 +0000934
935 // Add name if not anonymous or intermediate type.
936 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000937 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +0000938
939 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopher35f225a2012-02-21 22:25:53 +0000940 if (Size && Tag != dwarf::DW_TAG_pointer_type)
Devang Patel161b2f42011-04-12 23:21:44 +0000941 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
942
David Blaikie62fdfb52013-01-07 05:51:15 +0000943 if (Tag == dwarf::DW_TAG_ptr_to_member_type)
944 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
Manman Renbc660712013-09-05 18:48:31 +0000945 getOrCreateTypeDIE(DD->resolve(DTy.getClassType())));
Devang Patel161b2f42011-04-12 23:21:44 +0000946 // Add source line info if available and TyDesc is not a forward declaration.
947 if (!DTy.isForwardDecl())
948 addSourceLine(&Buffer, DTy);
949}
950
Eric Christopher3dee5752013-07-26 17:02:41 +0000951/// Return true if the type is appropriately scoped to be contained inside
952/// its own type unit.
Manman Ren18eb2452013-09-09 19:23:58 +0000953static bool isTypeUnitScoped(DIType Ty, const DwarfDebug *DD) {
Manman Ren2c9905a2013-09-09 19:47:11 +0000954 DIScope Parent = DD->resolve(Ty.getContext());
Eric Christopher3dee5752013-07-26 17:02:41 +0000955 while (Parent) {
956 // Don't generate a hash for anything scoped inside a function.
957 if (Parent.isSubprogram())
958 return false;
Manman Rene72aba92013-09-09 22:35:23 +0000959 Parent = DD->resolve(Parent.getContext());
Eric Christopher3dee5752013-07-26 17:02:41 +0000960 }
961 return true;
962}
963
964/// Return true if the type should be split out into a type unit.
Manman Ren18eb2452013-09-09 19:23:58 +0000965static bool shouldCreateTypeUnit(DICompositeType CTy, const DwarfDebug *DD) {
Eric Christopher31667622013-08-08 01:41:00 +0000966 uint16_t Tag = CTy.getTag();
Eric Christopher3dee5752013-07-26 17:02:41 +0000967
968 switch (Tag) {
969 case dwarf::DW_TAG_structure_type:
970 case dwarf::DW_TAG_union_type:
971 case dwarf::DW_TAG_enumeration_type:
972 case dwarf::DW_TAG_class_type:
973 // If this is a class, structure, union, or enumeration type
974 // that is not a declaration, is a type definition, and not scoped
975 // inside a function then separate this out as a type unit.
Manman Ren18eb2452013-09-09 19:23:58 +0000976 if (CTy.isForwardDecl() || !isTypeUnitScoped(CTy, DD))
Eric Christopher3dee5752013-07-26 17:02:41 +0000977 return 0;
978 return 1;
979 default:
980 return 0;
981 }
982}
983
Devang Patel161b2f42011-04-12 23:21:44 +0000984/// constructTypeDIE - Construct type DIE from DICompositeType.
985void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
986 // Get core information.
987 StringRef Name = CTy.getName();
988
989 uint64_t Size = CTy.getSizeInBits() >> 3;
David Blaikie916d49e2013-10-04 23:21:16 +0000990 uint16_t Tag = Buffer.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +0000991
992 switch (Tag) {
Devang Patel161b2f42011-04-12 23:21:44 +0000993 case dwarf::DW_TAG_array_type:
994 constructArrayTypeDIE(Buffer, &CTy);
995 break;
996 case dwarf::DW_TAG_enumeration_type: {
997 DIArray Elements = CTy.getTypeArray();
998
999 // Add enumerators to enumeration type.
1000 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1001 DIE *ElemDie = NULL;
1002 DIDescriptor Enum(Elements.getElement(i));
1003 if (Enum.isEnumerator()) {
1004 ElemDie = constructEnumTypeDIE(DIEnumerator(Enum));
1005 Buffer.addChild(ElemDie);
1006 }
1007 }
Eric Christopher3f045002013-10-04 17:08:38 +00001008 DIType DTy = CTy.getTypeDerivedFrom();
Eric Christopher37c107b2013-08-08 07:40:42 +00001009 if (DTy) {
Eric Christopherbb0f6ea2012-05-23 00:09:20 +00001010 addType(&Buffer, DTy);
Eric Christopher371d9582013-10-04 22:40:10 +00001011 addFlag(&Buffer, dwarf::DW_AT_enum_class);
Eric Christopherbb0f6ea2012-05-23 00:09:20 +00001012 }
Devang Patel161b2f42011-04-12 23:21:44 +00001013 }
1014 break;
1015 case dwarf::DW_TAG_subroutine_type: {
Eric Christopherdc1363f2013-08-08 07:40:37 +00001016 // Add return type. A void return won't have a type.
Devang Patel161b2f42011-04-12 23:21:44 +00001017 DIArray Elements = CTy.getTypeArray();
1018 DIDescriptor RTy = Elements.getElement(0);
Eric Christopherdc1363f2013-08-08 07:40:37 +00001019 if (RTy)
1020 addType(&Buffer, DIType(RTy));
Devang Patel161b2f42011-04-12 23:21:44 +00001021
1022 bool isPrototyped = true;
1023 // Add arguments.
1024 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
1025 DIDescriptor Ty = Elements.getElement(i);
1026 if (Ty.isUnspecifiedParameter()) {
1027 DIE *Arg = new DIE(dwarf::DW_TAG_unspecified_parameters);
1028 Buffer.addChild(Arg);
1029 isPrototyped = false;
1030 } else {
1031 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1032 addType(Arg, DIType(Ty));
David Blaikieaaf2e632013-01-29 19:35:24 +00001033 if (DIType(Ty).isArtificial())
1034 addFlag(Arg, dwarf::DW_AT_artificial);
Devang Patel161b2f42011-04-12 23:21:44 +00001035 Buffer.addChild(Arg);
1036 }
1037 }
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001038 // Add prototype flag if we're dealing with a C language and the
1039 // function has been prototyped.
Eric Christopher7b878952013-08-26 23:50:38 +00001040 uint16_t Language = DICompileUnit(Node).getLanguage();
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001041 if (isPrototyped &&
Eric Christopher4d069bf2012-05-22 18:45:24 +00001042 (Language == dwarf::DW_LANG_C89 ||
1043 Language == dwarf::DW_LANG_C99 ||
1044 Language == dwarf::DW_LANG_ObjC))
Eric Christopher873cf0a2012-08-24 01:14:27 +00001045 addFlag(&Buffer, dwarf::DW_AT_prototyped);
Devang Patel161b2f42011-04-12 23:21:44 +00001046 }
1047 break;
1048 case dwarf::DW_TAG_structure_type:
1049 case dwarf::DW_TAG_union_type:
1050 case dwarf::DW_TAG_class_type: {
Devang Patel161b2f42011-04-12 23:21:44 +00001051 // Add elements to structure type.
David Blaikiec8b93552013-08-01 20:30:22 +00001052 DIArray Elements = CTy.getTypeArray();
1053 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
Devang Patel161b2f42011-04-12 23:21:44 +00001054 DIDescriptor Element = Elements.getElement(i);
1055 DIE *ElemDie = NULL;
1056 if (Element.isSubprogram()) {
1057 DISubprogram SP(Element);
Devang Pateldbc64af2011-08-15 17:24:54 +00001058 ElemDie = getOrCreateSubprogramDIE(DISubprogram(Element));
Devang Patel161b2f42011-04-12 23:21:44 +00001059 if (SP.isProtected())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001060 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001061 dwarf::DW_ACCESS_protected);
1062 else if (SP.isPrivate())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001063 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001064 dwarf::DW_ACCESS_private);
Eric Christopher8b4310b2012-11-21 00:34:38 +00001065 else
Nick Lewycky13aaca52011-12-13 05:09:11 +00001066 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001067 dwarf::DW_ACCESS_public);
1068 if (SP.isExplicit())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001069 addFlag(ElemDie, dwarf::DW_AT_explicit);
Eric Christopher663e0cf2012-03-28 07:34:31 +00001070 } else if (Element.isDerivedType()) {
Eric Christopher4d069bf2012-05-22 18:45:24 +00001071 DIDerivedType DDTy(Element);
1072 if (DDTy.getTag() == dwarf::DW_TAG_friend) {
1073 ElemDie = new DIE(dwarf::DW_TAG_friend);
Eric Christopher3f045002013-10-04 17:08:38 +00001074 addType(ElemDie, DDTy.getTypeDerivedFrom(), dwarf::DW_AT_friend);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001075 } else if (DDTy.isStaticMember())
1076 ElemDie = createStaticMemberDIE(DDTy);
1077 else
1078 ElemDie = createMemberDIE(DDTy);
David Blaikiee5830c42013-10-03 20:07:20 +00001079 Buffer.addChild(ElemDie);
Eric Christopher663e0cf2012-03-28 07:34:31 +00001080 } else if (Element.isObjCProperty()) {
Devang Patel30d409c2012-02-07 23:33:58 +00001081 DIObjCProperty Property(Element);
1082 ElemDie = new DIE(Property.getTag());
1083 StringRef PropertyName = Property.getObjCPropertyName();
1084 addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
Eric Christopher4d069bf2012-05-22 18:45:24 +00001085 addType(ElemDie, Property.getType());
1086 addSourceLine(ElemDie, Property);
Devang Patel30d409c2012-02-07 23:33:58 +00001087 StringRef GetterName = Property.getObjCPropertyGetterName();
1088 if (!GetterName.empty())
1089 addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
1090 StringRef SetterName = Property.getObjCPropertySetterName();
1091 if (!SetterName.empty())
1092 addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
1093 unsigned PropertyAttributes = 0;
Devang Patel9e11eb12012-02-04 01:30:32 +00001094 if (Property.isReadOnlyObjCProperty())
1095 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
1096 if (Property.isReadWriteObjCProperty())
1097 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
1098 if (Property.isAssignObjCProperty())
1099 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
1100 if (Property.isRetainObjCProperty())
1101 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
1102 if (Property.isCopyObjCProperty())
1103 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
1104 if (Property.isNonAtomicObjCProperty())
1105 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
1106 if (PropertyAttributes)
Eric Christopher8b4310b2012-11-21 00:34:38 +00001107 addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, 0,
Devang Patel9e11eb12012-02-04 01:30:32 +00001108 PropertyAttributes);
Devang Patel6588abf2012-02-06 17:49:43 +00001109
Devang Patel30d409c2012-02-07 23:33:58 +00001110 DIEEntry *Entry = getDIEEntry(Element);
1111 if (!Entry) {
1112 Entry = createDIEEntry(ElemDie);
1113 insertDIEEntry(Element, Entry);
1114 }
David Blaikiee5830c42013-10-03 20:07:20 +00001115 Buffer.addChild(ElemDie);
Devang Patel9e11eb12012-02-04 01:30:32 +00001116 } else
Devang Patel161b2f42011-04-12 23:21:44 +00001117 continue;
Devang Patel161b2f42011-04-12 23:21:44 +00001118 }
1119
1120 if (CTy.isAppleBlockExtension())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001121 addFlag(&Buffer, dwarf::DW_AT_APPLE_block);
Devang Patel161b2f42011-04-12 23:21:44 +00001122
Manman Rene42279c2013-09-06 18:46:00 +00001123 DICompositeType ContainingType(DD->resolve(CTy.getContainingType()));
Devang Patel161b2f42011-04-12 23:21:44 +00001124 if (DIDescriptor(ContainingType).isCompositeType())
1125 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
1126 getOrCreateTypeDIE(DIType(ContainingType)));
Devang Patel161b2f42011-04-12 23:21:44 +00001127
Devang Patel201e6cd2011-05-12 21:29:42 +00001128 if (CTy.isObjcClassComplete())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001129 addFlag(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type);
Devang Patelb11f80e2011-05-12 19:06:16 +00001130
Eric Christopher1a8e8862011-12-16 23:42:42 +00001131 // Add template parameters to a class, structure or union types.
1132 // FIXME: The support isn't in the metadata for this yet.
1133 if (Tag == dwarf::DW_TAG_class_type ||
1134 Tag == dwarf::DW_TAG_structure_type ||
1135 Tag == dwarf::DW_TAG_union_type)
Devang Patel161b2f42011-04-12 23:21:44 +00001136 addTemplateParams(Buffer, CTy.getTemplateParams());
1137
1138 break;
1139 }
1140 default:
1141 break;
1142 }
1143
1144 // Add name if not anonymous or intermediate type.
1145 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001146 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001147
Eric Christopher4a5d8392012-05-22 18:45:18 +00001148 if (Tag == dwarf::DW_TAG_enumeration_type ||
1149 Tag == dwarf::DW_TAG_class_type ||
1150 Tag == dwarf::DW_TAG_structure_type ||
1151 Tag == dwarf::DW_TAG_union_type) {
Devang Patel161b2f42011-04-12 23:21:44 +00001152 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopherfc4199b2012-06-01 00:22:32 +00001153 // TODO: Do we care about size for enum forward declarations?
Devang Patel161b2f42011-04-12 23:21:44 +00001154 if (Size)
1155 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
Eric Christopherfc4199b2012-06-01 00:22:32 +00001156 else if (!CTy.isForwardDecl())
Devang Patel161b2f42011-04-12 23:21:44 +00001157 // Add zero size if it is not a forward declaration.
Eric Christopherfc4199b2012-06-01 00:22:32 +00001158 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
1159
1160 // If we're a forward decl, say so.
1161 if (CTy.isForwardDecl())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001162 addFlag(&Buffer, dwarf::DW_AT_declaration);
Devang Patel161b2f42011-04-12 23:21:44 +00001163
1164 // Add source line info if available.
1165 if (!CTy.isForwardDecl())
1166 addSourceLine(&Buffer, CTy);
Eric Christopher89388952012-03-07 00:15:19 +00001167
1168 // No harm in adding the runtime language to the declaration.
1169 unsigned RLang = CTy.getRunTimeLang();
1170 if (RLang)
1171 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
1172 dwarf::DW_FORM_data1, RLang);
Devang Patel161b2f42011-04-12 23:21:44 +00001173 }
Eric Christopher3dee5752013-07-26 17:02:41 +00001174 // If this is a type applicable to a type unit it then add it to the
1175 // list of types we'll compute a hash for later.
Manman Ren18eb2452013-09-09 19:23:58 +00001176 if (shouldCreateTypeUnit(CTy, DD))
Eric Christopher3dee5752013-07-26 17:02:41 +00001177 DD->addTypeUnitType(&Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +00001178}
1179
Eric Christopher8b4310b2012-11-21 00:34:38 +00001180/// getOrCreateTemplateTypeParameterDIE - Find existing DIE or create new DIE
Devang Patel161b2f42011-04-12 23:21:44 +00001181/// for the given DITemplateTypeParameter.
1182DIE *
1183CompileUnit::getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP) {
1184 DIE *ParamDIE = getDIE(TP);
1185 if (ParamDIE)
1186 return ParamDIE;
1187
1188 ParamDIE = new DIE(dwarf::DW_TAG_template_type_parameter);
Eric Christopher76ef79f2013-08-08 08:09:43 +00001189 // Add the type if it exists, it could be void and therefore no type.
1190 if (TP.getType())
1191 addType(ParamDIE, TP.getType());
David Blaikiee88939c2013-06-22 18:59:11 +00001192 if (!TP.getName().empty())
1193 addString(ParamDIE, dwarf::DW_AT_name, TP.getName());
Devang Patel161b2f42011-04-12 23:21:44 +00001194 return ParamDIE;
1195}
1196
Eric Christopher8b4310b2012-11-21 00:34:38 +00001197/// getOrCreateTemplateValueParameterDIE - Find existing DIE or create new DIE
Devang Patel161b2f42011-04-12 23:21:44 +00001198/// for the given DITemplateValueParameter.
1199DIE *
Eric Christopherafdd1f82013-08-08 07:40:31 +00001200CompileUnit::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter VP) {
1201 DIE *ParamDIE = getDIE(VP);
Devang Patel161b2f42011-04-12 23:21:44 +00001202 if (ParamDIE)
1203 return ParamDIE;
1204
Eric Christopherafdd1f82013-08-08 07:40:31 +00001205 ParamDIE = new DIE(VP.getTag());
Eric Christopherdc1363f2013-08-08 07:40:37 +00001206
1207 // Add the type if there is one, template template and template parameter
1208 // packs will not have a type.
1209 if (VP.getType())
1210 addType(ParamDIE, VP.getType());
Eric Christopherafdd1f82013-08-08 07:40:31 +00001211 if (!VP.getName().empty())
1212 addString(ParamDIE, dwarf::DW_AT_name, VP.getName());
1213 if (Value *Val = VP.getValue()) {
David Blaikie4de9d722013-05-10 21:52:07 +00001214 if (ConstantInt *CI = dyn_cast<ConstantInt>(Val))
Eric Christopher3f045002013-10-04 17:08:38 +00001215 addConstantValue(ParamDIE, CI, VP.getType().isUnsignedDIType());
David Blaikie4de9d722013-05-10 21:52:07 +00001216 else if (GlobalValue *GV = dyn_cast<GlobalValue>(Val)) {
1217 // For declaration non-type template parameters (such as global values and
1218 // functions)
1219 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1220 addOpAddress(Block, Asm->Mang->getSymbol(GV));
1221 // Emit DW_OP_stack_value to use the address as the immediate value of the
1222 // parameter, rather than a pointer to it.
1223 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value);
1224 addBlock(ParamDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopherafdd1f82013-08-08 07:40:31 +00001225 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_template_param) {
David Blaikiee88939c2013-06-22 18:59:11 +00001226 assert(isa<MDString>(Val));
1227 addString(ParamDIE, dwarf::DW_AT_GNU_template_name,
1228 cast<MDString>(Val)->getString());
Eric Christopherafdd1f82013-08-08 07:40:31 +00001229 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_parameter_pack) {
David Blaikiee88939c2013-06-22 18:59:11 +00001230 assert(isa<MDNode>(Val));
1231 DIArray A(cast<MDNode>(Val));
1232 addTemplateParams(*ParamDIE, A);
David Blaikie4de9d722013-05-10 21:52:07 +00001233 }
1234 }
1235
Devang Patel161b2f42011-04-12 23:21:44 +00001236 return ParamDIE;
1237}
1238
Devang Patel31c5d052011-05-06 16:57:54 +00001239/// getOrCreateNameSpace - Create a DIE for DINameSpace.
1240DIE *CompileUnit::getOrCreateNameSpace(DINameSpace NS) {
1241 DIE *NDie = getDIE(NS);
1242 if (NDie)
1243 return NDie;
1244 NDie = new DIE(dwarf::DW_TAG_namespace);
1245 insertDIE(NS, NDie);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001246 if (!NS.getName().empty()) {
Nick Lewycky390c40d2011-10-27 06:44:11 +00001247 addString(NDie, dwarf::DW_AT_name, NS.getName());
Eric Christopher09ac3d82011-11-07 09:24:32 +00001248 addAccelNamespace(NS.getName(), NDie);
Eric Christopher3d2c90f2013-09-24 00:17:57 +00001249 addGlobalName(NS.getName(), NDie);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001250 } else
1251 addAccelNamespace("(anonymous namespace)", NDie);
Devang Patel31c5d052011-05-06 16:57:54 +00001252 addSourceLine(NDie, NS);
1253 addToContextOwner(NDie, NS.getContext());
1254 return NDie;
1255}
1256
Devang Pateldbc64af2011-08-15 17:24:54 +00001257/// getOrCreateSubprogramDIE - Create new DIE using SP.
1258DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
David Blaikiec32f2332013-10-04 01:39:59 +00001259 // Construct the context before querying for the existence of the DIE in case
1260 // such construction creates the DIE (as is the case for member function
1261 // declarations).
1262 DIE *ContextDIE = getOrCreateContextDIE(SP.getContext());
1263 if (!ContextDIE)
1264 ContextDIE = CUDie.get();
1265
Eric Christopher3f045002013-10-04 17:08:38 +00001266 DIE *SPDie = getDIE(SP);
Devang Pateldbc64af2011-08-15 17:24:54 +00001267 if (SPDie)
1268 return SPDie;
1269
Peter Collingbourne27302f02012-05-27 18:36:44 +00001270 SPDie = new DIE(dwarf::DW_TAG_subprogram);
1271
1272 // DW_TAG_inlined_subroutine may refer to this DIE.
Eric Christopher3f045002013-10-04 17:08:38 +00001273 insertDIE(SP, SPDie);
Peter Collingbourne27302f02012-05-27 18:36:44 +00001274
Rafael Espindola01b55b42011-11-10 22:34:29 +00001275 DISubprogram SPDecl = SP.getFunctionDeclaration();
1276 DIE *DeclDie = NULL;
1277 if (SPDecl.isSubprogram()) {
1278 DeclDie = getOrCreateSubprogramDIE(SPDecl);
1279 }
1280
Devang Pateldbc64af2011-08-15 17:24:54 +00001281 // Add to context owner.
David Blaikiec32f2332013-10-04 01:39:59 +00001282 ContextDIE->addChild(SPDie);
Devang Pateldbc64af2011-08-15 17:24:54 +00001283
1284 // Add function template parameters.
1285 addTemplateParams(*SPDie, SP.getTemplateParams());
1286
Devang Pateldbc64af2011-08-15 17:24:54 +00001287 // If this DIE is going to refer declaration info using AT_specification
Eric Christopherc4968752013-05-09 00:42:33 +00001288 // then there is no need to add other attributes.
Rafael Espindola01b55b42011-11-10 22:34:29 +00001289 if (DeclDie) {
1290 // Refer function declaration directly.
1291 addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
1292 DeclDie);
1293
Devang Pateldbc64af2011-08-15 17:24:54 +00001294 return SPDie;
Rafael Espindola01b55b42011-11-10 22:34:29 +00001295 }
Devang Pateldbc64af2011-08-15 17:24:54 +00001296
Eric Christophercbbd5b12012-08-23 22:52:55 +00001297 // Add the linkage name if we have one.
Michael Gottesmandc42d032013-09-04 04:39:38 +00001298 StringRef LinkageName = SP.getLinkageName();
1299 if (!LinkageName.empty())
Eric Christophercbbd5b12012-08-23 22:52:55 +00001300 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c2b4be2013-06-01 17:51:14 +00001301 GlobalValue::getRealLinkageName(LinkageName));
Eric Christophercbbd5b12012-08-23 22:52:55 +00001302
Devang Pateldbc64af2011-08-15 17:24:54 +00001303 // Constructors and operators for anonymous aggregates do not have names.
1304 if (!SP.getName().empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001305 addString(SPDie, dwarf::DW_AT_name, SP.getName());
Devang Pateldbc64af2011-08-15 17:24:54 +00001306
1307 addSourceLine(SPDie, SP);
1308
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001309 // Add the prototype if we have a prototype and we have a C like
1310 // language.
Eric Christopher7b878952013-08-26 23:50:38 +00001311 uint16_t Language = DICompileUnit(Node).getLanguage();
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001312 if (SP.isPrototyped() &&
1313 (Language == dwarf::DW_LANG_C89 ||
1314 Language == dwarf::DW_LANG_C99 ||
1315 Language == dwarf::DW_LANG_ObjC))
Eric Christopher873cf0a2012-08-24 01:14:27 +00001316 addFlag(SPDie, dwarf::DW_AT_prototyped);
Devang Pateldbc64af2011-08-15 17:24:54 +00001317
Eric Christopherdc1363f2013-08-08 07:40:37 +00001318 // Add Return Type. A void return type will not have a type.
Devang Pateldbc64af2011-08-15 17:24:54 +00001319 DICompositeType SPTy = SP.getType();
David Blaikie3d331842013-05-22 23:22:18 +00001320 assert(SPTy.getTag() == dwarf::DW_TAG_subroutine_type &&
1321 "the type of a subprogram should be a subroutine");
Devang Pateldbc64af2011-08-15 17:24:54 +00001322
David Blaikie3d331842013-05-22 23:22:18 +00001323 DIArray Args = SPTy.getTypeArray();
Eric Christopherdc1363f2013-08-08 07:40:37 +00001324 if (Args.getElement(0))
1325 addType(SPDie, DIType(Args.getElement(0)));
Devang Pateldbc64af2011-08-15 17:24:54 +00001326
1327 unsigned VK = SP.getVirtuality();
1328 if (VK) {
Nick Lewycky798313d2011-12-14 00:56:07 +00001329 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
Devang Pateldbc64af2011-08-15 17:24:54 +00001330 DIEBlock *Block = getDIEBlock();
1331 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1332 addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex());
1333 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
1334 ContainingTypeMap.insert(std::make_pair(SPDie,
Manman Ren0e85f6e2013-09-07 00:04:05 +00001335 DD->resolve(SP.getContainingType())));
Devang Pateldbc64af2011-08-15 17:24:54 +00001336 }
1337
1338 if (!SP.isDefinition()) {
Eric Christopher873cf0a2012-08-24 01:14:27 +00001339 addFlag(SPDie, dwarf::DW_AT_declaration);
Eric Christopher8b4310b2012-11-21 00:34:38 +00001340
Devang Pateldbc64af2011-08-15 17:24:54 +00001341 // Add arguments. Do not add arguments for subprogram definition. They will
1342 // be handled while processing variables.
David Blaikie3d331842013-05-22 23:22:18 +00001343 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1344 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1345 DIType ATy = DIType(Args.getElement(i));
1346 addType(Arg, ATy);
1347 if (ATy.isArtificial())
1348 addFlag(Arg, dwarf::DW_AT_artificial);
1349 SPDie->addChild(Arg);
1350 }
Devang Pateldbc64af2011-08-15 17:24:54 +00001351 }
1352
1353 if (SP.isArtificial())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001354 addFlag(SPDie, dwarf::DW_AT_artificial);
Devang Pateldbc64af2011-08-15 17:24:54 +00001355
1356 if (!SP.isLocalToUnit())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001357 addFlag(SPDie, dwarf::DW_AT_external);
Devang Pateldbc64af2011-08-15 17:24:54 +00001358
1359 if (SP.isOptimized())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001360 addFlag(SPDie, dwarf::DW_AT_APPLE_optimized);
Devang Pateldbc64af2011-08-15 17:24:54 +00001361
1362 if (unsigned isa = Asm->getISAEncoding()) {
1363 addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1364 }
1365
1366 return SPDie;
1367}
1368
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001369// Return const expression if value is a GEP to access merged global
1370// constant. e.g.
1371// i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
1372static const ConstantExpr *getMergedGlobalExpr(const Value *V) {
1373 const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
1374 if (!CE || CE->getNumOperands() != 3 ||
1375 CE->getOpcode() != Instruction::GetElementPtr)
1376 return NULL;
1377
1378 // First operand points to a global struct.
1379 Value *Ptr = CE->getOperand(0);
1380 if (!isa<GlobalValue>(Ptr) ||
1381 !isa<StructType>(cast<PointerType>(Ptr->getType())->getElementType()))
1382 return NULL;
1383
1384 // Second operand is zero.
1385 const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
1386 if (!CI || !CI->isZero())
1387 return NULL;
1388
1389 // Third operand is offset.
1390 if (!isa<ConstantInt>(CE->getOperand(2)))
1391 return NULL;
1392
1393 return CE;
1394}
1395
1396/// createGlobalVariableDIE - create global variable DIE.
1397void CompileUnit::createGlobalVariableDIE(const MDNode *N) {
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001398 // Check for pre-existence.
Devang Patel49e2f032011-08-18 22:21:50 +00001399 if (getDIE(N))
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001400 return;
1401
Devang Patel49e2f032011-08-18 22:21:50 +00001402 DIGlobalVariable GV(N);
Manman Rend03d2b22013-07-08 18:33:29 +00001403 if (!GV.isGlobalVariable())
Devang Patel28bea082011-08-18 23:17:55 +00001404 return;
1405
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001406 DIDescriptor GVContext = GV.getContext();
Eric Christopher6b6061f2013-01-16 01:22:23 +00001407 DIType GTy = GV.getType();
1408
1409 // If this is a static data member definition, some attributes belong
1410 // to the declaration DIE.
1411 DIE *VariableDIE = NULL;
Manman Ren945e8282013-02-01 23:54:37 +00001412 bool IsStaticMember = false;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001413 DIDerivedType SDMDecl = GV.getStaticDataMemberDeclaration();
1414 if (SDMDecl.Verify()) {
1415 assert(SDMDecl.isStaticMember() && "Expected static member decl");
1416 // We need the declaration DIE that is in the static member's class.
1417 // But that class might not exist in the DWARF yet.
1418 // Creating the class will create the static member decl DIE.
Manman Ren2c9905a2013-09-09 19:47:11 +00001419 getOrCreateContextDIE(DD->resolve(SDMDecl.getContext()));
Eric Christopher3f045002013-10-04 17:08:38 +00001420 VariableDIE = getDIE(SDMDecl);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001421 assert(VariableDIE && "Static member decl has no context?");
Manman Ren945e8282013-02-01 23:54:37 +00001422 IsStaticMember = true;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001423 }
1424
1425 // If this is not a static data member definition, create the variable
1426 // DIE and add the initial set of attributes to it.
1427 if (!VariableDIE) {
1428 VariableDIE = new DIE(GV.getTag());
1429 // Add to map.
1430 insertDIE(N, VariableDIE);
1431
1432 // Add name and type.
1433 addString(VariableDIE, dwarf::DW_AT_name, GV.getDisplayName());
1434 addType(VariableDIE, GTy);
1435
1436 // Add scoping info.
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00001437 if (!GV.isLocalToUnit()) {
Eric Christopher6b6061f2013-01-16 01:22:23 +00001438 addFlag(VariableDIE, dwarf::DW_AT_external);
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00001439 addGlobalName(GV.getName(), VariableDIE);
1440 }
Eric Christopher6b6061f2013-01-16 01:22:23 +00001441
1442 // Add line number info.
1443 addSourceLine(VariableDIE, GV);
1444 // Add to context owner.
1445 addToContextOwner(VariableDIE, GVContext);
1446 }
1447
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001448 // Add location.
Eric Christopher09ac3d82011-11-07 09:24:32 +00001449 bool addToAccelTable = false;
Eric Christopherd61c34b2011-11-11 03:16:32 +00001450 DIE *VariableSpecDIE = NULL;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001451 bool isGlobalVariable = GV.getGlobal() != NULL;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001452 if (isGlobalVariable) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001453 addToAccelTable = true;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001454 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
David Blaikie59eaa382013-06-28 20:05:11 +00001455 const MCSymbol *Sym = Asm->Mang->getSymbol(GV.getGlobal());
1456 if (GV.getGlobal()->isThreadLocal()) {
1457 // FIXME: Make this work with -gsplit-dwarf.
1458 unsigned PointerSize = Asm->getDataLayout().getPointerSize();
1459 assert((PointerSize == 4 || PointerSize == 8) &&
1460 "Add support for other sizes if necessary");
Ulrich Weigand716a94f2013-07-02 18:47:09 +00001461 const MCExpr *Expr =
David Blaikie8fed05e2013-07-01 23:55:52 +00001462 Asm->getObjFileLowering().getDebugThreadLocalSymbol(Sym);
David Blaikie59eaa382013-06-28 20:05:11 +00001463 // Based on GCC's support for TLS:
David Blaikie8fed05e2013-07-01 23:55:52 +00001464 if (!DD->useSplitDwarf()) {
1465 // 1) Start with a constNu of the appropriate pointer size
1466 addUInt(Block, 0, dwarf::DW_FORM_data1,
1467 PointerSize == 4 ? dwarf::DW_OP_const4u : dwarf::DW_OP_const8u);
1468 // 2) containing the (relocated) address of the TLS variable
Ulrich Weigand716a94f2013-07-02 18:47:09 +00001469 addExpr(Block, 0, dwarf::DW_FORM_udata, Expr);
David Blaikie8fed05e2013-07-01 23:55:52 +00001470 } else {
1471 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_const_index);
Ulrich Weigand716a94f2013-07-02 18:47:09 +00001472 addUInt(Block, 0, dwarf::DW_FORM_udata, DU->getAddrPoolIndex(Expr));
David Blaikie8fed05e2013-07-01 23:55:52 +00001473 }
David Blaikie59eaa382013-06-28 20:05:11 +00001474 // 3) followed by a custom OP to tell the debugger about TLS (presumably)
1475 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_lo_user);
1476 } else
1477 addOpAddress(Block, Sym);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001478 // Do not create specification DIE if context is either compile unit
1479 // or a subprogram.
Devang Patel1dd4e562011-09-21 23:41:11 +00001480 if (GVContext && GV.isDefinition() && !GVContext.isCompileUnit() &&
Manman Ren02d29672013-09-09 19:05:21 +00001481 !GVContext.isFile() && !DD->isSubprogramContext(GVContext)) {
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001482 // Create specification DIE.
Eric Christopherd117fbb2011-11-11 01:55:22 +00001483 VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001484 addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
1485 dwarf::DW_FORM_ref4, VariableDIE);
1486 addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001487 // A static member's declaration is already flagged as such.
1488 if (!SDMDecl.Verify())
1489 addFlag(VariableDIE, dwarf::DW_AT_declaration);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001490 addDie(VariableSpecDIE);
1491 } else {
1492 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001493 }
Michael Gottesmandc42d032013-09-04 04:39:38 +00001494 // Add the linkage name.
Eric Christopher6b6061f2013-01-16 01:22:23 +00001495 StringRef LinkageName = GV.getLinkageName();
Michael Gottesmandc42d032013-09-04 04:39:38 +00001496 if (!LinkageName.empty())
Eric Christopher8d45a982013-02-27 23:49:47 +00001497 // From DWARF4: DIEs to which DW_AT_linkage_name may apply include:
1498 // TAG_common_block, TAG_constant, TAG_entry_point, TAG_subprogram and
1499 // TAG_variable.
Manman Ren21a08a12013-02-27 23:21:02 +00001500 addString(IsStaticMember && VariableSpecDIE ?
1501 VariableSpecDIE : VariableDIE, dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c2b4be2013-06-01 17:51:14 +00001502 GlobalValue::getRealLinkageName(LinkageName));
Eric Christopher8b4310b2012-11-21 00:34:38 +00001503 } else if (const ConstantInt *CI =
Manman Ren945e8282013-02-01 23:54:37 +00001504 dyn_cast_or_null<ConstantInt>(GV.getConstant())) {
Adrian Prantl2e892e42013-04-04 22:56:49 +00001505 // AT_const_value was added when the static member was created. To avoid
Manman Ren945e8282013-02-01 23:54:37 +00001506 // emitting AT_const_value multiple times, we only add AT_const_value when
1507 // it is not a static member.
1508 if (!IsStaticMember)
Eric Christopher3f045002013-10-04 17:08:38 +00001509 addConstantValue(VariableDIE, CI, GTy.isUnsignedDIType());
Manman Ren945e8282013-02-01 23:54:37 +00001510 } else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001511 addToAccelTable = true;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001512 // GV is a merged global.
1513 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1514 Value *Ptr = CE->getOperand(0);
Eric Christopher0969ddf2013-01-18 22:11:33 +00001515 addOpAddress(Block, Asm->Mang->getSymbol(cast<GlobalValue>(Ptr)));
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001516 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1517 SmallVector<Value*, 3> Idx(CE->op_begin()+1, CE->op_end());
Eric Christopher8b4310b2012-11-21 00:34:38 +00001518 addUInt(Block, 0, dwarf::DW_FORM_udata,
Micah Villmow3574eca2012-10-08 16:38:25 +00001519 Asm->getDataLayout().getIndexedOffset(Ptr->getType(), Idx));
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001520 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1521 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
1522 }
1523
Eric Christopherd117fbb2011-11-11 01:55:22 +00001524 if (addToAccelTable) {
1525 DIE *AddrDIE = VariableSpecDIE ? VariableSpecDIE : VariableDIE;
1526 addAccelName(GV.getName(), AddrDIE);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001527
Eric Christopherd117fbb2011-11-11 01:55:22 +00001528 // If the linkage name is different than the name, go ahead and output
1529 // that as well into the name table.
1530 if (GV.getLinkageName() != "" && GV.getName() != GV.getLinkageName())
1531 addAccelName(GV.getLinkageName(), AddrDIE);
1532 }
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001533}
1534
Devang Patel161b2f42011-04-12 23:21:44 +00001535/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
Eric Christopher4d069bf2012-05-22 18:45:24 +00001536void CompileUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR,
1537 DIE *IndexTy) {
Devang Patel161b2f42011-04-12 23:21:44 +00001538 DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
1539 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
Devang Patel161b2f42011-04-12 23:21:44 +00001540
Bill Wendling222c2fd2012-12-06 07:38:10 +00001541 // The LowerBound value defines the lower bounds which is typically zero for
1542 // C/C++. The Count value is the number of elements. Values are 64 bit. If
1543 // Count == -1 then the array is unbounded and we do not emit
1544 // DW_AT_lower_bound and DW_AT_upper_bound attributes. If LowerBound == 0 and
1545 // Count == 0, then the array has zero elements in which case we do not emit
1546 // an upper bound.
1547 int64_t LowerBound = SR.getLo();
Bill Wendling6afe4782012-12-06 07:55:19 +00001548 int64_t DefaultLowerBound = getDefaultLowerBound();
Bill Wendling9493dae2012-12-04 21:34:03 +00001549 int64_t Count = SR.getCount();
Devang Patel161b2f42011-04-12 23:21:44 +00001550
Bill Wendling6afe4782012-12-06 07:55:19 +00001551 if (DefaultLowerBound == -1 || LowerBound != DefaultLowerBound)
Bill Wendling222c2fd2012-12-06 07:38:10 +00001552 addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, LowerBound);
1553
1554 if (Count != -1 && Count != 0)
Bill Wendling9493dae2012-12-04 21:34:03 +00001555 // FIXME: An unbounded array should reference the expression that defines
1556 // the array.
Bill Wendling222c2fd2012-12-06 07:38:10 +00001557 addUInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, LowerBound + Count - 1);
Bill Wendling9493dae2012-12-04 21:34:03 +00001558
Devang Patel161b2f42011-04-12 23:21:44 +00001559 Buffer.addChild(DW_Subrange);
1560}
1561
1562/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
1563void CompileUnit::constructArrayTypeDIE(DIE &Buffer,
1564 DICompositeType *CTy) {
Eric Christopher9a1e0e22013-01-08 01:53:52 +00001565 if (CTy->isVector())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001566 addFlag(&Buffer, dwarf::DW_AT_GNU_vector);
Devang Patel161b2f42011-04-12 23:21:44 +00001567
Eric Christopherdc1363f2013-08-08 07:40:37 +00001568 // Emit the element type.
Eric Christopher3f045002013-10-04 17:08:38 +00001569 addType(&Buffer, CTy->getTypeDerivedFrom());
Devang Patel161b2f42011-04-12 23:21:44 +00001570
1571 // Get an anonymous type for index type.
Eric Christopher8cab6ed2013-01-04 21:51:53 +00001572 // FIXME: This type should be passed down from the front end
1573 // as different languages may have different sizes for indexes.
Devang Patel161b2f42011-04-12 23:21:44 +00001574 DIE *IdxTy = getIndexTyDie();
1575 if (!IdxTy) {
1576 // Construct an anonymous type for index type.
1577 IdxTy = new DIE(dwarf::DW_TAG_base_type);
Eric Christopher8cab6ed2013-01-04 21:51:53 +00001578 addString(IdxTy, dwarf::DW_AT_name, "int");
Devang Patel161b2f42011-04-12 23:21:44 +00001579 addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1580 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1581 dwarf::DW_ATE_signed);
1582 addDie(IdxTy);
1583 setIndexTyDie(IdxTy);
1584 }
1585
1586 // Add subranges to array type.
Eric Christopherdc1363f2013-08-08 07:40:37 +00001587 DIArray Elements = CTy->getTypeArray();
Devang Patel161b2f42011-04-12 23:21:44 +00001588 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1589 DIDescriptor Element = Elements.getElement(i);
1590 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1591 constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1592 }
1593}
1594
1595/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
1596DIE *CompileUnit::constructEnumTypeDIE(DIEnumerator ETy) {
1597 DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
1598 StringRef Name = ETy.getName();
Nick Lewycky390c40d2011-10-27 06:44:11 +00001599 addString(Enumerator, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001600 int64_t Value = ETy.getEnumValue();
1601 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
1602 return Enumerator;
1603}
1604
Devang Pateldbc64af2011-08-15 17:24:54 +00001605/// constructContainingTypeDIEs - Construct DIEs for types that contain
1606/// vtables.
1607void CompileUnit::constructContainingTypeDIEs() {
1608 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
1609 CE = ContainingTypeMap.end(); CI != CE; ++CI) {
1610 DIE *SPDie = CI->first;
1611 const MDNode *N = CI->second;
1612 if (!N) continue;
Eric Christopher3f045002013-10-04 17:08:38 +00001613 DIE *NDie = getDIE(N);
Devang Pateldbc64af2011-08-15 17:24:54 +00001614 if (!NDie) continue;
1615 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
1616 }
1617}
1618
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001619/// constructVariableDIE - Construct a DIE for the given DbgVariable.
Eric Christopherf61dbc12013-06-24 21:07:27 +00001620DIE *CompileUnit::constructVariableDIE(DbgVariable *DV,
1621 bool isScopeAbstract) {
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001622 StringRef Name = DV->getName();
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001623
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001624 // Define variable debug information entry.
David Blaikie916d49e2013-10-04 23:21:16 +00001625 DIE *VariableDie = new DIE(DV->getTag());
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001626 DbgVariable *AbsVar = DV->getAbstractVariable();
1627 DIE *AbsDIE = AbsVar ? AbsVar->getDIE() : NULL;
Manman Ren742671b2013-05-29 17:16:59 +00001628 if (AbsDIE)
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001629 addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
Manman Ren742671b2013-05-29 17:16:59 +00001630 dwarf::DW_FORM_ref4, AbsDIE);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001631 else {
David Blaikie2883fd42013-08-19 03:34:03 +00001632 if (!Name.empty())
1633 addString(VariableDie, dwarf::DW_AT_name, Name);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001634 addSourceLine(VariableDie, DV->getVariable());
1635 addType(VariableDie, DV->getType());
1636 }
1637
1638 if (DV->isArtificial())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001639 addFlag(VariableDie, dwarf::DW_AT_artificial);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001640
1641 if (isScopeAbstract) {
1642 DV->setDIE(VariableDie);
1643 return VariableDie;
1644 }
1645
1646 // Add variable address.
1647
1648 unsigned Offset = DV->getDotDebugLocOffset();
1649 if (Offset != ~0U) {
Eric Christopherafbe0e22013-06-24 21:34:55 +00001650 addLabel(VariableDie, dwarf::DW_AT_location, dwarf::DW_FORM_data4,
1651 Asm->GetTempSymbol("debug_loc", Offset));
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001652 DV->setDIE(VariableDie);
1653 return VariableDie;
1654 }
1655
Eric Christopher8cf5e742011-10-03 15:49:20 +00001656 // Check if variable is described by a DBG_VALUE instruction.
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001657 if (const MachineInstr *DVInsn = DV->getMInsn()) {
David Blaikie6d9dbd52013-06-16 20:34:15 +00001658 assert(DVInsn->getNumOperands() == 3);
1659 if (DVInsn->getOperand(0).isReg()) {
1660 const MachineOperand RegOp = DVInsn->getOperand(0);
Adrian Prantlb2754912013-07-09 21:44:06 +00001661 // If the second operand is an immediate, this is an indirect value.
Adrian Prantl35176402013-07-09 20:28:37 +00001662 if (DVInsn->getOperand(1).isImm()) {
1663 MachineLocation Location(RegOp.getReg(), DVInsn->getOperand(1).getImm());
Eric Christopherf61dbc12013-06-24 21:07:27 +00001664 addVariableAddress(*DV, VariableDie, Location);
David Blaikie6d9dbd52013-06-16 20:34:15 +00001665 } else if (RegOp.getReg())
Eric Christopherf61dbc12013-06-24 21:07:27 +00001666 addVariableAddress(*DV, VariableDie, MachineLocation(RegOp.getReg()));
David Blaikie6d9dbd52013-06-16 20:34:15 +00001667 } else if (DVInsn->getOperand(0).isImm())
Eric Christophere4721492013-07-03 01:08:30 +00001668 addConstantValue(VariableDie, DVInsn->getOperand(0), DV->getType());
David Blaikie6d9dbd52013-06-16 20:34:15 +00001669 else if (DVInsn->getOperand(0).isFPImm())
Eric Christophere4721492013-07-03 01:08:30 +00001670 addConstantFPValue(VariableDie, DVInsn->getOperand(0));
David Blaikie6d9dbd52013-06-16 20:34:15 +00001671 else if (DVInsn->getOperand(0).isCImm())
Eric Christophere4721492013-07-03 01:08:30 +00001672 addConstantValue(VariableDie, DVInsn->getOperand(0).getCImm(),
Eric Christopher3f045002013-10-04 17:08:38 +00001673 DV->getType().isUnsignedDIType());
Eric Christophere4721492013-07-03 01:08:30 +00001674
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001675 DV->setDIE(VariableDie);
1676 return VariableDie;
1677 } else {
1678 // .. else use frame index.
1679 int FI = DV->getFrameIndex();
1680 if (FI != ~0) {
1681 unsigned FrameReg = 0;
1682 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
Eric Christopher8b4310b2012-11-21 00:34:38 +00001683 int Offset =
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001684 TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
1685 MachineLocation Location(FrameReg, Offset);
Eric Christopherf61dbc12013-06-24 21:07:27 +00001686 addVariableAddress(*DV, VariableDie, Location);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001687 }
1688 }
1689
1690 DV->setDIE(VariableDie);
1691 return VariableDie;
1692}
1693
Devang Patel161b2f42011-04-12 23:21:44 +00001694/// createMemberDIE - Create new member DIE.
1695DIE *CompileUnit::createMemberDIE(DIDerivedType DT) {
1696 DIE *MemberDie = new DIE(DT.getTag());
1697 StringRef Name = DT.getName();
1698 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001699 addString(MemberDie, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001700
Eric Christopher3f045002013-10-04 17:08:38 +00001701 addType(MemberDie, DT.getTypeDerivedFrom());
Devang Patel161b2f42011-04-12 23:21:44 +00001702
1703 addSourceLine(MemberDie, DT);
1704
1705 DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
1706 addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1707
1708 uint64_t Size = DT.getSizeInBits();
Eric Christopher3f045002013-10-04 17:08:38 +00001709 uint64_t FieldSize = DT.getOriginalTypeSize();
Devang Patel161b2f42011-04-12 23:21:44 +00001710
1711 if (Size != FieldSize) {
1712 // Handle bitfield.
Eric Christopher3f045002013-10-04 17:08:38 +00001713 addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
Devang Patel161b2f42011-04-12 23:21:44 +00001714 addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1715
1716 uint64_t Offset = DT.getOffsetInBits();
1717 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1718 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1719 uint64_t FieldOffset = (HiMark - FieldSize);
1720 Offset -= FieldOffset;
1721
1722 // Maybe we need to work from the other end.
Micah Villmow3574eca2012-10-08 16:38:25 +00001723 if (Asm->getDataLayout().isLittleEndian())
Devang Patel161b2f42011-04-12 23:21:44 +00001724 Offset = FieldSize - (Offset + Size);
1725 addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
1726
1727 // Here WD_AT_data_member_location points to the anonymous
1728 // field that includes this bit field.
1729 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
1730
1731 } else
1732 // This is not a bitfield.
1733 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1734
1735 if (DT.getTag() == dwarf::DW_TAG_inheritance
1736 && DT.isVirtual()) {
1737
1738 // For C++, virtual base classes are not at fixed offset. Use following
1739 // expression to extract appropriate offset from vtable.
1740 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1741
1742 DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
1743 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1744 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1745 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1746 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1747 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1748 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1749 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1750
1751 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
1752 VBaseLocationDie);
1753 } else
1754 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
1755
1756 if (DT.isProtected())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001757 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001758 dwarf::DW_ACCESS_protected);
1759 else if (DT.isPrivate())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001760 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001761 dwarf::DW_ACCESS_private);
1762 // Otherwise C++ member and base classes are considered public.
Eric Christopher8b4310b2012-11-21 00:34:38 +00001763 else
Nick Lewycky13aaca52011-12-13 05:09:11 +00001764 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001765 dwarf::DW_ACCESS_public);
1766 if (DT.isVirtual())
Nick Lewycky798313d2011-12-14 00:56:07 +00001767 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001768 dwarf::DW_VIRTUALITY_virtual);
Devang Patele9db5e22011-04-16 00:11:51 +00001769
1770 // Objective-C properties.
Devang Patel6588abf2012-02-06 17:49:43 +00001771 if (MDNode *PNode = DT.getObjCProperty())
1772 if (DIEEntry *PropertyDie = getDIEEntry(PNode))
Eric Christopher8b4310b2012-11-21 00:34:38 +00001773 MemberDie->addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4,
Devang Patel6588abf2012-02-06 17:49:43 +00001774 PropertyDie);
1775
David Blaikie01bc2b32012-12-13 22:43:07 +00001776 if (DT.isArtificial())
1777 addFlag(MemberDie, dwarf::DW_AT_artificial);
1778
Devang Patel161b2f42011-04-12 23:21:44 +00001779 return MemberDie;
1780}
Eric Christopher6b6061f2013-01-16 01:22:23 +00001781
1782/// createStaticMemberDIE - Create new DIE for C++ static member.
1783DIE *CompileUnit::createStaticMemberDIE(const DIDerivedType DT) {
1784 if (!DT.Verify())
1785 return NULL;
1786
1787 DIE *StaticMemberDIE = new DIE(DT.getTag());
Eric Christopher3f045002013-10-04 17:08:38 +00001788 DIType Ty = DT.getTypeDerivedFrom();
Eric Christopher6b6061f2013-01-16 01:22:23 +00001789
1790 addString(StaticMemberDIE, dwarf::DW_AT_name, DT.getName());
1791 addType(StaticMemberDIE, Ty);
1792 addSourceLine(StaticMemberDIE, DT);
1793 addFlag(StaticMemberDIE, dwarf::DW_AT_external);
1794 addFlag(StaticMemberDIE, dwarf::DW_AT_declaration);
1795
1796 // FIXME: We could omit private if the parent is a class_type, and
1797 // public if the parent is something else.
1798 if (DT.isProtected())
1799 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1800 dwarf::DW_ACCESS_protected);
1801 else if (DT.isPrivate())
1802 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1803 dwarf::DW_ACCESS_private);
1804 else
1805 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1806 dwarf::DW_ACCESS_public);
1807
1808 if (const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(DT.getConstant()))
Eric Christopher3f045002013-10-04 17:08:38 +00001809 addConstantValue(StaticMemberDIE, CI, Ty.isUnsignedDIType());
David Blaikie14268412013-01-20 01:18:01 +00001810 if (const ConstantFP *CFP = dyn_cast_or_null<ConstantFP>(DT.getConstant()))
1811 addConstantFPValue(StaticMemberDIE, CFP);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001812
Eric Christopher3f045002013-10-04 17:08:38 +00001813 insertDIE(DT, StaticMemberDIE);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001814 return StaticMemberDIE;
1815}