blob: 803a35d9e4c0da550b1b1602f36d286b4a4f12b0 [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 Christopher9c57ad22013-05-08 00:58:51 +000036CompileUnit::CompileUnit(unsigned UID, unsigned L, DIE *D, const MDNode *N,
Eric Christopher5592ba42013-05-30 00:43:32 +000037 AsmPrinter *A, DwarfDebug *DW, DwarfUnits *DWU)
Eric Christopher2e5d8702012-12-20 21:58:36 +000038 : UniqueID(UID), Language(L), CUDie(D), Asm(A), DD(DW), DU(DWU),
Manman Renbc3e96f2013-03-12 18:27:15 +000039 IndexTyDie(0), 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 {
Bill Wendling222c2fd2012-12-06 07:38:10 +000060 switch (Language) {
61 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 Patel161b2f42011-04-12 23:21:44 +0000609 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Devang Patel4ec14b02011-07-20 21:57:04 +0000610 int SizeInBits = -1;
611 bool SignedConstant = isTypeSigned(Ty, &SizeInBits);
Eric Christopher31667622013-08-08 01:41:00 +0000612 uint16_t Form = SignedConstant ? dwarf::DW_FORM_sdata : dwarf::DW_FORM_udata;
Devang Patel4ec14b02011-07-20 21:57:04 +0000613 switch (SizeInBits) {
614 case 8: Form = dwarf::DW_FORM_data1; break;
615 case 16: Form = dwarf::DW_FORM_data2; break;
616 case 32: Form = dwarf::DW_FORM_data4; break;
617 case 64: Form = dwarf::DW_FORM_data8; break;
Devang Patel045c1d42011-05-27 19:13:26 +0000618 default: break;
619 }
Eric Christopher8b4310b2012-11-21 00:34:38 +0000620 SignedConstant ? addSInt(Block, 0, Form, MO.getImm())
Devang Patel4ec14b02011-07-20 21:57:04 +0000621 : addUInt(Block, 0, Form, MO.getImm());
Devang Patel72f0d9c2011-05-27 18:15:52 +0000622
Devang Patel161b2f42011-04-12 23:21:44 +0000623 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
Devang Patel161b2f42011-04-12 23:21:44 +0000624}
625
626/// addConstantFPValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000627void CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
Nick Lewycky390c40d2011-10-27 06:44:11 +0000628 assert (MO.isFPImm() && "Invalid machine operand!");
Devang Patel161b2f42011-04-12 23:21:44 +0000629 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
630 APFloat FPImm = MO.getFPImm()->getValueAPF();
631
632 // Get the raw data form of the floating point.
633 const APInt FltVal = FPImm.bitcastToAPInt();
634 const char *FltPtr = (const char*)FltVal.getRawData();
635
636 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
Micah Villmow3574eca2012-10-08 16:38:25 +0000637 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel161b2f42011-04-12 23:21:44 +0000638 int Incr = (LittleEndian ? 1 : -1);
639 int Start = (LittleEndian ? 0 : NumBytes - 1);
640 int Stop = (LittleEndian ? NumBytes : -1);
641
642 // Output the constant to DWARF one byte at a time.
643 for (; Start != Stop; Start += Incr)
644 addUInt(Block, 0, dwarf::DW_FORM_data1,
645 (unsigned char)0xFF & FltPtr[Start]);
646
647 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
Devang Patel161b2f42011-04-12 23:21:44 +0000648}
649
David Blaikie14268412013-01-20 01:18:01 +0000650/// addConstantFPValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000651void CompileUnit::addConstantFPValue(DIE *Die, const ConstantFP *CFP) {
652 addConstantValue(Die, CFP->getValueAPF().bitcastToAPInt(), false);
David Blaikie14268412013-01-20 01:18:01 +0000653}
654
Devang Patel161b2f42011-04-12 23:21:44 +0000655/// addConstantValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000656void CompileUnit::addConstantValue(DIE *Die, const ConstantInt *CI,
Devang Patel161b2f42011-04-12 23:21:44 +0000657 bool Unsigned) {
Eric Christophere4721492013-07-03 01:08:30 +0000658 addConstantValue(Die, CI->getValue(), Unsigned);
David Blaikie14268412013-01-20 01:18:01 +0000659}
660
661// addConstantValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000662void CompileUnit::addConstantValue(DIE *Die, const APInt &Val, bool Unsigned) {
David Blaikie14268412013-01-20 01:18:01 +0000663 unsigned CIBitWidth = Val.getBitWidth();
Devang Pateld6a81362011-05-28 00:39:18 +0000664 if (CIBitWidth <= 64) {
665 unsigned form = 0;
666 switch (CIBitWidth) {
667 case 8: form = dwarf::DW_FORM_data1; break;
668 case 16: form = dwarf::DW_FORM_data2; break;
669 case 32: form = dwarf::DW_FORM_data4; break;
670 case 64: form = dwarf::DW_FORM_data8; break;
Eric Christopher8b4310b2012-11-21 00:34:38 +0000671 default:
Devang Pateld6a81362011-05-28 00:39:18 +0000672 form = Unsigned ? dwarf::DW_FORM_udata : dwarf::DW_FORM_sdata;
673 }
Devang Patel161b2f42011-04-12 23:21:44 +0000674 if (Unsigned)
David Blaikie14268412013-01-20 01:18:01 +0000675 addUInt(Die, dwarf::DW_AT_const_value, form, Val.getZExtValue());
Devang Patel161b2f42011-04-12 23:21:44 +0000676 else
David Blaikie14268412013-01-20 01:18:01 +0000677 addSInt(Die, dwarf::DW_AT_const_value, form, Val.getSExtValue());
Eric Christophere4721492013-07-03 01:08:30 +0000678 return;
Devang Patel161b2f42011-04-12 23:21:44 +0000679 }
680
681 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
682
683 // Get the raw data form of the large APInt.
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000684 const uint64_t *Ptr64 = Val.getRawData();
Devang Patel161b2f42011-04-12 23:21:44 +0000685
686 int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
Micah Villmow3574eca2012-10-08 16:38:25 +0000687 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel161b2f42011-04-12 23:21:44 +0000688
689 // Output the constant to DWARF one byte at a time.
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000690 for (int i = 0; i < NumBytes; i++) {
691 uint8_t c;
692 if (LittleEndian)
693 c = Ptr64[i / 8] >> (8 * (i & 7));
694 else
695 c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7));
696 addUInt(Block, 0, dwarf::DW_FORM_data1, c);
697 }
Devang Patel161b2f42011-04-12 23:21:44 +0000698
699 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
Devang Patel161b2f42011-04-12 23:21:44 +0000700}
701
Eric Christopher6c3bb942013-04-22 07:47:40 +0000702/// addTemplateParams - Add template parameters into buffer.
Devang Patel161b2f42011-04-12 23:21:44 +0000703void CompileUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
704 // Add template parameters.
705 for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) {
706 DIDescriptor Element = TParams.getElement(i);
707 if (Element.isTemplateTypeParameter())
708 Buffer.addChild(getOrCreateTemplateTypeParameterDIE(
709 DITemplateTypeParameter(Element)));
710 else if (Element.isTemplateValueParameter())
711 Buffer.addChild(getOrCreateTemplateValueParameterDIE(
712 DITemplateValueParameter(Element)));
713 }
Devang Patel161b2f42011-04-12 23:21:44 +0000714}
Nick Lewycky746cb672011-10-26 22:55:33 +0000715
Eric Christopher6b6061f2013-01-16 01:22:23 +0000716/// getOrCreateContextDIE - Get context owner's DIE.
717DIE *CompileUnit::getOrCreateContextDIE(DIDescriptor Context) {
718 if (Context.isType())
719 return getOrCreateTypeDIE(DIType(Context));
720 else if (Context.isNameSpace())
721 return getOrCreateNameSpace(DINameSpace(Context));
722 else if (Context.isSubprogram())
723 return getOrCreateSubprogramDIE(DISubprogram(Context));
Eric Christopher6c3bb942013-04-22 07:47:40 +0000724 else
Eric Christopher6b6061f2013-01-16 01:22:23 +0000725 return getDIE(Context);
726}
727
Devang Patel161b2f42011-04-12 23:21:44 +0000728/// addToContextOwner - Add Die into the list of its context owner's children.
729void CompileUnit::addToContextOwner(DIE *Die, DIDescriptor Context) {
Eric Christopher6b6061f2013-01-16 01:22:23 +0000730 if (DIE *ContextDIE = getOrCreateContextDIE(Context))
Devang Patel161b2f42011-04-12 23:21:44 +0000731 ContextDIE->addChild(Die);
732 else
733 addDie(Die);
734}
735
736/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
737/// given DIType.
Devang Patel94c7ddb2011-08-16 22:09:43 +0000738DIE *CompileUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
739 DIType Ty(TyNode);
Manman Rend03d2b22013-07-08 18:33:29 +0000740 if (!Ty.isType())
Devang Patel94c7ddb2011-08-16 22:09:43 +0000741 return NULL;
Devang Patel161b2f42011-04-12 23:21:44 +0000742 DIE *TyDIE = getDIE(Ty);
743 if (TyDIE)
744 return TyDIE;
745
746 // Create new type.
747 TyDIE = new DIE(dwarf::DW_TAG_base_type);
748 insertDIE(Ty, TyDIE);
749 if (Ty.isBasicType())
750 constructTypeDIE(*TyDIE, DIBasicType(Ty));
751 else if (Ty.isCompositeType())
752 constructTypeDIE(*TyDIE, DICompositeType(Ty));
753 else {
754 assert(Ty.isDerivedType() && "Unknown kind of DIType");
755 constructTypeDIE(*TyDIE, DIDerivedType(Ty));
756 }
Eric Christopher1b3f9192011-11-10 19:52:58 +0000757 // If this is a named finished type then include it in the list of types
758 // for the accelerator tables.
Eric Christopherc36145f2012-01-06 04:35:23 +0000759 if (!Ty.getName().empty() && !Ty.isForwardDecl()) {
760 bool IsImplementation = 0;
761 if (Ty.isCompositeType()) {
762 DICompositeType CT(Ty);
Eric Christophere0167892012-01-06 23:03:37 +0000763 // A runtime language of 0 actually means C/C++ and that any
764 // non-negative value is some version of Objective-C/C++.
Eric Christopherc36145f2012-01-06 04:35:23 +0000765 IsImplementation = (CT.getRunTimeLang() == 0) ||
Eric Christophere2dc9332012-02-22 08:46:02 +0000766 CT.isObjcClassComplete();
Eric Christopherc36145f2012-01-06 04:35:23 +0000767 }
Eric Christophere0167892012-01-06 23:03:37 +0000768 unsigned Flags = IsImplementation ?
769 DwarfAccelTable::eTypeFlagClassIsImplementation : 0;
770 addAccelType(Ty.getName(), std::make_pair(TyDIE, Flags));
Eric Christopherc36145f2012-01-06 04:35:23 +0000771 }
Eric Christopher8b4310b2012-11-21 00:34:38 +0000772
Devang Patel161b2f42011-04-12 23:21:44 +0000773 addToContextOwner(TyDIE, Ty.getContext());
774 return TyDIE;
775}
776
777/// addType - Add a new type attribute to the specified entity.
Eric Christopher31667622013-08-08 01:41:00 +0000778void CompileUnit::addType(DIE *Entity, DIType Ty, uint16_t Attribute) {
Eric Christopherdc1363f2013-08-08 07:40:37 +0000779 assert(Ty && "Trying to add a type that doesn't exist?");
Devang Patel161b2f42011-04-12 23:21:44 +0000780
781 // Check for pre-existence.
782 DIEEntry *Entry = getDIEEntry(Ty);
783 // If it exists then use the existing value.
784 if (Entry) {
Eric Christopher663e0cf2012-03-28 07:34:31 +0000785 Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
Devang Patel161b2f42011-04-12 23:21:44 +0000786 return;
787 }
788
789 // Construct type.
790 DIE *Buffer = getOrCreateTypeDIE(Ty);
791
792 // Set up proxy.
793 Entry = createDIEEntry(Buffer);
794 insertDIEEntry(Ty, Entry);
Eric Christopher663e0cf2012-03-28 07:34:31 +0000795 Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
Devang Patele9ae06c2011-05-31 22:56:51 +0000796
797 // If this is a complete composite type then include it in the
798 // list of global types.
Devang Patelc20bdf12011-06-01 00:23:24 +0000799 addGlobalType(Ty);
Devang Patel66658e42011-05-31 23:30:30 +0000800}
801
802/// addGlobalType - Add a new global type to the compile unit.
803///
Devang Patelc20bdf12011-06-01 00:23:24 +0000804void CompileUnit::addGlobalType(DIType Ty) {
Devang Patele9ae06c2011-05-31 22:56:51 +0000805 DIDescriptor Context = Ty.getContext();
Eric Christopher8b4310b2012-11-21 00:34:38 +0000806 if (Ty.isCompositeType() && !Ty.getName().empty() && !Ty.isForwardDecl()
807 && (!Context || Context.isCompileUnit() || Context.isFile()
Devang Patel94c7ddb2011-08-16 22:09:43 +0000808 || Context.isNameSpace()))
Devang Patelc20bdf12011-06-01 00:23:24 +0000809 if (DIEEntry *Entry = getDIEEntry(Ty))
810 GlobalTypes[Ty.getName()] = Entry->getEntry();
Devang Patel161b2f42011-04-12 23:21:44 +0000811}
812
Devang Patel31c5d052011-05-06 16:57:54 +0000813/// addPubTypes - Add type for pubtypes section.
814void CompileUnit::addPubTypes(DISubprogram SP) {
815 DICompositeType SPTy = SP.getType();
Eric Christopher31667622013-08-08 01:41:00 +0000816 uint16_t SPTag = SPTy.getTag();
Devang Patel31c5d052011-05-06 16:57:54 +0000817 if (SPTag != dwarf::DW_TAG_subroutine_type)
818 return;
819
820 DIArray Args = SPTy.getTypeArray();
821 for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
822 DIType ATy(Args.getElement(i));
Manman Rend03d2b22013-07-08 18:33:29 +0000823 if (!ATy.isType())
Devang Patel31c5d052011-05-06 16:57:54 +0000824 continue;
Devang Patelc20bdf12011-06-01 00:23:24 +0000825 addGlobalType(ATy);
Devang Patel31c5d052011-05-06 16:57:54 +0000826 }
827}
828
Devang Patel161b2f42011-04-12 23:21:44 +0000829/// constructTypeDIE - Construct basic type die from DIBasicType.
830void CompileUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
831 // Get core information.
832 StringRef Name = BTy.getName();
Devang Patel161b2f42011-04-12 23:21:44 +0000833 // Add name if not anonymous or intermediate type.
834 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000835 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel734a67c2011-09-14 23:13:28 +0000836
837 if (BTy.getTag() == dwarf::DW_TAG_unspecified_type) {
838 Buffer.setTag(dwarf::DW_TAG_unspecified_type);
Eric Christopher61c91d52013-07-09 23:48:45 +0000839 // An unspecified type only has a name attribute.
Devang Patel734a67c2011-09-14 23:13:28 +0000840 return;
841 }
842
843 Buffer.setTag(dwarf::DW_TAG_base_type);
Nick Lewycky746cb672011-10-26 22:55:33 +0000844 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
Devang Patel30d409c2012-02-07 23:33:58 +0000845 BTy.getEncoding());
Devang Patel734a67c2011-09-14 23:13:28 +0000846
Devang Patel161b2f42011-04-12 23:21:44 +0000847 uint64_t Size = BTy.getSizeInBits() >> 3;
848 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
849}
850
851/// constructTypeDIE - Construct derived type die from DIDerivedType.
852void CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
853 // Get core information.
854 StringRef Name = DTy.getName();
855 uint64_t Size = DTy.getSizeInBits() >> 3;
Eric Christopher31667622013-08-08 01:41:00 +0000856 uint16_t Tag = DTy.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +0000857
858 // FIXME - Workaround for templates.
859 if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
860
861 Buffer.setTag(Tag);
862
863 // Map to main type, void will not have a type.
864 DIType FromTy = DTy.getTypeDerivedFrom();
Eric Christopherdc1363f2013-08-08 07:40:37 +0000865 if (FromTy)
866 addType(&Buffer, FromTy);
Devang Patel161b2f42011-04-12 23:21:44 +0000867
868 // Add name if not anonymous or intermediate type.
869 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000870 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +0000871
872 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopher35f225a2012-02-21 22:25:53 +0000873 if (Size && Tag != dwarf::DW_TAG_pointer_type)
Devang Patel161b2f42011-04-12 23:21:44 +0000874 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
875
David Blaikie62fdfb52013-01-07 05:51:15 +0000876 if (Tag == dwarf::DW_TAG_ptr_to_member_type)
877 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
878 getOrCreateTypeDIE(DTy.getClassType()));
Devang Patel161b2f42011-04-12 23:21:44 +0000879 // Add source line info if available and TyDesc is not a forward declaration.
880 if (!DTy.isForwardDecl())
881 addSourceLine(&Buffer, DTy);
882}
883
Eric Christopher3dee5752013-07-26 17:02:41 +0000884/// Return true if the type is appropriately scoped to be contained inside
885/// its own type unit.
886static bool isTypeUnitScoped(DIType Ty) {
887 DIScope Parent = Ty.getContext();
888 while (Parent) {
889 // Don't generate a hash for anything scoped inside a function.
890 if (Parent.isSubprogram())
891 return false;
892 Parent = Parent.getContext();
893 }
894 return true;
895}
896
897/// Return true if the type should be split out into a type unit.
898static bool shouldCreateTypeUnit(DICompositeType CTy) {
Eric Christopher31667622013-08-08 01:41:00 +0000899 uint16_t Tag = CTy.getTag();
Eric Christopher3dee5752013-07-26 17:02:41 +0000900
901 switch (Tag) {
902 case dwarf::DW_TAG_structure_type:
903 case dwarf::DW_TAG_union_type:
904 case dwarf::DW_TAG_enumeration_type:
905 case dwarf::DW_TAG_class_type:
906 // If this is a class, structure, union, or enumeration type
907 // that is not a declaration, is a type definition, and not scoped
908 // inside a function then separate this out as a type unit.
909 if (CTy.isForwardDecl() || !isTypeUnitScoped(CTy))
910 return 0;
911 return 1;
912 default:
913 return 0;
914 }
915}
916
Devang Patel161b2f42011-04-12 23:21:44 +0000917/// constructTypeDIE - Construct type DIE from DICompositeType.
918void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
919 // Get core information.
920 StringRef Name = CTy.getName();
921
922 uint64_t Size = CTy.getSizeInBits() >> 3;
Eric Christopher31667622013-08-08 01:41:00 +0000923 uint16_t Tag = CTy.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +0000924 Buffer.setTag(Tag);
925
926 switch (Tag) {
Devang Patel161b2f42011-04-12 23:21:44 +0000927 case dwarf::DW_TAG_array_type:
928 constructArrayTypeDIE(Buffer, &CTy);
929 break;
930 case dwarf::DW_TAG_enumeration_type: {
931 DIArray Elements = CTy.getTypeArray();
932
933 // Add enumerators to enumeration type.
934 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
935 DIE *ElemDie = NULL;
936 DIDescriptor Enum(Elements.getElement(i));
937 if (Enum.isEnumerator()) {
938 ElemDie = constructEnumTypeDIE(DIEnumerator(Enum));
939 Buffer.addChild(ElemDie);
940 }
941 }
Eric Christopherbb0f6ea2012-05-23 00:09:20 +0000942 DIType DTy = CTy.getTypeDerivedFrom();
Eric Christopher37c107b2013-08-08 07:40:42 +0000943 if (DTy) {
Eric Christopherbb0f6ea2012-05-23 00:09:20 +0000944 addType(&Buffer, DTy);
945 addUInt(&Buffer, dwarf::DW_AT_enum_class, dwarf::DW_FORM_flag, 1);
946 }
Devang Patel161b2f42011-04-12 23:21:44 +0000947 }
948 break;
949 case dwarf::DW_TAG_subroutine_type: {
Eric Christopherdc1363f2013-08-08 07:40:37 +0000950 // Add return type. A void return won't have a type.
Devang Patel161b2f42011-04-12 23:21:44 +0000951 DIArray Elements = CTy.getTypeArray();
952 DIDescriptor RTy = Elements.getElement(0);
Eric Christopherdc1363f2013-08-08 07:40:37 +0000953 if (RTy)
954 addType(&Buffer, DIType(RTy));
Devang Patel161b2f42011-04-12 23:21:44 +0000955
956 bool isPrototyped = true;
957 // Add arguments.
958 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
959 DIDescriptor Ty = Elements.getElement(i);
960 if (Ty.isUnspecifiedParameter()) {
961 DIE *Arg = new DIE(dwarf::DW_TAG_unspecified_parameters);
962 Buffer.addChild(Arg);
963 isPrototyped = false;
964 } else {
965 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
966 addType(Arg, DIType(Ty));
David Blaikieaaf2e632013-01-29 19:35:24 +0000967 if (DIType(Ty).isArtificial())
968 addFlag(Arg, dwarf::DW_AT_artificial);
Devang Patel161b2f42011-04-12 23:21:44 +0000969 Buffer.addChild(Arg);
970 }
971 }
Eric Christopher8b6fe6b2012-02-22 08:46:21 +0000972 // Add prototype flag if we're dealing with a C language and the
973 // function has been prototyped.
974 if (isPrototyped &&
Eric Christopher4d069bf2012-05-22 18:45:24 +0000975 (Language == dwarf::DW_LANG_C89 ||
976 Language == dwarf::DW_LANG_C99 ||
977 Language == dwarf::DW_LANG_ObjC))
Eric Christopher873cf0a2012-08-24 01:14:27 +0000978 addFlag(&Buffer, dwarf::DW_AT_prototyped);
Devang Patel161b2f42011-04-12 23:21:44 +0000979 }
980 break;
981 case dwarf::DW_TAG_structure_type:
982 case dwarf::DW_TAG_union_type:
983 case dwarf::DW_TAG_class_type: {
David Blaikiec8b93552013-08-01 20:30:22 +0000984 if (CTy.isForwardDecl())
Devang Patel161b2f42011-04-12 23:21:44 +0000985 break;
986
987 // Add elements to structure type.
David Blaikiec8b93552013-08-01 20:30:22 +0000988 DIArray Elements = CTy.getTypeArray();
989 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
Devang Patel161b2f42011-04-12 23:21:44 +0000990 DIDescriptor Element = Elements.getElement(i);
991 DIE *ElemDie = NULL;
992 if (Element.isSubprogram()) {
993 DISubprogram SP(Element);
Devang Pateldbc64af2011-08-15 17:24:54 +0000994 ElemDie = getOrCreateSubprogramDIE(DISubprogram(Element));
Devang Patel161b2f42011-04-12 23:21:44 +0000995 if (SP.isProtected())
Nick Lewycky13aaca52011-12-13 05:09:11 +0000996 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +0000997 dwarf::DW_ACCESS_protected);
998 else if (SP.isPrivate())
Nick Lewycky13aaca52011-12-13 05:09:11 +0000999 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001000 dwarf::DW_ACCESS_private);
Eric Christopher8b4310b2012-11-21 00:34:38 +00001001 else
Nick Lewycky13aaca52011-12-13 05:09:11 +00001002 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001003 dwarf::DW_ACCESS_public);
1004 if (SP.isExplicit())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001005 addFlag(ElemDie, dwarf::DW_AT_explicit);
Eric Christopher663e0cf2012-03-28 07:34:31 +00001006 } else if (Element.isDerivedType()) {
Eric Christopher4d069bf2012-05-22 18:45:24 +00001007 DIDerivedType DDTy(Element);
1008 if (DDTy.getTag() == dwarf::DW_TAG_friend) {
1009 ElemDie = new DIE(dwarf::DW_TAG_friend);
1010 addType(ElemDie, DDTy.getTypeDerivedFrom(), dwarf::DW_AT_friend);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001011 } else if (DDTy.isStaticMember())
1012 ElemDie = createStaticMemberDIE(DDTy);
1013 else
1014 ElemDie = createMemberDIE(DDTy);
Eric Christopher663e0cf2012-03-28 07:34:31 +00001015 } else if (Element.isObjCProperty()) {
Devang Patel30d409c2012-02-07 23:33:58 +00001016 DIObjCProperty Property(Element);
1017 ElemDie = new DIE(Property.getTag());
1018 StringRef PropertyName = Property.getObjCPropertyName();
1019 addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
Eric Christopher4d069bf2012-05-22 18:45:24 +00001020 addType(ElemDie, Property.getType());
1021 addSourceLine(ElemDie, Property);
Devang Patel30d409c2012-02-07 23:33:58 +00001022 StringRef GetterName = Property.getObjCPropertyGetterName();
1023 if (!GetterName.empty())
1024 addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
1025 StringRef SetterName = Property.getObjCPropertySetterName();
1026 if (!SetterName.empty())
1027 addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
1028 unsigned PropertyAttributes = 0;
Devang Patel9e11eb12012-02-04 01:30:32 +00001029 if (Property.isReadOnlyObjCProperty())
1030 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
1031 if (Property.isReadWriteObjCProperty())
1032 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
1033 if (Property.isAssignObjCProperty())
1034 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
1035 if (Property.isRetainObjCProperty())
1036 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
1037 if (Property.isCopyObjCProperty())
1038 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
1039 if (Property.isNonAtomicObjCProperty())
1040 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
1041 if (PropertyAttributes)
Eric Christopher8b4310b2012-11-21 00:34:38 +00001042 addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, 0,
Devang Patel9e11eb12012-02-04 01:30:32 +00001043 PropertyAttributes);
Devang Patel6588abf2012-02-06 17:49:43 +00001044
Devang Patel30d409c2012-02-07 23:33:58 +00001045 DIEEntry *Entry = getDIEEntry(Element);
1046 if (!Entry) {
1047 Entry = createDIEEntry(ElemDie);
1048 insertDIEEntry(Element, Entry);
1049 }
Devang Patel9e11eb12012-02-04 01:30:32 +00001050 } else
Devang Patel161b2f42011-04-12 23:21:44 +00001051 continue;
1052 Buffer.addChild(ElemDie);
1053 }
1054
1055 if (CTy.isAppleBlockExtension())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001056 addFlag(&Buffer, dwarf::DW_AT_APPLE_block);
Devang Patel161b2f42011-04-12 23:21:44 +00001057
Devang Patel161b2f42011-04-12 23:21:44 +00001058 DICompositeType ContainingType = CTy.getContainingType();
1059 if (DIDescriptor(ContainingType).isCompositeType())
1060 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
1061 getOrCreateTypeDIE(DIType(ContainingType)));
Eric Christopher010dbfd2013-07-14 21:46:51 +00001062 else
1063 addToContextOwner(&Buffer, CTy.getContext());
Devang Patel161b2f42011-04-12 23:21:44 +00001064
Devang Patel201e6cd2011-05-12 21:29:42 +00001065 if (CTy.isObjcClassComplete())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001066 addFlag(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type);
Devang Patelb11f80e2011-05-12 19:06:16 +00001067
Eric Christopher1a8e8862011-12-16 23:42:42 +00001068 // Add template parameters to a class, structure or union types.
1069 // FIXME: The support isn't in the metadata for this yet.
1070 if (Tag == dwarf::DW_TAG_class_type ||
1071 Tag == dwarf::DW_TAG_structure_type ||
1072 Tag == dwarf::DW_TAG_union_type)
Devang Patel161b2f42011-04-12 23:21:44 +00001073 addTemplateParams(Buffer, CTy.getTemplateParams());
1074
1075 break;
1076 }
1077 default:
1078 break;
1079 }
1080
1081 // Add name if not anonymous or intermediate type.
1082 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001083 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001084
Eric Christopher4a5d8392012-05-22 18:45:18 +00001085 if (Tag == dwarf::DW_TAG_enumeration_type ||
1086 Tag == dwarf::DW_TAG_class_type ||
1087 Tag == dwarf::DW_TAG_structure_type ||
1088 Tag == dwarf::DW_TAG_union_type) {
Devang Patel161b2f42011-04-12 23:21:44 +00001089 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopherfc4199b2012-06-01 00:22:32 +00001090 // TODO: Do we care about size for enum forward declarations?
Devang Patel161b2f42011-04-12 23:21:44 +00001091 if (Size)
1092 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
Eric Christopherfc4199b2012-06-01 00:22:32 +00001093 else if (!CTy.isForwardDecl())
Devang Patel161b2f42011-04-12 23:21:44 +00001094 // Add zero size if it is not a forward declaration.
Eric Christopherfc4199b2012-06-01 00:22:32 +00001095 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
1096
1097 // If we're a forward decl, say so.
1098 if (CTy.isForwardDecl())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001099 addFlag(&Buffer, dwarf::DW_AT_declaration);
Devang Patel161b2f42011-04-12 23:21:44 +00001100
1101 // Add source line info if available.
1102 if (!CTy.isForwardDecl())
1103 addSourceLine(&Buffer, CTy);
Eric Christopher89388952012-03-07 00:15:19 +00001104
1105 // No harm in adding the runtime language to the declaration.
1106 unsigned RLang = CTy.getRunTimeLang();
1107 if (RLang)
1108 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
1109 dwarf::DW_FORM_data1, RLang);
Devang Patel161b2f42011-04-12 23:21:44 +00001110 }
Eric Christopher3dee5752013-07-26 17:02:41 +00001111 // If this is a type applicable to a type unit it then add it to the
1112 // list of types we'll compute a hash for later.
1113 if (shouldCreateTypeUnit(CTy))
1114 DD->addTypeUnitType(&Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +00001115}
1116
Eric Christopher8b4310b2012-11-21 00:34:38 +00001117/// getOrCreateTemplateTypeParameterDIE - Find existing DIE or create new DIE
Devang Patel161b2f42011-04-12 23:21:44 +00001118/// for the given DITemplateTypeParameter.
1119DIE *
1120CompileUnit::getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP) {
1121 DIE *ParamDIE = getDIE(TP);
1122 if (ParamDIE)
1123 return ParamDIE;
1124
1125 ParamDIE = new DIE(dwarf::DW_TAG_template_type_parameter);
Eric Christopher76ef79f2013-08-08 08:09:43 +00001126 // Add the type if it exists, it could be void and therefore no type.
1127 if (TP.getType())
1128 addType(ParamDIE, TP.getType());
David Blaikiee88939c2013-06-22 18:59:11 +00001129 if (!TP.getName().empty())
1130 addString(ParamDIE, dwarf::DW_AT_name, TP.getName());
Devang Patel161b2f42011-04-12 23:21:44 +00001131 return ParamDIE;
1132}
1133
Eric Christopher8b4310b2012-11-21 00:34:38 +00001134/// getOrCreateTemplateValueParameterDIE - Find existing DIE or create new DIE
Devang Patel161b2f42011-04-12 23:21:44 +00001135/// for the given DITemplateValueParameter.
1136DIE *
Eric Christopherafdd1f82013-08-08 07:40:31 +00001137CompileUnit::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter VP) {
1138 DIE *ParamDIE = getDIE(VP);
Devang Patel161b2f42011-04-12 23:21:44 +00001139 if (ParamDIE)
1140 return ParamDIE;
1141
Eric Christopherafdd1f82013-08-08 07:40:31 +00001142 ParamDIE = new DIE(VP.getTag());
Eric Christopherdc1363f2013-08-08 07:40:37 +00001143
1144 // Add the type if there is one, template template and template parameter
1145 // packs will not have a type.
1146 if (VP.getType())
1147 addType(ParamDIE, VP.getType());
Eric Christopherafdd1f82013-08-08 07:40:31 +00001148 if (!VP.getName().empty())
1149 addString(ParamDIE, dwarf::DW_AT_name, VP.getName());
1150 if (Value *Val = VP.getValue()) {
David Blaikie4de9d722013-05-10 21:52:07 +00001151 if (ConstantInt *CI = dyn_cast<ConstantInt>(Val))
Eric Christopherafdd1f82013-08-08 07:40:31 +00001152 addConstantValue(ParamDIE, CI, VP.getType().isUnsignedDIType());
David Blaikie4de9d722013-05-10 21:52:07 +00001153 else if (GlobalValue *GV = dyn_cast<GlobalValue>(Val)) {
1154 // For declaration non-type template parameters (such as global values and
1155 // functions)
1156 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1157 addOpAddress(Block, Asm->Mang->getSymbol(GV));
1158 // Emit DW_OP_stack_value to use the address as the immediate value of the
1159 // parameter, rather than a pointer to it.
1160 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value);
1161 addBlock(ParamDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopherafdd1f82013-08-08 07:40:31 +00001162 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_template_param) {
David Blaikiee88939c2013-06-22 18:59:11 +00001163 assert(isa<MDString>(Val));
1164 addString(ParamDIE, dwarf::DW_AT_GNU_template_name,
1165 cast<MDString>(Val)->getString());
Eric Christopherafdd1f82013-08-08 07:40:31 +00001166 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_parameter_pack) {
David Blaikiee88939c2013-06-22 18:59:11 +00001167 assert(isa<MDNode>(Val));
1168 DIArray A(cast<MDNode>(Val));
1169 addTemplateParams(*ParamDIE, A);
David Blaikie4de9d722013-05-10 21:52:07 +00001170 }
1171 }
1172
Devang Patel161b2f42011-04-12 23:21:44 +00001173 return ParamDIE;
1174}
1175
Devang Patel31c5d052011-05-06 16:57:54 +00001176/// getOrCreateNameSpace - Create a DIE for DINameSpace.
1177DIE *CompileUnit::getOrCreateNameSpace(DINameSpace NS) {
1178 DIE *NDie = getDIE(NS);
1179 if (NDie)
1180 return NDie;
1181 NDie = new DIE(dwarf::DW_TAG_namespace);
1182 insertDIE(NS, NDie);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001183 if (!NS.getName().empty()) {
Nick Lewycky390c40d2011-10-27 06:44:11 +00001184 addString(NDie, dwarf::DW_AT_name, NS.getName());
Eric Christopher09ac3d82011-11-07 09:24:32 +00001185 addAccelNamespace(NS.getName(), NDie);
1186 } else
1187 addAccelNamespace("(anonymous namespace)", NDie);
Devang Patel31c5d052011-05-06 16:57:54 +00001188 addSourceLine(NDie, NS);
1189 addToContextOwner(NDie, NS.getContext());
1190 return NDie;
1191}
1192
Devang Pateldbc64af2011-08-15 17:24:54 +00001193/// getOrCreateSubprogramDIE - Create new DIE using SP.
1194DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
1195 DIE *SPDie = getDIE(SP);
1196 if (SPDie)
1197 return SPDie;
1198
Peter Collingbourne27302f02012-05-27 18:36:44 +00001199 SPDie = new DIE(dwarf::DW_TAG_subprogram);
1200
1201 // DW_TAG_inlined_subroutine may refer to this DIE.
1202 insertDIE(SP, SPDie);
1203
Rafael Espindola01b55b42011-11-10 22:34:29 +00001204 DISubprogram SPDecl = SP.getFunctionDeclaration();
1205 DIE *DeclDie = NULL;
1206 if (SPDecl.isSubprogram()) {
1207 DeclDie = getOrCreateSubprogramDIE(SPDecl);
1208 }
1209
Devang Pateldbc64af2011-08-15 17:24:54 +00001210 // Add to context owner.
1211 addToContextOwner(SPDie, SP.getContext());
1212
1213 // Add function template parameters.
1214 addTemplateParams(*SPDie, SP.getTemplateParams());
1215
Eric Christopherc4968752013-05-09 00:42:33 +00001216 // Unfortunately this code needs to stay here instead of below the
1217 // AT_specification code in order to work around a bug in older
1218 // gdbs that requires the linkage name to resolve multiple template
1219 // functions.
1220 // TODO: Remove this set of code when we get rid of the old gdb
1221 // compatibility.
Eric Christopher8d101c32012-03-15 08:19:33 +00001222 StringRef LinkageName = SP.getLinkageName();
Eric Christopherc4968752013-05-09 00:42:33 +00001223 if (!LinkageName.empty() && DD->useDarwinGDBCompat())
1224 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c2b4be2013-06-01 17:51:14 +00001225 GlobalValue::getRealLinkageName(LinkageName));
Eric Christopher8d101c32012-03-15 08:19:33 +00001226
Devang Pateldbc64af2011-08-15 17:24:54 +00001227 // If this DIE is going to refer declaration info using AT_specification
Eric Christopherc4968752013-05-09 00:42:33 +00001228 // then there is no need to add other attributes.
Rafael Espindola01b55b42011-11-10 22:34:29 +00001229 if (DeclDie) {
1230 // Refer function declaration directly.
1231 addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
1232 DeclDie);
1233
Devang Pateldbc64af2011-08-15 17:24:54 +00001234 return SPDie;
Rafael Espindola01b55b42011-11-10 22:34:29 +00001235 }
Devang Pateldbc64af2011-08-15 17:24:54 +00001236
Eric Christophercbbd5b12012-08-23 22:52:55 +00001237 // Add the linkage name if we have one.
Eric Christopherc4968752013-05-09 00:42:33 +00001238 if (!LinkageName.empty() && !DD->useDarwinGDBCompat())
Eric Christophercbbd5b12012-08-23 22:52:55 +00001239 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c2b4be2013-06-01 17:51:14 +00001240 GlobalValue::getRealLinkageName(LinkageName));
Eric Christophercbbd5b12012-08-23 22:52:55 +00001241
Devang Pateldbc64af2011-08-15 17:24:54 +00001242 // Constructors and operators for anonymous aggregates do not have names.
1243 if (!SP.getName().empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001244 addString(SPDie, dwarf::DW_AT_name, SP.getName());
Devang Pateldbc64af2011-08-15 17:24:54 +00001245
1246 addSourceLine(SPDie, SP);
1247
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001248 // Add the prototype if we have a prototype and we have a C like
1249 // language.
1250 if (SP.isPrototyped() &&
1251 (Language == dwarf::DW_LANG_C89 ||
1252 Language == dwarf::DW_LANG_C99 ||
1253 Language == dwarf::DW_LANG_ObjC))
Eric Christopher873cf0a2012-08-24 01:14:27 +00001254 addFlag(SPDie, dwarf::DW_AT_prototyped);
Devang Pateldbc64af2011-08-15 17:24:54 +00001255
Eric Christopherdc1363f2013-08-08 07:40:37 +00001256 // Add Return Type. A void return type will not have a type.
Devang Pateldbc64af2011-08-15 17:24:54 +00001257 DICompositeType SPTy = SP.getType();
David Blaikie3d331842013-05-22 23:22:18 +00001258 assert(SPTy.getTag() == dwarf::DW_TAG_subroutine_type &&
1259 "the type of a subprogram should be a subroutine");
Devang Pateldbc64af2011-08-15 17:24:54 +00001260
David Blaikie3d331842013-05-22 23:22:18 +00001261 DIArray Args = SPTy.getTypeArray();
Eric Christopherdc1363f2013-08-08 07:40:37 +00001262 if (Args.getElement(0))
1263 addType(SPDie, DIType(Args.getElement(0)));
Devang Pateldbc64af2011-08-15 17:24:54 +00001264
1265 unsigned VK = SP.getVirtuality();
1266 if (VK) {
Nick Lewycky798313d2011-12-14 00:56:07 +00001267 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
Devang Pateldbc64af2011-08-15 17:24:54 +00001268 DIEBlock *Block = getDIEBlock();
1269 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1270 addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex());
1271 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
1272 ContainingTypeMap.insert(std::make_pair(SPDie,
1273 SP.getContainingType()));
1274 }
1275
1276 if (!SP.isDefinition()) {
Eric Christopher873cf0a2012-08-24 01:14:27 +00001277 addFlag(SPDie, dwarf::DW_AT_declaration);
Eric Christopher8b4310b2012-11-21 00:34:38 +00001278
Devang Pateldbc64af2011-08-15 17:24:54 +00001279 // Add arguments. Do not add arguments for subprogram definition. They will
1280 // be handled while processing variables.
David Blaikie3d331842013-05-22 23:22:18 +00001281 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1282 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1283 DIType ATy = DIType(Args.getElement(i));
1284 addType(Arg, ATy);
1285 if (ATy.isArtificial())
1286 addFlag(Arg, dwarf::DW_AT_artificial);
1287 SPDie->addChild(Arg);
1288 }
Devang Pateldbc64af2011-08-15 17:24:54 +00001289 }
1290
1291 if (SP.isArtificial())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001292 addFlag(SPDie, dwarf::DW_AT_artificial);
Devang Pateldbc64af2011-08-15 17:24:54 +00001293
1294 if (!SP.isLocalToUnit())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001295 addFlag(SPDie, dwarf::DW_AT_external);
Devang Pateldbc64af2011-08-15 17:24:54 +00001296
1297 if (SP.isOptimized())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001298 addFlag(SPDie, dwarf::DW_AT_APPLE_optimized);
Devang Pateldbc64af2011-08-15 17:24:54 +00001299
1300 if (unsigned isa = Asm->getISAEncoding()) {
1301 addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1302 }
1303
1304 return SPDie;
1305}
1306
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001307// Return const expression if value is a GEP to access merged global
1308// constant. e.g.
1309// i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
1310static const ConstantExpr *getMergedGlobalExpr(const Value *V) {
1311 const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
1312 if (!CE || CE->getNumOperands() != 3 ||
1313 CE->getOpcode() != Instruction::GetElementPtr)
1314 return NULL;
1315
1316 // First operand points to a global struct.
1317 Value *Ptr = CE->getOperand(0);
1318 if (!isa<GlobalValue>(Ptr) ||
1319 !isa<StructType>(cast<PointerType>(Ptr->getType())->getElementType()))
1320 return NULL;
1321
1322 // Second operand is zero.
1323 const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
1324 if (!CI || !CI->isZero())
1325 return NULL;
1326
1327 // Third operand is offset.
1328 if (!isa<ConstantInt>(CE->getOperand(2)))
1329 return NULL;
1330
1331 return CE;
1332}
1333
1334/// createGlobalVariableDIE - create global variable DIE.
1335void CompileUnit::createGlobalVariableDIE(const MDNode *N) {
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001336 // Check for pre-existence.
Devang Patel49e2f032011-08-18 22:21:50 +00001337 if (getDIE(N))
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001338 return;
1339
Devang Patel49e2f032011-08-18 22:21:50 +00001340 DIGlobalVariable GV(N);
Manman Rend03d2b22013-07-08 18:33:29 +00001341 if (!GV.isGlobalVariable())
Devang Patel28bea082011-08-18 23:17:55 +00001342 return;
1343
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001344 DIDescriptor GVContext = GV.getContext();
Eric Christopher6b6061f2013-01-16 01:22:23 +00001345 DIType GTy = GV.getType();
1346
1347 // If this is a static data member definition, some attributes belong
1348 // to the declaration DIE.
1349 DIE *VariableDIE = NULL;
Manman Ren945e8282013-02-01 23:54:37 +00001350 bool IsStaticMember = false;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001351 DIDerivedType SDMDecl = GV.getStaticDataMemberDeclaration();
1352 if (SDMDecl.Verify()) {
1353 assert(SDMDecl.isStaticMember() && "Expected static member decl");
1354 // We need the declaration DIE that is in the static member's class.
1355 // But that class might not exist in the DWARF yet.
1356 // Creating the class will create the static member decl DIE.
1357 getOrCreateContextDIE(SDMDecl.getContext());
1358 VariableDIE = getDIE(SDMDecl);
1359 assert(VariableDIE && "Static member decl has no context?");
Manman Ren945e8282013-02-01 23:54:37 +00001360 IsStaticMember = true;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001361 }
1362
1363 // If this is not a static data member definition, create the variable
1364 // DIE and add the initial set of attributes to it.
1365 if (!VariableDIE) {
1366 VariableDIE = new DIE(GV.getTag());
1367 // Add to map.
1368 insertDIE(N, VariableDIE);
1369
1370 // Add name and type.
1371 addString(VariableDIE, dwarf::DW_AT_name, GV.getDisplayName());
1372 addType(VariableDIE, GTy);
1373
1374 // Add scoping info.
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00001375 if (!GV.isLocalToUnit()) {
Eric Christopher6b6061f2013-01-16 01:22:23 +00001376 addFlag(VariableDIE, dwarf::DW_AT_external);
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00001377 addGlobalName(GV.getName(), VariableDIE);
1378 }
Eric Christopher6b6061f2013-01-16 01:22:23 +00001379
1380 // Add line number info.
1381 addSourceLine(VariableDIE, GV);
1382 // Add to context owner.
1383 addToContextOwner(VariableDIE, GVContext);
1384 }
1385
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001386 // Add location.
Eric Christopher09ac3d82011-11-07 09:24:32 +00001387 bool addToAccelTable = false;
Eric Christopherd61c34b2011-11-11 03:16:32 +00001388 DIE *VariableSpecDIE = NULL;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001389 bool isGlobalVariable = GV.getGlobal() != NULL;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001390 if (isGlobalVariable) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001391 addToAccelTable = true;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001392 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
David Blaikie59eaa382013-06-28 20:05:11 +00001393 const MCSymbol *Sym = Asm->Mang->getSymbol(GV.getGlobal());
1394 if (GV.getGlobal()->isThreadLocal()) {
1395 // FIXME: Make this work with -gsplit-dwarf.
1396 unsigned PointerSize = Asm->getDataLayout().getPointerSize();
1397 assert((PointerSize == 4 || PointerSize == 8) &&
1398 "Add support for other sizes if necessary");
Ulrich Weigand716a94f2013-07-02 18:47:09 +00001399 const MCExpr *Expr =
David Blaikie8fed05e2013-07-01 23:55:52 +00001400 Asm->getObjFileLowering().getDebugThreadLocalSymbol(Sym);
David Blaikie59eaa382013-06-28 20:05:11 +00001401 // Based on GCC's support for TLS:
David Blaikie8fed05e2013-07-01 23:55:52 +00001402 if (!DD->useSplitDwarf()) {
1403 // 1) Start with a constNu of the appropriate pointer size
1404 addUInt(Block, 0, dwarf::DW_FORM_data1,
1405 PointerSize == 4 ? dwarf::DW_OP_const4u : dwarf::DW_OP_const8u);
1406 // 2) containing the (relocated) address of the TLS variable
Ulrich Weigand716a94f2013-07-02 18:47:09 +00001407 addExpr(Block, 0, dwarf::DW_FORM_udata, Expr);
David Blaikie8fed05e2013-07-01 23:55:52 +00001408 } else {
1409 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_const_index);
Ulrich Weigand716a94f2013-07-02 18:47:09 +00001410 addUInt(Block, 0, dwarf::DW_FORM_udata, DU->getAddrPoolIndex(Expr));
David Blaikie8fed05e2013-07-01 23:55:52 +00001411 }
David Blaikie59eaa382013-06-28 20:05:11 +00001412 // 3) followed by a custom OP to tell the debugger about TLS (presumably)
1413 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_lo_user);
1414 } else
1415 addOpAddress(Block, Sym);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001416 // Do not create specification DIE if context is either compile unit
1417 // or a subprogram.
Devang Patel1dd4e562011-09-21 23:41:11 +00001418 if (GVContext && GV.isDefinition() && !GVContext.isCompileUnit() &&
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001419 !GVContext.isFile() && !isSubprogramContext(GVContext)) {
1420 // Create specification DIE.
Eric Christopherd117fbb2011-11-11 01:55:22 +00001421 VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001422 addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
1423 dwarf::DW_FORM_ref4, VariableDIE);
1424 addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001425 // A static member's declaration is already flagged as such.
1426 if (!SDMDecl.Verify())
1427 addFlag(VariableDIE, dwarf::DW_AT_declaration);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001428 addDie(VariableSpecDIE);
1429 } else {
1430 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001431 }
Eric Christopher6b6061f2013-01-16 01:22:23 +00001432 // Add linkage name.
1433 StringRef LinkageName = GV.getLinkageName();
Eric Christophera8ada252013-02-27 23:49:50 +00001434 if (!LinkageName.empty()) {
Eric Christopher8d45a982013-02-27 23:49:47 +00001435 // From DWARF4: DIEs to which DW_AT_linkage_name may apply include:
1436 // TAG_common_block, TAG_constant, TAG_entry_point, TAG_subprogram and
1437 // TAG_variable.
Manman Ren21a08a12013-02-27 23:21:02 +00001438 addString(IsStaticMember && VariableSpecDIE ?
1439 VariableSpecDIE : VariableDIE, dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c2b4be2013-06-01 17:51:14 +00001440 GlobalValue::getRealLinkageName(LinkageName));
Eric Christopher8d45a982013-02-27 23:49:47 +00001441 // In compatibility mode with older gdbs we put the linkage name on both
1442 // the TAG_variable DIE and on the TAG_member DIE.
Manman Ren21a08a12013-02-27 23:21:02 +00001443 if (IsStaticMember && VariableSpecDIE && DD->useDarwinGDBCompat())
1444 addString(VariableDIE, dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c2b4be2013-06-01 17:51:14 +00001445 GlobalValue::getRealLinkageName(LinkageName));
Manman Ren06df83c2013-02-27 00:02:32 +00001446 }
Eric Christopher8b4310b2012-11-21 00:34:38 +00001447 } else if (const ConstantInt *CI =
Manman Ren945e8282013-02-01 23:54:37 +00001448 dyn_cast_or_null<ConstantInt>(GV.getConstant())) {
Adrian Prantl2e892e42013-04-04 22:56:49 +00001449 // AT_const_value was added when the static member was created. To avoid
Manman Ren945e8282013-02-01 23:54:37 +00001450 // emitting AT_const_value multiple times, we only add AT_const_value when
1451 // it is not a static member.
1452 if (!IsStaticMember)
1453 addConstantValue(VariableDIE, CI, GTy.isUnsignedDIType());
1454 } else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001455 addToAccelTable = true;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001456 // GV is a merged global.
1457 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1458 Value *Ptr = CE->getOperand(0);
Eric Christopher0969ddf2013-01-18 22:11:33 +00001459 addOpAddress(Block, Asm->Mang->getSymbol(cast<GlobalValue>(Ptr)));
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001460 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1461 SmallVector<Value*, 3> Idx(CE->op_begin()+1, CE->op_end());
Eric Christopher8b4310b2012-11-21 00:34:38 +00001462 addUInt(Block, 0, dwarf::DW_FORM_udata,
Micah Villmow3574eca2012-10-08 16:38:25 +00001463 Asm->getDataLayout().getIndexedOffset(Ptr->getType(), Idx));
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001464 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1465 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
1466 }
1467
Eric Christopherd117fbb2011-11-11 01:55:22 +00001468 if (addToAccelTable) {
1469 DIE *AddrDIE = VariableSpecDIE ? VariableSpecDIE : VariableDIE;
1470 addAccelName(GV.getName(), AddrDIE);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001471
Eric Christopherd117fbb2011-11-11 01:55:22 +00001472 // If the linkage name is different than the name, go ahead and output
1473 // that as well into the name table.
1474 if (GV.getLinkageName() != "" && GV.getName() != GV.getLinkageName())
1475 addAccelName(GV.getLinkageName(), AddrDIE);
1476 }
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001477}
1478
Devang Patel161b2f42011-04-12 23:21:44 +00001479/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
Eric Christopher4d069bf2012-05-22 18:45:24 +00001480void CompileUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR,
1481 DIE *IndexTy) {
Devang Patel161b2f42011-04-12 23:21:44 +00001482 DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
1483 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
Devang Patel161b2f42011-04-12 23:21:44 +00001484
Bill Wendling222c2fd2012-12-06 07:38:10 +00001485 // The LowerBound value defines the lower bounds which is typically zero for
1486 // C/C++. The Count value is the number of elements. Values are 64 bit. If
1487 // Count == -1 then the array is unbounded and we do not emit
1488 // DW_AT_lower_bound and DW_AT_upper_bound attributes. If LowerBound == 0 and
1489 // Count == 0, then the array has zero elements in which case we do not emit
1490 // an upper bound.
1491 int64_t LowerBound = SR.getLo();
Bill Wendling6afe4782012-12-06 07:55:19 +00001492 int64_t DefaultLowerBound = getDefaultLowerBound();
Bill Wendling9493dae2012-12-04 21:34:03 +00001493 int64_t Count = SR.getCount();
Devang Patel161b2f42011-04-12 23:21:44 +00001494
Bill Wendling6afe4782012-12-06 07:55:19 +00001495 if (DefaultLowerBound == -1 || LowerBound != DefaultLowerBound)
Bill Wendling222c2fd2012-12-06 07:38:10 +00001496 addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, LowerBound);
1497
1498 if (Count != -1 && Count != 0)
Bill Wendling9493dae2012-12-04 21:34:03 +00001499 // FIXME: An unbounded array should reference the expression that defines
1500 // the array.
Bill Wendling222c2fd2012-12-06 07:38:10 +00001501 addUInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, LowerBound + Count - 1);
Bill Wendling9493dae2012-12-04 21:34:03 +00001502
Devang Patel161b2f42011-04-12 23:21:44 +00001503 Buffer.addChild(DW_Subrange);
1504}
1505
1506/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
1507void CompileUnit::constructArrayTypeDIE(DIE &Buffer,
1508 DICompositeType *CTy) {
1509 Buffer.setTag(dwarf::DW_TAG_array_type);
Eric Christopher9a1e0e22013-01-08 01:53:52 +00001510 if (CTy->isVector())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001511 addFlag(&Buffer, dwarf::DW_AT_GNU_vector);
Devang Patel161b2f42011-04-12 23:21:44 +00001512
Eric Christopherdc1363f2013-08-08 07:40:37 +00001513 // Emit the element type.
Devang Patel161b2f42011-04-12 23:21:44 +00001514 addType(&Buffer, CTy->getTypeDerivedFrom());
Devang Patel161b2f42011-04-12 23:21:44 +00001515
1516 // Get an anonymous type for index type.
Eric Christopher8cab6ed2013-01-04 21:51:53 +00001517 // FIXME: This type should be passed down from the front end
1518 // as different languages may have different sizes for indexes.
Devang Patel161b2f42011-04-12 23:21:44 +00001519 DIE *IdxTy = getIndexTyDie();
1520 if (!IdxTy) {
1521 // Construct an anonymous type for index type.
1522 IdxTy = new DIE(dwarf::DW_TAG_base_type);
Eric Christopher8cab6ed2013-01-04 21:51:53 +00001523 addString(IdxTy, dwarf::DW_AT_name, "int");
Devang Patel161b2f42011-04-12 23:21:44 +00001524 addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1525 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1526 dwarf::DW_ATE_signed);
1527 addDie(IdxTy);
1528 setIndexTyDie(IdxTy);
1529 }
1530
1531 // Add subranges to array type.
Eric Christopherdc1363f2013-08-08 07:40:37 +00001532 DIArray Elements = CTy->getTypeArray();
Devang Patel161b2f42011-04-12 23:21:44 +00001533 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1534 DIDescriptor Element = Elements.getElement(i);
1535 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1536 constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1537 }
1538}
1539
1540/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
1541DIE *CompileUnit::constructEnumTypeDIE(DIEnumerator ETy) {
1542 DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
1543 StringRef Name = ETy.getName();
Nick Lewycky390c40d2011-10-27 06:44:11 +00001544 addString(Enumerator, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001545 int64_t Value = ETy.getEnumValue();
1546 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
1547 return Enumerator;
1548}
1549
Devang Pateldbc64af2011-08-15 17:24:54 +00001550/// constructContainingTypeDIEs - Construct DIEs for types that contain
1551/// vtables.
1552void CompileUnit::constructContainingTypeDIEs() {
1553 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
1554 CE = ContainingTypeMap.end(); CI != CE; ++CI) {
1555 DIE *SPDie = CI->first;
1556 const MDNode *N = CI->second;
1557 if (!N) continue;
1558 DIE *NDie = getDIE(N);
1559 if (!NDie) continue;
1560 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
1561 }
1562}
1563
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001564/// constructVariableDIE - Construct a DIE for the given DbgVariable.
Eric Christopherf61dbc12013-06-24 21:07:27 +00001565DIE *CompileUnit::constructVariableDIE(DbgVariable *DV,
1566 bool isScopeAbstract) {
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001567 StringRef Name = DV->getName();
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001568
1569 // Translate tag to proper Dwarf tag.
Eric Christopher31667622013-08-08 01:41:00 +00001570 uint16_t Tag = DV->getTag();
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001571
1572 // Define variable debug information entry.
1573 DIE *VariableDie = new DIE(Tag);
1574 DbgVariable *AbsVar = DV->getAbstractVariable();
1575 DIE *AbsDIE = AbsVar ? AbsVar->getDIE() : NULL;
Manman Ren742671b2013-05-29 17:16:59 +00001576 if (AbsDIE)
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001577 addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
Manman Ren742671b2013-05-29 17:16:59 +00001578 dwarf::DW_FORM_ref4, AbsDIE);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001579 else {
Nick Lewycky390c40d2011-10-27 06:44:11 +00001580 addString(VariableDie, dwarf::DW_AT_name, Name);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001581 addSourceLine(VariableDie, DV->getVariable());
1582 addType(VariableDie, DV->getType());
1583 }
1584
1585 if (DV->isArtificial())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001586 addFlag(VariableDie, dwarf::DW_AT_artificial);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001587
1588 if (isScopeAbstract) {
1589 DV->setDIE(VariableDie);
1590 return VariableDie;
1591 }
1592
1593 // Add variable address.
1594
1595 unsigned Offset = DV->getDotDebugLocOffset();
1596 if (Offset != ~0U) {
Eric Christopherafbe0e22013-06-24 21:34:55 +00001597 addLabel(VariableDie, dwarf::DW_AT_location, dwarf::DW_FORM_data4,
1598 Asm->GetTempSymbol("debug_loc", Offset));
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001599 DV->setDIE(VariableDie);
1600 return VariableDie;
1601 }
1602
Eric Christopher8cf5e742011-10-03 15:49:20 +00001603 // Check if variable is described by a DBG_VALUE instruction.
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001604 if (const MachineInstr *DVInsn = DV->getMInsn()) {
David Blaikie6d9dbd52013-06-16 20:34:15 +00001605 assert(DVInsn->getNumOperands() == 3);
1606 if (DVInsn->getOperand(0).isReg()) {
1607 const MachineOperand RegOp = DVInsn->getOperand(0);
Adrian Prantlb2754912013-07-09 21:44:06 +00001608 // If the second operand is an immediate, this is an indirect value.
Adrian Prantl35176402013-07-09 20:28:37 +00001609 if (DVInsn->getOperand(1).isImm()) {
1610 MachineLocation Location(RegOp.getReg(), DVInsn->getOperand(1).getImm());
Eric Christopherf61dbc12013-06-24 21:07:27 +00001611 addVariableAddress(*DV, VariableDie, Location);
David Blaikie6d9dbd52013-06-16 20:34:15 +00001612 } else if (RegOp.getReg())
Eric Christopherf61dbc12013-06-24 21:07:27 +00001613 addVariableAddress(*DV, VariableDie, MachineLocation(RegOp.getReg()));
David Blaikie6d9dbd52013-06-16 20:34:15 +00001614 } else if (DVInsn->getOperand(0).isImm())
Eric Christophere4721492013-07-03 01:08:30 +00001615 addConstantValue(VariableDie, DVInsn->getOperand(0), DV->getType());
David Blaikie6d9dbd52013-06-16 20:34:15 +00001616 else if (DVInsn->getOperand(0).isFPImm())
Eric Christophere4721492013-07-03 01:08:30 +00001617 addConstantFPValue(VariableDie, DVInsn->getOperand(0));
David Blaikie6d9dbd52013-06-16 20:34:15 +00001618 else if (DVInsn->getOperand(0).isCImm())
Eric Christophere4721492013-07-03 01:08:30 +00001619 addConstantValue(VariableDie, DVInsn->getOperand(0).getCImm(),
1620 DV->getType().isUnsignedDIType());
1621
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001622 DV->setDIE(VariableDie);
1623 return VariableDie;
1624 } else {
1625 // .. else use frame index.
1626 int FI = DV->getFrameIndex();
1627 if (FI != ~0) {
1628 unsigned FrameReg = 0;
1629 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
Eric Christopher8b4310b2012-11-21 00:34:38 +00001630 int Offset =
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001631 TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
1632 MachineLocation Location(FrameReg, Offset);
Eric Christopherf61dbc12013-06-24 21:07:27 +00001633 addVariableAddress(*DV, VariableDie, Location);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001634 }
1635 }
1636
1637 DV->setDIE(VariableDie);
1638 return VariableDie;
1639}
1640
Devang Patel161b2f42011-04-12 23:21:44 +00001641/// createMemberDIE - Create new member DIE.
1642DIE *CompileUnit::createMemberDIE(DIDerivedType DT) {
1643 DIE *MemberDie = new DIE(DT.getTag());
1644 StringRef Name = DT.getName();
1645 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001646 addString(MemberDie, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001647
1648 addType(MemberDie, DT.getTypeDerivedFrom());
1649
1650 addSourceLine(MemberDie, DT);
1651
1652 DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
1653 addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1654
1655 uint64_t Size = DT.getSizeInBits();
1656 uint64_t FieldSize = DT.getOriginalTypeSize();
1657
1658 if (Size != FieldSize) {
1659 // Handle bitfield.
1660 addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
1661 addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1662
1663 uint64_t Offset = DT.getOffsetInBits();
1664 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1665 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1666 uint64_t FieldOffset = (HiMark - FieldSize);
1667 Offset -= FieldOffset;
1668
1669 // Maybe we need to work from the other end.
Micah Villmow3574eca2012-10-08 16:38:25 +00001670 if (Asm->getDataLayout().isLittleEndian())
Devang Patel161b2f42011-04-12 23:21:44 +00001671 Offset = FieldSize - (Offset + Size);
1672 addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
1673
1674 // Here WD_AT_data_member_location points to the anonymous
1675 // field that includes this bit field.
1676 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
1677
1678 } else
1679 // This is not a bitfield.
1680 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1681
1682 if (DT.getTag() == dwarf::DW_TAG_inheritance
1683 && DT.isVirtual()) {
1684
1685 // For C++, virtual base classes are not at fixed offset. Use following
1686 // expression to extract appropriate offset from vtable.
1687 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1688
1689 DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
1690 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1691 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1692 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1693 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1694 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1695 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1696 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1697
1698 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
1699 VBaseLocationDie);
1700 } else
1701 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
1702
1703 if (DT.isProtected())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001704 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001705 dwarf::DW_ACCESS_protected);
1706 else if (DT.isPrivate())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001707 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001708 dwarf::DW_ACCESS_private);
1709 // Otherwise C++ member and base classes are considered public.
Eric Christopher8b4310b2012-11-21 00:34:38 +00001710 else
Nick Lewycky13aaca52011-12-13 05:09:11 +00001711 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001712 dwarf::DW_ACCESS_public);
1713 if (DT.isVirtual())
Nick Lewycky798313d2011-12-14 00:56:07 +00001714 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001715 dwarf::DW_VIRTUALITY_virtual);
Devang Patele9db5e22011-04-16 00:11:51 +00001716
1717 // Objective-C properties.
Devang Patel6588abf2012-02-06 17:49:43 +00001718 if (MDNode *PNode = DT.getObjCProperty())
1719 if (DIEEntry *PropertyDie = getDIEEntry(PNode))
Eric Christopher8b4310b2012-11-21 00:34:38 +00001720 MemberDie->addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4,
Devang Patel6588abf2012-02-06 17:49:43 +00001721 PropertyDie);
1722
David Blaikie01bc2b32012-12-13 22:43:07 +00001723 if (DT.isArtificial())
1724 addFlag(MemberDie, dwarf::DW_AT_artificial);
1725
Devang Patel161b2f42011-04-12 23:21:44 +00001726 return MemberDie;
1727}
Eric Christopher6b6061f2013-01-16 01:22:23 +00001728
1729/// createStaticMemberDIE - Create new DIE for C++ static member.
1730DIE *CompileUnit::createStaticMemberDIE(const DIDerivedType DT) {
1731 if (!DT.Verify())
1732 return NULL;
1733
1734 DIE *StaticMemberDIE = new DIE(DT.getTag());
1735 DIType Ty = DT.getTypeDerivedFrom();
1736
1737 addString(StaticMemberDIE, dwarf::DW_AT_name, DT.getName());
1738 addType(StaticMemberDIE, Ty);
1739 addSourceLine(StaticMemberDIE, DT);
1740 addFlag(StaticMemberDIE, dwarf::DW_AT_external);
1741 addFlag(StaticMemberDIE, dwarf::DW_AT_declaration);
1742
1743 // FIXME: We could omit private if the parent is a class_type, and
1744 // public if the parent is something else.
1745 if (DT.isProtected())
1746 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1747 dwarf::DW_ACCESS_protected);
1748 else if (DT.isPrivate())
1749 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1750 dwarf::DW_ACCESS_private);
1751 else
1752 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1753 dwarf::DW_ACCESS_public);
1754
1755 if (const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(DT.getConstant()))
1756 addConstantValue(StaticMemberDIE, CI, Ty.isUnsignedDIType());
David Blaikie14268412013-01-20 01:18:01 +00001757 if (const ConstantFP *CFP = dyn_cast_or_null<ConstantFP>(DT.getConstant()))
1758 addConstantFPValue(StaticMemberDIE, CFP);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001759
1760 insertDIE(DT, StaticMemberDIE);
1761 return StaticMemberDIE;
1762}