blob: d8ef1232f2c18bcd82ceea51d24ddad9581129a4 [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.
David Blaikie770530b2013-10-21 17:28:37 +000099void CompileUnit::addFlag(DIE *Die, dwarf::Attribute 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///
David Blaikie770530b2013-10-21 17:28:37 +0000108void CompileUnit::addUInt(DIE *Die, dwarf::Attribute Attribute,
109 Optional<dwarf::Form> Form, uint64_t Integer) {
Eric Christopher6efc0432013-10-19 01:04:47 +0000110 if (!Form)
111 Form = DIEInteger::BestForm(false, Integer);
112 DIEValue *Value = Integer == 1 ? DIEIntegerOne : new (DIEValueAllocator)
113 DIEInteger(Integer);
David Blaikie770530b2013-10-21 17:28:37 +0000114 Die->addValue(Attribute, *Form, Value);
115}
116
117void CompileUnit::addUInt(DIEBlock *Block, dwarf::Form Form, uint64_t Integer) {
118 addUInt(Block, (dwarf::Attribute)0, Form, Integer);
Devang Patel161b2f42011-04-12 23:21:44 +0000119}
120
121/// addSInt - Add an signed integer attribute data and value.
122///
David Blaikie770530b2013-10-21 17:28:37 +0000123void CompileUnit::addSInt(DIE *Die, dwarf::Attribute Attribute,
124 Optional<dwarf::Form> Form, int64_t Integer) {
Eric Christopher6efc0432013-10-19 01:04:47 +0000125 if (!Form)
126 Form = DIEInteger::BestForm(true, Integer);
Devang Patel161b2f42011-04-12 23:21:44 +0000127 DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
David Blaikie770530b2013-10-21 17:28:37 +0000128 Die->addValue(Attribute, *Form, Value);
129}
130
131void CompileUnit::addSInt(DIEBlock *Die, Optional<dwarf::Form> Form,
132 int64_t Integer) {
133 addSInt(Die, (dwarf::Attribute)0, Form, Integer);
Devang Patel161b2f42011-04-12 23:21:44 +0000134}
135
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000136/// addString - Add a string attribute data and value. We always emit a
137/// reference to the string pool instead of immediate strings so that DIEs have
Eric Christopher3cc42202013-01-07 19:32:45 +0000138/// more predictable sizes. In the case of split dwarf we emit an index
139/// into another table which gets us the static offset into the string
140/// table.
David Blaikie770530b2013-10-21 17:28:37 +0000141void CompileUnit::addString(DIE *Die, dwarf::Attribute Attribute, StringRef String) {
Eric Christopher3dee5752013-07-26 17:02:41 +0000142 DIEValue *Value;
David Blaikie770530b2013-10-21 17:28:37 +0000143 dwarf::Form Form;
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000144 if (!DD->useSplitDwarf()) {
145 MCSymbol *Symb = DU->getStringPoolEntry(String);
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000146 if (Asm->needsRelocationsForDwarfStringPool())
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000147 Value = new (DIEValueAllocator) DIELabel(Symb);
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000148 else {
149 MCSymbol *StringPool = DU->getStringPoolSym();
150 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
151 }
Eric Christopher3dee5752013-07-26 17:02:41 +0000152 Form = dwarf::DW_FORM_strp;
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000153 } else {
154 unsigned idx = DU->getStringPoolIndex(String);
Eric Christopher3dee5752013-07-26 17:02:41 +0000155 Value = new (DIEValueAllocator) DIEInteger(idx);
156 Form = dwarf::DW_FORM_GNU_str_index;
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000157 }
Eric Christopher3dee5752013-07-26 17:02:41 +0000158 DIEValue *Str = new (DIEValueAllocator) DIEString(Value, String);
159 Die->addValue(Attribute, Form, Str);
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000160}
161
162/// addLocalString - Add a string attribute data and value. This is guaranteed
163/// to be in the local string pool instead of indirected.
David Blaikie770530b2013-10-21 17:28:37 +0000164void CompileUnit::addLocalString(DIE *Die, dwarf::Attribute Attribute,
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000165 StringRef String) {
Eric Christopher2e5d8702012-12-20 21:58:36 +0000166 MCSymbol *Symb = DU->getStringPoolEntry(String);
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000167 DIEValue *Value;
168 if (Asm->needsRelocationsForDwarfStringPool())
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000169 Value = new (DIEValueAllocator) DIELabel(Symb);
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000170 else {
Eric Christopher2e5d8702012-12-20 21:58:36 +0000171 MCSymbol *StringPool = DU->getStringPoolSym();
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000172 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
Nick Lewycky390c40d2011-10-27 06:44:11 +0000173 }
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000174 Die->addValue(Attribute, dwarf::DW_FORM_strp, Value);
Devang Patel161b2f42011-04-12 23:21:44 +0000175}
176
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000177/// addExpr - Add a Dwarf expression attribute data and value.
Devang Patel161b2f42011-04-12 23:21:44 +0000178///
David Blaikie770530b2013-10-21 17:28:37 +0000179void CompileUnit::addExpr(DIEBlock *Die, dwarf::Form Form, const MCExpr *Expr) {
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000180 DIEValue *Value = new (DIEValueAllocator) DIEExpr(Expr);
David Blaikie770530b2013-10-21 17:28:37 +0000181 Die->addValue((dwarf::Attribute)0, Form, Value);
Devang Patel161b2f42011-04-12 23:21:44 +0000182}
183
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000184/// addLabel - Add a Dwarf label attribute data and value.
185///
David Blaikie770530b2013-10-21 17:28:37 +0000186void CompileUnit::addLabel(DIE *Die, dwarf::Attribute Attribute, dwarf::Form Form,
David Blaikie95e72c92013-06-28 20:05:04 +0000187 const MCSymbol *Label) {
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000188 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
189 Die->addValue(Attribute, Form, Value);
David Blaikie95e72c92013-06-28 20:05:04 +0000190}
191
David Blaikie770530b2013-10-21 17:28:37 +0000192void CompileUnit::addLabel(DIEBlock *Die, dwarf::Form Form,
193 const MCSymbol *Label) {
194 addLabel(Die, (dwarf::Attribute)0, Form, Label);
195}
196
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000197/// addLabelAddress - Add a dwarf label attribute data and value using
198/// DW_FORM_addr or DW_FORM_GNU_addr_index.
199///
David Blaikie770530b2013-10-21 17:28:37 +0000200void CompileUnit::addLabelAddress(DIE *Die, dwarf::Attribute Attribute,
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000201 MCSymbol *Label) {
Alexey Samsonov9d08d692013-10-03 08:54:43 +0000202 if (Label)
203 DD->addArangeLabel(SymbolCU(this, Label));
Richard Mitton5cc319a2013-09-19 23:21:01 +0000204
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000205 if (!DD->useSplitDwarf()) {
206 if (Label != NULL) {
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000207 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000208 Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
209 } else {
210 DIEValue *Value = new (DIEValueAllocator) DIEInteger(0);
211 Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
212 }
213 } else {
214 unsigned idx = DU->getAddrPoolIndex(Label);
215 DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx);
216 Die->addValue(Attribute, dwarf::DW_FORM_GNU_addr_index, Value);
217 }
218}
219
Eric Christopher0969ddf2013-01-18 22:11:33 +0000220/// addOpAddress - Add a dwarf op address data and value using the
221/// form given and an op of either DW_FORM_addr or DW_FORM_GNU_addr_index.
222///
David Blaikie770530b2013-10-21 17:28:37 +0000223void CompileUnit::addOpAddress(DIEBlock *Die, const MCSymbol *Sym) {
Alexey Samsonov9d08d692013-10-03 08:54:43 +0000224 DD->addArangeLabel(SymbolCU(this, Sym));
Eric Christopher0969ddf2013-01-18 22:11:33 +0000225 if (!DD->useSplitDwarf()) {
David Blaikie770530b2013-10-21 17:28:37 +0000226 addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
227 addLabel(Die, dwarf::DW_FORM_udata, Sym);
Eric Christopher0969ddf2013-01-18 22:11:33 +0000228 } else {
David Blaikie770530b2013-10-21 17:28:37 +0000229 addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_addr_index);
230 addUInt(Die, dwarf::DW_FORM_GNU_addr_index, DU->getAddrPoolIndex(Sym));
Eric Christopher0969ddf2013-01-18 22:11:33 +0000231 }
232}
233
Devang Patel161b2f42011-04-12 23:21:44 +0000234/// addDelta - Add a label delta attribute data and value.
235///
David Blaikie770530b2013-10-21 17:28:37 +0000236void CompileUnit::addDelta(DIE *Die, dwarf::Attribute Attribute, dwarf::Form Form,
Devang Patel161b2f42011-04-12 23:21:44 +0000237 const MCSymbol *Hi, const MCSymbol *Lo) {
238 DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
239 Die->addValue(Attribute, Form, Value);
240}
241
242/// addDIEEntry - Add a DIE attribute data and value.
243///
David Blaikie770530b2013-10-21 17:28:37 +0000244void CompileUnit::addDIEEntry(DIE *Die, dwarf::Attribute Attribute, DIE *Entry) {
Manman Ren87b110a2013-10-11 23:58:05 +0000245 // We currently only use ref4.
246 Die->addValue(Attribute, dwarf::DW_FORM_ref4, createDIEEntry(Entry));
Devang Patel161b2f42011-04-12 23:21:44 +0000247}
248
Devang Patel161b2f42011-04-12 23:21:44 +0000249/// addBlock - Add block data.
250///
David Blaikie770530b2013-10-21 17:28:37 +0000251void CompileUnit::addBlock(DIE *Die, dwarf::Attribute Attribute,
Devang Patel161b2f42011-04-12 23:21:44 +0000252 DIEBlock *Block) {
253 Block->ComputeSize(Asm);
254 DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
255 Die->addValue(Attribute, Block->BestForm(), Block);
256}
257
258/// addSourceLine - Add location information to specified debug information
259/// entry.
260void CompileUnit::addSourceLine(DIE *Die, DIVariable V) {
261 // Verify variable.
Manman Rend03d2b22013-07-08 18:33:29 +0000262 if (!V.isVariable())
Devang Patel161b2f42011-04-12 23:21:44 +0000263 return;
Eric Christopher8b4310b2012-11-21 00:34:38 +0000264
Devang Patel161b2f42011-04-12 23:21:44 +0000265 unsigned Line = V.getLineNumber();
266 if (Line == 0)
267 return;
Eric Christopher6efc0432013-10-19 01:04:47 +0000268 unsigned FileID =
269 DD->getOrCreateSourceID(V.getContext().getFilename(),
270 V.getContext().getDirectory(), getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000271 assert(FileID && "Invalid file id");
David Blaikie770530b2013-10-21 17:28:37 +0000272 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
273 addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
Devang Patel161b2f42011-04-12 23:21:44 +0000274}
275
276/// addSourceLine - Add location information to specified debug information
277/// entry.
278void CompileUnit::addSourceLine(DIE *Die, DIGlobalVariable G) {
279 // Verify global variable.
Manman Rend03d2b22013-07-08 18:33:29 +0000280 if (!G.isGlobalVariable())
Devang Patel161b2f42011-04-12 23:21:44 +0000281 return;
282
283 unsigned Line = G.getLineNumber();
284 if (Line == 0)
285 return;
Eric Christopher6efc0432013-10-19 01:04:47 +0000286 unsigned FileID =
287 DD->getOrCreateSourceID(G.getFilename(), G.getDirectory(), getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000288 assert(FileID && "Invalid file id");
David Blaikie770530b2013-10-21 17:28:37 +0000289 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
290 addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
Devang Patel161b2f42011-04-12 23:21:44 +0000291}
292
293/// addSourceLine - Add location information to specified debug information
294/// entry.
295void CompileUnit::addSourceLine(DIE *Die, DISubprogram SP) {
296 // Verify subprogram.
Manman Rend03d2b22013-07-08 18:33:29 +0000297 if (!SP.isSubprogram())
Devang Patel161b2f42011-04-12 23:21:44 +0000298 return;
Eric Christopher2125d5a2012-03-15 23:55:40 +0000299
Devang Patel161b2f42011-04-12 23:21:44 +0000300 // If the line number is 0, don't add it.
Eric Christopher2125d5a2012-03-15 23:55:40 +0000301 unsigned Line = SP.getLineNumber();
302 if (Line == 0)
Devang Patel161b2f42011-04-12 23:21:44 +0000303 return;
304
Eric Christopher6efc0432013-10-19 01:04:47 +0000305 unsigned FileID = DD->getOrCreateSourceID(SP.getFilename(), SP.getDirectory(),
306 getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000307 assert(FileID && "Invalid file id");
David Blaikie770530b2013-10-21 17:28:37 +0000308 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
309 addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
Devang Patel161b2f42011-04-12 23:21:44 +0000310}
311
312/// addSourceLine - Add location information to specified debug information
313/// entry.
314void CompileUnit::addSourceLine(DIE *Die, DIType Ty) {
315 // Verify type.
Manman Rend03d2b22013-07-08 18:33:29 +0000316 if (!Ty.isType())
Devang Patel161b2f42011-04-12 23:21:44 +0000317 return;
318
319 unsigned Line = Ty.getLineNumber();
Eric Christopher2125d5a2012-03-15 23:55:40 +0000320 if (Line == 0)
Devang Patel161b2f42011-04-12 23:21:44 +0000321 return;
Eric Christopher6efc0432013-10-19 01:04:47 +0000322 unsigned FileID = DD->getOrCreateSourceID(Ty.getFilename(), Ty.getDirectory(),
323 getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000324 assert(FileID && "Invalid file id");
David Blaikie770530b2013-10-21 17:28:37 +0000325 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
326 addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
Devang Patel161b2f42011-04-12 23:21:44 +0000327}
328
329/// addSourceLine - Add location information to specified debug information
330/// entry.
Eric Christopherb8ca9882012-03-29 08:42:56 +0000331void CompileUnit::addSourceLine(DIE *Die, DIObjCProperty Ty) {
332 // Verify type.
Manman Rend03d2b22013-07-08 18:33:29 +0000333 if (!Ty.isObjCProperty())
Eric Christopherb8ca9882012-03-29 08:42:56 +0000334 return;
335
336 unsigned Line = Ty.getLineNumber();
337 if (Line == 0)
338 return;
339 DIFile File = Ty.getFile();
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000340 unsigned FileID = DD->getOrCreateSourceID(File.getFilename(),
Manman Ren3de61b42013-03-07 01:42:00 +0000341 File.getDirectory(), getUniqueID());
Eric Christopherb8ca9882012-03-29 08:42:56 +0000342 assert(FileID && "Invalid file id");
David Blaikie770530b2013-10-21 17:28:37 +0000343 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
344 addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
Eric Christopherb8ca9882012-03-29 08:42:56 +0000345}
346
347/// addSourceLine - Add location information to specified debug information
348/// entry.
Devang Patel161b2f42011-04-12 23:21:44 +0000349void CompileUnit::addSourceLine(DIE *Die, DINameSpace NS) {
350 // Verify namespace.
351 if (!NS.Verify())
352 return;
353
354 unsigned Line = NS.getLineNumber();
355 if (Line == 0)
356 return;
357 StringRef FN = NS.getFilename();
358
Eric Christopher6efc0432013-10-19 01:04:47 +0000359 unsigned FileID =
360 DD->getOrCreateSourceID(FN, NS.getDirectory(), getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000361 assert(FileID && "Invalid file id");
David Blaikie770530b2013-10-21 17:28:37 +0000362 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
363 addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
Devang Patel161b2f42011-04-12 23:21:44 +0000364}
365
Eric Christopher8b4310b2012-11-21 00:34:38 +0000366/// addVariableAddress - Add DW_AT_location attribute for a
Devang Patele1cdf842011-04-27 22:45:24 +0000367/// DbgVariable based on provided MachineLocation.
Eric Christopherf61dbc12013-06-24 21:07:27 +0000368void CompileUnit::addVariableAddress(const DbgVariable &DV, DIE *Die,
Devang Patele1cdf842011-04-27 22:45:24 +0000369 MachineLocation Location) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000370 if (DV.variableHasComplexAddress())
Devang Patel161b2f42011-04-12 23:21:44 +0000371 addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
Eric Christopherf61dbc12013-06-24 21:07:27 +0000372 else if (DV.isBlockByrefVariable())
Devang Patel161b2f42011-04-12 23:21:44 +0000373 addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location);
374 else
David Blaikie4532c282013-06-20 00:25:24 +0000375 addAddress(Die, dwarf::DW_AT_location, Location,
Eric Christopherf61dbc12013-06-24 21:07:27 +0000376 DV.getVariable().isIndirect());
Devang Patel161b2f42011-04-12 23:21:44 +0000377}
378
Devang Patel116da2f2011-04-26 19:06:18 +0000379/// addRegisterOp - Add register operand.
David Blaikie770530b2013-10-21 17:28:37 +0000380void CompileUnit::addRegisterOp(DIEBlock *TheDie, unsigned Reg) {
Devang Patel116da2f2011-04-26 19:06:18 +0000381 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
382 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
383 if (DWReg < 32)
David Blaikie770530b2013-10-21 17:28:37 +0000384 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + DWReg);
Devang Patel116da2f2011-04-26 19:06:18 +0000385 else {
David Blaikie770530b2013-10-21 17:28:37 +0000386 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
387 addUInt(TheDie, dwarf::DW_FORM_udata, DWReg);
Devang Patel116da2f2011-04-26 19:06:18 +0000388 }
389}
390
391/// addRegisterOffset - Add register offset.
David Blaikie770530b2013-10-21 17:28:37 +0000392void CompileUnit::addRegisterOffset(DIEBlock *TheDie, unsigned Reg,
393 int64_t Offset) {
Devang Patel116da2f2011-04-26 19:06:18 +0000394 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
395 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
396 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
397 if (Reg == TRI->getFrameRegister(*Asm->MF))
398 // If variable offset is based in frame register then use fbreg.
David Blaikie770530b2013-10-21 17:28:37 +0000399 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
Devang Patel116da2f2011-04-26 19:06:18 +0000400 else if (DWReg < 32)
David Blaikie770530b2013-10-21 17:28:37 +0000401 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DWReg);
Devang Patel116da2f2011-04-26 19:06:18 +0000402 else {
David Blaikie770530b2013-10-21 17:28:37 +0000403 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
404 addUInt(TheDie, dwarf::DW_FORM_udata, DWReg);
Devang Patel116da2f2011-04-26 19:06:18 +0000405 }
David Blaikie770530b2013-10-21 17:28:37 +0000406 addSInt(TheDie, dwarf::DW_FORM_sdata, Offset);
Devang Patel116da2f2011-04-26 19:06:18 +0000407}
408
409/// addAddress - Add an address attribute to a die based on the location
410/// provided.
David Blaikie770530b2013-10-21 17:28:37 +0000411void CompileUnit::addAddress(DIE *Die, dwarf::Attribute Attribute,
David Blaikie4532c282013-06-20 00:25:24 +0000412 const MachineLocation &Location, bool Indirect) {
Devang Patel116da2f2011-04-26 19:06:18 +0000413 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
414
David Blaikie4532c282013-06-20 00:25:24 +0000415 if (Location.isReg() && !Indirect)
Devang Patel116da2f2011-04-26 19:06:18 +0000416 addRegisterOp(Block, Location.getReg());
David Blaikie4532c282013-06-20 00:25:24 +0000417 else {
Devang Patel116da2f2011-04-26 19:06:18 +0000418 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
David Blaikie4532c282013-06-20 00:25:24 +0000419 if (Indirect && !Location.isReg()) {
David Blaikie770530b2013-10-21 17:28:37 +0000420 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
David Blaikie4532c282013-06-20 00:25:24 +0000421 }
422 }
Devang Patel116da2f2011-04-26 19:06:18 +0000423
424 // Now attach the location information to the DIE.
David Blaikie770530b2013-10-21 17:28:37 +0000425 addBlock(Die, Attribute, Block);
Devang Patel116da2f2011-04-26 19:06:18 +0000426}
427
Devang Patel161b2f42011-04-12 23:21:44 +0000428/// addComplexAddress - Start with the address based on the location provided,
429/// and generate the DWARF information necessary to find the actual variable
430/// given the extra address information encoded in the DIVariable, starting from
431/// the starting location. Add the DWARF information to the die.
432///
Eric Christopherf61dbc12013-06-24 21:07:27 +0000433void CompileUnit::addComplexAddress(const DbgVariable &DV, DIE *Die,
David Blaikie770530b2013-10-21 17:28:37 +0000434 dwarf::Attribute Attribute,
Devang Patel161b2f42011-04-12 23:21:44 +0000435 const MachineLocation &Location) {
Devang Patel161b2f42011-04-12 23:21:44 +0000436 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Eric Christopherf61dbc12013-06-24 21:07:27 +0000437 unsigned N = DV.getNumAddrElements();
Devang Patelc26f5442011-04-28 02:22:40 +0000438 unsigned i = 0;
439 if (Location.isReg()) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000440 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
Devang Patelc26f5442011-04-28 02:22:40 +0000441 // If first address element is OpPlus then emit
442 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
Eric Christopherf61dbc12013-06-24 21:07:27 +0000443 addRegisterOffset(Block, Location.getReg(), DV.getAddrElement(1));
Devang Patelc26f5442011-04-28 02:22:40 +0000444 i = 2;
445 } else
446 addRegisterOp(Block, Location.getReg());
Eric Christopher6efc0432013-10-19 01:04:47 +0000447 } else
Devang Patel116da2f2011-04-26 19:06:18 +0000448 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel161b2f42011-04-12 23:21:44 +0000449
Eric Christopher6efc0432013-10-19 01:04:47 +0000450 for (; i < N; ++i) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000451 uint64_t Element = DV.getAddrElement(i);
Devang Patel161b2f42011-04-12 23:21:44 +0000452 if (Element == DIBuilder::OpPlus) {
David Blaikie770530b2013-10-21 17:28:37 +0000453 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
454 addUInt(Block, dwarf::DW_FORM_udata, DV.getAddrElement(++i));
Devang Patel161b2f42011-04-12 23:21:44 +0000455 } else if (Element == DIBuilder::OpDeref) {
Eric Christopher50120762012-05-08 18:56:00 +0000456 if (!Location.isReg())
David Blaikie770530b2013-10-21 17:28:37 +0000457 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Eric Christopher6efc0432013-10-19 01:04:47 +0000458 } else
459 llvm_unreachable("unknown DIBuilder Opcode");
Devang Patel161b2f42011-04-12 23:21:44 +0000460 }
461
462 // Now attach the location information to the DIE.
David Blaikie770530b2013-10-21 17:28:37 +0000463 addBlock(Die, Attribute, Block);
Devang Patel161b2f42011-04-12 23:21:44 +0000464}
465
466/* Byref variables, in Blocks, are declared by the programmer as "SomeType
467 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
468 gives the variable VarName either the struct, or a pointer to the struct, as
469 its type. This is necessary for various behind-the-scenes things the
470 compiler needs to do with by-reference variables in Blocks.
471
472 However, as far as the original *programmer* is concerned, the variable
473 should still have type 'SomeType', as originally declared.
474
475 The function getBlockByrefType dives into the __Block_byref_x_VarName
476 struct to find the original type of the variable, which is then assigned to
477 the variable's Debug Information Entry as its real type. So far, so good.
478 However now the debugger will expect the variable VarName to have the type
479 SomeType. So we need the location attribute for the variable to be an
480 expression that explains to the debugger how to navigate through the
481 pointers and struct to find the actual variable of type SomeType.
482
483 The following function does just that. We start by getting
484 the "normal" location for the variable. This will be the location
485 of either the struct __Block_byref_x_VarName or the pointer to the
486 struct __Block_byref_x_VarName.
487
488 The struct will look something like:
489
490 struct __Block_byref_x_VarName {
491 ... <various fields>
492 struct __Block_byref_x_VarName *forwarding;
493 ... <various other fields>
494 SomeType VarName;
495 ... <maybe more fields>
496 };
497
498 If we are given the struct directly (as our starting point) we
499 need to tell the debugger to:
500
501 1). Add the offset of the forwarding field.
502
503 2). Follow that pointer to get the real __Block_byref_x_VarName
504 struct to use (the real one may have been copied onto the heap).
505
506 3). Add the offset for the field VarName, to find the actual variable.
507
508 If we started with a pointer to the struct, then we need to
509 dereference that pointer first, before the other steps.
510 Translating this into DWARF ops, we will need to append the following
511 to the current location description for the variable:
512
513 DW_OP_deref -- optional, if we start with a pointer
514 DW_OP_plus_uconst <forward_fld_offset>
515 DW_OP_deref
516 DW_OP_plus_uconst <varName_fld_offset>
517
518 That is what this function does. */
519
520/// addBlockByrefAddress - Start with the address based on the location
521/// provided, and generate the DWARF information necessary to find the
522/// actual Block variable (navigating the Block struct) based on the
523/// starting location. Add the DWARF information to the die. For
524/// more information, read large comment just above here.
525///
Eric Christopherf61dbc12013-06-24 21:07:27 +0000526void CompileUnit::addBlockByrefAddress(const DbgVariable &DV, DIE *Die,
David Blaikie770530b2013-10-21 17:28:37 +0000527 dwarf::Attribute Attribute,
Devang Patel161b2f42011-04-12 23:21:44 +0000528 const MachineLocation &Location) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000529 DIType Ty = DV.getType();
Devang Patel161b2f42011-04-12 23:21:44 +0000530 DIType TmpTy = Ty;
Eric Christopher31667622013-08-08 01:41:00 +0000531 uint16_t Tag = Ty.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +0000532 bool isPointer = false;
533
Eric Christopherf61dbc12013-06-24 21:07:27 +0000534 StringRef varName = DV.getName();
Devang Patel161b2f42011-04-12 23:21:44 +0000535
536 if (Tag == dwarf::DW_TAG_pointer_type) {
537 DIDerivedType DTy = DIDerivedType(Ty);
Manman Ren017ceda2013-10-08 18:42:58 +0000538 TmpTy = resolve(DTy.getTypeDerivedFrom());
Devang Patel161b2f42011-04-12 23:21:44 +0000539 isPointer = true;
540 }
541
542 DICompositeType blockStruct = DICompositeType(TmpTy);
543
544 // Find the __forwarding field and the variable field in the __Block_byref
545 // struct.
546 DIArray Fields = blockStruct.getTypeArray();
547 DIDescriptor varField = DIDescriptor();
548 DIDescriptor forwardingField = DIDescriptor();
549
550 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
551 DIDescriptor Element = Fields.getElement(i);
552 DIDerivedType DT = DIDerivedType(Element);
553 StringRef fieldName = DT.getName();
554 if (fieldName == "__forwarding")
555 forwardingField = Element;
556 else if (fieldName == varName)
557 varField = Element;
558 }
559
560 // Get the offsets for the forwarding field and the variable field.
561 unsigned forwardingFieldOffset =
Eric Christopher6efc0432013-10-19 01:04:47 +0000562 DIDerivedType(forwardingField).getOffsetInBits() >> 3;
563 unsigned varFieldOffset = DIDerivedType(varField).getOffsetInBits() >> 3;
Devang Patel161b2f42011-04-12 23:21:44 +0000564
565 // Decode the original location, and use that as the start of the byref
566 // variable's location.
Devang Patel161b2f42011-04-12 23:21:44 +0000567 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
568
Eric Christophercaba2632012-07-04 02:02:18 +0000569 if (Location.isReg())
570 addRegisterOp(Block, Location.getReg());
571 else
572 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel161b2f42011-04-12 23:21:44 +0000573
574 // If we started with a pointer to the __Block_byref... struct, then
575 // the first thing we need to do is dereference the pointer (DW_OP_deref).
576 if (isPointer)
David Blaikie770530b2013-10-21 17:28:37 +0000577 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Devang Patel161b2f42011-04-12 23:21:44 +0000578
579 // Next add the offset for the '__forwarding' field:
580 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
581 // adding the offset if it's 0.
582 if (forwardingFieldOffset > 0) {
David Blaikie770530b2013-10-21 17:28:37 +0000583 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
584 addUInt(Block, dwarf::DW_FORM_udata, forwardingFieldOffset);
Devang Patel161b2f42011-04-12 23:21:44 +0000585 }
586
587 // Now dereference the __forwarding field to get to the real __Block_byref
588 // struct: DW_OP_deref.
David Blaikie770530b2013-10-21 17:28:37 +0000589 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Devang Patel161b2f42011-04-12 23:21:44 +0000590
591 // Now that we've got the real __Block_byref... struct, add the offset
592 // for the variable's field to get to the location of the actual variable:
593 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
594 if (varFieldOffset > 0) {
David Blaikie770530b2013-10-21 17:28:37 +0000595 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
596 addUInt(Block, dwarf::DW_FORM_udata, varFieldOffset);
Devang Patel161b2f42011-04-12 23:21:44 +0000597 }
598
599 // Now attach the location information to the DIE.
David Blaikie770530b2013-10-21 17:28:37 +0000600 addBlock(Die, Attribute, Block);
Devang Patel161b2f42011-04-12 23:21:44 +0000601}
602
Devang Patel4ec14b02011-07-20 21:57:04 +0000603/// isTypeSigned - Return true if the type is signed.
Manman Renc664d762013-10-05 01:43:03 +0000604static bool isTypeSigned(DwarfDebug *DD, DIType Ty, int *SizeInBits) {
Devang Patel4ec14b02011-07-20 21:57:04 +0000605 if (Ty.isDerivedType())
Manman Renc664d762013-10-05 01:43:03 +0000606 return isTypeSigned(DD, DD->resolve(DIDerivedType(Ty).getTypeDerivedFrom()),
607 SizeInBits);
Devang Patel4ec14b02011-07-20 21:57:04 +0000608 if (Ty.isBasicType())
Eric Christopher6efc0432013-10-19 01:04:47 +0000609 if (DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed ||
610 DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed_char) {
Devang Patel4ec14b02011-07-20 21:57:04 +0000611 *SizeInBits = Ty.getSizeInBits();
612 return true;
613 }
614 return false;
615}
616
Manman Renc664d762013-10-05 01:43:03 +0000617/// Return true if type encoding is unsigned.
618static bool isUnsignedDIType(DwarfDebug *DD, DIType Ty) {
619 DIDerivedType DTy(Ty);
620 if (DTy.isDerivedType())
621 return isUnsignedDIType(DD, DD->resolve(DTy.getTypeDerivedFrom()));
622
623 DIBasicType BTy(Ty);
624 if (BTy.isBasicType()) {
625 unsigned Encoding = BTy.getEncoding();
626 if (Encoding == dwarf::DW_ATE_unsigned ||
627 Encoding == dwarf::DW_ATE_unsigned_char ||
628 Encoding == dwarf::DW_ATE_boolean)
629 return true;
630 }
631 return false;
632}
633
634/// If this type is derived from a base type then return base type size.
Manman Ren43251002013-10-08 18:46:58 +0000635static uint64_t getBaseTypeSize(DwarfDebug *DD, DIDerivedType Ty) {
Manman Renc664d762013-10-05 01:43:03 +0000636 unsigned Tag = Ty.getTag();
637
638 if (Tag != dwarf::DW_TAG_member && Tag != dwarf::DW_TAG_typedef &&
639 Tag != dwarf::DW_TAG_const_type && Tag != dwarf::DW_TAG_volatile_type &&
640 Tag != dwarf::DW_TAG_restrict_type)
641 return Ty.getSizeInBits();
642
643 DIType BaseType = DD->resolve(Ty.getTypeDerivedFrom());
644
645 // If this type is not derived from any type then take conservative approach.
646 if (!BaseType.isValid())
647 return Ty.getSizeInBits();
648
649 // If this is a derived type, go ahead and get the base type, unless it's a
650 // reference then it's just the size of the field. Pointer types have no need
651 // of this since they're a different type of qualification on the type.
652 if (BaseType.getTag() == dwarf::DW_TAG_reference_type ||
653 BaseType.getTag() == dwarf::DW_TAG_rvalue_reference_type)
654 return Ty.getSizeInBits();
655
656 if (BaseType.isDerivedType())
Manman Ren43251002013-10-08 18:46:58 +0000657 return getBaseTypeSize(DD, DIDerivedType(BaseType));
Manman Renc664d762013-10-05 01:43:03 +0000658
659 return BaseType.getSizeInBits();
660}
661
Devang Patel161b2f42011-04-12 23:21:44 +0000662/// addConstantValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000663void CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO,
Devang Patelb58128e2011-05-27 16:45:18 +0000664 DIType Ty) {
David Blaikie4de9d722013-05-10 21:52:07 +0000665 // FIXME: This is a bit conservative/simple - it emits negative values at
666 // their maximum bit width which is a bit unfortunate (& doesn't prefer
667 // udata/sdata over dataN as suggested by the DWARF spec)
Nick Lewycky746cb672011-10-26 22:55:33 +0000668 assert(MO.isImm() && "Invalid machine operand!");
Devang Patel4ec14b02011-07-20 21:57:04 +0000669 int SizeInBits = -1;
Manman Renc664d762013-10-05 01:43:03 +0000670 bool SignedConstant = isTypeSigned(DD, Ty, &SizeInBits);
David Blaikie770530b2013-10-21 17:28:37 +0000671 dwarf::Form Form;
Devang Patel72f0d9c2011-05-27 18:15:52 +0000672
Eric Christopher7b2ee392013-08-27 23:49:04 +0000673 // If we're a signed constant definitely use sdata.
674 if (SignedConstant) {
675 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, MO.getImm());
676 return;
677 }
678
679 // Else use data for now unless it's larger than we can deal with.
680 switch (SizeInBits) {
681 case 8:
682 Form = dwarf::DW_FORM_data1;
683 break;
684 case 16:
685 Form = dwarf::DW_FORM_data2;
686 break;
687 case 32:
688 Form = dwarf::DW_FORM_data4;
689 break;
690 case 64:
691 Form = dwarf::DW_FORM_data8;
692 break;
693 default:
694 Form = dwarf::DW_FORM_udata;
695 addUInt(Die, dwarf::DW_AT_const_value, Form, MO.getImm());
696 return;
697 }
698 addUInt(Die, dwarf::DW_AT_const_value, Form, MO.getImm());
Devang Patel161b2f42011-04-12 23:21:44 +0000699}
700
701/// addConstantFPValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000702void CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
Eric Christopher6efc0432013-10-19 01:04:47 +0000703 assert(MO.isFPImm() && "Invalid machine operand!");
Devang Patel161b2f42011-04-12 23:21:44 +0000704 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
705 APFloat FPImm = MO.getFPImm()->getValueAPF();
706
707 // Get the raw data form of the floating point.
708 const APInt FltVal = FPImm.bitcastToAPInt();
Eric Christopher6efc0432013-10-19 01:04:47 +0000709 const char *FltPtr = (const char *)FltVal.getRawData();
Devang Patel161b2f42011-04-12 23:21:44 +0000710
711 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
Micah Villmow3574eca2012-10-08 16:38:25 +0000712 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel161b2f42011-04-12 23:21:44 +0000713 int Incr = (LittleEndian ? 1 : -1);
714 int Start = (LittleEndian ? 0 : NumBytes - 1);
715 int Stop = (LittleEndian ? NumBytes : -1);
716
717 // Output the constant to DWARF one byte at a time.
718 for (; Start != Stop; Start += Incr)
David Blaikie770530b2013-10-21 17:28:37 +0000719 addUInt(Block, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +0000720 (unsigned char)0xFF & FltPtr[Start]);
721
David Blaikie770530b2013-10-21 17:28:37 +0000722 addBlock(Die, dwarf::DW_AT_const_value, Block);
Devang Patel161b2f42011-04-12 23:21:44 +0000723}
724
David Blaikie14268412013-01-20 01:18:01 +0000725/// addConstantFPValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000726void CompileUnit::addConstantFPValue(DIE *Die, const ConstantFP *CFP) {
Eric Christopher7b2ee392013-08-27 23:49:04 +0000727 // Pass this down to addConstantValue as an unsigned bag of bits.
728 addConstantValue(Die, CFP->getValueAPF().bitcastToAPInt(), true);
David Blaikie14268412013-01-20 01:18:01 +0000729}
730
Devang Patel161b2f42011-04-12 23:21:44 +0000731/// addConstantValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000732void CompileUnit::addConstantValue(DIE *Die, const ConstantInt *CI,
Devang Patel161b2f42011-04-12 23:21:44 +0000733 bool Unsigned) {
Eric Christophere4721492013-07-03 01:08:30 +0000734 addConstantValue(Die, CI->getValue(), Unsigned);
David Blaikie14268412013-01-20 01:18:01 +0000735}
736
737// addConstantValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000738void CompileUnit::addConstantValue(DIE *Die, const APInt &Val, bool Unsigned) {
David Blaikie14268412013-01-20 01:18:01 +0000739 unsigned CIBitWidth = Val.getBitWidth();
Devang Pateld6a81362011-05-28 00:39:18 +0000740 if (CIBitWidth <= 64) {
Eric Christopher7b2ee392013-08-27 23:49:04 +0000741 // If we're a signed constant definitely use sdata.
742 if (!Unsigned) {
743 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata,
744 Val.getSExtValue());
745 return;
Devang Pateld6a81362011-05-28 00:39:18 +0000746 }
Eric Christopher7b2ee392013-08-27 23:49:04 +0000747
748 // Else use data for now unless it's larger than we can deal with.
David Blaikie770530b2013-10-21 17:28:37 +0000749 dwarf::Form Form;
Eric Christopher7b2ee392013-08-27 23:49:04 +0000750 switch (CIBitWidth) {
751 case 8:
752 Form = dwarf::DW_FORM_data1;
753 break;
754 case 16:
755 Form = dwarf::DW_FORM_data2;
756 break;
757 case 32:
758 Form = dwarf::DW_FORM_data4;
759 break;
760 case 64:
761 Form = dwarf::DW_FORM_data8;
762 break;
763 default:
764 addUInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
765 Val.getZExtValue());
766 return;
767 }
768 addUInt(Die, dwarf::DW_AT_const_value, Form, Val.getZExtValue());
Eric Christophere4721492013-07-03 01:08:30 +0000769 return;
Devang Patel161b2f42011-04-12 23:21:44 +0000770 }
771
772 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
773
774 // Get the raw data form of the large APInt.
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000775 const uint64_t *Ptr64 = Val.getRawData();
Devang Patel161b2f42011-04-12 23:21:44 +0000776
777 int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
Micah Villmow3574eca2012-10-08 16:38:25 +0000778 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel161b2f42011-04-12 23:21:44 +0000779
780 // Output the constant to DWARF one byte at a time.
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000781 for (int i = 0; i < NumBytes; i++) {
782 uint8_t c;
783 if (LittleEndian)
784 c = Ptr64[i / 8] >> (8 * (i & 7));
785 else
786 c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7));
David Blaikie770530b2013-10-21 17:28:37 +0000787 addUInt(Block, dwarf::DW_FORM_data1, c);
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000788 }
Devang Patel161b2f42011-04-12 23:21:44 +0000789
David Blaikie770530b2013-10-21 17:28:37 +0000790 addBlock(Die, dwarf::DW_AT_const_value, Block);
Devang Patel161b2f42011-04-12 23:21:44 +0000791}
792
Eric Christopher6c3bb942013-04-22 07:47:40 +0000793/// addTemplateParams - Add template parameters into buffer.
Devang Patel161b2f42011-04-12 23:21:44 +0000794void CompileUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
795 // Add template parameters.
796 for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) {
797 DIDescriptor Element = TParams.getElement(i);
798 if (Element.isTemplateTypeParameter())
Eric Christopher6efc0432013-10-19 01:04:47 +0000799 getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter(Element),
800 Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +0000801 else if (Element.isTemplateValueParameter())
Eric Christopher6efc0432013-10-19 01:04:47 +0000802 getOrCreateTemplateValueParameterDIE(DITemplateValueParameter(Element),
803 Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +0000804 }
Devang Patel161b2f42011-04-12 23:21:44 +0000805}
Nick Lewycky746cb672011-10-26 22:55:33 +0000806
Eric Christopher6b6061f2013-01-16 01:22:23 +0000807/// getOrCreateContextDIE - Get context owner's DIE.
Eric Christopherccb66362013-10-04 23:49:26 +0000808DIE *CompileUnit::getOrCreateContextDIE(DIScope Context) {
Eric Christopher6b6061f2013-01-16 01:22:23 +0000809 if (Context.isType())
810 return getOrCreateTypeDIE(DIType(Context));
811 else if (Context.isNameSpace())
812 return getOrCreateNameSpace(DINameSpace(Context));
813 else if (Context.isSubprogram())
814 return getOrCreateSubprogramDIE(DISubprogram(Context));
Eric Christopher6c3bb942013-04-22 07:47:40 +0000815 else
Eric Christopher6b6061f2013-01-16 01:22:23 +0000816 return getDIE(Context);
817}
818
Devang Patel161b2f42011-04-12 23:21:44 +0000819/// addToContextOwner - Add Die into the list of its context owner's children.
Eric Christopherccb66362013-10-04 23:49:26 +0000820void CompileUnit::addToContextOwner(DIE *Die, DIScope Context) {
David Blaikiee5830c42013-10-03 20:07:20 +0000821 assert(!Die->getParent());
822 if (DIE *ContextDIE = getOrCreateContextDIE(Context)) {
823 if (Die->getParent()) {
824 // While creating the context, if this is a type member, we will have
825 // added the child to the context already.
826 assert(Die->getParent() == ContextDIE);
827 return;
828 }
Devang Patel161b2f42011-04-12 23:21:44 +0000829 ContextDIE->addChild(Die);
David Blaikiee5830c42013-10-03 20:07:20 +0000830 } else
Devang Patel161b2f42011-04-12 23:21:44 +0000831 addDie(Die);
832}
833
834/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
835/// given DIType.
Devang Patel94c7ddb2011-08-16 22:09:43 +0000836DIE *CompileUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
837 DIType Ty(TyNode);
Manman Rend03d2b22013-07-08 18:33:29 +0000838 if (!Ty.isType())
Devang Patel94c7ddb2011-08-16 22:09:43 +0000839 return NULL;
Eric Christopher3f045002013-10-04 17:08:38 +0000840 DIE *TyDIE = getDIE(Ty);
Devang Patel161b2f42011-04-12 23:21:44 +0000841 if (TyDIE)
842 return TyDIE;
843
844 // Create new type.
David Blaikie916d49e2013-10-04 23:21:16 +0000845 TyDIE = new DIE(Ty.getTag());
Eric Christopher3f045002013-10-04 17:08:38 +0000846 insertDIE(Ty, TyDIE);
Devang Patel161b2f42011-04-12 23:21:44 +0000847 if (Ty.isBasicType())
848 constructTypeDIE(*TyDIE, DIBasicType(Ty));
849 else if (Ty.isCompositeType())
850 constructTypeDIE(*TyDIE, DICompositeType(Ty));
851 else {
852 assert(Ty.isDerivedType() && "Unknown kind of DIType");
853 constructTypeDIE(*TyDIE, DIDerivedType(Ty));
854 }
Eric Christopher1b3f9192011-11-10 19:52:58 +0000855 // If this is a named finished type then include it in the list of types
856 // for the accelerator tables.
Eric Christopherc36145f2012-01-06 04:35:23 +0000857 if (!Ty.getName().empty() && !Ty.isForwardDecl()) {
858 bool IsImplementation = 0;
859 if (Ty.isCompositeType()) {
860 DICompositeType CT(Ty);
Eric Christophere0167892012-01-06 23:03:37 +0000861 // A runtime language of 0 actually means C/C++ and that any
862 // non-negative value is some version of Objective-C/C++.
Eric Christopher6efc0432013-10-19 01:04:47 +0000863 IsImplementation = (CT.getRunTimeLang() == 0) || CT.isObjcClassComplete();
Eric Christopherc36145f2012-01-06 04:35:23 +0000864 }
Eric Christopher577056f2013-09-05 18:20:16 +0000865 unsigned Flags = IsImplementation ? dwarf::DW_FLAG_type_implementation : 0;
Eric Christophere0167892012-01-06 23:03:37 +0000866 addAccelType(Ty.getName(), std::make_pair(TyDIE, Flags));
Eric Christopherc36145f2012-01-06 04:35:23 +0000867 }
Eric Christopher8b4310b2012-11-21 00:34:38 +0000868
Eric Christophereee74fb2013-10-05 00:27:02 +0000869 addToContextOwner(TyDIE, resolve(Ty.getContext()));
Devang Patel161b2f42011-04-12 23:21:44 +0000870 return TyDIE;
871}
872
873/// addType - Add a new type attribute to the specified entity.
David Blaikie770530b2013-10-21 17:28:37 +0000874void CompileUnit::addType(DIE *Entity, DIType Ty, dwarf::Attribute Attribute) {
Eric Christopherdc1363f2013-08-08 07:40:37 +0000875 assert(Ty && "Trying to add a type that doesn't exist?");
Devang Patel161b2f42011-04-12 23:21:44 +0000876
877 // Check for pre-existence.
878 DIEEntry *Entry = getDIEEntry(Ty);
879 // If it exists then use the existing value.
880 if (Entry) {
Eric Christopher3f045002013-10-04 17:08:38 +0000881 Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
Devang Patel161b2f42011-04-12 23:21:44 +0000882 return;
883 }
884
885 // Construct type.
886 DIE *Buffer = getOrCreateTypeDIE(Ty);
887
888 // Set up proxy.
889 Entry = createDIEEntry(Buffer);
890 insertDIEEntry(Ty, Entry);
Eric Christopher3f045002013-10-04 17:08:38 +0000891 Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
Devang Patele9ae06c2011-05-31 22:56:51 +0000892
893 // If this is a complete composite type then include it in the
894 // list of global types.
Devang Patelc20bdf12011-06-01 00:23:24 +0000895 addGlobalType(Ty);
Devang Patel66658e42011-05-31 23:30:30 +0000896}
897
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000898// Accelerator table mutators - add each name along with its companion
899// DIE to the proper table while ensuring that the name that we're going
900// to reference is in the string table. We do this since the names we
901// add may not only be identical to the names in the DIE.
902void CompileUnit::addAccelName(StringRef Name, DIE *Die) {
903 DU->getStringPoolEntry(Name);
Eric Christopher734334e2013-09-23 22:59:11 +0000904 std::vector<DIE *> &DIEs = AccelNames[Name];
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000905 DIEs.push_back(Die);
906}
907
908void CompileUnit::addAccelObjC(StringRef Name, DIE *Die) {
909 DU->getStringPoolEntry(Name);
Eric Christopher734334e2013-09-23 22:59:11 +0000910 std::vector<DIE *> &DIEs = AccelObjC[Name];
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000911 DIEs.push_back(Die);
912}
913
914void CompileUnit::addAccelNamespace(StringRef Name, DIE *Die) {
915 DU->getStringPoolEntry(Name);
Eric Christopher734334e2013-09-23 22:59:11 +0000916 std::vector<DIE *> &DIEs = AccelNamespace[Name];
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000917 DIEs.push_back(Die);
918}
919
920void CompileUnit::addAccelType(StringRef Name, std::pair<DIE *, unsigned> Die) {
921 DU->getStringPoolEntry(Name);
922 std::vector<std::pair<DIE *, unsigned> > &DIEs = AccelTypes[Name];
923 DIEs.push_back(Die);
924}
925
Eric Christopher50d37a42013-09-20 22:20:55 +0000926/// addGlobalName - Add a new global name to the compile unit.
Eric Christopher91986572013-10-17 02:06:06 +0000927void CompileUnit::addGlobalName(StringRef Name, DIE *Die, DIScope Context) {
Eric Christopher0ab64392013-10-19 01:04:42 +0000928 std::string FullName = getParentContextString(Context) + Name.str();
Eric Christopher91986572013-10-17 02:06:06 +0000929 GlobalNames[FullName] = Die;
Eric Christopher50d37a42013-09-20 22:20:55 +0000930}
931
Devang Patel66658e42011-05-31 23:30:30 +0000932/// addGlobalType - Add a new global type to the compile unit.
933///
Devang Patelc20bdf12011-06-01 00:23:24 +0000934void CompileUnit::addGlobalType(DIType Ty) {
Eric Christophereee74fb2013-10-05 00:27:02 +0000935 DIScope Context = resolve(Ty.getContext());
Eric Christopher5a634742013-09-23 23:15:58 +0000936 if (!Ty.getName().empty() && !Ty.isForwardDecl() &&
Eric Christopher734334e2013-09-23 22:59:11 +0000937 (!Context || Context.isCompileUnit() || Context.isFile() ||
938 Context.isNameSpace()))
Eric Christopher91986572013-10-17 02:06:06 +0000939 if (DIEEntry *Entry = getDIEEntry(Ty)) {
Eric Christopher0ab64392013-10-19 01:04:42 +0000940 std::string FullName =
941 getParentContextString(Context) + Ty.getName().str();
Eric Christopher6efc0432013-10-19 01:04:47 +0000942 GlobalTypes[FullName] = Entry->getEntry();
Eric Christopher91986572013-10-17 02:06:06 +0000943 }
944}
945
946/// getParentContextString - Walks the metadata parent chain in a language
947/// specific manner (using the compile unit language) and returns
948/// it as a string. This is done at the metadata level because DIEs may
949/// not currently have been added to the parent context and walking the
950/// DIEs looking for names is more expensive than walking the metadata.
951std::string CompileUnit::getParentContextString(DIScope Context) const {
952 if (!Context)
953 return "";
954
955 // FIXME: Decide whether to implement this for non-C++ languages.
956 if (getLanguage() != dwarf::DW_LANG_C_plus_plus)
957 return "";
958
Eric Christopher0ab64392013-10-19 01:04:42 +0000959 std::string CS;
Eric Christopher91986572013-10-17 02:06:06 +0000960 SmallVector<DIScope, 1> Parents;
961 while (!Context.isCompileUnit()) {
962 Parents.push_back(Context);
963 if (Context.getContext())
964 Context = resolve(Context.getContext());
965 else
966 // Structure, etc types will have a NULL context if they're at the top
967 // level.
968 break;
969 }
970
971 // Reverse iterate over our list to go from the outermost construct to the
972 // innermost.
973 for (SmallVectorImpl<DIScope>::reverse_iterator I = Parents.rbegin(),
974 E = Parents.rend();
975 I != E; ++I) {
976 DIScope Ctx = *I;
977 StringRef Name = Ctx.getName();
Eric Christopher0ab64392013-10-19 01:04:42 +0000978 if (!Name.empty()) {
Eric Christopher91986572013-10-17 02:06:06 +0000979 CS += Name;
980 CS += "::";
981 }
982 }
983 return CS;
Devang Patel161b2f42011-04-12 23:21:44 +0000984}
985
Eric Christopher22852c72013-10-05 00:05:51 +0000986/// addPubTypes - Add subprogram argument types for pubtypes section.
Devang Patel31c5d052011-05-06 16:57:54 +0000987void CompileUnit::addPubTypes(DISubprogram SP) {
988 DICompositeType SPTy = SP.getType();
Eric Christopher31667622013-08-08 01:41:00 +0000989 uint16_t SPTag = SPTy.getTag();
Devang Patel31c5d052011-05-06 16:57:54 +0000990 if (SPTag != dwarf::DW_TAG_subroutine_type)
991 return;
992
993 DIArray Args = SPTy.getTypeArray();
994 for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
995 DIType ATy(Args.getElement(i));
Manman Rend03d2b22013-07-08 18:33:29 +0000996 if (!ATy.isType())
Devang Patel31c5d052011-05-06 16:57:54 +0000997 continue;
Devang Patelc20bdf12011-06-01 00:23:24 +0000998 addGlobalType(ATy);
Devang Patel31c5d052011-05-06 16:57:54 +0000999 }
1000}
1001
Devang Patel161b2f42011-04-12 23:21:44 +00001002/// constructTypeDIE - Construct basic type die from DIBasicType.
1003void CompileUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
1004 // Get core information.
1005 StringRef Name = BTy.getName();
Devang Patel161b2f42011-04-12 23:21:44 +00001006 // Add name if not anonymous or intermediate type.
1007 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001008 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel734a67c2011-09-14 23:13:28 +00001009
David Blaikie916d49e2013-10-04 23:21:16 +00001010 // An unspecified type only has a name attribute.
1011 if (BTy.getTag() == dwarf::DW_TAG_unspecified_type)
Devang Patel734a67c2011-09-14 23:13:28 +00001012 return;
Devang Patel734a67c2011-09-14 23:13:28 +00001013
Nick Lewycky746cb672011-10-26 22:55:33 +00001014 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
Devang Patel30d409c2012-02-07 23:33:58 +00001015 BTy.getEncoding());
Devang Patel734a67c2011-09-14 23:13:28 +00001016
Devang Patel161b2f42011-04-12 23:21:44 +00001017 uint64_t Size = BTy.getSizeInBits() >> 3;
David Blaikie770530b2013-10-21 17:28:37 +00001018 addUInt(&Buffer, dwarf::DW_AT_byte_size, None, Size);
Devang Patel161b2f42011-04-12 23:21:44 +00001019}
1020
1021/// constructTypeDIE - Construct derived type die from DIDerivedType.
1022void CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
1023 // Get core information.
1024 StringRef Name = DTy.getName();
1025 uint64_t Size = DTy.getSizeInBits() >> 3;
David Blaikie916d49e2013-10-04 23:21:16 +00001026 uint16_t Tag = Buffer.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +00001027
1028 // Map to main type, void will not have a type.
Manman Ren017ceda2013-10-08 18:42:58 +00001029 DIType FromTy = resolve(DTy.getTypeDerivedFrom());
Eric Christopherdc1363f2013-08-08 07:40:37 +00001030 if (FromTy)
1031 addType(&Buffer, FromTy);
Devang Patel161b2f42011-04-12 23:21:44 +00001032
1033 // Add name if not anonymous or intermediate type.
1034 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001035 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001036
1037 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopher35f225a2012-02-21 22:25:53 +00001038 if (Size && Tag != dwarf::DW_TAG_pointer_type)
David Blaikie770530b2013-10-21 17:28:37 +00001039 addUInt(&Buffer, dwarf::DW_AT_byte_size, None, Size);
Devang Patel161b2f42011-04-12 23:21:44 +00001040
David Blaikie62fdfb52013-01-07 05:51:15 +00001041 if (Tag == dwarf::DW_TAG_ptr_to_member_type)
Eric Christopher6efc0432013-10-19 01:04:47 +00001042 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type,
1043 getOrCreateTypeDIE(resolve(DTy.getClassType())));
Devang Patel161b2f42011-04-12 23:21:44 +00001044 // Add source line info if available and TyDesc is not a forward declaration.
1045 if (!DTy.isForwardDecl())
1046 addSourceLine(&Buffer, DTy);
1047}
1048
Eric Christopher3dee5752013-07-26 17:02:41 +00001049/// Return true if the type is appropriately scoped to be contained inside
1050/// its own type unit.
Manman Ren18eb2452013-09-09 19:23:58 +00001051static bool isTypeUnitScoped(DIType Ty, const DwarfDebug *DD) {
Manman Ren2c9905a2013-09-09 19:47:11 +00001052 DIScope Parent = DD->resolve(Ty.getContext());
Eric Christopher3dee5752013-07-26 17:02:41 +00001053 while (Parent) {
1054 // Don't generate a hash for anything scoped inside a function.
1055 if (Parent.isSubprogram())
1056 return false;
Manman Rene72aba92013-09-09 22:35:23 +00001057 Parent = DD->resolve(Parent.getContext());
Eric Christopher3dee5752013-07-26 17:02:41 +00001058 }
1059 return true;
1060}
1061
1062/// Return true if the type should be split out into a type unit.
Manman Ren18eb2452013-09-09 19:23:58 +00001063static bool shouldCreateTypeUnit(DICompositeType CTy, const DwarfDebug *DD) {
Eric Christopher31667622013-08-08 01:41:00 +00001064 uint16_t Tag = CTy.getTag();
Eric Christopher3dee5752013-07-26 17:02:41 +00001065
1066 switch (Tag) {
1067 case dwarf::DW_TAG_structure_type:
1068 case dwarf::DW_TAG_union_type:
1069 case dwarf::DW_TAG_enumeration_type:
1070 case dwarf::DW_TAG_class_type:
1071 // If this is a class, structure, union, or enumeration type
David Blaikiec4eb3532013-10-04 23:52:02 +00001072 // that is a definition (not a declaration), and not scoped
Eric Christopher3dee5752013-07-26 17:02:41 +00001073 // inside a function then separate this out as a type unit.
David Blaikiec4eb3532013-10-04 23:52:02 +00001074 return !CTy.isForwardDecl() && isTypeUnitScoped(CTy, DD);
Eric Christopher3dee5752013-07-26 17:02:41 +00001075 default:
David Blaikiec4eb3532013-10-04 23:52:02 +00001076 return false;
Eric Christopher3dee5752013-07-26 17:02:41 +00001077 }
1078}
1079
Devang Patel161b2f42011-04-12 23:21:44 +00001080/// constructTypeDIE - Construct type DIE from DICompositeType.
1081void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
1082 // Get core information.
1083 StringRef Name = CTy.getName();
1084
1085 uint64_t Size = CTy.getSizeInBits() >> 3;
David Blaikie916d49e2013-10-04 23:21:16 +00001086 uint16_t Tag = Buffer.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +00001087
1088 switch (Tag) {
Devang Patel161b2f42011-04-12 23:21:44 +00001089 case dwarf::DW_TAG_array_type:
1090 constructArrayTypeDIE(Buffer, &CTy);
1091 break;
1092 case dwarf::DW_TAG_enumeration_type: {
1093 DIArray Elements = CTy.getTypeArray();
1094
1095 // Add enumerators to enumeration type.
1096 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
Devang Patel161b2f42011-04-12 23:21:44 +00001097 DIDescriptor Enum(Elements.getElement(i));
Manman Ren630c3262013-10-18 21:14:19 +00001098 if (Enum.isEnumerator())
Benjamin Kramer53c9e5f2013-10-19 16:32:15 +00001099 constructEnumTypeDIE(DIEnumerator(Enum), Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +00001100 }
Manman Ren017ceda2013-10-08 18:42:58 +00001101 DIType DTy = resolve(CTy.getTypeDerivedFrom());
Eric Christopher37c107b2013-08-08 07:40:42 +00001102 if (DTy) {
Eric Christopherbb0f6ea2012-05-23 00:09:20 +00001103 addType(&Buffer, DTy);
Eric Christopher371d9582013-10-04 22:40:10 +00001104 addFlag(&Buffer, dwarf::DW_AT_enum_class);
Eric Christopherbb0f6ea2012-05-23 00:09:20 +00001105 }
Eric Christopher6efc0432013-10-19 01:04:47 +00001106 } break;
Devang Patel161b2f42011-04-12 23:21:44 +00001107 case dwarf::DW_TAG_subroutine_type: {
Eric Christopherdc1363f2013-08-08 07:40:37 +00001108 // Add return type. A void return won't have a type.
Devang Patel161b2f42011-04-12 23:21:44 +00001109 DIArray Elements = CTy.getTypeArray();
1110 DIDescriptor RTy = Elements.getElement(0);
Eric Christopherdc1363f2013-08-08 07:40:37 +00001111 if (RTy)
1112 addType(&Buffer, DIType(RTy));
Devang Patel161b2f42011-04-12 23:21:44 +00001113
1114 bool isPrototyped = true;
1115 // Add arguments.
1116 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
1117 DIDescriptor Ty = Elements.getElement(i);
1118 if (Ty.isUnspecifiedParameter()) {
1119 DIE *Arg = new DIE(dwarf::DW_TAG_unspecified_parameters);
1120 Buffer.addChild(Arg);
1121 isPrototyped = false;
1122 } else {
1123 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1124 addType(Arg, DIType(Ty));
David Blaikieaaf2e632013-01-29 19:35:24 +00001125 if (DIType(Ty).isArtificial())
1126 addFlag(Arg, dwarf::DW_AT_artificial);
Devang Patel161b2f42011-04-12 23:21:44 +00001127 Buffer.addChild(Arg);
1128 }
1129 }
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001130 // Add prototype flag if we're dealing with a C language and the
1131 // function has been prototyped.
Eric Christopher7b878952013-08-26 23:50:38 +00001132 uint16_t Language = DICompileUnit(Node).getLanguage();
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001133 if (isPrototyped &&
Eric Christopher6efc0432013-10-19 01:04:47 +00001134 (Language == dwarf::DW_LANG_C89 || Language == dwarf::DW_LANG_C99 ||
Eric Christopher4d069bf2012-05-22 18:45:24 +00001135 Language == dwarf::DW_LANG_ObjC))
Eric Christopher873cf0a2012-08-24 01:14:27 +00001136 addFlag(&Buffer, dwarf::DW_AT_prototyped);
Eric Christopher6efc0432013-10-19 01:04:47 +00001137 } break;
Devang Patel161b2f42011-04-12 23:21:44 +00001138 case dwarf::DW_TAG_structure_type:
1139 case dwarf::DW_TAG_union_type:
1140 case dwarf::DW_TAG_class_type: {
Devang Patel161b2f42011-04-12 23:21:44 +00001141 // Add elements to structure type.
David Blaikiec8b93552013-08-01 20:30:22 +00001142 DIArray Elements = CTy.getTypeArray();
1143 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
Devang Patel161b2f42011-04-12 23:21:44 +00001144 DIDescriptor Element = Elements.getElement(i);
1145 DIE *ElemDie = NULL;
1146 if (Element.isSubprogram()) {
1147 DISubprogram SP(Element);
Devang Pateldbc64af2011-08-15 17:24:54 +00001148 ElemDie = getOrCreateSubprogramDIE(DISubprogram(Element));
Devang Patel161b2f42011-04-12 23:21:44 +00001149 if (SP.isProtected())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001150 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001151 dwarf::DW_ACCESS_protected);
1152 else if (SP.isPrivate())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001153 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001154 dwarf::DW_ACCESS_private);
Eric Christopher8b4310b2012-11-21 00:34:38 +00001155 else
Nick Lewycky13aaca52011-12-13 05:09:11 +00001156 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Eric Christopher6efc0432013-10-19 01:04:47 +00001157 dwarf::DW_ACCESS_public);
Devang Patel161b2f42011-04-12 23:21:44 +00001158 if (SP.isExplicit())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001159 addFlag(ElemDie, dwarf::DW_AT_explicit);
Eric Christopher663e0cf2012-03-28 07:34:31 +00001160 } else if (Element.isDerivedType()) {
Eric Christopher4d069bf2012-05-22 18:45:24 +00001161 DIDerivedType DDTy(Element);
1162 if (DDTy.getTag() == dwarf::DW_TAG_friend) {
1163 ElemDie = new DIE(dwarf::DW_TAG_friend);
Manman Ren017ceda2013-10-08 18:42:58 +00001164 addType(ElemDie, resolve(DDTy.getTypeDerivedFrom()),
Manman Renc664d762013-10-05 01:43:03 +00001165 dwarf::DW_AT_friend);
Manman Ren655a10d2013-10-14 20:33:57 +00001166 Buffer.addChild(ElemDie);
1167 } else if (DDTy.isStaticMember()) {
1168 ElemDie = getOrCreateStaticMemberDIE(DDTy);
1169 } else {
Manman Ren630c3262013-10-18 21:14:19 +00001170 ElemDie = createMemberDIE(DDTy, Buffer);
Manman Ren655a10d2013-10-14 20:33:57 +00001171 }
Eric Christopher663e0cf2012-03-28 07:34:31 +00001172 } else if (Element.isObjCProperty()) {
Devang Patel30d409c2012-02-07 23:33:58 +00001173 DIObjCProperty Property(Element);
1174 ElemDie = new DIE(Property.getTag());
1175 StringRef PropertyName = Property.getObjCPropertyName();
1176 addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
Eric Christopher4d069bf2012-05-22 18:45:24 +00001177 addType(ElemDie, Property.getType());
1178 addSourceLine(ElemDie, Property);
Devang Patel30d409c2012-02-07 23:33:58 +00001179 StringRef GetterName = Property.getObjCPropertyGetterName();
1180 if (!GetterName.empty())
1181 addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
1182 StringRef SetterName = Property.getObjCPropertySetterName();
1183 if (!SetterName.empty())
1184 addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
1185 unsigned PropertyAttributes = 0;
Devang Patel9e11eb12012-02-04 01:30:32 +00001186 if (Property.isReadOnlyObjCProperty())
1187 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
1188 if (Property.isReadWriteObjCProperty())
1189 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
1190 if (Property.isAssignObjCProperty())
1191 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
1192 if (Property.isRetainObjCProperty())
1193 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
1194 if (Property.isCopyObjCProperty())
1195 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
1196 if (Property.isNonAtomicObjCProperty())
1197 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
1198 if (PropertyAttributes)
David Blaikie770530b2013-10-21 17:28:37 +00001199 addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, None,
Eric Christopher6efc0432013-10-19 01:04:47 +00001200 PropertyAttributes);
Devang Patel6588abf2012-02-06 17:49:43 +00001201
Devang Patel30d409c2012-02-07 23:33:58 +00001202 DIEEntry *Entry = getDIEEntry(Element);
1203 if (!Entry) {
1204 Entry = createDIEEntry(ElemDie);
1205 insertDIEEntry(Element, Entry);
1206 }
David Blaikiee5830c42013-10-03 20:07:20 +00001207 Buffer.addChild(ElemDie);
Devang Patel9e11eb12012-02-04 01:30:32 +00001208 } else
Devang Patel161b2f42011-04-12 23:21:44 +00001209 continue;
Devang Patel161b2f42011-04-12 23:21:44 +00001210 }
1211
1212 if (CTy.isAppleBlockExtension())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001213 addFlag(&Buffer, dwarf::DW_AT_APPLE_block);
Devang Patel161b2f42011-04-12 23:21:44 +00001214
Eric Christophereee74fb2013-10-05 00:27:02 +00001215 DICompositeType ContainingType(resolve(CTy.getContainingType()));
Devang Patel161b2f42011-04-12 23:21:44 +00001216 if (DIDescriptor(ContainingType).isCompositeType())
Manman Ren87b110a2013-10-11 23:58:05 +00001217 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type,
Devang Patel161b2f42011-04-12 23:21:44 +00001218 getOrCreateTypeDIE(DIType(ContainingType)));
Devang Patel161b2f42011-04-12 23:21:44 +00001219
Devang Patel201e6cd2011-05-12 21:29:42 +00001220 if (CTy.isObjcClassComplete())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001221 addFlag(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type);
Devang Patelb11f80e2011-05-12 19:06:16 +00001222
Eric Christopher1a8e8862011-12-16 23:42:42 +00001223 // Add template parameters to a class, structure or union types.
1224 // FIXME: The support isn't in the metadata for this yet.
1225 if (Tag == dwarf::DW_TAG_class_type ||
Eric Christopher6efc0432013-10-19 01:04:47 +00001226 Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type)
Devang Patel161b2f42011-04-12 23:21:44 +00001227 addTemplateParams(Buffer, CTy.getTemplateParams());
1228
1229 break;
1230 }
1231 default:
1232 break;
1233 }
1234
1235 // Add name if not anonymous or intermediate type.
1236 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001237 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001238
Eric Christopher4a5d8392012-05-22 18:45:18 +00001239 if (Tag == dwarf::DW_TAG_enumeration_type ||
Eric Christopher6efc0432013-10-19 01:04:47 +00001240 Tag == dwarf::DW_TAG_class_type || Tag == dwarf::DW_TAG_structure_type ||
Eric Christopher4a5d8392012-05-22 18:45:18 +00001241 Tag == dwarf::DW_TAG_union_type) {
Devang Patel161b2f42011-04-12 23:21:44 +00001242 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopherfc4199b2012-06-01 00:22:32 +00001243 // TODO: Do we care about size for enum forward declarations?
Devang Patel161b2f42011-04-12 23:21:44 +00001244 if (Size)
David Blaikie770530b2013-10-21 17:28:37 +00001245 addUInt(&Buffer, dwarf::DW_AT_byte_size, None, Size);
Eric Christopherfc4199b2012-06-01 00:22:32 +00001246 else if (!CTy.isForwardDecl())
Devang Patel161b2f42011-04-12 23:21:44 +00001247 // Add zero size if it is not a forward declaration.
David Blaikie770530b2013-10-21 17:28:37 +00001248 addUInt(&Buffer, dwarf::DW_AT_byte_size, None, 0);
Eric Christopherfc4199b2012-06-01 00:22:32 +00001249
1250 // If we're a forward decl, say so.
1251 if (CTy.isForwardDecl())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001252 addFlag(&Buffer, dwarf::DW_AT_declaration);
Devang Patel161b2f42011-04-12 23:21:44 +00001253
1254 // Add source line info if available.
1255 if (!CTy.isForwardDecl())
1256 addSourceLine(&Buffer, CTy);
Eric Christopher89388952012-03-07 00:15:19 +00001257
1258 // No harm in adding the runtime language to the declaration.
1259 unsigned RLang = CTy.getRunTimeLang();
1260 if (RLang)
Eric Christopher6efc0432013-10-19 01:04:47 +00001261 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class, dwarf::DW_FORM_data1,
1262 RLang);
Devang Patel161b2f42011-04-12 23:21:44 +00001263 }
Eric Christopher3dee5752013-07-26 17:02:41 +00001264 // If this is a type applicable to a type unit it then add it to the
1265 // list of types we'll compute a hash for later.
Manman Ren18eb2452013-09-09 19:23:58 +00001266 if (shouldCreateTypeUnit(CTy, DD))
Eric Christopher3dee5752013-07-26 17:02:41 +00001267 DD->addTypeUnitType(&Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +00001268}
1269
Eric Christopher8b4310b2012-11-21 00:34:38 +00001270/// getOrCreateTemplateTypeParameterDIE - Find existing DIE or create new DIE
Devang Patel161b2f42011-04-12 23:21:44 +00001271/// for the given DITemplateTypeParameter.
1272DIE *
Manman Ren630c3262013-10-18 21:14:19 +00001273CompileUnit::getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP,
1274 DIE &Buffer) {
Devang Patel161b2f42011-04-12 23:21:44 +00001275 DIE *ParamDIE = getDIE(TP);
1276 if (ParamDIE)
1277 return ParamDIE;
1278
1279 ParamDIE = new DIE(dwarf::DW_TAG_template_type_parameter);
Manman Ren630c3262013-10-18 21:14:19 +00001280 Buffer.addChild(ParamDIE);
Eric Christopher76ef79f2013-08-08 08:09:43 +00001281 // Add the type if it exists, it could be void and therefore no type.
1282 if (TP.getType())
Manman Renb4d9c112013-10-09 19:46:28 +00001283 addType(ParamDIE, resolve(TP.getType()));
David Blaikiee88939c2013-06-22 18:59:11 +00001284 if (!TP.getName().empty())
1285 addString(ParamDIE, dwarf::DW_AT_name, TP.getName());
Devang Patel161b2f42011-04-12 23:21:44 +00001286 return ParamDIE;
1287}
1288
Eric Christopher8b4310b2012-11-21 00:34:38 +00001289/// getOrCreateTemplateValueParameterDIE - Find existing DIE or create new DIE
Devang Patel161b2f42011-04-12 23:21:44 +00001290/// for the given DITemplateValueParameter.
1291DIE *
Manman Ren630c3262013-10-18 21:14:19 +00001292CompileUnit::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter VP,
1293 DIE &Buffer) {
Eric Christopherafdd1f82013-08-08 07:40:31 +00001294 DIE *ParamDIE = getDIE(VP);
Devang Patel161b2f42011-04-12 23:21:44 +00001295 if (ParamDIE)
1296 return ParamDIE;
1297
Eric Christopherafdd1f82013-08-08 07:40:31 +00001298 ParamDIE = new DIE(VP.getTag());
Manman Ren630c3262013-10-18 21:14:19 +00001299 Buffer.addChild(ParamDIE);
Eric Christopherdc1363f2013-08-08 07:40:37 +00001300
1301 // Add the type if there is one, template template and template parameter
1302 // packs will not have a type.
Eric Christopheref2d9192013-10-21 17:48:51 +00001303 if (VP.getTag() == dwarf::DW_TAG_template_value_parameter)
Manman Renb4d9c112013-10-09 19:46:28 +00001304 addType(ParamDIE, resolve(VP.getType()));
Eric Christopherafdd1f82013-08-08 07:40:31 +00001305 if (!VP.getName().empty())
1306 addString(ParamDIE, dwarf::DW_AT_name, VP.getName());
1307 if (Value *Val = VP.getValue()) {
David Blaikie4de9d722013-05-10 21:52:07 +00001308 if (ConstantInt *CI = dyn_cast<ConstantInt>(Val))
Manman Renb4d9c112013-10-09 19:46:28 +00001309 addConstantValue(ParamDIE, CI,
1310 isUnsignedDIType(DD, resolve(VP.getType())));
David Blaikie4de9d722013-05-10 21:52:07 +00001311 else if (GlobalValue *GV = dyn_cast<GlobalValue>(Val)) {
1312 // For declaration non-type template parameters (such as global values and
1313 // functions)
1314 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1315 addOpAddress(Block, Asm->Mang->getSymbol(GV));
1316 // Emit DW_OP_stack_value to use the address as the immediate value of the
1317 // parameter, rather than a pointer to it.
David Blaikie770530b2013-10-21 17:28:37 +00001318 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value);
1319 addBlock(ParamDIE, dwarf::DW_AT_location, Block);
Eric Christopherafdd1f82013-08-08 07:40:31 +00001320 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_template_param) {
David Blaikiee88939c2013-06-22 18:59:11 +00001321 assert(isa<MDString>(Val));
1322 addString(ParamDIE, dwarf::DW_AT_GNU_template_name,
1323 cast<MDString>(Val)->getString());
Eric Christopherafdd1f82013-08-08 07:40:31 +00001324 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_parameter_pack) {
David Blaikiee88939c2013-06-22 18:59:11 +00001325 assert(isa<MDNode>(Val));
1326 DIArray A(cast<MDNode>(Val));
1327 addTemplateParams(*ParamDIE, A);
David Blaikie4de9d722013-05-10 21:52:07 +00001328 }
1329 }
1330
Devang Patel161b2f42011-04-12 23:21:44 +00001331 return ParamDIE;
1332}
1333
Devang Patel31c5d052011-05-06 16:57:54 +00001334/// getOrCreateNameSpace - Create a DIE for DINameSpace.
1335DIE *CompileUnit::getOrCreateNameSpace(DINameSpace NS) {
1336 DIE *NDie = getDIE(NS);
1337 if (NDie)
1338 return NDie;
1339 NDie = new DIE(dwarf::DW_TAG_namespace);
1340 insertDIE(NS, NDie);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001341 if (!NS.getName().empty()) {
Nick Lewycky390c40d2011-10-27 06:44:11 +00001342 addString(NDie, dwarf::DW_AT_name, NS.getName());
Eric Christopher09ac3d82011-11-07 09:24:32 +00001343 addAccelNamespace(NS.getName(), NDie);
Eric Christopher91986572013-10-17 02:06:06 +00001344 addGlobalName(NS.getName(), NDie, NS.getContext());
Eric Christopher09ac3d82011-11-07 09:24:32 +00001345 } else
1346 addAccelNamespace("(anonymous namespace)", NDie);
Devang Patel31c5d052011-05-06 16:57:54 +00001347 addSourceLine(NDie, NS);
1348 addToContextOwner(NDie, NS.getContext());
1349 return NDie;
1350}
1351
Devang Pateldbc64af2011-08-15 17:24:54 +00001352/// getOrCreateSubprogramDIE - Create new DIE using SP.
1353DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
David Blaikiec32f2332013-10-04 01:39:59 +00001354 // Construct the context before querying for the existence of the DIE in case
1355 // such construction creates the DIE (as is the case for member function
1356 // declarations).
Manman Renb8e48a62013-10-10 18:40:01 +00001357 DIE *ContextDIE = getOrCreateContextDIE(resolve(SP.getContext()));
David Blaikiec32f2332013-10-04 01:39:59 +00001358 if (!ContextDIE)
1359 ContextDIE = CUDie.get();
1360
Eric Christopher3f045002013-10-04 17:08:38 +00001361 DIE *SPDie = getDIE(SP);
Devang Pateldbc64af2011-08-15 17:24:54 +00001362 if (SPDie)
1363 return SPDie;
1364
Peter Collingbourne27302f02012-05-27 18:36:44 +00001365 SPDie = new DIE(dwarf::DW_TAG_subprogram);
1366
1367 // DW_TAG_inlined_subroutine may refer to this DIE.
Eric Christopher3f045002013-10-04 17:08:38 +00001368 insertDIE(SP, SPDie);
Peter Collingbourne27302f02012-05-27 18:36:44 +00001369
Rafael Espindola01b55b42011-11-10 22:34:29 +00001370 DISubprogram SPDecl = SP.getFunctionDeclaration();
1371 DIE *DeclDie = NULL;
Manman Ren250f4e82013-10-23 22:12:26 +00001372 if (SPDecl.isSubprogram())
Rafael Espindola01b55b42011-11-10 22:34:29 +00001373 DeclDie = getOrCreateSubprogramDIE(SPDecl);
Rafael Espindola01b55b42011-11-10 22:34:29 +00001374
Devang Pateldbc64af2011-08-15 17:24:54 +00001375 // Add function template parameters.
1376 addTemplateParams(*SPDie, SP.getTemplateParams());
1377
Devang Pateldbc64af2011-08-15 17:24:54 +00001378 // If this DIE is going to refer declaration info using AT_specification
Eric Christopherc4968752013-05-09 00:42:33 +00001379 // then there is no need to add other attributes.
Rafael Espindola01b55b42011-11-10 22:34:29 +00001380 if (DeclDie) {
1381 // Refer function declaration directly.
Manman Ren87b110a2013-10-11 23:58:05 +00001382 addDIEEntry(SPDie, dwarf::DW_AT_specification, DeclDie);
Rafael Espindola01b55b42011-11-10 22:34:29 +00001383
Eric Christopherbdfed162013-10-17 01:31:12 +00001384 // Add subprogram definitions to the CU die directly.
Manman Ren57a964b2013-10-18 20:52:22 +00001385 addDie(SPDie);
Eric Christopherbdfed162013-10-17 01:31:12 +00001386
Devang Pateldbc64af2011-08-15 17:24:54 +00001387 return SPDie;
Rafael Espindola01b55b42011-11-10 22:34:29 +00001388 }
Devang Pateldbc64af2011-08-15 17:24:54 +00001389
Eric Christopherbdfed162013-10-17 01:31:12 +00001390 // Add to context owner.
1391 ContextDIE->addChild(SPDie);
1392
Eric Christophercbbd5b12012-08-23 22:52:55 +00001393 // Add the linkage name if we have one.
Michael Gottesmandc42d032013-09-04 04:39:38 +00001394 StringRef LinkageName = SP.getLinkageName();
1395 if (!LinkageName.empty())
Eric Christophercbbd5b12012-08-23 22:52:55 +00001396 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c2b4be2013-06-01 17:51:14 +00001397 GlobalValue::getRealLinkageName(LinkageName));
Eric Christophercbbd5b12012-08-23 22:52:55 +00001398
Devang Pateldbc64af2011-08-15 17:24:54 +00001399 // Constructors and operators for anonymous aggregates do not have names.
1400 if (!SP.getName().empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001401 addString(SPDie, dwarf::DW_AT_name, SP.getName());
Devang Pateldbc64af2011-08-15 17:24:54 +00001402
1403 addSourceLine(SPDie, SP);
1404
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001405 // Add the prototype if we have a prototype and we have a C like
1406 // language.
Eric Christopher7b878952013-08-26 23:50:38 +00001407 uint16_t Language = DICompileUnit(Node).getLanguage();
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001408 if (SP.isPrototyped() &&
Eric Christopher6efc0432013-10-19 01:04:47 +00001409 (Language == dwarf::DW_LANG_C89 || Language == dwarf::DW_LANG_C99 ||
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001410 Language == dwarf::DW_LANG_ObjC))
Eric Christopher873cf0a2012-08-24 01:14:27 +00001411 addFlag(SPDie, dwarf::DW_AT_prototyped);
Devang Pateldbc64af2011-08-15 17:24:54 +00001412
Devang Pateldbc64af2011-08-15 17:24:54 +00001413 DICompositeType SPTy = SP.getType();
David Blaikie3d331842013-05-22 23:22:18 +00001414 assert(SPTy.getTag() == dwarf::DW_TAG_subroutine_type &&
1415 "the type of a subprogram should be a subroutine");
Devang Pateldbc64af2011-08-15 17:24:54 +00001416
David Blaikie3d331842013-05-22 23:22:18 +00001417 DIArray Args = SPTy.getTypeArray();
Eric Christopheref2d9192013-10-21 17:48:51 +00001418 // Add a return type. If this is a type like a C/C++ void type we don't add a
1419 // return type.
Eric Christopherdc1363f2013-08-08 07:40:37 +00001420 if (Args.getElement(0))
1421 addType(SPDie, DIType(Args.getElement(0)));
Devang Pateldbc64af2011-08-15 17:24:54 +00001422
1423 unsigned VK = SP.getVirtuality();
1424 if (VK) {
Nick Lewycky798313d2011-12-14 00:56:07 +00001425 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
Devang Pateldbc64af2011-08-15 17:24:54 +00001426 DIEBlock *Block = getDIEBlock();
David Blaikie770530b2013-10-21 17:28:37 +00001427 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1428 addUInt(Block, dwarf::DW_FORM_udata, SP.getVirtualIndex());
1429 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, Block);
Devang Pateldbc64af2011-08-15 17:24:54 +00001430 ContainingTypeMap.insert(std::make_pair(SPDie,
Eric Christophereee74fb2013-10-05 00:27:02 +00001431 resolve(SP.getContainingType())));
Devang Pateldbc64af2011-08-15 17:24:54 +00001432 }
1433
1434 if (!SP.isDefinition()) {
Eric Christopher873cf0a2012-08-24 01:14:27 +00001435 addFlag(SPDie, dwarf::DW_AT_declaration);
Eric Christopher8b4310b2012-11-21 00:34:38 +00001436
Devang Pateldbc64af2011-08-15 17:24:54 +00001437 // Add arguments. Do not add arguments for subprogram definition. They will
1438 // be handled while processing variables.
Eric Christopher6efc0432013-10-19 01:04:47 +00001439 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
David Blaikie3d331842013-05-22 23:22:18 +00001440 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1441 DIType ATy = DIType(Args.getElement(i));
1442 addType(Arg, ATy);
1443 if (ATy.isArtificial())
1444 addFlag(Arg, dwarf::DW_AT_artificial);
1445 SPDie->addChild(Arg);
1446 }
Devang Pateldbc64af2011-08-15 17:24:54 +00001447 }
1448
1449 if (SP.isArtificial())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001450 addFlag(SPDie, dwarf::DW_AT_artificial);
Devang Pateldbc64af2011-08-15 17:24:54 +00001451
1452 if (!SP.isLocalToUnit())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001453 addFlag(SPDie, dwarf::DW_AT_external);
Devang Pateldbc64af2011-08-15 17:24:54 +00001454
1455 if (SP.isOptimized())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001456 addFlag(SPDie, dwarf::DW_AT_APPLE_optimized);
Devang Pateldbc64af2011-08-15 17:24:54 +00001457
1458 if (unsigned isa = Asm->getISAEncoding()) {
1459 addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1460 }
1461
1462 return SPDie;
1463}
1464
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001465// Return const expression if value is a GEP to access merged global
1466// constant. e.g.
1467// i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
1468static const ConstantExpr *getMergedGlobalExpr(const Value *V) {
1469 const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
1470 if (!CE || CE->getNumOperands() != 3 ||
1471 CE->getOpcode() != Instruction::GetElementPtr)
1472 return NULL;
1473
1474 // First operand points to a global struct.
1475 Value *Ptr = CE->getOperand(0);
1476 if (!isa<GlobalValue>(Ptr) ||
1477 !isa<StructType>(cast<PointerType>(Ptr->getType())->getElementType()))
1478 return NULL;
1479
1480 // Second operand is zero.
1481 const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
1482 if (!CI || !CI->isZero())
1483 return NULL;
1484
1485 // Third operand is offset.
1486 if (!isa<ConstantInt>(CE->getOperand(2)))
1487 return NULL;
1488
1489 return CE;
1490}
1491
1492/// createGlobalVariableDIE - create global variable DIE.
1493void CompileUnit::createGlobalVariableDIE(const MDNode *N) {
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001494 // Check for pre-existence.
Devang Patel49e2f032011-08-18 22:21:50 +00001495 if (getDIE(N))
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001496 return;
1497
Devang Patel49e2f032011-08-18 22:21:50 +00001498 DIGlobalVariable GV(N);
Manman Rend03d2b22013-07-08 18:33:29 +00001499 if (!GV.isGlobalVariable())
Devang Patel28bea082011-08-18 23:17:55 +00001500 return;
1501
Eric Christopherccb66362013-10-04 23:49:26 +00001502 DIScope GVContext = GV.getContext();
Eric Christopher6b6061f2013-01-16 01:22:23 +00001503 DIType GTy = GV.getType();
1504
1505 // If this is a static data member definition, some attributes belong
1506 // to the declaration DIE.
1507 DIE *VariableDIE = NULL;
Manman Ren945e8282013-02-01 23:54:37 +00001508 bool IsStaticMember = false;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001509 DIDerivedType SDMDecl = GV.getStaticDataMemberDeclaration();
1510 if (SDMDecl.Verify()) {
1511 assert(SDMDecl.isStaticMember() && "Expected static member decl");
1512 // We need the declaration DIE that is in the static member's class.
Manman Ren655a10d2013-10-14 20:33:57 +00001513 VariableDIE = getOrCreateStaticMemberDIE(SDMDecl);
Manman Ren945e8282013-02-01 23:54:37 +00001514 IsStaticMember = true;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001515 }
1516
1517 // If this is not a static data member definition, create the variable
1518 // DIE and add the initial set of attributes to it.
1519 if (!VariableDIE) {
1520 VariableDIE = new DIE(GV.getTag());
1521 // Add to map.
1522 insertDIE(N, VariableDIE);
1523
1524 // Add name and type.
1525 addString(VariableDIE, dwarf::DW_AT_name, GV.getDisplayName());
1526 addType(VariableDIE, GTy);
1527
1528 // Add scoping info.
Eric Christophera486f552013-10-16 01:37:49 +00001529 if (!GV.isLocalToUnit())
Eric Christopher6b6061f2013-01-16 01:22:23 +00001530 addFlag(VariableDIE, dwarf::DW_AT_external);
1531
1532 // Add line number info.
1533 addSourceLine(VariableDIE, GV);
1534 // Add to context owner.
1535 addToContextOwner(VariableDIE, GVContext);
1536 }
1537
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001538 // Add location.
Eric Christopher09ac3d82011-11-07 09:24:32 +00001539 bool addToAccelTable = false;
Eric Christopherd61c34b2011-11-11 03:16:32 +00001540 DIE *VariableSpecDIE = NULL;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001541 bool isGlobalVariable = GV.getGlobal() != NULL;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001542 if (isGlobalVariable) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001543 addToAccelTable = true;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001544 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
David Blaikie59eaa382013-06-28 20:05:11 +00001545 const MCSymbol *Sym = Asm->Mang->getSymbol(GV.getGlobal());
1546 if (GV.getGlobal()->isThreadLocal()) {
1547 // FIXME: Make this work with -gsplit-dwarf.
1548 unsigned PointerSize = Asm->getDataLayout().getPointerSize();
1549 assert((PointerSize == 4 || PointerSize == 8) &&
1550 "Add support for other sizes if necessary");
Ulrich Weigand716a94f2013-07-02 18:47:09 +00001551 const MCExpr *Expr =
David Blaikie8fed05e2013-07-01 23:55:52 +00001552 Asm->getObjFileLowering().getDebugThreadLocalSymbol(Sym);
David Blaikie59eaa382013-06-28 20:05:11 +00001553 // Based on GCC's support for TLS:
David Blaikie8fed05e2013-07-01 23:55:52 +00001554 if (!DD->useSplitDwarf()) {
1555 // 1) Start with a constNu of the appropriate pointer size
David Blaikie770530b2013-10-21 17:28:37 +00001556 addUInt(Block, dwarf::DW_FORM_data1,
David Blaikie8fed05e2013-07-01 23:55:52 +00001557 PointerSize == 4 ? dwarf::DW_OP_const4u : dwarf::DW_OP_const8u);
Richard Mitton379f76e2013-10-07 18:39:18 +00001558 // 2) containing the (relocated) offset of the TLS variable
1559 // within the module's TLS block.
David Blaikie770530b2013-10-21 17:28:37 +00001560 addExpr(Block, dwarf::DW_FORM_udata, Expr);
David Blaikie8fed05e2013-07-01 23:55:52 +00001561 } else {
David Blaikie770530b2013-10-21 17:28:37 +00001562 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_const_index);
1563 addUInt(Block, dwarf::DW_FORM_udata, DU->getAddrPoolIndex(Expr));
David Blaikie8fed05e2013-07-01 23:55:52 +00001564 }
Richard Mitton379f76e2013-10-07 18:39:18 +00001565 // 3) followed by a custom OP to make the debugger do a TLS lookup.
David Blaikie770530b2013-10-21 17:28:37 +00001566 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_push_tls_address);
David Blaikie59eaa382013-06-28 20:05:11 +00001567 } else
1568 addOpAddress(Block, Sym);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001569 // Do not create specification DIE if context is either compile unit
1570 // or a subprogram.
Devang Patel1dd4e562011-09-21 23:41:11 +00001571 if (GVContext && GV.isDefinition() && !GVContext.isCompileUnit() &&
Manman Ren02d29672013-09-09 19:05:21 +00001572 !GVContext.isFile() && !DD->isSubprogramContext(GVContext)) {
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001573 // Create specification DIE.
Eric Christopherd117fbb2011-11-11 01:55:22 +00001574 VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
Manman Ren87b110a2013-10-11 23:58:05 +00001575 addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification, VariableDIE);
David Blaikie770530b2013-10-21 17:28:37 +00001576 addBlock(VariableSpecDIE, dwarf::DW_AT_location, Block);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001577 // A static member's declaration is already flagged as such.
1578 if (!SDMDecl.Verify())
1579 addFlag(VariableDIE, dwarf::DW_AT_declaration);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001580 addDie(VariableSpecDIE);
1581 } else {
David Blaikie770530b2013-10-21 17:28:37 +00001582 addBlock(VariableDIE, dwarf::DW_AT_location, Block);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001583 }
Michael Gottesmandc42d032013-09-04 04:39:38 +00001584 // Add the linkage name.
Eric Christopher6b6061f2013-01-16 01:22:23 +00001585 StringRef LinkageName = GV.getLinkageName();
Michael Gottesmandc42d032013-09-04 04:39:38 +00001586 if (!LinkageName.empty())
Eric Christopher8d45a982013-02-27 23:49:47 +00001587 // From DWARF4: DIEs to which DW_AT_linkage_name may apply include:
1588 // TAG_common_block, TAG_constant, TAG_entry_point, TAG_subprogram and
1589 // TAG_variable.
Eric Christopher6efc0432013-10-19 01:04:47 +00001590 addString(IsStaticMember && VariableSpecDIE ? VariableSpecDIE
1591 : VariableDIE,
1592 dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c2b4be2013-06-01 17:51:14 +00001593 GlobalValue::getRealLinkageName(LinkageName));
Eric Christopher8b4310b2012-11-21 00:34:38 +00001594 } else if (const ConstantInt *CI =
Eric Christopher6efc0432013-10-19 01:04:47 +00001595 dyn_cast_or_null<ConstantInt>(GV.getConstant())) {
Adrian Prantl2e892e42013-04-04 22:56:49 +00001596 // AT_const_value was added when the static member was created. To avoid
Manman Ren945e8282013-02-01 23:54:37 +00001597 // emitting AT_const_value multiple times, we only add AT_const_value when
1598 // it is not a static member.
1599 if (!IsStaticMember)
Manman Renc664d762013-10-05 01:43:03 +00001600 addConstantValue(VariableDIE, CI, isUnsignedDIType(DD, GTy));
Manman Ren945e8282013-02-01 23:54:37 +00001601 } else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001602 addToAccelTable = true;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001603 // GV is a merged global.
1604 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1605 Value *Ptr = CE->getOperand(0);
Eric Christopher0969ddf2013-01-18 22:11:33 +00001606 addOpAddress(Block, Asm->Mang->getSymbol(cast<GlobalValue>(Ptr)));
David Blaikie770530b2013-10-21 17:28:37 +00001607 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
Eric Christopher6efc0432013-10-19 01:04:47 +00001608 SmallVector<Value *, 3> Idx(CE->op_begin() + 1, CE->op_end());
David Blaikie770530b2013-10-21 17:28:37 +00001609 addUInt(Block, dwarf::DW_FORM_udata,
Eric Christopher6efc0432013-10-19 01:04:47 +00001610 Asm->getDataLayout().getIndexedOffset(Ptr->getType(), Idx));
David Blaikie770530b2013-10-21 17:28:37 +00001611 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1612 addBlock(VariableDIE, dwarf::DW_AT_location, Block);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001613 }
1614
Eric Christopherd117fbb2011-11-11 01:55:22 +00001615 if (addToAccelTable) {
1616 DIE *AddrDIE = VariableSpecDIE ? VariableSpecDIE : VariableDIE;
1617 addAccelName(GV.getName(), AddrDIE);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001618
Eric Christopherd117fbb2011-11-11 01:55:22 +00001619 // If the linkage name is different than the name, go ahead and output
1620 // that as well into the name table.
1621 if (GV.getLinkageName() != "" && GV.getName() != GV.getLinkageName())
1622 addAccelName(GV.getLinkageName(), AddrDIE);
1623 }
Eric Christophera486f552013-10-16 01:37:49 +00001624
1625 if (!GV.isLocalToUnit())
Eric Christopher91986572013-10-17 02:06:06 +00001626 addGlobalName(GV.getName(), VariableSpecDIE ? VariableSpecDIE : VariableDIE,
1627 GV.getContext());
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001628}
1629
Devang Patel161b2f42011-04-12 23:21:44 +00001630/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
Eric Christopher4d069bf2012-05-22 18:45:24 +00001631void CompileUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR,
1632 DIE *IndexTy) {
Devang Patel161b2f42011-04-12 23:21:44 +00001633 DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
Manman Ren87b110a2013-10-11 23:58:05 +00001634 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, IndexTy);
Devang Patel161b2f42011-04-12 23:21:44 +00001635
Bill Wendling222c2fd2012-12-06 07:38:10 +00001636 // The LowerBound value defines the lower bounds which is typically zero for
1637 // C/C++. The Count value is the number of elements. Values are 64 bit. If
1638 // Count == -1 then the array is unbounded and we do not emit
1639 // DW_AT_lower_bound and DW_AT_upper_bound attributes. If LowerBound == 0 and
1640 // Count == 0, then the array has zero elements in which case we do not emit
1641 // an upper bound.
1642 int64_t LowerBound = SR.getLo();
Bill Wendling6afe4782012-12-06 07:55:19 +00001643 int64_t DefaultLowerBound = getDefaultLowerBound();
Bill Wendling9493dae2012-12-04 21:34:03 +00001644 int64_t Count = SR.getCount();
Devang Patel161b2f42011-04-12 23:21:44 +00001645
Bill Wendling6afe4782012-12-06 07:55:19 +00001646 if (DefaultLowerBound == -1 || LowerBound != DefaultLowerBound)
David Blaikie770530b2013-10-21 17:28:37 +00001647 addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, None, LowerBound);
Bill Wendling222c2fd2012-12-06 07:38:10 +00001648
1649 if (Count != -1 && Count != 0)
Bill Wendling9493dae2012-12-04 21:34:03 +00001650 // FIXME: An unbounded array should reference the expression that defines
1651 // the array.
David Blaikie770530b2013-10-21 17:28:37 +00001652 addUInt(DW_Subrange, dwarf::DW_AT_upper_bound, None, LowerBound + Count - 1);
Bill Wendling9493dae2012-12-04 21:34:03 +00001653
Devang Patel161b2f42011-04-12 23:21:44 +00001654 Buffer.addChild(DW_Subrange);
1655}
1656
1657/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
Eric Christopher6efc0432013-10-19 01:04:47 +00001658void CompileUnit::constructArrayTypeDIE(DIE &Buffer, DICompositeType *CTy) {
Eric Christopher9a1e0e22013-01-08 01:53:52 +00001659 if (CTy->isVector())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001660 addFlag(&Buffer, dwarf::DW_AT_GNU_vector);
Devang Patel161b2f42011-04-12 23:21:44 +00001661
Eric Christopherdc1363f2013-08-08 07:40:37 +00001662 // Emit the element type.
Manman Ren017ceda2013-10-08 18:42:58 +00001663 addType(&Buffer, resolve(CTy->getTypeDerivedFrom()));
Devang Patel161b2f42011-04-12 23:21:44 +00001664
1665 // Get an anonymous type for index type.
Eric Christopher8cab6ed2013-01-04 21:51:53 +00001666 // FIXME: This type should be passed down from the front end
1667 // as different languages may have different sizes for indexes.
Devang Patel161b2f42011-04-12 23:21:44 +00001668 DIE *IdxTy = getIndexTyDie();
1669 if (!IdxTy) {
1670 // Construct an anonymous type for index type.
1671 IdxTy = new DIE(dwarf::DW_TAG_base_type);
Eric Christopher8cab6ed2013-01-04 21:51:53 +00001672 addString(IdxTy, dwarf::DW_AT_name, "int");
David Blaikie770530b2013-10-21 17:28:37 +00001673 addUInt(IdxTy, dwarf::DW_AT_byte_size, None, sizeof(int32_t));
Devang Patel161b2f42011-04-12 23:21:44 +00001674 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1675 dwarf::DW_ATE_signed);
1676 addDie(IdxTy);
1677 setIndexTyDie(IdxTy);
1678 }
1679
1680 // Add subranges to array type.
Eric Christopherdc1363f2013-08-08 07:40:37 +00001681 DIArray Elements = CTy->getTypeArray();
Devang Patel161b2f42011-04-12 23:21:44 +00001682 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1683 DIDescriptor Element = Elements.getElement(i);
1684 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1685 constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1686 }
1687}
1688
1689/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
Manman Ren630c3262013-10-18 21:14:19 +00001690DIE *CompileUnit::constructEnumTypeDIE(DIEnumerator ETy, DIE &Buffer) {
Devang Patel161b2f42011-04-12 23:21:44 +00001691 DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
Manman Ren630c3262013-10-18 21:14:19 +00001692 Buffer.addChild(Enumerator);
Devang Patel161b2f42011-04-12 23:21:44 +00001693 StringRef Name = ETy.getName();
Nick Lewycky390c40d2011-10-27 06:44:11 +00001694 addString(Enumerator, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001695 int64_t Value = ETy.getEnumValue();
1696 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
1697 return Enumerator;
1698}
1699
Devang Pateldbc64af2011-08-15 17:24:54 +00001700/// constructContainingTypeDIEs - Construct DIEs for types that contain
1701/// vtables.
1702void CompileUnit::constructContainingTypeDIEs() {
1703 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
Eric Christopher6efc0432013-10-19 01:04:47 +00001704 CE = ContainingTypeMap.end();
1705 CI != CE; ++CI) {
Devang Pateldbc64af2011-08-15 17:24:54 +00001706 DIE *SPDie = CI->first;
1707 const MDNode *N = CI->second;
Eric Christopher6efc0432013-10-19 01:04:47 +00001708 if (!N)
1709 continue;
Eric Christopher3f045002013-10-04 17:08:38 +00001710 DIE *NDie = getDIE(N);
Eric Christopher6efc0432013-10-19 01:04:47 +00001711 if (!NDie)
1712 continue;
Manman Ren87b110a2013-10-11 23:58:05 +00001713 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, NDie);
Devang Pateldbc64af2011-08-15 17:24:54 +00001714 }
1715}
1716
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001717/// constructVariableDIE - Construct a DIE for the given DbgVariable.
Eric Christopher6efc0432013-10-19 01:04:47 +00001718DIE *CompileUnit::constructVariableDIE(DbgVariable *DV, bool isScopeAbstract) {
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001719 StringRef Name = DV->getName();
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001720
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001721 // Define variable debug information entry.
David Blaikie916d49e2013-10-04 23:21:16 +00001722 DIE *VariableDie = new DIE(DV->getTag());
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001723 DbgVariable *AbsVar = DV->getAbstractVariable();
1724 DIE *AbsDIE = AbsVar ? AbsVar->getDIE() : NULL;
Manman Ren742671b2013-05-29 17:16:59 +00001725 if (AbsDIE)
Manman Ren87b110a2013-10-11 23:58:05 +00001726 addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin, AbsDIE);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001727 else {
David Blaikie2883fd42013-08-19 03:34:03 +00001728 if (!Name.empty())
1729 addString(VariableDie, dwarf::DW_AT_name, Name);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001730 addSourceLine(VariableDie, DV->getVariable());
1731 addType(VariableDie, DV->getType());
1732 }
1733
1734 if (DV->isArtificial())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001735 addFlag(VariableDie, dwarf::DW_AT_artificial);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001736
1737 if (isScopeAbstract) {
1738 DV->setDIE(VariableDie);
1739 return VariableDie;
1740 }
1741
1742 // Add variable address.
1743
1744 unsigned Offset = DV->getDotDebugLocOffset();
1745 if (Offset != ~0U) {
Eric Christopherafbe0e22013-06-24 21:34:55 +00001746 addLabel(VariableDie, dwarf::DW_AT_location, dwarf::DW_FORM_data4,
1747 Asm->GetTempSymbol("debug_loc", Offset));
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001748 DV->setDIE(VariableDie);
1749 return VariableDie;
1750 }
1751
Eric Christopher8cf5e742011-10-03 15:49:20 +00001752 // Check if variable is described by a DBG_VALUE instruction.
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001753 if (const MachineInstr *DVInsn = DV->getMInsn()) {
David Blaikie6d9dbd52013-06-16 20:34:15 +00001754 assert(DVInsn->getNumOperands() == 3);
1755 if (DVInsn->getOperand(0).isReg()) {
1756 const MachineOperand RegOp = DVInsn->getOperand(0);
Adrian Prantlb2754912013-07-09 21:44:06 +00001757 // If the second operand is an immediate, this is an indirect value.
Adrian Prantl35176402013-07-09 20:28:37 +00001758 if (DVInsn->getOperand(1).isImm()) {
Eric Christopher6efc0432013-10-19 01:04:47 +00001759 MachineLocation Location(RegOp.getReg(),
1760 DVInsn->getOperand(1).getImm());
Eric Christopherf61dbc12013-06-24 21:07:27 +00001761 addVariableAddress(*DV, VariableDie, Location);
David Blaikie6d9dbd52013-06-16 20:34:15 +00001762 } else if (RegOp.getReg())
Eric Christopherf61dbc12013-06-24 21:07:27 +00001763 addVariableAddress(*DV, VariableDie, MachineLocation(RegOp.getReg()));
David Blaikie6d9dbd52013-06-16 20:34:15 +00001764 } else if (DVInsn->getOperand(0).isImm())
Eric Christophere4721492013-07-03 01:08:30 +00001765 addConstantValue(VariableDie, DVInsn->getOperand(0), DV->getType());
David Blaikie6d9dbd52013-06-16 20:34:15 +00001766 else if (DVInsn->getOperand(0).isFPImm())
Eric Christophere4721492013-07-03 01:08:30 +00001767 addConstantFPValue(VariableDie, DVInsn->getOperand(0));
David Blaikie6d9dbd52013-06-16 20:34:15 +00001768 else if (DVInsn->getOperand(0).isCImm())
Eric Christophere4721492013-07-03 01:08:30 +00001769 addConstantValue(VariableDie, DVInsn->getOperand(0).getCImm(),
Manman Renc664d762013-10-05 01:43:03 +00001770 isUnsignedDIType(DD, DV->getType()));
Eric Christophere4721492013-07-03 01:08:30 +00001771
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001772 DV->setDIE(VariableDie);
1773 return VariableDie;
1774 } else {
1775 // .. else use frame index.
1776 int FI = DV->getFrameIndex();
1777 if (FI != ~0) {
1778 unsigned FrameReg = 0;
1779 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
Eric Christopher6efc0432013-10-19 01:04:47 +00001780 int Offset = TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001781 MachineLocation Location(FrameReg, Offset);
Eric Christopherf61dbc12013-06-24 21:07:27 +00001782 addVariableAddress(*DV, VariableDie, Location);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001783 }
1784 }
1785
1786 DV->setDIE(VariableDie);
1787 return VariableDie;
1788}
1789
Devang Patel161b2f42011-04-12 23:21:44 +00001790/// createMemberDIE - Create new member DIE.
Manman Ren630c3262013-10-18 21:14:19 +00001791DIE *CompileUnit::createMemberDIE(DIDerivedType DT, DIE &Buffer) {
Devang Patel161b2f42011-04-12 23:21:44 +00001792 DIE *MemberDie = new DIE(DT.getTag());
Manman Ren630c3262013-10-18 21:14:19 +00001793 Buffer.addChild(MemberDie);
Devang Patel161b2f42011-04-12 23:21:44 +00001794 StringRef Name = DT.getName();
1795 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001796 addString(MemberDie, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001797
Manman Ren017ceda2013-10-08 18:42:58 +00001798 addType(MemberDie, resolve(DT.getTypeDerivedFrom()));
Devang Patel161b2f42011-04-12 23:21:44 +00001799
1800 addSourceLine(MemberDie, DT);
1801
1802 DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
David Blaikie770530b2013-10-21 17:28:37 +00001803 addUInt(MemLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
Devang Patel161b2f42011-04-12 23:21:44 +00001804
1805 uint64_t Size = DT.getSizeInBits();
Manman Ren43251002013-10-08 18:46:58 +00001806 uint64_t FieldSize = getBaseTypeSize(DD, DT);
Devang Patel161b2f42011-04-12 23:21:44 +00001807
1808 if (Size != FieldSize) {
1809 // Handle bitfield.
David Blaikie770530b2013-10-21 17:28:37 +00001810 addUInt(MemberDie, dwarf::DW_AT_byte_size, None,
1811 getBaseTypeSize(DD, DT) >> 3);
1812 addUInt(MemberDie, dwarf::DW_AT_bit_size, None, DT.getSizeInBits());
Devang Patel161b2f42011-04-12 23:21:44 +00001813
1814 uint64_t Offset = DT.getOffsetInBits();
1815 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1816 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1817 uint64_t FieldOffset = (HiMark - FieldSize);
1818 Offset -= FieldOffset;
1819
1820 // Maybe we need to work from the other end.
Micah Villmow3574eca2012-10-08 16:38:25 +00001821 if (Asm->getDataLayout().isLittleEndian())
Devang Patel161b2f42011-04-12 23:21:44 +00001822 Offset = FieldSize - (Offset + Size);
David Blaikie770530b2013-10-21 17:28:37 +00001823 addUInt(MemberDie, dwarf::DW_AT_bit_offset, None, Offset);
Devang Patel161b2f42011-04-12 23:21:44 +00001824
1825 // Here WD_AT_data_member_location points to the anonymous
1826 // field that includes this bit field.
David Blaikie770530b2013-10-21 17:28:37 +00001827 addUInt(MemLocationDie, dwarf::DW_FORM_udata, FieldOffset >> 3);
Devang Patel161b2f42011-04-12 23:21:44 +00001828
1829 } else
1830 // This is not a bitfield.
David Blaikie770530b2013-10-21 17:28:37 +00001831 addUInt(MemLocationDie, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
Devang Patel161b2f42011-04-12 23:21:44 +00001832
Eric Christopher6efc0432013-10-19 01:04:47 +00001833 if (DT.getTag() == dwarf::DW_TAG_inheritance && DT.isVirtual()) {
Devang Patel161b2f42011-04-12 23:21:44 +00001834
1835 // For C++, virtual base classes are not at fixed offset. Use following
1836 // expression to extract appropriate offset from vtable.
1837 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1838
1839 DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
David Blaikie770530b2013-10-21 17:28:37 +00001840 addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1841 addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1842 addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1843 addUInt(VBaseLocationDie, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1844 addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1845 addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1846 addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
Devang Patel161b2f42011-04-12 23:21:44 +00001847
David Blaikie770530b2013-10-21 17:28:37 +00001848 addBlock(MemberDie, dwarf::DW_AT_data_member_location, VBaseLocationDie);
Devang Patel161b2f42011-04-12 23:21:44 +00001849 } else
David Blaikie770530b2013-10-21 17:28:37 +00001850 addBlock(MemberDie, dwarf::DW_AT_data_member_location, MemLocationDie);
Devang Patel161b2f42011-04-12 23:21:44 +00001851
1852 if (DT.isProtected())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001853 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001854 dwarf::DW_ACCESS_protected);
1855 else if (DT.isPrivate())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001856 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001857 dwarf::DW_ACCESS_private);
1858 // Otherwise C++ member and base classes are considered public.
Eric Christopher8b4310b2012-11-21 00:34:38 +00001859 else
Nick Lewycky13aaca52011-12-13 05:09:11 +00001860 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001861 dwarf::DW_ACCESS_public);
1862 if (DT.isVirtual())
Nick Lewycky798313d2011-12-14 00:56:07 +00001863 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001864 dwarf::DW_VIRTUALITY_virtual);
Devang Patele9db5e22011-04-16 00:11:51 +00001865
1866 // Objective-C properties.
Devang Patel6588abf2012-02-06 17:49:43 +00001867 if (MDNode *PNode = DT.getObjCProperty())
1868 if (DIEEntry *PropertyDie = getDIEEntry(PNode))
Eric Christopher8b4310b2012-11-21 00:34:38 +00001869 MemberDie->addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4,
Devang Patel6588abf2012-02-06 17:49:43 +00001870 PropertyDie);
1871
David Blaikie01bc2b32012-12-13 22:43:07 +00001872 if (DT.isArtificial())
1873 addFlag(MemberDie, dwarf::DW_AT_artificial);
1874
Devang Patel161b2f42011-04-12 23:21:44 +00001875 return MemberDie;
1876}
Eric Christopher6b6061f2013-01-16 01:22:23 +00001877
Manman Ren655a10d2013-10-14 20:33:57 +00001878/// getOrCreateStaticMemberDIE - Create new DIE for C++ static member.
1879DIE *CompileUnit::getOrCreateStaticMemberDIE(const DIDerivedType DT) {
Eric Christopher6b6061f2013-01-16 01:22:23 +00001880 if (!DT.Verify())
1881 return NULL;
1882
Manman Ren655a10d2013-10-14 20:33:57 +00001883 // Construct the context before querying for the existence of the DIE in case
1884 // such construction creates the DIE.
1885 DIE *ContextDIE = getOrCreateContextDIE(resolve(DT.getContext()));
1886 assert(ContextDIE && "Static member should belong to a non-CU context.");
1887
1888 DIE *StaticMemberDIE = getDIE(DT);
1889 if (StaticMemberDIE)
1890 return StaticMemberDIE;
1891
1892 StaticMemberDIE = new DIE(DT.getTag());
1893 // Add to context owner.
1894 ContextDIE->addChild(StaticMemberDIE);
1895
Manman Ren017ceda2013-10-08 18:42:58 +00001896 DIType Ty = resolve(DT.getTypeDerivedFrom());
Eric Christopher6b6061f2013-01-16 01:22:23 +00001897
1898 addString(StaticMemberDIE, dwarf::DW_AT_name, DT.getName());
1899 addType(StaticMemberDIE, Ty);
1900 addSourceLine(StaticMemberDIE, DT);
1901 addFlag(StaticMemberDIE, dwarf::DW_AT_external);
1902 addFlag(StaticMemberDIE, dwarf::DW_AT_declaration);
1903
1904 // FIXME: We could omit private if the parent is a class_type, and
1905 // public if the parent is something else.
1906 if (DT.isProtected())
1907 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1908 dwarf::DW_ACCESS_protected);
1909 else if (DT.isPrivate())
1910 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1911 dwarf::DW_ACCESS_private);
1912 else
1913 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1914 dwarf::DW_ACCESS_public);
1915
1916 if (const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(DT.getConstant()))
Manman Renc664d762013-10-05 01:43:03 +00001917 addConstantValue(StaticMemberDIE, CI, isUnsignedDIType(DD, Ty));
David Blaikie14268412013-01-20 01:18:01 +00001918 if (const ConstantFP *CFP = dyn_cast_or_null<ConstantFP>(DT.getConstant()))
1919 addConstantFPValue(StaticMemberDIE, CFP);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001920
Eric Christopher3f045002013-10-04 17:08:38 +00001921 insertDIE(DT, StaticMemberDIE);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001922 return StaticMemberDIE;
1923}