blob: 3ff6d68a22deb4d8aec686d155ca2971b9f1fef2 [file] [log] [blame]
Devang Patel161b2f42011-04-12 23:21:44 +00001//===-- llvm/CodeGen/DwarfCompileUnit.cpp - Dwarf Compile Unit ------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
Eric Christopher443c9ed2012-08-14 05:13:29 +000010// This file contains support for constructing a dwarf compile unit.
Devang Patel161b2f42011-04-12 23:21:44 +000011//
12//===----------------------------------------------------------------------===//
13
14#define DEBUG_TYPE "dwarfdebug"
15
16#include "DwarfCompileUnit.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000017#include "DwarfAccelTable.h"
Devang Patel161b2f42011-04-12 23:21:44 +000018#include "DwarfDebug.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000019#include "llvm/ADT/APFloat.h"
Bill Wendling16eeb6f2012-06-29 08:32:07 +000020#include "llvm/DIBuilder.h"
Chandler Carruth0b8c9a82013-01-02 11:36:10 +000021#include "llvm/IR/Constants.h"
22#include "llvm/IR/DataLayout.h"
23#include "llvm/IR/GlobalVariable.h"
24#include "llvm/IR/Instructions.h"
Eric Christopherd61c34b2011-11-11 03:16:32 +000025#include "llvm/Support/Debug.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000026#include "llvm/Support/ErrorHandling.h"
Devang Patel6f9d8ff2011-08-15 17:57:41 +000027#include "llvm/Target/Mangler.h"
Devang Patel161b2f42011-04-12 23:21:44 +000028#include "llvm/Target/TargetFrameLowering.h"
29#include "llvm/Target/TargetMachine.h"
David Blaikie59eaa382013-06-28 20:05:11 +000030#include "llvm/Target/TargetLoweringObjectFile.h"
Devang Patel161b2f42011-04-12 23:21:44 +000031#include "llvm/Target/TargetRegisterInfo.h"
Devang Patel161b2f42011-04-12 23:21:44 +000032
33using namespace llvm;
34
35/// CompileUnit - Compile unit constructor.
Eric Christopher7b878952013-08-26 23:50:38 +000036CompileUnit::CompileUnit(unsigned UID, DIE *D, const MDNode *N, AsmPrinter *A,
37 DwarfDebug *DW, DwarfUnits *DWU)
Eric Christophere7099f62013-10-04 19:40:33 +000038 : UniqueID(UID), Node(N), CUDie(D), Asm(A), DD(DW), DU(DWU), IndexTyDie(0) {
Devang Patel161b2f42011-04-12 23:21:44 +000039 DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
Eric Christopher9c57ad22013-05-08 00:58:51 +000040 insertDIE(N, D);
Devang Patel161b2f42011-04-12 23:21:44 +000041}
42
43/// ~CompileUnit - Destructor for compile unit.
44CompileUnit::~CompileUnit() {
45 for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
46 DIEBlocks[j]->~DIEBlock();
47}
48
49/// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
50/// information entry.
51DIEEntry *CompileUnit::createDIEEntry(DIE *Entry) {
52 DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
53 return Value;
54}
55
Bill Wendling6afe4782012-12-06 07:55:19 +000056/// getDefaultLowerBound - Return the default lower bound for an array. If the
Bill Wendling222c2fd2012-12-06 07:38:10 +000057/// DWARF version doesn't handle the language, return -1.
Bill Wendling6afe4782012-12-06 07:55:19 +000058int64_t CompileUnit::getDefaultLowerBound() const {
Eric Christopher7b878952013-08-26 23:50:38 +000059 switch (DICompileUnit(Node).getLanguage()) {
Bill Wendling222c2fd2012-12-06 07:38:10 +000060 default:
61 break;
62
63 case dwarf::DW_LANG_C89:
64 case dwarf::DW_LANG_C99:
65 case dwarf::DW_LANG_C:
66 case dwarf::DW_LANG_C_plus_plus:
67 case dwarf::DW_LANG_ObjC:
68 case dwarf::DW_LANG_ObjC_plus_plus:
69 return 0;
70
71 case dwarf::DW_LANG_Fortran77:
72 case dwarf::DW_LANG_Fortran90:
73 case dwarf::DW_LANG_Fortran95:
74 return 1;
75
76 // The languages below have valid values only if the DWARF version >= 4.
77 case dwarf::DW_LANG_Java:
78 case dwarf::DW_LANG_Python:
79 case dwarf::DW_LANG_UPC:
80 case dwarf::DW_LANG_D:
81 if (dwarf::DWARF_VERSION >= 4)
82 return 0;
83 break;
84
85 case dwarf::DW_LANG_Ada83:
86 case dwarf::DW_LANG_Ada95:
87 case dwarf::DW_LANG_Cobol74:
88 case dwarf::DW_LANG_Cobol85:
89 case dwarf::DW_LANG_Modula2:
90 case dwarf::DW_LANG_Pascal83:
91 case dwarf::DW_LANG_PLI:
92 if (dwarf::DWARF_VERSION >= 4)
93 return 1;
94 break;
95 }
96
97 return -1;
98}
99
Eric Christopher873cf0a2012-08-24 01:14:27 +0000100/// addFlag - Add a flag that is true.
Eric Christopher31667622013-08-08 01:41:00 +0000101void CompileUnit::addFlag(DIE *Die, uint16_t Attribute) {
Michael Gottesmandc42d032013-09-04 04:39:38 +0000102 if (DD->getDwarfVersion() >= 4)
Eric Christopher9c0c9482013-10-04 22:40:05 +0000103 Die->addValue(Attribute, dwarf::DW_FORM_flag_present, DIEIntegerOne);
Eric Christopher873cf0a2012-08-24 01:14:27 +0000104 else
Eric Christopher9c0c9482013-10-04 22:40:05 +0000105 Die->addValue(Attribute, dwarf::DW_FORM_flag, DIEIntegerOne);
Eric Christopher873cf0a2012-08-24 01:14:27 +0000106}
107
Devang Patel161b2f42011-04-12 23:21:44 +0000108/// addUInt - Add an unsigned integer attribute data and value.
109///
Eric Christopher31667622013-08-08 01:41:00 +0000110void CompileUnit::addUInt(DIE *Die, uint16_t Attribute,
111 uint16_t Form, uint64_t Integer) {
Devang Patel161b2f42011-04-12 23:21:44 +0000112 if (!Form) Form = DIEInteger::BestForm(false, Integer);
113 DIEValue *Value = Integer == 1 ?
114 DIEIntegerOne : new (DIEValueAllocator) DIEInteger(Integer);
115 Die->addValue(Attribute, Form, Value);
116}
117
118/// addSInt - Add an signed integer attribute data and value.
119///
Eric Christopher31667622013-08-08 01:41:00 +0000120void CompileUnit::addSInt(DIE *Die, uint16_t Attribute,
121 uint16_t Form, int64_t Integer) {
Devang Patel161b2f42011-04-12 23:21:44 +0000122 if (!Form) Form = DIEInteger::BestForm(true, Integer);
123 DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
124 Die->addValue(Attribute, Form, Value);
125}
126
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000127/// addString - Add a string attribute data and value. We always emit a
128/// reference to the string pool instead of immediate strings so that DIEs have
Eric Christopher3cc42202013-01-07 19:32:45 +0000129/// more predictable sizes. In the case of split dwarf we emit an index
130/// into another table which gets us the static offset into the string
131/// table.
Eric Christopher31667622013-08-08 01:41:00 +0000132void CompileUnit::addString(DIE *Die, uint16_t Attribute, StringRef String) {
Eric Christopher3dee5752013-07-26 17:02:41 +0000133 DIEValue *Value;
Eric Christopher31667622013-08-08 01:41:00 +0000134 uint16_t Form;
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000135 if (!DD->useSplitDwarf()) {
136 MCSymbol *Symb = DU->getStringPoolEntry(String);
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000137 if (Asm->needsRelocationsForDwarfStringPool())
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000138 Value = new (DIEValueAllocator) DIELabel(Symb);
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000139 else {
140 MCSymbol *StringPool = DU->getStringPoolSym();
141 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
142 }
Eric Christopher3dee5752013-07-26 17:02:41 +0000143 Form = dwarf::DW_FORM_strp;
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000144 } else {
145 unsigned idx = DU->getStringPoolIndex(String);
Eric Christopher3dee5752013-07-26 17:02:41 +0000146 Value = new (DIEValueAllocator) DIEInteger(idx);
147 Form = dwarf::DW_FORM_GNU_str_index;
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000148 }
Eric Christopher3dee5752013-07-26 17:02:41 +0000149 DIEValue *Str = new (DIEValueAllocator) DIEString(Value, String);
150 Die->addValue(Attribute, Form, Str);
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000151}
152
153/// addLocalString - Add a string attribute data and value. This is guaranteed
154/// to be in the local string pool instead of indirected.
Eric Christopher31667622013-08-08 01:41:00 +0000155void CompileUnit::addLocalString(DIE *Die, uint16_t Attribute,
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000156 StringRef String) {
Eric Christopher2e5d8702012-12-20 21:58:36 +0000157 MCSymbol *Symb = DU->getStringPoolEntry(String);
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000158 DIEValue *Value;
159 if (Asm->needsRelocationsForDwarfStringPool())
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000160 Value = new (DIEValueAllocator) DIELabel(Symb);
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000161 else {
Eric Christopher2e5d8702012-12-20 21:58:36 +0000162 MCSymbol *StringPool = DU->getStringPoolSym();
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000163 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
Nick Lewycky390c40d2011-10-27 06:44:11 +0000164 }
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000165 Die->addValue(Attribute, dwarf::DW_FORM_strp, Value);
Devang Patel161b2f42011-04-12 23:21:44 +0000166}
167
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000168/// addExpr - Add a Dwarf expression attribute data and value.
Devang Patel161b2f42011-04-12 23:21:44 +0000169///
Eric Christopher31667622013-08-08 01:41:00 +0000170void CompileUnit::addExpr(DIE *Die, uint16_t Attribute, uint16_t Form,
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000171 const MCExpr *Expr) {
172 DIEValue *Value = new (DIEValueAllocator) DIEExpr(Expr);
Devang Patel161b2f42011-04-12 23:21:44 +0000173 Die->addValue(Attribute, Form, Value);
174}
175
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000176/// addLabel - Add a Dwarf label attribute data and value.
177///
Eric Christopher31667622013-08-08 01:41:00 +0000178void CompileUnit::addLabel(DIE *Die, uint16_t Attribute, uint16_t Form,
David Blaikie95e72c92013-06-28 20:05:04 +0000179 const MCSymbol *Label) {
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000180 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
181 Die->addValue(Attribute, Form, Value);
David Blaikie95e72c92013-06-28 20:05:04 +0000182}
183
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000184/// addLabelAddress - Add a dwarf label attribute data and value using
185/// DW_FORM_addr or DW_FORM_GNU_addr_index.
186///
Eric Christopher31667622013-08-08 01:41:00 +0000187void CompileUnit::addLabelAddress(DIE *Die, uint16_t Attribute,
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000188 MCSymbol *Label) {
Alexey Samsonov9d08d692013-10-03 08:54:43 +0000189 if (Label)
190 DD->addArangeLabel(SymbolCU(this, Label));
Richard Mitton5cc319a2013-09-19 23:21:01 +0000191
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000192 if (!DD->useSplitDwarf()) {
193 if (Label != NULL) {
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000194 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000195 Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
196 } else {
197 DIEValue *Value = new (DIEValueAllocator) DIEInteger(0);
198 Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
199 }
200 } else {
201 unsigned idx = DU->getAddrPoolIndex(Label);
202 DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx);
203 Die->addValue(Attribute, dwarf::DW_FORM_GNU_addr_index, Value);
204 }
205}
206
Eric Christopher0969ddf2013-01-18 22:11:33 +0000207/// addOpAddress - Add a dwarf op address data and value using the
208/// form given and an op of either DW_FORM_addr or DW_FORM_GNU_addr_index.
209///
David Blaikie95e72c92013-06-28 20:05:04 +0000210void CompileUnit::addOpAddress(DIE *Die, const MCSymbol *Sym) {
Alexey Samsonov9d08d692013-10-03 08:54:43 +0000211 DD->addArangeLabel(SymbolCU(this, Sym));
Eric Christopher0969ddf2013-01-18 22:11:33 +0000212 if (!DD->useSplitDwarf()) {
213 addUInt(Die, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
214 addLabel(Die, 0, dwarf::DW_FORM_udata, Sym);
215 } else {
Eric Christopher0969ddf2013-01-18 22:11:33 +0000216 addUInt(Die, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_addr_index);
David Blaikie8fed05e2013-07-01 23:55:52 +0000217 addUInt(Die, 0, dwarf::DW_FORM_GNU_addr_index, DU->getAddrPoolIndex(Sym));
Eric Christopher0969ddf2013-01-18 22:11:33 +0000218 }
219}
220
Devang Patel161b2f42011-04-12 23:21:44 +0000221/// addDelta - Add a label delta attribute data and value.
222///
Eric Christopher31667622013-08-08 01:41:00 +0000223void CompileUnit::addDelta(DIE *Die, uint16_t Attribute, uint16_t Form,
Devang Patel161b2f42011-04-12 23:21:44 +0000224 const MCSymbol *Hi, const MCSymbol *Lo) {
225 DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
226 Die->addValue(Attribute, Form, Value);
227}
228
229/// addDIEEntry - Add a DIE attribute data and value.
230///
Eric Christopher31667622013-08-08 01:41:00 +0000231void CompileUnit::addDIEEntry(DIE *Die, uint16_t Attribute, uint16_t Form,
Devang Patel161b2f42011-04-12 23:21:44 +0000232 DIE *Entry) {
Eric Christopher3f045002013-10-04 17:08:38 +0000233 Die->addValue(Attribute, Form, createDIEEntry(Entry));
Devang Patel161b2f42011-04-12 23:21:44 +0000234}
235
Devang Patel161b2f42011-04-12 23:21:44 +0000236/// addBlock - Add block data.
237///
Eric Christopher31667622013-08-08 01:41:00 +0000238void CompileUnit::addBlock(DIE *Die, uint16_t Attribute, uint16_t Form,
Devang Patel161b2f42011-04-12 23:21:44 +0000239 DIEBlock *Block) {
240 Block->ComputeSize(Asm);
241 DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
242 Die->addValue(Attribute, Block->BestForm(), Block);
243}
244
245/// addSourceLine - Add location information to specified debug information
246/// entry.
247void CompileUnit::addSourceLine(DIE *Die, DIVariable V) {
248 // Verify variable.
Manman Rend03d2b22013-07-08 18:33:29 +0000249 if (!V.isVariable())
Devang Patel161b2f42011-04-12 23:21:44 +0000250 return;
Eric Christopher8b4310b2012-11-21 00:34:38 +0000251
Devang Patel161b2f42011-04-12 23:21:44 +0000252 unsigned Line = V.getLineNumber();
253 if (Line == 0)
254 return;
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000255 unsigned FileID = DD->getOrCreateSourceID(V.getContext().getFilename(),
Manman Ren3de61b42013-03-07 01:42:00 +0000256 V.getContext().getDirectory(),
257 getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000258 assert(FileID && "Invalid file id");
259 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
260 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
261}
262
263/// addSourceLine - Add location information to specified debug information
264/// entry.
265void CompileUnit::addSourceLine(DIE *Die, DIGlobalVariable G) {
266 // Verify global variable.
Manman Rend03d2b22013-07-08 18:33:29 +0000267 if (!G.isGlobalVariable())
Devang Patel161b2f42011-04-12 23:21:44 +0000268 return;
269
270 unsigned Line = G.getLineNumber();
271 if (Line == 0)
272 return;
Manman Ren3de61b42013-03-07 01:42:00 +0000273 unsigned FileID = DD->getOrCreateSourceID(G.getFilename(), G.getDirectory(),
274 getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000275 assert(FileID && "Invalid file id");
276 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
277 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
278}
279
280/// addSourceLine - Add location information to specified debug information
281/// entry.
282void CompileUnit::addSourceLine(DIE *Die, DISubprogram SP) {
283 // Verify subprogram.
Manman Rend03d2b22013-07-08 18:33:29 +0000284 if (!SP.isSubprogram())
Devang Patel161b2f42011-04-12 23:21:44 +0000285 return;
Eric Christopher2125d5a2012-03-15 23:55:40 +0000286
Devang Patel161b2f42011-04-12 23:21:44 +0000287 // If the line number is 0, don't add it.
Eric Christopher2125d5a2012-03-15 23:55:40 +0000288 unsigned Line = SP.getLineNumber();
289 if (Line == 0)
Devang Patel161b2f42011-04-12 23:21:44 +0000290 return;
291
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000292 unsigned FileID = DD->getOrCreateSourceID(SP.getFilename(),
Manman Ren3de61b42013-03-07 01:42:00 +0000293 SP.getDirectory(), getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000294 assert(FileID && "Invalid file id");
295 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
296 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
297}
298
299/// addSourceLine - Add location information to specified debug information
300/// entry.
301void CompileUnit::addSourceLine(DIE *Die, DIType Ty) {
302 // Verify type.
Manman Rend03d2b22013-07-08 18:33:29 +0000303 if (!Ty.isType())
Devang Patel161b2f42011-04-12 23:21:44 +0000304 return;
305
306 unsigned Line = Ty.getLineNumber();
Eric Christopher2125d5a2012-03-15 23:55:40 +0000307 if (Line == 0)
Devang Patel161b2f42011-04-12 23:21:44 +0000308 return;
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000309 unsigned FileID = DD->getOrCreateSourceID(Ty.getFilename(),
Manman Ren3de61b42013-03-07 01:42:00 +0000310 Ty.getDirectory(), getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000311 assert(FileID && "Invalid file id");
312 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
313 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
314}
315
316/// addSourceLine - Add location information to specified debug information
317/// entry.
Eric Christopherb8ca9882012-03-29 08:42:56 +0000318void CompileUnit::addSourceLine(DIE *Die, DIObjCProperty Ty) {
319 // Verify type.
Manman Rend03d2b22013-07-08 18:33:29 +0000320 if (!Ty.isObjCProperty())
Eric Christopherb8ca9882012-03-29 08:42:56 +0000321 return;
322
323 unsigned Line = Ty.getLineNumber();
324 if (Line == 0)
325 return;
326 DIFile File = Ty.getFile();
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000327 unsigned FileID = DD->getOrCreateSourceID(File.getFilename(),
Manman Ren3de61b42013-03-07 01:42:00 +0000328 File.getDirectory(), getUniqueID());
Eric Christopherb8ca9882012-03-29 08:42:56 +0000329 assert(FileID && "Invalid file id");
330 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
331 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
332}
333
334/// addSourceLine - Add location information to specified debug information
335/// entry.
Devang Patel161b2f42011-04-12 23:21:44 +0000336void CompileUnit::addSourceLine(DIE *Die, DINameSpace NS) {
337 // Verify namespace.
338 if (!NS.Verify())
339 return;
340
341 unsigned Line = NS.getLineNumber();
342 if (Line == 0)
343 return;
344 StringRef FN = NS.getFilename();
345
Manman Ren3de61b42013-03-07 01:42:00 +0000346 unsigned FileID = DD->getOrCreateSourceID(FN, NS.getDirectory(),
347 getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000348 assert(FileID && "Invalid file id");
349 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
350 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
351}
352
Eric Christopher8b4310b2012-11-21 00:34:38 +0000353/// addVariableAddress - Add DW_AT_location attribute for a
Devang Patele1cdf842011-04-27 22:45:24 +0000354/// DbgVariable based on provided MachineLocation.
Eric Christopherf61dbc12013-06-24 21:07:27 +0000355void CompileUnit::addVariableAddress(const DbgVariable &DV, DIE *Die,
Devang Patele1cdf842011-04-27 22:45:24 +0000356 MachineLocation Location) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000357 if (DV.variableHasComplexAddress())
Devang Patel161b2f42011-04-12 23:21:44 +0000358 addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
Eric Christopherf61dbc12013-06-24 21:07:27 +0000359 else if (DV.isBlockByrefVariable())
Devang Patel161b2f42011-04-12 23:21:44 +0000360 addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location);
361 else
David Blaikie4532c282013-06-20 00:25:24 +0000362 addAddress(Die, dwarf::DW_AT_location, Location,
Eric Christopherf61dbc12013-06-24 21:07:27 +0000363 DV.getVariable().isIndirect());
Devang Patel161b2f42011-04-12 23:21:44 +0000364}
365
Devang Patel116da2f2011-04-26 19:06:18 +0000366/// addRegisterOp - Add register operand.
367void CompileUnit::addRegisterOp(DIE *TheDie, unsigned Reg) {
368 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
369 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
370 if (DWReg < 32)
371 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + DWReg);
372 else {
373 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
374 addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
375 }
376}
377
378/// addRegisterOffset - Add register offset.
379void CompileUnit::addRegisterOffset(DIE *TheDie, unsigned Reg,
380 int64_t Offset) {
381 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
382 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
383 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
384 if (Reg == TRI->getFrameRegister(*Asm->MF))
385 // If variable offset is based in frame register then use fbreg.
386 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
387 else if (DWReg < 32)
388 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DWReg);
389 else {
390 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
391 addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
392 }
393 addSInt(TheDie, 0, dwarf::DW_FORM_sdata, Offset);
394}
395
396/// addAddress - Add an address attribute to a die based on the location
397/// provided.
Eric Christopher31667622013-08-08 01:41:00 +0000398void CompileUnit::addAddress(DIE *Die, uint16_t Attribute,
David Blaikie4532c282013-06-20 00:25:24 +0000399 const MachineLocation &Location, bool Indirect) {
Devang Patel116da2f2011-04-26 19:06:18 +0000400 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
401
David Blaikie4532c282013-06-20 00:25:24 +0000402 if (Location.isReg() && !Indirect)
Devang Patel116da2f2011-04-26 19:06:18 +0000403 addRegisterOp(Block, Location.getReg());
David Blaikie4532c282013-06-20 00:25:24 +0000404 else {
Devang Patel116da2f2011-04-26 19:06:18 +0000405 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
David Blaikie4532c282013-06-20 00:25:24 +0000406 if (Indirect && !Location.isReg()) {
407 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
408 }
409 }
Devang Patel116da2f2011-04-26 19:06:18 +0000410
411 // Now attach the location information to the DIE.
412 addBlock(Die, Attribute, 0, Block);
413}
414
Devang Patel161b2f42011-04-12 23:21:44 +0000415/// addComplexAddress - Start with the address based on the location provided,
416/// and generate the DWARF information necessary to find the actual variable
417/// given the extra address information encoded in the DIVariable, starting from
418/// the starting location. Add the DWARF information to the die.
419///
Eric Christopherf61dbc12013-06-24 21:07:27 +0000420void CompileUnit::addComplexAddress(const DbgVariable &DV, DIE *Die,
Eric Christopher31667622013-08-08 01:41:00 +0000421 uint16_t Attribute,
Devang Patel161b2f42011-04-12 23:21:44 +0000422 const MachineLocation &Location) {
Devang Patel161b2f42011-04-12 23:21:44 +0000423 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Eric Christopherf61dbc12013-06-24 21:07:27 +0000424 unsigned N = DV.getNumAddrElements();
Devang Patelc26f5442011-04-28 02:22:40 +0000425 unsigned i = 0;
426 if (Location.isReg()) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000427 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
Devang Patelc26f5442011-04-28 02:22:40 +0000428 // If first address element is OpPlus then emit
429 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
Eric Christopherf61dbc12013-06-24 21:07:27 +0000430 addRegisterOffset(Block, Location.getReg(), DV.getAddrElement(1));
Devang Patelc26f5442011-04-28 02:22:40 +0000431 i = 2;
432 } else
433 addRegisterOp(Block, Location.getReg());
434 }
Devang Patel116da2f2011-04-26 19:06:18 +0000435 else
436 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel161b2f42011-04-12 23:21:44 +0000437
Devang Patelc26f5442011-04-28 02:22:40 +0000438 for (;i < N; ++i) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000439 uint64_t Element = DV.getAddrElement(i);
Devang Patel161b2f42011-04-12 23:21:44 +0000440 if (Element == DIBuilder::OpPlus) {
441 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
Eric Christopherf61dbc12013-06-24 21:07:27 +0000442 addUInt(Block, 0, dwarf::DW_FORM_udata, DV.getAddrElement(++i));
Devang Patel161b2f42011-04-12 23:21:44 +0000443 } else if (Element == DIBuilder::OpDeref) {
Eric Christopher50120762012-05-08 18:56:00 +0000444 if (!Location.isReg())
445 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Devang Patel161b2f42011-04-12 23:21:44 +0000446 } else llvm_unreachable("unknown DIBuilder Opcode");
447 }
448
449 // Now attach the location information to the DIE.
450 addBlock(Die, Attribute, 0, Block);
451}
452
453/* Byref variables, in Blocks, are declared by the programmer as "SomeType
454 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
455 gives the variable VarName either the struct, or a pointer to the struct, as
456 its type. This is necessary for various behind-the-scenes things the
457 compiler needs to do with by-reference variables in Blocks.
458
459 However, as far as the original *programmer* is concerned, the variable
460 should still have type 'SomeType', as originally declared.
461
462 The function getBlockByrefType dives into the __Block_byref_x_VarName
463 struct to find the original type of the variable, which is then assigned to
464 the variable's Debug Information Entry as its real type. So far, so good.
465 However now the debugger will expect the variable VarName to have the type
466 SomeType. So we need the location attribute for the variable to be an
467 expression that explains to the debugger how to navigate through the
468 pointers and struct to find the actual variable of type SomeType.
469
470 The following function does just that. We start by getting
471 the "normal" location for the variable. This will be the location
472 of either the struct __Block_byref_x_VarName or the pointer to the
473 struct __Block_byref_x_VarName.
474
475 The struct will look something like:
476
477 struct __Block_byref_x_VarName {
478 ... <various fields>
479 struct __Block_byref_x_VarName *forwarding;
480 ... <various other fields>
481 SomeType VarName;
482 ... <maybe more fields>
483 };
484
485 If we are given the struct directly (as our starting point) we
486 need to tell the debugger to:
487
488 1). Add the offset of the forwarding field.
489
490 2). Follow that pointer to get the real __Block_byref_x_VarName
491 struct to use (the real one may have been copied onto the heap).
492
493 3). Add the offset for the field VarName, to find the actual variable.
494
495 If we started with a pointer to the struct, then we need to
496 dereference that pointer first, before the other steps.
497 Translating this into DWARF ops, we will need to append the following
498 to the current location description for the variable:
499
500 DW_OP_deref -- optional, if we start with a pointer
501 DW_OP_plus_uconst <forward_fld_offset>
502 DW_OP_deref
503 DW_OP_plus_uconst <varName_fld_offset>
504
505 That is what this function does. */
506
507/// addBlockByrefAddress - Start with the address based on the location
508/// provided, and generate the DWARF information necessary to find the
509/// actual Block variable (navigating the Block struct) based on the
510/// starting location. Add the DWARF information to the die. For
511/// more information, read large comment just above here.
512///
Eric Christopherf61dbc12013-06-24 21:07:27 +0000513void CompileUnit::addBlockByrefAddress(const DbgVariable &DV, DIE *Die,
Eric Christopher31667622013-08-08 01:41:00 +0000514 uint16_t Attribute,
Devang Patel161b2f42011-04-12 23:21:44 +0000515 const MachineLocation &Location) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000516 DIType Ty = DV.getType();
Devang Patel161b2f42011-04-12 23:21:44 +0000517 DIType TmpTy = Ty;
Eric Christopher31667622013-08-08 01:41:00 +0000518 uint16_t Tag = Ty.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +0000519 bool isPointer = false;
520
Eric Christopherf61dbc12013-06-24 21:07:27 +0000521 StringRef varName = DV.getName();
Devang Patel161b2f42011-04-12 23:21:44 +0000522
523 if (Tag == dwarf::DW_TAG_pointer_type) {
524 DIDerivedType DTy = DIDerivedType(Ty);
Eric Christopher3f045002013-10-04 17:08:38 +0000525 TmpTy = DTy.getTypeDerivedFrom();
Devang Patel161b2f42011-04-12 23:21:44 +0000526 isPointer = true;
527 }
528
529 DICompositeType blockStruct = DICompositeType(TmpTy);
530
531 // Find the __forwarding field and the variable field in the __Block_byref
532 // struct.
533 DIArray Fields = blockStruct.getTypeArray();
534 DIDescriptor varField = DIDescriptor();
535 DIDescriptor forwardingField = DIDescriptor();
536
537 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
538 DIDescriptor Element = Fields.getElement(i);
539 DIDerivedType DT = DIDerivedType(Element);
540 StringRef fieldName = DT.getName();
541 if (fieldName == "__forwarding")
542 forwardingField = Element;
543 else if (fieldName == varName)
544 varField = Element;
545 }
546
547 // Get the offsets for the forwarding field and the variable field.
548 unsigned forwardingFieldOffset =
549 DIDerivedType(forwardingField).getOffsetInBits() >> 3;
550 unsigned varFieldOffset =
551 DIDerivedType(varField).getOffsetInBits() >> 3;
552
553 // Decode the original location, and use that as the start of the byref
554 // variable's location.
Devang Patel161b2f42011-04-12 23:21:44 +0000555 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
556
Eric Christophercaba2632012-07-04 02:02:18 +0000557 if (Location.isReg())
558 addRegisterOp(Block, Location.getReg());
559 else
560 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel161b2f42011-04-12 23:21:44 +0000561
562 // If we started with a pointer to the __Block_byref... struct, then
563 // the first thing we need to do is dereference the pointer (DW_OP_deref).
564 if (isPointer)
565 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
566
567 // Next add the offset for the '__forwarding' field:
568 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
569 // adding the offset if it's 0.
570 if (forwardingFieldOffset > 0) {
571 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
572 addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
573 }
574
575 // Now dereference the __forwarding field to get to the real __Block_byref
576 // struct: DW_OP_deref.
577 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
578
579 // Now that we've got the real __Block_byref... struct, add the offset
580 // for the variable's field to get to the location of the actual variable:
581 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
582 if (varFieldOffset > 0) {
583 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
584 addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
585 }
586
587 // Now attach the location information to the DIE.
588 addBlock(Die, Attribute, 0, Block);
589}
590
Devang Patel4ec14b02011-07-20 21:57:04 +0000591/// isTypeSigned - Return true if the type is signed.
Eric Christopher3f045002013-10-04 17:08:38 +0000592static bool isTypeSigned(DIType Ty, int *SizeInBits) {
Devang Patel4ec14b02011-07-20 21:57:04 +0000593 if (Ty.isDerivedType())
Eric Christopher3f045002013-10-04 17:08:38 +0000594 return isTypeSigned(DIDerivedType(Ty).getTypeDerivedFrom(), SizeInBits);
Devang Patel4ec14b02011-07-20 21:57:04 +0000595 if (Ty.isBasicType())
596 if (DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed
597 || DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed_char) {
598 *SizeInBits = Ty.getSizeInBits();
599 return true;
600 }
601 return false;
602}
603
Devang Patel161b2f42011-04-12 23:21:44 +0000604/// addConstantValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000605void CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO,
Devang Patelb58128e2011-05-27 16:45:18 +0000606 DIType Ty) {
David Blaikie4de9d722013-05-10 21:52:07 +0000607 // FIXME: This is a bit conservative/simple - it emits negative values at
608 // their maximum bit width which is a bit unfortunate (& doesn't prefer
609 // udata/sdata over dataN as suggested by the DWARF spec)
Nick Lewycky746cb672011-10-26 22:55:33 +0000610 assert(MO.isImm() && "Invalid machine operand!");
Devang Patel4ec14b02011-07-20 21:57:04 +0000611 int SizeInBits = -1;
Eric Christopher3f045002013-10-04 17:08:38 +0000612 bool SignedConstant = isTypeSigned(Ty, &SizeInBits);
Eric Christopher7b2ee392013-08-27 23:49:04 +0000613 uint16_t Form;
Devang Patel72f0d9c2011-05-27 18:15:52 +0000614
Eric Christopher7b2ee392013-08-27 23:49:04 +0000615 // If we're a signed constant definitely use sdata.
616 if (SignedConstant) {
617 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, MO.getImm());
618 return;
619 }
620
621 // Else use data for now unless it's larger than we can deal with.
622 switch (SizeInBits) {
623 case 8:
624 Form = dwarf::DW_FORM_data1;
625 break;
626 case 16:
627 Form = dwarf::DW_FORM_data2;
628 break;
629 case 32:
630 Form = dwarf::DW_FORM_data4;
631 break;
632 case 64:
633 Form = dwarf::DW_FORM_data8;
634 break;
635 default:
636 Form = dwarf::DW_FORM_udata;
637 addUInt(Die, dwarf::DW_AT_const_value, Form, MO.getImm());
638 return;
639 }
640 addUInt(Die, dwarf::DW_AT_const_value, Form, MO.getImm());
Devang Patel161b2f42011-04-12 23:21:44 +0000641}
642
643/// addConstantFPValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000644void CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
Nick Lewycky390c40d2011-10-27 06:44:11 +0000645 assert (MO.isFPImm() && "Invalid machine operand!");
Devang Patel161b2f42011-04-12 23:21:44 +0000646 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
647 APFloat FPImm = MO.getFPImm()->getValueAPF();
648
649 // Get the raw data form of the floating point.
650 const APInt FltVal = FPImm.bitcastToAPInt();
651 const char *FltPtr = (const char*)FltVal.getRawData();
652
653 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
Micah Villmow3574eca2012-10-08 16:38:25 +0000654 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel161b2f42011-04-12 23:21:44 +0000655 int Incr = (LittleEndian ? 1 : -1);
656 int Start = (LittleEndian ? 0 : NumBytes - 1);
657 int Stop = (LittleEndian ? NumBytes : -1);
658
659 // Output the constant to DWARF one byte at a time.
660 for (; Start != Stop; Start += Incr)
661 addUInt(Block, 0, dwarf::DW_FORM_data1,
662 (unsigned char)0xFF & FltPtr[Start]);
663
664 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
Devang Patel161b2f42011-04-12 23:21:44 +0000665}
666
David Blaikie14268412013-01-20 01:18:01 +0000667/// addConstantFPValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000668void CompileUnit::addConstantFPValue(DIE *Die, const ConstantFP *CFP) {
Eric Christopher7b2ee392013-08-27 23:49:04 +0000669 // Pass this down to addConstantValue as an unsigned bag of bits.
670 addConstantValue(Die, CFP->getValueAPF().bitcastToAPInt(), true);
David Blaikie14268412013-01-20 01:18:01 +0000671}
672
Devang Patel161b2f42011-04-12 23:21:44 +0000673/// addConstantValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000674void CompileUnit::addConstantValue(DIE *Die, const ConstantInt *CI,
Devang Patel161b2f42011-04-12 23:21:44 +0000675 bool Unsigned) {
Eric Christophere4721492013-07-03 01:08:30 +0000676 addConstantValue(Die, CI->getValue(), Unsigned);
David Blaikie14268412013-01-20 01:18:01 +0000677}
678
679// addConstantValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000680void CompileUnit::addConstantValue(DIE *Die, const APInt &Val, bool Unsigned) {
David Blaikie14268412013-01-20 01:18:01 +0000681 unsigned CIBitWidth = Val.getBitWidth();
Devang Pateld6a81362011-05-28 00:39:18 +0000682 if (CIBitWidth <= 64) {
Eric Christopher7b2ee392013-08-27 23:49:04 +0000683 // If we're a signed constant definitely use sdata.
684 if (!Unsigned) {
685 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata,
686 Val.getSExtValue());
687 return;
Devang Pateld6a81362011-05-28 00:39:18 +0000688 }
Eric Christopher7b2ee392013-08-27 23:49:04 +0000689
690 // Else use data for now unless it's larger than we can deal with.
691 uint16_t Form;
692 switch (CIBitWidth) {
693 case 8:
694 Form = dwarf::DW_FORM_data1;
695 break;
696 case 16:
697 Form = dwarf::DW_FORM_data2;
698 break;
699 case 32:
700 Form = dwarf::DW_FORM_data4;
701 break;
702 case 64:
703 Form = dwarf::DW_FORM_data8;
704 break;
705 default:
706 addUInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
707 Val.getZExtValue());
708 return;
709 }
710 addUInt(Die, dwarf::DW_AT_const_value, Form, Val.getZExtValue());
Eric Christophere4721492013-07-03 01:08:30 +0000711 return;
Devang Patel161b2f42011-04-12 23:21:44 +0000712 }
713
714 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
715
716 // Get the raw data form of the large APInt.
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000717 const uint64_t *Ptr64 = Val.getRawData();
Devang Patel161b2f42011-04-12 23:21:44 +0000718
719 int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
Micah Villmow3574eca2012-10-08 16:38:25 +0000720 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel161b2f42011-04-12 23:21:44 +0000721
722 // Output the constant to DWARF one byte at a time.
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000723 for (int i = 0; i < NumBytes; i++) {
724 uint8_t c;
725 if (LittleEndian)
726 c = Ptr64[i / 8] >> (8 * (i & 7));
727 else
728 c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7));
729 addUInt(Block, 0, dwarf::DW_FORM_data1, c);
730 }
Devang Patel161b2f42011-04-12 23:21:44 +0000731
732 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
Devang Patel161b2f42011-04-12 23:21:44 +0000733}
734
Eric Christopher6c3bb942013-04-22 07:47:40 +0000735/// addTemplateParams - Add template parameters into buffer.
Devang Patel161b2f42011-04-12 23:21:44 +0000736void CompileUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
737 // Add template parameters.
738 for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) {
739 DIDescriptor Element = TParams.getElement(i);
740 if (Element.isTemplateTypeParameter())
741 Buffer.addChild(getOrCreateTemplateTypeParameterDIE(
742 DITemplateTypeParameter(Element)));
743 else if (Element.isTemplateValueParameter())
744 Buffer.addChild(getOrCreateTemplateValueParameterDIE(
745 DITemplateValueParameter(Element)));
746 }
Devang Patel161b2f42011-04-12 23:21:44 +0000747}
Nick Lewycky746cb672011-10-26 22:55:33 +0000748
Eric Christopher6b6061f2013-01-16 01:22:23 +0000749/// getOrCreateContextDIE - Get context owner's DIE.
750DIE *CompileUnit::getOrCreateContextDIE(DIDescriptor Context) {
751 if (Context.isType())
752 return getOrCreateTypeDIE(DIType(Context));
753 else if (Context.isNameSpace())
754 return getOrCreateNameSpace(DINameSpace(Context));
755 else if (Context.isSubprogram())
756 return getOrCreateSubprogramDIE(DISubprogram(Context));
Eric Christopher6c3bb942013-04-22 07:47:40 +0000757 else
Eric Christopher6b6061f2013-01-16 01:22:23 +0000758 return getDIE(Context);
759}
760
Devang Patel161b2f42011-04-12 23:21:44 +0000761/// addToContextOwner - Add Die into the list of its context owner's children.
762void CompileUnit::addToContextOwner(DIE *Die, DIDescriptor Context) {
David Blaikiee5830c42013-10-03 20:07:20 +0000763 assert(!Die->getParent());
764 if (DIE *ContextDIE = getOrCreateContextDIE(Context)) {
765 if (Die->getParent()) {
766 // While creating the context, if this is a type member, we will have
767 // added the child to the context already.
768 assert(Die->getParent() == ContextDIE);
769 return;
770 }
Devang Patel161b2f42011-04-12 23:21:44 +0000771 ContextDIE->addChild(Die);
David Blaikiee5830c42013-10-03 20:07:20 +0000772 } else
Devang Patel161b2f42011-04-12 23:21:44 +0000773 addDie(Die);
774}
775
776/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
777/// given DIType.
Devang Patel94c7ddb2011-08-16 22:09:43 +0000778DIE *CompileUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
779 DIType Ty(TyNode);
Manman Rend03d2b22013-07-08 18:33:29 +0000780 if (!Ty.isType())
Devang Patel94c7ddb2011-08-16 22:09:43 +0000781 return NULL;
Eric Christopher3f045002013-10-04 17:08:38 +0000782 DIE *TyDIE = getDIE(Ty);
Devang Patel161b2f42011-04-12 23:21:44 +0000783 if (TyDIE)
784 return TyDIE;
785
786 // Create new type.
787 TyDIE = new DIE(dwarf::DW_TAG_base_type);
Eric Christopher3f045002013-10-04 17:08:38 +0000788 insertDIE(Ty, TyDIE);
Devang Patel161b2f42011-04-12 23:21:44 +0000789 if (Ty.isBasicType())
790 constructTypeDIE(*TyDIE, DIBasicType(Ty));
791 else if (Ty.isCompositeType())
792 constructTypeDIE(*TyDIE, DICompositeType(Ty));
793 else {
794 assert(Ty.isDerivedType() && "Unknown kind of DIType");
795 constructTypeDIE(*TyDIE, DIDerivedType(Ty));
796 }
Eric Christopher1b3f9192011-11-10 19:52:58 +0000797 // If this is a named finished type then include it in the list of types
798 // for the accelerator tables.
Eric Christopherc36145f2012-01-06 04:35:23 +0000799 if (!Ty.getName().empty() && !Ty.isForwardDecl()) {
800 bool IsImplementation = 0;
801 if (Ty.isCompositeType()) {
802 DICompositeType CT(Ty);
Eric Christophere0167892012-01-06 23:03:37 +0000803 // A runtime language of 0 actually means C/C++ and that any
804 // non-negative value is some version of Objective-C/C++.
Eric Christopherc36145f2012-01-06 04:35:23 +0000805 IsImplementation = (CT.getRunTimeLang() == 0) ||
Eric Christophere2dc9332012-02-22 08:46:02 +0000806 CT.isObjcClassComplete();
Eric Christopherc36145f2012-01-06 04:35:23 +0000807 }
Eric Christopher577056f2013-09-05 18:20:16 +0000808 unsigned Flags = IsImplementation ? dwarf::DW_FLAG_type_implementation : 0;
Eric Christophere0167892012-01-06 23:03:37 +0000809 addAccelType(Ty.getName(), std::make_pair(TyDIE, Flags));
Eric Christopherc36145f2012-01-06 04:35:23 +0000810 }
Eric Christopher8b4310b2012-11-21 00:34:38 +0000811
Manman Ren2c9905a2013-09-09 19:47:11 +0000812 addToContextOwner(TyDIE, DD->resolve(Ty.getContext()));
Devang Patel161b2f42011-04-12 23:21:44 +0000813 return TyDIE;
814}
815
816/// addType - Add a new type attribute to the specified entity.
Eric Christopher31667622013-08-08 01:41:00 +0000817void CompileUnit::addType(DIE *Entity, DIType Ty, uint16_t Attribute) {
Eric Christopherdc1363f2013-08-08 07:40:37 +0000818 assert(Ty && "Trying to add a type that doesn't exist?");
Devang Patel161b2f42011-04-12 23:21:44 +0000819
820 // Check for pre-existence.
821 DIEEntry *Entry = getDIEEntry(Ty);
822 // If it exists then use the existing value.
823 if (Entry) {
Eric Christopher3f045002013-10-04 17:08:38 +0000824 Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
Devang Patel161b2f42011-04-12 23:21:44 +0000825 return;
826 }
827
828 // Construct type.
829 DIE *Buffer = getOrCreateTypeDIE(Ty);
830
831 // Set up proxy.
832 Entry = createDIEEntry(Buffer);
833 insertDIEEntry(Ty, Entry);
Eric Christopher3f045002013-10-04 17:08:38 +0000834 Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
Devang Patele9ae06c2011-05-31 22:56:51 +0000835
836 // If this is a complete composite type then include it in the
837 // list of global types.
Devang Patelc20bdf12011-06-01 00:23:24 +0000838 addGlobalType(Ty);
Devang Patel66658e42011-05-31 23:30:30 +0000839}
840
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000841// Accelerator table mutators - add each name along with its companion
842// DIE to the proper table while ensuring that the name that we're going
843// to reference is in the string table. We do this since the names we
844// add may not only be identical to the names in the DIE.
845void CompileUnit::addAccelName(StringRef Name, DIE *Die) {
846 DU->getStringPoolEntry(Name);
Eric Christopher734334e2013-09-23 22:59:11 +0000847 std::vector<DIE *> &DIEs = AccelNames[Name];
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000848 DIEs.push_back(Die);
849}
850
851void CompileUnit::addAccelObjC(StringRef Name, DIE *Die) {
852 DU->getStringPoolEntry(Name);
Eric Christopher734334e2013-09-23 22:59:11 +0000853 std::vector<DIE *> &DIEs = AccelObjC[Name];
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000854 DIEs.push_back(Die);
855}
856
857void CompileUnit::addAccelNamespace(StringRef Name, DIE *Die) {
858 DU->getStringPoolEntry(Name);
Eric Christopher734334e2013-09-23 22:59:11 +0000859 std::vector<DIE *> &DIEs = AccelNamespace[Name];
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000860 DIEs.push_back(Die);
861}
862
863void CompileUnit::addAccelType(StringRef Name, std::pair<DIE *, unsigned> Die) {
864 DU->getStringPoolEntry(Name);
865 std::vector<std::pair<DIE *, unsigned> > &DIEs = AccelTypes[Name];
866 DIEs.push_back(Die);
867}
868
Eric Christopher50d37a42013-09-20 22:20:55 +0000869/// addGlobalName - Add a new global name to the compile unit.
870void CompileUnit::addGlobalName(StringRef Name, DIE *Die) {
871 GlobalNames[Name] = Die;
872}
873
Devang Patel66658e42011-05-31 23:30:30 +0000874/// addGlobalType - Add a new global type to the compile unit.
875///
Devang Patelc20bdf12011-06-01 00:23:24 +0000876void CompileUnit::addGlobalType(DIType Ty) {
Manman Ren2c9905a2013-09-09 19:47:11 +0000877 DIDescriptor Context = DD->resolve(Ty.getContext());
Eric Christopher5a634742013-09-23 23:15:58 +0000878 if (!Ty.getName().empty() && !Ty.isForwardDecl() &&
Eric Christopher734334e2013-09-23 22:59:11 +0000879 (!Context || Context.isCompileUnit() || Context.isFile() ||
880 Context.isNameSpace()))
Devang Patelc20bdf12011-06-01 00:23:24 +0000881 if (DIEEntry *Entry = getDIEEntry(Ty))
882 GlobalTypes[Ty.getName()] = Entry->getEntry();
Devang Patel161b2f42011-04-12 23:21:44 +0000883}
884
Devang Patel31c5d052011-05-06 16:57:54 +0000885/// addPubTypes - Add type for pubtypes section.
886void CompileUnit::addPubTypes(DISubprogram SP) {
887 DICompositeType SPTy = SP.getType();
Eric Christopher31667622013-08-08 01:41:00 +0000888 uint16_t SPTag = SPTy.getTag();
Devang Patel31c5d052011-05-06 16:57:54 +0000889 if (SPTag != dwarf::DW_TAG_subroutine_type)
890 return;
891
892 DIArray Args = SPTy.getTypeArray();
893 for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
894 DIType ATy(Args.getElement(i));
Manman Rend03d2b22013-07-08 18:33:29 +0000895 if (!ATy.isType())
Devang Patel31c5d052011-05-06 16:57:54 +0000896 continue;
Devang Patelc20bdf12011-06-01 00:23:24 +0000897 addGlobalType(ATy);
Devang Patel31c5d052011-05-06 16:57:54 +0000898 }
899}
900
Devang Patel161b2f42011-04-12 23:21:44 +0000901/// constructTypeDIE - Construct basic type die from DIBasicType.
902void CompileUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
903 // Get core information.
904 StringRef Name = BTy.getName();
Devang Patel161b2f42011-04-12 23:21:44 +0000905 // Add name if not anonymous or intermediate type.
906 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000907 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel734a67c2011-09-14 23:13:28 +0000908
909 if (BTy.getTag() == dwarf::DW_TAG_unspecified_type) {
910 Buffer.setTag(dwarf::DW_TAG_unspecified_type);
Eric Christopher61c91d52013-07-09 23:48:45 +0000911 // An unspecified type only has a name attribute.
Devang Patel734a67c2011-09-14 23:13:28 +0000912 return;
913 }
914
915 Buffer.setTag(dwarf::DW_TAG_base_type);
Nick Lewycky746cb672011-10-26 22:55:33 +0000916 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
Devang Patel30d409c2012-02-07 23:33:58 +0000917 BTy.getEncoding());
Devang Patel734a67c2011-09-14 23:13:28 +0000918
Devang Patel161b2f42011-04-12 23:21:44 +0000919 uint64_t Size = BTy.getSizeInBits() >> 3;
920 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
921}
922
923/// constructTypeDIE - Construct derived type die from DIDerivedType.
924void CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
925 // Get core information.
926 StringRef Name = DTy.getName();
927 uint64_t Size = DTy.getSizeInBits() >> 3;
Eric Christopher31667622013-08-08 01:41:00 +0000928 uint16_t Tag = DTy.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +0000929
930 // FIXME - Workaround for templates.
931 if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
932
933 Buffer.setTag(Tag);
934
935 // Map to main type, void will not have a type.
Eric Christopher3f045002013-10-04 17:08:38 +0000936 DIType FromTy = DTy.getTypeDerivedFrom();
Eric Christopherdc1363f2013-08-08 07:40:37 +0000937 if (FromTy)
938 addType(&Buffer, FromTy);
Devang Patel161b2f42011-04-12 23:21:44 +0000939
940 // Add name if not anonymous or intermediate type.
941 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000942 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +0000943
944 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopher35f225a2012-02-21 22:25:53 +0000945 if (Size && Tag != dwarf::DW_TAG_pointer_type)
Devang Patel161b2f42011-04-12 23:21:44 +0000946 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
947
David Blaikie62fdfb52013-01-07 05:51:15 +0000948 if (Tag == dwarf::DW_TAG_ptr_to_member_type)
949 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
Manman Renbc660712013-09-05 18:48:31 +0000950 getOrCreateTypeDIE(DD->resolve(DTy.getClassType())));
Devang Patel161b2f42011-04-12 23:21:44 +0000951 // Add source line info if available and TyDesc is not a forward declaration.
952 if (!DTy.isForwardDecl())
953 addSourceLine(&Buffer, DTy);
954}
955
Eric Christopher3dee5752013-07-26 17:02:41 +0000956/// Return true if the type is appropriately scoped to be contained inside
957/// its own type unit.
Manman Ren18eb2452013-09-09 19:23:58 +0000958static bool isTypeUnitScoped(DIType Ty, const DwarfDebug *DD) {
Manman Ren2c9905a2013-09-09 19:47:11 +0000959 DIScope Parent = DD->resolve(Ty.getContext());
Eric Christopher3dee5752013-07-26 17:02:41 +0000960 while (Parent) {
961 // Don't generate a hash for anything scoped inside a function.
962 if (Parent.isSubprogram())
963 return false;
Manman Rene72aba92013-09-09 22:35:23 +0000964 Parent = DD->resolve(Parent.getContext());
Eric Christopher3dee5752013-07-26 17:02:41 +0000965 }
966 return true;
967}
968
969/// Return true if the type should be split out into a type unit.
Manman Ren18eb2452013-09-09 19:23:58 +0000970static bool shouldCreateTypeUnit(DICompositeType CTy, const DwarfDebug *DD) {
Eric Christopher31667622013-08-08 01:41:00 +0000971 uint16_t Tag = CTy.getTag();
Eric Christopher3dee5752013-07-26 17:02:41 +0000972
973 switch (Tag) {
974 case dwarf::DW_TAG_structure_type:
975 case dwarf::DW_TAG_union_type:
976 case dwarf::DW_TAG_enumeration_type:
977 case dwarf::DW_TAG_class_type:
978 // If this is a class, structure, union, or enumeration type
979 // that is not a declaration, is a type definition, and not scoped
980 // inside a function then separate this out as a type unit.
Manman Ren18eb2452013-09-09 19:23:58 +0000981 if (CTy.isForwardDecl() || !isTypeUnitScoped(CTy, DD))
Eric Christopher3dee5752013-07-26 17:02:41 +0000982 return 0;
983 return 1;
984 default:
985 return 0;
986 }
987}
988
Devang Patel161b2f42011-04-12 23:21:44 +0000989/// constructTypeDIE - Construct type DIE from DICompositeType.
990void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
991 // Get core information.
992 StringRef Name = CTy.getName();
993
994 uint64_t Size = CTy.getSizeInBits() >> 3;
Eric Christopher31667622013-08-08 01:41:00 +0000995 uint16_t Tag = CTy.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +0000996 Buffer.setTag(Tag);
997
998 switch (Tag) {
Devang Patel161b2f42011-04-12 23:21:44 +0000999 case dwarf::DW_TAG_array_type:
1000 constructArrayTypeDIE(Buffer, &CTy);
1001 break;
1002 case dwarf::DW_TAG_enumeration_type: {
1003 DIArray Elements = CTy.getTypeArray();
1004
1005 // Add enumerators to enumeration type.
1006 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1007 DIE *ElemDie = NULL;
1008 DIDescriptor Enum(Elements.getElement(i));
1009 if (Enum.isEnumerator()) {
1010 ElemDie = constructEnumTypeDIE(DIEnumerator(Enum));
1011 Buffer.addChild(ElemDie);
1012 }
1013 }
Eric Christopher3f045002013-10-04 17:08:38 +00001014 DIType DTy = CTy.getTypeDerivedFrom();
Eric Christopher37c107b2013-08-08 07:40:42 +00001015 if (DTy) {
Eric Christopherbb0f6ea2012-05-23 00:09:20 +00001016 addType(&Buffer, DTy);
Eric Christopher371d9582013-10-04 22:40:10 +00001017 addFlag(&Buffer, dwarf::DW_AT_enum_class);
Eric Christopherbb0f6ea2012-05-23 00:09:20 +00001018 }
Devang Patel161b2f42011-04-12 23:21:44 +00001019 }
1020 break;
1021 case dwarf::DW_TAG_subroutine_type: {
Eric Christopherdc1363f2013-08-08 07:40:37 +00001022 // Add return type. A void return won't have a type.
Devang Patel161b2f42011-04-12 23:21:44 +00001023 DIArray Elements = CTy.getTypeArray();
1024 DIDescriptor RTy = Elements.getElement(0);
Eric Christopherdc1363f2013-08-08 07:40:37 +00001025 if (RTy)
1026 addType(&Buffer, DIType(RTy));
Devang Patel161b2f42011-04-12 23:21:44 +00001027
1028 bool isPrototyped = true;
1029 // Add arguments.
1030 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
1031 DIDescriptor Ty = Elements.getElement(i);
1032 if (Ty.isUnspecifiedParameter()) {
1033 DIE *Arg = new DIE(dwarf::DW_TAG_unspecified_parameters);
1034 Buffer.addChild(Arg);
1035 isPrototyped = false;
1036 } else {
1037 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1038 addType(Arg, DIType(Ty));
David Blaikieaaf2e632013-01-29 19:35:24 +00001039 if (DIType(Ty).isArtificial())
1040 addFlag(Arg, dwarf::DW_AT_artificial);
Devang Patel161b2f42011-04-12 23:21:44 +00001041 Buffer.addChild(Arg);
1042 }
1043 }
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001044 // Add prototype flag if we're dealing with a C language and the
1045 // function has been prototyped.
Eric Christopher7b878952013-08-26 23:50:38 +00001046 uint16_t Language = DICompileUnit(Node).getLanguage();
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001047 if (isPrototyped &&
Eric Christopher4d069bf2012-05-22 18:45:24 +00001048 (Language == dwarf::DW_LANG_C89 ||
1049 Language == dwarf::DW_LANG_C99 ||
1050 Language == dwarf::DW_LANG_ObjC))
Eric Christopher873cf0a2012-08-24 01:14:27 +00001051 addFlag(&Buffer, dwarf::DW_AT_prototyped);
Devang Patel161b2f42011-04-12 23:21:44 +00001052 }
1053 break;
1054 case dwarf::DW_TAG_structure_type:
1055 case dwarf::DW_TAG_union_type:
1056 case dwarf::DW_TAG_class_type: {
Devang Patel161b2f42011-04-12 23:21:44 +00001057 // Add elements to structure type.
David Blaikiec8b93552013-08-01 20:30:22 +00001058 DIArray Elements = CTy.getTypeArray();
1059 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
Devang Patel161b2f42011-04-12 23:21:44 +00001060 DIDescriptor Element = Elements.getElement(i);
1061 DIE *ElemDie = NULL;
1062 if (Element.isSubprogram()) {
1063 DISubprogram SP(Element);
Devang Pateldbc64af2011-08-15 17:24:54 +00001064 ElemDie = getOrCreateSubprogramDIE(DISubprogram(Element));
Devang Patel161b2f42011-04-12 23:21:44 +00001065 if (SP.isProtected())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001066 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001067 dwarf::DW_ACCESS_protected);
1068 else if (SP.isPrivate())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001069 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001070 dwarf::DW_ACCESS_private);
Eric Christopher8b4310b2012-11-21 00:34:38 +00001071 else
Nick Lewycky13aaca52011-12-13 05:09:11 +00001072 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001073 dwarf::DW_ACCESS_public);
1074 if (SP.isExplicit())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001075 addFlag(ElemDie, dwarf::DW_AT_explicit);
Eric Christopher663e0cf2012-03-28 07:34:31 +00001076 } else if (Element.isDerivedType()) {
Eric Christopher4d069bf2012-05-22 18:45:24 +00001077 DIDerivedType DDTy(Element);
1078 if (DDTy.getTag() == dwarf::DW_TAG_friend) {
1079 ElemDie = new DIE(dwarf::DW_TAG_friend);
Eric Christopher3f045002013-10-04 17:08:38 +00001080 addType(ElemDie, DDTy.getTypeDerivedFrom(), dwarf::DW_AT_friend);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001081 } else if (DDTy.isStaticMember())
1082 ElemDie = createStaticMemberDIE(DDTy);
1083 else
1084 ElemDie = createMemberDIE(DDTy);
David Blaikiee5830c42013-10-03 20:07:20 +00001085 Buffer.addChild(ElemDie);
Eric Christopher663e0cf2012-03-28 07:34:31 +00001086 } else if (Element.isObjCProperty()) {
Devang Patel30d409c2012-02-07 23:33:58 +00001087 DIObjCProperty Property(Element);
1088 ElemDie = new DIE(Property.getTag());
1089 StringRef PropertyName = Property.getObjCPropertyName();
1090 addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
Eric Christopher4d069bf2012-05-22 18:45:24 +00001091 addType(ElemDie, Property.getType());
1092 addSourceLine(ElemDie, Property);
Devang Patel30d409c2012-02-07 23:33:58 +00001093 StringRef GetterName = Property.getObjCPropertyGetterName();
1094 if (!GetterName.empty())
1095 addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
1096 StringRef SetterName = Property.getObjCPropertySetterName();
1097 if (!SetterName.empty())
1098 addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
1099 unsigned PropertyAttributes = 0;
Devang Patel9e11eb12012-02-04 01:30:32 +00001100 if (Property.isReadOnlyObjCProperty())
1101 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
1102 if (Property.isReadWriteObjCProperty())
1103 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
1104 if (Property.isAssignObjCProperty())
1105 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
1106 if (Property.isRetainObjCProperty())
1107 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
1108 if (Property.isCopyObjCProperty())
1109 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
1110 if (Property.isNonAtomicObjCProperty())
1111 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
1112 if (PropertyAttributes)
Eric Christopher8b4310b2012-11-21 00:34:38 +00001113 addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, 0,
Devang Patel9e11eb12012-02-04 01:30:32 +00001114 PropertyAttributes);
Devang Patel6588abf2012-02-06 17:49:43 +00001115
Devang Patel30d409c2012-02-07 23:33:58 +00001116 DIEEntry *Entry = getDIEEntry(Element);
1117 if (!Entry) {
1118 Entry = createDIEEntry(ElemDie);
1119 insertDIEEntry(Element, Entry);
1120 }
David Blaikiee5830c42013-10-03 20:07:20 +00001121 Buffer.addChild(ElemDie);
Devang Patel9e11eb12012-02-04 01:30:32 +00001122 } else
Devang Patel161b2f42011-04-12 23:21:44 +00001123 continue;
Devang Patel161b2f42011-04-12 23:21:44 +00001124 }
1125
1126 if (CTy.isAppleBlockExtension())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001127 addFlag(&Buffer, dwarf::DW_AT_APPLE_block);
Devang Patel161b2f42011-04-12 23:21:44 +00001128
Manman Rene42279c2013-09-06 18:46:00 +00001129 DICompositeType ContainingType(DD->resolve(CTy.getContainingType()));
Devang Patel161b2f42011-04-12 23:21:44 +00001130 if (DIDescriptor(ContainingType).isCompositeType())
1131 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
1132 getOrCreateTypeDIE(DIType(ContainingType)));
Devang Patel161b2f42011-04-12 23:21:44 +00001133
Devang Patel201e6cd2011-05-12 21:29:42 +00001134 if (CTy.isObjcClassComplete())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001135 addFlag(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type);
Devang Patelb11f80e2011-05-12 19:06:16 +00001136
Eric Christopher1a8e8862011-12-16 23:42:42 +00001137 // Add template parameters to a class, structure or union types.
1138 // FIXME: The support isn't in the metadata for this yet.
1139 if (Tag == dwarf::DW_TAG_class_type ||
1140 Tag == dwarf::DW_TAG_structure_type ||
1141 Tag == dwarf::DW_TAG_union_type)
Devang Patel161b2f42011-04-12 23:21:44 +00001142 addTemplateParams(Buffer, CTy.getTemplateParams());
1143
1144 break;
1145 }
1146 default:
1147 break;
1148 }
1149
1150 // Add name if not anonymous or intermediate type.
1151 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001152 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001153
Eric Christopher4a5d8392012-05-22 18:45:18 +00001154 if (Tag == dwarf::DW_TAG_enumeration_type ||
1155 Tag == dwarf::DW_TAG_class_type ||
1156 Tag == dwarf::DW_TAG_structure_type ||
1157 Tag == dwarf::DW_TAG_union_type) {
Devang Patel161b2f42011-04-12 23:21:44 +00001158 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopherfc4199b2012-06-01 00:22:32 +00001159 // TODO: Do we care about size for enum forward declarations?
Devang Patel161b2f42011-04-12 23:21:44 +00001160 if (Size)
1161 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
Eric Christopherfc4199b2012-06-01 00:22:32 +00001162 else if (!CTy.isForwardDecl())
Devang Patel161b2f42011-04-12 23:21:44 +00001163 // Add zero size if it is not a forward declaration.
Eric Christopherfc4199b2012-06-01 00:22:32 +00001164 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
1165
1166 // If we're a forward decl, say so.
1167 if (CTy.isForwardDecl())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001168 addFlag(&Buffer, dwarf::DW_AT_declaration);
Devang Patel161b2f42011-04-12 23:21:44 +00001169
1170 // Add source line info if available.
1171 if (!CTy.isForwardDecl())
1172 addSourceLine(&Buffer, CTy);
Eric Christopher89388952012-03-07 00:15:19 +00001173
1174 // No harm in adding the runtime language to the declaration.
1175 unsigned RLang = CTy.getRunTimeLang();
1176 if (RLang)
1177 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
1178 dwarf::DW_FORM_data1, RLang);
Devang Patel161b2f42011-04-12 23:21:44 +00001179 }
Eric Christopher3dee5752013-07-26 17:02:41 +00001180 // If this is a type applicable to a type unit it then add it to the
1181 // list of types we'll compute a hash for later.
Manman Ren18eb2452013-09-09 19:23:58 +00001182 if (shouldCreateTypeUnit(CTy, DD))
Eric Christopher3dee5752013-07-26 17:02:41 +00001183 DD->addTypeUnitType(&Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +00001184}
1185
Eric Christopher8b4310b2012-11-21 00:34:38 +00001186/// getOrCreateTemplateTypeParameterDIE - Find existing DIE or create new DIE
Devang Patel161b2f42011-04-12 23:21:44 +00001187/// for the given DITemplateTypeParameter.
1188DIE *
1189CompileUnit::getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP) {
1190 DIE *ParamDIE = getDIE(TP);
1191 if (ParamDIE)
1192 return ParamDIE;
1193
1194 ParamDIE = new DIE(dwarf::DW_TAG_template_type_parameter);
Eric Christopher76ef79f2013-08-08 08:09:43 +00001195 // Add the type if it exists, it could be void and therefore no type.
1196 if (TP.getType())
1197 addType(ParamDIE, TP.getType());
David Blaikiee88939c2013-06-22 18:59:11 +00001198 if (!TP.getName().empty())
1199 addString(ParamDIE, dwarf::DW_AT_name, TP.getName());
Devang Patel161b2f42011-04-12 23:21:44 +00001200 return ParamDIE;
1201}
1202
Eric Christopher8b4310b2012-11-21 00:34:38 +00001203/// getOrCreateTemplateValueParameterDIE - Find existing DIE or create new DIE
Devang Patel161b2f42011-04-12 23:21:44 +00001204/// for the given DITemplateValueParameter.
1205DIE *
Eric Christopherafdd1f82013-08-08 07:40:31 +00001206CompileUnit::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter VP) {
1207 DIE *ParamDIE = getDIE(VP);
Devang Patel161b2f42011-04-12 23:21:44 +00001208 if (ParamDIE)
1209 return ParamDIE;
1210
Eric Christopherafdd1f82013-08-08 07:40:31 +00001211 ParamDIE = new DIE(VP.getTag());
Eric Christopherdc1363f2013-08-08 07:40:37 +00001212
1213 // Add the type if there is one, template template and template parameter
1214 // packs will not have a type.
1215 if (VP.getType())
1216 addType(ParamDIE, VP.getType());
Eric Christopherafdd1f82013-08-08 07:40:31 +00001217 if (!VP.getName().empty())
1218 addString(ParamDIE, dwarf::DW_AT_name, VP.getName());
1219 if (Value *Val = VP.getValue()) {
David Blaikie4de9d722013-05-10 21:52:07 +00001220 if (ConstantInt *CI = dyn_cast<ConstantInt>(Val))
Eric Christopher3f045002013-10-04 17:08:38 +00001221 addConstantValue(ParamDIE, CI, VP.getType().isUnsignedDIType());
David Blaikie4de9d722013-05-10 21:52:07 +00001222 else if (GlobalValue *GV = dyn_cast<GlobalValue>(Val)) {
1223 // For declaration non-type template parameters (such as global values and
1224 // functions)
1225 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1226 addOpAddress(Block, Asm->Mang->getSymbol(GV));
1227 // Emit DW_OP_stack_value to use the address as the immediate value of the
1228 // parameter, rather than a pointer to it.
1229 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value);
1230 addBlock(ParamDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopherafdd1f82013-08-08 07:40:31 +00001231 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_template_param) {
David Blaikiee88939c2013-06-22 18:59:11 +00001232 assert(isa<MDString>(Val));
1233 addString(ParamDIE, dwarf::DW_AT_GNU_template_name,
1234 cast<MDString>(Val)->getString());
Eric Christopherafdd1f82013-08-08 07:40:31 +00001235 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_parameter_pack) {
David Blaikiee88939c2013-06-22 18:59:11 +00001236 assert(isa<MDNode>(Val));
1237 DIArray A(cast<MDNode>(Val));
1238 addTemplateParams(*ParamDIE, A);
David Blaikie4de9d722013-05-10 21:52:07 +00001239 }
1240 }
1241
Devang Patel161b2f42011-04-12 23:21:44 +00001242 return ParamDIE;
1243}
1244
Devang Patel31c5d052011-05-06 16:57:54 +00001245/// getOrCreateNameSpace - Create a DIE for DINameSpace.
1246DIE *CompileUnit::getOrCreateNameSpace(DINameSpace NS) {
1247 DIE *NDie = getDIE(NS);
1248 if (NDie)
1249 return NDie;
1250 NDie = new DIE(dwarf::DW_TAG_namespace);
1251 insertDIE(NS, NDie);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001252 if (!NS.getName().empty()) {
Nick Lewycky390c40d2011-10-27 06:44:11 +00001253 addString(NDie, dwarf::DW_AT_name, NS.getName());
Eric Christopher09ac3d82011-11-07 09:24:32 +00001254 addAccelNamespace(NS.getName(), NDie);
Eric Christopher3d2c90f2013-09-24 00:17:57 +00001255 addGlobalName(NS.getName(), NDie);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001256 } else
1257 addAccelNamespace("(anonymous namespace)", NDie);
Devang Patel31c5d052011-05-06 16:57:54 +00001258 addSourceLine(NDie, NS);
1259 addToContextOwner(NDie, NS.getContext());
1260 return NDie;
1261}
1262
Devang Pateldbc64af2011-08-15 17:24:54 +00001263/// getOrCreateSubprogramDIE - Create new DIE using SP.
1264DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
David Blaikiec32f2332013-10-04 01:39:59 +00001265 // Construct the context before querying for the existence of the DIE in case
1266 // such construction creates the DIE (as is the case for member function
1267 // declarations).
1268 DIE *ContextDIE = getOrCreateContextDIE(SP.getContext());
1269 if (!ContextDIE)
1270 ContextDIE = CUDie.get();
1271
Eric Christopher3f045002013-10-04 17:08:38 +00001272 DIE *SPDie = getDIE(SP);
Devang Pateldbc64af2011-08-15 17:24:54 +00001273 if (SPDie)
1274 return SPDie;
1275
Peter Collingbourne27302f02012-05-27 18:36:44 +00001276 SPDie = new DIE(dwarf::DW_TAG_subprogram);
1277
1278 // DW_TAG_inlined_subroutine may refer to this DIE.
Eric Christopher3f045002013-10-04 17:08:38 +00001279 insertDIE(SP, SPDie);
Peter Collingbourne27302f02012-05-27 18:36:44 +00001280
Rafael Espindola01b55b42011-11-10 22:34:29 +00001281 DISubprogram SPDecl = SP.getFunctionDeclaration();
1282 DIE *DeclDie = NULL;
1283 if (SPDecl.isSubprogram()) {
1284 DeclDie = getOrCreateSubprogramDIE(SPDecl);
1285 }
1286
Devang Pateldbc64af2011-08-15 17:24:54 +00001287 // Add to context owner.
David Blaikiec32f2332013-10-04 01:39:59 +00001288 ContextDIE->addChild(SPDie);
Devang Pateldbc64af2011-08-15 17:24:54 +00001289
1290 // Add function template parameters.
1291 addTemplateParams(*SPDie, SP.getTemplateParams());
1292
Devang Pateldbc64af2011-08-15 17:24:54 +00001293 // If this DIE is going to refer declaration info using AT_specification
Eric Christopherc4968752013-05-09 00:42:33 +00001294 // then there is no need to add other attributes.
Rafael Espindola01b55b42011-11-10 22:34:29 +00001295 if (DeclDie) {
1296 // Refer function declaration directly.
1297 addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
1298 DeclDie);
1299
Devang Pateldbc64af2011-08-15 17:24:54 +00001300 return SPDie;
Rafael Espindola01b55b42011-11-10 22:34:29 +00001301 }
Devang Pateldbc64af2011-08-15 17:24:54 +00001302
Eric Christophercbbd5b12012-08-23 22:52:55 +00001303 // Add the linkage name if we have one.
Michael Gottesmandc42d032013-09-04 04:39:38 +00001304 StringRef LinkageName = SP.getLinkageName();
1305 if (!LinkageName.empty())
Eric Christophercbbd5b12012-08-23 22:52:55 +00001306 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c2b4be2013-06-01 17:51:14 +00001307 GlobalValue::getRealLinkageName(LinkageName));
Eric Christophercbbd5b12012-08-23 22:52:55 +00001308
Devang Pateldbc64af2011-08-15 17:24:54 +00001309 // Constructors and operators for anonymous aggregates do not have names.
1310 if (!SP.getName().empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001311 addString(SPDie, dwarf::DW_AT_name, SP.getName());
Devang Pateldbc64af2011-08-15 17:24:54 +00001312
1313 addSourceLine(SPDie, SP);
1314
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001315 // Add the prototype if we have a prototype and we have a C like
1316 // language.
Eric Christopher7b878952013-08-26 23:50:38 +00001317 uint16_t Language = DICompileUnit(Node).getLanguage();
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001318 if (SP.isPrototyped() &&
1319 (Language == dwarf::DW_LANG_C89 ||
1320 Language == dwarf::DW_LANG_C99 ||
1321 Language == dwarf::DW_LANG_ObjC))
Eric Christopher873cf0a2012-08-24 01:14:27 +00001322 addFlag(SPDie, dwarf::DW_AT_prototyped);
Devang Pateldbc64af2011-08-15 17:24:54 +00001323
Eric Christopherdc1363f2013-08-08 07:40:37 +00001324 // Add Return Type. A void return type will not have a type.
Devang Pateldbc64af2011-08-15 17:24:54 +00001325 DICompositeType SPTy = SP.getType();
David Blaikie3d331842013-05-22 23:22:18 +00001326 assert(SPTy.getTag() == dwarf::DW_TAG_subroutine_type &&
1327 "the type of a subprogram should be a subroutine");
Devang Pateldbc64af2011-08-15 17:24:54 +00001328
David Blaikie3d331842013-05-22 23:22:18 +00001329 DIArray Args = SPTy.getTypeArray();
Eric Christopherdc1363f2013-08-08 07:40:37 +00001330 if (Args.getElement(0))
1331 addType(SPDie, DIType(Args.getElement(0)));
Devang Pateldbc64af2011-08-15 17:24:54 +00001332
1333 unsigned VK = SP.getVirtuality();
1334 if (VK) {
Nick Lewycky798313d2011-12-14 00:56:07 +00001335 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
Devang Pateldbc64af2011-08-15 17:24:54 +00001336 DIEBlock *Block = getDIEBlock();
1337 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1338 addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex());
1339 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
1340 ContainingTypeMap.insert(std::make_pair(SPDie,
Manman Ren0e85f6e2013-09-07 00:04:05 +00001341 DD->resolve(SP.getContainingType())));
Devang Pateldbc64af2011-08-15 17:24:54 +00001342 }
1343
1344 if (!SP.isDefinition()) {
Eric Christopher873cf0a2012-08-24 01:14:27 +00001345 addFlag(SPDie, dwarf::DW_AT_declaration);
Eric Christopher8b4310b2012-11-21 00:34:38 +00001346
Devang Pateldbc64af2011-08-15 17:24:54 +00001347 // Add arguments. Do not add arguments for subprogram definition. They will
1348 // be handled while processing variables.
David Blaikie3d331842013-05-22 23:22:18 +00001349 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1350 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1351 DIType ATy = DIType(Args.getElement(i));
1352 addType(Arg, ATy);
1353 if (ATy.isArtificial())
1354 addFlag(Arg, dwarf::DW_AT_artificial);
1355 SPDie->addChild(Arg);
1356 }
Devang Pateldbc64af2011-08-15 17:24:54 +00001357 }
1358
1359 if (SP.isArtificial())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001360 addFlag(SPDie, dwarf::DW_AT_artificial);
Devang Pateldbc64af2011-08-15 17:24:54 +00001361
1362 if (!SP.isLocalToUnit())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001363 addFlag(SPDie, dwarf::DW_AT_external);
Devang Pateldbc64af2011-08-15 17:24:54 +00001364
1365 if (SP.isOptimized())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001366 addFlag(SPDie, dwarf::DW_AT_APPLE_optimized);
Devang Pateldbc64af2011-08-15 17:24:54 +00001367
1368 if (unsigned isa = Asm->getISAEncoding()) {
1369 addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1370 }
1371
1372 return SPDie;
1373}
1374
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001375// Return const expression if value is a GEP to access merged global
1376// constant. e.g.
1377// i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
1378static const ConstantExpr *getMergedGlobalExpr(const Value *V) {
1379 const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
1380 if (!CE || CE->getNumOperands() != 3 ||
1381 CE->getOpcode() != Instruction::GetElementPtr)
1382 return NULL;
1383
1384 // First operand points to a global struct.
1385 Value *Ptr = CE->getOperand(0);
1386 if (!isa<GlobalValue>(Ptr) ||
1387 !isa<StructType>(cast<PointerType>(Ptr->getType())->getElementType()))
1388 return NULL;
1389
1390 // Second operand is zero.
1391 const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
1392 if (!CI || !CI->isZero())
1393 return NULL;
1394
1395 // Third operand is offset.
1396 if (!isa<ConstantInt>(CE->getOperand(2)))
1397 return NULL;
1398
1399 return CE;
1400}
1401
1402/// createGlobalVariableDIE - create global variable DIE.
1403void CompileUnit::createGlobalVariableDIE(const MDNode *N) {
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001404 // Check for pre-existence.
Devang Patel49e2f032011-08-18 22:21:50 +00001405 if (getDIE(N))
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001406 return;
1407
Devang Patel49e2f032011-08-18 22:21:50 +00001408 DIGlobalVariable GV(N);
Manman Rend03d2b22013-07-08 18:33:29 +00001409 if (!GV.isGlobalVariable())
Devang Patel28bea082011-08-18 23:17:55 +00001410 return;
1411
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001412 DIDescriptor GVContext = GV.getContext();
Eric Christopher6b6061f2013-01-16 01:22:23 +00001413 DIType GTy = GV.getType();
1414
1415 // If this is a static data member definition, some attributes belong
1416 // to the declaration DIE.
1417 DIE *VariableDIE = NULL;
Manman Ren945e8282013-02-01 23:54:37 +00001418 bool IsStaticMember = false;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001419 DIDerivedType SDMDecl = GV.getStaticDataMemberDeclaration();
1420 if (SDMDecl.Verify()) {
1421 assert(SDMDecl.isStaticMember() && "Expected static member decl");
1422 // We need the declaration DIE that is in the static member's class.
1423 // But that class might not exist in the DWARF yet.
1424 // Creating the class will create the static member decl DIE.
Manman Ren2c9905a2013-09-09 19:47:11 +00001425 getOrCreateContextDIE(DD->resolve(SDMDecl.getContext()));
Eric Christopher3f045002013-10-04 17:08:38 +00001426 VariableDIE = getDIE(SDMDecl);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001427 assert(VariableDIE && "Static member decl has no context?");
Manman Ren945e8282013-02-01 23:54:37 +00001428 IsStaticMember = true;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001429 }
1430
1431 // If this is not a static data member definition, create the variable
1432 // DIE and add the initial set of attributes to it.
1433 if (!VariableDIE) {
1434 VariableDIE = new DIE(GV.getTag());
1435 // Add to map.
1436 insertDIE(N, VariableDIE);
1437
1438 // Add name and type.
1439 addString(VariableDIE, dwarf::DW_AT_name, GV.getDisplayName());
1440 addType(VariableDIE, GTy);
1441
1442 // Add scoping info.
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00001443 if (!GV.isLocalToUnit()) {
Eric Christopher6b6061f2013-01-16 01:22:23 +00001444 addFlag(VariableDIE, dwarf::DW_AT_external);
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00001445 addGlobalName(GV.getName(), VariableDIE);
1446 }
Eric Christopher6b6061f2013-01-16 01:22:23 +00001447
1448 // Add line number info.
1449 addSourceLine(VariableDIE, GV);
1450 // Add to context owner.
1451 addToContextOwner(VariableDIE, GVContext);
1452 }
1453
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001454 // Add location.
Eric Christopher09ac3d82011-11-07 09:24:32 +00001455 bool addToAccelTable = false;
Eric Christopherd61c34b2011-11-11 03:16:32 +00001456 DIE *VariableSpecDIE = NULL;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001457 bool isGlobalVariable = GV.getGlobal() != NULL;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001458 if (isGlobalVariable) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001459 addToAccelTable = true;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001460 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
David Blaikie59eaa382013-06-28 20:05:11 +00001461 const MCSymbol *Sym = Asm->Mang->getSymbol(GV.getGlobal());
1462 if (GV.getGlobal()->isThreadLocal()) {
1463 // FIXME: Make this work with -gsplit-dwarf.
1464 unsigned PointerSize = Asm->getDataLayout().getPointerSize();
1465 assert((PointerSize == 4 || PointerSize == 8) &&
1466 "Add support for other sizes if necessary");
Ulrich Weigand716a94f2013-07-02 18:47:09 +00001467 const MCExpr *Expr =
David Blaikie8fed05e2013-07-01 23:55:52 +00001468 Asm->getObjFileLowering().getDebugThreadLocalSymbol(Sym);
David Blaikie59eaa382013-06-28 20:05:11 +00001469 // Based on GCC's support for TLS:
David Blaikie8fed05e2013-07-01 23:55:52 +00001470 if (!DD->useSplitDwarf()) {
1471 // 1) Start with a constNu of the appropriate pointer size
1472 addUInt(Block, 0, dwarf::DW_FORM_data1,
1473 PointerSize == 4 ? dwarf::DW_OP_const4u : dwarf::DW_OP_const8u);
1474 // 2) containing the (relocated) address of the TLS variable
Ulrich Weigand716a94f2013-07-02 18:47:09 +00001475 addExpr(Block, 0, dwarf::DW_FORM_udata, Expr);
David Blaikie8fed05e2013-07-01 23:55:52 +00001476 } else {
1477 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_const_index);
Ulrich Weigand716a94f2013-07-02 18:47:09 +00001478 addUInt(Block, 0, dwarf::DW_FORM_udata, DU->getAddrPoolIndex(Expr));
David Blaikie8fed05e2013-07-01 23:55:52 +00001479 }
David Blaikie59eaa382013-06-28 20:05:11 +00001480 // 3) followed by a custom OP to tell the debugger about TLS (presumably)
1481 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_lo_user);
1482 } else
1483 addOpAddress(Block, Sym);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001484 // Do not create specification DIE if context is either compile unit
1485 // or a subprogram.
Devang Patel1dd4e562011-09-21 23:41:11 +00001486 if (GVContext && GV.isDefinition() && !GVContext.isCompileUnit() &&
Manman Ren02d29672013-09-09 19:05:21 +00001487 !GVContext.isFile() && !DD->isSubprogramContext(GVContext)) {
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001488 // Create specification DIE.
Eric Christopherd117fbb2011-11-11 01:55:22 +00001489 VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001490 addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
1491 dwarf::DW_FORM_ref4, VariableDIE);
1492 addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001493 // A static member's declaration is already flagged as such.
1494 if (!SDMDecl.Verify())
1495 addFlag(VariableDIE, dwarf::DW_AT_declaration);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001496 addDie(VariableSpecDIE);
1497 } else {
1498 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001499 }
Michael Gottesmandc42d032013-09-04 04:39:38 +00001500 // Add the linkage name.
Eric Christopher6b6061f2013-01-16 01:22:23 +00001501 StringRef LinkageName = GV.getLinkageName();
Michael Gottesmandc42d032013-09-04 04:39:38 +00001502 if (!LinkageName.empty())
Eric Christopher8d45a982013-02-27 23:49:47 +00001503 // From DWARF4: DIEs to which DW_AT_linkage_name may apply include:
1504 // TAG_common_block, TAG_constant, TAG_entry_point, TAG_subprogram and
1505 // TAG_variable.
Manman Ren21a08a12013-02-27 23:21:02 +00001506 addString(IsStaticMember && VariableSpecDIE ?
1507 VariableSpecDIE : VariableDIE, dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c2b4be2013-06-01 17:51:14 +00001508 GlobalValue::getRealLinkageName(LinkageName));
Eric Christopher8b4310b2012-11-21 00:34:38 +00001509 } else if (const ConstantInt *CI =
Manman Ren945e8282013-02-01 23:54:37 +00001510 dyn_cast_or_null<ConstantInt>(GV.getConstant())) {
Adrian Prantl2e892e42013-04-04 22:56:49 +00001511 // AT_const_value was added when the static member was created. To avoid
Manman Ren945e8282013-02-01 23:54:37 +00001512 // emitting AT_const_value multiple times, we only add AT_const_value when
1513 // it is not a static member.
1514 if (!IsStaticMember)
Eric Christopher3f045002013-10-04 17:08:38 +00001515 addConstantValue(VariableDIE, CI, GTy.isUnsignedDIType());
Manman Ren945e8282013-02-01 23:54:37 +00001516 } else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001517 addToAccelTable = true;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001518 // GV is a merged global.
1519 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1520 Value *Ptr = CE->getOperand(0);
Eric Christopher0969ddf2013-01-18 22:11:33 +00001521 addOpAddress(Block, Asm->Mang->getSymbol(cast<GlobalValue>(Ptr)));
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001522 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1523 SmallVector<Value*, 3> Idx(CE->op_begin()+1, CE->op_end());
Eric Christopher8b4310b2012-11-21 00:34:38 +00001524 addUInt(Block, 0, dwarf::DW_FORM_udata,
Micah Villmow3574eca2012-10-08 16:38:25 +00001525 Asm->getDataLayout().getIndexedOffset(Ptr->getType(), Idx));
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001526 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1527 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
1528 }
1529
Eric Christopherd117fbb2011-11-11 01:55:22 +00001530 if (addToAccelTable) {
1531 DIE *AddrDIE = VariableSpecDIE ? VariableSpecDIE : VariableDIE;
1532 addAccelName(GV.getName(), AddrDIE);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001533
Eric Christopherd117fbb2011-11-11 01:55:22 +00001534 // If the linkage name is different than the name, go ahead and output
1535 // that as well into the name table.
1536 if (GV.getLinkageName() != "" && GV.getName() != GV.getLinkageName())
1537 addAccelName(GV.getLinkageName(), AddrDIE);
1538 }
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001539}
1540
Devang Patel161b2f42011-04-12 23:21:44 +00001541/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
Eric Christopher4d069bf2012-05-22 18:45:24 +00001542void CompileUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR,
1543 DIE *IndexTy) {
Devang Patel161b2f42011-04-12 23:21:44 +00001544 DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
1545 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
Devang Patel161b2f42011-04-12 23:21:44 +00001546
Bill Wendling222c2fd2012-12-06 07:38:10 +00001547 // The LowerBound value defines the lower bounds which is typically zero for
1548 // C/C++. The Count value is the number of elements. Values are 64 bit. If
1549 // Count == -1 then the array is unbounded and we do not emit
1550 // DW_AT_lower_bound and DW_AT_upper_bound attributes. If LowerBound == 0 and
1551 // Count == 0, then the array has zero elements in which case we do not emit
1552 // an upper bound.
1553 int64_t LowerBound = SR.getLo();
Bill Wendling6afe4782012-12-06 07:55:19 +00001554 int64_t DefaultLowerBound = getDefaultLowerBound();
Bill Wendling9493dae2012-12-04 21:34:03 +00001555 int64_t Count = SR.getCount();
Devang Patel161b2f42011-04-12 23:21:44 +00001556
Bill Wendling6afe4782012-12-06 07:55:19 +00001557 if (DefaultLowerBound == -1 || LowerBound != DefaultLowerBound)
Bill Wendling222c2fd2012-12-06 07:38:10 +00001558 addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, LowerBound);
1559
1560 if (Count != -1 && Count != 0)
Bill Wendling9493dae2012-12-04 21:34:03 +00001561 // FIXME: An unbounded array should reference the expression that defines
1562 // the array.
Bill Wendling222c2fd2012-12-06 07:38:10 +00001563 addUInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, LowerBound + Count - 1);
Bill Wendling9493dae2012-12-04 21:34:03 +00001564
Devang Patel161b2f42011-04-12 23:21:44 +00001565 Buffer.addChild(DW_Subrange);
1566}
1567
1568/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
1569void CompileUnit::constructArrayTypeDIE(DIE &Buffer,
1570 DICompositeType *CTy) {
1571 Buffer.setTag(dwarf::DW_TAG_array_type);
Eric Christopher9a1e0e22013-01-08 01:53:52 +00001572 if (CTy->isVector())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001573 addFlag(&Buffer, dwarf::DW_AT_GNU_vector);
Devang Patel161b2f42011-04-12 23:21:44 +00001574
Eric Christopherdc1363f2013-08-08 07:40:37 +00001575 // Emit the element type.
Eric Christopher3f045002013-10-04 17:08:38 +00001576 addType(&Buffer, CTy->getTypeDerivedFrom());
Devang Patel161b2f42011-04-12 23:21:44 +00001577
1578 // Get an anonymous type for index type.
Eric Christopher8cab6ed2013-01-04 21:51:53 +00001579 // FIXME: This type should be passed down from the front end
1580 // as different languages may have different sizes for indexes.
Devang Patel161b2f42011-04-12 23:21:44 +00001581 DIE *IdxTy = getIndexTyDie();
1582 if (!IdxTy) {
1583 // Construct an anonymous type for index type.
1584 IdxTy = new DIE(dwarf::DW_TAG_base_type);
Eric Christopher8cab6ed2013-01-04 21:51:53 +00001585 addString(IdxTy, dwarf::DW_AT_name, "int");
Devang Patel161b2f42011-04-12 23:21:44 +00001586 addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1587 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1588 dwarf::DW_ATE_signed);
1589 addDie(IdxTy);
1590 setIndexTyDie(IdxTy);
1591 }
1592
1593 // Add subranges to array type.
Eric Christopherdc1363f2013-08-08 07:40:37 +00001594 DIArray Elements = CTy->getTypeArray();
Devang Patel161b2f42011-04-12 23:21:44 +00001595 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1596 DIDescriptor Element = Elements.getElement(i);
1597 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1598 constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1599 }
1600}
1601
1602/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
1603DIE *CompileUnit::constructEnumTypeDIE(DIEnumerator ETy) {
1604 DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
1605 StringRef Name = ETy.getName();
Nick Lewycky390c40d2011-10-27 06:44:11 +00001606 addString(Enumerator, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001607 int64_t Value = ETy.getEnumValue();
1608 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
1609 return Enumerator;
1610}
1611
Devang Pateldbc64af2011-08-15 17:24:54 +00001612/// constructContainingTypeDIEs - Construct DIEs for types that contain
1613/// vtables.
1614void CompileUnit::constructContainingTypeDIEs() {
1615 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
1616 CE = ContainingTypeMap.end(); CI != CE; ++CI) {
1617 DIE *SPDie = CI->first;
1618 const MDNode *N = CI->second;
1619 if (!N) continue;
Eric Christopher3f045002013-10-04 17:08:38 +00001620 DIE *NDie = getDIE(N);
Devang Pateldbc64af2011-08-15 17:24:54 +00001621 if (!NDie) continue;
1622 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
1623 }
1624}
1625
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001626/// constructVariableDIE - Construct a DIE for the given DbgVariable.
Eric Christopherf61dbc12013-06-24 21:07:27 +00001627DIE *CompileUnit::constructVariableDIE(DbgVariable *DV,
1628 bool isScopeAbstract) {
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001629 StringRef Name = DV->getName();
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001630
1631 // Translate tag to proper Dwarf tag.
Eric Christopher31667622013-08-08 01:41:00 +00001632 uint16_t Tag = DV->getTag();
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001633
1634 // Define variable debug information entry.
1635 DIE *VariableDie = new DIE(Tag);
1636 DbgVariable *AbsVar = DV->getAbstractVariable();
1637 DIE *AbsDIE = AbsVar ? AbsVar->getDIE() : NULL;
Manman Ren742671b2013-05-29 17:16:59 +00001638 if (AbsDIE)
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001639 addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
Manman Ren742671b2013-05-29 17:16:59 +00001640 dwarf::DW_FORM_ref4, AbsDIE);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001641 else {
David Blaikie2883fd42013-08-19 03:34:03 +00001642 if (!Name.empty())
1643 addString(VariableDie, dwarf::DW_AT_name, Name);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001644 addSourceLine(VariableDie, DV->getVariable());
1645 addType(VariableDie, DV->getType());
1646 }
1647
1648 if (DV->isArtificial())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001649 addFlag(VariableDie, dwarf::DW_AT_artificial);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001650
1651 if (isScopeAbstract) {
1652 DV->setDIE(VariableDie);
1653 return VariableDie;
1654 }
1655
1656 // Add variable address.
1657
1658 unsigned Offset = DV->getDotDebugLocOffset();
1659 if (Offset != ~0U) {
Eric Christopherafbe0e22013-06-24 21:34:55 +00001660 addLabel(VariableDie, dwarf::DW_AT_location, dwarf::DW_FORM_data4,
1661 Asm->GetTempSymbol("debug_loc", Offset));
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001662 DV->setDIE(VariableDie);
1663 return VariableDie;
1664 }
1665
Eric Christopher8cf5e742011-10-03 15:49:20 +00001666 // Check if variable is described by a DBG_VALUE instruction.
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001667 if (const MachineInstr *DVInsn = DV->getMInsn()) {
David Blaikie6d9dbd52013-06-16 20:34:15 +00001668 assert(DVInsn->getNumOperands() == 3);
1669 if (DVInsn->getOperand(0).isReg()) {
1670 const MachineOperand RegOp = DVInsn->getOperand(0);
Adrian Prantlb2754912013-07-09 21:44:06 +00001671 // If the second operand is an immediate, this is an indirect value.
Adrian Prantl35176402013-07-09 20:28:37 +00001672 if (DVInsn->getOperand(1).isImm()) {
1673 MachineLocation Location(RegOp.getReg(), DVInsn->getOperand(1).getImm());
Eric Christopherf61dbc12013-06-24 21:07:27 +00001674 addVariableAddress(*DV, VariableDie, Location);
David Blaikie6d9dbd52013-06-16 20:34:15 +00001675 } else if (RegOp.getReg())
Eric Christopherf61dbc12013-06-24 21:07:27 +00001676 addVariableAddress(*DV, VariableDie, MachineLocation(RegOp.getReg()));
David Blaikie6d9dbd52013-06-16 20:34:15 +00001677 } else if (DVInsn->getOperand(0).isImm())
Eric Christophere4721492013-07-03 01:08:30 +00001678 addConstantValue(VariableDie, DVInsn->getOperand(0), DV->getType());
David Blaikie6d9dbd52013-06-16 20:34:15 +00001679 else if (DVInsn->getOperand(0).isFPImm())
Eric Christophere4721492013-07-03 01:08:30 +00001680 addConstantFPValue(VariableDie, DVInsn->getOperand(0));
David Blaikie6d9dbd52013-06-16 20:34:15 +00001681 else if (DVInsn->getOperand(0).isCImm())
Eric Christophere4721492013-07-03 01:08:30 +00001682 addConstantValue(VariableDie, DVInsn->getOperand(0).getCImm(),
Eric Christopher3f045002013-10-04 17:08:38 +00001683 DV->getType().isUnsignedDIType());
Eric Christophere4721492013-07-03 01:08:30 +00001684
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001685 DV->setDIE(VariableDie);
1686 return VariableDie;
1687 } else {
1688 // .. else use frame index.
1689 int FI = DV->getFrameIndex();
1690 if (FI != ~0) {
1691 unsigned FrameReg = 0;
1692 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
Eric Christopher8b4310b2012-11-21 00:34:38 +00001693 int Offset =
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001694 TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
1695 MachineLocation Location(FrameReg, Offset);
Eric Christopherf61dbc12013-06-24 21:07:27 +00001696 addVariableAddress(*DV, VariableDie, Location);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001697 }
1698 }
1699
1700 DV->setDIE(VariableDie);
1701 return VariableDie;
1702}
1703
Devang Patel161b2f42011-04-12 23:21:44 +00001704/// createMemberDIE - Create new member DIE.
1705DIE *CompileUnit::createMemberDIE(DIDerivedType DT) {
1706 DIE *MemberDie = new DIE(DT.getTag());
1707 StringRef Name = DT.getName();
1708 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001709 addString(MemberDie, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001710
Eric Christopher3f045002013-10-04 17:08:38 +00001711 addType(MemberDie, DT.getTypeDerivedFrom());
Devang Patel161b2f42011-04-12 23:21:44 +00001712
1713 addSourceLine(MemberDie, DT);
1714
1715 DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
1716 addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1717
1718 uint64_t Size = DT.getSizeInBits();
Eric Christopher3f045002013-10-04 17:08:38 +00001719 uint64_t FieldSize = DT.getOriginalTypeSize();
Devang Patel161b2f42011-04-12 23:21:44 +00001720
1721 if (Size != FieldSize) {
1722 // Handle bitfield.
Eric Christopher3f045002013-10-04 17:08:38 +00001723 addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
Devang Patel161b2f42011-04-12 23:21:44 +00001724 addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1725
1726 uint64_t Offset = DT.getOffsetInBits();
1727 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1728 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1729 uint64_t FieldOffset = (HiMark - FieldSize);
1730 Offset -= FieldOffset;
1731
1732 // Maybe we need to work from the other end.
Micah Villmow3574eca2012-10-08 16:38:25 +00001733 if (Asm->getDataLayout().isLittleEndian())
Devang Patel161b2f42011-04-12 23:21:44 +00001734 Offset = FieldSize - (Offset + Size);
1735 addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
1736
1737 // Here WD_AT_data_member_location points to the anonymous
1738 // field that includes this bit field.
1739 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
1740
1741 } else
1742 // This is not a bitfield.
1743 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1744
1745 if (DT.getTag() == dwarf::DW_TAG_inheritance
1746 && DT.isVirtual()) {
1747
1748 // For C++, virtual base classes are not at fixed offset. Use following
1749 // expression to extract appropriate offset from vtable.
1750 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1751
1752 DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
1753 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1754 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1755 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1756 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1757 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1758 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1759 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1760
1761 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
1762 VBaseLocationDie);
1763 } else
1764 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
1765
1766 if (DT.isProtected())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001767 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001768 dwarf::DW_ACCESS_protected);
1769 else if (DT.isPrivate())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001770 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001771 dwarf::DW_ACCESS_private);
1772 // Otherwise C++ member and base classes are considered public.
Eric Christopher8b4310b2012-11-21 00:34:38 +00001773 else
Nick Lewycky13aaca52011-12-13 05:09:11 +00001774 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001775 dwarf::DW_ACCESS_public);
1776 if (DT.isVirtual())
Nick Lewycky798313d2011-12-14 00:56:07 +00001777 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001778 dwarf::DW_VIRTUALITY_virtual);
Devang Patele9db5e22011-04-16 00:11:51 +00001779
1780 // Objective-C properties.
Devang Patel6588abf2012-02-06 17:49:43 +00001781 if (MDNode *PNode = DT.getObjCProperty())
1782 if (DIEEntry *PropertyDie = getDIEEntry(PNode))
Eric Christopher8b4310b2012-11-21 00:34:38 +00001783 MemberDie->addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4,
Devang Patel6588abf2012-02-06 17:49:43 +00001784 PropertyDie);
1785
David Blaikie01bc2b32012-12-13 22:43:07 +00001786 if (DT.isArtificial())
1787 addFlag(MemberDie, dwarf::DW_AT_artificial);
1788
Devang Patel161b2f42011-04-12 23:21:44 +00001789 return MemberDie;
1790}
Eric Christopher6b6061f2013-01-16 01:22:23 +00001791
1792/// createStaticMemberDIE - Create new DIE for C++ static member.
1793DIE *CompileUnit::createStaticMemberDIE(const DIDerivedType DT) {
1794 if (!DT.Verify())
1795 return NULL;
1796
1797 DIE *StaticMemberDIE = new DIE(DT.getTag());
Eric Christopher3f045002013-10-04 17:08:38 +00001798 DIType Ty = DT.getTypeDerivedFrom();
Eric Christopher6b6061f2013-01-16 01:22:23 +00001799
1800 addString(StaticMemberDIE, dwarf::DW_AT_name, DT.getName());
1801 addType(StaticMemberDIE, Ty);
1802 addSourceLine(StaticMemberDIE, DT);
1803 addFlag(StaticMemberDIE, dwarf::DW_AT_external);
1804 addFlag(StaticMemberDIE, dwarf::DW_AT_declaration);
1805
1806 // FIXME: We could omit private if the parent is a class_type, and
1807 // public if the parent is something else.
1808 if (DT.isProtected())
1809 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1810 dwarf::DW_ACCESS_protected);
1811 else if (DT.isPrivate())
1812 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1813 dwarf::DW_ACCESS_private);
1814 else
1815 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1816 dwarf::DW_ACCESS_public);
1817
1818 if (const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(DT.getConstant()))
Eric Christopher3f045002013-10-04 17:08:38 +00001819 addConstantValue(StaticMemberDIE, CI, Ty.isUnsignedDIType());
David Blaikie14268412013-01-20 01:18:01 +00001820 if (const ConstantFP *CFP = dyn_cast_or_null<ConstantFP>(DT.getConstant()))
1821 addConstantFPValue(StaticMemberDIE, CFP);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001822
Eric Christopher3f045002013-10-04 17:08:38 +00001823 insertDIE(DT, StaticMemberDIE);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001824 return StaticMemberDIE;
1825}