blob: cf926773d6c4a4e548ba024ca8a2f59206684d9d [file] [log] [blame]
Devang Patel161b2f42011-04-12 23:21:44 +00001//===-- llvm/CodeGen/DwarfCompileUnit.cpp - Dwarf Compile Unit ------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
Eric Christopher443c9ed2012-08-14 05:13:29 +000010// This file contains support for constructing a dwarf compile unit.
Devang Patel161b2f42011-04-12 23:21:44 +000011//
12//===----------------------------------------------------------------------===//
13
14#define DEBUG_TYPE "dwarfdebug"
15
16#include "DwarfCompileUnit.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000017#include "DwarfAccelTable.h"
Devang Patel161b2f42011-04-12 23:21:44 +000018#include "DwarfDebug.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000019#include "llvm/ADT/APFloat.h"
Bill Wendling16eeb6f2012-06-29 08:32:07 +000020#include "llvm/DIBuilder.h"
Chandler Carruth0b8c9a82013-01-02 11:36:10 +000021#include "llvm/IR/Constants.h"
22#include "llvm/IR/DataLayout.h"
23#include "llvm/IR/GlobalVariable.h"
24#include "llvm/IR/Instructions.h"
Eric Christopherd61c34b2011-11-11 03:16:32 +000025#include "llvm/Support/Debug.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000026#include "llvm/Support/ErrorHandling.h"
Devang Patel6f9d8ff2011-08-15 17:57:41 +000027#include "llvm/Target/Mangler.h"
Devang Patel161b2f42011-04-12 23:21:44 +000028#include "llvm/Target/TargetFrameLowering.h"
29#include "llvm/Target/TargetMachine.h"
David Blaikie59eaa382013-06-28 20:05:11 +000030#include "llvm/Target/TargetLoweringObjectFile.h"
Devang Patel161b2f42011-04-12 23:21:44 +000031#include "llvm/Target/TargetRegisterInfo.h"
Devang Patel161b2f42011-04-12 23:21:44 +000032
33using namespace llvm;
34
35/// CompileUnit - Compile unit constructor.
Eric Christopher7b878952013-08-26 23:50:38 +000036CompileUnit::CompileUnit(unsigned UID, DIE *D, const MDNode *N, AsmPrinter *A,
37 DwarfDebug *DW, DwarfUnits *DWU)
38 : UniqueID(UID), Node(N), CUDie(D), Asm(A), DD(DW), DU(DWU), IndexTyDie(0),
39 DebugInfoOffset(0) {
Devang Patel161b2f42011-04-12 23:21:44 +000040 DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
Eric Christopher9c57ad22013-05-08 00:58:51 +000041 insertDIE(N, D);
Devang Patel161b2f42011-04-12 23:21:44 +000042}
43
44/// ~CompileUnit - Destructor for compile unit.
45CompileUnit::~CompileUnit() {
46 for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
47 DIEBlocks[j]->~DIEBlock();
48}
49
50/// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
51/// information entry.
52DIEEntry *CompileUnit::createDIEEntry(DIE *Entry) {
53 DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
54 return Value;
55}
56
Bill Wendling6afe4782012-12-06 07:55:19 +000057/// getDefaultLowerBound - Return the default lower bound for an array. If the
Bill Wendling222c2fd2012-12-06 07:38:10 +000058/// DWARF version doesn't handle the language, return -1.
Bill Wendling6afe4782012-12-06 07:55:19 +000059int64_t CompileUnit::getDefaultLowerBound() const {
Eric Christopher7b878952013-08-26 23:50:38 +000060 switch (DICompileUnit(Node).getLanguage()) {
Bill Wendling222c2fd2012-12-06 07:38:10 +000061 default:
62 break;
63
64 case dwarf::DW_LANG_C89:
65 case dwarf::DW_LANG_C99:
66 case dwarf::DW_LANG_C:
67 case dwarf::DW_LANG_C_plus_plus:
68 case dwarf::DW_LANG_ObjC:
69 case dwarf::DW_LANG_ObjC_plus_plus:
70 return 0;
71
72 case dwarf::DW_LANG_Fortran77:
73 case dwarf::DW_LANG_Fortran90:
74 case dwarf::DW_LANG_Fortran95:
75 return 1;
76
77 // The languages below have valid values only if the DWARF version >= 4.
78 case dwarf::DW_LANG_Java:
79 case dwarf::DW_LANG_Python:
80 case dwarf::DW_LANG_UPC:
81 case dwarf::DW_LANG_D:
82 if (dwarf::DWARF_VERSION >= 4)
83 return 0;
84 break;
85
86 case dwarf::DW_LANG_Ada83:
87 case dwarf::DW_LANG_Ada95:
88 case dwarf::DW_LANG_Cobol74:
89 case dwarf::DW_LANG_Cobol85:
90 case dwarf::DW_LANG_Modula2:
91 case dwarf::DW_LANG_Pascal83:
92 case dwarf::DW_LANG_PLI:
93 if (dwarf::DWARF_VERSION >= 4)
94 return 1;
95 break;
96 }
97
98 return -1;
99}
100
Eric Christopher873cf0a2012-08-24 01:14:27 +0000101/// addFlag - Add a flag that is true.
Eric Christopher31667622013-08-08 01:41:00 +0000102void CompileUnit::addFlag(DIE *Die, uint16_t Attribute) {
Michael Gottesmandc42d032013-09-04 04:39:38 +0000103 if (DD->getDwarfVersion() >= 4)
Eric Christopher873cf0a2012-08-24 01:14:27 +0000104 Die->addValue(Attribute, dwarf::DW_FORM_flag_present,
105 DIEIntegerOne);
106 else
107 addUInt(Die, Attribute, dwarf::DW_FORM_flag, 1);
108}
109
Devang Patel161b2f42011-04-12 23:21:44 +0000110/// addUInt - Add an unsigned integer attribute data and value.
111///
Eric Christopher31667622013-08-08 01:41:00 +0000112void CompileUnit::addUInt(DIE *Die, uint16_t Attribute,
113 uint16_t Form, uint64_t Integer) {
Devang Patel161b2f42011-04-12 23:21:44 +0000114 if (!Form) Form = DIEInteger::BestForm(false, Integer);
115 DIEValue *Value = Integer == 1 ?
116 DIEIntegerOne : new (DIEValueAllocator) DIEInteger(Integer);
117 Die->addValue(Attribute, Form, Value);
118}
119
120/// addSInt - Add an signed integer attribute data and value.
121///
Eric Christopher31667622013-08-08 01:41:00 +0000122void CompileUnit::addSInt(DIE *Die, uint16_t Attribute,
123 uint16_t Form, int64_t Integer) {
Devang Patel161b2f42011-04-12 23:21:44 +0000124 if (!Form) Form = DIEInteger::BestForm(true, Integer);
125 DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
126 Die->addValue(Attribute, Form, Value);
127}
128
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000129/// addString - Add a string attribute data and value. We always emit a
130/// reference to the string pool instead of immediate strings so that DIEs have
Eric Christopher3cc42202013-01-07 19:32:45 +0000131/// more predictable sizes. In the case of split dwarf we emit an index
132/// into another table which gets us the static offset into the string
133/// table.
Eric Christopher31667622013-08-08 01:41:00 +0000134void CompileUnit::addString(DIE *Die, uint16_t Attribute, StringRef String) {
Eric Christopher3dee5752013-07-26 17:02:41 +0000135 DIEValue *Value;
Eric Christopher31667622013-08-08 01:41:00 +0000136 uint16_t Form;
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000137 if (!DD->useSplitDwarf()) {
138 MCSymbol *Symb = DU->getStringPoolEntry(String);
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000139 if (Asm->needsRelocationsForDwarfStringPool())
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000140 Value = new (DIEValueAllocator) DIELabel(Symb);
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000141 else {
142 MCSymbol *StringPool = DU->getStringPoolSym();
143 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
144 }
Eric Christopher3dee5752013-07-26 17:02:41 +0000145 Form = dwarf::DW_FORM_strp;
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000146 } else {
147 unsigned idx = DU->getStringPoolIndex(String);
Eric Christopher3dee5752013-07-26 17:02:41 +0000148 Value = new (DIEValueAllocator) DIEInteger(idx);
149 Form = dwarf::DW_FORM_GNU_str_index;
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000150 }
Eric Christopher3dee5752013-07-26 17:02:41 +0000151 DIEValue *Str = new (DIEValueAllocator) DIEString(Value, String);
152 Die->addValue(Attribute, Form, Str);
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000153}
154
155/// addLocalString - Add a string attribute data and value. This is guaranteed
156/// to be in the local string pool instead of indirected.
Eric Christopher31667622013-08-08 01:41:00 +0000157void CompileUnit::addLocalString(DIE *Die, uint16_t Attribute,
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000158 StringRef String) {
Eric Christopher2e5d8702012-12-20 21:58:36 +0000159 MCSymbol *Symb = DU->getStringPoolEntry(String);
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000160 DIEValue *Value;
161 if (Asm->needsRelocationsForDwarfStringPool())
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000162 Value = new (DIEValueAllocator) DIELabel(Symb);
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000163 else {
Eric Christopher2e5d8702012-12-20 21:58:36 +0000164 MCSymbol *StringPool = DU->getStringPoolSym();
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000165 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
Nick Lewycky390c40d2011-10-27 06:44:11 +0000166 }
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000167 Die->addValue(Attribute, dwarf::DW_FORM_strp, Value);
Devang Patel161b2f42011-04-12 23:21:44 +0000168}
169
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000170/// addExpr - Add a Dwarf expression attribute data and value.
Devang Patel161b2f42011-04-12 23:21:44 +0000171///
Eric Christopher31667622013-08-08 01:41:00 +0000172void CompileUnit::addExpr(DIE *Die, uint16_t Attribute, uint16_t Form,
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000173 const MCExpr *Expr) {
174 DIEValue *Value = new (DIEValueAllocator) DIEExpr(Expr);
Devang Patel161b2f42011-04-12 23:21:44 +0000175 Die->addValue(Attribute, Form, Value);
176}
177
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000178/// addLabel - Add a Dwarf label attribute data and value.
179///
Eric Christopher31667622013-08-08 01:41:00 +0000180void CompileUnit::addLabel(DIE *Die, uint16_t Attribute, uint16_t Form,
David Blaikie95e72c92013-06-28 20:05:04 +0000181 const MCSymbol *Label) {
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000182 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
183 Die->addValue(Attribute, Form, Value);
David Blaikie95e72c92013-06-28 20:05:04 +0000184}
185
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000186/// addLabelAddress - Add a dwarf label attribute data and value using
187/// DW_FORM_addr or DW_FORM_GNU_addr_index.
188///
Eric Christopher31667622013-08-08 01:41:00 +0000189void CompileUnit::addLabelAddress(DIE *Die, uint16_t Attribute,
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000190 MCSymbol *Label) {
Alexey Samsonov9d08d692013-10-03 08:54:43 +0000191 if (Label)
192 DD->addArangeLabel(SymbolCU(this, Label));
Richard Mitton5cc319a2013-09-19 23:21:01 +0000193
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000194 if (!DD->useSplitDwarf()) {
195 if (Label != NULL) {
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000196 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000197 Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
198 } else {
199 DIEValue *Value = new (DIEValueAllocator) DIEInteger(0);
200 Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
201 }
202 } else {
203 unsigned idx = DU->getAddrPoolIndex(Label);
204 DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx);
205 Die->addValue(Attribute, dwarf::DW_FORM_GNU_addr_index, Value);
206 }
207}
208
Eric Christopher0969ddf2013-01-18 22:11:33 +0000209/// addOpAddress - Add a dwarf op address data and value using the
210/// form given and an op of either DW_FORM_addr or DW_FORM_GNU_addr_index.
211///
David Blaikie95e72c92013-06-28 20:05:04 +0000212void CompileUnit::addOpAddress(DIE *Die, const MCSymbol *Sym) {
Alexey Samsonov9d08d692013-10-03 08:54:43 +0000213 DD->addArangeLabel(SymbolCU(this, Sym));
Eric Christopher0969ddf2013-01-18 22:11:33 +0000214 if (!DD->useSplitDwarf()) {
215 addUInt(Die, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
216 addLabel(Die, 0, dwarf::DW_FORM_udata, Sym);
217 } else {
Eric Christopher0969ddf2013-01-18 22:11:33 +0000218 addUInt(Die, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_addr_index);
David Blaikie8fed05e2013-07-01 23:55:52 +0000219 addUInt(Die, 0, dwarf::DW_FORM_GNU_addr_index, DU->getAddrPoolIndex(Sym));
Eric Christopher0969ddf2013-01-18 22:11:33 +0000220 }
221}
222
Devang Patel161b2f42011-04-12 23:21:44 +0000223/// addDelta - Add a label delta attribute data and value.
224///
Eric Christopher31667622013-08-08 01:41:00 +0000225void CompileUnit::addDelta(DIE *Die, uint16_t Attribute, uint16_t Form,
Devang Patel161b2f42011-04-12 23:21:44 +0000226 const MCSymbol *Hi, const MCSymbol *Lo) {
227 DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
228 Die->addValue(Attribute, Form, Value);
229}
230
231/// addDIEEntry - Add a DIE attribute data and value.
232///
Eric Christopher31667622013-08-08 01:41:00 +0000233void CompileUnit::addDIEEntry(DIE *Die, uint16_t Attribute, uint16_t Form,
Devang Patel161b2f42011-04-12 23:21:44 +0000234 DIE *Entry) {
Eric Christopher3f045002013-10-04 17:08:38 +0000235 Die->addValue(Attribute, Form, createDIEEntry(Entry));
Devang Patel161b2f42011-04-12 23:21:44 +0000236}
237
Devang Patel161b2f42011-04-12 23:21:44 +0000238/// addBlock - Add block data.
239///
Eric Christopher31667622013-08-08 01:41:00 +0000240void CompileUnit::addBlock(DIE *Die, uint16_t Attribute, uint16_t Form,
Devang Patel161b2f42011-04-12 23:21:44 +0000241 DIEBlock *Block) {
242 Block->ComputeSize(Asm);
243 DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
244 Die->addValue(Attribute, Block->BestForm(), Block);
245}
246
247/// addSourceLine - Add location information to specified debug information
248/// entry.
249void CompileUnit::addSourceLine(DIE *Die, DIVariable V) {
250 // Verify variable.
Manman Rend03d2b22013-07-08 18:33:29 +0000251 if (!V.isVariable())
Devang Patel161b2f42011-04-12 23:21:44 +0000252 return;
Eric Christopher8b4310b2012-11-21 00:34:38 +0000253
Devang Patel161b2f42011-04-12 23:21:44 +0000254 unsigned Line = V.getLineNumber();
255 if (Line == 0)
256 return;
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000257 unsigned FileID = DD->getOrCreateSourceID(V.getContext().getFilename(),
Manman Ren3de61b42013-03-07 01:42:00 +0000258 V.getContext().getDirectory(),
259 getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000260 assert(FileID && "Invalid file id");
261 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
262 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
263}
264
265/// addSourceLine - Add location information to specified debug information
266/// entry.
267void CompileUnit::addSourceLine(DIE *Die, DIGlobalVariable G) {
268 // Verify global variable.
Manman Rend03d2b22013-07-08 18:33:29 +0000269 if (!G.isGlobalVariable())
Devang Patel161b2f42011-04-12 23:21:44 +0000270 return;
271
272 unsigned Line = G.getLineNumber();
273 if (Line == 0)
274 return;
Manman Ren3de61b42013-03-07 01:42:00 +0000275 unsigned FileID = DD->getOrCreateSourceID(G.getFilename(), G.getDirectory(),
276 getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000277 assert(FileID && "Invalid file id");
278 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
279 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
280}
281
282/// addSourceLine - Add location information to specified debug information
283/// entry.
284void CompileUnit::addSourceLine(DIE *Die, DISubprogram SP) {
285 // Verify subprogram.
Manman Rend03d2b22013-07-08 18:33:29 +0000286 if (!SP.isSubprogram())
Devang Patel161b2f42011-04-12 23:21:44 +0000287 return;
Eric Christopher2125d5a2012-03-15 23:55:40 +0000288
Devang Patel161b2f42011-04-12 23:21:44 +0000289 // If the line number is 0, don't add it.
Eric Christopher2125d5a2012-03-15 23:55:40 +0000290 unsigned Line = SP.getLineNumber();
291 if (Line == 0)
Devang Patel161b2f42011-04-12 23:21:44 +0000292 return;
293
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000294 unsigned FileID = DD->getOrCreateSourceID(SP.getFilename(),
Manman Ren3de61b42013-03-07 01:42:00 +0000295 SP.getDirectory(), getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000296 assert(FileID && "Invalid file id");
297 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
298 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
299}
300
301/// addSourceLine - Add location information to specified debug information
302/// entry.
303void CompileUnit::addSourceLine(DIE *Die, DIType Ty) {
304 // Verify type.
Manman Rend03d2b22013-07-08 18:33:29 +0000305 if (!Ty.isType())
Devang Patel161b2f42011-04-12 23:21:44 +0000306 return;
307
308 unsigned Line = Ty.getLineNumber();
Eric Christopher2125d5a2012-03-15 23:55:40 +0000309 if (Line == 0)
Devang Patel161b2f42011-04-12 23:21:44 +0000310 return;
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000311 unsigned FileID = DD->getOrCreateSourceID(Ty.getFilename(),
Manman Ren3de61b42013-03-07 01:42:00 +0000312 Ty.getDirectory(), getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000313 assert(FileID && "Invalid file id");
314 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
315 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
316}
317
318/// addSourceLine - Add location information to specified debug information
319/// entry.
Eric Christopherb8ca9882012-03-29 08:42:56 +0000320void CompileUnit::addSourceLine(DIE *Die, DIObjCProperty Ty) {
321 // Verify type.
Manman Rend03d2b22013-07-08 18:33:29 +0000322 if (!Ty.isObjCProperty())
Eric Christopherb8ca9882012-03-29 08:42:56 +0000323 return;
324
325 unsigned Line = Ty.getLineNumber();
326 if (Line == 0)
327 return;
328 DIFile File = Ty.getFile();
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000329 unsigned FileID = DD->getOrCreateSourceID(File.getFilename(),
Manman Ren3de61b42013-03-07 01:42:00 +0000330 File.getDirectory(), getUniqueID());
Eric Christopherb8ca9882012-03-29 08:42:56 +0000331 assert(FileID && "Invalid file id");
332 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
333 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
334}
335
336/// addSourceLine - Add location information to specified debug information
337/// entry.
Devang Patel161b2f42011-04-12 23:21:44 +0000338void CompileUnit::addSourceLine(DIE *Die, DINameSpace NS) {
339 // Verify namespace.
340 if (!NS.Verify())
341 return;
342
343 unsigned Line = NS.getLineNumber();
344 if (Line == 0)
345 return;
346 StringRef FN = NS.getFilename();
347
Manman Ren3de61b42013-03-07 01:42:00 +0000348 unsigned FileID = DD->getOrCreateSourceID(FN, NS.getDirectory(),
349 getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000350 assert(FileID && "Invalid file id");
351 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
352 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
353}
354
Eric Christopher8b4310b2012-11-21 00:34:38 +0000355/// addVariableAddress - Add DW_AT_location attribute for a
Devang Patele1cdf842011-04-27 22:45:24 +0000356/// DbgVariable based on provided MachineLocation.
Eric Christopherf61dbc12013-06-24 21:07:27 +0000357void CompileUnit::addVariableAddress(const DbgVariable &DV, DIE *Die,
Devang Patele1cdf842011-04-27 22:45:24 +0000358 MachineLocation Location) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000359 if (DV.variableHasComplexAddress())
Devang Patel161b2f42011-04-12 23:21:44 +0000360 addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
Eric Christopherf61dbc12013-06-24 21:07:27 +0000361 else if (DV.isBlockByrefVariable())
Devang Patel161b2f42011-04-12 23:21:44 +0000362 addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location);
363 else
David Blaikie4532c282013-06-20 00:25:24 +0000364 addAddress(Die, dwarf::DW_AT_location, Location,
Eric Christopherf61dbc12013-06-24 21:07:27 +0000365 DV.getVariable().isIndirect());
Devang Patel161b2f42011-04-12 23:21:44 +0000366}
367
Devang Patel116da2f2011-04-26 19:06:18 +0000368/// addRegisterOp - Add register operand.
369void CompileUnit::addRegisterOp(DIE *TheDie, unsigned Reg) {
370 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
371 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
372 if (DWReg < 32)
373 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + DWReg);
374 else {
375 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
376 addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
377 }
378}
379
380/// addRegisterOffset - Add register offset.
381void CompileUnit::addRegisterOffset(DIE *TheDie, unsigned Reg,
382 int64_t Offset) {
383 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
384 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
385 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
386 if (Reg == TRI->getFrameRegister(*Asm->MF))
387 // If variable offset is based in frame register then use fbreg.
388 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
389 else if (DWReg < 32)
390 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DWReg);
391 else {
392 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
393 addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
394 }
395 addSInt(TheDie, 0, dwarf::DW_FORM_sdata, Offset);
396}
397
398/// addAddress - Add an address attribute to a die based on the location
399/// provided.
Eric Christopher31667622013-08-08 01:41:00 +0000400void CompileUnit::addAddress(DIE *Die, uint16_t Attribute,
David Blaikie4532c282013-06-20 00:25:24 +0000401 const MachineLocation &Location, bool Indirect) {
Devang Patel116da2f2011-04-26 19:06:18 +0000402 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
403
David Blaikie4532c282013-06-20 00:25:24 +0000404 if (Location.isReg() && !Indirect)
Devang Patel116da2f2011-04-26 19:06:18 +0000405 addRegisterOp(Block, Location.getReg());
David Blaikie4532c282013-06-20 00:25:24 +0000406 else {
Devang Patel116da2f2011-04-26 19:06:18 +0000407 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
David Blaikie4532c282013-06-20 00:25:24 +0000408 if (Indirect && !Location.isReg()) {
409 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
410 }
411 }
Devang Patel116da2f2011-04-26 19:06:18 +0000412
413 // Now attach the location information to the DIE.
414 addBlock(Die, Attribute, 0, Block);
415}
416
Devang Patel161b2f42011-04-12 23:21:44 +0000417/// addComplexAddress - Start with the address based on the location provided,
418/// and generate the DWARF information necessary to find the actual variable
419/// given the extra address information encoded in the DIVariable, starting from
420/// the starting location. Add the DWARF information to the die.
421///
Eric Christopherf61dbc12013-06-24 21:07:27 +0000422void CompileUnit::addComplexAddress(const DbgVariable &DV, DIE *Die,
Eric Christopher31667622013-08-08 01:41:00 +0000423 uint16_t Attribute,
Devang Patel161b2f42011-04-12 23:21:44 +0000424 const MachineLocation &Location) {
Devang Patel161b2f42011-04-12 23:21:44 +0000425 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Eric Christopherf61dbc12013-06-24 21:07:27 +0000426 unsigned N = DV.getNumAddrElements();
Devang Patelc26f5442011-04-28 02:22:40 +0000427 unsigned i = 0;
428 if (Location.isReg()) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000429 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
Devang Patelc26f5442011-04-28 02:22:40 +0000430 // If first address element is OpPlus then emit
431 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
Eric Christopherf61dbc12013-06-24 21:07:27 +0000432 addRegisterOffset(Block, Location.getReg(), DV.getAddrElement(1));
Devang Patelc26f5442011-04-28 02:22:40 +0000433 i = 2;
434 } else
435 addRegisterOp(Block, Location.getReg());
436 }
Devang Patel116da2f2011-04-26 19:06:18 +0000437 else
438 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel161b2f42011-04-12 23:21:44 +0000439
Devang Patelc26f5442011-04-28 02:22:40 +0000440 for (;i < N; ++i) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000441 uint64_t Element = DV.getAddrElement(i);
Devang Patel161b2f42011-04-12 23:21:44 +0000442 if (Element == DIBuilder::OpPlus) {
443 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
Eric Christopherf61dbc12013-06-24 21:07:27 +0000444 addUInt(Block, 0, dwarf::DW_FORM_udata, DV.getAddrElement(++i));
Devang Patel161b2f42011-04-12 23:21:44 +0000445 } else if (Element == DIBuilder::OpDeref) {
Eric Christopher50120762012-05-08 18:56:00 +0000446 if (!Location.isReg())
447 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Devang Patel161b2f42011-04-12 23:21:44 +0000448 } else llvm_unreachable("unknown DIBuilder Opcode");
449 }
450
451 // Now attach the location information to the DIE.
452 addBlock(Die, Attribute, 0, Block);
453}
454
455/* Byref variables, in Blocks, are declared by the programmer as "SomeType
456 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
457 gives the variable VarName either the struct, or a pointer to the struct, as
458 its type. This is necessary for various behind-the-scenes things the
459 compiler needs to do with by-reference variables in Blocks.
460
461 However, as far as the original *programmer* is concerned, the variable
462 should still have type 'SomeType', as originally declared.
463
464 The function getBlockByrefType dives into the __Block_byref_x_VarName
465 struct to find the original type of the variable, which is then assigned to
466 the variable's Debug Information Entry as its real type. So far, so good.
467 However now the debugger will expect the variable VarName to have the type
468 SomeType. So we need the location attribute for the variable to be an
469 expression that explains to the debugger how to navigate through the
470 pointers and struct to find the actual variable of type SomeType.
471
472 The following function does just that. We start by getting
473 the "normal" location for the variable. This will be the location
474 of either the struct __Block_byref_x_VarName or the pointer to the
475 struct __Block_byref_x_VarName.
476
477 The struct will look something like:
478
479 struct __Block_byref_x_VarName {
480 ... <various fields>
481 struct __Block_byref_x_VarName *forwarding;
482 ... <various other fields>
483 SomeType VarName;
484 ... <maybe more fields>
485 };
486
487 If we are given the struct directly (as our starting point) we
488 need to tell the debugger to:
489
490 1). Add the offset of the forwarding field.
491
492 2). Follow that pointer to get the real __Block_byref_x_VarName
493 struct to use (the real one may have been copied onto the heap).
494
495 3). Add the offset for the field VarName, to find the actual variable.
496
497 If we started with a pointer to the struct, then we need to
498 dereference that pointer first, before the other steps.
499 Translating this into DWARF ops, we will need to append the following
500 to the current location description for the variable:
501
502 DW_OP_deref -- optional, if we start with a pointer
503 DW_OP_plus_uconst <forward_fld_offset>
504 DW_OP_deref
505 DW_OP_plus_uconst <varName_fld_offset>
506
507 That is what this function does. */
508
509/// addBlockByrefAddress - Start with the address based on the location
510/// provided, and generate the DWARF information necessary to find the
511/// actual Block variable (navigating the Block struct) based on the
512/// starting location. Add the DWARF information to the die. For
513/// more information, read large comment just above here.
514///
Eric Christopherf61dbc12013-06-24 21:07:27 +0000515void CompileUnit::addBlockByrefAddress(const DbgVariable &DV, DIE *Die,
Eric Christopher31667622013-08-08 01:41:00 +0000516 uint16_t Attribute,
Devang Patel161b2f42011-04-12 23:21:44 +0000517 const MachineLocation &Location) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000518 DIType Ty = DV.getType();
Devang Patel161b2f42011-04-12 23:21:44 +0000519 DIType TmpTy = Ty;
Eric Christopher31667622013-08-08 01:41:00 +0000520 uint16_t Tag = Ty.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +0000521 bool isPointer = false;
522
Eric Christopherf61dbc12013-06-24 21:07:27 +0000523 StringRef varName = DV.getName();
Devang Patel161b2f42011-04-12 23:21:44 +0000524
525 if (Tag == dwarf::DW_TAG_pointer_type) {
526 DIDerivedType DTy = DIDerivedType(Ty);
Eric Christopher3f045002013-10-04 17:08:38 +0000527 TmpTy = DTy.getTypeDerivedFrom();
Devang Patel161b2f42011-04-12 23:21:44 +0000528 isPointer = true;
529 }
530
531 DICompositeType blockStruct = DICompositeType(TmpTy);
532
533 // Find the __forwarding field and the variable field in the __Block_byref
534 // struct.
535 DIArray Fields = blockStruct.getTypeArray();
536 DIDescriptor varField = DIDescriptor();
537 DIDescriptor forwardingField = DIDescriptor();
538
539 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
540 DIDescriptor Element = Fields.getElement(i);
541 DIDerivedType DT = DIDerivedType(Element);
542 StringRef fieldName = DT.getName();
543 if (fieldName == "__forwarding")
544 forwardingField = Element;
545 else if (fieldName == varName)
546 varField = Element;
547 }
548
549 // Get the offsets for the forwarding field and the variable field.
550 unsigned forwardingFieldOffset =
551 DIDerivedType(forwardingField).getOffsetInBits() >> 3;
552 unsigned varFieldOffset =
553 DIDerivedType(varField).getOffsetInBits() >> 3;
554
555 // Decode the original location, and use that as the start of the byref
556 // variable's location.
Devang Patel161b2f42011-04-12 23:21:44 +0000557 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
558
Eric Christophercaba2632012-07-04 02:02:18 +0000559 if (Location.isReg())
560 addRegisterOp(Block, Location.getReg());
561 else
562 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel161b2f42011-04-12 23:21:44 +0000563
564 // If we started with a pointer to the __Block_byref... struct, then
565 // the first thing we need to do is dereference the pointer (DW_OP_deref).
566 if (isPointer)
567 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
568
569 // Next add the offset for the '__forwarding' field:
570 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
571 // adding the offset if it's 0.
572 if (forwardingFieldOffset > 0) {
573 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
574 addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
575 }
576
577 // Now dereference the __forwarding field to get to the real __Block_byref
578 // struct: DW_OP_deref.
579 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
580
581 // Now that we've got the real __Block_byref... struct, add the offset
582 // for the variable's field to get to the location of the actual variable:
583 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
584 if (varFieldOffset > 0) {
585 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
586 addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
587 }
588
589 // Now attach the location information to the DIE.
590 addBlock(Die, Attribute, 0, Block);
591}
592
Devang Patel4ec14b02011-07-20 21:57:04 +0000593/// isTypeSigned - Return true if the type is signed.
Eric Christopher3f045002013-10-04 17:08:38 +0000594static bool isTypeSigned(DIType Ty, int *SizeInBits) {
Devang Patel4ec14b02011-07-20 21:57:04 +0000595 if (Ty.isDerivedType())
Eric Christopher3f045002013-10-04 17:08:38 +0000596 return isTypeSigned(DIDerivedType(Ty).getTypeDerivedFrom(), SizeInBits);
Devang Patel4ec14b02011-07-20 21:57:04 +0000597 if (Ty.isBasicType())
598 if (DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed
599 || DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed_char) {
600 *SizeInBits = Ty.getSizeInBits();
601 return true;
602 }
603 return false;
604}
605
Devang Patel161b2f42011-04-12 23:21:44 +0000606/// addConstantValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000607void CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO,
Devang Patelb58128e2011-05-27 16:45:18 +0000608 DIType Ty) {
David Blaikie4de9d722013-05-10 21:52:07 +0000609 // FIXME: This is a bit conservative/simple - it emits negative values at
610 // their maximum bit width which is a bit unfortunate (& doesn't prefer
611 // udata/sdata over dataN as suggested by the DWARF spec)
Nick Lewycky746cb672011-10-26 22:55:33 +0000612 assert(MO.isImm() && "Invalid machine operand!");
Devang Patel4ec14b02011-07-20 21:57:04 +0000613 int SizeInBits = -1;
Eric Christopher3f045002013-10-04 17:08:38 +0000614 bool SignedConstant = isTypeSigned(Ty, &SizeInBits);
Eric Christopher7b2ee392013-08-27 23:49:04 +0000615 uint16_t Form;
Devang Patel72f0d9c2011-05-27 18:15:52 +0000616
Eric Christopher7b2ee392013-08-27 23:49:04 +0000617 // If we're a signed constant definitely use sdata.
618 if (SignedConstant) {
619 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, MO.getImm());
620 return;
621 }
622
623 // Else use data for now unless it's larger than we can deal with.
624 switch (SizeInBits) {
625 case 8:
626 Form = dwarf::DW_FORM_data1;
627 break;
628 case 16:
629 Form = dwarf::DW_FORM_data2;
630 break;
631 case 32:
632 Form = dwarf::DW_FORM_data4;
633 break;
634 case 64:
635 Form = dwarf::DW_FORM_data8;
636 break;
637 default:
638 Form = dwarf::DW_FORM_udata;
639 addUInt(Die, dwarf::DW_AT_const_value, Form, MO.getImm());
640 return;
641 }
642 addUInt(Die, dwarf::DW_AT_const_value, Form, MO.getImm());
Devang Patel161b2f42011-04-12 23:21:44 +0000643}
644
645/// addConstantFPValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000646void CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
Nick Lewycky390c40d2011-10-27 06:44:11 +0000647 assert (MO.isFPImm() && "Invalid machine operand!");
Devang Patel161b2f42011-04-12 23:21:44 +0000648 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
649 APFloat FPImm = MO.getFPImm()->getValueAPF();
650
651 // Get the raw data form of the floating point.
652 const APInt FltVal = FPImm.bitcastToAPInt();
653 const char *FltPtr = (const char*)FltVal.getRawData();
654
655 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
Micah Villmow3574eca2012-10-08 16:38:25 +0000656 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel161b2f42011-04-12 23:21:44 +0000657 int Incr = (LittleEndian ? 1 : -1);
658 int Start = (LittleEndian ? 0 : NumBytes - 1);
659 int Stop = (LittleEndian ? NumBytes : -1);
660
661 // Output the constant to DWARF one byte at a time.
662 for (; Start != Stop; Start += Incr)
663 addUInt(Block, 0, dwarf::DW_FORM_data1,
664 (unsigned char)0xFF & FltPtr[Start]);
665
666 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
Devang Patel161b2f42011-04-12 23:21:44 +0000667}
668
David Blaikie14268412013-01-20 01:18:01 +0000669/// addConstantFPValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000670void CompileUnit::addConstantFPValue(DIE *Die, const ConstantFP *CFP) {
Eric Christopher7b2ee392013-08-27 23:49:04 +0000671 // Pass this down to addConstantValue as an unsigned bag of bits.
672 addConstantValue(Die, CFP->getValueAPF().bitcastToAPInt(), true);
David Blaikie14268412013-01-20 01:18:01 +0000673}
674
Devang Patel161b2f42011-04-12 23:21:44 +0000675/// addConstantValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000676void CompileUnit::addConstantValue(DIE *Die, const ConstantInt *CI,
Devang Patel161b2f42011-04-12 23:21:44 +0000677 bool Unsigned) {
Eric Christophere4721492013-07-03 01:08:30 +0000678 addConstantValue(Die, CI->getValue(), Unsigned);
David Blaikie14268412013-01-20 01:18:01 +0000679}
680
681// addConstantValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000682void CompileUnit::addConstantValue(DIE *Die, const APInt &Val, bool Unsigned) {
David Blaikie14268412013-01-20 01:18:01 +0000683 unsigned CIBitWidth = Val.getBitWidth();
Devang Pateld6a81362011-05-28 00:39:18 +0000684 if (CIBitWidth <= 64) {
Eric Christopher7b2ee392013-08-27 23:49:04 +0000685 // If we're a signed constant definitely use sdata.
686 if (!Unsigned) {
687 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata,
688 Val.getSExtValue());
689 return;
Devang Pateld6a81362011-05-28 00:39:18 +0000690 }
Eric Christopher7b2ee392013-08-27 23:49:04 +0000691
692 // Else use data for now unless it's larger than we can deal with.
693 uint16_t Form;
694 switch (CIBitWidth) {
695 case 8:
696 Form = dwarf::DW_FORM_data1;
697 break;
698 case 16:
699 Form = dwarf::DW_FORM_data2;
700 break;
701 case 32:
702 Form = dwarf::DW_FORM_data4;
703 break;
704 case 64:
705 Form = dwarf::DW_FORM_data8;
706 break;
707 default:
708 addUInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
709 Val.getZExtValue());
710 return;
711 }
712 addUInt(Die, dwarf::DW_AT_const_value, Form, Val.getZExtValue());
Eric Christophere4721492013-07-03 01:08:30 +0000713 return;
Devang Patel161b2f42011-04-12 23:21:44 +0000714 }
715
716 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
717
718 // Get the raw data form of the large APInt.
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000719 const uint64_t *Ptr64 = Val.getRawData();
Devang Patel161b2f42011-04-12 23:21:44 +0000720
721 int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
Micah Villmow3574eca2012-10-08 16:38:25 +0000722 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel161b2f42011-04-12 23:21:44 +0000723
724 // Output the constant to DWARF one byte at a time.
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000725 for (int i = 0; i < NumBytes; i++) {
726 uint8_t c;
727 if (LittleEndian)
728 c = Ptr64[i / 8] >> (8 * (i & 7));
729 else
730 c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7));
731 addUInt(Block, 0, dwarf::DW_FORM_data1, c);
732 }
Devang Patel161b2f42011-04-12 23:21:44 +0000733
734 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
Devang Patel161b2f42011-04-12 23:21:44 +0000735}
736
Eric Christopher6c3bb942013-04-22 07:47:40 +0000737/// addTemplateParams - Add template parameters into buffer.
Devang Patel161b2f42011-04-12 23:21:44 +0000738void CompileUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
739 // Add template parameters.
740 for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) {
741 DIDescriptor Element = TParams.getElement(i);
742 if (Element.isTemplateTypeParameter())
743 Buffer.addChild(getOrCreateTemplateTypeParameterDIE(
744 DITemplateTypeParameter(Element)));
745 else if (Element.isTemplateValueParameter())
746 Buffer.addChild(getOrCreateTemplateValueParameterDIE(
747 DITemplateValueParameter(Element)));
748 }
Devang Patel161b2f42011-04-12 23:21:44 +0000749}
Nick Lewycky746cb672011-10-26 22:55:33 +0000750
Eric Christopher6b6061f2013-01-16 01:22:23 +0000751/// getOrCreateContextDIE - Get context owner's DIE.
752DIE *CompileUnit::getOrCreateContextDIE(DIDescriptor Context) {
753 if (Context.isType())
754 return getOrCreateTypeDIE(DIType(Context));
755 else if (Context.isNameSpace())
756 return getOrCreateNameSpace(DINameSpace(Context));
757 else if (Context.isSubprogram())
758 return getOrCreateSubprogramDIE(DISubprogram(Context));
Eric Christopher6c3bb942013-04-22 07:47:40 +0000759 else
Eric Christopher6b6061f2013-01-16 01:22:23 +0000760 return getDIE(Context);
761}
762
Devang Patel161b2f42011-04-12 23:21:44 +0000763/// addToContextOwner - Add Die into the list of its context owner's children.
764void CompileUnit::addToContextOwner(DIE *Die, DIDescriptor Context) {
David Blaikiee5830c42013-10-03 20:07:20 +0000765 assert(!Die->getParent());
766 if (DIE *ContextDIE = getOrCreateContextDIE(Context)) {
767 if (Die->getParent()) {
768 // While creating the context, if this is a type member, we will have
769 // added the child to the context already.
770 assert(Die->getParent() == ContextDIE);
771 return;
772 }
Devang Patel161b2f42011-04-12 23:21:44 +0000773 ContextDIE->addChild(Die);
David Blaikiee5830c42013-10-03 20:07:20 +0000774 } else
Devang Patel161b2f42011-04-12 23:21:44 +0000775 addDie(Die);
776}
777
778/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
779/// given DIType.
Devang Patel94c7ddb2011-08-16 22:09:43 +0000780DIE *CompileUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
781 DIType Ty(TyNode);
Manman Rend03d2b22013-07-08 18:33:29 +0000782 if (!Ty.isType())
Devang Patel94c7ddb2011-08-16 22:09:43 +0000783 return NULL;
Eric Christopher3f045002013-10-04 17:08:38 +0000784 DIE *TyDIE = getDIE(Ty);
Devang Patel161b2f42011-04-12 23:21:44 +0000785 if (TyDIE)
786 return TyDIE;
787
788 // Create new type.
789 TyDIE = new DIE(dwarf::DW_TAG_base_type);
Eric Christopher3f045002013-10-04 17:08:38 +0000790 insertDIE(Ty, TyDIE);
Devang Patel161b2f42011-04-12 23:21:44 +0000791 if (Ty.isBasicType())
792 constructTypeDIE(*TyDIE, DIBasicType(Ty));
793 else if (Ty.isCompositeType())
794 constructTypeDIE(*TyDIE, DICompositeType(Ty));
795 else {
796 assert(Ty.isDerivedType() && "Unknown kind of DIType");
797 constructTypeDIE(*TyDIE, DIDerivedType(Ty));
798 }
Eric Christopher1b3f9192011-11-10 19:52:58 +0000799 // If this is a named finished type then include it in the list of types
800 // for the accelerator tables.
Eric Christopherc36145f2012-01-06 04:35:23 +0000801 if (!Ty.getName().empty() && !Ty.isForwardDecl()) {
802 bool IsImplementation = 0;
803 if (Ty.isCompositeType()) {
804 DICompositeType CT(Ty);
Eric Christophere0167892012-01-06 23:03:37 +0000805 // A runtime language of 0 actually means C/C++ and that any
806 // non-negative value is some version of Objective-C/C++.
Eric Christopherc36145f2012-01-06 04:35:23 +0000807 IsImplementation = (CT.getRunTimeLang() == 0) ||
Eric Christophere2dc9332012-02-22 08:46:02 +0000808 CT.isObjcClassComplete();
Eric Christopherc36145f2012-01-06 04:35:23 +0000809 }
Eric Christopher577056f2013-09-05 18:20:16 +0000810 unsigned Flags = IsImplementation ? dwarf::DW_FLAG_type_implementation : 0;
Eric Christophere0167892012-01-06 23:03:37 +0000811 addAccelType(Ty.getName(), std::make_pair(TyDIE, Flags));
Eric Christopherc36145f2012-01-06 04:35:23 +0000812 }
Eric Christopher8b4310b2012-11-21 00:34:38 +0000813
Manman Ren2c9905a2013-09-09 19:47:11 +0000814 addToContextOwner(TyDIE, DD->resolve(Ty.getContext()));
Devang Patel161b2f42011-04-12 23:21:44 +0000815 return TyDIE;
816}
817
818/// addType - Add a new type attribute to the specified entity.
Eric Christopher31667622013-08-08 01:41:00 +0000819void CompileUnit::addType(DIE *Entity, DIType Ty, uint16_t Attribute) {
Eric Christopherdc1363f2013-08-08 07:40:37 +0000820 assert(Ty && "Trying to add a type that doesn't exist?");
Devang Patel161b2f42011-04-12 23:21:44 +0000821
822 // Check for pre-existence.
823 DIEEntry *Entry = getDIEEntry(Ty);
824 // If it exists then use the existing value.
825 if (Entry) {
Eric Christopher3f045002013-10-04 17:08:38 +0000826 Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
Devang Patel161b2f42011-04-12 23:21:44 +0000827 return;
828 }
829
830 // Construct type.
831 DIE *Buffer = getOrCreateTypeDIE(Ty);
832
833 // Set up proxy.
834 Entry = createDIEEntry(Buffer);
835 insertDIEEntry(Ty, Entry);
Eric Christopher3f045002013-10-04 17:08:38 +0000836 Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
Devang Patele9ae06c2011-05-31 22:56:51 +0000837
838 // If this is a complete composite type then include it in the
839 // list of global types.
Devang Patelc20bdf12011-06-01 00:23:24 +0000840 addGlobalType(Ty);
Devang Patel66658e42011-05-31 23:30:30 +0000841}
842
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000843// Accelerator table mutators - add each name along with its companion
844// DIE to the proper table while ensuring that the name that we're going
845// to reference is in the string table. We do this since the names we
846// add may not only be identical to the names in the DIE.
847void CompileUnit::addAccelName(StringRef Name, DIE *Die) {
848 DU->getStringPoolEntry(Name);
Eric Christopher734334e2013-09-23 22:59:11 +0000849 std::vector<DIE *> &DIEs = AccelNames[Name];
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000850 DIEs.push_back(Die);
851}
852
853void CompileUnit::addAccelObjC(StringRef Name, DIE *Die) {
854 DU->getStringPoolEntry(Name);
Eric Christopher734334e2013-09-23 22:59:11 +0000855 std::vector<DIE *> &DIEs = AccelObjC[Name];
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000856 DIEs.push_back(Die);
857}
858
859void CompileUnit::addAccelNamespace(StringRef Name, DIE *Die) {
860 DU->getStringPoolEntry(Name);
Eric Christopher734334e2013-09-23 22:59:11 +0000861 std::vector<DIE *> &DIEs = AccelNamespace[Name];
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000862 DIEs.push_back(Die);
863}
864
865void CompileUnit::addAccelType(StringRef Name, std::pair<DIE *, unsigned> Die) {
866 DU->getStringPoolEntry(Name);
867 std::vector<std::pair<DIE *, unsigned> > &DIEs = AccelTypes[Name];
868 DIEs.push_back(Die);
869}
870
Eric Christopher50d37a42013-09-20 22:20:55 +0000871/// addGlobalName - Add a new global name to the compile unit.
872void CompileUnit::addGlobalName(StringRef Name, DIE *Die) {
873 GlobalNames[Name] = Die;
874}
875
Devang Patel66658e42011-05-31 23:30:30 +0000876/// addGlobalType - Add a new global type to the compile unit.
877///
Devang Patelc20bdf12011-06-01 00:23:24 +0000878void CompileUnit::addGlobalType(DIType Ty) {
Manman Ren2c9905a2013-09-09 19:47:11 +0000879 DIDescriptor Context = DD->resolve(Ty.getContext());
Eric Christopher5a634742013-09-23 23:15:58 +0000880 if (!Ty.getName().empty() && !Ty.isForwardDecl() &&
Eric Christopher734334e2013-09-23 22:59:11 +0000881 (!Context || Context.isCompileUnit() || Context.isFile() ||
882 Context.isNameSpace()))
Devang Patelc20bdf12011-06-01 00:23:24 +0000883 if (DIEEntry *Entry = getDIEEntry(Ty))
884 GlobalTypes[Ty.getName()] = Entry->getEntry();
Devang Patel161b2f42011-04-12 23:21:44 +0000885}
886
Devang Patel31c5d052011-05-06 16:57:54 +0000887/// addPubTypes - Add type for pubtypes section.
888void CompileUnit::addPubTypes(DISubprogram SP) {
889 DICompositeType SPTy = SP.getType();
Eric Christopher31667622013-08-08 01:41:00 +0000890 uint16_t SPTag = SPTy.getTag();
Devang Patel31c5d052011-05-06 16:57:54 +0000891 if (SPTag != dwarf::DW_TAG_subroutine_type)
892 return;
893
894 DIArray Args = SPTy.getTypeArray();
895 for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
896 DIType ATy(Args.getElement(i));
Manman Rend03d2b22013-07-08 18:33:29 +0000897 if (!ATy.isType())
Devang Patel31c5d052011-05-06 16:57:54 +0000898 continue;
Devang Patelc20bdf12011-06-01 00:23:24 +0000899 addGlobalType(ATy);
Devang Patel31c5d052011-05-06 16:57:54 +0000900 }
901}
902
Devang Patel161b2f42011-04-12 23:21:44 +0000903/// constructTypeDIE - Construct basic type die from DIBasicType.
904void CompileUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
905 // Get core information.
906 StringRef Name = BTy.getName();
Devang Patel161b2f42011-04-12 23:21:44 +0000907 // Add name if not anonymous or intermediate type.
908 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000909 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel734a67c2011-09-14 23:13:28 +0000910
911 if (BTy.getTag() == dwarf::DW_TAG_unspecified_type) {
912 Buffer.setTag(dwarf::DW_TAG_unspecified_type);
Eric Christopher61c91d52013-07-09 23:48:45 +0000913 // An unspecified type only has a name attribute.
Devang Patel734a67c2011-09-14 23:13:28 +0000914 return;
915 }
916
917 Buffer.setTag(dwarf::DW_TAG_base_type);
Nick Lewycky746cb672011-10-26 22:55:33 +0000918 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
Devang Patel30d409c2012-02-07 23:33:58 +0000919 BTy.getEncoding());
Devang Patel734a67c2011-09-14 23:13:28 +0000920
Devang Patel161b2f42011-04-12 23:21:44 +0000921 uint64_t Size = BTy.getSizeInBits() >> 3;
922 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
923}
924
925/// constructTypeDIE - Construct derived type die from DIDerivedType.
926void CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
927 // Get core information.
928 StringRef Name = DTy.getName();
929 uint64_t Size = DTy.getSizeInBits() >> 3;
Eric Christopher31667622013-08-08 01:41:00 +0000930 uint16_t Tag = DTy.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +0000931
932 // FIXME - Workaround for templates.
933 if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
934
935 Buffer.setTag(Tag);
936
937 // Map to main type, void will not have a type.
Eric Christopher3f045002013-10-04 17:08:38 +0000938 DIType FromTy = DTy.getTypeDerivedFrom();
Eric Christopherdc1363f2013-08-08 07:40:37 +0000939 if (FromTy)
940 addType(&Buffer, FromTy);
Devang Patel161b2f42011-04-12 23:21:44 +0000941
942 // Add name if not anonymous or intermediate type.
943 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000944 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +0000945
946 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopher35f225a2012-02-21 22:25:53 +0000947 if (Size && Tag != dwarf::DW_TAG_pointer_type)
Devang Patel161b2f42011-04-12 23:21:44 +0000948 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
949
David Blaikie62fdfb52013-01-07 05:51:15 +0000950 if (Tag == dwarf::DW_TAG_ptr_to_member_type)
951 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
Manman Renbc660712013-09-05 18:48:31 +0000952 getOrCreateTypeDIE(DD->resolve(DTy.getClassType())));
Devang Patel161b2f42011-04-12 23:21:44 +0000953 // Add source line info if available and TyDesc is not a forward declaration.
954 if (!DTy.isForwardDecl())
955 addSourceLine(&Buffer, DTy);
956}
957
Eric Christopher3dee5752013-07-26 17:02:41 +0000958/// Return true if the type is appropriately scoped to be contained inside
959/// its own type unit.
Manman Ren18eb2452013-09-09 19:23:58 +0000960static bool isTypeUnitScoped(DIType Ty, const DwarfDebug *DD) {
Manman Ren2c9905a2013-09-09 19:47:11 +0000961 DIScope Parent = DD->resolve(Ty.getContext());
Eric Christopher3dee5752013-07-26 17:02:41 +0000962 while (Parent) {
963 // Don't generate a hash for anything scoped inside a function.
964 if (Parent.isSubprogram())
965 return false;
Manman Rene72aba92013-09-09 22:35:23 +0000966 Parent = DD->resolve(Parent.getContext());
Eric Christopher3dee5752013-07-26 17:02:41 +0000967 }
968 return true;
969}
970
971/// Return true if the type should be split out into a type unit.
Manman Ren18eb2452013-09-09 19:23:58 +0000972static bool shouldCreateTypeUnit(DICompositeType CTy, const DwarfDebug *DD) {
Eric Christopher31667622013-08-08 01:41:00 +0000973 uint16_t Tag = CTy.getTag();
Eric Christopher3dee5752013-07-26 17:02:41 +0000974
975 switch (Tag) {
976 case dwarf::DW_TAG_structure_type:
977 case dwarf::DW_TAG_union_type:
978 case dwarf::DW_TAG_enumeration_type:
979 case dwarf::DW_TAG_class_type:
980 // If this is a class, structure, union, or enumeration type
981 // that is not a declaration, is a type definition, and not scoped
982 // inside a function then separate this out as a type unit.
Manman Ren18eb2452013-09-09 19:23:58 +0000983 if (CTy.isForwardDecl() || !isTypeUnitScoped(CTy, DD))
Eric Christopher3dee5752013-07-26 17:02:41 +0000984 return 0;
985 return 1;
986 default:
987 return 0;
988 }
989}
990
Devang Patel161b2f42011-04-12 23:21:44 +0000991/// constructTypeDIE - Construct type DIE from DICompositeType.
992void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
993 // Get core information.
994 StringRef Name = CTy.getName();
995
996 uint64_t Size = CTy.getSizeInBits() >> 3;
Eric Christopher31667622013-08-08 01:41:00 +0000997 uint16_t Tag = CTy.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +0000998 Buffer.setTag(Tag);
999
1000 switch (Tag) {
Devang Patel161b2f42011-04-12 23:21:44 +00001001 case dwarf::DW_TAG_array_type:
1002 constructArrayTypeDIE(Buffer, &CTy);
1003 break;
1004 case dwarf::DW_TAG_enumeration_type: {
1005 DIArray Elements = CTy.getTypeArray();
1006
1007 // Add enumerators to enumeration type.
1008 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1009 DIE *ElemDie = NULL;
1010 DIDescriptor Enum(Elements.getElement(i));
1011 if (Enum.isEnumerator()) {
1012 ElemDie = constructEnumTypeDIE(DIEnumerator(Enum));
1013 Buffer.addChild(ElemDie);
1014 }
1015 }
Eric Christopher3f045002013-10-04 17:08:38 +00001016 DIType DTy = CTy.getTypeDerivedFrom();
Eric Christopher37c107b2013-08-08 07:40:42 +00001017 if (DTy) {
Eric Christopherbb0f6ea2012-05-23 00:09:20 +00001018 addType(&Buffer, DTy);
1019 addUInt(&Buffer, dwarf::DW_AT_enum_class, dwarf::DW_FORM_flag, 1);
1020 }
Devang Patel161b2f42011-04-12 23:21:44 +00001021 }
1022 break;
1023 case dwarf::DW_TAG_subroutine_type: {
Eric Christopherdc1363f2013-08-08 07:40:37 +00001024 // Add return type. A void return won't have a type.
Devang Patel161b2f42011-04-12 23:21:44 +00001025 DIArray Elements = CTy.getTypeArray();
1026 DIDescriptor RTy = Elements.getElement(0);
Eric Christopherdc1363f2013-08-08 07:40:37 +00001027 if (RTy)
1028 addType(&Buffer, DIType(RTy));
Devang Patel161b2f42011-04-12 23:21:44 +00001029
1030 bool isPrototyped = true;
1031 // Add arguments.
1032 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
1033 DIDescriptor Ty = Elements.getElement(i);
1034 if (Ty.isUnspecifiedParameter()) {
1035 DIE *Arg = new DIE(dwarf::DW_TAG_unspecified_parameters);
1036 Buffer.addChild(Arg);
1037 isPrototyped = false;
1038 } else {
1039 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1040 addType(Arg, DIType(Ty));
David Blaikieaaf2e632013-01-29 19:35:24 +00001041 if (DIType(Ty).isArtificial())
1042 addFlag(Arg, dwarf::DW_AT_artificial);
Devang Patel161b2f42011-04-12 23:21:44 +00001043 Buffer.addChild(Arg);
1044 }
1045 }
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001046 // Add prototype flag if we're dealing with a C language and the
1047 // function has been prototyped.
Eric Christopher7b878952013-08-26 23:50:38 +00001048 uint16_t Language = DICompileUnit(Node).getLanguage();
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001049 if (isPrototyped &&
Eric Christopher4d069bf2012-05-22 18:45:24 +00001050 (Language == dwarf::DW_LANG_C89 ||
1051 Language == dwarf::DW_LANG_C99 ||
1052 Language == dwarf::DW_LANG_ObjC))
Eric Christopher873cf0a2012-08-24 01:14:27 +00001053 addFlag(&Buffer, dwarf::DW_AT_prototyped);
Devang Patel161b2f42011-04-12 23:21:44 +00001054 }
1055 break;
1056 case dwarf::DW_TAG_structure_type:
1057 case dwarf::DW_TAG_union_type:
1058 case dwarf::DW_TAG_class_type: {
Devang Patel161b2f42011-04-12 23:21:44 +00001059 // Add elements to structure type.
David Blaikiec8b93552013-08-01 20:30:22 +00001060 DIArray Elements = CTy.getTypeArray();
1061 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
Devang Patel161b2f42011-04-12 23:21:44 +00001062 DIDescriptor Element = Elements.getElement(i);
1063 DIE *ElemDie = NULL;
1064 if (Element.isSubprogram()) {
1065 DISubprogram SP(Element);
Devang Pateldbc64af2011-08-15 17:24:54 +00001066 ElemDie = getOrCreateSubprogramDIE(DISubprogram(Element));
Devang Patel161b2f42011-04-12 23:21:44 +00001067 if (SP.isProtected())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001068 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001069 dwarf::DW_ACCESS_protected);
1070 else if (SP.isPrivate())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001071 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001072 dwarf::DW_ACCESS_private);
Eric Christopher8b4310b2012-11-21 00:34:38 +00001073 else
Nick Lewycky13aaca52011-12-13 05:09:11 +00001074 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001075 dwarf::DW_ACCESS_public);
1076 if (SP.isExplicit())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001077 addFlag(ElemDie, dwarf::DW_AT_explicit);
Eric Christopher663e0cf2012-03-28 07:34:31 +00001078 } else if (Element.isDerivedType()) {
Eric Christopher4d069bf2012-05-22 18:45:24 +00001079 DIDerivedType DDTy(Element);
1080 if (DDTy.getTag() == dwarf::DW_TAG_friend) {
1081 ElemDie = new DIE(dwarf::DW_TAG_friend);
Eric Christopher3f045002013-10-04 17:08:38 +00001082 addType(ElemDie, DDTy.getTypeDerivedFrom(), dwarf::DW_AT_friend);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001083 } else if (DDTy.isStaticMember())
1084 ElemDie = createStaticMemberDIE(DDTy);
1085 else
1086 ElemDie = createMemberDIE(DDTy);
David Blaikiee5830c42013-10-03 20:07:20 +00001087 Buffer.addChild(ElemDie);
Eric Christopher663e0cf2012-03-28 07:34:31 +00001088 } else if (Element.isObjCProperty()) {
Devang Patel30d409c2012-02-07 23:33:58 +00001089 DIObjCProperty Property(Element);
1090 ElemDie = new DIE(Property.getTag());
1091 StringRef PropertyName = Property.getObjCPropertyName();
1092 addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
Eric Christopher4d069bf2012-05-22 18:45:24 +00001093 addType(ElemDie, Property.getType());
1094 addSourceLine(ElemDie, Property);
Devang Patel30d409c2012-02-07 23:33:58 +00001095 StringRef GetterName = Property.getObjCPropertyGetterName();
1096 if (!GetterName.empty())
1097 addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
1098 StringRef SetterName = Property.getObjCPropertySetterName();
1099 if (!SetterName.empty())
1100 addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
1101 unsigned PropertyAttributes = 0;
Devang Patel9e11eb12012-02-04 01:30:32 +00001102 if (Property.isReadOnlyObjCProperty())
1103 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
1104 if (Property.isReadWriteObjCProperty())
1105 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
1106 if (Property.isAssignObjCProperty())
1107 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
1108 if (Property.isRetainObjCProperty())
1109 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
1110 if (Property.isCopyObjCProperty())
1111 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
1112 if (Property.isNonAtomicObjCProperty())
1113 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
1114 if (PropertyAttributes)
Eric Christopher8b4310b2012-11-21 00:34:38 +00001115 addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, 0,
Devang Patel9e11eb12012-02-04 01:30:32 +00001116 PropertyAttributes);
Devang Patel6588abf2012-02-06 17:49:43 +00001117
Devang Patel30d409c2012-02-07 23:33:58 +00001118 DIEEntry *Entry = getDIEEntry(Element);
1119 if (!Entry) {
1120 Entry = createDIEEntry(ElemDie);
1121 insertDIEEntry(Element, Entry);
1122 }
David Blaikiee5830c42013-10-03 20:07:20 +00001123 Buffer.addChild(ElemDie);
Devang Patel9e11eb12012-02-04 01:30:32 +00001124 } else
Devang Patel161b2f42011-04-12 23:21:44 +00001125 continue;
Devang Patel161b2f42011-04-12 23:21:44 +00001126 }
1127
1128 if (CTy.isAppleBlockExtension())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001129 addFlag(&Buffer, dwarf::DW_AT_APPLE_block);
Devang Patel161b2f42011-04-12 23:21:44 +00001130
Manman Rene42279c2013-09-06 18:46:00 +00001131 DICompositeType ContainingType(DD->resolve(CTy.getContainingType()));
Devang Patel161b2f42011-04-12 23:21:44 +00001132 if (DIDescriptor(ContainingType).isCompositeType())
1133 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
1134 getOrCreateTypeDIE(DIType(ContainingType)));
Devang Patel161b2f42011-04-12 23:21:44 +00001135
Devang Patel201e6cd2011-05-12 21:29:42 +00001136 if (CTy.isObjcClassComplete())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001137 addFlag(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type);
Devang Patelb11f80e2011-05-12 19:06:16 +00001138
Eric Christopher1a8e8862011-12-16 23:42:42 +00001139 // Add template parameters to a class, structure or union types.
1140 // FIXME: The support isn't in the metadata for this yet.
1141 if (Tag == dwarf::DW_TAG_class_type ||
1142 Tag == dwarf::DW_TAG_structure_type ||
1143 Tag == dwarf::DW_TAG_union_type)
Devang Patel161b2f42011-04-12 23:21:44 +00001144 addTemplateParams(Buffer, CTy.getTemplateParams());
1145
1146 break;
1147 }
1148 default:
1149 break;
1150 }
1151
1152 // Add name if not anonymous or intermediate type.
1153 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001154 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001155
Eric Christopher4a5d8392012-05-22 18:45:18 +00001156 if (Tag == dwarf::DW_TAG_enumeration_type ||
1157 Tag == dwarf::DW_TAG_class_type ||
1158 Tag == dwarf::DW_TAG_structure_type ||
1159 Tag == dwarf::DW_TAG_union_type) {
Devang Patel161b2f42011-04-12 23:21:44 +00001160 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopherfc4199b2012-06-01 00:22:32 +00001161 // TODO: Do we care about size for enum forward declarations?
Devang Patel161b2f42011-04-12 23:21:44 +00001162 if (Size)
1163 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
Eric Christopherfc4199b2012-06-01 00:22:32 +00001164 else if (!CTy.isForwardDecl())
Devang Patel161b2f42011-04-12 23:21:44 +00001165 // Add zero size if it is not a forward declaration.
Eric Christopherfc4199b2012-06-01 00:22:32 +00001166 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
1167
1168 // If we're a forward decl, say so.
1169 if (CTy.isForwardDecl())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001170 addFlag(&Buffer, dwarf::DW_AT_declaration);
Devang Patel161b2f42011-04-12 23:21:44 +00001171
1172 // Add source line info if available.
1173 if (!CTy.isForwardDecl())
1174 addSourceLine(&Buffer, CTy);
Eric Christopher89388952012-03-07 00:15:19 +00001175
1176 // No harm in adding the runtime language to the declaration.
1177 unsigned RLang = CTy.getRunTimeLang();
1178 if (RLang)
1179 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
1180 dwarf::DW_FORM_data1, RLang);
Devang Patel161b2f42011-04-12 23:21:44 +00001181 }
Eric Christopher3dee5752013-07-26 17:02:41 +00001182 // If this is a type applicable to a type unit it then add it to the
1183 // list of types we'll compute a hash for later.
Manman Ren18eb2452013-09-09 19:23:58 +00001184 if (shouldCreateTypeUnit(CTy, DD))
Eric Christopher3dee5752013-07-26 17:02:41 +00001185 DD->addTypeUnitType(&Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +00001186}
1187
Eric Christopher8b4310b2012-11-21 00:34:38 +00001188/// getOrCreateTemplateTypeParameterDIE - Find existing DIE or create new DIE
Devang Patel161b2f42011-04-12 23:21:44 +00001189/// for the given DITemplateTypeParameter.
1190DIE *
1191CompileUnit::getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP) {
1192 DIE *ParamDIE = getDIE(TP);
1193 if (ParamDIE)
1194 return ParamDIE;
1195
1196 ParamDIE = new DIE(dwarf::DW_TAG_template_type_parameter);
Eric Christopher76ef79f2013-08-08 08:09:43 +00001197 // Add the type if it exists, it could be void and therefore no type.
1198 if (TP.getType())
1199 addType(ParamDIE, TP.getType());
David Blaikiee88939c2013-06-22 18:59:11 +00001200 if (!TP.getName().empty())
1201 addString(ParamDIE, dwarf::DW_AT_name, TP.getName());
Devang Patel161b2f42011-04-12 23:21:44 +00001202 return ParamDIE;
1203}
1204
Eric Christopher8b4310b2012-11-21 00:34:38 +00001205/// getOrCreateTemplateValueParameterDIE - Find existing DIE or create new DIE
Devang Patel161b2f42011-04-12 23:21:44 +00001206/// for the given DITemplateValueParameter.
1207DIE *
Eric Christopherafdd1f82013-08-08 07:40:31 +00001208CompileUnit::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter VP) {
1209 DIE *ParamDIE = getDIE(VP);
Devang Patel161b2f42011-04-12 23:21:44 +00001210 if (ParamDIE)
1211 return ParamDIE;
1212
Eric Christopherafdd1f82013-08-08 07:40:31 +00001213 ParamDIE = new DIE(VP.getTag());
Eric Christopherdc1363f2013-08-08 07:40:37 +00001214
1215 // Add the type if there is one, template template and template parameter
1216 // packs will not have a type.
1217 if (VP.getType())
1218 addType(ParamDIE, VP.getType());
Eric Christopherafdd1f82013-08-08 07:40:31 +00001219 if (!VP.getName().empty())
1220 addString(ParamDIE, dwarf::DW_AT_name, VP.getName());
1221 if (Value *Val = VP.getValue()) {
David Blaikie4de9d722013-05-10 21:52:07 +00001222 if (ConstantInt *CI = dyn_cast<ConstantInt>(Val))
Eric Christopher3f045002013-10-04 17:08:38 +00001223 addConstantValue(ParamDIE, CI, VP.getType().isUnsignedDIType());
David Blaikie4de9d722013-05-10 21:52:07 +00001224 else if (GlobalValue *GV = dyn_cast<GlobalValue>(Val)) {
1225 // For declaration non-type template parameters (such as global values and
1226 // functions)
1227 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1228 addOpAddress(Block, Asm->Mang->getSymbol(GV));
1229 // Emit DW_OP_stack_value to use the address as the immediate value of the
1230 // parameter, rather than a pointer to it.
1231 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value);
1232 addBlock(ParamDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopherafdd1f82013-08-08 07:40:31 +00001233 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_template_param) {
David Blaikiee88939c2013-06-22 18:59:11 +00001234 assert(isa<MDString>(Val));
1235 addString(ParamDIE, dwarf::DW_AT_GNU_template_name,
1236 cast<MDString>(Val)->getString());
Eric Christopherafdd1f82013-08-08 07:40:31 +00001237 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_parameter_pack) {
David Blaikiee88939c2013-06-22 18:59:11 +00001238 assert(isa<MDNode>(Val));
1239 DIArray A(cast<MDNode>(Val));
1240 addTemplateParams(*ParamDIE, A);
David Blaikie4de9d722013-05-10 21:52:07 +00001241 }
1242 }
1243
Devang Patel161b2f42011-04-12 23:21:44 +00001244 return ParamDIE;
1245}
1246
Devang Patel31c5d052011-05-06 16:57:54 +00001247/// getOrCreateNameSpace - Create a DIE for DINameSpace.
1248DIE *CompileUnit::getOrCreateNameSpace(DINameSpace NS) {
1249 DIE *NDie = getDIE(NS);
1250 if (NDie)
1251 return NDie;
1252 NDie = new DIE(dwarf::DW_TAG_namespace);
1253 insertDIE(NS, NDie);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001254 if (!NS.getName().empty()) {
Nick Lewycky390c40d2011-10-27 06:44:11 +00001255 addString(NDie, dwarf::DW_AT_name, NS.getName());
Eric Christopher09ac3d82011-11-07 09:24:32 +00001256 addAccelNamespace(NS.getName(), NDie);
Eric Christopher3d2c90f2013-09-24 00:17:57 +00001257 addGlobalName(NS.getName(), NDie);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001258 } else
1259 addAccelNamespace("(anonymous namespace)", NDie);
Devang Patel31c5d052011-05-06 16:57:54 +00001260 addSourceLine(NDie, NS);
1261 addToContextOwner(NDie, NS.getContext());
1262 return NDie;
1263}
1264
Devang Pateldbc64af2011-08-15 17:24:54 +00001265/// getOrCreateSubprogramDIE - Create new DIE using SP.
1266DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
David Blaikiec32f2332013-10-04 01:39:59 +00001267 // Construct the context before querying for the existence of the DIE in case
1268 // such construction creates the DIE (as is the case for member function
1269 // declarations).
1270 DIE *ContextDIE = getOrCreateContextDIE(SP.getContext());
1271 if (!ContextDIE)
1272 ContextDIE = CUDie.get();
1273
Eric Christopher3f045002013-10-04 17:08:38 +00001274 DIE *SPDie = getDIE(SP);
Devang Pateldbc64af2011-08-15 17:24:54 +00001275 if (SPDie)
1276 return SPDie;
1277
Peter Collingbourne27302f02012-05-27 18:36:44 +00001278 SPDie = new DIE(dwarf::DW_TAG_subprogram);
1279
1280 // DW_TAG_inlined_subroutine may refer to this DIE.
Eric Christopher3f045002013-10-04 17:08:38 +00001281 insertDIE(SP, SPDie);
Peter Collingbourne27302f02012-05-27 18:36:44 +00001282
Rafael Espindola01b55b42011-11-10 22:34:29 +00001283 DISubprogram SPDecl = SP.getFunctionDeclaration();
1284 DIE *DeclDie = NULL;
1285 if (SPDecl.isSubprogram()) {
1286 DeclDie = getOrCreateSubprogramDIE(SPDecl);
1287 }
1288
Devang Pateldbc64af2011-08-15 17:24:54 +00001289 // Add to context owner.
David Blaikiec32f2332013-10-04 01:39:59 +00001290 ContextDIE->addChild(SPDie);
Devang Pateldbc64af2011-08-15 17:24:54 +00001291
1292 // Add function template parameters.
1293 addTemplateParams(*SPDie, SP.getTemplateParams());
1294
Devang Pateldbc64af2011-08-15 17:24:54 +00001295 // If this DIE is going to refer declaration info using AT_specification
Eric Christopherc4968752013-05-09 00:42:33 +00001296 // then there is no need to add other attributes.
Rafael Espindola01b55b42011-11-10 22:34:29 +00001297 if (DeclDie) {
1298 // Refer function declaration directly.
1299 addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
1300 DeclDie);
1301
Devang Pateldbc64af2011-08-15 17:24:54 +00001302 return SPDie;
Rafael Espindola01b55b42011-11-10 22:34:29 +00001303 }
Devang Pateldbc64af2011-08-15 17:24:54 +00001304
Eric Christophercbbd5b12012-08-23 22:52:55 +00001305 // Add the linkage name if we have one.
Michael Gottesmandc42d032013-09-04 04:39:38 +00001306 StringRef LinkageName = SP.getLinkageName();
1307 if (!LinkageName.empty())
Eric Christophercbbd5b12012-08-23 22:52:55 +00001308 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c2b4be2013-06-01 17:51:14 +00001309 GlobalValue::getRealLinkageName(LinkageName));
Eric Christophercbbd5b12012-08-23 22:52:55 +00001310
Devang Pateldbc64af2011-08-15 17:24:54 +00001311 // Constructors and operators for anonymous aggregates do not have names.
1312 if (!SP.getName().empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001313 addString(SPDie, dwarf::DW_AT_name, SP.getName());
Devang Pateldbc64af2011-08-15 17:24:54 +00001314
1315 addSourceLine(SPDie, SP);
1316
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001317 // Add the prototype if we have a prototype and we have a C like
1318 // language.
Eric Christopher7b878952013-08-26 23:50:38 +00001319 uint16_t Language = DICompileUnit(Node).getLanguage();
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001320 if (SP.isPrototyped() &&
1321 (Language == dwarf::DW_LANG_C89 ||
1322 Language == dwarf::DW_LANG_C99 ||
1323 Language == dwarf::DW_LANG_ObjC))
Eric Christopher873cf0a2012-08-24 01:14:27 +00001324 addFlag(SPDie, dwarf::DW_AT_prototyped);
Devang Pateldbc64af2011-08-15 17:24:54 +00001325
Eric Christopherdc1363f2013-08-08 07:40:37 +00001326 // Add Return Type. A void return type will not have a type.
Devang Pateldbc64af2011-08-15 17:24:54 +00001327 DICompositeType SPTy = SP.getType();
David Blaikie3d331842013-05-22 23:22:18 +00001328 assert(SPTy.getTag() == dwarf::DW_TAG_subroutine_type &&
1329 "the type of a subprogram should be a subroutine");
Devang Pateldbc64af2011-08-15 17:24:54 +00001330
David Blaikie3d331842013-05-22 23:22:18 +00001331 DIArray Args = SPTy.getTypeArray();
Eric Christopherdc1363f2013-08-08 07:40:37 +00001332 if (Args.getElement(0))
1333 addType(SPDie, DIType(Args.getElement(0)));
Devang Pateldbc64af2011-08-15 17:24:54 +00001334
1335 unsigned VK = SP.getVirtuality();
1336 if (VK) {
Nick Lewycky798313d2011-12-14 00:56:07 +00001337 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
Devang Pateldbc64af2011-08-15 17:24:54 +00001338 DIEBlock *Block = getDIEBlock();
1339 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1340 addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex());
1341 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
1342 ContainingTypeMap.insert(std::make_pair(SPDie,
Manman Ren0e85f6e2013-09-07 00:04:05 +00001343 DD->resolve(SP.getContainingType())));
Devang Pateldbc64af2011-08-15 17:24:54 +00001344 }
1345
1346 if (!SP.isDefinition()) {
Eric Christopher873cf0a2012-08-24 01:14:27 +00001347 addFlag(SPDie, dwarf::DW_AT_declaration);
Eric Christopher8b4310b2012-11-21 00:34:38 +00001348
Devang Pateldbc64af2011-08-15 17:24:54 +00001349 // Add arguments. Do not add arguments for subprogram definition. They will
1350 // be handled while processing variables.
David Blaikie3d331842013-05-22 23:22:18 +00001351 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1352 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1353 DIType ATy = DIType(Args.getElement(i));
1354 addType(Arg, ATy);
1355 if (ATy.isArtificial())
1356 addFlag(Arg, dwarf::DW_AT_artificial);
1357 SPDie->addChild(Arg);
1358 }
Devang Pateldbc64af2011-08-15 17:24:54 +00001359 }
1360
1361 if (SP.isArtificial())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001362 addFlag(SPDie, dwarf::DW_AT_artificial);
Devang Pateldbc64af2011-08-15 17:24:54 +00001363
1364 if (!SP.isLocalToUnit())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001365 addFlag(SPDie, dwarf::DW_AT_external);
Devang Pateldbc64af2011-08-15 17:24:54 +00001366
1367 if (SP.isOptimized())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001368 addFlag(SPDie, dwarf::DW_AT_APPLE_optimized);
Devang Pateldbc64af2011-08-15 17:24:54 +00001369
1370 if (unsigned isa = Asm->getISAEncoding()) {
1371 addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1372 }
1373
1374 return SPDie;
1375}
1376
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001377// Return const expression if value is a GEP to access merged global
1378// constant. e.g.
1379// i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
1380static const ConstantExpr *getMergedGlobalExpr(const Value *V) {
1381 const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
1382 if (!CE || CE->getNumOperands() != 3 ||
1383 CE->getOpcode() != Instruction::GetElementPtr)
1384 return NULL;
1385
1386 // First operand points to a global struct.
1387 Value *Ptr = CE->getOperand(0);
1388 if (!isa<GlobalValue>(Ptr) ||
1389 !isa<StructType>(cast<PointerType>(Ptr->getType())->getElementType()))
1390 return NULL;
1391
1392 // Second operand is zero.
1393 const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
1394 if (!CI || !CI->isZero())
1395 return NULL;
1396
1397 // Third operand is offset.
1398 if (!isa<ConstantInt>(CE->getOperand(2)))
1399 return NULL;
1400
1401 return CE;
1402}
1403
1404/// createGlobalVariableDIE - create global variable DIE.
1405void CompileUnit::createGlobalVariableDIE(const MDNode *N) {
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001406 // Check for pre-existence.
Devang Patel49e2f032011-08-18 22:21:50 +00001407 if (getDIE(N))
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001408 return;
1409
Devang Patel49e2f032011-08-18 22:21:50 +00001410 DIGlobalVariable GV(N);
Manman Rend03d2b22013-07-08 18:33:29 +00001411 if (!GV.isGlobalVariable())
Devang Patel28bea082011-08-18 23:17:55 +00001412 return;
1413
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001414 DIDescriptor GVContext = GV.getContext();
Eric Christopher6b6061f2013-01-16 01:22:23 +00001415 DIType GTy = GV.getType();
1416
1417 // If this is a static data member definition, some attributes belong
1418 // to the declaration DIE.
1419 DIE *VariableDIE = NULL;
Manman Ren945e8282013-02-01 23:54:37 +00001420 bool IsStaticMember = false;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001421 DIDerivedType SDMDecl = GV.getStaticDataMemberDeclaration();
1422 if (SDMDecl.Verify()) {
1423 assert(SDMDecl.isStaticMember() && "Expected static member decl");
1424 // We need the declaration DIE that is in the static member's class.
1425 // But that class might not exist in the DWARF yet.
1426 // Creating the class will create the static member decl DIE.
Manman Ren2c9905a2013-09-09 19:47:11 +00001427 getOrCreateContextDIE(DD->resolve(SDMDecl.getContext()));
Eric Christopher3f045002013-10-04 17:08:38 +00001428 VariableDIE = getDIE(SDMDecl);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001429 assert(VariableDIE && "Static member decl has no context?");
Manman Ren945e8282013-02-01 23:54:37 +00001430 IsStaticMember = true;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001431 }
1432
1433 // If this is not a static data member definition, create the variable
1434 // DIE and add the initial set of attributes to it.
1435 if (!VariableDIE) {
1436 VariableDIE = new DIE(GV.getTag());
1437 // Add to map.
1438 insertDIE(N, VariableDIE);
1439
1440 // Add name and type.
1441 addString(VariableDIE, dwarf::DW_AT_name, GV.getDisplayName());
1442 addType(VariableDIE, GTy);
1443
1444 // Add scoping info.
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00001445 if (!GV.isLocalToUnit()) {
Eric Christopher6b6061f2013-01-16 01:22:23 +00001446 addFlag(VariableDIE, dwarf::DW_AT_external);
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00001447 addGlobalName(GV.getName(), VariableDIE);
1448 }
Eric Christopher6b6061f2013-01-16 01:22:23 +00001449
1450 // Add line number info.
1451 addSourceLine(VariableDIE, GV);
1452 // Add to context owner.
1453 addToContextOwner(VariableDIE, GVContext);
1454 }
1455
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001456 // Add location.
Eric Christopher09ac3d82011-11-07 09:24:32 +00001457 bool addToAccelTable = false;
Eric Christopherd61c34b2011-11-11 03:16:32 +00001458 DIE *VariableSpecDIE = NULL;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001459 bool isGlobalVariable = GV.getGlobal() != NULL;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001460 if (isGlobalVariable) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001461 addToAccelTable = true;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001462 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
David Blaikie59eaa382013-06-28 20:05:11 +00001463 const MCSymbol *Sym = Asm->Mang->getSymbol(GV.getGlobal());
1464 if (GV.getGlobal()->isThreadLocal()) {
1465 // FIXME: Make this work with -gsplit-dwarf.
1466 unsigned PointerSize = Asm->getDataLayout().getPointerSize();
1467 assert((PointerSize == 4 || PointerSize == 8) &&
1468 "Add support for other sizes if necessary");
Ulrich Weigand716a94f2013-07-02 18:47:09 +00001469 const MCExpr *Expr =
David Blaikie8fed05e2013-07-01 23:55:52 +00001470 Asm->getObjFileLowering().getDebugThreadLocalSymbol(Sym);
David Blaikie59eaa382013-06-28 20:05:11 +00001471 // Based on GCC's support for TLS:
David Blaikie8fed05e2013-07-01 23:55:52 +00001472 if (!DD->useSplitDwarf()) {
1473 // 1) Start with a constNu of the appropriate pointer size
1474 addUInt(Block, 0, dwarf::DW_FORM_data1,
1475 PointerSize == 4 ? dwarf::DW_OP_const4u : dwarf::DW_OP_const8u);
1476 // 2) containing the (relocated) address of the TLS variable
Ulrich Weigand716a94f2013-07-02 18:47:09 +00001477 addExpr(Block, 0, dwarf::DW_FORM_udata, Expr);
David Blaikie8fed05e2013-07-01 23:55:52 +00001478 } else {
1479 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_const_index);
Ulrich Weigand716a94f2013-07-02 18:47:09 +00001480 addUInt(Block, 0, dwarf::DW_FORM_udata, DU->getAddrPoolIndex(Expr));
David Blaikie8fed05e2013-07-01 23:55:52 +00001481 }
David Blaikie59eaa382013-06-28 20:05:11 +00001482 // 3) followed by a custom OP to tell the debugger about TLS (presumably)
1483 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_lo_user);
1484 } else
1485 addOpAddress(Block, Sym);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001486 // Do not create specification DIE if context is either compile unit
1487 // or a subprogram.
Devang Patel1dd4e562011-09-21 23:41:11 +00001488 if (GVContext && GV.isDefinition() && !GVContext.isCompileUnit() &&
Manman Ren02d29672013-09-09 19:05:21 +00001489 !GVContext.isFile() && !DD->isSubprogramContext(GVContext)) {
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001490 // Create specification DIE.
Eric Christopherd117fbb2011-11-11 01:55:22 +00001491 VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001492 addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
1493 dwarf::DW_FORM_ref4, VariableDIE);
1494 addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001495 // A static member's declaration is already flagged as such.
1496 if (!SDMDecl.Verify())
1497 addFlag(VariableDIE, dwarf::DW_AT_declaration);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001498 addDie(VariableSpecDIE);
1499 } else {
1500 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001501 }
Michael Gottesmandc42d032013-09-04 04:39:38 +00001502 // Add the linkage name.
Eric Christopher6b6061f2013-01-16 01:22:23 +00001503 StringRef LinkageName = GV.getLinkageName();
Michael Gottesmandc42d032013-09-04 04:39:38 +00001504 if (!LinkageName.empty())
Eric Christopher8d45a982013-02-27 23:49:47 +00001505 // From DWARF4: DIEs to which DW_AT_linkage_name may apply include:
1506 // TAG_common_block, TAG_constant, TAG_entry_point, TAG_subprogram and
1507 // TAG_variable.
Manman Ren21a08a12013-02-27 23:21:02 +00001508 addString(IsStaticMember && VariableSpecDIE ?
1509 VariableSpecDIE : VariableDIE, dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c2b4be2013-06-01 17:51:14 +00001510 GlobalValue::getRealLinkageName(LinkageName));
Eric Christopher8b4310b2012-11-21 00:34:38 +00001511 } else if (const ConstantInt *CI =
Manman Ren945e8282013-02-01 23:54:37 +00001512 dyn_cast_or_null<ConstantInt>(GV.getConstant())) {
Adrian Prantl2e892e42013-04-04 22:56:49 +00001513 // AT_const_value was added when the static member was created. To avoid
Manman Ren945e8282013-02-01 23:54:37 +00001514 // emitting AT_const_value multiple times, we only add AT_const_value when
1515 // it is not a static member.
1516 if (!IsStaticMember)
Eric Christopher3f045002013-10-04 17:08:38 +00001517 addConstantValue(VariableDIE, CI, GTy.isUnsignedDIType());
Manman Ren945e8282013-02-01 23:54:37 +00001518 } else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001519 addToAccelTable = true;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001520 // GV is a merged global.
1521 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1522 Value *Ptr = CE->getOperand(0);
Eric Christopher0969ddf2013-01-18 22:11:33 +00001523 addOpAddress(Block, Asm->Mang->getSymbol(cast<GlobalValue>(Ptr)));
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001524 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1525 SmallVector<Value*, 3> Idx(CE->op_begin()+1, CE->op_end());
Eric Christopher8b4310b2012-11-21 00:34:38 +00001526 addUInt(Block, 0, dwarf::DW_FORM_udata,
Micah Villmow3574eca2012-10-08 16:38:25 +00001527 Asm->getDataLayout().getIndexedOffset(Ptr->getType(), Idx));
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001528 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1529 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
1530 }
1531
Eric Christopherd117fbb2011-11-11 01:55:22 +00001532 if (addToAccelTable) {
1533 DIE *AddrDIE = VariableSpecDIE ? VariableSpecDIE : VariableDIE;
1534 addAccelName(GV.getName(), AddrDIE);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001535
Eric Christopherd117fbb2011-11-11 01:55:22 +00001536 // If the linkage name is different than the name, go ahead and output
1537 // that as well into the name table.
1538 if (GV.getLinkageName() != "" && GV.getName() != GV.getLinkageName())
1539 addAccelName(GV.getLinkageName(), AddrDIE);
1540 }
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001541}
1542
Devang Patel161b2f42011-04-12 23:21:44 +00001543/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
Eric Christopher4d069bf2012-05-22 18:45:24 +00001544void CompileUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR,
1545 DIE *IndexTy) {
Devang Patel161b2f42011-04-12 23:21:44 +00001546 DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
1547 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
Devang Patel161b2f42011-04-12 23:21:44 +00001548
Bill Wendling222c2fd2012-12-06 07:38:10 +00001549 // The LowerBound value defines the lower bounds which is typically zero for
1550 // C/C++. The Count value is the number of elements. Values are 64 bit. If
1551 // Count == -1 then the array is unbounded and we do not emit
1552 // DW_AT_lower_bound and DW_AT_upper_bound attributes. If LowerBound == 0 and
1553 // Count == 0, then the array has zero elements in which case we do not emit
1554 // an upper bound.
1555 int64_t LowerBound = SR.getLo();
Bill Wendling6afe4782012-12-06 07:55:19 +00001556 int64_t DefaultLowerBound = getDefaultLowerBound();
Bill Wendling9493dae2012-12-04 21:34:03 +00001557 int64_t Count = SR.getCount();
Devang Patel161b2f42011-04-12 23:21:44 +00001558
Bill Wendling6afe4782012-12-06 07:55:19 +00001559 if (DefaultLowerBound == -1 || LowerBound != DefaultLowerBound)
Bill Wendling222c2fd2012-12-06 07:38:10 +00001560 addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, LowerBound);
1561
1562 if (Count != -1 && Count != 0)
Bill Wendling9493dae2012-12-04 21:34:03 +00001563 // FIXME: An unbounded array should reference the expression that defines
1564 // the array.
Bill Wendling222c2fd2012-12-06 07:38:10 +00001565 addUInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, LowerBound + Count - 1);
Bill Wendling9493dae2012-12-04 21:34:03 +00001566
Devang Patel161b2f42011-04-12 23:21:44 +00001567 Buffer.addChild(DW_Subrange);
1568}
1569
1570/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
1571void CompileUnit::constructArrayTypeDIE(DIE &Buffer,
1572 DICompositeType *CTy) {
1573 Buffer.setTag(dwarf::DW_TAG_array_type);
Eric Christopher9a1e0e22013-01-08 01:53:52 +00001574 if (CTy->isVector())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001575 addFlag(&Buffer, dwarf::DW_AT_GNU_vector);
Devang Patel161b2f42011-04-12 23:21:44 +00001576
Eric Christopherdc1363f2013-08-08 07:40:37 +00001577 // Emit the element type.
Eric Christopher3f045002013-10-04 17:08:38 +00001578 addType(&Buffer, CTy->getTypeDerivedFrom());
Devang Patel161b2f42011-04-12 23:21:44 +00001579
1580 // Get an anonymous type for index type.
Eric Christopher8cab6ed2013-01-04 21:51:53 +00001581 // FIXME: This type should be passed down from the front end
1582 // as different languages may have different sizes for indexes.
Devang Patel161b2f42011-04-12 23:21:44 +00001583 DIE *IdxTy = getIndexTyDie();
1584 if (!IdxTy) {
1585 // Construct an anonymous type for index type.
1586 IdxTy = new DIE(dwarf::DW_TAG_base_type);
Eric Christopher8cab6ed2013-01-04 21:51:53 +00001587 addString(IdxTy, dwarf::DW_AT_name, "int");
Devang Patel161b2f42011-04-12 23:21:44 +00001588 addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1589 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1590 dwarf::DW_ATE_signed);
1591 addDie(IdxTy);
1592 setIndexTyDie(IdxTy);
1593 }
1594
1595 // Add subranges to array type.
Eric Christopherdc1363f2013-08-08 07:40:37 +00001596 DIArray Elements = CTy->getTypeArray();
Devang Patel161b2f42011-04-12 23:21:44 +00001597 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1598 DIDescriptor Element = Elements.getElement(i);
1599 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1600 constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1601 }
1602}
1603
1604/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
1605DIE *CompileUnit::constructEnumTypeDIE(DIEnumerator ETy) {
1606 DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
1607 StringRef Name = ETy.getName();
Nick Lewycky390c40d2011-10-27 06:44:11 +00001608 addString(Enumerator, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001609 int64_t Value = ETy.getEnumValue();
1610 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
1611 return Enumerator;
1612}
1613
Devang Pateldbc64af2011-08-15 17:24:54 +00001614/// constructContainingTypeDIEs - Construct DIEs for types that contain
1615/// vtables.
1616void CompileUnit::constructContainingTypeDIEs() {
1617 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
1618 CE = ContainingTypeMap.end(); CI != CE; ++CI) {
1619 DIE *SPDie = CI->first;
1620 const MDNode *N = CI->second;
1621 if (!N) continue;
Eric Christopher3f045002013-10-04 17:08:38 +00001622 DIE *NDie = getDIE(N);
Devang Pateldbc64af2011-08-15 17:24:54 +00001623 if (!NDie) continue;
1624 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
1625 }
1626}
1627
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001628/// constructVariableDIE - Construct a DIE for the given DbgVariable.
Eric Christopherf61dbc12013-06-24 21:07:27 +00001629DIE *CompileUnit::constructVariableDIE(DbgVariable *DV,
1630 bool isScopeAbstract) {
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001631 StringRef Name = DV->getName();
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001632
1633 // Translate tag to proper Dwarf tag.
Eric Christopher31667622013-08-08 01:41:00 +00001634 uint16_t Tag = DV->getTag();
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001635
1636 // Define variable debug information entry.
1637 DIE *VariableDie = new DIE(Tag);
1638 DbgVariable *AbsVar = DV->getAbstractVariable();
1639 DIE *AbsDIE = AbsVar ? AbsVar->getDIE() : NULL;
Manman Ren742671b2013-05-29 17:16:59 +00001640 if (AbsDIE)
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001641 addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
Manman Ren742671b2013-05-29 17:16:59 +00001642 dwarf::DW_FORM_ref4, AbsDIE);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001643 else {
David Blaikie2883fd42013-08-19 03:34:03 +00001644 if (!Name.empty())
1645 addString(VariableDie, dwarf::DW_AT_name, Name);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001646 addSourceLine(VariableDie, DV->getVariable());
1647 addType(VariableDie, DV->getType());
1648 }
1649
1650 if (DV->isArtificial())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001651 addFlag(VariableDie, dwarf::DW_AT_artificial);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001652
1653 if (isScopeAbstract) {
1654 DV->setDIE(VariableDie);
1655 return VariableDie;
1656 }
1657
1658 // Add variable address.
1659
1660 unsigned Offset = DV->getDotDebugLocOffset();
1661 if (Offset != ~0U) {
Eric Christopherafbe0e22013-06-24 21:34:55 +00001662 addLabel(VariableDie, dwarf::DW_AT_location, dwarf::DW_FORM_data4,
1663 Asm->GetTempSymbol("debug_loc", Offset));
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001664 DV->setDIE(VariableDie);
1665 return VariableDie;
1666 }
1667
Eric Christopher8cf5e742011-10-03 15:49:20 +00001668 // Check if variable is described by a DBG_VALUE instruction.
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001669 if (const MachineInstr *DVInsn = DV->getMInsn()) {
David Blaikie6d9dbd52013-06-16 20:34:15 +00001670 assert(DVInsn->getNumOperands() == 3);
1671 if (DVInsn->getOperand(0).isReg()) {
1672 const MachineOperand RegOp = DVInsn->getOperand(0);
Adrian Prantlb2754912013-07-09 21:44:06 +00001673 // If the second operand is an immediate, this is an indirect value.
Adrian Prantl35176402013-07-09 20:28:37 +00001674 if (DVInsn->getOperand(1).isImm()) {
1675 MachineLocation Location(RegOp.getReg(), DVInsn->getOperand(1).getImm());
Eric Christopherf61dbc12013-06-24 21:07:27 +00001676 addVariableAddress(*DV, VariableDie, Location);
David Blaikie6d9dbd52013-06-16 20:34:15 +00001677 } else if (RegOp.getReg())
Eric Christopherf61dbc12013-06-24 21:07:27 +00001678 addVariableAddress(*DV, VariableDie, MachineLocation(RegOp.getReg()));
David Blaikie6d9dbd52013-06-16 20:34:15 +00001679 } else if (DVInsn->getOperand(0).isImm())
Eric Christophere4721492013-07-03 01:08:30 +00001680 addConstantValue(VariableDie, DVInsn->getOperand(0), DV->getType());
David Blaikie6d9dbd52013-06-16 20:34:15 +00001681 else if (DVInsn->getOperand(0).isFPImm())
Eric Christophere4721492013-07-03 01:08:30 +00001682 addConstantFPValue(VariableDie, DVInsn->getOperand(0));
David Blaikie6d9dbd52013-06-16 20:34:15 +00001683 else if (DVInsn->getOperand(0).isCImm())
Eric Christophere4721492013-07-03 01:08:30 +00001684 addConstantValue(VariableDie, DVInsn->getOperand(0).getCImm(),
Eric Christopher3f045002013-10-04 17:08:38 +00001685 DV->getType().isUnsignedDIType());
Eric Christophere4721492013-07-03 01:08:30 +00001686
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001687 DV->setDIE(VariableDie);
1688 return VariableDie;
1689 } else {
1690 // .. else use frame index.
1691 int FI = DV->getFrameIndex();
1692 if (FI != ~0) {
1693 unsigned FrameReg = 0;
1694 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
Eric Christopher8b4310b2012-11-21 00:34:38 +00001695 int Offset =
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001696 TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
1697 MachineLocation Location(FrameReg, Offset);
Eric Christopherf61dbc12013-06-24 21:07:27 +00001698 addVariableAddress(*DV, VariableDie, Location);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001699 }
1700 }
1701
1702 DV->setDIE(VariableDie);
1703 return VariableDie;
1704}
1705
Devang Patel161b2f42011-04-12 23:21:44 +00001706/// createMemberDIE - Create new member DIE.
1707DIE *CompileUnit::createMemberDIE(DIDerivedType DT) {
1708 DIE *MemberDie = new DIE(DT.getTag());
1709 StringRef Name = DT.getName();
1710 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001711 addString(MemberDie, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001712
Eric Christopher3f045002013-10-04 17:08:38 +00001713 addType(MemberDie, DT.getTypeDerivedFrom());
Devang Patel161b2f42011-04-12 23:21:44 +00001714
1715 addSourceLine(MemberDie, DT);
1716
1717 DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
1718 addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1719
1720 uint64_t Size = DT.getSizeInBits();
Eric Christopher3f045002013-10-04 17:08:38 +00001721 uint64_t FieldSize = DT.getOriginalTypeSize();
Devang Patel161b2f42011-04-12 23:21:44 +00001722
1723 if (Size != FieldSize) {
1724 // Handle bitfield.
Eric Christopher3f045002013-10-04 17:08:38 +00001725 addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
Devang Patel161b2f42011-04-12 23:21:44 +00001726 addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1727
1728 uint64_t Offset = DT.getOffsetInBits();
1729 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1730 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1731 uint64_t FieldOffset = (HiMark - FieldSize);
1732 Offset -= FieldOffset;
1733
1734 // Maybe we need to work from the other end.
Micah Villmow3574eca2012-10-08 16:38:25 +00001735 if (Asm->getDataLayout().isLittleEndian())
Devang Patel161b2f42011-04-12 23:21:44 +00001736 Offset = FieldSize - (Offset + Size);
1737 addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
1738
1739 // Here WD_AT_data_member_location points to the anonymous
1740 // field that includes this bit field.
1741 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
1742
1743 } else
1744 // This is not a bitfield.
1745 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1746
1747 if (DT.getTag() == dwarf::DW_TAG_inheritance
1748 && DT.isVirtual()) {
1749
1750 // For C++, virtual base classes are not at fixed offset. Use following
1751 // expression to extract appropriate offset from vtable.
1752 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1753
1754 DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
1755 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1756 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1757 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1758 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1759 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1760 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1761 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1762
1763 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
1764 VBaseLocationDie);
1765 } else
1766 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
1767
1768 if (DT.isProtected())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001769 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001770 dwarf::DW_ACCESS_protected);
1771 else if (DT.isPrivate())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001772 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001773 dwarf::DW_ACCESS_private);
1774 // Otherwise C++ member and base classes are considered public.
Eric Christopher8b4310b2012-11-21 00:34:38 +00001775 else
Nick Lewycky13aaca52011-12-13 05:09:11 +00001776 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001777 dwarf::DW_ACCESS_public);
1778 if (DT.isVirtual())
Nick Lewycky798313d2011-12-14 00:56:07 +00001779 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001780 dwarf::DW_VIRTUALITY_virtual);
Devang Patele9db5e22011-04-16 00:11:51 +00001781
1782 // Objective-C properties.
Devang Patel6588abf2012-02-06 17:49:43 +00001783 if (MDNode *PNode = DT.getObjCProperty())
1784 if (DIEEntry *PropertyDie = getDIEEntry(PNode))
Eric Christopher8b4310b2012-11-21 00:34:38 +00001785 MemberDie->addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4,
Devang Patel6588abf2012-02-06 17:49:43 +00001786 PropertyDie);
1787
David Blaikie01bc2b32012-12-13 22:43:07 +00001788 if (DT.isArtificial())
1789 addFlag(MemberDie, dwarf::DW_AT_artificial);
1790
Devang Patel161b2f42011-04-12 23:21:44 +00001791 return MemberDie;
1792}
Eric Christopher6b6061f2013-01-16 01:22:23 +00001793
1794/// createStaticMemberDIE - Create new DIE for C++ static member.
1795DIE *CompileUnit::createStaticMemberDIE(const DIDerivedType DT) {
1796 if (!DT.Verify())
1797 return NULL;
1798
1799 DIE *StaticMemberDIE = new DIE(DT.getTag());
Eric Christopher3f045002013-10-04 17:08:38 +00001800 DIType Ty = DT.getTypeDerivedFrom();
Eric Christopher6b6061f2013-01-16 01:22:23 +00001801
1802 addString(StaticMemberDIE, dwarf::DW_AT_name, DT.getName());
1803 addType(StaticMemberDIE, Ty);
1804 addSourceLine(StaticMemberDIE, DT);
1805 addFlag(StaticMemberDIE, dwarf::DW_AT_external);
1806 addFlag(StaticMemberDIE, dwarf::DW_AT_declaration);
1807
1808 // FIXME: We could omit private if the parent is a class_type, and
1809 // public if the parent is something else.
1810 if (DT.isProtected())
1811 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1812 dwarf::DW_ACCESS_protected);
1813 else if (DT.isPrivate())
1814 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1815 dwarf::DW_ACCESS_private);
1816 else
1817 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1818 dwarf::DW_ACCESS_public);
1819
1820 if (const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(DT.getConstant()))
Eric Christopher3f045002013-10-04 17:08:38 +00001821 addConstantValue(StaticMemberDIE, CI, Ty.isUnsignedDIType());
David Blaikie14268412013-01-20 01:18:01 +00001822 if (const ConstantFP *CFP = dyn_cast_or_null<ConstantFP>(DT.getConstant()))
1823 addConstantFPValue(StaticMemberDIE, CFP);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001824
Eric Christopher3f045002013-10-04 17:08:38 +00001825 insertDIE(DT, StaticMemberDIE);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001826 return StaticMemberDIE;
1827}