blob: afe8a7d283a43d424c18cfc57f7d9fb31b9d84a9 [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"
Eric Christopher0a917b72011-11-11 03:16:32 +000025#include "llvm/Support/Debug.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000026#include "llvm/Support/ErrorHandling.h"
Devang Pateldfd6ec32011-08-15 17:57:41 +000027#include "llvm/Target/Mangler.h"
Devang Patel0e821f42011-04-12 23:21:44 +000028#include "llvm/Target/TargetFrameLowering.h"
29#include "llvm/Target/TargetMachine.h"
David Blaikief2694972013-06-28 20:05:11 +000030#include "llvm/Target/TargetLoweringObjectFile.h"
Devang Patel0e821f42011-04-12 23:21:44 +000031#include "llvm/Target/TargetRegisterInfo.h"
Devang Patel0e821f42011-04-12 23:21:44 +000032
33using namespace llvm;
34
35/// CompileUnit - Compile unit constructor.
Eric Christopherbfceb2f2013-08-26 23:50:38 +000036CompileUnit::CompileUnit(unsigned UID, DIE *D, const MDNode *N, AsmPrinter *A,
37 DwarfDebug *DW, DwarfUnits *DWU)
38 : UniqueID(UID), Node(N), CUDie(D), Asm(A), DD(DW), DU(DWU), IndexTyDie(0),
39 DebugInfoOffset(0) {
Devang Patel0e821f42011-04-12 23:21:44 +000040 DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
Eric Christopherc57baee2013-05-08 00:58:51 +000041 insertDIE(N, D);
Devang Patel0e821f42011-04-12 23:21:44 +000042}
43
44/// ~CompileUnit - Destructor for compile unit.
45CompileUnit::~CompileUnit() {
46 for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
47 DIEBlocks[j]->~DIEBlock();
48}
49
50/// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
51/// information entry.
52DIEEntry *CompileUnit::createDIEEntry(DIE *Entry) {
53 DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
54 return Value;
55}
56
Bill Wendling3495f9b2012-12-06 07:55:19 +000057/// getDefaultLowerBound - Return the default lower bound for an array. If the
Bill Wendling28fe9e72012-12-06 07:38:10 +000058/// DWARF version doesn't handle the language, return -1.
Bill Wendling3495f9b2012-12-06 07:55:19 +000059int64_t CompileUnit::getDefaultLowerBound() const {
Eric Christopherbfceb2f2013-08-26 23:50:38 +000060 switch (DICompileUnit(Node).getLanguage()) {
Bill Wendling28fe9e72012-12-06 07:38:10 +000061 default:
62 break;
63
64 case dwarf::DW_LANG_C89:
65 case dwarf::DW_LANG_C99:
66 case dwarf::DW_LANG_C:
67 case dwarf::DW_LANG_C_plus_plus:
68 case dwarf::DW_LANG_ObjC:
69 case dwarf::DW_LANG_ObjC_plus_plus:
70 return 0;
71
72 case dwarf::DW_LANG_Fortran77:
73 case dwarf::DW_LANG_Fortran90:
74 case dwarf::DW_LANG_Fortran95:
75 return 1;
76
77 // The languages below have valid values only if the DWARF version >= 4.
78 case dwarf::DW_LANG_Java:
79 case dwarf::DW_LANG_Python:
80 case dwarf::DW_LANG_UPC:
81 case dwarf::DW_LANG_D:
82 if (dwarf::DWARF_VERSION >= 4)
83 return 0;
84 break;
85
86 case dwarf::DW_LANG_Ada83:
87 case dwarf::DW_LANG_Ada95:
88 case dwarf::DW_LANG_Cobol74:
89 case dwarf::DW_LANG_Cobol85:
90 case dwarf::DW_LANG_Modula2:
91 case dwarf::DW_LANG_Pascal83:
92 case dwarf::DW_LANG_PLI:
93 if (dwarf::DWARF_VERSION >= 4)
94 return 1;
95 break;
96 }
97
98 return -1;
99}
100
Eric Christopherbb69a272012-08-24 01:14:27 +0000101/// addFlag - Add a flag that is true.
Eric Christopher31b05762013-08-08 01:41:00 +0000102void CompileUnit::addFlag(DIE *Die, uint16_t Attribute) {
Michael Gottesmanc89466f2013-09-04 04:39:38 +0000103 if (DD->getDwarfVersion() >= 4)
Eric Christopherbb69a272012-08-24 01:14:27 +0000104 Die->addValue(Attribute, dwarf::DW_FORM_flag_present,
105 DIEIntegerOne);
106 else
107 addUInt(Die, Attribute, dwarf::DW_FORM_flag, 1);
108}
109
Devang Patel0e821f42011-04-12 23:21:44 +0000110/// addUInt - Add an unsigned integer attribute data and value.
111///
Eric Christopher31b05762013-08-08 01:41:00 +0000112void CompileUnit::addUInt(DIE *Die, uint16_t Attribute,
113 uint16_t Form, uint64_t Integer) {
Devang Patel0e821f42011-04-12 23:21:44 +0000114 if (!Form) Form = DIEInteger::BestForm(false, Integer);
115 DIEValue *Value = Integer == 1 ?
116 DIEIntegerOne : new (DIEValueAllocator) DIEInteger(Integer);
117 Die->addValue(Attribute, Form, Value);
118}
119
120/// addSInt - Add an signed integer attribute data and value.
121///
Eric Christopher31b05762013-08-08 01:41:00 +0000122void CompileUnit::addSInt(DIE *Die, uint16_t Attribute,
123 uint16_t Form, int64_t Integer) {
Devang Patel0e821f42011-04-12 23:21:44 +0000124 if (!Form) Form = DIEInteger::BestForm(true, Integer);
125 DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
126 Die->addValue(Attribute, Form, Value);
127}
128
Nick Lewyckycc64ae12011-10-28 05:29:47 +0000129/// addString - Add a string attribute data and value. We always emit a
130/// reference to the string pool instead of immediate strings so that DIEs have
Eric Christopherfba22602013-01-07 19:32:45 +0000131/// more predictable sizes. In the case of split dwarf we emit an index
132/// into another table which gets us the static offset into the string
133/// table.
Eric Christopher31b05762013-08-08 01:41:00 +0000134void CompileUnit::addString(DIE *Die, uint16_t Attribute, StringRef String) {
Eric Christopher67646432013-07-26 17:02:41 +0000135 DIEValue *Value;
Eric Christopher31b05762013-08-08 01:41:00 +0000136 uint16_t Form;
Eric Christopher2cbd5762013-01-07 19:32:41 +0000137 if (!DD->useSplitDwarf()) {
138 MCSymbol *Symb = DU->getStringPoolEntry(String);
Eric Christopher2cbd5762013-01-07 19:32:41 +0000139 if (Asm->needsRelocationsForDwarfStringPool())
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000140 Value = new (DIEValueAllocator) DIELabel(Symb);
Eric Christopher2cbd5762013-01-07 19:32:41 +0000141 else {
142 MCSymbol *StringPool = DU->getStringPoolSym();
143 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
144 }
Eric Christopher67646432013-07-26 17:02:41 +0000145 Form = dwarf::DW_FORM_strp;
Eric Christopher2cbd5762013-01-07 19:32:41 +0000146 } else {
147 unsigned idx = DU->getStringPoolIndex(String);
Eric Christopher67646432013-07-26 17:02:41 +0000148 Value = new (DIEValueAllocator) DIEInteger(idx);
149 Form = dwarf::DW_FORM_GNU_str_index;
Eric Christopher2cbd5762013-01-07 19:32:41 +0000150 }
Eric Christopher67646432013-07-26 17:02:41 +0000151 DIEValue *Str = new (DIEValueAllocator) DIEString(Value, String);
152 Die->addValue(Attribute, Form, Str);
Eric Christopher2cbd5762013-01-07 19:32:41 +0000153}
154
155/// addLocalString - Add a string attribute data and value. This is guaranteed
156/// to be in the local string pool instead of indirected.
Eric Christopher31b05762013-08-08 01:41:00 +0000157void CompileUnit::addLocalString(DIE *Die, uint16_t Attribute,
Eric Christopher2cbd5762013-01-07 19:32:41 +0000158 StringRef String) {
Eric Christophere698f532012-12-20 21:58:36 +0000159 MCSymbol *Symb = DU->getStringPoolEntry(String);
Nick Lewyckycc64ae12011-10-28 05:29:47 +0000160 DIEValue *Value;
161 if (Asm->needsRelocationsForDwarfStringPool())
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000162 Value = new (DIEValueAllocator) DIELabel(Symb);
Nick Lewyckycc64ae12011-10-28 05:29:47 +0000163 else {
Eric Christophere698f532012-12-20 21:58:36 +0000164 MCSymbol *StringPool = DU->getStringPoolSym();
Nick Lewyckycc64ae12011-10-28 05:29:47 +0000165 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +0000166 }
Nick Lewyckycc64ae12011-10-28 05:29:47 +0000167 Die->addValue(Attribute, dwarf::DW_FORM_strp, Value);
Devang Patel0e821f42011-04-12 23:21:44 +0000168}
169
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000170/// addExpr - Add a Dwarf expression attribute data and value.
Devang Patel0e821f42011-04-12 23:21:44 +0000171///
Eric Christopher31b05762013-08-08 01:41:00 +0000172void CompileUnit::addExpr(DIE *Die, uint16_t Attribute, uint16_t Form,
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000173 const MCExpr *Expr) {
174 DIEValue *Value = new (DIEValueAllocator) DIEExpr(Expr);
Devang Patel0e821f42011-04-12 23:21:44 +0000175 Die->addValue(Attribute, Form, Value);
176}
177
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000178/// addLabel - Add a Dwarf label attribute data and value.
179///
Eric Christopher31b05762013-08-08 01:41:00 +0000180void CompileUnit::addLabel(DIE *Die, uint16_t Attribute, uint16_t Form,
David Blaikief3cd7c52013-06-28 20:05:04 +0000181 const MCSymbol *Label) {
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000182 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
183 Die->addValue(Attribute, Form, Value);
David Blaikief3cd7c52013-06-28 20:05:04 +0000184}
185
Eric Christopher962c9082013-01-15 23:56:56 +0000186/// addLabelAddress - Add a dwarf label attribute data and value using
187/// DW_FORM_addr or DW_FORM_GNU_addr_index.
188///
Eric Christopher31b05762013-08-08 01:41:00 +0000189void CompileUnit::addLabelAddress(DIE *Die, uint16_t Attribute,
Eric Christopher962c9082013-01-15 23:56:56 +0000190 MCSymbol *Label) {
Alexey Samsonov4436bf02013-10-03 08:54:43 +0000191 if (Label)
192 DD->addArangeLabel(SymbolCU(this, Label));
Richard Mitton21101b32013-09-19 23:21:01 +0000193
Eric Christopher962c9082013-01-15 23:56:56 +0000194 if (!DD->useSplitDwarf()) {
195 if (Label != NULL) {
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000196 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
Eric Christopher962c9082013-01-15 23:56:56 +0000197 Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
198 } else {
199 DIEValue *Value = new (DIEValueAllocator) DIEInteger(0);
200 Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
201 }
202 } else {
203 unsigned idx = DU->getAddrPoolIndex(Label);
204 DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx);
205 Die->addValue(Attribute, dwarf::DW_FORM_GNU_addr_index, Value);
206 }
207}
208
Eric Christophere9ec2452013-01-18 22:11:33 +0000209/// addOpAddress - Add a dwarf op address data and value using the
210/// form given and an op of either DW_FORM_addr or DW_FORM_GNU_addr_index.
211///
David Blaikief3cd7c52013-06-28 20:05:04 +0000212void CompileUnit::addOpAddress(DIE *Die, const MCSymbol *Sym) {
Alexey Samsonov4436bf02013-10-03 08:54:43 +0000213 DD->addArangeLabel(SymbolCU(this, Sym));
Eric Christophere9ec2452013-01-18 22:11:33 +0000214 if (!DD->useSplitDwarf()) {
215 addUInt(Die, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
216 addLabel(Die, 0, dwarf::DW_FORM_udata, Sym);
217 } else {
Eric Christophere9ec2452013-01-18 22:11:33 +0000218 addUInt(Die, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_addr_index);
David Blaikie8466ca82013-07-01 23:55:52 +0000219 addUInt(Die, 0, dwarf::DW_FORM_GNU_addr_index, DU->getAddrPoolIndex(Sym));
Eric Christophere9ec2452013-01-18 22:11:33 +0000220 }
221}
222
Devang Patel0e821f42011-04-12 23:21:44 +0000223/// addDelta - Add a label delta attribute data and value.
224///
Eric Christopher31b05762013-08-08 01:41:00 +0000225void CompileUnit::addDelta(DIE *Die, uint16_t Attribute, uint16_t Form,
Devang Patel0e821f42011-04-12 23:21:44 +0000226 const MCSymbol *Hi, const MCSymbol *Lo) {
227 DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
228 Die->addValue(Attribute, Form, Value);
229}
230
231/// addDIEEntry - Add a DIE attribute data and value.
232///
Eric Christopher31b05762013-08-08 01:41:00 +0000233void CompileUnit::addDIEEntry(DIE *Die, uint16_t Attribute, uint16_t Form,
Devang Patel0e821f42011-04-12 23:21:44 +0000234 DIE *Entry) {
Manman Ren8990d7e2013-10-01 19:52:23 +0000235 DD->addDIEEntry(Die, Attribute, Form, createDIEEntry(Entry));
Devang Patel0e821f42011-04-12 23:21:44 +0000236}
237
Devang Patel0e821f42011-04-12 23:21:44 +0000238/// addBlock - Add block data.
239///
Eric Christopher31b05762013-08-08 01:41:00 +0000240void CompileUnit::addBlock(DIE *Die, uint16_t Attribute, uint16_t Form,
Devang Patel0e821f42011-04-12 23:21:44 +0000241 DIEBlock *Block) {
242 Block->ComputeSize(Asm);
243 DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
244 Die->addValue(Attribute, Block->BestForm(), Block);
245}
246
247/// addSourceLine - Add location information to specified debug information
248/// entry.
249void CompileUnit::addSourceLine(DIE *Die, DIVariable V) {
250 // Verify variable.
Manman Ren7504ed42013-07-08 18:33:29 +0000251 if (!V.isVariable())
Devang Patel0e821f42011-04-12 23:21:44 +0000252 return;
Eric Christopher92331fd2012-11-21 00:34:38 +0000253
Devang Patel0e821f42011-04-12 23:21:44 +0000254 unsigned Line = V.getLineNumber();
255 if (Line == 0)
256 return;
Eric Christopher7b30f2e42012-11-21 00:34:35 +0000257 unsigned FileID = DD->getOrCreateSourceID(V.getContext().getFilename(),
Manman Ren1e427202013-03-07 01:42:00 +0000258 V.getContext().getDirectory(),
259 getUniqueID());
Devang Patel0e821f42011-04-12 23:21:44 +0000260 assert(FileID && "Invalid file id");
261 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
262 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
263}
264
265/// addSourceLine - Add location information to specified debug information
266/// entry.
267void CompileUnit::addSourceLine(DIE *Die, DIGlobalVariable G) {
268 // Verify global variable.
Manman Ren7504ed42013-07-08 18:33:29 +0000269 if (!G.isGlobalVariable())
Devang Patel0e821f42011-04-12 23:21:44 +0000270 return;
271
272 unsigned Line = G.getLineNumber();
273 if (Line == 0)
274 return;
Manman Ren1e427202013-03-07 01:42:00 +0000275 unsigned FileID = DD->getOrCreateSourceID(G.getFilename(), G.getDirectory(),
276 getUniqueID());
Devang Patel0e821f42011-04-12 23:21:44 +0000277 assert(FileID && "Invalid file id");
278 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
279 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
280}
281
282/// addSourceLine - Add location information to specified debug information
283/// entry.
284void CompileUnit::addSourceLine(DIE *Die, DISubprogram SP) {
285 // Verify subprogram.
Manman Ren7504ed42013-07-08 18:33:29 +0000286 if (!SP.isSubprogram())
Devang Patel0e821f42011-04-12 23:21:44 +0000287 return;
Eric Christopher7734ca22012-03-15 23:55:40 +0000288
Devang Patel0e821f42011-04-12 23:21:44 +0000289 // If the line number is 0, don't add it.
Eric Christopher7734ca22012-03-15 23:55:40 +0000290 unsigned Line = SP.getLineNumber();
291 if (Line == 0)
Devang Patel0e821f42011-04-12 23:21:44 +0000292 return;
293
Eric Christopher7b30f2e42012-11-21 00:34:35 +0000294 unsigned FileID = DD->getOrCreateSourceID(SP.getFilename(),
Manman Ren1e427202013-03-07 01:42:00 +0000295 SP.getDirectory(), getUniqueID());
Devang Patel0e821f42011-04-12 23:21:44 +0000296 assert(FileID && "Invalid file id");
297 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
298 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
299}
300
301/// addSourceLine - Add location information to specified debug information
302/// entry.
303void CompileUnit::addSourceLine(DIE *Die, DIType Ty) {
304 // Verify type.
Manman Ren7504ed42013-07-08 18:33:29 +0000305 if (!Ty.isType())
Devang Patel0e821f42011-04-12 23:21:44 +0000306 return;
307
308 unsigned Line = Ty.getLineNumber();
Eric Christopher7734ca22012-03-15 23:55:40 +0000309 if (Line == 0)
Devang Patel0e821f42011-04-12 23:21:44 +0000310 return;
Eric Christopher7b30f2e42012-11-21 00:34:35 +0000311 unsigned FileID = DD->getOrCreateSourceID(Ty.getFilename(),
Manman Ren1e427202013-03-07 01:42:00 +0000312 Ty.getDirectory(), getUniqueID());
Devang Patel0e821f42011-04-12 23:21:44 +0000313 assert(FileID && "Invalid file id");
314 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
315 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
316}
317
318/// addSourceLine - Add location information to specified debug information
319/// entry.
Eric Christopher70e1bd82012-03-29 08:42:56 +0000320void CompileUnit::addSourceLine(DIE *Die, DIObjCProperty Ty) {
321 // Verify type.
Manman Ren7504ed42013-07-08 18:33:29 +0000322 if (!Ty.isObjCProperty())
Eric Christopher70e1bd82012-03-29 08:42:56 +0000323 return;
324
325 unsigned Line = Ty.getLineNumber();
326 if (Line == 0)
327 return;
328 DIFile File = Ty.getFile();
Eric Christopher7b30f2e42012-11-21 00:34:35 +0000329 unsigned FileID = DD->getOrCreateSourceID(File.getFilename(),
Manman Ren1e427202013-03-07 01:42:00 +0000330 File.getDirectory(), getUniqueID());
Eric Christopher70e1bd82012-03-29 08:42:56 +0000331 assert(FileID && "Invalid file id");
332 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
333 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
334}
335
336/// addSourceLine - Add location information to specified debug information
337/// entry.
Devang Patel0e821f42011-04-12 23:21:44 +0000338void CompileUnit::addSourceLine(DIE *Die, DINameSpace NS) {
339 // Verify namespace.
340 if (!NS.Verify())
341 return;
342
343 unsigned Line = NS.getLineNumber();
344 if (Line == 0)
345 return;
346 StringRef FN = NS.getFilename();
347
Manman Ren1e427202013-03-07 01:42:00 +0000348 unsigned FileID = DD->getOrCreateSourceID(FN, NS.getDirectory(),
349 getUniqueID());
Devang Patel0e821f42011-04-12 23:21:44 +0000350 assert(FileID && "Invalid file id");
351 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
352 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
353}
354
Eric Christopher92331fd2012-11-21 00:34:38 +0000355/// addVariableAddress - Add DW_AT_location attribute for a
Devang Patel77dc5412011-04-27 22:45:24 +0000356/// DbgVariable based on provided MachineLocation.
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000357void CompileUnit::addVariableAddress(const DbgVariable &DV, DIE *Die,
Devang Patel77dc5412011-04-27 22:45:24 +0000358 MachineLocation Location) {
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000359 if (DV.variableHasComplexAddress())
Devang Patel0e821f42011-04-12 23:21:44 +0000360 addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000361 else if (DV.isBlockByrefVariable())
Devang Patel0e821f42011-04-12 23:21:44 +0000362 addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location);
363 else
David Blaikieea2605d2013-06-20 00:25:24 +0000364 addAddress(Die, dwarf::DW_AT_location, Location,
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000365 DV.getVariable().isIndirect());
Devang Patel0e821f42011-04-12 23:21:44 +0000366}
367
Devang Patelba5fbf12011-04-26 19:06:18 +0000368/// addRegisterOp - Add register operand.
369void CompileUnit::addRegisterOp(DIE *TheDie, unsigned Reg) {
370 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
371 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
372 if (DWReg < 32)
373 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + DWReg);
374 else {
375 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
376 addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
377 }
378}
379
380/// addRegisterOffset - Add register offset.
381void CompileUnit::addRegisterOffset(DIE *TheDie, unsigned Reg,
382 int64_t Offset) {
383 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
384 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
385 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
386 if (Reg == TRI->getFrameRegister(*Asm->MF))
387 // If variable offset is based in frame register then use fbreg.
388 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
389 else if (DWReg < 32)
390 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DWReg);
391 else {
392 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
393 addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
394 }
395 addSInt(TheDie, 0, dwarf::DW_FORM_sdata, Offset);
396}
397
398/// addAddress - Add an address attribute to a die based on the location
399/// provided.
Eric Christopher31b05762013-08-08 01:41:00 +0000400void CompileUnit::addAddress(DIE *Die, uint16_t Attribute,
David Blaikieea2605d2013-06-20 00:25:24 +0000401 const MachineLocation &Location, bool Indirect) {
Devang Patelba5fbf12011-04-26 19:06:18 +0000402 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
403
David Blaikieea2605d2013-06-20 00:25:24 +0000404 if (Location.isReg() && !Indirect)
Devang Patelba5fbf12011-04-26 19:06:18 +0000405 addRegisterOp(Block, Location.getReg());
David Blaikieea2605d2013-06-20 00:25:24 +0000406 else {
Devang Patelba5fbf12011-04-26 19:06:18 +0000407 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
David Blaikieea2605d2013-06-20 00:25:24 +0000408 if (Indirect && !Location.isReg()) {
409 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
410 }
411 }
Devang Patelba5fbf12011-04-26 19:06:18 +0000412
413 // Now attach the location information to the DIE.
414 addBlock(Die, Attribute, 0, Block);
415}
416
Devang Patel0e821f42011-04-12 23:21:44 +0000417/// addComplexAddress - Start with the address based on the location provided,
418/// and generate the DWARF information necessary to find the actual variable
419/// given the extra address information encoded in the DIVariable, starting from
420/// the starting location. Add the DWARF information to the die.
421///
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000422void CompileUnit::addComplexAddress(const DbgVariable &DV, DIE *Die,
Eric Christopher31b05762013-08-08 01:41:00 +0000423 uint16_t Attribute,
Devang Patel0e821f42011-04-12 23:21:44 +0000424 const MachineLocation &Location) {
Devang Patel0e821f42011-04-12 23:21:44 +0000425 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000426 unsigned N = DV.getNumAddrElements();
Devang Patel3e021532011-04-28 02:22:40 +0000427 unsigned i = 0;
428 if (Location.isReg()) {
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000429 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
Devang Patel3e021532011-04-28 02:22:40 +0000430 // If first address element is OpPlus then emit
431 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000432 addRegisterOffset(Block, Location.getReg(), DV.getAddrElement(1));
Devang Patel3e021532011-04-28 02:22:40 +0000433 i = 2;
434 } else
435 addRegisterOp(Block, Location.getReg());
436 }
Devang Patelba5fbf12011-04-26 19:06:18 +0000437 else
438 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel0e821f42011-04-12 23:21:44 +0000439
Devang Patel3e021532011-04-28 02:22:40 +0000440 for (;i < N; ++i) {
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000441 uint64_t Element = DV.getAddrElement(i);
Devang Patel0e821f42011-04-12 23:21:44 +0000442 if (Element == DIBuilder::OpPlus) {
443 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000444 addUInt(Block, 0, dwarf::DW_FORM_udata, DV.getAddrElement(++i));
Devang Patel0e821f42011-04-12 23:21:44 +0000445 } else if (Element == DIBuilder::OpDeref) {
Eric Christopher4d250522012-05-08 18:56:00 +0000446 if (!Location.isReg())
447 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Devang Patel0e821f42011-04-12 23:21:44 +0000448 } else llvm_unreachable("unknown DIBuilder Opcode");
449 }
450
451 // Now attach the location information to the DIE.
452 addBlock(Die, Attribute, 0, Block);
453}
454
455/* Byref variables, in Blocks, are declared by the programmer as "SomeType
456 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
457 gives the variable VarName either the struct, or a pointer to the struct, as
458 its type. This is necessary for various behind-the-scenes things the
459 compiler needs to do with by-reference variables in Blocks.
460
461 However, as far as the original *programmer* is concerned, the variable
462 should still have type 'SomeType', as originally declared.
463
464 The function getBlockByrefType dives into the __Block_byref_x_VarName
465 struct to find the original type of the variable, which is then assigned to
466 the variable's Debug Information Entry as its real type. So far, so good.
467 However now the debugger will expect the variable VarName to have the type
468 SomeType. So we need the location attribute for the variable to be an
469 expression that explains to the debugger how to navigate through the
470 pointers and struct to find the actual variable of type SomeType.
471
472 The following function does just that. We start by getting
473 the "normal" location for the variable. This will be the location
474 of either the struct __Block_byref_x_VarName or the pointer to the
475 struct __Block_byref_x_VarName.
476
477 The struct will look something like:
478
479 struct __Block_byref_x_VarName {
480 ... <various fields>
481 struct __Block_byref_x_VarName *forwarding;
482 ... <various other fields>
483 SomeType VarName;
484 ... <maybe more fields>
485 };
486
487 If we are given the struct directly (as our starting point) we
488 need to tell the debugger to:
489
490 1). Add the offset of the forwarding field.
491
492 2). Follow that pointer to get the real __Block_byref_x_VarName
493 struct to use (the real one may have been copied onto the heap).
494
495 3). Add the offset for the field VarName, to find the actual variable.
496
497 If we started with a pointer to the struct, then we need to
498 dereference that pointer first, before the other steps.
499 Translating this into DWARF ops, we will need to append the following
500 to the current location description for the variable:
501
502 DW_OP_deref -- optional, if we start with a pointer
503 DW_OP_plus_uconst <forward_fld_offset>
504 DW_OP_deref
505 DW_OP_plus_uconst <varName_fld_offset>
506
507 That is what this function does. */
508
509/// addBlockByrefAddress - Start with the address based on the location
510/// provided, and generate the DWARF information necessary to find the
511/// actual Block variable (navigating the Block struct) based on the
512/// starting location. Add the DWARF information to the die. For
513/// more information, read large comment just above here.
514///
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000515void CompileUnit::addBlockByrefAddress(const DbgVariable &DV, DIE *Die,
Eric Christopher31b05762013-08-08 01:41:00 +0000516 uint16_t Attribute,
Devang Patel0e821f42011-04-12 23:21:44 +0000517 const MachineLocation &Location) {
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000518 DIType Ty = DV.getType();
Devang Patel0e821f42011-04-12 23:21:44 +0000519 DIType TmpTy = Ty;
Eric Christopher31b05762013-08-08 01:41:00 +0000520 uint16_t Tag = Ty.getTag();
Devang Patel0e821f42011-04-12 23:21:44 +0000521 bool isPointer = false;
522
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000523 StringRef varName = DV.getName();
Devang Patel0e821f42011-04-12 23:21:44 +0000524
525 if (Tag == dwarf::DW_TAG_pointer_type) {
526 DIDerivedType DTy = DIDerivedType(Ty);
Manman Ren9a0a6702013-10-01 23:45:54 +0000527 TmpTy = DD->resolve(DTy.getTypeDerivedFrom());
Devang Patel0e821f42011-04-12 23:21:44 +0000528 isPointer = true;
529 }
530
531 DICompositeType blockStruct = DICompositeType(TmpTy);
532
533 // Find the __forwarding field and the variable field in the __Block_byref
534 // struct.
535 DIArray Fields = blockStruct.getTypeArray();
536 DIDescriptor varField = DIDescriptor();
537 DIDescriptor forwardingField = DIDescriptor();
538
539 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
540 DIDescriptor Element = Fields.getElement(i);
541 DIDerivedType DT = DIDerivedType(Element);
542 StringRef fieldName = DT.getName();
543 if (fieldName == "__forwarding")
544 forwardingField = Element;
545 else if (fieldName == varName)
546 varField = Element;
547 }
548
549 // Get the offsets for the forwarding field and the variable field.
550 unsigned forwardingFieldOffset =
551 DIDerivedType(forwardingField).getOffsetInBits() >> 3;
552 unsigned varFieldOffset =
553 DIDerivedType(varField).getOffsetInBits() >> 3;
554
555 // Decode the original location, and use that as the start of the byref
556 // variable's location.
Devang Patel0e821f42011-04-12 23:21:44 +0000557 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
558
Eric Christopheref9d7102012-07-04 02:02:18 +0000559 if (Location.isReg())
560 addRegisterOp(Block, Location.getReg());
561 else
562 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel0e821f42011-04-12 23:21:44 +0000563
564 // If we started with a pointer to the __Block_byref... struct, then
565 // the first thing we need to do is dereference the pointer (DW_OP_deref).
566 if (isPointer)
567 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
568
569 // Next add the offset for the '__forwarding' field:
570 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
571 // adding the offset if it's 0.
572 if (forwardingFieldOffset > 0) {
573 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
574 addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
575 }
576
577 // Now dereference the __forwarding field to get to the real __Block_byref
578 // struct: DW_OP_deref.
579 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
580
581 // Now that we've got the real __Block_byref... struct, add the offset
582 // for the variable's field to get to the location of the actual variable:
583 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
584 if (varFieldOffset > 0) {
585 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
586 addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
587 }
588
589 // Now attach the location information to the DIE.
590 addBlock(Die, Attribute, 0, Block);
591}
592
Devang Patelbcd50a12011-07-20 21:57:04 +0000593/// isTypeSigned - Return true if the type is signed.
Manman Ren9a0a6702013-10-01 23:45:54 +0000594static bool isTypeSigned(DwarfDebug *DD, DIType Ty, int *SizeInBits) {
Devang Patelbcd50a12011-07-20 21:57:04 +0000595 if (Ty.isDerivedType())
Manman Ren9a0a6702013-10-01 23:45:54 +0000596 return isTypeSigned(DD, DD->resolve(DIDerivedType(Ty).getTypeDerivedFrom()),
597 SizeInBits);
Devang Patelbcd50a12011-07-20 21:57:04 +0000598 if (Ty.isBasicType())
599 if (DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed
600 || DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed_char) {
601 *SizeInBits = Ty.getSizeInBits();
602 return true;
603 }
604 return false;
605}
606
Manman Ren9a0a6702013-10-01 23:45:54 +0000607/// Return true if type encoding is unsigned.
608static bool isUnsignedDIType(DwarfDebug *DD, DIType Ty) {
609 DIDerivedType DTy(Ty);
610 if (DTy.isDerivedType())
611 return isUnsignedDIType(DD, DD->resolve(DTy.getTypeDerivedFrom()));
612
613 DIBasicType BTy(Ty);
614 if (BTy.isBasicType()) {
615 unsigned Encoding = BTy.getEncoding();
616 if (Encoding == dwarf::DW_ATE_unsigned ||
617 Encoding == dwarf::DW_ATE_unsigned_char ||
618 Encoding == dwarf::DW_ATE_boolean)
619 return true;
620 }
621 return false;
622}
623
624/// If this type is derived from a base type then return base type size.
625static uint64_t getOriginalTypeSize(DwarfDebug *DD, DIDerivedType Ty) {
626 unsigned Tag = Ty.getTag();
627
628 if (Tag != dwarf::DW_TAG_member && Tag != dwarf::DW_TAG_typedef &&
629 Tag != dwarf::DW_TAG_const_type && Tag != dwarf::DW_TAG_volatile_type &&
630 Tag != dwarf::DW_TAG_restrict_type)
631 return Ty.getSizeInBits();
632
633 DIType BaseType = DD->resolve(Ty.getTypeDerivedFrom());
634
635 // If this type is not derived from any type then take conservative approach.
636 if (!BaseType.isValid())
637 return Ty.getSizeInBits();
638
639 // If this is a derived type, go ahead and get the base type, unless it's a
640 // reference then it's just the size of the field. Pointer types have no need
641 // of this since they're a different type of qualification on the type.
642 if (BaseType.getTag() == dwarf::DW_TAG_reference_type ||
643 BaseType.getTag() == dwarf::DW_TAG_rvalue_reference_type)
644 return Ty.getSizeInBits();
645
646 if (BaseType.isDerivedType())
647 return getOriginalTypeSize(DD, DIDerivedType(BaseType));
648
649 return BaseType.getSizeInBits();
650}
651
Devang Patel0e821f42011-04-12 23:21:44 +0000652/// addConstantValue - Add constant value entry in variable DIE.
Eric Christopher78fcf4902013-07-03 01:08:30 +0000653void CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO,
Devang Patel3c6aed22011-05-27 16:45:18 +0000654 DIType Ty) {
David Blaikiea1e813d2013-05-10 21:52:07 +0000655 // FIXME: This is a bit conservative/simple - it emits negative values at
656 // their maximum bit width which is a bit unfortunate (& doesn't prefer
657 // udata/sdata over dataN as suggested by the DWARF spec)
Nick Lewycky654f5ce2011-10-26 22:55:33 +0000658 assert(MO.isImm() && "Invalid machine operand!");
Devang Patelbcd50a12011-07-20 21:57:04 +0000659 int SizeInBits = -1;
Manman Ren9a0a6702013-10-01 23:45:54 +0000660 bool SignedConstant = isTypeSigned(DD, Ty, &SizeInBits);
Eric Christopher9d1daa82013-08-27 23:49:04 +0000661 uint16_t Form;
Devang Patelf1d04702011-05-27 18:15:52 +0000662
Eric Christopher9d1daa82013-08-27 23:49:04 +0000663 // If we're a signed constant definitely use sdata.
664 if (SignedConstant) {
665 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, MO.getImm());
666 return;
667 }
668
669 // Else use data for now unless it's larger than we can deal with.
670 switch (SizeInBits) {
671 case 8:
672 Form = dwarf::DW_FORM_data1;
673 break;
674 case 16:
675 Form = dwarf::DW_FORM_data2;
676 break;
677 case 32:
678 Form = dwarf::DW_FORM_data4;
679 break;
680 case 64:
681 Form = dwarf::DW_FORM_data8;
682 break;
683 default:
684 Form = dwarf::DW_FORM_udata;
685 addUInt(Die, dwarf::DW_AT_const_value, Form, MO.getImm());
686 return;
687 }
688 addUInt(Die, dwarf::DW_AT_const_value, Form, MO.getImm());
Devang Patel0e821f42011-04-12 23:21:44 +0000689}
690
691/// addConstantFPValue - Add constant value entry in variable DIE.
Eric Christopher78fcf4902013-07-03 01:08:30 +0000692void CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +0000693 assert (MO.isFPImm() && "Invalid machine operand!");
Devang Patel0e821f42011-04-12 23:21:44 +0000694 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
695 APFloat FPImm = MO.getFPImm()->getValueAPF();
696
697 // Get the raw data form of the floating point.
698 const APInt FltVal = FPImm.bitcastToAPInt();
699 const char *FltPtr = (const char*)FltVal.getRawData();
700
701 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
Micah Villmowcdfe20b2012-10-08 16:38:25 +0000702 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel0e821f42011-04-12 23:21:44 +0000703 int Incr = (LittleEndian ? 1 : -1);
704 int Start = (LittleEndian ? 0 : NumBytes - 1);
705 int Stop = (LittleEndian ? NumBytes : -1);
706
707 // Output the constant to DWARF one byte at a time.
708 for (; Start != Stop; Start += Incr)
709 addUInt(Block, 0, dwarf::DW_FORM_data1,
710 (unsigned char)0xFF & FltPtr[Start]);
711
712 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
Devang Patel0e821f42011-04-12 23:21:44 +0000713}
714
David Blaikiea39a76e2013-01-20 01:18:01 +0000715/// addConstantFPValue - Add constant value entry in variable DIE.
Eric Christopher78fcf4902013-07-03 01:08:30 +0000716void CompileUnit::addConstantFPValue(DIE *Die, const ConstantFP *CFP) {
Eric Christopher9d1daa82013-08-27 23:49:04 +0000717 // Pass this down to addConstantValue as an unsigned bag of bits.
718 addConstantValue(Die, CFP->getValueAPF().bitcastToAPInt(), true);
David Blaikiea39a76e2013-01-20 01:18:01 +0000719}
720
Devang Patel0e821f42011-04-12 23:21:44 +0000721/// addConstantValue - Add constant value entry in variable DIE.
Eric Christopher78fcf4902013-07-03 01:08:30 +0000722void CompileUnit::addConstantValue(DIE *Die, const ConstantInt *CI,
Devang Patel0e821f42011-04-12 23:21:44 +0000723 bool Unsigned) {
Eric Christopher78fcf4902013-07-03 01:08:30 +0000724 addConstantValue(Die, CI->getValue(), Unsigned);
David Blaikiea39a76e2013-01-20 01:18:01 +0000725}
726
727// addConstantValue - Add constant value entry in variable DIE.
Eric Christopher78fcf4902013-07-03 01:08:30 +0000728void CompileUnit::addConstantValue(DIE *Die, const APInt &Val, bool Unsigned) {
David Blaikiea39a76e2013-01-20 01:18:01 +0000729 unsigned CIBitWidth = Val.getBitWidth();
Devang Patel8816bbc2011-05-28 00:39:18 +0000730 if (CIBitWidth <= 64) {
Eric Christopher9d1daa82013-08-27 23:49:04 +0000731 // If we're a signed constant definitely use sdata.
732 if (!Unsigned) {
733 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata,
734 Val.getSExtValue());
735 return;
Devang Patel8816bbc2011-05-28 00:39:18 +0000736 }
Eric Christopher9d1daa82013-08-27 23:49:04 +0000737
738 // Else use data for now unless it's larger than we can deal with.
739 uint16_t Form;
740 switch (CIBitWidth) {
741 case 8:
742 Form = dwarf::DW_FORM_data1;
743 break;
744 case 16:
745 Form = dwarf::DW_FORM_data2;
746 break;
747 case 32:
748 Form = dwarf::DW_FORM_data4;
749 break;
750 case 64:
751 Form = dwarf::DW_FORM_data8;
752 break;
753 default:
754 addUInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
755 Val.getZExtValue());
756 return;
757 }
758 addUInt(Die, dwarf::DW_AT_const_value, Form, Val.getZExtValue());
Eric Christopher78fcf4902013-07-03 01:08:30 +0000759 return;
Devang Patel0e821f42011-04-12 23:21:44 +0000760 }
761
762 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
763
764 // Get the raw data form of the large APInt.
NAKAMURA Takumi29ccdd82011-10-28 14:12:22 +0000765 const uint64_t *Ptr64 = Val.getRawData();
Devang Patel0e821f42011-04-12 23:21:44 +0000766
767 int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
Micah Villmowcdfe20b2012-10-08 16:38:25 +0000768 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel0e821f42011-04-12 23:21:44 +0000769
770 // Output the constant to DWARF one byte at a time.
NAKAMURA Takumi29ccdd82011-10-28 14:12:22 +0000771 for (int i = 0; i < NumBytes; i++) {
772 uint8_t c;
773 if (LittleEndian)
774 c = Ptr64[i / 8] >> (8 * (i & 7));
775 else
776 c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7));
777 addUInt(Block, 0, dwarf::DW_FORM_data1, c);
778 }
Devang Patel0e821f42011-04-12 23:21:44 +0000779
780 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
Devang Patel0e821f42011-04-12 23:21:44 +0000781}
782
Eric Christopher25e35092013-04-22 07:47:40 +0000783/// addTemplateParams - Add template parameters into buffer.
Devang Patel0e821f42011-04-12 23:21:44 +0000784void CompileUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
785 // Add template parameters.
786 for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) {
787 DIDescriptor Element = TParams.getElement(i);
788 if (Element.isTemplateTypeParameter())
789 Buffer.addChild(getOrCreateTemplateTypeParameterDIE(
790 DITemplateTypeParameter(Element)));
791 else if (Element.isTemplateValueParameter())
792 Buffer.addChild(getOrCreateTemplateValueParameterDIE(
793 DITemplateValueParameter(Element)));
794 }
Devang Patel0e821f42011-04-12 23:21:44 +0000795}
Nick Lewycky654f5ce2011-10-26 22:55:33 +0000796
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000797/// getOrCreateContextDIE - Get context owner's DIE.
798DIE *CompileUnit::getOrCreateContextDIE(DIDescriptor Context) {
799 if (Context.isType())
800 return getOrCreateTypeDIE(DIType(Context));
801 else if (Context.isNameSpace())
802 return getOrCreateNameSpace(DINameSpace(Context));
803 else if (Context.isSubprogram())
804 return getOrCreateSubprogramDIE(DISubprogram(Context));
Eric Christopher25e35092013-04-22 07:47:40 +0000805 else
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000806 return getDIE(Context);
807}
808
Devang Patel0e821f42011-04-12 23:21:44 +0000809/// addToContextOwner - Add Die into the list of its context owner's children.
810void CompileUnit::addToContextOwner(DIE *Die, DIDescriptor Context) {
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000811 if (DIE *ContextDIE = getOrCreateContextDIE(Context))
Devang Patel0e821f42011-04-12 23:21:44 +0000812 ContextDIE->addChild(Die);
813 else
814 addDie(Die);
815}
816
817/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
818/// given DIType.
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000819DIE *CompileUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
820 DIType Ty(TyNode);
Manman Ren7504ed42013-07-08 18:33:29 +0000821 if (!Ty.isType())
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000822 return NULL;
Manman Ren8990d7e2013-10-01 19:52:23 +0000823 DIE *TyDIE = DD->getTypeDIE(Ty);
Devang Patel0e821f42011-04-12 23:21:44 +0000824 if (TyDIE)
825 return TyDIE;
826
827 // Create new type.
828 TyDIE = new DIE(dwarf::DW_TAG_base_type);
Manman Ren8990d7e2013-10-01 19:52:23 +0000829 DD->insertTypeDIE(Ty, TyDIE);
Devang Patel0e821f42011-04-12 23:21:44 +0000830 if (Ty.isBasicType())
831 constructTypeDIE(*TyDIE, DIBasicType(Ty));
832 else if (Ty.isCompositeType())
833 constructTypeDIE(*TyDIE, DICompositeType(Ty));
834 else {
835 assert(Ty.isDerivedType() && "Unknown kind of DIType");
836 constructTypeDIE(*TyDIE, DIDerivedType(Ty));
837 }
Eric Christophere2887932011-11-10 19:52:58 +0000838 // If this is a named finished type then include it in the list of types
839 // for the accelerator tables.
Eric Christopher21bde872012-01-06 04:35:23 +0000840 if (!Ty.getName().empty() && !Ty.isForwardDecl()) {
841 bool IsImplementation = 0;
842 if (Ty.isCompositeType()) {
843 DICompositeType CT(Ty);
Eric Christopher8ea8e4f2012-01-06 23:03:37 +0000844 // A runtime language of 0 actually means C/C++ and that any
845 // non-negative value is some version of Objective-C/C++.
Eric Christopher21bde872012-01-06 04:35:23 +0000846 IsImplementation = (CT.getRunTimeLang() == 0) ||
Eric Christopheref64b462012-02-22 08:46:02 +0000847 CT.isObjcClassComplete();
Eric Christopher21bde872012-01-06 04:35:23 +0000848 }
Eric Christophercf7289f2013-09-05 18:20:16 +0000849 unsigned Flags = IsImplementation ? dwarf::DW_FLAG_type_implementation : 0;
Eric Christopher8ea8e4f2012-01-06 23:03:37 +0000850 addAccelType(Ty.getName(), std::make_pair(TyDIE, Flags));
Eric Christopher21bde872012-01-06 04:35:23 +0000851 }
Eric Christopher92331fd2012-11-21 00:34:38 +0000852
Manman Ren116868e2013-09-09 19:47:11 +0000853 addToContextOwner(TyDIE, DD->resolve(Ty.getContext()));
Devang Patel0e821f42011-04-12 23:21:44 +0000854 return TyDIE;
855}
856
857/// addType - Add a new type attribute to the specified entity.
Eric Christopher31b05762013-08-08 01:41:00 +0000858void CompileUnit::addType(DIE *Entity, DIType Ty, uint16_t Attribute) {
Eric Christopher0df08e22013-08-08 07:40:37 +0000859 assert(Ty && "Trying to add a type that doesn't exist?");
Devang Patel0e821f42011-04-12 23:21:44 +0000860
861 // Check for pre-existence.
862 DIEEntry *Entry = getDIEEntry(Ty);
863 // If it exists then use the existing value.
864 if (Entry) {
Manman Ren8990d7e2013-10-01 19:52:23 +0000865 DD->addDIEEntry(Entity, Attribute, dwarf::DW_FORM_ref4, Entry);
Devang Patel0e821f42011-04-12 23:21:44 +0000866 return;
867 }
868
869 // Construct type.
870 DIE *Buffer = getOrCreateTypeDIE(Ty);
871
872 // Set up proxy.
873 Entry = createDIEEntry(Buffer);
874 insertDIEEntry(Ty, Entry);
Manman Ren8990d7e2013-10-01 19:52:23 +0000875 DD->addDIEEntry(Entity, Attribute, dwarf::DW_FORM_ref4, Entry);
Devang Patele9853f22011-05-31 22:56:51 +0000876
877 // If this is a complete composite type then include it in the
878 // list of global types.
Devang Patel562c7422011-06-01 00:23:24 +0000879 addGlobalType(Ty);
Devang Patel1cb8ab42011-05-31 23:30:30 +0000880}
881
Eric Christopher9cd26af2013-09-20 23:22:52 +0000882// Accelerator table mutators - add each name along with its companion
883// DIE to the proper table while ensuring that the name that we're going
884// to reference is in the string table. We do this since the names we
885// add may not only be identical to the names in the DIE.
886void CompileUnit::addAccelName(StringRef Name, DIE *Die) {
887 DU->getStringPoolEntry(Name);
Eric Christopherb0fc0b92013-09-23 22:59:11 +0000888 std::vector<DIE *> &DIEs = AccelNames[Name];
Eric Christopher9cd26af2013-09-20 23:22:52 +0000889 DIEs.push_back(Die);
890}
891
892void CompileUnit::addAccelObjC(StringRef Name, DIE *Die) {
893 DU->getStringPoolEntry(Name);
Eric Christopherb0fc0b92013-09-23 22:59:11 +0000894 std::vector<DIE *> &DIEs = AccelObjC[Name];
Eric Christopher9cd26af2013-09-20 23:22:52 +0000895 DIEs.push_back(Die);
896}
897
898void CompileUnit::addAccelNamespace(StringRef Name, DIE *Die) {
899 DU->getStringPoolEntry(Name);
Eric Christopherb0fc0b92013-09-23 22:59:11 +0000900 std::vector<DIE *> &DIEs = AccelNamespace[Name];
Eric Christopher9cd26af2013-09-20 23:22:52 +0000901 DIEs.push_back(Die);
902}
903
904void CompileUnit::addAccelType(StringRef Name, std::pair<DIE *, unsigned> Die) {
905 DU->getStringPoolEntry(Name);
906 std::vector<std::pair<DIE *, unsigned> > &DIEs = AccelTypes[Name];
907 DIEs.push_back(Die);
908}
909
Eric Christopher9c58f312013-09-20 22:20:55 +0000910/// addGlobalName - Add a new global name to the compile unit.
911void CompileUnit::addGlobalName(StringRef Name, DIE *Die) {
912 GlobalNames[Name] = Die;
913}
914
Devang Patel1cb8ab42011-05-31 23:30:30 +0000915/// addGlobalType - Add a new global type to the compile unit.
916///
Devang Patel562c7422011-06-01 00:23:24 +0000917void CompileUnit::addGlobalType(DIType Ty) {
Manman Ren116868e2013-09-09 19:47:11 +0000918 DIDescriptor Context = DD->resolve(Ty.getContext());
Eric Christopher6d0f1e62013-09-23 23:15:58 +0000919 if (!Ty.getName().empty() && !Ty.isForwardDecl() &&
Eric Christopherb0fc0b92013-09-23 22:59:11 +0000920 (!Context || Context.isCompileUnit() || Context.isFile() ||
921 Context.isNameSpace()))
Devang Patel562c7422011-06-01 00:23:24 +0000922 if (DIEEntry *Entry = getDIEEntry(Ty))
923 GlobalTypes[Ty.getName()] = Entry->getEntry();
Devang Patel0e821f42011-04-12 23:21:44 +0000924}
925
Devang Patel17b53272011-05-06 16:57:54 +0000926/// addPubTypes - Add type for pubtypes section.
927void CompileUnit::addPubTypes(DISubprogram SP) {
928 DICompositeType SPTy = SP.getType();
Eric Christopher31b05762013-08-08 01:41:00 +0000929 uint16_t SPTag = SPTy.getTag();
Devang Patel17b53272011-05-06 16:57:54 +0000930 if (SPTag != dwarf::DW_TAG_subroutine_type)
931 return;
932
933 DIArray Args = SPTy.getTypeArray();
934 for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
935 DIType ATy(Args.getElement(i));
Manman Ren7504ed42013-07-08 18:33:29 +0000936 if (!ATy.isType())
Devang Patel17b53272011-05-06 16:57:54 +0000937 continue;
Devang Patel562c7422011-06-01 00:23:24 +0000938 addGlobalType(ATy);
Devang Patel17b53272011-05-06 16:57:54 +0000939 }
940}
941
Devang Patel0e821f42011-04-12 23:21:44 +0000942/// constructTypeDIE - Construct basic type die from DIBasicType.
943void CompileUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
944 // Get core information.
945 StringRef Name = BTy.getName();
Devang Patel0e821f42011-04-12 23:21:44 +0000946 // Add name if not anonymous or intermediate type.
947 if (!Name.empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +0000948 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel04d6d472011-09-14 23:13:28 +0000949
950 if (BTy.getTag() == dwarf::DW_TAG_unspecified_type) {
951 Buffer.setTag(dwarf::DW_TAG_unspecified_type);
Eric Christopher93ebdd72013-07-09 23:48:45 +0000952 // An unspecified type only has a name attribute.
Devang Patel04d6d472011-09-14 23:13:28 +0000953 return;
954 }
955
956 Buffer.setTag(dwarf::DW_TAG_base_type);
Nick Lewycky654f5ce2011-10-26 22:55:33 +0000957 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
Devang Pateld925d1a2012-02-07 23:33:58 +0000958 BTy.getEncoding());
Devang Patel04d6d472011-09-14 23:13:28 +0000959
Devang Patel0e821f42011-04-12 23:21:44 +0000960 uint64_t Size = BTy.getSizeInBits() >> 3;
961 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
962}
963
964/// constructTypeDIE - Construct derived type die from DIDerivedType.
965void CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
966 // Get core information.
967 StringRef Name = DTy.getName();
968 uint64_t Size = DTy.getSizeInBits() >> 3;
Eric Christopher31b05762013-08-08 01:41:00 +0000969 uint16_t Tag = DTy.getTag();
Devang Patel0e821f42011-04-12 23:21:44 +0000970
971 // FIXME - Workaround for templates.
972 if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
973
974 Buffer.setTag(Tag);
975
976 // Map to main type, void will not have a type.
Manman Ren9a0a6702013-10-01 23:45:54 +0000977 DIType FromTy = DD->resolve(DTy.getTypeDerivedFrom());
Eric Christopher0df08e22013-08-08 07:40:37 +0000978 if (FromTy)
979 addType(&Buffer, FromTy);
Devang Patel0e821f42011-04-12 23:21:44 +0000980
981 // Add name if not anonymous or intermediate type.
982 if (!Name.empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +0000983 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel0e821f42011-04-12 23:21:44 +0000984
985 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopher85757902012-02-21 22:25:53 +0000986 if (Size && Tag != dwarf::DW_TAG_pointer_type)
Devang Patel0e821f42011-04-12 23:21:44 +0000987 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
988
David Blaikie5d3249b2013-01-07 05:51:15 +0000989 if (Tag == dwarf::DW_TAG_ptr_to_member_type)
990 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
Manman Ren60352032013-09-05 18:48:31 +0000991 getOrCreateTypeDIE(DD->resolve(DTy.getClassType())));
Devang Patel0e821f42011-04-12 23:21:44 +0000992 // Add source line info if available and TyDesc is not a forward declaration.
993 if (!DTy.isForwardDecl())
994 addSourceLine(&Buffer, DTy);
995}
996
Eric Christopher67646432013-07-26 17:02:41 +0000997/// Return true if the type is appropriately scoped to be contained inside
998/// its own type unit.
Manman Ren33796c52013-09-09 19:23:58 +0000999static bool isTypeUnitScoped(DIType Ty, const DwarfDebug *DD) {
Manman Ren116868e2013-09-09 19:47:11 +00001000 DIScope Parent = DD->resolve(Ty.getContext());
Eric Christopher67646432013-07-26 17:02:41 +00001001 while (Parent) {
1002 // Don't generate a hash for anything scoped inside a function.
1003 if (Parent.isSubprogram())
1004 return false;
Manman Rende897a362013-09-09 22:35:23 +00001005 Parent = DD->resolve(Parent.getContext());
Eric Christopher67646432013-07-26 17:02:41 +00001006 }
1007 return true;
1008}
1009
1010/// Return true if the type should be split out into a type unit.
Manman Ren33796c52013-09-09 19:23:58 +00001011static bool shouldCreateTypeUnit(DICompositeType CTy, const DwarfDebug *DD) {
Eric Christopher31b05762013-08-08 01:41:00 +00001012 uint16_t Tag = CTy.getTag();
Eric Christopher67646432013-07-26 17:02:41 +00001013
1014 switch (Tag) {
1015 case dwarf::DW_TAG_structure_type:
1016 case dwarf::DW_TAG_union_type:
1017 case dwarf::DW_TAG_enumeration_type:
1018 case dwarf::DW_TAG_class_type:
1019 // If this is a class, structure, union, or enumeration type
1020 // that is not a declaration, is a type definition, and not scoped
1021 // inside a function then separate this out as a type unit.
Manman Ren33796c52013-09-09 19:23:58 +00001022 if (CTy.isForwardDecl() || !isTypeUnitScoped(CTy, DD))
Eric Christopher67646432013-07-26 17:02:41 +00001023 return 0;
1024 return 1;
1025 default:
1026 return 0;
1027 }
1028}
1029
Devang Patel0e821f42011-04-12 23:21:44 +00001030/// constructTypeDIE - Construct type DIE from DICompositeType.
1031void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
1032 // Get core information.
1033 StringRef Name = CTy.getName();
1034
1035 uint64_t Size = CTy.getSizeInBits() >> 3;
Eric Christopher31b05762013-08-08 01:41:00 +00001036 uint16_t Tag = CTy.getTag();
Devang Patel0e821f42011-04-12 23:21:44 +00001037 Buffer.setTag(Tag);
1038
1039 switch (Tag) {
Devang Patel0e821f42011-04-12 23:21:44 +00001040 case dwarf::DW_TAG_array_type:
1041 constructArrayTypeDIE(Buffer, &CTy);
1042 break;
1043 case dwarf::DW_TAG_enumeration_type: {
1044 DIArray Elements = CTy.getTypeArray();
1045
1046 // Add enumerators to enumeration type.
1047 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1048 DIE *ElemDie = NULL;
1049 DIDescriptor Enum(Elements.getElement(i));
1050 if (Enum.isEnumerator()) {
1051 ElemDie = constructEnumTypeDIE(DIEnumerator(Enum));
1052 Buffer.addChild(ElemDie);
1053 }
1054 }
Manman Ren9a0a6702013-10-01 23:45:54 +00001055 DIType DTy = DD->resolve(CTy.getTypeDerivedFrom());
Eric Christopher49e17b22013-08-08 07:40:42 +00001056 if (DTy) {
Eric Christopherc4964352012-05-23 00:09:20 +00001057 addType(&Buffer, DTy);
1058 addUInt(&Buffer, dwarf::DW_AT_enum_class, dwarf::DW_FORM_flag, 1);
1059 }
Devang Patel0e821f42011-04-12 23:21:44 +00001060 }
1061 break;
1062 case dwarf::DW_TAG_subroutine_type: {
Eric Christopher0df08e22013-08-08 07:40:37 +00001063 // Add return type. A void return won't have a type.
Devang Patel0e821f42011-04-12 23:21:44 +00001064 DIArray Elements = CTy.getTypeArray();
1065 DIDescriptor RTy = Elements.getElement(0);
Eric Christopher0df08e22013-08-08 07:40:37 +00001066 if (RTy)
1067 addType(&Buffer, DIType(RTy));
Devang Patel0e821f42011-04-12 23:21:44 +00001068
1069 bool isPrototyped = true;
1070 // Add arguments.
1071 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
1072 DIDescriptor Ty = Elements.getElement(i);
1073 if (Ty.isUnspecifiedParameter()) {
1074 DIE *Arg = new DIE(dwarf::DW_TAG_unspecified_parameters);
1075 Buffer.addChild(Arg);
1076 isPrototyped = false;
1077 } else {
1078 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1079 addType(Arg, DIType(Ty));
David Blaikie9a7a7a92013-01-29 19:35:24 +00001080 if (DIType(Ty).isArtificial())
1081 addFlag(Arg, dwarf::DW_AT_artificial);
Devang Patel0e821f42011-04-12 23:21:44 +00001082 Buffer.addChild(Arg);
1083 }
1084 }
Eric Christopher5cd2a9d2012-02-22 08:46:21 +00001085 // Add prototype flag if we're dealing with a C language and the
1086 // function has been prototyped.
Eric Christopherbfceb2f2013-08-26 23:50:38 +00001087 uint16_t Language = DICompileUnit(Node).getLanguage();
Eric Christopher5cd2a9d2012-02-22 08:46:21 +00001088 if (isPrototyped &&
Eric Christopherd42b92f2012-05-22 18:45:24 +00001089 (Language == dwarf::DW_LANG_C89 ||
1090 Language == dwarf::DW_LANG_C99 ||
1091 Language == dwarf::DW_LANG_ObjC))
Eric Christopherbb69a272012-08-24 01:14:27 +00001092 addFlag(&Buffer, dwarf::DW_AT_prototyped);
Devang Patel0e821f42011-04-12 23:21:44 +00001093 }
1094 break;
1095 case dwarf::DW_TAG_structure_type:
1096 case dwarf::DW_TAG_union_type:
1097 case dwarf::DW_TAG_class_type: {
Devang Patel0e821f42011-04-12 23:21:44 +00001098 // Add elements to structure type.
David Blaikiea1ae0e62013-08-01 20:30:22 +00001099 DIArray Elements = CTy.getTypeArray();
1100 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
Devang Patel0e821f42011-04-12 23:21:44 +00001101 DIDescriptor Element = Elements.getElement(i);
1102 DIE *ElemDie = NULL;
1103 if (Element.isSubprogram()) {
1104 DISubprogram SP(Element);
Devang Patel89543712011-08-15 17:24:54 +00001105 ElemDie = getOrCreateSubprogramDIE(DISubprogram(Element));
Devang Patel0e821f42011-04-12 23:21:44 +00001106 if (SP.isProtected())
Nick Lewyckycb918492011-12-13 05:09:11 +00001107 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001108 dwarf::DW_ACCESS_protected);
1109 else if (SP.isPrivate())
Nick Lewyckycb918492011-12-13 05:09:11 +00001110 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001111 dwarf::DW_ACCESS_private);
Eric Christopher92331fd2012-11-21 00:34:38 +00001112 else
Nick Lewyckycb918492011-12-13 05:09:11 +00001113 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001114 dwarf::DW_ACCESS_public);
1115 if (SP.isExplicit())
Eric Christopherbb69a272012-08-24 01:14:27 +00001116 addFlag(ElemDie, dwarf::DW_AT_explicit);
Eric Christopher7285c7d2012-03-28 07:34:31 +00001117 } else if (Element.isDerivedType()) {
Eric Christopherd42b92f2012-05-22 18:45:24 +00001118 DIDerivedType DDTy(Element);
1119 if (DDTy.getTag() == dwarf::DW_TAG_friend) {
1120 ElemDie = new DIE(dwarf::DW_TAG_friend);
Manman Ren9a0a6702013-10-01 23:45:54 +00001121 addType(ElemDie, DD->resolve(DDTy.getTypeDerivedFrom()),
1122 dwarf::DW_AT_friend);
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001123 } else if (DDTy.isStaticMember())
1124 ElemDie = createStaticMemberDIE(DDTy);
1125 else
1126 ElemDie = createMemberDIE(DDTy);
Eric Christopher7285c7d2012-03-28 07:34:31 +00001127 } else if (Element.isObjCProperty()) {
Devang Pateld925d1a2012-02-07 23:33:58 +00001128 DIObjCProperty Property(Element);
1129 ElemDie = new DIE(Property.getTag());
1130 StringRef PropertyName = Property.getObjCPropertyName();
1131 addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
Eric Christopherd42b92f2012-05-22 18:45:24 +00001132 addType(ElemDie, Property.getType());
1133 addSourceLine(ElemDie, Property);
Devang Pateld925d1a2012-02-07 23:33:58 +00001134 StringRef GetterName = Property.getObjCPropertyGetterName();
1135 if (!GetterName.empty())
1136 addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
1137 StringRef SetterName = Property.getObjCPropertySetterName();
1138 if (!SetterName.empty())
1139 addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
1140 unsigned PropertyAttributes = 0;
Devang Patel403e8192012-02-04 01:30:32 +00001141 if (Property.isReadOnlyObjCProperty())
1142 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
1143 if (Property.isReadWriteObjCProperty())
1144 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
1145 if (Property.isAssignObjCProperty())
1146 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
1147 if (Property.isRetainObjCProperty())
1148 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
1149 if (Property.isCopyObjCProperty())
1150 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
1151 if (Property.isNonAtomicObjCProperty())
1152 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
1153 if (PropertyAttributes)
Eric Christopher92331fd2012-11-21 00:34:38 +00001154 addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, 0,
Devang Patel403e8192012-02-04 01:30:32 +00001155 PropertyAttributes);
Devang Patel44882172012-02-06 17:49:43 +00001156
Devang Pateld925d1a2012-02-07 23:33:58 +00001157 DIEEntry *Entry = getDIEEntry(Element);
1158 if (!Entry) {
1159 Entry = createDIEEntry(ElemDie);
1160 insertDIEEntry(Element, Entry);
1161 }
Devang Patel403e8192012-02-04 01:30:32 +00001162 } else
Devang Patel0e821f42011-04-12 23:21:44 +00001163 continue;
1164 Buffer.addChild(ElemDie);
1165 }
1166
1167 if (CTy.isAppleBlockExtension())
Eric Christopherbb69a272012-08-24 01:14:27 +00001168 addFlag(&Buffer, dwarf::DW_AT_APPLE_block);
Devang Patel0e821f42011-04-12 23:21:44 +00001169
Manman Rend8f798e2013-09-06 18:46:00 +00001170 DICompositeType ContainingType(DD->resolve(CTy.getContainingType()));
Devang Patel0e821f42011-04-12 23:21:44 +00001171 if (DIDescriptor(ContainingType).isCompositeType())
1172 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
1173 getOrCreateTypeDIE(DIType(ContainingType)));
Eric Christopher666dc632013-07-14 21:46:51 +00001174 else
Manman Ren116868e2013-09-09 19:47:11 +00001175 addToContextOwner(&Buffer, DD->resolve(CTy.getContext()));
Devang Patel0e821f42011-04-12 23:21:44 +00001176
Devang Patel12419ae2011-05-12 21:29:42 +00001177 if (CTy.isObjcClassComplete())
Eric Christopherbb69a272012-08-24 01:14:27 +00001178 addFlag(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type);
Devang Patel2409e782011-05-12 19:06:16 +00001179
Eric Christopherda011dd2011-12-16 23:42:42 +00001180 // Add template parameters to a class, structure or union types.
1181 // FIXME: The support isn't in the metadata for this yet.
1182 if (Tag == dwarf::DW_TAG_class_type ||
1183 Tag == dwarf::DW_TAG_structure_type ||
1184 Tag == dwarf::DW_TAG_union_type)
Devang Patel0e821f42011-04-12 23:21:44 +00001185 addTemplateParams(Buffer, CTy.getTemplateParams());
1186
1187 break;
1188 }
1189 default:
1190 break;
1191 }
1192
1193 // Add name if not anonymous or intermediate type.
1194 if (!Name.empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +00001195 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel0e821f42011-04-12 23:21:44 +00001196
Eric Christopher775cbd22012-05-22 18:45:18 +00001197 if (Tag == dwarf::DW_TAG_enumeration_type ||
1198 Tag == dwarf::DW_TAG_class_type ||
1199 Tag == dwarf::DW_TAG_structure_type ||
1200 Tag == dwarf::DW_TAG_union_type) {
Devang Patel0e821f42011-04-12 23:21:44 +00001201 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopher1cf33382012-06-01 00:22:32 +00001202 // TODO: Do we care about size for enum forward declarations?
Devang Patel0e821f42011-04-12 23:21:44 +00001203 if (Size)
1204 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
Eric Christopher1cf33382012-06-01 00:22:32 +00001205 else if (!CTy.isForwardDecl())
Devang Patel0e821f42011-04-12 23:21:44 +00001206 // Add zero size if it is not a forward declaration.
Eric Christopher1cf33382012-06-01 00:22:32 +00001207 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
1208
1209 // If we're a forward decl, say so.
1210 if (CTy.isForwardDecl())
Eric Christopherbb69a272012-08-24 01:14:27 +00001211 addFlag(&Buffer, dwarf::DW_AT_declaration);
Devang Patel0e821f42011-04-12 23:21:44 +00001212
1213 // Add source line info if available.
1214 if (!CTy.isForwardDecl())
1215 addSourceLine(&Buffer, CTy);
Eric Christopher54cf8ff2012-03-07 00:15:19 +00001216
1217 // No harm in adding the runtime language to the declaration.
1218 unsigned RLang = CTy.getRunTimeLang();
1219 if (RLang)
1220 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
1221 dwarf::DW_FORM_data1, RLang);
Devang Patel0e821f42011-04-12 23:21:44 +00001222 }
Eric Christopher67646432013-07-26 17:02:41 +00001223 // If this is a type applicable to a type unit it then add it to the
1224 // list of types we'll compute a hash for later.
Manman Ren33796c52013-09-09 19:23:58 +00001225 if (shouldCreateTypeUnit(CTy, DD))
Eric Christopher67646432013-07-26 17:02:41 +00001226 DD->addTypeUnitType(&Buffer);
Devang Patel0e821f42011-04-12 23:21:44 +00001227}
1228
Eric Christopher92331fd2012-11-21 00:34:38 +00001229/// getOrCreateTemplateTypeParameterDIE - Find existing DIE or create new DIE
Devang Patel0e821f42011-04-12 23:21:44 +00001230/// for the given DITemplateTypeParameter.
1231DIE *
1232CompileUnit::getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP) {
1233 DIE *ParamDIE = getDIE(TP);
1234 if (ParamDIE)
1235 return ParamDIE;
1236
1237 ParamDIE = new DIE(dwarf::DW_TAG_template_type_parameter);
Eric Christopher056b6472013-08-08 08:09:43 +00001238 // Add the type if it exists, it could be void and therefore no type.
1239 if (TP.getType())
1240 addType(ParamDIE, TP.getType());
David Blaikie2b380232013-06-22 18:59:11 +00001241 if (!TP.getName().empty())
1242 addString(ParamDIE, dwarf::DW_AT_name, TP.getName());
Devang Patel0e821f42011-04-12 23:21:44 +00001243 return ParamDIE;
1244}
1245
Eric Christopher92331fd2012-11-21 00:34:38 +00001246/// getOrCreateTemplateValueParameterDIE - Find existing DIE or create new DIE
Devang Patel0e821f42011-04-12 23:21:44 +00001247/// for the given DITemplateValueParameter.
1248DIE *
Eric Christopherafb2c412013-08-08 07:40:31 +00001249CompileUnit::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter VP) {
1250 DIE *ParamDIE = getDIE(VP);
Devang Patel0e821f42011-04-12 23:21:44 +00001251 if (ParamDIE)
1252 return ParamDIE;
1253
Eric Christopherafb2c412013-08-08 07:40:31 +00001254 ParamDIE = new DIE(VP.getTag());
Eric Christopher0df08e22013-08-08 07:40:37 +00001255
1256 // Add the type if there is one, template template and template parameter
1257 // packs will not have a type.
1258 if (VP.getType())
1259 addType(ParamDIE, VP.getType());
Eric Christopherafb2c412013-08-08 07:40:31 +00001260 if (!VP.getName().empty())
1261 addString(ParamDIE, dwarf::DW_AT_name, VP.getName());
1262 if (Value *Val = VP.getValue()) {
David Blaikiea1e813d2013-05-10 21:52:07 +00001263 if (ConstantInt *CI = dyn_cast<ConstantInt>(Val))
Manman Ren9a0a6702013-10-01 23:45:54 +00001264 addConstantValue(ParamDIE, CI, isUnsignedDIType(DD, VP.getType()));
David Blaikiea1e813d2013-05-10 21:52:07 +00001265 else if (GlobalValue *GV = dyn_cast<GlobalValue>(Val)) {
1266 // For declaration non-type template parameters (such as global values and
1267 // functions)
1268 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1269 addOpAddress(Block, Asm->Mang->getSymbol(GV));
1270 // Emit DW_OP_stack_value to use the address as the immediate value of the
1271 // parameter, rather than a pointer to it.
1272 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value);
1273 addBlock(ParamDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopherafb2c412013-08-08 07:40:31 +00001274 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_template_param) {
David Blaikie2b380232013-06-22 18:59:11 +00001275 assert(isa<MDString>(Val));
1276 addString(ParamDIE, dwarf::DW_AT_GNU_template_name,
1277 cast<MDString>(Val)->getString());
Eric Christopherafb2c412013-08-08 07:40:31 +00001278 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_parameter_pack) {
David Blaikie2b380232013-06-22 18:59:11 +00001279 assert(isa<MDNode>(Val));
1280 DIArray A(cast<MDNode>(Val));
1281 addTemplateParams(*ParamDIE, A);
David Blaikiea1e813d2013-05-10 21:52:07 +00001282 }
1283 }
1284
Devang Patel0e821f42011-04-12 23:21:44 +00001285 return ParamDIE;
1286}
1287
Devang Patel17b53272011-05-06 16:57:54 +00001288/// getOrCreateNameSpace - Create a DIE for DINameSpace.
1289DIE *CompileUnit::getOrCreateNameSpace(DINameSpace NS) {
1290 DIE *NDie = getDIE(NS);
1291 if (NDie)
1292 return NDie;
1293 NDie = new DIE(dwarf::DW_TAG_namespace);
1294 insertDIE(NS, NDie);
Eric Christopher4996c702011-11-07 09:24:32 +00001295 if (!NS.getName().empty()) {
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +00001296 addString(NDie, dwarf::DW_AT_name, NS.getName());
Eric Christopher4996c702011-11-07 09:24:32 +00001297 addAccelNamespace(NS.getName(), NDie);
Eric Christopher55364d72013-09-24 00:17:57 +00001298 addGlobalName(NS.getName(), NDie);
Eric Christopher4996c702011-11-07 09:24:32 +00001299 } else
1300 addAccelNamespace("(anonymous namespace)", NDie);
Devang Patel17b53272011-05-06 16:57:54 +00001301 addSourceLine(NDie, NS);
1302 addToContextOwner(NDie, NS.getContext());
1303 return NDie;
1304}
1305
Devang Patel89543712011-08-15 17:24:54 +00001306/// getOrCreateSubprogramDIE - Create new DIE using SP.
1307DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
Manman Ren8990d7e2013-10-01 19:52:23 +00001308 DIE *SPDie = DD->getSPDIE(SP);
Devang Patel89543712011-08-15 17:24:54 +00001309 if (SPDie)
1310 return SPDie;
1311
Peter Collingbourne4d358b52012-05-27 18:36:44 +00001312 SPDie = new DIE(dwarf::DW_TAG_subprogram);
1313
1314 // DW_TAG_inlined_subroutine may refer to this DIE.
Manman Ren8990d7e2013-10-01 19:52:23 +00001315 DD->insertSPDIE(SP, SPDie);
Peter Collingbourne4d358b52012-05-27 18:36:44 +00001316
Rafael Espindola79278362011-11-10 22:34:29 +00001317 DISubprogram SPDecl = SP.getFunctionDeclaration();
1318 DIE *DeclDie = NULL;
1319 if (SPDecl.isSubprogram()) {
1320 DeclDie = getOrCreateSubprogramDIE(SPDecl);
1321 }
1322
Devang Patel89543712011-08-15 17:24:54 +00001323 // Add to context owner.
1324 addToContextOwner(SPDie, SP.getContext());
1325
1326 // Add function template parameters.
1327 addTemplateParams(*SPDie, SP.getTemplateParams());
1328
Devang Patel89543712011-08-15 17:24:54 +00001329 // If this DIE is going to refer declaration info using AT_specification
Eric Christopherf20ff972013-05-09 00:42:33 +00001330 // then there is no need to add other attributes.
Rafael Espindola79278362011-11-10 22:34:29 +00001331 if (DeclDie) {
1332 // Refer function declaration directly.
1333 addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
1334 DeclDie);
1335
Devang Patel89543712011-08-15 17:24:54 +00001336 return SPDie;
Rafael Espindola79278362011-11-10 22:34:29 +00001337 }
Devang Patel89543712011-08-15 17:24:54 +00001338
Eric Christopheracb71152012-08-23 22:52:55 +00001339 // Add the linkage name if we have one.
Michael Gottesmanc89466f2013-09-04 04:39:38 +00001340 StringRef LinkageName = SP.getLinkageName();
1341 if (!LinkageName.empty())
Eric Christopheracb71152012-08-23 22:52:55 +00001342 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c275642013-06-01 17:51:14 +00001343 GlobalValue::getRealLinkageName(LinkageName));
Eric Christopheracb71152012-08-23 22:52:55 +00001344
Devang Patel89543712011-08-15 17:24:54 +00001345 // Constructors and operators for anonymous aggregates do not have names.
1346 if (!SP.getName().empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +00001347 addString(SPDie, dwarf::DW_AT_name, SP.getName());
Devang Patel89543712011-08-15 17:24:54 +00001348
1349 addSourceLine(SPDie, SP);
1350
Eric Christopher5cd2a9d2012-02-22 08:46:21 +00001351 // Add the prototype if we have a prototype and we have a C like
1352 // language.
Eric Christopherbfceb2f2013-08-26 23:50:38 +00001353 uint16_t Language = DICompileUnit(Node).getLanguage();
Eric Christopher5cd2a9d2012-02-22 08:46:21 +00001354 if (SP.isPrototyped() &&
1355 (Language == dwarf::DW_LANG_C89 ||
1356 Language == dwarf::DW_LANG_C99 ||
1357 Language == dwarf::DW_LANG_ObjC))
Eric Christopherbb69a272012-08-24 01:14:27 +00001358 addFlag(SPDie, dwarf::DW_AT_prototyped);
Devang Patel89543712011-08-15 17:24:54 +00001359
Eric Christopher0df08e22013-08-08 07:40:37 +00001360 // Add Return Type. A void return type will not have a type.
Devang Patel89543712011-08-15 17:24:54 +00001361 DICompositeType SPTy = SP.getType();
David Blaikie5174c842013-05-22 23:22:18 +00001362 assert(SPTy.getTag() == dwarf::DW_TAG_subroutine_type &&
1363 "the type of a subprogram should be a subroutine");
Devang Patel89543712011-08-15 17:24:54 +00001364
David Blaikie5174c842013-05-22 23:22:18 +00001365 DIArray Args = SPTy.getTypeArray();
Eric Christopher0df08e22013-08-08 07:40:37 +00001366 if (Args.getElement(0))
1367 addType(SPDie, DIType(Args.getElement(0)));
Devang Patel89543712011-08-15 17:24:54 +00001368
1369 unsigned VK = SP.getVirtuality();
1370 if (VK) {
Nick Lewyckycfde1a22011-12-14 00:56:07 +00001371 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
Devang Patel89543712011-08-15 17:24:54 +00001372 DIEBlock *Block = getDIEBlock();
1373 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1374 addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex());
1375 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
1376 ContainingTypeMap.insert(std::make_pair(SPDie,
Manman Renc4ae9b32013-09-07 00:04:05 +00001377 DD->resolve(SP.getContainingType())));
Devang Patel89543712011-08-15 17:24:54 +00001378 }
1379
1380 if (!SP.isDefinition()) {
Eric Christopherbb69a272012-08-24 01:14:27 +00001381 addFlag(SPDie, dwarf::DW_AT_declaration);
Eric Christopher92331fd2012-11-21 00:34:38 +00001382
Devang Patel89543712011-08-15 17:24:54 +00001383 // Add arguments. Do not add arguments for subprogram definition. They will
1384 // be handled while processing variables.
David Blaikie5174c842013-05-22 23:22:18 +00001385 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1386 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1387 DIType ATy = DIType(Args.getElement(i));
1388 addType(Arg, ATy);
1389 if (ATy.isArtificial())
1390 addFlag(Arg, dwarf::DW_AT_artificial);
1391 SPDie->addChild(Arg);
1392 }
Devang Patel89543712011-08-15 17:24:54 +00001393 }
1394
1395 if (SP.isArtificial())
Eric Christopherbb69a272012-08-24 01:14:27 +00001396 addFlag(SPDie, dwarf::DW_AT_artificial);
Devang Patel89543712011-08-15 17:24:54 +00001397
1398 if (!SP.isLocalToUnit())
Eric Christopherbb69a272012-08-24 01:14:27 +00001399 addFlag(SPDie, dwarf::DW_AT_external);
Devang Patel89543712011-08-15 17:24:54 +00001400
1401 if (SP.isOptimized())
Eric Christopherbb69a272012-08-24 01:14:27 +00001402 addFlag(SPDie, dwarf::DW_AT_APPLE_optimized);
Devang Patel89543712011-08-15 17:24:54 +00001403
1404 if (unsigned isa = Asm->getISAEncoding()) {
1405 addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1406 }
1407
1408 return SPDie;
1409}
1410
Devang Pateldfd6ec32011-08-15 17:57:41 +00001411// Return const expression if value is a GEP to access merged global
1412// constant. e.g.
1413// i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
1414static const ConstantExpr *getMergedGlobalExpr(const Value *V) {
1415 const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
1416 if (!CE || CE->getNumOperands() != 3 ||
1417 CE->getOpcode() != Instruction::GetElementPtr)
1418 return NULL;
1419
1420 // First operand points to a global struct.
1421 Value *Ptr = CE->getOperand(0);
1422 if (!isa<GlobalValue>(Ptr) ||
1423 !isa<StructType>(cast<PointerType>(Ptr->getType())->getElementType()))
1424 return NULL;
1425
1426 // Second operand is zero.
1427 const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
1428 if (!CI || !CI->isZero())
1429 return NULL;
1430
1431 // Third operand is offset.
1432 if (!isa<ConstantInt>(CE->getOperand(2)))
1433 return NULL;
1434
1435 return CE;
1436}
1437
1438/// createGlobalVariableDIE - create global variable DIE.
1439void CompileUnit::createGlobalVariableDIE(const MDNode *N) {
Devang Pateldfd6ec32011-08-15 17:57:41 +00001440 // Check for pre-existence.
Devang Patela6576a12011-08-18 22:21:50 +00001441 if (getDIE(N))
Devang Pateldfd6ec32011-08-15 17:57:41 +00001442 return;
1443
Devang Patela6576a12011-08-18 22:21:50 +00001444 DIGlobalVariable GV(N);
Manman Ren7504ed42013-07-08 18:33:29 +00001445 if (!GV.isGlobalVariable())
Devang Patel0ecbcbd2011-08-18 23:17:55 +00001446 return;
1447
Devang Pateldfd6ec32011-08-15 17:57:41 +00001448 DIDescriptor GVContext = GV.getContext();
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001449 DIType GTy = GV.getType();
1450
1451 // If this is a static data member definition, some attributes belong
1452 // to the declaration DIE.
1453 DIE *VariableDIE = NULL;
Manman Rene697d3c2013-02-01 23:54:37 +00001454 bool IsStaticMember = false;
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001455 DIDerivedType SDMDecl = GV.getStaticDataMemberDeclaration();
1456 if (SDMDecl.Verify()) {
1457 assert(SDMDecl.isStaticMember() && "Expected static member decl");
1458 // We need the declaration DIE that is in the static member's class.
1459 // But that class might not exist in the DWARF yet.
1460 // Creating the class will create the static member decl DIE.
Manman Ren116868e2013-09-09 19:47:11 +00001461 getOrCreateContextDIE(DD->resolve(SDMDecl.getContext()));
Manman Ren8990d7e2013-10-01 19:52:23 +00001462 VariableDIE = DD->getStaticMemberDIE(SDMDecl);
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001463 assert(VariableDIE && "Static member decl has no context?");
Manman Rene697d3c2013-02-01 23:54:37 +00001464 IsStaticMember = true;
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001465 }
1466
1467 // If this is not a static data member definition, create the variable
1468 // DIE and add the initial set of attributes to it.
1469 if (!VariableDIE) {
1470 VariableDIE = new DIE(GV.getTag());
1471 // Add to map.
1472 insertDIE(N, VariableDIE);
1473
1474 // Add name and type.
1475 addString(VariableDIE, dwarf::DW_AT_name, GV.getDisplayName());
1476 addType(VariableDIE, GTy);
1477
1478 // Add scoping info.
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00001479 if (!GV.isLocalToUnit()) {
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001480 addFlag(VariableDIE, dwarf::DW_AT_external);
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00001481 addGlobalName(GV.getName(), VariableDIE);
1482 }
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001483
1484 // Add line number info.
1485 addSourceLine(VariableDIE, GV);
1486 // Add to context owner.
1487 addToContextOwner(VariableDIE, GVContext);
1488 }
1489
Devang Pateldfd6ec32011-08-15 17:57:41 +00001490 // Add location.
Eric Christopher4996c702011-11-07 09:24:32 +00001491 bool addToAccelTable = false;
Eric Christopher0a917b72011-11-11 03:16:32 +00001492 DIE *VariableSpecDIE = NULL;
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001493 bool isGlobalVariable = GV.getGlobal() != NULL;
Devang Pateldfd6ec32011-08-15 17:57:41 +00001494 if (isGlobalVariable) {
Eric Christopher4996c702011-11-07 09:24:32 +00001495 addToAccelTable = true;
Devang Pateldfd6ec32011-08-15 17:57:41 +00001496 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
David Blaikief2694972013-06-28 20:05:11 +00001497 const MCSymbol *Sym = Asm->Mang->getSymbol(GV.getGlobal());
1498 if (GV.getGlobal()->isThreadLocal()) {
1499 // FIXME: Make this work with -gsplit-dwarf.
1500 unsigned PointerSize = Asm->getDataLayout().getPointerSize();
1501 assert((PointerSize == 4 || PointerSize == 8) &&
1502 "Add support for other sizes if necessary");
Ulrich Weigand2b6fc8d2013-07-02 18:47:09 +00001503 const MCExpr *Expr =
David Blaikie8466ca82013-07-01 23:55:52 +00001504 Asm->getObjFileLowering().getDebugThreadLocalSymbol(Sym);
David Blaikief2694972013-06-28 20:05:11 +00001505 // Based on GCC's support for TLS:
David Blaikie8466ca82013-07-01 23:55:52 +00001506 if (!DD->useSplitDwarf()) {
1507 // 1) Start with a constNu of the appropriate pointer size
1508 addUInt(Block, 0, dwarf::DW_FORM_data1,
1509 PointerSize == 4 ? dwarf::DW_OP_const4u : dwarf::DW_OP_const8u);
1510 // 2) containing the (relocated) address of the TLS variable
Ulrich Weigand2b6fc8d2013-07-02 18:47:09 +00001511 addExpr(Block, 0, dwarf::DW_FORM_udata, Expr);
David Blaikie8466ca82013-07-01 23:55:52 +00001512 } else {
1513 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_const_index);
Ulrich Weigand2b6fc8d2013-07-02 18:47:09 +00001514 addUInt(Block, 0, dwarf::DW_FORM_udata, DU->getAddrPoolIndex(Expr));
David Blaikie8466ca82013-07-01 23:55:52 +00001515 }
David Blaikief2694972013-06-28 20:05:11 +00001516 // 3) followed by a custom OP to tell the debugger about TLS (presumably)
1517 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_lo_user);
1518 } else
1519 addOpAddress(Block, Sym);
Devang Pateldfd6ec32011-08-15 17:57:41 +00001520 // Do not create specification DIE if context is either compile unit
1521 // or a subprogram.
Devang Patel5e6b65c2011-09-21 23:41:11 +00001522 if (GVContext && GV.isDefinition() && !GVContext.isCompileUnit() &&
Manman Ren3eb9dff2013-09-09 19:05:21 +00001523 !GVContext.isFile() && !DD->isSubprogramContext(GVContext)) {
Devang Pateldfd6ec32011-08-15 17:57:41 +00001524 // Create specification DIE.
Eric Christopherc12c2112011-11-11 01:55:22 +00001525 VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
Devang Pateldfd6ec32011-08-15 17:57:41 +00001526 addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
1527 dwarf::DW_FORM_ref4, VariableDIE);
1528 addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001529 // A static member's declaration is already flagged as such.
1530 if (!SDMDecl.Verify())
1531 addFlag(VariableDIE, dwarf::DW_AT_declaration);
Devang Pateldfd6ec32011-08-15 17:57:41 +00001532 addDie(VariableSpecDIE);
1533 } else {
1534 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopher4996c702011-11-07 09:24:32 +00001535 }
Michael Gottesmanc89466f2013-09-04 04:39:38 +00001536 // Add the linkage name.
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001537 StringRef LinkageName = GV.getLinkageName();
Michael Gottesmanc89466f2013-09-04 04:39:38 +00001538 if (!LinkageName.empty())
Eric Christopher3f79b8c2013-02-27 23:49:47 +00001539 // From DWARF4: DIEs to which DW_AT_linkage_name may apply include:
1540 // TAG_common_block, TAG_constant, TAG_entry_point, TAG_subprogram and
1541 // TAG_variable.
Manman Ren584e4c02013-02-27 23:21:02 +00001542 addString(IsStaticMember && VariableSpecDIE ?
1543 VariableSpecDIE : VariableDIE, dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c275642013-06-01 17:51:14 +00001544 GlobalValue::getRealLinkageName(LinkageName));
Eric Christopher92331fd2012-11-21 00:34:38 +00001545 } else if (const ConstantInt *CI =
Manman Rene697d3c2013-02-01 23:54:37 +00001546 dyn_cast_or_null<ConstantInt>(GV.getConstant())) {
Adrian Prantl322f41d2013-04-04 22:56:49 +00001547 // AT_const_value was added when the static member was created. To avoid
Manman Rene697d3c2013-02-01 23:54:37 +00001548 // emitting AT_const_value multiple times, we only add AT_const_value when
1549 // it is not a static member.
1550 if (!IsStaticMember)
Manman Ren9a0a6702013-10-01 23:45:54 +00001551 addConstantValue(VariableDIE, CI, isUnsignedDIType(DD, GTy));
Manman Rene697d3c2013-02-01 23:54:37 +00001552 } else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
Eric Christopher4996c702011-11-07 09:24:32 +00001553 addToAccelTable = true;
Devang Pateldfd6ec32011-08-15 17:57:41 +00001554 // GV is a merged global.
1555 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1556 Value *Ptr = CE->getOperand(0);
Eric Christophere9ec2452013-01-18 22:11:33 +00001557 addOpAddress(Block, Asm->Mang->getSymbol(cast<GlobalValue>(Ptr)));
Devang Pateldfd6ec32011-08-15 17:57:41 +00001558 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1559 SmallVector<Value*, 3> Idx(CE->op_begin()+1, CE->op_end());
Eric Christopher92331fd2012-11-21 00:34:38 +00001560 addUInt(Block, 0, dwarf::DW_FORM_udata,
Micah Villmowcdfe20b2012-10-08 16:38:25 +00001561 Asm->getDataLayout().getIndexedOffset(Ptr->getType(), Idx));
Devang Pateldfd6ec32011-08-15 17:57:41 +00001562 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1563 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
1564 }
1565
Eric Christopherc12c2112011-11-11 01:55:22 +00001566 if (addToAccelTable) {
1567 DIE *AddrDIE = VariableSpecDIE ? VariableSpecDIE : VariableDIE;
1568 addAccelName(GV.getName(), AddrDIE);
Eric Christopher4996c702011-11-07 09:24:32 +00001569
Eric Christopherc12c2112011-11-11 01:55:22 +00001570 // If the linkage name is different than the name, go ahead and output
1571 // that as well into the name table.
1572 if (GV.getLinkageName() != "" && GV.getName() != GV.getLinkageName())
1573 addAccelName(GV.getLinkageName(), AddrDIE);
1574 }
Devang Pateldfd6ec32011-08-15 17:57:41 +00001575}
1576
Devang Patel0e821f42011-04-12 23:21:44 +00001577/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
Eric Christopherd42b92f2012-05-22 18:45:24 +00001578void CompileUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR,
1579 DIE *IndexTy) {
Devang Patel0e821f42011-04-12 23:21:44 +00001580 DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
1581 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
Devang Patel0e821f42011-04-12 23:21:44 +00001582
Bill Wendling28fe9e72012-12-06 07:38:10 +00001583 // The LowerBound value defines the lower bounds which is typically zero for
1584 // C/C++. The Count value is the number of elements. Values are 64 bit. If
1585 // Count == -1 then the array is unbounded and we do not emit
1586 // DW_AT_lower_bound and DW_AT_upper_bound attributes. If LowerBound == 0 and
1587 // Count == 0, then the array has zero elements in which case we do not emit
1588 // an upper bound.
1589 int64_t LowerBound = SR.getLo();
Bill Wendling3495f9b2012-12-06 07:55:19 +00001590 int64_t DefaultLowerBound = getDefaultLowerBound();
Bill Wendlingd7767122012-12-04 21:34:03 +00001591 int64_t Count = SR.getCount();
Devang Patel0e821f42011-04-12 23:21:44 +00001592
Bill Wendling3495f9b2012-12-06 07:55:19 +00001593 if (DefaultLowerBound == -1 || LowerBound != DefaultLowerBound)
Bill Wendling28fe9e72012-12-06 07:38:10 +00001594 addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, LowerBound);
1595
1596 if (Count != -1 && Count != 0)
Bill Wendlingd7767122012-12-04 21:34:03 +00001597 // FIXME: An unbounded array should reference the expression that defines
1598 // the array.
Bill Wendling28fe9e72012-12-06 07:38:10 +00001599 addUInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, LowerBound + Count - 1);
Bill Wendlingd7767122012-12-04 21:34:03 +00001600
Devang Patel0e821f42011-04-12 23:21:44 +00001601 Buffer.addChild(DW_Subrange);
1602}
1603
1604/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
1605void CompileUnit::constructArrayTypeDIE(DIE &Buffer,
1606 DICompositeType *CTy) {
1607 Buffer.setTag(dwarf::DW_TAG_array_type);
Eric Christopher72a52952013-01-08 01:53:52 +00001608 if (CTy->isVector())
Eric Christopherbb69a272012-08-24 01:14:27 +00001609 addFlag(&Buffer, dwarf::DW_AT_GNU_vector);
Devang Patel0e821f42011-04-12 23:21:44 +00001610
Eric Christopher0df08e22013-08-08 07:40:37 +00001611 // Emit the element type.
Manman Ren9a0a6702013-10-01 23:45:54 +00001612 addType(&Buffer, DD->resolve(CTy->getTypeDerivedFrom()));
Devang Patel0e821f42011-04-12 23:21:44 +00001613
1614 // Get an anonymous type for index type.
Eric Christophercad9b532013-01-04 21:51:53 +00001615 // FIXME: This type should be passed down from the front end
1616 // as different languages may have different sizes for indexes.
Devang Patel0e821f42011-04-12 23:21:44 +00001617 DIE *IdxTy = getIndexTyDie();
1618 if (!IdxTy) {
1619 // Construct an anonymous type for index type.
1620 IdxTy = new DIE(dwarf::DW_TAG_base_type);
Eric Christophercad9b532013-01-04 21:51:53 +00001621 addString(IdxTy, dwarf::DW_AT_name, "int");
Devang Patel0e821f42011-04-12 23:21:44 +00001622 addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1623 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1624 dwarf::DW_ATE_signed);
1625 addDie(IdxTy);
1626 setIndexTyDie(IdxTy);
1627 }
1628
1629 // Add subranges to array type.
Eric Christopher0df08e22013-08-08 07:40:37 +00001630 DIArray Elements = CTy->getTypeArray();
Devang Patel0e821f42011-04-12 23:21:44 +00001631 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1632 DIDescriptor Element = Elements.getElement(i);
1633 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1634 constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1635 }
1636}
1637
1638/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
1639DIE *CompileUnit::constructEnumTypeDIE(DIEnumerator ETy) {
1640 DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
1641 StringRef Name = ETy.getName();
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +00001642 addString(Enumerator, dwarf::DW_AT_name, Name);
Devang Patel0e821f42011-04-12 23:21:44 +00001643 int64_t Value = ETy.getEnumValue();
1644 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
1645 return Enumerator;
1646}
1647
Devang Patel89543712011-08-15 17:24:54 +00001648/// constructContainingTypeDIEs - Construct DIEs for types that contain
1649/// vtables.
1650void CompileUnit::constructContainingTypeDIEs() {
1651 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
1652 CE = ContainingTypeMap.end(); CI != CE; ++CI) {
1653 DIE *SPDie = CI->first;
1654 const MDNode *N = CI->second;
1655 if (!N) continue;
Manman Ren8990d7e2013-10-01 19:52:23 +00001656 DIE *NDie = DD->getTypeDIE(N);
Devang Patel89543712011-08-15 17:24:54 +00001657 if (!NDie) continue;
1658 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
1659 }
1660}
1661
Devang Patel3acc70e2011-08-15 22:04:40 +00001662/// constructVariableDIE - Construct a DIE for the given DbgVariable.
Eric Christopherbf2d23c2013-06-24 21:07:27 +00001663DIE *CompileUnit::constructVariableDIE(DbgVariable *DV,
1664 bool isScopeAbstract) {
Devang Patel3acc70e2011-08-15 22:04:40 +00001665 StringRef Name = DV->getName();
Devang Patel3acc70e2011-08-15 22:04:40 +00001666
1667 // Translate tag to proper Dwarf tag.
Eric Christopher31b05762013-08-08 01:41:00 +00001668 uint16_t Tag = DV->getTag();
Devang Patel3acc70e2011-08-15 22:04:40 +00001669
1670 // Define variable debug information entry.
1671 DIE *VariableDie = new DIE(Tag);
1672 DbgVariable *AbsVar = DV->getAbstractVariable();
1673 DIE *AbsDIE = AbsVar ? AbsVar->getDIE() : NULL;
Manman Ren4213c392013-05-29 17:16:59 +00001674 if (AbsDIE)
Devang Patel3acc70e2011-08-15 22:04:40 +00001675 addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
Manman Ren4213c392013-05-29 17:16:59 +00001676 dwarf::DW_FORM_ref4, AbsDIE);
Devang Patel3acc70e2011-08-15 22:04:40 +00001677 else {
David Blaikie715528b2013-08-19 03:34:03 +00001678 if (!Name.empty())
1679 addString(VariableDie, dwarf::DW_AT_name, Name);
Devang Patel3acc70e2011-08-15 22:04:40 +00001680 addSourceLine(VariableDie, DV->getVariable());
1681 addType(VariableDie, DV->getType());
1682 }
1683
1684 if (DV->isArtificial())
Eric Christopherbb69a272012-08-24 01:14:27 +00001685 addFlag(VariableDie, dwarf::DW_AT_artificial);
Devang Patel3acc70e2011-08-15 22:04:40 +00001686
1687 if (isScopeAbstract) {
1688 DV->setDIE(VariableDie);
1689 return VariableDie;
1690 }
1691
1692 // Add variable address.
1693
1694 unsigned Offset = DV->getDotDebugLocOffset();
1695 if (Offset != ~0U) {
Eric Christopher40b6bf62013-06-24 21:34:55 +00001696 addLabel(VariableDie, dwarf::DW_AT_location, dwarf::DW_FORM_data4,
1697 Asm->GetTempSymbol("debug_loc", Offset));
Devang Patel3acc70e2011-08-15 22:04:40 +00001698 DV->setDIE(VariableDie);
1699 return VariableDie;
1700 }
1701
Eric Christophercead0332011-10-03 15:49:20 +00001702 // Check if variable is described by a DBG_VALUE instruction.
Devang Patel3acc70e2011-08-15 22:04:40 +00001703 if (const MachineInstr *DVInsn = DV->getMInsn()) {
David Blaikie0252265b2013-06-16 20:34:15 +00001704 assert(DVInsn->getNumOperands() == 3);
1705 if (DVInsn->getOperand(0).isReg()) {
1706 const MachineOperand RegOp = DVInsn->getOperand(0);
Adrian Prantl19942882013-07-09 21:44:06 +00001707 // If the second operand is an immediate, this is an indirect value.
Adrian Prantl418d1d12013-07-09 20:28:37 +00001708 if (DVInsn->getOperand(1).isImm()) {
1709 MachineLocation Location(RegOp.getReg(), DVInsn->getOperand(1).getImm());
Eric Christopherbf2d23c2013-06-24 21:07:27 +00001710 addVariableAddress(*DV, VariableDie, Location);
David Blaikie0252265b2013-06-16 20:34:15 +00001711 } else if (RegOp.getReg())
Eric Christopherbf2d23c2013-06-24 21:07:27 +00001712 addVariableAddress(*DV, VariableDie, MachineLocation(RegOp.getReg()));
David Blaikie0252265b2013-06-16 20:34:15 +00001713 } else if (DVInsn->getOperand(0).isImm())
Eric Christopher78fcf4902013-07-03 01:08:30 +00001714 addConstantValue(VariableDie, DVInsn->getOperand(0), DV->getType());
David Blaikie0252265b2013-06-16 20:34:15 +00001715 else if (DVInsn->getOperand(0).isFPImm())
Eric Christopher78fcf4902013-07-03 01:08:30 +00001716 addConstantFPValue(VariableDie, DVInsn->getOperand(0));
David Blaikie0252265b2013-06-16 20:34:15 +00001717 else if (DVInsn->getOperand(0).isCImm())
Eric Christopher78fcf4902013-07-03 01:08:30 +00001718 addConstantValue(VariableDie, DVInsn->getOperand(0).getCImm(),
Manman Ren9a0a6702013-10-01 23:45:54 +00001719 isUnsignedDIType(DD, DV->getType()));
Eric Christopher78fcf4902013-07-03 01:08:30 +00001720
Devang Patel3acc70e2011-08-15 22:04:40 +00001721 DV->setDIE(VariableDie);
1722 return VariableDie;
1723 } else {
1724 // .. else use frame index.
1725 int FI = DV->getFrameIndex();
1726 if (FI != ~0) {
1727 unsigned FrameReg = 0;
1728 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
Eric Christopher92331fd2012-11-21 00:34:38 +00001729 int Offset =
Devang Patel3acc70e2011-08-15 22:04:40 +00001730 TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
1731 MachineLocation Location(FrameReg, Offset);
Eric Christopherbf2d23c2013-06-24 21:07:27 +00001732 addVariableAddress(*DV, VariableDie, Location);
Devang Patel3acc70e2011-08-15 22:04:40 +00001733 }
1734 }
1735
1736 DV->setDIE(VariableDie);
1737 return VariableDie;
1738}
1739
Devang Patel0e821f42011-04-12 23:21:44 +00001740/// createMemberDIE - Create new member DIE.
1741DIE *CompileUnit::createMemberDIE(DIDerivedType DT) {
1742 DIE *MemberDie = new DIE(DT.getTag());
1743 StringRef Name = DT.getName();
1744 if (!Name.empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +00001745 addString(MemberDie, dwarf::DW_AT_name, Name);
Devang Patel0e821f42011-04-12 23:21:44 +00001746
Manman Ren9a0a6702013-10-01 23:45:54 +00001747 addType(MemberDie, DD->resolve(DT.getTypeDerivedFrom()));
Devang Patel0e821f42011-04-12 23:21:44 +00001748
1749 addSourceLine(MemberDie, DT);
1750
1751 DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
1752 addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1753
1754 uint64_t Size = DT.getSizeInBits();
Manman Ren9a0a6702013-10-01 23:45:54 +00001755 uint64_t FieldSize = getOriginalTypeSize(DD, DT);
Devang Patel0e821f42011-04-12 23:21:44 +00001756
1757 if (Size != FieldSize) {
1758 // Handle bitfield.
Manman Ren9a0a6702013-10-01 23:45:54 +00001759 addUInt(MemberDie, dwarf::DW_AT_byte_size, 0,
1760 getOriginalTypeSize(DD, DT)>>3);
Devang Patel0e821f42011-04-12 23:21:44 +00001761 addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1762
1763 uint64_t Offset = DT.getOffsetInBits();
1764 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1765 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1766 uint64_t FieldOffset = (HiMark - FieldSize);
1767 Offset -= FieldOffset;
1768
1769 // Maybe we need to work from the other end.
Micah Villmowcdfe20b2012-10-08 16:38:25 +00001770 if (Asm->getDataLayout().isLittleEndian())
Devang Patel0e821f42011-04-12 23:21:44 +00001771 Offset = FieldSize - (Offset + Size);
1772 addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
1773
1774 // Here WD_AT_data_member_location points to the anonymous
1775 // field that includes this bit field.
1776 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
1777
1778 } else
1779 // This is not a bitfield.
1780 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1781
1782 if (DT.getTag() == dwarf::DW_TAG_inheritance
1783 && DT.isVirtual()) {
1784
1785 // For C++, virtual base classes are not at fixed offset. Use following
1786 // expression to extract appropriate offset from vtable.
1787 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1788
1789 DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
1790 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1791 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1792 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1793 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1794 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1795 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1796 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1797
1798 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
1799 VBaseLocationDie);
1800 } else
1801 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
1802
1803 if (DT.isProtected())
Nick Lewyckycb918492011-12-13 05:09:11 +00001804 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001805 dwarf::DW_ACCESS_protected);
1806 else if (DT.isPrivate())
Nick Lewyckycb918492011-12-13 05:09:11 +00001807 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001808 dwarf::DW_ACCESS_private);
1809 // Otherwise C++ member and base classes are considered public.
Eric Christopher92331fd2012-11-21 00:34:38 +00001810 else
Nick Lewyckycb918492011-12-13 05:09:11 +00001811 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001812 dwarf::DW_ACCESS_public);
1813 if (DT.isVirtual())
Nick Lewyckycfde1a22011-12-14 00:56:07 +00001814 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001815 dwarf::DW_VIRTUALITY_virtual);
Devang Patel514b4002011-04-16 00:11:51 +00001816
1817 // Objective-C properties.
Devang Patel44882172012-02-06 17:49:43 +00001818 if (MDNode *PNode = DT.getObjCProperty())
1819 if (DIEEntry *PropertyDie = getDIEEntry(PNode))
Eric Christopher92331fd2012-11-21 00:34:38 +00001820 MemberDie->addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4,
Devang Patel44882172012-02-06 17:49:43 +00001821 PropertyDie);
1822
David Blaikie37fefc32012-12-13 22:43:07 +00001823 if (DT.isArtificial())
1824 addFlag(MemberDie, dwarf::DW_AT_artificial);
1825
Devang Patel0e821f42011-04-12 23:21:44 +00001826 return MemberDie;
1827}
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001828
1829/// createStaticMemberDIE - Create new DIE for C++ static member.
1830DIE *CompileUnit::createStaticMemberDIE(const DIDerivedType DT) {
1831 if (!DT.Verify())
1832 return NULL;
1833
1834 DIE *StaticMemberDIE = new DIE(DT.getTag());
Manman Ren9a0a6702013-10-01 23:45:54 +00001835 DIType Ty = DD->resolve(DT.getTypeDerivedFrom());
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001836
1837 addString(StaticMemberDIE, dwarf::DW_AT_name, DT.getName());
1838 addType(StaticMemberDIE, Ty);
1839 addSourceLine(StaticMemberDIE, DT);
1840 addFlag(StaticMemberDIE, dwarf::DW_AT_external);
1841 addFlag(StaticMemberDIE, dwarf::DW_AT_declaration);
1842
1843 // FIXME: We could omit private if the parent is a class_type, and
1844 // public if the parent is something else.
1845 if (DT.isProtected())
1846 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1847 dwarf::DW_ACCESS_protected);
1848 else if (DT.isPrivate())
1849 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1850 dwarf::DW_ACCESS_private);
1851 else
1852 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1853 dwarf::DW_ACCESS_public);
1854
1855 if (const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(DT.getConstant()))
Manman Ren9a0a6702013-10-01 23:45:54 +00001856 addConstantValue(StaticMemberDIE, CI, isUnsignedDIType(DD, Ty));
David Blaikiea39a76e2013-01-20 01:18:01 +00001857 if (const ConstantFP *CFP = dyn_cast_or_null<ConstantFP>(DT.getConstant()))
1858 addConstantFPValue(StaticMemberDIE, CFP);
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001859
Manman Ren8990d7e2013-10-01 19:52:23 +00001860 DD->insertStaticMemberDIE(DT, StaticMemberDIE);
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001861 return StaticMemberDIE;
1862}