blob: db8558cfeca37a5dfec025dc721ae412d5306e39 [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)
Eric Christophere7099f62013-10-04 19:40:33 +000036 : UniqueID(UID), Node(N), CUDie(D), Asm(A), DD(DW), DU(DWU), IndexTyDie(0) {
Devang Patel161b2f42011-04-12 23:21:44 +000037 DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
Eric Christopher9c57ad22013-05-08 00:58:51 +000038 insertDIE(N, D);
Devang Patel161b2f42011-04-12 23:21:44 +000039}
40
41/// ~CompileUnit - Destructor for compile unit.
42CompileUnit::~CompileUnit() {
43 for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
44 DIEBlocks[j]->~DIEBlock();
45}
46
47/// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
48/// information entry.
49DIEEntry *CompileUnit::createDIEEntry(DIE *Entry) {
50 DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
51 return Value;
52}
53
Bill Wendling6afe4782012-12-06 07:55:19 +000054/// getDefaultLowerBound - Return the default lower bound for an array. If the
Bill Wendling222c2fd2012-12-06 07:38:10 +000055/// DWARF version doesn't handle the language, return -1.
Bill Wendling6afe4782012-12-06 07:55:19 +000056int64_t CompileUnit::getDefaultLowerBound() const {
Eric Christopher7b878952013-08-26 23:50:38 +000057 switch (DICompileUnit(Node).getLanguage()) {
Bill Wendling222c2fd2012-12-06 07:38:10 +000058 default:
59 break;
60
61 case dwarf::DW_LANG_C89:
62 case dwarf::DW_LANG_C99:
63 case dwarf::DW_LANG_C:
64 case dwarf::DW_LANG_C_plus_plus:
65 case dwarf::DW_LANG_ObjC:
66 case dwarf::DW_LANG_ObjC_plus_plus:
67 return 0;
68
69 case dwarf::DW_LANG_Fortran77:
70 case dwarf::DW_LANG_Fortran90:
71 case dwarf::DW_LANG_Fortran95:
72 return 1;
73
74 // The languages below have valid values only if the DWARF version >= 4.
75 case dwarf::DW_LANG_Java:
76 case dwarf::DW_LANG_Python:
77 case dwarf::DW_LANG_UPC:
78 case dwarf::DW_LANG_D:
79 if (dwarf::DWARF_VERSION >= 4)
80 return 0;
81 break;
82
83 case dwarf::DW_LANG_Ada83:
84 case dwarf::DW_LANG_Ada95:
85 case dwarf::DW_LANG_Cobol74:
86 case dwarf::DW_LANG_Cobol85:
87 case dwarf::DW_LANG_Modula2:
88 case dwarf::DW_LANG_Pascal83:
89 case dwarf::DW_LANG_PLI:
90 if (dwarf::DWARF_VERSION >= 4)
91 return 1;
92 break;
93 }
94
95 return -1;
96}
97
Eric Christopher873cf0a2012-08-24 01:14:27 +000098/// addFlag - Add a flag that is true.
David Blaikie770530b2013-10-21 17:28:37 +000099void CompileUnit::addFlag(DIE *Die, dwarf::Attribute Attribute) {
Michael Gottesmandc42d032013-09-04 04:39:38 +0000100 if (DD->getDwarfVersion() >= 4)
Eric Christopher9c0c9482013-10-04 22:40:05 +0000101 Die->addValue(Attribute, dwarf::DW_FORM_flag_present, DIEIntegerOne);
Eric Christopher873cf0a2012-08-24 01:14:27 +0000102 else
Eric Christopher9c0c9482013-10-04 22:40:05 +0000103 Die->addValue(Attribute, dwarf::DW_FORM_flag, DIEIntegerOne);
Eric Christopher873cf0a2012-08-24 01:14:27 +0000104}
105
Devang Patel161b2f42011-04-12 23:21:44 +0000106/// addUInt - Add an unsigned integer attribute data and value.
107///
David Blaikie770530b2013-10-21 17:28:37 +0000108void CompileUnit::addUInt(DIE *Die, dwarf::Attribute Attribute,
109 Optional<dwarf::Form> Form, uint64_t Integer) {
Eric Christopher6efc0432013-10-19 01:04:47 +0000110 if (!Form)
111 Form = DIEInteger::BestForm(false, Integer);
112 DIEValue *Value = Integer == 1 ? DIEIntegerOne : new (DIEValueAllocator)
113 DIEInteger(Integer);
David Blaikie770530b2013-10-21 17:28:37 +0000114 Die->addValue(Attribute, *Form, Value);
115}
116
117void CompileUnit::addUInt(DIEBlock *Block, dwarf::Form Form, uint64_t Integer) {
118 addUInt(Block, (dwarf::Attribute)0, Form, Integer);
Devang Patel161b2f42011-04-12 23:21:44 +0000119}
120
121/// addSInt - Add an signed integer attribute data and value.
122///
David Blaikie770530b2013-10-21 17:28:37 +0000123void CompileUnit::addSInt(DIE *Die, dwarf::Attribute Attribute,
124 Optional<dwarf::Form> Form, int64_t Integer) {
Eric Christopher6efc0432013-10-19 01:04:47 +0000125 if (!Form)
126 Form = DIEInteger::BestForm(true, Integer);
Devang Patel161b2f42011-04-12 23:21:44 +0000127 DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
David Blaikie770530b2013-10-21 17:28:37 +0000128 Die->addValue(Attribute, *Form, Value);
129}
130
131void CompileUnit::addSInt(DIEBlock *Die, Optional<dwarf::Form> Form,
132 int64_t Integer) {
133 addSInt(Die, (dwarf::Attribute)0, Form, Integer);
Devang Patel161b2f42011-04-12 23:21:44 +0000134}
135
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000136/// addString - Add a string attribute data and value. We always emit a
137/// reference to the string pool instead of immediate strings so that DIEs have
Eric Christopher3cc42202013-01-07 19:32:45 +0000138/// more predictable sizes. In the case of split dwarf we emit an index
139/// into another table which gets us the static offset into the string
140/// table.
David Blaikie770530b2013-10-21 17:28:37 +0000141void CompileUnit::addString(DIE *Die, dwarf::Attribute Attribute, StringRef String) {
Eric Christopher3dee5752013-07-26 17:02:41 +0000142 DIEValue *Value;
David Blaikie770530b2013-10-21 17:28:37 +0000143 dwarf::Form Form;
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000144 if (!DD->useSplitDwarf()) {
145 MCSymbol *Symb = DU->getStringPoolEntry(String);
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000146 if (Asm->needsRelocationsForDwarfStringPool())
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000147 Value = new (DIEValueAllocator) DIELabel(Symb);
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000148 else {
149 MCSymbol *StringPool = DU->getStringPoolSym();
150 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
151 }
Eric Christopher3dee5752013-07-26 17:02:41 +0000152 Form = dwarf::DW_FORM_strp;
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000153 } else {
154 unsigned idx = DU->getStringPoolIndex(String);
Eric Christopher3dee5752013-07-26 17:02:41 +0000155 Value = new (DIEValueAllocator) DIEInteger(idx);
156 Form = dwarf::DW_FORM_GNU_str_index;
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000157 }
Eric Christopher3dee5752013-07-26 17:02:41 +0000158 DIEValue *Str = new (DIEValueAllocator) DIEString(Value, String);
159 Die->addValue(Attribute, Form, Str);
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000160}
161
162/// addLocalString - Add a string attribute data and value. This is guaranteed
163/// to be in the local string pool instead of indirected.
David Blaikie770530b2013-10-21 17:28:37 +0000164void CompileUnit::addLocalString(DIE *Die, dwarf::Attribute Attribute,
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000165 StringRef String) {
Eric Christopher2e5d8702012-12-20 21:58:36 +0000166 MCSymbol *Symb = DU->getStringPoolEntry(String);
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000167 DIEValue *Value;
168 if (Asm->needsRelocationsForDwarfStringPool())
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000169 Value = new (DIEValueAllocator) DIELabel(Symb);
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000170 else {
Eric Christopher2e5d8702012-12-20 21:58:36 +0000171 MCSymbol *StringPool = DU->getStringPoolSym();
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000172 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
Nick Lewycky390c40d2011-10-27 06:44:11 +0000173 }
Nick Lewycky6a7efcf2011-10-28 05:29:47 +0000174 Die->addValue(Attribute, dwarf::DW_FORM_strp, Value);
Devang Patel161b2f42011-04-12 23:21:44 +0000175}
176
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000177/// addExpr - Add a Dwarf expression attribute data and value.
Devang Patel161b2f42011-04-12 23:21:44 +0000178///
David Blaikie770530b2013-10-21 17:28:37 +0000179void CompileUnit::addExpr(DIEBlock *Die, dwarf::Form Form, const MCExpr *Expr) {
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000180 DIEValue *Value = new (DIEValueAllocator) DIEExpr(Expr);
David Blaikie770530b2013-10-21 17:28:37 +0000181 Die->addValue((dwarf::Attribute)0, Form, Value);
Devang Patel161b2f42011-04-12 23:21:44 +0000182}
183
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000184/// addLabel - Add a Dwarf label attribute data and value.
185///
David Blaikie770530b2013-10-21 17:28:37 +0000186void CompileUnit::addLabel(DIE *Die, dwarf::Attribute Attribute, dwarf::Form Form,
David Blaikie95e72c92013-06-28 20:05:04 +0000187 const MCSymbol *Label) {
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000188 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
189 Die->addValue(Attribute, Form, Value);
David Blaikie95e72c92013-06-28 20:05:04 +0000190}
191
David Blaikie770530b2013-10-21 17:28:37 +0000192void CompileUnit::addLabel(DIEBlock *Die, dwarf::Form Form,
193 const MCSymbol *Label) {
194 addLabel(Die, (dwarf::Attribute)0, Form, Label);
195}
196
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000197/// addLabelAddress - Add a dwarf label attribute data and value using
198/// DW_FORM_addr or DW_FORM_GNU_addr_index.
199///
David Blaikie770530b2013-10-21 17:28:37 +0000200void CompileUnit::addLabelAddress(DIE *Die, dwarf::Attribute Attribute,
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000201 MCSymbol *Label) {
Alexey Samsonov9d08d692013-10-03 08:54:43 +0000202 if (Label)
203 DD->addArangeLabel(SymbolCU(this, Label));
Richard Mitton5cc319a2013-09-19 23:21:01 +0000204
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000205 if (!DD->useSplitDwarf()) {
206 if (Label != NULL) {
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +0000207 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000208 Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
209 } else {
210 DIEValue *Value = new (DIEValueAllocator) DIEInteger(0);
211 Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
212 }
213 } else {
214 unsigned idx = DU->getAddrPoolIndex(Label);
215 DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx);
216 Die->addValue(Attribute, dwarf::DW_FORM_GNU_addr_index, Value);
217 }
218}
219
Eric Christopher0969ddf2013-01-18 22:11:33 +0000220/// addOpAddress - Add a dwarf op address data and value using the
221/// form given and an op of either DW_FORM_addr or DW_FORM_GNU_addr_index.
222///
David Blaikie770530b2013-10-21 17:28:37 +0000223void CompileUnit::addOpAddress(DIEBlock *Die, const MCSymbol *Sym) {
Alexey Samsonov9d08d692013-10-03 08:54:43 +0000224 DD->addArangeLabel(SymbolCU(this, Sym));
Eric Christopher0969ddf2013-01-18 22:11:33 +0000225 if (!DD->useSplitDwarf()) {
David Blaikie770530b2013-10-21 17:28:37 +0000226 addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
227 addLabel(Die, dwarf::DW_FORM_udata, Sym);
Eric Christopher0969ddf2013-01-18 22:11:33 +0000228 } else {
David Blaikie770530b2013-10-21 17:28:37 +0000229 addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_addr_index);
230 addUInt(Die, dwarf::DW_FORM_GNU_addr_index, DU->getAddrPoolIndex(Sym));
Eric Christopher0969ddf2013-01-18 22:11:33 +0000231 }
232}
233
Devang Patel161b2f42011-04-12 23:21:44 +0000234/// addDelta - Add a label delta attribute data and value.
235///
David Blaikie770530b2013-10-21 17:28:37 +0000236void CompileUnit::addDelta(DIE *Die, dwarf::Attribute Attribute, dwarf::Form Form,
Devang Patel161b2f42011-04-12 23:21:44 +0000237 const MCSymbol *Hi, const MCSymbol *Lo) {
238 DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
239 Die->addValue(Attribute, Form, Value);
240}
241
242/// addDIEEntry - Add a DIE attribute data and value.
243///
David Blaikie770530b2013-10-21 17:28:37 +0000244void CompileUnit::addDIEEntry(DIE *Die, dwarf::Attribute Attribute, DIE *Entry) {
Manman Ren87b110a2013-10-11 23:58:05 +0000245 // We currently only use ref4.
246 Die->addValue(Attribute, dwarf::DW_FORM_ref4, createDIEEntry(Entry));
Devang Patel161b2f42011-04-12 23:21:44 +0000247}
248
Manman Ren1a5e7872013-10-29 00:53:03 +0000249/// Create a DIE with the given Tag, add the DIE to its parent, and
250/// call insertDIE if MD is not null.
251DIE *CompileUnit::createAndAddDIE(unsigned Tag, DIE &Parent, const MDNode *MD) {
252 DIE *Die = new DIE(Tag);
253 Parent.addChild(Die);
254 if (MD)
255 insertDIE(MD, Die);
256 return Die;
257}
258
Devang Patel161b2f42011-04-12 23:21:44 +0000259/// addBlock - Add block data.
260///
David Blaikie770530b2013-10-21 17:28:37 +0000261void CompileUnit::addBlock(DIE *Die, dwarf::Attribute Attribute,
Devang Patel161b2f42011-04-12 23:21:44 +0000262 DIEBlock *Block) {
263 Block->ComputeSize(Asm);
264 DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
265 Die->addValue(Attribute, Block->BestForm(), Block);
266}
267
268/// addSourceLine - Add location information to specified debug information
269/// entry.
270void CompileUnit::addSourceLine(DIE *Die, DIVariable V) {
271 // Verify variable.
Manman Rend03d2b22013-07-08 18:33:29 +0000272 if (!V.isVariable())
Devang Patel161b2f42011-04-12 23:21:44 +0000273 return;
Eric Christopher8b4310b2012-11-21 00:34:38 +0000274
Devang Patel161b2f42011-04-12 23:21:44 +0000275 unsigned Line = V.getLineNumber();
276 if (Line == 0)
277 return;
Eric Christopher6efc0432013-10-19 01:04:47 +0000278 unsigned FileID =
279 DD->getOrCreateSourceID(V.getContext().getFilename(),
280 V.getContext().getDirectory(), getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000281 assert(FileID && "Invalid file id");
David Blaikie770530b2013-10-21 17:28:37 +0000282 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
283 addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
Devang Patel161b2f42011-04-12 23:21:44 +0000284}
285
286/// addSourceLine - Add location information to specified debug information
287/// entry.
288void CompileUnit::addSourceLine(DIE *Die, DIGlobalVariable G) {
289 // Verify global variable.
Manman Rend03d2b22013-07-08 18:33:29 +0000290 if (!G.isGlobalVariable())
Devang Patel161b2f42011-04-12 23:21:44 +0000291 return;
292
293 unsigned Line = G.getLineNumber();
294 if (Line == 0)
295 return;
Eric Christopher6efc0432013-10-19 01:04:47 +0000296 unsigned FileID =
297 DD->getOrCreateSourceID(G.getFilename(), G.getDirectory(), getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000298 assert(FileID && "Invalid file id");
David Blaikie770530b2013-10-21 17:28:37 +0000299 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
300 addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
Devang Patel161b2f42011-04-12 23:21:44 +0000301}
302
303/// addSourceLine - Add location information to specified debug information
304/// entry.
305void CompileUnit::addSourceLine(DIE *Die, DISubprogram SP) {
306 // Verify subprogram.
Manman Rend03d2b22013-07-08 18:33:29 +0000307 if (!SP.isSubprogram())
Devang Patel161b2f42011-04-12 23:21:44 +0000308 return;
Eric Christopher2125d5a2012-03-15 23:55:40 +0000309
Devang Patel161b2f42011-04-12 23:21:44 +0000310 // If the line number is 0, don't add it.
Eric Christopher2125d5a2012-03-15 23:55:40 +0000311 unsigned Line = SP.getLineNumber();
312 if (Line == 0)
Devang Patel161b2f42011-04-12 23:21:44 +0000313 return;
314
Eric Christopher6efc0432013-10-19 01:04:47 +0000315 unsigned FileID = DD->getOrCreateSourceID(SP.getFilename(), SP.getDirectory(),
316 getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000317 assert(FileID && "Invalid file id");
David Blaikie770530b2013-10-21 17:28:37 +0000318 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
319 addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
Devang Patel161b2f42011-04-12 23:21:44 +0000320}
321
322/// addSourceLine - Add location information to specified debug information
323/// entry.
324void CompileUnit::addSourceLine(DIE *Die, DIType Ty) {
325 // Verify type.
Manman Rend03d2b22013-07-08 18:33:29 +0000326 if (!Ty.isType())
Devang Patel161b2f42011-04-12 23:21:44 +0000327 return;
328
329 unsigned Line = Ty.getLineNumber();
Eric Christopher2125d5a2012-03-15 23:55:40 +0000330 if (Line == 0)
Devang Patel161b2f42011-04-12 23:21:44 +0000331 return;
Eric Christopher6efc0432013-10-19 01:04:47 +0000332 unsigned FileID = DD->getOrCreateSourceID(Ty.getFilename(), Ty.getDirectory(),
333 getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000334 assert(FileID && "Invalid file id");
David Blaikie770530b2013-10-21 17:28:37 +0000335 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
336 addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
Devang Patel161b2f42011-04-12 23:21:44 +0000337}
338
339/// addSourceLine - Add location information to specified debug information
340/// entry.
Eric Christopherb8ca9882012-03-29 08:42:56 +0000341void CompileUnit::addSourceLine(DIE *Die, DIObjCProperty Ty) {
342 // Verify type.
Manman Rend03d2b22013-07-08 18:33:29 +0000343 if (!Ty.isObjCProperty())
Eric Christopherb8ca9882012-03-29 08:42:56 +0000344 return;
345
346 unsigned Line = Ty.getLineNumber();
347 if (Line == 0)
348 return;
349 DIFile File = Ty.getFile();
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000350 unsigned FileID = DD->getOrCreateSourceID(File.getFilename(),
Manman Ren3de61b42013-03-07 01:42:00 +0000351 File.getDirectory(), getUniqueID());
Eric Christopherb8ca9882012-03-29 08:42:56 +0000352 assert(FileID && "Invalid file id");
David Blaikie770530b2013-10-21 17:28:37 +0000353 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
354 addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
Eric Christopherb8ca9882012-03-29 08:42:56 +0000355}
356
357/// addSourceLine - Add location information to specified debug information
358/// entry.
Devang Patel161b2f42011-04-12 23:21:44 +0000359void CompileUnit::addSourceLine(DIE *Die, DINameSpace NS) {
360 // Verify namespace.
361 if (!NS.Verify())
362 return;
363
364 unsigned Line = NS.getLineNumber();
365 if (Line == 0)
366 return;
367 StringRef FN = NS.getFilename();
368
Eric Christopher6efc0432013-10-19 01:04:47 +0000369 unsigned FileID =
370 DD->getOrCreateSourceID(FN, NS.getDirectory(), getUniqueID());
Devang Patel161b2f42011-04-12 23:21:44 +0000371 assert(FileID && "Invalid file id");
David Blaikie770530b2013-10-21 17:28:37 +0000372 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
373 addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
Devang Patel161b2f42011-04-12 23:21:44 +0000374}
375
Eric Christopher8b4310b2012-11-21 00:34:38 +0000376/// addVariableAddress - Add DW_AT_location attribute for a
Devang Patele1cdf842011-04-27 22:45:24 +0000377/// DbgVariable based on provided MachineLocation.
Eric Christopherf61dbc12013-06-24 21:07:27 +0000378void CompileUnit::addVariableAddress(const DbgVariable &DV, DIE *Die,
Devang Patele1cdf842011-04-27 22:45:24 +0000379 MachineLocation Location) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000380 if (DV.variableHasComplexAddress())
Devang Patel161b2f42011-04-12 23:21:44 +0000381 addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
Eric Christopherf61dbc12013-06-24 21:07:27 +0000382 else if (DV.isBlockByrefVariable())
Devang Patel161b2f42011-04-12 23:21:44 +0000383 addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location);
384 else
David Blaikie4532c282013-06-20 00:25:24 +0000385 addAddress(Die, dwarf::DW_AT_location, Location,
Eric Christopherf61dbc12013-06-24 21:07:27 +0000386 DV.getVariable().isIndirect());
Devang Patel161b2f42011-04-12 23:21:44 +0000387}
388
Devang Patel116da2f2011-04-26 19:06:18 +0000389/// addRegisterOp - Add register operand.
David Blaikie770530b2013-10-21 17:28:37 +0000390void CompileUnit::addRegisterOp(DIEBlock *TheDie, unsigned Reg) {
Devang Patel116da2f2011-04-26 19:06:18 +0000391 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
392 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
393 if (DWReg < 32)
David Blaikie770530b2013-10-21 17:28:37 +0000394 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + DWReg);
Devang Patel116da2f2011-04-26 19:06:18 +0000395 else {
David Blaikie770530b2013-10-21 17:28:37 +0000396 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
397 addUInt(TheDie, dwarf::DW_FORM_udata, DWReg);
Devang Patel116da2f2011-04-26 19:06:18 +0000398 }
399}
400
401/// addRegisterOffset - Add register offset.
David Blaikie770530b2013-10-21 17:28:37 +0000402void CompileUnit::addRegisterOffset(DIEBlock *TheDie, unsigned Reg,
403 int64_t Offset) {
Devang Patel116da2f2011-04-26 19:06:18 +0000404 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
405 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
406 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
407 if (Reg == TRI->getFrameRegister(*Asm->MF))
408 // If variable offset is based in frame register then use fbreg.
David Blaikie770530b2013-10-21 17:28:37 +0000409 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
Devang Patel116da2f2011-04-26 19:06:18 +0000410 else if (DWReg < 32)
David Blaikie770530b2013-10-21 17:28:37 +0000411 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DWReg);
Devang Patel116da2f2011-04-26 19:06:18 +0000412 else {
David Blaikie770530b2013-10-21 17:28:37 +0000413 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
414 addUInt(TheDie, dwarf::DW_FORM_udata, DWReg);
Devang Patel116da2f2011-04-26 19:06:18 +0000415 }
David Blaikie770530b2013-10-21 17:28:37 +0000416 addSInt(TheDie, dwarf::DW_FORM_sdata, Offset);
Devang Patel116da2f2011-04-26 19:06:18 +0000417}
418
419/// addAddress - Add an address attribute to a die based on the location
420/// provided.
David Blaikie770530b2013-10-21 17:28:37 +0000421void CompileUnit::addAddress(DIE *Die, dwarf::Attribute Attribute,
David Blaikie4532c282013-06-20 00:25:24 +0000422 const MachineLocation &Location, bool Indirect) {
Devang Patel116da2f2011-04-26 19:06:18 +0000423 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
424
David Blaikie4532c282013-06-20 00:25:24 +0000425 if (Location.isReg() && !Indirect)
Devang Patel116da2f2011-04-26 19:06:18 +0000426 addRegisterOp(Block, Location.getReg());
David Blaikie4532c282013-06-20 00:25:24 +0000427 else {
Devang Patel116da2f2011-04-26 19:06:18 +0000428 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
David Blaikie4532c282013-06-20 00:25:24 +0000429 if (Indirect && !Location.isReg()) {
David Blaikie770530b2013-10-21 17:28:37 +0000430 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
David Blaikie4532c282013-06-20 00:25:24 +0000431 }
432 }
Devang Patel116da2f2011-04-26 19:06:18 +0000433
434 // Now attach the location information to the DIE.
David Blaikie770530b2013-10-21 17:28:37 +0000435 addBlock(Die, Attribute, Block);
Devang Patel116da2f2011-04-26 19:06:18 +0000436}
437
Devang Patel161b2f42011-04-12 23:21:44 +0000438/// addComplexAddress - Start with the address based on the location provided,
439/// and generate the DWARF information necessary to find the actual variable
440/// given the extra address information encoded in the DIVariable, starting from
441/// the starting location. Add the DWARF information to the die.
442///
Eric Christopherf61dbc12013-06-24 21:07:27 +0000443void CompileUnit::addComplexAddress(const DbgVariable &DV, DIE *Die,
David Blaikie770530b2013-10-21 17:28:37 +0000444 dwarf::Attribute Attribute,
Devang Patel161b2f42011-04-12 23:21:44 +0000445 const MachineLocation &Location) {
Devang Patel161b2f42011-04-12 23:21:44 +0000446 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Eric Christopherf61dbc12013-06-24 21:07:27 +0000447 unsigned N = DV.getNumAddrElements();
Devang Patelc26f5442011-04-28 02:22:40 +0000448 unsigned i = 0;
449 if (Location.isReg()) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000450 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
Devang Patelc26f5442011-04-28 02:22:40 +0000451 // If first address element is OpPlus then emit
452 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
Eric Christopherf61dbc12013-06-24 21:07:27 +0000453 addRegisterOffset(Block, Location.getReg(), DV.getAddrElement(1));
Devang Patelc26f5442011-04-28 02:22:40 +0000454 i = 2;
455 } else
456 addRegisterOp(Block, Location.getReg());
Eric Christopher6efc0432013-10-19 01:04:47 +0000457 } else
Devang Patel116da2f2011-04-26 19:06:18 +0000458 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel161b2f42011-04-12 23:21:44 +0000459
Eric Christopher6efc0432013-10-19 01:04:47 +0000460 for (; i < N; ++i) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000461 uint64_t Element = DV.getAddrElement(i);
Devang Patel161b2f42011-04-12 23:21:44 +0000462 if (Element == DIBuilder::OpPlus) {
David Blaikie770530b2013-10-21 17:28:37 +0000463 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
464 addUInt(Block, dwarf::DW_FORM_udata, DV.getAddrElement(++i));
Devang Patel161b2f42011-04-12 23:21:44 +0000465 } else if (Element == DIBuilder::OpDeref) {
Eric Christopher50120762012-05-08 18:56:00 +0000466 if (!Location.isReg())
David Blaikie770530b2013-10-21 17:28:37 +0000467 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Eric Christopher6efc0432013-10-19 01:04:47 +0000468 } else
469 llvm_unreachable("unknown DIBuilder Opcode");
Devang Patel161b2f42011-04-12 23:21:44 +0000470 }
471
472 // Now attach the location information to the DIE.
David Blaikie770530b2013-10-21 17:28:37 +0000473 addBlock(Die, Attribute, Block);
Devang Patel161b2f42011-04-12 23:21:44 +0000474}
475
476/* Byref variables, in Blocks, are declared by the programmer as "SomeType
477 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
478 gives the variable VarName either the struct, or a pointer to the struct, as
479 its type. This is necessary for various behind-the-scenes things the
480 compiler needs to do with by-reference variables in Blocks.
481
482 However, as far as the original *programmer* is concerned, the variable
483 should still have type 'SomeType', as originally declared.
484
485 The function getBlockByrefType dives into the __Block_byref_x_VarName
486 struct to find the original type of the variable, which is then assigned to
487 the variable's Debug Information Entry as its real type. So far, so good.
488 However now the debugger will expect the variable VarName to have the type
489 SomeType. So we need the location attribute for the variable to be an
490 expression that explains to the debugger how to navigate through the
491 pointers and struct to find the actual variable of type SomeType.
492
493 The following function does just that. We start by getting
494 the "normal" location for the variable. This will be the location
495 of either the struct __Block_byref_x_VarName or the pointer to the
496 struct __Block_byref_x_VarName.
497
498 The struct will look something like:
499
500 struct __Block_byref_x_VarName {
501 ... <various fields>
502 struct __Block_byref_x_VarName *forwarding;
503 ... <various other fields>
504 SomeType VarName;
505 ... <maybe more fields>
506 };
507
508 If we are given the struct directly (as our starting point) we
509 need to tell the debugger to:
510
511 1). Add the offset of the forwarding field.
512
513 2). Follow that pointer to get the real __Block_byref_x_VarName
514 struct to use (the real one may have been copied onto the heap).
515
516 3). Add the offset for the field VarName, to find the actual variable.
517
518 If we started with a pointer to the struct, then we need to
519 dereference that pointer first, before the other steps.
520 Translating this into DWARF ops, we will need to append the following
521 to the current location description for the variable:
522
523 DW_OP_deref -- optional, if we start with a pointer
524 DW_OP_plus_uconst <forward_fld_offset>
525 DW_OP_deref
526 DW_OP_plus_uconst <varName_fld_offset>
527
528 That is what this function does. */
529
530/// addBlockByrefAddress - Start with the address based on the location
531/// provided, and generate the DWARF information necessary to find the
532/// actual Block variable (navigating the Block struct) based on the
533/// starting location. Add the DWARF information to the die. For
534/// more information, read large comment just above here.
535///
Eric Christopherf61dbc12013-06-24 21:07:27 +0000536void CompileUnit::addBlockByrefAddress(const DbgVariable &DV, DIE *Die,
David Blaikie770530b2013-10-21 17:28:37 +0000537 dwarf::Attribute Attribute,
Devang Patel161b2f42011-04-12 23:21:44 +0000538 const MachineLocation &Location) {
Eric Christopherf61dbc12013-06-24 21:07:27 +0000539 DIType Ty = DV.getType();
Devang Patel161b2f42011-04-12 23:21:44 +0000540 DIType TmpTy = Ty;
Eric Christopher31667622013-08-08 01:41:00 +0000541 uint16_t Tag = Ty.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +0000542 bool isPointer = false;
543
Eric Christopherf61dbc12013-06-24 21:07:27 +0000544 StringRef varName = DV.getName();
Devang Patel161b2f42011-04-12 23:21:44 +0000545
546 if (Tag == dwarf::DW_TAG_pointer_type) {
547 DIDerivedType DTy = DIDerivedType(Ty);
Manman Ren017ceda2013-10-08 18:42:58 +0000548 TmpTy = resolve(DTy.getTypeDerivedFrom());
Devang Patel161b2f42011-04-12 23:21:44 +0000549 isPointer = true;
550 }
551
552 DICompositeType blockStruct = DICompositeType(TmpTy);
553
554 // Find the __forwarding field and the variable field in the __Block_byref
555 // struct.
556 DIArray Fields = blockStruct.getTypeArray();
557 DIDescriptor varField = DIDescriptor();
558 DIDescriptor forwardingField = DIDescriptor();
559
560 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
561 DIDescriptor Element = Fields.getElement(i);
562 DIDerivedType DT = DIDerivedType(Element);
563 StringRef fieldName = DT.getName();
564 if (fieldName == "__forwarding")
565 forwardingField = Element;
566 else if (fieldName == varName)
567 varField = Element;
568 }
569
570 // Get the offsets for the forwarding field and the variable field.
571 unsigned forwardingFieldOffset =
Eric Christopher6efc0432013-10-19 01:04:47 +0000572 DIDerivedType(forwardingField).getOffsetInBits() >> 3;
573 unsigned varFieldOffset = DIDerivedType(varField).getOffsetInBits() >> 3;
Devang Patel161b2f42011-04-12 23:21:44 +0000574
575 // Decode the original location, and use that as the start of the byref
576 // variable's location.
Devang Patel161b2f42011-04-12 23:21:44 +0000577 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
578
Eric Christophercaba2632012-07-04 02:02:18 +0000579 if (Location.isReg())
580 addRegisterOp(Block, Location.getReg());
581 else
582 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel161b2f42011-04-12 23:21:44 +0000583
584 // If we started with a pointer to the __Block_byref... struct, then
585 // the first thing we need to do is dereference the pointer (DW_OP_deref).
586 if (isPointer)
David Blaikie770530b2013-10-21 17:28:37 +0000587 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Devang Patel161b2f42011-04-12 23:21:44 +0000588
589 // Next add the offset for the '__forwarding' field:
590 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
591 // adding the offset if it's 0.
592 if (forwardingFieldOffset > 0) {
David Blaikie770530b2013-10-21 17:28:37 +0000593 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
594 addUInt(Block, dwarf::DW_FORM_udata, forwardingFieldOffset);
Devang Patel161b2f42011-04-12 23:21:44 +0000595 }
596
597 // Now dereference the __forwarding field to get to the real __Block_byref
598 // struct: DW_OP_deref.
David Blaikie770530b2013-10-21 17:28:37 +0000599 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Devang Patel161b2f42011-04-12 23:21:44 +0000600
601 // Now that we've got the real __Block_byref... struct, add the offset
602 // for the variable's field to get to the location of the actual variable:
603 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
604 if (varFieldOffset > 0) {
David Blaikie770530b2013-10-21 17:28:37 +0000605 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
606 addUInt(Block, dwarf::DW_FORM_udata, varFieldOffset);
Devang Patel161b2f42011-04-12 23:21:44 +0000607 }
608
609 // Now attach the location information to the DIE.
David Blaikie770530b2013-10-21 17:28:37 +0000610 addBlock(Die, Attribute, Block);
Devang Patel161b2f42011-04-12 23:21:44 +0000611}
612
Devang Patel4ec14b02011-07-20 21:57:04 +0000613/// isTypeSigned - Return true if the type is signed.
Manman Renc664d762013-10-05 01:43:03 +0000614static bool isTypeSigned(DwarfDebug *DD, DIType Ty, int *SizeInBits) {
Devang Patel4ec14b02011-07-20 21:57:04 +0000615 if (Ty.isDerivedType())
Manman Renc664d762013-10-05 01:43:03 +0000616 return isTypeSigned(DD, DD->resolve(DIDerivedType(Ty).getTypeDerivedFrom()),
617 SizeInBits);
Devang Patel4ec14b02011-07-20 21:57:04 +0000618 if (Ty.isBasicType())
Eric Christopher6efc0432013-10-19 01:04:47 +0000619 if (DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed ||
620 DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed_char) {
Devang Patel4ec14b02011-07-20 21:57:04 +0000621 *SizeInBits = Ty.getSizeInBits();
622 return true;
623 }
624 return false;
625}
626
Manman Renc664d762013-10-05 01:43:03 +0000627/// Return true if type encoding is unsigned.
628static bool isUnsignedDIType(DwarfDebug *DD, DIType Ty) {
629 DIDerivedType DTy(Ty);
630 if (DTy.isDerivedType())
631 return isUnsignedDIType(DD, DD->resolve(DTy.getTypeDerivedFrom()));
632
633 DIBasicType BTy(Ty);
634 if (BTy.isBasicType()) {
635 unsigned Encoding = BTy.getEncoding();
636 if (Encoding == dwarf::DW_ATE_unsigned ||
637 Encoding == dwarf::DW_ATE_unsigned_char ||
638 Encoding == dwarf::DW_ATE_boolean)
639 return true;
640 }
641 return false;
642}
643
644/// If this type is derived from a base type then return base type size.
Manman Ren43251002013-10-08 18:46:58 +0000645static uint64_t getBaseTypeSize(DwarfDebug *DD, DIDerivedType Ty) {
Manman Renc664d762013-10-05 01:43:03 +0000646 unsigned Tag = Ty.getTag();
647
648 if (Tag != dwarf::DW_TAG_member && Tag != dwarf::DW_TAG_typedef &&
649 Tag != dwarf::DW_TAG_const_type && Tag != dwarf::DW_TAG_volatile_type &&
650 Tag != dwarf::DW_TAG_restrict_type)
651 return Ty.getSizeInBits();
652
653 DIType BaseType = DD->resolve(Ty.getTypeDerivedFrom());
654
655 // If this type is not derived from any type then take conservative approach.
656 if (!BaseType.isValid())
657 return Ty.getSizeInBits();
658
659 // If this is a derived type, go ahead and get the base type, unless it's a
660 // reference then it's just the size of the field. Pointer types have no need
661 // of this since they're a different type of qualification on the type.
662 if (BaseType.getTag() == dwarf::DW_TAG_reference_type ||
663 BaseType.getTag() == dwarf::DW_TAG_rvalue_reference_type)
664 return Ty.getSizeInBits();
665
666 if (BaseType.isDerivedType())
Manman Ren43251002013-10-08 18:46:58 +0000667 return getBaseTypeSize(DD, DIDerivedType(BaseType));
Manman Renc664d762013-10-05 01:43:03 +0000668
669 return BaseType.getSizeInBits();
670}
671
Devang Patel161b2f42011-04-12 23:21:44 +0000672/// addConstantValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000673void CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO,
Devang Patelb58128e2011-05-27 16:45:18 +0000674 DIType Ty) {
David Blaikie4de9d722013-05-10 21:52:07 +0000675 // FIXME: This is a bit conservative/simple - it emits negative values at
676 // their maximum bit width which is a bit unfortunate (& doesn't prefer
677 // udata/sdata over dataN as suggested by the DWARF spec)
Nick Lewycky746cb672011-10-26 22:55:33 +0000678 assert(MO.isImm() && "Invalid machine operand!");
Devang Patel4ec14b02011-07-20 21:57:04 +0000679 int SizeInBits = -1;
Manman Renc664d762013-10-05 01:43:03 +0000680 bool SignedConstant = isTypeSigned(DD, Ty, &SizeInBits);
David Blaikie770530b2013-10-21 17:28:37 +0000681 dwarf::Form Form;
Devang Patel72f0d9c2011-05-27 18:15:52 +0000682
Eric Christopher7b2ee392013-08-27 23:49:04 +0000683 // If we're a signed constant definitely use sdata.
684 if (SignedConstant) {
685 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, MO.getImm());
686 return;
687 }
688
689 // Else use data for now unless it's larger than we can deal with.
690 switch (SizeInBits) {
691 case 8:
692 Form = dwarf::DW_FORM_data1;
693 break;
694 case 16:
695 Form = dwarf::DW_FORM_data2;
696 break;
697 case 32:
698 Form = dwarf::DW_FORM_data4;
699 break;
700 case 64:
701 Form = dwarf::DW_FORM_data8;
702 break;
703 default:
704 Form = dwarf::DW_FORM_udata;
705 addUInt(Die, dwarf::DW_AT_const_value, Form, MO.getImm());
706 return;
707 }
708 addUInt(Die, dwarf::DW_AT_const_value, Form, MO.getImm());
Devang Patel161b2f42011-04-12 23:21:44 +0000709}
710
711/// addConstantFPValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000712void CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
Eric Christopher6efc0432013-10-19 01:04:47 +0000713 assert(MO.isFPImm() && "Invalid machine operand!");
Devang Patel161b2f42011-04-12 23:21:44 +0000714 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
715 APFloat FPImm = MO.getFPImm()->getValueAPF();
716
717 // Get the raw data form of the floating point.
718 const APInt FltVal = FPImm.bitcastToAPInt();
Eric Christopher6efc0432013-10-19 01:04:47 +0000719 const char *FltPtr = (const char *)FltVal.getRawData();
Devang Patel161b2f42011-04-12 23:21:44 +0000720
721 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
Micah Villmow3574eca2012-10-08 16:38:25 +0000722 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel161b2f42011-04-12 23:21:44 +0000723 int Incr = (LittleEndian ? 1 : -1);
724 int Start = (LittleEndian ? 0 : NumBytes - 1);
725 int Stop = (LittleEndian ? NumBytes : -1);
726
727 // Output the constant to DWARF one byte at a time.
728 for (; Start != Stop; Start += Incr)
David Blaikie770530b2013-10-21 17:28:37 +0000729 addUInt(Block, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +0000730 (unsigned char)0xFF & FltPtr[Start]);
731
David Blaikie770530b2013-10-21 17:28:37 +0000732 addBlock(Die, dwarf::DW_AT_const_value, Block);
Devang Patel161b2f42011-04-12 23:21:44 +0000733}
734
David Blaikie14268412013-01-20 01:18:01 +0000735/// addConstantFPValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000736void CompileUnit::addConstantFPValue(DIE *Die, const ConstantFP *CFP) {
Eric Christopher7b2ee392013-08-27 23:49:04 +0000737 // Pass this down to addConstantValue as an unsigned bag of bits.
738 addConstantValue(Die, CFP->getValueAPF().bitcastToAPInt(), true);
David Blaikie14268412013-01-20 01:18:01 +0000739}
740
Devang Patel161b2f42011-04-12 23:21:44 +0000741/// addConstantValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000742void CompileUnit::addConstantValue(DIE *Die, const ConstantInt *CI,
Devang Patel161b2f42011-04-12 23:21:44 +0000743 bool Unsigned) {
Eric Christophere4721492013-07-03 01:08:30 +0000744 addConstantValue(Die, CI->getValue(), Unsigned);
David Blaikie14268412013-01-20 01:18:01 +0000745}
746
747// addConstantValue - Add constant value entry in variable DIE.
Eric Christophere4721492013-07-03 01:08:30 +0000748void CompileUnit::addConstantValue(DIE *Die, const APInt &Val, bool Unsigned) {
David Blaikie14268412013-01-20 01:18:01 +0000749 unsigned CIBitWidth = Val.getBitWidth();
Devang Pateld6a81362011-05-28 00:39:18 +0000750 if (CIBitWidth <= 64) {
Eric Christopher7b2ee392013-08-27 23:49:04 +0000751 // If we're a signed constant definitely use sdata.
752 if (!Unsigned) {
753 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata,
754 Val.getSExtValue());
755 return;
Devang Pateld6a81362011-05-28 00:39:18 +0000756 }
Eric Christopher7b2ee392013-08-27 23:49:04 +0000757
758 // Else use data for now unless it's larger than we can deal with.
David Blaikie770530b2013-10-21 17:28:37 +0000759 dwarf::Form Form;
Eric Christopher7b2ee392013-08-27 23:49:04 +0000760 switch (CIBitWidth) {
761 case 8:
762 Form = dwarf::DW_FORM_data1;
763 break;
764 case 16:
765 Form = dwarf::DW_FORM_data2;
766 break;
767 case 32:
768 Form = dwarf::DW_FORM_data4;
769 break;
770 case 64:
771 Form = dwarf::DW_FORM_data8;
772 break;
773 default:
774 addUInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
775 Val.getZExtValue());
776 return;
777 }
778 addUInt(Die, dwarf::DW_AT_const_value, Form, Val.getZExtValue());
Eric Christophere4721492013-07-03 01:08:30 +0000779 return;
Devang Patel161b2f42011-04-12 23:21:44 +0000780 }
781
782 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
783
784 // Get the raw data form of the large APInt.
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000785 const uint64_t *Ptr64 = Val.getRawData();
Devang Patel161b2f42011-04-12 23:21:44 +0000786
787 int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
Micah Villmow3574eca2012-10-08 16:38:25 +0000788 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel161b2f42011-04-12 23:21:44 +0000789
790 // Output the constant to DWARF one byte at a time.
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000791 for (int i = 0; i < NumBytes; i++) {
792 uint8_t c;
793 if (LittleEndian)
794 c = Ptr64[i / 8] >> (8 * (i & 7));
795 else
796 c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7));
David Blaikie770530b2013-10-21 17:28:37 +0000797 addUInt(Block, dwarf::DW_FORM_data1, c);
NAKAMURA Takumic3e48c32011-10-28 14:12:22 +0000798 }
Devang Patel161b2f42011-04-12 23:21:44 +0000799
David Blaikie770530b2013-10-21 17:28:37 +0000800 addBlock(Die, dwarf::DW_AT_const_value, Block);
Devang Patel161b2f42011-04-12 23:21:44 +0000801}
802
Eric Christopher6c3bb942013-04-22 07:47:40 +0000803/// addTemplateParams - Add template parameters into buffer.
Devang Patel161b2f42011-04-12 23:21:44 +0000804void CompileUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
805 // Add template parameters.
806 for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) {
807 DIDescriptor Element = TParams.getElement(i);
808 if (Element.isTemplateTypeParameter())
Manman Renbe87b692013-10-23 23:05:28 +0000809 constructTemplateTypeParameterDIE(Buffer,
810 DITemplateTypeParameter(Element));
Devang Patel161b2f42011-04-12 23:21:44 +0000811 else if (Element.isTemplateValueParameter())
Manman Renbe87b692013-10-23 23:05:28 +0000812 constructTemplateValueParameterDIE(Buffer,
813 DITemplateValueParameter(Element));
Devang Patel161b2f42011-04-12 23:21:44 +0000814 }
Devang Patel161b2f42011-04-12 23:21:44 +0000815}
Nick Lewycky746cb672011-10-26 22:55:33 +0000816
Eric Christopher6b6061f2013-01-16 01:22:23 +0000817/// getOrCreateContextDIE - Get context owner's DIE.
Eric Christopherccb66362013-10-04 23:49:26 +0000818DIE *CompileUnit::getOrCreateContextDIE(DIScope Context) {
Eric Christopher6b6061f2013-01-16 01:22:23 +0000819 if (Context.isType())
820 return getOrCreateTypeDIE(DIType(Context));
821 else if (Context.isNameSpace())
822 return getOrCreateNameSpace(DINameSpace(Context));
823 else if (Context.isSubprogram())
824 return getOrCreateSubprogramDIE(DISubprogram(Context));
Eric Christopher6c3bb942013-04-22 07:47:40 +0000825 else
Eric Christopher6b6061f2013-01-16 01:22:23 +0000826 return getDIE(Context);
827}
828
Devang Patel161b2f42011-04-12 23:21:44 +0000829/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
830/// given DIType.
Devang Patel94c7ddb2011-08-16 22:09:43 +0000831DIE *CompileUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
832 DIType Ty(TyNode);
Manman Rend03d2b22013-07-08 18:33:29 +0000833 if (!Ty.isType())
Devang Patel94c7ddb2011-08-16 22:09:43 +0000834 return NULL;
Manman Rend498e5e2013-10-29 22:49:29 +0000835
836 // Construct the context before querying for the existence of the DIE in case
837 // such construction creates the DIE.
838 DIE *ContextDIE = getOrCreateContextDIE(resolve(Ty.getContext()));
839 if (!ContextDIE)
840 ContextDIE = CUDie.get();
841
Eric Christopher3f045002013-10-04 17:08:38 +0000842 DIE *TyDIE = getDIE(Ty);
Devang Patel161b2f42011-04-12 23:21:44 +0000843 if (TyDIE)
844 return TyDIE;
845
846 // Create new type.
Manman Rend498e5e2013-10-29 22:49:29 +0000847 TyDIE = createAndAddDIE(Ty.getTag(), *ContextDIE, Ty);
848
Devang Patel161b2f42011-04-12 23:21:44 +0000849 if (Ty.isBasicType())
850 constructTypeDIE(*TyDIE, DIBasicType(Ty));
851 else if (Ty.isCompositeType())
852 constructTypeDIE(*TyDIE, DICompositeType(Ty));
853 else {
854 assert(Ty.isDerivedType() && "Unknown kind of DIType");
855 constructTypeDIE(*TyDIE, DIDerivedType(Ty));
856 }
Eric Christopher1b3f9192011-11-10 19:52:58 +0000857 // If this is a named finished type then include it in the list of types
858 // for the accelerator tables.
Eric Christopherc36145f2012-01-06 04:35:23 +0000859 if (!Ty.getName().empty() && !Ty.isForwardDecl()) {
860 bool IsImplementation = 0;
861 if (Ty.isCompositeType()) {
862 DICompositeType CT(Ty);
Eric Christophere0167892012-01-06 23:03:37 +0000863 // A runtime language of 0 actually means C/C++ and that any
864 // non-negative value is some version of Objective-C/C++.
Eric Christopher6efc0432013-10-19 01:04:47 +0000865 IsImplementation = (CT.getRunTimeLang() == 0) || CT.isObjcClassComplete();
Eric Christopherc36145f2012-01-06 04:35:23 +0000866 }
Eric Christopher577056f2013-09-05 18:20:16 +0000867 unsigned Flags = IsImplementation ? dwarf::DW_FLAG_type_implementation : 0;
Eric Christophere0167892012-01-06 23:03:37 +0000868 addAccelType(Ty.getName(), std::make_pair(TyDIE, Flags));
Eric Christopherc36145f2012-01-06 04:35:23 +0000869 }
Eric Christopher8b4310b2012-11-21 00:34:38 +0000870
Devang Patel161b2f42011-04-12 23:21:44 +0000871 return TyDIE;
872}
873
874/// addType - Add a new type attribute to the specified entity.
David Blaikie770530b2013-10-21 17:28:37 +0000875void CompileUnit::addType(DIE *Entity, DIType Ty, dwarf::Attribute Attribute) {
Eric Christopherdc1363f2013-08-08 07:40:37 +0000876 assert(Ty && "Trying to add a type that doesn't exist?");
Devang Patel161b2f42011-04-12 23:21:44 +0000877
878 // Check for pre-existence.
879 DIEEntry *Entry = getDIEEntry(Ty);
880 // If it exists then use the existing value.
881 if (Entry) {
Eric Christopher3f045002013-10-04 17:08:38 +0000882 Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
Devang Patel161b2f42011-04-12 23:21:44 +0000883 return;
884 }
885
886 // Construct type.
887 DIE *Buffer = getOrCreateTypeDIE(Ty);
888
889 // Set up proxy.
890 Entry = createDIEEntry(Buffer);
891 insertDIEEntry(Ty, Entry);
Eric Christopher3f045002013-10-04 17:08:38 +0000892 Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry);
Devang Patele9ae06c2011-05-31 22:56:51 +0000893
894 // If this is a complete composite type then include it in the
895 // list of global types.
Devang Patelc20bdf12011-06-01 00:23:24 +0000896 addGlobalType(Ty);
Devang Patel66658e42011-05-31 23:30:30 +0000897}
898
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000899// Accelerator table mutators - add each name along with its companion
900// DIE to the proper table while ensuring that the name that we're going
901// to reference is in the string table. We do this since the names we
902// add may not only be identical to the names in the DIE.
903void CompileUnit::addAccelName(StringRef Name, DIE *Die) {
904 DU->getStringPoolEntry(Name);
Eric Christopher734334e2013-09-23 22:59:11 +0000905 std::vector<DIE *> &DIEs = AccelNames[Name];
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000906 DIEs.push_back(Die);
907}
908
909void CompileUnit::addAccelObjC(StringRef Name, DIE *Die) {
910 DU->getStringPoolEntry(Name);
Eric Christopher734334e2013-09-23 22:59:11 +0000911 std::vector<DIE *> &DIEs = AccelObjC[Name];
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000912 DIEs.push_back(Die);
913}
914
915void CompileUnit::addAccelNamespace(StringRef Name, DIE *Die) {
916 DU->getStringPoolEntry(Name);
Eric Christopher734334e2013-09-23 22:59:11 +0000917 std::vector<DIE *> &DIEs = AccelNamespace[Name];
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000918 DIEs.push_back(Die);
919}
920
921void CompileUnit::addAccelType(StringRef Name, std::pair<DIE *, unsigned> Die) {
922 DU->getStringPoolEntry(Name);
923 std::vector<std::pair<DIE *, unsigned> > &DIEs = AccelTypes[Name];
924 DIEs.push_back(Die);
925}
926
Eric Christopher50d37a42013-09-20 22:20:55 +0000927/// addGlobalName - Add a new global name to the compile unit.
Eric Christopher91986572013-10-17 02:06:06 +0000928void CompileUnit::addGlobalName(StringRef Name, DIE *Die, DIScope Context) {
Eric Christopher0ab64392013-10-19 01:04:42 +0000929 std::string FullName = getParentContextString(Context) + Name.str();
Eric Christopher91986572013-10-17 02:06:06 +0000930 GlobalNames[FullName] = Die;
Eric Christopher50d37a42013-09-20 22:20:55 +0000931}
932
Devang Patel66658e42011-05-31 23:30:30 +0000933/// addGlobalType - Add a new global type to the compile unit.
934///
Devang Patelc20bdf12011-06-01 00:23:24 +0000935void CompileUnit::addGlobalType(DIType Ty) {
Eric Christophereee74fb2013-10-05 00:27:02 +0000936 DIScope Context = resolve(Ty.getContext());
Eric Christopher5a634742013-09-23 23:15:58 +0000937 if (!Ty.getName().empty() && !Ty.isForwardDecl() &&
Eric Christopher734334e2013-09-23 22:59:11 +0000938 (!Context || Context.isCompileUnit() || Context.isFile() ||
939 Context.isNameSpace()))
Eric Christopher91986572013-10-17 02:06:06 +0000940 if (DIEEntry *Entry = getDIEEntry(Ty)) {
Eric Christopher0ab64392013-10-19 01:04:42 +0000941 std::string FullName =
942 getParentContextString(Context) + Ty.getName().str();
Eric Christopher6efc0432013-10-19 01:04:47 +0000943 GlobalTypes[FullName] = Entry->getEntry();
Eric Christopher91986572013-10-17 02:06:06 +0000944 }
945}
946
947/// getParentContextString - Walks the metadata parent chain in a language
948/// specific manner (using the compile unit language) and returns
949/// it as a string. This is done at the metadata level because DIEs may
950/// not currently have been added to the parent context and walking the
951/// DIEs looking for names is more expensive than walking the metadata.
952std::string CompileUnit::getParentContextString(DIScope Context) const {
953 if (!Context)
954 return "";
955
956 // FIXME: Decide whether to implement this for non-C++ languages.
957 if (getLanguage() != dwarf::DW_LANG_C_plus_plus)
958 return "";
959
Eric Christopher0ab64392013-10-19 01:04:42 +0000960 std::string CS;
Eric Christopher91986572013-10-17 02:06:06 +0000961 SmallVector<DIScope, 1> Parents;
962 while (!Context.isCompileUnit()) {
963 Parents.push_back(Context);
964 if (Context.getContext())
965 Context = resolve(Context.getContext());
966 else
967 // Structure, etc types will have a NULL context if they're at the top
968 // level.
969 break;
970 }
971
972 // Reverse iterate over our list to go from the outermost construct to the
973 // innermost.
974 for (SmallVectorImpl<DIScope>::reverse_iterator I = Parents.rbegin(),
975 E = Parents.rend();
976 I != E; ++I) {
977 DIScope Ctx = *I;
978 StringRef Name = Ctx.getName();
Eric Christopher0ab64392013-10-19 01:04:42 +0000979 if (!Name.empty()) {
Eric Christopher91986572013-10-17 02:06:06 +0000980 CS += Name;
981 CS += "::";
982 }
983 }
984 return CS;
Devang Patel161b2f42011-04-12 23:21:44 +0000985}
986
Eric Christopher22852c72013-10-05 00:05:51 +0000987/// addPubTypes - Add subprogram argument types for pubtypes section.
Devang Patel31c5d052011-05-06 16:57:54 +0000988void CompileUnit::addPubTypes(DISubprogram SP) {
989 DICompositeType SPTy = SP.getType();
Eric Christopher31667622013-08-08 01:41:00 +0000990 uint16_t SPTag = SPTy.getTag();
Devang Patel31c5d052011-05-06 16:57:54 +0000991 if (SPTag != dwarf::DW_TAG_subroutine_type)
992 return;
993
994 DIArray Args = SPTy.getTypeArray();
995 for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
996 DIType ATy(Args.getElement(i));
Manman Rend03d2b22013-07-08 18:33:29 +0000997 if (!ATy.isType())
Devang Patel31c5d052011-05-06 16:57:54 +0000998 continue;
Devang Patelc20bdf12011-06-01 00:23:24 +0000999 addGlobalType(ATy);
Devang Patel31c5d052011-05-06 16:57:54 +00001000 }
1001}
1002
Devang Patel161b2f42011-04-12 23:21:44 +00001003/// constructTypeDIE - Construct basic type die from DIBasicType.
1004void CompileUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
1005 // Get core information.
1006 StringRef Name = BTy.getName();
Devang Patel161b2f42011-04-12 23:21:44 +00001007 // Add name if not anonymous or intermediate type.
1008 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001009 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel734a67c2011-09-14 23:13:28 +00001010
David Blaikie916d49e2013-10-04 23:21:16 +00001011 // An unspecified type only has a name attribute.
1012 if (BTy.getTag() == dwarf::DW_TAG_unspecified_type)
Devang Patel734a67c2011-09-14 23:13:28 +00001013 return;
Devang Patel734a67c2011-09-14 23:13:28 +00001014
Nick Lewycky746cb672011-10-26 22:55:33 +00001015 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
Devang Patel30d409c2012-02-07 23:33:58 +00001016 BTy.getEncoding());
Devang Patel734a67c2011-09-14 23:13:28 +00001017
Devang Patel161b2f42011-04-12 23:21:44 +00001018 uint64_t Size = BTy.getSizeInBits() >> 3;
David Blaikie770530b2013-10-21 17:28:37 +00001019 addUInt(&Buffer, dwarf::DW_AT_byte_size, None, Size);
Devang Patel161b2f42011-04-12 23:21:44 +00001020}
1021
1022/// constructTypeDIE - Construct derived type die from DIDerivedType.
1023void CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
1024 // Get core information.
1025 StringRef Name = DTy.getName();
1026 uint64_t Size = DTy.getSizeInBits() >> 3;
David Blaikie916d49e2013-10-04 23:21:16 +00001027 uint16_t Tag = Buffer.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +00001028
1029 // Map to main type, void will not have a type.
Manman Ren017ceda2013-10-08 18:42:58 +00001030 DIType FromTy = resolve(DTy.getTypeDerivedFrom());
Eric Christopherdc1363f2013-08-08 07:40:37 +00001031 if (FromTy)
1032 addType(&Buffer, FromTy);
Devang Patel161b2f42011-04-12 23:21:44 +00001033
1034 // Add name if not anonymous or intermediate type.
1035 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001036 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001037
1038 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopher35f225a2012-02-21 22:25:53 +00001039 if (Size && Tag != dwarf::DW_TAG_pointer_type)
David Blaikie770530b2013-10-21 17:28:37 +00001040 addUInt(&Buffer, dwarf::DW_AT_byte_size, None, Size);
Devang Patel161b2f42011-04-12 23:21:44 +00001041
David Blaikie62fdfb52013-01-07 05:51:15 +00001042 if (Tag == dwarf::DW_TAG_ptr_to_member_type)
Eric Christopher6efc0432013-10-19 01:04:47 +00001043 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type,
1044 getOrCreateTypeDIE(resolve(DTy.getClassType())));
Devang Patel161b2f42011-04-12 23:21:44 +00001045 // Add source line info if available and TyDesc is not a forward declaration.
1046 if (!DTy.isForwardDecl())
1047 addSourceLine(&Buffer, DTy);
1048}
1049
Eric Christopher3dee5752013-07-26 17:02:41 +00001050/// Return true if the type is appropriately scoped to be contained inside
1051/// its own type unit.
Manman Ren18eb2452013-09-09 19:23:58 +00001052static bool isTypeUnitScoped(DIType Ty, const DwarfDebug *DD) {
Manman Ren2c9905a2013-09-09 19:47:11 +00001053 DIScope Parent = DD->resolve(Ty.getContext());
Eric Christopher3dee5752013-07-26 17:02:41 +00001054 while (Parent) {
1055 // Don't generate a hash for anything scoped inside a function.
1056 if (Parent.isSubprogram())
1057 return false;
Manman Rene72aba92013-09-09 22:35:23 +00001058 Parent = DD->resolve(Parent.getContext());
Eric Christopher3dee5752013-07-26 17:02:41 +00001059 }
1060 return true;
1061}
1062
1063/// Return true if the type should be split out into a type unit.
Manman Ren18eb2452013-09-09 19:23:58 +00001064static bool shouldCreateTypeUnit(DICompositeType CTy, const DwarfDebug *DD) {
Eric Christopher31667622013-08-08 01:41:00 +00001065 uint16_t Tag = CTy.getTag();
Eric Christopher3dee5752013-07-26 17:02:41 +00001066
1067 switch (Tag) {
1068 case dwarf::DW_TAG_structure_type:
1069 case dwarf::DW_TAG_union_type:
1070 case dwarf::DW_TAG_enumeration_type:
1071 case dwarf::DW_TAG_class_type:
1072 // If this is a class, structure, union, or enumeration type
David Blaikiec4eb3532013-10-04 23:52:02 +00001073 // that is a definition (not a declaration), and not scoped
Eric Christopher3dee5752013-07-26 17:02:41 +00001074 // inside a function then separate this out as a type unit.
David Blaikiec4eb3532013-10-04 23:52:02 +00001075 return !CTy.isForwardDecl() && isTypeUnitScoped(CTy, DD);
Eric Christopher3dee5752013-07-26 17:02:41 +00001076 default:
David Blaikiec4eb3532013-10-04 23:52:02 +00001077 return false;
Eric Christopher3dee5752013-07-26 17:02:41 +00001078 }
1079}
1080
Devang Patel161b2f42011-04-12 23:21:44 +00001081/// constructTypeDIE - Construct type DIE from DICompositeType.
1082void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
1083 // Get core information.
1084 StringRef Name = CTy.getName();
1085
1086 uint64_t Size = CTy.getSizeInBits() >> 3;
David Blaikie916d49e2013-10-04 23:21:16 +00001087 uint16_t Tag = Buffer.getTag();
Devang Patel161b2f42011-04-12 23:21:44 +00001088
1089 switch (Tag) {
Devang Patel161b2f42011-04-12 23:21:44 +00001090 case dwarf::DW_TAG_array_type:
1091 constructArrayTypeDIE(Buffer, &CTy);
1092 break;
1093 case dwarf::DW_TAG_enumeration_type: {
1094 DIArray Elements = CTy.getTypeArray();
1095
1096 // Add enumerators to enumeration type.
1097 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
Devang Patel161b2f42011-04-12 23:21:44 +00001098 DIDescriptor Enum(Elements.getElement(i));
Manman Ren630c3262013-10-18 21:14:19 +00001099 if (Enum.isEnumerator())
Manman Ren950f4e82013-10-23 22:52:22 +00001100 constructEnumTypeDIE(Buffer, DIEnumerator(Enum));
Devang Patel161b2f42011-04-12 23:21:44 +00001101 }
Manman Ren017ceda2013-10-08 18:42:58 +00001102 DIType DTy = resolve(CTy.getTypeDerivedFrom());
Eric Christopher37c107b2013-08-08 07:40:42 +00001103 if (DTy) {
Eric Christopherbb0f6ea2012-05-23 00:09:20 +00001104 addType(&Buffer, DTy);
Eric Christopher371d9582013-10-04 22:40:10 +00001105 addFlag(&Buffer, dwarf::DW_AT_enum_class);
Eric Christopherbb0f6ea2012-05-23 00:09:20 +00001106 }
Eric Christopher6efc0432013-10-19 01:04:47 +00001107 } break;
Devang Patel161b2f42011-04-12 23:21:44 +00001108 case dwarf::DW_TAG_subroutine_type: {
Eric Christopherdc1363f2013-08-08 07:40:37 +00001109 // Add return type. A void return won't have a type.
Devang Patel161b2f42011-04-12 23:21:44 +00001110 DIArray Elements = CTy.getTypeArray();
1111 DIDescriptor RTy = Elements.getElement(0);
Eric Christopherdc1363f2013-08-08 07:40:37 +00001112 if (RTy)
1113 addType(&Buffer, DIType(RTy));
Devang Patel161b2f42011-04-12 23:21:44 +00001114
1115 bool isPrototyped = true;
1116 // Add arguments.
1117 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
1118 DIDescriptor Ty = Elements.getElement(i);
1119 if (Ty.isUnspecifiedParameter()) {
Manman Ren1a5e7872013-10-29 00:53:03 +00001120 createAndAddDIE(dwarf::DW_TAG_unspecified_parameters, Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +00001121 isPrototyped = false;
1122 } else {
Manman Ren1a5e7872013-10-29 00:53:03 +00001123 DIE *Arg = createAndAddDIE(dwarf::DW_TAG_formal_parameter, Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +00001124 addType(Arg, DIType(Ty));
David Blaikieaaf2e632013-01-29 19:35:24 +00001125 if (DIType(Ty).isArtificial())
1126 addFlag(Arg, dwarf::DW_AT_artificial);
Devang Patel161b2f42011-04-12 23:21:44 +00001127 }
1128 }
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001129 // Add prototype flag if we're dealing with a C language and the
1130 // function has been prototyped.
Eric Christopher7b878952013-08-26 23:50:38 +00001131 uint16_t Language = DICompileUnit(Node).getLanguage();
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001132 if (isPrototyped &&
Eric Christopher6efc0432013-10-19 01:04:47 +00001133 (Language == dwarf::DW_LANG_C89 || Language == dwarf::DW_LANG_C99 ||
Eric Christopher4d069bf2012-05-22 18:45:24 +00001134 Language == dwarf::DW_LANG_ObjC))
Eric Christopher873cf0a2012-08-24 01:14:27 +00001135 addFlag(&Buffer, dwarf::DW_AT_prototyped);
Eric Christopher6efc0432013-10-19 01:04:47 +00001136 } break;
Devang Patel161b2f42011-04-12 23:21:44 +00001137 case dwarf::DW_TAG_structure_type:
1138 case dwarf::DW_TAG_union_type:
1139 case dwarf::DW_TAG_class_type: {
Devang Patel161b2f42011-04-12 23:21:44 +00001140 // Add elements to structure type.
David Blaikiec8b93552013-08-01 20:30:22 +00001141 DIArray Elements = CTy.getTypeArray();
1142 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
Devang Patel161b2f42011-04-12 23:21:44 +00001143 DIDescriptor Element = Elements.getElement(i);
1144 DIE *ElemDie = NULL;
1145 if (Element.isSubprogram()) {
1146 DISubprogram SP(Element);
Devang Pateldbc64af2011-08-15 17:24:54 +00001147 ElemDie = getOrCreateSubprogramDIE(DISubprogram(Element));
Devang Patel161b2f42011-04-12 23:21:44 +00001148 if (SP.isProtected())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001149 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001150 dwarf::DW_ACCESS_protected);
1151 else if (SP.isPrivate())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001152 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001153 dwarf::DW_ACCESS_private);
Eric Christopher8b4310b2012-11-21 00:34:38 +00001154 else
Nick Lewycky13aaca52011-12-13 05:09:11 +00001155 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Eric Christopher6efc0432013-10-19 01:04:47 +00001156 dwarf::DW_ACCESS_public);
Devang Patel161b2f42011-04-12 23:21:44 +00001157 if (SP.isExplicit())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001158 addFlag(ElemDie, dwarf::DW_AT_explicit);
Eric Christopher663e0cf2012-03-28 07:34:31 +00001159 } else if (Element.isDerivedType()) {
Eric Christopher4d069bf2012-05-22 18:45:24 +00001160 DIDerivedType DDTy(Element);
1161 if (DDTy.getTag() == dwarf::DW_TAG_friend) {
Manman Ren1a5e7872013-10-29 00:53:03 +00001162 ElemDie = createAndAddDIE(dwarf::DW_TAG_friend, Buffer);
Manman Ren017ceda2013-10-08 18:42:58 +00001163 addType(ElemDie, resolve(DDTy.getTypeDerivedFrom()),
Manman Renc664d762013-10-05 01:43:03 +00001164 dwarf::DW_AT_friend);
Manman Ren655a10d2013-10-14 20:33:57 +00001165 } else if (DDTy.isStaticMember()) {
Manman Ren99addee2013-10-23 22:57:12 +00001166 getOrCreateStaticMemberDIE(DDTy);
Manman Ren655a10d2013-10-14 20:33:57 +00001167 } else {
Manman Rena1d25b62013-10-23 23:00:44 +00001168 constructMemberDIE(Buffer, DDTy);
Manman Ren655a10d2013-10-14 20:33:57 +00001169 }
Eric Christopher663e0cf2012-03-28 07:34:31 +00001170 } else if (Element.isObjCProperty()) {
Devang Patel30d409c2012-02-07 23:33:58 +00001171 DIObjCProperty Property(Element);
Manman Ren1a5e7872013-10-29 00:53:03 +00001172 ElemDie = createAndAddDIE(Property.getTag(), Buffer);
Devang Patel30d409c2012-02-07 23:33:58 +00001173 StringRef PropertyName = Property.getObjCPropertyName();
1174 addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
Eric Christopher4d069bf2012-05-22 18:45:24 +00001175 addType(ElemDie, Property.getType());
1176 addSourceLine(ElemDie, Property);
Devang Patel30d409c2012-02-07 23:33:58 +00001177 StringRef GetterName = Property.getObjCPropertyGetterName();
1178 if (!GetterName.empty())
1179 addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
1180 StringRef SetterName = Property.getObjCPropertySetterName();
1181 if (!SetterName.empty())
1182 addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
1183 unsigned PropertyAttributes = 0;
Devang Patel9e11eb12012-02-04 01:30:32 +00001184 if (Property.isReadOnlyObjCProperty())
1185 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
1186 if (Property.isReadWriteObjCProperty())
1187 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
1188 if (Property.isAssignObjCProperty())
1189 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
1190 if (Property.isRetainObjCProperty())
1191 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
1192 if (Property.isCopyObjCProperty())
1193 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
1194 if (Property.isNonAtomicObjCProperty())
1195 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
1196 if (PropertyAttributes)
David Blaikie770530b2013-10-21 17:28:37 +00001197 addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, None,
Eric Christopher6efc0432013-10-19 01:04:47 +00001198 PropertyAttributes);
Devang Patel6588abf2012-02-06 17:49:43 +00001199
Devang Patel30d409c2012-02-07 23:33:58 +00001200 DIEEntry *Entry = getDIEEntry(Element);
1201 if (!Entry) {
1202 Entry = createDIEEntry(ElemDie);
1203 insertDIEEntry(Element, Entry);
1204 }
Devang Patel9e11eb12012-02-04 01:30:32 +00001205 } else
Devang Patel161b2f42011-04-12 23:21:44 +00001206 continue;
Devang Patel161b2f42011-04-12 23:21:44 +00001207 }
1208
1209 if (CTy.isAppleBlockExtension())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001210 addFlag(&Buffer, dwarf::DW_AT_APPLE_block);
Devang Patel161b2f42011-04-12 23:21:44 +00001211
Eric Christophereee74fb2013-10-05 00:27:02 +00001212 DICompositeType ContainingType(resolve(CTy.getContainingType()));
Devang Patel161b2f42011-04-12 23:21:44 +00001213 if (DIDescriptor(ContainingType).isCompositeType())
Manman Ren87b110a2013-10-11 23:58:05 +00001214 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type,
Devang Patel161b2f42011-04-12 23:21:44 +00001215 getOrCreateTypeDIE(DIType(ContainingType)));
Devang Patel161b2f42011-04-12 23:21:44 +00001216
Devang Patel201e6cd2011-05-12 21:29:42 +00001217 if (CTy.isObjcClassComplete())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001218 addFlag(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type);
Devang Patelb11f80e2011-05-12 19:06:16 +00001219
Eric Christopher1a8e8862011-12-16 23:42:42 +00001220 // Add template parameters to a class, structure or union types.
1221 // FIXME: The support isn't in the metadata for this yet.
1222 if (Tag == dwarf::DW_TAG_class_type ||
Eric Christopher6efc0432013-10-19 01:04:47 +00001223 Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type)
Devang Patel161b2f42011-04-12 23:21:44 +00001224 addTemplateParams(Buffer, CTy.getTemplateParams());
1225
1226 break;
1227 }
1228 default:
1229 break;
1230 }
1231
1232 // Add name if not anonymous or intermediate type.
1233 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001234 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001235
Eric Christopher4a5d8392012-05-22 18:45:18 +00001236 if (Tag == dwarf::DW_TAG_enumeration_type ||
Eric Christopher6efc0432013-10-19 01:04:47 +00001237 Tag == dwarf::DW_TAG_class_type || Tag == dwarf::DW_TAG_structure_type ||
Eric Christopher4a5d8392012-05-22 18:45:18 +00001238 Tag == dwarf::DW_TAG_union_type) {
Devang Patel161b2f42011-04-12 23:21:44 +00001239 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopherfc4199b2012-06-01 00:22:32 +00001240 // TODO: Do we care about size for enum forward declarations?
Devang Patel161b2f42011-04-12 23:21:44 +00001241 if (Size)
David Blaikie770530b2013-10-21 17:28:37 +00001242 addUInt(&Buffer, dwarf::DW_AT_byte_size, None, Size);
Eric Christopherfc4199b2012-06-01 00:22:32 +00001243 else if (!CTy.isForwardDecl())
Devang Patel161b2f42011-04-12 23:21:44 +00001244 // Add zero size if it is not a forward declaration.
David Blaikie770530b2013-10-21 17:28:37 +00001245 addUInt(&Buffer, dwarf::DW_AT_byte_size, None, 0);
Eric Christopherfc4199b2012-06-01 00:22:32 +00001246
1247 // If we're a forward decl, say so.
1248 if (CTy.isForwardDecl())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001249 addFlag(&Buffer, dwarf::DW_AT_declaration);
Devang Patel161b2f42011-04-12 23:21:44 +00001250
1251 // Add source line info if available.
1252 if (!CTy.isForwardDecl())
1253 addSourceLine(&Buffer, CTy);
Eric Christopher89388952012-03-07 00:15:19 +00001254
1255 // No harm in adding the runtime language to the declaration.
1256 unsigned RLang = CTy.getRunTimeLang();
1257 if (RLang)
Eric Christopher6efc0432013-10-19 01:04:47 +00001258 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class, dwarf::DW_FORM_data1,
1259 RLang);
Devang Patel161b2f42011-04-12 23:21:44 +00001260 }
Eric Christopher3dee5752013-07-26 17:02:41 +00001261 // If this is a type applicable to a type unit it then add it to the
1262 // list of types we'll compute a hash for later.
Manman Ren18eb2452013-09-09 19:23:58 +00001263 if (shouldCreateTypeUnit(CTy, DD))
Eric Christopher3dee5752013-07-26 17:02:41 +00001264 DD->addTypeUnitType(&Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +00001265}
1266
Manman Renbe87b692013-10-23 23:05:28 +00001267/// constructTemplateTypeParameterDIE - Construct new DIE for the given
1268/// DITemplateTypeParameter.
Manman Ren99addee2013-10-23 22:57:12 +00001269void
Manman Renbe87b692013-10-23 23:05:28 +00001270CompileUnit::constructTemplateTypeParameterDIE(DIE &Buffer,
1271 DITemplateTypeParameter TP) {
Manman Ren1a5e7872013-10-29 00:53:03 +00001272 DIE *ParamDIE =
1273 createAndAddDIE(dwarf::DW_TAG_template_type_parameter, Buffer);
Eric Christopher76ef79f2013-08-08 08:09:43 +00001274 // Add the type if it exists, it could be void and therefore no type.
1275 if (TP.getType())
Manman Renb4d9c112013-10-09 19:46:28 +00001276 addType(ParamDIE, resolve(TP.getType()));
David Blaikiee88939c2013-06-22 18:59:11 +00001277 if (!TP.getName().empty())
1278 addString(ParamDIE, dwarf::DW_AT_name, TP.getName());
Devang Patel161b2f42011-04-12 23:21:44 +00001279}
1280
Manman Renbe87b692013-10-23 23:05:28 +00001281/// constructTemplateValueParameterDIE - Construct new DIE for the given
1282/// DITemplateValueParameter.
Manman Ren99addee2013-10-23 22:57:12 +00001283void
Manman Renbe87b692013-10-23 23:05:28 +00001284CompileUnit::constructTemplateValueParameterDIE(DIE &Buffer,
1285 DITemplateValueParameter VP) {
Manman Ren1a5e7872013-10-29 00:53:03 +00001286 DIE *ParamDIE = createAndAddDIE(VP.getTag(), Buffer);
Eric Christopherdc1363f2013-08-08 07:40:37 +00001287
1288 // Add the type if there is one, template template and template parameter
1289 // packs will not have a type.
Eric Christopheref2d9192013-10-21 17:48:51 +00001290 if (VP.getTag() == dwarf::DW_TAG_template_value_parameter)
Manman Renb4d9c112013-10-09 19:46:28 +00001291 addType(ParamDIE, resolve(VP.getType()));
Eric Christopherafdd1f82013-08-08 07:40:31 +00001292 if (!VP.getName().empty())
1293 addString(ParamDIE, dwarf::DW_AT_name, VP.getName());
1294 if (Value *Val = VP.getValue()) {
David Blaikie4de9d722013-05-10 21:52:07 +00001295 if (ConstantInt *CI = dyn_cast<ConstantInt>(Val))
Manman Renb4d9c112013-10-09 19:46:28 +00001296 addConstantValue(ParamDIE, CI,
1297 isUnsignedDIType(DD, resolve(VP.getType())));
David Blaikie4de9d722013-05-10 21:52:07 +00001298 else if (GlobalValue *GV = dyn_cast<GlobalValue>(Val)) {
1299 // For declaration non-type template parameters (such as global values and
1300 // functions)
1301 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Rafael Espindolaffc7dca2013-10-29 17:07:16 +00001302 addOpAddress(Block, Asm->getSymbol(GV));
David Blaikie4de9d722013-05-10 21:52:07 +00001303 // Emit DW_OP_stack_value to use the address as the immediate value of the
1304 // parameter, rather than a pointer to it.
David Blaikie770530b2013-10-21 17:28:37 +00001305 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value);
1306 addBlock(ParamDIE, dwarf::DW_AT_location, Block);
Eric Christopherafdd1f82013-08-08 07:40:31 +00001307 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_template_param) {
David Blaikiee88939c2013-06-22 18:59:11 +00001308 assert(isa<MDString>(Val));
1309 addString(ParamDIE, dwarf::DW_AT_GNU_template_name,
1310 cast<MDString>(Val)->getString());
Eric Christopherafdd1f82013-08-08 07:40:31 +00001311 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_parameter_pack) {
David Blaikiee88939c2013-06-22 18:59:11 +00001312 assert(isa<MDNode>(Val));
1313 DIArray A(cast<MDNode>(Val));
1314 addTemplateParams(*ParamDIE, A);
David Blaikie4de9d722013-05-10 21:52:07 +00001315 }
1316 }
Devang Patel161b2f42011-04-12 23:21:44 +00001317}
1318
Devang Patel31c5d052011-05-06 16:57:54 +00001319/// getOrCreateNameSpace - Create a DIE for DINameSpace.
1320DIE *CompileUnit::getOrCreateNameSpace(DINameSpace NS) {
Manman Ren6b713802013-10-29 05:49:41 +00001321 // Construct the context before querying for the existence of the DIE in case
1322 // such construction creates the DIE.
1323 DIE *ContextDIE = getOrCreateContextDIE(NS.getContext());
1324 if (!ContextDIE)
1325 // If the context is null, DIE should belong to the CU we call construct
1326 // function on.
1327 ContextDIE = CUDie.get();
1328
Devang Patel31c5d052011-05-06 16:57:54 +00001329 DIE *NDie = getDIE(NS);
1330 if (NDie)
1331 return NDie;
Manman Ren6b713802013-10-29 05:49:41 +00001332 NDie = createAndAddDIE(dwarf::DW_TAG_namespace, *ContextDIE, NS);
1333
Eric Christopher09ac3d82011-11-07 09:24:32 +00001334 if (!NS.getName().empty()) {
Nick Lewycky390c40d2011-10-27 06:44:11 +00001335 addString(NDie, dwarf::DW_AT_name, NS.getName());
Eric Christopher09ac3d82011-11-07 09:24:32 +00001336 addAccelNamespace(NS.getName(), NDie);
Eric Christopher91986572013-10-17 02:06:06 +00001337 addGlobalName(NS.getName(), NDie, NS.getContext());
Eric Christopher09ac3d82011-11-07 09:24:32 +00001338 } else
1339 addAccelNamespace("(anonymous namespace)", NDie);
Devang Patel31c5d052011-05-06 16:57:54 +00001340 addSourceLine(NDie, NS);
Devang Patel31c5d052011-05-06 16:57:54 +00001341 return NDie;
1342}
1343
Devang Pateldbc64af2011-08-15 17:24:54 +00001344/// getOrCreateSubprogramDIE - Create new DIE using SP.
1345DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
David Blaikiec32f2332013-10-04 01:39:59 +00001346 // Construct the context before querying for the existence of the DIE in case
1347 // such construction creates the DIE (as is the case for member function
1348 // declarations).
Manman Renb8e48a62013-10-10 18:40:01 +00001349 DIE *ContextDIE = getOrCreateContextDIE(resolve(SP.getContext()));
David Blaikiec32f2332013-10-04 01:39:59 +00001350 if (!ContextDIE)
1351 ContextDIE = CUDie.get();
1352
Eric Christopher3f045002013-10-04 17:08:38 +00001353 DIE *SPDie = getDIE(SP);
Devang Pateldbc64af2011-08-15 17:24:54 +00001354 if (SPDie)
1355 return SPDie;
1356
Manman Renbbdd02c2013-10-29 00:58:04 +00001357 DISubprogram SPDecl = SP.getFunctionDeclaration();
1358 if (SPDecl.isSubprogram())
1359 // Add subprogram definitions to the CU die directly.
1360 ContextDIE = CUDie.get();
Peter Collingbourne27302f02012-05-27 18:36:44 +00001361
1362 // DW_TAG_inlined_subroutine may refer to this DIE.
Manman Renbbdd02c2013-10-29 00:58:04 +00001363 SPDie = createAndAddDIE(dwarf::DW_TAG_subprogram, *ContextDIE, SP);
Peter Collingbourne27302f02012-05-27 18:36:44 +00001364
Rafael Espindola01b55b42011-11-10 22:34:29 +00001365 DIE *DeclDie = NULL;
Manman Ren250f4e82013-10-23 22:12:26 +00001366 if (SPDecl.isSubprogram())
Rafael Espindola01b55b42011-11-10 22:34:29 +00001367 DeclDie = getOrCreateSubprogramDIE(SPDecl);
Rafael Espindola01b55b42011-11-10 22:34:29 +00001368
Devang Pateldbc64af2011-08-15 17:24:54 +00001369 // Add function template parameters.
1370 addTemplateParams(*SPDie, SP.getTemplateParams());
1371
Devang Pateldbc64af2011-08-15 17:24:54 +00001372 // If this DIE is going to refer declaration info using AT_specification
Eric Christopherc4968752013-05-09 00:42:33 +00001373 // then there is no need to add other attributes.
Rafael Espindola01b55b42011-11-10 22:34:29 +00001374 if (DeclDie) {
1375 // Refer function declaration directly.
Manman Ren87b110a2013-10-11 23:58:05 +00001376 addDIEEntry(SPDie, dwarf::DW_AT_specification, DeclDie);
Rafael Espindola01b55b42011-11-10 22:34:29 +00001377
Devang Pateldbc64af2011-08-15 17:24:54 +00001378 return SPDie;
Rafael Espindola01b55b42011-11-10 22:34:29 +00001379 }
Devang Pateldbc64af2011-08-15 17:24:54 +00001380
Eric Christophercbbd5b12012-08-23 22:52:55 +00001381 // Add the linkage name if we have one.
Michael Gottesmandc42d032013-09-04 04:39:38 +00001382 StringRef LinkageName = SP.getLinkageName();
1383 if (!LinkageName.empty())
Eric Christophercbbd5b12012-08-23 22:52:55 +00001384 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c2b4be2013-06-01 17:51:14 +00001385 GlobalValue::getRealLinkageName(LinkageName));
Eric Christophercbbd5b12012-08-23 22:52:55 +00001386
Devang Pateldbc64af2011-08-15 17:24:54 +00001387 // Constructors and operators for anonymous aggregates do not have names.
1388 if (!SP.getName().empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001389 addString(SPDie, dwarf::DW_AT_name, SP.getName());
Devang Pateldbc64af2011-08-15 17:24:54 +00001390
1391 addSourceLine(SPDie, SP);
1392
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001393 // Add the prototype if we have a prototype and we have a C like
1394 // language.
Eric Christopher7b878952013-08-26 23:50:38 +00001395 uint16_t Language = DICompileUnit(Node).getLanguage();
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001396 if (SP.isPrototyped() &&
Eric Christopher6efc0432013-10-19 01:04:47 +00001397 (Language == dwarf::DW_LANG_C89 || Language == dwarf::DW_LANG_C99 ||
Eric Christopher8b6fe6b2012-02-22 08:46:21 +00001398 Language == dwarf::DW_LANG_ObjC))
Eric Christopher873cf0a2012-08-24 01:14:27 +00001399 addFlag(SPDie, dwarf::DW_AT_prototyped);
Devang Pateldbc64af2011-08-15 17:24:54 +00001400
Devang Pateldbc64af2011-08-15 17:24:54 +00001401 DICompositeType SPTy = SP.getType();
David Blaikie3d331842013-05-22 23:22:18 +00001402 assert(SPTy.getTag() == dwarf::DW_TAG_subroutine_type &&
1403 "the type of a subprogram should be a subroutine");
Devang Pateldbc64af2011-08-15 17:24:54 +00001404
David Blaikie3d331842013-05-22 23:22:18 +00001405 DIArray Args = SPTy.getTypeArray();
Eric Christopheref2d9192013-10-21 17:48:51 +00001406 // Add a return type. If this is a type like a C/C++ void type we don't add a
1407 // return type.
Eric Christopherdc1363f2013-08-08 07:40:37 +00001408 if (Args.getElement(0))
1409 addType(SPDie, DIType(Args.getElement(0)));
Devang Pateldbc64af2011-08-15 17:24:54 +00001410
1411 unsigned VK = SP.getVirtuality();
1412 if (VK) {
Nick Lewycky798313d2011-12-14 00:56:07 +00001413 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
Devang Pateldbc64af2011-08-15 17:24:54 +00001414 DIEBlock *Block = getDIEBlock();
David Blaikie770530b2013-10-21 17:28:37 +00001415 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1416 addUInt(Block, dwarf::DW_FORM_udata, SP.getVirtualIndex());
1417 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, Block);
Devang Pateldbc64af2011-08-15 17:24:54 +00001418 ContainingTypeMap.insert(std::make_pair(SPDie,
Eric Christophereee74fb2013-10-05 00:27:02 +00001419 resolve(SP.getContainingType())));
Devang Pateldbc64af2011-08-15 17:24:54 +00001420 }
1421
1422 if (!SP.isDefinition()) {
Eric Christopher873cf0a2012-08-24 01:14:27 +00001423 addFlag(SPDie, dwarf::DW_AT_declaration);
Eric Christopher8b4310b2012-11-21 00:34:38 +00001424
Devang Pateldbc64af2011-08-15 17:24:54 +00001425 // Add arguments. Do not add arguments for subprogram definition. They will
1426 // be handled while processing variables.
Eric Christopher6efc0432013-10-19 01:04:47 +00001427 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
Manman Ren1a5e7872013-10-29 00:53:03 +00001428 DIE *Arg = createAndAddDIE(dwarf::DW_TAG_formal_parameter, *SPDie);
David Blaikie3d331842013-05-22 23:22:18 +00001429 DIType ATy = DIType(Args.getElement(i));
1430 addType(Arg, ATy);
1431 if (ATy.isArtificial())
1432 addFlag(Arg, dwarf::DW_AT_artificial);
David Blaikie3d331842013-05-22 23:22:18 +00001433 }
Devang Pateldbc64af2011-08-15 17:24:54 +00001434 }
1435
1436 if (SP.isArtificial())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001437 addFlag(SPDie, dwarf::DW_AT_artificial);
Devang Pateldbc64af2011-08-15 17:24:54 +00001438
1439 if (!SP.isLocalToUnit())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001440 addFlag(SPDie, dwarf::DW_AT_external);
Devang Pateldbc64af2011-08-15 17:24:54 +00001441
1442 if (SP.isOptimized())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001443 addFlag(SPDie, dwarf::DW_AT_APPLE_optimized);
Devang Pateldbc64af2011-08-15 17:24:54 +00001444
1445 if (unsigned isa = Asm->getISAEncoding()) {
1446 addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1447 }
1448
1449 return SPDie;
1450}
1451
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001452// Return const expression if value is a GEP to access merged global
1453// constant. e.g.
1454// i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
1455static const ConstantExpr *getMergedGlobalExpr(const Value *V) {
1456 const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
1457 if (!CE || CE->getNumOperands() != 3 ||
1458 CE->getOpcode() != Instruction::GetElementPtr)
1459 return NULL;
1460
1461 // First operand points to a global struct.
1462 Value *Ptr = CE->getOperand(0);
1463 if (!isa<GlobalValue>(Ptr) ||
1464 !isa<StructType>(cast<PointerType>(Ptr->getType())->getElementType()))
1465 return NULL;
1466
1467 // Second operand is zero.
1468 const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
1469 if (!CI || !CI->isZero())
1470 return NULL;
1471
1472 // Third operand is offset.
1473 if (!isa<ConstantInt>(CE->getOperand(2)))
1474 return NULL;
1475
1476 return CE;
1477}
1478
1479/// createGlobalVariableDIE - create global variable DIE.
1480void CompileUnit::createGlobalVariableDIE(const MDNode *N) {
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001481 // Check for pre-existence.
Devang Patel49e2f032011-08-18 22:21:50 +00001482 if (getDIE(N))
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001483 return;
1484
Devang Patel49e2f032011-08-18 22:21:50 +00001485 DIGlobalVariable GV(N);
Manman Rend03d2b22013-07-08 18:33:29 +00001486 if (!GV.isGlobalVariable())
Devang Patel28bea082011-08-18 23:17:55 +00001487 return;
1488
Eric Christopherccb66362013-10-04 23:49:26 +00001489 DIScope GVContext = GV.getContext();
Eric Christopher6b6061f2013-01-16 01:22:23 +00001490 DIType GTy = GV.getType();
1491
1492 // If this is a static data member definition, some attributes belong
1493 // to the declaration DIE.
1494 DIE *VariableDIE = NULL;
Manman Ren945e8282013-02-01 23:54:37 +00001495 bool IsStaticMember = false;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001496 DIDerivedType SDMDecl = GV.getStaticDataMemberDeclaration();
1497 if (SDMDecl.Verify()) {
1498 assert(SDMDecl.isStaticMember() && "Expected static member decl");
1499 // We need the declaration DIE that is in the static member's class.
Manman Ren655a10d2013-10-14 20:33:57 +00001500 VariableDIE = getOrCreateStaticMemberDIE(SDMDecl);
Manman Ren945e8282013-02-01 23:54:37 +00001501 IsStaticMember = true;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001502 }
1503
1504 // If this is not a static data member definition, create the variable
1505 // DIE and add the initial set of attributes to it.
1506 if (!VariableDIE) {
Manman Ren6b713802013-10-29 05:49:41 +00001507 // Construct the context before querying for the existence of the DIE in
1508 // case such construction creates the DIE.
1509 DIE *ContextDIE = getOrCreateContextDIE(GVContext);
1510 if (!ContextDIE)
1511 ContextDIE = CUDie.get();
1512
Eric Christopher6b6061f2013-01-16 01:22:23 +00001513 // Add to map.
Manman Ren6b713802013-10-29 05:49:41 +00001514 VariableDIE = createAndAddDIE(GV.getTag(), *ContextDIE, N);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001515
1516 // Add name and type.
1517 addString(VariableDIE, dwarf::DW_AT_name, GV.getDisplayName());
1518 addType(VariableDIE, GTy);
1519
1520 // Add scoping info.
Eric Christophera486f552013-10-16 01:37:49 +00001521 if (!GV.isLocalToUnit())
Eric Christopher6b6061f2013-01-16 01:22:23 +00001522 addFlag(VariableDIE, dwarf::DW_AT_external);
1523
1524 // Add line number info.
1525 addSourceLine(VariableDIE, GV);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001526 }
1527
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001528 // Add location.
Eric Christopher09ac3d82011-11-07 09:24:32 +00001529 bool addToAccelTable = false;
Eric Christopherd61c34b2011-11-11 03:16:32 +00001530 DIE *VariableSpecDIE = NULL;
Eric Christopher6b6061f2013-01-16 01:22:23 +00001531 bool isGlobalVariable = GV.getGlobal() != NULL;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001532 if (isGlobalVariable) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001533 addToAccelTable = true;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001534 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Rafael Espindolaffc7dca2013-10-29 17:07:16 +00001535 const MCSymbol *Sym = Asm->getSymbol(GV.getGlobal());
David Blaikie59eaa382013-06-28 20:05:11 +00001536 if (GV.getGlobal()->isThreadLocal()) {
1537 // FIXME: Make this work with -gsplit-dwarf.
1538 unsigned PointerSize = Asm->getDataLayout().getPointerSize();
1539 assert((PointerSize == 4 || PointerSize == 8) &&
1540 "Add support for other sizes if necessary");
Ulrich Weigand716a94f2013-07-02 18:47:09 +00001541 const MCExpr *Expr =
David Blaikie8fed05e2013-07-01 23:55:52 +00001542 Asm->getObjFileLowering().getDebugThreadLocalSymbol(Sym);
David Blaikie59eaa382013-06-28 20:05:11 +00001543 // Based on GCC's support for TLS:
David Blaikie8fed05e2013-07-01 23:55:52 +00001544 if (!DD->useSplitDwarf()) {
1545 // 1) Start with a constNu of the appropriate pointer size
David Blaikie770530b2013-10-21 17:28:37 +00001546 addUInt(Block, dwarf::DW_FORM_data1,
David Blaikie8fed05e2013-07-01 23:55:52 +00001547 PointerSize == 4 ? dwarf::DW_OP_const4u : dwarf::DW_OP_const8u);
Richard Mitton379f76e2013-10-07 18:39:18 +00001548 // 2) containing the (relocated) offset of the TLS variable
1549 // within the module's TLS block.
David Blaikie770530b2013-10-21 17:28:37 +00001550 addExpr(Block, dwarf::DW_FORM_udata, Expr);
David Blaikie8fed05e2013-07-01 23:55:52 +00001551 } else {
David Blaikie770530b2013-10-21 17:28:37 +00001552 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_const_index);
1553 addUInt(Block, dwarf::DW_FORM_udata, DU->getAddrPoolIndex(Expr));
David Blaikie8fed05e2013-07-01 23:55:52 +00001554 }
Richard Mitton379f76e2013-10-07 18:39:18 +00001555 // 3) followed by a custom OP to make the debugger do a TLS lookup.
David Blaikie770530b2013-10-21 17:28:37 +00001556 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_push_tls_address);
David Blaikie59eaa382013-06-28 20:05:11 +00001557 } else
1558 addOpAddress(Block, Sym);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001559 // Do not create specification DIE if context is either compile unit
1560 // or a subprogram.
Devang Patel1dd4e562011-09-21 23:41:11 +00001561 if (GVContext && GV.isDefinition() && !GVContext.isCompileUnit() &&
Manman Ren02d29672013-09-09 19:05:21 +00001562 !GVContext.isFile() && !DD->isSubprogramContext(GVContext)) {
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001563 // Create specification DIE.
Manman Ren1a5e7872013-10-29 00:53:03 +00001564 VariableSpecDIE = createAndAddDIE(dwarf::DW_TAG_variable, *CUDie.get());
Manman Ren87b110a2013-10-11 23:58:05 +00001565 addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification, VariableDIE);
David Blaikie770530b2013-10-21 17:28:37 +00001566 addBlock(VariableSpecDIE, dwarf::DW_AT_location, Block);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001567 // A static member's declaration is already flagged as such.
1568 if (!SDMDecl.Verify())
1569 addFlag(VariableDIE, dwarf::DW_AT_declaration);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001570 } else {
David Blaikie770530b2013-10-21 17:28:37 +00001571 addBlock(VariableDIE, dwarf::DW_AT_location, Block);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001572 }
Michael Gottesmandc42d032013-09-04 04:39:38 +00001573 // Add the linkage name.
Eric Christopher6b6061f2013-01-16 01:22:23 +00001574 StringRef LinkageName = GV.getLinkageName();
Michael Gottesmandc42d032013-09-04 04:39:38 +00001575 if (!LinkageName.empty())
Eric Christopher8d45a982013-02-27 23:49:47 +00001576 // From DWARF4: DIEs to which DW_AT_linkage_name may apply include:
1577 // TAG_common_block, TAG_constant, TAG_entry_point, TAG_subprogram and
1578 // TAG_variable.
Eric Christopher6efc0432013-10-19 01:04:47 +00001579 addString(IsStaticMember && VariableSpecDIE ? VariableSpecDIE
1580 : VariableDIE,
1581 dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c2b4be2013-06-01 17:51:14 +00001582 GlobalValue::getRealLinkageName(LinkageName));
Eric Christopher8b4310b2012-11-21 00:34:38 +00001583 } else if (const ConstantInt *CI =
Eric Christopher6efc0432013-10-19 01:04:47 +00001584 dyn_cast_or_null<ConstantInt>(GV.getConstant())) {
Adrian Prantl2e892e42013-04-04 22:56:49 +00001585 // AT_const_value was added when the static member was created. To avoid
Manman Ren945e8282013-02-01 23:54:37 +00001586 // emitting AT_const_value multiple times, we only add AT_const_value when
1587 // it is not a static member.
1588 if (!IsStaticMember)
Manman Renc664d762013-10-05 01:43:03 +00001589 addConstantValue(VariableDIE, CI, isUnsignedDIType(DD, GTy));
Manman Ren945e8282013-02-01 23:54:37 +00001590 } else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001591 addToAccelTable = true;
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001592 // GV is a merged global.
1593 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1594 Value *Ptr = CE->getOperand(0);
Rafael Espindolaffc7dca2013-10-29 17:07:16 +00001595 addOpAddress(Block, Asm->getSymbol(cast<GlobalValue>(Ptr)));
David Blaikie770530b2013-10-21 17:28:37 +00001596 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
Eric Christopher6efc0432013-10-19 01:04:47 +00001597 SmallVector<Value *, 3> Idx(CE->op_begin() + 1, CE->op_end());
David Blaikie770530b2013-10-21 17:28:37 +00001598 addUInt(Block, dwarf::DW_FORM_udata,
Eric Christopher6efc0432013-10-19 01:04:47 +00001599 Asm->getDataLayout().getIndexedOffset(Ptr->getType(), Idx));
David Blaikie770530b2013-10-21 17:28:37 +00001600 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1601 addBlock(VariableDIE, dwarf::DW_AT_location, Block);
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001602 }
1603
Eric Christopherd117fbb2011-11-11 01:55:22 +00001604 if (addToAccelTable) {
1605 DIE *AddrDIE = VariableSpecDIE ? VariableSpecDIE : VariableDIE;
1606 addAccelName(GV.getName(), AddrDIE);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001607
Eric Christopherd117fbb2011-11-11 01:55:22 +00001608 // If the linkage name is different than the name, go ahead and output
1609 // that as well into the name table.
1610 if (GV.getLinkageName() != "" && GV.getName() != GV.getLinkageName())
1611 addAccelName(GV.getLinkageName(), AddrDIE);
1612 }
Eric Christophera486f552013-10-16 01:37:49 +00001613
1614 if (!GV.isLocalToUnit())
Eric Christopher91986572013-10-17 02:06:06 +00001615 addGlobalName(GV.getName(), VariableSpecDIE ? VariableSpecDIE : VariableDIE,
1616 GV.getContext());
Devang Patel6f9d8ff2011-08-15 17:57:41 +00001617}
1618
Devang Patel161b2f42011-04-12 23:21:44 +00001619/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
Eric Christopher4d069bf2012-05-22 18:45:24 +00001620void CompileUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR,
1621 DIE *IndexTy) {
Manman Ren1a5e7872013-10-29 00:53:03 +00001622 DIE *DW_Subrange = createAndAddDIE(dwarf::DW_TAG_subrange_type, Buffer);
Manman Ren87b110a2013-10-11 23:58:05 +00001623 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, IndexTy);
Devang Patel161b2f42011-04-12 23:21:44 +00001624
Bill Wendling222c2fd2012-12-06 07:38:10 +00001625 // The LowerBound value defines the lower bounds which is typically zero for
1626 // C/C++. The Count value is the number of elements. Values are 64 bit. If
1627 // Count == -1 then the array is unbounded and we do not emit
1628 // DW_AT_lower_bound and DW_AT_upper_bound attributes. If LowerBound == 0 and
1629 // Count == 0, then the array has zero elements in which case we do not emit
1630 // an upper bound.
1631 int64_t LowerBound = SR.getLo();
Bill Wendling6afe4782012-12-06 07:55:19 +00001632 int64_t DefaultLowerBound = getDefaultLowerBound();
Bill Wendling9493dae2012-12-04 21:34:03 +00001633 int64_t Count = SR.getCount();
Devang Patel161b2f42011-04-12 23:21:44 +00001634
Bill Wendling6afe4782012-12-06 07:55:19 +00001635 if (DefaultLowerBound == -1 || LowerBound != DefaultLowerBound)
David Blaikie770530b2013-10-21 17:28:37 +00001636 addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, None, LowerBound);
Bill Wendling222c2fd2012-12-06 07:38:10 +00001637
1638 if (Count != -1 && Count != 0)
Bill Wendling9493dae2012-12-04 21:34:03 +00001639 // FIXME: An unbounded array should reference the expression that defines
1640 // the array.
David Blaikie770530b2013-10-21 17:28:37 +00001641 addUInt(DW_Subrange, dwarf::DW_AT_upper_bound, None, LowerBound + Count - 1);
Devang Patel161b2f42011-04-12 23:21:44 +00001642}
1643
1644/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
Eric Christopher6efc0432013-10-19 01:04:47 +00001645void CompileUnit::constructArrayTypeDIE(DIE &Buffer, DICompositeType *CTy) {
Eric Christopher9a1e0e22013-01-08 01:53:52 +00001646 if (CTy->isVector())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001647 addFlag(&Buffer, dwarf::DW_AT_GNU_vector);
Devang Patel161b2f42011-04-12 23:21:44 +00001648
Eric Christopherdc1363f2013-08-08 07:40:37 +00001649 // Emit the element type.
Manman Ren017ceda2013-10-08 18:42:58 +00001650 addType(&Buffer, resolve(CTy->getTypeDerivedFrom()));
Devang Patel161b2f42011-04-12 23:21:44 +00001651
1652 // Get an anonymous type for index type.
Eric Christopher8cab6ed2013-01-04 21:51:53 +00001653 // FIXME: This type should be passed down from the front end
1654 // as different languages may have different sizes for indexes.
Devang Patel161b2f42011-04-12 23:21:44 +00001655 DIE *IdxTy = getIndexTyDie();
1656 if (!IdxTy) {
1657 // Construct an anonymous type for index type.
Manman Ren1a5e7872013-10-29 00:53:03 +00001658 IdxTy = createAndAddDIE(dwarf::DW_TAG_base_type, *CUDie.get());
Eric Christopher8cab6ed2013-01-04 21:51:53 +00001659 addString(IdxTy, dwarf::DW_AT_name, "int");
David Blaikie770530b2013-10-21 17:28:37 +00001660 addUInt(IdxTy, dwarf::DW_AT_byte_size, None, sizeof(int32_t));
Devang Patel161b2f42011-04-12 23:21:44 +00001661 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1662 dwarf::DW_ATE_signed);
Devang Patel161b2f42011-04-12 23:21:44 +00001663 setIndexTyDie(IdxTy);
1664 }
1665
1666 // Add subranges to array type.
Eric Christopherdc1363f2013-08-08 07:40:37 +00001667 DIArray Elements = CTy->getTypeArray();
Devang Patel161b2f42011-04-12 23:21:44 +00001668 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1669 DIDescriptor Element = Elements.getElement(i);
1670 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1671 constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1672 }
1673}
1674
1675/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
Manman Ren99addee2013-10-23 22:57:12 +00001676void CompileUnit::constructEnumTypeDIE(DIE &Buffer, DIEnumerator ETy) {
Manman Ren1a5e7872013-10-29 00:53:03 +00001677 DIE *Enumerator = createAndAddDIE(dwarf::DW_TAG_enumerator, Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +00001678 StringRef Name = ETy.getName();
Nick Lewycky390c40d2011-10-27 06:44:11 +00001679 addString(Enumerator, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001680 int64_t Value = ETy.getEnumValue();
1681 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
Devang Patel161b2f42011-04-12 23:21:44 +00001682}
1683
Devang Pateldbc64af2011-08-15 17:24:54 +00001684/// constructContainingTypeDIEs - Construct DIEs for types that contain
1685/// vtables.
1686void CompileUnit::constructContainingTypeDIEs() {
1687 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
Eric Christopher6efc0432013-10-19 01:04:47 +00001688 CE = ContainingTypeMap.end();
1689 CI != CE; ++CI) {
Devang Pateldbc64af2011-08-15 17:24:54 +00001690 DIE *SPDie = CI->first;
1691 const MDNode *N = CI->second;
Eric Christopher6efc0432013-10-19 01:04:47 +00001692 if (!N)
1693 continue;
Eric Christopher3f045002013-10-04 17:08:38 +00001694 DIE *NDie = getDIE(N);
Eric Christopher6efc0432013-10-19 01:04:47 +00001695 if (!NDie)
1696 continue;
Manman Ren87b110a2013-10-11 23:58:05 +00001697 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, NDie);
Devang Pateldbc64af2011-08-15 17:24:54 +00001698 }
1699}
1700
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001701/// constructVariableDIE - Construct a DIE for the given DbgVariable.
Eric Christopher6efc0432013-10-19 01:04:47 +00001702DIE *CompileUnit::constructVariableDIE(DbgVariable *DV, bool isScopeAbstract) {
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001703 StringRef Name = DV->getName();
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001704
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001705 // Define variable debug information entry.
David Blaikie916d49e2013-10-04 23:21:16 +00001706 DIE *VariableDie = new DIE(DV->getTag());
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001707 DbgVariable *AbsVar = DV->getAbstractVariable();
1708 DIE *AbsDIE = AbsVar ? AbsVar->getDIE() : NULL;
Manman Ren742671b2013-05-29 17:16:59 +00001709 if (AbsDIE)
Manman Ren87b110a2013-10-11 23:58:05 +00001710 addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin, AbsDIE);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001711 else {
David Blaikie2883fd42013-08-19 03:34:03 +00001712 if (!Name.empty())
1713 addString(VariableDie, dwarf::DW_AT_name, Name);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001714 addSourceLine(VariableDie, DV->getVariable());
1715 addType(VariableDie, DV->getType());
1716 }
1717
1718 if (DV->isArtificial())
Eric Christopher873cf0a2012-08-24 01:14:27 +00001719 addFlag(VariableDie, dwarf::DW_AT_artificial);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001720
1721 if (isScopeAbstract) {
1722 DV->setDIE(VariableDie);
1723 return VariableDie;
1724 }
1725
1726 // Add variable address.
1727
1728 unsigned Offset = DV->getDotDebugLocOffset();
1729 if (Offset != ~0U) {
Eric Christopherafbe0e22013-06-24 21:34:55 +00001730 addLabel(VariableDie, dwarf::DW_AT_location, dwarf::DW_FORM_data4,
1731 Asm->GetTempSymbol("debug_loc", Offset));
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001732 DV->setDIE(VariableDie);
1733 return VariableDie;
1734 }
1735
Eric Christopher8cf5e742011-10-03 15:49:20 +00001736 // Check if variable is described by a DBG_VALUE instruction.
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001737 if (const MachineInstr *DVInsn = DV->getMInsn()) {
David Blaikie6d9dbd52013-06-16 20:34:15 +00001738 assert(DVInsn->getNumOperands() == 3);
1739 if (DVInsn->getOperand(0).isReg()) {
1740 const MachineOperand RegOp = DVInsn->getOperand(0);
Adrian Prantlb2754912013-07-09 21:44:06 +00001741 // If the second operand is an immediate, this is an indirect value.
Adrian Prantl35176402013-07-09 20:28:37 +00001742 if (DVInsn->getOperand(1).isImm()) {
Eric Christopher6efc0432013-10-19 01:04:47 +00001743 MachineLocation Location(RegOp.getReg(),
1744 DVInsn->getOperand(1).getImm());
Eric Christopherf61dbc12013-06-24 21:07:27 +00001745 addVariableAddress(*DV, VariableDie, Location);
David Blaikie6d9dbd52013-06-16 20:34:15 +00001746 } else if (RegOp.getReg())
Eric Christopherf61dbc12013-06-24 21:07:27 +00001747 addVariableAddress(*DV, VariableDie, MachineLocation(RegOp.getReg()));
David Blaikie6d9dbd52013-06-16 20:34:15 +00001748 } else if (DVInsn->getOperand(0).isImm())
Eric Christophere4721492013-07-03 01:08:30 +00001749 addConstantValue(VariableDie, DVInsn->getOperand(0), DV->getType());
David Blaikie6d9dbd52013-06-16 20:34:15 +00001750 else if (DVInsn->getOperand(0).isFPImm())
Eric Christophere4721492013-07-03 01:08:30 +00001751 addConstantFPValue(VariableDie, DVInsn->getOperand(0));
David Blaikie6d9dbd52013-06-16 20:34:15 +00001752 else if (DVInsn->getOperand(0).isCImm())
Eric Christophere4721492013-07-03 01:08:30 +00001753 addConstantValue(VariableDie, DVInsn->getOperand(0).getCImm(),
Manman Renc664d762013-10-05 01:43:03 +00001754 isUnsignedDIType(DD, DV->getType()));
Eric Christophere4721492013-07-03 01:08:30 +00001755
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001756 DV->setDIE(VariableDie);
1757 return VariableDie;
1758 } else {
1759 // .. else use frame index.
1760 int FI = DV->getFrameIndex();
1761 if (FI != ~0) {
1762 unsigned FrameReg = 0;
1763 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
Eric Christopher6efc0432013-10-19 01:04:47 +00001764 int Offset = TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001765 MachineLocation Location(FrameReg, Offset);
Eric Christopherf61dbc12013-06-24 21:07:27 +00001766 addVariableAddress(*DV, VariableDie, Location);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001767 }
1768 }
1769
1770 DV->setDIE(VariableDie);
1771 return VariableDie;
1772}
1773
Manman Rena1d25b62013-10-23 23:00:44 +00001774/// constructMemberDIE - Construct member DIE from DIDerivedType.
1775void CompileUnit::constructMemberDIE(DIE &Buffer, DIDerivedType DT) {
Manman Ren1a5e7872013-10-29 00:53:03 +00001776 DIE *MemberDie = createAndAddDIE(DT.getTag(), Buffer);
Devang Patel161b2f42011-04-12 23:21:44 +00001777 StringRef Name = DT.getName();
1778 if (!Name.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +00001779 addString(MemberDie, dwarf::DW_AT_name, Name);
Devang Patel161b2f42011-04-12 23:21:44 +00001780
Manman Ren017ceda2013-10-08 18:42:58 +00001781 addType(MemberDie, resolve(DT.getTypeDerivedFrom()));
Devang Patel161b2f42011-04-12 23:21:44 +00001782
1783 addSourceLine(MemberDie, DT);
1784
1785 DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
David Blaikie770530b2013-10-21 17:28:37 +00001786 addUInt(MemLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
Devang Patel161b2f42011-04-12 23:21:44 +00001787
1788 uint64_t Size = DT.getSizeInBits();
Manman Ren43251002013-10-08 18:46:58 +00001789 uint64_t FieldSize = getBaseTypeSize(DD, DT);
Devang Patel161b2f42011-04-12 23:21:44 +00001790
1791 if (Size != FieldSize) {
1792 // Handle bitfield.
David Blaikie770530b2013-10-21 17:28:37 +00001793 addUInt(MemberDie, dwarf::DW_AT_byte_size, None,
1794 getBaseTypeSize(DD, DT) >> 3);
1795 addUInt(MemberDie, dwarf::DW_AT_bit_size, None, DT.getSizeInBits());
Devang Patel161b2f42011-04-12 23:21:44 +00001796
1797 uint64_t Offset = DT.getOffsetInBits();
1798 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1799 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1800 uint64_t FieldOffset = (HiMark - FieldSize);
1801 Offset -= FieldOffset;
1802
1803 // Maybe we need to work from the other end.
Micah Villmow3574eca2012-10-08 16:38:25 +00001804 if (Asm->getDataLayout().isLittleEndian())
Devang Patel161b2f42011-04-12 23:21:44 +00001805 Offset = FieldSize - (Offset + Size);
David Blaikie770530b2013-10-21 17:28:37 +00001806 addUInt(MemberDie, dwarf::DW_AT_bit_offset, None, Offset);
Devang Patel161b2f42011-04-12 23:21:44 +00001807
1808 // Here WD_AT_data_member_location points to the anonymous
1809 // field that includes this bit field.
David Blaikie770530b2013-10-21 17:28:37 +00001810 addUInt(MemLocationDie, dwarf::DW_FORM_udata, FieldOffset >> 3);
Devang Patel161b2f42011-04-12 23:21:44 +00001811
1812 } else
1813 // This is not a bitfield.
David Blaikie770530b2013-10-21 17:28:37 +00001814 addUInt(MemLocationDie, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
Devang Patel161b2f42011-04-12 23:21:44 +00001815
Eric Christopher6efc0432013-10-19 01:04:47 +00001816 if (DT.getTag() == dwarf::DW_TAG_inheritance && DT.isVirtual()) {
Devang Patel161b2f42011-04-12 23:21:44 +00001817
1818 // For C++, virtual base classes are not at fixed offset. Use following
1819 // expression to extract appropriate offset from vtable.
1820 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1821
1822 DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
David Blaikie770530b2013-10-21 17:28:37 +00001823 addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1824 addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1825 addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1826 addUInt(VBaseLocationDie, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1827 addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1828 addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1829 addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
Devang Patel161b2f42011-04-12 23:21:44 +00001830
David Blaikie770530b2013-10-21 17:28:37 +00001831 addBlock(MemberDie, dwarf::DW_AT_data_member_location, VBaseLocationDie);
Devang Patel161b2f42011-04-12 23:21:44 +00001832 } else
David Blaikie770530b2013-10-21 17:28:37 +00001833 addBlock(MemberDie, dwarf::DW_AT_data_member_location, MemLocationDie);
Devang Patel161b2f42011-04-12 23:21:44 +00001834
1835 if (DT.isProtected())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001836 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001837 dwarf::DW_ACCESS_protected);
1838 else if (DT.isPrivate())
Nick Lewycky13aaca52011-12-13 05:09:11 +00001839 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001840 dwarf::DW_ACCESS_private);
1841 // Otherwise C++ member and base classes are considered public.
Eric Christopher8b4310b2012-11-21 00:34:38 +00001842 else
Nick Lewycky13aaca52011-12-13 05:09:11 +00001843 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001844 dwarf::DW_ACCESS_public);
1845 if (DT.isVirtual())
Nick Lewycky798313d2011-12-14 00:56:07 +00001846 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
Devang Patel161b2f42011-04-12 23:21:44 +00001847 dwarf::DW_VIRTUALITY_virtual);
Devang Patele9db5e22011-04-16 00:11:51 +00001848
1849 // Objective-C properties.
Devang Patel6588abf2012-02-06 17:49:43 +00001850 if (MDNode *PNode = DT.getObjCProperty())
1851 if (DIEEntry *PropertyDie = getDIEEntry(PNode))
Eric Christopher8b4310b2012-11-21 00:34:38 +00001852 MemberDie->addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4,
Devang Patel6588abf2012-02-06 17:49:43 +00001853 PropertyDie);
1854
David Blaikie01bc2b32012-12-13 22:43:07 +00001855 if (DT.isArtificial())
1856 addFlag(MemberDie, dwarf::DW_AT_artificial);
Devang Patel161b2f42011-04-12 23:21:44 +00001857}
Eric Christopher6b6061f2013-01-16 01:22:23 +00001858
Manman Ren655a10d2013-10-14 20:33:57 +00001859/// getOrCreateStaticMemberDIE - Create new DIE for C++ static member.
1860DIE *CompileUnit::getOrCreateStaticMemberDIE(const DIDerivedType DT) {
Eric Christopher6b6061f2013-01-16 01:22:23 +00001861 if (!DT.Verify())
1862 return NULL;
1863
Manman Ren655a10d2013-10-14 20:33:57 +00001864 // Construct the context before querying for the existence of the DIE in case
1865 // such construction creates the DIE.
1866 DIE *ContextDIE = getOrCreateContextDIE(resolve(DT.getContext()));
1867 assert(ContextDIE && "Static member should belong to a non-CU context.");
1868
1869 DIE *StaticMemberDIE = getDIE(DT);
1870 if (StaticMemberDIE)
1871 return StaticMemberDIE;
1872
Manman Ren1a5e7872013-10-29 00:53:03 +00001873 StaticMemberDIE = createAndAddDIE(DT.getTag(), *ContextDIE, DT);
Manman Ren655a10d2013-10-14 20:33:57 +00001874
Manman Ren017ceda2013-10-08 18:42:58 +00001875 DIType Ty = resolve(DT.getTypeDerivedFrom());
Eric Christopher6b6061f2013-01-16 01:22:23 +00001876
1877 addString(StaticMemberDIE, dwarf::DW_AT_name, DT.getName());
1878 addType(StaticMemberDIE, Ty);
1879 addSourceLine(StaticMemberDIE, DT);
1880 addFlag(StaticMemberDIE, dwarf::DW_AT_external);
1881 addFlag(StaticMemberDIE, dwarf::DW_AT_declaration);
1882
1883 // FIXME: We could omit private if the parent is a class_type, and
1884 // public if the parent is something else.
1885 if (DT.isProtected())
1886 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1887 dwarf::DW_ACCESS_protected);
1888 else if (DT.isPrivate())
1889 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1890 dwarf::DW_ACCESS_private);
1891 else
1892 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1893 dwarf::DW_ACCESS_public);
1894
1895 if (const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(DT.getConstant()))
Manman Renc664d762013-10-05 01:43:03 +00001896 addConstantValue(StaticMemberDIE, CI, isUnsignedDIType(DD, Ty));
David Blaikie14268412013-01-20 01:18:01 +00001897 if (const ConstantFP *CFP = dyn_cast_or_null<ConstantFP>(DT.getConstant()))
1898 addConstantFPValue(StaticMemberDIE, CFP);
Eric Christopher6b6061f2013-01-16 01:22:23 +00001899
Eric Christopher6b6061f2013-01-16 01:22:23 +00001900 return StaticMemberDIE;
1901}