blob: 27ba19a89647c1231cc5d3de4ed24004966d3362 [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"
Devang Patel6f9d8ff2011-08-15 17:57:41 +000025#include "llvm/Target/Mangler.h"
Devang Patel161b2f42011-04-12 23:21:44 +000026#include "llvm/Target/TargetFrameLowering.h"
27#include "llvm/Target/TargetMachine.h"
David Blaikie59eaa382013-06-28 20:05:11 +000028#include "llvm/Target/TargetLoweringObjectFile.h"
Devang Patel161b2f42011-04-12 23:21:44 +000029#include "llvm/Target/TargetRegisterInfo.h"
Devang Patel161b2f42011-04-12 23:21:44 +000030
31using namespace llvm;
32
33/// CompileUnit - Compile unit constructor.
Eric Christopher7b878952013-08-26 23:50:38 +000034CompileUnit::CompileUnit(unsigned UID, DIE *D, const MDNode *N, AsmPrinter *A,
35 DwarfDebug *DW, DwarfUnits *DWU)
Manman Ren3eabc2a2013-10-29 22:57:10 +000036 : UniqueID(UID), Node(N), CUDie(D), Asm(A), DD(DW), DU(DWU), IndexTyDie(0),
37 DebugInfoOffset(0) {
Devang Patel161b2f42011-04-12 23:21:44 +000038 DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
Eric Christopher9c57ad22013-05-08 00:58:51 +000039 insertDIE(N, D);
Devang Patel161b2f42011-04-12 23:21:44 +000040}
41
42/// ~CompileUnit - Destructor for compile unit.
43CompileUnit::~CompileUnit() {
44 for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
45 DIEBlocks[j]->~DIEBlock();
46}
47
48/// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
49/// information entry.
50DIEEntry *CompileUnit::createDIEEntry(DIE *Entry) {
51 DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
52 return Value;
53}
54
Bill Wendling6afe4782012-12-06 07:55:19 +000055/// getDefaultLowerBound - Return the default lower bound for an array. If the
Bill Wendling222c2fd2012-12-06 07:38:10 +000056/// DWARF version doesn't handle the language, return -1.
Bill Wendling6afe4782012-12-06 07:55:19 +000057int64_t CompileUnit::getDefaultLowerBound() const {
Eric Christopher7b878952013-08-26 23:50:38 +000058 switch (DICompileUnit(Node).getLanguage()) {
Bill Wendling222c2fd2012-12-06 07:38:10 +000059 default:
60 break;
61
62 case dwarf::DW_LANG_C89:
63 case dwarf::DW_LANG_C99:
64 case dwarf::DW_LANG_C:
65 case dwarf::DW_LANG_C_plus_plus:
66 case dwarf::DW_LANG_ObjC:
67 case dwarf::DW_LANG_ObjC_plus_plus:
68 return 0;
69
70 case dwarf::DW_LANG_Fortran77:
71 case dwarf::DW_LANG_Fortran90:
72 case dwarf::DW_LANG_Fortran95:
73 return 1;
74
75 // The languages below have valid values only if the DWARF version >= 4.
76 case dwarf::DW_LANG_Java:
77 case dwarf::DW_LANG_Python:
78 case dwarf::DW_LANG_UPC:
79 case dwarf::DW_LANG_D:
80 if (dwarf::DWARF_VERSION >= 4)
81 return 0;
82 break;
83
84 case dwarf::DW_LANG_Ada83:
85 case dwarf::DW_LANG_Ada95:
86 case dwarf::DW_LANG_Cobol74:
87 case dwarf::DW_LANG_Cobol85:
88 case dwarf::DW_LANG_Modula2:
89 case dwarf::DW_LANG_Pascal83:
90 case dwarf::DW_LANG_PLI:
91 if (dwarf::DWARF_VERSION >= 4)
92 return 1;
93 break;
94 }
95
96 return -1;
97}
98
Eric Christopher873cf0a2012-08-24 01:14:27 +000099/// addFlag - Add a flag that is true.
David Blaikie770530b2013-10-21 17:28:37 +0000100void CompileUnit::addFlag(DIE *Die, dwarf::Attribute Attribute) {
Michael Gottesmandc42d032013-09-04 04:39:38 +0000101 if (DD->getDwarfVersion() >= 4)
Eric Christopher9c0c9482013-10-04 22:40:05 +0000102 Die->addValue(Attribute, dwarf::DW_FORM_flag_present, DIEIntegerOne);
Eric Christopher873cf0a2012-08-24 01:14:27 +0000103 else
Eric Christopher9c0c9482013-10-04 22:40:05 +0000104 Die->addValue(Attribute, dwarf::DW_FORM_flag, DIEIntegerOne);
Eric Christopher873cf0a2012-08-24 01:14:27 +0000105}
106
Devang Patel161b2f42011-04-12 23:21:44 +0000107/// addUInt - Add an unsigned integer attribute data and value.
108///
David Blaikie770530b2013-10-21 17:28:37 +0000109void CompileUnit::addUInt(DIE *Die, dwarf::Attribute Attribute,
110 Optional<dwarf::Form> Form, uint64_t Integer) {
Eric Christopher6efc0432013-10-19 01:04:47 +0000111 if (!Form)
112 Form = DIEInteger::BestForm(false, Integer);
113 DIEValue *Value = Integer == 1 ? DIEIntegerOne : new (DIEValueAllocator)
114 DIEInteger(Integer);
David Blaikie770530b2013-10-21 17:28:37 +0000115 Die->addValue(Attribute, *Form, Value);
116}
117
118void CompileUnit::addUInt(DIEBlock *Block, dwarf::Form Form, uint64_t Integer) {
119 addUInt(Block, (dwarf::Attribute)0, Form, Integer);
Devang Patel161b2f42011-04-12 23:21:44 +0000120}
121
122/// addSInt - Add an signed integer attribute data and value.
123///
David Blaikie770530b2013-10-21 17:28:37 +0000124void CompileUnit::addSInt(DIE *Die, dwarf::Attribute Attribute,
125 Optional<dwarf::Form> Form, int64_t Integer) {
Eric Christopher6efc0432013-10-19 01:04:47 +0000126 if (!Form)
127 Form = DIEInteger::BestForm(true, Integer);
Devang Patel161b2f42011-04-12 23:21:44 +0000128 DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
David Blaikie770530b2013-10-21 17:28:37 +0000129 Die->addValue(Attribute, *Form, Value);
130}
131
132void CompileUnit::addSInt(DIEBlock *Die, Optional<dwarf::Form> Form,
133 int64_t Integer) {
134 addSInt(Die, (dwarf::Attribute)0, Form, Integer);
Devang Patel161b2f42011-04-12 23:21:44 +0000135}
136
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000137/// addString - Add a string attribute data and value. We always emit a
138/// reference to the string pool instead of immediate strings so that DIEs have
Eric Christopher3cc42202013-01-07 19:32:45 +0000139/// more predictable sizes. In the case of split dwarf we emit an index
140/// into another table which gets us the static offset into the string
141/// table.
David Blaikie770530b2013-10-21 17:28:37 +0000142void CompileUnit::addString(DIE *Die, dwarf::Attribute Attribute, StringRef String) {
Eric Christopher3dee5752013-07-26 17:02:41 +0000143 DIEValue *Value;
David Blaikie770530b2013-10-21 17:28:37 +0000144 dwarf::Form Form;
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000145 if (!DD->useSplitDwarf()) {
146 MCSymbol *Symb = DU->getStringPoolEntry(String);
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000147 if (Asm->needsRelocationsForDwarfStringPool())
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000148 Value = new (DIEValueAllocator) DIELabel(Symb);
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000149 else {
150 MCSymbol *StringPool = DU->getStringPoolSym();
151 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
152 }
Eric Christopher3dee5752013-07-26 17:02:41 +0000153 Form = dwarf::DW_FORM_strp;
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000154 } else {
155 unsigned idx = DU->getStringPoolIndex(String);
Eric Christopher3dee5752013-07-26 17:02:41 +0000156 Value = new (DIEValueAllocator) DIEInteger(idx);
157 Form = dwarf::DW_FORM_GNU_str_index;
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000158 }
Eric Christopher3dee5752013-07-26 17:02:41 +0000159 DIEValue *Str = new (DIEValueAllocator) DIEString(Value, String);
160 Die->addValue(Attribute, Form, Str);
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000161}
162
163/// addLocalString - Add a string attribute data and value. This is guaranteed
164/// to be in the local string pool instead of indirected.
David Blaikie770530b2013-10-21 17:28:37 +0000165void CompileUnit::addLocalString(DIE *Die, dwarf::Attribute Attribute,
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000166 StringRef String) {
Eric Christopher2e5d8702012-12-20 21:58:36 +0000167 MCSymbol *Symb = DU->getStringPoolEntry(String);
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000168 DIEValue *Value;
169 if (Asm->needsRelocationsForDwarfStringPool())
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000170 Value = new (DIEValueAllocator) DIELabel(Symb);
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000171 else {
Eric Christopher2e5d8702012-12-20 21:58:36 +0000172 MCSymbol *StringPool = DU->getStringPoolSym();
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000173 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
Nick Lewycky390c40d2011-10-27 06:44:11 +0000174 }
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000175 Die->addValue(Attribute, dwarf::DW_FORM_strp, Value);
Devang Patel161b2f42011-04-12 23:21:44 +0000176}
177
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000178/// addExpr - Add a Dwarf expression attribute data and value.
Devang Patel161b2f42011-04-12 23:21:44 +0000179///
David Blaikie770530b2013-10-21 17:28:37 +0000180void CompileUnit::addExpr(DIEBlock *Die, dwarf::Form Form, const MCExpr *Expr) {
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000181 DIEValue *Value = new (DIEValueAllocator) DIEExpr(Expr);
David Blaikie770530b2013-10-21 17:28:37 +0000182 Die->addValue((dwarf::Attribute)0, Form, Value);
Devang Patel161b2f42011-04-12 23:21:44 +0000183}
184
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000185/// addLabel - Add a Dwarf label attribute data and value.
186///
David Blaikie770530b2013-10-21 17:28:37 +0000187void CompileUnit::addLabel(DIE *Die, dwarf::Attribute Attribute, dwarf::Form Form,
David Blaikie95e72c92013-06-28 20:05:04 +0000188 const MCSymbol *Label) {
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000189 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
190 Die->addValue(Attribute, Form, Value);
David Blaikie95e72c92013-06-28 20:05:04 +0000191}
192
David Blaikie770530b2013-10-21 17:28:37 +0000193void CompileUnit::addLabel(DIEBlock *Die, dwarf::Form Form,
194 const MCSymbol *Label) {
195 addLabel(Die, (dwarf::Attribute)0, Form, Label);
196}
197
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000198/// addLabelAddress - Add a dwarf label attribute data and value using
199/// DW_FORM_addr or DW_FORM_GNU_addr_index.
200///
David Blaikie770530b2013-10-21 17:28:37 +0000201void CompileUnit::addLabelAddress(DIE *Die, dwarf::Attribute Attribute,
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000202 MCSymbol *Label) {
Alexey Samsonov9d08d692013-10-03 08:54:43 +0000203 if (Label)
204 DD->addArangeLabel(SymbolCU(this, Label));
Richard Mitton5cc319a2013-09-19 23:21:01 +0000205
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000206 if (!DD->useSplitDwarf()) {
207 if (Label != NULL) {
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000208 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000209 Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
210 } else {
211 DIEValue *Value = new (DIEValueAllocator) DIEInteger(0);
212 Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
213 }
214 } else {
215 unsigned idx = DU->getAddrPoolIndex(Label);
216 DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx);
217 Die->addValue(Attribute, dwarf::DW_FORM_GNU_addr_index, Value);
218 }
219}
220
Eric Christopher0969ddf2013-01-18 22:11:33 +0000221/// addOpAddress - Add a dwarf op address data and value using the
222/// form given and an op of either DW_FORM_addr or DW_FORM_GNU_addr_index.
223///
David Blaikie770530b2013-10-21 17:28:37 +0000224void CompileUnit::addOpAddress(DIEBlock *Die, const MCSymbol *Sym) {
Alexey Samsonov9d08d692013-10-03 08:54:43 +0000225 DD->addArangeLabel(SymbolCU(this, Sym));
Eric Christopher0969ddf2013-01-18 22:11:33 +0000226 if (!DD->useSplitDwarf()) {
David Blaikie770530b2013-10-21 17:28:37 +0000227 addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
228 addLabel(Die, dwarf::DW_FORM_udata, Sym);
Eric Christopher0969ddf2013-01-18 22:11:33 +0000229 } else {
David Blaikie770530b2013-10-21 17:28:37 +0000230 addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_addr_index);
231 addUInt(Die, dwarf::DW_FORM_GNU_addr_index, DU->getAddrPoolIndex(Sym));
Eric Christopher0969ddf2013-01-18 22:11:33 +0000232 }
233}
234
Devang Patel161b2f42011-04-12 23:21:44 +0000235/// addDelta - Add a label delta attribute data and value.
236///
David Blaikie770530b2013-10-21 17:28:37 +0000237void CompileUnit::addDelta(DIE *Die, dwarf::Attribute Attribute, dwarf::Form Form,
Devang Patel161b2f42011-04-12 23:21:44 +0000238 const MCSymbol *Hi, const MCSymbol *Lo) {
239 DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
240 Die->addValue(Attribute, Form, Value);
241}
242
243/// addDIEEntry - Add a DIE attribute data and value.
244///
David Blaikie770530b2013-10-21 17:28:37 +0000245void CompileUnit::addDIEEntry(DIE *Die, dwarf::Attribute Attribute, DIE *Entry) {
Manman Ren87b110a2013-10-11 23:58:05 +0000246 // We currently only use ref4.
247 Die->addValue(Attribute, dwarf::DW_FORM_ref4, createDIEEntry(Entry));
Devang Patel161b2f42011-04-12 23:21:44 +0000248}
249
Manman Ren1a5e7872013-10-29 00:53:03 +0000250/// Create a DIE with the given Tag, add the DIE to its parent, and
251/// call insertDIE if MD is not null.
252DIE *CompileUnit::createAndAddDIE(unsigned Tag, DIE &Parent, const MDNode *MD) {
253 DIE *Die = new DIE(Tag);
254 Parent.addChild(Die);
255 if (MD)
256 insertDIE(MD, Die);
257 return Die;
258}
259
Devang Patel161b2f42011-04-12 23:21:44 +0000260/// addBlock - Add block data.
261///
David Blaikie770530b2013-10-21 17:28:37 +0000262void CompileUnit::addBlock(DIE *Die, dwarf::Attribute Attribute,
Devang Patel161b2f42011-04-12 23:21:44 +0000263 DIEBlock *Block) {
264 Block->ComputeSize(Asm);
265 DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
266 Die->addValue(Attribute, Block->BestForm(), Block);
267}
268
269/// addSourceLine - Add location information to specified debug information
270/// entry.
271void CompileUnit::addSourceLine(DIE *Die, DIVariable V) {
272 // Verify variable.
Manman Rend03d2b22013-07-08 18:33:29 +0000273 if (!V.isVariable())
Devang Patel161b2f42011-04-12 23:21:44 +0000274 return;
Eric Christopher8b4310b2012-11-21 00:34:38 +0000275
Devang Patel161b2f42011-04-12 23:21:44 +0000276 unsigned Line = V.getLineNumber();
277 if (Line == 0)
278 return;
Eric Christopher6efc0432013-10-19 01:04:47 +0000279 unsigned FileID =
280 DD->getOrCreateSourceID(V.getContext().getFilename(),
281 V.getContext().getDirectory(), getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000282 assert(FileID && "Invalid file id");
David Blaikie770530b2013-10-21 17:28:37 +0000283 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
284 addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
Devang Patel161b2f42011-04-12 23:21:44 +0000285}
286
287/// addSourceLine - Add location information to specified debug information
288/// entry.
289void CompileUnit::addSourceLine(DIE *Die, DIGlobalVariable G) {
290 // Verify global variable.
Manman Rend03d2b22013-07-08 18:33:29 +0000291 if (!G.isGlobalVariable())
Devang Patel161b2f42011-04-12 23:21:44 +0000292 return;
293
294 unsigned Line = G.getLineNumber();
295 if (Line == 0)
296 return;
Eric Christopher6efc0432013-10-19 01:04:47 +0000297 unsigned FileID =
298 DD->getOrCreateSourceID(G.getFilename(), G.getDirectory(), getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000299 assert(FileID && "Invalid file id");
David Blaikie770530b2013-10-21 17:28:37 +0000300 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
301 addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
Devang Patel161b2f42011-04-12 23:21:44 +0000302}
303
304/// addSourceLine - Add location information to specified debug information
305/// entry.
306void CompileUnit::addSourceLine(DIE *Die, DISubprogram SP) {
307 // Verify subprogram.
Manman Rend03d2b22013-07-08 18:33:29 +0000308 if (!SP.isSubprogram())
Devang Patel161b2f42011-04-12 23:21:44 +0000309 return;
Eric Christopher2125d5a2012-03-15 23:55:40 +0000310
Devang Patel161b2f42011-04-12 23:21:44 +0000311 // If the line number is 0, don't add it.
Eric Christopher2125d5a2012-03-15 23:55:40 +0000312 unsigned Line = SP.getLineNumber();
313 if (Line == 0)
Devang Patel161b2f42011-04-12 23:21:44 +0000314 return;
315
Eric Christopher6efc0432013-10-19 01:04:47 +0000316 unsigned FileID = DD->getOrCreateSourceID(SP.getFilename(), SP.getDirectory(),
317 getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000318 assert(FileID && "Invalid file id");
David Blaikie770530b2013-10-21 17:28:37 +0000319 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
320 addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
Devang Patel161b2f42011-04-12 23:21:44 +0000321}
322
323/// addSourceLine - Add location information to specified debug information
324/// entry.
325void CompileUnit::addSourceLine(DIE *Die, DIType Ty) {
326 // Verify type.
Manman Rend03d2b22013-07-08 18:33:29 +0000327 if (!Ty.isType())
Devang Patel161b2f42011-04-12 23:21:44 +0000328 return;
329
330 unsigned Line = Ty.getLineNumber();
Eric Christopher2125d5a2012-03-15 23:55:40 +0000331 if (Line == 0)
Devang Patel161b2f42011-04-12 23:21:44 +0000332 return;
Eric Christopher6efc0432013-10-19 01:04:47 +0000333 unsigned FileID = DD->getOrCreateSourceID(Ty.getFilename(), Ty.getDirectory(),
334 getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000335 assert(FileID && "Invalid file id");
David Blaikie770530b2013-10-21 17:28:37 +0000336 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
337 addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
Devang Patel161b2f42011-04-12 23:21:44 +0000338}
339
340/// addSourceLine - Add location information to specified debug information
341/// entry.
Eric Christopherb8ca9882012-03-29 08:42:56 +0000342void CompileUnit::addSourceLine(DIE *Die, DIObjCProperty Ty) {
343 // Verify type.
Manman Rend03d2b22013-07-08 18:33:29 +0000344 if (!Ty.isObjCProperty())
Eric Christopherb8ca9882012-03-29 08:42:56 +0000345 return;
346
347 unsigned Line = Ty.getLineNumber();
348 if (Line == 0)
349 return;
350 DIFile File = Ty.getFile();
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000351 unsigned FileID = DD->getOrCreateSourceID(File.getFilename(),
Manman Ren3de61b42013-03-07 01:42:00 +0000352 File.getDirectory(), getUniqueID());
Eric Christopherb8ca9882012-03-29 08:42:56 +0000353 assert(FileID && "Invalid file id");
David Blaikie770530b2013-10-21 17:28:37 +0000354 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
355 addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
Eric Christopherb8ca9882012-03-29 08:42:56 +0000356}
357
358/// addSourceLine - Add location information to specified debug information
359/// entry.
Devang Patel161b2f42011-04-12 23:21:44 +0000360void CompileUnit::addSourceLine(DIE *Die, DINameSpace NS) {
361 // Verify namespace.
362 if (!NS.Verify())
363 return;
364
365 unsigned Line = NS.getLineNumber();
366 if (Line == 0)
367 return;
368 StringRef FN = NS.getFilename();
369
Eric Christopher6efc0432013-10-19 01:04:47 +0000370 unsigned FileID =
371 DD->getOrCreateSourceID(FN, NS.getDirectory(), getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000372 assert(FileID && "Invalid file id");
David Blaikie770530b2013-10-21 17:28:37 +0000373 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
374 addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
Devang Patel161b2f42011-04-12 23:21:44 +0000375}
376
Eric Christopher8b4310b2012-11-21 00:34:38 +0000377/// addVariableAddress - Add DW_AT_location attribute for a
Devang Patele1cdf842011-04-27 22:45:24 +0000378/// DbgVariable based on provided MachineLocation.
Eric Christopherf61dbc12013-06-24 21:07:27 +0000379void CompileUnit::addVariableAddress(const DbgVariable &DV, DIE *Die,
Devang Patele1cdf842011-04-27 22:45:24 +0000380 MachineLocation Location) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000381 if (DV.variableHasComplexAddress())
Devang Patel161b2f42011-04-12 23:21:44 +0000382 addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
Eric Christopherf61dbc12013-06-24 21:07:27 +0000383 else if (DV.isBlockByrefVariable())
Devang Patel161b2f42011-04-12 23:21:44 +0000384 addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location);
385 else
David Blaikie4532c282013-06-20 00:25:24 +0000386 addAddress(Die, dwarf::DW_AT_location, Location,
Eric Christopherf61dbc12013-06-24 21:07:27 +0000387 DV.getVariable().isIndirect());
Devang Patel161b2f42011-04-12 23:21:44 +0000388}
389
Devang Patel116da2f2011-04-26 19:06:18 +0000390/// addRegisterOp - Add register operand.
David Blaikie770530b2013-10-21 17:28:37 +0000391void CompileUnit::addRegisterOp(DIEBlock *TheDie, unsigned Reg) {
Devang Patel116da2f2011-04-26 19:06:18 +0000392 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
393 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
394 if (DWReg < 32)
David Blaikie770530b2013-10-21 17:28:37 +0000395 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + DWReg);
Devang Patel116da2f2011-04-26 19:06:18 +0000396 else {
David Blaikie770530b2013-10-21 17:28:37 +0000397 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
398 addUInt(TheDie, dwarf::DW_FORM_udata, DWReg);
Devang Patel116da2f2011-04-26 19:06:18 +0000399 }
400}
401
402/// addRegisterOffset - Add register offset.
David Blaikie770530b2013-10-21 17:28:37 +0000403void CompileUnit::addRegisterOffset(DIEBlock *TheDie, unsigned Reg,
404 int64_t Offset) {
Devang Patel116da2f2011-04-26 19:06:18 +0000405 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
406 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
407 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
408 if (Reg == TRI->getFrameRegister(*Asm->MF))
409 // If variable offset is based in frame register then use fbreg.
David Blaikie770530b2013-10-21 17:28:37 +0000410 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
Devang Patel116da2f2011-04-26 19:06:18 +0000411 else if (DWReg < 32)
David Blaikie770530b2013-10-21 17:28:37 +0000412 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DWReg);
Devang Patel116da2f2011-04-26 19:06:18 +0000413 else {
David Blaikie770530b2013-10-21 17:28:37 +0000414 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
415 addUInt(TheDie, dwarf::DW_FORM_udata, DWReg);
Devang Patel116da2f2011-04-26 19:06:18 +0000416 }
David Blaikie770530b2013-10-21 17:28:37 +0000417 addSInt(TheDie, dwarf::DW_FORM_sdata, Offset);
Devang Patel116da2f2011-04-26 19:06:18 +0000418}
419
420/// addAddress - Add an address attribute to a die based on the location
421/// provided.
David Blaikie770530b2013-10-21 17:28:37 +0000422void CompileUnit::addAddress(DIE *Die, dwarf::Attribute Attribute,
David Blaikie4532c282013-06-20 00:25:24 +0000423 const MachineLocation &Location, bool Indirect) {
Devang Patel116da2f2011-04-26 19:06:18 +0000424 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
425
David Blaikie4532c282013-06-20 00:25:24 +0000426 if (Location.isReg() && !Indirect)
Devang Patel116da2f2011-04-26 19:06:18 +0000427 addRegisterOp(Block, Location.getReg());
David Blaikie4532c282013-06-20 00:25:24 +0000428 else {
Devang Patel116da2f2011-04-26 19:06:18 +0000429 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
David Blaikie4532c282013-06-20 00:25:24 +0000430 if (Indirect && !Location.isReg()) {
David Blaikie770530b2013-10-21 17:28:37 +0000431 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
David Blaikie4532c282013-06-20 00:25:24 +0000432 }
433 }
Devang Patel116da2f2011-04-26 19:06:18 +0000434
435 // Now attach the location information to the DIE.
David Blaikie770530b2013-10-21 17:28:37 +0000436 addBlock(Die, Attribute, Block);
Devang Patel116da2f2011-04-26 19:06:18 +0000437}
438
Devang Patel161b2f42011-04-12 23:21:44 +0000439/// addComplexAddress - Start with the address based on the location provided,
440/// and generate the DWARF information necessary to find the actual variable
441/// given the extra address information encoded in the DIVariable, starting from
442/// the starting location. Add the DWARF information to the die.
443///
Eric Christopherf61dbc12013-06-24 21:07:27 +0000444void CompileUnit::addComplexAddress(const DbgVariable &DV, DIE *Die,
David Blaikie770530b2013-10-21 17:28:37 +0000445 dwarf::Attribute Attribute,
Devang Patel161b2f42011-04-12 23:21:44 +0000446 const MachineLocation &Location) {
Devang Patel161b2f42011-04-12 23:21:44 +0000447 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Eric Christopherf61dbc12013-06-24 21:07:27 +0000448 unsigned N = DV.getNumAddrElements();
Devang Patelc26f5442011-04-28 02:22:40 +0000449 unsigned i = 0;
450 if (Location.isReg()) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000451 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
Devang Patelc26f5442011-04-28 02:22:40 +0000452 // If first address element is OpPlus then emit
453 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
Eric Christopherf61dbc12013-06-24 21:07:27 +0000454 addRegisterOffset(Block, Location.getReg(), DV.getAddrElement(1));
Devang Patelc26f5442011-04-28 02:22:40 +0000455 i = 2;
456 } else
457 addRegisterOp(Block, Location.getReg());
Eric Christopher6efc0432013-10-19 01:04:47 +0000458 } else
Devang Patel116da2f2011-04-26 19:06:18 +0000459 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel161b2f42011-04-12 23:21:44 +0000460
Eric Christopher6efc0432013-10-19 01:04:47 +0000461 for (; i < N; ++i) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000462 uint64_t Element = DV.getAddrElement(i);
Devang Patel161b2f42011-04-12 23:21:44 +0000463 if (Element == DIBuilder::OpPlus) {
David Blaikie770530b2013-10-21 17:28:37 +0000464 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
465 addUInt(Block, dwarf::DW_FORM_udata, DV.getAddrElement(++i));
Devang Patel161b2f42011-04-12 23:21:44 +0000466 } else if (Element == DIBuilder::OpDeref) {
Eric Christopher50120762012-05-08 18:56:00 +0000467 if (!Location.isReg())
David Blaikie770530b2013-10-21 17:28:37 +0000468 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Eric Christopher6efc0432013-10-19 01:04:47 +0000469 } else
470 llvm_unreachable("unknown DIBuilder Opcode");
Devang Patel161b2f42011-04-12 23:21:44 +0000471 }
472
473 // Now attach the location information to the DIE.
David Blaikie770530b2013-10-21 17:28:37 +0000474 addBlock(Die, Attribute, Block);
Devang Patel161b2f42011-04-12 23:21:44 +0000475}
476
477/* Byref variables, in Blocks, are declared by the programmer as "SomeType
478 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
479 gives the variable VarName either the struct, or a pointer to the struct, as
480 its type. This is necessary for various behind-the-scenes things the
481 compiler needs to do with by-reference variables in Blocks.
482
483 However, as far as the original *programmer* is concerned, the variable
484 should still have type 'SomeType', as originally declared.
485
486 The function getBlockByrefType dives into the __Block_byref_x_VarName
487 struct to find the original type of the variable, which is then assigned to
488 the variable's Debug Information Entry as its real type. So far, so good.
489 However now the debugger will expect the variable VarName to have the type
490 SomeType. So we need the location attribute for the variable to be an
491 expression that explains to the debugger how to navigate through the
492 pointers and struct to find the actual variable of type SomeType.
493
494 The following function does just that. We start by getting
495 the "normal" location for the variable. This will be the location
496 of either the struct __Block_byref_x_VarName or the pointer to the
497 struct __Block_byref_x_VarName.
498
499 The struct will look something like:
500
501 struct __Block_byref_x_VarName {
502 ... <various fields>
503 struct __Block_byref_x_VarName *forwarding;
504 ... <various other fields>
505 SomeType VarName;
506 ... <maybe more fields>
507 };
508
509 If we are given the struct directly (as our starting point) we
510 need to tell the debugger to:
511
512 1). Add the offset of the forwarding field.
513
514 2). Follow that pointer to get the real __Block_byref_x_VarName
515 struct to use (the real one may have been copied onto the heap).
516
517 3). Add the offset for the field VarName, to find the actual variable.
518
519 If we started with a pointer to the struct, then we need to
520 dereference that pointer first, before the other steps.
521 Translating this into DWARF ops, we will need to append the following
522 to the current location description for the variable:
523
524 DW_OP_deref -- optional, if we start with a pointer
525 DW_OP_plus_uconst <forward_fld_offset>
526 DW_OP_deref
527 DW_OP_plus_uconst <varName_fld_offset>
528
529 That is what this function does. */
530
531/// addBlockByrefAddress - Start with the address based on the location
532/// provided, and generate the DWARF information necessary to find the
533/// actual Block variable (navigating the Block struct) based on the
534/// starting location. Add the DWARF information to the die. For
535/// more information, read large comment just above here.
536///
Eric Christopherf61dbc12013-06-24 21:07:27 +0000537void CompileUnit::addBlockByrefAddress(const DbgVariable &DV, DIE *Die,
David Blaikie770530b2013-10-21 17:28:37 +0000538 dwarf::Attribute Attribute,
Devang Patel161b2f42011-04-12 23:21:44 +0000539 const MachineLocation &Location) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000540 DIType Ty = DV.getType();
Devang Patel161b2f42011-04-12 23:21:44 +0000541 DIType TmpTy = Ty;
Eric Christopher31667622013-08-08 01:41:00 +0000542 uint16_t Tag = Ty.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +0000543 bool isPointer = false;
544
Eric Christopherf61dbc12013-06-24 21:07:27 +0000545 StringRef varName = DV.getName();
Devang Patel161b2f42011-04-12 23:21:44 +0000546
547 if (Tag == dwarf::DW_TAG_pointer_type) {
548 DIDerivedType DTy = DIDerivedType(Ty);
Manman Ren017ceda2013-10-08 18:42:58 +0000549 TmpTy = resolve(DTy.getTypeDerivedFrom());
Devang Patel161b2f42011-04-12 23:21:44 +0000550 isPointer = true;
551 }
552
553 DICompositeType blockStruct = DICompositeType(TmpTy);
554
555 // Find the __forwarding field and the variable field in the __Block_byref
556 // struct.
557 DIArray Fields = blockStruct.getTypeArray();
558 DIDescriptor varField = DIDescriptor();
559 DIDescriptor forwardingField = DIDescriptor();
560
561 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
562 DIDescriptor Element = Fields.getElement(i);
563 DIDerivedType DT = DIDerivedType(Element);
564 StringRef fieldName = DT.getName();
565 if (fieldName == "__forwarding")
566 forwardingField = Element;
567 else if (fieldName == varName)
568 varField = Element;
569 }
570
571 // Get the offsets for the forwarding field and the variable field.
572 unsigned forwardingFieldOffset =
Eric Christopher6efc0432013-10-19 01:04:47 +0000573 DIDerivedType(forwardingField).getOffsetInBits() >> 3;
574 unsigned varFieldOffset = DIDerivedType(varField).getOffsetInBits() >> 3;
Devang Patel161b2f42011-04-12 23:21:44 +0000575
576 // Decode the original location, and use that as the start of the byref
577 // variable's location.
Devang Patel161b2f42011-04-12 23:21:44 +0000578 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
579
Eric Christophercaba2632012-07-04 02:02:18 +0000580 if (Location.isReg())
581 addRegisterOp(Block, Location.getReg());
582 else
583 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel161b2f42011-04-12 23:21:44 +0000584
585 // If we started with a pointer to the __Block_byref... struct, then
586 // the first thing we need to do is dereference the pointer (DW_OP_deref).
587 if (isPointer)
David Blaikie770530b2013-10-21 17:28:37 +0000588 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Devang Patel161b2f42011-04-12 23:21:44 +0000589
590 // Next add the offset for the '__forwarding' field:
591 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
592 // adding the offset if it's 0.
593 if (forwardingFieldOffset > 0) {
David Blaikie770530b2013-10-21 17:28:37 +0000594 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
595 addUInt(Block, dwarf::DW_FORM_udata, forwardingFieldOffset);
Devang Patel161b2f42011-04-12 23:21:44 +0000596 }
597
598 // Now dereference the __forwarding field to get to the real __Block_byref
599 // struct: DW_OP_deref.
David Blaikie770530b2013-10-21 17:28:37 +0000600 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Devang Patel161b2f42011-04-12 23:21:44 +0000601
602 // Now that we've got the real __Block_byref... struct, add the offset
603 // for the variable's field to get to the location of the actual variable:
604 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
605 if (varFieldOffset > 0) {
David Blaikie770530b2013-10-21 17:28:37 +0000606 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
607 addUInt(Block, dwarf::DW_FORM_udata, varFieldOffset);
Devang Patel161b2f42011-04-12 23:21:44 +0000608 }
609
610 // Now attach the location information to the DIE.
David Blaikie770530b2013-10-21 17:28:37 +0000611 addBlock(Die, Attribute, Block);
Devang Patel161b2f42011-04-12 23:21:44 +0000612}
613
Devang Patel4ec14b02011-07-20 21:57:04 +0000614/// isTypeSigned - Return true if the type is signed.
Manman Renc664d762013-10-05 01:43:03 +0000615static bool isTypeSigned(DwarfDebug *DD, DIType Ty, int *SizeInBits) {
Devang Patel4ec14b02011-07-20 21:57:04 +0000616 if (Ty.isDerivedType())
Manman Renc664d762013-10-05 01:43:03 +0000617 return isTypeSigned(DD, DD->resolve(DIDerivedType(Ty).getTypeDerivedFrom()),
618 SizeInBits);
Devang Patel4ec14b02011-07-20 21:57:04 +0000619 if (Ty.isBasicType())
Eric Christopher6efc0432013-10-19 01:04:47 +0000620 if (DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed ||
621 DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed_char) {
Devang Patel4ec14b02011-07-20 21:57:04 +0000622 *SizeInBits = Ty.getSizeInBits();
623 return true;
624 }
625 return false;
626}
627
Manman Renc664d762013-10-05 01:43:03 +0000628/// Return true if type encoding is unsigned.
629static bool isUnsignedDIType(DwarfDebug *DD, DIType Ty) {
630 DIDerivedType DTy(Ty);
631 if (DTy.isDerivedType())
632 return isUnsignedDIType(DD, DD->resolve(DTy.getTypeDerivedFrom()));
633
634 DIBasicType BTy(Ty);
635 if (BTy.isBasicType()) {
636 unsigned Encoding = BTy.getEncoding();
637 if (Encoding == dwarf::DW_ATE_unsigned ||
638 Encoding == dwarf::DW_ATE_unsigned_char ||
639 Encoding == dwarf::DW_ATE_boolean)
640 return true;
641 }
642 return false;
643}
644
645/// If this type is derived from a base type then return base type size.
Manman Ren43251002013-10-08 18:46:58 +0000646static uint64_t getBaseTypeSize(DwarfDebug *DD, DIDerivedType Ty) {
Manman Renc664d762013-10-05 01:43:03 +0000647 unsigned Tag = Ty.getTag();
648
649 if (Tag != dwarf::DW_TAG_member && Tag != dwarf::DW_TAG_typedef &&
650 Tag != dwarf::DW_TAG_const_type && Tag != dwarf::DW_TAG_volatile_type &&
651 Tag != dwarf::DW_TAG_restrict_type)
652 return Ty.getSizeInBits();
653
654 DIType BaseType = DD->resolve(Ty.getTypeDerivedFrom());
655
656 // If this type is not derived from any type then take conservative approach.
657 if (!BaseType.isValid())
658 return Ty.getSizeInBits();
659
660 // If this is a derived type, go ahead and get the base type, unless it's a
661 // reference then it's just the size of the field. Pointer types have no need
662 // of this since they're a different type of qualification on the type.
663 if (BaseType.getTag() == dwarf::DW_TAG_reference_type ||
664 BaseType.getTag() == dwarf::DW_TAG_rvalue_reference_type)
665 return Ty.getSizeInBits();
666
667 if (BaseType.isDerivedType())
Manman Ren43251002013-10-08 18:46:58 +0000668 return getBaseTypeSize(DD, DIDerivedType(BaseType));
Manman Renc664d762013-10-05 01:43:03 +0000669
670 return BaseType.getSizeInBits();
671}
672
Devang Patel161b2f42011-04-12 23:21:44 +0000673/// addConstantValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000674void CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO,
Devang Patelb58128e2011-05-27 16:45:18 +0000675 DIType Ty) {
David Blaikie4de9d722013-05-10 21:52:07 +0000676 // FIXME: This is a bit conservative/simple - it emits negative values at
677 // their maximum bit width which is a bit unfortunate (& doesn't prefer
678 // udata/sdata over dataN as suggested by the DWARF spec)
Nick Lewycky746cb672011-10-26 22:55:33 +0000679 assert(MO.isImm() && "Invalid machine operand!");
Devang Patel4ec14b02011-07-20 21:57:04 +0000680 int SizeInBits = -1;
Manman Renc664d762013-10-05 01:43:03 +0000681 bool SignedConstant = isTypeSigned(DD, Ty, &SizeInBits);
David Blaikie770530b2013-10-21 17:28:37 +0000682 dwarf::Form Form;
Devang Patel72f0d9c2011-05-27 18:15:52 +0000683
Eric Christopher7b2ee392013-08-27 23:49:04 +0000684 // If we're a signed constant definitely use sdata.
685 if (SignedConstant) {
686 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, MO.getImm());
687 return;
688 }
689
690 // Else use data for now unless it's larger than we can deal with.
691 switch (SizeInBits) {
692 case 8:
693 Form = dwarf::DW_FORM_data1;
694 break;
695 case 16:
696 Form = dwarf::DW_FORM_data2;
697 break;
698 case 32:
699 Form = dwarf::DW_FORM_data4;
700 break;
701 case 64:
702 Form = dwarf::DW_FORM_data8;
703 break;
704 default:
705 Form = dwarf::DW_FORM_udata;
706 addUInt(Die, dwarf::DW_AT_const_value, Form, MO.getImm());
707 return;
708 }
709 addUInt(Die, dwarf::DW_AT_const_value, Form, MO.getImm());
Devang Patel161b2f42011-04-12 23:21:44 +0000710}
711
712/// addConstantFPValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000713void CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
Eric Christopher6efc0432013-10-19 01:04:47 +0000714 assert(MO.isFPImm() && "Invalid machine operand!");
Devang Patel161b2f42011-04-12 23:21:44 +0000715 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
716 APFloat FPImm = MO.getFPImm()->getValueAPF();
717
718 // Get the raw data form of the floating point.
719 const APInt FltVal = FPImm.bitcastToAPInt();
Eric Christopher6efc0432013-10-19 01:04:47 +0000720 const char *FltPtr = (const char *)FltVal.getRawData();
Devang Patel161b2f42011-04-12 23:21:44 +0000721
722 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
Micah Villmow3574eca2012-10-08 16:38:25 +0000723 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel161b2f42011-04-12 23:21:44 +0000724 int Incr = (LittleEndian ? 1 : -1);
725 int Start = (LittleEndian ? 0 : NumBytes - 1);
726 int Stop = (LittleEndian ? NumBytes : -1);
727
728 // Output the constant to DWARF one byte at a time.
729 for (; Start != Stop; Start += Incr)
David Blaikie770530b2013-10-21 17:28:37 +0000730 addUInt(Block, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +0000731 (unsigned char)0xFF & FltPtr[Start]);
732
David Blaikie770530b2013-10-21 17:28:37 +0000733 addBlock(Die, dwarf::DW_AT_const_value, Block);
Devang Patel161b2f42011-04-12 23:21:44 +0000734}
735
David Blaikie14268412013-01-20 01:18:01 +0000736/// addConstantFPValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000737void CompileUnit::addConstantFPValue(DIE *Die, const ConstantFP *CFP) {
Eric Christopher7b2ee392013-08-27 23:49:04 +0000738 // Pass this down to addConstantValue as an unsigned bag of bits.
739 addConstantValue(Die, CFP->getValueAPF().bitcastToAPInt(), true);
David Blaikie14268412013-01-20 01:18:01 +0000740}
741
Devang Patel161b2f42011-04-12 23:21:44 +0000742/// addConstantValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000743void CompileUnit::addConstantValue(DIE *Die, const ConstantInt *CI,
Devang Patel161b2f42011-04-12 23:21:44 +0000744 bool Unsigned) {
Eric Christophere4721492013-07-03 01:08:30 +0000745 addConstantValue(Die, CI->getValue(), Unsigned);
David Blaikie14268412013-01-20 01:18:01 +0000746}
747
748// addConstantValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000749void CompileUnit::addConstantValue(DIE *Die, const APInt &Val, bool Unsigned) {
David Blaikie14268412013-01-20 01:18:01 +0000750 unsigned CIBitWidth = Val.getBitWidth();
Devang Pateld6a81362011-05-28 00:39:18 +0000751 if (CIBitWidth <= 64) {
Eric Christopher7b2ee392013-08-27 23:49:04 +0000752 // If we're a signed constant definitely use sdata.
753 if (!Unsigned) {
754 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata,
755 Val.getSExtValue());
756 return;
Devang Pateld6a81362011-05-28 00:39:18 +0000757 }
Eric Christopher7b2ee392013-08-27 23:49:04 +0000758
759 // Else use data for now unless it's larger than we can deal with.
David Blaikie770530b2013-10-21 17:28:37 +0000760 dwarf::Form Form;
Eric Christopher7b2ee392013-08-27 23:49:04 +0000761 switch (CIBitWidth) {
762 case 8:
763 Form = dwarf::DW_FORM_data1;
764 break;
765 case 16:
766 Form = dwarf::DW_FORM_data2;
767 break;
768 case 32:
769 Form = dwarf::DW_FORM_data4;
770 break;
771 case 64:
772 Form = dwarf::DW_FORM_data8;
773 break;
774 default:
775 addUInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
776 Val.getZExtValue());
777 return;
778 }
779 addUInt(Die, dwarf::DW_AT_const_value, Form, Val.getZExtValue());
Eric Christophere4721492013-07-03 01:08:30 +0000780 return;
Devang Patel161b2f42011-04-12 23:21:44 +0000781 }
782
783 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
784
785 // Get the raw data form of the large APInt.
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000786 const uint64_t *Ptr64 = Val.getRawData();
Devang Patel161b2f42011-04-12 23:21:44 +0000787
788 int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
Micah Villmow3574eca2012-10-08 16:38:25 +0000789 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel161b2f42011-04-12 23:21:44 +0000790
791 // Output the constant to DWARF one byte at a time.
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000792 for (int i = 0; i < NumBytes; i++) {
793 uint8_t c;
794 if (LittleEndian)
795 c = Ptr64[i / 8] >> (8 * (i & 7));
796 else
797 c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7));
David Blaikie770530b2013-10-21 17:28:37 +0000798 addUInt(Block, dwarf::DW_FORM_data1, c);
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000799 }
Devang Patel161b2f42011-04-12 23:21:44 +0000800
David Blaikie770530b2013-10-21 17:28:37 +0000801 addBlock(Die, dwarf::DW_AT_const_value, Block);
Devang Patel161b2f42011-04-12 23:21:44 +0000802}
803
Eric Christopher6c3bb942013-04-22 07:47:40 +0000804/// addTemplateParams - Add template parameters into buffer.
Devang Patel161b2f42011-04-12 23:21:44 +0000805void CompileUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
806 // Add template parameters.
807 for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) {
808 DIDescriptor Element = TParams.getElement(i);
809 if (Element.isTemplateTypeParameter())
Manman Renbe87b692013-10-23 23:05:28 +0000810 constructTemplateTypeParameterDIE(Buffer,
811 DITemplateTypeParameter(Element));
Devang Patel161b2f42011-04-12 23:21:44 +0000812 else if (Element.isTemplateValueParameter())
Manman Renbe87b692013-10-23 23:05:28 +0000813 constructTemplateValueParameterDIE(Buffer,
814 DITemplateValueParameter(Element));
Devang Patel161b2f42011-04-12 23:21:44 +0000815 }
Devang Patel161b2f42011-04-12 23:21:44 +0000816}
Nick Lewycky746cb672011-10-26 22:55:33 +0000817
Eric Christopher6b6061f2013-01-16 01:22:23 +0000818/// getOrCreateContextDIE - Get context owner's DIE.
Eric Christopherccb66362013-10-04 23:49:26 +0000819DIE *CompileUnit::getOrCreateContextDIE(DIScope Context) {
Eric Christopher6b6061f2013-01-16 01:22:23 +0000820 if (Context.isType())
821 return getOrCreateTypeDIE(DIType(Context));
822 else if (Context.isNameSpace())
823 return getOrCreateNameSpace(DINameSpace(Context));
824 else if (Context.isSubprogram())
825 return getOrCreateSubprogramDIE(DISubprogram(Context));
Eric Christopher6c3bb942013-04-22 07:47:40 +0000826 else
Eric Christopher6b6061f2013-01-16 01:22:23 +0000827 return getDIE(Context);
828}
829
Devang Patel161b2f42011-04-12 23:21:44 +0000830/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
831/// given DIType.
Devang Patel94c7ddb2011-08-16 22:09:43 +0000832DIE *CompileUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
833 DIType Ty(TyNode);
Manman Rend03d2b22013-07-08 18:33:29 +0000834 if (!Ty.isType())
Devang Patel94c7ddb2011-08-16 22:09:43 +0000835 return NULL;
Manman Rend498e5e2013-10-29 22:49:29 +0000836
837 // Construct the context before querying for the existence of the DIE in case
838 // such construction creates the DIE.
839 DIE *ContextDIE = getOrCreateContextDIE(resolve(Ty.getContext()));
840 if (!ContextDIE)
841 ContextDIE = CUDie.get();
842
Eric Christopher3f045002013-10-04 17:08:38 +0000843 DIE *TyDIE = getDIE(Ty);
Devang Patel161b2f42011-04-12 23:21:44 +0000844 if (TyDIE)
845 return TyDIE;
846
847 // Create new type.
Manman Rend498e5e2013-10-29 22:49:29 +0000848 TyDIE = createAndAddDIE(Ty.getTag(), *ContextDIE, Ty);
849
Devang Patel161b2f42011-04-12 23:21:44 +0000850 if (Ty.isBasicType())
851 constructTypeDIE(*TyDIE, DIBasicType(Ty));
852 else if (Ty.isCompositeType())
853 constructTypeDIE(*TyDIE, DICompositeType(Ty));
854 else {
855 assert(Ty.isDerivedType() && "Unknown kind of DIType");
856 constructTypeDIE(*TyDIE, DIDerivedType(Ty));
857 }
Eric Christopher1b3f9192011-11-10 19:52:58 +0000858 // If this is a named finished type then include it in the list of types
859 // for the accelerator tables.
Eric Christopherc36145f2012-01-06 04:35:23 +0000860 if (!Ty.getName().empty() && !Ty.isForwardDecl()) {
861 bool IsImplementation = 0;
862 if (Ty.isCompositeType()) {
863 DICompositeType CT(Ty);
Eric Christophere0167892012-01-06 23:03:37 +0000864 // A runtime language of 0 actually means C/C++ and that any
865 // non-negative value is some version of Objective-C/C++.
Eric Christopher6efc0432013-10-19 01:04:47 +0000866 IsImplementation = (CT.getRunTimeLang() == 0) || CT.isObjcClassComplete();
Eric Christopherc36145f2012-01-06 04:35:23 +0000867 }
Eric Christopher577056f2013-09-05 18:20:16 +0000868 unsigned Flags = IsImplementation ? dwarf::DW_FLAG_type_implementation : 0;
Eric Christophere0167892012-01-06 23:03:37 +0000869 addAccelType(Ty.getName(), std::make_pair(TyDIE, Flags));
Eric Christopherc36145f2012-01-06 04:35:23 +0000870 }
Eric Christopher8b4310b2012-11-21 00:34:38 +0000871
Devang Patel161b2f42011-04-12 23:21:44 +0000872 return TyDIE;
873}
874
875/// addType - Add a new type attribute to the specified entity.
David Blaikie770530b2013-10-21 17:28:37 +0000876void CompileUnit::addType(DIE *Entity, DIType Ty, dwarf::Attribute Attribute) {
Eric Christopherdc1363f2013-08-08 07:40:37 +0000877 assert(Ty && "Trying to add a type that doesn't exist?");
Devang Patel161b2f42011-04-12 23:21:44 +0000878
879 // Check for pre-existence.
880 DIEEntry *Entry = getDIEEntry(Ty);
881 // If it exists then use the existing value.
882 if (Entry) {
Eric Christopher3f045002013-10-04 17:08:38 +0000883 Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
Devang Patel161b2f42011-04-12 23:21:44 +0000884 return;
885 }
886
887 // Construct type.
888 DIE *Buffer = getOrCreateTypeDIE(Ty);
889
890 // Set up proxy.
891 Entry = createDIEEntry(Buffer);
892 insertDIEEntry(Ty, Entry);
Eric Christopher3f045002013-10-04 17:08:38 +0000893 Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
Devang Patele9ae06c2011-05-31 22:56:51 +0000894
895 // If this is a complete composite type then include it in the
896 // list of global types.
Devang Patelc20bdf12011-06-01 00:23:24 +0000897 addGlobalType(Ty);
Devang Patel66658e42011-05-31 23:30:30 +0000898}
899
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000900// Accelerator table mutators - add each name along with its companion
901// DIE to the proper table while ensuring that the name that we're going
902// to reference is in the string table. We do this since the names we
903// add may not only be identical to the names in the DIE.
904void CompileUnit::addAccelName(StringRef Name, DIE *Die) {
905 DU->getStringPoolEntry(Name);
Eric Christopher734334e2013-09-23 22:59:11 +0000906 std::vector<DIE *> &DIEs = AccelNames[Name];
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000907 DIEs.push_back(Die);
908}
909
910void CompileUnit::addAccelObjC(StringRef Name, DIE *Die) {
911 DU->getStringPoolEntry(Name);
Eric Christopher734334e2013-09-23 22:59:11 +0000912 std::vector<DIE *> &DIEs = AccelObjC[Name];
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000913 DIEs.push_back(Die);
914}
915
916void CompileUnit::addAccelNamespace(StringRef Name, DIE *Die) {
917 DU->getStringPoolEntry(Name);
Eric Christopher734334e2013-09-23 22:59:11 +0000918 std::vector<DIE *> &DIEs = AccelNamespace[Name];
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000919 DIEs.push_back(Die);
920}
921
922void CompileUnit::addAccelType(StringRef Name, std::pair<DIE *, unsigned> Die) {
923 DU->getStringPoolEntry(Name);
924 std::vector<std::pair<DIE *, unsigned> > &DIEs = AccelTypes[Name];
925 DIEs.push_back(Die);
926}
927
Eric Christopher50d37a42013-09-20 22:20:55 +0000928/// addGlobalName - Add a new global name to the compile unit.
Eric Christopher91986572013-10-17 02:06:06 +0000929void CompileUnit::addGlobalName(StringRef Name, DIE *Die, DIScope Context) {
Eric Christopher0ab64392013-10-19 01:04:42 +0000930 std::string FullName = getParentContextString(Context) + Name.str();
Eric Christopher91986572013-10-17 02:06:06 +0000931 GlobalNames[FullName] = Die;
Eric Christopher50d37a42013-09-20 22:20:55 +0000932}
933
Devang Patel66658e42011-05-31 23:30:30 +0000934/// addGlobalType - Add a new global type to the compile unit.
935///
Devang Patelc20bdf12011-06-01 00:23:24 +0000936void CompileUnit::addGlobalType(DIType Ty) {
Eric Christophereee74fb2013-10-05 00:27:02 +0000937 DIScope Context = resolve(Ty.getContext());
Eric Christopher5a634742013-09-23 23:15:58 +0000938 if (!Ty.getName().empty() && !Ty.isForwardDecl() &&
Eric Christopher734334e2013-09-23 22:59:11 +0000939 (!Context || Context.isCompileUnit() || Context.isFile() ||
940 Context.isNameSpace()))
Eric Christopher91986572013-10-17 02:06:06 +0000941 if (DIEEntry *Entry = getDIEEntry(Ty)) {
Eric Christopher0ab64392013-10-19 01:04:42 +0000942 std::string FullName =
943 getParentContextString(Context) + Ty.getName().str();
Eric Christopher6efc0432013-10-19 01:04:47 +0000944 GlobalTypes[FullName] = Entry->getEntry();
Eric Christopher91986572013-10-17 02:06:06 +0000945 }
946}
947
948/// getParentContextString - Walks the metadata parent chain in a language
949/// specific manner (using the compile unit language) and returns
950/// it as a string. This is done at the metadata level because DIEs may
951/// not currently have been added to the parent context and walking the
952/// DIEs looking for names is more expensive than walking the metadata.
953std::string CompileUnit::getParentContextString(DIScope Context) const {
954 if (!Context)
955 return "";
956
957 // FIXME: Decide whether to implement this for non-C++ languages.
958 if (getLanguage() != dwarf::DW_LANG_C_plus_plus)
959 return "";
960
Eric Christopher0ab64392013-10-19 01:04:42 +0000961 std::string CS;
Eric Christopher91986572013-10-17 02:06:06 +0000962 SmallVector<DIScope, 1> Parents;
963 while (!Context.isCompileUnit()) {
964 Parents.push_back(Context);
965 if (Context.getContext())
966 Context = resolve(Context.getContext());
967 else
968 // Structure, etc types will have a NULL context if they're at the top
969 // level.
970 break;
971 }
972
973 // Reverse iterate over our list to go from the outermost construct to the
974 // innermost.
975 for (SmallVectorImpl<DIScope>::reverse_iterator I = Parents.rbegin(),
976 E = Parents.rend();
977 I != E; ++I) {
978 DIScope Ctx = *I;
979 StringRef Name = Ctx.getName();
Eric Christopher0ab64392013-10-19 01:04:42 +0000980 if (!Name.empty()) {
Eric Christopher91986572013-10-17 02:06:06 +0000981 CS += Name;
982 CS += "::";
983 }
984 }
985 return CS;
Devang Patel161b2f42011-04-12 23:21:44 +0000986}
987
Eric Christopher22852c72013-10-05 00:05:51 +0000988/// addPubTypes - Add subprogram argument types for pubtypes section.
Devang Patel31c5d052011-05-06 16:57:54 +0000989void CompileUnit::addPubTypes(DISubprogram SP) {
990 DICompositeType SPTy = SP.getType();
Eric Christopher31667622013-08-08 01:41:00 +0000991 uint16_t SPTag = SPTy.getTag();
Devang Patel31c5d052011-05-06 16:57:54 +0000992 if (SPTag != dwarf::DW_TAG_subroutine_type)
993 return;
994
995 DIArray Args = SPTy.getTypeArray();
996 for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
997 DIType ATy(Args.getElement(i));
Manman Rend03d2b22013-07-08 18:33:29 +0000998 if (!ATy.isType())
Devang Patel31c5d052011-05-06 16:57:54 +0000999 continue;
Devang Patelc20bdf12011-06-01 00:23:24 +00001000 addGlobalType(ATy);
Devang Patel31c5d052011-05-06 16:57:54 +00001001 }
1002}
1003
Devang Patel161b2f42011-04-12 23:21:44 +00001004/// constructTypeDIE - Construct basic type die from DIBasicType.
1005void CompileUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
1006 // Get core information.
1007 StringRef Name = BTy.getName();
Devang Patel161b2f42011-04-12 23:21:44 +00001008 // Add name if not anonymous or intermediate type.
1009 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001010 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel734a67c2011-09-14 23:13:28 +00001011
David Blaikie916d49e2013-10-04 23:21:16 +00001012 // An unspecified type only has a name attribute.
1013 if (BTy.getTag() == dwarf::DW_TAG_unspecified_type)
Devang Patel734a67c2011-09-14 23:13:28 +00001014 return;
Devang Patel734a67c2011-09-14 23:13:28 +00001015
Nick Lewycky746cb672011-10-26 22:55:33 +00001016 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
Devang Patel30d409c2012-02-07 23:33:58 +00001017 BTy.getEncoding());
Devang Patel734a67c2011-09-14 23:13:28 +00001018
Devang Patel161b2f42011-04-12 23:21:44 +00001019 uint64_t Size = BTy.getSizeInBits() >> 3;
David Blaikie770530b2013-10-21 17:28:37 +00001020 addUInt(&Buffer, dwarf::DW_AT_byte_size, None, Size);
Devang Patel161b2f42011-04-12 23:21:44 +00001021}
1022
1023/// constructTypeDIE - Construct derived type die from DIDerivedType.
1024void CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
1025 // Get core information.
1026 StringRef Name = DTy.getName();
1027 uint64_t Size = DTy.getSizeInBits() >> 3;
David Blaikie916d49e2013-10-04 23:21:16 +00001028 uint16_t Tag = Buffer.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +00001029
1030 // Map to main type, void will not have a type.
Manman Ren017ceda2013-10-08 18:42:58 +00001031 DIType FromTy = resolve(DTy.getTypeDerivedFrom());
Eric Christopherdc1363f2013-08-08 07:40:37 +00001032 if (FromTy)
1033 addType(&Buffer, FromTy);
Devang Patel161b2f42011-04-12 23:21:44 +00001034
1035 // Add name if not anonymous or intermediate type.
1036 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001037 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001038
1039 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopher35f225a2012-02-21 22:25:53 +00001040 if (Size && Tag != dwarf::DW_TAG_pointer_type)
David Blaikie770530b2013-10-21 17:28:37 +00001041 addUInt(&Buffer, dwarf::DW_AT_byte_size, None, Size);
Devang Patel161b2f42011-04-12 23:21:44 +00001042
David Blaikie62fdfb52013-01-07 05:51:15 +00001043 if (Tag == dwarf::DW_TAG_ptr_to_member_type)
Eric Christopher6efc0432013-10-19 01:04:47 +00001044 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type,
1045 getOrCreateTypeDIE(resolve(DTy.getClassType())));
Devang Patel161b2f42011-04-12 23:21:44 +00001046 // Add source line info if available and TyDesc is not a forward declaration.
1047 if (!DTy.isForwardDecl())
1048 addSourceLine(&Buffer, DTy);
1049}
1050
Eric Christopher3dee5752013-07-26 17:02:41 +00001051/// Return true if the type is appropriately scoped to be contained inside
1052/// its own type unit.
Manman Ren18eb2452013-09-09 19:23:58 +00001053static bool isTypeUnitScoped(DIType Ty, const DwarfDebug *DD) {
Manman Ren2c9905a2013-09-09 19:47:11 +00001054 DIScope Parent = DD->resolve(Ty.getContext());
Eric Christopher3dee5752013-07-26 17:02:41 +00001055 while (Parent) {
1056 // Don't generate a hash for anything scoped inside a function.
1057 if (Parent.isSubprogram())
1058 return false;
Manman Rene72aba92013-09-09 22:35:23 +00001059 Parent = DD->resolve(Parent.getContext());
Eric Christopher3dee5752013-07-26 17:02:41 +00001060 }
1061 return true;
1062}
1063
1064/// Return true if the type should be split out into a type unit.
Manman Ren18eb2452013-09-09 19:23:58 +00001065static bool shouldCreateTypeUnit(DICompositeType CTy, const DwarfDebug *DD) {
Eric Christopher31667622013-08-08 01:41:00 +00001066 uint16_t Tag = CTy.getTag();
Eric Christopher3dee5752013-07-26 17:02:41 +00001067
1068 switch (Tag) {
1069 case dwarf::DW_TAG_structure_type:
1070 case dwarf::DW_TAG_union_type:
1071 case dwarf::DW_TAG_enumeration_type:
1072 case dwarf::DW_TAG_class_type:
1073 // If this is a class, structure, union, or enumeration type
David Blaikiec4eb3532013-10-04 23:52:02 +00001074 // that is a definition (not a declaration), and not scoped
Eric Christopher3dee5752013-07-26 17:02:41 +00001075 // inside a function then separate this out as a type unit.
David Blaikiec4eb3532013-10-04 23:52:02 +00001076 return !CTy.isForwardDecl() && isTypeUnitScoped(CTy, DD);
Eric Christopher3dee5752013-07-26 17:02:41 +00001077 default:
David Blaikiec4eb3532013-10-04 23:52:02 +00001078 return false;
Eric Christopher3dee5752013-07-26 17:02:41 +00001079 }
1080}
1081
Devang Patel161b2f42011-04-12 23:21:44 +00001082/// constructTypeDIE - Construct type DIE from DICompositeType.
1083void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
1084 // Get core information.
1085 StringRef Name = CTy.getName();
1086
1087 uint64_t Size = CTy.getSizeInBits() >> 3;
David Blaikie916d49e2013-10-04 23:21:16 +00001088 uint16_t Tag = Buffer.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +00001089
1090 switch (Tag) {
Devang Patel161b2f42011-04-12 23:21:44 +00001091 case dwarf::DW_TAG_array_type:
1092 constructArrayTypeDIE(Buffer, &CTy);
1093 break;
1094 case dwarf::DW_TAG_enumeration_type: {
1095 DIArray Elements = CTy.getTypeArray();
1096
1097 // Add enumerators to enumeration type.
1098 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
Devang Patel161b2f42011-04-12 23:21:44 +00001099 DIDescriptor Enum(Elements.getElement(i));
Manman Ren630c3262013-10-18 21:14:19 +00001100 if (Enum.isEnumerator())
Manman Ren950f4e82013-10-23 22:52:22 +00001101 constructEnumTypeDIE(Buffer, DIEnumerator(Enum));
Devang Patel161b2f42011-04-12 23:21:44 +00001102 }
Manman Ren017ceda2013-10-08 18:42:58 +00001103 DIType DTy = resolve(CTy.getTypeDerivedFrom());
Eric Christopher37c107b2013-08-08 07:40:42 +00001104 if (DTy) {
Eric Christopherbb0f6ea2012-05-23 00:09:20 +00001105 addType(&Buffer, DTy);
Eric Christopher371d9582013-10-04 22:40:10 +00001106 addFlag(&Buffer, dwarf::DW_AT_enum_class);
Eric Christopherbb0f6ea2012-05-23 00:09:20 +00001107 }
Eric Christopher6efc0432013-10-19 01:04:47 +00001108 } break;
Devang Patel161b2f42011-04-12 23:21:44 +00001109 case dwarf::DW_TAG_subroutine_type: {
Eric Christopherdc1363f2013-08-08 07:40:37 +00001110 // Add return type. A void return won't have a type.
Devang Patel161b2f42011-04-12 23:21:44 +00001111 DIArray Elements = CTy.getTypeArray();
1112 DIDescriptor RTy = Elements.getElement(0);
Eric Christopherdc1363f2013-08-08 07:40:37 +00001113 if (RTy)
1114 addType(&Buffer, DIType(RTy));
Devang Patel161b2f42011-04-12 23:21:44 +00001115
1116 bool isPrototyped = true;
1117 // Add arguments.
1118 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
1119 DIDescriptor Ty = Elements.getElement(i);
1120 if (Ty.isUnspecifiedParameter()) {
Manman Ren1a5e7872013-10-29 00:53:03 +00001121 createAndAddDIE(dwarf::DW_TAG_unspecified_parameters, Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +00001122 isPrototyped = false;
1123 } else {
Manman Ren1a5e7872013-10-29 00:53:03 +00001124 DIE *Arg = createAndAddDIE(dwarf::DW_TAG_formal_parameter, Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +00001125 addType(Arg, DIType(Ty));
David Blaikieaaf2e632013-01-29 19:35:24 +00001126 if (DIType(Ty).isArtificial())
1127 addFlag(Arg, dwarf::DW_AT_artificial);
Devang Patel161b2f42011-04-12 23:21:44 +00001128 }
1129 }
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001130 // Add prototype flag if we're dealing with a C language and the
1131 // function has been prototyped.
Eric Christopher7b878952013-08-26 23:50:38 +00001132 uint16_t Language = DICompileUnit(Node).getLanguage();
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001133 if (isPrototyped &&
Eric Christopher6efc0432013-10-19 01:04:47 +00001134 (Language == dwarf::DW_LANG_C89 || Language == dwarf::DW_LANG_C99 ||
Eric Christopher4d069bf2012-05-22 18:45:24 +00001135 Language == dwarf::DW_LANG_ObjC))
Eric Christopher873cf0a2012-08-24 01:14:27 +00001136 addFlag(&Buffer, dwarf::DW_AT_prototyped);
Eric Christopher6efc0432013-10-19 01:04:47 +00001137 } break;
Devang Patel161b2f42011-04-12 23:21:44 +00001138 case dwarf::DW_TAG_structure_type:
1139 case dwarf::DW_TAG_union_type:
1140 case dwarf::DW_TAG_class_type: {
Devang Patel161b2f42011-04-12 23:21:44 +00001141 // Add elements to structure type.
David Blaikiec8b93552013-08-01 20:30:22 +00001142 DIArray Elements = CTy.getTypeArray();
1143 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
Devang Patel161b2f42011-04-12 23:21:44 +00001144 DIDescriptor Element = Elements.getElement(i);
1145 DIE *ElemDie = NULL;
1146 if (Element.isSubprogram()) {
1147 DISubprogram SP(Element);
Devang Pateldbc64af2011-08-15 17:24:54 +00001148 ElemDie = getOrCreateSubprogramDIE(DISubprogram(Element));
Devang Patel161b2f42011-04-12 23:21:44 +00001149 if (SP.isProtected())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001150 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001151 dwarf::DW_ACCESS_protected);
1152 else if (SP.isPrivate())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001153 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001154 dwarf::DW_ACCESS_private);
Eric Christopher8b4310b2012-11-21 00:34:38 +00001155 else
Nick Lewycky13aaca52011-12-13 05:09:11 +00001156 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Eric Christopher6efc0432013-10-19 01:04:47 +00001157 dwarf::DW_ACCESS_public);
Devang Patel161b2f42011-04-12 23:21:44 +00001158 if (SP.isExplicit())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001159 addFlag(ElemDie, dwarf::DW_AT_explicit);
Eric Christopher663e0cf2012-03-28 07:34:31 +00001160 } else if (Element.isDerivedType()) {
Eric Christopher4d069bf2012-05-22 18:45:24 +00001161 DIDerivedType DDTy(Element);
1162 if (DDTy.getTag() == dwarf::DW_TAG_friend) {
Manman Ren1a5e7872013-10-29 00:53:03 +00001163 ElemDie = createAndAddDIE(dwarf::DW_TAG_friend, Buffer);
Manman Ren017ceda2013-10-08 18:42:58 +00001164 addType(ElemDie, resolve(DDTy.getTypeDerivedFrom()),
Manman Renc664d762013-10-05 01:43:03 +00001165 dwarf::DW_AT_friend);
Manman Ren655a10d2013-10-14 20:33:57 +00001166 } else if (DDTy.isStaticMember()) {
Manman Ren99addee2013-10-23 22:57:12 +00001167 getOrCreateStaticMemberDIE(DDTy);
Manman Ren655a10d2013-10-14 20:33:57 +00001168 } else {
Manman Rena1d25b62013-10-23 23:00:44 +00001169 constructMemberDIE(Buffer, DDTy);
Manman Ren655a10d2013-10-14 20:33:57 +00001170 }
Eric Christopher663e0cf2012-03-28 07:34:31 +00001171 } else if (Element.isObjCProperty()) {
Devang Patel30d409c2012-02-07 23:33:58 +00001172 DIObjCProperty Property(Element);
Manman Ren1a5e7872013-10-29 00:53:03 +00001173 ElemDie = createAndAddDIE(Property.getTag(), Buffer);
Devang Patel30d409c2012-02-07 23:33:58 +00001174 StringRef PropertyName = Property.getObjCPropertyName();
1175 addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
Eric Christopher4d069bf2012-05-22 18:45:24 +00001176 addType(ElemDie, Property.getType());
1177 addSourceLine(ElemDie, Property);
Devang Patel30d409c2012-02-07 23:33:58 +00001178 StringRef GetterName = Property.getObjCPropertyGetterName();
1179 if (!GetterName.empty())
1180 addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
1181 StringRef SetterName = Property.getObjCPropertySetterName();
1182 if (!SetterName.empty())
1183 addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
1184 unsigned PropertyAttributes = 0;
Devang Patel9e11eb12012-02-04 01:30:32 +00001185 if (Property.isReadOnlyObjCProperty())
1186 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
1187 if (Property.isReadWriteObjCProperty())
1188 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
1189 if (Property.isAssignObjCProperty())
1190 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
1191 if (Property.isRetainObjCProperty())
1192 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
1193 if (Property.isCopyObjCProperty())
1194 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
1195 if (Property.isNonAtomicObjCProperty())
1196 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
1197 if (PropertyAttributes)
David Blaikie770530b2013-10-21 17:28:37 +00001198 addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, None,
Eric Christopher6efc0432013-10-19 01:04:47 +00001199 PropertyAttributes);
Devang Patel6588abf2012-02-06 17:49:43 +00001200
Devang Patel30d409c2012-02-07 23:33:58 +00001201 DIEEntry *Entry = getDIEEntry(Element);
1202 if (!Entry) {
1203 Entry = createDIEEntry(ElemDie);
1204 insertDIEEntry(Element, Entry);
1205 }
Devang Patel9e11eb12012-02-04 01:30:32 +00001206 } else
Devang Patel161b2f42011-04-12 23:21:44 +00001207 continue;
Devang Patel161b2f42011-04-12 23:21:44 +00001208 }
1209
1210 if (CTy.isAppleBlockExtension())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001211 addFlag(&Buffer, dwarf::DW_AT_APPLE_block);
Devang Patel161b2f42011-04-12 23:21:44 +00001212
Eric Christophereee74fb2013-10-05 00:27:02 +00001213 DICompositeType ContainingType(resolve(CTy.getContainingType()));
Devang Patel161b2f42011-04-12 23:21:44 +00001214 if (DIDescriptor(ContainingType).isCompositeType())
Manman Ren87b110a2013-10-11 23:58:05 +00001215 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type,
Devang Patel161b2f42011-04-12 23:21:44 +00001216 getOrCreateTypeDIE(DIType(ContainingType)));
Devang Patel161b2f42011-04-12 23:21:44 +00001217
Devang Patel201e6cd2011-05-12 21:29:42 +00001218 if (CTy.isObjcClassComplete())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001219 addFlag(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type);
Devang Patelb11f80e2011-05-12 19:06:16 +00001220
Eric Christopher1a8e8862011-12-16 23:42:42 +00001221 // Add template parameters to a class, structure or union types.
1222 // FIXME: The support isn't in the metadata for this yet.
1223 if (Tag == dwarf::DW_TAG_class_type ||
Eric Christopher6efc0432013-10-19 01:04:47 +00001224 Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type)
Devang Patel161b2f42011-04-12 23:21:44 +00001225 addTemplateParams(Buffer, CTy.getTemplateParams());
1226
1227 break;
1228 }
1229 default:
1230 break;
1231 }
1232
1233 // Add name if not anonymous or intermediate type.
1234 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001235 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001236
Eric Christopher4a5d8392012-05-22 18:45:18 +00001237 if (Tag == dwarf::DW_TAG_enumeration_type ||
Eric Christopher6efc0432013-10-19 01:04:47 +00001238 Tag == dwarf::DW_TAG_class_type || Tag == dwarf::DW_TAG_structure_type ||
Eric Christopher4a5d8392012-05-22 18:45:18 +00001239 Tag == dwarf::DW_TAG_union_type) {
Devang Patel161b2f42011-04-12 23:21:44 +00001240 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopherfc4199b2012-06-01 00:22:32 +00001241 // TODO: Do we care about size for enum forward declarations?
Devang Patel161b2f42011-04-12 23:21:44 +00001242 if (Size)
David Blaikie770530b2013-10-21 17:28:37 +00001243 addUInt(&Buffer, dwarf::DW_AT_byte_size, None, Size);
Eric Christopherfc4199b2012-06-01 00:22:32 +00001244 else if (!CTy.isForwardDecl())
Devang Patel161b2f42011-04-12 23:21:44 +00001245 // Add zero size if it is not a forward declaration.
David Blaikie770530b2013-10-21 17:28:37 +00001246 addUInt(&Buffer, dwarf::DW_AT_byte_size, None, 0);
Eric Christopherfc4199b2012-06-01 00:22:32 +00001247
1248 // If we're a forward decl, say so.
1249 if (CTy.isForwardDecl())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001250 addFlag(&Buffer, dwarf::DW_AT_declaration);
Devang Patel161b2f42011-04-12 23:21:44 +00001251
1252 // Add source line info if available.
1253 if (!CTy.isForwardDecl())
1254 addSourceLine(&Buffer, CTy);
Eric Christopher89388952012-03-07 00:15:19 +00001255
1256 // No harm in adding the runtime language to the declaration.
1257 unsigned RLang = CTy.getRunTimeLang();
1258 if (RLang)
Eric Christopher6efc0432013-10-19 01:04:47 +00001259 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class, dwarf::DW_FORM_data1,
1260 RLang);
Devang Patel161b2f42011-04-12 23:21:44 +00001261 }
Eric Christopher3dee5752013-07-26 17:02:41 +00001262 // If this is a type applicable to a type unit it then add it to the
1263 // list of types we'll compute a hash for later.
Manman Ren18eb2452013-09-09 19:23:58 +00001264 if (shouldCreateTypeUnit(CTy, DD))
Eric Christopher3dee5752013-07-26 17:02:41 +00001265 DD->addTypeUnitType(&Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +00001266}
1267
Manman Renbe87b692013-10-23 23:05:28 +00001268/// constructTemplateTypeParameterDIE - Construct new DIE for the given
1269/// DITemplateTypeParameter.
Manman Ren99addee2013-10-23 22:57:12 +00001270void
Manman Renbe87b692013-10-23 23:05:28 +00001271CompileUnit::constructTemplateTypeParameterDIE(DIE &Buffer,
1272 DITemplateTypeParameter TP) {
Manman Ren1a5e7872013-10-29 00:53:03 +00001273 DIE *ParamDIE =
1274 createAndAddDIE(dwarf::DW_TAG_template_type_parameter, Buffer);
Eric Christopher76ef79f2013-08-08 08:09:43 +00001275 // Add the type if it exists, it could be void and therefore no type.
1276 if (TP.getType())
Manman Renb4d9c112013-10-09 19:46:28 +00001277 addType(ParamDIE, resolve(TP.getType()));
David Blaikiee88939c2013-06-22 18:59:11 +00001278 if (!TP.getName().empty())
1279 addString(ParamDIE, dwarf::DW_AT_name, TP.getName());
Devang Patel161b2f42011-04-12 23:21:44 +00001280}
1281
Manman Renbe87b692013-10-23 23:05:28 +00001282/// constructTemplateValueParameterDIE - Construct new DIE for the given
1283/// DITemplateValueParameter.
Manman Ren99addee2013-10-23 22:57:12 +00001284void
Manman Renbe87b692013-10-23 23:05:28 +00001285CompileUnit::constructTemplateValueParameterDIE(DIE &Buffer,
1286 DITemplateValueParameter VP) {
Manman Ren1a5e7872013-10-29 00:53:03 +00001287 DIE *ParamDIE = createAndAddDIE(VP.getTag(), Buffer);
Eric Christopherdc1363f2013-08-08 07:40:37 +00001288
1289 // Add the type if there is one, template template and template parameter
1290 // packs will not have a type.
Eric Christopheref2d9192013-10-21 17:48:51 +00001291 if (VP.getTag() == dwarf::DW_TAG_template_value_parameter)
Manman Renb4d9c112013-10-09 19:46:28 +00001292 addType(ParamDIE, resolve(VP.getType()));
Eric Christopherafdd1f82013-08-08 07:40:31 +00001293 if (!VP.getName().empty())
1294 addString(ParamDIE, dwarf::DW_AT_name, VP.getName());
1295 if (Value *Val = VP.getValue()) {
David Blaikie4de9d722013-05-10 21:52:07 +00001296 if (ConstantInt *CI = dyn_cast<ConstantInt>(Val))
Manman Renb4d9c112013-10-09 19:46:28 +00001297 addConstantValue(ParamDIE, CI,
1298 isUnsignedDIType(DD, resolve(VP.getType())));
David Blaikie4de9d722013-05-10 21:52:07 +00001299 else if (GlobalValue *GV = dyn_cast<GlobalValue>(Val)) {
1300 // For declaration non-type template parameters (such as global values and
1301 // functions)
1302 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Rafael Espindolaffc7dca2013-10-29 17:07:16 +00001303 addOpAddress(Block, Asm->getSymbol(GV));
David Blaikie4de9d722013-05-10 21:52:07 +00001304 // Emit DW_OP_stack_value to use the address as the immediate value of the
1305 // parameter, rather than a pointer to it.
David Blaikie770530b2013-10-21 17:28:37 +00001306 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value);
1307 addBlock(ParamDIE, dwarf::DW_AT_location, Block);
Eric Christopherafdd1f82013-08-08 07:40:31 +00001308 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_template_param) {
David Blaikiee88939c2013-06-22 18:59:11 +00001309 assert(isa<MDString>(Val));
1310 addString(ParamDIE, dwarf::DW_AT_GNU_template_name,
1311 cast<MDString>(Val)->getString());
Eric Christopherafdd1f82013-08-08 07:40:31 +00001312 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_parameter_pack) {
David Blaikiee88939c2013-06-22 18:59:11 +00001313 assert(isa<MDNode>(Val));
1314 DIArray A(cast<MDNode>(Val));
1315 addTemplateParams(*ParamDIE, A);
David Blaikie4de9d722013-05-10 21:52:07 +00001316 }
1317 }
Devang Patel161b2f42011-04-12 23:21:44 +00001318}
1319
Devang Patel31c5d052011-05-06 16:57:54 +00001320/// getOrCreateNameSpace - Create a DIE for DINameSpace.
1321DIE *CompileUnit::getOrCreateNameSpace(DINameSpace NS) {
Manman Ren6b713802013-10-29 05:49:41 +00001322 // Construct the context before querying for the existence of the DIE in case
1323 // such construction creates the DIE.
1324 DIE *ContextDIE = getOrCreateContextDIE(NS.getContext());
1325 if (!ContextDIE)
1326 // If the context is null, DIE should belong to the CU we call construct
1327 // function on.
1328 ContextDIE = CUDie.get();
1329
Devang Patel31c5d052011-05-06 16:57:54 +00001330 DIE *NDie = getDIE(NS);
1331 if (NDie)
1332 return NDie;
Manman Ren6b713802013-10-29 05:49:41 +00001333 NDie = createAndAddDIE(dwarf::DW_TAG_namespace, *ContextDIE, NS);
1334
Eric Christopher09ac3d82011-11-07 09:24:32 +00001335 if (!NS.getName().empty()) {
Nick Lewycky390c40d2011-10-27 06:44:11 +00001336 addString(NDie, dwarf::DW_AT_name, NS.getName());
Eric Christopher09ac3d82011-11-07 09:24:32 +00001337 addAccelNamespace(NS.getName(), NDie);
Eric Christopher91986572013-10-17 02:06:06 +00001338 addGlobalName(NS.getName(), NDie, NS.getContext());
Eric Christopher09ac3d82011-11-07 09:24:32 +00001339 } else
1340 addAccelNamespace("(anonymous namespace)", NDie);
Devang Patel31c5d052011-05-06 16:57:54 +00001341 addSourceLine(NDie, NS);
Devang Patel31c5d052011-05-06 16:57:54 +00001342 return NDie;
1343}
1344
Devang Pateldbc64af2011-08-15 17:24:54 +00001345/// getOrCreateSubprogramDIE - Create new DIE using SP.
1346DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
David Blaikiec32f2332013-10-04 01:39:59 +00001347 // Construct the context before querying for the existence of the DIE in case
1348 // such construction creates the DIE (as is the case for member function
1349 // declarations).
Manman Renb8e48a62013-10-10 18:40:01 +00001350 DIE *ContextDIE = getOrCreateContextDIE(resolve(SP.getContext()));
David Blaikiec32f2332013-10-04 01:39:59 +00001351 if (!ContextDIE)
1352 ContextDIE = CUDie.get();
1353
Eric Christopher3f045002013-10-04 17:08:38 +00001354 DIE *SPDie = getDIE(SP);
Devang Pateldbc64af2011-08-15 17:24:54 +00001355 if (SPDie)
1356 return SPDie;
1357
Manman Renbbdd02c2013-10-29 00:58:04 +00001358 DISubprogram SPDecl = SP.getFunctionDeclaration();
1359 if (SPDecl.isSubprogram())
1360 // Add subprogram definitions to the CU die directly.
1361 ContextDIE = CUDie.get();
Peter Collingbourne27302f02012-05-27 18:36:44 +00001362
1363 // DW_TAG_inlined_subroutine may refer to this DIE.
Manman Renbbdd02c2013-10-29 00:58:04 +00001364 SPDie = createAndAddDIE(dwarf::DW_TAG_subprogram, *ContextDIE, SP);
Peter Collingbourne27302f02012-05-27 18:36:44 +00001365
Rafael Espindola01b55b42011-11-10 22:34:29 +00001366 DIE *DeclDie = NULL;
Manman Ren250f4e82013-10-23 22:12:26 +00001367 if (SPDecl.isSubprogram())
Rafael Espindola01b55b42011-11-10 22:34:29 +00001368 DeclDie = getOrCreateSubprogramDIE(SPDecl);
Rafael Espindola01b55b42011-11-10 22:34:29 +00001369
Devang Pateldbc64af2011-08-15 17:24:54 +00001370 // Add function template parameters.
1371 addTemplateParams(*SPDie, SP.getTemplateParams());
1372
Devang Pateldbc64af2011-08-15 17:24:54 +00001373 // If this DIE is going to refer declaration info using AT_specification
Eric Christopherc4968752013-05-09 00:42:33 +00001374 // then there is no need to add other attributes.
Rafael Espindola01b55b42011-11-10 22:34:29 +00001375 if (DeclDie) {
1376 // Refer function declaration directly.
Manman Ren87b110a2013-10-11 23:58:05 +00001377 addDIEEntry(SPDie, dwarf::DW_AT_specification, DeclDie);
Rafael Espindola01b55b42011-11-10 22:34:29 +00001378
Devang Pateldbc64af2011-08-15 17:24:54 +00001379 return SPDie;
Rafael Espindola01b55b42011-11-10 22:34:29 +00001380 }
Devang Pateldbc64af2011-08-15 17:24:54 +00001381
Eric Christophercbbd5b12012-08-23 22:52:55 +00001382 // Add the linkage name if we have one.
Michael Gottesmandc42d032013-09-04 04:39:38 +00001383 StringRef LinkageName = SP.getLinkageName();
1384 if (!LinkageName.empty())
Eric Christophercbbd5b12012-08-23 22:52:55 +00001385 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c2b4be2013-06-01 17:51:14 +00001386 GlobalValue::getRealLinkageName(LinkageName));
Eric Christophercbbd5b12012-08-23 22:52:55 +00001387
Devang Pateldbc64af2011-08-15 17:24:54 +00001388 // Constructors and operators for anonymous aggregates do not have names.
1389 if (!SP.getName().empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001390 addString(SPDie, dwarf::DW_AT_name, SP.getName());
Devang Pateldbc64af2011-08-15 17:24:54 +00001391
1392 addSourceLine(SPDie, SP);
1393
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001394 // Add the prototype if we have a prototype and we have a C like
1395 // language.
Eric Christopher7b878952013-08-26 23:50:38 +00001396 uint16_t Language = DICompileUnit(Node).getLanguage();
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001397 if (SP.isPrototyped() &&
Eric Christopher6efc0432013-10-19 01:04:47 +00001398 (Language == dwarf::DW_LANG_C89 || Language == dwarf::DW_LANG_C99 ||
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001399 Language == dwarf::DW_LANG_ObjC))
Eric Christopher873cf0a2012-08-24 01:14:27 +00001400 addFlag(SPDie, dwarf::DW_AT_prototyped);
Devang Pateldbc64af2011-08-15 17:24:54 +00001401
Devang Pateldbc64af2011-08-15 17:24:54 +00001402 DICompositeType SPTy = SP.getType();
David Blaikie3d331842013-05-22 23:22:18 +00001403 assert(SPTy.getTag() == dwarf::DW_TAG_subroutine_type &&
1404 "the type of a subprogram should be a subroutine");
Devang Pateldbc64af2011-08-15 17:24:54 +00001405
David Blaikie3d331842013-05-22 23:22:18 +00001406 DIArray Args = SPTy.getTypeArray();
Eric Christopheref2d9192013-10-21 17:48:51 +00001407 // Add a return type. If this is a type like a C/C++ void type we don't add a
1408 // return type.
Eric Christopherdc1363f2013-08-08 07:40:37 +00001409 if (Args.getElement(0))
1410 addType(SPDie, DIType(Args.getElement(0)));
Devang Pateldbc64af2011-08-15 17:24:54 +00001411
1412 unsigned VK = SP.getVirtuality();
1413 if (VK) {
Nick Lewycky798313d2011-12-14 00:56:07 +00001414 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
Devang Pateldbc64af2011-08-15 17:24:54 +00001415 DIEBlock *Block = getDIEBlock();
David Blaikie770530b2013-10-21 17:28:37 +00001416 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1417 addUInt(Block, dwarf::DW_FORM_udata, SP.getVirtualIndex());
1418 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, Block);
Devang Pateldbc64af2011-08-15 17:24:54 +00001419 ContainingTypeMap.insert(std::make_pair(SPDie,
Eric Christophereee74fb2013-10-05 00:27:02 +00001420 resolve(SP.getContainingType())));
Devang Pateldbc64af2011-08-15 17:24:54 +00001421 }
1422
1423 if (!SP.isDefinition()) {
Eric Christopher873cf0a2012-08-24 01:14:27 +00001424 addFlag(SPDie, dwarf::DW_AT_declaration);
Eric Christopher8b4310b2012-11-21 00:34:38 +00001425
Devang Pateldbc64af2011-08-15 17:24:54 +00001426 // Add arguments. Do not add arguments for subprogram definition. They will
1427 // be handled while processing variables.
Eric Christopher6efc0432013-10-19 01:04:47 +00001428 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
Manman Ren1a5e7872013-10-29 00:53:03 +00001429 DIE *Arg = createAndAddDIE(dwarf::DW_TAG_formal_parameter, *SPDie);
David Blaikie3d331842013-05-22 23:22:18 +00001430 DIType ATy = DIType(Args.getElement(i));
1431 addType(Arg, ATy);
1432 if (ATy.isArtificial())
1433 addFlag(Arg, dwarf::DW_AT_artificial);
David Blaikie3d331842013-05-22 23:22:18 +00001434 }
Devang Pateldbc64af2011-08-15 17:24:54 +00001435 }
1436
1437 if (SP.isArtificial())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001438 addFlag(SPDie, dwarf::DW_AT_artificial);
Devang Pateldbc64af2011-08-15 17:24:54 +00001439
1440 if (!SP.isLocalToUnit())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001441 addFlag(SPDie, dwarf::DW_AT_external);
Devang Pateldbc64af2011-08-15 17:24:54 +00001442
1443 if (SP.isOptimized())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001444 addFlag(SPDie, dwarf::DW_AT_APPLE_optimized);
Devang Pateldbc64af2011-08-15 17:24:54 +00001445
1446 if (unsigned isa = Asm->getISAEncoding()) {
1447 addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1448 }
1449
1450 return SPDie;
1451}
1452
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001453// Return const expression if value is a GEP to access merged global
1454// constant. e.g.
1455// i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
1456static const ConstantExpr *getMergedGlobalExpr(const Value *V) {
1457 const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
1458 if (!CE || CE->getNumOperands() != 3 ||
1459 CE->getOpcode() != Instruction::GetElementPtr)
1460 return NULL;
1461
1462 // First operand points to a global struct.
1463 Value *Ptr = CE->getOperand(0);
1464 if (!isa<GlobalValue>(Ptr) ||
1465 !isa<StructType>(cast<PointerType>(Ptr->getType())->getElementType()))
1466 return NULL;
1467
1468 // Second operand is zero.
1469 const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
1470 if (!CI || !CI->isZero())
1471 return NULL;
1472
1473 // Third operand is offset.
1474 if (!isa<ConstantInt>(CE->getOperand(2)))
1475 return NULL;
1476
1477 return CE;
1478}
1479
1480/// createGlobalVariableDIE - create global variable DIE.
1481void CompileUnit::createGlobalVariableDIE(const MDNode *N) {
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001482 // Check for pre-existence.
Devang Patel49e2f032011-08-18 22:21:50 +00001483 if (getDIE(N))
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001484 return;
1485
Devang Patel49e2f032011-08-18 22:21:50 +00001486 DIGlobalVariable GV(N);
Manman Rend03d2b22013-07-08 18:33:29 +00001487 if (!GV.isGlobalVariable())
Devang Patel28bea082011-08-18 23:17:55 +00001488 return;
1489
Eric Christopherccb66362013-10-04 23:49:26 +00001490 DIScope GVContext = GV.getContext();
Eric Christopher6b6061f2013-01-16 01:22:23 +00001491 DIType GTy = GV.getType();
1492
1493 // If this is a static data member definition, some attributes belong
1494 // to the declaration DIE.
1495 DIE *VariableDIE = NULL;
Manman Ren945e8282013-02-01 23:54:37 +00001496 bool IsStaticMember = false;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001497 DIDerivedType SDMDecl = GV.getStaticDataMemberDeclaration();
1498 if (SDMDecl.Verify()) {
1499 assert(SDMDecl.isStaticMember() && "Expected static member decl");
1500 // We need the declaration DIE that is in the static member's class.
Manman Ren655a10d2013-10-14 20:33:57 +00001501 VariableDIE = getOrCreateStaticMemberDIE(SDMDecl);
Manman Ren945e8282013-02-01 23:54:37 +00001502 IsStaticMember = true;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001503 }
1504
1505 // If this is not a static data member definition, create the variable
1506 // DIE and add the initial set of attributes to it.
1507 if (!VariableDIE) {
Manman Ren6b713802013-10-29 05:49:41 +00001508 // Construct the context before querying for the existence of the DIE in
1509 // case such construction creates the DIE.
1510 DIE *ContextDIE = getOrCreateContextDIE(GVContext);
1511 if (!ContextDIE)
1512 ContextDIE = CUDie.get();
1513
Eric Christopher6b6061f2013-01-16 01:22:23 +00001514 // Add to map.
Manman Ren6b713802013-10-29 05:49:41 +00001515 VariableDIE = createAndAddDIE(GV.getTag(), *ContextDIE, N);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001516
1517 // Add name and type.
1518 addString(VariableDIE, dwarf::DW_AT_name, GV.getDisplayName());
1519 addType(VariableDIE, GTy);
1520
1521 // Add scoping info.
Eric Christophera486f552013-10-16 01:37:49 +00001522 if (!GV.isLocalToUnit())
Eric Christopher6b6061f2013-01-16 01:22:23 +00001523 addFlag(VariableDIE, dwarf::DW_AT_external);
1524
1525 // Add line number info.
1526 addSourceLine(VariableDIE, GV);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001527 }
1528
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001529 // Add location.
Eric Christopher09ac3d82011-11-07 09:24:32 +00001530 bool addToAccelTable = false;
Eric Christopherd61c34b2011-11-11 03:16:32 +00001531 DIE *VariableSpecDIE = NULL;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001532 bool isGlobalVariable = GV.getGlobal() != NULL;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001533 if (isGlobalVariable) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001534 addToAccelTable = true;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001535 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Rafael Espindolaffc7dca2013-10-29 17:07:16 +00001536 const MCSymbol *Sym = Asm->getSymbol(GV.getGlobal());
David Blaikie59eaa382013-06-28 20:05:11 +00001537 if (GV.getGlobal()->isThreadLocal()) {
1538 // FIXME: Make this work with -gsplit-dwarf.
1539 unsigned PointerSize = Asm->getDataLayout().getPointerSize();
1540 assert((PointerSize == 4 || PointerSize == 8) &&
1541 "Add support for other sizes if necessary");
Ulrich Weigand716a94f2013-07-02 18:47:09 +00001542 const MCExpr *Expr =
David Blaikie8fed05e2013-07-01 23:55:52 +00001543 Asm->getObjFileLowering().getDebugThreadLocalSymbol(Sym);
David Blaikie59eaa382013-06-28 20:05:11 +00001544 // Based on GCC's support for TLS:
David Blaikie8fed05e2013-07-01 23:55:52 +00001545 if (!DD->useSplitDwarf()) {
1546 // 1) Start with a constNu of the appropriate pointer size
David Blaikie770530b2013-10-21 17:28:37 +00001547 addUInt(Block, dwarf::DW_FORM_data1,
David Blaikie8fed05e2013-07-01 23:55:52 +00001548 PointerSize == 4 ? dwarf::DW_OP_const4u : dwarf::DW_OP_const8u);
Richard Mitton379f76e2013-10-07 18:39:18 +00001549 // 2) containing the (relocated) offset of the TLS variable
1550 // within the module's TLS block.
David Blaikie770530b2013-10-21 17:28:37 +00001551 addExpr(Block, dwarf::DW_FORM_udata, Expr);
David Blaikie8fed05e2013-07-01 23:55:52 +00001552 } else {
David Blaikie770530b2013-10-21 17:28:37 +00001553 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_const_index);
1554 addUInt(Block, dwarf::DW_FORM_udata, DU->getAddrPoolIndex(Expr));
David Blaikie8fed05e2013-07-01 23:55:52 +00001555 }
Richard Mitton379f76e2013-10-07 18:39:18 +00001556 // 3) followed by a custom OP to make the debugger do a TLS lookup.
David Blaikie770530b2013-10-21 17:28:37 +00001557 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_push_tls_address);
David Blaikie59eaa382013-06-28 20:05:11 +00001558 } else
1559 addOpAddress(Block, Sym);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001560 // Do not create specification DIE if context is either compile unit
1561 // or a subprogram.
Devang Patel1dd4e562011-09-21 23:41:11 +00001562 if (GVContext && GV.isDefinition() && !GVContext.isCompileUnit() &&
Manman Ren02d29672013-09-09 19:05:21 +00001563 !GVContext.isFile() && !DD->isSubprogramContext(GVContext)) {
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001564 // Create specification DIE.
Manman Ren1a5e7872013-10-29 00:53:03 +00001565 VariableSpecDIE = createAndAddDIE(dwarf::DW_TAG_variable, *CUDie.get());
Manman Ren87b110a2013-10-11 23:58:05 +00001566 addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification, VariableDIE);
David Blaikie770530b2013-10-21 17:28:37 +00001567 addBlock(VariableSpecDIE, dwarf::DW_AT_location, Block);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001568 // A static member's declaration is already flagged as such.
1569 if (!SDMDecl.Verify())
1570 addFlag(VariableDIE, dwarf::DW_AT_declaration);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001571 } else {
David Blaikie770530b2013-10-21 17:28:37 +00001572 addBlock(VariableDIE, dwarf::DW_AT_location, Block);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001573 }
Michael Gottesmandc42d032013-09-04 04:39:38 +00001574 // Add the linkage name.
Eric Christopher6b6061f2013-01-16 01:22:23 +00001575 StringRef LinkageName = GV.getLinkageName();
Michael Gottesmandc42d032013-09-04 04:39:38 +00001576 if (!LinkageName.empty())
Eric Christopher8d45a982013-02-27 23:49:47 +00001577 // From DWARF4: DIEs to which DW_AT_linkage_name may apply include:
1578 // TAG_common_block, TAG_constant, TAG_entry_point, TAG_subprogram and
1579 // TAG_variable.
Eric Christopher6efc0432013-10-19 01:04:47 +00001580 addString(IsStaticMember && VariableSpecDIE ? VariableSpecDIE
1581 : VariableDIE,
1582 dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c2b4be2013-06-01 17:51:14 +00001583 GlobalValue::getRealLinkageName(LinkageName));
Eric Christopher8b4310b2012-11-21 00:34:38 +00001584 } else if (const ConstantInt *CI =
Eric Christopher6efc0432013-10-19 01:04:47 +00001585 dyn_cast_or_null<ConstantInt>(GV.getConstant())) {
Adrian Prantl2e892e42013-04-04 22:56:49 +00001586 // AT_const_value was added when the static member was created. To avoid
Manman Ren945e8282013-02-01 23:54:37 +00001587 // emitting AT_const_value multiple times, we only add AT_const_value when
1588 // it is not a static member.
1589 if (!IsStaticMember)
Manman Renc664d762013-10-05 01:43:03 +00001590 addConstantValue(VariableDIE, CI, isUnsignedDIType(DD, GTy));
Manman Ren945e8282013-02-01 23:54:37 +00001591 } else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001592 addToAccelTable = true;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001593 // GV is a merged global.
1594 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1595 Value *Ptr = CE->getOperand(0);
Rafael Espindolaffc7dca2013-10-29 17:07:16 +00001596 addOpAddress(Block, Asm->getSymbol(cast<GlobalValue>(Ptr)));
David Blaikie770530b2013-10-21 17:28:37 +00001597 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
Eric Christopher6efc0432013-10-19 01:04:47 +00001598 SmallVector<Value *, 3> Idx(CE->op_begin() + 1, CE->op_end());
David Blaikie770530b2013-10-21 17:28:37 +00001599 addUInt(Block, dwarf::DW_FORM_udata,
Eric Christopher6efc0432013-10-19 01:04:47 +00001600 Asm->getDataLayout().getIndexedOffset(Ptr->getType(), Idx));
David Blaikie770530b2013-10-21 17:28:37 +00001601 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1602 addBlock(VariableDIE, dwarf::DW_AT_location, Block);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001603 }
1604
Eric Christopherd117fbb2011-11-11 01:55:22 +00001605 if (addToAccelTable) {
1606 DIE *AddrDIE = VariableSpecDIE ? VariableSpecDIE : VariableDIE;
1607 addAccelName(GV.getName(), AddrDIE);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001608
Eric Christopherd117fbb2011-11-11 01:55:22 +00001609 // If the linkage name is different than the name, go ahead and output
1610 // that as well into the name table.
1611 if (GV.getLinkageName() != "" && GV.getName() != GV.getLinkageName())
1612 addAccelName(GV.getLinkageName(), AddrDIE);
1613 }
Eric Christophera486f552013-10-16 01:37:49 +00001614
1615 if (!GV.isLocalToUnit())
Eric Christopher91986572013-10-17 02:06:06 +00001616 addGlobalName(GV.getName(), VariableSpecDIE ? VariableSpecDIE : VariableDIE,
1617 GV.getContext());
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001618}
1619
Devang Patel161b2f42011-04-12 23:21:44 +00001620/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
Eric Christopher4d069bf2012-05-22 18:45:24 +00001621void CompileUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR,
1622 DIE *IndexTy) {
Manman Ren1a5e7872013-10-29 00:53:03 +00001623 DIE *DW_Subrange = createAndAddDIE(dwarf::DW_TAG_subrange_type, Buffer);
Manman Ren87b110a2013-10-11 23:58:05 +00001624 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, IndexTy);
Devang Patel161b2f42011-04-12 23:21:44 +00001625
Bill Wendling222c2fd2012-12-06 07:38:10 +00001626 // The LowerBound value defines the lower bounds which is typically zero for
1627 // C/C++. The Count value is the number of elements. Values are 64 bit. If
1628 // Count == -1 then the array is unbounded and we do not emit
1629 // DW_AT_lower_bound and DW_AT_upper_bound attributes. If LowerBound == 0 and
1630 // Count == 0, then the array has zero elements in which case we do not emit
1631 // an upper bound.
1632 int64_t LowerBound = SR.getLo();
Bill Wendling6afe4782012-12-06 07:55:19 +00001633 int64_t DefaultLowerBound = getDefaultLowerBound();
Bill Wendling9493dae2012-12-04 21:34:03 +00001634 int64_t Count = SR.getCount();
Devang Patel161b2f42011-04-12 23:21:44 +00001635
Bill Wendling6afe4782012-12-06 07:55:19 +00001636 if (DefaultLowerBound == -1 || LowerBound != DefaultLowerBound)
David Blaikie770530b2013-10-21 17:28:37 +00001637 addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, None, LowerBound);
Bill Wendling222c2fd2012-12-06 07:38:10 +00001638
1639 if (Count != -1 && Count != 0)
Bill Wendling9493dae2012-12-04 21:34:03 +00001640 // FIXME: An unbounded array should reference the expression that defines
1641 // the array.
David Blaikie770530b2013-10-21 17:28:37 +00001642 addUInt(DW_Subrange, dwarf::DW_AT_upper_bound, None, LowerBound + Count - 1);
Devang Patel161b2f42011-04-12 23:21:44 +00001643}
1644
1645/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
Eric Christopher6efc0432013-10-19 01:04:47 +00001646void CompileUnit::constructArrayTypeDIE(DIE &Buffer, DICompositeType *CTy) {
Eric Christopher9a1e0e22013-01-08 01:53:52 +00001647 if (CTy->isVector())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001648 addFlag(&Buffer, dwarf::DW_AT_GNU_vector);
Devang Patel161b2f42011-04-12 23:21:44 +00001649
Eric Christopherdc1363f2013-08-08 07:40:37 +00001650 // Emit the element type.
Manman Ren017ceda2013-10-08 18:42:58 +00001651 addType(&Buffer, resolve(CTy->getTypeDerivedFrom()));
Devang Patel161b2f42011-04-12 23:21:44 +00001652
1653 // Get an anonymous type for index type.
Eric Christopher8cab6ed2013-01-04 21:51:53 +00001654 // FIXME: This type should be passed down from the front end
1655 // as different languages may have different sizes for indexes.
Devang Patel161b2f42011-04-12 23:21:44 +00001656 DIE *IdxTy = getIndexTyDie();
1657 if (!IdxTy) {
1658 // Construct an anonymous type for index type.
Manman Ren1a5e7872013-10-29 00:53:03 +00001659 IdxTy = createAndAddDIE(dwarf::DW_TAG_base_type, *CUDie.get());
Eric Christopher8cab6ed2013-01-04 21:51:53 +00001660 addString(IdxTy, dwarf::DW_AT_name, "int");
David Blaikie770530b2013-10-21 17:28:37 +00001661 addUInt(IdxTy, dwarf::DW_AT_byte_size, None, sizeof(int32_t));
Devang Patel161b2f42011-04-12 23:21:44 +00001662 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1663 dwarf::DW_ATE_signed);
Devang Patel161b2f42011-04-12 23:21:44 +00001664 setIndexTyDie(IdxTy);
1665 }
1666
1667 // Add subranges to array type.
Eric Christopherdc1363f2013-08-08 07:40:37 +00001668 DIArray Elements = CTy->getTypeArray();
Devang Patel161b2f42011-04-12 23:21:44 +00001669 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1670 DIDescriptor Element = Elements.getElement(i);
1671 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1672 constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1673 }
1674}
1675
1676/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
Manman Ren99addee2013-10-23 22:57:12 +00001677void CompileUnit::constructEnumTypeDIE(DIE &Buffer, DIEnumerator ETy) {
Manman Ren1a5e7872013-10-29 00:53:03 +00001678 DIE *Enumerator = createAndAddDIE(dwarf::DW_TAG_enumerator, Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +00001679 StringRef Name = ETy.getName();
Nick Lewycky390c40d2011-10-27 06:44:11 +00001680 addString(Enumerator, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001681 int64_t Value = ETy.getEnumValue();
1682 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
Devang Patel161b2f42011-04-12 23:21:44 +00001683}
1684
Devang Pateldbc64af2011-08-15 17:24:54 +00001685/// constructContainingTypeDIEs - Construct DIEs for types that contain
1686/// vtables.
1687void CompileUnit::constructContainingTypeDIEs() {
1688 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
Eric Christopher6efc0432013-10-19 01:04:47 +00001689 CE = ContainingTypeMap.end();
1690 CI != CE; ++CI) {
Devang Pateldbc64af2011-08-15 17:24:54 +00001691 DIE *SPDie = CI->first;
1692 const MDNode *N = CI->second;
Eric Christopher6efc0432013-10-19 01:04:47 +00001693 if (!N)
1694 continue;
Eric Christopher3f045002013-10-04 17:08:38 +00001695 DIE *NDie = getDIE(N);
Eric Christopher6efc0432013-10-19 01:04:47 +00001696 if (!NDie)
1697 continue;
Manman Ren87b110a2013-10-11 23:58:05 +00001698 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, NDie);
Devang Pateldbc64af2011-08-15 17:24:54 +00001699 }
1700}
1701
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001702/// constructVariableDIE - Construct a DIE for the given DbgVariable.
Eric Christopher6efc0432013-10-19 01:04:47 +00001703DIE *CompileUnit::constructVariableDIE(DbgVariable *DV, bool isScopeAbstract) {
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001704 StringRef Name = DV->getName();
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001705
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001706 // Define variable debug information entry.
David Blaikie916d49e2013-10-04 23:21:16 +00001707 DIE *VariableDie = new DIE(DV->getTag());
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001708 DbgVariable *AbsVar = DV->getAbstractVariable();
1709 DIE *AbsDIE = AbsVar ? AbsVar->getDIE() : NULL;
Manman Ren742671b2013-05-29 17:16:59 +00001710 if (AbsDIE)
Manman Ren87b110a2013-10-11 23:58:05 +00001711 addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin, AbsDIE);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001712 else {
David Blaikie2883fd42013-08-19 03:34:03 +00001713 if (!Name.empty())
1714 addString(VariableDie, dwarf::DW_AT_name, Name);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001715 addSourceLine(VariableDie, DV->getVariable());
1716 addType(VariableDie, DV->getType());
1717 }
1718
1719 if (DV->isArtificial())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001720 addFlag(VariableDie, dwarf::DW_AT_artificial);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001721
1722 if (isScopeAbstract) {
1723 DV->setDIE(VariableDie);
1724 return VariableDie;
1725 }
1726
1727 // Add variable address.
1728
1729 unsigned Offset = DV->getDotDebugLocOffset();
1730 if (Offset != ~0U) {
Eric Christopherafbe0e22013-06-24 21:34:55 +00001731 addLabel(VariableDie, dwarf::DW_AT_location, dwarf::DW_FORM_data4,
1732 Asm->GetTempSymbol("debug_loc", Offset));
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001733 DV->setDIE(VariableDie);
1734 return VariableDie;
1735 }
1736
Eric Christopher8cf5e742011-10-03 15:49:20 +00001737 // Check if variable is described by a DBG_VALUE instruction.
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001738 if (const MachineInstr *DVInsn = DV->getMInsn()) {
David Blaikie6d9dbd52013-06-16 20:34:15 +00001739 assert(DVInsn->getNumOperands() == 3);
1740 if (DVInsn->getOperand(0).isReg()) {
1741 const MachineOperand RegOp = DVInsn->getOperand(0);
Adrian Prantlb2754912013-07-09 21:44:06 +00001742 // If the second operand is an immediate, this is an indirect value.
Adrian Prantl35176402013-07-09 20:28:37 +00001743 if (DVInsn->getOperand(1).isImm()) {
Eric Christopher6efc0432013-10-19 01:04:47 +00001744 MachineLocation Location(RegOp.getReg(),
1745 DVInsn->getOperand(1).getImm());
Eric Christopherf61dbc12013-06-24 21:07:27 +00001746 addVariableAddress(*DV, VariableDie, Location);
David Blaikie6d9dbd52013-06-16 20:34:15 +00001747 } else if (RegOp.getReg())
Eric Christopherf61dbc12013-06-24 21:07:27 +00001748 addVariableAddress(*DV, VariableDie, MachineLocation(RegOp.getReg()));
David Blaikie6d9dbd52013-06-16 20:34:15 +00001749 } else if (DVInsn->getOperand(0).isImm())
Eric Christophere4721492013-07-03 01:08:30 +00001750 addConstantValue(VariableDie, DVInsn->getOperand(0), DV->getType());
David Blaikie6d9dbd52013-06-16 20:34:15 +00001751 else if (DVInsn->getOperand(0).isFPImm())
Eric Christophere4721492013-07-03 01:08:30 +00001752 addConstantFPValue(VariableDie, DVInsn->getOperand(0));
David Blaikie6d9dbd52013-06-16 20:34:15 +00001753 else if (DVInsn->getOperand(0).isCImm())
Eric Christophere4721492013-07-03 01:08:30 +00001754 addConstantValue(VariableDie, DVInsn->getOperand(0).getCImm(),
Manman Renc664d762013-10-05 01:43:03 +00001755 isUnsignedDIType(DD, DV->getType()));
Eric Christophere4721492013-07-03 01:08:30 +00001756
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001757 DV->setDIE(VariableDie);
1758 return VariableDie;
1759 } else {
1760 // .. else use frame index.
1761 int FI = DV->getFrameIndex();
1762 if (FI != ~0) {
1763 unsigned FrameReg = 0;
1764 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
Eric Christopher6efc0432013-10-19 01:04:47 +00001765 int Offset = TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001766 MachineLocation Location(FrameReg, Offset);
Eric Christopherf61dbc12013-06-24 21:07:27 +00001767 addVariableAddress(*DV, VariableDie, Location);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001768 }
1769 }
1770
1771 DV->setDIE(VariableDie);
1772 return VariableDie;
1773}
1774
Manman Rena1d25b62013-10-23 23:00:44 +00001775/// constructMemberDIE - Construct member DIE from DIDerivedType.
1776void CompileUnit::constructMemberDIE(DIE &Buffer, DIDerivedType DT) {
Manman Ren1a5e7872013-10-29 00:53:03 +00001777 DIE *MemberDie = createAndAddDIE(DT.getTag(), Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +00001778 StringRef Name = DT.getName();
1779 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001780 addString(MemberDie, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001781
Manman Ren017ceda2013-10-08 18:42:58 +00001782 addType(MemberDie, resolve(DT.getTypeDerivedFrom()));
Devang Patel161b2f42011-04-12 23:21:44 +00001783
1784 addSourceLine(MemberDie, DT);
1785
1786 DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
David Blaikie770530b2013-10-21 17:28:37 +00001787 addUInt(MemLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
Devang Patel161b2f42011-04-12 23:21:44 +00001788
1789 uint64_t Size = DT.getSizeInBits();
Manman Ren43251002013-10-08 18:46:58 +00001790 uint64_t FieldSize = getBaseTypeSize(DD, DT);
Devang Patel161b2f42011-04-12 23:21:44 +00001791
1792 if (Size != FieldSize) {
1793 // Handle bitfield.
David Blaikie770530b2013-10-21 17:28:37 +00001794 addUInt(MemberDie, dwarf::DW_AT_byte_size, None,
1795 getBaseTypeSize(DD, DT) >> 3);
1796 addUInt(MemberDie, dwarf::DW_AT_bit_size, None, DT.getSizeInBits());
Devang Patel161b2f42011-04-12 23:21:44 +00001797
1798 uint64_t Offset = DT.getOffsetInBits();
1799 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1800 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1801 uint64_t FieldOffset = (HiMark - FieldSize);
1802 Offset -= FieldOffset;
1803
1804 // Maybe we need to work from the other end.
Micah Villmow3574eca2012-10-08 16:38:25 +00001805 if (Asm->getDataLayout().isLittleEndian())
Devang Patel161b2f42011-04-12 23:21:44 +00001806 Offset = FieldSize - (Offset + Size);
David Blaikie770530b2013-10-21 17:28:37 +00001807 addUInt(MemberDie, dwarf::DW_AT_bit_offset, None, Offset);
Devang Patel161b2f42011-04-12 23:21:44 +00001808
1809 // Here WD_AT_data_member_location points to the anonymous
1810 // field that includes this bit field.
David Blaikie770530b2013-10-21 17:28:37 +00001811 addUInt(MemLocationDie, dwarf::DW_FORM_udata, FieldOffset >> 3);
Devang Patel161b2f42011-04-12 23:21:44 +00001812
1813 } else
1814 // This is not a bitfield.
David Blaikie770530b2013-10-21 17:28:37 +00001815 addUInt(MemLocationDie, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
Devang Patel161b2f42011-04-12 23:21:44 +00001816
Eric Christopher6efc0432013-10-19 01:04:47 +00001817 if (DT.getTag() == dwarf::DW_TAG_inheritance && DT.isVirtual()) {
Devang Patel161b2f42011-04-12 23:21:44 +00001818
1819 // For C++, virtual base classes are not at fixed offset. Use following
1820 // expression to extract appropriate offset from vtable.
1821 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1822
1823 DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
David Blaikie770530b2013-10-21 17:28:37 +00001824 addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1825 addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1826 addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1827 addUInt(VBaseLocationDie, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1828 addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1829 addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1830 addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
Devang Patel161b2f42011-04-12 23:21:44 +00001831
David Blaikie770530b2013-10-21 17:28:37 +00001832 addBlock(MemberDie, dwarf::DW_AT_data_member_location, VBaseLocationDie);
Devang Patel161b2f42011-04-12 23:21:44 +00001833 } else
David Blaikie770530b2013-10-21 17:28:37 +00001834 addBlock(MemberDie, dwarf::DW_AT_data_member_location, MemLocationDie);
Devang Patel161b2f42011-04-12 23:21:44 +00001835
1836 if (DT.isProtected())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001837 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001838 dwarf::DW_ACCESS_protected);
1839 else if (DT.isPrivate())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001840 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001841 dwarf::DW_ACCESS_private);
1842 // Otherwise C++ member and base classes are considered public.
Eric Christopher8b4310b2012-11-21 00:34:38 +00001843 else
Nick Lewycky13aaca52011-12-13 05:09:11 +00001844 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001845 dwarf::DW_ACCESS_public);
1846 if (DT.isVirtual())
Nick Lewycky798313d2011-12-14 00:56:07 +00001847 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001848 dwarf::DW_VIRTUALITY_virtual);
Devang Patele9db5e22011-04-16 00:11:51 +00001849
1850 // Objective-C properties.
Devang Patel6588abf2012-02-06 17:49:43 +00001851 if (MDNode *PNode = DT.getObjCProperty())
1852 if (DIEEntry *PropertyDie = getDIEEntry(PNode))
Eric Christopher8b4310b2012-11-21 00:34:38 +00001853 MemberDie->addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4,
Devang Patel6588abf2012-02-06 17:49:43 +00001854 PropertyDie);
1855
David Blaikie01bc2b32012-12-13 22:43:07 +00001856 if (DT.isArtificial())
1857 addFlag(MemberDie, dwarf::DW_AT_artificial);
Devang Patel161b2f42011-04-12 23:21:44 +00001858}
Eric Christopher6b6061f2013-01-16 01:22:23 +00001859
Manman Ren655a10d2013-10-14 20:33:57 +00001860/// getOrCreateStaticMemberDIE - Create new DIE for C++ static member.
1861DIE *CompileUnit::getOrCreateStaticMemberDIE(const DIDerivedType DT) {
Eric Christopher6b6061f2013-01-16 01:22:23 +00001862 if (!DT.Verify())
1863 return NULL;
1864
Manman Ren655a10d2013-10-14 20:33:57 +00001865 // Construct the context before querying for the existence of the DIE in case
1866 // such construction creates the DIE.
1867 DIE *ContextDIE = getOrCreateContextDIE(resolve(DT.getContext()));
1868 assert(ContextDIE && "Static member should belong to a non-CU context.");
1869
1870 DIE *StaticMemberDIE = getDIE(DT);
1871 if (StaticMemberDIE)
1872 return StaticMemberDIE;
1873
Manman Ren1a5e7872013-10-29 00:53:03 +00001874 StaticMemberDIE = createAndAddDIE(DT.getTag(), *ContextDIE, DT);
Manman Ren655a10d2013-10-14 20:33:57 +00001875
Manman Ren017ceda2013-10-08 18:42:58 +00001876 DIType Ty = resolve(DT.getTypeDerivedFrom());
Eric Christopher6b6061f2013-01-16 01:22:23 +00001877
1878 addString(StaticMemberDIE, dwarf::DW_AT_name, DT.getName());
1879 addType(StaticMemberDIE, Ty);
1880 addSourceLine(StaticMemberDIE, DT);
1881 addFlag(StaticMemberDIE, dwarf::DW_AT_external);
1882 addFlag(StaticMemberDIE, dwarf::DW_AT_declaration);
1883
1884 // FIXME: We could omit private if the parent is a class_type, and
1885 // public if the parent is something else.
1886 if (DT.isProtected())
1887 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1888 dwarf::DW_ACCESS_protected);
1889 else if (DT.isPrivate())
1890 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1891 dwarf::DW_ACCESS_private);
1892 else
1893 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1894 dwarf::DW_ACCESS_public);
1895
1896 if (const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(DT.getConstant()))
Manman Renc664d762013-10-05 01:43:03 +00001897 addConstantValue(StaticMemberDIE, CI, isUnsignedDIType(DD, Ty));
David Blaikie14268412013-01-20 01:18:01 +00001898 if (const ConstantFP *CFP = dyn_cast_or_null<ConstantFP>(DT.getConstant()))
1899 addConstantFPValue(StaticMemberDIE, CFP);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001900
Eric Christopher6b6061f2013-01-16 01:22:23 +00001901 return StaticMemberDIE;
1902}