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