blob: 68a346887a47b6c0c6accc8ea72e7641718dafed [file] [log] [blame]
David Blaikie319a05f2013-12-02 19:33:10 +00001//===-- llvm/CodeGen/DwarfUnit.cpp - Dwarf Type and Compile Units ---------===//
Devang Patel0e821f42011-04-12 23:21:44 +00002//
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
David Blaikie2c86a722013-12-02 19:33:15 +000016#include "DwarfUnit.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"
Rafael Espindola894843c2014-01-07 21:19:40 +000025#include "llvm/IR/Mangler.h"
Eric Christopher84588622013-12-28 01:39:17 +000026#include "llvm/MC/MCAsmInfo.h"
Adrian Prantlcbcd5782014-02-11 22:22:15 +000027#include "llvm/MC/MCContext.h"
David Blaikie6b288cf2013-10-30 20:42:41 +000028#include "llvm/MC/MCSection.h"
29#include "llvm/MC/MCStreamer.h"
Chandler Carruth8a8cd2b2014-01-07 11:48:04 +000030#include "llvm/Support/CommandLine.h"
Devang Patel0e821f42011-04-12 23:21:44 +000031#include "llvm/Target/TargetFrameLowering.h"
David Blaikief2694972013-06-28 20:05:11 +000032#include "llvm/Target/TargetLoweringObjectFile.h"
Chandler Carruth8a8cd2b2014-01-07 11:48:04 +000033#include "llvm/Target/TargetMachine.h"
Devang Patel0e821f42011-04-12 23:21:44 +000034#include "llvm/Target/TargetRegisterInfo.h"
Devang Patel0e821f42011-04-12 23:21:44 +000035
36using namespace llvm;
37
Eric Christopher4287a492013-12-09 23:57:44 +000038static cl::opt<bool>
39GenerateDwarfTypeUnits("generate-type-units", cl::Hidden,
40 cl::desc("Generate DWARF4 type units."),
41 cl::init(false));
David Blaikie409dd9c2013-11-19 23:08:21 +000042
David Blaikie2a80e442013-12-02 22:09:48 +000043/// Unit - Unit constructor.
David Blaikie7480ae62014-01-09 03:03:27 +000044DwarfUnit::DwarfUnit(unsigned UID, DIE *D, DICompileUnit Node, AsmPrinter *A,
45 DwarfDebug *DW, DwarfFile *DWU)
David Blaikief645f962014-01-09 03:23:41 +000046 : UniqueID(UID), CUNode(Node), UnitDie(D), DebugInfoOffset(0), Asm(A),
47 DD(DW), DU(DWU), IndexTyDie(0), Section(0), Skeleton(0) {
David Blaikie319a05f2013-12-02 19:33:10 +000048 DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
49}
50
Eric Christopher4287a492013-12-09 23:57:44 +000051DwarfCompileUnit::DwarfCompileUnit(unsigned UID, DIE *D, DICompileUnit Node,
52 AsmPrinter *A, DwarfDebug *DW,
53 DwarfFile *DWU)
David Blaikie7480ae62014-01-09 03:03:27 +000054 : DwarfUnit(UID, D, Node, A, DW, DWU) {
David Blaikie5a152402013-11-15 23:52:02 +000055 insertDIE(Node, D);
Devang Patel0e821f42011-04-12 23:21:44 +000056}
57
David Blaikie15632ae2014-02-12 00:31:30 +000058DwarfTypeUnit::DwarfTypeUnit(unsigned UID, DIE *D, DwarfCompileUnit &CU,
Eric Christopher4287a492013-12-09 23:57:44 +000059 AsmPrinter *A, DwarfDebug *DW, DwarfFile *DWU)
David Blaikie15632ae2014-02-12 00:31:30 +000060 : DwarfUnit(UID, D, CU.getCUNode(), A, DW, DWU), CU(CU) {
61 (void)CU;
62}
David Blaikie409dd9c2013-11-19 23:08:21 +000063
David Blaikie319a05f2013-12-02 19:33:10 +000064/// ~Unit - Destructor for compile unit.
Eric Christophera5a79422013-12-09 23:32:48 +000065DwarfUnit::~DwarfUnit() {
Devang Patel0e821f42011-04-12 23:21:44 +000066 for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
67 DIEBlocks[j]->~DIEBlock();
68}
69
70/// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
71/// information entry.
Eric Christophera5a79422013-12-09 23:32:48 +000072DIEEntry *DwarfUnit::createDIEEntry(DIE *Entry) {
Devang Patel0e821f42011-04-12 23:21:44 +000073 DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
74 return Value;
75}
76
Bill Wendling3495f9b2012-12-06 07:55:19 +000077/// getDefaultLowerBound - Return the default lower bound for an array. If the
Bill Wendling28fe9e72012-12-06 07:38:10 +000078/// DWARF version doesn't handle the language, return -1.
Eric Christophera5a79422013-12-09 23:32:48 +000079int64_t DwarfUnit::getDefaultLowerBound() const {
David Blaikiecb8e4352013-11-15 23:50:53 +000080 switch (getLanguage()) {
Bill Wendling28fe9e72012-12-06 07:38:10 +000081 default:
82 break;
83
84 case dwarf::DW_LANG_C89:
85 case dwarf::DW_LANG_C99:
86 case dwarf::DW_LANG_C:
87 case dwarf::DW_LANG_C_plus_plus:
88 case dwarf::DW_LANG_ObjC:
89 case dwarf::DW_LANG_ObjC_plus_plus:
90 return 0;
91
92 case dwarf::DW_LANG_Fortran77:
93 case dwarf::DW_LANG_Fortran90:
94 case dwarf::DW_LANG_Fortran95:
95 return 1;
96
97 // The languages below have valid values only if the DWARF version >= 4.
98 case dwarf::DW_LANG_Java:
99 case dwarf::DW_LANG_Python:
100 case dwarf::DW_LANG_UPC:
101 case dwarf::DW_LANG_D:
102 if (dwarf::DWARF_VERSION >= 4)
103 return 0;
104 break;
105
106 case dwarf::DW_LANG_Ada83:
107 case dwarf::DW_LANG_Ada95:
108 case dwarf::DW_LANG_Cobol74:
109 case dwarf::DW_LANG_Cobol85:
110 case dwarf::DW_LANG_Modula2:
111 case dwarf::DW_LANG_Pascal83:
112 case dwarf::DW_LANG_PLI:
113 if (dwarf::DWARF_VERSION >= 4)
114 return 1;
115 break;
116 }
117
118 return -1;
119}
120
Manman Ren4dbdc902013-10-31 17:54:35 +0000121/// Check whether the DIE for this MDNode can be shared across CUs.
David Blaikie4201ddf2013-11-15 22:59:36 +0000122static bool isShareableAcrossCUs(DIDescriptor D) {
David Blaikiebcb418e2013-11-20 18:40:16 +0000123 // When the MDNode can be part of the type system, the DIE can be shared
124 // across CUs.
125 // Combining type units and cross-CU DIE sharing is lower value (since
126 // cross-CU DIE sharing is used in LTO and removes type redundancy at that
127 // level already) but may be implementable for some value in projects
128 // building multiple independent libraries with LTO and then linking those
129 // together.
David Blaikie409dd9c2013-11-19 23:08:21 +0000130 return (D.isType() ||
131 (D.isSubprogram() && !DISubprogram(D).isDefinition())) &&
Eric Christopher4287a492013-12-09 23:57:44 +0000132 !GenerateDwarfTypeUnits;
Manman Ren4dbdc902013-10-31 17:54:35 +0000133}
134
135/// getDIE - Returns the debug information entry map slot for the
136/// specified debug variable. We delegate the request to DwarfDebug
137/// when the DIE for this MDNode can be shared across CUs. The mappings
138/// will be kept in DwarfDebug for shareable DIEs.
Eric Christophera5a79422013-12-09 23:32:48 +0000139DIE *DwarfUnit::getDIE(DIDescriptor D) const {
David Blaikie2ad00162013-11-15 23:09:13 +0000140 if (isShareableAcrossCUs(D))
141 return DD->getDIE(D);
142 return MDNodeToDieMap.lookup(D);
Manman Ren4dbdc902013-10-31 17:54:35 +0000143}
144
145/// insertDIE - Insert DIE into the map. We delegate the request to DwarfDebug
146/// when the DIE for this MDNode can be shared across CUs. The mappings
147/// will be kept in DwarfDebug for shareable DIEs.
Eric Christophera5a79422013-12-09 23:32:48 +0000148void DwarfUnit::insertDIE(DIDescriptor Desc, DIE *D) {
David Blaikie2ad00162013-11-15 23:09:13 +0000149 if (isShareableAcrossCUs(Desc)) {
150 DD->insertDIE(Desc, D);
Manman Ren4dbdc902013-10-31 17:54:35 +0000151 return;
152 }
David Blaikie2ad00162013-11-15 23:09:13 +0000153 MDNodeToDieMap.insert(std::make_pair(Desc, D));
Manman Ren4dbdc902013-10-31 17:54:35 +0000154}
155
Eric Christopherbb69a272012-08-24 01:14:27 +0000156/// addFlag - Add a flag that is true.
Eric Christophera5a79422013-12-09 23:32:48 +0000157void DwarfUnit::addFlag(DIE *Die, dwarf::Attribute Attribute) {
Michael Gottesmanc89466f2013-09-04 04:39:38 +0000158 if (DD->getDwarfVersion() >= 4)
Eric Christopherdccd3282013-10-04 22:40:05 +0000159 Die->addValue(Attribute, dwarf::DW_FORM_flag_present, DIEIntegerOne);
Eric Christopherbb69a272012-08-24 01:14:27 +0000160 else
Eric Christopherdccd3282013-10-04 22:40:05 +0000161 Die->addValue(Attribute, dwarf::DW_FORM_flag, DIEIntegerOne);
Eric Christopherbb69a272012-08-24 01:14:27 +0000162}
163
Devang Patel0e821f42011-04-12 23:21:44 +0000164/// addUInt - Add an unsigned integer attribute data and value.
165///
Eric Christophera5a79422013-12-09 23:32:48 +0000166void DwarfUnit::addUInt(DIE *Die, dwarf::Attribute Attribute,
167 Optional<dwarf::Form> Form, uint64_t Integer) {
Eric Christopherc2697f82013-10-19 01:04:47 +0000168 if (!Form)
169 Form = DIEInteger::BestForm(false, Integer);
170 DIEValue *Value = Integer == 1 ? DIEIntegerOne : new (DIEValueAllocator)
171 DIEInteger(Integer);
David Blaikief2443192013-10-21 17:28:37 +0000172 Die->addValue(Attribute, *Form, Value);
173}
174
Eric Christophera5a79422013-12-09 23:32:48 +0000175void DwarfUnit::addUInt(DIEBlock *Block, dwarf::Form Form, uint64_t Integer) {
David Blaikief2443192013-10-21 17:28:37 +0000176 addUInt(Block, (dwarf::Attribute)0, Form, Integer);
Devang Patel0e821f42011-04-12 23:21:44 +0000177}
178
179/// addSInt - Add an signed integer attribute data and value.
180///
Eric Christophera5a79422013-12-09 23:32:48 +0000181void DwarfUnit::addSInt(DIE *Die, dwarf::Attribute Attribute,
182 Optional<dwarf::Form> Form, int64_t Integer) {
Eric Christopherc2697f82013-10-19 01:04:47 +0000183 if (!Form)
184 Form = DIEInteger::BestForm(true, Integer);
Devang Patel0e821f42011-04-12 23:21:44 +0000185 DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
David Blaikief2443192013-10-21 17:28:37 +0000186 Die->addValue(Attribute, *Form, Value);
187}
188
Eric Christophera5a79422013-12-09 23:32:48 +0000189void DwarfUnit::addSInt(DIEBlock *Die, Optional<dwarf::Form> Form,
190 int64_t Integer) {
David Blaikief2443192013-10-21 17:28:37 +0000191 addSInt(Die, (dwarf::Attribute)0, Form, Integer);
Devang Patel0e821f42011-04-12 23:21:44 +0000192}
193
Nick Lewyckycc64ae12011-10-28 05:29:47 +0000194/// addString - Add a string attribute data and value. We always emit a
195/// reference to the string pool instead of immediate strings so that DIEs have
Eric Christopherfba22602013-01-07 19:32:45 +0000196/// more predictable sizes. In the case of split dwarf we emit an index
197/// into another table which gets us the static offset into the string
198/// table.
Eric Christophera5a79422013-12-09 23:32:48 +0000199void DwarfUnit::addString(DIE *Die, dwarf::Attribute Attribute,
200 StringRef String) {
Eric Christopher05893f42013-12-30 18:32:31 +0000201
202 if (!DD->useSplitDwarf())
203 return addLocalString(Die, Attribute, String);
204
205 unsigned idx = DU->getStringPoolIndex(String);
206 DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx);
Eric Christopher67646432013-07-26 17:02:41 +0000207 DIEValue *Str = new (DIEValueAllocator) DIEString(Value, String);
Eric Christopher05893f42013-12-30 18:32:31 +0000208 Die->addValue(Attribute, dwarf::DW_FORM_GNU_str_index, Str);
Eric Christopher2cbd5762013-01-07 19:32:41 +0000209}
210
211/// addLocalString - Add a string attribute data and value. This is guaranteed
212/// to be in the local string pool instead of indirected.
Eric Christophera5a79422013-12-09 23:32:48 +0000213void DwarfUnit::addLocalString(DIE *Die, dwarf::Attribute Attribute,
214 StringRef String) {
Eric Christophere698f532012-12-20 21:58:36 +0000215 MCSymbol *Symb = DU->getStringPoolEntry(String);
Nick Lewyckycc64ae12011-10-28 05:29:47 +0000216 DIEValue *Value;
Eric Christopher84588622013-12-28 01:39:17 +0000217 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000218 Value = new (DIEValueAllocator) DIELabel(Symb);
Nick Lewyckycc64ae12011-10-28 05:29:47 +0000219 else {
Eric Christophere698f532012-12-20 21:58:36 +0000220 MCSymbol *StringPool = DU->getStringPoolSym();
Nick Lewyckycc64ae12011-10-28 05:29:47 +0000221 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +0000222 }
Eric Christopher05893f42013-12-30 18:32:31 +0000223 DIEValue *Str = new (DIEValueAllocator) DIEString(Value, String);
224 Die->addValue(Attribute, dwarf::DW_FORM_strp, Str);
Devang Patel0e821f42011-04-12 23:21:44 +0000225}
226
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000227/// addExpr - Add a Dwarf expression attribute data and value.
Devang Patel0e821f42011-04-12 23:21:44 +0000228///
Eric Christophera5a79422013-12-09 23:32:48 +0000229void DwarfUnit::addExpr(DIEBlock *Die, dwarf::Form Form, const MCExpr *Expr) {
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000230 DIEValue *Value = new (DIEValueAllocator) DIEExpr(Expr);
David Blaikief2443192013-10-21 17:28:37 +0000231 Die->addValue((dwarf::Attribute)0, Form, Value);
Devang Patel0e821f42011-04-12 23:21:44 +0000232}
233
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000234/// addLabel - Add a Dwarf label attribute data and value.
235///
Eric Christophera5a79422013-12-09 23:32:48 +0000236void DwarfUnit::addLabel(DIE *Die, dwarf::Attribute Attribute, dwarf::Form Form,
237 const MCSymbol *Label) {
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000238 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
239 Die->addValue(Attribute, Form, Value);
David Blaikief3cd7c52013-06-28 20:05:04 +0000240}
241
Eric Christophera5a79422013-12-09 23:32:48 +0000242void DwarfUnit::addLabel(DIEBlock *Die, dwarf::Form Form,
243 const MCSymbol *Label) {
David Blaikief2443192013-10-21 17:28:37 +0000244 addLabel(Die, (dwarf::Attribute)0, Form, Label);
245}
246
Eric Christopher33ff6972013-11-21 23:46:41 +0000247/// addSectionLabel - Add a Dwarf section label attribute data and value.
248///
Eric Christophera5a79422013-12-09 23:32:48 +0000249void DwarfUnit::addSectionLabel(DIE *Die, dwarf::Attribute Attribute,
250 const MCSymbol *Label) {
Eric Christopher33ff6972013-11-21 23:46:41 +0000251 if (DD->getDwarfVersion() >= 4)
252 addLabel(Die, Attribute, dwarf::DW_FORM_sec_offset, Label);
253 else
254 addLabel(Die, Attribute, dwarf::DW_FORM_data4, Label);
255}
256
257/// addSectionOffset - Add an offset into a section attribute data and value.
258///
Eric Christophera5a79422013-12-09 23:32:48 +0000259void DwarfUnit::addSectionOffset(DIE *Die, dwarf::Attribute Attribute,
260 uint64_t Integer) {
Eric Christopher33ff6972013-11-21 23:46:41 +0000261 if (DD->getDwarfVersion() >= 4)
262 addUInt(Die, Attribute, dwarf::DW_FORM_sec_offset, Integer);
263 else
264 addUInt(Die, Attribute, dwarf::DW_FORM_data4, Integer);
265}
266
Eric Christopher962c9082013-01-15 23:56:56 +0000267/// addLabelAddress - Add a dwarf label attribute data and value using
268/// DW_FORM_addr or DW_FORM_GNU_addr_index.
269///
Eric Christopher4287a492013-12-09 23:57:44 +0000270void DwarfCompileUnit::addLabelAddress(DIE *Die, dwarf::Attribute Attribute,
271 MCSymbol *Label) {
Alexey Samsonov4436bf02013-10-03 08:54:43 +0000272 if (Label)
273 DD->addArangeLabel(SymbolCU(this, Label));
Richard Mitton21101b32013-09-19 23:21:01 +0000274
Eric Christophercf48ade2014-01-24 11:52:53 +0000275 if (!DD->useSplitDwarf()) {
276 if (Label) {
277 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
278 Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
279 } else {
280 DIEValue *Value = new (DIEValueAllocator) DIEInteger(0);
281 Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
282 }
Eric Christopher962c9082013-01-15 23:56:56 +0000283 } else {
Eric Christophercf48ade2014-01-24 11:52:53 +0000284 unsigned idx = DU->getAddrPoolIndex(Label);
285 DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx);
286 Die->addValue(Attribute, dwarf::DW_FORM_GNU_addr_index, Value);
Eric Christopher962c9082013-01-15 23:56:56 +0000287 }
288}
289
Eric Christophere9ec2452013-01-18 22:11:33 +0000290/// addOpAddress - Add a dwarf op address data and value using the
291/// form given and an op of either DW_FORM_addr or DW_FORM_GNU_addr_index.
292///
Eric Christophera5a79422013-12-09 23:32:48 +0000293void DwarfUnit::addOpAddress(DIEBlock *Die, const MCSymbol *Sym) {
Eric Christophere9ec2452013-01-18 22:11:33 +0000294 if (!DD->useSplitDwarf()) {
David Blaikief2443192013-10-21 17:28:37 +0000295 addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
296 addLabel(Die, dwarf::DW_FORM_udata, Sym);
Eric Christophere9ec2452013-01-18 22:11:33 +0000297 } else {
David Blaikief2443192013-10-21 17:28:37 +0000298 addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_addr_index);
299 addUInt(Die, dwarf::DW_FORM_GNU_addr_index, DU->getAddrPoolIndex(Sym));
Eric Christophere9ec2452013-01-18 22:11:33 +0000300 }
301}
302
Eric Christopher33ff6972013-11-21 23:46:41 +0000303/// addSectionDelta - Add a section label delta attribute data and value.
Devang Patel0e821f42011-04-12 23:21:44 +0000304///
Eric Christophera5a79422013-12-09 23:32:48 +0000305void DwarfUnit::addSectionDelta(DIE *Die, dwarf::Attribute Attribute,
306 const MCSymbol *Hi, const MCSymbol *Lo) {
Devang Patel0e821f42011-04-12 23:21:44 +0000307 DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
Eric Christopher33ff6972013-11-21 23:46:41 +0000308 if (DD->getDwarfVersion() >= 4)
309 Die->addValue(Attribute, dwarf::DW_FORM_sec_offset, Value);
310 else
311 Die->addValue(Attribute, dwarf::DW_FORM_data4, Value);
Devang Patel0e821f42011-04-12 23:21:44 +0000312}
313
314/// addDIEEntry - Add a DIE attribute data and value.
315///
Eric Christophera5a79422013-12-09 23:32:48 +0000316void DwarfUnit::addDIEEntry(DIE *Die, dwarf::Attribute Attribute, DIE *Entry) {
Manman Ren4dbdc902013-10-31 17:54:35 +0000317 addDIEEntry(Die, Attribute, createDIEEntry(Entry));
318}
319
David Blaikie47f615e2013-12-17 23:32:35 +0000320void DwarfUnit::addDIETypeSignature(DIE *Die, const DwarfTypeUnit &Type) {
321 Die->addValue(dwarf::DW_AT_signature, dwarf::DW_FORM_ref_sig8,
322 new (DIEValueAllocator) DIETypeSignature(Type));
323}
324
Eric Christophera5a79422013-12-09 23:32:48 +0000325void DwarfUnit::addDIEEntry(DIE *Die, dwarf::Attribute Attribute,
326 DIEEntry *Entry) {
David Blaikie409dd9c2013-11-19 23:08:21 +0000327 const DIE *DieCU = Die->getUnitOrNull();
328 const DIE *EntryCU = Entry->getEntry()->getUnitOrNull();
Manman Ren4dbdc902013-10-31 17:54:35 +0000329 if (!DieCU)
330 // We assume that Die belongs to this CU, if it is not linked to any CU yet.
David Blaikie2a80e442013-12-02 22:09:48 +0000331 DieCU = getUnitDie();
Manman Ren4dbdc902013-10-31 17:54:35 +0000332 if (!EntryCU)
David Blaikie2a80e442013-12-02 22:09:48 +0000333 EntryCU = getUnitDie();
Manman Ren4dbdc902013-10-31 17:54:35 +0000334 Die->addValue(Attribute, EntryCU == DieCU ? dwarf::DW_FORM_ref4
335 : dwarf::DW_FORM_ref_addr,
336 Entry);
Devang Patel0e821f42011-04-12 23:21:44 +0000337}
338
Manman Renb987e512013-10-29 00:53:03 +0000339/// Create a DIE with the given Tag, add the DIE to its parent, and
340/// call insertDIE if MD is not null.
Eric Christophera5a79422013-12-09 23:32:48 +0000341DIE *DwarfUnit::createAndAddDIE(unsigned Tag, DIE &Parent, DIDescriptor N) {
Manman Renb987e512013-10-29 00:53:03 +0000342 DIE *Die = new DIE(Tag);
343 Parent.addChild(Die);
David Blaikie52c50202013-11-16 00:29:01 +0000344 if (N)
345 insertDIE(N, Die);
Manman Renb987e512013-10-29 00:53:03 +0000346 return Die;
347}
348
Devang Patel0e821f42011-04-12 23:21:44 +0000349/// addBlock - Add block data.
350///
Eric Christophera5a79422013-12-09 23:32:48 +0000351void DwarfUnit::addBlock(DIE *Die, dwarf::Attribute Attribute,
352 DIEBlock *Block) {
Devang Patel0e821f42011-04-12 23:21:44 +0000353 Block->ComputeSize(Asm);
354 DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
355 Die->addValue(Attribute, Block->BestForm(), Block);
356}
357
358/// addSourceLine - Add location information to specified debug information
359/// entry.
David Blaikie101613e2014-02-12 00:11:25 +0000360void DwarfUnit::addSourceLine(DIE *Die, unsigned Line, StringRef File,
361 StringRef Directory) {
Devang Patel0e821f42011-04-12 23:21:44 +0000362 if (Line == 0)
363 return;
David Blaikie101613e2014-02-12 00:11:25 +0000364
David Blaikie5b858582014-02-12 00:40:47 +0000365 unsigned FileID =
366 DD->getOrCreateSourceID(File, Directory, getCU().getUniqueID());
Devang Patel0e821f42011-04-12 23:21:44 +0000367 assert(FileID && "Invalid file id");
David Blaikief2443192013-10-21 17:28:37 +0000368 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
369 addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
Devang Patel0e821f42011-04-12 23:21:44 +0000370}
371
372/// addSourceLine - Add location information to specified debug information
373/// entry.
David Blaikie101613e2014-02-12 00:11:25 +0000374void DwarfUnit::addSourceLine(DIE *Die, DIVariable V) {
375 assert(V.isVariable());
376
377 addSourceLine(Die, V.getLineNumber(), V.getContext().getFilename(), V.getContext().getDirectory());
378}
379
380/// addSourceLine - Add location information to specified debug information
381/// entry.
Eric Christophera5a79422013-12-09 23:32:48 +0000382void DwarfUnit::addSourceLine(DIE *Die, DIGlobalVariable G) {
David Blaikie52019302014-02-11 23:57:03 +0000383 assert(G.isGlobalVariable());
Devang Patel0e821f42011-04-12 23:21:44 +0000384
David Blaikie101613e2014-02-12 00:11:25 +0000385 addSourceLine(Die, G.getLineNumber(), G.getFilename(), G.getDirectory());
Devang Patel0e821f42011-04-12 23:21:44 +0000386}
387
388/// addSourceLine - Add location information to specified debug information
389/// entry.
Eric Christophera5a79422013-12-09 23:32:48 +0000390void DwarfUnit::addSourceLine(DIE *Die, DISubprogram SP) {
David Blaikie52019302014-02-11 23:57:03 +0000391 assert(SP.isSubprogram());
Eric Christopher7734ca22012-03-15 23:55:40 +0000392
David Blaikie101613e2014-02-12 00:11:25 +0000393 addSourceLine(Die, SP.getLineNumber(), SP.getFilename(), SP.getDirectory());
Devang Patel0e821f42011-04-12 23:21:44 +0000394}
395
396/// addSourceLine - Add location information to specified debug information
397/// entry.
Eric Christophera5a79422013-12-09 23:32:48 +0000398void DwarfUnit::addSourceLine(DIE *Die, DIType Ty) {
David Blaikie52019302014-02-11 23:57:03 +0000399 assert(Ty.isType());
Devang Patel0e821f42011-04-12 23:21:44 +0000400
David Blaikie101613e2014-02-12 00:11:25 +0000401 addSourceLine(Die, Ty.getLineNumber(), Ty.getFilename(), Ty.getDirectory());
Devang Patel0e821f42011-04-12 23:21:44 +0000402}
403
404/// addSourceLine - Add location information to specified debug information
405/// entry.
Eric Christophera5a79422013-12-09 23:32:48 +0000406void DwarfUnit::addSourceLine(DIE *Die, DIObjCProperty Ty) {
David Blaikie52019302014-02-11 23:57:03 +0000407 assert(Ty.isObjCProperty());
Eric Christopher70e1bd82012-03-29 08:42:56 +0000408
Eric Christopher70e1bd82012-03-29 08:42:56 +0000409 DIFile File = Ty.getFile();
David Blaikie101613e2014-02-12 00:11:25 +0000410 addSourceLine(Die, Ty.getLineNumber(), File.getFilename(),
411 File.getDirectory());
Eric Christopher70e1bd82012-03-29 08:42:56 +0000412}
413
414/// addSourceLine - Add location information to specified debug information
415/// entry.
Eric Christophera5a79422013-12-09 23:32:48 +0000416void DwarfUnit::addSourceLine(DIE *Die, DINameSpace NS) {
David Blaikie52019302014-02-11 23:57:03 +0000417 assert(NS.Verify());
Devang Patel0e821f42011-04-12 23:21:44 +0000418
David Blaikie101613e2014-02-12 00:11:25 +0000419 addSourceLine(Die, NS.getLineNumber(), NS.getFilename(), NS.getDirectory());
Devang Patel0e821f42011-04-12 23:21:44 +0000420}
421
Eric Christopher92331fd2012-11-21 00:34:38 +0000422/// addVariableAddress - Add DW_AT_location attribute for a
Devang Patel77dc5412011-04-27 22:45:24 +0000423/// DbgVariable based on provided MachineLocation.
Eric Christophera5a79422013-12-09 23:32:48 +0000424void DwarfUnit::addVariableAddress(const DbgVariable &DV, DIE *Die,
425 MachineLocation Location) {
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000426 if (DV.variableHasComplexAddress())
Devang Patel0e821f42011-04-12 23:21:44 +0000427 addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000428 else if (DV.isBlockByrefVariable())
Devang Patel0e821f42011-04-12 23:21:44 +0000429 addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location);
430 else
David Blaikieea2605d2013-06-20 00:25:24 +0000431 addAddress(Die, dwarf::DW_AT_location, Location,
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000432 DV.getVariable().isIndirect());
Devang Patel0e821f42011-04-12 23:21:44 +0000433}
434
Devang Patelba5fbf12011-04-26 19:06:18 +0000435/// addRegisterOp - Add register operand.
Eric Christophera5a79422013-12-09 23:32:48 +0000436void DwarfUnit::addRegisterOp(DIEBlock *TheDie, unsigned Reg) {
Devang Patelba5fbf12011-04-26 19:06:18 +0000437 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
Adrian Prantlcbcd5782014-02-11 22:22:15 +0000438 int DWReg = RI->getDwarfRegNum(Reg, false);
439 bool isSubRegister = DWReg < 0;
440
441 unsigned Idx = 0;
442
443 // Go up the super-register chain until we hit a valid dwarf register number.
444 for (MCSuperRegIterator SR(Reg, RI); SR.isValid() && DWReg < 0; ++SR) {
445 DWReg = RI->getDwarfRegNum(*SR, false);
446 if (DWReg >= 0)
447 Idx = RI->getSubRegIndex(*SR, Reg);
448 }
449
450 if (DWReg < 0) {
451 DEBUG(llvm::dbgs() << "Invalid Dwarf register number.\n");
452 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_nop);
453 return;
454 }
455
456 // Emit register
Devang Patelba5fbf12011-04-26 19:06:18 +0000457 if (DWReg < 32)
David Blaikief2443192013-10-21 17:28:37 +0000458 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + DWReg);
Devang Patelba5fbf12011-04-26 19:06:18 +0000459 else {
David Blaikief2443192013-10-21 17:28:37 +0000460 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
461 addUInt(TheDie, dwarf::DW_FORM_udata, DWReg);
Devang Patelba5fbf12011-04-26 19:06:18 +0000462 }
Adrian Prantlcbcd5782014-02-11 22:22:15 +0000463
464 // Emit Mask
465 if (isSubRegister) {
466 unsigned Size = RI->getSubRegIdxSize(Idx);
467 unsigned Offset = RI->getSubRegIdxOffset(Idx);
468 if (Offset > 0) {
469 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_bit_piece);
470 addUInt(TheDie, dwarf::DW_FORM_data1, Size);
471 addUInt(TheDie, dwarf::DW_FORM_data1, Offset);
472 } else {
Adrian Prantl7199fd52014-02-12 19:34:44 +0000473 unsigned ByteSize = Size / 8; // Assuming 8 bits per byte.
Adrian Prantlcbcd5782014-02-11 22:22:15 +0000474 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_piece);
Adrian Prantl7199fd52014-02-12 19:34:44 +0000475 addUInt(TheDie, dwarf::DW_FORM_data1, ByteSize);
Adrian Prantlcbcd5782014-02-11 22:22:15 +0000476 }
477 }
Devang Patelba5fbf12011-04-26 19:06:18 +0000478}
479
480/// addRegisterOffset - Add register offset.
Eric Christophera5a79422013-12-09 23:32:48 +0000481void DwarfUnit::addRegisterOffset(DIEBlock *TheDie, unsigned Reg,
482 int64_t Offset) {
Devang Patelba5fbf12011-04-26 19:06:18 +0000483 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
484 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
485 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
486 if (Reg == TRI->getFrameRegister(*Asm->MF))
487 // If variable offset is based in frame register then use fbreg.
David Blaikief2443192013-10-21 17:28:37 +0000488 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
Devang Patelba5fbf12011-04-26 19:06:18 +0000489 else if (DWReg < 32)
David Blaikief2443192013-10-21 17:28:37 +0000490 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DWReg);
Devang Patelba5fbf12011-04-26 19:06:18 +0000491 else {
David Blaikief2443192013-10-21 17:28:37 +0000492 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
493 addUInt(TheDie, dwarf::DW_FORM_udata, DWReg);
Devang Patelba5fbf12011-04-26 19:06:18 +0000494 }
David Blaikief2443192013-10-21 17:28:37 +0000495 addSInt(TheDie, dwarf::DW_FORM_sdata, Offset);
Devang Patelba5fbf12011-04-26 19:06:18 +0000496}
497
498/// addAddress - Add an address attribute to a die based on the location
499/// provided.
Eric Christophera5a79422013-12-09 23:32:48 +0000500void DwarfUnit::addAddress(DIE *Die, dwarf::Attribute Attribute,
501 const MachineLocation &Location, bool Indirect) {
Devang Patelba5fbf12011-04-26 19:06:18 +0000502 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
503
David Blaikieea2605d2013-06-20 00:25:24 +0000504 if (Location.isReg() && !Indirect)
Devang Patelba5fbf12011-04-26 19:06:18 +0000505 addRegisterOp(Block, Location.getReg());
David Blaikieea2605d2013-06-20 00:25:24 +0000506 else {
Devang Patelba5fbf12011-04-26 19:06:18 +0000507 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
David Blaikieea2605d2013-06-20 00:25:24 +0000508 if (Indirect && !Location.isReg()) {
David Blaikief2443192013-10-21 17:28:37 +0000509 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
David Blaikieea2605d2013-06-20 00:25:24 +0000510 }
511 }
Devang Patelba5fbf12011-04-26 19:06:18 +0000512
513 // Now attach the location information to the DIE.
David Blaikief2443192013-10-21 17:28:37 +0000514 addBlock(Die, Attribute, Block);
Devang Patelba5fbf12011-04-26 19:06:18 +0000515}
516
Devang Patel0e821f42011-04-12 23:21:44 +0000517/// addComplexAddress - Start with the address based on the location provided,
518/// and generate the DWARF information necessary to find the actual variable
Eric Christopher1c70b672013-12-05 00:13:15 +0000519/// given the extra address information encoded in the DbgVariable, starting
520/// from the starting location. Add the DWARF information to the die.
Devang Patel0e821f42011-04-12 23:21:44 +0000521///
Eric Christophera5a79422013-12-09 23:32:48 +0000522void DwarfUnit::addComplexAddress(const DbgVariable &DV, DIE *Die,
523 dwarf::Attribute Attribute,
524 const MachineLocation &Location) {
Devang Patel0e821f42011-04-12 23:21:44 +0000525 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000526 unsigned N = DV.getNumAddrElements();
Devang Patel3e021532011-04-28 02:22:40 +0000527 unsigned i = 0;
528 if (Location.isReg()) {
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000529 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
Devang Patel3e021532011-04-28 02:22:40 +0000530 // If first address element is OpPlus then emit
531 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000532 addRegisterOffset(Block, Location.getReg(), DV.getAddrElement(1));
Devang Patel3e021532011-04-28 02:22:40 +0000533 i = 2;
534 } else
535 addRegisterOp(Block, Location.getReg());
Eric Christopherc2697f82013-10-19 01:04:47 +0000536 } else
Devang Patelba5fbf12011-04-26 19:06:18 +0000537 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel0e821f42011-04-12 23:21:44 +0000538
Eric Christopherc2697f82013-10-19 01:04:47 +0000539 for (; i < N; ++i) {
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000540 uint64_t Element = DV.getAddrElement(i);
Devang Patel0e821f42011-04-12 23:21:44 +0000541 if (Element == DIBuilder::OpPlus) {
David Blaikief2443192013-10-21 17:28:37 +0000542 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
543 addUInt(Block, dwarf::DW_FORM_udata, DV.getAddrElement(++i));
Devang Patel0e821f42011-04-12 23:21:44 +0000544 } else if (Element == DIBuilder::OpDeref) {
Eric Christopher4d250522012-05-08 18:56:00 +0000545 if (!Location.isReg())
David Blaikief2443192013-10-21 17:28:37 +0000546 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Eric Christopherc2697f82013-10-19 01:04:47 +0000547 } else
548 llvm_unreachable("unknown DIBuilder Opcode");
Devang Patel0e821f42011-04-12 23:21:44 +0000549 }
550
551 // Now attach the location information to the DIE.
David Blaikief2443192013-10-21 17:28:37 +0000552 addBlock(Die, Attribute, Block);
Devang Patel0e821f42011-04-12 23:21:44 +0000553}
554
555/* Byref variables, in Blocks, are declared by the programmer as "SomeType
556 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
557 gives the variable VarName either the struct, or a pointer to the struct, as
558 its type. This is necessary for various behind-the-scenes things the
559 compiler needs to do with by-reference variables in Blocks.
560
561 However, as far as the original *programmer* is concerned, the variable
562 should still have type 'SomeType', as originally declared.
563
564 The function getBlockByrefType dives into the __Block_byref_x_VarName
565 struct to find the original type of the variable, which is then assigned to
566 the variable's Debug Information Entry as its real type. So far, so good.
567 However now the debugger will expect the variable VarName to have the type
568 SomeType. So we need the location attribute for the variable to be an
569 expression that explains to the debugger how to navigate through the
570 pointers and struct to find the actual variable of type SomeType.
571
572 The following function does just that. We start by getting
573 the "normal" location for the variable. This will be the location
574 of either the struct __Block_byref_x_VarName or the pointer to the
575 struct __Block_byref_x_VarName.
576
577 The struct will look something like:
578
579 struct __Block_byref_x_VarName {
580 ... <various fields>
581 struct __Block_byref_x_VarName *forwarding;
582 ... <various other fields>
583 SomeType VarName;
584 ... <maybe more fields>
585 };
586
587 If we are given the struct directly (as our starting point) we
588 need to tell the debugger to:
589
590 1). Add the offset of the forwarding field.
591
592 2). Follow that pointer to get the real __Block_byref_x_VarName
593 struct to use (the real one may have been copied onto the heap).
594
595 3). Add the offset for the field VarName, to find the actual variable.
596
597 If we started with a pointer to the struct, then we need to
598 dereference that pointer first, before the other steps.
599 Translating this into DWARF ops, we will need to append the following
600 to the current location description for the variable:
601
602 DW_OP_deref -- optional, if we start with a pointer
603 DW_OP_plus_uconst <forward_fld_offset>
604 DW_OP_deref
605 DW_OP_plus_uconst <varName_fld_offset>
606
607 That is what this function does. */
608
609/// addBlockByrefAddress - Start with the address based on the location
610/// provided, and generate the DWARF information necessary to find the
611/// actual Block variable (navigating the Block struct) based on the
612/// starting location. Add the DWARF information to the die. For
613/// more information, read large comment just above here.
614///
Eric Christophera5a79422013-12-09 23:32:48 +0000615void DwarfUnit::addBlockByrefAddress(const DbgVariable &DV, DIE *Die,
616 dwarf::Attribute Attribute,
617 const MachineLocation &Location) {
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000618 DIType Ty = DV.getType();
Devang Patel0e821f42011-04-12 23:21:44 +0000619 DIType TmpTy = Ty;
Eric Christopher31b05762013-08-08 01:41:00 +0000620 uint16_t Tag = Ty.getTag();
Devang Patel0e821f42011-04-12 23:21:44 +0000621 bool isPointer = false;
622
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000623 StringRef varName = DV.getName();
Devang Patel0e821f42011-04-12 23:21:44 +0000624
625 if (Tag == dwarf::DW_TAG_pointer_type) {
David Blaikie4f6bf27a2013-11-18 23:33:32 +0000626 DIDerivedType DTy(Ty);
Manman Ren93b30902013-10-08 18:42:58 +0000627 TmpTy = resolve(DTy.getTypeDerivedFrom());
Devang Patel0e821f42011-04-12 23:21:44 +0000628 isPointer = true;
629 }
630
David Blaikie4f6bf27a2013-11-18 23:33:32 +0000631 DICompositeType blockStruct(TmpTy);
Devang Patel0e821f42011-04-12 23:21:44 +0000632
633 // Find the __forwarding field and the variable field in the __Block_byref
634 // struct.
635 DIArray Fields = blockStruct.getTypeArray();
David Blaikie4f6bf27a2013-11-18 23:33:32 +0000636 DIDerivedType varField;
637 DIDerivedType forwardingField;
Devang Patel0e821f42011-04-12 23:21:44 +0000638
639 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
David Blaikie4f6bf27a2013-11-18 23:33:32 +0000640 DIDerivedType DT(Fields.getElement(i));
Devang Patel0e821f42011-04-12 23:21:44 +0000641 StringRef fieldName = DT.getName();
642 if (fieldName == "__forwarding")
David Blaikie4f6bf27a2013-11-18 23:33:32 +0000643 forwardingField = DT;
Devang Patel0e821f42011-04-12 23:21:44 +0000644 else if (fieldName == varName)
David Blaikie4f6bf27a2013-11-18 23:33:32 +0000645 varField = DT;
Devang Patel0e821f42011-04-12 23:21:44 +0000646 }
647
648 // Get the offsets for the forwarding field and the variable field.
David Blaikie4f6bf27a2013-11-18 23:33:32 +0000649 unsigned forwardingFieldOffset = forwardingField.getOffsetInBits() >> 3;
650 unsigned varFieldOffset = varField.getOffsetInBits() >> 2;
Devang Patel0e821f42011-04-12 23:21:44 +0000651
652 // Decode the original location, and use that as the start of the byref
653 // variable's location.
Devang Patel0e821f42011-04-12 23:21:44 +0000654 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
655
Eric Christopheref9d7102012-07-04 02:02:18 +0000656 if (Location.isReg())
657 addRegisterOp(Block, Location.getReg());
658 else
659 addRegisterOffset(Block, Location.getReg(), Location.getOffset());
Devang Patel0e821f42011-04-12 23:21:44 +0000660
661 // If we started with a pointer to the __Block_byref... struct, then
662 // the first thing we need to do is dereference the pointer (DW_OP_deref).
663 if (isPointer)
David Blaikief2443192013-10-21 17:28:37 +0000664 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Devang Patel0e821f42011-04-12 23:21:44 +0000665
666 // Next add the offset for the '__forwarding' field:
667 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
668 // adding the offset if it's 0.
669 if (forwardingFieldOffset > 0) {
David Blaikief2443192013-10-21 17:28:37 +0000670 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
671 addUInt(Block, dwarf::DW_FORM_udata, forwardingFieldOffset);
Devang Patel0e821f42011-04-12 23:21:44 +0000672 }
673
674 // Now dereference the __forwarding field to get to the real __Block_byref
675 // struct: DW_OP_deref.
David Blaikief2443192013-10-21 17:28:37 +0000676 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Devang Patel0e821f42011-04-12 23:21:44 +0000677
678 // Now that we've got the real __Block_byref... struct, add the offset
679 // for the variable's field to get to the location of the actual variable:
680 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
681 if (varFieldOffset > 0) {
David Blaikief2443192013-10-21 17:28:37 +0000682 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
683 addUInt(Block, dwarf::DW_FORM_udata, varFieldOffset);
Devang Patel0e821f42011-04-12 23:21:44 +0000684 }
685
686 // Now attach the location information to the DIE.
David Blaikief2443192013-10-21 17:28:37 +0000687 addBlock(Die, Attribute, Block);
Devang Patel0e821f42011-04-12 23:21:44 +0000688}
689
Devang Patelbcd50a12011-07-20 21:57:04 +0000690/// isTypeSigned - Return true if the type is signed.
Manman Renb3388602013-10-05 01:43:03 +0000691static bool isTypeSigned(DwarfDebug *DD, DIType Ty, int *SizeInBits) {
Devang Patelbcd50a12011-07-20 21:57:04 +0000692 if (Ty.isDerivedType())
Manman Renb3388602013-10-05 01:43:03 +0000693 return isTypeSigned(DD, DD->resolve(DIDerivedType(Ty).getTypeDerivedFrom()),
694 SizeInBits);
Devang Patelbcd50a12011-07-20 21:57:04 +0000695 if (Ty.isBasicType())
Eric Christopherc2697f82013-10-19 01:04:47 +0000696 if (DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed ||
697 DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed_char) {
Devang Patelbcd50a12011-07-20 21:57:04 +0000698 *SizeInBits = Ty.getSizeInBits();
699 return true;
700 }
701 return false;
702}
703
Manman Renb3388602013-10-05 01:43:03 +0000704/// Return true if type encoding is unsigned.
705static bool isUnsignedDIType(DwarfDebug *DD, DIType Ty) {
706 DIDerivedType DTy(Ty);
707 if (DTy.isDerivedType())
708 return isUnsignedDIType(DD, DD->resolve(DTy.getTypeDerivedFrom()));
709
710 DIBasicType BTy(Ty);
711 if (BTy.isBasicType()) {
712 unsigned Encoding = BTy.getEncoding();
713 if (Encoding == dwarf::DW_ATE_unsigned ||
714 Encoding == dwarf::DW_ATE_unsigned_char ||
715 Encoding == dwarf::DW_ATE_boolean)
716 return true;
717 }
718 return false;
719}
720
721/// If this type is derived from a base type then return base type size.
Manman Renbda410f2013-10-08 18:46:58 +0000722static uint64_t getBaseTypeSize(DwarfDebug *DD, DIDerivedType Ty) {
Manman Renb3388602013-10-05 01:43:03 +0000723 unsigned Tag = Ty.getTag();
724
725 if (Tag != dwarf::DW_TAG_member && Tag != dwarf::DW_TAG_typedef &&
726 Tag != dwarf::DW_TAG_const_type && Tag != dwarf::DW_TAG_volatile_type &&
727 Tag != dwarf::DW_TAG_restrict_type)
728 return Ty.getSizeInBits();
729
730 DIType BaseType = DD->resolve(Ty.getTypeDerivedFrom());
731
732 // If this type is not derived from any type then take conservative approach.
733 if (!BaseType.isValid())
734 return Ty.getSizeInBits();
735
736 // If this is a derived type, go ahead and get the base type, unless it's a
737 // reference then it's just the size of the field. Pointer types have no need
738 // of this since they're a different type of qualification on the type.
739 if (BaseType.getTag() == dwarf::DW_TAG_reference_type ||
740 BaseType.getTag() == dwarf::DW_TAG_rvalue_reference_type)
741 return Ty.getSizeInBits();
742
743 if (BaseType.isDerivedType())
Manman Renbda410f2013-10-08 18:46:58 +0000744 return getBaseTypeSize(DD, DIDerivedType(BaseType));
Manman Renb3388602013-10-05 01:43:03 +0000745
746 return BaseType.getSizeInBits();
747}
748
Devang Patel0e821f42011-04-12 23:21:44 +0000749/// addConstantValue - Add constant value entry in variable DIE.
Eric Christophera5a79422013-12-09 23:32:48 +0000750void DwarfUnit::addConstantValue(DIE *Die, const MachineOperand &MO,
751 DIType Ty) {
David Blaikiea1e813d2013-05-10 21:52:07 +0000752 // FIXME: This is a bit conservative/simple - it emits negative values at
753 // their maximum bit width which is a bit unfortunate (& doesn't prefer
754 // udata/sdata over dataN as suggested by the DWARF spec)
Nick Lewycky654f5ce2011-10-26 22:55:33 +0000755 assert(MO.isImm() && "Invalid machine operand!");
Devang Patelbcd50a12011-07-20 21:57:04 +0000756 int SizeInBits = -1;
Manman Renb3388602013-10-05 01:43:03 +0000757 bool SignedConstant = isTypeSigned(DD, Ty, &SizeInBits);
David Blaikief2443192013-10-21 17:28:37 +0000758 dwarf::Form Form;
Devang Patelf1d04702011-05-27 18:15:52 +0000759
Eric Christopher9d1daa82013-08-27 23:49:04 +0000760 // If we're a signed constant definitely use sdata.
761 if (SignedConstant) {
762 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, MO.getImm());
763 return;
764 }
765
766 // Else use data for now unless it's larger than we can deal with.
767 switch (SizeInBits) {
768 case 8:
769 Form = dwarf::DW_FORM_data1;
770 break;
771 case 16:
772 Form = dwarf::DW_FORM_data2;
773 break;
774 case 32:
775 Form = dwarf::DW_FORM_data4;
776 break;
777 case 64:
778 Form = dwarf::DW_FORM_data8;
779 break;
780 default:
781 Form = dwarf::DW_FORM_udata;
782 addUInt(Die, dwarf::DW_AT_const_value, Form, MO.getImm());
783 return;
784 }
785 addUInt(Die, dwarf::DW_AT_const_value, Form, MO.getImm());
Devang Patel0e821f42011-04-12 23:21:44 +0000786}
787
788/// addConstantFPValue - Add constant value entry in variable DIE.
Eric Christophera5a79422013-12-09 23:32:48 +0000789void DwarfUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
Eric Christopherc2697f82013-10-19 01:04:47 +0000790 assert(MO.isFPImm() && "Invalid machine operand!");
Devang Patel0e821f42011-04-12 23:21:44 +0000791 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
792 APFloat FPImm = MO.getFPImm()->getValueAPF();
793
794 // Get the raw data form of the floating point.
795 const APInt FltVal = FPImm.bitcastToAPInt();
Eric Christopherc2697f82013-10-19 01:04:47 +0000796 const char *FltPtr = (const char *)FltVal.getRawData();
Devang Patel0e821f42011-04-12 23:21:44 +0000797
798 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
Micah Villmowcdfe20b2012-10-08 16:38:25 +0000799 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel0e821f42011-04-12 23:21:44 +0000800 int Incr = (LittleEndian ? 1 : -1);
801 int Start = (LittleEndian ? 0 : NumBytes - 1);
802 int Stop = (LittleEndian ? NumBytes : -1);
803
804 // Output the constant to DWARF one byte at a time.
805 for (; Start != Stop; Start += Incr)
Eric Christopher98b7f172013-11-11 18:52:36 +0000806 addUInt(Block, dwarf::DW_FORM_data1, (unsigned char)0xFF & FltPtr[Start]);
Devang Patel0e821f42011-04-12 23:21:44 +0000807
David Blaikief2443192013-10-21 17:28:37 +0000808 addBlock(Die, dwarf::DW_AT_const_value, Block);
Devang Patel0e821f42011-04-12 23:21:44 +0000809}
810
David Blaikiea39a76e2013-01-20 01:18:01 +0000811/// addConstantFPValue - Add constant value entry in variable DIE.
Eric Christophera5a79422013-12-09 23:32:48 +0000812void DwarfUnit::addConstantFPValue(DIE *Die, const ConstantFP *CFP) {
Eric Christopher9d1daa82013-08-27 23:49:04 +0000813 // Pass this down to addConstantValue as an unsigned bag of bits.
814 addConstantValue(Die, CFP->getValueAPF().bitcastToAPInt(), true);
David Blaikiea39a76e2013-01-20 01:18:01 +0000815}
816
Devang Patel0e821f42011-04-12 23:21:44 +0000817/// addConstantValue - Add constant value entry in variable DIE.
Eric Christophera5a79422013-12-09 23:32:48 +0000818void DwarfUnit::addConstantValue(DIE *Die, const ConstantInt *CI,
819 bool Unsigned) {
Eric Christopher78fcf4902013-07-03 01:08:30 +0000820 addConstantValue(Die, CI->getValue(), Unsigned);
David Blaikiea39a76e2013-01-20 01:18:01 +0000821}
822
823// addConstantValue - Add constant value entry in variable DIE.
Eric Christophera5a79422013-12-09 23:32:48 +0000824void DwarfUnit::addConstantValue(DIE *Die, const APInt &Val, bool Unsigned) {
David Blaikiea39a76e2013-01-20 01:18:01 +0000825 unsigned CIBitWidth = Val.getBitWidth();
Devang Patel8816bbc2011-05-28 00:39:18 +0000826 if (CIBitWidth <= 64) {
Eric Christopher9d1daa82013-08-27 23:49:04 +0000827 // If we're a signed constant definitely use sdata.
828 if (!Unsigned) {
829 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata,
830 Val.getSExtValue());
831 return;
Devang Patel8816bbc2011-05-28 00:39:18 +0000832 }
Eric Christopher9d1daa82013-08-27 23:49:04 +0000833
834 // Else use data for now unless it's larger than we can deal with.
David Blaikief2443192013-10-21 17:28:37 +0000835 dwarf::Form Form;
Eric Christopher9d1daa82013-08-27 23:49:04 +0000836 switch (CIBitWidth) {
837 case 8:
838 Form = dwarf::DW_FORM_data1;
839 break;
840 case 16:
841 Form = dwarf::DW_FORM_data2;
842 break;
843 case 32:
844 Form = dwarf::DW_FORM_data4;
845 break;
846 case 64:
847 Form = dwarf::DW_FORM_data8;
848 break;
849 default:
850 addUInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
851 Val.getZExtValue());
852 return;
853 }
854 addUInt(Die, dwarf::DW_AT_const_value, Form, Val.getZExtValue());
Eric Christopher78fcf4902013-07-03 01:08:30 +0000855 return;
Devang Patel0e821f42011-04-12 23:21:44 +0000856 }
857
858 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
859
860 // Get the raw data form of the large APInt.
NAKAMURA Takumi29ccdd82011-10-28 14:12:22 +0000861 const uint64_t *Ptr64 = Val.getRawData();
Devang Patel0e821f42011-04-12 23:21:44 +0000862
863 int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
Micah Villmowcdfe20b2012-10-08 16:38:25 +0000864 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel0e821f42011-04-12 23:21:44 +0000865
866 // Output the constant to DWARF one byte at a time.
NAKAMURA Takumi29ccdd82011-10-28 14:12:22 +0000867 for (int i = 0; i < NumBytes; i++) {
868 uint8_t c;
869 if (LittleEndian)
870 c = Ptr64[i / 8] >> (8 * (i & 7));
871 else
872 c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7));
David Blaikief2443192013-10-21 17:28:37 +0000873 addUInt(Block, dwarf::DW_FORM_data1, c);
NAKAMURA Takumi29ccdd82011-10-28 14:12:22 +0000874 }
Devang Patel0e821f42011-04-12 23:21:44 +0000875
David Blaikief2443192013-10-21 17:28:37 +0000876 addBlock(Die, dwarf::DW_AT_const_value, Block);
Devang Patel0e821f42011-04-12 23:21:44 +0000877}
878
Eric Christopher25e35092013-04-22 07:47:40 +0000879/// addTemplateParams - Add template parameters into buffer.
Eric Christophera5a79422013-12-09 23:32:48 +0000880void DwarfUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
Devang Patel0e821f42011-04-12 23:21:44 +0000881 // Add template parameters.
882 for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) {
883 DIDescriptor Element = TParams.getElement(i);
884 if (Element.isTemplateTypeParameter())
Manman Renffc9a712013-10-23 23:05:28 +0000885 constructTemplateTypeParameterDIE(Buffer,
886 DITemplateTypeParameter(Element));
Devang Patel0e821f42011-04-12 23:21:44 +0000887 else if (Element.isTemplateValueParameter())
Manman Renffc9a712013-10-23 23:05:28 +0000888 constructTemplateValueParameterDIE(Buffer,
889 DITemplateValueParameter(Element));
Devang Patel0e821f42011-04-12 23:21:44 +0000890 }
Devang Patel0e821f42011-04-12 23:21:44 +0000891}
Nick Lewycky654f5ce2011-10-26 22:55:33 +0000892
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000893/// getOrCreateContextDIE - Get context owner's DIE.
Eric Christophera5a79422013-12-09 23:32:48 +0000894DIE *DwarfUnit::getOrCreateContextDIE(DIScope Context) {
David Blaikiebd700e42013-11-14 21:24:34 +0000895 if (!Context || Context.isFile())
David Blaikie2a80e442013-12-02 22:09:48 +0000896 return getUnitDie();
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000897 if (Context.isType())
898 return getOrCreateTypeDIE(DIType(Context));
David Blaikie1dbca702013-11-14 19:37:56 +0000899 if (Context.isNameSpace())
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000900 return getOrCreateNameSpace(DINameSpace(Context));
David Blaikie1dbca702013-11-14 19:37:56 +0000901 if (Context.isSubprogram())
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000902 return getOrCreateSubprogramDIE(DISubprogram(Context));
Adrian Prantl7d828bb2013-11-15 21:05:09 +0000903 return getDIE(Context);
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000904}
905
Eric Christophera5a79422013-12-09 23:32:48 +0000906DIE *DwarfUnit::createTypeDIE(DICompositeType Ty) {
David Blaikie9d861be2013-11-26 00:15:27 +0000907 DIScope Context = resolve(Ty.getContext());
908 DIE *ContextDIE = getOrCreateContextDIE(Context);
David Blaikie409dd9c2013-11-19 23:08:21 +0000909
910 DIE *TyDIE = getDIE(Ty);
911 if (TyDIE)
912 return TyDIE;
913
914 // Create new type.
915 TyDIE = createAndAddDIE(Ty.getTag(), *ContextDIE, Ty);
916
David Blaikiefbd29eb2013-11-26 00:35:04 +0000917 constructTypeDIE(*TyDIE, Ty);
David Blaikie409dd9c2013-11-19 23:08:21 +0000918
David Blaikie9d861be2013-11-26 00:15:27 +0000919 updateAcceleratorTables(Context, Ty, TyDIE);
David Blaikie409dd9c2013-11-19 23:08:21 +0000920 return TyDIE;
921}
922
Devang Patel0e821f42011-04-12 23:21:44 +0000923/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
924/// given DIType.
Eric Christophera5a79422013-12-09 23:32:48 +0000925DIE *DwarfUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
David Blaikie32887552013-11-14 22:25:02 +0000926 if (!TyNode)
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000927 return NULL;
Manman Renf4c339e2013-10-29 22:49:29 +0000928
David Blaikie32887552013-11-14 22:25:02 +0000929 DIType Ty(TyNode);
930 assert(Ty.isType());
931
Manman Renf4c339e2013-10-29 22:49:29 +0000932 // Construct the context before querying for the existence of the DIE in case
933 // such construction creates the DIE.
David Blaikie9d861be2013-11-26 00:15:27 +0000934 DIScope Context = resolve(Ty.getContext());
935 DIE *ContextDIE = getOrCreateContextDIE(Context);
Adrian Prantl4583f7d2013-11-15 23:21:39 +0000936 assert(ContextDIE);
Manman Renf4c339e2013-10-29 22:49:29 +0000937
Eric Christophere595bae2013-10-04 17:08:38 +0000938 DIE *TyDIE = getDIE(Ty);
Devang Patel0e821f42011-04-12 23:21:44 +0000939 if (TyDIE)
940 return TyDIE;
941
942 // Create new type.
Manman Renf4c339e2013-10-29 22:49:29 +0000943 TyDIE = createAndAddDIE(Ty.getTag(), *ContextDIE, Ty);
944
Devang Patel0e821f42011-04-12 23:21:44 +0000945 if (Ty.isBasicType())
946 constructTypeDIE(*TyDIE, DIBasicType(Ty));
David Blaikie8a263cb2013-11-26 00:22:37 +0000947 else if (Ty.isCompositeType()) {
948 DICompositeType CTy(Ty);
David Blaikiecfb21152014-01-03 18:59:42 +0000949 if (GenerateDwarfTypeUnits && !Ty.isForwardDecl())
950 if (MDString *TypeId = CTy.getIdentifier()) {
David Blaikie15632ae2014-02-12 00:31:30 +0000951 DD->addDwarfTypeUnitType(getCU(), TypeId->getString(), TyDIE, CTy);
David Blaikiecfb21152014-01-03 18:59:42 +0000952 // Skip updating the accellerator tables since this is not the full type
953 return TyDIE;
954 }
David Blaikiefbd29eb2013-11-26 00:35:04 +0000955 constructTypeDIE(*TyDIE, CTy);
David Blaikie8a263cb2013-11-26 00:22:37 +0000956 } else {
Devang Patel0e821f42011-04-12 23:21:44 +0000957 assert(Ty.isDerivedType() && "Unknown kind of DIType");
958 constructTypeDIE(*TyDIE, DIDerivedType(Ty));
959 }
David Blaikie2ea848b2013-11-19 22:51:04 +0000960
David Blaikie9d861be2013-11-26 00:15:27 +0000961 updateAcceleratorTables(Context, Ty, TyDIE);
David Blaikie2ea848b2013-11-19 22:51:04 +0000962
963 return TyDIE;
964}
965
Eric Christophera5a79422013-12-09 23:32:48 +0000966void DwarfUnit::updateAcceleratorTables(DIScope Context, DIType Ty,
967 const DIE *TyDIE) {
Eric Christopher21bde872012-01-06 04:35:23 +0000968 if (!Ty.getName().empty() && !Ty.isForwardDecl()) {
969 bool IsImplementation = 0;
970 if (Ty.isCompositeType()) {
971 DICompositeType CT(Ty);
Eric Christopher8ea8e4f2012-01-06 23:03:37 +0000972 // A runtime language of 0 actually means C/C++ and that any
973 // non-negative value is some version of Objective-C/C++.
Eric Christopherc2697f82013-10-19 01:04:47 +0000974 IsImplementation = (CT.getRunTimeLang() == 0) || CT.isObjcClassComplete();
Eric Christopher21bde872012-01-06 04:35:23 +0000975 }
Eric Christophercf7289f2013-09-05 18:20:16 +0000976 unsigned Flags = IsImplementation ? dwarf::DW_FLAG_type_implementation : 0;
Eric Christopher8ea8e4f2012-01-06 23:03:37 +0000977 addAccelType(Ty.getName(), std::make_pair(TyDIE, Flags));
David Blaikie9d861be2013-11-26 00:15:27 +0000978
979 if (!Context || Context.isCompileUnit() || Context.isFile() ||
980 Context.isNameSpace())
981 GlobalTypes[getParentContextString(Context) + Ty.getName().str()] = TyDIE;
Eric Christopher21bde872012-01-06 04:35:23 +0000982 }
Devang Patel0e821f42011-04-12 23:21:44 +0000983}
984
985/// addType - Add a new type attribute to the specified entity.
Eric Christophera5a79422013-12-09 23:32:48 +0000986void DwarfUnit::addType(DIE *Entity, DIType Ty, dwarf::Attribute Attribute) {
Eric Christopher0df08e22013-08-08 07:40:37 +0000987 assert(Ty && "Trying to add a type that doesn't exist?");
Devang Patel0e821f42011-04-12 23:21:44 +0000988
989 // Check for pre-existence.
990 DIEEntry *Entry = getDIEEntry(Ty);
991 // If it exists then use the existing value.
992 if (Entry) {
Manman Ren4dbdc902013-10-31 17:54:35 +0000993 addDIEEntry(Entity, Attribute, Entry);
Devang Patel0e821f42011-04-12 23:21:44 +0000994 return;
995 }
996
997 // Construct type.
998 DIE *Buffer = getOrCreateTypeDIE(Ty);
999
1000 // Set up proxy.
1001 Entry = createDIEEntry(Buffer);
1002 insertDIEEntry(Ty, Entry);
Manman Ren4dbdc902013-10-31 17:54:35 +00001003 addDIEEntry(Entity, Attribute, Entry);
Devang Patel1cb8ab42011-05-31 23:30:30 +00001004}
1005
Eric Christopher9cd26af2013-09-20 23:22:52 +00001006// Accelerator table mutators - add each name along with its companion
1007// DIE to the proper table while ensuring that the name that we're going
1008// to reference is in the string table. We do this since the names we
1009// add may not only be identical to the names in the DIE.
Eric Christophera5a79422013-12-09 23:32:48 +00001010void DwarfUnit::addAccelName(StringRef Name, const DIE *Die) {
Paul Robinson3878a782014-01-31 20:39:19 +00001011 if (!DD->useDwarfAccelTables()) return;
Eric Christopher9cd26af2013-09-20 23:22:52 +00001012 DU->getStringPoolEntry(Name);
David Blaikie2ea848b2013-11-19 22:51:04 +00001013 std::vector<const DIE *> &DIEs = AccelNames[Name];
Eric Christopher9cd26af2013-09-20 23:22:52 +00001014 DIEs.push_back(Die);
1015}
1016
Eric Christophera5a79422013-12-09 23:32:48 +00001017void DwarfUnit::addAccelObjC(StringRef Name, const DIE *Die) {
Paul Robinson3878a782014-01-31 20:39:19 +00001018 if (!DD->useDwarfAccelTables()) return;
Eric Christopher9cd26af2013-09-20 23:22:52 +00001019 DU->getStringPoolEntry(Name);
David Blaikie2ea848b2013-11-19 22:51:04 +00001020 std::vector<const DIE *> &DIEs = AccelObjC[Name];
Eric Christopher9cd26af2013-09-20 23:22:52 +00001021 DIEs.push_back(Die);
1022}
1023
Eric Christophera5a79422013-12-09 23:32:48 +00001024void DwarfUnit::addAccelNamespace(StringRef Name, const DIE *Die) {
Paul Robinson3878a782014-01-31 20:39:19 +00001025 if (!DD->useDwarfAccelTables()) return;
Eric Christopher9cd26af2013-09-20 23:22:52 +00001026 DU->getStringPoolEntry(Name);
David Blaikie2ea848b2013-11-19 22:51:04 +00001027 std::vector<const DIE *> &DIEs = AccelNamespace[Name];
Eric Christopher9cd26af2013-09-20 23:22:52 +00001028 DIEs.push_back(Die);
1029}
1030
Eric Christophera5a79422013-12-09 23:32:48 +00001031void DwarfUnit::addAccelType(StringRef Name,
1032 std::pair<const DIE *, unsigned> Die) {
Paul Robinson3878a782014-01-31 20:39:19 +00001033 if (!DD->useDwarfAccelTables()) return;
Eric Christopher9cd26af2013-09-20 23:22:52 +00001034 DU->getStringPoolEntry(Name);
David Blaikie2ea848b2013-11-19 22:51:04 +00001035 std::vector<std::pair<const DIE *, unsigned> > &DIEs = AccelTypes[Name];
Eric Christopher9cd26af2013-09-20 23:22:52 +00001036 DIEs.push_back(Die);
1037}
1038
Eric Christopher9c58f312013-09-20 22:20:55 +00001039/// addGlobalName - Add a new global name to the compile unit.
Eric Christophera5a79422013-12-09 23:32:48 +00001040void DwarfUnit::addGlobalName(StringRef Name, DIE *Die, DIScope Context) {
Eric Christopher8dba0d52013-10-19 01:04:42 +00001041 std::string FullName = getParentContextString(Context) + Name.str();
Eric Christopher2c8b7902013-10-17 02:06:06 +00001042 GlobalNames[FullName] = Die;
Eric Christopher9c58f312013-09-20 22:20:55 +00001043}
1044
Eric Christopher2c8b7902013-10-17 02:06:06 +00001045/// getParentContextString - Walks the metadata parent chain in a language
1046/// specific manner (using the compile unit language) and returns
1047/// it as a string. This is done at the metadata level because DIEs may
1048/// not currently have been added to the parent context and walking the
1049/// DIEs looking for names is more expensive than walking the metadata.
Eric Christophera5a79422013-12-09 23:32:48 +00001050std::string DwarfUnit::getParentContextString(DIScope Context) const {
Eric Christopher2c8b7902013-10-17 02:06:06 +00001051 if (!Context)
1052 return "";
1053
1054 // FIXME: Decide whether to implement this for non-C++ languages.
1055 if (getLanguage() != dwarf::DW_LANG_C_plus_plus)
1056 return "";
1057
Eric Christopher8dba0d52013-10-19 01:04:42 +00001058 std::string CS;
Eric Christopher2c8b7902013-10-17 02:06:06 +00001059 SmallVector<DIScope, 1> Parents;
1060 while (!Context.isCompileUnit()) {
1061 Parents.push_back(Context);
1062 if (Context.getContext())
1063 Context = resolve(Context.getContext());
1064 else
1065 // Structure, etc types will have a NULL context if they're at the top
1066 // level.
1067 break;
1068 }
1069
1070 // Reverse iterate over our list to go from the outermost construct to the
1071 // innermost.
1072 for (SmallVectorImpl<DIScope>::reverse_iterator I = Parents.rbegin(),
1073 E = Parents.rend();
1074 I != E; ++I) {
1075 DIScope Ctx = *I;
1076 StringRef Name = Ctx.getName();
Eric Christopher8dba0d52013-10-19 01:04:42 +00001077 if (!Name.empty()) {
Eric Christopher2c8b7902013-10-17 02:06:06 +00001078 CS += Name;
1079 CS += "::";
1080 }
1081 }
1082 return CS;
Devang Patel0e821f42011-04-12 23:21:44 +00001083}
1084
1085/// constructTypeDIE - Construct basic type die from DIBasicType.
Eric Christophera5a79422013-12-09 23:32:48 +00001086void DwarfUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
Devang Patel0e821f42011-04-12 23:21:44 +00001087 // Get core information.
1088 StringRef Name = BTy.getName();
Devang Patel0e821f42011-04-12 23:21:44 +00001089 // Add name if not anonymous or intermediate type.
1090 if (!Name.empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +00001091 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel04d6d472011-09-14 23:13:28 +00001092
David Blaikiefac56122013-10-04 23:21:16 +00001093 // An unspecified type only has a name attribute.
1094 if (BTy.getTag() == dwarf::DW_TAG_unspecified_type)
Devang Patel04d6d472011-09-14 23:13:28 +00001095 return;
Devang Patel04d6d472011-09-14 23:13:28 +00001096
Nick Lewycky654f5ce2011-10-26 22:55:33 +00001097 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
Devang Pateld925d1a2012-02-07 23:33:58 +00001098 BTy.getEncoding());
Devang Patel04d6d472011-09-14 23:13:28 +00001099
Devang Patel0e821f42011-04-12 23:21:44 +00001100 uint64_t Size = BTy.getSizeInBits() >> 3;
David Blaikief2443192013-10-21 17:28:37 +00001101 addUInt(&Buffer, dwarf::DW_AT_byte_size, None, Size);
Devang Patel0e821f42011-04-12 23:21:44 +00001102}
1103
1104/// constructTypeDIE - Construct derived type die from DIDerivedType.
Eric Christophera5a79422013-12-09 23:32:48 +00001105void DwarfUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
Devang Patel0e821f42011-04-12 23:21:44 +00001106 // Get core information.
1107 StringRef Name = DTy.getName();
1108 uint64_t Size = DTy.getSizeInBits() >> 3;
David Blaikiefac56122013-10-04 23:21:16 +00001109 uint16_t Tag = Buffer.getTag();
Devang Patel0e821f42011-04-12 23:21:44 +00001110
1111 // Map to main type, void will not have a type.
Manman Ren93b30902013-10-08 18:42:58 +00001112 DIType FromTy = resolve(DTy.getTypeDerivedFrom());
Eric Christopher0df08e22013-08-08 07:40:37 +00001113 if (FromTy)
1114 addType(&Buffer, FromTy);
Devang Patel0e821f42011-04-12 23:21:44 +00001115
1116 // Add name if not anonymous or intermediate type.
1117 if (!Name.empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +00001118 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel0e821f42011-04-12 23:21:44 +00001119
1120 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopher85757902012-02-21 22:25:53 +00001121 if (Size && Tag != dwarf::DW_TAG_pointer_type)
David Blaikief2443192013-10-21 17:28:37 +00001122 addUInt(&Buffer, dwarf::DW_AT_byte_size, None, Size);
Devang Patel0e821f42011-04-12 23:21:44 +00001123
David Blaikie5d3249b2013-01-07 05:51:15 +00001124 if (Tag == dwarf::DW_TAG_ptr_to_member_type)
Eric Christopherc2697f82013-10-19 01:04:47 +00001125 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type,
1126 getOrCreateTypeDIE(resolve(DTy.getClassType())));
Devang Patel0e821f42011-04-12 23:21:44 +00001127 // Add source line info if available and TyDesc is not a forward declaration.
1128 if (!DTy.isForwardDecl())
1129 addSourceLine(&Buffer, DTy);
1130}
1131
1132/// constructTypeDIE - Construct type DIE from DICompositeType.
Eric Christophera5a79422013-12-09 23:32:48 +00001133void DwarfUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
David Blaikie409dd9c2013-11-19 23:08:21 +00001134 // Add name if not anonymous or intermediate type.
Devang Patel0e821f42011-04-12 23:21:44 +00001135 StringRef Name = CTy.getName();
1136
1137 uint64_t Size = CTy.getSizeInBits() >> 3;
David Blaikiefac56122013-10-04 23:21:16 +00001138 uint16_t Tag = Buffer.getTag();
Devang Patel0e821f42011-04-12 23:21:44 +00001139
1140 switch (Tag) {
Devang Patel0e821f42011-04-12 23:21:44 +00001141 case dwarf::DW_TAG_array_type:
Eric Christopherdf9955d2013-11-11 18:52:31 +00001142 constructArrayTypeDIE(Buffer, CTy);
Devang Patel0e821f42011-04-12 23:21:44 +00001143 break;
Eric Christopheraeb105f2013-11-11 18:52:39 +00001144 case dwarf::DW_TAG_enumeration_type:
1145 constructEnumTypeDIE(Buffer, CTy);
1146 break;
Devang Patel0e821f42011-04-12 23:21:44 +00001147 case dwarf::DW_TAG_subroutine_type: {
Eric Christopher0df08e22013-08-08 07:40:37 +00001148 // Add return type. A void return won't have a type.
Devang Patel0e821f42011-04-12 23:21:44 +00001149 DIArray Elements = CTy.getTypeArray();
David Blaikie4f6bf27a2013-11-18 23:33:32 +00001150 DIType RTy(Elements.getElement(0));
Eric Christopher0df08e22013-08-08 07:40:37 +00001151 if (RTy)
David Blaikie4f6bf27a2013-11-18 23:33:32 +00001152 addType(&Buffer, RTy);
Devang Patel0e821f42011-04-12 23:21:44 +00001153
1154 bool isPrototyped = true;
1155 // Add arguments.
1156 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
1157 DIDescriptor Ty = Elements.getElement(i);
1158 if (Ty.isUnspecifiedParameter()) {
Manman Renb987e512013-10-29 00:53:03 +00001159 createAndAddDIE(dwarf::DW_TAG_unspecified_parameters, Buffer);
Devang Patel0e821f42011-04-12 23:21:44 +00001160 isPrototyped = false;
1161 } else {
Manman Renb987e512013-10-29 00:53:03 +00001162 DIE *Arg = createAndAddDIE(dwarf::DW_TAG_formal_parameter, Buffer);
Devang Patel0e821f42011-04-12 23:21:44 +00001163 addType(Arg, DIType(Ty));
David Blaikie9a7a7a92013-01-29 19:35:24 +00001164 if (DIType(Ty).isArtificial())
1165 addFlag(Arg, dwarf::DW_AT_artificial);
Devang Patel0e821f42011-04-12 23:21:44 +00001166 }
1167 }
Eric Christopher5cd2a9d2012-02-22 08:46:21 +00001168 // Add prototype flag if we're dealing with a C language and the
1169 // function has been prototyped.
David Blaikiecb8e4352013-11-15 23:50:53 +00001170 uint16_t Language = getLanguage();
Eric Christopher5cd2a9d2012-02-22 08:46:21 +00001171 if (isPrototyped &&
Eric Christopherc2697f82013-10-19 01:04:47 +00001172 (Language == dwarf::DW_LANG_C89 || Language == dwarf::DW_LANG_C99 ||
Eric Christopherd42b92f2012-05-22 18:45:24 +00001173 Language == dwarf::DW_LANG_ObjC))
Eric Christopherbb69a272012-08-24 01:14:27 +00001174 addFlag(&Buffer, dwarf::DW_AT_prototyped);
Adrian Prantl99c7af22013-12-18 21:48:19 +00001175
1176 if (CTy.isLValueReference())
1177 addFlag(&Buffer, dwarf::DW_AT_reference);
1178
1179 if (CTy.isRValueReference())
1180 addFlag(&Buffer, dwarf::DW_AT_rvalue_reference);
Eric Christopherc2697f82013-10-19 01:04:47 +00001181 } break;
Devang Patel0e821f42011-04-12 23:21:44 +00001182 case dwarf::DW_TAG_structure_type:
1183 case dwarf::DW_TAG_union_type:
1184 case dwarf::DW_TAG_class_type: {
Devang Patel0e821f42011-04-12 23:21:44 +00001185 // Add elements to structure type.
David Blaikiea1ae0e62013-08-01 20:30:22 +00001186 DIArray Elements = CTy.getTypeArray();
1187 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
Devang Patel0e821f42011-04-12 23:21:44 +00001188 DIDescriptor Element = Elements.getElement(i);
1189 DIE *ElemDie = NULL;
Adrian Prantlef129fb2014-01-18 02:12:00 +00001190 if (Element.isSubprogram())
1191 ElemDie = getOrCreateSubprogramDIE(DISubprogram(Element));
1192 else if (Element.isDerivedType()) {
Eric Christopherd42b92f2012-05-22 18:45:24 +00001193 DIDerivedType DDTy(Element);
1194 if (DDTy.getTag() == dwarf::DW_TAG_friend) {
Manman Renb987e512013-10-29 00:53:03 +00001195 ElemDie = createAndAddDIE(dwarf::DW_TAG_friend, Buffer);
Manman Ren93b30902013-10-08 18:42:58 +00001196 addType(ElemDie, resolve(DDTy.getTypeDerivedFrom()),
Manman Renb3388602013-10-05 01:43:03 +00001197 dwarf::DW_AT_friend);
Manman Renc6b63922013-10-14 20:33:57 +00001198 } else if (DDTy.isStaticMember()) {
Manman Ren57e6ff72013-10-23 22:57:12 +00001199 getOrCreateStaticMemberDIE(DDTy);
Manman Renc6b63922013-10-14 20:33:57 +00001200 } else {
Manman Ren230ec862013-10-23 23:00:44 +00001201 constructMemberDIE(Buffer, DDTy);
Manman Renc6b63922013-10-14 20:33:57 +00001202 }
Eric Christopher7285c7d2012-03-28 07:34:31 +00001203 } else if (Element.isObjCProperty()) {
Devang Pateld925d1a2012-02-07 23:33:58 +00001204 DIObjCProperty Property(Element);
Manman Renb987e512013-10-29 00:53:03 +00001205 ElemDie = createAndAddDIE(Property.getTag(), Buffer);
Devang Pateld925d1a2012-02-07 23:33:58 +00001206 StringRef PropertyName = Property.getObjCPropertyName();
1207 addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
Eric Christopher4c960562014-01-23 19:16:28 +00001208 if (Property.getType())
1209 addType(ElemDie, Property.getType());
Eric Christopherd42b92f2012-05-22 18:45:24 +00001210 addSourceLine(ElemDie, Property);
Devang Pateld925d1a2012-02-07 23:33:58 +00001211 StringRef GetterName = Property.getObjCPropertyGetterName();
1212 if (!GetterName.empty())
1213 addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
1214 StringRef SetterName = Property.getObjCPropertySetterName();
1215 if (!SetterName.empty())
1216 addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
1217 unsigned PropertyAttributes = 0;
Devang Patel403e8192012-02-04 01:30:32 +00001218 if (Property.isReadOnlyObjCProperty())
1219 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
1220 if (Property.isReadWriteObjCProperty())
1221 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
1222 if (Property.isAssignObjCProperty())
1223 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
1224 if (Property.isRetainObjCProperty())
1225 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
1226 if (Property.isCopyObjCProperty())
1227 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
1228 if (Property.isNonAtomicObjCProperty())
1229 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
1230 if (PropertyAttributes)
David Blaikief2443192013-10-21 17:28:37 +00001231 addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, None,
Eric Christopherc2697f82013-10-19 01:04:47 +00001232 PropertyAttributes);
Devang Patel44882172012-02-06 17:49:43 +00001233
Devang Pateld925d1a2012-02-07 23:33:58 +00001234 DIEEntry *Entry = getDIEEntry(Element);
1235 if (!Entry) {
1236 Entry = createDIEEntry(ElemDie);
1237 insertDIEEntry(Element, Entry);
1238 }
Devang Patel403e8192012-02-04 01:30:32 +00001239 } else
Devang Patel0e821f42011-04-12 23:21:44 +00001240 continue;
Devang Patel0e821f42011-04-12 23:21:44 +00001241 }
1242
1243 if (CTy.isAppleBlockExtension())
Eric Christopherbb69a272012-08-24 01:14:27 +00001244 addFlag(&Buffer, dwarf::DW_AT_APPLE_block);
Devang Patel0e821f42011-04-12 23:21:44 +00001245
Eric Christopher9e429ae2013-10-05 00:27:02 +00001246 DICompositeType ContainingType(resolve(CTy.getContainingType()));
David Blaikie4f6bf27a2013-11-18 23:33:32 +00001247 if (ContainingType)
Manman Ren4c4b69c2013-10-11 23:58:05 +00001248 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type,
David Blaikie4f6bf27a2013-11-18 23:33:32 +00001249 getOrCreateTypeDIE(ContainingType));
Devang Patel0e821f42011-04-12 23:21:44 +00001250
Devang Patel12419ae2011-05-12 21:29:42 +00001251 if (CTy.isObjcClassComplete())
Eric Christopherbb69a272012-08-24 01:14:27 +00001252 addFlag(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type);
Devang Patel2409e782011-05-12 19:06:16 +00001253
Eric Christopherda011dd2011-12-16 23:42:42 +00001254 // Add template parameters to a class, structure or union types.
1255 // FIXME: The support isn't in the metadata for this yet.
1256 if (Tag == dwarf::DW_TAG_class_type ||
Eric Christopherc2697f82013-10-19 01:04:47 +00001257 Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type)
Devang Patel0e821f42011-04-12 23:21:44 +00001258 addTemplateParams(Buffer, CTy.getTemplateParams());
1259
1260 break;
1261 }
1262 default:
1263 break;
1264 }
1265
1266 // Add name if not anonymous or intermediate type.
1267 if (!Name.empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +00001268 addString(&Buffer, dwarf::DW_AT_name, Name);
Devang Patel0e821f42011-04-12 23:21:44 +00001269
Eric Christopher775cbd22012-05-22 18:45:18 +00001270 if (Tag == dwarf::DW_TAG_enumeration_type ||
Eric Christopherc2697f82013-10-19 01:04:47 +00001271 Tag == dwarf::DW_TAG_class_type || Tag == dwarf::DW_TAG_structure_type ||
Eric Christopher775cbd22012-05-22 18:45:18 +00001272 Tag == dwarf::DW_TAG_union_type) {
Devang Patel0e821f42011-04-12 23:21:44 +00001273 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopher1cf33382012-06-01 00:22:32 +00001274 // TODO: Do we care about size for enum forward declarations?
Devang Patel0e821f42011-04-12 23:21:44 +00001275 if (Size)
David Blaikief2443192013-10-21 17:28:37 +00001276 addUInt(&Buffer, dwarf::DW_AT_byte_size, None, Size);
Eric Christopher1cf33382012-06-01 00:22:32 +00001277 else if (!CTy.isForwardDecl())
Devang Patel0e821f42011-04-12 23:21:44 +00001278 // Add zero size if it is not a forward declaration.
David Blaikief2443192013-10-21 17:28:37 +00001279 addUInt(&Buffer, dwarf::DW_AT_byte_size, None, 0);
Eric Christopher1cf33382012-06-01 00:22:32 +00001280
1281 // If we're a forward decl, say so.
1282 if (CTy.isForwardDecl())
Eric Christopherbb69a272012-08-24 01:14:27 +00001283 addFlag(&Buffer, dwarf::DW_AT_declaration);
Devang Patel0e821f42011-04-12 23:21:44 +00001284
1285 // Add source line info if available.
1286 if (!CTy.isForwardDecl())
1287 addSourceLine(&Buffer, CTy);
Eric Christopher54cf8ff2012-03-07 00:15:19 +00001288
1289 // No harm in adding the runtime language to the declaration.
1290 unsigned RLang = CTy.getRunTimeLang();
1291 if (RLang)
Eric Christopherc2697f82013-10-19 01:04:47 +00001292 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class, dwarf::DW_FORM_data1,
1293 RLang);
Devang Patel0e821f42011-04-12 23:21:44 +00001294 }
1295}
1296
Manman Renffc9a712013-10-23 23:05:28 +00001297/// constructTemplateTypeParameterDIE - Construct new DIE for the given
1298/// DITemplateTypeParameter.
Eric Christophera5a79422013-12-09 23:32:48 +00001299void DwarfUnit::constructTemplateTypeParameterDIE(DIE &Buffer,
1300 DITemplateTypeParameter TP) {
Manman Renb987e512013-10-29 00:53:03 +00001301 DIE *ParamDIE =
1302 createAndAddDIE(dwarf::DW_TAG_template_type_parameter, Buffer);
Eric Christopher056b6472013-08-08 08:09:43 +00001303 // Add the type if it exists, it could be void and therefore no type.
1304 if (TP.getType())
Manman Ren88b0f942013-10-09 19:46:28 +00001305 addType(ParamDIE, resolve(TP.getType()));
David Blaikie2b380232013-06-22 18:59:11 +00001306 if (!TP.getName().empty())
1307 addString(ParamDIE, dwarf::DW_AT_name, TP.getName());
Devang Patel0e821f42011-04-12 23:21:44 +00001308}
1309
Manman Renffc9a712013-10-23 23:05:28 +00001310/// constructTemplateValueParameterDIE - Construct new DIE for the given
1311/// DITemplateValueParameter.
Eric Christophera5a79422013-12-09 23:32:48 +00001312void
1313DwarfUnit::constructTemplateValueParameterDIE(DIE &Buffer,
David Blaikie319a05f2013-12-02 19:33:10 +00001314 DITemplateValueParameter VP) {
Manman Renb987e512013-10-29 00:53:03 +00001315 DIE *ParamDIE = createAndAddDIE(VP.getTag(), Buffer);
Eric Christopher0df08e22013-08-08 07:40:37 +00001316
1317 // Add the type if there is one, template template and template parameter
1318 // packs will not have a type.
Eric Christopher691281b2013-10-21 17:48:51 +00001319 if (VP.getTag() == dwarf::DW_TAG_template_value_parameter)
Manman Ren88b0f942013-10-09 19:46:28 +00001320 addType(ParamDIE, resolve(VP.getType()));
Eric Christopherafb2c412013-08-08 07:40:31 +00001321 if (!VP.getName().empty())
1322 addString(ParamDIE, dwarf::DW_AT_name, VP.getName());
1323 if (Value *Val = VP.getValue()) {
David Blaikiea1e813d2013-05-10 21:52:07 +00001324 if (ConstantInt *CI = dyn_cast<ConstantInt>(Val))
Manman Ren88b0f942013-10-09 19:46:28 +00001325 addConstantValue(ParamDIE, CI,
1326 isUnsignedDIType(DD, resolve(VP.getType())));
David Blaikiea1e813d2013-05-10 21:52:07 +00001327 else if (GlobalValue *GV = dyn_cast<GlobalValue>(Val)) {
1328 // For declaration non-type template parameters (such as global values and
1329 // functions)
1330 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Rafael Espindola79858aa2013-10-29 17:07:16 +00001331 addOpAddress(Block, Asm->getSymbol(GV));
David Blaikiea1e813d2013-05-10 21:52:07 +00001332 // Emit DW_OP_stack_value to use the address as the immediate value of the
1333 // parameter, rather than a pointer to it.
David Blaikief2443192013-10-21 17:28:37 +00001334 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value);
1335 addBlock(ParamDIE, dwarf::DW_AT_location, Block);
Eric Christopherafb2c412013-08-08 07:40:31 +00001336 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_template_param) {
David Blaikie2b380232013-06-22 18:59:11 +00001337 assert(isa<MDString>(Val));
1338 addString(ParamDIE, dwarf::DW_AT_GNU_template_name,
1339 cast<MDString>(Val)->getString());
Eric Christopherafb2c412013-08-08 07:40:31 +00001340 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_parameter_pack) {
David Blaikie2b380232013-06-22 18:59:11 +00001341 assert(isa<MDNode>(Val));
1342 DIArray A(cast<MDNode>(Val));
1343 addTemplateParams(*ParamDIE, A);
David Blaikiea1e813d2013-05-10 21:52:07 +00001344 }
1345 }
Devang Patel0e821f42011-04-12 23:21:44 +00001346}
1347
Devang Patel17b53272011-05-06 16:57:54 +00001348/// getOrCreateNameSpace - Create a DIE for DINameSpace.
Eric Christophera5a79422013-12-09 23:32:48 +00001349DIE *DwarfUnit::getOrCreateNameSpace(DINameSpace NS) {
Manman Renf6b936b2013-10-29 05:49:41 +00001350 // Construct the context before querying for the existence of the DIE in case
1351 // such construction creates the DIE.
1352 DIE *ContextDIE = getOrCreateContextDIE(NS.getContext());
Manman Renf6b936b2013-10-29 05:49:41 +00001353
Devang Patel17b53272011-05-06 16:57:54 +00001354 DIE *NDie = getDIE(NS);
1355 if (NDie)
1356 return NDie;
Manman Renf6b936b2013-10-29 05:49:41 +00001357 NDie = createAndAddDIE(dwarf::DW_TAG_namespace, *ContextDIE, NS);
1358
Eric Christopher4996c702011-11-07 09:24:32 +00001359 if (!NS.getName().empty()) {
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +00001360 addString(NDie, dwarf::DW_AT_name, NS.getName());
Eric Christopher4996c702011-11-07 09:24:32 +00001361 addAccelNamespace(NS.getName(), NDie);
Eric Christopher2c8b7902013-10-17 02:06:06 +00001362 addGlobalName(NS.getName(), NDie, NS.getContext());
Eric Christopher4996c702011-11-07 09:24:32 +00001363 } else
1364 addAccelNamespace("(anonymous namespace)", NDie);
Devang Patel17b53272011-05-06 16:57:54 +00001365 addSourceLine(NDie, NS);
Devang Patel17b53272011-05-06 16:57:54 +00001366 return NDie;
1367}
1368
Devang Patel89543712011-08-15 17:24:54 +00001369/// getOrCreateSubprogramDIE - Create new DIE using SP.
Eric Christophera5a79422013-12-09 23:32:48 +00001370DIE *DwarfUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
David Blaikie309ffe42013-10-04 01:39:59 +00001371 // Construct the context before querying for the existence of the DIE in case
1372 // such construction creates the DIE (as is the case for member function
1373 // declarations).
Manman Renc50fa112013-10-10 18:40:01 +00001374 DIE *ContextDIE = getOrCreateContextDIE(resolve(SP.getContext()));
David Blaikie309ffe42013-10-04 01:39:59 +00001375
Eric Christophere595bae2013-10-04 17:08:38 +00001376 DIE *SPDie = getDIE(SP);
Devang Patel89543712011-08-15 17:24:54 +00001377 if (SPDie)
1378 return SPDie;
1379
Manman Ren73d697c2013-10-29 00:58:04 +00001380 DISubprogram SPDecl = SP.getFunctionDeclaration();
1381 if (SPDecl.isSubprogram())
1382 // Add subprogram definitions to the CU die directly.
David Blaikie2a80e442013-12-02 22:09:48 +00001383 ContextDIE = UnitDie.get();
Peter Collingbourne4d358b52012-05-27 18:36:44 +00001384
1385 // DW_TAG_inlined_subroutine may refer to this DIE.
Manman Ren73d697c2013-10-29 00:58:04 +00001386 SPDie = createAndAddDIE(dwarf::DW_TAG_subprogram, *ContextDIE, SP);
Peter Collingbourne4d358b52012-05-27 18:36:44 +00001387
Rafael Espindola79278362011-11-10 22:34:29 +00001388 DIE *DeclDie = NULL;
Manman Renb9512a72013-10-23 22:12:26 +00001389 if (SPDecl.isSubprogram())
Rafael Espindola79278362011-11-10 22:34:29 +00001390 DeclDie = getOrCreateSubprogramDIE(SPDecl);
Rafael Espindola79278362011-11-10 22:34:29 +00001391
Devang Patel89543712011-08-15 17:24:54 +00001392 // Add function template parameters.
1393 addTemplateParams(*SPDie, SP.getTemplateParams());
1394
Devang Patel89543712011-08-15 17:24:54 +00001395 // If this DIE is going to refer declaration info using AT_specification
Eric Christopherf20ff972013-05-09 00:42:33 +00001396 // then there is no need to add other attributes.
Rafael Espindola79278362011-11-10 22:34:29 +00001397 if (DeclDie) {
1398 // Refer function declaration directly.
Manman Ren4c4b69c2013-10-11 23:58:05 +00001399 addDIEEntry(SPDie, dwarf::DW_AT_specification, DeclDie);
Rafael Espindola79278362011-11-10 22:34:29 +00001400
Devang Patel89543712011-08-15 17:24:54 +00001401 return SPDie;
Rafael Espindola79278362011-11-10 22:34:29 +00001402 }
Devang Patel89543712011-08-15 17:24:54 +00001403
Eric Christopheracb71152012-08-23 22:52:55 +00001404 // Add the linkage name if we have one.
Michael Gottesmanc89466f2013-09-04 04:39:38 +00001405 StringRef LinkageName = SP.getLinkageName();
1406 if (!LinkageName.empty())
Eric Christopheracb71152012-08-23 22:52:55 +00001407 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c275642013-06-01 17:51:14 +00001408 GlobalValue::getRealLinkageName(LinkageName));
Eric Christopheracb71152012-08-23 22:52:55 +00001409
Devang Patel89543712011-08-15 17:24:54 +00001410 // Constructors and operators for anonymous aggregates do not have names.
1411 if (!SP.getName().empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +00001412 addString(SPDie, dwarf::DW_AT_name, SP.getName());
Devang Patel89543712011-08-15 17:24:54 +00001413
1414 addSourceLine(SPDie, SP);
1415
Eric Christopher5cd2a9d2012-02-22 08:46:21 +00001416 // Add the prototype if we have a prototype and we have a C like
1417 // language.
David Blaikiecb8e4352013-11-15 23:50:53 +00001418 uint16_t Language = getLanguage();
Eric Christopher5cd2a9d2012-02-22 08:46:21 +00001419 if (SP.isPrototyped() &&
Eric Christopherc2697f82013-10-19 01:04:47 +00001420 (Language == dwarf::DW_LANG_C89 || Language == dwarf::DW_LANG_C99 ||
Eric Christopher5cd2a9d2012-02-22 08:46:21 +00001421 Language == dwarf::DW_LANG_ObjC))
Eric Christopherbb69a272012-08-24 01:14:27 +00001422 addFlag(SPDie, dwarf::DW_AT_prototyped);
Devang Patel89543712011-08-15 17:24:54 +00001423
Devang Patel89543712011-08-15 17:24:54 +00001424 DICompositeType SPTy = SP.getType();
David Blaikie5174c842013-05-22 23:22:18 +00001425 assert(SPTy.getTag() == dwarf::DW_TAG_subroutine_type &&
1426 "the type of a subprogram should be a subroutine");
Devang Patel89543712011-08-15 17:24:54 +00001427
David Blaikie5174c842013-05-22 23:22:18 +00001428 DIArray Args = SPTy.getTypeArray();
Eric Christopher691281b2013-10-21 17:48:51 +00001429 // Add a return type. If this is a type like a C/C++ void type we don't add a
1430 // return type.
Eric Christopher0df08e22013-08-08 07:40:37 +00001431 if (Args.getElement(0))
1432 addType(SPDie, DIType(Args.getElement(0)));
Devang Patel89543712011-08-15 17:24:54 +00001433
1434 unsigned VK = SP.getVirtuality();
1435 if (VK) {
Nick Lewyckycfde1a22011-12-14 00:56:07 +00001436 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
Devang Patel89543712011-08-15 17:24:54 +00001437 DIEBlock *Block = getDIEBlock();
David Blaikief2443192013-10-21 17:28:37 +00001438 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1439 addUInt(Block, dwarf::DW_FORM_udata, SP.getVirtualIndex());
1440 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, Block);
Eric Christopher98b7f172013-11-11 18:52:36 +00001441 ContainingTypeMap.insert(
1442 std::make_pair(SPDie, resolve(SP.getContainingType())));
Devang Patel89543712011-08-15 17:24:54 +00001443 }
1444
1445 if (!SP.isDefinition()) {
Eric Christopherbb69a272012-08-24 01:14:27 +00001446 addFlag(SPDie, dwarf::DW_AT_declaration);
Eric Christopher92331fd2012-11-21 00:34:38 +00001447
Devang Patel89543712011-08-15 17:24:54 +00001448 // Add arguments. Do not add arguments for subprogram definition. They will
1449 // be handled while processing variables.
Eric Christopherc2697f82013-10-19 01:04:47 +00001450 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
Manman Renb987e512013-10-29 00:53:03 +00001451 DIE *Arg = createAndAddDIE(dwarf::DW_TAG_formal_parameter, *SPDie);
David Blaikie4f6bf27a2013-11-18 23:33:32 +00001452 DIType ATy(Args.getElement(i));
David Blaikie5174c842013-05-22 23:22:18 +00001453 addType(Arg, ATy);
1454 if (ATy.isArtificial())
1455 addFlag(Arg, dwarf::DW_AT_artificial);
David Blaikie5174c842013-05-22 23:22:18 +00001456 }
Devang Patel89543712011-08-15 17:24:54 +00001457 }
1458
1459 if (SP.isArtificial())
Eric Christopherbb69a272012-08-24 01:14:27 +00001460 addFlag(SPDie, dwarf::DW_AT_artificial);
Devang Patel89543712011-08-15 17:24:54 +00001461
1462 if (!SP.isLocalToUnit())
Eric Christopherbb69a272012-08-24 01:14:27 +00001463 addFlag(SPDie, dwarf::DW_AT_external);
Devang Patel89543712011-08-15 17:24:54 +00001464
1465 if (SP.isOptimized())
Eric Christopherbb69a272012-08-24 01:14:27 +00001466 addFlag(SPDie, dwarf::DW_AT_APPLE_optimized);
Devang Patel89543712011-08-15 17:24:54 +00001467
1468 if (unsigned isa = Asm->getISAEncoding()) {
1469 addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1470 }
1471
Adrian Prantl99c7af22013-12-18 21:48:19 +00001472 if (SP.isLValueReference())
1473 addFlag(SPDie, dwarf::DW_AT_reference);
1474
1475 if (SP.isRValueReference())
1476 addFlag(SPDie, dwarf::DW_AT_rvalue_reference);
1477
Adrian Prantlef129fb2014-01-18 02:12:00 +00001478 if (SP.isProtected())
1479 addUInt(SPDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1480 dwarf::DW_ACCESS_protected);
1481 else if (SP.isPrivate())
1482 addUInt(SPDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1483 dwarf::DW_ACCESS_private);
1484 else
1485 addUInt(SPDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1486 dwarf::DW_ACCESS_public);
1487
1488 if (SP.isExplicit())
1489 addFlag(SPDie, dwarf::DW_AT_explicit);
1490
Devang Patel89543712011-08-15 17:24:54 +00001491 return SPDie;
1492}
1493
Devang Pateldfd6ec32011-08-15 17:57:41 +00001494// Return const expression if value is a GEP to access merged global
1495// constant. e.g.
1496// i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
1497static const ConstantExpr *getMergedGlobalExpr(const Value *V) {
1498 const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
1499 if (!CE || CE->getNumOperands() != 3 ||
1500 CE->getOpcode() != Instruction::GetElementPtr)
1501 return NULL;
1502
1503 // First operand points to a global struct.
1504 Value *Ptr = CE->getOperand(0);
1505 if (!isa<GlobalValue>(Ptr) ||
1506 !isa<StructType>(cast<PointerType>(Ptr->getType())->getElementType()))
1507 return NULL;
1508
1509 // Second operand is zero.
1510 const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
1511 if (!CI || !CI->isZero())
1512 return NULL;
1513
1514 // Third operand is offset.
1515 if (!isa<ConstantInt>(CE->getOperand(2)))
1516 return NULL;
1517
1518 return CE;
1519}
1520
1521/// createGlobalVariableDIE - create global variable DIE.
Eric Christopher4287a492013-12-09 23:57:44 +00001522void DwarfCompileUnit::createGlobalVariableDIE(DIGlobalVariable GV) {
Devang Pateldfd6ec32011-08-15 17:57:41 +00001523 // Check for pre-existence.
David Blaikie2ad00162013-11-15 23:09:13 +00001524 if (getDIE(GV))
Devang Pateldfd6ec32011-08-15 17:57:41 +00001525 return;
1526
David Blaikie5e390e42014-02-04 01:23:52 +00001527 assert(GV.isGlobalVariable());
Devang Patel0ecbcbd2011-08-18 23:17:55 +00001528
Eric Christopher08f7c8f2013-10-04 23:49:26 +00001529 DIScope GVContext = GV.getContext();
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001530 DIType GTy = GV.getType();
1531
1532 // If this is a static data member definition, some attributes belong
1533 // to the declaration DIE.
1534 DIE *VariableDIE = NULL;
Manman Rene697d3c2013-02-01 23:54:37 +00001535 bool IsStaticMember = false;
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001536 DIDerivedType SDMDecl = GV.getStaticDataMemberDeclaration();
1537 if (SDMDecl.Verify()) {
1538 assert(SDMDecl.isStaticMember() && "Expected static member decl");
1539 // We need the declaration DIE that is in the static member's class.
Manman Renc6b63922013-10-14 20:33:57 +00001540 VariableDIE = getOrCreateStaticMemberDIE(SDMDecl);
Manman Rene697d3c2013-02-01 23:54:37 +00001541 IsStaticMember = true;
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001542 }
1543
1544 // If this is not a static data member definition, create the variable
1545 // DIE and add the initial set of attributes to it.
1546 if (!VariableDIE) {
Manman Renf6b936b2013-10-29 05:49:41 +00001547 // Construct the context before querying for the existence of the DIE in
1548 // case such construction creates the DIE.
1549 DIE *ContextDIE = getOrCreateContextDIE(GVContext);
Manman Renf6b936b2013-10-29 05:49:41 +00001550
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001551 // Add to map.
David Blaikie52c50202013-11-16 00:29:01 +00001552 VariableDIE = createAndAddDIE(GV.getTag(), *ContextDIE, GV);
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001553
1554 // Add name and type.
1555 addString(VariableDIE, dwarf::DW_AT_name, GV.getDisplayName());
1556 addType(VariableDIE, GTy);
1557
1558 // Add scoping info.
Eric Christopherd2b497b2013-10-16 01:37:49 +00001559 if (!GV.isLocalToUnit())
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001560 addFlag(VariableDIE, dwarf::DW_AT_external);
1561
1562 // Add line number info.
1563 addSourceLine(VariableDIE, GV);
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001564 }
1565
Devang Pateldfd6ec32011-08-15 17:57:41 +00001566 // Add location.
Eric Christopher4996c702011-11-07 09:24:32 +00001567 bool addToAccelTable = false;
Eric Christopher0a917b72011-11-11 03:16:32 +00001568 DIE *VariableSpecDIE = NULL;
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001569 bool isGlobalVariable = GV.getGlobal() != NULL;
Devang Pateldfd6ec32011-08-15 17:57:41 +00001570 if (isGlobalVariable) {
Eric Christopher4996c702011-11-07 09:24:32 +00001571 addToAccelTable = true;
Devang Pateldfd6ec32011-08-15 17:57:41 +00001572 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Rafael Espindola79858aa2013-10-29 17:07:16 +00001573 const MCSymbol *Sym = Asm->getSymbol(GV.getGlobal());
David Blaikief2694972013-06-28 20:05:11 +00001574 if (GV.getGlobal()->isThreadLocal()) {
1575 // FIXME: Make this work with -gsplit-dwarf.
1576 unsigned PointerSize = Asm->getDataLayout().getPointerSize();
1577 assert((PointerSize == 4 || PointerSize == 8) &&
1578 "Add support for other sizes if necessary");
Ulrich Weigand2b6fc8d2013-07-02 18:47:09 +00001579 const MCExpr *Expr =
David Blaikie8466ca82013-07-01 23:55:52 +00001580 Asm->getObjFileLowering().getDebugThreadLocalSymbol(Sym);
David Blaikief2694972013-06-28 20:05:11 +00001581 // Based on GCC's support for TLS:
David Blaikie8466ca82013-07-01 23:55:52 +00001582 if (!DD->useSplitDwarf()) {
1583 // 1) Start with a constNu of the appropriate pointer size
David Blaikief2443192013-10-21 17:28:37 +00001584 addUInt(Block, dwarf::DW_FORM_data1,
David Blaikie8466ca82013-07-01 23:55:52 +00001585 PointerSize == 4 ? dwarf::DW_OP_const4u : dwarf::DW_OP_const8u);
Richard Mitton0aafb582013-10-07 18:39:18 +00001586 // 2) containing the (relocated) offset of the TLS variable
1587 // within the module's TLS block.
David Blaikief2443192013-10-21 17:28:37 +00001588 addExpr(Block, dwarf::DW_FORM_udata, Expr);
David Blaikie8466ca82013-07-01 23:55:52 +00001589 } else {
David Blaikief2443192013-10-21 17:28:37 +00001590 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_const_index);
1591 addUInt(Block, dwarf::DW_FORM_udata, DU->getAddrPoolIndex(Expr));
David Blaikie8466ca82013-07-01 23:55:52 +00001592 }
Richard Mitton0aafb582013-10-07 18:39:18 +00001593 // 3) followed by a custom OP to make the debugger do a TLS lookup.
David Blaikief2443192013-10-21 17:28:37 +00001594 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_push_tls_address);
David Blaikiebc7e0d42013-11-27 23:53:52 +00001595 } else {
1596 DD->addArangeLabel(SymbolCU(this, Sym));
David Blaikief2694972013-06-28 20:05:11 +00001597 addOpAddress(Block, Sym);
David Blaikiebc7e0d42013-11-27 23:53:52 +00001598 }
Devang Pateldfd6ec32011-08-15 17:57:41 +00001599 // Do not create specification DIE if context is either compile unit
1600 // or a subprogram.
Devang Patel5e6b65c2011-09-21 23:41:11 +00001601 if (GVContext && GV.isDefinition() && !GVContext.isCompileUnit() &&
Manman Ren3eb9dff2013-09-09 19:05:21 +00001602 !GVContext.isFile() && !DD->isSubprogramContext(GVContext)) {
Devang Pateldfd6ec32011-08-15 17:57:41 +00001603 // Create specification DIE.
David Blaikie2a80e442013-12-02 22:09:48 +00001604 VariableSpecDIE = createAndAddDIE(dwarf::DW_TAG_variable, *UnitDie);
Manman Ren4c4b69c2013-10-11 23:58:05 +00001605 addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification, VariableDIE);
David Blaikief2443192013-10-21 17:28:37 +00001606 addBlock(VariableSpecDIE, dwarf::DW_AT_location, Block);
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001607 // A static member's declaration is already flagged as such.
1608 if (!SDMDecl.Verify())
1609 addFlag(VariableDIE, dwarf::DW_AT_declaration);
Devang Pateldfd6ec32011-08-15 17:57:41 +00001610 } else {
David Blaikief2443192013-10-21 17:28:37 +00001611 addBlock(VariableDIE, dwarf::DW_AT_location, Block);
Eric Christopher4996c702011-11-07 09:24:32 +00001612 }
Michael Gottesmanc89466f2013-09-04 04:39:38 +00001613 // Add the linkage name.
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001614 StringRef LinkageName = GV.getLinkageName();
Michael Gottesmanc89466f2013-09-04 04:39:38 +00001615 if (!LinkageName.empty())
Eric Christopher3f79b8c2013-02-27 23:49:47 +00001616 // From DWARF4: DIEs to which DW_AT_linkage_name may apply include:
1617 // TAG_common_block, TAG_constant, TAG_entry_point, TAG_subprogram and
1618 // TAG_variable.
Eric Christopherc2697f82013-10-19 01:04:47 +00001619 addString(IsStaticMember && VariableSpecDIE ? VariableSpecDIE
1620 : VariableDIE,
1621 dwarf::DW_AT_MIPS_linkage_name,
Benjamin Kramer7c275642013-06-01 17:51:14 +00001622 GlobalValue::getRealLinkageName(LinkageName));
Eric Christopher92331fd2012-11-21 00:34:38 +00001623 } else if (const ConstantInt *CI =
Eric Christopherc2697f82013-10-19 01:04:47 +00001624 dyn_cast_or_null<ConstantInt>(GV.getConstant())) {
Adrian Prantl322f41d2013-04-04 22:56:49 +00001625 // AT_const_value was added when the static member was created. To avoid
Manman Rene697d3c2013-02-01 23:54:37 +00001626 // emitting AT_const_value multiple times, we only add AT_const_value when
1627 // it is not a static member.
1628 if (!IsStaticMember)
Manman Renb3388602013-10-05 01:43:03 +00001629 addConstantValue(VariableDIE, CI, isUnsignedDIType(DD, GTy));
David Blaikiea781b25b2013-11-17 21:55:13 +00001630 } else if (const ConstantExpr *CE = getMergedGlobalExpr(GV->getOperand(11))) {
Eric Christopher4996c702011-11-07 09:24:32 +00001631 addToAccelTable = true;
Devang Pateldfd6ec32011-08-15 17:57:41 +00001632 // GV is a merged global.
1633 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1634 Value *Ptr = CE->getOperand(0);
David Blaikiebc7e0d42013-11-27 23:53:52 +00001635 MCSymbol *Sym = Asm->getSymbol(cast<GlobalValue>(Ptr));
1636 DD->addArangeLabel(SymbolCU(this, Sym));
1637 addOpAddress(Block, Sym);
David Blaikief2443192013-10-21 17:28:37 +00001638 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
Eric Christopherc2697f82013-10-19 01:04:47 +00001639 SmallVector<Value *, 3> Idx(CE->op_begin() + 1, CE->op_end());
David Blaikief2443192013-10-21 17:28:37 +00001640 addUInt(Block, dwarf::DW_FORM_udata,
Eric Christopherc2697f82013-10-19 01:04:47 +00001641 Asm->getDataLayout().getIndexedOffset(Ptr->getType(), Idx));
David Blaikief2443192013-10-21 17:28:37 +00001642 addUInt(Block, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1643 addBlock(VariableDIE, dwarf::DW_AT_location, Block);
Devang Pateldfd6ec32011-08-15 17:57:41 +00001644 }
1645
Eric Christopherc12c2112011-11-11 01:55:22 +00001646 if (addToAccelTable) {
1647 DIE *AddrDIE = VariableSpecDIE ? VariableSpecDIE : VariableDIE;
1648 addAccelName(GV.getName(), AddrDIE);
Eric Christopher4996c702011-11-07 09:24:32 +00001649
Eric Christopherc12c2112011-11-11 01:55:22 +00001650 // If the linkage name is different than the name, go ahead and output
1651 // that as well into the name table.
1652 if (GV.getLinkageName() != "" && GV.getName() != GV.getLinkageName())
1653 addAccelName(GV.getLinkageName(), AddrDIE);
1654 }
Eric Christopherd2b497b2013-10-16 01:37:49 +00001655
1656 if (!GV.isLocalToUnit())
Eric Christopher2c8b7902013-10-17 02:06:06 +00001657 addGlobalName(GV.getName(), VariableSpecDIE ? VariableSpecDIE : VariableDIE,
1658 GV.getContext());
Devang Pateldfd6ec32011-08-15 17:57:41 +00001659}
1660
Devang Patel0e821f42011-04-12 23:21:44 +00001661/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
Eric Christophera5a79422013-12-09 23:32:48 +00001662void DwarfUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy) {
Manman Renb987e512013-10-29 00:53:03 +00001663 DIE *DW_Subrange = createAndAddDIE(dwarf::DW_TAG_subrange_type, Buffer);
Manman Ren4c4b69c2013-10-11 23:58:05 +00001664 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, IndexTy);
Devang Patel0e821f42011-04-12 23:21:44 +00001665
Bill Wendling28fe9e72012-12-06 07:38:10 +00001666 // The LowerBound value defines the lower bounds which is typically zero for
1667 // C/C++. The Count value is the number of elements. Values are 64 bit. If
1668 // Count == -1 then the array is unbounded and we do not emit
1669 // DW_AT_lower_bound and DW_AT_upper_bound attributes. If LowerBound == 0 and
1670 // Count == 0, then the array has zero elements in which case we do not emit
1671 // an upper bound.
1672 int64_t LowerBound = SR.getLo();
Bill Wendling3495f9b2012-12-06 07:55:19 +00001673 int64_t DefaultLowerBound = getDefaultLowerBound();
Bill Wendlingd7767122012-12-04 21:34:03 +00001674 int64_t Count = SR.getCount();
Devang Patel0e821f42011-04-12 23:21:44 +00001675
Bill Wendling3495f9b2012-12-06 07:55:19 +00001676 if (DefaultLowerBound == -1 || LowerBound != DefaultLowerBound)
David Blaikief2443192013-10-21 17:28:37 +00001677 addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, None, LowerBound);
Bill Wendling28fe9e72012-12-06 07:38:10 +00001678
1679 if (Count != -1 && Count != 0)
Bill Wendlingd7767122012-12-04 21:34:03 +00001680 // FIXME: An unbounded array should reference the expression that defines
1681 // the array.
Eric Christopher98b7f172013-11-11 18:52:36 +00001682 addUInt(DW_Subrange, dwarf::DW_AT_upper_bound, None,
1683 LowerBound + Count - 1);
Devang Patel0e821f42011-04-12 23:21:44 +00001684}
1685
1686/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
Eric Christophera5a79422013-12-09 23:32:48 +00001687void DwarfUnit::constructArrayTypeDIE(DIE &Buffer, DICompositeType CTy) {
Eric Christopherdf9955d2013-11-11 18:52:31 +00001688 if (CTy.isVector())
Eric Christopherbb69a272012-08-24 01:14:27 +00001689 addFlag(&Buffer, dwarf::DW_AT_GNU_vector);
Devang Patel0e821f42011-04-12 23:21:44 +00001690
Eric Christopher0df08e22013-08-08 07:40:37 +00001691 // Emit the element type.
Eric Christopherdf9955d2013-11-11 18:52:31 +00001692 addType(&Buffer, resolve(CTy.getTypeDerivedFrom()));
Devang Patel0e821f42011-04-12 23:21:44 +00001693
1694 // Get an anonymous type for index type.
Eric Christophercad9b532013-01-04 21:51:53 +00001695 // FIXME: This type should be passed down from the front end
1696 // as different languages may have different sizes for indexes.
Devang Patel0e821f42011-04-12 23:21:44 +00001697 DIE *IdxTy = getIndexTyDie();
1698 if (!IdxTy) {
1699 // Construct an anonymous type for index type.
David Blaikie2a80e442013-12-02 22:09:48 +00001700 IdxTy = createAndAddDIE(dwarf::DW_TAG_base_type, *UnitDie);
Eric Christophercad9b532013-01-04 21:51:53 +00001701 addString(IdxTy, dwarf::DW_AT_name, "int");
David Blaikief2443192013-10-21 17:28:37 +00001702 addUInt(IdxTy, dwarf::DW_AT_byte_size, None, sizeof(int32_t));
Devang Patel0e821f42011-04-12 23:21:44 +00001703 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1704 dwarf::DW_ATE_signed);
Devang Patel0e821f42011-04-12 23:21:44 +00001705 setIndexTyDie(IdxTy);
1706 }
1707
1708 // Add subranges to array type.
Eric Christopherdf9955d2013-11-11 18:52:31 +00001709 DIArray Elements = CTy.getTypeArray();
Devang Patel0e821f42011-04-12 23:21:44 +00001710 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1711 DIDescriptor Element = Elements.getElement(i);
1712 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1713 constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1714 }
1715}
1716
Eric Christopheraeb105f2013-11-11 18:52:39 +00001717/// constructEnumTypeDIE - Construct an enum type DIE from DICompositeType.
Eric Christophera5a79422013-12-09 23:32:48 +00001718void DwarfUnit::constructEnumTypeDIE(DIE &Buffer, DICompositeType CTy) {
Eric Christopheraeb105f2013-11-11 18:52:39 +00001719 DIArray Elements = CTy.getTypeArray();
1720
1721 // Add enumerators to enumeration type.
1722 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
David Blaikie4f6bf27a2013-11-18 23:33:32 +00001723 DIEnumerator Enum(Elements.getElement(i));
Eric Christopheraeb105f2013-11-11 18:52:39 +00001724 if (Enum.isEnumerator()) {
1725 DIE *Enumerator = createAndAddDIE(dwarf::DW_TAG_enumerator, Buffer);
David Blaikie4f6bf27a2013-11-18 23:33:32 +00001726 StringRef Name = Enum.getName();
Eric Christopheraeb105f2013-11-11 18:52:39 +00001727 addString(Enumerator, dwarf::DW_AT_name, Name);
David Blaikie4f6bf27a2013-11-18 23:33:32 +00001728 int64_t Value = Enum.getEnumValue();
Eric Christophera07e4f52013-11-19 09:28:34 +00001729 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata,
1730 Value);
Eric Christopheraeb105f2013-11-11 18:52:39 +00001731 }
1732 }
1733 DIType DTy = resolve(CTy.getTypeDerivedFrom());
1734 if (DTy) {
1735 addType(&Buffer, DTy);
1736 addFlag(&Buffer, dwarf::DW_AT_enum_class);
1737 }
Devang Patel0e821f42011-04-12 23:21:44 +00001738}
1739
Devang Patel89543712011-08-15 17:24:54 +00001740/// constructContainingTypeDIEs - Construct DIEs for types that contain
1741/// vtables.
Eric Christophera5a79422013-12-09 23:32:48 +00001742void DwarfUnit::constructContainingTypeDIEs() {
Devang Patel89543712011-08-15 17:24:54 +00001743 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
Eric Christopherc2697f82013-10-19 01:04:47 +00001744 CE = ContainingTypeMap.end();
1745 CI != CE; ++CI) {
Devang Patel89543712011-08-15 17:24:54 +00001746 DIE *SPDie = CI->first;
David Blaikie2ad00162013-11-15 23:09:13 +00001747 DIDescriptor D(CI->second);
1748 if (!D)
Eric Christopherc2697f82013-10-19 01:04:47 +00001749 continue;
David Blaikie2ad00162013-11-15 23:09:13 +00001750 DIE *NDie = getDIE(D);
Eric Christopherc2697f82013-10-19 01:04:47 +00001751 if (!NDie)
1752 continue;
Manman Ren4c4b69c2013-10-11 23:58:05 +00001753 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, NDie);
Devang Patel89543712011-08-15 17:24:54 +00001754 }
1755}
1756
Devang Patel3acc70e2011-08-15 22:04:40 +00001757/// constructVariableDIE - Construct a DIE for the given DbgVariable.
Eric Christophera5a79422013-12-09 23:32:48 +00001758DIE *DwarfUnit::constructVariableDIE(DbgVariable &DV, bool isScopeAbstract) {
Eric Christopher34a2c872013-11-15 01:43:19 +00001759 StringRef Name = DV.getName();
Devang Patel3acc70e2011-08-15 22:04:40 +00001760
Devang Patel3acc70e2011-08-15 22:04:40 +00001761 // Define variable debug information entry.
Eric Christopher34a2c872013-11-15 01:43:19 +00001762 DIE *VariableDie = new DIE(DV.getTag());
1763 DbgVariable *AbsVar = DV.getAbstractVariable();
Devang Patel3acc70e2011-08-15 22:04:40 +00001764 DIE *AbsDIE = AbsVar ? AbsVar->getDIE() : NULL;
Manman Ren4213c392013-05-29 17:16:59 +00001765 if (AbsDIE)
Manman Ren4c4b69c2013-10-11 23:58:05 +00001766 addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin, AbsDIE);
Devang Patel3acc70e2011-08-15 22:04:40 +00001767 else {
David Blaikie715528b2013-08-19 03:34:03 +00001768 if (!Name.empty())
1769 addString(VariableDie, dwarf::DW_AT_name, Name);
Eric Christopher34a2c872013-11-15 01:43:19 +00001770 addSourceLine(VariableDie, DV.getVariable());
1771 addType(VariableDie, DV.getType());
Devang Patel3acc70e2011-08-15 22:04:40 +00001772 }
1773
Eric Christopher34a2c872013-11-15 01:43:19 +00001774 if (DV.isArtificial())
Eric Christopherbb69a272012-08-24 01:14:27 +00001775 addFlag(VariableDie, dwarf::DW_AT_artificial);
Devang Patel3acc70e2011-08-15 22:04:40 +00001776
1777 if (isScopeAbstract) {
Eric Christopher34a2c872013-11-15 01:43:19 +00001778 DV.setDIE(VariableDie);
Devang Patel3acc70e2011-08-15 22:04:40 +00001779 return VariableDie;
1780 }
1781
1782 // Add variable address.
1783
Eric Christopher34a2c872013-11-15 01:43:19 +00001784 unsigned Offset = DV.getDotDebugLocOffset();
Devang Patel3acc70e2011-08-15 22:04:40 +00001785 if (Offset != ~0U) {
Eric Christopher33ff6972013-11-21 23:46:41 +00001786 addSectionLabel(VariableDie, dwarf::DW_AT_location,
1787 Asm->GetTempSymbol("debug_loc", Offset));
Eric Christopher34a2c872013-11-15 01:43:19 +00001788 DV.setDIE(VariableDie);
Devang Patel3acc70e2011-08-15 22:04:40 +00001789 return VariableDie;
1790 }
1791
Eric Christophercead0332011-10-03 15:49:20 +00001792 // Check if variable is described by a DBG_VALUE instruction.
Eric Christopher34a2c872013-11-15 01:43:19 +00001793 if (const MachineInstr *DVInsn = DV.getMInsn()) {
David Blaikie0252265b2013-06-16 20:34:15 +00001794 assert(DVInsn->getNumOperands() == 3);
1795 if (DVInsn->getOperand(0).isReg()) {
1796 const MachineOperand RegOp = DVInsn->getOperand(0);
Adrian Prantl19942882013-07-09 21:44:06 +00001797 // If the second operand is an immediate, this is an indirect value.
Adrian Prantl418d1d12013-07-09 20:28:37 +00001798 if (DVInsn->getOperand(1).isImm()) {
Eric Christopherc2697f82013-10-19 01:04:47 +00001799 MachineLocation Location(RegOp.getReg(),
1800 DVInsn->getOperand(1).getImm());
Eric Christopher34a2c872013-11-15 01:43:19 +00001801 addVariableAddress(DV, VariableDie, Location);
David Blaikie0252265b2013-06-16 20:34:15 +00001802 } else if (RegOp.getReg())
Eric Christopher34a2c872013-11-15 01:43:19 +00001803 addVariableAddress(DV, VariableDie, MachineLocation(RegOp.getReg()));
David Blaikie0252265b2013-06-16 20:34:15 +00001804 } else if (DVInsn->getOperand(0).isImm())
Eric Christopher34a2c872013-11-15 01:43:19 +00001805 addConstantValue(VariableDie, DVInsn->getOperand(0), DV.getType());
David Blaikie0252265b2013-06-16 20:34:15 +00001806 else if (DVInsn->getOperand(0).isFPImm())
Eric Christopher78fcf4902013-07-03 01:08:30 +00001807 addConstantFPValue(VariableDie, DVInsn->getOperand(0));
David Blaikie0252265b2013-06-16 20:34:15 +00001808 else if (DVInsn->getOperand(0).isCImm())
Eric Christopher78fcf4902013-07-03 01:08:30 +00001809 addConstantValue(VariableDie, DVInsn->getOperand(0).getCImm(),
Eric Christopher34a2c872013-11-15 01:43:19 +00001810 isUnsignedDIType(DD, DV.getType()));
Eric Christopher78fcf4902013-07-03 01:08:30 +00001811
Eric Christopher34a2c872013-11-15 01:43:19 +00001812 DV.setDIE(VariableDie);
Devang Patel3acc70e2011-08-15 22:04:40 +00001813 return VariableDie;
1814 } else {
1815 // .. else use frame index.
Eric Christopher34a2c872013-11-15 01:43:19 +00001816 int FI = DV.getFrameIndex();
Devang Patel3acc70e2011-08-15 22:04:40 +00001817 if (FI != ~0) {
1818 unsigned FrameReg = 0;
1819 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
Eric Christopherc2697f82013-10-19 01:04:47 +00001820 int Offset = TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
Devang Patel3acc70e2011-08-15 22:04:40 +00001821 MachineLocation Location(FrameReg, Offset);
Eric Christopher34a2c872013-11-15 01:43:19 +00001822 addVariableAddress(DV, VariableDie, Location);
Devang Patel3acc70e2011-08-15 22:04:40 +00001823 }
1824 }
1825
Eric Christopher34a2c872013-11-15 01:43:19 +00001826 DV.setDIE(VariableDie);
Devang Patel3acc70e2011-08-15 22:04:40 +00001827 return VariableDie;
1828}
1829
Manman Ren230ec862013-10-23 23:00:44 +00001830/// constructMemberDIE - Construct member DIE from DIDerivedType.
Eric Christophera5a79422013-12-09 23:32:48 +00001831void DwarfUnit::constructMemberDIE(DIE &Buffer, DIDerivedType DT) {
Manman Renb987e512013-10-29 00:53:03 +00001832 DIE *MemberDie = createAndAddDIE(DT.getTag(), Buffer);
Devang Patel0e821f42011-04-12 23:21:44 +00001833 StringRef Name = DT.getName();
1834 if (!Name.empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +00001835 addString(MemberDie, dwarf::DW_AT_name, Name);
Devang Patel0e821f42011-04-12 23:21:44 +00001836
Manman Ren93b30902013-10-08 18:42:58 +00001837 addType(MemberDie, resolve(DT.getTypeDerivedFrom()));
Devang Patel0e821f42011-04-12 23:21:44 +00001838
1839 addSourceLine(MemberDie, DT);
1840
Eric Christopherc2697f82013-10-19 01:04:47 +00001841 if (DT.getTag() == dwarf::DW_TAG_inheritance && DT.isVirtual()) {
Devang Patel0e821f42011-04-12 23:21:44 +00001842
1843 // For C++, virtual base classes are not at fixed offset. Use following
1844 // expression to extract appropriate offset from vtable.
1845 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1846
1847 DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
David Blaikief2443192013-10-21 17:28:37 +00001848 addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1849 addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1850 addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1851 addUInt(VBaseLocationDie, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1852 addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1853 addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1854 addUInt(VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
Devang Patel0e821f42011-04-12 23:21:44 +00001855
David Blaikief2443192013-10-21 17:28:37 +00001856 addBlock(MemberDie, dwarf::DW_AT_data_member_location, VBaseLocationDie);
David Blaikie71d34a22013-11-01 00:25:45 +00001857 } else {
1858 uint64_t Size = DT.getSizeInBits();
1859 uint64_t FieldSize = getBaseTypeSize(DD, DT);
1860 uint64_t OffsetInBytes;
1861
1862 if (Size != FieldSize) {
1863 // Handle bitfield.
1864 addUInt(MemberDie, dwarf::DW_AT_byte_size, None,
1865 getBaseTypeSize(DD, DT) >> 3);
1866 addUInt(MemberDie, dwarf::DW_AT_bit_size, None, DT.getSizeInBits());
1867
1868 uint64_t Offset = DT.getOffsetInBits();
1869 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1870 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1871 uint64_t FieldOffset = (HiMark - FieldSize);
1872 Offset -= FieldOffset;
1873
1874 // Maybe we need to work from the other end.
1875 if (Asm->getDataLayout().isLittleEndian())
1876 Offset = FieldSize - (Offset + Size);
1877 addUInt(MemberDie, dwarf::DW_AT_bit_offset, None, Offset);
1878
Adrian Prantlc67655a2014-01-28 18:13:47 +00001879 // Here DW_AT_data_member_location points to the anonymous
David Blaikie71d34a22013-11-01 00:25:45 +00001880 // field that includes this bit field.
1881 OffsetInBytes = FieldOffset >> 3;
1882 } else
1883 // This is not a bitfield.
1884 OffsetInBytes = DT.getOffsetInBits() >> 3;
David Blaikie2ada1162014-01-03 00:48:38 +00001885
David Blaikie22b29a52014-01-03 01:30:05 +00001886 if (DD->getDwarfVersion() <= 2) {
1887 DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
1888 addUInt(MemLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1889 addUInt(MemLocationDie, dwarf::DW_FORM_udata, OffsetInBytes);
1890 addBlock(MemberDie, dwarf::DW_AT_data_member_location, MemLocationDie);
1891 } else
1892 addUInt(MemberDie, dwarf::DW_AT_data_member_location, None,
1893 OffsetInBytes);
David Blaikie71d34a22013-11-01 00:25:45 +00001894 }
Devang Patel0e821f42011-04-12 23:21:44 +00001895
1896 if (DT.isProtected())
Nick Lewyckycb918492011-12-13 05:09:11 +00001897 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001898 dwarf::DW_ACCESS_protected);
1899 else if (DT.isPrivate())
Nick Lewyckycb918492011-12-13 05:09:11 +00001900 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001901 dwarf::DW_ACCESS_private);
1902 // Otherwise C++ member and base classes are considered public.
Eric Christopher92331fd2012-11-21 00:34:38 +00001903 else
Nick Lewyckycb918492011-12-13 05:09:11 +00001904 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001905 dwarf::DW_ACCESS_public);
1906 if (DT.isVirtual())
Nick Lewyckycfde1a22011-12-14 00:56:07 +00001907 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001908 dwarf::DW_VIRTUALITY_virtual);
Devang Patel514b4002011-04-16 00:11:51 +00001909
1910 // Objective-C properties.
Devang Patel44882172012-02-06 17:49:43 +00001911 if (MDNode *PNode = DT.getObjCProperty())
1912 if (DIEEntry *PropertyDie = getDIEEntry(PNode))
Eric Christopher92331fd2012-11-21 00:34:38 +00001913 MemberDie->addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4,
Devang Patel44882172012-02-06 17:49:43 +00001914 PropertyDie);
1915
David Blaikie37fefc32012-12-13 22:43:07 +00001916 if (DT.isArtificial())
1917 addFlag(MemberDie, dwarf::DW_AT_artificial);
Devang Patel0e821f42011-04-12 23:21:44 +00001918}
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001919
Manman Renc6b63922013-10-14 20:33:57 +00001920/// getOrCreateStaticMemberDIE - Create new DIE for C++ static member.
Eric Christophera5a79422013-12-09 23:32:48 +00001921DIE *DwarfUnit::getOrCreateStaticMemberDIE(DIDerivedType DT) {
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001922 if (!DT.Verify())
1923 return NULL;
1924
Manman Renc6b63922013-10-14 20:33:57 +00001925 // Construct the context before querying for the existence of the DIE in case
1926 // such construction creates the DIE.
1927 DIE *ContextDIE = getOrCreateContextDIE(resolve(DT.getContext()));
David Blaikiebd700e42013-11-14 21:24:34 +00001928 assert(dwarf::isType(ContextDIE->getTag()) &&
1929 "Static member should belong to a type.");
Manman Renc6b63922013-10-14 20:33:57 +00001930
1931 DIE *StaticMemberDIE = getDIE(DT);
1932 if (StaticMemberDIE)
1933 return StaticMemberDIE;
1934
Manman Renb987e512013-10-29 00:53:03 +00001935 StaticMemberDIE = createAndAddDIE(DT.getTag(), *ContextDIE, DT);
Manman Renc6b63922013-10-14 20:33:57 +00001936
Manman Ren93b30902013-10-08 18:42:58 +00001937 DIType Ty = resolve(DT.getTypeDerivedFrom());
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001938
1939 addString(StaticMemberDIE, dwarf::DW_AT_name, DT.getName());
1940 addType(StaticMemberDIE, Ty);
1941 addSourceLine(StaticMemberDIE, DT);
1942 addFlag(StaticMemberDIE, dwarf::DW_AT_external);
1943 addFlag(StaticMemberDIE, dwarf::DW_AT_declaration);
1944
1945 // FIXME: We could omit private if the parent is a class_type, and
1946 // public if the parent is something else.
1947 if (DT.isProtected())
1948 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1949 dwarf::DW_ACCESS_protected);
1950 else if (DT.isPrivate())
1951 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1952 dwarf::DW_ACCESS_private);
1953 else
1954 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1955 dwarf::DW_ACCESS_public);
1956
1957 if (const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(DT.getConstant()))
Manman Renb3388602013-10-05 01:43:03 +00001958 addConstantValue(StaticMemberDIE, CI, isUnsignedDIType(DD, Ty));
David Blaikiea39a76e2013-01-20 01:18:01 +00001959 if (const ConstantFP *CFP = dyn_cast_or_null<ConstantFP>(DT.getConstant()))
1960 addConstantFPValue(StaticMemberDIE, CFP);
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001961
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001962 return StaticMemberDIE;
1963}
David Blaikie6b288cf2013-10-30 20:42:41 +00001964
Eric Christophera5a79422013-12-09 23:32:48 +00001965void DwarfUnit::emitHeader(const MCSection *ASection,
David Blaikie3332d4c2013-12-11 21:14:02 +00001966 const MCSymbol *ASectionSym) const {
David Blaikie6b288cf2013-10-30 20:42:41 +00001967 Asm->OutStreamer.AddComment("DWARF version number");
1968 Asm->EmitInt16(DD->getDwarfVersion());
1969 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
David Blaikie6896e192013-12-04 23:39:02 +00001970 // We share one abbreviations table across all units so it's always at the
1971 // start of the section. Use a relocatable offset where needed to ensure
1972 // linking doesn't invalidate that offset.
David Blaikie91db9ab2013-12-04 18:12:28 +00001973 Asm->EmitSectionOffset(ASectionSym, ASectionSym);
David Blaikie6b288cf2013-10-30 20:42:41 +00001974 Asm->OutStreamer.AddComment("Address Size (in bytes)");
1975 Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
1976}
David Blaikiebc563272013-12-13 21:33:40 +00001977
Juergen Ributzkadb9ee002013-12-14 12:23:14 +00001978DwarfCompileUnit::~DwarfCompileUnit() {}
1979DwarfTypeUnit::~DwarfTypeUnit() {}
1980
David Blaikiebc563272013-12-13 21:33:40 +00001981void DwarfTypeUnit::emitHeader(const MCSection *ASection,
1982 const MCSymbol *ASectionSym) const {
1983 DwarfUnit::emitHeader(ASection, ASectionSym);
1984 Asm->OutStreamer.AddComment("Type Signature");
1985 Asm->OutStreamer.EmitIntValue(TypeSignature, sizeof(TypeSignature));
1986 Asm->OutStreamer.AddComment("Type DIE Offset");
David Blaikie15ed5eb2014-01-10 01:38:41 +00001987 // In a skeleton type unit there is no type DIE so emit a zero offset.
1988 Asm->OutStreamer.EmitIntValue(Ty ? Ty->getOffset() : 0,
1989 sizeof(Ty->getOffset()));
David Blaikiebc563272013-12-13 21:33:40 +00001990}
1991
1992void DwarfTypeUnit::initSection(const MCSection *Section) {
1993 assert(!this->Section);
1994 this->Section = Section;
1995 // Since each type unit is contained in its own COMDAT section, the begin
1996 // label and the section label are the same. Using the begin label emission in
1997 // DwarfDebug to emit the section label as well is slightly subtle/sneaky, but
1998 // the only other alternative of lazily constructing start-of-section labels
1999 // and storing a mapping in DwarfDebug (or AsmPrinter).
2000 this->SectionSym = this->LabelBegin =
2001 Asm->GetTempSymbol(Section->getLabelBeginName(), getUniqueID());
2002 this->LabelEnd =
2003 Asm->GetTempSymbol(Section->getLabelEndName(), getUniqueID());
2004 this->LabelRange = Asm->GetTempSymbol("gnu_ranges", getUniqueID());
2005}