blob: 9afa6e2fa9d93daef7cf1f37e9f22b388b2be898 [file] [log] [blame]
Devang Patel161b2f42011-04-12 23:21:44 +00001//===-- llvm/CodeGen/DwarfCompileUnit.cpp - Dwarf Compile Unit ------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
Eric Christopher443c9ed2012-08-14 05:13:29 +000010// This file contains support for constructing a dwarf compile unit.
Devang Patel161b2f42011-04-12 23:21:44 +000011//
12//===----------------------------------------------------------------------===//
13
14#define DEBUG_TYPE "dwarfdebug"
15
16#include "DwarfCompileUnit.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000017#include "DwarfAccelTable.h"
Devang Patel161b2f42011-04-12 23:21:44 +000018#include "DwarfDebug.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000019#include "llvm/ADT/APFloat.h"
Bill Wendling16eeb6f2012-06-29 08:32:07 +000020#include "llvm/DIBuilder.h"
Chandler Carruth0b8c9a82013-01-02 11:36:10 +000021#include "llvm/IR/Constants.h"
22#include "llvm/IR/DataLayout.h"
23#include "llvm/IR/GlobalVariable.h"
24#include "llvm/IR/Instructions.h"
Eric Christopherd61c34b2011-11-11 03:16:32 +000025#include "llvm/Support/Debug.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000026#include "llvm/Support/ErrorHandling.h"
Devang Patel6f9d8ff2011-08-15 17:57:41 +000027#include "llvm/Target/Mangler.h"
Devang Patel161b2f42011-04-12 23:21:44 +000028#include "llvm/Target/TargetFrameLowering.h"
29#include "llvm/Target/TargetMachine.h"
David Blaikie59eaa382013-06-28 20:05:11 +000030#include "llvm/Target/TargetLoweringObjectFile.h"
Devang Patel161b2f42011-04-12 23:21:44 +000031#include "llvm/Target/TargetRegisterInfo.h"
Devang Patel161b2f42011-04-12 23:21:44 +000032
33using namespace llvm;
34
35/// CompileUnit - Compile unit constructor.
Eric Christopher7b878952013-08-26 23:50:38 +000036CompileUnit::CompileUnit(unsigned UID, DIE *D, const MDNode *N, AsmPrinter *A,
37 DwarfDebug *DW, DwarfUnits *DWU)
Eric Christophere7099f62013-10-04 19:40:33 +000038 : UniqueID(UID), Node(N), CUDie(D), Asm(A), DD(DW), DU(DWU), IndexTyDie(0) {
Devang Patel161b2f42011-04-12 23:21:44 +000039 DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
Eric Christopher9c57ad22013-05-08 00:58:51 +000040 insertDIE(N, D);
Devang Patel161b2f42011-04-12 23:21:44 +000041}
42
43/// ~CompileUnit - Destructor for compile unit.
44CompileUnit::~CompileUnit() {
45 for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
46 DIEBlocks[j]->~DIEBlock();
47}
48
49/// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
50/// information entry.
51DIEEntry *CompileUnit::createDIEEntry(DIE *Entry) {
52 DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
53 return Value;
54}
55
Bill Wendling6afe4782012-12-06 07:55:19 +000056/// getDefaultLowerBound - Return the default lower bound for an array. If the
Bill Wendling222c2fd2012-12-06 07:38:10 +000057/// DWARF version doesn't handle the language, return -1.
Bill Wendling6afe4782012-12-06 07:55:19 +000058int64_t CompileUnit::getDefaultLowerBound() const {
Eric Christopher7b878952013-08-26 23:50:38 +000059 switch (DICompileUnit(Node).getLanguage()) {
Bill Wendling222c2fd2012-12-06 07:38:10 +000060 default:
61 break;
62
63 case dwarf::DW_LANG_C89:
64 case dwarf::DW_LANG_C99:
65 case dwarf::DW_LANG_C:
66 case dwarf::DW_LANG_C_plus_plus:
67 case dwarf::DW_LANG_ObjC:
68 case dwarf::DW_LANG_ObjC_plus_plus:
69 return 0;
70
71 case dwarf::DW_LANG_Fortran77:
72 case dwarf::DW_LANG_Fortran90:
73 case dwarf::DW_LANG_Fortran95:
74 return 1;
75
76 // The languages below have valid values only if the DWARF version >= 4.
77 case dwarf::DW_LANG_Java:
78 case dwarf::DW_LANG_Python:
79 case dwarf::DW_LANG_UPC:
80 case dwarf::DW_LANG_D:
81 if (dwarf::DWARF_VERSION >= 4)
82 return 0;
83 break;
84
85 case dwarf::DW_LANG_Ada83:
86 case dwarf::DW_LANG_Ada95:
87 case dwarf::DW_LANG_Cobol74:
88 case dwarf::DW_LANG_Cobol85:
89 case dwarf::DW_LANG_Modula2:
90 case dwarf::DW_LANG_Pascal83:
91 case dwarf::DW_LANG_PLI:
92 if (dwarf::DWARF_VERSION >= 4)
93 return 1;
94 break;
95 }
96
97 return -1;
98}
99
Eric Christopher873cf0a2012-08-24 01:14:27 +0000100/// addFlag - Add a flag that is true.
Eric Christopher31667622013-08-08 01:41:00 +0000101void CompileUnit::addFlag(DIE *Die, uint16_t Attribute) {
Michael Gottesmandc42d032013-09-04 04:39:38 +0000102 if (DD->getDwarfVersion() >= 4)
Eric Christopher873cf0a2012-08-24 01:14:27 +0000103 Die->addValue(Attribute, dwarf::DW_FORM_flag_present,
104 DIEIntegerOne);
105 else
106 addUInt(Die, Attribute, dwarf::DW_FORM_flag, 1);
107}
108
Devang Patel161b2f42011-04-12 23:21:44 +0000109/// addUInt - Add an unsigned integer attribute data and value.
110///
Eric Christopher31667622013-08-08 01:41:00 +0000111void CompileUnit::addUInt(DIE *Die, uint16_t Attribute,
112 uint16_t Form, uint64_t Integer) {
Devang Patel161b2f42011-04-12 23:21:44 +0000113 if (!Form) Form = DIEInteger::BestForm(false, Integer);
114 DIEValue *Value = Integer == 1 ?
115 DIEIntegerOne : new (DIEValueAllocator) DIEInteger(Integer);
116 Die->addValue(Attribute, Form, Value);
117}
118
119/// addSInt - Add an signed integer attribute data and value.
120///
Eric Christopher31667622013-08-08 01:41:00 +0000121void CompileUnit::addSInt(DIE *Die, uint16_t Attribute,
122 uint16_t Form, int64_t Integer) {
Devang Patel161b2f42011-04-12 23:21:44 +0000123 if (!Form) Form = DIEInteger::BestForm(true, Integer);
124 DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
125 Die->addValue(Attribute, Form, Value);
126}
127
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000128/// addString - Add a string attribute data and value. We always emit a
129/// reference to the string pool instead of immediate strings so that DIEs have
Eric Christopher3cc42202013-01-07 19:32:45 +0000130/// more predictable sizes. In the case of split dwarf we emit an index
131/// into another table which gets us the static offset into the string
132/// table.
Eric Christopher31667622013-08-08 01:41:00 +0000133void CompileUnit::addString(DIE *Die, uint16_t Attribute, StringRef String) {
Eric Christopher3dee5752013-07-26 17:02:41 +0000134 DIEValue *Value;
Eric Christopher31667622013-08-08 01:41:00 +0000135 uint16_t Form;
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000136 if (!DD->useSplitDwarf()) {
137 MCSymbol *Symb = DU->getStringPoolEntry(String);
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000138 if (Asm->needsRelocationsForDwarfStringPool())
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000139 Value = new (DIEValueAllocator) DIELabel(Symb);
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000140 else {
141 MCSymbol *StringPool = DU->getStringPoolSym();
142 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
143 }
Eric Christopher3dee5752013-07-26 17:02:41 +0000144 Form = dwarf::DW_FORM_strp;
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000145 } else {
146 unsigned idx = DU->getStringPoolIndex(String);
Eric Christopher3dee5752013-07-26 17:02:41 +0000147 Value = new (DIEValueAllocator) DIEInteger(idx);
148 Form = dwarf::DW_FORM_GNU_str_index;
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000149 }
Eric Christopher3dee5752013-07-26 17:02:41 +0000150 DIEValue *Str = new (DIEValueAllocator) DIEString(Value, String);
151 Die->addValue(Attribute, Form, Str);
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000152}
153
154/// addLocalString - Add a string attribute data and value. This is guaranteed
155/// to be in the local string pool instead of indirected.
Eric Christopher31667622013-08-08 01:41:00 +0000156void CompileUnit::addLocalString(DIE *Die, uint16_t Attribute,
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000157 StringRef String) {
Eric Christopher2e5d8702012-12-20 21:58:36 +0000158 MCSymbol *Symb = DU->getStringPoolEntry(String);
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000159 DIEValue *Value;
160 if (Asm->needsRelocationsForDwarfStringPool())
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000161 Value = new (DIEValueAllocator) DIELabel(Symb);
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000162 else {
Eric Christopher2e5d8702012-12-20 21:58:36 +0000163 MCSymbol *StringPool = DU->getStringPoolSym();
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000164 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
Nick Lewycky390c40d2011-10-27 06:44:11 +0000165 }
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000166 Die->addValue(Attribute, dwarf::DW_FORM_strp, Value);
Devang Patel161b2f42011-04-12 23:21:44 +0000167}
168
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000169/// addExpr - Add a Dwarf expression attribute data and value.
Devang Patel161b2f42011-04-12 23:21:44 +0000170///
Eric Christopher31667622013-08-08 01:41:00 +0000171void CompileUnit::addExpr(DIE *Die, uint16_t Attribute, uint16_t Form,
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000172 const MCExpr *Expr) {
173 DIEValue *Value = new (DIEValueAllocator) DIEExpr(Expr);
Devang Patel161b2f42011-04-12 23:21:44 +0000174 Die->addValue(Attribute, Form, Value);
175}
176
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000177/// addLabel - Add a Dwarf label attribute data and value.
178///
Eric Christopher31667622013-08-08 01:41:00 +0000179void CompileUnit::addLabel(DIE *Die, uint16_t Attribute, uint16_t Form,
David Blaikie95e72c92013-06-28 20:05:04 +0000180 const MCSymbol *Label) {
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000181 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
182 Die->addValue(Attribute, Form, Value);
David Blaikie95e72c92013-06-28 20:05:04 +0000183}
184
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000185/// addLabelAddress - Add a dwarf label attribute data and value using
186/// DW_FORM_addr or DW_FORM_GNU_addr_index.
187///
Eric Christopher31667622013-08-08 01:41:00 +0000188void CompileUnit::addLabelAddress(DIE *Die, uint16_t Attribute,
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000189 MCSymbol *Label) {
Alexey Samsonov9d08d692013-10-03 08:54:43 +0000190 if (Label)
191 DD->addArangeLabel(SymbolCU(this, Label));
Richard Mitton5cc319a2013-09-19 23:21:01 +0000192
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000193 if (!DD->useSplitDwarf()) {
194 if (Label != NULL) {
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000195 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000196 Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
197 } else {
198 DIEValue *Value = new (DIEValueAllocator) DIEInteger(0);
199 Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
200 }
201 } else {
202 unsigned idx = DU->getAddrPoolIndex(Label);
203 DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx);
204 Die->addValue(Attribute, dwarf::DW_FORM_GNU_addr_index, Value);
205 }
206}
207
Eric Christopher0969ddf2013-01-18 22:11:33 +0000208/// addOpAddress - Add a dwarf op address data and value using the
209/// form given and an op of either DW_FORM_addr or DW_FORM_GNU_addr_index.
210///
David Blaikie95e72c92013-06-28 20:05:04 +0000211void CompileUnit::addOpAddress(DIE *Die, const MCSymbol *Sym) {
Alexey Samsonov9d08d692013-10-03 08:54:43 +0000212 DD->addArangeLabel(SymbolCU(this, Sym));
Eric Christopher0969ddf2013-01-18 22:11:33 +0000213 if (!DD->useSplitDwarf()) {
214 addUInt(Die, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
215 addLabel(Die, 0, dwarf::DW_FORM_udata, Sym);
216 } else {
Eric Christopher0969ddf2013-01-18 22:11:33 +0000217 addUInt(Die, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_addr_index);
David Blaikie8fed05e2013-07-01 23:55:52 +0000218 addUInt(Die, 0, dwarf::DW_FORM_GNU_addr_index, DU->getAddrPoolIndex(Sym));
Eric Christopher0969ddf2013-01-18 22:11:33 +0000219 }
220}
221
Devang Patel161b2f42011-04-12 23:21:44 +0000222/// addDelta - Add a label delta attribute data and value.
223///
Eric Christopher31667622013-08-08 01:41:00 +0000224void CompileUnit::addDelta(DIE *Die, uint16_t Attribute, uint16_t Form,
Devang Patel161b2f42011-04-12 23:21:44 +0000225 const MCSymbol *Hi, const MCSymbol *Lo) {
226 DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
227 Die->addValue(Attribute, Form, Value);
228}
229
230/// addDIEEntry - Add a DIE attribute data and value.
231///
Eric Christopher31667622013-08-08 01:41:00 +0000232void CompileUnit::addDIEEntry(DIE *Die, uint16_t Attribute, uint16_t Form,
Devang Patel161b2f42011-04-12 23:21:44 +0000233 DIE *Entry) {
Eric Christopher3f045002013-10-04 17:08:38 +0000234 Die->addValue(Attribute, Form, createDIEEntry(Entry));
Devang Patel161b2f42011-04-12 23:21:44 +0000235}
236
Devang Patel161b2f42011-04-12 23:21:44 +0000237/// addBlock - Add block data.
238///
Eric Christopher31667622013-08-08 01:41:00 +0000239void CompileUnit::addBlock(DIE *Die, uint16_t Attribute, uint16_t Form,
Devang Patel161b2f42011-04-12 23:21:44 +0000240 DIEBlock *Block) {
241 Block->ComputeSize(Asm);
242 DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
243 Die->addValue(Attribute, Block->BestForm(), Block);
244}
245
246/// addSourceLine - Add location information to specified debug information
247/// entry.
248void CompileUnit::addSourceLine(DIE *Die, DIVariable V) {
249 // Verify variable.
Manman Rend03d2b22013-07-08 18:33:29 +0000250 if (!V.isVariable())
Devang Patel161b2f42011-04-12 23:21:44 +0000251 return;
Eric Christopher8b4310b2012-11-21 00:34:38 +0000252
Devang Patel161b2f42011-04-12 23:21:44 +0000253 unsigned Line = V.getLineNumber();
254 if (Line == 0)
255 return;
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000256 unsigned FileID = DD->getOrCreateSourceID(V.getContext().getFilename(),
Manman Ren3de61b42013-03-07 01:42:00 +0000257 V.getContext().getDirectory(),
258 getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000259 assert(FileID && "Invalid file id");
260 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
261 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
262}
263
264/// addSourceLine - Add location information to specified debug information
265/// entry.
266void CompileUnit::addSourceLine(DIE *Die, DIGlobalVariable G) {
267 // Verify global variable.
Manman Rend03d2b22013-07-08 18:33:29 +0000268 if (!G.isGlobalVariable())
Devang Patel161b2f42011-04-12 23:21:44 +0000269 return;
270
271 unsigned Line = G.getLineNumber();
272 if (Line == 0)
273 return;
Manman Ren3de61b42013-03-07 01:42:00 +0000274 unsigned FileID = DD->getOrCreateSourceID(G.getFilename(), G.getDirectory(),
275 getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000276 assert(FileID && "Invalid file id");
277 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
278 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
279}
280
281/// addSourceLine - Add location information to specified debug information
282/// entry.
283void CompileUnit::addSourceLine(DIE *Die, DISubprogram SP) {
284 // Verify subprogram.
Manman Rend03d2b22013-07-08 18:33:29 +0000285 if (!SP.isSubprogram())
Devang Patel161b2f42011-04-12 23:21:44 +0000286 return;
Eric Christopher2125d5a2012-03-15 23:55:40 +0000287
Devang Patel161b2f42011-04-12 23:21:44 +0000288 // If the line number is 0, don't add it.
Eric Christopher2125d5a2012-03-15 23:55:40 +0000289 unsigned Line = SP.getLineNumber();
290 if (Line == 0)
Devang Patel161b2f42011-04-12 23:21:44 +0000291 return;
292
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000293 unsigned FileID = DD->getOrCreateSourceID(SP.getFilename(),
Manman Ren3de61b42013-03-07 01:42:00 +0000294 SP.getDirectory(), getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000295 assert(FileID && "Invalid file id");
296 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
297 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
298}
299
300/// addSourceLine - Add location information to specified debug information
301/// entry.
302void CompileUnit::addSourceLine(DIE *Die, DIType Ty) {
303 // Verify type.
Manman Rend03d2b22013-07-08 18:33:29 +0000304 if (!Ty.isType())
Devang Patel161b2f42011-04-12 23:21:44 +0000305 return;
306
307 unsigned Line = Ty.getLineNumber();
Eric Christopher2125d5a2012-03-15 23:55:40 +0000308 if (Line == 0)
Devang Patel161b2f42011-04-12 23:21:44 +0000309 return;
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000310 unsigned FileID = DD->getOrCreateSourceID(Ty.getFilename(),
Manman Ren3de61b42013-03-07 01:42:00 +0000311 Ty.getDirectory(), getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000312 assert(FileID && "Invalid file id");
313 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
314 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
315}
316
317/// addSourceLine - Add location information to specified debug information
318/// entry.
Eric Christopherb8ca9882012-03-29 08:42:56 +0000319void CompileUnit::addSourceLine(DIE *Die, DIObjCProperty Ty) {
320 // Verify type.
Manman Rend03d2b22013-07-08 18:33:29 +0000321 if (!Ty.isObjCProperty())
Eric Christopherb8ca9882012-03-29 08:42:56 +0000322 return;
323
324 unsigned Line = Ty.getLineNumber();
325 if (Line == 0)
326 return;
327 DIFile File = Ty.getFile();
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000328 unsigned FileID = DD->getOrCreateSourceID(File.getFilename(),
Manman Ren3de61b42013-03-07 01:42:00 +0000329 File.getDirectory(), getUniqueID());
Eric Christopherb8ca9882012-03-29 08:42:56 +0000330 assert(FileID && "Invalid file id");
331 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
332 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
333}
334
335/// addSourceLine - Add location information to specified debug information
336/// entry.
Devang Patel161b2f42011-04-12 23:21:44 +0000337void CompileUnit::addSourceLine(DIE *Die, DINameSpace NS) {
338 // Verify namespace.
339 if (!NS.Verify())
340 return;
341
342 unsigned Line = NS.getLineNumber();
343 if (Line == 0)
344 return;
345 StringRef FN = NS.getFilename();
346
Manman Ren3de61b42013-03-07 01:42:00 +0000347 unsigned FileID = DD->getOrCreateSourceID(FN, NS.getDirectory(),
348 getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000349 assert(FileID && "Invalid file id");
350 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
351 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
352}
353
Eric Christopher8b4310b2012-11-21 00:34:38 +0000354/// addVariableAddress - Add DW_AT_location attribute for a
Devang Patele1cdf842011-04-27 22:45:24 +0000355/// DbgVariable based on provided MachineLocation.
Eric Christopherf61dbc12013-06-24 21:07:27 +0000356void CompileUnit::addVariableAddress(const DbgVariable &DV, DIE *Die,
Devang Patele1cdf842011-04-27 22:45:24 +0000357 MachineLocation Location) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000358 if (DV.variableHasComplexAddress())
Devang Patel161b2f42011-04-12 23:21:44 +0000359 addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
Eric Christopherf61dbc12013-06-24 21:07:27 +0000360 else if (DV.isBlockByrefVariable())
Devang Patel161b2f42011-04-12 23:21:44 +0000361 addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location);
362 else
David Blaikie4532c282013-06-20 00:25:24 +0000363 addAddress(Die, dwarf::DW_AT_location, Location,
Eric Christopherf61dbc12013-06-24 21:07:27 +0000364 DV.getVariable().isIndirect());
Devang Patel161b2f42011-04-12 23:21:44 +0000365}
366
Devang Patel116da2f2011-04-26 19:06:18 +0000367/// addRegisterOp - Add register operand.
368void CompileUnit::addRegisterOp(DIE *TheDie, unsigned Reg) {
369 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
370 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
371 if (DWReg < 32)
372 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + DWReg);
373 else {
374 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
375 addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
376 }
377}
378
379/// addRegisterOffset - Add register offset.
380void CompileUnit::addRegisterOffset(DIE *TheDie, unsigned Reg,
381 int64_t Offset) {
382 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
383 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
384 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
385 if (Reg == TRI->getFrameRegister(*Asm->MF))
386 // If variable offset is based in frame register then use fbreg.
387 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
388 else if (DWReg < 32)
389 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DWReg);
390 else {
391 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
392 addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
393 }
394 addSInt(TheDie, 0, dwarf::DW_FORM_sdata, Offset);
395}
396
397/// addAddress - Add an address attribute to a die based on the location
398/// provided.
Eric Christopher31667622013-08-08 01:41:00 +0000399void CompileUnit::addAddress(DIE *Die, uint16_t Attribute,
David Blaikie4532c282013-06-20 00:25:24 +0000400 const MachineLocation &Location, bool Indirect) {
Devang Patel116da2f2011-04-26 19:06:18 +0000401 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
402
David Blaikie4532c282013-06-20 00:25:24 +0000403 if (Location.isReg() && !Indirect)
Devang Patel116da2f2011-04-26 19:06:18 +0000404 addRegisterOp(Block, Location.getReg());
David Blaikie4532c282013-06-20 00:25:24 +0000405 else {
Devang Patel116da2f2011-04-26 19:06:18 +0000406 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
David Blaikie4532c282013-06-20 00:25:24 +0000407 if (Indirect && !Location.isReg()) {
408 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
409 }
410 }
Devang Patel116da2f2011-04-26 19:06:18 +0000411
412 // Now attach the location information to the DIE.
413 addBlock(Die, Attribute, 0, Block);
414}
415
Devang Patel161b2f42011-04-12 23:21:44 +0000416/// addComplexAddress - Start with the address based on the location provided,
417/// and generate the DWARF information necessary to find the actual variable
418/// given the extra address information encoded in the DIVariable, starting from
419/// the starting location. Add the DWARF information to the die.
420///
Eric Christopherf61dbc12013-06-24 21:07:27 +0000421void CompileUnit::addComplexAddress(const DbgVariable &DV, DIE *Die,
Eric Christopher31667622013-08-08 01:41:00 +0000422 uint16_t Attribute,
Devang Patel161b2f42011-04-12 23:21:44 +0000423 const MachineLocation &Location) {
Devang Patel161b2f42011-04-12 23:21:44 +0000424 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Eric Christopherf61dbc12013-06-24 21:07:27 +0000425 unsigned N = DV.getNumAddrElements();
Devang Patelc26f5442011-04-28 02:22:40 +0000426 unsigned i = 0;
427 if (Location.isReg()) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000428 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
Devang Patelc26f5442011-04-28 02:22:40 +0000429 // If first address element is OpPlus then emit
430 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
Eric Christopherf61dbc12013-06-24 21:07:27 +0000431 addRegisterOffset(Block, Location.getReg(), DV.getAddrElement(1));
Devang Patelc26f5442011-04-28 02:22:40 +0000432 i = 2;
433 } else
434 addRegisterOp(Block, Location.getReg());
435 }
Devang Patel116da2f2011-04-26 19:06:18 +0000436 else
437 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel161b2f42011-04-12 23:21:44 +0000438
Devang Patelc26f5442011-04-28 02:22:40 +0000439 for (;i < N; ++i) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000440 uint64_t Element = DV.getAddrElement(i);
Devang Patel161b2f42011-04-12 23:21:44 +0000441 if (Element == DIBuilder::OpPlus) {
442 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
Eric Christopherf61dbc12013-06-24 21:07:27 +0000443 addUInt(Block, 0, dwarf::DW_FORM_udata, DV.getAddrElement(++i));
Devang Patel161b2f42011-04-12 23:21:44 +0000444 } else if (Element == DIBuilder::OpDeref) {
Eric Christopher50120762012-05-08 18:56:00 +0000445 if (!Location.isReg())
446 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Devang Patel161b2f42011-04-12 23:21:44 +0000447 } else llvm_unreachable("unknown DIBuilder Opcode");
448 }
449
450 // Now attach the location information to the DIE.
451 addBlock(Die, Attribute, 0, Block);
452}
453
454/* Byref variables, in Blocks, are declared by the programmer as "SomeType
455 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
456 gives the variable VarName either the struct, or a pointer to the struct, as
457 its type. This is necessary for various behind-the-scenes things the
458 compiler needs to do with by-reference variables in Blocks.
459
460 However, as far as the original *programmer* is concerned, the variable
461 should still have type 'SomeType', as originally declared.
462
463 The function getBlockByrefType dives into the __Block_byref_x_VarName
464 struct to find the original type of the variable, which is then assigned to
465 the variable's Debug Information Entry as its real type. So far, so good.
466 However now the debugger will expect the variable VarName to have the type
467 SomeType. So we need the location attribute for the variable to be an
468 expression that explains to the debugger how to navigate through the
469 pointers and struct to find the actual variable of type SomeType.
470
471 The following function does just that. We start by getting
472 the "normal" location for the variable. This will be the location
473 of either the struct __Block_byref_x_VarName or the pointer to the
474 struct __Block_byref_x_VarName.
475
476 The struct will look something like:
477
478 struct __Block_byref_x_VarName {
479 ... <various fields>
480 struct __Block_byref_x_VarName *forwarding;
481 ... <various other fields>
482 SomeType VarName;
483 ... <maybe more fields>
484 };
485
486 If we are given the struct directly (as our starting point) we
487 need to tell the debugger to:
488
489 1). Add the offset of the forwarding field.
490
491 2). Follow that pointer to get the real __Block_byref_x_VarName
492 struct to use (the real one may have been copied onto the heap).
493
494 3). Add the offset for the field VarName, to find the actual variable.
495
496 If we started with a pointer to the struct, then we need to
497 dereference that pointer first, before the other steps.
498 Translating this into DWARF ops, we will need to append the following
499 to the current location description for the variable:
500
501 DW_OP_deref -- optional, if we start with a pointer
502 DW_OP_plus_uconst <forward_fld_offset>
503 DW_OP_deref
504 DW_OP_plus_uconst <varName_fld_offset>
505
506 That is what this function does. */
507
508/// addBlockByrefAddress - Start with the address based on the location
509/// provided, and generate the DWARF information necessary to find the
510/// actual Block variable (navigating the Block struct) based on the
511/// starting location. Add the DWARF information to the die. For
512/// more information, read large comment just above here.
513///
Eric Christopherf61dbc12013-06-24 21:07:27 +0000514void CompileUnit::addBlockByrefAddress(const DbgVariable &DV, DIE *Die,
Eric Christopher31667622013-08-08 01:41:00 +0000515 uint16_t Attribute,
Devang Patel161b2f42011-04-12 23:21:44 +0000516 const MachineLocation &Location) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000517 DIType Ty = DV.getType();
Devang Patel161b2f42011-04-12 23:21:44 +0000518 DIType TmpTy = Ty;
Eric Christopher31667622013-08-08 01:41:00 +0000519 uint16_t Tag = Ty.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +0000520 bool isPointer = false;
521
Eric Christopherf61dbc12013-06-24 21:07:27 +0000522 StringRef varName = DV.getName();
Devang Patel161b2f42011-04-12 23:21:44 +0000523
524 if (Tag == dwarf::DW_TAG_pointer_type) {
525 DIDerivedType DTy = DIDerivedType(Ty);
Eric Christopher3f045002013-10-04 17:08:38 +0000526 TmpTy = DTy.getTypeDerivedFrom();
Devang Patel161b2f42011-04-12 23:21:44 +0000527 isPointer = true;
528 }
529
530 DICompositeType blockStruct = DICompositeType(TmpTy);
531
532 // Find the __forwarding field and the variable field in the __Block_byref
533 // struct.
534 DIArray Fields = blockStruct.getTypeArray();
535 DIDescriptor varField = DIDescriptor();
536 DIDescriptor forwardingField = DIDescriptor();
537
538 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
539 DIDescriptor Element = Fields.getElement(i);
540 DIDerivedType DT = DIDerivedType(Element);
541 StringRef fieldName = DT.getName();
542 if (fieldName == "__forwarding")
543 forwardingField = Element;
544 else if (fieldName == varName)
545 varField = Element;
546 }
547
548 // Get the offsets for the forwarding field and the variable field.
549 unsigned forwardingFieldOffset =
550 DIDerivedType(forwardingField).getOffsetInBits() >> 3;
551 unsigned varFieldOffset =
552 DIDerivedType(varField).getOffsetInBits() >> 3;
553
554 // Decode the original location, and use that as the start of the byref
555 // variable's location.
Devang Patel161b2f42011-04-12 23:21:44 +0000556 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
557
Eric Christophercaba2632012-07-04 02:02:18 +0000558 if (Location.isReg())
559 addRegisterOp(Block, Location.getReg());
560 else
561 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel161b2f42011-04-12 23:21:44 +0000562
563 // If we started with a pointer to the __Block_byref... struct, then
564 // the first thing we need to do is dereference the pointer (DW_OP_deref).
565 if (isPointer)
566 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
567
568 // Next add the offset for the '__forwarding' field:
569 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
570 // adding the offset if it's 0.
571 if (forwardingFieldOffset > 0) {
572 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
573 addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
574 }
575
576 // Now dereference the __forwarding field to get to the real __Block_byref
577 // struct: DW_OP_deref.
578 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
579
580 // Now that we've got the real __Block_byref... struct, add the offset
581 // for the variable's field to get to the location of the actual variable:
582 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
583 if (varFieldOffset > 0) {
584 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
585 addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
586 }
587
588 // Now attach the location information to the DIE.
589 addBlock(Die, Attribute, 0, Block);
590}
591
Devang Patel4ec14b02011-07-20 21:57:04 +0000592/// isTypeSigned - Return true if the type is signed.
Eric Christopher3f045002013-10-04 17:08:38 +0000593static bool isTypeSigned(DIType Ty, int *SizeInBits) {
Devang Patel4ec14b02011-07-20 21:57:04 +0000594 if (Ty.isDerivedType())
Eric Christopher3f045002013-10-04 17:08:38 +0000595 return isTypeSigned(DIDerivedType(Ty).getTypeDerivedFrom(), SizeInBits);
Devang Patel4ec14b02011-07-20 21:57:04 +0000596 if (Ty.isBasicType())
597 if (DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed
598 || DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed_char) {
599 *SizeInBits = Ty.getSizeInBits();
600 return true;
601 }
602 return false;
603}
604
Devang Patel161b2f42011-04-12 23:21:44 +0000605/// addConstantValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000606void CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO,
Devang Patelb58128e2011-05-27 16:45:18 +0000607 DIType Ty) {
David Blaikie4de9d722013-05-10 21:52:07 +0000608 // FIXME: This is a bit conservative/simple - it emits negative values at
609 // their maximum bit width which is a bit unfortunate (& doesn't prefer
610 // udata/sdata over dataN as suggested by the DWARF spec)
Nick Lewycky746cb672011-10-26 22:55:33 +0000611 assert(MO.isImm() && "Invalid machine operand!");
Devang Patel4ec14b02011-07-20 21:57:04 +0000612 int SizeInBits = -1;
Eric Christopher3f045002013-10-04 17:08:38 +0000613 bool SignedConstant = isTypeSigned(Ty, &SizeInBits);
Eric Christopher7b2ee392013-08-27 23:49:04 +0000614 uint16_t Form;
Devang Patel72f0d9c2011-05-27 18:15:52 +0000615
Eric Christopher7b2ee392013-08-27 23:49:04 +0000616 // If we're a signed constant definitely use sdata.
617 if (SignedConstant) {
618 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, MO.getImm());
619 return;
620 }
621
622 // Else use data for now unless it's larger than we can deal with.
623 switch (SizeInBits) {
624 case 8:
625 Form = dwarf::DW_FORM_data1;
626 break;
627 case 16:
628 Form = dwarf::DW_FORM_data2;
629 break;
630 case 32:
631 Form = dwarf::DW_FORM_data4;
632 break;
633 case 64:
634 Form = dwarf::DW_FORM_data8;
635 break;
636 default:
637 Form = dwarf::DW_FORM_udata;
638 addUInt(Die, dwarf::DW_AT_const_value, Form, MO.getImm());
639 return;
640 }
641 addUInt(Die, dwarf::DW_AT_const_value, Form, MO.getImm());
Devang Patel161b2f42011-04-12 23:21:44 +0000642}
643
644/// addConstantFPValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000645void CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
Nick Lewycky390c40d2011-10-27 06:44:11 +0000646 assert (MO.isFPImm() && "Invalid machine operand!");
Devang Patel161b2f42011-04-12 23:21:44 +0000647 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
648 APFloat FPImm = MO.getFPImm()->getValueAPF();
649
650 // Get the raw data form of the floating point.
651 const APInt FltVal = FPImm.bitcastToAPInt();
652 const char *FltPtr = (const char*)FltVal.getRawData();
653
654 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
Micah Villmow3574eca2012-10-08 16:38:25 +0000655 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel161b2f42011-04-12 23:21:44 +0000656 int Incr = (LittleEndian ? 1 : -1);
657 int Start = (LittleEndian ? 0 : NumBytes - 1);
658 int Stop = (LittleEndian ? NumBytes : -1);
659
660 // Output the constant to DWARF one byte at a time.
661 for (; Start != Stop; Start += Incr)
662 addUInt(Block, 0, dwarf::DW_FORM_data1,
663 (unsigned char)0xFF & FltPtr[Start]);
664
665 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
Devang Patel161b2f42011-04-12 23:21:44 +0000666}
667
David Blaikie14268412013-01-20 01:18:01 +0000668/// addConstantFPValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000669void CompileUnit::addConstantFPValue(DIE *Die, const ConstantFP *CFP) {
Eric Christopher7b2ee392013-08-27 23:49:04 +0000670 // Pass this down to addConstantValue as an unsigned bag of bits.
671 addConstantValue(Die, CFP->getValueAPF().bitcastToAPInt(), true);
David Blaikie14268412013-01-20 01:18:01 +0000672}
673
Devang Patel161b2f42011-04-12 23:21:44 +0000674/// addConstantValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000675void CompileUnit::addConstantValue(DIE *Die, const ConstantInt *CI,
Devang Patel161b2f42011-04-12 23:21:44 +0000676 bool Unsigned) {
Eric Christophere4721492013-07-03 01:08:30 +0000677 addConstantValue(Die, CI->getValue(), Unsigned);
David Blaikie14268412013-01-20 01:18:01 +0000678}
679
680// addConstantValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000681void CompileUnit::addConstantValue(DIE *Die, const APInt &Val, bool Unsigned) {
David Blaikie14268412013-01-20 01:18:01 +0000682 unsigned CIBitWidth = Val.getBitWidth();
Devang Pateld6a81362011-05-28 00:39:18 +0000683 if (CIBitWidth <= 64) {
Eric Christopher7b2ee392013-08-27 23:49:04 +0000684 // If we're a signed constant definitely use sdata.
685 if (!Unsigned) {
686 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata,
687 Val.getSExtValue());
688 return;
Devang Pateld6a81362011-05-28 00:39:18 +0000689 }
Eric Christopher7b2ee392013-08-27 23:49:04 +0000690
691 // Else use data for now unless it's larger than we can deal with.
692 uint16_t Form;
693 switch (CIBitWidth) {
694 case 8:
695 Form = dwarf::DW_FORM_data1;
696 break;
697 case 16:
698 Form = dwarf::DW_FORM_data2;
699 break;
700 case 32:
701 Form = dwarf::DW_FORM_data4;
702 break;
703 case 64:
704 Form = dwarf::DW_FORM_data8;
705 break;
706 default:
707 addUInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
708 Val.getZExtValue());
709 return;
710 }
711 addUInt(Die, dwarf::DW_AT_const_value, Form, Val.getZExtValue());
Eric Christophere4721492013-07-03 01:08:30 +0000712 return;
Devang Patel161b2f42011-04-12 23:21:44 +0000713 }
714
715 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
716
717 // Get the raw data form of the large APInt.
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000718 const uint64_t *Ptr64 = Val.getRawData();
Devang Patel161b2f42011-04-12 23:21:44 +0000719
720 int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
Micah Villmow3574eca2012-10-08 16:38:25 +0000721 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel161b2f42011-04-12 23:21:44 +0000722
723 // Output the constant to DWARF one byte at a time.
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000724 for (int i = 0; i < NumBytes; i++) {
725 uint8_t c;
726 if (LittleEndian)
727 c = Ptr64[i / 8] >> (8 * (i & 7));
728 else
729 c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7));
730 addUInt(Block, 0, dwarf::DW_FORM_data1, c);
731 }
Devang Patel161b2f42011-04-12 23:21:44 +0000732
733 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
Devang Patel161b2f42011-04-12 23:21:44 +0000734}
735
Eric Christopher6c3bb942013-04-22 07:47:40 +0000736/// addTemplateParams - Add template parameters into buffer.
Devang Patel161b2f42011-04-12 23:21:44 +0000737void CompileUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
738 // Add template parameters.
739 for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) {
740 DIDescriptor Element = TParams.getElement(i);
741 if (Element.isTemplateTypeParameter())
742 Buffer.addChild(getOrCreateTemplateTypeParameterDIE(
743 DITemplateTypeParameter(Element)));
744 else if (Element.isTemplateValueParameter())
745 Buffer.addChild(getOrCreateTemplateValueParameterDIE(
746 DITemplateValueParameter(Element)));
747 }
Devang Patel161b2f42011-04-12 23:21:44 +0000748}
Nick Lewycky746cb672011-10-26 22:55:33 +0000749
Eric Christopher6b6061f2013-01-16 01:22:23 +0000750/// getOrCreateContextDIE - Get context owner's DIE.
751DIE *CompileUnit::getOrCreateContextDIE(DIDescriptor Context) {
752 if (Context.isType())
753 return getOrCreateTypeDIE(DIType(Context));
754 else if (Context.isNameSpace())
755 return getOrCreateNameSpace(DINameSpace(Context));
756 else if (Context.isSubprogram())
757 return getOrCreateSubprogramDIE(DISubprogram(Context));
Eric Christopher6c3bb942013-04-22 07:47:40 +0000758 else
Eric Christopher6b6061f2013-01-16 01:22:23 +0000759 return getDIE(Context);
760}
761
Devang Patel161b2f42011-04-12 23:21:44 +0000762/// addToContextOwner - Add Die into the list of its context owner's children.
763void CompileUnit::addToContextOwner(DIE *Die, DIDescriptor Context) {
David Blaikiee5830c42013-10-03 20:07:20 +0000764 assert(!Die->getParent());
765 if (DIE *ContextDIE = getOrCreateContextDIE(Context)) {
766 if (Die->getParent()) {
767 // While creating the context, if this is a type member, we will have
768 // added the child to the context already.
769 assert(Die->getParent() == ContextDIE);
770 return;
771 }
Devang Patel161b2f42011-04-12 23:21:44 +0000772 ContextDIE->addChild(Die);
David Blaikiee5830c42013-10-03 20:07:20 +0000773 } else
Devang Patel161b2f42011-04-12 23:21:44 +0000774 addDie(Die);
775}
776
777/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
778/// given DIType.
Devang Patel94c7ddb2011-08-16 22:09:43 +0000779DIE *CompileUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
780 DIType Ty(TyNode);
Manman Rend03d2b22013-07-08 18:33:29 +0000781 if (!Ty.isType())
Devang Patel94c7ddb2011-08-16 22:09:43 +0000782 return NULL;
Eric Christopher3f045002013-10-04 17:08:38 +0000783 DIE *TyDIE = getDIE(Ty);
Devang Patel161b2f42011-04-12 23:21:44 +0000784 if (TyDIE)
785 return TyDIE;
786
787 // Create new type.
788 TyDIE = new DIE(dwarf::DW_TAG_base_type);
Eric Christopher3f045002013-10-04 17:08:38 +0000789 insertDIE(Ty, TyDIE);
Devang Patel161b2f42011-04-12 23:21:44 +0000790 if (Ty.isBasicType())
791 constructTypeDIE(*TyDIE, DIBasicType(Ty));
792 else if (Ty.isCompositeType())
793 constructTypeDIE(*TyDIE, DICompositeType(Ty));
794 else {
795 assert(Ty.isDerivedType() && "Unknown kind of DIType");
796 constructTypeDIE(*TyDIE, DIDerivedType(Ty));
797 }
Eric Christopher1b3f9192011-11-10 19:52:58 +0000798 // If this is a named finished type then include it in the list of types
799 // for the accelerator tables.
Eric Christopherc36145f2012-01-06 04:35:23 +0000800 if (!Ty.getName().empty() && !Ty.isForwardDecl()) {
801 bool IsImplementation = 0;
802 if (Ty.isCompositeType()) {
803 DICompositeType CT(Ty);
Eric Christophere0167892012-01-06 23:03:37 +0000804 // A runtime language of 0 actually means C/C++ and that any
805 // non-negative value is some version of Objective-C/C++.
Eric Christopherc36145f2012-01-06 04:35:23 +0000806 IsImplementation = (CT.getRunTimeLang() == 0) ||
Eric Christophere2dc9332012-02-22 08:46:02 +0000807 CT.isObjcClassComplete();
Eric Christopherc36145f2012-01-06 04:35:23 +0000808 }
Eric Christopher577056f2013-09-05 18:20:16 +0000809 unsigned Flags = IsImplementation ? dwarf::DW_FLAG_type_implementation : 0;
Eric Christophere0167892012-01-06 23:03:37 +0000810 addAccelType(Ty.getName(), std::make_pair(TyDIE, Flags));
Eric Christopherc36145f2012-01-06 04:35:23 +0000811 }
Eric Christopher8b4310b2012-11-21 00:34:38 +0000812
Manman Ren2c9905a2013-09-09 19:47:11 +0000813 addToContextOwner(TyDIE, DD->resolve(Ty.getContext()));
Devang Patel161b2f42011-04-12 23:21:44 +0000814 return TyDIE;
815}
816
817/// addType - Add a new type attribute to the specified entity.
Eric Christopher31667622013-08-08 01:41:00 +0000818void CompileUnit::addType(DIE *Entity, DIType Ty, uint16_t Attribute) {
Eric Christopherdc1363f2013-08-08 07:40:37 +0000819 assert(Ty && "Trying to add a type that doesn't exist?");
Devang Patel161b2f42011-04-12 23:21:44 +0000820
821 // Check for pre-existence.
822 DIEEntry *Entry = getDIEEntry(Ty);
823 // If it exists then use the existing value.
824 if (Entry) {
Eric Christopher3f045002013-10-04 17:08:38 +0000825 Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
Devang Patel161b2f42011-04-12 23:21:44 +0000826 return;
827 }
828
829 // Construct type.
830 DIE *Buffer = getOrCreateTypeDIE(Ty);
831
832 // Set up proxy.
833 Entry = createDIEEntry(Buffer);
834 insertDIEEntry(Ty, Entry);
Eric Christopher3f045002013-10-04 17:08:38 +0000835 Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
Devang Patele9ae06c2011-05-31 22:56:51 +0000836
837 // If this is a complete composite type then include it in the
838 // list of global types.
Devang Patelc20bdf12011-06-01 00:23:24 +0000839 addGlobalType(Ty);
Devang Patel66658e42011-05-31 23:30:30 +0000840}
841
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000842// Accelerator table mutators - add each name along with its companion
843// DIE to the proper table while ensuring that the name that we're going
844// to reference is in the string table. We do this since the names we
845// add may not only be identical to the names in the DIE.
846void CompileUnit::addAccelName(StringRef Name, DIE *Die) {
847 DU->getStringPoolEntry(Name);
Eric Christopher734334e2013-09-23 22:59:11 +0000848 std::vector<DIE *> &DIEs = AccelNames[Name];
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000849 DIEs.push_back(Die);
850}
851
852void CompileUnit::addAccelObjC(StringRef Name, DIE *Die) {
853 DU->getStringPoolEntry(Name);
Eric Christopher734334e2013-09-23 22:59:11 +0000854 std::vector<DIE *> &DIEs = AccelObjC[Name];
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000855 DIEs.push_back(Die);
856}
857
858void CompileUnit::addAccelNamespace(StringRef Name, DIE *Die) {
859 DU->getStringPoolEntry(Name);
Eric Christopher734334e2013-09-23 22:59:11 +0000860 std::vector<DIE *> &DIEs = AccelNamespace[Name];
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000861 DIEs.push_back(Die);
862}
863
864void CompileUnit::addAccelType(StringRef Name, std::pair<DIE *, unsigned> Die) {
865 DU->getStringPoolEntry(Name);
866 std::vector<std::pair<DIE *, unsigned> > &DIEs = AccelTypes[Name];
867 DIEs.push_back(Die);
868}
869
Eric Christopher50d37a42013-09-20 22:20:55 +0000870/// addGlobalName - Add a new global name to the compile unit.
871void CompileUnit::addGlobalName(StringRef Name, DIE *Die) {
872 GlobalNames[Name] = Die;
873}
874
Devang Patel66658e42011-05-31 23:30:30 +0000875/// addGlobalType - Add a new global type to the compile unit.
876///
Devang Patelc20bdf12011-06-01 00:23:24 +0000877void CompileUnit::addGlobalType(DIType Ty) {
Manman Ren2c9905a2013-09-09 19:47:11 +0000878 DIDescriptor Context = DD->resolve(Ty.getContext());
Eric Christopher5a634742013-09-23 23:15:58 +0000879 if (!Ty.getName().empty() && !Ty.isForwardDecl() &&
Eric Christopher734334e2013-09-23 22:59:11 +0000880 (!Context || Context.isCompileUnit() || Context.isFile() ||
881 Context.isNameSpace()))
Devang Patelc20bdf12011-06-01 00:23:24 +0000882 if (DIEEntry *Entry = getDIEEntry(Ty))
883 GlobalTypes[Ty.getName()] = Entry->getEntry();
Devang Patel161b2f42011-04-12 23:21:44 +0000884}
885
Devang Patel31c5d052011-05-06 16:57:54 +0000886/// addPubTypes - Add type for pubtypes section.
887void CompileUnit::addPubTypes(DISubprogram SP) {
888 DICompositeType SPTy = SP.getType();
Eric Christopher31667622013-08-08 01:41:00 +0000889 uint16_t SPTag = SPTy.getTag();
Devang Patel31c5d052011-05-06 16:57:54 +0000890 if (SPTag != dwarf::DW_TAG_subroutine_type)
891 return;
892
893 DIArray Args = SPTy.getTypeArray();
894 for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
895 DIType ATy(Args.getElement(i));
Manman Rend03d2b22013-07-08 18:33:29 +0000896 if (!ATy.isType())
Devang Patel31c5d052011-05-06 16:57:54 +0000897 continue;
Devang Patelc20bdf12011-06-01 00:23:24 +0000898 addGlobalType(ATy);
Devang Patel31c5d052011-05-06 16:57:54 +0000899 }
900}
901
Devang Patel161b2f42011-04-12 23:21:44 +0000902/// constructTypeDIE - Construct basic type die from DIBasicType.
903void CompileUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
904 // Get core information.
905 StringRef Name = BTy.getName();
Devang Patel161b2f42011-04-12 23:21:44 +0000906 // Add name if not anonymous or intermediate type.
907 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000908 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel734a67c2011-09-14 23:13:28 +0000909
910 if (BTy.getTag() == dwarf::DW_TAG_unspecified_type) {
911 Buffer.setTag(dwarf::DW_TAG_unspecified_type);
Eric Christopher61c91d52013-07-09 23:48:45 +0000912 // An unspecified type only has a name attribute.
Devang Patel734a67c2011-09-14 23:13:28 +0000913 return;
914 }
915
916 Buffer.setTag(dwarf::DW_TAG_base_type);
Nick Lewycky746cb672011-10-26 22:55:33 +0000917 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
Devang Patel30d409c2012-02-07 23:33:58 +0000918 BTy.getEncoding());
Devang Patel734a67c2011-09-14 23:13:28 +0000919
Devang Patel161b2f42011-04-12 23:21:44 +0000920 uint64_t Size = BTy.getSizeInBits() >> 3;
921 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
922}
923
924/// constructTypeDIE - Construct derived type die from DIDerivedType.
925void CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
926 // Get core information.
927 StringRef Name = DTy.getName();
928 uint64_t Size = DTy.getSizeInBits() >> 3;
Eric Christopher31667622013-08-08 01:41:00 +0000929 uint16_t Tag = DTy.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +0000930
931 // FIXME - Workaround for templates.
932 if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
933
934 Buffer.setTag(Tag);
935
936 // Map to main type, void will not have a type.
Eric Christopher3f045002013-10-04 17:08:38 +0000937 DIType FromTy = DTy.getTypeDerivedFrom();
Eric Christopherdc1363f2013-08-08 07:40:37 +0000938 if (FromTy)
939 addType(&Buffer, FromTy);
Devang Patel161b2f42011-04-12 23:21:44 +0000940
941 // Add name if not anonymous or intermediate type.
942 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000943 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +0000944
945 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopher35f225a2012-02-21 22:25:53 +0000946 if (Size && Tag != dwarf::DW_TAG_pointer_type)
Devang Patel161b2f42011-04-12 23:21:44 +0000947 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
948
David Blaikie62fdfb52013-01-07 05:51:15 +0000949 if (Tag == dwarf::DW_TAG_ptr_to_member_type)
950 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
Manman Renbc660712013-09-05 18:48:31 +0000951 getOrCreateTypeDIE(DD->resolve(DTy.getClassType())));
Devang Patel161b2f42011-04-12 23:21:44 +0000952 // Add source line info if available and TyDesc is not a forward declaration.
953 if (!DTy.isForwardDecl())
954 addSourceLine(&Buffer, DTy);
955}
956
Eric Christopher3dee5752013-07-26 17:02:41 +0000957/// Return true if the type is appropriately scoped to be contained inside
958/// its own type unit.
Manman Ren18eb2452013-09-09 19:23:58 +0000959static bool isTypeUnitScoped(DIType Ty, const DwarfDebug *DD) {
Manman Ren2c9905a2013-09-09 19:47:11 +0000960 DIScope Parent = DD->resolve(Ty.getContext());
Eric Christopher3dee5752013-07-26 17:02:41 +0000961 while (Parent) {
962 // Don't generate a hash for anything scoped inside a function.
963 if (Parent.isSubprogram())
964 return false;
Manman Rene72aba92013-09-09 22:35:23 +0000965 Parent = DD->resolve(Parent.getContext());
Eric Christopher3dee5752013-07-26 17:02:41 +0000966 }
967 return true;
968}
969
970/// Return true if the type should be split out into a type unit.
Manman Ren18eb2452013-09-09 19:23:58 +0000971static bool shouldCreateTypeUnit(DICompositeType CTy, const DwarfDebug *DD) {
Eric Christopher31667622013-08-08 01:41:00 +0000972 uint16_t Tag = CTy.getTag();
Eric Christopher3dee5752013-07-26 17:02:41 +0000973
974 switch (Tag) {
975 case dwarf::DW_TAG_structure_type:
976 case dwarf::DW_TAG_union_type:
977 case dwarf::DW_TAG_enumeration_type:
978 case dwarf::DW_TAG_class_type:
979 // If this is a class, structure, union, or enumeration type
980 // that is not a declaration, is a type definition, and not scoped
981 // inside a function then separate this out as a type unit.
Manman Ren18eb2452013-09-09 19:23:58 +0000982 if (CTy.isForwardDecl() || !isTypeUnitScoped(CTy, DD))
Eric Christopher3dee5752013-07-26 17:02:41 +0000983 return 0;
984 return 1;
985 default:
986 return 0;
987 }
988}
989
Devang Patel161b2f42011-04-12 23:21:44 +0000990/// constructTypeDIE - Construct type DIE from DICompositeType.
991void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
992 // Get core information.
993 StringRef Name = CTy.getName();
994
995 uint64_t Size = CTy.getSizeInBits() >> 3;
Eric Christopher31667622013-08-08 01:41:00 +0000996 uint16_t Tag = CTy.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +0000997 Buffer.setTag(Tag);
998
999 switch (Tag) {
Devang Patel161b2f42011-04-12 23:21:44 +00001000 case dwarf::DW_TAG_array_type:
1001 constructArrayTypeDIE(Buffer, &CTy);
1002 break;
1003 case dwarf::DW_TAG_enumeration_type: {
1004 DIArray Elements = CTy.getTypeArray();
1005
1006 // Add enumerators to enumeration type.
1007 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1008 DIE *ElemDie = NULL;
1009 DIDescriptor Enum(Elements.getElement(i));
1010 if (Enum.isEnumerator()) {
1011 ElemDie = constructEnumTypeDIE(DIEnumerator(Enum));
1012 Buffer.addChild(ElemDie);
1013 }
1014 }
Eric Christopher3f045002013-10-04 17:08:38 +00001015 DIType DTy = CTy.getTypeDerivedFrom();
Eric Christopher37c107b2013-08-08 07:40:42 +00001016 if (DTy) {
Eric Christopherbb0f6ea2012-05-23 00:09:20 +00001017 addType(&Buffer, DTy);
1018 addUInt(&Buffer, dwarf::DW_AT_enum_class, dwarf::DW_FORM_flag, 1);
1019 }
Devang Patel161b2f42011-04-12 23:21:44 +00001020 }
1021 break;
1022 case dwarf::DW_TAG_subroutine_type: {
Eric Christopherdc1363f2013-08-08 07:40:37 +00001023 // Add return type. A void return won't have a type.
Devang Patel161b2f42011-04-12 23:21:44 +00001024 DIArray Elements = CTy.getTypeArray();
1025 DIDescriptor RTy = Elements.getElement(0);
Eric Christopherdc1363f2013-08-08 07:40:37 +00001026 if (RTy)
1027 addType(&Buffer, DIType(RTy));
Devang Patel161b2f42011-04-12 23:21:44 +00001028
1029 bool isPrototyped = true;
1030 // Add arguments.
1031 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
1032 DIDescriptor Ty = Elements.getElement(i);
1033 if (Ty.isUnspecifiedParameter()) {
1034 DIE *Arg = new DIE(dwarf::DW_TAG_unspecified_parameters);
1035 Buffer.addChild(Arg);
1036 isPrototyped = false;
1037 } else {
1038 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1039 addType(Arg, DIType(Ty));
David Blaikieaaf2e632013-01-29 19:35:24 +00001040 if (DIType(Ty).isArtificial())
1041 addFlag(Arg, dwarf::DW_AT_artificial);
Devang Patel161b2f42011-04-12 23:21:44 +00001042 Buffer.addChild(Arg);
1043 }
1044 }
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001045 // Add prototype flag if we're dealing with a C language and the
1046 // function has been prototyped.
Eric Christopher7b878952013-08-26 23:50:38 +00001047 uint16_t Language = DICompileUnit(Node).getLanguage();
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001048 if (isPrototyped &&
Eric Christopher4d069bf2012-05-22 18:45:24 +00001049 (Language == dwarf::DW_LANG_C89 ||
1050 Language == dwarf::DW_LANG_C99 ||
1051 Language == dwarf::DW_LANG_ObjC))
Eric Christopher873cf0a2012-08-24 01:14:27 +00001052 addFlag(&Buffer, dwarf::DW_AT_prototyped);
Devang Patel161b2f42011-04-12 23:21:44 +00001053 }
1054 break;
1055 case dwarf::DW_TAG_structure_type:
1056 case dwarf::DW_TAG_union_type:
1057 case dwarf::DW_TAG_class_type: {
Devang Patel161b2f42011-04-12 23:21:44 +00001058 // Add elements to structure type.
David Blaikiec8b93552013-08-01 20:30:22 +00001059 DIArray Elements = CTy.getTypeArray();
1060 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
Devang Patel161b2f42011-04-12 23:21:44 +00001061 DIDescriptor Element = Elements.getElement(i);
1062 DIE *ElemDie = NULL;
1063 if (Element.isSubprogram()) {
1064 DISubprogram SP(Element);
Devang Pateldbc64af2011-08-15 17:24:54 +00001065 ElemDie = getOrCreateSubprogramDIE(DISubprogram(Element));
Devang Patel161b2f42011-04-12 23:21:44 +00001066 if (SP.isProtected())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001067 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001068 dwarf::DW_ACCESS_protected);
1069 else if (SP.isPrivate())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001070 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001071 dwarf::DW_ACCESS_private);
Eric Christopher8b4310b2012-11-21 00:34:38 +00001072 else
Nick Lewycky13aaca52011-12-13 05:09:11 +00001073 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001074 dwarf::DW_ACCESS_public);
1075 if (SP.isExplicit())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001076 addFlag(ElemDie, dwarf::DW_AT_explicit);
Eric Christopher663e0cf2012-03-28 07:34:31 +00001077 } else if (Element.isDerivedType()) {
Eric Christopher4d069bf2012-05-22 18:45:24 +00001078 DIDerivedType DDTy(Element);
1079 if (DDTy.getTag() == dwarf::DW_TAG_friend) {
1080 ElemDie = new DIE(dwarf::DW_TAG_friend);
Eric Christopher3f045002013-10-04 17:08:38 +00001081 addType(ElemDie, DDTy.getTypeDerivedFrom(), dwarf::DW_AT_friend);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001082 } else if (DDTy.isStaticMember())
1083 ElemDie = createStaticMemberDIE(DDTy);
1084 else
1085 ElemDie = createMemberDIE(DDTy);
David Blaikiee5830c42013-10-03 20:07:20 +00001086 Buffer.addChild(ElemDie);
Eric Christopher663e0cf2012-03-28 07:34:31 +00001087 } else if (Element.isObjCProperty()) {
Devang Patel30d409c2012-02-07 23:33:58 +00001088 DIObjCProperty Property(Element);
1089 ElemDie = new DIE(Property.getTag());
1090 StringRef PropertyName = Property.getObjCPropertyName();
1091 addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
Eric Christopher4d069bf2012-05-22 18:45:24 +00001092 addType(ElemDie, Property.getType());
1093 addSourceLine(ElemDie, Property);
Devang Patel30d409c2012-02-07 23:33:58 +00001094 StringRef GetterName = Property.getObjCPropertyGetterName();
1095 if (!GetterName.empty())
1096 addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
1097 StringRef SetterName = Property.getObjCPropertySetterName();
1098 if (!SetterName.empty())
1099 addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
1100 unsigned PropertyAttributes = 0;
Devang Patel9e11eb12012-02-04 01:30:32 +00001101 if (Property.isReadOnlyObjCProperty())
1102 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
1103 if (Property.isReadWriteObjCProperty())
1104 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
1105 if (Property.isAssignObjCProperty())
1106 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
1107 if (Property.isRetainObjCProperty())
1108 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
1109 if (Property.isCopyObjCProperty())
1110 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
1111 if (Property.isNonAtomicObjCProperty())
1112 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
1113 if (PropertyAttributes)
Eric Christopher8b4310b2012-11-21 00:34:38 +00001114 addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, 0,
Devang Patel9e11eb12012-02-04 01:30:32 +00001115 PropertyAttributes);
Devang Patel6588abf2012-02-06 17:49:43 +00001116
Devang Patel30d409c2012-02-07 23:33:58 +00001117 DIEEntry *Entry = getDIEEntry(Element);
1118 if (!Entry) {
1119 Entry = createDIEEntry(ElemDie);
1120 insertDIEEntry(Element, Entry);
1121 }
David Blaikiee5830c42013-10-03 20:07:20 +00001122 Buffer.addChild(ElemDie);
Devang Patel9e11eb12012-02-04 01:30:32 +00001123 } else
Devang Patel161b2f42011-04-12 23:21:44 +00001124 continue;
Devang Patel161b2f42011-04-12 23:21:44 +00001125 }
1126
1127 if (CTy.isAppleBlockExtension())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001128 addFlag(&Buffer, dwarf::DW_AT_APPLE_block);
Devang Patel161b2f42011-04-12 23:21:44 +00001129
Manman Rene42279c2013-09-06 18:46:00 +00001130 DICompositeType ContainingType(DD->resolve(CTy.getContainingType()));
Devang Patel161b2f42011-04-12 23:21:44 +00001131 if (DIDescriptor(ContainingType).isCompositeType())
1132 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
1133 getOrCreateTypeDIE(DIType(ContainingType)));
Devang Patel161b2f42011-04-12 23:21:44 +00001134
Devang Patel201e6cd2011-05-12 21:29:42 +00001135 if (CTy.isObjcClassComplete())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001136 addFlag(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type);
Devang Patelb11f80e2011-05-12 19:06:16 +00001137
Eric Christopher1a8e8862011-12-16 23:42:42 +00001138 // Add template parameters to a class, structure or union types.
1139 // FIXME: The support isn't in the metadata for this yet.
1140 if (Tag == dwarf::DW_TAG_class_type ||
1141 Tag == dwarf::DW_TAG_structure_type ||
1142 Tag == dwarf::DW_TAG_union_type)
Devang Patel161b2f42011-04-12 23:21:44 +00001143 addTemplateParams(Buffer, CTy.getTemplateParams());
1144
1145 break;
1146 }
1147 default:
1148 break;
1149 }
1150
1151 // Add name if not anonymous or intermediate type.
1152 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001153 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001154
Eric Christopher4a5d8392012-05-22 18:45:18 +00001155 if (Tag == dwarf::DW_TAG_enumeration_type ||
1156 Tag == dwarf::DW_TAG_class_type ||
1157 Tag == dwarf::DW_TAG_structure_type ||
1158 Tag == dwarf::DW_TAG_union_type) {
Devang Patel161b2f42011-04-12 23:21:44 +00001159 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopherfc4199b2012-06-01 00:22:32 +00001160 // TODO: Do we care about size for enum forward declarations?
Devang Patel161b2f42011-04-12 23:21:44 +00001161 if (Size)
1162 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
Eric Christopherfc4199b2012-06-01 00:22:32 +00001163 else if (!CTy.isForwardDecl())
Devang Patel161b2f42011-04-12 23:21:44 +00001164 // Add zero size if it is not a forward declaration.
Eric Christopherfc4199b2012-06-01 00:22:32 +00001165 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
1166
1167 // If we're a forward decl, say so.
1168 if (CTy.isForwardDecl())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001169 addFlag(&Buffer, dwarf::DW_AT_declaration);
Devang Patel161b2f42011-04-12 23:21:44 +00001170
1171 // Add source line info if available.
1172 if (!CTy.isForwardDecl())
1173 addSourceLine(&Buffer, CTy);
Eric Christopher89388952012-03-07 00:15:19 +00001174
1175 // No harm in adding the runtime language to the declaration.
1176 unsigned RLang = CTy.getRunTimeLang();
1177 if (RLang)
1178 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
1179 dwarf::DW_FORM_data1, RLang);
Devang Patel161b2f42011-04-12 23:21:44 +00001180 }
Eric Christopher3dee5752013-07-26 17:02:41 +00001181 // If this is a type applicable to a type unit it then add it to the
1182 // list of types we'll compute a hash for later.
Manman Ren18eb2452013-09-09 19:23:58 +00001183 if (shouldCreateTypeUnit(CTy, DD))
Eric Christopher3dee5752013-07-26 17:02:41 +00001184 DD->addTypeUnitType(&Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +00001185}
1186
Eric Christopher8b4310b2012-11-21 00:34:38 +00001187/// getOrCreateTemplateTypeParameterDIE - Find existing DIE or create new DIE
Devang Patel161b2f42011-04-12 23:21:44 +00001188/// for the given DITemplateTypeParameter.
1189DIE *
1190CompileUnit::getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP) {
1191 DIE *ParamDIE = getDIE(TP);
1192 if (ParamDIE)
1193 return ParamDIE;
1194
1195 ParamDIE = new DIE(dwarf::DW_TAG_template_type_parameter);
Eric Christopher76ef79f2013-08-08 08:09:43 +00001196 // Add the type if it exists, it could be void and therefore no type.
1197 if (TP.getType())
1198 addType(ParamDIE, TP.getType());
David Blaikiee88939c2013-06-22 18:59:11 +00001199 if (!TP.getName().empty())
1200 addString(ParamDIE, dwarf::DW_AT_name, TP.getName());
Devang Patel161b2f42011-04-12 23:21:44 +00001201 return ParamDIE;
1202}
1203
Eric Christopher8b4310b2012-11-21 00:34:38 +00001204/// getOrCreateTemplateValueParameterDIE - Find existing DIE or create new DIE
Devang Patel161b2f42011-04-12 23:21:44 +00001205/// for the given DITemplateValueParameter.
1206DIE *
Eric Christopherafdd1f82013-08-08 07:40:31 +00001207CompileUnit::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter VP) {
1208 DIE *ParamDIE = getDIE(VP);
Devang Patel161b2f42011-04-12 23:21:44 +00001209 if (ParamDIE)
1210 return ParamDIE;
1211
Eric Christopherafdd1f82013-08-08 07:40:31 +00001212 ParamDIE = new DIE(VP.getTag());
Eric Christopherdc1363f2013-08-08 07:40:37 +00001213
1214 // Add the type if there is one, template template and template parameter
1215 // packs will not have a type.
1216 if (VP.getType())
1217 addType(ParamDIE, VP.getType());
Eric Christopherafdd1f82013-08-08 07:40:31 +00001218 if (!VP.getName().empty())
1219 addString(ParamDIE, dwarf::DW_AT_name, VP.getName());
1220 if (Value *Val = VP.getValue()) {
David Blaikie4de9d722013-05-10 21:52:07 +00001221 if (ConstantInt *CI = dyn_cast<ConstantInt>(Val))
Eric Christopher3f045002013-10-04 17:08:38 +00001222 addConstantValue(ParamDIE, CI, VP.getType().isUnsignedDIType());
David Blaikie4de9d722013-05-10 21:52:07 +00001223 else if (GlobalValue *GV = dyn_cast<GlobalValue>(Val)) {
1224 // For declaration non-type template parameters (such as global values and
1225 // functions)
1226 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1227 addOpAddress(Block, Asm->Mang->getSymbol(GV));
1228 // Emit DW_OP_stack_value to use the address as the immediate value of the
1229 // parameter, rather than a pointer to it.
1230 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value);
1231 addBlock(ParamDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopherafdd1f82013-08-08 07:40:31 +00001232 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_template_param) {
David Blaikiee88939c2013-06-22 18:59:11 +00001233 assert(isa<MDString>(Val));
1234 addString(ParamDIE, dwarf::DW_AT_GNU_template_name,
1235 cast<MDString>(Val)->getString());
Eric Christopherafdd1f82013-08-08 07:40:31 +00001236 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_parameter_pack) {
David Blaikiee88939c2013-06-22 18:59:11 +00001237 assert(isa<MDNode>(Val));
1238 DIArray A(cast<MDNode>(Val));
1239 addTemplateParams(*ParamDIE, A);
David Blaikie4de9d722013-05-10 21:52:07 +00001240 }
1241 }
1242
Devang Patel161b2f42011-04-12 23:21:44 +00001243 return ParamDIE;
1244}
1245
Devang Patel31c5d052011-05-06 16:57:54 +00001246/// getOrCreateNameSpace - Create a DIE for DINameSpace.
1247DIE *CompileUnit::getOrCreateNameSpace(DINameSpace NS) {
1248 DIE *NDie = getDIE(NS);
1249 if (NDie)
1250 return NDie;
1251 NDie = new DIE(dwarf::DW_TAG_namespace);
1252 insertDIE(NS, NDie);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001253 if (!NS.getName().empty()) {
Nick Lewycky390c40d2011-10-27 06:44:11 +00001254 addString(NDie, dwarf::DW_AT_name, NS.getName());
Eric Christopher09ac3d82011-11-07 09:24:32 +00001255 addAccelNamespace(NS.getName(), NDie);
Eric Christopher3d2c90f2013-09-24 00:17:57 +00001256 addGlobalName(NS.getName(), NDie);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001257 } else
1258 addAccelNamespace("(anonymous namespace)", NDie);
Devang Patel31c5d052011-05-06 16:57:54 +00001259 addSourceLine(NDie, NS);
1260 addToContextOwner(NDie, NS.getContext());
1261 return NDie;
1262}
1263
Devang Pateldbc64af2011-08-15 17:24:54 +00001264/// getOrCreateSubprogramDIE - Create new DIE using SP.
1265DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
David Blaikiec32f2332013-10-04 01:39:59 +00001266 // Construct the context before querying for the existence of the DIE in case
1267 // such construction creates the DIE (as is the case for member function
1268 // declarations).
1269 DIE *ContextDIE = getOrCreateContextDIE(SP.getContext());
1270 if (!ContextDIE)
1271 ContextDIE = CUDie.get();
1272
Eric Christopher3f045002013-10-04 17:08:38 +00001273 DIE *SPDie = getDIE(SP);
Devang Pateldbc64af2011-08-15 17:24:54 +00001274 if (SPDie)
1275 return SPDie;
1276
Peter Collingbourne27302f02012-05-27 18:36:44 +00001277 SPDie = new DIE(dwarf::DW_TAG_subprogram);
1278
1279 // DW_TAG_inlined_subroutine may refer to this DIE.
Eric Christopher3f045002013-10-04 17:08:38 +00001280 insertDIE(SP, SPDie);
Peter Collingbourne27302f02012-05-27 18:36:44 +00001281
Rafael Espindola01b55b42011-11-10 22:34:29 +00001282 DISubprogram SPDecl = SP.getFunctionDeclaration();
1283 DIE *DeclDie = NULL;
1284 if (SPDecl.isSubprogram()) {
1285 DeclDie = getOrCreateSubprogramDIE(SPDecl);
1286 }
1287
Devang Pateldbc64af2011-08-15 17:24:54 +00001288 // Add to context owner.
David Blaikiec32f2332013-10-04 01:39:59 +00001289 ContextDIE->addChild(SPDie);
Devang Pateldbc64af2011-08-15 17:24:54 +00001290
1291 // Add function template parameters.
1292 addTemplateParams(*SPDie, SP.getTemplateParams());
1293
Devang Pateldbc64af2011-08-15 17:24:54 +00001294 // If this DIE is going to refer declaration info using AT_specification
Eric Christopherc4968752013-05-09 00:42:33 +00001295 // then there is no need to add other attributes.
Rafael Espindola01b55b42011-11-10 22:34:29 +00001296 if (DeclDie) {
1297 // Refer function declaration directly.
1298 addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
1299 DeclDie);
1300
Devang Pateldbc64af2011-08-15 17:24:54 +00001301 return SPDie;
Rafael Espindola01b55b42011-11-10 22:34:29 +00001302 }
Devang Pateldbc64af2011-08-15 17:24:54 +00001303
Eric Christophercbbd5b12012-08-23 22:52:55 +00001304 // Add the linkage name if we have one.
Michael Gottesmandc42d032013-09-04 04:39:38 +00001305 StringRef LinkageName = SP.getLinkageName();
1306 if (!LinkageName.empty())
Eric Christophercbbd5b12012-08-23 22:52:55 +00001307 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c2b4be2013-06-01 17:51:14 +00001308 GlobalValue::getRealLinkageName(LinkageName));
Eric Christophercbbd5b12012-08-23 22:52:55 +00001309
Devang Pateldbc64af2011-08-15 17:24:54 +00001310 // Constructors and operators for anonymous aggregates do not have names.
1311 if (!SP.getName().empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001312 addString(SPDie, dwarf::DW_AT_name, SP.getName());
Devang Pateldbc64af2011-08-15 17:24:54 +00001313
1314 addSourceLine(SPDie, SP);
1315
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001316 // Add the prototype if we have a prototype and we have a C like
1317 // language.
Eric Christopher7b878952013-08-26 23:50:38 +00001318 uint16_t Language = DICompileUnit(Node).getLanguage();
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001319 if (SP.isPrototyped() &&
1320 (Language == dwarf::DW_LANG_C89 ||
1321 Language == dwarf::DW_LANG_C99 ||
1322 Language == dwarf::DW_LANG_ObjC))
Eric Christopher873cf0a2012-08-24 01:14:27 +00001323 addFlag(SPDie, dwarf::DW_AT_prototyped);
Devang Pateldbc64af2011-08-15 17:24:54 +00001324
Eric Christopherdc1363f2013-08-08 07:40:37 +00001325 // Add Return Type. A void return type will not have a type.
Devang Pateldbc64af2011-08-15 17:24:54 +00001326 DICompositeType SPTy = SP.getType();
David Blaikie3d331842013-05-22 23:22:18 +00001327 assert(SPTy.getTag() == dwarf::DW_TAG_subroutine_type &&
1328 "the type of a subprogram should be a subroutine");
Devang Pateldbc64af2011-08-15 17:24:54 +00001329
David Blaikie3d331842013-05-22 23:22:18 +00001330 DIArray Args = SPTy.getTypeArray();
Eric Christopherdc1363f2013-08-08 07:40:37 +00001331 if (Args.getElement(0))
1332 addType(SPDie, DIType(Args.getElement(0)));
Devang Pateldbc64af2011-08-15 17:24:54 +00001333
1334 unsigned VK = SP.getVirtuality();
1335 if (VK) {
Nick Lewycky798313d2011-12-14 00:56:07 +00001336 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
Devang Pateldbc64af2011-08-15 17:24:54 +00001337 DIEBlock *Block = getDIEBlock();
1338 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1339 addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex());
1340 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
1341 ContainingTypeMap.insert(std::make_pair(SPDie,
Manman Ren0e85f6e2013-09-07 00:04:05 +00001342 DD->resolve(SP.getContainingType())));
Devang Pateldbc64af2011-08-15 17:24:54 +00001343 }
1344
1345 if (!SP.isDefinition()) {
Eric Christopher873cf0a2012-08-24 01:14:27 +00001346 addFlag(SPDie, dwarf::DW_AT_declaration);
Eric Christopher8b4310b2012-11-21 00:34:38 +00001347
Devang Pateldbc64af2011-08-15 17:24:54 +00001348 // Add arguments. Do not add arguments for subprogram definition. They will
1349 // be handled while processing variables.
David Blaikie3d331842013-05-22 23:22:18 +00001350 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1351 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1352 DIType ATy = DIType(Args.getElement(i));
1353 addType(Arg, ATy);
1354 if (ATy.isArtificial())
1355 addFlag(Arg, dwarf::DW_AT_artificial);
1356 SPDie->addChild(Arg);
1357 }
Devang Pateldbc64af2011-08-15 17:24:54 +00001358 }
1359
1360 if (SP.isArtificial())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001361 addFlag(SPDie, dwarf::DW_AT_artificial);
Devang Pateldbc64af2011-08-15 17:24:54 +00001362
1363 if (!SP.isLocalToUnit())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001364 addFlag(SPDie, dwarf::DW_AT_external);
Devang Pateldbc64af2011-08-15 17:24:54 +00001365
1366 if (SP.isOptimized())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001367 addFlag(SPDie, dwarf::DW_AT_APPLE_optimized);
Devang Pateldbc64af2011-08-15 17:24:54 +00001368
1369 if (unsigned isa = Asm->getISAEncoding()) {
1370 addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1371 }
1372
1373 return SPDie;
1374}
1375
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001376// Return const expression if value is a GEP to access merged global
1377// constant. e.g.
1378// i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
1379static const ConstantExpr *getMergedGlobalExpr(const Value *V) {
1380 const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
1381 if (!CE || CE->getNumOperands() != 3 ||
1382 CE->getOpcode() != Instruction::GetElementPtr)
1383 return NULL;
1384
1385 // First operand points to a global struct.
1386 Value *Ptr = CE->getOperand(0);
1387 if (!isa<GlobalValue>(Ptr) ||
1388 !isa<StructType>(cast<PointerType>(Ptr->getType())->getElementType()))
1389 return NULL;
1390
1391 // Second operand is zero.
1392 const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
1393 if (!CI || !CI->isZero())
1394 return NULL;
1395
1396 // Third operand is offset.
1397 if (!isa<ConstantInt>(CE->getOperand(2)))
1398 return NULL;
1399
1400 return CE;
1401}
1402
1403/// createGlobalVariableDIE - create global variable DIE.
1404void CompileUnit::createGlobalVariableDIE(const MDNode *N) {
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001405 // Check for pre-existence.
Devang Patel49e2f032011-08-18 22:21:50 +00001406 if (getDIE(N))
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001407 return;
1408
Devang Patel49e2f032011-08-18 22:21:50 +00001409 DIGlobalVariable GV(N);
Manman Rend03d2b22013-07-08 18:33:29 +00001410 if (!GV.isGlobalVariable())
Devang Patel28bea082011-08-18 23:17:55 +00001411 return;
1412
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001413 DIDescriptor GVContext = GV.getContext();
Eric Christopher6b6061f2013-01-16 01:22:23 +00001414 DIType GTy = GV.getType();
1415
1416 // If this is a static data member definition, some attributes belong
1417 // to the declaration DIE.
1418 DIE *VariableDIE = NULL;
Manman Ren945e8282013-02-01 23:54:37 +00001419 bool IsStaticMember = false;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001420 DIDerivedType SDMDecl = GV.getStaticDataMemberDeclaration();
1421 if (SDMDecl.Verify()) {
1422 assert(SDMDecl.isStaticMember() && "Expected static member decl");
1423 // We need the declaration DIE that is in the static member's class.
1424 // But that class might not exist in the DWARF yet.
1425 // Creating the class will create the static member decl DIE.
Manman Ren2c9905a2013-09-09 19:47:11 +00001426 getOrCreateContextDIE(DD->resolve(SDMDecl.getContext()));
Eric Christopher3f045002013-10-04 17:08:38 +00001427 VariableDIE = getDIE(SDMDecl);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001428 assert(VariableDIE && "Static member decl has no context?");
Manman Ren945e8282013-02-01 23:54:37 +00001429 IsStaticMember = true;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001430 }
1431
1432 // If this is not a static data member definition, create the variable
1433 // DIE and add the initial set of attributes to it.
1434 if (!VariableDIE) {
1435 VariableDIE = new DIE(GV.getTag());
1436 // Add to map.
1437 insertDIE(N, VariableDIE);
1438
1439 // Add name and type.
1440 addString(VariableDIE, dwarf::DW_AT_name, GV.getDisplayName());
1441 addType(VariableDIE, GTy);
1442
1443 // Add scoping info.
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00001444 if (!GV.isLocalToUnit()) {
Eric Christopher6b6061f2013-01-16 01:22:23 +00001445 addFlag(VariableDIE, dwarf::DW_AT_external);
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00001446 addGlobalName(GV.getName(), VariableDIE);
1447 }
Eric Christopher6b6061f2013-01-16 01:22:23 +00001448
1449 // Add line number info.
1450 addSourceLine(VariableDIE, GV);
1451 // Add to context owner.
1452 addToContextOwner(VariableDIE, GVContext);
1453 }
1454
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001455 // Add location.
Eric Christopher09ac3d82011-11-07 09:24:32 +00001456 bool addToAccelTable = false;
Eric Christopherd61c34b2011-11-11 03:16:32 +00001457 DIE *VariableSpecDIE = NULL;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001458 bool isGlobalVariable = GV.getGlobal() != NULL;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001459 if (isGlobalVariable) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001460 addToAccelTable = true;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001461 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
David Blaikie59eaa382013-06-28 20:05:11 +00001462 const MCSymbol *Sym = Asm->Mang->getSymbol(GV.getGlobal());
1463 if (GV.getGlobal()->isThreadLocal()) {
1464 // FIXME: Make this work with -gsplit-dwarf.
1465 unsigned PointerSize = Asm->getDataLayout().getPointerSize();
1466 assert((PointerSize == 4 || PointerSize == 8) &&
1467 "Add support for other sizes if necessary");
Ulrich Weigand716a94f2013-07-02 18:47:09 +00001468 const MCExpr *Expr =
David Blaikie8fed05e2013-07-01 23:55:52 +00001469 Asm->getObjFileLowering().getDebugThreadLocalSymbol(Sym);
David Blaikie59eaa382013-06-28 20:05:11 +00001470 // Based on GCC's support for TLS:
David Blaikie8fed05e2013-07-01 23:55:52 +00001471 if (!DD->useSplitDwarf()) {
1472 // 1) Start with a constNu of the appropriate pointer size
1473 addUInt(Block, 0, dwarf::DW_FORM_data1,
1474 PointerSize == 4 ? dwarf::DW_OP_const4u : dwarf::DW_OP_const8u);
1475 // 2) containing the (relocated) address of the TLS variable
Ulrich Weigand716a94f2013-07-02 18:47:09 +00001476 addExpr(Block, 0, dwarf::DW_FORM_udata, Expr);
David Blaikie8fed05e2013-07-01 23:55:52 +00001477 } else {
1478 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_const_index);
Ulrich Weigand716a94f2013-07-02 18:47:09 +00001479 addUInt(Block, 0, dwarf::DW_FORM_udata, DU->getAddrPoolIndex(Expr));
David Blaikie8fed05e2013-07-01 23:55:52 +00001480 }
David Blaikie59eaa382013-06-28 20:05:11 +00001481 // 3) followed by a custom OP to tell the debugger about TLS (presumably)
1482 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_lo_user);
1483 } else
1484 addOpAddress(Block, Sym);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001485 // Do not create specification DIE if context is either compile unit
1486 // or a subprogram.
Devang Patel1dd4e562011-09-21 23:41:11 +00001487 if (GVContext && GV.isDefinition() && !GVContext.isCompileUnit() &&
Manman Ren02d29672013-09-09 19:05:21 +00001488 !GVContext.isFile() && !DD->isSubprogramContext(GVContext)) {
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001489 // Create specification DIE.
Eric Christopherd117fbb2011-11-11 01:55:22 +00001490 VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001491 addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
1492 dwarf::DW_FORM_ref4, VariableDIE);
1493 addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001494 // A static member's declaration is already flagged as such.
1495 if (!SDMDecl.Verify())
1496 addFlag(VariableDIE, dwarf::DW_AT_declaration);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001497 addDie(VariableSpecDIE);
1498 } else {
1499 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001500 }
Michael Gottesmandc42d032013-09-04 04:39:38 +00001501 // Add the linkage name.
Eric Christopher6b6061f2013-01-16 01:22:23 +00001502 StringRef LinkageName = GV.getLinkageName();
Michael Gottesmandc42d032013-09-04 04:39:38 +00001503 if (!LinkageName.empty())
Eric Christopher8d45a982013-02-27 23:49:47 +00001504 // From DWARF4: DIEs to which DW_AT_linkage_name may apply include:
1505 // TAG_common_block, TAG_constant, TAG_entry_point, TAG_subprogram and
1506 // TAG_variable.
Manman Ren21a08a12013-02-27 23:21:02 +00001507 addString(IsStaticMember && VariableSpecDIE ?
1508 VariableSpecDIE : VariableDIE, dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c2b4be2013-06-01 17:51:14 +00001509 GlobalValue::getRealLinkageName(LinkageName));
Eric Christopher8b4310b2012-11-21 00:34:38 +00001510 } else if (const ConstantInt *CI =
Manman Ren945e8282013-02-01 23:54:37 +00001511 dyn_cast_or_null<ConstantInt>(GV.getConstant())) {
Adrian Prantl2e892e42013-04-04 22:56:49 +00001512 // AT_const_value was added when the static member was created. To avoid
Manman Ren945e8282013-02-01 23:54:37 +00001513 // emitting AT_const_value multiple times, we only add AT_const_value when
1514 // it is not a static member.
1515 if (!IsStaticMember)
Eric Christopher3f045002013-10-04 17:08:38 +00001516 addConstantValue(VariableDIE, CI, GTy.isUnsignedDIType());
Manman Ren945e8282013-02-01 23:54:37 +00001517 } else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001518 addToAccelTable = true;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001519 // GV is a merged global.
1520 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1521 Value *Ptr = CE->getOperand(0);
Eric Christopher0969ddf2013-01-18 22:11:33 +00001522 addOpAddress(Block, Asm->Mang->getSymbol(cast<GlobalValue>(Ptr)));
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001523 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1524 SmallVector<Value*, 3> Idx(CE->op_begin()+1, CE->op_end());
Eric Christopher8b4310b2012-11-21 00:34:38 +00001525 addUInt(Block, 0, dwarf::DW_FORM_udata,
Micah Villmow3574eca2012-10-08 16:38:25 +00001526 Asm->getDataLayout().getIndexedOffset(Ptr->getType(), Idx));
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001527 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1528 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
1529 }
1530
Eric Christopherd117fbb2011-11-11 01:55:22 +00001531 if (addToAccelTable) {
1532 DIE *AddrDIE = VariableSpecDIE ? VariableSpecDIE : VariableDIE;
1533 addAccelName(GV.getName(), AddrDIE);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001534
Eric Christopherd117fbb2011-11-11 01:55:22 +00001535 // If the linkage name is different than the name, go ahead and output
1536 // that as well into the name table.
1537 if (GV.getLinkageName() != "" && GV.getName() != GV.getLinkageName())
1538 addAccelName(GV.getLinkageName(), AddrDIE);
1539 }
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001540}
1541
Devang Patel161b2f42011-04-12 23:21:44 +00001542/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
Eric Christopher4d069bf2012-05-22 18:45:24 +00001543void CompileUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR,
1544 DIE *IndexTy) {
Devang Patel161b2f42011-04-12 23:21:44 +00001545 DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
1546 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
Devang Patel161b2f42011-04-12 23:21:44 +00001547
Bill Wendling222c2fd2012-12-06 07:38:10 +00001548 // The LowerBound value defines the lower bounds which is typically zero for
1549 // C/C++. The Count value is the number of elements. Values are 64 bit. If
1550 // Count == -1 then the array is unbounded and we do not emit
1551 // DW_AT_lower_bound and DW_AT_upper_bound attributes. If LowerBound == 0 and
1552 // Count == 0, then the array has zero elements in which case we do not emit
1553 // an upper bound.
1554 int64_t LowerBound = SR.getLo();
Bill Wendling6afe4782012-12-06 07:55:19 +00001555 int64_t DefaultLowerBound = getDefaultLowerBound();
Bill Wendling9493dae2012-12-04 21:34:03 +00001556 int64_t Count = SR.getCount();
Devang Patel161b2f42011-04-12 23:21:44 +00001557
Bill Wendling6afe4782012-12-06 07:55:19 +00001558 if (DefaultLowerBound == -1 || LowerBound != DefaultLowerBound)
Bill Wendling222c2fd2012-12-06 07:38:10 +00001559 addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, LowerBound);
1560
1561 if (Count != -1 && Count != 0)
Bill Wendling9493dae2012-12-04 21:34:03 +00001562 // FIXME: An unbounded array should reference the expression that defines
1563 // the array.
Bill Wendling222c2fd2012-12-06 07:38:10 +00001564 addUInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, LowerBound + Count - 1);
Bill Wendling9493dae2012-12-04 21:34:03 +00001565
Devang Patel161b2f42011-04-12 23:21:44 +00001566 Buffer.addChild(DW_Subrange);
1567}
1568
1569/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
1570void CompileUnit::constructArrayTypeDIE(DIE &Buffer,
1571 DICompositeType *CTy) {
1572 Buffer.setTag(dwarf::DW_TAG_array_type);
Eric Christopher9a1e0e22013-01-08 01:53:52 +00001573 if (CTy->isVector())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001574 addFlag(&Buffer, dwarf::DW_AT_GNU_vector);
Devang Patel161b2f42011-04-12 23:21:44 +00001575
Eric Christopherdc1363f2013-08-08 07:40:37 +00001576 // Emit the element type.
Eric Christopher3f045002013-10-04 17:08:38 +00001577 addType(&Buffer, CTy->getTypeDerivedFrom());
Devang Patel161b2f42011-04-12 23:21:44 +00001578
1579 // Get an anonymous type for index type.
Eric Christopher8cab6ed2013-01-04 21:51:53 +00001580 // FIXME: This type should be passed down from the front end
1581 // as different languages may have different sizes for indexes.
Devang Patel161b2f42011-04-12 23:21:44 +00001582 DIE *IdxTy = getIndexTyDie();
1583 if (!IdxTy) {
1584 // Construct an anonymous type for index type.
1585 IdxTy = new DIE(dwarf::DW_TAG_base_type);
Eric Christopher8cab6ed2013-01-04 21:51:53 +00001586 addString(IdxTy, dwarf::DW_AT_name, "int");
Devang Patel161b2f42011-04-12 23:21:44 +00001587 addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1588 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1589 dwarf::DW_ATE_signed);
1590 addDie(IdxTy);
1591 setIndexTyDie(IdxTy);
1592 }
1593
1594 // Add subranges to array type.
Eric Christopherdc1363f2013-08-08 07:40:37 +00001595 DIArray Elements = CTy->getTypeArray();
Devang Patel161b2f42011-04-12 23:21:44 +00001596 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1597 DIDescriptor Element = Elements.getElement(i);
1598 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1599 constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1600 }
1601}
1602
1603/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
1604DIE *CompileUnit::constructEnumTypeDIE(DIEnumerator ETy) {
1605 DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
1606 StringRef Name = ETy.getName();
Nick Lewycky390c40d2011-10-27 06:44:11 +00001607 addString(Enumerator, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001608 int64_t Value = ETy.getEnumValue();
1609 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
1610 return Enumerator;
1611}
1612
Devang Pateldbc64af2011-08-15 17:24:54 +00001613/// constructContainingTypeDIEs - Construct DIEs for types that contain
1614/// vtables.
1615void CompileUnit::constructContainingTypeDIEs() {
1616 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
1617 CE = ContainingTypeMap.end(); CI != CE; ++CI) {
1618 DIE *SPDie = CI->first;
1619 const MDNode *N = CI->second;
1620 if (!N) continue;
Eric Christopher3f045002013-10-04 17:08:38 +00001621 DIE *NDie = getDIE(N);
Devang Pateldbc64af2011-08-15 17:24:54 +00001622 if (!NDie) continue;
1623 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
1624 }
1625}
1626
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001627/// constructVariableDIE - Construct a DIE for the given DbgVariable.
Eric Christopherf61dbc12013-06-24 21:07:27 +00001628DIE *CompileUnit::constructVariableDIE(DbgVariable *DV,
1629 bool isScopeAbstract) {
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001630 StringRef Name = DV->getName();
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001631
1632 // Translate tag to proper Dwarf tag.
Eric Christopher31667622013-08-08 01:41:00 +00001633 uint16_t Tag = DV->getTag();
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001634
1635 // Define variable debug information entry.
1636 DIE *VariableDie = new DIE(Tag);
1637 DbgVariable *AbsVar = DV->getAbstractVariable();
1638 DIE *AbsDIE = AbsVar ? AbsVar->getDIE() : NULL;
Manman Ren742671b2013-05-29 17:16:59 +00001639 if (AbsDIE)
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001640 addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
Manman Ren742671b2013-05-29 17:16:59 +00001641 dwarf::DW_FORM_ref4, AbsDIE);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001642 else {
David Blaikie2883fd42013-08-19 03:34:03 +00001643 if (!Name.empty())
1644 addString(VariableDie, dwarf::DW_AT_name, Name);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001645 addSourceLine(VariableDie, DV->getVariable());
1646 addType(VariableDie, DV->getType());
1647 }
1648
1649 if (DV->isArtificial())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001650 addFlag(VariableDie, dwarf::DW_AT_artificial);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001651
1652 if (isScopeAbstract) {
1653 DV->setDIE(VariableDie);
1654 return VariableDie;
1655 }
1656
1657 // Add variable address.
1658
1659 unsigned Offset = DV->getDotDebugLocOffset();
1660 if (Offset != ~0U) {
Eric Christopherafbe0e22013-06-24 21:34:55 +00001661 addLabel(VariableDie, dwarf::DW_AT_location, dwarf::DW_FORM_data4,
1662 Asm->GetTempSymbol("debug_loc", Offset));
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001663 DV->setDIE(VariableDie);
1664 return VariableDie;
1665 }
1666
Eric Christopher8cf5e742011-10-03 15:49:20 +00001667 // Check if variable is described by a DBG_VALUE instruction.
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001668 if (const MachineInstr *DVInsn = DV->getMInsn()) {
David Blaikie6d9dbd52013-06-16 20:34:15 +00001669 assert(DVInsn->getNumOperands() == 3);
1670 if (DVInsn->getOperand(0).isReg()) {
1671 const MachineOperand RegOp = DVInsn->getOperand(0);
Adrian Prantlb2754912013-07-09 21:44:06 +00001672 // If the second operand is an immediate, this is an indirect value.
Adrian Prantl35176402013-07-09 20:28:37 +00001673 if (DVInsn->getOperand(1).isImm()) {
1674 MachineLocation Location(RegOp.getReg(), DVInsn->getOperand(1).getImm());
Eric Christopherf61dbc12013-06-24 21:07:27 +00001675 addVariableAddress(*DV, VariableDie, Location);
David Blaikie6d9dbd52013-06-16 20:34:15 +00001676 } else if (RegOp.getReg())
Eric Christopherf61dbc12013-06-24 21:07:27 +00001677 addVariableAddress(*DV, VariableDie, MachineLocation(RegOp.getReg()));
David Blaikie6d9dbd52013-06-16 20:34:15 +00001678 } else if (DVInsn->getOperand(0).isImm())
Eric Christophere4721492013-07-03 01:08:30 +00001679 addConstantValue(VariableDie, DVInsn->getOperand(0), DV->getType());
David Blaikie6d9dbd52013-06-16 20:34:15 +00001680 else if (DVInsn->getOperand(0).isFPImm())
Eric Christophere4721492013-07-03 01:08:30 +00001681 addConstantFPValue(VariableDie, DVInsn->getOperand(0));
David Blaikie6d9dbd52013-06-16 20:34:15 +00001682 else if (DVInsn->getOperand(0).isCImm())
Eric Christophere4721492013-07-03 01:08:30 +00001683 addConstantValue(VariableDie, DVInsn->getOperand(0).getCImm(),
Eric Christopher3f045002013-10-04 17:08:38 +00001684 DV->getType().isUnsignedDIType());
Eric Christophere4721492013-07-03 01:08:30 +00001685
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001686 DV->setDIE(VariableDie);
1687 return VariableDie;
1688 } else {
1689 // .. else use frame index.
1690 int FI = DV->getFrameIndex();
1691 if (FI != ~0) {
1692 unsigned FrameReg = 0;
1693 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
Eric Christopher8b4310b2012-11-21 00:34:38 +00001694 int Offset =
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001695 TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
1696 MachineLocation Location(FrameReg, Offset);
Eric Christopherf61dbc12013-06-24 21:07:27 +00001697 addVariableAddress(*DV, VariableDie, Location);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001698 }
1699 }
1700
1701 DV->setDIE(VariableDie);
1702 return VariableDie;
1703}
1704
Devang Patel161b2f42011-04-12 23:21:44 +00001705/// createMemberDIE - Create new member DIE.
1706DIE *CompileUnit::createMemberDIE(DIDerivedType DT) {
1707 DIE *MemberDie = new DIE(DT.getTag());
1708 StringRef Name = DT.getName();
1709 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001710 addString(MemberDie, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001711
Eric Christopher3f045002013-10-04 17:08:38 +00001712 addType(MemberDie, DT.getTypeDerivedFrom());
Devang Patel161b2f42011-04-12 23:21:44 +00001713
1714 addSourceLine(MemberDie, DT);
1715
1716 DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
1717 addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1718
1719 uint64_t Size = DT.getSizeInBits();
Eric Christopher3f045002013-10-04 17:08:38 +00001720 uint64_t FieldSize = DT.getOriginalTypeSize();
Devang Patel161b2f42011-04-12 23:21:44 +00001721
1722 if (Size != FieldSize) {
1723 // Handle bitfield.
Eric Christopher3f045002013-10-04 17:08:38 +00001724 addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
Devang Patel161b2f42011-04-12 23:21:44 +00001725 addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1726
1727 uint64_t Offset = DT.getOffsetInBits();
1728 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1729 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1730 uint64_t FieldOffset = (HiMark - FieldSize);
1731 Offset -= FieldOffset;
1732
1733 // Maybe we need to work from the other end.
Micah Villmow3574eca2012-10-08 16:38:25 +00001734 if (Asm->getDataLayout().isLittleEndian())
Devang Patel161b2f42011-04-12 23:21:44 +00001735 Offset = FieldSize - (Offset + Size);
1736 addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
1737
1738 // Here WD_AT_data_member_location points to the anonymous
1739 // field that includes this bit field.
1740 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
1741
1742 } else
1743 // This is not a bitfield.
1744 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1745
1746 if (DT.getTag() == dwarf::DW_TAG_inheritance
1747 && DT.isVirtual()) {
1748
1749 // For C++, virtual base classes are not at fixed offset. Use following
1750 // expression to extract appropriate offset from vtable.
1751 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1752
1753 DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
1754 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1755 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1756 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1757 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1758 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1759 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1760 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1761
1762 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
1763 VBaseLocationDie);
1764 } else
1765 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
1766
1767 if (DT.isProtected())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001768 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001769 dwarf::DW_ACCESS_protected);
1770 else if (DT.isPrivate())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001771 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001772 dwarf::DW_ACCESS_private);
1773 // Otherwise C++ member and base classes are considered public.
Eric Christopher8b4310b2012-11-21 00:34:38 +00001774 else
Nick Lewycky13aaca52011-12-13 05:09:11 +00001775 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001776 dwarf::DW_ACCESS_public);
1777 if (DT.isVirtual())
Nick Lewycky798313d2011-12-14 00:56:07 +00001778 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001779 dwarf::DW_VIRTUALITY_virtual);
Devang Patele9db5e22011-04-16 00:11:51 +00001780
1781 // Objective-C properties.
Devang Patel6588abf2012-02-06 17:49:43 +00001782 if (MDNode *PNode = DT.getObjCProperty())
1783 if (DIEEntry *PropertyDie = getDIEEntry(PNode))
Eric Christopher8b4310b2012-11-21 00:34:38 +00001784 MemberDie->addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4,
Devang Patel6588abf2012-02-06 17:49:43 +00001785 PropertyDie);
1786
David Blaikie01bc2b32012-12-13 22:43:07 +00001787 if (DT.isArtificial())
1788 addFlag(MemberDie, dwarf::DW_AT_artificial);
1789
Devang Patel161b2f42011-04-12 23:21:44 +00001790 return MemberDie;
1791}
Eric Christopher6b6061f2013-01-16 01:22:23 +00001792
1793/// createStaticMemberDIE - Create new DIE for C++ static member.
1794DIE *CompileUnit::createStaticMemberDIE(const DIDerivedType DT) {
1795 if (!DT.Verify())
1796 return NULL;
1797
1798 DIE *StaticMemberDIE = new DIE(DT.getTag());
Eric Christopher3f045002013-10-04 17:08:38 +00001799 DIType Ty = DT.getTypeDerivedFrom();
Eric Christopher6b6061f2013-01-16 01:22:23 +00001800
1801 addString(StaticMemberDIE, dwarf::DW_AT_name, DT.getName());
1802 addType(StaticMemberDIE, Ty);
1803 addSourceLine(StaticMemberDIE, DT);
1804 addFlag(StaticMemberDIE, dwarf::DW_AT_external);
1805 addFlag(StaticMemberDIE, dwarf::DW_AT_declaration);
1806
1807 // FIXME: We could omit private if the parent is a class_type, and
1808 // public if the parent is something else.
1809 if (DT.isProtected())
1810 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1811 dwarf::DW_ACCESS_protected);
1812 else if (DT.isPrivate())
1813 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1814 dwarf::DW_ACCESS_private);
1815 else
1816 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1817 dwarf::DW_ACCESS_public);
1818
1819 if (const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(DT.getConstant()))
Eric Christopher3f045002013-10-04 17:08:38 +00001820 addConstantValue(StaticMemberDIE, CI, Ty.isUnsignedDIType());
David Blaikie14268412013-01-20 01:18:01 +00001821 if (const ConstantFP *CFP = dyn_cast_or_null<ConstantFP>(DT.getConstant()))
1822 addConstantFPValue(StaticMemberDIE, CFP);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001823
Eric Christopher3f045002013-10-04 17:08:38 +00001824 insertDIE(DT, StaticMemberDIE);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001825 return StaticMemberDIE;
1826}