blob: ca416c4d80c2733ead33ac477961a48b337d198e [file] [log] [blame]
Devang Patel0e821f42011-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 Christopher160522c2012-08-14 05:13:29 +000010// This file contains support for constructing a dwarf compile unit.
Devang Patel0e821f42011-04-12 23:21:44 +000011//
12//===----------------------------------------------------------------------===//
13
14#define DEBUG_TYPE "dwarfdebug"
15
16#include "DwarfCompileUnit.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000017#include "DwarfAccelTable.h"
Devang Patel0e821f42011-04-12 23:21:44 +000018#include "DwarfDebug.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000019#include "llvm/ADT/APFloat.h"
Bill Wendlingf799efd2012-06-29 08:32:07 +000020#include "llvm/DIBuilder.h"
Chandler Carruth9fb823b2013-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 Pateldfd6ec32011-08-15 17:57:41 +000025#include "llvm/Target/Mangler.h"
Devang Patel0e821f42011-04-12 23:21:44 +000026#include "llvm/Target/TargetFrameLowering.h"
27#include "llvm/Target/TargetMachine.h"
David Blaikief2694972013-06-28 20:05:11 +000028#include "llvm/Target/TargetLoweringObjectFile.h"
Devang Patel0e821f42011-04-12 23:21:44 +000029#include "llvm/Target/TargetRegisterInfo.h"
Devang Patel0e821f42011-04-12 23:21:44 +000030
31using namespace llvm;
32
33/// CompileUnit - Compile unit constructor.
Eric Christopherbfceb2f2013-08-26 23:50:38 +000034CompileUnit::CompileUnit(unsigned UID, DIE *D, const MDNode *N, AsmPrinter *A,
35 DwarfDebug *DW, DwarfUnits *DWU)
Eric Christopherc19d6f02013-10-04 19:40:33 +000036 : UniqueID(UID), Node(N), CUDie(D), Asm(A), DD(DW), DU(DWU), IndexTyDie(0) {
Devang Patel0e821f42011-04-12 23:21:44 +000037 DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
Eric Christopherc57baee2013-05-08 00:58:51 +000038 insertDIE(N, D);
Devang Patel0e821f42011-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 Wendling3495f9b2012-12-06 07:55:19 +000054/// getDefaultLowerBound - Return the default lower bound for an array. If the
Bill Wendling28fe9e72012-12-06 07:38:10 +000055/// DWARF version doesn't handle the language, return -1.
Bill Wendling3495f9b2012-12-06 07:55:19 +000056int64_t CompileUnit::getDefaultLowerBound() const {
Eric Christopherbfceb2f2013-08-26 23:50:38 +000057 switch (DICompileUnit(Node).getLanguage()) {
Bill Wendling28fe9e72012-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 Christopherbb69a272012-08-24 01:14:27 +000098/// addFlag - Add a flag that is true.
Eric Christopher31b05762013-08-08 01:41:00 +000099void CompileUnit::addFlag(DIE *Die, uint16_t Attribute) {
Michael Gottesmanc89466f2013-09-04 04:39:38 +0000100 if (DD->getDwarfVersion() >= 4)
Eric Christopherdccd3282013-10-04 22:40:05 +0000101 Die->addValue(Attribute, dwarf::DW_FORM_flag_present, DIEIntegerOne);
Eric Christopherbb69a272012-08-24 01:14:27 +0000102 else
Eric Christopherdccd3282013-10-04 22:40:05 +0000103 Die->addValue(Attribute, dwarf::DW_FORM_flag, DIEIntegerOne);
Eric Christopherbb69a272012-08-24 01:14:27 +0000104}
105
Devang Patel0e821f42011-04-12 23:21:44 +0000106/// addUInt - Add an unsigned integer attribute data and value.
107///
Eric Christopherc2697f82013-10-19 01:04:47 +0000108void CompileUnit::addUInt(DIE *Die, uint16_t Attribute, uint16_t Form,
109 uint64_t Integer) {
110 if (!Form)
111 Form = DIEInteger::BestForm(false, Integer);
112 DIEValue *Value = Integer == 1 ? DIEIntegerOne : new (DIEValueAllocator)
113 DIEInteger(Integer);
Devang Patel0e821f42011-04-12 23:21:44 +0000114 Die->addValue(Attribute, Form, Value);
115}
116
117/// addSInt - Add an signed integer attribute data and value.
118///
Eric Christopherc2697f82013-10-19 01:04:47 +0000119void CompileUnit::addSInt(DIE *Die, uint16_t Attribute, uint16_t Form,
120 int64_t Integer) {
121 if (!Form)
122 Form = DIEInteger::BestForm(true, Integer);
Devang Patel0e821f42011-04-12 23:21:44 +0000123 DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
124 Die->addValue(Attribute, Form, Value);
125}
126
Nick Lewyckycc64ae12011-10-28 05:29:47 +0000127/// addString - Add a string attribute data and value. We always emit a
128/// reference to the string pool instead of immediate strings so that DIEs have
Eric Christopherfba22602013-01-07 19:32:45 +0000129/// more predictable sizes. In the case of split dwarf we emit an index
130/// into another table which gets us the static offset into the string
131/// table.
Eric Christopher31b05762013-08-08 01:41:00 +0000132void CompileUnit::addString(DIE *Die, uint16_t Attribute, StringRef String) {
Eric Christopher67646432013-07-26 17:02:41 +0000133 DIEValue *Value;
Eric Christopher31b05762013-08-08 01:41:00 +0000134 uint16_t Form;
Eric Christopher2cbd5762013-01-07 19:32:41 +0000135 if (!DD->useSplitDwarf()) {
136 MCSymbol *Symb = DU->getStringPoolEntry(String);
Eric Christopher2cbd5762013-01-07 19:32:41 +0000137 if (Asm->needsRelocationsForDwarfStringPool())
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000138 Value = new (DIEValueAllocator) DIELabel(Symb);
Eric Christopher2cbd5762013-01-07 19:32:41 +0000139 else {
140 MCSymbol *StringPool = DU->getStringPoolSym();
141 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
142 }
Eric Christopher67646432013-07-26 17:02:41 +0000143 Form = dwarf::DW_FORM_strp;
Eric Christopher2cbd5762013-01-07 19:32:41 +0000144 } else {
145 unsigned idx = DU->getStringPoolIndex(String);
Eric Christopher67646432013-07-26 17:02:41 +0000146 Value = new (DIEValueAllocator) DIEInteger(idx);
147 Form = dwarf::DW_FORM_GNU_str_index;
Eric Christopher2cbd5762013-01-07 19:32:41 +0000148 }
Eric Christopher67646432013-07-26 17:02:41 +0000149 DIEValue *Str = new (DIEValueAllocator) DIEString(Value, String);
150 Die->addValue(Attribute, Form, Str);
Eric Christopher2cbd5762013-01-07 19:32:41 +0000151}
152
153/// addLocalString - Add a string attribute data and value. This is guaranteed
154/// to be in the local string pool instead of indirected.
Eric Christopher31b05762013-08-08 01:41:00 +0000155void CompileUnit::addLocalString(DIE *Die, uint16_t Attribute,
Eric Christopher2cbd5762013-01-07 19:32:41 +0000156 StringRef String) {
Eric Christophere698f532012-12-20 21:58:36 +0000157 MCSymbol *Symb = DU->getStringPoolEntry(String);
Nick Lewyckycc64ae12011-10-28 05:29:47 +0000158 DIEValue *Value;
159 if (Asm->needsRelocationsForDwarfStringPool())
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000160 Value = new (DIEValueAllocator) DIELabel(Symb);
Nick Lewyckycc64ae12011-10-28 05:29:47 +0000161 else {
Eric Christophere698f532012-12-20 21:58:36 +0000162 MCSymbol *StringPool = DU->getStringPoolSym();
Nick Lewyckycc64ae12011-10-28 05:29:47 +0000163 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +0000164 }
Nick Lewyckycc64ae12011-10-28 05:29:47 +0000165 Die->addValue(Attribute, dwarf::DW_FORM_strp, Value);
Devang Patel0e821f42011-04-12 23:21:44 +0000166}
167
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000168/// addExpr - Add a Dwarf expression attribute data and value.
Devang Patel0e821f42011-04-12 23:21:44 +0000169///
Eric Christopher31b05762013-08-08 01:41:00 +0000170void CompileUnit::addExpr(DIE *Die, uint16_t Attribute, uint16_t Form,
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000171 const MCExpr *Expr) {
172 DIEValue *Value = new (DIEValueAllocator) DIEExpr(Expr);
Devang Patel0e821f42011-04-12 23:21:44 +0000173 Die->addValue(Attribute, Form, Value);
174}
175
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000176/// addLabel - Add a Dwarf label attribute data and value.
177///
Eric Christopher31b05762013-08-08 01:41:00 +0000178void CompileUnit::addLabel(DIE *Die, uint16_t Attribute, uint16_t Form,
David Blaikief3cd7c52013-06-28 20:05:04 +0000179 const MCSymbol *Label) {
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000180 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
181 Die->addValue(Attribute, Form, Value);
David Blaikief3cd7c52013-06-28 20:05:04 +0000182}
183
Eric Christopher962c9082013-01-15 23:56:56 +0000184/// addLabelAddress - Add a dwarf label attribute data and value using
185/// DW_FORM_addr or DW_FORM_GNU_addr_index.
186///
Eric Christopher31b05762013-08-08 01:41:00 +0000187void CompileUnit::addLabelAddress(DIE *Die, uint16_t Attribute,
Eric Christopher962c9082013-01-15 23:56:56 +0000188 MCSymbol *Label) {
Alexey Samsonov4436bf02013-10-03 08:54:43 +0000189 if (Label)
190 DD->addArangeLabel(SymbolCU(this, Label));
Richard Mitton21101b32013-09-19 23:21:01 +0000191
Eric Christopher962c9082013-01-15 23:56:56 +0000192 if (!DD->useSplitDwarf()) {
193 if (Label != NULL) {
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000194 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
Eric Christopher962c9082013-01-15 23:56:56 +0000195 Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
196 } else {
197 DIEValue *Value = new (DIEValueAllocator) DIEInteger(0);
198 Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
199 }
200 } else {
201 unsigned idx = DU->getAddrPoolIndex(Label);
202 DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx);
203 Die->addValue(Attribute, dwarf::DW_FORM_GNU_addr_index, Value);
204 }
205}
206
Eric Christophere9ec2452013-01-18 22:11:33 +0000207/// addOpAddress - Add a dwarf op address data and value using the
208/// form given and an op of either DW_FORM_addr or DW_FORM_GNU_addr_index.
209///
David Blaikief3cd7c52013-06-28 20:05:04 +0000210void CompileUnit::addOpAddress(DIE *Die, const MCSymbol *Sym) {
Alexey Samsonov4436bf02013-10-03 08:54:43 +0000211 DD->addArangeLabel(SymbolCU(this, Sym));
Eric Christophere9ec2452013-01-18 22:11:33 +0000212 if (!DD->useSplitDwarf()) {
213 addUInt(Die, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
214 addLabel(Die, 0, dwarf::DW_FORM_udata, Sym);
215 } else {
Eric Christophere9ec2452013-01-18 22:11:33 +0000216 addUInt(Die, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_addr_index);
David Blaikie8466ca82013-07-01 23:55:52 +0000217 addUInt(Die, 0, dwarf::DW_FORM_GNU_addr_index, DU->getAddrPoolIndex(Sym));
Eric Christophere9ec2452013-01-18 22:11:33 +0000218 }
219}
220
Devang Patel0e821f42011-04-12 23:21:44 +0000221/// addDelta - Add a label delta attribute data and value.
222///
Eric Christopher31b05762013-08-08 01:41:00 +0000223void CompileUnit::addDelta(DIE *Die, uint16_t Attribute, uint16_t Form,
Devang Patel0e821f42011-04-12 23:21:44 +0000224 const MCSymbol *Hi, const MCSymbol *Lo) {
225 DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
226 Die->addValue(Attribute, Form, Value);
227}
228
229/// addDIEEntry - Add a DIE attribute data and value.
230///
Manman Ren4c4b69c2013-10-11 23:58:05 +0000231void CompileUnit::addDIEEntry(DIE *Die, uint16_t Attribute, DIE *Entry) {
232 // We currently only use ref4.
233 Die->addValue(Attribute, dwarf::DW_FORM_ref4, createDIEEntry(Entry));
Devang Patel0e821f42011-04-12 23:21:44 +0000234}
235
Devang Patel0e821f42011-04-12 23:21:44 +0000236/// addBlock - Add block data.
237///
Eric Christopher31b05762013-08-08 01:41:00 +0000238void CompileUnit::addBlock(DIE *Die, uint16_t Attribute, uint16_t Form,
Devang Patel0e821f42011-04-12 23:21:44 +0000239 DIEBlock *Block) {
240 Block->ComputeSize(Asm);
241 DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
242 Die->addValue(Attribute, Block->BestForm(), Block);
243}
244
245/// addSourceLine - Add location information to specified debug information
246/// entry.
247void CompileUnit::addSourceLine(DIE *Die, DIVariable V) {
248 // Verify variable.
Manman Ren7504ed42013-07-08 18:33:29 +0000249 if (!V.isVariable())
Devang Patel0e821f42011-04-12 23:21:44 +0000250 return;
Eric Christopher92331fd2012-11-21 00:34:38 +0000251
Devang Patel0e821f42011-04-12 23:21:44 +0000252 unsigned Line = V.getLineNumber();
253 if (Line == 0)
254 return;
Eric Christopherc2697f82013-10-19 01:04:47 +0000255 unsigned FileID =
256 DD->getOrCreateSourceID(V.getContext().getFilename(),
257 V.getContext().getDirectory(), getUniqueID());
Devang Patel0e821f42011-04-12 23:21:44 +0000258 assert(FileID && "Invalid file id");
259 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
260 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
261}
262
263/// addSourceLine - Add location information to specified debug information
264/// entry.
265void CompileUnit::addSourceLine(DIE *Die, DIGlobalVariable G) {
266 // Verify global variable.
Manman Ren7504ed42013-07-08 18:33:29 +0000267 if (!G.isGlobalVariable())
Devang Patel0e821f42011-04-12 23:21:44 +0000268 return;
269
270 unsigned Line = G.getLineNumber();
271 if (Line == 0)
272 return;
Eric Christopherc2697f82013-10-19 01:04:47 +0000273 unsigned FileID =
274 DD->getOrCreateSourceID(G.getFilename(), G.getDirectory(), getUniqueID());
Devang Patel0e821f42011-04-12 23:21:44 +0000275 assert(FileID && "Invalid file id");
276 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
277 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
278}
279
280/// addSourceLine - Add location information to specified debug information
281/// entry.
282void CompileUnit::addSourceLine(DIE *Die, DISubprogram SP) {
283 // Verify subprogram.
Manman Ren7504ed42013-07-08 18:33:29 +0000284 if (!SP.isSubprogram())
Devang Patel0e821f42011-04-12 23:21:44 +0000285 return;
Eric Christopher7734ca22012-03-15 23:55:40 +0000286
Devang Patel0e821f42011-04-12 23:21:44 +0000287 // If the line number is 0, don't add it.
Eric Christopher7734ca22012-03-15 23:55:40 +0000288 unsigned Line = SP.getLineNumber();
289 if (Line == 0)
Devang Patel0e821f42011-04-12 23:21:44 +0000290 return;
291
Eric Christopherc2697f82013-10-19 01:04:47 +0000292 unsigned FileID = DD->getOrCreateSourceID(SP.getFilename(), SP.getDirectory(),
293 getUniqueID());
Devang Patel0e821f42011-04-12 23:21:44 +0000294 assert(FileID && "Invalid file id");
295 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
296 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
297}
298
299/// addSourceLine - Add location information to specified debug information
300/// entry.
301void CompileUnit::addSourceLine(DIE *Die, DIType Ty) {
302 // Verify type.
Manman Ren7504ed42013-07-08 18:33:29 +0000303 if (!Ty.isType())
Devang Patel0e821f42011-04-12 23:21:44 +0000304 return;
305
306 unsigned Line = Ty.getLineNumber();
Eric Christopher7734ca22012-03-15 23:55:40 +0000307 if (Line == 0)
Devang Patel0e821f42011-04-12 23:21:44 +0000308 return;
Eric Christopherc2697f82013-10-19 01:04:47 +0000309 unsigned FileID = DD->getOrCreateSourceID(Ty.getFilename(), Ty.getDirectory(),
310 getUniqueID());
Devang Patel0e821f42011-04-12 23:21:44 +0000311 assert(FileID && "Invalid file id");
312 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
313 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
314}
315
316/// addSourceLine - Add location information to specified debug information
317/// entry.
Eric Christopher70e1bd82012-03-29 08:42:56 +0000318void CompileUnit::addSourceLine(DIE *Die, DIObjCProperty Ty) {
319 // Verify type.
Manman Ren7504ed42013-07-08 18:33:29 +0000320 if (!Ty.isObjCProperty())
Eric Christopher70e1bd82012-03-29 08:42:56 +0000321 return;
322
323 unsigned Line = Ty.getLineNumber();
324 if (Line == 0)
325 return;
326 DIFile File = Ty.getFile();
Eric Christopher7b30f2e42012-11-21 00:34:35 +0000327 unsigned FileID = DD->getOrCreateSourceID(File.getFilename(),
Manman Ren1e427202013-03-07 01:42:00 +0000328 File.getDirectory(), getUniqueID());
Eric Christopher70e1bd82012-03-29 08:42:56 +0000329 assert(FileID && "Invalid file id");
330 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
331 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
332}
333
334/// addSourceLine - Add location information to specified debug information
335/// entry.
Devang Patel0e821f42011-04-12 23:21:44 +0000336void CompileUnit::addSourceLine(DIE *Die, DINameSpace NS) {
337 // Verify namespace.
338 if (!NS.Verify())
339 return;
340
341 unsigned Line = NS.getLineNumber();
342 if (Line == 0)
343 return;
344 StringRef FN = NS.getFilename();
345
Eric Christopherc2697f82013-10-19 01:04:47 +0000346 unsigned FileID =
347 DD->getOrCreateSourceID(FN, NS.getDirectory(), getUniqueID());
Devang Patel0e821f42011-04-12 23:21:44 +0000348 assert(FileID && "Invalid file id");
349 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
350 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
351}
352
Eric Christopher92331fd2012-11-21 00:34:38 +0000353/// addVariableAddress - Add DW_AT_location attribute for a
Devang Patel77dc5412011-04-27 22:45:24 +0000354/// DbgVariable based on provided MachineLocation.
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000355void CompileUnit::addVariableAddress(const DbgVariable &DV, DIE *Die,
Devang Patel77dc5412011-04-27 22:45:24 +0000356 MachineLocation Location) {
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000357 if (DV.variableHasComplexAddress())
Devang Patel0e821f42011-04-12 23:21:44 +0000358 addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000359 else if (DV.isBlockByrefVariable())
Devang Patel0e821f42011-04-12 23:21:44 +0000360 addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location);
361 else
David Blaikieea2605d2013-06-20 00:25:24 +0000362 addAddress(Die, dwarf::DW_AT_location, Location,
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000363 DV.getVariable().isIndirect());
Devang Patel0e821f42011-04-12 23:21:44 +0000364}
365
Devang Patelba5fbf12011-04-26 19:06:18 +0000366/// addRegisterOp - Add register operand.
367void CompileUnit::addRegisterOp(DIE *TheDie, unsigned Reg) {
368 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
369 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
370 if (DWReg < 32)
371 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + DWReg);
372 else {
373 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
374 addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
375 }
376}
377
378/// addRegisterOffset - Add register offset.
Eric Christopherc2697f82013-10-19 01:04:47 +0000379void CompileUnit::addRegisterOffset(DIE *TheDie, unsigned Reg, int64_t Offset) {
Devang Patelba5fbf12011-04-26 19:06:18 +0000380 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
381 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
382 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
383 if (Reg == TRI->getFrameRegister(*Asm->MF))
384 // If variable offset is based in frame register then use fbreg.
385 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
386 else if (DWReg < 32)
387 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DWReg);
388 else {
389 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
390 addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
391 }
392 addSInt(TheDie, 0, dwarf::DW_FORM_sdata, Offset);
393}
394
395/// addAddress - Add an address attribute to a die based on the location
396/// provided.
Eric Christopher31b05762013-08-08 01:41:00 +0000397void CompileUnit::addAddress(DIE *Die, uint16_t Attribute,
David Blaikieea2605d2013-06-20 00:25:24 +0000398 const MachineLocation &Location, bool Indirect) {
Devang Patelba5fbf12011-04-26 19:06:18 +0000399 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
400
David Blaikieea2605d2013-06-20 00:25:24 +0000401 if (Location.isReg() && !Indirect)
Devang Patelba5fbf12011-04-26 19:06:18 +0000402 addRegisterOp(Block, Location.getReg());
David Blaikieea2605d2013-06-20 00:25:24 +0000403 else {
Devang Patelba5fbf12011-04-26 19:06:18 +0000404 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
David Blaikieea2605d2013-06-20 00:25:24 +0000405 if (Indirect && !Location.isReg()) {
406 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
407 }
408 }
Devang Patelba5fbf12011-04-26 19:06:18 +0000409
410 // Now attach the location information to the DIE.
411 addBlock(Die, Attribute, 0, Block);
412}
413
Devang Patel0e821f42011-04-12 23:21:44 +0000414/// addComplexAddress - Start with the address based on the location provided,
415/// and generate the DWARF information necessary to find the actual variable
416/// given the extra address information encoded in the DIVariable, starting from
417/// the starting location. Add the DWARF information to the die.
418///
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000419void CompileUnit::addComplexAddress(const DbgVariable &DV, DIE *Die,
Eric Christopher31b05762013-08-08 01:41:00 +0000420 uint16_t Attribute,
Devang Patel0e821f42011-04-12 23:21:44 +0000421 const MachineLocation &Location) {
Devang Patel0e821f42011-04-12 23:21:44 +0000422 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000423 unsigned N = DV.getNumAddrElements();
Devang Patel3e021532011-04-28 02:22:40 +0000424 unsigned i = 0;
425 if (Location.isReg()) {
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000426 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
Devang Patel3e021532011-04-28 02:22:40 +0000427 // If first address element is OpPlus then emit
428 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000429 addRegisterOffset(Block, Location.getReg(), DV.getAddrElement(1));
Devang Patel3e021532011-04-28 02:22:40 +0000430 i = 2;
431 } else
432 addRegisterOp(Block, Location.getReg());
Eric Christopherc2697f82013-10-19 01:04:47 +0000433 } else
Devang Patelba5fbf12011-04-26 19:06:18 +0000434 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel0e821f42011-04-12 23:21:44 +0000435
Eric Christopherc2697f82013-10-19 01:04:47 +0000436 for (; i < N; ++i) {
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000437 uint64_t Element = DV.getAddrElement(i);
Devang Patel0e821f42011-04-12 23:21:44 +0000438 if (Element == DIBuilder::OpPlus) {
439 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000440 addUInt(Block, 0, dwarf::DW_FORM_udata, DV.getAddrElement(++i));
Devang Patel0e821f42011-04-12 23:21:44 +0000441 } else if (Element == DIBuilder::OpDeref) {
Eric Christopher4d250522012-05-08 18:56:00 +0000442 if (!Location.isReg())
443 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Eric Christopherc2697f82013-10-19 01:04:47 +0000444 } else
445 llvm_unreachable("unknown DIBuilder Opcode");
Devang Patel0e821f42011-04-12 23:21:44 +0000446 }
447
448 // Now attach the location information to the DIE.
449 addBlock(Die, Attribute, 0, Block);
450}
451
452/* Byref variables, in Blocks, are declared by the programmer as "SomeType
453 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
454 gives the variable VarName either the struct, or a pointer to the struct, as
455 its type. This is necessary for various behind-the-scenes things the
456 compiler needs to do with by-reference variables in Blocks.
457
458 However, as far as the original *programmer* is concerned, the variable
459 should still have type 'SomeType', as originally declared.
460
461 The function getBlockByrefType dives into the __Block_byref_x_VarName
462 struct to find the original type of the variable, which is then assigned to
463 the variable's Debug Information Entry as its real type. So far, so good.
464 However now the debugger will expect the variable VarName to have the type
465 SomeType. So we need the location attribute for the variable to be an
466 expression that explains to the debugger how to navigate through the
467 pointers and struct to find the actual variable of type SomeType.
468
469 The following function does just that. We start by getting
470 the "normal" location for the variable. This will be the location
471 of either the struct __Block_byref_x_VarName or the pointer to the
472 struct __Block_byref_x_VarName.
473
474 The struct will look something like:
475
476 struct __Block_byref_x_VarName {
477 ... <various fields>
478 struct __Block_byref_x_VarName *forwarding;
479 ... <various other fields>
480 SomeType VarName;
481 ... <maybe more fields>
482 };
483
484 If we are given the struct directly (as our starting point) we
485 need to tell the debugger to:
486
487 1). Add the offset of the forwarding field.
488
489 2). Follow that pointer to get the real __Block_byref_x_VarName
490 struct to use (the real one may have been copied onto the heap).
491
492 3). Add the offset for the field VarName, to find the actual variable.
493
494 If we started with a pointer to the struct, then we need to
495 dereference that pointer first, before the other steps.
496 Translating this into DWARF ops, we will need to append the following
497 to the current location description for the variable:
498
499 DW_OP_deref -- optional, if we start with a pointer
500 DW_OP_plus_uconst <forward_fld_offset>
501 DW_OP_deref
502 DW_OP_plus_uconst <varName_fld_offset>
503
504 That is what this function does. */
505
506/// addBlockByrefAddress - Start with the address based on the location
507/// provided, and generate the DWARF information necessary to find the
508/// actual Block variable (navigating the Block struct) based on the
509/// starting location. Add the DWARF information to the die. For
510/// more information, read large comment just above here.
511///
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000512void CompileUnit::addBlockByrefAddress(const DbgVariable &DV, DIE *Die,
Eric Christopher31b05762013-08-08 01:41:00 +0000513 uint16_t Attribute,
Devang Patel0e821f42011-04-12 23:21:44 +0000514 const MachineLocation &Location) {
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000515 DIType Ty = DV.getType();
Devang Patel0e821f42011-04-12 23:21:44 +0000516 DIType TmpTy = Ty;
Eric Christopher31b05762013-08-08 01:41:00 +0000517 uint16_t Tag = Ty.getTag();
Devang Patel0e821f42011-04-12 23:21:44 +0000518 bool isPointer = false;
519
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000520 StringRef varName = DV.getName();
Devang Patel0e821f42011-04-12 23:21:44 +0000521
522 if (Tag == dwarf::DW_TAG_pointer_type) {
523 DIDerivedType DTy = DIDerivedType(Ty);
Manman Ren93b30902013-10-08 18:42:58 +0000524 TmpTy = resolve(DTy.getTypeDerivedFrom());
Devang Patel0e821f42011-04-12 23:21:44 +0000525 isPointer = true;
526 }
527
528 DICompositeType blockStruct = DICompositeType(TmpTy);
529
530 // Find the __forwarding field and the variable field in the __Block_byref
531 // struct.
532 DIArray Fields = blockStruct.getTypeArray();
533 DIDescriptor varField = DIDescriptor();
534 DIDescriptor forwardingField = DIDescriptor();
535
536 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
537 DIDescriptor Element = Fields.getElement(i);
538 DIDerivedType DT = DIDerivedType(Element);
539 StringRef fieldName = DT.getName();
540 if (fieldName == "__forwarding")
541 forwardingField = Element;
542 else if (fieldName == varName)
543 varField = Element;
544 }
545
546 // Get the offsets for the forwarding field and the variable field.
547 unsigned forwardingFieldOffset =
Eric Christopherc2697f82013-10-19 01:04:47 +0000548 DIDerivedType(forwardingField).getOffsetInBits() >> 3;
549 unsigned varFieldOffset = DIDerivedType(varField).getOffsetInBits() >> 3;
Devang Patel0e821f42011-04-12 23:21:44 +0000550
551 // Decode the original location, and use that as the start of the byref
552 // variable's location.
Devang Patel0e821f42011-04-12 23:21:44 +0000553 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
554
Eric Christopheref9d7102012-07-04 02:02:18 +0000555 if (Location.isReg())
556 addRegisterOp(Block, Location.getReg());
557 else
558 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel0e821f42011-04-12 23:21:44 +0000559
560 // If we started with a pointer to the __Block_byref... struct, then
561 // the first thing we need to do is dereference the pointer (DW_OP_deref).
562 if (isPointer)
563 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
564
565 // Next add the offset for the '__forwarding' field:
566 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
567 // adding the offset if it's 0.
568 if (forwardingFieldOffset > 0) {
569 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
570 addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
571 }
572
573 // Now dereference the __forwarding field to get to the real __Block_byref
574 // struct: DW_OP_deref.
575 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
576
577 // Now that we've got the real __Block_byref... struct, add the offset
578 // for the variable's field to get to the location of the actual variable:
579 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
580 if (varFieldOffset > 0) {
581 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
582 addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
583 }
584
585 // Now attach the location information to the DIE.
586 addBlock(Die, Attribute, 0, Block);
587}
588
Devang Patelbcd50a12011-07-20 21:57:04 +0000589/// isTypeSigned - Return true if the type is signed.
Manman Renb3388602013-10-05 01:43:03 +0000590static bool isTypeSigned(DwarfDebug *DD, DIType Ty, int *SizeInBits) {
Devang Patelbcd50a12011-07-20 21:57:04 +0000591 if (Ty.isDerivedType())
Manman Renb3388602013-10-05 01:43:03 +0000592 return isTypeSigned(DD, DD->resolve(DIDerivedType(Ty).getTypeDerivedFrom()),
593 SizeInBits);
Devang Patelbcd50a12011-07-20 21:57:04 +0000594 if (Ty.isBasicType())
Eric Christopherc2697f82013-10-19 01:04:47 +0000595 if (DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed ||
596 DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed_char) {
Devang Patelbcd50a12011-07-20 21:57:04 +0000597 *SizeInBits = Ty.getSizeInBits();
598 return true;
599 }
600 return false;
601}
602
Manman Renb3388602013-10-05 01:43:03 +0000603/// Return true if type encoding is unsigned.
604static bool isUnsignedDIType(DwarfDebug *DD, DIType Ty) {
605 DIDerivedType DTy(Ty);
606 if (DTy.isDerivedType())
607 return isUnsignedDIType(DD, DD->resolve(DTy.getTypeDerivedFrom()));
608
609 DIBasicType BTy(Ty);
610 if (BTy.isBasicType()) {
611 unsigned Encoding = BTy.getEncoding();
612 if (Encoding == dwarf::DW_ATE_unsigned ||
613 Encoding == dwarf::DW_ATE_unsigned_char ||
614 Encoding == dwarf::DW_ATE_boolean)
615 return true;
616 }
617 return false;
618}
619
620/// If this type is derived from a base type then return base type size.
Manman Renbda410f2013-10-08 18:46:58 +0000621static uint64_t getBaseTypeSize(DwarfDebug *DD, DIDerivedType Ty) {
Manman Renb3388602013-10-05 01:43:03 +0000622 unsigned Tag = Ty.getTag();
623
624 if (Tag != dwarf::DW_TAG_member && Tag != dwarf::DW_TAG_typedef &&
625 Tag != dwarf::DW_TAG_const_type && Tag != dwarf::DW_TAG_volatile_type &&
626 Tag != dwarf::DW_TAG_restrict_type)
627 return Ty.getSizeInBits();
628
629 DIType BaseType = DD->resolve(Ty.getTypeDerivedFrom());
630
631 // If this type is not derived from any type then take conservative approach.
632 if (!BaseType.isValid())
633 return Ty.getSizeInBits();
634
635 // If this is a derived type, go ahead and get the base type, unless it's a
636 // reference then it's just the size of the field. Pointer types have no need
637 // of this since they're a different type of qualification on the type.
638 if (BaseType.getTag() == dwarf::DW_TAG_reference_type ||
639 BaseType.getTag() == dwarf::DW_TAG_rvalue_reference_type)
640 return Ty.getSizeInBits();
641
642 if (BaseType.isDerivedType())
Manman Renbda410f2013-10-08 18:46:58 +0000643 return getBaseTypeSize(DD, DIDerivedType(BaseType));
Manman Renb3388602013-10-05 01:43:03 +0000644
645 return BaseType.getSizeInBits();
646}
647
Devang Patel0e821f42011-04-12 23:21:44 +0000648/// addConstantValue - Add constant value entry in variable DIE.
Eric Christopher78fcf4902013-07-03 01:08:30 +0000649void CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO,
Devang Patel3c6aed22011-05-27 16:45:18 +0000650 DIType Ty) {
David Blaikiea1e813d2013-05-10 21:52:07 +0000651 // FIXME: This is a bit conservative/simple - it emits negative values at
652 // their maximum bit width which is a bit unfortunate (& doesn't prefer
653 // udata/sdata over dataN as suggested by the DWARF spec)
Nick Lewycky654f5ce2011-10-26 22:55:33 +0000654 assert(MO.isImm() && "Invalid machine operand!");
Devang Patelbcd50a12011-07-20 21:57:04 +0000655 int SizeInBits = -1;
Manman Renb3388602013-10-05 01:43:03 +0000656 bool SignedConstant = isTypeSigned(DD, Ty, &SizeInBits);
Eric Christopher9d1daa82013-08-27 23:49:04 +0000657 uint16_t Form;
Devang Patelf1d04702011-05-27 18:15:52 +0000658
Eric Christopher9d1daa82013-08-27 23:49:04 +0000659 // If we're a signed constant definitely use sdata.
660 if (SignedConstant) {
661 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, MO.getImm());
662 return;
663 }
664
665 // Else use data for now unless it's larger than we can deal with.
666 switch (SizeInBits) {
667 case 8:
668 Form = dwarf::DW_FORM_data1;
669 break;
670 case 16:
671 Form = dwarf::DW_FORM_data2;
672 break;
673 case 32:
674 Form = dwarf::DW_FORM_data4;
675 break;
676 case 64:
677 Form = dwarf::DW_FORM_data8;
678 break;
679 default:
680 Form = dwarf::DW_FORM_udata;
681 addUInt(Die, dwarf::DW_AT_const_value, Form, MO.getImm());
682 return;
683 }
684 addUInt(Die, dwarf::DW_AT_const_value, Form, MO.getImm());
Devang Patel0e821f42011-04-12 23:21:44 +0000685}
686
687/// addConstantFPValue - Add constant value entry in variable DIE.
Eric Christopher78fcf4902013-07-03 01:08:30 +0000688void CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
Eric Christopherc2697f82013-10-19 01:04:47 +0000689 assert(MO.isFPImm() && "Invalid machine operand!");
Devang Patel0e821f42011-04-12 23:21:44 +0000690 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
691 APFloat FPImm = MO.getFPImm()->getValueAPF();
692
693 // Get the raw data form of the floating point.
694 const APInt FltVal = FPImm.bitcastToAPInt();
Eric Christopherc2697f82013-10-19 01:04:47 +0000695 const char *FltPtr = (const char *)FltVal.getRawData();
Devang Patel0e821f42011-04-12 23:21:44 +0000696
697 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
Micah Villmowcdfe20b2012-10-08 16:38:25 +0000698 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel0e821f42011-04-12 23:21:44 +0000699 int Incr = (LittleEndian ? 1 : -1);
700 int Start = (LittleEndian ? 0 : NumBytes - 1);
701 int Stop = (LittleEndian ? NumBytes : -1);
702
703 // Output the constant to DWARF one byte at a time.
704 for (; Start != Stop; Start += Incr)
705 addUInt(Block, 0, dwarf::DW_FORM_data1,
706 (unsigned char)0xFF & FltPtr[Start]);
707
708 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
Devang Patel0e821f42011-04-12 23:21:44 +0000709}
710
David Blaikiea39a76e2013-01-20 01:18:01 +0000711/// addConstantFPValue - Add constant value entry in variable DIE.
Eric Christopher78fcf4902013-07-03 01:08:30 +0000712void CompileUnit::addConstantFPValue(DIE *Die, const ConstantFP *CFP) {
Eric Christopher9d1daa82013-08-27 23:49:04 +0000713 // Pass this down to addConstantValue as an unsigned bag of bits.
714 addConstantValue(Die, CFP->getValueAPF().bitcastToAPInt(), true);
David Blaikiea39a76e2013-01-20 01:18:01 +0000715}
716
Devang Patel0e821f42011-04-12 23:21:44 +0000717/// addConstantValue - Add constant value entry in variable DIE.
Eric Christopher78fcf4902013-07-03 01:08:30 +0000718void CompileUnit::addConstantValue(DIE *Die, const ConstantInt *CI,
Devang Patel0e821f42011-04-12 23:21:44 +0000719 bool Unsigned) {
Eric Christopher78fcf4902013-07-03 01:08:30 +0000720 addConstantValue(Die, CI->getValue(), Unsigned);
David Blaikiea39a76e2013-01-20 01:18:01 +0000721}
722
723// addConstantValue - Add constant value entry in variable DIE.
Eric Christopher78fcf4902013-07-03 01:08:30 +0000724void CompileUnit::addConstantValue(DIE *Die, const APInt &Val, bool Unsigned) {
David Blaikiea39a76e2013-01-20 01:18:01 +0000725 unsigned CIBitWidth = Val.getBitWidth();
Devang Patel8816bbc2011-05-28 00:39:18 +0000726 if (CIBitWidth <= 64) {
Eric Christopher9d1daa82013-08-27 23:49:04 +0000727 // If we're a signed constant definitely use sdata.
728 if (!Unsigned) {
729 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata,
730 Val.getSExtValue());
731 return;
Devang Patel8816bbc2011-05-28 00:39:18 +0000732 }
Eric Christopher9d1daa82013-08-27 23:49:04 +0000733
734 // Else use data for now unless it's larger than we can deal with.
735 uint16_t Form;
736 switch (CIBitWidth) {
737 case 8:
738 Form = dwarf::DW_FORM_data1;
739 break;
740 case 16:
741 Form = dwarf::DW_FORM_data2;
742 break;
743 case 32:
744 Form = dwarf::DW_FORM_data4;
745 break;
746 case 64:
747 Form = dwarf::DW_FORM_data8;
748 break;
749 default:
750 addUInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
751 Val.getZExtValue());
752 return;
753 }
754 addUInt(Die, dwarf::DW_AT_const_value, Form, Val.getZExtValue());
Eric Christopher78fcf4902013-07-03 01:08:30 +0000755 return;
Devang Patel0e821f42011-04-12 23:21:44 +0000756 }
757
758 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
759
760 // Get the raw data form of the large APInt.
NAKAMURA Takumi29ccdd82011-10-28 14:12:22 +0000761 const uint64_t *Ptr64 = Val.getRawData();
Devang Patel0e821f42011-04-12 23:21:44 +0000762
763 int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
Micah Villmowcdfe20b2012-10-08 16:38:25 +0000764 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel0e821f42011-04-12 23:21:44 +0000765
766 // Output the constant to DWARF one byte at a time.
NAKAMURA Takumi29ccdd82011-10-28 14:12:22 +0000767 for (int i = 0; i < NumBytes; i++) {
768 uint8_t c;
769 if (LittleEndian)
770 c = Ptr64[i / 8] >> (8 * (i & 7));
771 else
772 c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7));
773 addUInt(Block, 0, dwarf::DW_FORM_data1, c);
774 }
Devang Patel0e821f42011-04-12 23:21:44 +0000775
776 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
Devang Patel0e821f42011-04-12 23:21:44 +0000777}
778
Eric Christopher25e35092013-04-22 07:47:40 +0000779/// addTemplateParams - Add template parameters into buffer.
Devang Patel0e821f42011-04-12 23:21:44 +0000780void CompileUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
781 // Add template parameters.
782 for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) {
783 DIDescriptor Element = TParams.getElement(i);
784 if (Element.isTemplateTypeParameter())
Eric Christopherc2697f82013-10-19 01:04:47 +0000785 getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter(Element),
786 Buffer);
Devang Patel0e821f42011-04-12 23:21:44 +0000787 else if (Element.isTemplateValueParameter())
Eric Christopherc2697f82013-10-19 01:04:47 +0000788 getOrCreateTemplateValueParameterDIE(DITemplateValueParameter(Element),
789 Buffer);
Devang Patel0e821f42011-04-12 23:21:44 +0000790 }
Devang Patel0e821f42011-04-12 23:21:44 +0000791}
Nick Lewycky654f5ce2011-10-26 22:55:33 +0000792
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000793/// getOrCreateContextDIE - Get context owner's DIE.
Eric Christopher08f7c8f2013-10-04 23:49:26 +0000794DIE *CompileUnit::getOrCreateContextDIE(DIScope Context) {
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000795 if (Context.isType())
796 return getOrCreateTypeDIE(DIType(Context));
797 else if (Context.isNameSpace())
798 return getOrCreateNameSpace(DINameSpace(Context));
799 else if (Context.isSubprogram())
800 return getOrCreateSubprogramDIE(DISubprogram(Context));
Eric Christopher25e35092013-04-22 07:47:40 +0000801 else
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000802 return getDIE(Context);
803}
804
Devang Patel0e821f42011-04-12 23:21:44 +0000805/// addToContextOwner - Add Die into the list of its context owner's children.
Eric Christopher08f7c8f2013-10-04 23:49:26 +0000806void CompileUnit::addToContextOwner(DIE *Die, DIScope Context) {
David Blaikie811bfe62013-10-03 20:07:20 +0000807 assert(!Die->getParent());
808 if (DIE *ContextDIE = getOrCreateContextDIE(Context)) {
809 if (Die->getParent()) {
810 // While creating the context, if this is a type member, we will have
811 // added the child to the context already.
812 assert(Die->getParent() == ContextDIE);
813 return;
814 }
Devang Patel0e821f42011-04-12 23:21:44 +0000815 ContextDIE->addChild(Die);
David Blaikie811bfe62013-10-03 20:07:20 +0000816 } else
Devang Patel0e821f42011-04-12 23:21:44 +0000817 addDie(Die);
818}
819
820/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
821/// given DIType.
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000822DIE *CompileUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
823 DIType Ty(TyNode);
Manman Ren7504ed42013-07-08 18:33:29 +0000824 if (!Ty.isType())
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000825 return NULL;
Eric Christophere595bae2013-10-04 17:08:38 +0000826 DIE *TyDIE = getDIE(Ty);
Devang Patel0e821f42011-04-12 23:21:44 +0000827 if (TyDIE)
828 return TyDIE;
829
830 // Create new type.
David Blaikiefac56122013-10-04 23:21:16 +0000831 TyDIE = new DIE(Ty.getTag());
Eric Christophere595bae2013-10-04 17:08:38 +0000832 insertDIE(Ty, TyDIE);
Devang Patel0e821f42011-04-12 23:21:44 +0000833 if (Ty.isBasicType())
834 constructTypeDIE(*TyDIE, DIBasicType(Ty));
835 else if (Ty.isCompositeType())
836 constructTypeDIE(*TyDIE, DICompositeType(Ty));
837 else {
838 assert(Ty.isDerivedType() && "Unknown kind of DIType");
839 constructTypeDIE(*TyDIE, DIDerivedType(Ty));
840 }
Eric Christophere2887932011-11-10 19:52:58 +0000841 // If this is a named finished type then include it in the list of types
842 // for the accelerator tables.
Eric Christopher21bde872012-01-06 04:35:23 +0000843 if (!Ty.getName().empty() && !Ty.isForwardDecl()) {
844 bool IsImplementation = 0;
845 if (Ty.isCompositeType()) {
846 DICompositeType CT(Ty);
Eric Christopher8ea8e4f2012-01-06 23:03:37 +0000847 // A runtime language of 0 actually means C/C++ and that any
848 // non-negative value is some version of Objective-C/C++.
Eric Christopherc2697f82013-10-19 01:04:47 +0000849 IsImplementation = (CT.getRunTimeLang() == 0) || CT.isObjcClassComplete();
Eric Christopher21bde872012-01-06 04:35:23 +0000850 }
Eric Christophercf7289f2013-09-05 18:20:16 +0000851 unsigned Flags = IsImplementation ? dwarf::DW_FLAG_type_implementation : 0;
Eric Christopher8ea8e4f2012-01-06 23:03:37 +0000852 addAccelType(Ty.getName(), std::make_pair(TyDIE, Flags));
Eric Christopher21bde872012-01-06 04:35:23 +0000853 }
Eric Christopher92331fd2012-11-21 00:34:38 +0000854
Eric Christopher9e429ae2013-10-05 00:27:02 +0000855 addToContextOwner(TyDIE, resolve(Ty.getContext()));
Devang Patel0e821f42011-04-12 23:21:44 +0000856 return TyDIE;
857}
858
859/// addType - Add a new type attribute to the specified entity.
Eric Christopher31b05762013-08-08 01:41:00 +0000860void CompileUnit::addType(DIE *Entity, DIType Ty, uint16_t Attribute) {
Eric Christopher0df08e22013-08-08 07:40:37 +0000861 assert(Ty && "Trying to add a type that doesn't exist?");
Devang Patel0e821f42011-04-12 23:21:44 +0000862
863 // Check for pre-existence.
864 DIEEntry *Entry = getDIEEntry(Ty);
865 // If it exists then use the existing value.
866 if (Entry) {
Eric Christophere595bae2013-10-04 17:08:38 +0000867 Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
Devang Patel0e821f42011-04-12 23:21:44 +0000868 return;
869 }
870
871 // Construct type.
872 DIE *Buffer = getOrCreateTypeDIE(Ty);
873
874 // Set up proxy.
875 Entry = createDIEEntry(Buffer);
876 insertDIEEntry(Ty, Entry);
Eric Christophere595bae2013-10-04 17:08:38 +0000877 Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
Devang Patele9853f22011-05-31 22:56:51 +0000878
879 // If this is a complete composite type then include it in the
880 // list of global types.
Devang Patel562c7422011-06-01 00:23:24 +0000881 addGlobalType(Ty);
Devang Patel1cb8ab42011-05-31 23:30:30 +0000882}
883
Eric Christopher9cd26af2013-09-20 23:22:52 +0000884// Accelerator table mutators - add each name along with its companion
885// DIE to the proper table while ensuring that the name that we're going
886// to reference is in the string table. We do this since the names we
887// add may not only be identical to the names in the DIE.
888void CompileUnit::addAccelName(StringRef Name, DIE *Die) {
889 DU->getStringPoolEntry(Name);
Eric Christopherb0fc0b92013-09-23 22:59:11 +0000890 std::vector<DIE *> &DIEs = AccelNames[Name];
Eric Christopher9cd26af2013-09-20 23:22:52 +0000891 DIEs.push_back(Die);
892}
893
894void CompileUnit::addAccelObjC(StringRef Name, DIE *Die) {
895 DU->getStringPoolEntry(Name);
Eric Christopherb0fc0b92013-09-23 22:59:11 +0000896 std::vector<DIE *> &DIEs = AccelObjC[Name];
Eric Christopher9cd26af2013-09-20 23:22:52 +0000897 DIEs.push_back(Die);
898}
899
900void CompileUnit::addAccelNamespace(StringRef Name, DIE *Die) {
901 DU->getStringPoolEntry(Name);
Eric Christopherb0fc0b92013-09-23 22:59:11 +0000902 std::vector<DIE *> &DIEs = AccelNamespace[Name];
Eric Christopher9cd26af2013-09-20 23:22:52 +0000903 DIEs.push_back(Die);
904}
905
906void CompileUnit::addAccelType(StringRef Name, std::pair<DIE *, unsigned> Die) {
907 DU->getStringPoolEntry(Name);
908 std::vector<std::pair<DIE *, unsigned> > &DIEs = AccelTypes[Name];
909 DIEs.push_back(Die);
910}
911
Eric Christopher9c58f312013-09-20 22:20:55 +0000912/// addGlobalName - Add a new global name to the compile unit.
Eric Christopher2c8b7902013-10-17 02:06:06 +0000913void CompileUnit::addGlobalName(StringRef Name, DIE *Die, DIScope Context) {
Eric Christopher8dba0d52013-10-19 01:04:42 +0000914 std::string FullName = getParentContextString(Context) + Name.str();
Eric Christopher2c8b7902013-10-17 02:06:06 +0000915 GlobalNames[FullName] = Die;
Eric Christopher9c58f312013-09-20 22:20:55 +0000916}
917
Devang Patel1cb8ab42011-05-31 23:30:30 +0000918/// addGlobalType - Add a new global type to the compile unit.
919///
Devang Patel562c7422011-06-01 00:23:24 +0000920void CompileUnit::addGlobalType(DIType Ty) {
Eric Christopher9e429ae2013-10-05 00:27:02 +0000921 DIScope Context = resolve(Ty.getContext());
Eric Christopher6d0f1e62013-09-23 23:15:58 +0000922 if (!Ty.getName().empty() && !Ty.isForwardDecl() &&
Eric Christopherb0fc0b92013-09-23 22:59:11 +0000923 (!Context || Context.isCompileUnit() || Context.isFile() ||
924 Context.isNameSpace()))
Eric Christopher2c8b7902013-10-17 02:06:06 +0000925 if (DIEEntry *Entry = getDIEEntry(Ty)) {
Eric Christopher8dba0d52013-10-19 01:04:42 +0000926 std::string FullName =
927 getParentContextString(Context) + Ty.getName().str();
Eric Christopherc2697f82013-10-19 01:04:47 +0000928 GlobalTypes[FullName] = Entry->getEntry();
Eric Christopher2c8b7902013-10-17 02:06:06 +0000929 }
930}
931
932/// getParentContextString - Walks the metadata parent chain in a language
933/// specific manner (using the compile unit language) and returns
934/// it as a string. This is done at the metadata level because DIEs may
935/// not currently have been added to the parent context and walking the
936/// DIEs looking for names is more expensive than walking the metadata.
937std::string CompileUnit::getParentContextString(DIScope Context) const {
938 if (!Context)
939 return "";
940
941 // FIXME: Decide whether to implement this for non-C++ languages.
942 if (getLanguage() != dwarf::DW_LANG_C_plus_plus)
943 return "";
944
Eric Christopher8dba0d52013-10-19 01:04:42 +0000945 std::string CS;
Eric Christopher2c8b7902013-10-17 02:06:06 +0000946 SmallVector<DIScope, 1> Parents;
947 while (!Context.isCompileUnit()) {
948 Parents.push_back(Context);
949 if (Context.getContext())
950 Context = resolve(Context.getContext());
951 else
952 // Structure, etc types will have a NULL context if they're at the top
953 // level.
954 break;
955 }
956
957 // Reverse iterate over our list to go from the outermost construct to the
958 // innermost.
959 for (SmallVectorImpl<DIScope>::reverse_iterator I = Parents.rbegin(),
960 E = Parents.rend();
961 I != E; ++I) {
962 DIScope Ctx = *I;
963 StringRef Name = Ctx.getName();
Eric Christopher8dba0d52013-10-19 01:04:42 +0000964 if (!Name.empty()) {
Eric Christopher2c8b7902013-10-17 02:06:06 +0000965 CS += Name;
966 CS += "::";
967 }
968 }
969 return CS;
Devang Patel0e821f42011-04-12 23:21:44 +0000970}
971
Eric Christopherfa205ca2013-10-05 00:05:51 +0000972/// addPubTypes - Add subprogram argument types for pubtypes section.
Devang Patel17b53272011-05-06 16:57:54 +0000973void CompileUnit::addPubTypes(DISubprogram SP) {
974 DICompositeType SPTy = SP.getType();
Eric Christopher31b05762013-08-08 01:41:00 +0000975 uint16_t SPTag = SPTy.getTag();
Devang Patel17b53272011-05-06 16:57:54 +0000976 if (SPTag != dwarf::DW_TAG_subroutine_type)
977 return;
978
979 DIArray Args = SPTy.getTypeArray();
980 for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
981 DIType ATy(Args.getElement(i));
Manman Ren7504ed42013-07-08 18:33:29 +0000982 if (!ATy.isType())
Devang Patel17b53272011-05-06 16:57:54 +0000983 continue;
Devang Patel562c7422011-06-01 00:23:24 +0000984 addGlobalType(ATy);
Devang Patel17b53272011-05-06 16:57:54 +0000985 }
986}
987
Devang Patel0e821f42011-04-12 23:21:44 +0000988/// constructTypeDIE - Construct basic type die from DIBasicType.
989void CompileUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
990 // Get core information.
991 StringRef Name = BTy.getName();
Devang Patel0e821f42011-04-12 23:21:44 +0000992 // Add name if not anonymous or intermediate type.
993 if (!Name.empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +0000994 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel04d6d472011-09-14 23:13:28 +0000995
David Blaikiefac56122013-10-04 23:21:16 +0000996 // An unspecified type only has a name attribute.
997 if (BTy.getTag() == dwarf::DW_TAG_unspecified_type)
Devang Patel04d6d472011-09-14 23:13:28 +0000998 return;
Devang Patel04d6d472011-09-14 23:13:28 +0000999
Nick Lewycky654f5ce2011-10-26 22:55:33 +00001000 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
Devang Pateld925d1a2012-02-07 23:33:58 +00001001 BTy.getEncoding());
Devang Patel04d6d472011-09-14 23:13:28 +00001002
Devang Patel0e821f42011-04-12 23:21:44 +00001003 uint64_t Size = BTy.getSizeInBits() >> 3;
1004 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
1005}
1006
1007/// constructTypeDIE - Construct derived type die from DIDerivedType.
1008void CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
1009 // Get core information.
1010 StringRef Name = DTy.getName();
1011 uint64_t Size = DTy.getSizeInBits() >> 3;
David Blaikiefac56122013-10-04 23:21:16 +00001012 uint16_t Tag = Buffer.getTag();
Devang Patel0e821f42011-04-12 23:21:44 +00001013
1014 // Map to main type, void will not have a type.
Manman Ren93b30902013-10-08 18:42:58 +00001015 DIType FromTy = resolve(DTy.getTypeDerivedFrom());
Eric Christopher0df08e22013-08-08 07:40:37 +00001016 if (FromTy)
1017 addType(&Buffer, FromTy);
Devang Patel0e821f42011-04-12 23:21:44 +00001018
1019 // Add name if not anonymous or intermediate type.
1020 if (!Name.empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +00001021 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel0e821f42011-04-12 23:21:44 +00001022
1023 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopher85757902012-02-21 22:25:53 +00001024 if (Size && Tag != dwarf::DW_TAG_pointer_type)
Devang Patel0e821f42011-04-12 23:21:44 +00001025 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
1026
David Blaikie5d3249b2013-01-07 05:51:15 +00001027 if (Tag == dwarf::DW_TAG_ptr_to_member_type)
Eric Christopherc2697f82013-10-19 01:04:47 +00001028 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type,
1029 getOrCreateTypeDIE(resolve(DTy.getClassType())));
Devang Patel0e821f42011-04-12 23:21:44 +00001030 // Add source line info if available and TyDesc is not a forward declaration.
1031 if (!DTy.isForwardDecl())
1032 addSourceLine(&Buffer, DTy);
1033}
1034
Eric Christopher67646432013-07-26 17:02:41 +00001035/// Return true if the type is appropriately scoped to be contained inside
1036/// its own type unit.
Manman Ren33796c52013-09-09 19:23:58 +00001037static bool isTypeUnitScoped(DIType Ty, const DwarfDebug *DD) {
Manman Ren116868e2013-09-09 19:47:11 +00001038 DIScope Parent = DD->resolve(Ty.getContext());
Eric Christopher67646432013-07-26 17:02:41 +00001039 while (Parent) {
1040 // Don't generate a hash for anything scoped inside a function.
1041 if (Parent.isSubprogram())
1042 return false;
Manman Rende897a362013-09-09 22:35:23 +00001043 Parent = DD->resolve(Parent.getContext());
Eric Christopher67646432013-07-26 17:02:41 +00001044 }
1045 return true;
1046}
1047
1048/// Return true if the type should be split out into a type unit.
Manman Ren33796c52013-09-09 19:23:58 +00001049static bool shouldCreateTypeUnit(DICompositeType CTy, const DwarfDebug *DD) {
Eric Christopher31b05762013-08-08 01:41:00 +00001050 uint16_t Tag = CTy.getTag();
Eric Christopher67646432013-07-26 17:02:41 +00001051
1052 switch (Tag) {
1053 case dwarf::DW_TAG_structure_type:
1054 case dwarf::DW_TAG_union_type:
1055 case dwarf::DW_TAG_enumeration_type:
1056 case dwarf::DW_TAG_class_type:
1057 // If this is a class, structure, union, or enumeration type
David Blaikie93ff1eb2013-10-04 23:52:02 +00001058 // that is a definition (not a declaration), and not scoped
Eric Christopher67646432013-07-26 17:02:41 +00001059 // inside a function then separate this out as a type unit.
David Blaikie93ff1eb2013-10-04 23:52:02 +00001060 return !CTy.isForwardDecl() && isTypeUnitScoped(CTy, DD);
Eric Christopher67646432013-07-26 17:02:41 +00001061 default:
David Blaikie93ff1eb2013-10-04 23:52:02 +00001062 return false;
Eric Christopher67646432013-07-26 17:02:41 +00001063 }
1064}
1065
Devang Patel0e821f42011-04-12 23:21:44 +00001066/// constructTypeDIE - Construct type DIE from DICompositeType.
1067void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
1068 // Get core information.
1069 StringRef Name = CTy.getName();
1070
1071 uint64_t Size = CTy.getSizeInBits() >> 3;
David Blaikiefac56122013-10-04 23:21:16 +00001072 uint16_t Tag = Buffer.getTag();
Devang Patel0e821f42011-04-12 23:21:44 +00001073
1074 switch (Tag) {
Devang Patel0e821f42011-04-12 23:21:44 +00001075 case dwarf::DW_TAG_array_type:
1076 constructArrayTypeDIE(Buffer, &CTy);
1077 break;
1078 case dwarf::DW_TAG_enumeration_type: {
1079 DIArray Elements = CTy.getTypeArray();
1080
1081 // Add enumerators to enumeration type.
1082 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
Devang Patel0e821f42011-04-12 23:21:44 +00001083 DIDescriptor Enum(Elements.getElement(i));
Manman Ren7cc62702013-10-18 21:14:19 +00001084 if (Enum.isEnumerator())
Benjamin Kramer6ddca572013-10-19 16:32:15 +00001085 constructEnumTypeDIE(DIEnumerator(Enum), Buffer);
Devang Patel0e821f42011-04-12 23:21:44 +00001086 }
Manman Ren93b30902013-10-08 18:42:58 +00001087 DIType DTy = resolve(CTy.getTypeDerivedFrom());
Eric Christopher49e17b22013-08-08 07:40:42 +00001088 if (DTy) {
Eric Christopherc4964352012-05-23 00:09:20 +00001089 addType(&Buffer, DTy);
Eric Christopher6b8209b2013-10-04 22:40:10 +00001090 addFlag(&Buffer, dwarf::DW_AT_enum_class);
Eric Christopherc4964352012-05-23 00:09:20 +00001091 }
Eric Christopherc2697f82013-10-19 01:04:47 +00001092 } break;
Devang Patel0e821f42011-04-12 23:21:44 +00001093 case dwarf::DW_TAG_subroutine_type: {
Eric Christopher0df08e22013-08-08 07:40:37 +00001094 // Add return type. A void return won't have a type.
Devang Patel0e821f42011-04-12 23:21:44 +00001095 DIArray Elements = CTy.getTypeArray();
1096 DIDescriptor RTy = Elements.getElement(0);
Eric Christopher0df08e22013-08-08 07:40:37 +00001097 if (RTy)
1098 addType(&Buffer, DIType(RTy));
Devang Patel0e821f42011-04-12 23:21:44 +00001099
1100 bool isPrototyped = true;
1101 // Add arguments.
1102 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
1103 DIDescriptor Ty = Elements.getElement(i);
1104 if (Ty.isUnspecifiedParameter()) {
1105 DIE *Arg = new DIE(dwarf::DW_TAG_unspecified_parameters);
1106 Buffer.addChild(Arg);
1107 isPrototyped = false;
1108 } else {
1109 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1110 addType(Arg, DIType(Ty));
David Blaikie9a7a7a92013-01-29 19:35:24 +00001111 if (DIType(Ty).isArtificial())
1112 addFlag(Arg, dwarf::DW_AT_artificial);
Devang Patel0e821f42011-04-12 23:21:44 +00001113 Buffer.addChild(Arg);
1114 }
1115 }
Eric Christopher5cd2a9d2012-02-22 08:46:21 +00001116 // Add prototype flag if we're dealing with a C language and the
1117 // function has been prototyped.
Eric Christopherbfceb2f2013-08-26 23:50:38 +00001118 uint16_t Language = DICompileUnit(Node).getLanguage();
Eric Christopher5cd2a9d2012-02-22 08:46:21 +00001119 if (isPrototyped &&
Eric Christopherc2697f82013-10-19 01:04:47 +00001120 (Language == dwarf::DW_LANG_C89 || Language == dwarf::DW_LANG_C99 ||
Eric Christopherd42b92f2012-05-22 18:45:24 +00001121 Language == dwarf::DW_LANG_ObjC))
Eric Christopherbb69a272012-08-24 01:14:27 +00001122 addFlag(&Buffer, dwarf::DW_AT_prototyped);
Eric Christopherc2697f82013-10-19 01:04:47 +00001123 } break;
Devang Patel0e821f42011-04-12 23:21:44 +00001124 case dwarf::DW_TAG_structure_type:
1125 case dwarf::DW_TAG_union_type:
1126 case dwarf::DW_TAG_class_type: {
Devang Patel0e821f42011-04-12 23:21:44 +00001127 // Add elements to structure type.
David Blaikiea1ae0e62013-08-01 20:30:22 +00001128 DIArray Elements = CTy.getTypeArray();
1129 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
Devang Patel0e821f42011-04-12 23:21:44 +00001130 DIDescriptor Element = Elements.getElement(i);
1131 DIE *ElemDie = NULL;
1132 if (Element.isSubprogram()) {
1133 DISubprogram SP(Element);
Devang Patel89543712011-08-15 17:24:54 +00001134 ElemDie = getOrCreateSubprogramDIE(DISubprogram(Element));
Devang Patel0e821f42011-04-12 23:21:44 +00001135 if (SP.isProtected())
Nick Lewyckycb918492011-12-13 05:09:11 +00001136 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001137 dwarf::DW_ACCESS_protected);
1138 else if (SP.isPrivate())
Nick Lewyckycb918492011-12-13 05:09:11 +00001139 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001140 dwarf::DW_ACCESS_private);
Eric Christopher92331fd2012-11-21 00:34:38 +00001141 else
Nick Lewyckycb918492011-12-13 05:09:11 +00001142 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Eric Christopherc2697f82013-10-19 01:04:47 +00001143 dwarf::DW_ACCESS_public);
Devang Patel0e821f42011-04-12 23:21:44 +00001144 if (SP.isExplicit())
Eric Christopherbb69a272012-08-24 01:14:27 +00001145 addFlag(ElemDie, dwarf::DW_AT_explicit);
Eric Christopher7285c7d2012-03-28 07:34:31 +00001146 } else if (Element.isDerivedType()) {
Eric Christopherd42b92f2012-05-22 18:45:24 +00001147 DIDerivedType DDTy(Element);
1148 if (DDTy.getTag() == dwarf::DW_TAG_friend) {
1149 ElemDie = new DIE(dwarf::DW_TAG_friend);
Manman Ren93b30902013-10-08 18:42:58 +00001150 addType(ElemDie, resolve(DDTy.getTypeDerivedFrom()),
Manman Renb3388602013-10-05 01:43:03 +00001151 dwarf::DW_AT_friend);
Manman Renc6b63922013-10-14 20:33:57 +00001152 Buffer.addChild(ElemDie);
1153 } else if (DDTy.isStaticMember()) {
1154 ElemDie = getOrCreateStaticMemberDIE(DDTy);
1155 } else {
Manman Ren7cc62702013-10-18 21:14:19 +00001156 ElemDie = createMemberDIE(DDTy, Buffer);
Manman Renc6b63922013-10-14 20:33:57 +00001157 }
Eric Christopher7285c7d2012-03-28 07:34:31 +00001158 } else if (Element.isObjCProperty()) {
Devang Pateld925d1a2012-02-07 23:33:58 +00001159 DIObjCProperty Property(Element);
1160 ElemDie = new DIE(Property.getTag());
1161 StringRef PropertyName = Property.getObjCPropertyName();
1162 addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
Eric Christopherd42b92f2012-05-22 18:45:24 +00001163 addType(ElemDie, Property.getType());
1164 addSourceLine(ElemDie, Property);
Devang Pateld925d1a2012-02-07 23:33:58 +00001165 StringRef GetterName = Property.getObjCPropertyGetterName();
1166 if (!GetterName.empty())
1167 addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
1168 StringRef SetterName = Property.getObjCPropertySetterName();
1169 if (!SetterName.empty())
1170 addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
1171 unsigned PropertyAttributes = 0;
Devang Patel403e8192012-02-04 01:30:32 +00001172 if (Property.isReadOnlyObjCProperty())
1173 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
1174 if (Property.isReadWriteObjCProperty())
1175 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
1176 if (Property.isAssignObjCProperty())
1177 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
1178 if (Property.isRetainObjCProperty())
1179 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
1180 if (Property.isCopyObjCProperty())
1181 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
1182 if (Property.isNonAtomicObjCProperty())
1183 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
1184 if (PropertyAttributes)
Eric Christopher92331fd2012-11-21 00:34:38 +00001185 addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, 0,
Eric Christopherc2697f82013-10-19 01:04:47 +00001186 PropertyAttributes);
Devang Patel44882172012-02-06 17:49:43 +00001187
Devang Pateld925d1a2012-02-07 23:33:58 +00001188 DIEEntry *Entry = getDIEEntry(Element);
1189 if (!Entry) {
1190 Entry = createDIEEntry(ElemDie);
1191 insertDIEEntry(Element, Entry);
1192 }
David Blaikie811bfe62013-10-03 20:07:20 +00001193 Buffer.addChild(ElemDie);
Devang Patel403e8192012-02-04 01:30:32 +00001194 } else
Devang Patel0e821f42011-04-12 23:21:44 +00001195 continue;
Devang Patel0e821f42011-04-12 23:21:44 +00001196 }
1197
1198 if (CTy.isAppleBlockExtension())
Eric Christopherbb69a272012-08-24 01:14:27 +00001199 addFlag(&Buffer, dwarf::DW_AT_APPLE_block);
Devang Patel0e821f42011-04-12 23:21:44 +00001200
Eric Christopher9e429ae2013-10-05 00:27:02 +00001201 DICompositeType ContainingType(resolve(CTy.getContainingType()));
Devang Patel0e821f42011-04-12 23:21:44 +00001202 if (DIDescriptor(ContainingType).isCompositeType())
Manman Ren4c4b69c2013-10-11 23:58:05 +00001203 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type,
Devang Patel0e821f42011-04-12 23:21:44 +00001204 getOrCreateTypeDIE(DIType(ContainingType)));
Devang Patel0e821f42011-04-12 23:21:44 +00001205
Devang Patel12419ae2011-05-12 21:29:42 +00001206 if (CTy.isObjcClassComplete())
Eric Christopherbb69a272012-08-24 01:14:27 +00001207 addFlag(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type);
Devang Patel2409e782011-05-12 19:06:16 +00001208
Eric Christopherda011dd2011-12-16 23:42:42 +00001209 // Add template parameters to a class, structure or union types.
1210 // FIXME: The support isn't in the metadata for this yet.
1211 if (Tag == dwarf::DW_TAG_class_type ||
Eric Christopherc2697f82013-10-19 01:04:47 +00001212 Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type)
Devang Patel0e821f42011-04-12 23:21:44 +00001213 addTemplateParams(Buffer, CTy.getTemplateParams());
1214
1215 break;
1216 }
1217 default:
1218 break;
1219 }
1220
1221 // Add name if not anonymous or intermediate type.
1222 if (!Name.empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +00001223 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel0e821f42011-04-12 23:21:44 +00001224
Eric Christopher775cbd22012-05-22 18:45:18 +00001225 if (Tag == dwarf::DW_TAG_enumeration_type ||
Eric Christopherc2697f82013-10-19 01:04:47 +00001226 Tag == dwarf::DW_TAG_class_type || Tag == dwarf::DW_TAG_structure_type ||
Eric Christopher775cbd22012-05-22 18:45:18 +00001227 Tag == dwarf::DW_TAG_union_type) {
Devang Patel0e821f42011-04-12 23:21:44 +00001228 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopher1cf33382012-06-01 00:22:32 +00001229 // TODO: Do we care about size for enum forward declarations?
Devang Patel0e821f42011-04-12 23:21:44 +00001230 if (Size)
1231 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
Eric Christopher1cf33382012-06-01 00:22:32 +00001232 else if (!CTy.isForwardDecl())
Devang Patel0e821f42011-04-12 23:21:44 +00001233 // Add zero size if it is not a forward declaration.
Eric Christopher1cf33382012-06-01 00:22:32 +00001234 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
1235
1236 // If we're a forward decl, say so.
1237 if (CTy.isForwardDecl())
Eric Christopherbb69a272012-08-24 01:14:27 +00001238 addFlag(&Buffer, dwarf::DW_AT_declaration);
Devang Patel0e821f42011-04-12 23:21:44 +00001239
1240 // Add source line info if available.
1241 if (!CTy.isForwardDecl())
1242 addSourceLine(&Buffer, CTy);
Eric Christopher54cf8ff2012-03-07 00:15:19 +00001243
1244 // No harm in adding the runtime language to the declaration.
1245 unsigned RLang = CTy.getRunTimeLang();
1246 if (RLang)
Eric Christopherc2697f82013-10-19 01:04:47 +00001247 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class, dwarf::DW_FORM_data1,
1248 RLang);
Devang Patel0e821f42011-04-12 23:21:44 +00001249 }
Eric Christopher67646432013-07-26 17:02:41 +00001250 // If this is a type applicable to a type unit it then add it to the
1251 // list of types we'll compute a hash for later.
Manman Ren33796c52013-09-09 19:23:58 +00001252 if (shouldCreateTypeUnit(CTy, DD))
Eric Christopher67646432013-07-26 17:02:41 +00001253 DD->addTypeUnitType(&Buffer);
Devang Patel0e821f42011-04-12 23:21:44 +00001254}
1255
Eric Christopher92331fd2012-11-21 00:34:38 +00001256/// getOrCreateTemplateTypeParameterDIE - Find existing DIE or create new DIE
Devang Patel0e821f42011-04-12 23:21:44 +00001257/// for the given DITemplateTypeParameter.
1258DIE *
Manman Ren7cc62702013-10-18 21:14:19 +00001259CompileUnit::getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP,
1260 DIE &Buffer) {
Devang Patel0e821f42011-04-12 23:21:44 +00001261 DIE *ParamDIE = getDIE(TP);
1262 if (ParamDIE)
1263 return ParamDIE;
1264
1265 ParamDIE = new DIE(dwarf::DW_TAG_template_type_parameter);
Manman Ren7cc62702013-10-18 21:14:19 +00001266 Buffer.addChild(ParamDIE);
Eric Christopher056b6472013-08-08 08:09:43 +00001267 // Add the type if it exists, it could be void and therefore no type.
1268 if (TP.getType())
Manman Ren88b0f942013-10-09 19:46:28 +00001269 addType(ParamDIE, resolve(TP.getType()));
David Blaikie2b380232013-06-22 18:59:11 +00001270 if (!TP.getName().empty())
1271 addString(ParamDIE, dwarf::DW_AT_name, TP.getName());
Devang Patel0e821f42011-04-12 23:21:44 +00001272 return ParamDIE;
1273}
1274
Eric Christopher92331fd2012-11-21 00:34:38 +00001275/// getOrCreateTemplateValueParameterDIE - Find existing DIE or create new DIE
Devang Patel0e821f42011-04-12 23:21:44 +00001276/// for the given DITemplateValueParameter.
1277DIE *
Manman Ren7cc62702013-10-18 21:14:19 +00001278CompileUnit::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter VP,
1279 DIE &Buffer) {
Eric Christopherafb2c412013-08-08 07:40:31 +00001280 DIE *ParamDIE = getDIE(VP);
Devang Patel0e821f42011-04-12 23:21:44 +00001281 if (ParamDIE)
1282 return ParamDIE;
1283
Eric Christopherafb2c412013-08-08 07:40:31 +00001284 ParamDIE = new DIE(VP.getTag());
Manman Ren7cc62702013-10-18 21:14:19 +00001285 Buffer.addChild(ParamDIE);
Eric Christopher0df08e22013-08-08 07:40:37 +00001286
1287 // Add the type if there is one, template template and template parameter
1288 // packs will not have a type.
1289 if (VP.getType())
Manman Ren88b0f942013-10-09 19:46:28 +00001290 addType(ParamDIE, resolve(VP.getType()));
Eric Christopherafb2c412013-08-08 07:40:31 +00001291 if (!VP.getName().empty())
1292 addString(ParamDIE, dwarf::DW_AT_name, VP.getName());
1293 if (Value *Val = VP.getValue()) {
David Blaikiea1e813d2013-05-10 21:52:07 +00001294 if (ConstantInt *CI = dyn_cast<ConstantInt>(Val))
Manman Ren88b0f942013-10-09 19:46:28 +00001295 addConstantValue(ParamDIE, CI,
1296 isUnsignedDIType(DD, resolve(VP.getType())));
David Blaikiea1e813d2013-05-10 21:52:07 +00001297 else if (GlobalValue *GV = dyn_cast<GlobalValue>(Val)) {
1298 // For declaration non-type template parameters (such as global values and
1299 // functions)
1300 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1301 addOpAddress(Block, Asm->Mang->getSymbol(GV));
1302 // Emit DW_OP_stack_value to use the address as the immediate value of the
1303 // parameter, rather than a pointer to it.
1304 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value);
1305 addBlock(ParamDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopherafb2c412013-08-08 07:40:31 +00001306 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_template_param) {
David Blaikie2b380232013-06-22 18:59:11 +00001307 assert(isa<MDString>(Val));
1308 addString(ParamDIE, dwarf::DW_AT_GNU_template_name,
1309 cast<MDString>(Val)->getString());
Eric Christopherafb2c412013-08-08 07:40:31 +00001310 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_parameter_pack) {
David Blaikie2b380232013-06-22 18:59:11 +00001311 assert(isa<MDNode>(Val));
1312 DIArray A(cast<MDNode>(Val));
1313 addTemplateParams(*ParamDIE, A);
David Blaikiea1e813d2013-05-10 21:52:07 +00001314 }
1315 }
1316
Devang Patel0e821f42011-04-12 23:21:44 +00001317 return ParamDIE;
1318}
1319
Devang Patel17b53272011-05-06 16:57:54 +00001320/// getOrCreateNameSpace - Create a DIE for DINameSpace.
1321DIE *CompileUnit::getOrCreateNameSpace(DINameSpace NS) {
1322 DIE *NDie = getDIE(NS);
1323 if (NDie)
1324 return NDie;
1325 NDie = new DIE(dwarf::DW_TAG_namespace);
1326 insertDIE(NS, NDie);
Eric Christopher4996c702011-11-07 09:24:32 +00001327 if (!NS.getName().empty()) {
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +00001328 addString(NDie, dwarf::DW_AT_name, NS.getName());
Eric Christopher4996c702011-11-07 09:24:32 +00001329 addAccelNamespace(NS.getName(), NDie);
Eric Christopher2c8b7902013-10-17 02:06:06 +00001330 addGlobalName(NS.getName(), NDie, NS.getContext());
Eric Christopher4996c702011-11-07 09:24:32 +00001331 } else
1332 addAccelNamespace("(anonymous namespace)", NDie);
Devang Patel17b53272011-05-06 16:57:54 +00001333 addSourceLine(NDie, NS);
1334 addToContextOwner(NDie, NS.getContext());
1335 return NDie;
1336}
1337
Devang Patel89543712011-08-15 17:24:54 +00001338/// getOrCreateSubprogramDIE - Create new DIE using SP.
1339DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
David Blaikie309ffe42013-10-04 01:39:59 +00001340 // Construct the context before querying for the existence of the DIE in case
1341 // such construction creates the DIE (as is the case for member function
1342 // declarations).
Manman Renc50fa112013-10-10 18:40:01 +00001343 DIE *ContextDIE = getOrCreateContextDIE(resolve(SP.getContext()));
David Blaikie309ffe42013-10-04 01:39:59 +00001344 if (!ContextDIE)
1345 ContextDIE = CUDie.get();
1346
Eric Christophere595bae2013-10-04 17:08:38 +00001347 DIE *SPDie = getDIE(SP);
Devang Patel89543712011-08-15 17:24:54 +00001348 if (SPDie)
1349 return SPDie;
1350
Peter Collingbourne4d358b52012-05-27 18:36:44 +00001351 SPDie = new DIE(dwarf::DW_TAG_subprogram);
1352
1353 // DW_TAG_inlined_subroutine may refer to this DIE.
Eric Christophere595bae2013-10-04 17:08:38 +00001354 insertDIE(SP, SPDie);
Peter Collingbourne4d358b52012-05-27 18:36:44 +00001355
Rafael Espindola79278362011-11-10 22:34:29 +00001356 DISubprogram SPDecl = SP.getFunctionDeclaration();
1357 DIE *DeclDie = NULL;
1358 if (SPDecl.isSubprogram()) {
1359 DeclDie = getOrCreateSubprogramDIE(SPDecl);
1360 }
1361
Devang Patel89543712011-08-15 17:24:54 +00001362 // Add function template parameters.
1363 addTemplateParams(*SPDie, SP.getTemplateParams());
1364
Devang Patel89543712011-08-15 17:24:54 +00001365 // If this DIE is going to refer declaration info using AT_specification
Eric Christopherf20ff972013-05-09 00:42:33 +00001366 // then there is no need to add other attributes.
Rafael Espindola79278362011-11-10 22:34:29 +00001367 if (DeclDie) {
1368 // Refer function declaration directly.
Manman Ren4c4b69c2013-10-11 23:58:05 +00001369 addDIEEntry(SPDie, dwarf::DW_AT_specification, DeclDie);
Rafael Espindola79278362011-11-10 22:34:29 +00001370
Eric Christopher96eff3f2013-10-17 01:31:12 +00001371 // Add subprogram definitions to the CU die directly.
Manman Ren8040bb52013-10-18 20:52:22 +00001372 addDie(SPDie);
Eric Christopher96eff3f2013-10-17 01:31:12 +00001373
Devang Patel89543712011-08-15 17:24:54 +00001374 return SPDie;
Rafael Espindola79278362011-11-10 22:34:29 +00001375 }
Devang Patel89543712011-08-15 17:24:54 +00001376
Eric Christopher96eff3f2013-10-17 01:31:12 +00001377 // Add to context owner.
1378 ContextDIE->addChild(SPDie);
1379
Eric Christopheracb71152012-08-23 22:52:55 +00001380 // Add the linkage name if we have one.
Michael Gottesmanc89466f2013-09-04 04:39:38 +00001381 StringRef LinkageName = SP.getLinkageName();
1382 if (!LinkageName.empty())
Eric Christopheracb71152012-08-23 22:52:55 +00001383 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c275642013-06-01 17:51:14 +00001384 GlobalValue::getRealLinkageName(LinkageName));
Eric Christopheracb71152012-08-23 22:52:55 +00001385
Devang Patel89543712011-08-15 17:24:54 +00001386 // Constructors and operators for anonymous aggregates do not have names.
1387 if (!SP.getName().empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +00001388 addString(SPDie, dwarf::DW_AT_name, SP.getName());
Devang Patel89543712011-08-15 17:24:54 +00001389
1390 addSourceLine(SPDie, SP);
1391
Eric Christopher5cd2a9d2012-02-22 08:46:21 +00001392 // Add the prototype if we have a prototype and we have a C like
1393 // language.
Eric Christopherbfceb2f2013-08-26 23:50:38 +00001394 uint16_t Language = DICompileUnit(Node).getLanguage();
Eric Christopher5cd2a9d2012-02-22 08:46:21 +00001395 if (SP.isPrototyped() &&
Eric Christopherc2697f82013-10-19 01:04:47 +00001396 (Language == dwarf::DW_LANG_C89 || Language == dwarf::DW_LANG_C99 ||
Eric Christopher5cd2a9d2012-02-22 08:46:21 +00001397 Language == dwarf::DW_LANG_ObjC))
Eric Christopherbb69a272012-08-24 01:14:27 +00001398 addFlag(SPDie, dwarf::DW_AT_prototyped);
Devang Patel89543712011-08-15 17:24:54 +00001399
Eric Christopher0df08e22013-08-08 07:40:37 +00001400 // Add Return Type. A void return type will not have a type.
Devang Patel89543712011-08-15 17:24:54 +00001401 DICompositeType SPTy = SP.getType();
David Blaikie5174c842013-05-22 23:22:18 +00001402 assert(SPTy.getTag() == dwarf::DW_TAG_subroutine_type &&
1403 "the type of a subprogram should be a subroutine");
Devang Patel89543712011-08-15 17:24:54 +00001404
David Blaikie5174c842013-05-22 23:22:18 +00001405 DIArray Args = SPTy.getTypeArray();
Eric Christopher0df08e22013-08-08 07:40:37 +00001406 if (Args.getElement(0))
1407 addType(SPDie, DIType(Args.getElement(0)));
Devang Patel89543712011-08-15 17:24:54 +00001408
1409 unsigned VK = SP.getVirtuality();
1410 if (VK) {
Nick Lewyckycfde1a22011-12-14 00:56:07 +00001411 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
Devang Patel89543712011-08-15 17:24:54 +00001412 DIEBlock *Block = getDIEBlock();
1413 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1414 addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex());
1415 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
1416 ContainingTypeMap.insert(std::make_pair(SPDie,
Eric Christopher9e429ae2013-10-05 00:27:02 +00001417 resolve(SP.getContainingType())));
Devang Patel89543712011-08-15 17:24:54 +00001418 }
1419
1420 if (!SP.isDefinition()) {
Eric Christopherbb69a272012-08-24 01:14:27 +00001421 addFlag(SPDie, dwarf::DW_AT_declaration);
Eric Christopher92331fd2012-11-21 00:34:38 +00001422
Devang Patel89543712011-08-15 17:24:54 +00001423 // Add arguments. Do not add arguments for subprogram definition. They will
1424 // be handled while processing variables.
Eric Christopherc2697f82013-10-19 01:04:47 +00001425 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
David Blaikie5174c842013-05-22 23:22:18 +00001426 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1427 DIType ATy = DIType(Args.getElement(i));
1428 addType(Arg, ATy);
1429 if (ATy.isArtificial())
1430 addFlag(Arg, dwarf::DW_AT_artificial);
1431 SPDie->addChild(Arg);
1432 }
Devang Patel89543712011-08-15 17:24:54 +00001433 }
1434
1435 if (SP.isArtificial())
Eric Christopherbb69a272012-08-24 01:14:27 +00001436 addFlag(SPDie, dwarf::DW_AT_artificial);
Devang Patel89543712011-08-15 17:24:54 +00001437
1438 if (!SP.isLocalToUnit())
Eric Christopherbb69a272012-08-24 01:14:27 +00001439 addFlag(SPDie, dwarf::DW_AT_external);
Devang Patel89543712011-08-15 17:24:54 +00001440
1441 if (SP.isOptimized())
Eric Christopherbb69a272012-08-24 01:14:27 +00001442 addFlag(SPDie, dwarf::DW_AT_APPLE_optimized);
Devang Patel89543712011-08-15 17:24:54 +00001443
1444 if (unsigned isa = Asm->getISAEncoding()) {
1445 addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1446 }
1447
1448 return SPDie;
1449}
1450
Devang Pateldfd6ec32011-08-15 17:57:41 +00001451// Return const expression if value is a GEP to access merged global
1452// constant. e.g.
1453// i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
1454static const ConstantExpr *getMergedGlobalExpr(const Value *V) {
1455 const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
1456 if (!CE || CE->getNumOperands() != 3 ||
1457 CE->getOpcode() != Instruction::GetElementPtr)
1458 return NULL;
1459
1460 // First operand points to a global struct.
1461 Value *Ptr = CE->getOperand(0);
1462 if (!isa<GlobalValue>(Ptr) ||
1463 !isa<StructType>(cast<PointerType>(Ptr->getType())->getElementType()))
1464 return NULL;
1465
1466 // Second operand is zero.
1467 const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
1468 if (!CI || !CI->isZero())
1469 return NULL;
1470
1471 // Third operand is offset.
1472 if (!isa<ConstantInt>(CE->getOperand(2)))
1473 return NULL;
1474
1475 return CE;
1476}
1477
1478/// createGlobalVariableDIE - create global variable DIE.
1479void CompileUnit::createGlobalVariableDIE(const MDNode *N) {
Devang Pateldfd6ec32011-08-15 17:57:41 +00001480 // Check for pre-existence.
Devang Patela6576a12011-08-18 22:21:50 +00001481 if (getDIE(N))
Devang Pateldfd6ec32011-08-15 17:57:41 +00001482 return;
1483
Devang Patela6576a12011-08-18 22:21:50 +00001484 DIGlobalVariable GV(N);
Manman Ren7504ed42013-07-08 18:33:29 +00001485 if (!GV.isGlobalVariable())
Devang Patel0ecbcbd2011-08-18 23:17:55 +00001486 return;
1487
Eric Christopher08f7c8f2013-10-04 23:49:26 +00001488 DIScope GVContext = GV.getContext();
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001489 DIType GTy = GV.getType();
1490
1491 // If this is a static data member definition, some attributes belong
1492 // to the declaration DIE.
1493 DIE *VariableDIE = NULL;
Manman Rene697d3c2013-02-01 23:54:37 +00001494 bool IsStaticMember = false;
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001495 DIDerivedType SDMDecl = GV.getStaticDataMemberDeclaration();
1496 if (SDMDecl.Verify()) {
1497 assert(SDMDecl.isStaticMember() && "Expected static member decl");
1498 // We need the declaration DIE that is in the static member's class.
Manman Renc6b63922013-10-14 20:33:57 +00001499 VariableDIE = getOrCreateStaticMemberDIE(SDMDecl);
Manman Rene697d3c2013-02-01 23:54:37 +00001500 IsStaticMember = true;
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001501 }
1502
1503 // If this is not a static data member definition, create the variable
1504 // DIE and add the initial set of attributes to it.
1505 if (!VariableDIE) {
1506 VariableDIE = new DIE(GV.getTag());
1507 // Add to map.
1508 insertDIE(N, VariableDIE);
1509
1510 // Add name and type.
1511 addString(VariableDIE, dwarf::DW_AT_name, GV.getDisplayName());
1512 addType(VariableDIE, GTy);
1513
1514 // Add scoping info.
Eric Christopherd2b497b2013-10-16 01:37:49 +00001515 if (!GV.isLocalToUnit())
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001516 addFlag(VariableDIE, dwarf::DW_AT_external);
1517
1518 // Add line number info.
1519 addSourceLine(VariableDIE, GV);
1520 // Add to context owner.
1521 addToContextOwner(VariableDIE, GVContext);
1522 }
1523
Devang Pateldfd6ec32011-08-15 17:57:41 +00001524 // Add location.
Eric Christopher4996c702011-11-07 09:24:32 +00001525 bool addToAccelTable = false;
Eric Christopher0a917b72011-11-11 03:16:32 +00001526 DIE *VariableSpecDIE = NULL;
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001527 bool isGlobalVariable = GV.getGlobal() != NULL;
Devang Pateldfd6ec32011-08-15 17:57:41 +00001528 if (isGlobalVariable) {
Eric Christopher4996c702011-11-07 09:24:32 +00001529 addToAccelTable = true;
Devang Pateldfd6ec32011-08-15 17:57:41 +00001530 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
David Blaikief2694972013-06-28 20:05:11 +00001531 const MCSymbol *Sym = Asm->Mang->getSymbol(GV.getGlobal());
1532 if (GV.getGlobal()->isThreadLocal()) {
1533 // FIXME: Make this work with -gsplit-dwarf.
1534 unsigned PointerSize = Asm->getDataLayout().getPointerSize();
1535 assert((PointerSize == 4 || PointerSize == 8) &&
1536 "Add support for other sizes if necessary");
Ulrich Weigand2b6fc8d2013-07-02 18:47:09 +00001537 const MCExpr *Expr =
David Blaikie8466ca82013-07-01 23:55:52 +00001538 Asm->getObjFileLowering().getDebugThreadLocalSymbol(Sym);
David Blaikief2694972013-06-28 20:05:11 +00001539 // Based on GCC's support for TLS:
David Blaikie8466ca82013-07-01 23:55:52 +00001540 if (!DD->useSplitDwarf()) {
1541 // 1) Start with a constNu of the appropriate pointer size
1542 addUInt(Block, 0, dwarf::DW_FORM_data1,
1543 PointerSize == 4 ? dwarf::DW_OP_const4u : dwarf::DW_OP_const8u);
Richard Mitton0aafb582013-10-07 18:39:18 +00001544 // 2) containing the (relocated) offset of the TLS variable
1545 // within the module's TLS block.
Ulrich Weigand2b6fc8d2013-07-02 18:47:09 +00001546 addExpr(Block, 0, dwarf::DW_FORM_udata, Expr);
David Blaikie8466ca82013-07-01 23:55:52 +00001547 } else {
1548 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_const_index);
Ulrich Weigand2b6fc8d2013-07-02 18:47:09 +00001549 addUInt(Block, 0, dwarf::DW_FORM_udata, DU->getAddrPoolIndex(Expr));
David Blaikie8466ca82013-07-01 23:55:52 +00001550 }
Richard Mitton0aafb582013-10-07 18:39:18 +00001551 // 3) followed by a custom OP to make the debugger do a TLS lookup.
Eric Christopherc2697f82013-10-19 01:04:47 +00001552 addUInt(Block, 0, dwarf::DW_FORM_data1,
1553 dwarf::DW_OP_GNU_push_tls_address);
David Blaikief2694972013-06-28 20:05:11 +00001554 } else
1555 addOpAddress(Block, Sym);
Devang Pateldfd6ec32011-08-15 17:57:41 +00001556 // Do not create specification DIE if context is either compile unit
1557 // or a subprogram.
Devang Patel5e6b65c2011-09-21 23:41:11 +00001558 if (GVContext && GV.isDefinition() && !GVContext.isCompileUnit() &&
Manman Ren3eb9dff2013-09-09 19:05:21 +00001559 !GVContext.isFile() && !DD->isSubprogramContext(GVContext)) {
Devang Pateldfd6ec32011-08-15 17:57:41 +00001560 // Create specification DIE.
Eric Christopherc12c2112011-11-11 01:55:22 +00001561 VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
Manman Ren4c4b69c2013-10-11 23:58:05 +00001562 addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification, VariableDIE);
Devang Pateldfd6ec32011-08-15 17:57:41 +00001563 addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001564 // A static member's declaration is already flagged as such.
1565 if (!SDMDecl.Verify())
1566 addFlag(VariableDIE, dwarf::DW_AT_declaration);
Devang Pateldfd6ec32011-08-15 17:57:41 +00001567 addDie(VariableSpecDIE);
1568 } else {
1569 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopher4996c702011-11-07 09:24:32 +00001570 }
Michael Gottesmanc89466f2013-09-04 04:39:38 +00001571 // Add the linkage name.
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001572 StringRef LinkageName = GV.getLinkageName();
Michael Gottesmanc89466f2013-09-04 04:39:38 +00001573 if (!LinkageName.empty())
Eric Christopher3f79b8c2013-02-27 23:49:47 +00001574 // From DWARF4: DIEs to which DW_AT_linkage_name may apply include:
1575 // TAG_common_block, TAG_constant, TAG_entry_point, TAG_subprogram and
1576 // TAG_variable.
Eric Christopherc2697f82013-10-19 01:04:47 +00001577 addString(IsStaticMember && VariableSpecDIE ? VariableSpecDIE
1578 : VariableDIE,
1579 dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c275642013-06-01 17:51:14 +00001580 GlobalValue::getRealLinkageName(LinkageName));
Eric Christopher92331fd2012-11-21 00:34:38 +00001581 } else if (const ConstantInt *CI =
Eric Christopherc2697f82013-10-19 01:04:47 +00001582 dyn_cast_or_null<ConstantInt>(GV.getConstant())) {
Adrian Prantl322f41d2013-04-04 22:56:49 +00001583 // AT_const_value was added when the static member was created. To avoid
Manman Rene697d3c2013-02-01 23:54:37 +00001584 // emitting AT_const_value multiple times, we only add AT_const_value when
1585 // it is not a static member.
1586 if (!IsStaticMember)
Manman Renb3388602013-10-05 01:43:03 +00001587 addConstantValue(VariableDIE, CI, isUnsignedDIType(DD, GTy));
Manman Rene697d3c2013-02-01 23:54:37 +00001588 } else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
Eric Christopher4996c702011-11-07 09:24:32 +00001589 addToAccelTable = true;
Devang Pateldfd6ec32011-08-15 17:57:41 +00001590 // GV is a merged global.
1591 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1592 Value *Ptr = CE->getOperand(0);
Eric Christophere9ec2452013-01-18 22:11:33 +00001593 addOpAddress(Block, Asm->Mang->getSymbol(cast<GlobalValue>(Ptr)));
Devang Pateldfd6ec32011-08-15 17:57:41 +00001594 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
Eric Christopherc2697f82013-10-19 01:04:47 +00001595 SmallVector<Value *, 3> Idx(CE->op_begin() + 1, CE->op_end());
Eric Christopher92331fd2012-11-21 00:34:38 +00001596 addUInt(Block, 0, dwarf::DW_FORM_udata,
Eric Christopherc2697f82013-10-19 01:04:47 +00001597 Asm->getDataLayout().getIndexedOffset(Ptr->getType(), Idx));
Devang Pateldfd6ec32011-08-15 17:57:41 +00001598 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1599 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
1600 }
1601
Eric Christopherc12c2112011-11-11 01:55:22 +00001602 if (addToAccelTable) {
1603 DIE *AddrDIE = VariableSpecDIE ? VariableSpecDIE : VariableDIE;
1604 addAccelName(GV.getName(), AddrDIE);
Eric Christopher4996c702011-11-07 09:24:32 +00001605
Eric Christopherc12c2112011-11-11 01:55:22 +00001606 // If the linkage name is different than the name, go ahead and output
1607 // that as well into the name table.
1608 if (GV.getLinkageName() != "" && GV.getName() != GV.getLinkageName())
1609 addAccelName(GV.getLinkageName(), AddrDIE);
1610 }
Eric Christopherd2b497b2013-10-16 01:37:49 +00001611
1612 if (!GV.isLocalToUnit())
Eric Christopher2c8b7902013-10-17 02:06:06 +00001613 addGlobalName(GV.getName(), VariableSpecDIE ? VariableSpecDIE : VariableDIE,
1614 GV.getContext());
Devang Pateldfd6ec32011-08-15 17:57:41 +00001615}
1616
Devang Patel0e821f42011-04-12 23:21:44 +00001617/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
Eric Christopherd42b92f2012-05-22 18:45:24 +00001618void CompileUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR,
1619 DIE *IndexTy) {
Devang Patel0e821f42011-04-12 23:21:44 +00001620 DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
Manman Ren4c4b69c2013-10-11 23:58:05 +00001621 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, IndexTy);
Devang Patel0e821f42011-04-12 23:21:44 +00001622
Bill Wendling28fe9e72012-12-06 07:38:10 +00001623 // The LowerBound value defines the lower bounds which is typically zero for
1624 // C/C++. The Count value is the number of elements. Values are 64 bit. If
1625 // Count == -1 then the array is unbounded and we do not emit
1626 // DW_AT_lower_bound and DW_AT_upper_bound attributes. If LowerBound == 0 and
1627 // Count == 0, then the array has zero elements in which case we do not emit
1628 // an upper bound.
1629 int64_t LowerBound = SR.getLo();
Bill Wendling3495f9b2012-12-06 07:55:19 +00001630 int64_t DefaultLowerBound = getDefaultLowerBound();
Bill Wendlingd7767122012-12-04 21:34:03 +00001631 int64_t Count = SR.getCount();
Devang Patel0e821f42011-04-12 23:21:44 +00001632
Bill Wendling3495f9b2012-12-06 07:55:19 +00001633 if (DefaultLowerBound == -1 || LowerBound != DefaultLowerBound)
Bill Wendling28fe9e72012-12-06 07:38:10 +00001634 addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, LowerBound);
1635
1636 if (Count != -1 && Count != 0)
Bill Wendlingd7767122012-12-04 21:34:03 +00001637 // FIXME: An unbounded array should reference the expression that defines
1638 // the array.
Bill Wendling28fe9e72012-12-06 07:38:10 +00001639 addUInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, LowerBound + Count - 1);
Bill Wendlingd7767122012-12-04 21:34:03 +00001640
Devang Patel0e821f42011-04-12 23:21:44 +00001641 Buffer.addChild(DW_Subrange);
1642}
1643
1644/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
Eric Christopherc2697f82013-10-19 01:04:47 +00001645void CompileUnit::constructArrayTypeDIE(DIE &Buffer, DICompositeType *CTy) {
Eric Christopher72a52952013-01-08 01:53:52 +00001646 if (CTy->isVector())
Eric Christopherbb69a272012-08-24 01:14:27 +00001647 addFlag(&Buffer, dwarf::DW_AT_GNU_vector);
Devang Patel0e821f42011-04-12 23:21:44 +00001648
Eric Christopher0df08e22013-08-08 07:40:37 +00001649 // Emit the element type.
Manman Ren93b30902013-10-08 18:42:58 +00001650 addType(&Buffer, resolve(CTy->getTypeDerivedFrom()));
Devang Patel0e821f42011-04-12 23:21:44 +00001651
1652 // Get an anonymous type for index type.
Eric Christophercad9b532013-01-04 21:51:53 +00001653 // FIXME: This type should be passed down from the front end
1654 // as different languages may have different sizes for indexes.
Devang Patel0e821f42011-04-12 23:21:44 +00001655 DIE *IdxTy = getIndexTyDie();
1656 if (!IdxTy) {
1657 // Construct an anonymous type for index type.
1658 IdxTy = new DIE(dwarf::DW_TAG_base_type);
Eric Christophercad9b532013-01-04 21:51:53 +00001659 addString(IdxTy, dwarf::DW_AT_name, "int");
Devang Patel0e821f42011-04-12 23:21:44 +00001660 addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1661 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1662 dwarf::DW_ATE_signed);
1663 addDie(IdxTy);
1664 setIndexTyDie(IdxTy);
1665 }
1666
1667 // Add subranges to array type.
Eric Christopher0df08e22013-08-08 07:40:37 +00001668 DIArray Elements = CTy->getTypeArray();
Devang Patel0e821f42011-04-12 23:21:44 +00001669 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1670 DIDescriptor Element = Elements.getElement(i);
1671 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1672 constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1673 }
1674}
1675
1676/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
Manman Ren7cc62702013-10-18 21:14:19 +00001677DIE *CompileUnit::constructEnumTypeDIE(DIEnumerator ETy, DIE &Buffer) {
Devang Patel0e821f42011-04-12 23:21:44 +00001678 DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
Manman Ren7cc62702013-10-18 21:14:19 +00001679 Buffer.addChild(Enumerator);
Devang Patel0e821f42011-04-12 23:21:44 +00001680 StringRef Name = ETy.getName();
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +00001681 addString(Enumerator, dwarf::DW_AT_name, Name);
Devang Patel0e821f42011-04-12 23:21:44 +00001682 int64_t Value = ETy.getEnumValue();
1683 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
1684 return Enumerator;
1685}
1686
Devang Patel89543712011-08-15 17:24:54 +00001687/// constructContainingTypeDIEs - Construct DIEs for types that contain
1688/// vtables.
1689void CompileUnit::constructContainingTypeDIEs() {
1690 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
Eric Christopherc2697f82013-10-19 01:04:47 +00001691 CE = ContainingTypeMap.end();
1692 CI != CE; ++CI) {
Devang Patel89543712011-08-15 17:24:54 +00001693 DIE *SPDie = CI->first;
1694 const MDNode *N = CI->second;
Eric Christopherc2697f82013-10-19 01:04:47 +00001695 if (!N)
1696 continue;
Eric Christophere595bae2013-10-04 17:08:38 +00001697 DIE *NDie = getDIE(N);
Eric Christopherc2697f82013-10-19 01:04:47 +00001698 if (!NDie)
1699 continue;
Manman Ren4c4b69c2013-10-11 23:58:05 +00001700 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, NDie);
Devang Patel89543712011-08-15 17:24:54 +00001701 }
1702}
1703
Devang Patel3acc70e2011-08-15 22:04:40 +00001704/// constructVariableDIE - Construct a DIE for the given DbgVariable.
Eric Christopherc2697f82013-10-19 01:04:47 +00001705DIE *CompileUnit::constructVariableDIE(DbgVariable *DV, bool isScopeAbstract) {
Devang Patel3acc70e2011-08-15 22:04:40 +00001706 StringRef Name = DV->getName();
Devang Patel3acc70e2011-08-15 22:04:40 +00001707
Devang Patel3acc70e2011-08-15 22:04:40 +00001708 // Define variable debug information entry.
David Blaikiefac56122013-10-04 23:21:16 +00001709 DIE *VariableDie = new DIE(DV->getTag());
Devang Patel3acc70e2011-08-15 22:04:40 +00001710 DbgVariable *AbsVar = DV->getAbstractVariable();
1711 DIE *AbsDIE = AbsVar ? AbsVar->getDIE() : NULL;
Manman Ren4213c392013-05-29 17:16:59 +00001712 if (AbsDIE)
Manman Ren4c4b69c2013-10-11 23:58:05 +00001713 addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin, AbsDIE);
Devang Patel3acc70e2011-08-15 22:04:40 +00001714 else {
David Blaikie715528b2013-08-19 03:34:03 +00001715 if (!Name.empty())
1716 addString(VariableDie, dwarf::DW_AT_name, Name);
Devang Patel3acc70e2011-08-15 22:04:40 +00001717 addSourceLine(VariableDie, DV->getVariable());
1718 addType(VariableDie, DV->getType());
1719 }
1720
1721 if (DV->isArtificial())
Eric Christopherbb69a272012-08-24 01:14:27 +00001722 addFlag(VariableDie, dwarf::DW_AT_artificial);
Devang Patel3acc70e2011-08-15 22:04:40 +00001723
1724 if (isScopeAbstract) {
1725 DV->setDIE(VariableDie);
1726 return VariableDie;
1727 }
1728
1729 // Add variable address.
1730
1731 unsigned Offset = DV->getDotDebugLocOffset();
1732 if (Offset != ~0U) {
Eric Christopher40b6bf62013-06-24 21:34:55 +00001733 addLabel(VariableDie, dwarf::DW_AT_location, dwarf::DW_FORM_data4,
1734 Asm->GetTempSymbol("debug_loc", Offset));
Devang Patel3acc70e2011-08-15 22:04:40 +00001735 DV->setDIE(VariableDie);
1736 return VariableDie;
1737 }
1738
Eric Christophercead0332011-10-03 15:49:20 +00001739 // Check if variable is described by a DBG_VALUE instruction.
Devang Patel3acc70e2011-08-15 22:04:40 +00001740 if (const MachineInstr *DVInsn = DV->getMInsn()) {
David Blaikie0252265b2013-06-16 20:34:15 +00001741 assert(DVInsn->getNumOperands() == 3);
1742 if (DVInsn->getOperand(0).isReg()) {
1743 const MachineOperand RegOp = DVInsn->getOperand(0);
Adrian Prantl19942882013-07-09 21:44:06 +00001744 // If the second operand is an immediate, this is an indirect value.
Adrian Prantl418d1d12013-07-09 20:28:37 +00001745 if (DVInsn->getOperand(1).isImm()) {
Eric Christopherc2697f82013-10-19 01:04:47 +00001746 MachineLocation Location(RegOp.getReg(),
1747 DVInsn->getOperand(1).getImm());
Eric Christopherbf2d23c2013-06-24 21:07:27 +00001748 addVariableAddress(*DV, VariableDie, Location);
David Blaikie0252265b2013-06-16 20:34:15 +00001749 } else if (RegOp.getReg())
Eric Christopherbf2d23c2013-06-24 21:07:27 +00001750 addVariableAddress(*DV, VariableDie, MachineLocation(RegOp.getReg()));
David Blaikie0252265b2013-06-16 20:34:15 +00001751 } else if (DVInsn->getOperand(0).isImm())
Eric Christopher78fcf4902013-07-03 01:08:30 +00001752 addConstantValue(VariableDie, DVInsn->getOperand(0), DV->getType());
David Blaikie0252265b2013-06-16 20:34:15 +00001753 else if (DVInsn->getOperand(0).isFPImm())
Eric Christopher78fcf4902013-07-03 01:08:30 +00001754 addConstantFPValue(VariableDie, DVInsn->getOperand(0));
David Blaikie0252265b2013-06-16 20:34:15 +00001755 else if (DVInsn->getOperand(0).isCImm())
Eric Christopher78fcf4902013-07-03 01:08:30 +00001756 addConstantValue(VariableDie, DVInsn->getOperand(0).getCImm(),
Manman Renb3388602013-10-05 01:43:03 +00001757 isUnsignedDIType(DD, DV->getType()));
Eric Christopher78fcf4902013-07-03 01:08:30 +00001758
Devang Patel3acc70e2011-08-15 22:04:40 +00001759 DV->setDIE(VariableDie);
1760 return VariableDie;
1761 } else {
1762 // .. else use frame index.
1763 int FI = DV->getFrameIndex();
1764 if (FI != ~0) {
1765 unsigned FrameReg = 0;
1766 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
Eric Christopherc2697f82013-10-19 01:04:47 +00001767 int Offset = TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
Devang Patel3acc70e2011-08-15 22:04:40 +00001768 MachineLocation Location(FrameReg, Offset);
Eric Christopherbf2d23c2013-06-24 21:07:27 +00001769 addVariableAddress(*DV, VariableDie, Location);
Devang Patel3acc70e2011-08-15 22:04:40 +00001770 }
1771 }
1772
1773 DV->setDIE(VariableDie);
1774 return VariableDie;
1775}
1776
Devang Patel0e821f42011-04-12 23:21:44 +00001777/// createMemberDIE - Create new member DIE.
Manman Ren7cc62702013-10-18 21:14:19 +00001778DIE *CompileUnit::createMemberDIE(DIDerivedType DT, DIE &Buffer) {
Devang Patel0e821f42011-04-12 23:21:44 +00001779 DIE *MemberDie = new DIE(DT.getTag());
Manman Ren7cc62702013-10-18 21:14:19 +00001780 Buffer.addChild(MemberDie);
Devang Patel0e821f42011-04-12 23:21:44 +00001781 StringRef Name = DT.getName();
1782 if (!Name.empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +00001783 addString(MemberDie, dwarf::DW_AT_name, Name);
Devang Patel0e821f42011-04-12 23:21:44 +00001784
Manman Ren93b30902013-10-08 18:42:58 +00001785 addType(MemberDie, resolve(DT.getTypeDerivedFrom()));
Devang Patel0e821f42011-04-12 23:21:44 +00001786
1787 addSourceLine(MemberDie, DT);
1788
1789 DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
1790 addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1791
1792 uint64_t Size = DT.getSizeInBits();
Manman Renbda410f2013-10-08 18:46:58 +00001793 uint64_t FieldSize = getBaseTypeSize(DD, DT);
Devang Patel0e821f42011-04-12 23:21:44 +00001794
1795 if (Size != FieldSize) {
1796 // Handle bitfield.
Eric Christopherc2697f82013-10-19 01:04:47 +00001797 addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, getBaseTypeSize(DD, DT) >> 3);
Devang Patel0e821f42011-04-12 23:21:44 +00001798 addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1799
1800 uint64_t Offset = DT.getOffsetInBits();
1801 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1802 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1803 uint64_t FieldOffset = (HiMark - FieldSize);
1804 Offset -= FieldOffset;
1805
1806 // Maybe we need to work from the other end.
Micah Villmowcdfe20b2012-10-08 16:38:25 +00001807 if (Asm->getDataLayout().isLittleEndian())
Devang Patel0e821f42011-04-12 23:21:44 +00001808 Offset = FieldSize - (Offset + Size);
1809 addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
1810
1811 // Here WD_AT_data_member_location points to the anonymous
1812 // field that includes this bit field.
1813 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
1814
1815 } else
1816 // This is not a bitfield.
1817 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1818
Eric Christopherc2697f82013-10-19 01:04:47 +00001819 if (DT.getTag() == dwarf::DW_TAG_inheritance && DT.isVirtual()) {
Devang Patel0e821f42011-04-12 23:21:44 +00001820
1821 // For C++, virtual base classes are not at fixed offset. Use following
1822 // expression to extract appropriate offset from vtable.
1823 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1824
1825 DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
1826 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1827 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1828 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1829 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1830 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1831 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1832 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1833
Eric Christopherc2697f82013-10-19 01:04:47 +00001834 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, VBaseLocationDie);
Devang Patel0e821f42011-04-12 23:21:44 +00001835 } else
1836 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
1837
1838 if (DT.isProtected())
Nick Lewyckycb918492011-12-13 05:09:11 +00001839 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001840 dwarf::DW_ACCESS_protected);
1841 else if (DT.isPrivate())
Nick Lewyckycb918492011-12-13 05:09:11 +00001842 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001843 dwarf::DW_ACCESS_private);
1844 // Otherwise C++ member and base classes are considered public.
Eric Christopher92331fd2012-11-21 00:34:38 +00001845 else
Nick Lewyckycb918492011-12-13 05:09:11 +00001846 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001847 dwarf::DW_ACCESS_public);
1848 if (DT.isVirtual())
Nick Lewyckycfde1a22011-12-14 00:56:07 +00001849 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001850 dwarf::DW_VIRTUALITY_virtual);
Devang Patel514b4002011-04-16 00:11:51 +00001851
1852 // Objective-C properties.
Devang Patel44882172012-02-06 17:49:43 +00001853 if (MDNode *PNode = DT.getObjCProperty())
1854 if (DIEEntry *PropertyDie = getDIEEntry(PNode))
Eric Christopher92331fd2012-11-21 00:34:38 +00001855 MemberDie->addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4,
Devang Patel44882172012-02-06 17:49:43 +00001856 PropertyDie);
1857
David Blaikie37fefc32012-12-13 22:43:07 +00001858 if (DT.isArtificial())
1859 addFlag(MemberDie, dwarf::DW_AT_artificial);
1860
Devang Patel0e821f42011-04-12 23:21:44 +00001861 return MemberDie;
1862}
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001863
Manman Renc6b63922013-10-14 20:33:57 +00001864/// getOrCreateStaticMemberDIE - Create new DIE for C++ static member.
1865DIE *CompileUnit::getOrCreateStaticMemberDIE(const DIDerivedType DT) {
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001866 if (!DT.Verify())
1867 return NULL;
1868
Manman Renc6b63922013-10-14 20:33:57 +00001869 // Construct the context before querying for the existence of the DIE in case
1870 // such construction creates the DIE.
1871 DIE *ContextDIE = getOrCreateContextDIE(resolve(DT.getContext()));
1872 assert(ContextDIE && "Static member should belong to a non-CU context.");
1873
1874 DIE *StaticMemberDIE = getDIE(DT);
1875 if (StaticMemberDIE)
1876 return StaticMemberDIE;
1877
1878 StaticMemberDIE = new DIE(DT.getTag());
1879 // Add to context owner.
1880 ContextDIE->addChild(StaticMemberDIE);
1881
Manman Ren93b30902013-10-08 18:42:58 +00001882 DIType Ty = resolve(DT.getTypeDerivedFrom());
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001883
1884 addString(StaticMemberDIE, dwarf::DW_AT_name, DT.getName());
1885 addType(StaticMemberDIE, Ty);
1886 addSourceLine(StaticMemberDIE, DT);
1887 addFlag(StaticMemberDIE, dwarf::DW_AT_external);
1888 addFlag(StaticMemberDIE, dwarf::DW_AT_declaration);
1889
1890 // FIXME: We could omit private if the parent is a class_type, and
1891 // public if the parent is something else.
1892 if (DT.isProtected())
1893 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1894 dwarf::DW_ACCESS_protected);
1895 else if (DT.isPrivate())
1896 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1897 dwarf::DW_ACCESS_private);
1898 else
1899 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1900 dwarf::DW_ACCESS_public);
1901
1902 if (const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(DT.getConstant()))
Manman Renb3388602013-10-05 01:43:03 +00001903 addConstantValue(StaticMemberDIE, CI, isUnsignedDIType(DD, Ty));
David Blaikiea39a76e2013-01-20 01:18:01 +00001904 if (const ConstantFP *CFP = dyn_cast_or_null<ConstantFP>(DT.getConstant()))
1905 addConstantFPValue(StaticMemberDIE, CFP);
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001906
Eric Christophere595bae2013-10-04 17:08:38 +00001907 insertDIE(DT, StaticMemberDIE);
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001908 return StaticMemberDIE;
1909}