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