blob: 703e2c12d8d26196248ca109ef944dc8dbe03d90 [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"
David Blaikie1d361132013-10-30 20:42:41 +000025#include "llvm/MC/MCSection.h"
26#include "llvm/MC/MCStreamer.h"
Devang Patel6f9d8ff2011-08-15 17:57:41 +000027#include "llvm/Target/Mangler.h"
Devang Patel161b2f42011-04-12 23:21:44 +000028#include "llvm/Target/TargetFrameLowering.h"
29#include "llvm/Target/TargetMachine.h"
David Blaikie59eaa382013-06-28 20:05:11 +000030#include "llvm/Target/TargetLoweringObjectFile.h"
Devang Patel161b2f42011-04-12 23:21:44 +000031#include "llvm/Target/TargetRegisterInfo.h"
Devang Patel161b2f42011-04-12 23:21:44 +000032
33using namespace llvm;
34
35/// CompileUnit - Compile unit constructor.
Eric Christopher7b878952013-08-26 23:50:38 +000036CompileUnit::CompileUnit(unsigned UID, DIE *D, const MDNode *N, AsmPrinter *A,
37 DwarfDebug *DW, DwarfUnits *DWU)
Manman Ren3eabc2a2013-10-29 22:57:10 +000038 : UniqueID(UID), Node(N), CUDie(D), Asm(A), DD(DW), DU(DWU), IndexTyDie(0),
39 DebugInfoOffset(0) {
Devang Patel161b2f42011-04-12 23:21:44 +000040 DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
Eric Christopher9c57ad22013-05-08 00:58:51 +000041 insertDIE(N, D);
Devang Patel161b2f42011-04-12 23:21:44 +000042}
43
44/// ~CompileUnit - Destructor for compile unit.
45CompileUnit::~CompileUnit() {
46 for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
47 DIEBlocks[j]->~DIEBlock();
48}
49
50/// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
51/// information entry.
52DIEEntry *CompileUnit::createDIEEntry(DIE *Entry) {
53 DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
54 return Value;
55}
56
Bill Wendling6afe4782012-12-06 07:55:19 +000057/// getDefaultLowerBound - Return the default lower bound for an array. If the
Bill Wendling222c2fd2012-12-06 07:38:10 +000058/// DWARF version doesn't handle the language, return -1.
Bill Wendling6afe4782012-12-06 07:55:19 +000059int64_t CompileUnit::getDefaultLowerBound() const {
Eric Christopher7b878952013-08-26 23:50:38 +000060 switch (DICompileUnit(Node).getLanguage()) {
Bill Wendling222c2fd2012-12-06 07:38:10 +000061 default:
62 break;
63
64 case dwarf::DW_LANG_C89:
65 case dwarf::DW_LANG_C99:
66 case dwarf::DW_LANG_C:
67 case dwarf::DW_LANG_C_plus_plus:
68 case dwarf::DW_LANG_ObjC:
69 case dwarf::DW_LANG_ObjC_plus_plus:
70 return 0;
71
72 case dwarf::DW_LANG_Fortran77:
73 case dwarf::DW_LANG_Fortran90:
74 case dwarf::DW_LANG_Fortran95:
75 return 1;
76
77 // The languages below have valid values only if the DWARF version >= 4.
78 case dwarf::DW_LANG_Java:
79 case dwarf::DW_LANG_Python:
80 case dwarf::DW_LANG_UPC:
81 case dwarf::DW_LANG_D:
82 if (dwarf::DWARF_VERSION >= 4)
83 return 0;
84 break;
85
86 case dwarf::DW_LANG_Ada83:
87 case dwarf::DW_LANG_Ada95:
88 case dwarf::DW_LANG_Cobol74:
89 case dwarf::DW_LANG_Cobol85:
90 case dwarf::DW_LANG_Modula2:
91 case dwarf::DW_LANG_Pascal83:
92 case dwarf::DW_LANG_PLI:
93 if (dwarf::DWARF_VERSION >= 4)
94 return 1;
95 break;
96 }
97
98 return -1;
99}
100
Eric Christopher873cf0a2012-08-24 01:14:27 +0000101/// addFlag - Add a flag that is true.
David Blaikie770530b2013-10-21 17:28:37 +0000102void CompileUnit::addFlag(DIE *Die, dwarf::Attribute Attribute) {
Michael Gottesmandc42d032013-09-04 04:39:38 +0000103 if (DD->getDwarfVersion() >= 4)
Eric Christopher9c0c9482013-10-04 22:40:05 +0000104 Die->addValue(Attribute, dwarf::DW_FORM_flag_present, DIEIntegerOne);
Eric Christopher873cf0a2012-08-24 01:14:27 +0000105 else
Eric Christopher9c0c9482013-10-04 22:40:05 +0000106 Die->addValue(Attribute, dwarf::DW_FORM_flag, DIEIntegerOne);
Eric Christopher873cf0a2012-08-24 01:14:27 +0000107}
108
Devang Patel161b2f42011-04-12 23:21:44 +0000109/// addUInt - Add an unsigned integer attribute data and value.
110///
David Blaikie770530b2013-10-21 17:28:37 +0000111void CompileUnit::addUInt(DIE *Die, dwarf::Attribute Attribute,
112 Optional<dwarf::Form> Form, uint64_t Integer) {
Eric Christopher6efc0432013-10-19 01:04:47 +0000113 if (!Form)
114 Form = DIEInteger::BestForm(false, Integer);
115 DIEValue *Value = Integer == 1 ? DIEIntegerOne : new (DIEValueAllocator)
116 DIEInteger(Integer);
David Blaikie770530b2013-10-21 17:28:37 +0000117 Die->addValue(Attribute, *Form, Value);
118}
119
120void CompileUnit::addUInt(DIEBlock *Block, dwarf::Form Form, uint64_t Integer) {
121 addUInt(Block, (dwarf::Attribute)0, Form, Integer);
Devang Patel161b2f42011-04-12 23:21:44 +0000122}
123
124/// addSInt - Add an signed integer attribute data and value.
125///
David Blaikie770530b2013-10-21 17:28:37 +0000126void CompileUnit::addSInt(DIE *Die, dwarf::Attribute Attribute,
127 Optional<dwarf::Form> Form, int64_t Integer) {
Eric Christopher6efc0432013-10-19 01:04:47 +0000128 if (!Form)
129 Form = DIEInteger::BestForm(true, Integer);
Devang Patel161b2f42011-04-12 23:21:44 +0000130 DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
David Blaikie770530b2013-10-21 17:28:37 +0000131 Die->addValue(Attribute, *Form, Value);
132}
133
134void CompileUnit::addSInt(DIEBlock *Die, Optional<dwarf::Form> Form,
135 int64_t Integer) {
136 addSInt(Die, (dwarf::Attribute)0, Form, Integer);
Devang Patel161b2f42011-04-12 23:21:44 +0000137}
138
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000139/// addString - Add a string attribute data and value. We always emit a
140/// reference to the string pool instead of immediate strings so that DIEs have
Eric Christopher3cc42202013-01-07 19:32:45 +0000141/// more predictable sizes. In the case of split dwarf we emit an index
142/// into another table which gets us the static offset into the string
143/// table.
David Blaikie770530b2013-10-21 17:28:37 +0000144void CompileUnit::addString(DIE *Die, dwarf::Attribute Attribute, StringRef String) {
Eric Christopher3dee5752013-07-26 17:02:41 +0000145 DIEValue *Value;
David Blaikie770530b2013-10-21 17:28:37 +0000146 dwarf::Form Form;
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000147 if (!DD->useSplitDwarf()) {
148 MCSymbol *Symb = DU->getStringPoolEntry(String);
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000149 if (Asm->needsRelocationsForDwarfStringPool())
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000150 Value = new (DIEValueAllocator) DIELabel(Symb);
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000151 else {
152 MCSymbol *StringPool = DU->getStringPoolSym();
153 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
154 }
Eric Christopher3dee5752013-07-26 17:02:41 +0000155 Form = dwarf::DW_FORM_strp;
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000156 } else {
157 unsigned idx = DU->getStringPoolIndex(String);
Eric Christopher3dee5752013-07-26 17:02:41 +0000158 Value = new (DIEValueAllocator) DIEInteger(idx);
159 Form = dwarf::DW_FORM_GNU_str_index;
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000160 }
Eric Christopher3dee5752013-07-26 17:02:41 +0000161 DIEValue *Str = new (DIEValueAllocator) DIEString(Value, String);
162 Die->addValue(Attribute, Form, Str);
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000163}
164
165/// addLocalString - Add a string attribute data and value. This is guaranteed
166/// to be in the local string pool instead of indirected.
David Blaikie770530b2013-10-21 17:28:37 +0000167void CompileUnit::addLocalString(DIE *Die, dwarf::Attribute Attribute,
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000168 StringRef String) {
Eric Christopher2e5d8702012-12-20 21:58:36 +0000169 MCSymbol *Symb = DU->getStringPoolEntry(String);
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000170 DIEValue *Value;
171 if (Asm->needsRelocationsForDwarfStringPool())
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000172 Value = new (DIEValueAllocator) DIELabel(Symb);
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000173 else {
Eric Christopher2e5d8702012-12-20 21:58:36 +0000174 MCSymbol *StringPool = DU->getStringPoolSym();
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000175 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
Nick Lewycky390c40d2011-10-27 06:44:11 +0000176 }
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000177 Die->addValue(Attribute, dwarf::DW_FORM_strp, Value);
Devang Patel161b2f42011-04-12 23:21:44 +0000178}
179
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000180/// addExpr - Add a Dwarf expression attribute data and value.
Devang Patel161b2f42011-04-12 23:21:44 +0000181///
David Blaikie770530b2013-10-21 17:28:37 +0000182void CompileUnit::addExpr(DIEBlock *Die, dwarf::Form Form, const MCExpr *Expr) {
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000183 DIEValue *Value = new (DIEValueAllocator) DIEExpr(Expr);
David Blaikie770530b2013-10-21 17:28:37 +0000184 Die->addValue((dwarf::Attribute)0, Form, Value);
Devang Patel161b2f42011-04-12 23:21:44 +0000185}
186
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000187/// addLabel - Add a Dwarf label attribute data and value.
188///
David Blaikie770530b2013-10-21 17:28:37 +0000189void CompileUnit::addLabel(DIE *Die, dwarf::Attribute Attribute, dwarf::Form Form,
David Blaikie95e72c92013-06-28 20:05:04 +0000190 const MCSymbol *Label) {
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000191 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
192 Die->addValue(Attribute, Form, Value);
David Blaikie95e72c92013-06-28 20:05:04 +0000193}
194
David Blaikie770530b2013-10-21 17:28:37 +0000195void CompileUnit::addLabel(DIEBlock *Die, dwarf::Form Form,
196 const MCSymbol *Label) {
197 addLabel(Die, (dwarf::Attribute)0, Form, Label);
198}
199
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000200/// addLabelAddress - Add a dwarf label attribute data and value using
201/// DW_FORM_addr or DW_FORM_GNU_addr_index.
202///
David Blaikie770530b2013-10-21 17:28:37 +0000203void CompileUnit::addLabelAddress(DIE *Die, dwarf::Attribute Attribute,
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000204 MCSymbol *Label) {
Alexey Samsonov9d08d692013-10-03 08:54:43 +0000205 if (Label)
206 DD->addArangeLabel(SymbolCU(this, Label));
Richard Mitton5cc319a2013-09-19 23:21:01 +0000207
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000208 if (!DD->useSplitDwarf()) {
209 if (Label != NULL) {
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000210 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000211 Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
212 } else {
213 DIEValue *Value = new (DIEValueAllocator) DIEInteger(0);
214 Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
215 }
216 } else {
217 unsigned idx = DU->getAddrPoolIndex(Label);
218 DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx);
219 Die->addValue(Attribute, dwarf::DW_FORM_GNU_addr_index, Value);
220 }
221}
222
Eric Christopher0969ddf2013-01-18 22:11:33 +0000223/// addOpAddress - Add a dwarf op address data and value using the
224/// form given and an op of either DW_FORM_addr or DW_FORM_GNU_addr_index.
225///
David Blaikie770530b2013-10-21 17:28:37 +0000226void CompileUnit::addOpAddress(DIEBlock *Die, const MCSymbol *Sym) {
Alexey Samsonov9d08d692013-10-03 08:54:43 +0000227 DD->addArangeLabel(SymbolCU(this, Sym));
Eric Christopher0969ddf2013-01-18 22:11:33 +0000228 if (!DD->useSplitDwarf()) {
David Blaikie770530b2013-10-21 17:28:37 +0000229 addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
230 addLabel(Die, dwarf::DW_FORM_udata, Sym);
Eric Christopher0969ddf2013-01-18 22:11:33 +0000231 } else {
David Blaikie770530b2013-10-21 17:28:37 +0000232 addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_addr_index);
233 addUInt(Die, dwarf::DW_FORM_GNU_addr_index, DU->getAddrPoolIndex(Sym));
Eric Christopher0969ddf2013-01-18 22:11:33 +0000234 }
235}
236
Devang Patel161b2f42011-04-12 23:21:44 +0000237/// addDelta - Add a label delta attribute data and value.
238///
David Blaikie770530b2013-10-21 17:28:37 +0000239void CompileUnit::addDelta(DIE *Die, dwarf::Attribute Attribute, dwarf::Form Form,
Devang Patel161b2f42011-04-12 23:21:44 +0000240 const MCSymbol *Hi, const MCSymbol *Lo) {
241 DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
242 Die->addValue(Attribute, Form, Value);
243}
244
245/// addDIEEntry - Add a DIE attribute data and value.
246///
David Blaikie770530b2013-10-21 17:28:37 +0000247void CompileUnit::addDIEEntry(DIE *Die, dwarf::Attribute Attribute, DIE *Entry) {
Manman Ren87b110a2013-10-11 23:58:05 +0000248 // We currently only use ref4.
249 Die->addValue(Attribute, dwarf::DW_FORM_ref4, createDIEEntry(Entry));
Devang Patel161b2f42011-04-12 23:21:44 +0000250}
251
Manman Ren1a5e7872013-10-29 00:53:03 +0000252/// Create a DIE with the given Tag, add the DIE to its parent, and
253/// call insertDIE if MD is not null.
254DIE *CompileUnit::createAndAddDIE(unsigned Tag, DIE &Parent, const MDNode *MD) {
255 DIE *Die = new DIE(Tag);
256 Parent.addChild(Die);
257 if (MD)
258 insertDIE(MD, Die);
259 return Die;
260}
261
Devang Patel161b2f42011-04-12 23:21:44 +0000262/// addBlock - Add block data.
263///
David Blaikie770530b2013-10-21 17:28:37 +0000264void CompileUnit::addBlock(DIE *Die, dwarf::Attribute Attribute,
Devang Patel161b2f42011-04-12 23:21:44 +0000265 DIEBlock *Block) {
266 Block->ComputeSize(Asm);
267 DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
268 Die->addValue(Attribute, Block->BestForm(), Block);
269}
270
271/// addSourceLine - Add location information to specified debug information
272/// entry.
273void CompileUnit::addSourceLine(DIE *Die, DIVariable V) {
274 // Verify variable.
Manman Rend03d2b22013-07-08 18:33:29 +0000275 if (!V.isVariable())
Devang Patel161b2f42011-04-12 23:21:44 +0000276 return;
Eric Christopher8b4310b2012-11-21 00:34:38 +0000277
Devang Patel161b2f42011-04-12 23:21:44 +0000278 unsigned Line = V.getLineNumber();
279 if (Line == 0)
280 return;
Eric Christopher6efc0432013-10-19 01:04:47 +0000281 unsigned FileID =
282 DD->getOrCreateSourceID(V.getContext().getFilename(),
283 V.getContext().getDirectory(), getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000284 assert(FileID && "Invalid file id");
David Blaikie770530b2013-10-21 17:28:37 +0000285 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
286 addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
Devang Patel161b2f42011-04-12 23:21:44 +0000287}
288
289/// addSourceLine - Add location information to specified debug information
290/// entry.
291void CompileUnit::addSourceLine(DIE *Die, DIGlobalVariable G) {
292 // Verify global variable.
Manman Rend03d2b22013-07-08 18:33:29 +0000293 if (!G.isGlobalVariable())
Devang Patel161b2f42011-04-12 23:21:44 +0000294 return;
295
296 unsigned Line = G.getLineNumber();
297 if (Line == 0)
298 return;
Eric Christopher6efc0432013-10-19 01:04:47 +0000299 unsigned FileID =
300 DD->getOrCreateSourceID(G.getFilename(), G.getDirectory(), getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000301 assert(FileID && "Invalid file id");
David Blaikie770530b2013-10-21 17:28:37 +0000302 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
303 addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
Devang Patel161b2f42011-04-12 23:21:44 +0000304}
305
306/// addSourceLine - Add location information to specified debug information
307/// entry.
308void CompileUnit::addSourceLine(DIE *Die, DISubprogram SP) {
309 // Verify subprogram.
Manman Rend03d2b22013-07-08 18:33:29 +0000310 if (!SP.isSubprogram())
Devang Patel161b2f42011-04-12 23:21:44 +0000311 return;
Eric Christopher2125d5a2012-03-15 23:55:40 +0000312
Devang Patel161b2f42011-04-12 23:21:44 +0000313 // If the line number is 0, don't add it.
Eric Christopher2125d5a2012-03-15 23:55:40 +0000314 unsigned Line = SP.getLineNumber();
315 if (Line == 0)
Devang Patel161b2f42011-04-12 23:21:44 +0000316 return;
317
Eric Christopher6efc0432013-10-19 01:04:47 +0000318 unsigned FileID = DD->getOrCreateSourceID(SP.getFilename(), SP.getDirectory(),
319 getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000320 assert(FileID && "Invalid file id");
David Blaikie770530b2013-10-21 17:28:37 +0000321 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
322 addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
Devang Patel161b2f42011-04-12 23:21:44 +0000323}
324
325/// addSourceLine - Add location information to specified debug information
326/// entry.
327void CompileUnit::addSourceLine(DIE *Die, DIType Ty) {
328 // Verify type.
Manman Rend03d2b22013-07-08 18:33:29 +0000329 if (!Ty.isType())
Devang Patel161b2f42011-04-12 23:21:44 +0000330 return;
331
332 unsigned Line = Ty.getLineNumber();
Eric Christopher2125d5a2012-03-15 23:55:40 +0000333 if (Line == 0)
Devang Patel161b2f42011-04-12 23:21:44 +0000334 return;
Eric Christopher6efc0432013-10-19 01:04:47 +0000335 unsigned FileID = DD->getOrCreateSourceID(Ty.getFilename(), Ty.getDirectory(),
336 getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000337 assert(FileID && "Invalid file id");
David Blaikie770530b2013-10-21 17:28:37 +0000338 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
339 addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
Devang Patel161b2f42011-04-12 23:21:44 +0000340}
341
342/// addSourceLine - Add location information to specified debug information
343/// entry.
Eric Christopherb8ca9882012-03-29 08:42:56 +0000344void CompileUnit::addSourceLine(DIE *Die, DIObjCProperty Ty) {
345 // Verify type.
Manman Rend03d2b22013-07-08 18:33:29 +0000346 if (!Ty.isObjCProperty())
Eric Christopherb8ca9882012-03-29 08:42:56 +0000347 return;
348
349 unsigned Line = Ty.getLineNumber();
350 if (Line == 0)
351 return;
352 DIFile File = Ty.getFile();
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000353 unsigned FileID = DD->getOrCreateSourceID(File.getFilename(),
Manman Ren3de61b42013-03-07 01:42:00 +0000354 File.getDirectory(), getUniqueID());
Eric Christopherb8ca9882012-03-29 08:42:56 +0000355 assert(FileID && "Invalid file id");
David Blaikie770530b2013-10-21 17:28:37 +0000356 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
357 addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
Eric Christopherb8ca9882012-03-29 08:42:56 +0000358}
359
360/// addSourceLine - Add location information to specified debug information
361/// entry.
Devang Patel161b2f42011-04-12 23:21:44 +0000362void CompileUnit::addSourceLine(DIE *Die, DINameSpace NS) {
363 // Verify namespace.
364 if (!NS.Verify())
365 return;
366
367 unsigned Line = NS.getLineNumber();
368 if (Line == 0)
369 return;
370 StringRef FN = NS.getFilename();
371
Eric Christopher6efc0432013-10-19 01:04:47 +0000372 unsigned FileID =
373 DD->getOrCreateSourceID(FN, NS.getDirectory(), getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000374 assert(FileID && "Invalid file id");
David Blaikie770530b2013-10-21 17:28:37 +0000375 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
376 addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
Devang Patel161b2f42011-04-12 23:21:44 +0000377}
378
Eric Christopher8b4310b2012-11-21 00:34:38 +0000379/// addVariableAddress - Add DW_AT_location attribute for a
Devang Patele1cdf842011-04-27 22:45:24 +0000380/// DbgVariable based on provided MachineLocation.
Eric Christopherf61dbc12013-06-24 21:07:27 +0000381void CompileUnit::addVariableAddress(const DbgVariable &DV, DIE *Die,
Devang Patele1cdf842011-04-27 22:45:24 +0000382 MachineLocation Location) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000383 if (DV.variableHasComplexAddress())
Devang Patel161b2f42011-04-12 23:21:44 +0000384 addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
Eric Christopherf61dbc12013-06-24 21:07:27 +0000385 else if (DV.isBlockByrefVariable())
Devang Patel161b2f42011-04-12 23:21:44 +0000386 addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location);
387 else
David Blaikie4532c282013-06-20 00:25:24 +0000388 addAddress(Die, dwarf::DW_AT_location, Location,
Eric Christopherf61dbc12013-06-24 21:07:27 +0000389 DV.getVariable().isIndirect());
Devang Patel161b2f42011-04-12 23:21:44 +0000390}
391
Devang Patel116da2f2011-04-26 19:06:18 +0000392/// addRegisterOp - Add register operand.
David Blaikie770530b2013-10-21 17:28:37 +0000393void CompileUnit::addRegisterOp(DIEBlock *TheDie, unsigned Reg) {
Devang Patel116da2f2011-04-26 19:06:18 +0000394 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
395 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
396 if (DWReg < 32)
David Blaikie770530b2013-10-21 17:28:37 +0000397 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + DWReg);
Devang Patel116da2f2011-04-26 19:06:18 +0000398 else {
David Blaikie770530b2013-10-21 17:28:37 +0000399 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
400 addUInt(TheDie, dwarf::DW_FORM_udata, DWReg);
Devang Patel116da2f2011-04-26 19:06:18 +0000401 }
402}
403
404/// addRegisterOffset - Add register offset.
David Blaikie770530b2013-10-21 17:28:37 +0000405void CompileUnit::addRegisterOffset(DIEBlock *TheDie, unsigned Reg,
406 int64_t Offset) {
Devang Patel116da2f2011-04-26 19:06:18 +0000407 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
408 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
409 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
410 if (Reg == TRI->getFrameRegister(*Asm->MF))
411 // If variable offset is based in frame register then use fbreg.
David Blaikie770530b2013-10-21 17:28:37 +0000412 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
Devang Patel116da2f2011-04-26 19:06:18 +0000413 else if (DWReg < 32)
David Blaikie770530b2013-10-21 17:28:37 +0000414 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DWReg);
Devang Patel116da2f2011-04-26 19:06:18 +0000415 else {
David Blaikie770530b2013-10-21 17:28:37 +0000416 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
417 addUInt(TheDie, dwarf::DW_FORM_udata, DWReg);
Devang Patel116da2f2011-04-26 19:06:18 +0000418 }
David Blaikie770530b2013-10-21 17:28:37 +0000419 addSInt(TheDie, dwarf::DW_FORM_sdata, Offset);
Devang Patel116da2f2011-04-26 19:06:18 +0000420}
421
422/// addAddress - Add an address attribute to a die based on the location
423/// provided.
David Blaikie770530b2013-10-21 17:28:37 +0000424void CompileUnit::addAddress(DIE *Die, dwarf::Attribute Attribute,
David Blaikie4532c282013-06-20 00:25:24 +0000425 const MachineLocation &Location, bool Indirect) {
Devang Patel116da2f2011-04-26 19:06:18 +0000426 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
427
David Blaikie4532c282013-06-20 00:25:24 +0000428 if (Location.isReg() && !Indirect)
Devang Patel116da2f2011-04-26 19:06:18 +0000429 addRegisterOp(Block, Location.getReg());
David Blaikie4532c282013-06-20 00:25:24 +0000430 else {
Devang Patel116da2f2011-04-26 19:06:18 +0000431 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
David Blaikie4532c282013-06-20 00:25:24 +0000432 if (Indirect && !Location.isReg()) {
David Blaikie770530b2013-10-21 17:28:37 +0000433 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
David Blaikie4532c282013-06-20 00:25:24 +0000434 }
435 }
Devang Patel116da2f2011-04-26 19:06:18 +0000436
437 // Now attach the location information to the DIE.
David Blaikie770530b2013-10-21 17:28:37 +0000438 addBlock(Die, Attribute, Block);
Devang Patel116da2f2011-04-26 19:06:18 +0000439}
440
Devang Patel161b2f42011-04-12 23:21:44 +0000441/// addComplexAddress - Start with the address based on the location provided,
442/// and generate the DWARF information necessary to find the actual variable
443/// given the extra address information encoded in the DIVariable, starting from
444/// the starting location. Add the DWARF information to the die.
445///
Eric Christopherf61dbc12013-06-24 21:07:27 +0000446void CompileUnit::addComplexAddress(const DbgVariable &DV, DIE *Die,
David Blaikie770530b2013-10-21 17:28:37 +0000447 dwarf::Attribute Attribute,
Devang Patel161b2f42011-04-12 23:21:44 +0000448 const MachineLocation &Location) {
Devang Patel161b2f42011-04-12 23:21:44 +0000449 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Eric Christopherf61dbc12013-06-24 21:07:27 +0000450 unsigned N = DV.getNumAddrElements();
Devang Patelc26f5442011-04-28 02:22:40 +0000451 unsigned i = 0;
452 if (Location.isReg()) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000453 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
Devang Patelc26f5442011-04-28 02:22:40 +0000454 // If first address element is OpPlus then emit
455 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
Eric Christopherf61dbc12013-06-24 21:07:27 +0000456 addRegisterOffset(Block, Location.getReg(), DV.getAddrElement(1));
Devang Patelc26f5442011-04-28 02:22:40 +0000457 i = 2;
458 } else
459 addRegisterOp(Block, Location.getReg());
Eric Christopher6efc0432013-10-19 01:04:47 +0000460 } else
Devang Patel116da2f2011-04-26 19:06:18 +0000461 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel161b2f42011-04-12 23:21:44 +0000462
Eric Christopher6efc0432013-10-19 01:04:47 +0000463 for (; i < N; ++i) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000464 uint64_t Element = DV.getAddrElement(i);
Devang Patel161b2f42011-04-12 23:21:44 +0000465 if (Element == DIBuilder::OpPlus) {
David Blaikie770530b2013-10-21 17:28:37 +0000466 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
467 addUInt(Block, dwarf::DW_FORM_udata, DV.getAddrElement(++i));
Devang Patel161b2f42011-04-12 23:21:44 +0000468 } else if (Element == DIBuilder::OpDeref) {
Eric Christopher50120762012-05-08 18:56:00 +0000469 if (!Location.isReg())
David Blaikie770530b2013-10-21 17:28:37 +0000470 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Eric Christopher6efc0432013-10-19 01:04:47 +0000471 } else
472 llvm_unreachable("unknown DIBuilder Opcode");
Devang Patel161b2f42011-04-12 23:21:44 +0000473 }
474
475 // Now attach the location information to the DIE.
David Blaikie770530b2013-10-21 17:28:37 +0000476 addBlock(Die, Attribute, Block);
Devang Patel161b2f42011-04-12 23:21:44 +0000477}
478
479/* Byref variables, in Blocks, are declared by the programmer as "SomeType
480 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
481 gives the variable VarName either the struct, or a pointer to the struct, as
482 its type. This is necessary for various behind-the-scenes things the
483 compiler needs to do with by-reference variables in Blocks.
484
485 However, as far as the original *programmer* is concerned, the variable
486 should still have type 'SomeType', as originally declared.
487
488 The function getBlockByrefType dives into the __Block_byref_x_VarName
489 struct to find the original type of the variable, which is then assigned to
490 the variable's Debug Information Entry as its real type. So far, so good.
491 However now the debugger will expect the variable VarName to have the type
492 SomeType. So we need the location attribute for the variable to be an
493 expression that explains to the debugger how to navigate through the
494 pointers and struct to find the actual variable of type SomeType.
495
496 The following function does just that. We start by getting
497 the "normal" location for the variable. This will be the location
498 of either the struct __Block_byref_x_VarName or the pointer to the
499 struct __Block_byref_x_VarName.
500
501 The struct will look something like:
502
503 struct __Block_byref_x_VarName {
504 ... <various fields>
505 struct __Block_byref_x_VarName *forwarding;
506 ... <various other fields>
507 SomeType VarName;
508 ... <maybe more fields>
509 };
510
511 If we are given the struct directly (as our starting point) we
512 need to tell the debugger to:
513
514 1). Add the offset of the forwarding field.
515
516 2). Follow that pointer to get the real __Block_byref_x_VarName
517 struct to use (the real one may have been copied onto the heap).
518
519 3). Add the offset for the field VarName, to find the actual variable.
520
521 If we started with a pointer to the struct, then we need to
522 dereference that pointer first, before the other steps.
523 Translating this into DWARF ops, we will need to append the following
524 to the current location description for the variable:
525
526 DW_OP_deref -- optional, if we start with a pointer
527 DW_OP_plus_uconst <forward_fld_offset>
528 DW_OP_deref
529 DW_OP_plus_uconst <varName_fld_offset>
530
531 That is what this function does. */
532
533/// addBlockByrefAddress - Start with the address based on the location
534/// provided, and generate the DWARF information necessary to find the
535/// actual Block variable (navigating the Block struct) based on the
536/// starting location. Add the DWARF information to the die. For
537/// more information, read large comment just above here.
538///
Eric Christopherf61dbc12013-06-24 21:07:27 +0000539void CompileUnit::addBlockByrefAddress(const DbgVariable &DV, DIE *Die,
David Blaikie770530b2013-10-21 17:28:37 +0000540 dwarf::Attribute Attribute,
Devang Patel161b2f42011-04-12 23:21:44 +0000541 const MachineLocation &Location) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000542 DIType Ty = DV.getType();
Devang Patel161b2f42011-04-12 23:21:44 +0000543 DIType TmpTy = Ty;
Eric Christopher31667622013-08-08 01:41:00 +0000544 uint16_t Tag = Ty.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +0000545 bool isPointer = false;
546
Eric Christopherf61dbc12013-06-24 21:07:27 +0000547 StringRef varName = DV.getName();
Devang Patel161b2f42011-04-12 23:21:44 +0000548
549 if (Tag == dwarf::DW_TAG_pointer_type) {
550 DIDerivedType DTy = DIDerivedType(Ty);
Manman Ren017ceda2013-10-08 18:42:58 +0000551 TmpTy = resolve(DTy.getTypeDerivedFrom());
Devang Patel161b2f42011-04-12 23:21:44 +0000552 isPointer = true;
553 }
554
555 DICompositeType blockStruct = DICompositeType(TmpTy);
556
557 // Find the __forwarding field and the variable field in the __Block_byref
558 // struct.
559 DIArray Fields = blockStruct.getTypeArray();
560 DIDescriptor varField = DIDescriptor();
561 DIDescriptor forwardingField = DIDescriptor();
562
563 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
564 DIDescriptor Element = Fields.getElement(i);
565 DIDerivedType DT = DIDerivedType(Element);
566 StringRef fieldName = DT.getName();
567 if (fieldName == "__forwarding")
568 forwardingField = Element;
569 else if (fieldName == varName)
570 varField = Element;
571 }
572
573 // Get the offsets for the forwarding field and the variable field.
574 unsigned forwardingFieldOffset =
Eric Christopher6efc0432013-10-19 01:04:47 +0000575 DIDerivedType(forwardingField).getOffsetInBits() >> 3;
576 unsigned varFieldOffset = DIDerivedType(varField).getOffsetInBits() >> 3;
Devang Patel161b2f42011-04-12 23:21:44 +0000577
578 // Decode the original location, and use that as the start of the byref
579 // variable's location.
Devang Patel161b2f42011-04-12 23:21:44 +0000580 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
581
Eric Christophercaba2632012-07-04 02:02:18 +0000582 if (Location.isReg())
583 addRegisterOp(Block, Location.getReg());
584 else
585 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel161b2f42011-04-12 23:21:44 +0000586
587 // If we started with a pointer to the __Block_byref... struct, then
588 // the first thing we need to do is dereference the pointer (DW_OP_deref).
589 if (isPointer)
David Blaikie770530b2013-10-21 17:28:37 +0000590 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Devang Patel161b2f42011-04-12 23:21:44 +0000591
592 // Next add the offset for the '__forwarding' field:
593 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
594 // adding the offset if it's 0.
595 if (forwardingFieldOffset > 0) {
David Blaikie770530b2013-10-21 17:28:37 +0000596 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
597 addUInt(Block, dwarf::DW_FORM_udata, forwardingFieldOffset);
Devang Patel161b2f42011-04-12 23:21:44 +0000598 }
599
600 // Now dereference the __forwarding field to get to the real __Block_byref
601 // struct: DW_OP_deref.
David Blaikie770530b2013-10-21 17:28:37 +0000602 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Devang Patel161b2f42011-04-12 23:21:44 +0000603
604 // Now that we've got the real __Block_byref... struct, add the offset
605 // for the variable's field to get to the location of the actual variable:
606 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
607 if (varFieldOffset > 0) {
David Blaikie770530b2013-10-21 17:28:37 +0000608 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
609 addUInt(Block, dwarf::DW_FORM_udata, varFieldOffset);
Devang Patel161b2f42011-04-12 23:21:44 +0000610 }
611
612 // Now attach the location information to the DIE.
David Blaikie770530b2013-10-21 17:28:37 +0000613 addBlock(Die, Attribute, Block);
Devang Patel161b2f42011-04-12 23:21:44 +0000614}
615
Devang Patel4ec14b02011-07-20 21:57:04 +0000616/// isTypeSigned - Return true if the type is signed.
Manman Renc664d762013-10-05 01:43:03 +0000617static bool isTypeSigned(DwarfDebug *DD, DIType Ty, int *SizeInBits) {
Devang Patel4ec14b02011-07-20 21:57:04 +0000618 if (Ty.isDerivedType())
Manman Renc664d762013-10-05 01:43:03 +0000619 return isTypeSigned(DD, DD->resolve(DIDerivedType(Ty).getTypeDerivedFrom()),
620 SizeInBits);
Devang Patel4ec14b02011-07-20 21:57:04 +0000621 if (Ty.isBasicType())
Eric Christopher6efc0432013-10-19 01:04:47 +0000622 if (DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed ||
623 DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed_char) {
Devang Patel4ec14b02011-07-20 21:57:04 +0000624 *SizeInBits = Ty.getSizeInBits();
625 return true;
626 }
627 return false;
628}
629
Manman Renc664d762013-10-05 01:43:03 +0000630/// Return true if type encoding is unsigned.
631static bool isUnsignedDIType(DwarfDebug *DD, DIType Ty) {
632 DIDerivedType DTy(Ty);
633 if (DTy.isDerivedType())
634 return isUnsignedDIType(DD, DD->resolve(DTy.getTypeDerivedFrom()));
635
636 DIBasicType BTy(Ty);
637 if (BTy.isBasicType()) {
638 unsigned Encoding = BTy.getEncoding();
639 if (Encoding == dwarf::DW_ATE_unsigned ||
640 Encoding == dwarf::DW_ATE_unsigned_char ||
641 Encoding == dwarf::DW_ATE_boolean)
642 return true;
643 }
644 return false;
645}
646
647/// If this type is derived from a base type then return base type size.
Manman Ren43251002013-10-08 18:46:58 +0000648static uint64_t getBaseTypeSize(DwarfDebug *DD, DIDerivedType Ty) {
Manman Renc664d762013-10-05 01:43:03 +0000649 unsigned Tag = Ty.getTag();
650
651 if (Tag != dwarf::DW_TAG_member && Tag != dwarf::DW_TAG_typedef &&
652 Tag != dwarf::DW_TAG_const_type && Tag != dwarf::DW_TAG_volatile_type &&
653 Tag != dwarf::DW_TAG_restrict_type)
654 return Ty.getSizeInBits();
655
656 DIType BaseType = DD->resolve(Ty.getTypeDerivedFrom());
657
658 // If this type is not derived from any type then take conservative approach.
659 if (!BaseType.isValid())
660 return Ty.getSizeInBits();
661
662 // If this is a derived type, go ahead and get the base type, unless it's a
663 // reference then it's just the size of the field. Pointer types have no need
664 // of this since they're a different type of qualification on the type.
665 if (BaseType.getTag() == dwarf::DW_TAG_reference_type ||
666 BaseType.getTag() == dwarf::DW_TAG_rvalue_reference_type)
667 return Ty.getSizeInBits();
668
669 if (BaseType.isDerivedType())
Manman Ren43251002013-10-08 18:46:58 +0000670 return getBaseTypeSize(DD, DIDerivedType(BaseType));
Manman Renc664d762013-10-05 01:43:03 +0000671
672 return BaseType.getSizeInBits();
673}
674
Devang Patel161b2f42011-04-12 23:21:44 +0000675/// addConstantValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000676void CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO,
Devang Patelb58128e2011-05-27 16:45:18 +0000677 DIType Ty) {
David Blaikie4de9d722013-05-10 21:52:07 +0000678 // FIXME: This is a bit conservative/simple - it emits negative values at
679 // their maximum bit width which is a bit unfortunate (& doesn't prefer
680 // udata/sdata over dataN as suggested by the DWARF spec)
Nick Lewycky746cb672011-10-26 22:55:33 +0000681 assert(MO.isImm() && "Invalid machine operand!");
Devang Patel4ec14b02011-07-20 21:57:04 +0000682 int SizeInBits = -1;
Manman Renc664d762013-10-05 01:43:03 +0000683 bool SignedConstant = isTypeSigned(DD, Ty, &SizeInBits);
David Blaikie770530b2013-10-21 17:28:37 +0000684 dwarf::Form Form;
Devang Patel72f0d9c2011-05-27 18:15:52 +0000685
Eric Christopher7b2ee392013-08-27 23:49:04 +0000686 // If we're a signed constant definitely use sdata.
687 if (SignedConstant) {
688 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, MO.getImm());
689 return;
690 }
691
692 // Else use data for now unless it's larger than we can deal with.
693 switch (SizeInBits) {
694 case 8:
695 Form = dwarf::DW_FORM_data1;
696 break;
697 case 16:
698 Form = dwarf::DW_FORM_data2;
699 break;
700 case 32:
701 Form = dwarf::DW_FORM_data4;
702 break;
703 case 64:
704 Form = dwarf::DW_FORM_data8;
705 break;
706 default:
707 Form = dwarf::DW_FORM_udata;
708 addUInt(Die, dwarf::DW_AT_const_value, Form, MO.getImm());
709 return;
710 }
711 addUInt(Die, dwarf::DW_AT_const_value, Form, MO.getImm());
Devang Patel161b2f42011-04-12 23:21:44 +0000712}
713
714/// addConstantFPValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000715void CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
Eric Christopher6efc0432013-10-19 01:04:47 +0000716 assert(MO.isFPImm() && "Invalid machine operand!");
Devang Patel161b2f42011-04-12 23:21:44 +0000717 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
718 APFloat FPImm = MO.getFPImm()->getValueAPF();
719
720 // Get the raw data form of the floating point.
721 const APInt FltVal = FPImm.bitcastToAPInt();
Eric Christopher6efc0432013-10-19 01:04:47 +0000722 const char *FltPtr = (const char *)FltVal.getRawData();
Devang Patel161b2f42011-04-12 23:21:44 +0000723
724 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
Micah Villmow3574eca2012-10-08 16:38:25 +0000725 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel161b2f42011-04-12 23:21:44 +0000726 int Incr = (LittleEndian ? 1 : -1);
727 int Start = (LittleEndian ? 0 : NumBytes - 1);
728 int Stop = (LittleEndian ? NumBytes : -1);
729
730 // Output the constant to DWARF one byte at a time.
731 for (; Start != Stop; Start += Incr)
David Blaikie770530b2013-10-21 17:28:37 +0000732 addUInt(Block, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +0000733 (unsigned char)0xFF & FltPtr[Start]);
734
David Blaikie770530b2013-10-21 17:28:37 +0000735 addBlock(Die, dwarf::DW_AT_const_value, Block);
Devang Patel161b2f42011-04-12 23:21:44 +0000736}
737
David Blaikie14268412013-01-20 01:18:01 +0000738/// addConstantFPValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000739void CompileUnit::addConstantFPValue(DIE *Die, const ConstantFP *CFP) {
Eric Christopher7b2ee392013-08-27 23:49:04 +0000740 // Pass this down to addConstantValue as an unsigned bag of bits.
741 addConstantValue(Die, CFP->getValueAPF().bitcastToAPInt(), true);
David Blaikie14268412013-01-20 01:18:01 +0000742}
743
Devang Patel161b2f42011-04-12 23:21:44 +0000744/// addConstantValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000745void CompileUnit::addConstantValue(DIE *Die, const ConstantInt *CI,
Devang Patel161b2f42011-04-12 23:21:44 +0000746 bool Unsigned) {
Eric Christophere4721492013-07-03 01:08:30 +0000747 addConstantValue(Die, CI->getValue(), Unsigned);
David Blaikie14268412013-01-20 01:18:01 +0000748}
749
750// addConstantValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000751void CompileUnit::addConstantValue(DIE *Die, const APInt &Val, bool Unsigned) {
David Blaikie14268412013-01-20 01:18:01 +0000752 unsigned CIBitWidth = Val.getBitWidth();
Devang Pateld6a81362011-05-28 00:39:18 +0000753 if (CIBitWidth <= 64) {
Eric Christopher7b2ee392013-08-27 23:49:04 +0000754 // If we're a signed constant definitely use sdata.
755 if (!Unsigned) {
756 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata,
757 Val.getSExtValue());
758 return;
Devang Pateld6a81362011-05-28 00:39:18 +0000759 }
Eric Christopher7b2ee392013-08-27 23:49:04 +0000760
761 // Else use data for now unless it's larger than we can deal with.
David Blaikie770530b2013-10-21 17:28:37 +0000762 dwarf::Form Form;
Eric Christopher7b2ee392013-08-27 23:49:04 +0000763 switch (CIBitWidth) {
764 case 8:
765 Form = dwarf::DW_FORM_data1;
766 break;
767 case 16:
768 Form = dwarf::DW_FORM_data2;
769 break;
770 case 32:
771 Form = dwarf::DW_FORM_data4;
772 break;
773 case 64:
774 Form = dwarf::DW_FORM_data8;
775 break;
776 default:
777 addUInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
778 Val.getZExtValue());
779 return;
780 }
781 addUInt(Die, dwarf::DW_AT_const_value, Form, Val.getZExtValue());
Eric Christophere4721492013-07-03 01:08:30 +0000782 return;
Devang Patel161b2f42011-04-12 23:21:44 +0000783 }
784
785 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
786
787 // Get the raw data form of the large APInt.
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000788 const uint64_t *Ptr64 = Val.getRawData();
Devang Patel161b2f42011-04-12 23:21:44 +0000789
790 int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
Micah Villmow3574eca2012-10-08 16:38:25 +0000791 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel161b2f42011-04-12 23:21:44 +0000792
793 // Output the constant to DWARF one byte at a time.
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000794 for (int i = 0; i < NumBytes; i++) {
795 uint8_t c;
796 if (LittleEndian)
797 c = Ptr64[i / 8] >> (8 * (i & 7));
798 else
799 c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7));
David Blaikie770530b2013-10-21 17:28:37 +0000800 addUInt(Block, dwarf::DW_FORM_data1, c);
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000801 }
Devang Patel161b2f42011-04-12 23:21:44 +0000802
David Blaikie770530b2013-10-21 17:28:37 +0000803 addBlock(Die, dwarf::DW_AT_const_value, Block);
Devang Patel161b2f42011-04-12 23:21:44 +0000804}
805
Eric Christopher6c3bb942013-04-22 07:47:40 +0000806/// addTemplateParams - Add template parameters into buffer.
Devang Patel161b2f42011-04-12 23:21:44 +0000807void CompileUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
808 // Add template parameters.
809 for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) {
810 DIDescriptor Element = TParams.getElement(i);
811 if (Element.isTemplateTypeParameter())
Manman Renbe87b692013-10-23 23:05:28 +0000812 constructTemplateTypeParameterDIE(Buffer,
813 DITemplateTypeParameter(Element));
Devang Patel161b2f42011-04-12 23:21:44 +0000814 else if (Element.isTemplateValueParameter())
Manman Renbe87b692013-10-23 23:05:28 +0000815 constructTemplateValueParameterDIE(Buffer,
816 DITemplateValueParameter(Element));
Devang Patel161b2f42011-04-12 23:21:44 +0000817 }
Devang Patel161b2f42011-04-12 23:21:44 +0000818}
Nick Lewycky746cb672011-10-26 22:55:33 +0000819
Eric Christopher6b6061f2013-01-16 01:22:23 +0000820/// getOrCreateContextDIE - Get context owner's DIE.
Eric Christopherccb66362013-10-04 23:49:26 +0000821DIE *CompileUnit::getOrCreateContextDIE(DIScope Context) {
Eric Christopher6b6061f2013-01-16 01:22:23 +0000822 if (Context.isType())
823 return getOrCreateTypeDIE(DIType(Context));
824 else if (Context.isNameSpace())
825 return getOrCreateNameSpace(DINameSpace(Context));
826 else if (Context.isSubprogram())
827 return getOrCreateSubprogramDIE(DISubprogram(Context));
Eric Christopher6c3bb942013-04-22 07:47:40 +0000828 else
Eric Christopher6b6061f2013-01-16 01:22:23 +0000829 return getDIE(Context);
830}
831
Devang Patel161b2f42011-04-12 23:21:44 +0000832/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
833/// given DIType.
Devang Patel94c7ddb2011-08-16 22:09:43 +0000834DIE *CompileUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
835 DIType Ty(TyNode);
Manman Rend03d2b22013-07-08 18:33:29 +0000836 if (!Ty.isType())
Devang Patel94c7ddb2011-08-16 22:09:43 +0000837 return NULL;
Manman Rend498e5e2013-10-29 22:49:29 +0000838
839 // Construct the context before querying for the existence of the DIE in case
840 // such construction creates the DIE.
841 DIE *ContextDIE = getOrCreateContextDIE(resolve(Ty.getContext()));
842 if (!ContextDIE)
843 ContextDIE = CUDie.get();
844
Eric Christopher3f045002013-10-04 17:08:38 +0000845 DIE *TyDIE = getDIE(Ty);
Devang Patel161b2f42011-04-12 23:21:44 +0000846 if (TyDIE)
847 return TyDIE;
848
849 // Create new type.
Manman Rend498e5e2013-10-29 22:49:29 +0000850 TyDIE = createAndAddDIE(Ty.getTag(), *ContextDIE, Ty);
851
Devang Patel161b2f42011-04-12 23:21:44 +0000852 if (Ty.isBasicType())
853 constructTypeDIE(*TyDIE, DIBasicType(Ty));
854 else if (Ty.isCompositeType())
855 constructTypeDIE(*TyDIE, DICompositeType(Ty));
856 else {
857 assert(Ty.isDerivedType() && "Unknown kind of DIType");
858 constructTypeDIE(*TyDIE, DIDerivedType(Ty));
859 }
Eric Christopher1b3f9192011-11-10 19:52:58 +0000860 // If this is a named finished type then include it in the list of types
861 // for the accelerator tables.
Eric Christopherc36145f2012-01-06 04:35:23 +0000862 if (!Ty.getName().empty() && !Ty.isForwardDecl()) {
863 bool IsImplementation = 0;
864 if (Ty.isCompositeType()) {
865 DICompositeType CT(Ty);
Eric Christophere0167892012-01-06 23:03:37 +0000866 // A runtime language of 0 actually means C/C++ and that any
867 // non-negative value is some version of Objective-C/C++.
Eric Christopher6efc0432013-10-19 01:04:47 +0000868 IsImplementation = (CT.getRunTimeLang() == 0) || CT.isObjcClassComplete();
Eric Christopherc36145f2012-01-06 04:35:23 +0000869 }
Eric Christopher577056f2013-09-05 18:20:16 +0000870 unsigned Flags = IsImplementation ? dwarf::DW_FLAG_type_implementation : 0;
Eric Christophere0167892012-01-06 23:03:37 +0000871 addAccelType(Ty.getName(), std::make_pair(TyDIE, Flags));
Eric Christopherc36145f2012-01-06 04:35:23 +0000872 }
Eric Christopher8b4310b2012-11-21 00:34:38 +0000873
Devang Patel161b2f42011-04-12 23:21:44 +0000874 return TyDIE;
875}
876
877/// addType - Add a new type attribute to the specified entity.
David Blaikie770530b2013-10-21 17:28:37 +0000878void CompileUnit::addType(DIE *Entity, DIType Ty, dwarf::Attribute Attribute) {
Eric Christopherdc1363f2013-08-08 07:40:37 +0000879 assert(Ty && "Trying to add a type that doesn't exist?");
Devang Patel161b2f42011-04-12 23:21:44 +0000880
881 // Check for pre-existence.
882 DIEEntry *Entry = getDIEEntry(Ty);
883 // If it exists then use the existing value.
884 if (Entry) {
Eric Christopher3f045002013-10-04 17:08:38 +0000885 Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
Devang Patel161b2f42011-04-12 23:21:44 +0000886 return;
887 }
888
889 // Construct type.
890 DIE *Buffer = getOrCreateTypeDIE(Ty);
891
892 // Set up proxy.
893 Entry = createDIEEntry(Buffer);
894 insertDIEEntry(Ty, Entry);
Eric Christopher3f045002013-10-04 17:08:38 +0000895 Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
Devang Patele9ae06c2011-05-31 22:56:51 +0000896
897 // If this is a complete composite type then include it in the
898 // list of global types.
Devang Patelc20bdf12011-06-01 00:23:24 +0000899 addGlobalType(Ty);
Devang Patel66658e42011-05-31 23:30:30 +0000900}
901
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000902// Accelerator table mutators - add each name along with its companion
903// DIE to the proper table while ensuring that the name that we're going
904// to reference is in the string table. We do this since the names we
905// add may not only be identical to the names in the DIE.
906void CompileUnit::addAccelName(StringRef Name, DIE *Die) {
907 DU->getStringPoolEntry(Name);
Eric Christopher734334e2013-09-23 22:59:11 +0000908 std::vector<DIE *> &DIEs = AccelNames[Name];
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000909 DIEs.push_back(Die);
910}
911
912void CompileUnit::addAccelObjC(StringRef Name, DIE *Die) {
913 DU->getStringPoolEntry(Name);
Eric Christopher734334e2013-09-23 22:59:11 +0000914 std::vector<DIE *> &DIEs = AccelObjC[Name];
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000915 DIEs.push_back(Die);
916}
917
918void CompileUnit::addAccelNamespace(StringRef Name, DIE *Die) {
919 DU->getStringPoolEntry(Name);
Eric Christopher734334e2013-09-23 22:59:11 +0000920 std::vector<DIE *> &DIEs = AccelNamespace[Name];
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000921 DIEs.push_back(Die);
922}
923
924void CompileUnit::addAccelType(StringRef Name, std::pair<DIE *, unsigned> Die) {
925 DU->getStringPoolEntry(Name);
926 std::vector<std::pair<DIE *, unsigned> > &DIEs = AccelTypes[Name];
927 DIEs.push_back(Die);
928}
929
Eric Christopher50d37a42013-09-20 22:20:55 +0000930/// addGlobalName - Add a new global name to the compile unit.
Eric Christopher91986572013-10-17 02:06:06 +0000931void CompileUnit::addGlobalName(StringRef Name, DIE *Die, DIScope Context) {
Eric Christopher0ab64392013-10-19 01:04:42 +0000932 std::string FullName = getParentContextString(Context) + Name.str();
Eric Christopher91986572013-10-17 02:06:06 +0000933 GlobalNames[FullName] = Die;
Eric Christopher50d37a42013-09-20 22:20:55 +0000934}
935
Devang Patel66658e42011-05-31 23:30:30 +0000936/// addGlobalType - Add a new global type to the compile unit.
937///
Devang Patelc20bdf12011-06-01 00:23:24 +0000938void CompileUnit::addGlobalType(DIType Ty) {
Eric Christophereee74fb2013-10-05 00:27:02 +0000939 DIScope Context = resolve(Ty.getContext());
Eric Christopher5a634742013-09-23 23:15:58 +0000940 if (!Ty.getName().empty() && !Ty.isForwardDecl() &&
Eric Christopher734334e2013-09-23 22:59:11 +0000941 (!Context || Context.isCompileUnit() || Context.isFile() ||
942 Context.isNameSpace()))
Eric Christopher91986572013-10-17 02:06:06 +0000943 if (DIEEntry *Entry = getDIEEntry(Ty)) {
Eric Christopher0ab64392013-10-19 01:04:42 +0000944 std::string FullName =
945 getParentContextString(Context) + Ty.getName().str();
Eric Christopher6efc0432013-10-19 01:04:47 +0000946 GlobalTypes[FullName] = Entry->getEntry();
Eric Christopher91986572013-10-17 02:06:06 +0000947 }
948}
949
950/// getParentContextString - Walks the metadata parent chain in a language
951/// specific manner (using the compile unit language) and returns
952/// it as a string. This is done at the metadata level because DIEs may
953/// not currently have been added to the parent context and walking the
954/// DIEs looking for names is more expensive than walking the metadata.
955std::string CompileUnit::getParentContextString(DIScope Context) const {
956 if (!Context)
957 return "";
958
959 // FIXME: Decide whether to implement this for non-C++ languages.
960 if (getLanguage() != dwarf::DW_LANG_C_plus_plus)
961 return "";
962
Eric Christopher0ab64392013-10-19 01:04:42 +0000963 std::string CS;
Eric Christopher91986572013-10-17 02:06:06 +0000964 SmallVector<DIScope, 1> Parents;
965 while (!Context.isCompileUnit()) {
966 Parents.push_back(Context);
967 if (Context.getContext())
968 Context = resolve(Context.getContext());
969 else
970 // Structure, etc types will have a NULL context if they're at the top
971 // level.
972 break;
973 }
974
975 // Reverse iterate over our list to go from the outermost construct to the
976 // innermost.
977 for (SmallVectorImpl<DIScope>::reverse_iterator I = Parents.rbegin(),
978 E = Parents.rend();
979 I != E; ++I) {
980 DIScope Ctx = *I;
981 StringRef Name = Ctx.getName();
Eric Christopher0ab64392013-10-19 01:04:42 +0000982 if (!Name.empty()) {
Eric Christopher91986572013-10-17 02:06:06 +0000983 CS += Name;
984 CS += "::";
985 }
986 }
987 return CS;
Devang Patel161b2f42011-04-12 23:21:44 +0000988}
989
Eric Christopher22852c72013-10-05 00:05:51 +0000990/// addPubTypes - Add subprogram argument types for pubtypes section.
Devang Patel31c5d052011-05-06 16:57:54 +0000991void CompileUnit::addPubTypes(DISubprogram SP) {
992 DICompositeType SPTy = SP.getType();
Eric Christopher31667622013-08-08 01:41:00 +0000993 uint16_t SPTag = SPTy.getTag();
Devang Patel31c5d052011-05-06 16:57:54 +0000994 if (SPTag != dwarf::DW_TAG_subroutine_type)
995 return;
996
997 DIArray Args = SPTy.getTypeArray();
998 for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
999 DIType ATy(Args.getElement(i));
Manman Rend03d2b22013-07-08 18:33:29 +00001000 if (!ATy.isType())
Devang Patel31c5d052011-05-06 16:57:54 +00001001 continue;
Devang Patelc20bdf12011-06-01 00:23:24 +00001002 addGlobalType(ATy);
Devang Patel31c5d052011-05-06 16:57:54 +00001003 }
1004}
1005
Devang Patel161b2f42011-04-12 23:21:44 +00001006/// constructTypeDIE - Construct basic type die from DIBasicType.
1007void CompileUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
1008 // Get core information.
1009 StringRef Name = BTy.getName();
Devang Patel161b2f42011-04-12 23:21:44 +00001010 // Add name if not anonymous or intermediate type.
1011 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001012 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel734a67c2011-09-14 23:13:28 +00001013
David Blaikie916d49e2013-10-04 23:21:16 +00001014 // An unspecified type only has a name attribute.
1015 if (BTy.getTag() == dwarf::DW_TAG_unspecified_type)
Devang Patel734a67c2011-09-14 23:13:28 +00001016 return;
Devang Patel734a67c2011-09-14 23:13:28 +00001017
Nick Lewycky746cb672011-10-26 22:55:33 +00001018 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
Devang Patel30d409c2012-02-07 23:33:58 +00001019 BTy.getEncoding());
Devang Patel734a67c2011-09-14 23:13:28 +00001020
Devang Patel161b2f42011-04-12 23:21:44 +00001021 uint64_t Size = BTy.getSizeInBits() >> 3;
David Blaikie770530b2013-10-21 17:28:37 +00001022 addUInt(&Buffer, dwarf::DW_AT_byte_size, None, Size);
Devang Patel161b2f42011-04-12 23:21:44 +00001023}
1024
1025/// constructTypeDIE - Construct derived type die from DIDerivedType.
1026void CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
1027 // Get core information.
1028 StringRef Name = DTy.getName();
1029 uint64_t Size = DTy.getSizeInBits() >> 3;
David Blaikie916d49e2013-10-04 23:21:16 +00001030 uint16_t Tag = Buffer.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +00001031
1032 // Map to main type, void will not have a type.
Manman Ren017ceda2013-10-08 18:42:58 +00001033 DIType FromTy = resolve(DTy.getTypeDerivedFrom());
Eric Christopherdc1363f2013-08-08 07:40:37 +00001034 if (FromTy)
1035 addType(&Buffer, FromTy);
Devang Patel161b2f42011-04-12 23:21:44 +00001036
1037 // Add name if not anonymous or intermediate type.
1038 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001039 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001040
1041 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopher35f225a2012-02-21 22:25:53 +00001042 if (Size && Tag != dwarf::DW_TAG_pointer_type)
David Blaikie770530b2013-10-21 17:28:37 +00001043 addUInt(&Buffer, dwarf::DW_AT_byte_size, None, Size);
Devang Patel161b2f42011-04-12 23:21:44 +00001044
David Blaikie62fdfb52013-01-07 05:51:15 +00001045 if (Tag == dwarf::DW_TAG_ptr_to_member_type)
Eric Christopher6efc0432013-10-19 01:04:47 +00001046 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type,
1047 getOrCreateTypeDIE(resolve(DTy.getClassType())));
Devang Patel161b2f42011-04-12 23:21:44 +00001048 // Add source line info if available and TyDesc is not a forward declaration.
1049 if (!DTy.isForwardDecl())
1050 addSourceLine(&Buffer, DTy);
1051}
1052
Eric Christopher3dee5752013-07-26 17:02:41 +00001053/// Return true if the type is appropriately scoped to be contained inside
1054/// its own type unit.
Manman Ren18eb2452013-09-09 19:23:58 +00001055static bool isTypeUnitScoped(DIType Ty, const DwarfDebug *DD) {
Manman Ren2c9905a2013-09-09 19:47:11 +00001056 DIScope Parent = DD->resolve(Ty.getContext());
Eric Christopher3dee5752013-07-26 17:02:41 +00001057 while (Parent) {
1058 // Don't generate a hash for anything scoped inside a function.
1059 if (Parent.isSubprogram())
1060 return false;
Manman Rene72aba92013-09-09 22:35:23 +00001061 Parent = DD->resolve(Parent.getContext());
Eric Christopher3dee5752013-07-26 17:02:41 +00001062 }
1063 return true;
1064}
1065
1066/// Return true if the type should be split out into a type unit.
Manman Ren18eb2452013-09-09 19:23:58 +00001067static bool shouldCreateTypeUnit(DICompositeType CTy, const DwarfDebug *DD) {
Eric Christopher31667622013-08-08 01:41:00 +00001068 uint16_t Tag = CTy.getTag();
Eric Christopher3dee5752013-07-26 17:02:41 +00001069
1070 switch (Tag) {
1071 case dwarf::DW_TAG_structure_type:
1072 case dwarf::DW_TAG_union_type:
1073 case dwarf::DW_TAG_enumeration_type:
1074 case dwarf::DW_TAG_class_type:
1075 // If this is a class, structure, union, or enumeration type
David Blaikiec4eb3532013-10-04 23:52:02 +00001076 // that is a definition (not a declaration), and not scoped
Eric Christopher3dee5752013-07-26 17:02:41 +00001077 // inside a function then separate this out as a type unit.
David Blaikiec4eb3532013-10-04 23:52:02 +00001078 return !CTy.isForwardDecl() && isTypeUnitScoped(CTy, DD);
Eric Christopher3dee5752013-07-26 17:02:41 +00001079 default:
David Blaikiec4eb3532013-10-04 23:52:02 +00001080 return false;
Eric Christopher3dee5752013-07-26 17:02:41 +00001081 }
1082}
1083
Devang Patel161b2f42011-04-12 23:21:44 +00001084/// constructTypeDIE - Construct type DIE from DICompositeType.
1085void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
1086 // Get core information.
1087 StringRef Name = CTy.getName();
1088
1089 uint64_t Size = CTy.getSizeInBits() >> 3;
David Blaikie916d49e2013-10-04 23:21:16 +00001090 uint16_t Tag = Buffer.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +00001091
1092 switch (Tag) {
Devang Patel161b2f42011-04-12 23:21:44 +00001093 case dwarf::DW_TAG_array_type:
1094 constructArrayTypeDIE(Buffer, &CTy);
1095 break;
1096 case dwarf::DW_TAG_enumeration_type: {
1097 DIArray Elements = CTy.getTypeArray();
1098
1099 // Add enumerators to enumeration type.
1100 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
Devang Patel161b2f42011-04-12 23:21:44 +00001101 DIDescriptor Enum(Elements.getElement(i));
Manman Ren630c3262013-10-18 21:14:19 +00001102 if (Enum.isEnumerator())
Manman Ren950f4e82013-10-23 22:52:22 +00001103 constructEnumTypeDIE(Buffer, DIEnumerator(Enum));
Devang Patel161b2f42011-04-12 23:21:44 +00001104 }
Manman Ren017ceda2013-10-08 18:42:58 +00001105 DIType DTy = resolve(CTy.getTypeDerivedFrom());
Eric Christopher37c107b2013-08-08 07:40:42 +00001106 if (DTy) {
Eric Christopherbb0f6ea2012-05-23 00:09:20 +00001107 addType(&Buffer, DTy);
Eric Christopher371d9582013-10-04 22:40:10 +00001108 addFlag(&Buffer, dwarf::DW_AT_enum_class);
Eric Christopherbb0f6ea2012-05-23 00:09:20 +00001109 }
Eric Christopher6efc0432013-10-19 01:04:47 +00001110 } break;
Devang Patel161b2f42011-04-12 23:21:44 +00001111 case dwarf::DW_TAG_subroutine_type: {
Eric Christopherdc1363f2013-08-08 07:40:37 +00001112 // Add return type. A void return won't have a type.
Devang Patel161b2f42011-04-12 23:21:44 +00001113 DIArray Elements = CTy.getTypeArray();
1114 DIDescriptor RTy = Elements.getElement(0);
Eric Christopherdc1363f2013-08-08 07:40:37 +00001115 if (RTy)
1116 addType(&Buffer, DIType(RTy));
Devang Patel161b2f42011-04-12 23:21:44 +00001117
1118 bool isPrototyped = true;
1119 // Add arguments.
1120 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
1121 DIDescriptor Ty = Elements.getElement(i);
1122 if (Ty.isUnspecifiedParameter()) {
Manman Ren1a5e7872013-10-29 00:53:03 +00001123 createAndAddDIE(dwarf::DW_TAG_unspecified_parameters, Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +00001124 isPrototyped = false;
1125 } else {
Manman Ren1a5e7872013-10-29 00:53:03 +00001126 DIE *Arg = createAndAddDIE(dwarf::DW_TAG_formal_parameter, Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +00001127 addType(Arg, DIType(Ty));
David Blaikieaaf2e632013-01-29 19:35:24 +00001128 if (DIType(Ty).isArtificial())
1129 addFlag(Arg, dwarf::DW_AT_artificial);
Devang Patel161b2f42011-04-12 23:21:44 +00001130 }
1131 }
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001132 // Add prototype flag if we're dealing with a C language and the
1133 // function has been prototyped.
Eric Christopher7b878952013-08-26 23:50:38 +00001134 uint16_t Language = DICompileUnit(Node).getLanguage();
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001135 if (isPrototyped &&
Eric Christopher6efc0432013-10-19 01:04:47 +00001136 (Language == dwarf::DW_LANG_C89 || Language == dwarf::DW_LANG_C99 ||
Eric Christopher4d069bf2012-05-22 18:45:24 +00001137 Language == dwarf::DW_LANG_ObjC))
Eric Christopher873cf0a2012-08-24 01:14:27 +00001138 addFlag(&Buffer, dwarf::DW_AT_prototyped);
Eric Christopher6efc0432013-10-19 01:04:47 +00001139 } break;
Devang Patel161b2f42011-04-12 23:21:44 +00001140 case dwarf::DW_TAG_structure_type:
1141 case dwarf::DW_TAG_union_type:
1142 case dwarf::DW_TAG_class_type: {
Devang Patel161b2f42011-04-12 23:21:44 +00001143 // Add elements to structure type.
David Blaikiec8b93552013-08-01 20:30:22 +00001144 DIArray Elements = CTy.getTypeArray();
1145 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
Devang Patel161b2f42011-04-12 23:21:44 +00001146 DIDescriptor Element = Elements.getElement(i);
1147 DIE *ElemDie = NULL;
1148 if (Element.isSubprogram()) {
1149 DISubprogram SP(Element);
Devang Pateldbc64af2011-08-15 17:24:54 +00001150 ElemDie = getOrCreateSubprogramDIE(DISubprogram(Element));
Devang Patel161b2f42011-04-12 23:21:44 +00001151 if (SP.isProtected())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001152 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001153 dwarf::DW_ACCESS_protected);
1154 else if (SP.isPrivate())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001155 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001156 dwarf::DW_ACCESS_private);
Eric Christopher8b4310b2012-11-21 00:34:38 +00001157 else
Nick Lewycky13aaca52011-12-13 05:09:11 +00001158 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Eric Christopher6efc0432013-10-19 01:04:47 +00001159 dwarf::DW_ACCESS_public);
Devang Patel161b2f42011-04-12 23:21:44 +00001160 if (SP.isExplicit())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001161 addFlag(ElemDie, dwarf::DW_AT_explicit);
Eric Christopher663e0cf2012-03-28 07:34:31 +00001162 } else if (Element.isDerivedType()) {
Eric Christopher4d069bf2012-05-22 18:45:24 +00001163 DIDerivedType DDTy(Element);
1164 if (DDTy.getTag() == dwarf::DW_TAG_friend) {
Manman Ren1a5e7872013-10-29 00:53:03 +00001165 ElemDie = createAndAddDIE(dwarf::DW_TAG_friend, Buffer);
Manman Ren017ceda2013-10-08 18:42:58 +00001166 addType(ElemDie, resolve(DDTy.getTypeDerivedFrom()),
Manman Renc664d762013-10-05 01:43:03 +00001167 dwarf::DW_AT_friend);
Manman Ren655a10d2013-10-14 20:33:57 +00001168 } else if (DDTy.isStaticMember()) {
Manman Ren99addee2013-10-23 22:57:12 +00001169 getOrCreateStaticMemberDIE(DDTy);
Manman Ren655a10d2013-10-14 20:33:57 +00001170 } else {
Manman Rena1d25b62013-10-23 23:00:44 +00001171 constructMemberDIE(Buffer, DDTy);
Manman Ren655a10d2013-10-14 20:33:57 +00001172 }
Eric Christopher663e0cf2012-03-28 07:34:31 +00001173 } else if (Element.isObjCProperty()) {
Devang Patel30d409c2012-02-07 23:33:58 +00001174 DIObjCProperty Property(Element);
Manman Ren1a5e7872013-10-29 00:53:03 +00001175 ElemDie = createAndAddDIE(Property.getTag(), Buffer);
Devang Patel30d409c2012-02-07 23:33:58 +00001176 StringRef PropertyName = Property.getObjCPropertyName();
1177 addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
Eric Christopher4d069bf2012-05-22 18:45:24 +00001178 addType(ElemDie, Property.getType());
1179 addSourceLine(ElemDie, Property);
Devang Patel30d409c2012-02-07 23:33:58 +00001180 StringRef GetterName = Property.getObjCPropertyGetterName();
1181 if (!GetterName.empty())
1182 addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
1183 StringRef SetterName = Property.getObjCPropertySetterName();
1184 if (!SetterName.empty())
1185 addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
1186 unsigned PropertyAttributes = 0;
Devang Patel9e11eb12012-02-04 01:30:32 +00001187 if (Property.isReadOnlyObjCProperty())
1188 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
1189 if (Property.isReadWriteObjCProperty())
1190 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
1191 if (Property.isAssignObjCProperty())
1192 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
1193 if (Property.isRetainObjCProperty())
1194 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
1195 if (Property.isCopyObjCProperty())
1196 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
1197 if (Property.isNonAtomicObjCProperty())
1198 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
1199 if (PropertyAttributes)
David Blaikie770530b2013-10-21 17:28:37 +00001200 addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, None,
Eric Christopher6efc0432013-10-19 01:04:47 +00001201 PropertyAttributes);
Devang Patel6588abf2012-02-06 17:49:43 +00001202
Devang Patel30d409c2012-02-07 23:33:58 +00001203 DIEEntry *Entry = getDIEEntry(Element);
1204 if (!Entry) {
1205 Entry = createDIEEntry(ElemDie);
1206 insertDIEEntry(Element, Entry);
1207 }
Devang Patel9e11eb12012-02-04 01:30:32 +00001208 } else
Devang Patel161b2f42011-04-12 23:21:44 +00001209 continue;
Devang Patel161b2f42011-04-12 23:21:44 +00001210 }
1211
1212 if (CTy.isAppleBlockExtension())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001213 addFlag(&Buffer, dwarf::DW_AT_APPLE_block);
Devang Patel161b2f42011-04-12 23:21:44 +00001214
Eric Christophereee74fb2013-10-05 00:27:02 +00001215 DICompositeType ContainingType(resolve(CTy.getContainingType()));
Devang Patel161b2f42011-04-12 23:21:44 +00001216 if (DIDescriptor(ContainingType).isCompositeType())
Manman Ren87b110a2013-10-11 23:58:05 +00001217 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type,
Devang Patel161b2f42011-04-12 23:21:44 +00001218 getOrCreateTypeDIE(DIType(ContainingType)));
Devang Patel161b2f42011-04-12 23:21:44 +00001219
Devang Patel201e6cd2011-05-12 21:29:42 +00001220 if (CTy.isObjcClassComplete())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001221 addFlag(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type);
Devang Patelb11f80e2011-05-12 19:06:16 +00001222
Eric Christopher1a8e8862011-12-16 23:42:42 +00001223 // Add template parameters to a class, structure or union types.
1224 // FIXME: The support isn't in the metadata for this yet.
1225 if (Tag == dwarf::DW_TAG_class_type ||
Eric Christopher6efc0432013-10-19 01:04:47 +00001226 Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type)
Devang Patel161b2f42011-04-12 23:21:44 +00001227 addTemplateParams(Buffer, CTy.getTemplateParams());
1228
1229 break;
1230 }
1231 default:
1232 break;
1233 }
1234
1235 // Add name if not anonymous or intermediate type.
1236 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001237 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001238
Eric Christopher4a5d8392012-05-22 18:45:18 +00001239 if (Tag == dwarf::DW_TAG_enumeration_type ||
Eric Christopher6efc0432013-10-19 01:04:47 +00001240 Tag == dwarf::DW_TAG_class_type || Tag == dwarf::DW_TAG_structure_type ||
Eric Christopher4a5d8392012-05-22 18:45:18 +00001241 Tag == dwarf::DW_TAG_union_type) {
Devang Patel161b2f42011-04-12 23:21:44 +00001242 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopherfc4199b2012-06-01 00:22:32 +00001243 // TODO: Do we care about size for enum forward declarations?
Devang Patel161b2f42011-04-12 23:21:44 +00001244 if (Size)
David Blaikie770530b2013-10-21 17:28:37 +00001245 addUInt(&Buffer, dwarf::DW_AT_byte_size, None, Size);
Eric Christopherfc4199b2012-06-01 00:22:32 +00001246 else if (!CTy.isForwardDecl())
Devang Patel161b2f42011-04-12 23:21:44 +00001247 // Add zero size if it is not a forward declaration.
David Blaikie770530b2013-10-21 17:28:37 +00001248 addUInt(&Buffer, dwarf::DW_AT_byte_size, None, 0);
Eric Christopherfc4199b2012-06-01 00:22:32 +00001249
1250 // If we're a forward decl, say so.
1251 if (CTy.isForwardDecl())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001252 addFlag(&Buffer, dwarf::DW_AT_declaration);
Devang Patel161b2f42011-04-12 23:21:44 +00001253
1254 // Add source line info if available.
1255 if (!CTy.isForwardDecl())
1256 addSourceLine(&Buffer, CTy);
Eric Christopher89388952012-03-07 00:15:19 +00001257
1258 // No harm in adding the runtime language to the declaration.
1259 unsigned RLang = CTy.getRunTimeLang();
1260 if (RLang)
Eric Christopher6efc0432013-10-19 01:04:47 +00001261 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class, dwarf::DW_FORM_data1,
1262 RLang);
Devang Patel161b2f42011-04-12 23:21:44 +00001263 }
Eric Christopher3dee5752013-07-26 17:02:41 +00001264 // If this is a type applicable to a type unit it then add it to the
1265 // list of types we'll compute a hash for later.
Manman Ren18eb2452013-09-09 19:23:58 +00001266 if (shouldCreateTypeUnit(CTy, DD))
Eric Christopher3dee5752013-07-26 17:02:41 +00001267 DD->addTypeUnitType(&Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +00001268}
1269
Manman Renbe87b692013-10-23 23:05:28 +00001270/// constructTemplateTypeParameterDIE - Construct new DIE for the given
1271/// DITemplateTypeParameter.
Manman Ren99addee2013-10-23 22:57:12 +00001272void
Manman Renbe87b692013-10-23 23:05:28 +00001273CompileUnit::constructTemplateTypeParameterDIE(DIE &Buffer,
1274 DITemplateTypeParameter TP) {
Manman Ren1a5e7872013-10-29 00:53:03 +00001275 DIE *ParamDIE =
1276 createAndAddDIE(dwarf::DW_TAG_template_type_parameter, Buffer);
Eric Christopher76ef79f2013-08-08 08:09:43 +00001277 // Add the type if it exists, it could be void and therefore no type.
1278 if (TP.getType())
Manman Renb4d9c112013-10-09 19:46:28 +00001279 addType(ParamDIE, resolve(TP.getType()));
David Blaikiee88939c2013-06-22 18:59:11 +00001280 if (!TP.getName().empty())
1281 addString(ParamDIE, dwarf::DW_AT_name, TP.getName());
Devang Patel161b2f42011-04-12 23:21:44 +00001282}
1283
Manman Renbe87b692013-10-23 23:05:28 +00001284/// constructTemplateValueParameterDIE - Construct new DIE for the given
1285/// DITemplateValueParameter.
Manman Ren99addee2013-10-23 22:57:12 +00001286void
Manman Renbe87b692013-10-23 23:05:28 +00001287CompileUnit::constructTemplateValueParameterDIE(DIE &Buffer,
1288 DITemplateValueParameter VP) {
Manman Ren1a5e7872013-10-29 00:53:03 +00001289 DIE *ParamDIE = createAndAddDIE(VP.getTag(), Buffer);
Eric Christopherdc1363f2013-08-08 07:40:37 +00001290
1291 // Add the type if there is one, template template and template parameter
1292 // packs will not have a type.
Eric Christopheref2d9192013-10-21 17:48:51 +00001293 if (VP.getTag() == dwarf::DW_TAG_template_value_parameter)
Manman Renb4d9c112013-10-09 19:46:28 +00001294 addType(ParamDIE, resolve(VP.getType()));
Eric Christopherafdd1f82013-08-08 07:40:31 +00001295 if (!VP.getName().empty())
1296 addString(ParamDIE, dwarf::DW_AT_name, VP.getName());
1297 if (Value *Val = VP.getValue()) {
David Blaikie4de9d722013-05-10 21:52:07 +00001298 if (ConstantInt *CI = dyn_cast<ConstantInt>(Val))
Manman Renb4d9c112013-10-09 19:46:28 +00001299 addConstantValue(ParamDIE, CI,
1300 isUnsignedDIType(DD, resolve(VP.getType())));
David Blaikie4de9d722013-05-10 21:52:07 +00001301 else if (GlobalValue *GV = dyn_cast<GlobalValue>(Val)) {
1302 // For declaration non-type template parameters (such as global values and
1303 // functions)
1304 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Rafael Espindolaffc7dca2013-10-29 17:07:16 +00001305 addOpAddress(Block, Asm->getSymbol(GV));
David Blaikie4de9d722013-05-10 21:52:07 +00001306 // Emit DW_OP_stack_value to use the address as the immediate value of the
1307 // parameter, rather than a pointer to it.
David Blaikie770530b2013-10-21 17:28:37 +00001308 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value);
1309 addBlock(ParamDIE, dwarf::DW_AT_location, Block);
Eric Christopherafdd1f82013-08-08 07:40:31 +00001310 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_template_param) {
David Blaikiee88939c2013-06-22 18:59:11 +00001311 assert(isa<MDString>(Val));
1312 addString(ParamDIE, dwarf::DW_AT_GNU_template_name,
1313 cast<MDString>(Val)->getString());
Eric Christopherafdd1f82013-08-08 07:40:31 +00001314 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_parameter_pack) {
David Blaikiee88939c2013-06-22 18:59:11 +00001315 assert(isa<MDNode>(Val));
1316 DIArray A(cast<MDNode>(Val));
1317 addTemplateParams(*ParamDIE, A);
David Blaikie4de9d722013-05-10 21:52:07 +00001318 }
1319 }
Devang Patel161b2f42011-04-12 23:21:44 +00001320}
1321
Devang Patel31c5d052011-05-06 16:57:54 +00001322/// getOrCreateNameSpace - Create a DIE for DINameSpace.
1323DIE *CompileUnit::getOrCreateNameSpace(DINameSpace NS) {
Manman Ren6b713802013-10-29 05:49:41 +00001324 // Construct the context before querying for the existence of the DIE in case
1325 // such construction creates the DIE.
1326 DIE *ContextDIE = getOrCreateContextDIE(NS.getContext());
1327 if (!ContextDIE)
1328 // If the context is null, DIE should belong to the CU we call construct
1329 // function on.
1330 ContextDIE = CUDie.get();
1331
Devang Patel31c5d052011-05-06 16:57:54 +00001332 DIE *NDie = getDIE(NS);
1333 if (NDie)
1334 return NDie;
Manman Ren6b713802013-10-29 05:49:41 +00001335 NDie = createAndAddDIE(dwarf::DW_TAG_namespace, *ContextDIE, NS);
1336
Eric Christopher09ac3d82011-11-07 09:24:32 +00001337 if (!NS.getName().empty()) {
Nick Lewycky390c40d2011-10-27 06:44:11 +00001338 addString(NDie, dwarf::DW_AT_name, NS.getName());
Eric Christopher09ac3d82011-11-07 09:24:32 +00001339 addAccelNamespace(NS.getName(), NDie);
Eric Christopher91986572013-10-17 02:06:06 +00001340 addGlobalName(NS.getName(), NDie, NS.getContext());
Eric Christopher09ac3d82011-11-07 09:24:32 +00001341 } else
1342 addAccelNamespace("(anonymous namespace)", NDie);
Devang Patel31c5d052011-05-06 16:57:54 +00001343 addSourceLine(NDie, NS);
Devang Patel31c5d052011-05-06 16:57:54 +00001344 return NDie;
1345}
1346
Devang Pateldbc64af2011-08-15 17:24:54 +00001347/// getOrCreateSubprogramDIE - Create new DIE using SP.
1348DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
David Blaikiec32f2332013-10-04 01:39:59 +00001349 // Construct the context before querying for the existence of the DIE in case
1350 // such construction creates the DIE (as is the case for member function
1351 // declarations).
Manman Renb8e48a62013-10-10 18:40:01 +00001352 DIE *ContextDIE = getOrCreateContextDIE(resolve(SP.getContext()));
David Blaikiec32f2332013-10-04 01:39:59 +00001353 if (!ContextDIE)
1354 ContextDIE = CUDie.get();
1355
Eric Christopher3f045002013-10-04 17:08:38 +00001356 DIE *SPDie = getDIE(SP);
Devang Pateldbc64af2011-08-15 17:24:54 +00001357 if (SPDie)
1358 return SPDie;
1359
Manman Renbbdd02c2013-10-29 00:58:04 +00001360 DISubprogram SPDecl = SP.getFunctionDeclaration();
1361 if (SPDecl.isSubprogram())
1362 // Add subprogram definitions to the CU die directly.
1363 ContextDIE = CUDie.get();
Peter Collingbourne27302f02012-05-27 18:36:44 +00001364
1365 // DW_TAG_inlined_subroutine may refer to this DIE.
Manman Renbbdd02c2013-10-29 00:58:04 +00001366 SPDie = createAndAddDIE(dwarf::DW_TAG_subprogram, *ContextDIE, SP);
Peter Collingbourne27302f02012-05-27 18:36:44 +00001367
Rafael Espindola01b55b42011-11-10 22:34:29 +00001368 DIE *DeclDie = NULL;
Manman Ren250f4e82013-10-23 22:12:26 +00001369 if (SPDecl.isSubprogram())
Rafael Espindola01b55b42011-11-10 22:34:29 +00001370 DeclDie = getOrCreateSubprogramDIE(SPDecl);
Rafael Espindola01b55b42011-11-10 22:34:29 +00001371
Devang Pateldbc64af2011-08-15 17:24:54 +00001372 // Add function template parameters.
1373 addTemplateParams(*SPDie, SP.getTemplateParams());
1374
Devang Pateldbc64af2011-08-15 17:24:54 +00001375 // If this DIE is going to refer declaration info using AT_specification
Eric Christopherc4968752013-05-09 00:42:33 +00001376 // then there is no need to add other attributes.
Rafael Espindola01b55b42011-11-10 22:34:29 +00001377 if (DeclDie) {
1378 // Refer function declaration directly.
Manman Ren87b110a2013-10-11 23:58:05 +00001379 addDIEEntry(SPDie, dwarf::DW_AT_specification, DeclDie);
Rafael Espindola01b55b42011-11-10 22:34:29 +00001380
Devang Pateldbc64af2011-08-15 17:24:54 +00001381 return SPDie;
Rafael Espindola01b55b42011-11-10 22:34:29 +00001382 }
Devang Pateldbc64af2011-08-15 17:24:54 +00001383
Eric Christophercbbd5b12012-08-23 22:52:55 +00001384 // Add the linkage name if we have one.
Michael Gottesmandc42d032013-09-04 04:39:38 +00001385 StringRef LinkageName = SP.getLinkageName();
1386 if (!LinkageName.empty())
Eric Christophercbbd5b12012-08-23 22:52:55 +00001387 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c2b4be2013-06-01 17:51:14 +00001388 GlobalValue::getRealLinkageName(LinkageName));
Eric Christophercbbd5b12012-08-23 22:52:55 +00001389
Devang Pateldbc64af2011-08-15 17:24:54 +00001390 // Constructors and operators for anonymous aggregates do not have names.
1391 if (!SP.getName().empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001392 addString(SPDie, dwarf::DW_AT_name, SP.getName());
Devang Pateldbc64af2011-08-15 17:24:54 +00001393
1394 addSourceLine(SPDie, SP);
1395
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001396 // Add the prototype if we have a prototype and we have a C like
1397 // language.
Eric Christopher7b878952013-08-26 23:50:38 +00001398 uint16_t Language = DICompileUnit(Node).getLanguage();
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001399 if (SP.isPrototyped() &&
Eric Christopher6efc0432013-10-19 01:04:47 +00001400 (Language == dwarf::DW_LANG_C89 || Language == dwarf::DW_LANG_C99 ||
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001401 Language == dwarf::DW_LANG_ObjC))
Eric Christopher873cf0a2012-08-24 01:14:27 +00001402 addFlag(SPDie, dwarf::DW_AT_prototyped);
Devang Pateldbc64af2011-08-15 17:24:54 +00001403
Devang Pateldbc64af2011-08-15 17:24:54 +00001404 DICompositeType SPTy = SP.getType();
David Blaikie3d331842013-05-22 23:22:18 +00001405 assert(SPTy.getTag() == dwarf::DW_TAG_subroutine_type &&
1406 "the type of a subprogram should be a subroutine");
Devang Pateldbc64af2011-08-15 17:24:54 +00001407
David Blaikie3d331842013-05-22 23:22:18 +00001408 DIArray Args = SPTy.getTypeArray();
Eric Christopheref2d9192013-10-21 17:48:51 +00001409 // Add a return type. If this is a type like a C/C++ void type we don't add a
1410 // return type.
Eric Christopherdc1363f2013-08-08 07:40:37 +00001411 if (Args.getElement(0))
1412 addType(SPDie, DIType(Args.getElement(0)));
Devang Pateldbc64af2011-08-15 17:24:54 +00001413
1414 unsigned VK = SP.getVirtuality();
1415 if (VK) {
Nick Lewycky798313d2011-12-14 00:56:07 +00001416 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
Devang Pateldbc64af2011-08-15 17:24:54 +00001417 DIEBlock *Block = getDIEBlock();
David Blaikie770530b2013-10-21 17:28:37 +00001418 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1419 addUInt(Block, dwarf::DW_FORM_udata, SP.getVirtualIndex());
1420 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, Block);
Devang Pateldbc64af2011-08-15 17:24:54 +00001421 ContainingTypeMap.insert(std::make_pair(SPDie,
Eric Christophereee74fb2013-10-05 00:27:02 +00001422 resolve(SP.getContainingType())));
Devang Pateldbc64af2011-08-15 17:24:54 +00001423 }
1424
1425 if (!SP.isDefinition()) {
Eric Christopher873cf0a2012-08-24 01:14:27 +00001426 addFlag(SPDie, dwarf::DW_AT_declaration);
Eric Christopher8b4310b2012-11-21 00:34:38 +00001427
Devang Pateldbc64af2011-08-15 17:24:54 +00001428 // Add arguments. Do not add arguments for subprogram definition. They will
1429 // be handled while processing variables.
Eric Christopher6efc0432013-10-19 01:04:47 +00001430 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
Manman Ren1a5e7872013-10-29 00:53:03 +00001431 DIE *Arg = createAndAddDIE(dwarf::DW_TAG_formal_parameter, *SPDie);
David Blaikie3d331842013-05-22 23:22:18 +00001432 DIType ATy = DIType(Args.getElement(i));
1433 addType(Arg, ATy);
1434 if (ATy.isArtificial())
1435 addFlag(Arg, dwarf::DW_AT_artificial);
David Blaikie3d331842013-05-22 23:22:18 +00001436 }
Devang Pateldbc64af2011-08-15 17:24:54 +00001437 }
1438
1439 if (SP.isArtificial())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001440 addFlag(SPDie, dwarf::DW_AT_artificial);
Devang Pateldbc64af2011-08-15 17:24:54 +00001441
1442 if (!SP.isLocalToUnit())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001443 addFlag(SPDie, dwarf::DW_AT_external);
Devang Pateldbc64af2011-08-15 17:24:54 +00001444
1445 if (SP.isOptimized())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001446 addFlag(SPDie, dwarf::DW_AT_APPLE_optimized);
Devang Pateldbc64af2011-08-15 17:24:54 +00001447
1448 if (unsigned isa = Asm->getISAEncoding()) {
1449 addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1450 }
1451
1452 return SPDie;
1453}
1454
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001455// Return const expression if value is a GEP to access merged global
1456// constant. e.g.
1457// i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
1458static const ConstantExpr *getMergedGlobalExpr(const Value *V) {
1459 const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
1460 if (!CE || CE->getNumOperands() != 3 ||
1461 CE->getOpcode() != Instruction::GetElementPtr)
1462 return NULL;
1463
1464 // First operand points to a global struct.
1465 Value *Ptr = CE->getOperand(0);
1466 if (!isa<GlobalValue>(Ptr) ||
1467 !isa<StructType>(cast<PointerType>(Ptr->getType())->getElementType()))
1468 return NULL;
1469
1470 // Second operand is zero.
1471 const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
1472 if (!CI || !CI->isZero())
1473 return NULL;
1474
1475 // Third operand is offset.
1476 if (!isa<ConstantInt>(CE->getOperand(2)))
1477 return NULL;
1478
1479 return CE;
1480}
1481
1482/// createGlobalVariableDIE - create global variable DIE.
1483void CompileUnit::createGlobalVariableDIE(const MDNode *N) {
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001484 // Check for pre-existence.
Devang Patel49e2f032011-08-18 22:21:50 +00001485 if (getDIE(N))
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001486 return;
1487
Devang Patel49e2f032011-08-18 22:21:50 +00001488 DIGlobalVariable GV(N);
Manman Rend03d2b22013-07-08 18:33:29 +00001489 if (!GV.isGlobalVariable())
Devang Patel28bea082011-08-18 23:17:55 +00001490 return;
1491
Eric Christopherccb66362013-10-04 23:49:26 +00001492 DIScope GVContext = GV.getContext();
Eric Christopher6b6061f2013-01-16 01:22:23 +00001493 DIType GTy = GV.getType();
1494
1495 // If this is a static data member definition, some attributes belong
1496 // to the declaration DIE.
1497 DIE *VariableDIE = NULL;
Manman Ren945e8282013-02-01 23:54:37 +00001498 bool IsStaticMember = false;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001499 DIDerivedType SDMDecl = GV.getStaticDataMemberDeclaration();
1500 if (SDMDecl.Verify()) {
1501 assert(SDMDecl.isStaticMember() && "Expected static member decl");
1502 // We need the declaration DIE that is in the static member's class.
Manman Ren655a10d2013-10-14 20:33:57 +00001503 VariableDIE = getOrCreateStaticMemberDIE(SDMDecl);
Manman Ren945e8282013-02-01 23:54:37 +00001504 IsStaticMember = true;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001505 }
1506
1507 // If this is not a static data member definition, create the variable
1508 // DIE and add the initial set of attributes to it.
1509 if (!VariableDIE) {
Manman Ren6b713802013-10-29 05:49:41 +00001510 // Construct the context before querying for the existence of the DIE in
1511 // case such construction creates the DIE.
1512 DIE *ContextDIE = getOrCreateContextDIE(GVContext);
1513 if (!ContextDIE)
1514 ContextDIE = CUDie.get();
1515
Eric Christopher6b6061f2013-01-16 01:22:23 +00001516 // Add to map.
Manman Ren6b713802013-10-29 05:49:41 +00001517 VariableDIE = createAndAddDIE(GV.getTag(), *ContextDIE, N);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001518
1519 // Add name and type.
1520 addString(VariableDIE, dwarf::DW_AT_name, GV.getDisplayName());
1521 addType(VariableDIE, GTy);
1522
1523 // Add scoping info.
Eric Christophera486f552013-10-16 01:37:49 +00001524 if (!GV.isLocalToUnit())
Eric Christopher6b6061f2013-01-16 01:22:23 +00001525 addFlag(VariableDIE, dwarf::DW_AT_external);
1526
1527 // Add line number info.
1528 addSourceLine(VariableDIE, GV);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001529 }
1530
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001531 // Add location.
Eric Christopher09ac3d82011-11-07 09:24:32 +00001532 bool addToAccelTable = false;
Eric Christopherd61c34b2011-11-11 03:16:32 +00001533 DIE *VariableSpecDIE = NULL;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001534 bool isGlobalVariable = GV.getGlobal() != NULL;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001535 if (isGlobalVariable) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001536 addToAccelTable = true;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001537 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Rafael Espindolaffc7dca2013-10-29 17:07:16 +00001538 const MCSymbol *Sym = Asm->getSymbol(GV.getGlobal());
David Blaikie59eaa382013-06-28 20:05:11 +00001539 if (GV.getGlobal()->isThreadLocal()) {
1540 // FIXME: Make this work with -gsplit-dwarf.
1541 unsigned PointerSize = Asm->getDataLayout().getPointerSize();
1542 assert((PointerSize == 4 || PointerSize == 8) &&
1543 "Add support for other sizes if necessary");
Ulrich Weigand716a94f2013-07-02 18:47:09 +00001544 const MCExpr *Expr =
David Blaikie8fed05e2013-07-01 23:55:52 +00001545 Asm->getObjFileLowering().getDebugThreadLocalSymbol(Sym);
David Blaikie59eaa382013-06-28 20:05:11 +00001546 // Based on GCC's support for TLS:
David Blaikie8fed05e2013-07-01 23:55:52 +00001547 if (!DD->useSplitDwarf()) {
1548 // 1) Start with a constNu of the appropriate pointer size
David Blaikie770530b2013-10-21 17:28:37 +00001549 addUInt(Block, dwarf::DW_FORM_data1,
David Blaikie8fed05e2013-07-01 23:55:52 +00001550 PointerSize == 4 ? dwarf::DW_OP_const4u : dwarf::DW_OP_const8u);
Richard Mitton379f76e2013-10-07 18:39:18 +00001551 // 2) containing the (relocated) offset of the TLS variable
1552 // within the module's TLS block.
David Blaikie770530b2013-10-21 17:28:37 +00001553 addExpr(Block, dwarf::DW_FORM_udata, Expr);
David Blaikie8fed05e2013-07-01 23:55:52 +00001554 } else {
David Blaikie770530b2013-10-21 17:28:37 +00001555 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_const_index);
1556 addUInt(Block, dwarf::DW_FORM_udata, DU->getAddrPoolIndex(Expr));
David Blaikie8fed05e2013-07-01 23:55:52 +00001557 }
Richard Mitton379f76e2013-10-07 18:39:18 +00001558 // 3) followed by a custom OP to make the debugger do a TLS lookup.
David Blaikie770530b2013-10-21 17:28:37 +00001559 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_push_tls_address);
David Blaikie59eaa382013-06-28 20:05:11 +00001560 } else
1561 addOpAddress(Block, Sym);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001562 // Do not create specification DIE if context is either compile unit
1563 // or a subprogram.
Devang Patel1dd4e562011-09-21 23:41:11 +00001564 if (GVContext && GV.isDefinition() && !GVContext.isCompileUnit() &&
Manman Ren02d29672013-09-09 19:05:21 +00001565 !GVContext.isFile() && !DD->isSubprogramContext(GVContext)) {
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001566 // Create specification DIE.
Manman Ren1a5e7872013-10-29 00:53:03 +00001567 VariableSpecDIE = createAndAddDIE(dwarf::DW_TAG_variable, *CUDie.get());
Manman Ren87b110a2013-10-11 23:58:05 +00001568 addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification, VariableDIE);
David Blaikie770530b2013-10-21 17:28:37 +00001569 addBlock(VariableSpecDIE, dwarf::DW_AT_location, Block);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001570 // A static member's declaration is already flagged as such.
1571 if (!SDMDecl.Verify())
1572 addFlag(VariableDIE, dwarf::DW_AT_declaration);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001573 } else {
David Blaikie770530b2013-10-21 17:28:37 +00001574 addBlock(VariableDIE, dwarf::DW_AT_location, Block);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001575 }
Michael Gottesmandc42d032013-09-04 04:39:38 +00001576 // Add the linkage name.
Eric Christopher6b6061f2013-01-16 01:22:23 +00001577 StringRef LinkageName = GV.getLinkageName();
Michael Gottesmandc42d032013-09-04 04:39:38 +00001578 if (!LinkageName.empty())
Eric Christopher8d45a982013-02-27 23:49:47 +00001579 // From DWARF4: DIEs to which DW_AT_linkage_name may apply include:
1580 // TAG_common_block, TAG_constant, TAG_entry_point, TAG_subprogram and
1581 // TAG_variable.
Eric Christopher6efc0432013-10-19 01:04:47 +00001582 addString(IsStaticMember && VariableSpecDIE ? VariableSpecDIE
1583 : VariableDIE,
1584 dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c2b4be2013-06-01 17:51:14 +00001585 GlobalValue::getRealLinkageName(LinkageName));
Eric Christopher8b4310b2012-11-21 00:34:38 +00001586 } else if (const ConstantInt *CI =
Eric Christopher6efc0432013-10-19 01:04:47 +00001587 dyn_cast_or_null<ConstantInt>(GV.getConstant())) {
Adrian Prantl2e892e42013-04-04 22:56:49 +00001588 // AT_const_value was added when the static member was created. To avoid
Manman Ren945e8282013-02-01 23:54:37 +00001589 // emitting AT_const_value multiple times, we only add AT_const_value when
1590 // it is not a static member.
1591 if (!IsStaticMember)
Manman Renc664d762013-10-05 01:43:03 +00001592 addConstantValue(VariableDIE, CI, isUnsignedDIType(DD, GTy));
Manman Ren945e8282013-02-01 23:54:37 +00001593 } else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001594 addToAccelTable = true;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001595 // GV is a merged global.
1596 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1597 Value *Ptr = CE->getOperand(0);
Rafael Espindolaffc7dca2013-10-29 17:07:16 +00001598 addOpAddress(Block, Asm->getSymbol(cast<GlobalValue>(Ptr)));
David Blaikie770530b2013-10-21 17:28:37 +00001599 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
Eric Christopher6efc0432013-10-19 01:04:47 +00001600 SmallVector<Value *, 3> Idx(CE->op_begin() + 1, CE->op_end());
David Blaikie770530b2013-10-21 17:28:37 +00001601 addUInt(Block, dwarf::DW_FORM_udata,
Eric Christopher6efc0432013-10-19 01:04:47 +00001602 Asm->getDataLayout().getIndexedOffset(Ptr->getType(), Idx));
David Blaikie770530b2013-10-21 17:28:37 +00001603 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1604 addBlock(VariableDIE, dwarf::DW_AT_location, Block);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001605 }
1606
Eric Christopherd117fbb2011-11-11 01:55:22 +00001607 if (addToAccelTable) {
1608 DIE *AddrDIE = VariableSpecDIE ? VariableSpecDIE : VariableDIE;
1609 addAccelName(GV.getName(), AddrDIE);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001610
Eric Christopherd117fbb2011-11-11 01:55:22 +00001611 // If the linkage name is different than the name, go ahead and output
1612 // that as well into the name table.
1613 if (GV.getLinkageName() != "" && GV.getName() != GV.getLinkageName())
1614 addAccelName(GV.getLinkageName(), AddrDIE);
1615 }
Eric Christophera486f552013-10-16 01:37:49 +00001616
1617 if (!GV.isLocalToUnit())
Eric Christopher91986572013-10-17 02:06:06 +00001618 addGlobalName(GV.getName(), VariableSpecDIE ? VariableSpecDIE : VariableDIE,
1619 GV.getContext());
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001620}
1621
Devang Patel161b2f42011-04-12 23:21:44 +00001622/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
Eric Christopher4d069bf2012-05-22 18:45:24 +00001623void CompileUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR,
1624 DIE *IndexTy) {
Manman Ren1a5e7872013-10-29 00:53:03 +00001625 DIE *DW_Subrange = createAndAddDIE(dwarf::DW_TAG_subrange_type, Buffer);
Manman Ren87b110a2013-10-11 23:58:05 +00001626 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, IndexTy);
Devang Patel161b2f42011-04-12 23:21:44 +00001627
Bill Wendling222c2fd2012-12-06 07:38:10 +00001628 // The LowerBound value defines the lower bounds which is typically zero for
1629 // C/C++. The Count value is the number of elements. Values are 64 bit. If
1630 // Count == -1 then the array is unbounded and we do not emit
1631 // DW_AT_lower_bound and DW_AT_upper_bound attributes. If LowerBound == 0 and
1632 // Count == 0, then the array has zero elements in which case we do not emit
1633 // an upper bound.
1634 int64_t LowerBound = SR.getLo();
Bill Wendling6afe4782012-12-06 07:55:19 +00001635 int64_t DefaultLowerBound = getDefaultLowerBound();
Bill Wendling9493dae2012-12-04 21:34:03 +00001636 int64_t Count = SR.getCount();
Devang Patel161b2f42011-04-12 23:21:44 +00001637
Bill Wendling6afe4782012-12-06 07:55:19 +00001638 if (DefaultLowerBound == -1 || LowerBound != DefaultLowerBound)
David Blaikie770530b2013-10-21 17:28:37 +00001639 addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, None, LowerBound);
Bill Wendling222c2fd2012-12-06 07:38:10 +00001640
1641 if (Count != -1 && Count != 0)
Bill Wendling9493dae2012-12-04 21:34:03 +00001642 // FIXME: An unbounded array should reference the expression that defines
1643 // the array.
David Blaikie770530b2013-10-21 17:28:37 +00001644 addUInt(DW_Subrange, dwarf::DW_AT_upper_bound, None, LowerBound + Count - 1);
Devang Patel161b2f42011-04-12 23:21:44 +00001645}
1646
1647/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
Eric Christopher6efc0432013-10-19 01:04:47 +00001648void CompileUnit::constructArrayTypeDIE(DIE &Buffer, DICompositeType *CTy) {
Eric Christopher9a1e0e22013-01-08 01:53:52 +00001649 if (CTy->isVector())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001650 addFlag(&Buffer, dwarf::DW_AT_GNU_vector);
Devang Patel161b2f42011-04-12 23:21:44 +00001651
Eric Christopherdc1363f2013-08-08 07:40:37 +00001652 // Emit the element type.
Manman Ren017ceda2013-10-08 18:42:58 +00001653 addType(&Buffer, resolve(CTy->getTypeDerivedFrom()));
Devang Patel161b2f42011-04-12 23:21:44 +00001654
1655 // Get an anonymous type for index type.
Eric Christopher8cab6ed2013-01-04 21:51:53 +00001656 // FIXME: This type should be passed down from the front end
1657 // as different languages may have different sizes for indexes.
Devang Patel161b2f42011-04-12 23:21:44 +00001658 DIE *IdxTy = getIndexTyDie();
1659 if (!IdxTy) {
1660 // Construct an anonymous type for index type.
Manman Ren1a5e7872013-10-29 00:53:03 +00001661 IdxTy = createAndAddDIE(dwarf::DW_TAG_base_type, *CUDie.get());
Eric Christopher8cab6ed2013-01-04 21:51:53 +00001662 addString(IdxTy, dwarf::DW_AT_name, "int");
David Blaikie770530b2013-10-21 17:28:37 +00001663 addUInt(IdxTy, dwarf::DW_AT_byte_size, None, sizeof(int32_t));
Devang Patel161b2f42011-04-12 23:21:44 +00001664 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1665 dwarf::DW_ATE_signed);
Devang Patel161b2f42011-04-12 23:21:44 +00001666 setIndexTyDie(IdxTy);
1667 }
1668
1669 // Add subranges to array type.
Eric Christopherdc1363f2013-08-08 07:40:37 +00001670 DIArray Elements = CTy->getTypeArray();
Devang Patel161b2f42011-04-12 23:21:44 +00001671 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1672 DIDescriptor Element = Elements.getElement(i);
1673 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1674 constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1675 }
1676}
1677
1678/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
Manman Ren99addee2013-10-23 22:57:12 +00001679void CompileUnit::constructEnumTypeDIE(DIE &Buffer, DIEnumerator ETy) {
Manman Ren1a5e7872013-10-29 00:53:03 +00001680 DIE *Enumerator = createAndAddDIE(dwarf::DW_TAG_enumerator, Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +00001681 StringRef Name = ETy.getName();
Nick Lewycky390c40d2011-10-27 06:44:11 +00001682 addString(Enumerator, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001683 int64_t Value = ETy.getEnumValue();
1684 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
Devang Patel161b2f42011-04-12 23:21:44 +00001685}
1686
Devang Pateldbc64af2011-08-15 17:24:54 +00001687/// constructContainingTypeDIEs - Construct DIEs for types that contain
1688/// vtables.
1689void CompileUnit::constructContainingTypeDIEs() {
1690 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
Eric Christopher6efc0432013-10-19 01:04:47 +00001691 CE = ContainingTypeMap.end();
1692 CI != CE; ++CI) {
Devang Pateldbc64af2011-08-15 17:24:54 +00001693 DIE *SPDie = CI->first;
1694 const MDNode *N = CI->second;
Eric Christopher6efc0432013-10-19 01:04:47 +00001695 if (!N)
1696 continue;
Eric Christopher3f045002013-10-04 17:08:38 +00001697 DIE *NDie = getDIE(N);
Eric Christopher6efc0432013-10-19 01:04:47 +00001698 if (!NDie)
1699 continue;
Manman Ren87b110a2013-10-11 23:58:05 +00001700 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, NDie);
Devang Pateldbc64af2011-08-15 17:24:54 +00001701 }
1702}
1703
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001704/// constructVariableDIE - Construct a DIE for the given DbgVariable.
Eric Christopher6efc0432013-10-19 01:04:47 +00001705DIE *CompileUnit::constructVariableDIE(DbgVariable *DV, bool isScopeAbstract) {
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001706 StringRef Name = DV->getName();
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001707
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001708 // Define variable debug information entry.
David Blaikie916d49e2013-10-04 23:21:16 +00001709 DIE *VariableDie = new DIE(DV->getTag());
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001710 DbgVariable *AbsVar = DV->getAbstractVariable();
1711 DIE *AbsDIE = AbsVar ? AbsVar->getDIE() : NULL;
Manman Ren742671b2013-05-29 17:16:59 +00001712 if (AbsDIE)
Manman Ren87b110a2013-10-11 23:58:05 +00001713 addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin, AbsDIE);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001714 else {
David Blaikie2883fd42013-08-19 03:34:03 +00001715 if (!Name.empty())
1716 addString(VariableDie, dwarf::DW_AT_name, Name);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001717 addSourceLine(VariableDie, DV->getVariable());
1718 addType(VariableDie, DV->getType());
1719 }
1720
1721 if (DV->isArtificial())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001722 addFlag(VariableDie, dwarf::DW_AT_artificial);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001723
1724 if (isScopeAbstract) {
1725 DV->setDIE(VariableDie);
1726 return VariableDie;
1727 }
1728
1729 // Add variable address.
1730
1731 unsigned Offset = DV->getDotDebugLocOffset();
1732 if (Offset != ~0U) {
Eric Christopherafbe0e22013-06-24 21:34:55 +00001733 addLabel(VariableDie, dwarf::DW_AT_location, dwarf::DW_FORM_data4,
1734 Asm->GetTempSymbol("debug_loc", Offset));
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001735 DV->setDIE(VariableDie);
1736 return VariableDie;
1737 }
1738
Eric Christopher8cf5e742011-10-03 15:49:20 +00001739 // Check if variable is described by a DBG_VALUE instruction.
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001740 if (const MachineInstr *DVInsn = DV->getMInsn()) {
David Blaikie6d9dbd52013-06-16 20:34:15 +00001741 assert(DVInsn->getNumOperands() == 3);
1742 if (DVInsn->getOperand(0).isReg()) {
1743 const MachineOperand RegOp = DVInsn->getOperand(0);
Adrian Prantlb2754912013-07-09 21:44:06 +00001744 // If the second operand is an immediate, this is an indirect value.
Adrian Prantl35176402013-07-09 20:28:37 +00001745 if (DVInsn->getOperand(1).isImm()) {
Eric Christopher6efc0432013-10-19 01:04:47 +00001746 MachineLocation Location(RegOp.getReg(),
1747 DVInsn->getOperand(1).getImm());
Eric Christopherf61dbc12013-06-24 21:07:27 +00001748 addVariableAddress(*DV, VariableDie, Location);
David Blaikie6d9dbd52013-06-16 20:34:15 +00001749 } else if (RegOp.getReg())
Eric Christopherf61dbc12013-06-24 21:07:27 +00001750 addVariableAddress(*DV, VariableDie, MachineLocation(RegOp.getReg()));
David Blaikie6d9dbd52013-06-16 20:34:15 +00001751 } else if (DVInsn->getOperand(0).isImm())
Eric Christophere4721492013-07-03 01:08:30 +00001752 addConstantValue(VariableDie, DVInsn->getOperand(0), DV->getType());
David Blaikie6d9dbd52013-06-16 20:34:15 +00001753 else if (DVInsn->getOperand(0).isFPImm())
Eric Christophere4721492013-07-03 01:08:30 +00001754 addConstantFPValue(VariableDie, DVInsn->getOperand(0));
David Blaikie6d9dbd52013-06-16 20:34:15 +00001755 else if (DVInsn->getOperand(0).isCImm())
Eric Christophere4721492013-07-03 01:08:30 +00001756 addConstantValue(VariableDie, DVInsn->getOperand(0).getCImm(),
Manman Renc664d762013-10-05 01:43:03 +00001757 isUnsignedDIType(DD, DV->getType()));
Eric Christophere4721492013-07-03 01:08:30 +00001758
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001759 DV->setDIE(VariableDie);
1760 return VariableDie;
1761 } else {
1762 // .. else use frame index.
1763 int FI = DV->getFrameIndex();
1764 if (FI != ~0) {
1765 unsigned FrameReg = 0;
1766 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
Eric Christopher6efc0432013-10-19 01:04:47 +00001767 int Offset = TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001768 MachineLocation Location(FrameReg, Offset);
Eric Christopherf61dbc12013-06-24 21:07:27 +00001769 addVariableAddress(*DV, VariableDie, Location);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001770 }
1771 }
1772
1773 DV->setDIE(VariableDie);
1774 return VariableDie;
1775}
1776
Manman Rena1d25b62013-10-23 23:00:44 +00001777/// constructMemberDIE - Construct member DIE from DIDerivedType.
1778void CompileUnit::constructMemberDIE(DIE &Buffer, DIDerivedType DT) {
Manman Ren1a5e7872013-10-29 00:53:03 +00001779 DIE *MemberDie = createAndAddDIE(DT.getTag(), Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +00001780 StringRef Name = DT.getName();
1781 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001782 addString(MemberDie, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001783
Manman Ren017ceda2013-10-08 18:42:58 +00001784 addType(MemberDie, resolve(DT.getTypeDerivedFrom()));
Devang Patel161b2f42011-04-12 23:21:44 +00001785
1786 addSourceLine(MemberDie, DT);
1787
1788 DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
David Blaikie770530b2013-10-21 17:28:37 +00001789 addUInt(MemLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
Devang Patel161b2f42011-04-12 23:21:44 +00001790
1791 uint64_t Size = DT.getSizeInBits();
Manman Ren43251002013-10-08 18:46:58 +00001792 uint64_t FieldSize = getBaseTypeSize(DD, DT);
Devang Patel161b2f42011-04-12 23:21:44 +00001793
1794 if (Size != FieldSize) {
1795 // Handle bitfield.
David Blaikie770530b2013-10-21 17:28:37 +00001796 addUInt(MemberDie, dwarf::DW_AT_byte_size, None,
1797 getBaseTypeSize(DD, DT) >> 3);
1798 addUInt(MemberDie, dwarf::DW_AT_bit_size, None, DT.getSizeInBits());
Devang Patel161b2f42011-04-12 23:21:44 +00001799
1800 uint64_t Offset = DT.getOffsetInBits();
1801 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1802 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1803 uint64_t FieldOffset = (HiMark - FieldSize);
1804 Offset -= FieldOffset;
1805
1806 // Maybe we need to work from the other end.
Micah Villmow3574eca2012-10-08 16:38:25 +00001807 if (Asm->getDataLayout().isLittleEndian())
Devang Patel161b2f42011-04-12 23:21:44 +00001808 Offset = FieldSize - (Offset + Size);
David Blaikie770530b2013-10-21 17:28:37 +00001809 addUInt(MemberDie, dwarf::DW_AT_bit_offset, None, Offset);
Devang Patel161b2f42011-04-12 23:21:44 +00001810
1811 // Here WD_AT_data_member_location points to the anonymous
1812 // field that includes this bit field.
David Blaikie770530b2013-10-21 17:28:37 +00001813 addUInt(MemLocationDie, dwarf::DW_FORM_udata, FieldOffset >> 3);
Devang Patel161b2f42011-04-12 23:21:44 +00001814
1815 } else
1816 // This is not a bitfield.
David Blaikie770530b2013-10-21 17:28:37 +00001817 addUInt(MemLocationDie, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
Devang Patel161b2f42011-04-12 23:21:44 +00001818
Eric Christopher6efc0432013-10-19 01:04:47 +00001819 if (DT.getTag() == dwarf::DW_TAG_inheritance && DT.isVirtual()) {
Devang Patel161b2f42011-04-12 23:21:44 +00001820
1821 // For C++, virtual base classes are not at fixed offset. Use following
1822 // expression to extract appropriate offset from vtable.
1823 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1824
1825 DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
David Blaikie770530b2013-10-21 17:28:37 +00001826 addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1827 addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1828 addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1829 addUInt(VBaseLocationDie, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1830 addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1831 addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1832 addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
Devang Patel161b2f42011-04-12 23:21:44 +00001833
David Blaikie770530b2013-10-21 17:28:37 +00001834 addBlock(MemberDie, dwarf::DW_AT_data_member_location, VBaseLocationDie);
Devang Patel161b2f42011-04-12 23:21:44 +00001835 } else
David Blaikie770530b2013-10-21 17:28:37 +00001836 addBlock(MemberDie, dwarf::DW_AT_data_member_location, MemLocationDie);
Devang Patel161b2f42011-04-12 23:21:44 +00001837
1838 if (DT.isProtected())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001839 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001840 dwarf::DW_ACCESS_protected);
1841 else if (DT.isPrivate())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001842 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001843 dwarf::DW_ACCESS_private);
1844 // Otherwise C++ member and base classes are considered public.
Eric Christopher8b4310b2012-11-21 00:34:38 +00001845 else
Nick Lewycky13aaca52011-12-13 05:09:11 +00001846 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001847 dwarf::DW_ACCESS_public);
1848 if (DT.isVirtual())
Nick Lewycky798313d2011-12-14 00:56:07 +00001849 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001850 dwarf::DW_VIRTUALITY_virtual);
Devang Patele9db5e22011-04-16 00:11:51 +00001851
1852 // Objective-C properties.
Devang Patel6588abf2012-02-06 17:49:43 +00001853 if (MDNode *PNode = DT.getObjCProperty())
1854 if (DIEEntry *PropertyDie = getDIEEntry(PNode))
Eric Christopher8b4310b2012-11-21 00:34:38 +00001855 MemberDie->addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4,
Devang Patel6588abf2012-02-06 17:49:43 +00001856 PropertyDie);
1857
David Blaikie01bc2b32012-12-13 22:43:07 +00001858 if (DT.isArtificial())
1859 addFlag(MemberDie, dwarf::DW_AT_artificial);
Devang Patel161b2f42011-04-12 23:21:44 +00001860}
Eric Christopher6b6061f2013-01-16 01:22:23 +00001861
Manman Ren655a10d2013-10-14 20:33:57 +00001862/// getOrCreateStaticMemberDIE - Create new DIE for C++ static member.
1863DIE *CompileUnit::getOrCreateStaticMemberDIE(const DIDerivedType DT) {
Eric Christopher6b6061f2013-01-16 01:22:23 +00001864 if (!DT.Verify())
1865 return NULL;
1866
Manman Ren655a10d2013-10-14 20:33:57 +00001867 // Construct the context before querying for the existence of the DIE in case
1868 // such construction creates the DIE.
1869 DIE *ContextDIE = getOrCreateContextDIE(resolve(DT.getContext()));
1870 assert(ContextDIE && "Static member should belong to a non-CU context.");
1871
1872 DIE *StaticMemberDIE = getDIE(DT);
1873 if (StaticMemberDIE)
1874 return StaticMemberDIE;
1875
Manman Ren1a5e7872013-10-29 00:53:03 +00001876 StaticMemberDIE = createAndAddDIE(DT.getTag(), *ContextDIE, DT);
Manman Ren655a10d2013-10-14 20:33:57 +00001877
Manman Ren017ceda2013-10-08 18:42:58 +00001878 DIType Ty = resolve(DT.getTypeDerivedFrom());
Eric Christopher6b6061f2013-01-16 01:22:23 +00001879
1880 addString(StaticMemberDIE, dwarf::DW_AT_name, DT.getName());
1881 addType(StaticMemberDIE, Ty);
1882 addSourceLine(StaticMemberDIE, DT);
1883 addFlag(StaticMemberDIE, dwarf::DW_AT_external);
1884 addFlag(StaticMemberDIE, dwarf::DW_AT_declaration);
1885
1886 // FIXME: We could omit private if the parent is a class_type, and
1887 // public if the parent is something else.
1888 if (DT.isProtected())
1889 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1890 dwarf::DW_ACCESS_protected);
1891 else if (DT.isPrivate())
1892 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1893 dwarf::DW_ACCESS_private);
1894 else
1895 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1896 dwarf::DW_ACCESS_public);
1897
1898 if (const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(DT.getConstant()))
Manman Renc664d762013-10-05 01:43:03 +00001899 addConstantValue(StaticMemberDIE, CI, isUnsignedDIType(DD, Ty));
David Blaikie14268412013-01-20 01:18:01 +00001900 if (const ConstantFP *CFP = dyn_cast_or_null<ConstantFP>(DT.getConstant()))
1901 addConstantFPValue(StaticMemberDIE, CFP);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001902
Eric Christopher6b6061f2013-01-16 01:22:23 +00001903 return StaticMemberDIE;
1904}
David Blaikie1d361132013-10-30 20:42:41 +00001905
1906void CompileUnit::emitHeader(const MCSection *ASection,
1907 const MCSymbol *ASectionSym) {
1908 Asm->OutStreamer.AddComment("DWARF version number");
1909 Asm->EmitInt16(DD->getDwarfVersion());
1910 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
1911 Asm->EmitSectionOffset(Asm->GetTempSymbol(ASection->getLabelBeginName()),
1912 ASectionSym);
1913 Asm->OutStreamer.AddComment("Address Size (in bytes)");
1914 Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
1915}