blob: 7b3842811a32b3a702a5ccb5676bbac68ae8ccba [file] [log] [blame]
Devang Patel161b2f42011-04-12 23:21:44 +00001//===-- llvm/CodeGen/DwarfCompileUnit.cpp - Dwarf Compile Unit ------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
Eric Christopher443c9ed2012-08-14 05:13:29 +000010// This file contains support for constructing a dwarf compile unit.
Devang Patel161b2f42011-04-12 23:21:44 +000011//
12//===----------------------------------------------------------------------===//
13
14#define DEBUG_TYPE "dwarfdebug"
15
16#include "DwarfCompileUnit.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000017#include "DwarfAccelTable.h"
Devang Patel161b2f42011-04-12 23:21:44 +000018#include "DwarfDebug.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000019#include "llvm/ADT/APFloat.h"
Bill Wendling16eeb6f2012-06-29 08:32:07 +000020#include "llvm/DIBuilder.h"
Chandler Carruth0b8c9a82013-01-02 11:36:10 +000021#include "llvm/IR/Constants.h"
22#include "llvm/IR/DataLayout.h"
23#include "llvm/IR/GlobalVariable.h"
24#include "llvm/IR/Instructions.h"
Eric Christopherd61c34b2011-11-11 03:16:32 +000025#include "llvm/Support/Debug.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000026#include "llvm/Support/ErrorHandling.h"
Devang Patel6f9d8ff2011-08-15 17:57:41 +000027#include "llvm/Target/Mangler.h"
Devang Patel161b2f42011-04-12 23:21:44 +000028#include "llvm/Target/TargetFrameLowering.h"
29#include "llvm/Target/TargetMachine.h"
David Blaikie59eaa382013-06-28 20:05:11 +000030#include "llvm/Target/TargetLoweringObjectFile.h"
Devang Patel161b2f42011-04-12 23:21:44 +000031#include "llvm/Target/TargetRegisterInfo.h"
Devang Patel161b2f42011-04-12 23:21:44 +000032
33using namespace llvm;
34
35/// CompileUnit - Compile unit constructor.
Eric Christopher7b878952013-08-26 23:50:38 +000036CompileUnit::CompileUnit(unsigned UID, DIE *D, const MDNode *N, AsmPrinter *A,
37 DwarfDebug *DW, DwarfUnits *DWU)
38 : UniqueID(UID), Node(N), CUDie(D), Asm(A), DD(DW), DU(DWU), IndexTyDie(0),
39 DebugInfoOffset(0) {
Devang Patel161b2f42011-04-12 23:21:44 +000040 DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
Eric Christopher9c57ad22013-05-08 00:58:51 +000041 insertDIE(N, D);
Devang Patel161b2f42011-04-12 23:21:44 +000042}
43
44/// ~CompileUnit - Destructor for compile unit.
45CompileUnit::~CompileUnit() {
46 for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
47 DIEBlocks[j]->~DIEBlock();
48}
49
50/// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
51/// information entry.
52DIEEntry *CompileUnit::createDIEEntry(DIE *Entry) {
53 DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
54 return Value;
55}
56
Bill Wendling6afe4782012-12-06 07:55:19 +000057/// getDefaultLowerBound - Return the default lower bound for an array. If the
Bill Wendling222c2fd2012-12-06 07:38:10 +000058/// DWARF version doesn't handle the language, return -1.
Bill Wendling6afe4782012-12-06 07:55:19 +000059int64_t CompileUnit::getDefaultLowerBound() const {
Eric Christopher7b878952013-08-26 23:50:38 +000060 switch (DICompileUnit(Node).getLanguage()) {
Bill Wendling222c2fd2012-12-06 07:38:10 +000061 default:
62 break;
63
64 case dwarf::DW_LANG_C89:
65 case dwarf::DW_LANG_C99:
66 case dwarf::DW_LANG_C:
67 case dwarf::DW_LANG_C_plus_plus:
68 case dwarf::DW_LANG_ObjC:
69 case dwarf::DW_LANG_ObjC_plus_plus:
70 return 0;
71
72 case dwarf::DW_LANG_Fortran77:
73 case dwarf::DW_LANG_Fortran90:
74 case dwarf::DW_LANG_Fortran95:
75 return 1;
76
77 // The languages below have valid values only if the DWARF version >= 4.
78 case dwarf::DW_LANG_Java:
79 case dwarf::DW_LANG_Python:
80 case dwarf::DW_LANG_UPC:
81 case dwarf::DW_LANG_D:
82 if (dwarf::DWARF_VERSION >= 4)
83 return 0;
84 break;
85
86 case dwarf::DW_LANG_Ada83:
87 case dwarf::DW_LANG_Ada95:
88 case dwarf::DW_LANG_Cobol74:
89 case dwarf::DW_LANG_Cobol85:
90 case dwarf::DW_LANG_Modula2:
91 case dwarf::DW_LANG_Pascal83:
92 case dwarf::DW_LANG_PLI:
93 if (dwarf::DWARF_VERSION >= 4)
94 return 1;
95 break;
96 }
97
98 return -1;
99}
100
Eric Christopher873cf0a2012-08-24 01:14:27 +0000101/// addFlag - Add a flag that is true.
Eric Christopher31667622013-08-08 01:41:00 +0000102void CompileUnit::addFlag(DIE *Die, uint16_t Attribute) {
Eric Christopher873cf0a2012-08-24 01:14:27 +0000103 if (!DD->useDarwinGDBCompat())
104 Die->addValue(Attribute, dwarf::DW_FORM_flag_present,
105 DIEIntegerOne);
106 else
107 addUInt(Die, Attribute, dwarf::DW_FORM_flag, 1);
108}
109
Devang Patel161b2f42011-04-12 23:21:44 +0000110/// addUInt - Add an unsigned integer attribute data and value.
111///
Eric Christopher31667622013-08-08 01:41:00 +0000112void CompileUnit::addUInt(DIE *Die, uint16_t Attribute,
113 uint16_t Form, uint64_t Integer) {
Devang Patel161b2f42011-04-12 23:21:44 +0000114 if (!Form) Form = DIEInteger::BestForm(false, Integer);
115 DIEValue *Value = Integer == 1 ?
116 DIEIntegerOne : new (DIEValueAllocator) DIEInteger(Integer);
117 Die->addValue(Attribute, Form, Value);
118}
119
120/// addSInt - Add an signed integer attribute data and value.
121///
Eric Christopher31667622013-08-08 01:41:00 +0000122void CompileUnit::addSInt(DIE *Die, uint16_t Attribute,
123 uint16_t Form, int64_t Integer) {
Devang Patel161b2f42011-04-12 23:21:44 +0000124 if (!Form) Form = DIEInteger::BestForm(true, Integer);
125 DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
126 Die->addValue(Attribute, Form, Value);
127}
128
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000129/// addString - Add a string attribute data and value. We always emit a
130/// reference to the string pool instead of immediate strings so that DIEs have
Eric Christopher3cc42202013-01-07 19:32:45 +0000131/// more predictable sizes. In the case of split dwarf we emit an index
132/// into another table which gets us the static offset into the string
133/// table.
Eric Christopher31667622013-08-08 01:41:00 +0000134void CompileUnit::addString(DIE *Die, uint16_t Attribute, StringRef String) {
Eric Christopher3dee5752013-07-26 17:02:41 +0000135 DIEValue *Value;
Eric Christopher31667622013-08-08 01:41:00 +0000136 uint16_t Form;
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000137 if (!DD->useSplitDwarf()) {
138 MCSymbol *Symb = DU->getStringPoolEntry(String);
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000139 if (Asm->needsRelocationsForDwarfStringPool())
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000140 Value = new (DIEValueAllocator) DIELabel(Symb);
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000141 else {
142 MCSymbol *StringPool = DU->getStringPoolSym();
143 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
144 }
Eric Christopher3dee5752013-07-26 17:02:41 +0000145 Form = dwarf::DW_FORM_strp;
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000146 } else {
147 unsigned idx = DU->getStringPoolIndex(String);
Eric Christopher3dee5752013-07-26 17:02:41 +0000148 Value = new (DIEValueAllocator) DIEInteger(idx);
149 Form = dwarf::DW_FORM_GNU_str_index;
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000150 }
Eric Christopher3dee5752013-07-26 17:02:41 +0000151 DIEValue *Str = new (DIEValueAllocator) DIEString(Value, String);
152 Die->addValue(Attribute, Form, Str);
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000153}
154
155/// addLocalString - Add a string attribute data and value. This is guaranteed
156/// to be in the local string pool instead of indirected.
Eric Christopher31667622013-08-08 01:41:00 +0000157void CompileUnit::addLocalString(DIE *Die, uint16_t Attribute,
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000158 StringRef String) {
Eric Christopher2e5d8702012-12-20 21:58:36 +0000159 MCSymbol *Symb = DU->getStringPoolEntry(String);
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000160 DIEValue *Value;
161 if (Asm->needsRelocationsForDwarfStringPool())
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000162 Value = new (DIEValueAllocator) DIELabel(Symb);
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000163 else {
Eric Christopher2e5d8702012-12-20 21:58:36 +0000164 MCSymbol *StringPool = DU->getStringPoolSym();
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000165 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
Nick Lewycky390c40d2011-10-27 06:44:11 +0000166 }
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000167 Die->addValue(Attribute, dwarf::DW_FORM_strp, Value);
Devang Patel161b2f42011-04-12 23:21:44 +0000168}
169
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000170/// addExpr - Add a Dwarf expression attribute data and value.
Devang Patel161b2f42011-04-12 23:21:44 +0000171///
Eric Christopher31667622013-08-08 01:41:00 +0000172void CompileUnit::addExpr(DIE *Die, uint16_t Attribute, uint16_t Form,
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000173 const MCExpr *Expr) {
174 DIEValue *Value = new (DIEValueAllocator) DIEExpr(Expr);
Devang Patel161b2f42011-04-12 23:21:44 +0000175 Die->addValue(Attribute, Form, Value);
176}
177
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000178/// addLabel - Add a Dwarf label attribute data and value.
179///
Eric Christopher31667622013-08-08 01:41:00 +0000180void CompileUnit::addLabel(DIE *Die, uint16_t Attribute, uint16_t Form,
David Blaikie95e72c92013-06-28 20:05:04 +0000181 const MCSymbol *Label) {
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000182 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
183 Die->addValue(Attribute, Form, Value);
David Blaikie95e72c92013-06-28 20:05:04 +0000184}
185
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000186/// addLabelAddress - Add a dwarf label attribute data and value using
187/// DW_FORM_addr or DW_FORM_GNU_addr_index.
188///
Eric Christopher31667622013-08-08 01:41:00 +0000189void CompileUnit::addLabelAddress(DIE *Die, uint16_t Attribute,
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000190 MCSymbol *Label) {
191 if (!DD->useSplitDwarf()) {
192 if (Label != NULL) {
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000193 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000194 Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
195 } else {
196 DIEValue *Value = new (DIEValueAllocator) DIEInteger(0);
197 Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
198 }
199 } else {
200 unsigned idx = DU->getAddrPoolIndex(Label);
201 DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx);
202 Die->addValue(Attribute, dwarf::DW_FORM_GNU_addr_index, Value);
203 }
204}
205
Eric Christopher0969ddf2013-01-18 22:11:33 +0000206/// addOpAddress - Add a dwarf op address data and value using the
207/// form given and an op of either DW_FORM_addr or DW_FORM_GNU_addr_index.
208///
David Blaikie95e72c92013-06-28 20:05:04 +0000209void CompileUnit::addOpAddress(DIE *Die, const MCSymbol *Sym) {
Eric Christopher0969ddf2013-01-18 22:11:33 +0000210 if (!DD->useSplitDwarf()) {
211 addUInt(Die, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
212 addLabel(Die, 0, dwarf::DW_FORM_udata, Sym);
213 } else {
Eric Christopher0969ddf2013-01-18 22:11:33 +0000214 addUInt(Die, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_addr_index);
David Blaikie8fed05e2013-07-01 23:55:52 +0000215 addUInt(Die, 0, dwarf::DW_FORM_GNU_addr_index, DU->getAddrPoolIndex(Sym));
Eric Christopher0969ddf2013-01-18 22:11:33 +0000216 }
217}
218
Devang Patel161b2f42011-04-12 23:21:44 +0000219/// addDelta - Add a label delta attribute data and value.
220///
Eric Christopher31667622013-08-08 01:41:00 +0000221void CompileUnit::addDelta(DIE *Die, uint16_t Attribute, uint16_t Form,
Devang Patel161b2f42011-04-12 23:21:44 +0000222 const MCSymbol *Hi, const MCSymbol *Lo) {
223 DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
224 Die->addValue(Attribute, Form, Value);
225}
226
227/// addDIEEntry - Add a DIE attribute data and value.
228///
Eric Christopher31667622013-08-08 01:41:00 +0000229void CompileUnit::addDIEEntry(DIE *Die, uint16_t Attribute, uint16_t Form,
Devang Patel161b2f42011-04-12 23:21:44 +0000230 DIE *Entry) {
231 Die->addValue(Attribute, Form, createDIEEntry(Entry));
232}
233
Devang Patel161b2f42011-04-12 23:21:44 +0000234/// addBlock - Add block data.
235///
Eric Christopher31667622013-08-08 01:41:00 +0000236void CompileUnit::addBlock(DIE *Die, uint16_t Attribute, uint16_t Form,
Devang Patel161b2f42011-04-12 23:21:44 +0000237 DIEBlock *Block) {
238 Block->ComputeSize(Asm);
239 DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
240 Die->addValue(Attribute, Block->BestForm(), Block);
241}
242
243/// addSourceLine - Add location information to specified debug information
244/// entry.
245void CompileUnit::addSourceLine(DIE *Die, DIVariable V) {
246 // Verify variable.
Manman Rend03d2b22013-07-08 18:33:29 +0000247 if (!V.isVariable())
Devang Patel161b2f42011-04-12 23:21:44 +0000248 return;
Eric Christopher8b4310b2012-11-21 00:34:38 +0000249
Devang Patel161b2f42011-04-12 23:21:44 +0000250 unsigned Line = V.getLineNumber();
251 if (Line == 0)
252 return;
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000253 unsigned FileID = DD->getOrCreateSourceID(V.getContext().getFilename(),
Manman Ren3de61b42013-03-07 01:42:00 +0000254 V.getContext().getDirectory(),
255 getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000256 assert(FileID && "Invalid file id");
257 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
258 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
259}
260
261/// addSourceLine - Add location information to specified debug information
262/// entry.
263void CompileUnit::addSourceLine(DIE *Die, DIGlobalVariable G) {
264 // Verify global variable.
Manman Rend03d2b22013-07-08 18:33:29 +0000265 if (!G.isGlobalVariable())
Devang Patel161b2f42011-04-12 23:21:44 +0000266 return;
267
268 unsigned Line = G.getLineNumber();
269 if (Line == 0)
270 return;
Manman Ren3de61b42013-03-07 01:42:00 +0000271 unsigned FileID = DD->getOrCreateSourceID(G.getFilename(), G.getDirectory(),
272 getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000273 assert(FileID && "Invalid file id");
274 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
275 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
276}
277
278/// addSourceLine - Add location information to specified debug information
279/// entry.
280void CompileUnit::addSourceLine(DIE *Die, DISubprogram SP) {
281 // Verify subprogram.
Manman Rend03d2b22013-07-08 18:33:29 +0000282 if (!SP.isSubprogram())
Devang Patel161b2f42011-04-12 23:21:44 +0000283 return;
Eric Christopher2125d5a2012-03-15 23:55:40 +0000284
Devang Patel161b2f42011-04-12 23:21:44 +0000285 // If the line number is 0, don't add it.
Eric Christopher2125d5a2012-03-15 23:55:40 +0000286 unsigned Line = SP.getLineNumber();
287 if (Line == 0)
Devang Patel161b2f42011-04-12 23:21:44 +0000288 return;
289
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000290 unsigned FileID = DD->getOrCreateSourceID(SP.getFilename(),
Manman Ren3de61b42013-03-07 01:42:00 +0000291 SP.getDirectory(), getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000292 assert(FileID && "Invalid file id");
293 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
294 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
295}
296
297/// addSourceLine - Add location information to specified debug information
298/// entry.
299void CompileUnit::addSourceLine(DIE *Die, DIType Ty) {
300 // Verify type.
Manman Rend03d2b22013-07-08 18:33:29 +0000301 if (!Ty.isType())
Devang Patel161b2f42011-04-12 23:21:44 +0000302 return;
303
304 unsigned Line = Ty.getLineNumber();
Eric Christopher2125d5a2012-03-15 23:55:40 +0000305 if (Line == 0)
Devang Patel161b2f42011-04-12 23:21:44 +0000306 return;
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000307 unsigned FileID = DD->getOrCreateSourceID(Ty.getFilename(),
Manman Ren3de61b42013-03-07 01:42:00 +0000308 Ty.getDirectory(), getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000309 assert(FileID && "Invalid file id");
310 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
311 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
312}
313
314/// addSourceLine - Add location information to specified debug information
315/// entry.
Eric Christopherb8ca9882012-03-29 08:42:56 +0000316void CompileUnit::addSourceLine(DIE *Die, DIObjCProperty Ty) {
317 // Verify type.
Manman Rend03d2b22013-07-08 18:33:29 +0000318 if (!Ty.isObjCProperty())
Eric Christopherb8ca9882012-03-29 08:42:56 +0000319 return;
320
321 unsigned Line = Ty.getLineNumber();
322 if (Line == 0)
323 return;
324 DIFile File = Ty.getFile();
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000325 unsigned FileID = DD->getOrCreateSourceID(File.getFilename(),
Manman Ren3de61b42013-03-07 01:42:00 +0000326 File.getDirectory(), getUniqueID());
Eric Christopherb8ca9882012-03-29 08:42:56 +0000327 assert(FileID && "Invalid file id");
328 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
329 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
330}
331
332/// addSourceLine - Add location information to specified debug information
333/// entry.
Devang Patel161b2f42011-04-12 23:21:44 +0000334void CompileUnit::addSourceLine(DIE *Die, DINameSpace NS) {
335 // Verify namespace.
336 if (!NS.Verify())
337 return;
338
339 unsigned Line = NS.getLineNumber();
340 if (Line == 0)
341 return;
342 StringRef FN = NS.getFilename();
343
Manman Ren3de61b42013-03-07 01:42:00 +0000344 unsigned FileID = DD->getOrCreateSourceID(FN, NS.getDirectory(),
345 getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000346 assert(FileID && "Invalid file id");
347 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
348 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
349}
350
Eric Christopher8b4310b2012-11-21 00:34:38 +0000351/// addVariableAddress - Add DW_AT_location attribute for a
Devang Patele1cdf842011-04-27 22:45:24 +0000352/// DbgVariable based on provided MachineLocation.
Eric Christopherf61dbc12013-06-24 21:07:27 +0000353void CompileUnit::addVariableAddress(const DbgVariable &DV, DIE *Die,
Devang Patele1cdf842011-04-27 22:45:24 +0000354 MachineLocation Location) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000355 if (DV.variableHasComplexAddress())
Devang Patel161b2f42011-04-12 23:21:44 +0000356 addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
Eric Christopherf61dbc12013-06-24 21:07:27 +0000357 else if (DV.isBlockByrefVariable())
Devang Patel161b2f42011-04-12 23:21:44 +0000358 addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location);
359 else
David Blaikie4532c282013-06-20 00:25:24 +0000360 addAddress(Die, dwarf::DW_AT_location, Location,
Eric Christopherf61dbc12013-06-24 21:07:27 +0000361 DV.getVariable().isIndirect());
Devang Patel161b2f42011-04-12 23:21:44 +0000362}
363
Devang Patel116da2f2011-04-26 19:06:18 +0000364/// addRegisterOp - Add register operand.
365void CompileUnit::addRegisterOp(DIE *TheDie, unsigned Reg) {
366 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
367 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
368 if (DWReg < 32)
369 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + DWReg);
370 else {
371 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
372 addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
373 }
374}
375
376/// addRegisterOffset - Add register offset.
377void CompileUnit::addRegisterOffset(DIE *TheDie, unsigned Reg,
378 int64_t Offset) {
379 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
380 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
381 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
382 if (Reg == TRI->getFrameRegister(*Asm->MF))
383 // If variable offset is based in frame register then use fbreg.
384 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
385 else if (DWReg < 32)
386 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DWReg);
387 else {
388 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
389 addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
390 }
391 addSInt(TheDie, 0, dwarf::DW_FORM_sdata, Offset);
392}
393
394/// addAddress - Add an address attribute to a die based on the location
395/// provided.
Eric Christopher31667622013-08-08 01:41:00 +0000396void CompileUnit::addAddress(DIE *Die, uint16_t Attribute,
David Blaikie4532c282013-06-20 00:25:24 +0000397 const MachineLocation &Location, bool Indirect) {
Devang Patel116da2f2011-04-26 19:06:18 +0000398 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
399
David Blaikie4532c282013-06-20 00:25:24 +0000400 if (Location.isReg() && !Indirect)
Devang Patel116da2f2011-04-26 19:06:18 +0000401 addRegisterOp(Block, Location.getReg());
David Blaikie4532c282013-06-20 00:25:24 +0000402 else {
Devang Patel116da2f2011-04-26 19:06:18 +0000403 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
David Blaikie4532c282013-06-20 00:25:24 +0000404 if (Indirect && !Location.isReg()) {
405 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
406 }
407 }
Devang Patel116da2f2011-04-26 19:06:18 +0000408
409 // Now attach the location information to the DIE.
410 addBlock(Die, Attribute, 0, Block);
411}
412
Devang Patel161b2f42011-04-12 23:21:44 +0000413/// addComplexAddress - Start with the address based on the location provided,
414/// and generate the DWARF information necessary to find the actual variable
415/// given the extra address information encoded in the DIVariable, starting from
416/// the starting location. Add the DWARF information to the die.
417///
Eric Christopherf61dbc12013-06-24 21:07:27 +0000418void CompileUnit::addComplexAddress(const DbgVariable &DV, DIE *Die,
Eric Christopher31667622013-08-08 01:41:00 +0000419 uint16_t Attribute,
Devang Patel161b2f42011-04-12 23:21:44 +0000420 const MachineLocation &Location) {
Devang Patel161b2f42011-04-12 23:21:44 +0000421 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Eric Christopherf61dbc12013-06-24 21:07:27 +0000422 unsigned N = DV.getNumAddrElements();
Devang Patelc26f5442011-04-28 02:22:40 +0000423 unsigned i = 0;
424 if (Location.isReg()) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000425 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
Devang Patelc26f5442011-04-28 02:22:40 +0000426 // If first address element is OpPlus then emit
427 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
Eric Christopherf61dbc12013-06-24 21:07:27 +0000428 addRegisterOffset(Block, Location.getReg(), DV.getAddrElement(1));
Devang Patelc26f5442011-04-28 02:22:40 +0000429 i = 2;
430 } else
431 addRegisterOp(Block, Location.getReg());
432 }
Devang Patel116da2f2011-04-26 19:06:18 +0000433 else
434 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel161b2f42011-04-12 23:21:44 +0000435
Devang Patelc26f5442011-04-28 02:22:40 +0000436 for (;i < N; ++i) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000437 uint64_t Element = DV.getAddrElement(i);
Devang Patel161b2f42011-04-12 23:21:44 +0000438 if (Element == DIBuilder::OpPlus) {
439 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
Eric Christopherf61dbc12013-06-24 21:07:27 +0000440 addUInt(Block, 0, dwarf::DW_FORM_udata, DV.getAddrElement(++i));
Devang Patel161b2f42011-04-12 23:21:44 +0000441 } else if (Element == DIBuilder::OpDeref) {
Eric Christopher50120762012-05-08 18:56:00 +0000442 if (!Location.isReg())
443 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Devang Patel161b2f42011-04-12 23:21:44 +0000444 } else llvm_unreachable("unknown DIBuilder Opcode");
445 }
446
447 // Now attach the location information to the DIE.
448 addBlock(Die, Attribute, 0, Block);
449}
450
451/* Byref variables, in Blocks, are declared by the programmer as "SomeType
452 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
453 gives the variable VarName either the struct, or a pointer to the struct, as
454 its type. This is necessary for various behind-the-scenes things the
455 compiler needs to do with by-reference variables in Blocks.
456
457 However, as far as the original *programmer* is concerned, the variable
458 should still have type 'SomeType', as originally declared.
459
460 The function getBlockByrefType dives into the __Block_byref_x_VarName
461 struct to find the original type of the variable, which is then assigned to
462 the variable's Debug Information Entry as its real type. So far, so good.
463 However now the debugger will expect the variable VarName to have the type
464 SomeType. So we need the location attribute for the variable to be an
465 expression that explains to the debugger how to navigate through the
466 pointers and struct to find the actual variable of type SomeType.
467
468 The following function does just that. We start by getting
469 the "normal" location for the variable. This will be the location
470 of either the struct __Block_byref_x_VarName or the pointer to the
471 struct __Block_byref_x_VarName.
472
473 The struct will look something like:
474
475 struct __Block_byref_x_VarName {
476 ... <various fields>
477 struct __Block_byref_x_VarName *forwarding;
478 ... <various other fields>
479 SomeType VarName;
480 ... <maybe more fields>
481 };
482
483 If we are given the struct directly (as our starting point) we
484 need to tell the debugger to:
485
486 1). Add the offset of the forwarding field.
487
488 2). Follow that pointer to get the real __Block_byref_x_VarName
489 struct to use (the real one may have been copied onto the heap).
490
491 3). Add the offset for the field VarName, to find the actual variable.
492
493 If we started with a pointer to the struct, then we need to
494 dereference that pointer first, before the other steps.
495 Translating this into DWARF ops, we will need to append the following
496 to the current location description for the variable:
497
498 DW_OP_deref -- optional, if we start with a pointer
499 DW_OP_plus_uconst <forward_fld_offset>
500 DW_OP_deref
501 DW_OP_plus_uconst <varName_fld_offset>
502
503 That is what this function does. */
504
505/// addBlockByrefAddress - Start with the address based on the location
506/// provided, and generate the DWARF information necessary to find the
507/// actual Block variable (navigating the Block struct) based on the
508/// starting location. Add the DWARF information to the die. For
509/// more information, read large comment just above here.
510///
Eric Christopherf61dbc12013-06-24 21:07:27 +0000511void CompileUnit::addBlockByrefAddress(const DbgVariable &DV, DIE *Die,
Eric Christopher31667622013-08-08 01:41:00 +0000512 uint16_t Attribute,
Devang Patel161b2f42011-04-12 23:21:44 +0000513 const MachineLocation &Location) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000514 DIType Ty = DV.getType();
Devang Patel161b2f42011-04-12 23:21:44 +0000515 DIType TmpTy = Ty;
Eric Christopher31667622013-08-08 01:41:00 +0000516 uint16_t Tag = Ty.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +0000517 bool isPointer = false;
518
Eric Christopherf61dbc12013-06-24 21:07:27 +0000519 StringRef varName = DV.getName();
Devang Patel161b2f42011-04-12 23:21:44 +0000520
521 if (Tag == dwarf::DW_TAG_pointer_type) {
522 DIDerivedType DTy = DIDerivedType(Ty);
523 TmpTy = DTy.getTypeDerivedFrom();
524 isPointer = true;
525 }
526
527 DICompositeType blockStruct = DICompositeType(TmpTy);
528
529 // Find the __forwarding field and the variable field in the __Block_byref
530 // struct.
531 DIArray Fields = blockStruct.getTypeArray();
532 DIDescriptor varField = DIDescriptor();
533 DIDescriptor forwardingField = DIDescriptor();
534
535 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
536 DIDescriptor Element = Fields.getElement(i);
537 DIDerivedType DT = DIDerivedType(Element);
538 StringRef fieldName = DT.getName();
539 if (fieldName == "__forwarding")
540 forwardingField = Element;
541 else if (fieldName == varName)
542 varField = Element;
543 }
544
545 // Get the offsets for the forwarding field and the variable field.
546 unsigned forwardingFieldOffset =
547 DIDerivedType(forwardingField).getOffsetInBits() >> 3;
548 unsigned varFieldOffset =
549 DIDerivedType(varField).getOffsetInBits() >> 3;
550
551 // Decode the original location, and use that as the start of the byref
552 // variable's location.
Devang Patel161b2f42011-04-12 23:21:44 +0000553 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
554
Eric Christophercaba2632012-07-04 02:02:18 +0000555 if (Location.isReg())
556 addRegisterOp(Block, Location.getReg());
557 else
558 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel161b2f42011-04-12 23:21:44 +0000559
560 // If we started with a pointer to the __Block_byref... struct, then
561 // the first thing we need to do is dereference the pointer (DW_OP_deref).
562 if (isPointer)
563 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
564
565 // Next add the offset for the '__forwarding' field:
566 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
567 // adding the offset if it's 0.
568 if (forwardingFieldOffset > 0) {
569 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
570 addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
571 }
572
573 // Now dereference the __forwarding field to get to the real __Block_byref
574 // struct: DW_OP_deref.
575 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
576
577 // Now that we've got the real __Block_byref... struct, add the offset
578 // for the variable's field to get to the location of the actual variable:
579 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
580 if (varFieldOffset > 0) {
581 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
582 addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
583 }
584
585 // Now attach the location information to the DIE.
586 addBlock(Die, Attribute, 0, Block);
587}
588
Devang Patel4ec14b02011-07-20 21:57:04 +0000589/// isTypeSigned - Return true if the type is signed.
590static bool isTypeSigned(DIType Ty, int *SizeInBits) {
591 if (Ty.isDerivedType())
592 return isTypeSigned(DIDerivedType(Ty).getTypeDerivedFrom(), SizeInBits);
593 if (Ty.isBasicType())
594 if (DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed
595 || DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed_char) {
596 *SizeInBits = Ty.getSizeInBits();
597 return true;
598 }
599 return false;
600}
601
Devang Patel161b2f42011-04-12 23:21:44 +0000602/// addConstantValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000603void CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO,
Devang Patelb58128e2011-05-27 16:45:18 +0000604 DIType Ty) {
David Blaikie4de9d722013-05-10 21:52:07 +0000605 // FIXME: This is a bit conservative/simple - it emits negative values at
606 // their maximum bit width which is a bit unfortunate (& doesn't prefer
607 // udata/sdata over dataN as suggested by the DWARF spec)
Nick Lewycky746cb672011-10-26 22:55:33 +0000608 assert(MO.isImm() && "Invalid machine operand!");
Devang Patel4ec14b02011-07-20 21:57:04 +0000609 int SizeInBits = -1;
610 bool SignedConstant = isTypeSigned(Ty, &SizeInBits);
Eric Christopher7b2ee392013-08-27 23:49:04 +0000611 uint16_t Form;
Devang Patel72f0d9c2011-05-27 18:15:52 +0000612
Eric Christopher7b2ee392013-08-27 23:49:04 +0000613 // If we're a signed constant definitely use sdata.
614 if (SignedConstant) {
615 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, MO.getImm());
616 return;
617 }
618
619 // Else use data for now unless it's larger than we can deal with.
620 switch (SizeInBits) {
621 case 8:
622 Form = dwarf::DW_FORM_data1;
623 break;
624 case 16:
625 Form = dwarf::DW_FORM_data2;
626 break;
627 case 32:
628 Form = dwarf::DW_FORM_data4;
629 break;
630 case 64:
631 Form = dwarf::DW_FORM_data8;
632 break;
633 default:
634 Form = dwarf::DW_FORM_udata;
635 addUInt(Die, dwarf::DW_AT_const_value, Form, MO.getImm());
636 return;
637 }
638 addUInt(Die, dwarf::DW_AT_const_value, Form, MO.getImm());
Devang Patel161b2f42011-04-12 23:21:44 +0000639}
640
641/// addConstantFPValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000642void CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
Nick Lewycky390c40d2011-10-27 06:44:11 +0000643 assert (MO.isFPImm() && "Invalid machine operand!");
Devang Patel161b2f42011-04-12 23:21:44 +0000644 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
645 APFloat FPImm = MO.getFPImm()->getValueAPF();
646
647 // Get the raw data form of the floating point.
648 const APInt FltVal = FPImm.bitcastToAPInt();
649 const char *FltPtr = (const char*)FltVal.getRawData();
650
651 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
Micah Villmow3574eca2012-10-08 16:38:25 +0000652 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel161b2f42011-04-12 23:21:44 +0000653 int Incr = (LittleEndian ? 1 : -1);
654 int Start = (LittleEndian ? 0 : NumBytes - 1);
655 int Stop = (LittleEndian ? NumBytes : -1);
656
657 // Output the constant to DWARF one byte at a time.
658 for (; Start != Stop; Start += Incr)
659 addUInt(Block, 0, dwarf::DW_FORM_data1,
660 (unsigned char)0xFF & FltPtr[Start]);
661
662 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
Devang Patel161b2f42011-04-12 23:21:44 +0000663}
664
David Blaikie14268412013-01-20 01:18:01 +0000665/// addConstantFPValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000666void CompileUnit::addConstantFPValue(DIE *Die, const ConstantFP *CFP) {
Eric Christopher7b2ee392013-08-27 23:49:04 +0000667 // Pass this down to addConstantValue as an unsigned bag of bits.
668 addConstantValue(Die, CFP->getValueAPF().bitcastToAPInt(), true);
David Blaikie14268412013-01-20 01:18:01 +0000669}
670
Devang Patel161b2f42011-04-12 23:21:44 +0000671/// addConstantValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000672void CompileUnit::addConstantValue(DIE *Die, const ConstantInt *CI,
Devang Patel161b2f42011-04-12 23:21:44 +0000673 bool Unsigned) {
Eric Christophere4721492013-07-03 01:08:30 +0000674 addConstantValue(Die, CI->getValue(), Unsigned);
David Blaikie14268412013-01-20 01:18:01 +0000675}
676
677// addConstantValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000678void CompileUnit::addConstantValue(DIE *Die, const APInt &Val, bool Unsigned) {
David Blaikie14268412013-01-20 01:18:01 +0000679 unsigned CIBitWidth = Val.getBitWidth();
Devang Pateld6a81362011-05-28 00:39:18 +0000680 if (CIBitWidth <= 64) {
Eric Christopher7b2ee392013-08-27 23:49:04 +0000681 // If we're a signed constant definitely use sdata.
682 if (!Unsigned) {
683 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata,
684 Val.getSExtValue());
685 return;
Devang Pateld6a81362011-05-28 00:39:18 +0000686 }
Eric Christopher7b2ee392013-08-27 23:49:04 +0000687
688 // Else use data for now unless it's larger than we can deal with.
689 uint16_t Form;
690 switch (CIBitWidth) {
691 case 8:
692 Form = dwarf::DW_FORM_data1;
693 break;
694 case 16:
695 Form = dwarf::DW_FORM_data2;
696 break;
697 case 32:
698 Form = dwarf::DW_FORM_data4;
699 break;
700 case 64:
701 Form = dwarf::DW_FORM_data8;
702 break;
703 default:
704 addUInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
705 Val.getZExtValue());
706 return;
707 }
708 addUInt(Die, dwarf::DW_AT_const_value, Form, Val.getZExtValue());
Eric Christophere4721492013-07-03 01:08:30 +0000709 return;
Devang Patel161b2f42011-04-12 23:21:44 +0000710 }
711
712 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
713
714 // Get the raw data form of the large APInt.
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000715 const uint64_t *Ptr64 = Val.getRawData();
Devang Patel161b2f42011-04-12 23:21:44 +0000716
717 int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
Micah Villmow3574eca2012-10-08 16:38:25 +0000718 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel161b2f42011-04-12 23:21:44 +0000719
720 // Output the constant to DWARF one byte at a time.
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000721 for (int i = 0; i < NumBytes; i++) {
722 uint8_t c;
723 if (LittleEndian)
724 c = Ptr64[i / 8] >> (8 * (i & 7));
725 else
726 c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7));
727 addUInt(Block, 0, dwarf::DW_FORM_data1, c);
728 }
Devang Patel161b2f42011-04-12 23:21:44 +0000729
730 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
Devang Patel161b2f42011-04-12 23:21:44 +0000731}
732
Eric Christopher6c3bb942013-04-22 07:47:40 +0000733/// addTemplateParams - Add template parameters into buffer.
Devang Patel161b2f42011-04-12 23:21:44 +0000734void CompileUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
735 // Add template parameters.
736 for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) {
737 DIDescriptor Element = TParams.getElement(i);
738 if (Element.isTemplateTypeParameter())
739 Buffer.addChild(getOrCreateTemplateTypeParameterDIE(
740 DITemplateTypeParameter(Element)));
741 else if (Element.isTemplateValueParameter())
742 Buffer.addChild(getOrCreateTemplateValueParameterDIE(
743 DITemplateValueParameter(Element)));
744 }
Devang Patel161b2f42011-04-12 23:21:44 +0000745}
Nick Lewycky746cb672011-10-26 22:55:33 +0000746
Eric Christopher6b6061f2013-01-16 01:22:23 +0000747/// getOrCreateContextDIE - Get context owner's DIE.
748DIE *CompileUnit::getOrCreateContextDIE(DIDescriptor Context) {
749 if (Context.isType())
750 return getOrCreateTypeDIE(DIType(Context));
751 else if (Context.isNameSpace())
752 return getOrCreateNameSpace(DINameSpace(Context));
753 else if (Context.isSubprogram())
754 return getOrCreateSubprogramDIE(DISubprogram(Context));
Eric Christopher6c3bb942013-04-22 07:47:40 +0000755 else
Eric Christopher6b6061f2013-01-16 01:22:23 +0000756 return getDIE(Context);
757}
758
Devang Patel161b2f42011-04-12 23:21:44 +0000759/// addToContextOwner - Add Die into the list of its context owner's children.
760void CompileUnit::addToContextOwner(DIE *Die, DIDescriptor Context) {
Eric Christopher6b6061f2013-01-16 01:22:23 +0000761 if (DIE *ContextDIE = getOrCreateContextDIE(Context))
Devang Patel161b2f42011-04-12 23:21:44 +0000762 ContextDIE->addChild(Die);
763 else
764 addDie(Die);
765}
766
767/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
768/// given DIType.
Devang Patel94c7ddb2011-08-16 22:09:43 +0000769DIE *CompileUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
770 DIType Ty(TyNode);
Manman Rend03d2b22013-07-08 18:33:29 +0000771 if (!Ty.isType())
Devang Patel94c7ddb2011-08-16 22:09:43 +0000772 return NULL;
Devang Patel161b2f42011-04-12 23:21:44 +0000773 DIE *TyDIE = getDIE(Ty);
774 if (TyDIE)
775 return TyDIE;
776
777 // Create new type.
778 TyDIE = new DIE(dwarf::DW_TAG_base_type);
779 insertDIE(Ty, TyDIE);
780 if (Ty.isBasicType())
781 constructTypeDIE(*TyDIE, DIBasicType(Ty));
782 else if (Ty.isCompositeType())
783 constructTypeDIE(*TyDIE, DICompositeType(Ty));
784 else {
785 assert(Ty.isDerivedType() && "Unknown kind of DIType");
786 constructTypeDIE(*TyDIE, DIDerivedType(Ty));
787 }
Eric Christopher1b3f9192011-11-10 19:52:58 +0000788 // If this is a named finished type then include it in the list of types
789 // for the accelerator tables.
Eric Christopherc36145f2012-01-06 04:35:23 +0000790 if (!Ty.getName().empty() && !Ty.isForwardDecl()) {
791 bool IsImplementation = 0;
792 if (Ty.isCompositeType()) {
793 DICompositeType CT(Ty);
Eric Christophere0167892012-01-06 23:03:37 +0000794 // A runtime language of 0 actually means C/C++ and that any
795 // non-negative value is some version of Objective-C/C++.
Eric Christopherc36145f2012-01-06 04:35:23 +0000796 IsImplementation = (CT.getRunTimeLang() == 0) ||
Eric Christophere2dc9332012-02-22 08:46:02 +0000797 CT.isObjcClassComplete();
Eric Christopherc36145f2012-01-06 04:35:23 +0000798 }
Eric Christophere0167892012-01-06 23:03:37 +0000799 unsigned Flags = IsImplementation ?
800 DwarfAccelTable::eTypeFlagClassIsImplementation : 0;
801 addAccelType(Ty.getName(), std::make_pair(TyDIE, Flags));
Eric Christopherc36145f2012-01-06 04:35:23 +0000802 }
Eric Christopher8b4310b2012-11-21 00:34:38 +0000803
Devang Patel161b2f42011-04-12 23:21:44 +0000804 addToContextOwner(TyDIE, Ty.getContext());
805 return TyDIE;
806}
807
808/// addType - Add a new type attribute to the specified entity.
Eric Christopher31667622013-08-08 01:41:00 +0000809void CompileUnit::addType(DIE *Entity, DIType Ty, uint16_t Attribute) {
Eric Christopherdc1363f2013-08-08 07:40:37 +0000810 assert(Ty && "Trying to add a type that doesn't exist?");
Devang Patel161b2f42011-04-12 23:21:44 +0000811
812 // Check for pre-existence.
813 DIEEntry *Entry = getDIEEntry(Ty);
814 // If it exists then use the existing value.
815 if (Entry) {
Eric Christopher663e0cf2012-03-28 07:34:31 +0000816 Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
Devang Patel161b2f42011-04-12 23:21:44 +0000817 return;
818 }
819
820 // Construct type.
821 DIE *Buffer = getOrCreateTypeDIE(Ty);
822
823 // Set up proxy.
824 Entry = createDIEEntry(Buffer);
825 insertDIEEntry(Ty, Entry);
Eric Christopher663e0cf2012-03-28 07:34:31 +0000826 Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
Devang Patele9ae06c2011-05-31 22:56:51 +0000827
828 // If this is a complete composite type then include it in the
829 // list of global types.
Devang Patelc20bdf12011-06-01 00:23:24 +0000830 addGlobalType(Ty);
Devang Patel66658e42011-05-31 23:30:30 +0000831}
832
833/// addGlobalType - Add a new global type to the compile unit.
834///
Devang Patelc20bdf12011-06-01 00:23:24 +0000835void CompileUnit::addGlobalType(DIType Ty) {
Devang Patele9ae06c2011-05-31 22:56:51 +0000836 DIDescriptor Context = Ty.getContext();
Eric Christopher8b4310b2012-11-21 00:34:38 +0000837 if (Ty.isCompositeType() && !Ty.getName().empty() && !Ty.isForwardDecl()
838 && (!Context || Context.isCompileUnit() || Context.isFile()
Devang Patel94c7ddb2011-08-16 22:09:43 +0000839 || Context.isNameSpace()))
Devang Patelc20bdf12011-06-01 00:23:24 +0000840 if (DIEEntry *Entry = getDIEEntry(Ty))
841 GlobalTypes[Ty.getName()] = Entry->getEntry();
Devang Patel161b2f42011-04-12 23:21:44 +0000842}
843
Devang Patel31c5d052011-05-06 16:57:54 +0000844/// addPubTypes - Add type for pubtypes section.
845void CompileUnit::addPubTypes(DISubprogram SP) {
846 DICompositeType SPTy = SP.getType();
Eric Christopher31667622013-08-08 01:41:00 +0000847 uint16_t SPTag = SPTy.getTag();
Devang Patel31c5d052011-05-06 16:57:54 +0000848 if (SPTag != dwarf::DW_TAG_subroutine_type)
849 return;
850
851 DIArray Args = SPTy.getTypeArray();
852 for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
853 DIType ATy(Args.getElement(i));
Manman Rend03d2b22013-07-08 18:33:29 +0000854 if (!ATy.isType())
Devang Patel31c5d052011-05-06 16:57:54 +0000855 continue;
Devang Patelc20bdf12011-06-01 00:23:24 +0000856 addGlobalType(ATy);
Devang Patel31c5d052011-05-06 16:57:54 +0000857 }
858}
859
Devang Patel161b2f42011-04-12 23:21:44 +0000860/// constructTypeDIE - Construct basic type die from DIBasicType.
861void CompileUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
862 // Get core information.
863 StringRef Name = BTy.getName();
Devang Patel161b2f42011-04-12 23:21:44 +0000864 // Add name if not anonymous or intermediate type.
865 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000866 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel734a67c2011-09-14 23:13:28 +0000867
868 if (BTy.getTag() == dwarf::DW_TAG_unspecified_type) {
869 Buffer.setTag(dwarf::DW_TAG_unspecified_type);
Eric Christopher61c91d52013-07-09 23:48:45 +0000870 // An unspecified type only has a name attribute.
Devang Patel734a67c2011-09-14 23:13:28 +0000871 return;
872 }
873
874 Buffer.setTag(dwarf::DW_TAG_base_type);
Nick Lewycky746cb672011-10-26 22:55:33 +0000875 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
Devang Patel30d409c2012-02-07 23:33:58 +0000876 BTy.getEncoding());
Devang Patel734a67c2011-09-14 23:13:28 +0000877
Devang Patel161b2f42011-04-12 23:21:44 +0000878 uint64_t Size = BTy.getSizeInBits() >> 3;
879 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
880}
881
882/// constructTypeDIE - Construct derived type die from DIDerivedType.
883void CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
884 // Get core information.
885 StringRef Name = DTy.getName();
886 uint64_t Size = DTy.getSizeInBits() >> 3;
Eric Christopher31667622013-08-08 01:41:00 +0000887 uint16_t Tag = DTy.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +0000888
889 // FIXME - Workaround for templates.
890 if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
891
892 Buffer.setTag(Tag);
893
894 // Map to main type, void will not have a type.
895 DIType FromTy = DTy.getTypeDerivedFrom();
Eric Christopherdc1363f2013-08-08 07:40:37 +0000896 if (FromTy)
897 addType(&Buffer, FromTy);
Devang Patel161b2f42011-04-12 23:21:44 +0000898
899 // Add name if not anonymous or intermediate type.
900 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000901 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +0000902
903 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopher35f225a2012-02-21 22:25:53 +0000904 if (Size && Tag != dwarf::DW_TAG_pointer_type)
Devang Patel161b2f42011-04-12 23:21:44 +0000905 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
906
David Blaikie62fdfb52013-01-07 05:51:15 +0000907 if (Tag == dwarf::DW_TAG_ptr_to_member_type)
908 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
909 getOrCreateTypeDIE(DTy.getClassType()));
Devang Patel161b2f42011-04-12 23:21:44 +0000910 // Add source line info if available and TyDesc is not a forward declaration.
911 if (!DTy.isForwardDecl())
912 addSourceLine(&Buffer, DTy);
913}
914
Eric Christopher3dee5752013-07-26 17:02:41 +0000915/// Return true if the type is appropriately scoped to be contained inside
916/// its own type unit.
917static bool isTypeUnitScoped(DIType Ty) {
918 DIScope Parent = Ty.getContext();
919 while (Parent) {
920 // Don't generate a hash for anything scoped inside a function.
921 if (Parent.isSubprogram())
922 return false;
923 Parent = Parent.getContext();
924 }
925 return true;
926}
927
928/// Return true if the type should be split out into a type unit.
929static bool shouldCreateTypeUnit(DICompositeType CTy) {
Eric Christopher31667622013-08-08 01:41:00 +0000930 uint16_t Tag = CTy.getTag();
Eric Christopher3dee5752013-07-26 17:02:41 +0000931
932 switch (Tag) {
933 case dwarf::DW_TAG_structure_type:
934 case dwarf::DW_TAG_union_type:
935 case dwarf::DW_TAG_enumeration_type:
936 case dwarf::DW_TAG_class_type:
937 // If this is a class, structure, union, or enumeration type
938 // that is not a declaration, is a type definition, and not scoped
939 // inside a function then separate this out as a type unit.
940 if (CTy.isForwardDecl() || !isTypeUnitScoped(CTy))
941 return 0;
942 return 1;
943 default:
944 return 0;
945 }
946}
947
Devang Patel161b2f42011-04-12 23:21:44 +0000948/// constructTypeDIE - Construct type DIE from DICompositeType.
949void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
950 // Get core information.
951 StringRef Name = CTy.getName();
952
953 uint64_t Size = CTy.getSizeInBits() >> 3;
Eric Christopher31667622013-08-08 01:41:00 +0000954 uint16_t Tag = CTy.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +0000955 Buffer.setTag(Tag);
956
957 switch (Tag) {
Devang Patel161b2f42011-04-12 23:21:44 +0000958 case dwarf::DW_TAG_array_type:
959 constructArrayTypeDIE(Buffer, &CTy);
960 break;
961 case dwarf::DW_TAG_enumeration_type: {
962 DIArray Elements = CTy.getTypeArray();
963
964 // Add enumerators to enumeration type.
965 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
966 DIE *ElemDie = NULL;
967 DIDescriptor Enum(Elements.getElement(i));
968 if (Enum.isEnumerator()) {
969 ElemDie = constructEnumTypeDIE(DIEnumerator(Enum));
970 Buffer.addChild(ElemDie);
971 }
972 }
Eric Christopherbb0f6ea2012-05-23 00:09:20 +0000973 DIType DTy = CTy.getTypeDerivedFrom();
Eric Christopher37c107b2013-08-08 07:40:42 +0000974 if (DTy) {
Eric Christopherbb0f6ea2012-05-23 00:09:20 +0000975 addType(&Buffer, DTy);
976 addUInt(&Buffer, dwarf::DW_AT_enum_class, dwarf::DW_FORM_flag, 1);
977 }
Devang Patel161b2f42011-04-12 23:21:44 +0000978 }
979 break;
980 case dwarf::DW_TAG_subroutine_type: {
Eric Christopherdc1363f2013-08-08 07:40:37 +0000981 // Add return type. A void return won't have a type.
Devang Patel161b2f42011-04-12 23:21:44 +0000982 DIArray Elements = CTy.getTypeArray();
983 DIDescriptor RTy = Elements.getElement(0);
Eric Christopherdc1363f2013-08-08 07:40:37 +0000984 if (RTy)
985 addType(&Buffer, DIType(RTy));
Devang Patel161b2f42011-04-12 23:21:44 +0000986
987 bool isPrototyped = true;
988 // Add arguments.
989 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
990 DIDescriptor Ty = Elements.getElement(i);
991 if (Ty.isUnspecifiedParameter()) {
992 DIE *Arg = new DIE(dwarf::DW_TAG_unspecified_parameters);
993 Buffer.addChild(Arg);
994 isPrototyped = false;
995 } else {
996 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
997 addType(Arg, DIType(Ty));
David Blaikieaaf2e632013-01-29 19:35:24 +0000998 if (DIType(Ty).isArtificial())
999 addFlag(Arg, dwarf::DW_AT_artificial);
Devang Patel161b2f42011-04-12 23:21:44 +00001000 Buffer.addChild(Arg);
1001 }
1002 }
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001003 // Add prototype flag if we're dealing with a C language and the
1004 // function has been prototyped.
Eric Christopher7b878952013-08-26 23:50:38 +00001005 uint16_t Language = DICompileUnit(Node).getLanguage();
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001006 if (isPrototyped &&
Eric Christopher4d069bf2012-05-22 18:45:24 +00001007 (Language == dwarf::DW_LANG_C89 ||
1008 Language == dwarf::DW_LANG_C99 ||
1009 Language == dwarf::DW_LANG_ObjC))
Eric Christopher873cf0a2012-08-24 01:14:27 +00001010 addFlag(&Buffer, dwarf::DW_AT_prototyped);
Devang Patel161b2f42011-04-12 23:21:44 +00001011 }
1012 break;
1013 case dwarf::DW_TAG_structure_type:
1014 case dwarf::DW_TAG_union_type:
1015 case dwarf::DW_TAG_class_type: {
Devang Patel161b2f42011-04-12 23:21:44 +00001016 // Add elements to structure type.
David Blaikiec8b93552013-08-01 20:30:22 +00001017 DIArray Elements = CTy.getTypeArray();
1018 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
Devang Patel161b2f42011-04-12 23:21:44 +00001019 DIDescriptor Element = Elements.getElement(i);
1020 DIE *ElemDie = NULL;
1021 if (Element.isSubprogram()) {
1022 DISubprogram SP(Element);
Devang Pateldbc64af2011-08-15 17:24:54 +00001023 ElemDie = getOrCreateSubprogramDIE(DISubprogram(Element));
Devang Patel161b2f42011-04-12 23:21:44 +00001024 if (SP.isProtected())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001025 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001026 dwarf::DW_ACCESS_protected);
1027 else if (SP.isPrivate())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001028 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001029 dwarf::DW_ACCESS_private);
Eric Christopher8b4310b2012-11-21 00:34:38 +00001030 else
Nick Lewycky13aaca52011-12-13 05:09:11 +00001031 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001032 dwarf::DW_ACCESS_public);
1033 if (SP.isExplicit())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001034 addFlag(ElemDie, dwarf::DW_AT_explicit);
Eric Christopher663e0cf2012-03-28 07:34:31 +00001035 } else if (Element.isDerivedType()) {
Eric Christopher4d069bf2012-05-22 18:45:24 +00001036 DIDerivedType DDTy(Element);
1037 if (DDTy.getTag() == dwarf::DW_TAG_friend) {
1038 ElemDie = new DIE(dwarf::DW_TAG_friend);
1039 addType(ElemDie, DDTy.getTypeDerivedFrom(), dwarf::DW_AT_friend);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001040 } else if (DDTy.isStaticMember())
1041 ElemDie = createStaticMemberDIE(DDTy);
1042 else
1043 ElemDie = createMemberDIE(DDTy);
Eric Christopher663e0cf2012-03-28 07:34:31 +00001044 } else if (Element.isObjCProperty()) {
Devang Patel30d409c2012-02-07 23:33:58 +00001045 DIObjCProperty Property(Element);
1046 ElemDie = new DIE(Property.getTag());
1047 StringRef PropertyName = Property.getObjCPropertyName();
1048 addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
Eric Christopher4d069bf2012-05-22 18:45:24 +00001049 addType(ElemDie, Property.getType());
1050 addSourceLine(ElemDie, Property);
Devang Patel30d409c2012-02-07 23:33:58 +00001051 StringRef GetterName = Property.getObjCPropertyGetterName();
1052 if (!GetterName.empty())
1053 addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
1054 StringRef SetterName = Property.getObjCPropertySetterName();
1055 if (!SetterName.empty())
1056 addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
1057 unsigned PropertyAttributes = 0;
Devang Patel9e11eb12012-02-04 01:30:32 +00001058 if (Property.isReadOnlyObjCProperty())
1059 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
1060 if (Property.isReadWriteObjCProperty())
1061 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
1062 if (Property.isAssignObjCProperty())
1063 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
1064 if (Property.isRetainObjCProperty())
1065 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
1066 if (Property.isCopyObjCProperty())
1067 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
1068 if (Property.isNonAtomicObjCProperty())
1069 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
1070 if (PropertyAttributes)
Eric Christopher8b4310b2012-11-21 00:34:38 +00001071 addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, 0,
Devang Patel9e11eb12012-02-04 01:30:32 +00001072 PropertyAttributes);
Devang Patel6588abf2012-02-06 17:49:43 +00001073
Devang Patel30d409c2012-02-07 23:33:58 +00001074 DIEEntry *Entry = getDIEEntry(Element);
1075 if (!Entry) {
1076 Entry = createDIEEntry(ElemDie);
1077 insertDIEEntry(Element, Entry);
1078 }
Devang Patel9e11eb12012-02-04 01:30:32 +00001079 } else
Devang Patel161b2f42011-04-12 23:21:44 +00001080 continue;
1081 Buffer.addChild(ElemDie);
1082 }
1083
1084 if (CTy.isAppleBlockExtension())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001085 addFlag(&Buffer, dwarf::DW_AT_APPLE_block);
Devang Patel161b2f42011-04-12 23:21:44 +00001086
Devang Patel161b2f42011-04-12 23:21:44 +00001087 DICompositeType ContainingType = CTy.getContainingType();
1088 if (DIDescriptor(ContainingType).isCompositeType())
1089 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
1090 getOrCreateTypeDIE(DIType(ContainingType)));
Eric Christopher010dbfd2013-07-14 21:46:51 +00001091 else
1092 addToContextOwner(&Buffer, CTy.getContext());
Devang Patel161b2f42011-04-12 23:21:44 +00001093
Devang Patel201e6cd2011-05-12 21:29:42 +00001094 if (CTy.isObjcClassComplete())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001095 addFlag(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type);
Devang Patelb11f80e2011-05-12 19:06:16 +00001096
Eric Christopher1a8e8862011-12-16 23:42:42 +00001097 // Add template parameters to a class, structure or union types.
1098 // FIXME: The support isn't in the metadata for this yet.
1099 if (Tag == dwarf::DW_TAG_class_type ||
1100 Tag == dwarf::DW_TAG_structure_type ||
1101 Tag == dwarf::DW_TAG_union_type)
Devang Patel161b2f42011-04-12 23:21:44 +00001102 addTemplateParams(Buffer, CTy.getTemplateParams());
1103
1104 break;
1105 }
1106 default:
1107 break;
1108 }
1109
1110 // Add name if not anonymous or intermediate type.
1111 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001112 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001113
Eric Christopher4a5d8392012-05-22 18:45:18 +00001114 if (Tag == dwarf::DW_TAG_enumeration_type ||
1115 Tag == dwarf::DW_TAG_class_type ||
1116 Tag == dwarf::DW_TAG_structure_type ||
1117 Tag == dwarf::DW_TAG_union_type) {
Devang Patel161b2f42011-04-12 23:21:44 +00001118 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopherfc4199b2012-06-01 00:22:32 +00001119 // TODO: Do we care about size for enum forward declarations?
Devang Patel161b2f42011-04-12 23:21:44 +00001120 if (Size)
1121 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
Eric Christopherfc4199b2012-06-01 00:22:32 +00001122 else if (!CTy.isForwardDecl())
Devang Patel161b2f42011-04-12 23:21:44 +00001123 // Add zero size if it is not a forward declaration.
Eric Christopherfc4199b2012-06-01 00:22:32 +00001124 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
1125
1126 // If we're a forward decl, say so.
1127 if (CTy.isForwardDecl())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001128 addFlag(&Buffer, dwarf::DW_AT_declaration);
Devang Patel161b2f42011-04-12 23:21:44 +00001129
1130 // Add source line info if available.
1131 if (!CTy.isForwardDecl())
1132 addSourceLine(&Buffer, CTy);
Eric Christopher89388952012-03-07 00:15:19 +00001133
1134 // No harm in adding the runtime language to the declaration.
1135 unsigned RLang = CTy.getRunTimeLang();
1136 if (RLang)
1137 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
1138 dwarf::DW_FORM_data1, RLang);
Devang Patel161b2f42011-04-12 23:21:44 +00001139 }
Eric Christopher3dee5752013-07-26 17:02:41 +00001140 // If this is a type applicable to a type unit it then add it to the
1141 // list of types we'll compute a hash for later.
1142 if (shouldCreateTypeUnit(CTy))
1143 DD->addTypeUnitType(&Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +00001144}
1145
Eric Christopher8b4310b2012-11-21 00:34:38 +00001146/// getOrCreateTemplateTypeParameterDIE - Find existing DIE or create new DIE
Devang Patel161b2f42011-04-12 23:21:44 +00001147/// for the given DITemplateTypeParameter.
1148DIE *
1149CompileUnit::getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP) {
1150 DIE *ParamDIE = getDIE(TP);
1151 if (ParamDIE)
1152 return ParamDIE;
1153
1154 ParamDIE = new DIE(dwarf::DW_TAG_template_type_parameter);
Eric Christopher76ef79f2013-08-08 08:09:43 +00001155 // Add the type if it exists, it could be void and therefore no type.
1156 if (TP.getType())
1157 addType(ParamDIE, TP.getType());
David Blaikiee88939c2013-06-22 18:59:11 +00001158 if (!TP.getName().empty())
1159 addString(ParamDIE, dwarf::DW_AT_name, TP.getName());
Devang Patel161b2f42011-04-12 23:21:44 +00001160 return ParamDIE;
1161}
1162
Eric Christopher8b4310b2012-11-21 00:34:38 +00001163/// getOrCreateTemplateValueParameterDIE - Find existing DIE or create new DIE
Devang Patel161b2f42011-04-12 23:21:44 +00001164/// for the given DITemplateValueParameter.
1165DIE *
Eric Christopherafdd1f82013-08-08 07:40:31 +00001166CompileUnit::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter VP) {
1167 DIE *ParamDIE = getDIE(VP);
Devang Patel161b2f42011-04-12 23:21:44 +00001168 if (ParamDIE)
1169 return ParamDIE;
1170
Eric Christopherafdd1f82013-08-08 07:40:31 +00001171 ParamDIE = new DIE(VP.getTag());
Eric Christopherdc1363f2013-08-08 07:40:37 +00001172
1173 // Add the type if there is one, template template and template parameter
1174 // packs will not have a type.
1175 if (VP.getType())
1176 addType(ParamDIE, VP.getType());
Eric Christopherafdd1f82013-08-08 07:40:31 +00001177 if (!VP.getName().empty())
1178 addString(ParamDIE, dwarf::DW_AT_name, VP.getName());
1179 if (Value *Val = VP.getValue()) {
David Blaikie4de9d722013-05-10 21:52:07 +00001180 if (ConstantInt *CI = dyn_cast<ConstantInt>(Val))
Eric Christopherafdd1f82013-08-08 07:40:31 +00001181 addConstantValue(ParamDIE, CI, VP.getType().isUnsignedDIType());
David Blaikie4de9d722013-05-10 21:52:07 +00001182 else if (GlobalValue *GV = dyn_cast<GlobalValue>(Val)) {
1183 // For declaration non-type template parameters (such as global values and
1184 // functions)
1185 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1186 addOpAddress(Block, Asm->Mang->getSymbol(GV));
1187 // Emit DW_OP_stack_value to use the address as the immediate value of the
1188 // parameter, rather than a pointer to it.
1189 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value);
1190 addBlock(ParamDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopherafdd1f82013-08-08 07:40:31 +00001191 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_template_param) {
David Blaikiee88939c2013-06-22 18:59:11 +00001192 assert(isa<MDString>(Val));
1193 addString(ParamDIE, dwarf::DW_AT_GNU_template_name,
1194 cast<MDString>(Val)->getString());
Eric Christopherafdd1f82013-08-08 07:40:31 +00001195 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_parameter_pack) {
David Blaikiee88939c2013-06-22 18:59:11 +00001196 assert(isa<MDNode>(Val));
1197 DIArray A(cast<MDNode>(Val));
1198 addTemplateParams(*ParamDIE, A);
David Blaikie4de9d722013-05-10 21:52:07 +00001199 }
1200 }
1201
Devang Patel161b2f42011-04-12 23:21:44 +00001202 return ParamDIE;
1203}
1204
Devang Patel31c5d052011-05-06 16:57:54 +00001205/// getOrCreateNameSpace - Create a DIE for DINameSpace.
1206DIE *CompileUnit::getOrCreateNameSpace(DINameSpace NS) {
1207 DIE *NDie = getDIE(NS);
1208 if (NDie)
1209 return NDie;
1210 NDie = new DIE(dwarf::DW_TAG_namespace);
1211 insertDIE(NS, NDie);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001212 if (!NS.getName().empty()) {
Nick Lewycky390c40d2011-10-27 06:44:11 +00001213 addString(NDie, dwarf::DW_AT_name, NS.getName());
Eric Christopher09ac3d82011-11-07 09:24:32 +00001214 addAccelNamespace(NS.getName(), NDie);
1215 } else
1216 addAccelNamespace("(anonymous namespace)", NDie);
Devang Patel31c5d052011-05-06 16:57:54 +00001217 addSourceLine(NDie, NS);
1218 addToContextOwner(NDie, NS.getContext());
1219 return NDie;
1220}
1221
Devang Pateldbc64af2011-08-15 17:24:54 +00001222/// getOrCreateSubprogramDIE - Create new DIE using SP.
1223DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
1224 DIE *SPDie = getDIE(SP);
1225 if (SPDie)
1226 return SPDie;
1227
Peter Collingbourne27302f02012-05-27 18:36:44 +00001228 SPDie = new DIE(dwarf::DW_TAG_subprogram);
1229
1230 // DW_TAG_inlined_subroutine may refer to this DIE.
1231 insertDIE(SP, SPDie);
1232
Rafael Espindola01b55b42011-11-10 22:34:29 +00001233 DISubprogram SPDecl = SP.getFunctionDeclaration();
1234 DIE *DeclDie = NULL;
1235 if (SPDecl.isSubprogram()) {
1236 DeclDie = getOrCreateSubprogramDIE(SPDecl);
1237 }
1238
Devang Pateldbc64af2011-08-15 17:24:54 +00001239 // Add to context owner.
1240 addToContextOwner(SPDie, SP.getContext());
1241
1242 // Add function template parameters.
1243 addTemplateParams(*SPDie, SP.getTemplateParams());
1244
Eric Christopherc4968752013-05-09 00:42:33 +00001245 // Unfortunately this code needs to stay here instead of below the
1246 // AT_specification code in order to work around a bug in older
1247 // gdbs that requires the linkage name to resolve multiple template
1248 // functions.
1249 // TODO: Remove this set of code when we get rid of the old gdb
1250 // compatibility.
Eric Christopher8d101c32012-03-15 08:19:33 +00001251 StringRef LinkageName = SP.getLinkageName();
Eric Christopherc4968752013-05-09 00:42:33 +00001252 if (!LinkageName.empty() && DD->useDarwinGDBCompat())
1253 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c2b4be2013-06-01 17:51:14 +00001254 GlobalValue::getRealLinkageName(LinkageName));
Eric Christopher8d101c32012-03-15 08:19:33 +00001255
Devang Pateldbc64af2011-08-15 17:24:54 +00001256 // If this DIE is going to refer declaration info using AT_specification
Eric Christopherc4968752013-05-09 00:42:33 +00001257 // then there is no need to add other attributes.
Rafael Espindola01b55b42011-11-10 22:34:29 +00001258 if (DeclDie) {
1259 // Refer function declaration directly.
1260 addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
1261 DeclDie);
1262
Devang Pateldbc64af2011-08-15 17:24:54 +00001263 return SPDie;
Rafael Espindola01b55b42011-11-10 22:34:29 +00001264 }
Devang Pateldbc64af2011-08-15 17:24:54 +00001265
Eric Christophercbbd5b12012-08-23 22:52:55 +00001266 // Add the linkage name if we have one.
Eric Christopherc4968752013-05-09 00:42:33 +00001267 if (!LinkageName.empty() && !DD->useDarwinGDBCompat())
Eric Christophercbbd5b12012-08-23 22:52:55 +00001268 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c2b4be2013-06-01 17:51:14 +00001269 GlobalValue::getRealLinkageName(LinkageName));
Eric Christophercbbd5b12012-08-23 22:52:55 +00001270
Devang Pateldbc64af2011-08-15 17:24:54 +00001271 // Constructors and operators for anonymous aggregates do not have names.
1272 if (!SP.getName().empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001273 addString(SPDie, dwarf::DW_AT_name, SP.getName());
Devang Pateldbc64af2011-08-15 17:24:54 +00001274
1275 addSourceLine(SPDie, SP);
1276
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001277 // Add the prototype if we have a prototype and we have a C like
1278 // language.
Eric Christopher7b878952013-08-26 23:50:38 +00001279 uint16_t Language = DICompileUnit(Node).getLanguage();
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001280 if (SP.isPrototyped() &&
1281 (Language == dwarf::DW_LANG_C89 ||
1282 Language == dwarf::DW_LANG_C99 ||
1283 Language == dwarf::DW_LANG_ObjC))
Eric Christopher873cf0a2012-08-24 01:14:27 +00001284 addFlag(SPDie, dwarf::DW_AT_prototyped);
Devang Pateldbc64af2011-08-15 17:24:54 +00001285
Eric Christopherdc1363f2013-08-08 07:40:37 +00001286 // Add Return Type. A void return type will not have a type.
Devang Pateldbc64af2011-08-15 17:24:54 +00001287 DICompositeType SPTy = SP.getType();
David Blaikie3d331842013-05-22 23:22:18 +00001288 assert(SPTy.getTag() == dwarf::DW_TAG_subroutine_type &&
1289 "the type of a subprogram should be a subroutine");
Devang Pateldbc64af2011-08-15 17:24:54 +00001290
David Blaikie3d331842013-05-22 23:22:18 +00001291 DIArray Args = SPTy.getTypeArray();
Eric Christopherdc1363f2013-08-08 07:40:37 +00001292 if (Args.getElement(0))
1293 addType(SPDie, DIType(Args.getElement(0)));
Devang Pateldbc64af2011-08-15 17:24:54 +00001294
1295 unsigned VK = SP.getVirtuality();
1296 if (VK) {
Nick Lewycky798313d2011-12-14 00:56:07 +00001297 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
Devang Pateldbc64af2011-08-15 17:24:54 +00001298 DIEBlock *Block = getDIEBlock();
1299 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1300 addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex());
1301 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
1302 ContainingTypeMap.insert(std::make_pair(SPDie,
1303 SP.getContainingType()));
1304 }
1305
1306 if (!SP.isDefinition()) {
Eric Christopher873cf0a2012-08-24 01:14:27 +00001307 addFlag(SPDie, dwarf::DW_AT_declaration);
Eric Christopher8b4310b2012-11-21 00:34:38 +00001308
Devang Pateldbc64af2011-08-15 17:24:54 +00001309 // Add arguments. Do not add arguments for subprogram definition. They will
1310 // be handled while processing variables.
David Blaikie3d331842013-05-22 23:22:18 +00001311 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1312 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1313 DIType ATy = DIType(Args.getElement(i));
1314 addType(Arg, ATy);
1315 if (ATy.isArtificial())
1316 addFlag(Arg, dwarf::DW_AT_artificial);
1317 SPDie->addChild(Arg);
1318 }
Devang Pateldbc64af2011-08-15 17:24:54 +00001319 }
1320
1321 if (SP.isArtificial())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001322 addFlag(SPDie, dwarf::DW_AT_artificial);
Devang Pateldbc64af2011-08-15 17:24:54 +00001323
1324 if (!SP.isLocalToUnit())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001325 addFlag(SPDie, dwarf::DW_AT_external);
Devang Pateldbc64af2011-08-15 17:24:54 +00001326
1327 if (SP.isOptimized())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001328 addFlag(SPDie, dwarf::DW_AT_APPLE_optimized);
Devang Pateldbc64af2011-08-15 17:24:54 +00001329
1330 if (unsigned isa = Asm->getISAEncoding()) {
1331 addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1332 }
1333
1334 return SPDie;
1335}
1336
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001337// Return const expression if value is a GEP to access merged global
1338// constant. e.g.
1339// i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
1340static const ConstantExpr *getMergedGlobalExpr(const Value *V) {
1341 const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
1342 if (!CE || CE->getNumOperands() != 3 ||
1343 CE->getOpcode() != Instruction::GetElementPtr)
1344 return NULL;
1345
1346 // First operand points to a global struct.
1347 Value *Ptr = CE->getOperand(0);
1348 if (!isa<GlobalValue>(Ptr) ||
1349 !isa<StructType>(cast<PointerType>(Ptr->getType())->getElementType()))
1350 return NULL;
1351
1352 // Second operand is zero.
1353 const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
1354 if (!CI || !CI->isZero())
1355 return NULL;
1356
1357 // Third operand is offset.
1358 if (!isa<ConstantInt>(CE->getOperand(2)))
1359 return NULL;
1360
1361 return CE;
1362}
1363
1364/// createGlobalVariableDIE - create global variable DIE.
1365void CompileUnit::createGlobalVariableDIE(const MDNode *N) {
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001366 // Check for pre-existence.
Devang Patel49e2f032011-08-18 22:21:50 +00001367 if (getDIE(N))
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001368 return;
1369
Devang Patel49e2f032011-08-18 22:21:50 +00001370 DIGlobalVariable GV(N);
Manman Rend03d2b22013-07-08 18:33:29 +00001371 if (!GV.isGlobalVariable())
Devang Patel28bea082011-08-18 23:17:55 +00001372 return;
1373
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001374 DIDescriptor GVContext = GV.getContext();
Eric Christopher6b6061f2013-01-16 01:22:23 +00001375 DIType GTy = GV.getType();
1376
1377 // If this is a static data member definition, some attributes belong
1378 // to the declaration DIE.
1379 DIE *VariableDIE = NULL;
Manman Ren945e8282013-02-01 23:54:37 +00001380 bool IsStaticMember = false;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001381 DIDerivedType SDMDecl = GV.getStaticDataMemberDeclaration();
1382 if (SDMDecl.Verify()) {
1383 assert(SDMDecl.isStaticMember() && "Expected static member decl");
1384 // We need the declaration DIE that is in the static member's class.
1385 // But that class might not exist in the DWARF yet.
1386 // Creating the class will create the static member decl DIE.
1387 getOrCreateContextDIE(SDMDecl.getContext());
1388 VariableDIE = getDIE(SDMDecl);
1389 assert(VariableDIE && "Static member decl has no context?");
Manman Ren945e8282013-02-01 23:54:37 +00001390 IsStaticMember = true;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001391 }
1392
1393 // If this is not a static data member definition, create the variable
1394 // DIE and add the initial set of attributes to it.
1395 if (!VariableDIE) {
1396 VariableDIE = new DIE(GV.getTag());
1397 // Add to map.
1398 insertDIE(N, VariableDIE);
1399
1400 // Add name and type.
1401 addString(VariableDIE, dwarf::DW_AT_name, GV.getDisplayName());
1402 addType(VariableDIE, GTy);
1403
1404 // Add scoping info.
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00001405 if (!GV.isLocalToUnit()) {
Eric Christopher6b6061f2013-01-16 01:22:23 +00001406 addFlag(VariableDIE, dwarf::DW_AT_external);
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00001407 addGlobalName(GV.getName(), VariableDIE);
1408 }
Eric Christopher6b6061f2013-01-16 01:22:23 +00001409
1410 // Add line number info.
1411 addSourceLine(VariableDIE, GV);
1412 // Add to context owner.
1413 addToContextOwner(VariableDIE, GVContext);
1414 }
1415
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001416 // Add location.
Eric Christopher09ac3d82011-11-07 09:24:32 +00001417 bool addToAccelTable = false;
Eric Christopherd61c34b2011-11-11 03:16:32 +00001418 DIE *VariableSpecDIE = NULL;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001419 bool isGlobalVariable = GV.getGlobal() != NULL;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001420 if (isGlobalVariable) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001421 addToAccelTable = true;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001422 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
David Blaikie59eaa382013-06-28 20:05:11 +00001423 const MCSymbol *Sym = Asm->Mang->getSymbol(GV.getGlobal());
1424 if (GV.getGlobal()->isThreadLocal()) {
1425 // FIXME: Make this work with -gsplit-dwarf.
1426 unsigned PointerSize = Asm->getDataLayout().getPointerSize();
1427 assert((PointerSize == 4 || PointerSize == 8) &&
1428 "Add support for other sizes if necessary");
Ulrich Weigand716a94f2013-07-02 18:47:09 +00001429 const MCExpr *Expr =
David Blaikie8fed05e2013-07-01 23:55:52 +00001430 Asm->getObjFileLowering().getDebugThreadLocalSymbol(Sym);
David Blaikie59eaa382013-06-28 20:05:11 +00001431 // Based on GCC's support for TLS:
David Blaikie8fed05e2013-07-01 23:55:52 +00001432 if (!DD->useSplitDwarf()) {
1433 // 1) Start with a constNu of the appropriate pointer size
1434 addUInt(Block, 0, dwarf::DW_FORM_data1,
1435 PointerSize == 4 ? dwarf::DW_OP_const4u : dwarf::DW_OP_const8u);
1436 // 2) containing the (relocated) address of the TLS variable
Ulrich Weigand716a94f2013-07-02 18:47:09 +00001437 addExpr(Block, 0, dwarf::DW_FORM_udata, Expr);
David Blaikie8fed05e2013-07-01 23:55:52 +00001438 } else {
1439 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_const_index);
Ulrich Weigand716a94f2013-07-02 18:47:09 +00001440 addUInt(Block, 0, dwarf::DW_FORM_udata, DU->getAddrPoolIndex(Expr));
David Blaikie8fed05e2013-07-01 23:55:52 +00001441 }
David Blaikie59eaa382013-06-28 20:05:11 +00001442 // 3) followed by a custom OP to tell the debugger about TLS (presumably)
1443 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_lo_user);
1444 } else
1445 addOpAddress(Block, Sym);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001446 // Do not create specification DIE if context is either compile unit
1447 // or a subprogram.
Devang Patel1dd4e562011-09-21 23:41:11 +00001448 if (GVContext && GV.isDefinition() && !GVContext.isCompileUnit() &&
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001449 !GVContext.isFile() && !isSubprogramContext(GVContext)) {
1450 // Create specification DIE.
Eric Christopherd117fbb2011-11-11 01:55:22 +00001451 VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001452 addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
1453 dwarf::DW_FORM_ref4, VariableDIE);
1454 addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001455 // A static member's declaration is already flagged as such.
1456 if (!SDMDecl.Verify())
1457 addFlag(VariableDIE, dwarf::DW_AT_declaration);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001458 addDie(VariableSpecDIE);
1459 } else {
1460 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001461 }
Eric Christopher6b6061f2013-01-16 01:22:23 +00001462 // Add linkage name.
1463 StringRef LinkageName = GV.getLinkageName();
Eric Christophera8ada252013-02-27 23:49:50 +00001464 if (!LinkageName.empty()) {
Eric Christopher8d45a982013-02-27 23:49:47 +00001465 // From DWARF4: DIEs to which DW_AT_linkage_name may apply include:
1466 // TAG_common_block, TAG_constant, TAG_entry_point, TAG_subprogram and
1467 // TAG_variable.
Manman Ren21a08a12013-02-27 23:21:02 +00001468 addString(IsStaticMember && VariableSpecDIE ?
1469 VariableSpecDIE : VariableDIE, dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c2b4be2013-06-01 17:51:14 +00001470 GlobalValue::getRealLinkageName(LinkageName));
Eric Christopher8d45a982013-02-27 23:49:47 +00001471 // In compatibility mode with older gdbs we put the linkage name on both
1472 // the TAG_variable DIE and on the TAG_member DIE.
Manman Ren21a08a12013-02-27 23:21:02 +00001473 if (IsStaticMember && VariableSpecDIE && DD->useDarwinGDBCompat())
1474 addString(VariableDIE, dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c2b4be2013-06-01 17:51:14 +00001475 GlobalValue::getRealLinkageName(LinkageName));
Manman Ren06df83c2013-02-27 00:02:32 +00001476 }
Eric Christopher8b4310b2012-11-21 00:34:38 +00001477 } else if (const ConstantInt *CI =
Manman Ren945e8282013-02-01 23:54:37 +00001478 dyn_cast_or_null<ConstantInt>(GV.getConstant())) {
Adrian Prantl2e892e42013-04-04 22:56:49 +00001479 // AT_const_value was added when the static member was created. To avoid
Manman Ren945e8282013-02-01 23:54:37 +00001480 // emitting AT_const_value multiple times, we only add AT_const_value when
1481 // it is not a static member.
1482 if (!IsStaticMember)
1483 addConstantValue(VariableDIE, CI, GTy.isUnsignedDIType());
1484 } else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001485 addToAccelTable = true;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001486 // GV is a merged global.
1487 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1488 Value *Ptr = CE->getOperand(0);
Eric Christopher0969ddf2013-01-18 22:11:33 +00001489 addOpAddress(Block, Asm->Mang->getSymbol(cast<GlobalValue>(Ptr)));
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001490 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1491 SmallVector<Value*, 3> Idx(CE->op_begin()+1, CE->op_end());
Eric Christopher8b4310b2012-11-21 00:34:38 +00001492 addUInt(Block, 0, dwarf::DW_FORM_udata,
Micah Villmow3574eca2012-10-08 16:38:25 +00001493 Asm->getDataLayout().getIndexedOffset(Ptr->getType(), Idx));
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001494 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1495 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
1496 }
1497
Eric Christopherd117fbb2011-11-11 01:55:22 +00001498 if (addToAccelTable) {
1499 DIE *AddrDIE = VariableSpecDIE ? VariableSpecDIE : VariableDIE;
1500 addAccelName(GV.getName(), AddrDIE);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001501
Eric Christopherd117fbb2011-11-11 01:55:22 +00001502 // If the linkage name is different than the name, go ahead and output
1503 // that as well into the name table.
1504 if (GV.getLinkageName() != "" && GV.getName() != GV.getLinkageName())
1505 addAccelName(GV.getLinkageName(), AddrDIE);
1506 }
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001507}
1508
Devang Patel161b2f42011-04-12 23:21:44 +00001509/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
Eric Christopher4d069bf2012-05-22 18:45:24 +00001510void CompileUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR,
1511 DIE *IndexTy) {
Devang Patel161b2f42011-04-12 23:21:44 +00001512 DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
1513 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
Devang Patel161b2f42011-04-12 23:21:44 +00001514
Bill Wendling222c2fd2012-12-06 07:38:10 +00001515 // The LowerBound value defines the lower bounds which is typically zero for
1516 // C/C++. The Count value is the number of elements. Values are 64 bit. If
1517 // Count == -1 then the array is unbounded and we do not emit
1518 // DW_AT_lower_bound and DW_AT_upper_bound attributes. If LowerBound == 0 and
1519 // Count == 0, then the array has zero elements in which case we do not emit
1520 // an upper bound.
1521 int64_t LowerBound = SR.getLo();
Bill Wendling6afe4782012-12-06 07:55:19 +00001522 int64_t DefaultLowerBound = getDefaultLowerBound();
Bill Wendling9493dae2012-12-04 21:34:03 +00001523 int64_t Count = SR.getCount();
Devang Patel161b2f42011-04-12 23:21:44 +00001524
Bill Wendling6afe4782012-12-06 07:55:19 +00001525 if (DefaultLowerBound == -1 || LowerBound != DefaultLowerBound)
Bill Wendling222c2fd2012-12-06 07:38:10 +00001526 addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, LowerBound);
1527
1528 if (Count != -1 && Count != 0)
Bill Wendling9493dae2012-12-04 21:34:03 +00001529 // FIXME: An unbounded array should reference the expression that defines
1530 // the array.
Bill Wendling222c2fd2012-12-06 07:38:10 +00001531 addUInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, LowerBound + Count - 1);
Bill Wendling9493dae2012-12-04 21:34:03 +00001532
Devang Patel161b2f42011-04-12 23:21:44 +00001533 Buffer.addChild(DW_Subrange);
1534}
1535
1536/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
1537void CompileUnit::constructArrayTypeDIE(DIE &Buffer,
1538 DICompositeType *CTy) {
1539 Buffer.setTag(dwarf::DW_TAG_array_type);
Eric Christopher9a1e0e22013-01-08 01:53:52 +00001540 if (CTy->isVector())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001541 addFlag(&Buffer, dwarf::DW_AT_GNU_vector);
Devang Patel161b2f42011-04-12 23:21:44 +00001542
Eric Christopherdc1363f2013-08-08 07:40:37 +00001543 // Emit the element type.
Devang Patel161b2f42011-04-12 23:21:44 +00001544 addType(&Buffer, CTy->getTypeDerivedFrom());
Devang Patel161b2f42011-04-12 23:21:44 +00001545
1546 // Get an anonymous type for index type.
Eric Christopher8cab6ed2013-01-04 21:51:53 +00001547 // FIXME: This type should be passed down from the front end
1548 // as different languages may have different sizes for indexes.
Devang Patel161b2f42011-04-12 23:21:44 +00001549 DIE *IdxTy = getIndexTyDie();
1550 if (!IdxTy) {
1551 // Construct an anonymous type for index type.
1552 IdxTy = new DIE(dwarf::DW_TAG_base_type);
Eric Christopher8cab6ed2013-01-04 21:51:53 +00001553 addString(IdxTy, dwarf::DW_AT_name, "int");
Devang Patel161b2f42011-04-12 23:21:44 +00001554 addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1555 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1556 dwarf::DW_ATE_signed);
1557 addDie(IdxTy);
1558 setIndexTyDie(IdxTy);
1559 }
1560
1561 // Add subranges to array type.
Eric Christopherdc1363f2013-08-08 07:40:37 +00001562 DIArray Elements = CTy->getTypeArray();
Devang Patel161b2f42011-04-12 23:21:44 +00001563 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1564 DIDescriptor Element = Elements.getElement(i);
1565 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1566 constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1567 }
1568}
1569
1570/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
1571DIE *CompileUnit::constructEnumTypeDIE(DIEnumerator ETy) {
1572 DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
1573 StringRef Name = ETy.getName();
Nick Lewycky390c40d2011-10-27 06:44:11 +00001574 addString(Enumerator, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001575 int64_t Value = ETy.getEnumValue();
1576 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
1577 return Enumerator;
1578}
1579
Devang Pateldbc64af2011-08-15 17:24:54 +00001580/// constructContainingTypeDIEs - Construct DIEs for types that contain
1581/// vtables.
1582void CompileUnit::constructContainingTypeDIEs() {
1583 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
1584 CE = ContainingTypeMap.end(); CI != CE; ++CI) {
1585 DIE *SPDie = CI->first;
1586 const MDNode *N = CI->second;
1587 if (!N) continue;
1588 DIE *NDie = getDIE(N);
1589 if (!NDie) continue;
1590 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
1591 }
1592}
1593
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001594/// constructVariableDIE - Construct a DIE for the given DbgVariable.
Eric Christopherf61dbc12013-06-24 21:07:27 +00001595DIE *CompileUnit::constructVariableDIE(DbgVariable *DV,
1596 bool isScopeAbstract) {
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001597 StringRef Name = DV->getName();
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001598
1599 // Translate tag to proper Dwarf tag.
Eric Christopher31667622013-08-08 01:41:00 +00001600 uint16_t Tag = DV->getTag();
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001601
1602 // Define variable debug information entry.
1603 DIE *VariableDie = new DIE(Tag);
1604 DbgVariable *AbsVar = DV->getAbstractVariable();
1605 DIE *AbsDIE = AbsVar ? AbsVar->getDIE() : NULL;
Manman Ren742671b2013-05-29 17:16:59 +00001606 if (AbsDIE)
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001607 addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
Manman Ren742671b2013-05-29 17:16:59 +00001608 dwarf::DW_FORM_ref4, AbsDIE);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001609 else {
David Blaikie2883fd42013-08-19 03:34:03 +00001610 if (!Name.empty())
1611 addString(VariableDie, dwarf::DW_AT_name, Name);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001612 addSourceLine(VariableDie, DV->getVariable());
1613 addType(VariableDie, DV->getType());
1614 }
1615
1616 if (DV->isArtificial())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001617 addFlag(VariableDie, dwarf::DW_AT_artificial);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001618
1619 if (isScopeAbstract) {
1620 DV->setDIE(VariableDie);
1621 return VariableDie;
1622 }
1623
1624 // Add variable address.
1625
1626 unsigned Offset = DV->getDotDebugLocOffset();
1627 if (Offset != ~0U) {
Eric Christopherafbe0e22013-06-24 21:34:55 +00001628 addLabel(VariableDie, dwarf::DW_AT_location, dwarf::DW_FORM_data4,
1629 Asm->GetTempSymbol("debug_loc", Offset));
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001630 DV->setDIE(VariableDie);
1631 return VariableDie;
1632 }
1633
Eric Christopher8cf5e742011-10-03 15:49:20 +00001634 // Check if variable is described by a DBG_VALUE instruction.
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001635 if (const MachineInstr *DVInsn = DV->getMInsn()) {
David Blaikie6d9dbd52013-06-16 20:34:15 +00001636 assert(DVInsn->getNumOperands() == 3);
1637 if (DVInsn->getOperand(0).isReg()) {
1638 const MachineOperand RegOp = DVInsn->getOperand(0);
Adrian Prantlb2754912013-07-09 21:44:06 +00001639 // If the second operand is an immediate, this is an indirect value.
Adrian Prantl35176402013-07-09 20:28:37 +00001640 if (DVInsn->getOperand(1).isImm()) {
1641 MachineLocation Location(RegOp.getReg(), DVInsn->getOperand(1).getImm());
Eric Christopherf61dbc12013-06-24 21:07:27 +00001642 addVariableAddress(*DV, VariableDie, Location);
David Blaikie6d9dbd52013-06-16 20:34:15 +00001643 } else if (RegOp.getReg())
Eric Christopherf61dbc12013-06-24 21:07:27 +00001644 addVariableAddress(*DV, VariableDie, MachineLocation(RegOp.getReg()));
David Blaikie6d9dbd52013-06-16 20:34:15 +00001645 } else if (DVInsn->getOperand(0).isImm())
Eric Christophere4721492013-07-03 01:08:30 +00001646 addConstantValue(VariableDie, DVInsn->getOperand(0), DV->getType());
David Blaikie6d9dbd52013-06-16 20:34:15 +00001647 else if (DVInsn->getOperand(0).isFPImm())
Eric Christophere4721492013-07-03 01:08:30 +00001648 addConstantFPValue(VariableDie, DVInsn->getOperand(0));
David Blaikie6d9dbd52013-06-16 20:34:15 +00001649 else if (DVInsn->getOperand(0).isCImm())
Eric Christophere4721492013-07-03 01:08:30 +00001650 addConstantValue(VariableDie, DVInsn->getOperand(0).getCImm(),
1651 DV->getType().isUnsignedDIType());
1652
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001653 DV->setDIE(VariableDie);
1654 return VariableDie;
1655 } else {
1656 // .. else use frame index.
1657 int FI = DV->getFrameIndex();
1658 if (FI != ~0) {
1659 unsigned FrameReg = 0;
1660 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
Eric Christopher8b4310b2012-11-21 00:34:38 +00001661 int Offset =
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001662 TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
1663 MachineLocation Location(FrameReg, Offset);
Eric Christopherf61dbc12013-06-24 21:07:27 +00001664 addVariableAddress(*DV, VariableDie, Location);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001665 }
1666 }
1667
1668 DV->setDIE(VariableDie);
1669 return VariableDie;
1670}
1671
Devang Patel161b2f42011-04-12 23:21:44 +00001672/// createMemberDIE - Create new member DIE.
1673DIE *CompileUnit::createMemberDIE(DIDerivedType DT) {
1674 DIE *MemberDie = new DIE(DT.getTag());
1675 StringRef Name = DT.getName();
1676 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001677 addString(MemberDie, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001678
1679 addType(MemberDie, DT.getTypeDerivedFrom());
1680
1681 addSourceLine(MemberDie, DT);
1682
1683 DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
1684 addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1685
1686 uint64_t Size = DT.getSizeInBits();
1687 uint64_t FieldSize = DT.getOriginalTypeSize();
1688
1689 if (Size != FieldSize) {
1690 // Handle bitfield.
1691 addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
1692 addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1693
1694 uint64_t Offset = DT.getOffsetInBits();
1695 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1696 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1697 uint64_t FieldOffset = (HiMark - FieldSize);
1698 Offset -= FieldOffset;
1699
1700 // Maybe we need to work from the other end.
Micah Villmow3574eca2012-10-08 16:38:25 +00001701 if (Asm->getDataLayout().isLittleEndian())
Devang Patel161b2f42011-04-12 23:21:44 +00001702 Offset = FieldSize - (Offset + Size);
1703 addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
1704
1705 // Here WD_AT_data_member_location points to the anonymous
1706 // field that includes this bit field.
1707 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
1708
1709 } else
1710 // This is not a bitfield.
1711 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1712
1713 if (DT.getTag() == dwarf::DW_TAG_inheritance
1714 && DT.isVirtual()) {
1715
1716 // For C++, virtual base classes are not at fixed offset. Use following
1717 // expression to extract appropriate offset from vtable.
1718 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1719
1720 DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
1721 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1722 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1723 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1724 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1725 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1726 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1727 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1728
1729 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
1730 VBaseLocationDie);
1731 } else
1732 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
1733
1734 if (DT.isProtected())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001735 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001736 dwarf::DW_ACCESS_protected);
1737 else if (DT.isPrivate())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001738 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001739 dwarf::DW_ACCESS_private);
1740 // Otherwise C++ member and base classes are considered public.
Eric Christopher8b4310b2012-11-21 00:34:38 +00001741 else
Nick Lewycky13aaca52011-12-13 05:09:11 +00001742 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001743 dwarf::DW_ACCESS_public);
1744 if (DT.isVirtual())
Nick Lewycky798313d2011-12-14 00:56:07 +00001745 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001746 dwarf::DW_VIRTUALITY_virtual);
Devang Patele9db5e22011-04-16 00:11:51 +00001747
1748 // Objective-C properties.
Devang Patel6588abf2012-02-06 17:49:43 +00001749 if (MDNode *PNode = DT.getObjCProperty())
1750 if (DIEEntry *PropertyDie = getDIEEntry(PNode))
Eric Christopher8b4310b2012-11-21 00:34:38 +00001751 MemberDie->addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4,
Devang Patel6588abf2012-02-06 17:49:43 +00001752 PropertyDie);
1753
David Blaikie01bc2b32012-12-13 22:43:07 +00001754 if (DT.isArtificial())
1755 addFlag(MemberDie, dwarf::DW_AT_artificial);
1756
Devang Patel161b2f42011-04-12 23:21:44 +00001757 return MemberDie;
1758}
Eric Christopher6b6061f2013-01-16 01:22:23 +00001759
1760/// createStaticMemberDIE - Create new DIE for C++ static member.
1761DIE *CompileUnit::createStaticMemberDIE(const DIDerivedType DT) {
1762 if (!DT.Verify())
1763 return NULL;
1764
1765 DIE *StaticMemberDIE = new DIE(DT.getTag());
1766 DIType Ty = DT.getTypeDerivedFrom();
1767
1768 addString(StaticMemberDIE, dwarf::DW_AT_name, DT.getName());
1769 addType(StaticMemberDIE, Ty);
1770 addSourceLine(StaticMemberDIE, DT);
1771 addFlag(StaticMemberDIE, dwarf::DW_AT_external);
1772 addFlag(StaticMemberDIE, dwarf::DW_AT_declaration);
1773
1774 // FIXME: We could omit private if the parent is a class_type, and
1775 // public if the parent is something else.
1776 if (DT.isProtected())
1777 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1778 dwarf::DW_ACCESS_protected);
1779 else if (DT.isPrivate())
1780 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1781 dwarf::DW_ACCESS_private);
1782 else
1783 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1784 dwarf::DW_ACCESS_public);
1785
1786 if (const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(DT.getConstant()))
1787 addConstantValue(StaticMemberDIE, CI, Ty.isUnsignedDIType());
David Blaikie14268412013-01-20 01:18:01 +00001788 if (const ConstantFP *CFP = dyn_cast_or_null<ConstantFP>(DT.getConstant()))
1789 addConstantFPValue(StaticMemberDIE, CFP);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001790
1791 insertDIE(DT, StaticMemberDIE);
1792 return StaticMemberDIE;
1793}