blob: 4d67dd1a570bb4aa4cb73a432ef3667f29801956 [file] [log] [blame]
Devang Patel161b2f42011-04-12 23:21:44 +00001//===-- llvm/CodeGen/DwarfCompileUnit.cpp - Dwarf Compile Unit ------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
Eric Christopher443c9ed2012-08-14 05:13:29 +000010// This file contains support for constructing a dwarf compile unit.
Devang Patel161b2f42011-04-12 23:21:44 +000011//
12//===----------------------------------------------------------------------===//
13
14#define DEBUG_TYPE "dwarfdebug"
15
16#include "DwarfCompileUnit.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000017#include "DwarfAccelTable.h"
Devang Patel161b2f42011-04-12 23:21:44 +000018#include "DwarfDebug.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000019#include "llvm/ADT/APFloat.h"
Bill Wendling16eeb6f2012-06-29 08:32:07 +000020#include "llvm/DIBuilder.h"
Chandler Carruth0b8c9a82013-01-02 11:36:10 +000021#include "llvm/IR/Constants.h"
22#include "llvm/IR/DataLayout.h"
23#include "llvm/IR/GlobalVariable.h"
24#include "llvm/IR/Instructions.h"
Devang Patel6f9d8ff2011-08-15 17:57:41 +000025#include "llvm/Target/Mangler.h"
Devang Patel161b2f42011-04-12 23:21:44 +000026#include "llvm/Target/TargetFrameLowering.h"
27#include "llvm/Target/TargetMachine.h"
David Blaikie59eaa382013-06-28 20:05:11 +000028#include "llvm/Target/TargetLoweringObjectFile.h"
Devang Patel161b2f42011-04-12 23:21:44 +000029#include "llvm/Target/TargetRegisterInfo.h"
Devang Patel161b2f42011-04-12 23:21:44 +000030
31using namespace llvm;
32
33/// CompileUnit - Compile unit constructor.
Eric Christopher7b878952013-08-26 23:50:38 +000034CompileUnit::CompileUnit(unsigned UID, DIE *D, const MDNode *N, AsmPrinter *A,
35 DwarfDebug *DW, DwarfUnits *DWU)
Eric Christophere7099f62013-10-04 19:40:33 +000036 : UniqueID(UID), Node(N), CUDie(D), Asm(A), DD(DW), DU(DWU), IndexTyDie(0) {
Devang Patel161b2f42011-04-12 23:21:44 +000037 DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
Eric Christopher9c57ad22013-05-08 00:58:51 +000038 insertDIE(N, D);
Devang Patel161b2f42011-04-12 23:21:44 +000039}
40
41/// ~CompileUnit - Destructor for compile unit.
42CompileUnit::~CompileUnit() {
43 for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
44 DIEBlocks[j]->~DIEBlock();
45}
46
47/// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
48/// information entry.
49DIEEntry *CompileUnit::createDIEEntry(DIE *Entry) {
50 DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
51 return Value;
52}
53
Bill Wendling6afe4782012-12-06 07:55:19 +000054/// getDefaultLowerBound - Return the default lower bound for an array. If the
Bill Wendling222c2fd2012-12-06 07:38:10 +000055/// DWARF version doesn't handle the language, return -1.
Bill Wendling6afe4782012-12-06 07:55:19 +000056int64_t CompileUnit::getDefaultLowerBound() const {
Eric Christopher7b878952013-08-26 23:50:38 +000057 switch (DICompileUnit(Node).getLanguage()) {
Bill Wendling222c2fd2012-12-06 07:38:10 +000058 default:
59 break;
60
61 case dwarf::DW_LANG_C89:
62 case dwarf::DW_LANG_C99:
63 case dwarf::DW_LANG_C:
64 case dwarf::DW_LANG_C_plus_plus:
65 case dwarf::DW_LANG_ObjC:
66 case dwarf::DW_LANG_ObjC_plus_plus:
67 return 0;
68
69 case dwarf::DW_LANG_Fortran77:
70 case dwarf::DW_LANG_Fortran90:
71 case dwarf::DW_LANG_Fortran95:
72 return 1;
73
74 // The languages below have valid values only if the DWARF version >= 4.
75 case dwarf::DW_LANG_Java:
76 case dwarf::DW_LANG_Python:
77 case dwarf::DW_LANG_UPC:
78 case dwarf::DW_LANG_D:
79 if (dwarf::DWARF_VERSION >= 4)
80 return 0;
81 break;
82
83 case dwarf::DW_LANG_Ada83:
84 case dwarf::DW_LANG_Ada95:
85 case dwarf::DW_LANG_Cobol74:
86 case dwarf::DW_LANG_Cobol85:
87 case dwarf::DW_LANG_Modula2:
88 case dwarf::DW_LANG_Pascal83:
89 case dwarf::DW_LANG_PLI:
90 if (dwarf::DWARF_VERSION >= 4)
91 return 1;
92 break;
93 }
94
95 return -1;
96}
97
Eric Christopher873cf0a2012-08-24 01:14:27 +000098/// addFlag - Add a flag that is true.
Eric Christopher31667622013-08-08 01:41:00 +000099void CompileUnit::addFlag(DIE *Die, uint16_t Attribute) {
Michael Gottesmandc42d032013-09-04 04:39:38 +0000100 if (DD->getDwarfVersion() >= 4)
Eric Christopher9c0c9482013-10-04 22:40:05 +0000101 Die->addValue(Attribute, dwarf::DW_FORM_flag_present, DIEIntegerOne);
Eric Christopher873cf0a2012-08-24 01:14:27 +0000102 else
Eric Christopher9c0c9482013-10-04 22:40:05 +0000103 Die->addValue(Attribute, dwarf::DW_FORM_flag, DIEIntegerOne);
Eric Christopher873cf0a2012-08-24 01:14:27 +0000104}
105
Devang Patel161b2f42011-04-12 23:21:44 +0000106/// addUInt - Add an unsigned integer attribute data and value.
107///
Eric Christopher6efc0432013-10-19 01:04:47 +0000108void CompileUnit::addUInt(DIE *Die, uint16_t Attribute, uint16_t Form,
109 uint64_t Integer) {
110 if (!Form)
111 Form = DIEInteger::BestForm(false, Integer);
112 DIEValue *Value = Integer == 1 ? DIEIntegerOne : new (DIEValueAllocator)
113 DIEInteger(Integer);
Devang Patel161b2f42011-04-12 23:21:44 +0000114 Die->addValue(Attribute, Form, Value);
115}
116
117/// addSInt - Add an signed integer attribute data and value.
118///
Eric Christopher6efc0432013-10-19 01:04:47 +0000119void CompileUnit::addSInt(DIE *Die, uint16_t Attribute, uint16_t Form,
120 int64_t Integer) {
121 if (!Form)
122 Form = DIEInteger::BestForm(true, Integer);
Devang Patel161b2f42011-04-12 23:21:44 +0000123 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///
Manman Ren87b110a2013-10-11 23:58:05 +0000231void CompileUnit::addDIEEntry(DIE *Die, uint16_t Attribute, DIE *Entry) {
232 // We currently only use ref4.
233 Die->addValue(Attribute, dwarf::DW_FORM_ref4, 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 Christopher6efc0432013-10-19 01:04:47 +0000255 unsigned FileID =
256 DD->getOrCreateSourceID(V.getContext().getFilename(),
257 V.getContext().getDirectory(), 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;
Eric Christopher6efc0432013-10-19 01:04:47 +0000273 unsigned FileID =
274 DD->getOrCreateSourceID(G.getFilename(), G.getDirectory(), 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 Christopher6efc0432013-10-19 01:04:47 +0000292 unsigned FileID = DD->getOrCreateSourceID(SP.getFilename(), SP.getDirectory(),
293 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 Christopher6efc0432013-10-19 01:04:47 +0000309 unsigned FileID = DD->getOrCreateSourceID(Ty.getFilename(), Ty.getDirectory(),
310 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
Eric Christopher6efc0432013-10-19 01:04:47 +0000346 unsigned FileID =
347 DD->getOrCreateSourceID(FN, NS.getDirectory(), 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.
Eric Christopher6efc0432013-10-19 01:04:47 +0000379void CompileUnit::addRegisterOffset(DIE *TheDie, unsigned Reg, int64_t Offset) {
Devang Patel116da2f2011-04-26 19:06:18 +0000380 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
381 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
382 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
383 if (Reg == TRI->getFrameRegister(*Asm->MF))
384 // If variable offset is based in frame register then use fbreg.
385 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
386 else if (DWReg < 32)
387 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DWReg);
388 else {
389 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
390 addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
391 }
392 addSInt(TheDie, 0, dwarf::DW_FORM_sdata, Offset);
393}
394
395/// addAddress - Add an address attribute to a die based on the location
396/// provided.
Eric Christopher31667622013-08-08 01:41:00 +0000397void CompileUnit::addAddress(DIE *Die, uint16_t Attribute,
David Blaikie4532c282013-06-20 00:25:24 +0000398 const MachineLocation &Location, bool Indirect) {
Devang Patel116da2f2011-04-26 19:06:18 +0000399 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
400
David Blaikie4532c282013-06-20 00:25:24 +0000401 if (Location.isReg() && !Indirect)
Devang Patel116da2f2011-04-26 19:06:18 +0000402 addRegisterOp(Block, Location.getReg());
David Blaikie4532c282013-06-20 00:25:24 +0000403 else {
Devang Patel116da2f2011-04-26 19:06:18 +0000404 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
David Blaikie4532c282013-06-20 00:25:24 +0000405 if (Indirect && !Location.isReg()) {
406 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
407 }
408 }
Devang Patel116da2f2011-04-26 19:06:18 +0000409
410 // Now attach the location information to the DIE.
411 addBlock(Die, Attribute, 0, Block);
412}
413
Devang Patel161b2f42011-04-12 23:21:44 +0000414/// addComplexAddress - Start with the address based on the location provided,
415/// and generate the DWARF information necessary to find the actual variable
416/// given the extra address information encoded in the DIVariable, starting from
417/// the starting location. Add the DWARF information to the die.
418///
Eric Christopherf61dbc12013-06-24 21:07:27 +0000419void CompileUnit::addComplexAddress(const DbgVariable &DV, DIE *Die,
Eric Christopher31667622013-08-08 01:41:00 +0000420 uint16_t Attribute,
Devang Patel161b2f42011-04-12 23:21:44 +0000421 const MachineLocation &Location) {
Devang Patel161b2f42011-04-12 23:21:44 +0000422 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Eric Christopherf61dbc12013-06-24 21:07:27 +0000423 unsigned N = DV.getNumAddrElements();
Devang Patelc26f5442011-04-28 02:22:40 +0000424 unsigned i = 0;
425 if (Location.isReg()) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000426 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
Devang Patelc26f5442011-04-28 02:22:40 +0000427 // If first address element is OpPlus then emit
428 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
Eric Christopherf61dbc12013-06-24 21:07:27 +0000429 addRegisterOffset(Block, Location.getReg(), DV.getAddrElement(1));
Devang Patelc26f5442011-04-28 02:22:40 +0000430 i = 2;
431 } else
432 addRegisterOp(Block, Location.getReg());
Eric Christopher6efc0432013-10-19 01:04:47 +0000433 } else
Devang Patel116da2f2011-04-26 19:06:18 +0000434 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel161b2f42011-04-12 23:21:44 +0000435
Eric Christopher6efc0432013-10-19 01:04:47 +0000436 for (; i < N; ++i) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000437 uint64_t Element = DV.getAddrElement(i);
Devang Patel161b2f42011-04-12 23:21:44 +0000438 if (Element == DIBuilder::OpPlus) {
439 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
Eric Christopherf61dbc12013-06-24 21:07:27 +0000440 addUInt(Block, 0, dwarf::DW_FORM_udata, DV.getAddrElement(++i));
Devang Patel161b2f42011-04-12 23:21:44 +0000441 } else if (Element == DIBuilder::OpDeref) {
Eric Christopher50120762012-05-08 18:56:00 +0000442 if (!Location.isReg())
443 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Eric Christopher6efc0432013-10-19 01:04:47 +0000444 } else
445 llvm_unreachable("unknown DIBuilder Opcode");
Devang Patel161b2f42011-04-12 23:21:44 +0000446 }
447
448 // Now attach the location information to the DIE.
449 addBlock(Die, Attribute, 0, Block);
450}
451
452/* Byref variables, in Blocks, are declared by the programmer as "SomeType
453 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
454 gives the variable VarName either the struct, or a pointer to the struct, as
455 its type. This is necessary for various behind-the-scenes things the
456 compiler needs to do with by-reference variables in Blocks.
457
458 However, as far as the original *programmer* is concerned, the variable
459 should still have type 'SomeType', as originally declared.
460
461 The function getBlockByrefType dives into the __Block_byref_x_VarName
462 struct to find the original type of the variable, which is then assigned to
463 the variable's Debug Information Entry as its real type. So far, so good.
464 However now the debugger will expect the variable VarName to have the type
465 SomeType. So we need the location attribute for the variable to be an
466 expression that explains to the debugger how to navigate through the
467 pointers and struct to find the actual variable of type SomeType.
468
469 The following function does just that. We start by getting
470 the "normal" location for the variable. This will be the location
471 of either the struct __Block_byref_x_VarName or the pointer to the
472 struct __Block_byref_x_VarName.
473
474 The struct will look something like:
475
476 struct __Block_byref_x_VarName {
477 ... <various fields>
478 struct __Block_byref_x_VarName *forwarding;
479 ... <various other fields>
480 SomeType VarName;
481 ... <maybe more fields>
482 };
483
484 If we are given the struct directly (as our starting point) we
485 need to tell the debugger to:
486
487 1). Add the offset of the forwarding field.
488
489 2). Follow that pointer to get the real __Block_byref_x_VarName
490 struct to use (the real one may have been copied onto the heap).
491
492 3). Add the offset for the field VarName, to find the actual variable.
493
494 If we started with a pointer to the struct, then we need to
495 dereference that pointer first, before the other steps.
496 Translating this into DWARF ops, we will need to append the following
497 to the current location description for the variable:
498
499 DW_OP_deref -- optional, if we start with a pointer
500 DW_OP_plus_uconst <forward_fld_offset>
501 DW_OP_deref
502 DW_OP_plus_uconst <varName_fld_offset>
503
504 That is what this function does. */
505
506/// addBlockByrefAddress - Start with the address based on the location
507/// provided, and generate the DWARF information necessary to find the
508/// actual Block variable (navigating the Block struct) based on the
509/// starting location. Add the DWARF information to the die. For
510/// more information, read large comment just above here.
511///
Eric Christopherf61dbc12013-06-24 21:07:27 +0000512void CompileUnit::addBlockByrefAddress(const DbgVariable &DV, DIE *Die,
Eric Christopher31667622013-08-08 01:41:00 +0000513 uint16_t Attribute,
Devang Patel161b2f42011-04-12 23:21:44 +0000514 const MachineLocation &Location) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000515 DIType Ty = DV.getType();
Devang Patel161b2f42011-04-12 23:21:44 +0000516 DIType TmpTy = Ty;
Eric Christopher31667622013-08-08 01:41:00 +0000517 uint16_t Tag = Ty.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +0000518 bool isPointer = false;
519
Eric Christopherf61dbc12013-06-24 21:07:27 +0000520 StringRef varName = DV.getName();
Devang Patel161b2f42011-04-12 23:21:44 +0000521
522 if (Tag == dwarf::DW_TAG_pointer_type) {
523 DIDerivedType DTy = DIDerivedType(Ty);
Manman Ren017ceda2013-10-08 18:42:58 +0000524 TmpTy = resolve(DTy.getTypeDerivedFrom());
Devang Patel161b2f42011-04-12 23:21:44 +0000525 isPointer = true;
526 }
527
528 DICompositeType blockStruct = DICompositeType(TmpTy);
529
530 // Find the __forwarding field and the variable field in the __Block_byref
531 // struct.
532 DIArray Fields = blockStruct.getTypeArray();
533 DIDescriptor varField = DIDescriptor();
534 DIDescriptor forwardingField = DIDescriptor();
535
536 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
537 DIDescriptor Element = Fields.getElement(i);
538 DIDerivedType DT = DIDerivedType(Element);
539 StringRef fieldName = DT.getName();
540 if (fieldName == "__forwarding")
541 forwardingField = Element;
542 else if (fieldName == varName)
543 varField = Element;
544 }
545
546 // Get the offsets for the forwarding field and the variable field.
547 unsigned forwardingFieldOffset =
Eric Christopher6efc0432013-10-19 01:04:47 +0000548 DIDerivedType(forwardingField).getOffsetInBits() >> 3;
549 unsigned varFieldOffset = DIDerivedType(varField).getOffsetInBits() >> 3;
Devang Patel161b2f42011-04-12 23:21:44 +0000550
551 // Decode the original location, and use that as the start of the byref
552 // variable's location.
Devang Patel161b2f42011-04-12 23:21:44 +0000553 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
554
Eric Christophercaba2632012-07-04 02:02:18 +0000555 if (Location.isReg())
556 addRegisterOp(Block, Location.getReg());
557 else
558 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel161b2f42011-04-12 23:21:44 +0000559
560 // If we started with a pointer to the __Block_byref... struct, then
561 // the first thing we need to do is dereference the pointer (DW_OP_deref).
562 if (isPointer)
563 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
564
565 // Next add the offset for the '__forwarding' field:
566 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
567 // adding the offset if it's 0.
568 if (forwardingFieldOffset > 0) {
569 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
570 addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
571 }
572
573 // Now dereference the __forwarding field to get to the real __Block_byref
574 // struct: DW_OP_deref.
575 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
576
577 // Now that we've got the real __Block_byref... struct, add the offset
578 // for the variable's field to get to the location of the actual variable:
579 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
580 if (varFieldOffset > 0) {
581 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
582 addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
583 }
584
585 // Now attach the location information to the DIE.
586 addBlock(Die, Attribute, 0, Block);
587}
588
Devang Patel4ec14b02011-07-20 21:57:04 +0000589/// isTypeSigned - Return true if the type is signed.
Manman Renc664d762013-10-05 01:43:03 +0000590static bool isTypeSigned(DwarfDebug *DD, DIType Ty, int *SizeInBits) {
Devang Patel4ec14b02011-07-20 21:57:04 +0000591 if (Ty.isDerivedType())
Manman Renc664d762013-10-05 01:43:03 +0000592 return isTypeSigned(DD, DD->resolve(DIDerivedType(Ty).getTypeDerivedFrom()),
593 SizeInBits);
Devang Patel4ec14b02011-07-20 21:57:04 +0000594 if (Ty.isBasicType())
Eric Christopher6efc0432013-10-19 01:04:47 +0000595 if (DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed ||
596 DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed_char) {
Devang Patel4ec14b02011-07-20 21:57:04 +0000597 *SizeInBits = Ty.getSizeInBits();
598 return true;
599 }
600 return false;
601}
602
Manman Renc664d762013-10-05 01:43:03 +0000603/// Return true if type encoding is unsigned.
604static bool isUnsignedDIType(DwarfDebug *DD, DIType Ty) {
605 DIDerivedType DTy(Ty);
606 if (DTy.isDerivedType())
607 return isUnsignedDIType(DD, DD->resolve(DTy.getTypeDerivedFrom()));
608
609 DIBasicType BTy(Ty);
610 if (BTy.isBasicType()) {
611 unsigned Encoding = BTy.getEncoding();
612 if (Encoding == dwarf::DW_ATE_unsigned ||
613 Encoding == dwarf::DW_ATE_unsigned_char ||
614 Encoding == dwarf::DW_ATE_boolean)
615 return true;
616 }
617 return false;
618}
619
620/// If this type is derived from a base type then return base type size.
Manman Ren43251002013-10-08 18:46:58 +0000621static uint64_t getBaseTypeSize(DwarfDebug *DD, DIDerivedType Ty) {
Manman Renc664d762013-10-05 01:43:03 +0000622 unsigned Tag = Ty.getTag();
623
624 if (Tag != dwarf::DW_TAG_member && Tag != dwarf::DW_TAG_typedef &&
625 Tag != dwarf::DW_TAG_const_type && Tag != dwarf::DW_TAG_volatile_type &&
626 Tag != dwarf::DW_TAG_restrict_type)
627 return Ty.getSizeInBits();
628
629 DIType BaseType = DD->resolve(Ty.getTypeDerivedFrom());
630
631 // If this type is not derived from any type then take conservative approach.
632 if (!BaseType.isValid())
633 return Ty.getSizeInBits();
634
635 // If this is a derived type, go ahead and get the base type, unless it's a
636 // reference then it's just the size of the field. Pointer types have no need
637 // of this since they're a different type of qualification on the type.
638 if (BaseType.getTag() == dwarf::DW_TAG_reference_type ||
639 BaseType.getTag() == dwarf::DW_TAG_rvalue_reference_type)
640 return Ty.getSizeInBits();
641
642 if (BaseType.isDerivedType())
Manman Ren43251002013-10-08 18:46:58 +0000643 return getBaseTypeSize(DD, DIDerivedType(BaseType));
Manman Renc664d762013-10-05 01:43:03 +0000644
645 return BaseType.getSizeInBits();
646}
647
Devang Patel161b2f42011-04-12 23:21:44 +0000648/// addConstantValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000649void CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO,
Devang Patelb58128e2011-05-27 16:45:18 +0000650 DIType Ty) {
David Blaikie4de9d722013-05-10 21:52:07 +0000651 // FIXME: This is a bit conservative/simple - it emits negative values at
652 // their maximum bit width which is a bit unfortunate (& doesn't prefer
653 // udata/sdata over dataN as suggested by the DWARF spec)
Nick Lewycky746cb672011-10-26 22:55:33 +0000654 assert(MO.isImm() && "Invalid machine operand!");
Devang Patel4ec14b02011-07-20 21:57:04 +0000655 int SizeInBits = -1;
Manman Renc664d762013-10-05 01:43:03 +0000656 bool SignedConstant = isTypeSigned(DD, Ty, &SizeInBits);
Eric Christopher7b2ee392013-08-27 23:49:04 +0000657 uint16_t Form;
Devang Patel72f0d9c2011-05-27 18:15:52 +0000658
Eric Christopher7b2ee392013-08-27 23:49:04 +0000659 // If we're a signed constant definitely use sdata.
660 if (SignedConstant) {
661 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, MO.getImm());
662 return;
663 }
664
665 // Else use data for now unless it's larger than we can deal with.
666 switch (SizeInBits) {
667 case 8:
668 Form = dwarf::DW_FORM_data1;
669 break;
670 case 16:
671 Form = dwarf::DW_FORM_data2;
672 break;
673 case 32:
674 Form = dwarf::DW_FORM_data4;
675 break;
676 case 64:
677 Form = dwarf::DW_FORM_data8;
678 break;
679 default:
680 Form = dwarf::DW_FORM_udata;
681 addUInt(Die, dwarf::DW_AT_const_value, Form, MO.getImm());
682 return;
683 }
684 addUInt(Die, dwarf::DW_AT_const_value, Form, MO.getImm());
Devang Patel161b2f42011-04-12 23:21:44 +0000685}
686
687/// addConstantFPValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000688void CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
Eric Christopher6efc0432013-10-19 01:04:47 +0000689 assert(MO.isFPImm() && "Invalid machine operand!");
Devang Patel161b2f42011-04-12 23:21:44 +0000690 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
691 APFloat FPImm = MO.getFPImm()->getValueAPF();
692
693 // Get the raw data form of the floating point.
694 const APInt FltVal = FPImm.bitcastToAPInt();
Eric Christopher6efc0432013-10-19 01:04:47 +0000695 const char *FltPtr = (const char *)FltVal.getRawData();
Devang Patel161b2f42011-04-12 23:21:44 +0000696
697 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
Micah Villmow3574eca2012-10-08 16:38:25 +0000698 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel161b2f42011-04-12 23:21:44 +0000699 int Incr = (LittleEndian ? 1 : -1);
700 int Start = (LittleEndian ? 0 : NumBytes - 1);
701 int Stop = (LittleEndian ? NumBytes : -1);
702
703 // Output the constant to DWARF one byte at a time.
704 for (; Start != Stop; Start += Incr)
705 addUInt(Block, 0, dwarf::DW_FORM_data1,
706 (unsigned char)0xFF & FltPtr[Start]);
707
708 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
Devang Patel161b2f42011-04-12 23:21:44 +0000709}
710
David Blaikie14268412013-01-20 01:18:01 +0000711/// addConstantFPValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000712void CompileUnit::addConstantFPValue(DIE *Die, const ConstantFP *CFP) {
Eric Christopher7b2ee392013-08-27 23:49:04 +0000713 // Pass this down to addConstantValue as an unsigned bag of bits.
714 addConstantValue(Die, CFP->getValueAPF().bitcastToAPInt(), true);
David Blaikie14268412013-01-20 01:18:01 +0000715}
716
Devang Patel161b2f42011-04-12 23:21:44 +0000717/// addConstantValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000718void CompileUnit::addConstantValue(DIE *Die, const ConstantInt *CI,
Devang Patel161b2f42011-04-12 23:21:44 +0000719 bool Unsigned) {
Eric Christophere4721492013-07-03 01:08:30 +0000720 addConstantValue(Die, CI->getValue(), Unsigned);
David Blaikie14268412013-01-20 01:18:01 +0000721}
722
723// addConstantValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000724void CompileUnit::addConstantValue(DIE *Die, const APInt &Val, bool Unsigned) {
David Blaikie14268412013-01-20 01:18:01 +0000725 unsigned CIBitWidth = Val.getBitWidth();
Devang Pateld6a81362011-05-28 00:39:18 +0000726 if (CIBitWidth <= 64) {
Eric Christopher7b2ee392013-08-27 23:49:04 +0000727 // If we're a signed constant definitely use sdata.
728 if (!Unsigned) {
729 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata,
730 Val.getSExtValue());
731 return;
Devang Pateld6a81362011-05-28 00:39:18 +0000732 }
Eric Christopher7b2ee392013-08-27 23:49:04 +0000733
734 // Else use data for now unless it's larger than we can deal with.
735 uint16_t Form;
736 switch (CIBitWidth) {
737 case 8:
738 Form = dwarf::DW_FORM_data1;
739 break;
740 case 16:
741 Form = dwarf::DW_FORM_data2;
742 break;
743 case 32:
744 Form = dwarf::DW_FORM_data4;
745 break;
746 case 64:
747 Form = dwarf::DW_FORM_data8;
748 break;
749 default:
750 addUInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
751 Val.getZExtValue());
752 return;
753 }
754 addUInt(Die, dwarf::DW_AT_const_value, Form, Val.getZExtValue());
Eric Christophere4721492013-07-03 01:08:30 +0000755 return;
Devang Patel161b2f42011-04-12 23:21:44 +0000756 }
757
758 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
759
760 // Get the raw data form of the large APInt.
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000761 const uint64_t *Ptr64 = Val.getRawData();
Devang Patel161b2f42011-04-12 23:21:44 +0000762
763 int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
Micah Villmow3574eca2012-10-08 16:38:25 +0000764 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel161b2f42011-04-12 23:21:44 +0000765
766 // Output the constant to DWARF one byte at a time.
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000767 for (int i = 0; i < NumBytes; i++) {
768 uint8_t c;
769 if (LittleEndian)
770 c = Ptr64[i / 8] >> (8 * (i & 7));
771 else
772 c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7));
773 addUInt(Block, 0, dwarf::DW_FORM_data1, c);
774 }
Devang Patel161b2f42011-04-12 23:21:44 +0000775
776 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
Devang Patel161b2f42011-04-12 23:21:44 +0000777}
778
Eric Christopher6c3bb942013-04-22 07:47:40 +0000779/// addTemplateParams - Add template parameters into buffer.
Devang Patel161b2f42011-04-12 23:21:44 +0000780void CompileUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
781 // Add template parameters.
782 for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) {
783 DIDescriptor Element = TParams.getElement(i);
784 if (Element.isTemplateTypeParameter())
Eric Christopher6efc0432013-10-19 01:04:47 +0000785 getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter(Element),
786 Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +0000787 else if (Element.isTemplateValueParameter())
Eric Christopher6efc0432013-10-19 01:04:47 +0000788 getOrCreateTemplateValueParameterDIE(DITemplateValueParameter(Element),
789 Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +0000790 }
Devang Patel161b2f42011-04-12 23:21:44 +0000791}
Nick Lewycky746cb672011-10-26 22:55:33 +0000792
Eric Christopher6b6061f2013-01-16 01:22:23 +0000793/// getOrCreateContextDIE - Get context owner's DIE.
Eric Christopherccb66362013-10-04 23:49:26 +0000794DIE *CompileUnit::getOrCreateContextDIE(DIScope Context) {
Eric Christopher6b6061f2013-01-16 01:22:23 +0000795 if (Context.isType())
796 return getOrCreateTypeDIE(DIType(Context));
797 else if (Context.isNameSpace())
798 return getOrCreateNameSpace(DINameSpace(Context));
799 else if (Context.isSubprogram())
800 return getOrCreateSubprogramDIE(DISubprogram(Context));
Eric Christopher6c3bb942013-04-22 07:47:40 +0000801 else
Eric Christopher6b6061f2013-01-16 01:22:23 +0000802 return getDIE(Context);
803}
804
Devang Patel161b2f42011-04-12 23:21:44 +0000805/// addToContextOwner - Add Die into the list of its context owner's children.
Eric Christopherccb66362013-10-04 23:49:26 +0000806void CompileUnit::addToContextOwner(DIE *Die, DIScope Context) {
David Blaikiee5830c42013-10-03 20:07:20 +0000807 assert(!Die->getParent());
808 if (DIE *ContextDIE = getOrCreateContextDIE(Context)) {
809 if (Die->getParent()) {
810 // While creating the context, if this is a type member, we will have
811 // added the child to the context already.
812 assert(Die->getParent() == ContextDIE);
813 return;
814 }
Devang Patel161b2f42011-04-12 23:21:44 +0000815 ContextDIE->addChild(Die);
David Blaikiee5830c42013-10-03 20:07:20 +0000816 } else
Devang Patel161b2f42011-04-12 23:21:44 +0000817 addDie(Die);
818}
819
820/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
821/// given DIType.
Devang Patel94c7ddb2011-08-16 22:09:43 +0000822DIE *CompileUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
823 DIType Ty(TyNode);
Manman Rend03d2b22013-07-08 18:33:29 +0000824 if (!Ty.isType())
Devang Patel94c7ddb2011-08-16 22:09:43 +0000825 return NULL;
Eric Christopher3f045002013-10-04 17:08:38 +0000826 DIE *TyDIE = getDIE(Ty);
Devang Patel161b2f42011-04-12 23:21:44 +0000827 if (TyDIE)
828 return TyDIE;
829
830 // Create new type.
David Blaikie916d49e2013-10-04 23:21:16 +0000831 TyDIE = new DIE(Ty.getTag());
Eric Christopher3f045002013-10-04 17:08:38 +0000832 insertDIE(Ty, TyDIE);
Devang Patel161b2f42011-04-12 23:21:44 +0000833 if (Ty.isBasicType())
834 constructTypeDIE(*TyDIE, DIBasicType(Ty));
835 else if (Ty.isCompositeType())
836 constructTypeDIE(*TyDIE, DICompositeType(Ty));
837 else {
838 assert(Ty.isDerivedType() && "Unknown kind of DIType");
839 constructTypeDIE(*TyDIE, DIDerivedType(Ty));
840 }
Eric Christopher1b3f9192011-11-10 19:52:58 +0000841 // If this is a named finished type then include it in the list of types
842 // for the accelerator tables.
Eric Christopherc36145f2012-01-06 04:35:23 +0000843 if (!Ty.getName().empty() && !Ty.isForwardDecl()) {
844 bool IsImplementation = 0;
845 if (Ty.isCompositeType()) {
846 DICompositeType CT(Ty);
Eric Christophere0167892012-01-06 23:03:37 +0000847 // A runtime language of 0 actually means C/C++ and that any
848 // non-negative value is some version of Objective-C/C++.
Eric Christopher6efc0432013-10-19 01:04:47 +0000849 IsImplementation = (CT.getRunTimeLang() == 0) || CT.isObjcClassComplete();
Eric Christopherc36145f2012-01-06 04:35:23 +0000850 }
Eric Christopher577056f2013-09-05 18:20:16 +0000851 unsigned Flags = IsImplementation ? dwarf::DW_FLAG_type_implementation : 0;
Eric Christophere0167892012-01-06 23:03:37 +0000852 addAccelType(Ty.getName(), std::make_pair(TyDIE, Flags));
Eric Christopherc36145f2012-01-06 04:35:23 +0000853 }
Eric Christopher8b4310b2012-11-21 00:34:38 +0000854
Eric Christophereee74fb2013-10-05 00:27:02 +0000855 addToContextOwner(TyDIE, resolve(Ty.getContext()));
Devang Patel161b2f42011-04-12 23:21:44 +0000856 return TyDIE;
857}
858
859/// addType - Add a new type attribute to the specified entity.
Eric Christopher31667622013-08-08 01:41:00 +0000860void CompileUnit::addType(DIE *Entity, DIType Ty, uint16_t Attribute) {
Eric Christopherdc1363f2013-08-08 07:40:37 +0000861 assert(Ty && "Trying to add a type that doesn't exist?");
Devang Patel161b2f42011-04-12 23:21:44 +0000862
863 // Check for pre-existence.
864 DIEEntry *Entry = getDIEEntry(Ty);
865 // If it exists then use the existing value.
866 if (Entry) {
Eric Christopher3f045002013-10-04 17:08:38 +0000867 Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
Devang Patel161b2f42011-04-12 23:21:44 +0000868 return;
869 }
870
871 // Construct type.
872 DIE *Buffer = getOrCreateTypeDIE(Ty);
873
874 // Set up proxy.
875 Entry = createDIEEntry(Buffer);
876 insertDIEEntry(Ty, Entry);
Eric Christopher3f045002013-10-04 17:08:38 +0000877 Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
Devang Patele9ae06c2011-05-31 22:56:51 +0000878
879 // If this is a complete composite type then include it in the
880 // list of global types.
Devang Patelc20bdf12011-06-01 00:23:24 +0000881 addGlobalType(Ty);
Devang Patel66658e42011-05-31 23:30:30 +0000882}
883
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000884// Accelerator table mutators - add each name along with its companion
885// DIE to the proper table while ensuring that the name that we're going
886// to reference is in the string table. We do this since the names we
887// add may not only be identical to the names in the DIE.
888void CompileUnit::addAccelName(StringRef Name, DIE *Die) {
889 DU->getStringPoolEntry(Name);
Eric Christopher734334e2013-09-23 22:59:11 +0000890 std::vector<DIE *> &DIEs = AccelNames[Name];
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000891 DIEs.push_back(Die);
892}
893
894void CompileUnit::addAccelObjC(StringRef Name, DIE *Die) {
895 DU->getStringPoolEntry(Name);
Eric Christopher734334e2013-09-23 22:59:11 +0000896 std::vector<DIE *> &DIEs = AccelObjC[Name];
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000897 DIEs.push_back(Die);
898}
899
900void CompileUnit::addAccelNamespace(StringRef Name, DIE *Die) {
901 DU->getStringPoolEntry(Name);
Eric Christopher734334e2013-09-23 22:59:11 +0000902 std::vector<DIE *> &DIEs = AccelNamespace[Name];
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000903 DIEs.push_back(Die);
904}
905
906void CompileUnit::addAccelType(StringRef Name, std::pair<DIE *, unsigned> Die) {
907 DU->getStringPoolEntry(Name);
908 std::vector<std::pair<DIE *, unsigned> > &DIEs = AccelTypes[Name];
909 DIEs.push_back(Die);
910}
911
Eric Christopher50d37a42013-09-20 22:20:55 +0000912/// addGlobalName - Add a new global name to the compile unit.
Eric Christopher91986572013-10-17 02:06:06 +0000913void CompileUnit::addGlobalName(StringRef Name, DIE *Die, DIScope Context) {
Eric Christopher0ab64392013-10-19 01:04:42 +0000914 std::string FullName = getParentContextString(Context) + Name.str();
Eric Christopher91986572013-10-17 02:06:06 +0000915 GlobalNames[FullName] = Die;
Eric Christopher50d37a42013-09-20 22:20:55 +0000916}
917
Devang Patel66658e42011-05-31 23:30:30 +0000918/// addGlobalType - Add a new global type to the compile unit.
919///
Devang Patelc20bdf12011-06-01 00:23:24 +0000920void CompileUnit::addGlobalType(DIType Ty) {
Eric Christophereee74fb2013-10-05 00:27:02 +0000921 DIScope Context = resolve(Ty.getContext());
Eric Christopher5a634742013-09-23 23:15:58 +0000922 if (!Ty.getName().empty() && !Ty.isForwardDecl() &&
Eric Christopher734334e2013-09-23 22:59:11 +0000923 (!Context || Context.isCompileUnit() || Context.isFile() ||
924 Context.isNameSpace()))
Eric Christopher91986572013-10-17 02:06:06 +0000925 if (DIEEntry *Entry = getDIEEntry(Ty)) {
Eric Christopher0ab64392013-10-19 01:04:42 +0000926 std::string FullName =
927 getParentContextString(Context) + Ty.getName().str();
Eric Christopher6efc0432013-10-19 01:04:47 +0000928 GlobalTypes[FullName] = Entry->getEntry();
Eric Christopher91986572013-10-17 02:06:06 +0000929 }
930}
931
932/// getParentContextString - Walks the metadata parent chain in a language
933/// specific manner (using the compile unit language) and returns
934/// it as a string. This is done at the metadata level because DIEs may
935/// not currently have been added to the parent context and walking the
936/// DIEs looking for names is more expensive than walking the metadata.
937std::string CompileUnit::getParentContextString(DIScope Context) const {
938 if (!Context)
939 return "";
940
941 // FIXME: Decide whether to implement this for non-C++ languages.
942 if (getLanguage() != dwarf::DW_LANG_C_plus_plus)
943 return "";
944
Eric Christopher0ab64392013-10-19 01:04:42 +0000945 std::string CS;
Eric Christopher91986572013-10-17 02:06:06 +0000946 SmallVector<DIScope, 1> Parents;
947 while (!Context.isCompileUnit()) {
948 Parents.push_back(Context);
949 if (Context.getContext())
950 Context = resolve(Context.getContext());
951 else
952 // Structure, etc types will have a NULL context if they're at the top
953 // level.
954 break;
955 }
956
957 // Reverse iterate over our list to go from the outermost construct to the
958 // innermost.
959 for (SmallVectorImpl<DIScope>::reverse_iterator I = Parents.rbegin(),
960 E = Parents.rend();
961 I != E; ++I) {
962 DIScope Ctx = *I;
963 StringRef Name = Ctx.getName();
Eric Christopher0ab64392013-10-19 01:04:42 +0000964 if (!Name.empty()) {
Eric Christopher91986572013-10-17 02:06:06 +0000965 CS += Name;
966 CS += "::";
967 }
968 }
969 return CS;
Devang Patel161b2f42011-04-12 23:21:44 +0000970}
971
Eric Christopher22852c72013-10-05 00:05:51 +0000972/// addPubTypes - Add subprogram argument types for pubtypes section.
Devang Patel31c5d052011-05-06 16:57:54 +0000973void CompileUnit::addPubTypes(DISubprogram SP) {
974 DICompositeType SPTy = SP.getType();
Eric Christopher31667622013-08-08 01:41:00 +0000975 uint16_t SPTag = SPTy.getTag();
Devang Patel31c5d052011-05-06 16:57:54 +0000976 if (SPTag != dwarf::DW_TAG_subroutine_type)
977 return;
978
979 DIArray Args = SPTy.getTypeArray();
980 for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
981 DIType ATy(Args.getElement(i));
Manman Rend03d2b22013-07-08 18:33:29 +0000982 if (!ATy.isType())
Devang Patel31c5d052011-05-06 16:57:54 +0000983 continue;
Devang Patelc20bdf12011-06-01 00:23:24 +0000984 addGlobalType(ATy);
Devang Patel31c5d052011-05-06 16:57:54 +0000985 }
986}
987
Devang Patel161b2f42011-04-12 23:21:44 +0000988/// constructTypeDIE - Construct basic type die from DIBasicType.
989void CompileUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
990 // Get core information.
991 StringRef Name = BTy.getName();
Devang Patel161b2f42011-04-12 23:21:44 +0000992 // Add name if not anonymous or intermediate type.
993 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000994 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel734a67c2011-09-14 23:13:28 +0000995
David Blaikie916d49e2013-10-04 23:21:16 +0000996 // An unspecified type only has a name attribute.
997 if (BTy.getTag() == dwarf::DW_TAG_unspecified_type)
Devang Patel734a67c2011-09-14 23:13:28 +0000998 return;
Devang Patel734a67c2011-09-14 23:13:28 +0000999
Nick Lewycky746cb672011-10-26 22:55:33 +00001000 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
Devang Patel30d409c2012-02-07 23:33:58 +00001001 BTy.getEncoding());
Devang Patel734a67c2011-09-14 23:13:28 +00001002
Devang Patel161b2f42011-04-12 23:21:44 +00001003 uint64_t Size = BTy.getSizeInBits() >> 3;
1004 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
1005}
1006
1007/// constructTypeDIE - Construct derived type die from DIDerivedType.
1008void CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
1009 // Get core information.
1010 StringRef Name = DTy.getName();
1011 uint64_t Size = DTy.getSizeInBits() >> 3;
David Blaikie916d49e2013-10-04 23:21:16 +00001012 uint16_t Tag = Buffer.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +00001013
1014 // Map to main type, void will not have a type.
Manman Ren017ceda2013-10-08 18:42:58 +00001015 DIType FromTy = resolve(DTy.getTypeDerivedFrom());
Eric Christopherdc1363f2013-08-08 07:40:37 +00001016 if (FromTy)
1017 addType(&Buffer, FromTy);
Devang Patel161b2f42011-04-12 23:21:44 +00001018
1019 // Add name if not anonymous or intermediate type.
1020 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001021 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001022
1023 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopher35f225a2012-02-21 22:25:53 +00001024 if (Size && Tag != dwarf::DW_TAG_pointer_type)
Devang Patel161b2f42011-04-12 23:21:44 +00001025 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
1026
David Blaikie62fdfb52013-01-07 05:51:15 +00001027 if (Tag == dwarf::DW_TAG_ptr_to_member_type)
Eric Christopher6efc0432013-10-19 01:04:47 +00001028 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type,
1029 getOrCreateTypeDIE(resolve(DTy.getClassType())));
Devang Patel161b2f42011-04-12 23:21:44 +00001030 // Add source line info if available and TyDesc is not a forward declaration.
1031 if (!DTy.isForwardDecl())
1032 addSourceLine(&Buffer, DTy);
1033}
1034
Eric Christopher3dee5752013-07-26 17:02:41 +00001035/// Return true if the type is appropriately scoped to be contained inside
1036/// its own type unit.
Manman Ren18eb2452013-09-09 19:23:58 +00001037static bool isTypeUnitScoped(DIType Ty, const DwarfDebug *DD) {
Manman Ren2c9905a2013-09-09 19:47:11 +00001038 DIScope Parent = DD->resolve(Ty.getContext());
Eric Christopher3dee5752013-07-26 17:02:41 +00001039 while (Parent) {
1040 // Don't generate a hash for anything scoped inside a function.
1041 if (Parent.isSubprogram())
1042 return false;
Manman Rene72aba92013-09-09 22:35:23 +00001043 Parent = DD->resolve(Parent.getContext());
Eric Christopher3dee5752013-07-26 17:02:41 +00001044 }
1045 return true;
1046}
1047
1048/// Return true if the type should be split out into a type unit.
Manman Ren18eb2452013-09-09 19:23:58 +00001049static bool shouldCreateTypeUnit(DICompositeType CTy, const DwarfDebug *DD) {
Eric Christopher31667622013-08-08 01:41:00 +00001050 uint16_t Tag = CTy.getTag();
Eric Christopher3dee5752013-07-26 17:02:41 +00001051
1052 switch (Tag) {
1053 case dwarf::DW_TAG_structure_type:
1054 case dwarf::DW_TAG_union_type:
1055 case dwarf::DW_TAG_enumeration_type:
1056 case dwarf::DW_TAG_class_type:
1057 // If this is a class, structure, union, or enumeration type
David Blaikiec4eb3532013-10-04 23:52:02 +00001058 // that is a definition (not a declaration), and not scoped
Eric Christopher3dee5752013-07-26 17:02:41 +00001059 // inside a function then separate this out as a type unit.
David Blaikiec4eb3532013-10-04 23:52:02 +00001060 return !CTy.isForwardDecl() && isTypeUnitScoped(CTy, DD);
Eric Christopher3dee5752013-07-26 17:02:41 +00001061 default:
David Blaikiec4eb3532013-10-04 23:52:02 +00001062 return false;
Eric Christopher3dee5752013-07-26 17:02:41 +00001063 }
1064}
1065
Devang Patel161b2f42011-04-12 23:21:44 +00001066/// constructTypeDIE - Construct type DIE from DICompositeType.
1067void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
1068 // Get core information.
1069 StringRef Name = CTy.getName();
1070
1071 uint64_t Size = CTy.getSizeInBits() >> 3;
David Blaikie916d49e2013-10-04 23:21:16 +00001072 uint16_t Tag = Buffer.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +00001073
1074 switch (Tag) {
Devang Patel161b2f42011-04-12 23:21:44 +00001075 case dwarf::DW_TAG_array_type:
1076 constructArrayTypeDIE(Buffer, &CTy);
1077 break;
1078 case dwarf::DW_TAG_enumeration_type: {
1079 DIArray Elements = CTy.getTypeArray();
1080
1081 // Add enumerators to enumeration type.
1082 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1083 DIE *ElemDie = NULL;
1084 DIDescriptor Enum(Elements.getElement(i));
Manman Ren630c3262013-10-18 21:14:19 +00001085 if (Enum.isEnumerator())
1086 ElemDie = constructEnumTypeDIE(DIEnumerator(Enum), Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +00001087 }
Manman Ren017ceda2013-10-08 18:42:58 +00001088 DIType DTy = resolve(CTy.getTypeDerivedFrom());
Eric Christopher37c107b2013-08-08 07:40:42 +00001089 if (DTy) {
Eric Christopherbb0f6ea2012-05-23 00:09:20 +00001090 addType(&Buffer, DTy);
Eric Christopher371d9582013-10-04 22:40:10 +00001091 addFlag(&Buffer, dwarf::DW_AT_enum_class);
Eric Christopherbb0f6ea2012-05-23 00:09:20 +00001092 }
Eric Christopher6efc0432013-10-19 01:04:47 +00001093 } break;
Devang Patel161b2f42011-04-12 23:21:44 +00001094 case dwarf::DW_TAG_subroutine_type: {
Eric Christopherdc1363f2013-08-08 07:40:37 +00001095 // Add return type. A void return won't have a type.
Devang Patel161b2f42011-04-12 23:21:44 +00001096 DIArray Elements = CTy.getTypeArray();
1097 DIDescriptor RTy = Elements.getElement(0);
Eric Christopherdc1363f2013-08-08 07:40:37 +00001098 if (RTy)
1099 addType(&Buffer, DIType(RTy));
Devang Patel161b2f42011-04-12 23:21:44 +00001100
1101 bool isPrototyped = true;
1102 // Add arguments.
1103 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
1104 DIDescriptor Ty = Elements.getElement(i);
1105 if (Ty.isUnspecifiedParameter()) {
1106 DIE *Arg = new DIE(dwarf::DW_TAG_unspecified_parameters);
1107 Buffer.addChild(Arg);
1108 isPrototyped = false;
1109 } else {
1110 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1111 addType(Arg, DIType(Ty));
David Blaikieaaf2e632013-01-29 19:35:24 +00001112 if (DIType(Ty).isArtificial())
1113 addFlag(Arg, dwarf::DW_AT_artificial);
Devang Patel161b2f42011-04-12 23:21:44 +00001114 Buffer.addChild(Arg);
1115 }
1116 }
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001117 // Add prototype flag if we're dealing with a C language and the
1118 // function has been prototyped.
Eric Christopher7b878952013-08-26 23:50:38 +00001119 uint16_t Language = DICompileUnit(Node).getLanguage();
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001120 if (isPrototyped &&
Eric Christopher6efc0432013-10-19 01:04:47 +00001121 (Language == dwarf::DW_LANG_C89 || Language == dwarf::DW_LANG_C99 ||
Eric Christopher4d069bf2012-05-22 18:45:24 +00001122 Language == dwarf::DW_LANG_ObjC))
Eric Christopher873cf0a2012-08-24 01:14:27 +00001123 addFlag(&Buffer, dwarf::DW_AT_prototyped);
Eric Christopher6efc0432013-10-19 01:04:47 +00001124 } break;
Devang Patel161b2f42011-04-12 23:21:44 +00001125 case dwarf::DW_TAG_structure_type:
1126 case dwarf::DW_TAG_union_type:
1127 case dwarf::DW_TAG_class_type: {
Devang Patel161b2f42011-04-12 23:21:44 +00001128 // Add elements to structure type.
David Blaikiec8b93552013-08-01 20:30:22 +00001129 DIArray Elements = CTy.getTypeArray();
1130 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
Devang Patel161b2f42011-04-12 23:21:44 +00001131 DIDescriptor Element = Elements.getElement(i);
1132 DIE *ElemDie = NULL;
1133 if (Element.isSubprogram()) {
1134 DISubprogram SP(Element);
Devang Pateldbc64af2011-08-15 17:24:54 +00001135 ElemDie = getOrCreateSubprogramDIE(DISubprogram(Element));
Devang Patel161b2f42011-04-12 23:21:44 +00001136 if (SP.isProtected())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001137 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001138 dwarf::DW_ACCESS_protected);
1139 else if (SP.isPrivate())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001140 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001141 dwarf::DW_ACCESS_private);
Eric Christopher8b4310b2012-11-21 00:34:38 +00001142 else
Nick Lewycky13aaca52011-12-13 05:09:11 +00001143 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Eric Christopher6efc0432013-10-19 01:04:47 +00001144 dwarf::DW_ACCESS_public);
Devang Patel161b2f42011-04-12 23:21:44 +00001145 if (SP.isExplicit())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001146 addFlag(ElemDie, dwarf::DW_AT_explicit);
Eric Christopher663e0cf2012-03-28 07:34:31 +00001147 } else if (Element.isDerivedType()) {
Eric Christopher4d069bf2012-05-22 18:45:24 +00001148 DIDerivedType DDTy(Element);
1149 if (DDTy.getTag() == dwarf::DW_TAG_friend) {
1150 ElemDie = new DIE(dwarf::DW_TAG_friend);
Manman Ren017ceda2013-10-08 18:42:58 +00001151 addType(ElemDie, resolve(DDTy.getTypeDerivedFrom()),
Manman Renc664d762013-10-05 01:43:03 +00001152 dwarf::DW_AT_friend);
Manman Ren655a10d2013-10-14 20:33:57 +00001153 Buffer.addChild(ElemDie);
1154 } else if (DDTy.isStaticMember()) {
1155 ElemDie = getOrCreateStaticMemberDIE(DDTy);
1156 } else {
Manman Ren630c3262013-10-18 21:14:19 +00001157 ElemDie = createMemberDIE(DDTy, Buffer);
Manman Ren655a10d2013-10-14 20:33:57 +00001158 }
Eric Christopher663e0cf2012-03-28 07:34:31 +00001159 } else if (Element.isObjCProperty()) {
Devang Patel30d409c2012-02-07 23:33:58 +00001160 DIObjCProperty Property(Element);
1161 ElemDie = new DIE(Property.getTag());
1162 StringRef PropertyName = Property.getObjCPropertyName();
1163 addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
Eric Christopher4d069bf2012-05-22 18:45:24 +00001164 addType(ElemDie, Property.getType());
1165 addSourceLine(ElemDie, Property);
Devang Patel30d409c2012-02-07 23:33:58 +00001166 StringRef GetterName = Property.getObjCPropertyGetterName();
1167 if (!GetterName.empty())
1168 addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
1169 StringRef SetterName = Property.getObjCPropertySetterName();
1170 if (!SetterName.empty())
1171 addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
1172 unsigned PropertyAttributes = 0;
Devang Patel9e11eb12012-02-04 01:30:32 +00001173 if (Property.isReadOnlyObjCProperty())
1174 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
1175 if (Property.isReadWriteObjCProperty())
1176 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
1177 if (Property.isAssignObjCProperty())
1178 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
1179 if (Property.isRetainObjCProperty())
1180 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
1181 if (Property.isCopyObjCProperty())
1182 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
1183 if (Property.isNonAtomicObjCProperty())
1184 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
1185 if (PropertyAttributes)
Eric Christopher8b4310b2012-11-21 00:34:38 +00001186 addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, 0,
Eric Christopher6efc0432013-10-19 01:04:47 +00001187 PropertyAttributes);
Devang Patel6588abf2012-02-06 17:49:43 +00001188
Devang Patel30d409c2012-02-07 23:33:58 +00001189 DIEEntry *Entry = getDIEEntry(Element);
1190 if (!Entry) {
1191 Entry = createDIEEntry(ElemDie);
1192 insertDIEEntry(Element, Entry);
1193 }
David Blaikiee5830c42013-10-03 20:07:20 +00001194 Buffer.addChild(ElemDie);
Devang Patel9e11eb12012-02-04 01:30:32 +00001195 } else
Devang Patel161b2f42011-04-12 23:21:44 +00001196 continue;
Devang Patel161b2f42011-04-12 23:21:44 +00001197 }
1198
1199 if (CTy.isAppleBlockExtension())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001200 addFlag(&Buffer, dwarf::DW_AT_APPLE_block);
Devang Patel161b2f42011-04-12 23:21:44 +00001201
Eric Christophereee74fb2013-10-05 00:27:02 +00001202 DICompositeType ContainingType(resolve(CTy.getContainingType()));
Devang Patel161b2f42011-04-12 23:21:44 +00001203 if (DIDescriptor(ContainingType).isCompositeType())
Manman Ren87b110a2013-10-11 23:58:05 +00001204 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type,
Devang Patel161b2f42011-04-12 23:21:44 +00001205 getOrCreateTypeDIE(DIType(ContainingType)));
Devang Patel161b2f42011-04-12 23:21:44 +00001206
Devang Patel201e6cd2011-05-12 21:29:42 +00001207 if (CTy.isObjcClassComplete())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001208 addFlag(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type);
Devang Patelb11f80e2011-05-12 19:06:16 +00001209
Eric Christopher1a8e8862011-12-16 23:42:42 +00001210 // Add template parameters to a class, structure or union types.
1211 // FIXME: The support isn't in the metadata for this yet.
1212 if (Tag == dwarf::DW_TAG_class_type ||
Eric Christopher6efc0432013-10-19 01:04:47 +00001213 Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type)
Devang Patel161b2f42011-04-12 23:21:44 +00001214 addTemplateParams(Buffer, CTy.getTemplateParams());
1215
1216 break;
1217 }
1218 default:
1219 break;
1220 }
1221
1222 // Add name if not anonymous or intermediate type.
1223 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001224 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001225
Eric Christopher4a5d8392012-05-22 18:45:18 +00001226 if (Tag == dwarf::DW_TAG_enumeration_type ||
Eric Christopher6efc0432013-10-19 01:04:47 +00001227 Tag == dwarf::DW_TAG_class_type || Tag == dwarf::DW_TAG_structure_type ||
Eric Christopher4a5d8392012-05-22 18:45:18 +00001228 Tag == dwarf::DW_TAG_union_type) {
Devang Patel161b2f42011-04-12 23:21:44 +00001229 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopherfc4199b2012-06-01 00:22:32 +00001230 // TODO: Do we care about size for enum forward declarations?
Devang Patel161b2f42011-04-12 23:21:44 +00001231 if (Size)
1232 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
Eric Christopherfc4199b2012-06-01 00:22:32 +00001233 else if (!CTy.isForwardDecl())
Devang Patel161b2f42011-04-12 23:21:44 +00001234 // Add zero size if it is not a forward declaration.
Eric Christopherfc4199b2012-06-01 00:22:32 +00001235 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
1236
1237 // If we're a forward decl, say so.
1238 if (CTy.isForwardDecl())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001239 addFlag(&Buffer, dwarf::DW_AT_declaration);
Devang Patel161b2f42011-04-12 23:21:44 +00001240
1241 // Add source line info if available.
1242 if (!CTy.isForwardDecl())
1243 addSourceLine(&Buffer, CTy);
Eric Christopher89388952012-03-07 00:15:19 +00001244
1245 // No harm in adding the runtime language to the declaration.
1246 unsigned RLang = CTy.getRunTimeLang();
1247 if (RLang)
Eric Christopher6efc0432013-10-19 01:04:47 +00001248 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class, dwarf::DW_FORM_data1,
1249 RLang);
Devang Patel161b2f42011-04-12 23:21:44 +00001250 }
Eric Christopher3dee5752013-07-26 17:02:41 +00001251 // If this is a type applicable to a type unit it then add it to the
1252 // list of types we'll compute a hash for later.
Manman Ren18eb2452013-09-09 19:23:58 +00001253 if (shouldCreateTypeUnit(CTy, DD))
Eric Christopher3dee5752013-07-26 17:02:41 +00001254 DD->addTypeUnitType(&Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +00001255}
1256
Eric Christopher8b4310b2012-11-21 00:34:38 +00001257/// getOrCreateTemplateTypeParameterDIE - Find existing DIE or create new DIE
Devang Patel161b2f42011-04-12 23:21:44 +00001258/// for the given DITemplateTypeParameter.
1259DIE *
Manman Ren630c3262013-10-18 21:14:19 +00001260CompileUnit::getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP,
1261 DIE &Buffer) {
Devang Patel161b2f42011-04-12 23:21:44 +00001262 DIE *ParamDIE = getDIE(TP);
1263 if (ParamDIE)
1264 return ParamDIE;
1265
1266 ParamDIE = new DIE(dwarf::DW_TAG_template_type_parameter);
Manman Ren630c3262013-10-18 21:14:19 +00001267 Buffer.addChild(ParamDIE);
Eric Christopher76ef79f2013-08-08 08:09:43 +00001268 // Add the type if it exists, it could be void and therefore no type.
1269 if (TP.getType())
Manman Renb4d9c112013-10-09 19:46:28 +00001270 addType(ParamDIE, resolve(TP.getType()));
David Blaikiee88939c2013-06-22 18:59:11 +00001271 if (!TP.getName().empty())
1272 addString(ParamDIE, dwarf::DW_AT_name, TP.getName());
Devang Patel161b2f42011-04-12 23:21:44 +00001273 return ParamDIE;
1274}
1275
Eric Christopher8b4310b2012-11-21 00:34:38 +00001276/// getOrCreateTemplateValueParameterDIE - Find existing DIE or create new DIE
Devang Patel161b2f42011-04-12 23:21:44 +00001277/// for the given DITemplateValueParameter.
1278DIE *
Manman Ren630c3262013-10-18 21:14:19 +00001279CompileUnit::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter VP,
1280 DIE &Buffer) {
Eric Christopherafdd1f82013-08-08 07:40:31 +00001281 DIE *ParamDIE = getDIE(VP);
Devang Patel161b2f42011-04-12 23:21:44 +00001282 if (ParamDIE)
1283 return ParamDIE;
1284
Eric Christopherafdd1f82013-08-08 07:40:31 +00001285 ParamDIE = new DIE(VP.getTag());
Manman Ren630c3262013-10-18 21:14:19 +00001286 Buffer.addChild(ParamDIE);
Eric Christopherdc1363f2013-08-08 07:40:37 +00001287
1288 // Add the type if there is one, template template and template parameter
1289 // packs will not have a type.
1290 if (VP.getType())
Manman Renb4d9c112013-10-09 19:46:28 +00001291 addType(ParamDIE, resolve(VP.getType()));
Eric Christopherafdd1f82013-08-08 07:40:31 +00001292 if (!VP.getName().empty())
1293 addString(ParamDIE, dwarf::DW_AT_name, VP.getName());
1294 if (Value *Val = VP.getValue()) {
David Blaikie4de9d722013-05-10 21:52:07 +00001295 if (ConstantInt *CI = dyn_cast<ConstantInt>(Val))
Manman Renb4d9c112013-10-09 19:46:28 +00001296 addConstantValue(ParamDIE, CI,
1297 isUnsignedDIType(DD, resolve(VP.getType())));
David Blaikie4de9d722013-05-10 21:52:07 +00001298 else if (GlobalValue *GV = dyn_cast<GlobalValue>(Val)) {
1299 // For declaration non-type template parameters (such as global values and
1300 // functions)
1301 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1302 addOpAddress(Block, Asm->Mang->getSymbol(GV));
1303 // Emit DW_OP_stack_value to use the address as the immediate value of the
1304 // parameter, rather than a pointer to it.
1305 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value);
1306 addBlock(ParamDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopherafdd1f82013-08-08 07:40:31 +00001307 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_template_param) {
David Blaikiee88939c2013-06-22 18:59:11 +00001308 assert(isa<MDString>(Val));
1309 addString(ParamDIE, dwarf::DW_AT_GNU_template_name,
1310 cast<MDString>(Val)->getString());
Eric Christopherafdd1f82013-08-08 07:40:31 +00001311 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_parameter_pack) {
David Blaikiee88939c2013-06-22 18:59:11 +00001312 assert(isa<MDNode>(Val));
1313 DIArray A(cast<MDNode>(Val));
1314 addTemplateParams(*ParamDIE, A);
David Blaikie4de9d722013-05-10 21:52:07 +00001315 }
1316 }
1317
Devang Patel161b2f42011-04-12 23:21:44 +00001318 return ParamDIE;
1319}
1320
Devang Patel31c5d052011-05-06 16:57:54 +00001321/// getOrCreateNameSpace - Create a DIE for DINameSpace.
1322DIE *CompileUnit::getOrCreateNameSpace(DINameSpace NS) {
1323 DIE *NDie = getDIE(NS);
1324 if (NDie)
1325 return NDie;
1326 NDie = new DIE(dwarf::DW_TAG_namespace);
1327 insertDIE(NS, NDie);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001328 if (!NS.getName().empty()) {
Nick Lewycky390c40d2011-10-27 06:44:11 +00001329 addString(NDie, dwarf::DW_AT_name, NS.getName());
Eric Christopher09ac3d82011-11-07 09:24:32 +00001330 addAccelNamespace(NS.getName(), NDie);
Eric Christopher91986572013-10-17 02:06:06 +00001331 addGlobalName(NS.getName(), NDie, NS.getContext());
Eric Christopher09ac3d82011-11-07 09:24:32 +00001332 } else
1333 addAccelNamespace("(anonymous namespace)", NDie);
Devang Patel31c5d052011-05-06 16:57:54 +00001334 addSourceLine(NDie, NS);
1335 addToContextOwner(NDie, NS.getContext());
1336 return NDie;
1337}
1338
Devang Pateldbc64af2011-08-15 17:24:54 +00001339/// getOrCreateSubprogramDIE - Create new DIE using SP.
1340DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
David Blaikiec32f2332013-10-04 01:39:59 +00001341 // Construct the context before querying for the existence of the DIE in case
1342 // such construction creates the DIE (as is the case for member function
1343 // declarations).
Manman Renb8e48a62013-10-10 18:40:01 +00001344 DIE *ContextDIE = getOrCreateContextDIE(resolve(SP.getContext()));
David Blaikiec32f2332013-10-04 01:39:59 +00001345 if (!ContextDIE)
1346 ContextDIE = CUDie.get();
1347
Eric Christopher3f045002013-10-04 17:08:38 +00001348 DIE *SPDie = getDIE(SP);
Devang Pateldbc64af2011-08-15 17:24:54 +00001349 if (SPDie)
1350 return SPDie;
1351
Peter Collingbourne27302f02012-05-27 18:36:44 +00001352 SPDie = new DIE(dwarf::DW_TAG_subprogram);
1353
1354 // DW_TAG_inlined_subroutine may refer to this DIE.
Eric Christopher3f045002013-10-04 17:08:38 +00001355 insertDIE(SP, SPDie);
Peter Collingbourne27302f02012-05-27 18:36:44 +00001356
Rafael Espindola01b55b42011-11-10 22:34:29 +00001357 DISubprogram SPDecl = SP.getFunctionDeclaration();
1358 DIE *DeclDie = NULL;
1359 if (SPDecl.isSubprogram()) {
1360 DeclDie = getOrCreateSubprogramDIE(SPDecl);
1361 }
1362
Devang Pateldbc64af2011-08-15 17:24:54 +00001363 // Add function template parameters.
1364 addTemplateParams(*SPDie, SP.getTemplateParams());
1365
Devang Pateldbc64af2011-08-15 17:24:54 +00001366 // If this DIE is going to refer declaration info using AT_specification
Eric Christopherc4968752013-05-09 00:42:33 +00001367 // then there is no need to add other attributes.
Rafael Espindola01b55b42011-11-10 22:34:29 +00001368 if (DeclDie) {
1369 // Refer function declaration directly.
Manman Ren87b110a2013-10-11 23:58:05 +00001370 addDIEEntry(SPDie, dwarf::DW_AT_specification, DeclDie);
Rafael Espindola01b55b42011-11-10 22:34:29 +00001371
Eric Christopherbdfed162013-10-17 01:31:12 +00001372 // Add subprogram definitions to the CU die directly.
Manman Ren57a964b2013-10-18 20:52:22 +00001373 addDie(SPDie);
Eric Christopherbdfed162013-10-17 01:31:12 +00001374
Devang Pateldbc64af2011-08-15 17:24:54 +00001375 return SPDie;
Rafael Espindola01b55b42011-11-10 22:34:29 +00001376 }
Devang Pateldbc64af2011-08-15 17:24:54 +00001377
Eric Christopherbdfed162013-10-17 01:31:12 +00001378 // Add to context owner.
1379 ContextDIE->addChild(SPDie);
1380
Eric Christophercbbd5b12012-08-23 22:52:55 +00001381 // Add the linkage name if we have one.
Michael Gottesmandc42d032013-09-04 04:39:38 +00001382 StringRef LinkageName = SP.getLinkageName();
1383 if (!LinkageName.empty())
Eric Christophercbbd5b12012-08-23 22:52:55 +00001384 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c2b4be2013-06-01 17:51:14 +00001385 GlobalValue::getRealLinkageName(LinkageName));
Eric Christophercbbd5b12012-08-23 22:52:55 +00001386
Devang Pateldbc64af2011-08-15 17:24:54 +00001387 // Constructors and operators for anonymous aggregates do not have names.
1388 if (!SP.getName().empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001389 addString(SPDie, dwarf::DW_AT_name, SP.getName());
Devang Pateldbc64af2011-08-15 17:24:54 +00001390
1391 addSourceLine(SPDie, SP);
1392
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001393 // Add the prototype if we have a prototype and we have a C like
1394 // language.
Eric Christopher7b878952013-08-26 23:50:38 +00001395 uint16_t Language = DICompileUnit(Node).getLanguage();
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001396 if (SP.isPrototyped() &&
Eric Christopher6efc0432013-10-19 01:04:47 +00001397 (Language == dwarf::DW_LANG_C89 || Language == dwarf::DW_LANG_C99 ||
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001398 Language == dwarf::DW_LANG_ObjC))
Eric Christopher873cf0a2012-08-24 01:14:27 +00001399 addFlag(SPDie, dwarf::DW_AT_prototyped);
Devang Pateldbc64af2011-08-15 17:24:54 +00001400
Eric Christopherdc1363f2013-08-08 07:40:37 +00001401 // Add Return Type. A void return type will not have a type.
Devang Pateldbc64af2011-08-15 17:24:54 +00001402 DICompositeType SPTy = SP.getType();
David Blaikie3d331842013-05-22 23:22:18 +00001403 assert(SPTy.getTag() == dwarf::DW_TAG_subroutine_type &&
1404 "the type of a subprogram should be a subroutine");
Devang Pateldbc64af2011-08-15 17:24:54 +00001405
David Blaikie3d331842013-05-22 23:22:18 +00001406 DIArray Args = SPTy.getTypeArray();
Eric Christopherdc1363f2013-08-08 07:40:37 +00001407 if (Args.getElement(0))
1408 addType(SPDie, DIType(Args.getElement(0)));
Devang Pateldbc64af2011-08-15 17:24:54 +00001409
1410 unsigned VK = SP.getVirtuality();
1411 if (VK) {
Nick Lewycky798313d2011-12-14 00:56:07 +00001412 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
Devang Pateldbc64af2011-08-15 17:24:54 +00001413 DIEBlock *Block = getDIEBlock();
1414 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1415 addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex());
1416 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
1417 ContainingTypeMap.insert(std::make_pair(SPDie,
Eric Christophereee74fb2013-10-05 00:27:02 +00001418 resolve(SP.getContainingType())));
Devang Pateldbc64af2011-08-15 17:24:54 +00001419 }
1420
1421 if (!SP.isDefinition()) {
Eric Christopher873cf0a2012-08-24 01:14:27 +00001422 addFlag(SPDie, dwarf::DW_AT_declaration);
Eric Christopher8b4310b2012-11-21 00:34:38 +00001423
Devang Pateldbc64af2011-08-15 17:24:54 +00001424 // Add arguments. Do not add arguments for subprogram definition. They will
1425 // be handled while processing variables.
Eric Christopher6efc0432013-10-19 01:04:47 +00001426 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
David Blaikie3d331842013-05-22 23:22:18 +00001427 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1428 DIType ATy = DIType(Args.getElement(i));
1429 addType(Arg, ATy);
1430 if (ATy.isArtificial())
1431 addFlag(Arg, dwarf::DW_AT_artificial);
1432 SPDie->addChild(Arg);
1433 }
Devang Pateldbc64af2011-08-15 17:24:54 +00001434 }
1435
1436 if (SP.isArtificial())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001437 addFlag(SPDie, dwarf::DW_AT_artificial);
Devang Pateldbc64af2011-08-15 17:24:54 +00001438
1439 if (!SP.isLocalToUnit())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001440 addFlag(SPDie, dwarf::DW_AT_external);
Devang Pateldbc64af2011-08-15 17:24:54 +00001441
1442 if (SP.isOptimized())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001443 addFlag(SPDie, dwarf::DW_AT_APPLE_optimized);
Devang Pateldbc64af2011-08-15 17:24:54 +00001444
1445 if (unsigned isa = Asm->getISAEncoding()) {
1446 addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1447 }
1448
1449 return SPDie;
1450}
1451
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001452// Return const expression if value is a GEP to access merged global
1453// constant. e.g.
1454// i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
1455static const ConstantExpr *getMergedGlobalExpr(const Value *V) {
1456 const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
1457 if (!CE || CE->getNumOperands() != 3 ||
1458 CE->getOpcode() != Instruction::GetElementPtr)
1459 return NULL;
1460
1461 // First operand points to a global struct.
1462 Value *Ptr = CE->getOperand(0);
1463 if (!isa<GlobalValue>(Ptr) ||
1464 !isa<StructType>(cast<PointerType>(Ptr->getType())->getElementType()))
1465 return NULL;
1466
1467 // Second operand is zero.
1468 const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
1469 if (!CI || !CI->isZero())
1470 return NULL;
1471
1472 // Third operand is offset.
1473 if (!isa<ConstantInt>(CE->getOperand(2)))
1474 return NULL;
1475
1476 return CE;
1477}
1478
1479/// createGlobalVariableDIE - create global variable DIE.
1480void CompileUnit::createGlobalVariableDIE(const MDNode *N) {
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001481 // Check for pre-existence.
Devang Patel49e2f032011-08-18 22:21:50 +00001482 if (getDIE(N))
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001483 return;
1484
Devang Patel49e2f032011-08-18 22:21:50 +00001485 DIGlobalVariable GV(N);
Manman Rend03d2b22013-07-08 18:33:29 +00001486 if (!GV.isGlobalVariable())
Devang Patel28bea082011-08-18 23:17:55 +00001487 return;
1488
Eric Christopherccb66362013-10-04 23:49:26 +00001489 DIScope GVContext = GV.getContext();
Eric Christopher6b6061f2013-01-16 01:22:23 +00001490 DIType GTy = GV.getType();
1491
1492 // If this is a static data member definition, some attributes belong
1493 // to the declaration DIE.
1494 DIE *VariableDIE = NULL;
Manman Ren945e8282013-02-01 23:54:37 +00001495 bool IsStaticMember = false;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001496 DIDerivedType SDMDecl = GV.getStaticDataMemberDeclaration();
1497 if (SDMDecl.Verify()) {
1498 assert(SDMDecl.isStaticMember() && "Expected static member decl");
1499 // We need the declaration DIE that is in the static member's class.
Manman Ren655a10d2013-10-14 20:33:57 +00001500 VariableDIE = getOrCreateStaticMemberDIE(SDMDecl);
Manman Ren945e8282013-02-01 23:54:37 +00001501 IsStaticMember = true;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001502 }
1503
1504 // If this is not a static data member definition, create the variable
1505 // DIE and add the initial set of attributes to it.
1506 if (!VariableDIE) {
1507 VariableDIE = new DIE(GV.getTag());
1508 // Add to map.
1509 insertDIE(N, VariableDIE);
1510
1511 // Add name and type.
1512 addString(VariableDIE, dwarf::DW_AT_name, GV.getDisplayName());
1513 addType(VariableDIE, GTy);
1514
1515 // Add scoping info.
Eric Christophera486f552013-10-16 01:37:49 +00001516 if (!GV.isLocalToUnit())
Eric Christopher6b6061f2013-01-16 01:22:23 +00001517 addFlag(VariableDIE, dwarf::DW_AT_external);
1518
1519 // Add line number info.
1520 addSourceLine(VariableDIE, GV);
1521 // Add to context owner.
1522 addToContextOwner(VariableDIE, GVContext);
1523 }
1524
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001525 // Add location.
Eric Christopher09ac3d82011-11-07 09:24:32 +00001526 bool addToAccelTable = false;
Eric Christopherd61c34b2011-11-11 03:16:32 +00001527 DIE *VariableSpecDIE = NULL;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001528 bool isGlobalVariable = GV.getGlobal() != NULL;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001529 if (isGlobalVariable) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001530 addToAccelTable = true;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001531 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
David Blaikie59eaa382013-06-28 20:05:11 +00001532 const MCSymbol *Sym = Asm->Mang->getSymbol(GV.getGlobal());
1533 if (GV.getGlobal()->isThreadLocal()) {
1534 // FIXME: Make this work with -gsplit-dwarf.
1535 unsigned PointerSize = Asm->getDataLayout().getPointerSize();
1536 assert((PointerSize == 4 || PointerSize == 8) &&
1537 "Add support for other sizes if necessary");
Ulrich Weigand716a94f2013-07-02 18:47:09 +00001538 const MCExpr *Expr =
David Blaikie8fed05e2013-07-01 23:55:52 +00001539 Asm->getObjFileLowering().getDebugThreadLocalSymbol(Sym);
David Blaikie59eaa382013-06-28 20:05:11 +00001540 // Based on GCC's support for TLS:
David Blaikie8fed05e2013-07-01 23:55:52 +00001541 if (!DD->useSplitDwarf()) {
1542 // 1) Start with a constNu of the appropriate pointer size
1543 addUInt(Block, 0, dwarf::DW_FORM_data1,
1544 PointerSize == 4 ? dwarf::DW_OP_const4u : dwarf::DW_OP_const8u);
Richard Mitton379f76e2013-10-07 18:39:18 +00001545 // 2) containing the (relocated) offset of the TLS variable
1546 // within the module's TLS block.
Ulrich Weigand716a94f2013-07-02 18:47:09 +00001547 addExpr(Block, 0, dwarf::DW_FORM_udata, Expr);
David Blaikie8fed05e2013-07-01 23:55:52 +00001548 } else {
1549 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_const_index);
Ulrich Weigand716a94f2013-07-02 18:47:09 +00001550 addUInt(Block, 0, dwarf::DW_FORM_udata, DU->getAddrPoolIndex(Expr));
David Blaikie8fed05e2013-07-01 23:55:52 +00001551 }
Richard Mitton379f76e2013-10-07 18:39:18 +00001552 // 3) followed by a custom OP to make the debugger do a TLS lookup.
Eric Christopher6efc0432013-10-19 01:04:47 +00001553 addUInt(Block, 0, dwarf::DW_FORM_data1,
1554 dwarf::DW_OP_GNU_push_tls_address);
David Blaikie59eaa382013-06-28 20:05:11 +00001555 } else
1556 addOpAddress(Block, Sym);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001557 // Do not create specification DIE if context is either compile unit
1558 // or a subprogram.
Devang Patel1dd4e562011-09-21 23:41:11 +00001559 if (GVContext && GV.isDefinition() && !GVContext.isCompileUnit() &&
Manman Ren02d29672013-09-09 19:05:21 +00001560 !GVContext.isFile() && !DD->isSubprogramContext(GVContext)) {
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001561 // Create specification DIE.
Eric Christopherd117fbb2011-11-11 01:55:22 +00001562 VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
Manman Ren87b110a2013-10-11 23:58:05 +00001563 addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification, VariableDIE);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001564 addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001565 // A static member's declaration is already flagged as such.
1566 if (!SDMDecl.Verify())
1567 addFlag(VariableDIE, dwarf::DW_AT_declaration);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001568 addDie(VariableSpecDIE);
1569 } else {
1570 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001571 }
Michael Gottesmandc42d032013-09-04 04:39:38 +00001572 // Add the linkage name.
Eric Christopher6b6061f2013-01-16 01:22:23 +00001573 StringRef LinkageName = GV.getLinkageName();
Michael Gottesmandc42d032013-09-04 04:39:38 +00001574 if (!LinkageName.empty())
Eric Christopher8d45a982013-02-27 23:49:47 +00001575 // From DWARF4: DIEs to which DW_AT_linkage_name may apply include:
1576 // TAG_common_block, TAG_constant, TAG_entry_point, TAG_subprogram and
1577 // TAG_variable.
Eric Christopher6efc0432013-10-19 01:04:47 +00001578 addString(IsStaticMember && VariableSpecDIE ? VariableSpecDIE
1579 : VariableDIE,
1580 dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c2b4be2013-06-01 17:51:14 +00001581 GlobalValue::getRealLinkageName(LinkageName));
Eric Christopher8b4310b2012-11-21 00:34:38 +00001582 } else if (const ConstantInt *CI =
Eric Christopher6efc0432013-10-19 01:04:47 +00001583 dyn_cast_or_null<ConstantInt>(GV.getConstant())) {
Adrian Prantl2e892e42013-04-04 22:56:49 +00001584 // AT_const_value was added when the static member was created. To avoid
Manman Ren945e8282013-02-01 23:54:37 +00001585 // emitting AT_const_value multiple times, we only add AT_const_value when
1586 // it is not a static member.
1587 if (!IsStaticMember)
Manman Renc664d762013-10-05 01:43:03 +00001588 addConstantValue(VariableDIE, CI, isUnsignedDIType(DD, GTy));
Manman Ren945e8282013-02-01 23:54:37 +00001589 } else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001590 addToAccelTable = true;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001591 // GV is a merged global.
1592 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1593 Value *Ptr = CE->getOperand(0);
Eric Christopher0969ddf2013-01-18 22:11:33 +00001594 addOpAddress(Block, Asm->Mang->getSymbol(cast<GlobalValue>(Ptr)));
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001595 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
Eric Christopher6efc0432013-10-19 01:04:47 +00001596 SmallVector<Value *, 3> Idx(CE->op_begin() + 1, CE->op_end());
Eric Christopher8b4310b2012-11-21 00:34:38 +00001597 addUInt(Block, 0, dwarf::DW_FORM_udata,
Eric Christopher6efc0432013-10-19 01:04:47 +00001598 Asm->getDataLayout().getIndexedOffset(Ptr->getType(), Idx));
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001599 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1600 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
1601 }
1602
Eric Christopherd117fbb2011-11-11 01:55:22 +00001603 if (addToAccelTable) {
1604 DIE *AddrDIE = VariableSpecDIE ? VariableSpecDIE : VariableDIE;
1605 addAccelName(GV.getName(), AddrDIE);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001606
Eric Christopherd117fbb2011-11-11 01:55:22 +00001607 // If the linkage name is different than the name, go ahead and output
1608 // that as well into the name table.
1609 if (GV.getLinkageName() != "" && GV.getName() != GV.getLinkageName())
1610 addAccelName(GV.getLinkageName(), AddrDIE);
1611 }
Eric Christophera486f552013-10-16 01:37:49 +00001612
1613 if (!GV.isLocalToUnit())
Eric Christopher91986572013-10-17 02:06:06 +00001614 addGlobalName(GV.getName(), VariableSpecDIE ? VariableSpecDIE : VariableDIE,
1615 GV.getContext());
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001616}
1617
Devang Patel161b2f42011-04-12 23:21:44 +00001618/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
Eric Christopher4d069bf2012-05-22 18:45:24 +00001619void CompileUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR,
1620 DIE *IndexTy) {
Devang Patel161b2f42011-04-12 23:21:44 +00001621 DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
Manman Ren87b110a2013-10-11 23:58:05 +00001622 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, IndexTy);
Devang Patel161b2f42011-04-12 23:21:44 +00001623
Bill Wendling222c2fd2012-12-06 07:38:10 +00001624 // The LowerBound value defines the lower bounds which is typically zero for
1625 // C/C++. The Count value is the number of elements. Values are 64 bit. If
1626 // Count == -1 then the array is unbounded and we do not emit
1627 // DW_AT_lower_bound and DW_AT_upper_bound attributes. If LowerBound == 0 and
1628 // Count == 0, then the array has zero elements in which case we do not emit
1629 // an upper bound.
1630 int64_t LowerBound = SR.getLo();
Bill Wendling6afe4782012-12-06 07:55:19 +00001631 int64_t DefaultLowerBound = getDefaultLowerBound();
Bill Wendling9493dae2012-12-04 21:34:03 +00001632 int64_t Count = SR.getCount();
Devang Patel161b2f42011-04-12 23:21:44 +00001633
Bill Wendling6afe4782012-12-06 07:55:19 +00001634 if (DefaultLowerBound == -1 || LowerBound != DefaultLowerBound)
Bill Wendling222c2fd2012-12-06 07:38:10 +00001635 addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, LowerBound);
1636
1637 if (Count != -1 && Count != 0)
Bill Wendling9493dae2012-12-04 21:34:03 +00001638 // FIXME: An unbounded array should reference the expression that defines
1639 // the array.
Bill Wendling222c2fd2012-12-06 07:38:10 +00001640 addUInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, LowerBound + Count - 1);
Bill Wendling9493dae2012-12-04 21:34:03 +00001641
Devang Patel161b2f42011-04-12 23:21:44 +00001642 Buffer.addChild(DW_Subrange);
1643}
1644
1645/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
Eric Christopher6efc0432013-10-19 01:04:47 +00001646void CompileUnit::constructArrayTypeDIE(DIE &Buffer, DICompositeType *CTy) {
Eric Christopher9a1e0e22013-01-08 01:53:52 +00001647 if (CTy->isVector())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001648 addFlag(&Buffer, dwarf::DW_AT_GNU_vector);
Devang Patel161b2f42011-04-12 23:21:44 +00001649
Eric Christopherdc1363f2013-08-08 07:40:37 +00001650 // Emit the element type.
Manman Ren017ceda2013-10-08 18:42:58 +00001651 addType(&Buffer, resolve(CTy->getTypeDerivedFrom()));
Devang Patel161b2f42011-04-12 23:21:44 +00001652
1653 // Get an anonymous type for index type.
Eric Christopher8cab6ed2013-01-04 21:51:53 +00001654 // FIXME: This type should be passed down from the front end
1655 // as different languages may have different sizes for indexes.
Devang Patel161b2f42011-04-12 23:21:44 +00001656 DIE *IdxTy = getIndexTyDie();
1657 if (!IdxTy) {
1658 // Construct an anonymous type for index type.
1659 IdxTy = new DIE(dwarf::DW_TAG_base_type);
Eric Christopher8cab6ed2013-01-04 21:51:53 +00001660 addString(IdxTy, dwarf::DW_AT_name, "int");
Devang Patel161b2f42011-04-12 23:21:44 +00001661 addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1662 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1663 dwarf::DW_ATE_signed);
1664 addDie(IdxTy);
1665 setIndexTyDie(IdxTy);
1666 }
1667
1668 // Add subranges to array type.
Eric Christopherdc1363f2013-08-08 07:40:37 +00001669 DIArray Elements = CTy->getTypeArray();
Devang Patel161b2f42011-04-12 23:21:44 +00001670 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1671 DIDescriptor Element = Elements.getElement(i);
1672 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1673 constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1674 }
1675}
1676
1677/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
Manman Ren630c3262013-10-18 21:14:19 +00001678DIE *CompileUnit::constructEnumTypeDIE(DIEnumerator ETy, DIE &Buffer) {
Devang Patel161b2f42011-04-12 23:21:44 +00001679 DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
Manman Ren630c3262013-10-18 21:14:19 +00001680 Buffer.addChild(Enumerator);
Devang Patel161b2f42011-04-12 23:21:44 +00001681 StringRef Name = ETy.getName();
Nick Lewycky390c40d2011-10-27 06:44:11 +00001682 addString(Enumerator, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001683 int64_t Value = ETy.getEnumValue();
1684 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
1685 return Enumerator;
1686}
1687
Devang Pateldbc64af2011-08-15 17:24:54 +00001688/// constructContainingTypeDIEs - Construct DIEs for types that contain
1689/// vtables.
1690void CompileUnit::constructContainingTypeDIEs() {
1691 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
Eric Christopher6efc0432013-10-19 01:04:47 +00001692 CE = ContainingTypeMap.end();
1693 CI != CE; ++CI) {
Devang Pateldbc64af2011-08-15 17:24:54 +00001694 DIE *SPDie = CI->first;
1695 const MDNode *N = CI->second;
Eric Christopher6efc0432013-10-19 01:04:47 +00001696 if (!N)
1697 continue;
Eric Christopher3f045002013-10-04 17:08:38 +00001698 DIE *NDie = getDIE(N);
Eric Christopher6efc0432013-10-19 01:04:47 +00001699 if (!NDie)
1700 continue;
Manman Ren87b110a2013-10-11 23:58:05 +00001701 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, NDie);
Devang Pateldbc64af2011-08-15 17:24:54 +00001702 }
1703}
1704
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001705/// constructVariableDIE - Construct a DIE for the given DbgVariable.
Eric Christopher6efc0432013-10-19 01:04:47 +00001706DIE *CompileUnit::constructVariableDIE(DbgVariable *DV, bool isScopeAbstract) {
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001707 StringRef Name = DV->getName();
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001708
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001709 // Define variable debug information entry.
David Blaikie916d49e2013-10-04 23:21:16 +00001710 DIE *VariableDie = new DIE(DV->getTag());
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001711 DbgVariable *AbsVar = DV->getAbstractVariable();
1712 DIE *AbsDIE = AbsVar ? AbsVar->getDIE() : NULL;
Manman Ren742671b2013-05-29 17:16:59 +00001713 if (AbsDIE)
Manman Ren87b110a2013-10-11 23:58:05 +00001714 addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin, AbsDIE);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001715 else {
David Blaikie2883fd42013-08-19 03:34:03 +00001716 if (!Name.empty())
1717 addString(VariableDie, dwarf::DW_AT_name, Name);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001718 addSourceLine(VariableDie, DV->getVariable());
1719 addType(VariableDie, DV->getType());
1720 }
1721
1722 if (DV->isArtificial())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001723 addFlag(VariableDie, dwarf::DW_AT_artificial);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001724
1725 if (isScopeAbstract) {
1726 DV->setDIE(VariableDie);
1727 return VariableDie;
1728 }
1729
1730 // Add variable address.
1731
1732 unsigned Offset = DV->getDotDebugLocOffset();
1733 if (Offset != ~0U) {
Eric Christopherafbe0e22013-06-24 21:34:55 +00001734 addLabel(VariableDie, dwarf::DW_AT_location, dwarf::DW_FORM_data4,
1735 Asm->GetTempSymbol("debug_loc", Offset));
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001736 DV->setDIE(VariableDie);
1737 return VariableDie;
1738 }
1739
Eric Christopher8cf5e742011-10-03 15:49:20 +00001740 // Check if variable is described by a DBG_VALUE instruction.
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001741 if (const MachineInstr *DVInsn = DV->getMInsn()) {
David Blaikie6d9dbd52013-06-16 20:34:15 +00001742 assert(DVInsn->getNumOperands() == 3);
1743 if (DVInsn->getOperand(0).isReg()) {
1744 const MachineOperand RegOp = DVInsn->getOperand(0);
Adrian Prantlb2754912013-07-09 21:44:06 +00001745 // If the second operand is an immediate, this is an indirect value.
Adrian Prantl35176402013-07-09 20:28:37 +00001746 if (DVInsn->getOperand(1).isImm()) {
Eric Christopher6efc0432013-10-19 01:04:47 +00001747 MachineLocation Location(RegOp.getReg(),
1748 DVInsn->getOperand(1).getImm());
Eric Christopherf61dbc12013-06-24 21:07:27 +00001749 addVariableAddress(*DV, VariableDie, Location);
David Blaikie6d9dbd52013-06-16 20:34:15 +00001750 } else if (RegOp.getReg())
Eric Christopherf61dbc12013-06-24 21:07:27 +00001751 addVariableAddress(*DV, VariableDie, MachineLocation(RegOp.getReg()));
David Blaikie6d9dbd52013-06-16 20:34:15 +00001752 } else if (DVInsn->getOperand(0).isImm())
Eric Christophere4721492013-07-03 01:08:30 +00001753 addConstantValue(VariableDie, DVInsn->getOperand(0), DV->getType());
David Blaikie6d9dbd52013-06-16 20:34:15 +00001754 else if (DVInsn->getOperand(0).isFPImm())
Eric Christophere4721492013-07-03 01:08:30 +00001755 addConstantFPValue(VariableDie, DVInsn->getOperand(0));
David Blaikie6d9dbd52013-06-16 20:34:15 +00001756 else if (DVInsn->getOperand(0).isCImm())
Eric Christophere4721492013-07-03 01:08:30 +00001757 addConstantValue(VariableDie, DVInsn->getOperand(0).getCImm(),
Manman Renc664d762013-10-05 01:43:03 +00001758 isUnsignedDIType(DD, DV->getType()));
Eric Christophere4721492013-07-03 01:08:30 +00001759
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001760 DV->setDIE(VariableDie);
1761 return VariableDie;
1762 } else {
1763 // .. else use frame index.
1764 int FI = DV->getFrameIndex();
1765 if (FI != ~0) {
1766 unsigned FrameReg = 0;
1767 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
Eric Christopher6efc0432013-10-19 01:04:47 +00001768 int Offset = TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001769 MachineLocation Location(FrameReg, Offset);
Eric Christopherf61dbc12013-06-24 21:07:27 +00001770 addVariableAddress(*DV, VariableDie, Location);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001771 }
1772 }
1773
1774 DV->setDIE(VariableDie);
1775 return VariableDie;
1776}
1777
Devang Patel161b2f42011-04-12 23:21:44 +00001778/// createMemberDIE - Create new member DIE.
Manman Ren630c3262013-10-18 21:14:19 +00001779DIE *CompileUnit::createMemberDIE(DIDerivedType DT, DIE &Buffer) {
Devang Patel161b2f42011-04-12 23:21:44 +00001780 DIE *MemberDie = new DIE(DT.getTag());
Manman Ren630c3262013-10-18 21:14:19 +00001781 Buffer.addChild(MemberDie);
Devang Patel161b2f42011-04-12 23:21:44 +00001782 StringRef Name = DT.getName();
1783 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001784 addString(MemberDie, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001785
Manman Ren017ceda2013-10-08 18:42:58 +00001786 addType(MemberDie, resolve(DT.getTypeDerivedFrom()));
Devang Patel161b2f42011-04-12 23:21:44 +00001787
1788 addSourceLine(MemberDie, DT);
1789
1790 DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
1791 addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1792
1793 uint64_t Size = DT.getSizeInBits();
Manman Ren43251002013-10-08 18:46:58 +00001794 uint64_t FieldSize = getBaseTypeSize(DD, DT);
Devang Patel161b2f42011-04-12 23:21:44 +00001795
1796 if (Size != FieldSize) {
1797 // Handle bitfield.
Eric Christopher6efc0432013-10-19 01:04:47 +00001798 addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, getBaseTypeSize(DD, DT) >> 3);
Devang Patel161b2f42011-04-12 23:21:44 +00001799 addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1800
1801 uint64_t Offset = DT.getOffsetInBits();
1802 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1803 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1804 uint64_t FieldOffset = (HiMark - FieldSize);
1805 Offset -= FieldOffset;
1806
1807 // Maybe we need to work from the other end.
Micah Villmow3574eca2012-10-08 16:38:25 +00001808 if (Asm->getDataLayout().isLittleEndian())
Devang Patel161b2f42011-04-12 23:21:44 +00001809 Offset = FieldSize - (Offset + Size);
1810 addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
1811
1812 // Here WD_AT_data_member_location points to the anonymous
1813 // field that includes this bit field.
1814 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
1815
1816 } else
1817 // This is not a bitfield.
1818 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1819
Eric Christopher6efc0432013-10-19 01:04:47 +00001820 if (DT.getTag() == dwarf::DW_TAG_inheritance && DT.isVirtual()) {
Devang Patel161b2f42011-04-12 23:21:44 +00001821
1822 // For C++, virtual base classes are not at fixed offset. Use following
1823 // expression to extract appropriate offset from vtable.
1824 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1825
1826 DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
1827 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1828 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1829 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1830 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1831 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1832 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1833 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1834
Eric Christopher6efc0432013-10-19 01:04:47 +00001835 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, VBaseLocationDie);
Devang Patel161b2f42011-04-12 23:21:44 +00001836 } else
1837 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
1838
1839 if (DT.isProtected())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001840 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001841 dwarf::DW_ACCESS_protected);
1842 else if (DT.isPrivate())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001843 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001844 dwarf::DW_ACCESS_private);
1845 // Otherwise C++ member and base classes are considered public.
Eric Christopher8b4310b2012-11-21 00:34:38 +00001846 else
Nick Lewycky13aaca52011-12-13 05:09:11 +00001847 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001848 dwarf::DW_ACCESS_public);
1849 if (DT.isVirtual())
Nick Lewycky798313d2011-12-14 00:56:07 +00001850 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001851 dwarf::DW_VIRTUALITY_virtual);
Devang Patele9db5e22011-04-16 00:11:51 +00001852
1853 // Objective-C properties.
Devang Patel6588abf2012-02-06 17:49:43 +00001854 if (MDNode *PNode = DT.getObjCProperty())
1855 if (DIEEntry *PropertyDie = getDIEEntry(PNode))
Eric Christopher8b4310b2012-11-21 00:34:38 +00001856 MemberDie->addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4,
Devang Patel6588abf2012-02-06 17:49:43 +00001857 PropertyDie);
1858
David Blaikie01bc2b32012-12-13 22:43:07 +00001859 if (DT.isArtificial())
1860 addFlag(MemberDie, dwarf::DW_AT_artificial);
1861
Devang Patel161b2f42011-04-12 23:21:44 +00001862 return MemberDie;
1863}
Eric Christopher6b6061f2013-01-16 01:22:23 +00001864
Manman Ren655a10d2013-10-14 20:33:57 +00001865/// getOrCreateStaticMemberDIE - Create new DIE for C++ static member.
1866DIE *CompileUnit::getOrCreateStaticMemberDIE(const DIDerivedType DT) {
Eric Christopher6b6061f2013-01-16 01:22:23 +00001867 if (!DT.Verify())
1868 return NULL;
1869
Manman Ren655a10d2013-10-14 20:33:57 +00001870 // Construct the context before querying for the existence of the DIE in case
1871 // such construction creates the DIE.
1872 DIE *ContextDIE = getOrCreateContextDIE(resolve(DT.getContext()));
1873 assert(ContextDIE && "Static member should belong to a non-CU context.");
1874
1875 DIE *StaticMemberDIE = getDIE(DT);
1876 if (StaticMemberDIE)
1877 return StaticMemberDIE;
1878
1879 StaticMemberDIE = new DIE(DT.getTag());
1880 // Add to context owner.
1881 ContextDIE->addChild(StaticMemberDIE);
1882
Manman Ren017ceda2013-10-08 18:42:58 +00001883 DIType Ty = resolve(DT.getTypeDerivedFrom());
Eric Christopher6b6061f2013-01-16 01:22:23 +00001884
1885 addString(StaticMemberDIE, dwarf::DW_AT_name, DT.getName());
1886 addType(StaticMemberDIE, Ty);
1887 addSourceLine(StaticMemberDIE, DT);
1888 addFlag(StaticMemberDIE, dwarf::DW_AT_external);
1889 addFlag(StaticMemberDIE, dwarf::DW_AT_declaration);
1890
1891 // FIXME: We could omit private if the parent is a class_type, and
1892 // public if the parent is something else.
1893 if (DT.isProtected())
1894 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1895 dwarf::DW_ACCESS_protected);
1896 else if (DT.isPrivate())
1897 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1898 dwarf::DW_ACCESS_private);
1899 else
1900 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1901 dwarf::DW_ACCESS_public);
1902
1903 if (const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(DT.getConstant()))
Manman Renc664d762013-10-05 01:43:03 +00001904 addConstantValue(StaticMemberDIE, CI, isUnsignedDIType(DD, Ty));
David Blaikie14268412013-01-20 01:18:01 +00001905 if (const ConstantFP *CFP = dyn_cast_or_null<ConstantFP>(DT.getConstant()))
1906 addConstantFPValue(StaticMemberDIE, CFP);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001907
Eric Christopher3f045002013-10-04 17:08:38 +00001908 insertDIE(DT, StaticMemberDIE);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001909 return StaticMemberDIE;
1910}