blob: 07959a5a8363cedd58835fe08a834880249dc234 [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
David Blaikie2c86a722013-12-02 19:33:15 +000014#include "DwarfUnit.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000015#include "DwarfAccelTable.h"
David Blaikie37c52312014-10-04 15:49:50 +000016#include "DwarfCompileUnit.h"
Devang Patel0e821f42011-04-12 23:21:44 +000017#include "DwarfDebug.h"
Adrian Prantl00dbc2a2015-01-12 22:19:26 +000018#include "DwarfExpression.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000019#include "llvm/ADT/APFloat.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000020#include "llvm/IR/Constants.h"
Chandler Carruth12664a02014-03-06 00:22:06 +000021#include "llvm/IR/DIBuilder.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000022#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"
Eric Christopherd9134482014-08-04 21:25:23 +000035#include "llvm/Target/TargetSubtargetInfo.h"
Devang Patel0e821f42011-04-12 23:21:44 +000036
37using namespace llvm;
38
Chandler Carruth1b9dde02014-04-22 02:02:50 +000039#define DEBUG_TYPE "dwarfdebug"
40
Eric Christopher4287a492013-12-09 23:57:44 +000041static cl::opt<bool>
42GenerateDwarfTypeUnits("generate-type-units", cl::Hidden,
43 cl::desc("Generate DWARF4 type units."),
44 cl::init(false));
David Blaikie409dd9c2013-11-19 23:08:21 +000045
Adrian Prantl00dbc2a2015-01-12 22:19:26 +000046void DIEDwarfExpression::EmitOp(uint8_t Op, const char* Comment) {
47 DU.addUInt(DIE, dwarf::DW_FORM_data1, Op);
48}
49void DIEDwarfExpression::EmitSigned(int Value) {
50 DU.addSInt(DIE, dwarf::DW_FORM_sdata, Value);
51}
52void DIEDwarfExpression::EmitUnsigned(unsigned Value) {
53 DU.addUInt(DIE, dwarf::DW_FORM_udata, Value);
54}
Adrian Prantl8995f5c2015-01-13 23:10:43 +000055bool DIEDwarfExpression::isFrameRegister(unsigned MachineReg) {
56 return MachineReg == getTRI()->getFrameRegister(*AP.MF);
Adrian Prantl00dbc2a2015-01-12 22:19:26 +000057}
58
59
David Blaikie2a80e442013-12-02 22:09:48 +000060/// Unit - Unit constructor.
David Blaikiebd579052014-04-28 21:14:27 +000061DwarfUnit::DwarfUnit(unsigned UID, dwarf::Tag UnitTag, DICompileUnit Node,
David Blaikie92a2f8a2014-04-28 21:04:29 +000062 AsmPrinter *A, DwarfDebug *DW, DwarfFile *DWU)
David Blaikiebd579052014-04-28 21:14:27 +000063 : UniqueID(UID), CUNode(Node), UnitDie(UnitTag), DebugInfoOffset(0), Asm(A),
David Blaikie7cbf58a2014-11-01 18:18:07 +000064 DD(DW), DU(DWU), IndexTyDie(nullptr), Section(nullptr) {
David Blaikiebd579052014-04-28 21:14:27 +000065 assert(UnitTag == dwarf::DW_TAG_compile_unit ||
66 UnitTag == dwarf::DW_TAG_type_unit);
David Blaikie319a05f2013-12-02 19:33:10 +000067 DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
68}
69
David Blaikiebd579052014-04-28 21:14:27 +000070DwarfTypeUnit::DwarfTypeUnit(unsigned UID, DwarfCompileUnit &CU, AsmPrinter *A,
David Blaikie92a2f8a2014-04-28 21:04:29 +000071 DwarfDebug *DW, DwarfFile *DWU,
David Blaikie8287aff2014-03-18 02:13:23 +000072 MCDwarfDwoLineTable *SplitLineTable)
David Blaikiebd579052014-04-28 21:14:27 +000073 : DwarfUnit(UID, dwarf::DW_TAG_type_unit, CU.getCUNode(), A, DW, DWU),
74 CU(CU), SplitLineTable(SplitLineTable) {
David Blaikie4a2f95f2014-03-18 01:17:26 +000075 if (SplitLineTable)
David Blaikiebd579052014-04-28 21:14:27 +000076 addSectionOffset(UnitDie, dwarf::DW_AT_stmt_list, 0);
David Blaikie4a2f95f2014-03-18 01:17:26 +000077}
David Blaikie409dd9c2013-11-19 23:08:21 +000078
David Blaikie319a05f2013-12-02 19:33:10 +000079/// ~Unit - Destructor for compile unit.
Eric Christophera5a79422013-12-09 23:32:48 +000080DwarfUnit::~DwarfUnit() {
Devang Patel0e821f42011-04-12 23:21:44 +000081 for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
82 DIEBlocks[j]->~DIEBlock();
Eric Christopher4a741042014-02-16 08:46:55 +000083 for (unsigned j = 0, M = DIELocs.size(); j < M; ++j)
84 DIELocs[j]->~DIELoc();
Devang Patel0e821f42011-04-12 23:21:44 +000085}
86
87/// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
88/// information entry.
David Blaikie8dbcc3f2014-04-25 19:33:43 +000089DIEEntry *DwarfUnit::createDIEEntry(DIE &Entry) {
Devang Patel0e821f42011-04-12 23:21:44 +000090 DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
91 return Value;
92}
93
Bill Wendling3495f9b2012-12-06 07:55:19 +000094/// getDefaultLowerBound - Return the default lower bound for an array. If the
Bill Wendling28fe9e72012-12-06 07:38:10 +000095/// DWARF version doesn't handle the language, return -1.
Eric Christophera5a79422013-12-09 23:32:48 +000096int64_t DwarfUnit::getDefaultLowerBound() const {
David Blaikiecb8e4352013-11-15 23:50:53 +000097 switch (getLanguage()) {
Bill Wendling28fe9e72012-12-06 07:38:10 +000098 default:
99 break;
100
101 case dwarf::DW_LANG_C89:
102 case dwarf::DW_LANG_C99:
103 case dwarf::DW_LANG_C:
104 case dwarf::DW_LANG_C_plus_plus:
105 case dwarf::DW_LANG_ObjC:
106 case dwarf::DW_LANG_ObjC_plus_plus:
107 return 0;
108
109 case dwarf::DW_LANG_Fortran77:
110 case dwarf::DW_LANG_Fortran90:
111 case dwarf::DW_LANG_Fortran95:
112 return 1;
113
114 // The languages below have valid values only if the DWARF version >= 4.
115 case dwarf::DW_LANG_Java:
116 case dwarf::DW_LANG_Python:
117 case dwarf::DW_LANG_UPC:
118 case dwarf::DW_LANG_D:
119 if (dwarf::DWARF_VERSION >= 4)
120 return 0;
121 break;
122
123 case dwarf::DW_LANG_Ada83:
124 case dwarf::DW_LANG_Ada95:
125 case dwarf::DW_LANG_Cobol74:
126 case dwarf::DW_LANG_Cobol85:
127 case dwarf::DW_LANG_Modula2:
128 case dwarf::DW_LANG_Pascal83:
129 case dwarf::DW_LANG_PLI:
130 if (dwarf::DWARF_VERSION >= 4)
131 return 1;
132 break;
133 }
134
135 return -1;
136}
137
Manman Ren4dbdc902013-10-31 17:54:35 +0000138/// Check whether the DIE for this MDNode can be shared across CUs.
David Blaikie4201ddf2013-11-15 22:59:36 +0000139static bool isShareableAcrossCUs(DIDescriptor D) {
David Blaikiebcb418e2013-11-20 18:40:16 +0000140 // When the MDNode can be part of the type system, the DIE can be shared
141 // across CUs.
142 // Combining type units and cross-CU DIE sharing is lower value (since
143 // cross-CU DIE sharing is used in LTO and removes type redundancy at that
144 // level already) but may be implementable for some value in projects
145 // building multiple independent libraries with LTO and then linking those
146 // together.
David Blaikie409dd9c2013-11-19 23:08:21 +0000147 return (D.isType() ||
148 (D.isSubprogram() && !DISubprogram(D).isDefinition())) &&
Eric Christopher4287a492013-12-09 23:57:44 +0000149 !GenerateDwarfTypeUnits;
Manman Ren4dbdc902013-10-31 17:54:35 +0000150}
151
152/// getDIE - Returns the debug information entry map slot for the
153/// specified debug variable. We delegate the request to DwarfDebug
154/// when the DIE for this MDNode can be shared across CUs. The mappings
155/// will be kept in DwarfDebug for shareable DIEs.
Eric Christophera5a79422013-12-09 23:32:48 +0000156DIE *DwarfUnit::getDIE(DIDescriptor D) const {
David Blaikie2ad00162013-11-15 23:09:13 +0000157 if (isShareableAcrossCUs(D))
David Blaikie9bfd7a92014-11-04 22:12:18 +0000158 return DU->getDIE(D);
David Blaikie2ad00162013-11-15 23:09:13 +0000159 return MDNodeToDieMap.lookup(D);
Manman Ren4dbdc902013-10-31 17:54:35 +0000160}
161
162/// insertDIE - Insert DIE into the map. We delegate the request to DwarfDebug
163/// when the DIE for this MDNode can be shared across CUs. The mappings
164/// will be kept in DwarfDebug for shareable DIEs.
Eric Christophera5a79422013-12-09 23:32:48 +0000165void DwarfUnit::insertDIE(DIDescriptor Desc, DIE *D) {
David Blaikie2ad00162013-11-15 23:09:13 +0000166 if (isShareableAcrossCUs(Desc)) {
David Blaikie9bfd7a92014-11-04 22:12:18 +0000167 DU->insertDIE(Desc, D);
Manman Ren4dbdc902013-10-31 17:54:35 +0000168 return;
169 }
David Blaikie2ad00162013-11-15 23:09:13 +0000170 MDNodeToDieMap.insert(std::make_pair(Desc, D));
Manman Ren4dbdc902013-10-31 17:54:35 +0000171}
172
Eric Christopherbb69a272012-08-24 01:14:27 +0000173/// addFlag - Add a flag that is true.
David Blaikie65a74662014-04-25 18:26:14 +0000174void DwarfUnit::addFlag(DIE &Die, dwarf::Attribute Attribute) {
Michael Gottesmanc89466f2013-09-04 04:39:38 +0000175 if (DD->getDwarfVersion() >= 4)
David Blaikie65a74662014-04-25 18:26:14 +0000176 Die.addValue(Attribute, dwarf::DW_FORM_flag_present, DIEIntegerOne);
Eric Christopherbb69a272012-08-24 01:14:27 +0000177 else
David Blaikie65a74662014-04-25 18:26:14 +0000178 Die.addValue(Attribute, dwarf::DW_FORM_flag, DIEIntegerOne);
Eric Christopherbb69a272012-08-24 01:14:27 +0000179}
180
Devang Patel0e821f42011-04-12 23:21:44 +0000181/// addUInt - Add an unsigned integer attribute data and value.
182///
David Blaikie65a74662014-04-25 18:26:14 +0000183void DwarfUnit::addUInt(DIE &Die, dwarf::Attribute Attribute,
Eric Christophera5a79422013-12-09 23:32:48 +0000184 Optional<dwarf::Form> Form, uint64_t Integer) {
Eric Christopherc2697f82013-10-19 01:04:47 +0000185 if (!Form)
186 Form = DIEInteger::BestForm(false, Integer);
187 DIEValue *Value = Integer == 1 ? DIEIntegerOne : new (DIEValueAllocator)
188 DIEInteger(Integer);
David Blaikie65a74662014-04-25 18:26:14 +0000189 Die.addValue(Attribute, *Form, Value);
David Blaikief2443192013-10-21 17:28:37 +0000190}
191
David Blaikie65a74662014-04-25 18:26:14 +0000192void DwarfUnit::addUInt(DIE &Block, dwarf::Form Form, uint64_t Integer) {
David Blaikief2443192013-10-21 17:28:37 +0000193 addUInt(Block, (dwarf::Attribute)0, Form, Integer);
Devang Patel0e821f42011-04-12 23:21:44 +0000194}
195
196/// addSInt - Add an signed integer attribute data and value.
197///
David Blaikie65a74662014-04-25 18:26:14 +0000198void DwarfUnit::addSInt(DIE &Die, dwarf::Attribute Attribute,
Eric Christophera5a79422013-12-09 23:32:48 +0000199 Optional<dwarf::Form> Form, int64_t Integer) {
Eric Christopherc2697f82013-10-19 01:04:47 +0000200 if (!Form)
201 Form = DIEInteger::BestForm(true, Integer);
Devang Patel0e821f42011-04-12 23:21:44 +0000202 DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
David Blaikie65a74662014-04-25 18:26:14 +0000203 Die.addValue(Attribute, *Form, Value);
David Blaikief2443192013-10-21 17:28:37 +0000204}
205
David Blaikie65a74662014-04-25 18:26:14 +0000206void DwarfUnit::addSInt(DIELoc &Die, Optional<dwarf::Form> Form,
Eric Christophera5a79422013-12-09 23:32:48 +0000207 int64_t Integer) {
David Blaikief2443192013-10-21 17:28:37 +0000208 addSInt(Die, (dwarf::Attribute)0, Form, Integer);
Devang Patel0e821f42011-04-12 23:21:44 +0000209}
210
Nick Lewyckycc64ae12011-10-28 05:29:47 +0000211/// addString - Add a string attribute data and value. We always emit a
212/// reference to the string pool instead of immediate strings so that DIEs have
Eric Christopherfba22602013-01-07 19:32:45 +0000213/// more predictable sizes. In the case of split dwarf we emit an index
214/// into another table which gets us the static offset into the string
215/// table.
David Blaikie65a74662014-04-25 18:26:14 +0000216void DwarfUnit::addString(DIE &Die, dwarf::Attribute Attribute,
Eric Christophera5a79422013-12-09 23:32:48 +0000217 StringRef String) {
David Blaikiecafd9622014-11-02 08:51:37 +0000218 if (!isDwoUnit())
Eric Christopher05893f42013-12-30 18:32:31 +0000219 return addLocalString(Die, Attribute, String);
220
David Blaikiecafd9622014-11-02 08:51:37 +0000221 addIndexedString(Die, Attribute, String);
222}
223
224void DwarfUnit::addIndexedString(DIE &Die, dwarf::Attribute Attribute,
225 StringRef String) {
David Blaikiedaefdbf2014-04-25 21:34:35 +0000226 unsigned idx = DU->getStringPool().getIndex(*Asm, String);
Eric Christopher05893f42013-12-30 18:32:31 +0000227 DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx);
Eric Christopher67646432013-07-26 17:02:41 +0000228 DIEValue *Str = new (DIEValueAllocator) DIEString(Value, String);
David Blaikie65a74662014-04-25 18:26:14 +0000229 Die.addValue(Attribute, dwarf::DW_FORM_GNU_str_index, Str);
Eric Christopher2cbd5762013-01-07 19:32:41 +0000230}
231
232/// addLocalString - Add a string attribute data and value. This is guaranteed
233/// to be in the local string pool instead of indirected.
David Blaikie65a74662014-04-25 18:26:14 +0000234void DwarfUnit::addLocalString(DIE &Die, dwarf::Attribute Attribute,
Eric Christophera5a79422013-12-09 23:32:48 +0000235 StringRef String) {
David Blaikiedaefdbf2014-04-25 21:34:35 +0000236 MCSymbol *Symb = DU->getStringPool().getSymbol(*Asm, String);
Nick Lewyckycc64ae12011-10-28 05:29:47 +0000237 DIEValue *Value;
Eric Christopher84588622013-12-28 01:39:17 +0000238 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000239 Value = new (DIEValueAllocator) DIELabel(Symb);
David Blaikie6741bb02014-09-11 21:12:48 +0000240 else
241 Value = new (DIEValueAllocator) DIEDelta(Symb, DD->getDebugStrSym());
Eric Christopher05893f42013-12-30 18:32:31 +0000242 DIEValue *Str = new (DIEValueAllocator) DIEString(Value, String);
David Blaikie65a74662014-04-25 18:26:14 +0000243 Die.addValue(Attribute, dwarf::DW_FORM_strp, Str);
Devang Patel0e821f42011-04-12 23:21:44 +0000244}
245
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000246/// addLabel - Add a Dwarf label attribute data and value.
247///
David Blaikie65a74662014-04-25 18:26:14 +0000248void DwarfUnit::addLabel(DIE &Die, dwarf::Attribute Attribute, dwarf::Form Form,
Eric Christophera5a79422013-12-09 23:32:48 +0000249 const MCSymbol *Label) {
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000250 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
David Blaikie65a74662014-04-25 18:26:14 +0000251 Die.addValue(Attribute, Form, Value);
David Blaikief3cd7c52013-06-28 20:05:04 +0000252}
253
David Blaikie65a74662014-04-25 18:26:14 +0000254void DwarfUnit::addLabel(DIELoc &Die, dwarf::Form Form, const MCSymbol *Label) {
David Blaikief2443192013-10-21 17:28:37 +0000255 addLabel(Die, (dwarf::Attribute)0, Form, Label);
256}
257
Eric Christopher33ff6972013-11-21 23:46:41 +0000258/// addSectionOffset - Add an offset into a section attribute data and value.
259///
David Blaikie65a74662014-04-25 18:26:14 +0000260void DwarfUnit::addSectionOffset(DIE &Die, dwarf::Attribute Attribute,
Eric Christophera5a79422013-12-09 23:32:48 +0000261 uint64_t Integer) {
Eric Christopher33ff6972013-11-21 23:46:41 +0000262 if (DD->getDwarfVersion() >= 4)
263 addUInt(Die, Attribute, dwarf::DW_FORM_sec_offset, Integer);
264 else
265 addUInt(Die, Attribute, dwarf::DW_FORM_data4, Integer);
266}
267
David Blaikie4a2f95f2014-03-18 01:17:26 +0000268unsigned DwarfTypeUnit::getOrCreateSourceID(StringRef FileName, StringRef DirName) {
269 return SplitLineTable ? SplitLineTable->getFile(DirName, FileName)
270 : getCU().getOrCreateSourceID(FileName, DirName);
271}
272
Eric Christophere9ec2452013-01-18 22:11:33 +0000273/// addOpAddress - Add a dwarf op address data and value using the
274/// form given and an op of either DW_FORM_addr or DW_FORM_GNU_addr_index.
275///
David Blaikie65a74662014-04-25 18:26:14 +0000276void DwarfUnit::addOpAddress(DIELoc &Die, const MCSymbol *Sym) {
Eric Christophere9ec2452013-01-18 22:11:33 +0000277 if (!DD->useSplitDwarf()) {
David Blaikief2443192013-10-21 17:28:37 +0000278 addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
279 addLabel(Die, dwarf::DW_FORM_udata, Sym);
Eric Christophere9ec2452013-01-18 22:11:33 +0000280 } else {
David Blaikief2443192013-10-21 17:28:37 +0000281 addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_addr_index);
David Blaikiee226b082014-04-23 21:04:59 +0000282 addUInt(Die, dwarf::DW_FORM_GNU_addr_index,
David Blaikied75fb282014-04-23 21:20:10 +0000283 DD->getAddressPool().getIndex(Sym));
Eric Christophere9ec2452013-01-18 22:11:33 +0000284 }
285}
286
David Blaikie65a74662014-04-25 18:26:14 +0000287void DwarfUnit::addLabelDelta(DIE &Die, dwarf::Attribute Attribute,
David Blaikie48b1bdc2014-03-07 01:30:55 +0000288 const MCSymbol *Hi, const MCSymbol *Lo) {
289 DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
David Blaikie65a74662014-04-25 18:26:14 +0000290 Die.addValue(Attribute, dwarf::DW_FORM_data4, Value);
David Blaikie48b1bdc2014-03-07 01:30:55 +0000291}
292
Devang Patel0e821f42011-04-12 23:21:44 +0000293/// addDIEEntry - Add a DIE attribute data and value.
294///
David Blaikie8dbcc3f2014-04-25 19:33:43 +0000295void DwarfUnit::addDIEEntry(DIE &Die, dwarf::Attribute Attribute, DIE &Entry) {
Manman Ren4dbdc902013-10-31 17:54:35 +0000296 addDIEEntry(Die, Attribute, createDIEEntry(Entry));
297}
298
David Blaikie65a74662014-04-25 18:26:14 +0000299void DwarfUnit::addDIETypeSignature(DIE &Die, const DwarfTypeUnit &Type) {
David Blaikief3de2ab2014-04-26 16:26:41 +0000300 // Flag the type unit reference as a declaration so that if it contains
301 // members (implicit special members, static data member definitions, member
302 // declarations for definitions in this CU, etc) consumers don't get confused
303 // and think this is a full definition.
304 addFlag(Die, dwarf::DW_AT_declaration);
305
David Blaikie65a74662014-04-25 18:26:14 +0000306 Die.addValue(dwarf::DW_AT_signature, dwarf::DW_FORM_ref_sig8,
307 new (DIEValueAllocator) DIETypeSignature(Type));
David Blaikie47f615e2013-12-17 23:32:35 +0000308}
309
David Blaikie65a74662014-04-25 18:26:14 +0000310void DwarfUnit::addDIEEntry(DIE &Die, dwarf::Attribute Attribute,
Eric Christophera5a79422013-12-09 23:32:48 +0000311 DIEEntry *Entry) {
David Blaikie65a74662014-04-25 18:26:14 +0000312 const DIE *DieCU = Die.getUnitOrNull();
David Blaikie8dbcc3f2014-04-25 19:33:43 +0000313 const DIE *EntryCU = Entry->getEntry().getUnitOrNull();
Manman Ren4dbdc902013-10-31 17:54:35 +0000314 if (!DieCU)
315 // We assume that Die belongs to this CU, if it is not linked to any CU yet.
David Blaikieadcde362014-04-25 18:35:57 +0000316 DieCU = &getUnitDie();
Manman Ren4dbdc902013-10-31 17:54:35 +0000317 if (!EntryCU)
David Blaikieadcde362014-04-25 18:35:57 +0000318 EntryCU = &getUnitDie();
David Blaikie65a74662014-04-25 18:26:14 +0000319 Die.addValue(Attribute,
320 EntryCU == DieCU ? dwarf::DW_FORM_ref4 : dwarf::DW_FORM_ref_addr,
321 Entry);
Devang Patel0e821f42011-04-12 23:21:44 +0000322}
323
Manman Renb987e512013-10-29 00:53:03 +0000324/// Create a DIE with the given Tag, add the DIE to its parent, and
325/// call insertDIE if MD is not null.
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000326DIE &DwarfUnit::createAndAddDIE(unsigned Tag, DIE &Parent, DIDescriptor N) {
David Blaikieefc403b2014-04-12 02:24:04 +0000327 assert(Tag != dwarf::DW_TAG_auto_variable &&
328 Tag != dwarf::DW_TAG_arg_variable);
David Blaikie914046e2014-04-25 20:00:34 +0000329 Parent.addChild(make_unique<DIE>((dwarf::Tag)Tag));
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000330 DIE &Die = *Parent.getChildren().back();
David Blaikie52c50202013-11-16 00:29:01 +0000331 if (N)
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000332 insertDIE(N, &Die);
Manman Renb987e512013-10-29 00:53:03 +0000333 return Die;
334}
335
Devang Patel0e821f42011-04-12 23:21:44 +0000336/// addBlock - Add block data.
337///
David Blaikie65a74662014-04-25 18:26:14 +0000338void DwarfUnit::addBlock(DIE &Die, dwarf::Attribute Attribute, DIELoc *Loc) {
Eric Christopher8bdab432014-02-27 18:36:10 +0000339 Loc->ComputeSize(Asm);
Eric Christopher4a741042014-02-16 08:46:55 +0000340 DIELocs.push_back(Loc); // Memoize so we can call the destructor later on.
David Blaikie65a74662014-04-25 18:26:14 +0000341 Die.addValue(Attribute, Loc->BestForm(DD->getDwarfVersion()), Loc);
Eric Christopher4a741042014-02-16 08:46:55 +0000342}
343
David Blaikie65a74662014-04-25 18:26:14 +0000344void DwarfUnit::addBlock(DIE &Die, dwarf::Attribute Attribute,
Eric Christophera5a79422013-12-09 23:32:48 +0000345 DIEBlock *Block) {
Eric Christopher8bdab432014-02-27 18:36:10 +0000346 Block->ComputeSize(Asm);
Devang Patel0e821f42011-04-12 23:21:44 +0000347 DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
David Blaikie65a74662014-04-25 18:26:14 +0000348 Die.addValue(Attribute, Block->BestForm(), Block);
Devang Patel0e821f42011-04-12 23:21:44 +0000349}
350
351/// addSourceLine - Add location information to specified debug information
352/// entry.
David Blaikie65a74662014-04-25 18:26:14 +0000353void DwarfUnit::addSourceLine(DIE &Die, unsigned Line, StringRef File,
David Blaikie101613e2014-02-12 00:11:25 +0000354 StringRef Directory) {
Devang Patel0e821f42011-04-12 23:21:44 +0000355 if (Line == 0)
356 return;
David Blaikie101613e2014-02-12 00:11:25 +0000357
David Blaikie4a2f95f2014-03-18 01:17:26 +0000358 unsigned FileID = getOrCreateSourceID(File, Directory);
Devang Patel0e821f42011-04-12 23:21:44 +0000359 assert(FileID && "Invalid file id");
David Blaikief2443192013-10-21 17:28:37 +0000360 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
361 addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
Devang Patel0e821f42011-04-12 23:21:44 +0000362}
363
364/// addSourceLine - Add location information to specified debug information
365/// entry.
David Blaikie65a74662014-04-25 18:26:14 +0000366void DwarfUnit::addSourceLine(DIE &Die, DIVariable V) {
David Blaikie101613e2014-02-12 00:11:25 +0000367 assert(V.isVariable());
368
Eric Christopher89a575c2014-02-12 22:38:04 +0000369 addSourceLine(Die, V.getLineNumber(), V.getContext().getFilename(),
370 V.getContext().getDirectory());
David Blaikie101613e2014-02-12 00:11:25 +0000371}
372
373/// addSourceLine - Add location information to specified debug information
374/// entry.
David Blaikie65a74662014-04-25 18:26:14 +0000375void DwarfUnit::addSourceLine(DIE &Die, DIGlobalVariable G) {
David Blaikie52019302014-02-11 23:57:03 +0000376 assert(G.isGlobalVariable());
Devang Patel0e821f42011-04-12 23:21:44 +0000377
David Blaikie101613e2014-02-12 00:11:25 +0000378 addSourceLine(Die, G.getLineNumber(), G.getFilename(), G.getDirectory());
Devang Patel0e821f42011-04-12 23:21:44 +0000379}
380
381/// addSourceLine - Add location information to specified debug information
382/// entry.
David Blaikie65a74662014-04-25 18:26:14 +0000383void DwarfUnit::addSourceLine(DIE &Die, DISubprogram SP) {
David Blaikie52019302014-02-11 23:57:03 +0000384 assert(SP.isSubprogram());
Eric Christopher7734ca22012-03-15 23:55:40 +0000385
David Blaikie101613e2014-02-12 00:11:25 +0000386 addSourceLine(Die, SP.getLineNumber(), SP.getFilename(), SP.getDirectory());
Devang Patel0e821f42011-04-12 23:21:44 +0000387}
388
389/// addSourceLine - Add location information to specified debug information
390/// entry.
David Blaikie65a74662014-04-25 18:26:14 +0000391void DwarfUnit::addSourceLine(DIE &Die, DIType Ty) {
David Blaikie52019302014-02-11 23:57:03 +0000392 assert(Ty.isType());
Devang Patel0e821f42011-04-12 23:21:44 +0000393
David Blaikie101613e2014-02-12 00:11:25 +0000394 addSourceLine(Die, Ty.getLineNumber(), Ty.getFilename(), Ty.getDirectory());
Devang Patel0e821f42011-04-12 23:21:44 +0000395}
396
397/// addSourceLine - Add location information to specified debug information
398/// entry.
David Blaikie65a74662014-04-25 18:26:14 +0000399void DwarfUnit::addSourceLine(DIE &Die, DIObjCProperty Ty) {
David Blaikie52019302014-02-11 23:57:03 +0000400 assert(Ty.isObjCProperty());
Eric Christopher70e1bd82012-03-29 08:42:56 +0000401
Eric Christopher70e1bd82012-03-29 08:42:56 +0000402 DIFile File = Ty.getFile();
David Blaikie101613e2014-02-12 00:11:25 +0000403 addSourceLine(Die, Ty.getLineNumber(), File.getFilename(),
404 File.getDirectory());
Eric Christopher70e1bd82012-03-29 08:42:56 +0000405}
406
407/// addSourceLine - Add location information to specified debug information
408/// entry.
David Blaikie65a74662014-04-25 18:26:14 +0000409void DwarfUnit::addSourceLine(DIE &Die, DINameSpace NS) {
David Blaikie52019302014-02-11 23:57:03 +0000410 assert(NS.Verify());
Devang Patel0e821f42011-04-12 23:21:44 +0000411
David Blaikie101613e2014-02-12 00:11:25 +0000412 addSourceLine(Die, NS.getLineNumber(), NS.getFilename(), NS.getDirectory());
Devang Patel0e821f42011-04-12 23:21:44 +0000413}
414
Devang Patelba5fbf12011-04-26 19:06:18 +0000415/// addRegisterOp - Add register operand.
Adrian Prantlab255fc2014-12-05 01:02:46 +0000416bool DwarfUnit::addRegisterOpPiece(DIELoc &TheDie, unsigned Reg,
Adrian Prantlb1416832014-08-01 22:11:58 +0000417 unsigned SizeInBits, unsigned OffsetInBits) {
Adrian Prantla4c30d62015-01-12 23:36:56 +0000418 DIEDwarfExpression Expr(*Asm, *this, TheDie);
Adrian Prantl0e6ffb92015-01-12 22:37:16 +0000419 Expr.AddMachineRegPiece(Reg, SizeInBits, OffsetInBits);
Adrian Prantlab255fc2014-12-05 01:02:46 +0000420 return true;
Devang Patelba5fbf12011-04-26 19:06:18 +0000421}
422
423/// addRegisterOffset - Add register offset.
Adrian Prantlab255fc2014-12-05 01:02:46 +0000424bool DwarfUnit::addRegisterOffset(DIELoc &TheDie, unsigned Reg,
Eric Christophera5a79422013-12-09 23:32:48 +0000425 int64_t Offset) {
Adrian Prantla4c30d62015-01-12 23:36:56 +0000426 DIEDwarfExpression Expr(*Asm, *this, TheDie);
Adrian Prantl00dbc2a2015-01-12 22:19:26 +0000427 return Expr.AddMachineRegIndirect(Reg, Offset);
Devang Patelba5fbf12011-04-26 19:06:18 +0000428}
429
Devang Patel0e821f42011-04-12 23:21:44 +0000430/* Byref variables, in Blocks, are declared by the programmer as "SomeType
431 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
432 gives the variable VarName either the struct, or a pointer to the struct, as
433 its type. This is necessary for various behind-the-scenes things the
434 compiler needs to do with by-reference variables in Blocks.
435
436 However, as far as the original *programmer* is concerned, the variable
437 should still have type 'SomeType', as originally declared.
438
439 The function getBlockByrefType dives into the __Block_byref_x_VarName
440 struct to find the original type of the variable, which is then assigned to
441 the variable's Debug Information Entry as its real type. So far, so good.
442 However now the debugger will expect the variable VarName to have the type
443 SomeType. So we need the location attribute for the variable to be an
444 expression that explains to the debugger how to navigate through the
445 pointers and struct to find the actual variable of type SomeType.
446
447 The following function does just that. We start by getting
448 the "normal" location for the variable. This will be the location
449 of either the struct __Block_byref_x_VarName or the pointer to the
450 struct __Block_byref_x_VarName.
451
452 The struct will look something like:
453
454 struct __Block_byref_x_VarName {
455 ... <various fields>
456 struct __Block_byref_x_VarName *forwarding;
457 ... <various other fields>
458 SomeType VarName;
459 ... <maybe more fields>
460 };
461
462 If we are given the struct directly (as our starting point) we
463 need to tell the debugger to:
464
465 1). Add the offset of the forwarding field.
466
467 2). Follow that pointer to get the real __Block_byref_x_VarName
468 struct to use (the real one may have been copied onto the heap).
469
470 3). Add the offset for the field VarName, to find the actual variable.
471
472 If we started with a pointer to the struct, then we need to
473 dereference that pointer first, before the other steps.
474 Translating this into DWARF ops, we will need to append the following
475 to the current location description for the variable:
476
477 DW_OP_deref -- optional, if we start with a pointer
478 DW_OP_plus_uconst <forward_fld_offset>
479 DW_OP_deref
480 DW_OP_plus_uconst <varName_fld_offset>
481
482 That is what this function does. */
483
484/// addBlockByrefAddress - Start with the address based on the location
485/// provided, and generate the DWARF information necessary to find the
486/// actual Block variable (navigating the Block struct) based on the
487/// starting location. Add the DWARF information to the die. For
488/// more information, read large comment just above here.
489///
David Blaikie65a74662014-04-25 18:26:14 +0000490void DwarfUnit::addBlockByrefAddress(const DbgVariable &DV, DIE &Die,
Eric Christophera5a79422013-12-09 23:32:48 +0000491 dwarf::Attribute Attribute,
492 const MachineLocation &Location) {
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000493 DIType Ty = DV.getType();
Devang Patel0e821f42011-04-12 23:21:44 +0000494 DIType TmpTy = Ty;
Eric Christopher31b05762013-08-08 01:41:00 +0000495 uint16_t Tag = Ty.getTag();
Devang Patel0e821f42011-04-12 23:21:44 +0000496 bool isPointer = false;
497
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000498 StringRef varName = DV.getName();
Devang Patel0e821f42011-04-12 23:21:44 +0000499
500 if (Tag == dwarf::DW_TAG_pointer_type) {
David Blaikie4f6bf27a2013-11-18 23:33:32 +0000501 DIDerivedType DTy(Ty);
Manman Ren93b30902013-10-08 18:42:58 +0000502 TmpTy = resolve(DTy.getTypeDerivedFrom());
Devang Patel0e821f42011-04-12 23:21:44 +0000503 isPointer = true;
504 }
505
David Blaikie4f6bf27a2013-11-18 23:33:32 +0000506 DICompositeType blockStruct(TmpTy);
Devang Patel0e821f42011-04-12 23:21:44 +0000507
508 // Find the __forwarding field and the variable field in the __Block_byref
509 // struct.
Manman Renab8ffba2014-07-28 19:14:13 +0000510 DIArray Fields = blockStruct.getElements();
David Blaikie4f6bf27a2013-11-18 23:33:32 +0000511 DIDerivedType varField;
512 DIDerivedType forwardingField;
Devang Patel0e821f42011-04-12 23:21:44 +0000513
514 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
David Blaikie4f6bf27a2013-11-18 23:33:32 +0000515 DIDerivedType DT(Fields.getElement(i));
Devang Patel0e821f42011-04-12 23:21:44 +0000516 StringRef fieldName = DT.getName();
517 if (fieldName == "__forwarding")
David Blaikie4f6bf27a2013-11-18 23:33:32 +0000518 forwardingField = DT;
Devang Patel0e821f42011-04-12 23:21:44 +0000519 else if (fieldName == varName)
David Blaikie4f6bf27a2013-11-18 23:33:32 +0000520 varField = DT;
Devang Patel0e821f42011-04-12 23:21:44 +0000521 }
522
523 // Get the offsets for the forwarding field and the variable field.
David Blaikie4f6bf27a2013-11-18 23:33:32 +0000524 unsigned forwardingFieldOffset = forwardingField.getOffsetInBits() >> 3;
525 unsigned varFieldOffset = varField.getOffsetInBits() >> 2;
Devang Patel0e821f42011-04-12 23:21:44 +0000526
527 // Decode the original location, and use that as the start of the byref
528 // variable's location.
Eric Christopher4a741042014-02-16 08:46:55 +0000529 DIELoc *Loc = new (DIEValueAllocator) DIELoc();
Devang Patel0e821f42011-04-12 23:21:44 +0000530
Adrian Prantlab255fc2014-12-05 01:02:46 +0000531 bool validReg;
Eric Christopheref9d7102012-07-04 02:02:18 +0000532 if (Location.isReg())
Adrian Prantlab255fc2014-12-05 01:02:46 +0000533 validReg = addRegisterOpPiece(*Loc, Location.getReg());
Eric Christopheref9d7102012-07-04 02:02:18 +0000534 else
Adrian Prantlab255fc2014-12-05 01:02:46 +0000535 validReg = addRegisterOffset(*Loc, Location.getReg(), Location.getOffset());
536
537 if (!validReg)
538 return;
Devang Patel0e821f42011-04-12 23:21:44 +0000539
540 // If we started with a pointer to the __Block_byref... struct, then
541 // the first thing we need to do is dereference the pointer (DW_OP_deref).
542 if (isPointer)
David Blaikie65a74662014-04-25 18:26:14 +0000543 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Devang Patel0e821f42011-04-12 23:21:44 +0000544
545 // Next add the offset for the '__forwarding' field:
546 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
547 // adding the offset if it's 0.
548 if (forwardingFieldOffset > 0) {
David Blaikie65a74662014-04-25 18:26:14 +0000549 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
550 addUInt(*Loc, dwarf::DW_FORM_udata, forwardingFieldOffset);
Devang Patel0e821f42011-04-12 23:21:44 +0000551 }
552
553 // Now dereference the __forwarding field to get to the real __Block_byref
554 // struct: DW_OP_deref.
David Blaikie65a74662014-04-25 18:26:14 +0000555 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Devang Patel0e821f42011-04-12 23:21:44 +0000556
557 // Now that we've got the real __Block_byref... struct, add the offset
558 // for the variable's field to get to the location of the actual variable:
559 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
560 if (varFieldOffset > 0) {
David Blaikie65a74662014-04-25 18:26:14 +0000561 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
562 addUInt(*Loc, dwarf::DW_FORM_udata, varFieldOffset);
Devang Patel0e821f42011-04-12 23:21:44 +0000563 }
564
565 // Now attach the location information to the DIE.
Eric Christopher4a741042014-02-16 08:46:55 +0000566 addBlock(Die, Attribute, Loc);
Devang Patel0e821f42011-04-12 23:21:44 +0000567}
568
Manman Renb3388602013-10-05 01:43:03 +0000569/// Return true if type encoding is unsigned.
570static bool isUnsignedDIType(DwarfDebug *DD, DIType Ty) {
571 DIDerivedType DTy(Ty);
David Blaikiee0f14742014-05-11 17:04:05 +0000572 if (DTy.isDerivedType()) {
David Blaikie2af1c802014-05-20 18:21:51 +0000573 dwarf::Tag T = (dwarf::Tag)Ty.getTag();
574 // Encode pointer constants as unsigned bytes. This is used at least for
David Blaikie93ef46b2014-05-20 21:40:13 +0000575 // null pointer constant emission.
Adrian Prantld88af272015-01-07 21:35:13 +0000576 // (Pieces of) aggregate types that get hacked apart by SROA may also be
577 // represented by a constant. Encode them as unsigned bytes.
David Blaikie93ef46b2014-05-20 21:40:13 +0000578 // FIXME: reference and rvalue_reference /probably/ shouldn't be allowed
579 // here, but accept them for now due to a bug in SROA producing bogus
580 // dbg.values.
Adrian Prantl3dd48c62015-01-07 20:48:58 +0000581 if (T == dwarf::DW_TAG_array_type ||
582 T == dwarf::DW_TAG_class_type ||
583 T == dwarf::DW_TAG_pointer_type ||
David Blaikie93ef46b2014-05-20 21:40:13 +0000584 T == dwarf::DW_TAG_ptr_to_member_type ||
585 T == dwarf::DW_TAG_reference_type ||
Adrian Prantl3dd48c62015-01-07 20:48:58 +0000586 T == dwarf::DW_TAG_rvalue_reference_type ||
Adrian Prantl577feba2015-01-23 18:01:39 +0000587 T == dwarf::DW_TAG_structure_type ||
588 T == dwarf::DW_TAG_union_type)
David Blaikie2af1c802014-05-20 18:21:51 +0000589 return true;
590 assert(T == dwarf::DW_TAG_typedef || T == dwarf::DW_TAG_const_type ||
591 T == dwarf::DW_TAG_volatile_type ||
David Blaikie1d9aec62014-05-20 18:36:35 +0000592 T == dwarf::DW_TAG_restrict_type ||
593 T == dwarf::DW_TAG_enumeration_type);
David Blaikie2af1c802014-05-20 18:21:51 +0000594 if (DITypeRef Deriv = DTy.getTypeDerivedFrom())
595 return isUnsignedDIType(DD, DD->resolve(Deriv));
David Blaikiee0f14742014-05-11 17:04:05 +0000596 // FIXME: Enums without a fixed underlying type have unknown signedness
597 // here, leading to incorrectly emitted constants.
598 assert(DTy.getTag() == dwarf::DW_TAG_enumeration_type);
599 return false;
600 }
Manman Renb3388602013-10-05 01:43:03 +0000601
602 DIBasicType BTy(Ty);
David Blaikiee0f14742014-05-11 17:04:05 +0000603 assert(BTy.isBasicType());
David Blaikie60cae1b2014-05-11 16:08:41 +0000604 unsigned Encoding = BTy.getEncoding();
Saleem Abdulrasoolfba09d42014-05-12 06:08:18 +0000605 assert((Encoding == dwarf::DW_ATE_unsigned ||
606 Encoding == dwarf::DW_ATE_unsigned_char ||
607 Encoding == dwarf::DW_ATE_signed ||
608 Encoding == dwarf::DW_ATE_signed_char ||
David Blaikie8b979f02014-12-17 00:43:22 +0000609 Encoding == dwarf::DW_ATE_UTF || Encoding == dwarf::DW_ATE_boolean ||
610 (Ty.getTag() == dwarf::DW_TAG_unspecified_type &&
611 Ty.getName() == "decltype(nullptr)")) &&
David Blaikiec405c9c2014-05-16 21:53:09 +0000612 "Unsupported encoding");
David Blaikie60cae1b2014-05-11 16:08:41 +0000613 return (Encoding == dwarf::DW_ATE_unsigned ||
614 Encoding == dwarf::DW_ATE_unsigned_char ||
David Blaikie8b979f02014-12-17 00:43:22 +0000615 Encoding == dwarf::DW_ATE_UTF || Encoding == dwarf::DW_ATE_boolean ||
616 Ty.getTag() == dwarf::DW_TAG_unspecified_type);
Manman Renb3388602013-10-05 01:43:03 +0000617}
618
619/// If this type is derived from a base type then return base type size.
Manman Renbda410f2013-10-08 18:46:58 +0000620static uint64_t getBaseTypeSize(DwarfDebug *DD, DIDerivedType Ty) {
Manman Renb3388602013-10-05 01:43:03 +0000621 unsigned Tag = Ty.getTag();
622
623 if (Tag != dwarf::DW_TAG_member && Tag != dwarf::DW_TAG_typedef &&
624 Tag != dwarf::DW_TAG_const_type && Tag != dwarf::DW_TAG_volatile_type &&
625 Tag != dwarf::DW_TAG_restrict_type)
626 return Ty.getSizeInBits();
627
628 DIType BaseType = DD->resolve(Ty.getTypeDerivedFrom());
629
David Blaikiee2452282015-01-28 02:43:15 +0000630 assert(BaseType.isValid() && "Unexpected invalid base type");
Manman Renb3388602013-10-05 01:43:03 +0000631
632 // If this is a derived type, go ahead and get the base type, unless it's a
633 // reference then it's just the size of the field. Pointer types have no need
634 // of this since they're a different type of qualification on the type.
635 if (BaseType.getTag() == dwarf::DW_TAG_reference_type ||
636 BaseType.getTag() == dwarf::DW_TAG_rvalue_reference_type)
637 return Ty.getSizeInBits();
638
639 if (BaseType.isDerivedType())
Manman Renbda410f2013-10-08 18:46:58 +0000640 return getBaseTypeSize(DD, DIDerivedType(BaseType));
Manman Renb3388602013-10-05 01:43:03 +0000641
642 return BaseType.getSizeInBits();
643}
644
Devang Patel0e821f42011-04-12 23:21:44 +0000645/// addConstantFPValue - Add constant value entry in variable DIE.
David Blaikie65a74662014-04-25 18:26:14 +0000646void DwarfUnit::addConstantFPValue(DIE &Die, const MachineOperand &MO) {
Eric Christopherc2697f82013-10-19 01:04:47 +0000647 assert(MO.isFPImm() && "Invalid machine operand!");
Devang Patel0e821f42011-04-12 23:21:44 +0000648 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
649 APFloat FPImm = MO.getFPImm()->getValueAPF();
650
651 // Get the raw data form of the floating point.
652 const APInt FltVal = FPImm.bitcastToAPInt();
Eric Christopherc2697f82013-10-19 01:04:47 +0000653 const char *FltPtr = (const char *)FltVal.getRawData();
Devang Patel0e821f42011-04-12 23:21:44 +0000654
655 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
Micah Villmowcdfe20b2012-10-08 16:38:25 +0000656 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel0e821f42011-04-12 23:21:44 +0000657 int Incr = (LittleEndian ? 1 : -1);
658 int Start = (LittleEndian ? 0 : NumBytes - 1);
659 int Stop = (LittleEndian ? NumBytes : -1);
660
661 // Output the constant to DWARF one byte at a time.
662 for (; Start != Stop; Start += Incr)
David Blaikie65a74662014-04-25 18:26:14 +0000663 addUInt(*Block, dwarf::DW_FORM_data1, (unsigned char)0xFF & FltPtr[Start]);
Devang Patel0e821f42011-04-12 23:21:44 +0000664
David Blaikief2443192013-10-21 17:28:37 +0000665 addBlock(Die, dwarf::DW_AT_const_value, Block);
Devang Patel0e821f42011-04-12 23:21:44 +0000666}
667
David Blaikiea39a76e2013-01-20 01:18:01 +0000668/// addConstantFPValue - Add constant value entry in variable DIE.
David Blaikie65a74662014-04-25 18:26:14 +0000669void DwarfUnit::addConstantFPValue(DIE &Die, const ConstantFP *CFP) {
Eric Christopher9d1daa82013-08-27 23:49:04 +0000670 // Pass this down to addConstantValue as an unsigned bag of bits.
671 addConstantValue(Die, CFP->getValueAPF().bitcastToAPInt(), true);
David Blaikiea39a76e2013-01-20 01:18:01 +0000672}
673
Devang Patel0e821f42011-04-12 23:21:44 +0000674/// addConstantValue - Add constant value entry in variable DIE.
David Blaikiec0a28412014-05-11 15:56:59 +0000675void DwarfUnit::addConstantValue(DIE &Die, const ConstantInt *CI, DIType Ty) {
676 addConstantValue(Die, CI->getValue(), Ty);
David Blaikiea39a76e2013-01-20 01:18:01 +0000677}
678
David Blaikiec05c8f42014-05-11 15:47:39 +0000679/// addConstantValue - Add constant value entry in variable DIE.
680void DwarfUnit::addConstantValue(DIE &Die, const MachineOperand &MO,
681 DIType Ty) {
682 assert(MO.isImm() && "Invalid machine operand!");
683
David Blaikie60cae1b2014-05-11 16:08:41 +0000684 addConstantValue(Die, isUnsignedDIType(DD, Ty), MO.getImm());
David Blaikiec05c8f42014-05-11 15:47:39 +0000685}
686
David Blaikie60cae1b2014-05-11 16:08:41 +0000687void DwarfUnit::addConstantValue(DIE &Die, bool Unsigned, uint64_t Val) {
David Blaikiec05c8f42014-05-11 15:47:39 +0000688 // FIXME: This is a bit conservative/simple - it emits negative values always
689 // sign extended to 64 bits rather than minimizing the number of bytes.
690 addUInt(Die, dwarf::DW_AT_const_value,
David Blaikie60cae1b2014-05-11 16:08:41 +0000691 Unsigned ? dwarf::DW_FORM_udata : dwarf::DW_FORM_sdata, Val);
David Blaikiec05c8f42014-05-11 15:47:39 +0000692}
693
David Blaikiec0a28412014-05-11 15:56:59 +0000694void DwarfUnit::addConstantValue(DIE &Die, const APInt &Val, DIType Ty) {
695 addConstantValue(Die, Val, isUnsignedDIType(DD, Ty));
696}
697
David Blaikiea39a76e2013-01-20 01:18:01 +0000698// addConstantValue - Add constant value entry in variable DIE.
David Blaikie65a74662014-04-25 18:26:14 +0000699void DwarfUnit::addConstantValue(DIE &Die, const APInt &Val, bool Unsigned) {
David Blaikiea39a76e2013-01-20 01:18:01 +0000700 unsigned CIBitWidth = Val.getBitWidth();
Devang Patel8816bbc2011-05-28 00:39:18 +0000701 if (CIBitWidth <= 64) {
David Blaikie60cae1b2014-05-11 16:08:41 +0000702 addConstantValue(Die, Unsigned,
703 Unsigned ? Val.getZExtValue() : Val.getSExtValue());
Eric Christopher78fcf4902013-07-03 01:08:30 +0000704 return;
Devang Patel0e821f42011-04-12 23:21:44 +0000705 }
706
707 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
708
709 // Get the raw data form of the large APInt.
NAKAMURA Takumi29ccdd82011-10-28 14:12:22 +0000710 const uint64_t *Ptr64 = Val.getRawData();
Devang Patel0e821f42011-04-12 23:21:44 +0000711
712 int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
Micah Villmowcdfe20b2012-10-08 16:38:25 +0000713 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel0e821f42011-04-12 23:21:44 +0000714
715 // Output the constant to DWARF one byte at a time.
NAKAMURA Takumi29ccdd82011-10-28 14:12:22 +0000716 for (int i = 0; i < NumBytes; i++) {
717 uint8_t c;
718 if (LittleEndian)
719 c = Ptr64[i / 8] >> (8 * (i & 7));
720 else
721 c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7));
David Blaikie65a74662014-04-25 18:26:14 +0000722 addUInt(*Block, dwarf::DW_FORM_data1, c);
NAKAMURA Takumi29ccdd82011-10-28 14:12:22 +0000723 }
Devang Patel0e821f42011-04-12 23:21:44 +0000724
David Blaikief2443192013-10-21 17:28:37 +0000725 addBlock(Die, dwarf::DW_AT_const_value, Block);
Devang Patel0e821f42011-04-12 23:21:44 +0000726}
727
Eric Christopher25e35092013-04-22 07:47:40 +0000728/// addTemplateParams - Add template parameters into buffer.
Eric Christophera5a79422013-12-09 23:32:48 +0000729void DwarfUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
Devang Patel0e821f42011-04-12 23:21:44 +0000730 // Add template parameters.
731 for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) {
732 DIDescriptor Element = TParams.getElement(i);
733 if (Element.isTemplateTypeParameter())
Manman Renffc9a712013-10-23 23:05:28 +0000734 constructTemplateTypeParameterDIE(Buffer,
735 DITemplateTypeParameter(Element));
Devang Patel0e821f42011-04-12 23:21:44 +0000736 else if (Element.isTemplateValueParameter())
Manman Renffc9a712013-10-23 23:05:28 +0000737 constructTemplateValueParameterDIE(Buffer,
738 DITemplateValueParameter(Element));
Devang Patel0e821f42011-04-12 23:21:44 +0000739 }
Devang Patel0e821f42011-04-12 23:21:44 +0000740}
Nick Lewycky654f5ce2011-10-26 22:55:33 +0000741
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000742/// getOrCreateContextDIE - Get context owner's DIE.
Eric Christophera5a79422013-12-09 23:32:48 +0000743DIE *DwarfUnit::getOrCreateContextDIE(DIScope Context) {
David Blaikiebd700e42013-11-14 21:24:34 +0000744 if (!Context || Context.isFile())
David Blaikieadcde362014-04-25 18:35:57 +0000745 return &getUnitDie();
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000746 if (Context.isType())
747 return getOrCreateTypeDIE(DIType(Context));
David Blaikie1dbca702013-11-14 19:37:56 +0000748 if (Context.isNameSpace())
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000749 return getOrCreateNameSpace(DINameSpace(Context));
David Blaikie1dbca702013-11-14 19:37:56 +0000750 if (Context.isSubprogram())
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000751 return getOrCreateSubprogramDIE(DISubprogram(Context));
Adrian Prantl7d828bb2013-11-15 21:05:09 +0000752 return getDIE(Context);
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000753}
754
Eric Christophera5a79422013-12-09 23:32:48 +0000755DIE *DwarfUnit::createTypeDIE(DICompositeType Ty) {
David Blaikie9d861be2013-11-26 00:15:27 +0000756 DIScope Context = resolve(Ty.getContext());
757 DIE *ContextDIE = getOrCreateContextDIE(Context);
David Blaikie409dd9c2013-11-19 23:08:21 +0000758
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000759 if (DIE *TyDIE = getDIE(Ty))
David Blaikie409dd9c2013-11-19 23:08:21 +0000760 return TyDIE;
761
762 // Create new type.
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000763 DIE &TyDIE = createAndAddDIE(Ty.getTag(), *ContextDIE, Ty);
David Blaikie409dd9c2013-11-19 23:08:21 +0000764
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000765 constructTypeDIE(TyDIE, Ty);
David Blaikie409dd9c2013-11-19 23:08:21 +0000766
David Blaikie9d861be2013-11-26 00:15:27 +0000767 updateAcceleratorTables(Context, Ty, TyDIE);
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000768 return &TyDIE;
David Blaikie409dd9c2013-11-19 23:08:21 +0000769}
770
Devang Patel0e821f42011-04-12 23:21:44 +0000771/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
772/// given DIType.
Eric Christophera5a79422013-12-09 23:32:48 +0000773DIE *DwarfUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
David Blaikie32887552013-11-14 22:25:02 +0000774 if (!TyNode)
Craig Topper353eda42014-04-24 06:44:33 +0000775 return nullptr;
Manman Renf4c339e2013-10-29 22:49:29 +0000776
David Blaikie32887552013-11-14 22:25:02 +0000777 DIType Ty(TyNode);
778 assert(Ty.isType());
Adrian Prantlc95ec912014-03-24 21:33:01 +0000779 assert(Ty == resolve(Ty.getRef()) &&
Adrian Prantl0aa1aa22014-03-18 02:35:03 +0000780 "type was not uniqued, possible ODR violation.");
David Blaikie32887552013-11-14 22:25:02 +0000781
David Blaikieee11f222014-04-12 05:35:59 +0000782 // DW_TAG_restrict_type is not supported in DWARF2
783 if (Ty.getTag() == dwarf::DW_TAG_restrict_type && DD->getDwarfVersion() <= 2)
784 return getOrCreateTypeDIE(resolve(DIDerivedType(Ty).getTypeDerivedFrom()));
785
Manman Renf4c339e2013-10-29 22:49:29 +0000786 // Construct the context before querying for the existence of the DIE in case
787 // such construction creates the DIE.
David Blaikie9d861be2013-11-26 00:15:27 +0000788 DIScope Context = resolve(Ty.getContext());
789 DIE *ContextDIE = getOrCreateContextDIE(Context);
Adrian Prantl4583f7d2013-11-15 23:21:39 +0000790 assert(ContextDIE);
Manman Renf4c339e2013-10-29 22:49:29 +0000791
David Blaikie65a74662014-04-25 18:26:14 +0000792 if (DIE *TyDIE = getDIE(Ty))
Devang Patel0e821f42011-04-12 23:21:44 +0000793 return TyDIE;
794
795 // Create new type.
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000796 DIE &TyDIE = createAndAddDIE(Ty.getTag(), *ContextDIE, Ty);
Manman Renf4c339e2013-10-29 22:49:29 +0000797
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000798 updateAcceleratorTables(Context, Ty, TyDIE);
David Blaikiec3d9e9e2014-03-06 01:42:00 +0000799
Devang Patel0e821f42011-04-12 23:21:44 +0000800 if (Ty.isBasicType())
David Blaikie65a74662014-04-25 18:26:14 +0000801 constructTypeDIE(TyDIE, DIBasicType(Ty));
David Blaikie8a263cb2013-11-26 00:22:37 +0000802 else if (Ty.isCompositeType()) {
803 DICompositeType CTy(Ty);
David Blaikiecfb21152014-01-03 18:59:42 +0000804 if (GenerateDwarfTypeUnits && !Ty.isForwardDecl())
805 if (MDString *TypeId = CTy.getIdentifier()) {
David Blaikie15632ae2014-02-12 00:31:30 +0000806 DD->addDwarfTypeUnitType(getCU(), TypeId->getString(), TyDIE, CTy);
Adrian Prantle2da17f2014-03-14 23:08:17 +0000807 // Skip updating the accelerator tables since this is not the full type.
David Blaikie65a74662014-04-25 18:26:14 +0000808 return &TyDIE;
David Blaikiecfb21152014-01-03 18:59:42 +0000809 }
David Blaikie65a74662014-04-25 18:26:14 +0000810 constructTypeDIE(TyDIE, CTy);
David Blaikie8a263cb2013-11-26 00:22:37 +0000811 } else {
Devang Patel0e821f42011-04-12 23:21:44 +0000812 assert(Ty.isDerivedType() && "Unknown kind of DIType");
David Blaikie65a74662014-04-25 18:26:14 +0000813 constructTypeDIE(TyDIE, DIDerivedType(Ty));
Devang Patel0e821f42011-04-12 23:21:44 +0000814 }
David Blaikie2ea848b2013-11-19 22:51:04 +0000815
David Blaikie65a74662014-04-25 18:26:14 +0000816 return &TyDIE;
David Blaikie2ea848b2013-11-19 22:51:04 +0000817}
818
Eric Christophera5a79422013-12-09 23:32:48 +0000819void DwarfUnit::updateAcceleratorTables(DIScope Context, DIType Ty,
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000820 const DIE &TyDIE) {
Eric Christopher21bde872012-01-06 04:35:23 +0000821 if (!Ty.getName().empty() && !Ty.isForwardDecl()) {
822 bool IsImplementation = 0;
823 if (Ty.isCompositeType()) {
824 DICompositeType CT(Ty);
Eric Christopher8ea8e4f2012-01-06 23:03:37 +0000825 // A runtime language of 0 actually means C/C++ and that any
826 // non-negative value is some version of Objective-C/C++.
Eric Christopherc2697f82013-10-19 01:04:47 +0000827 IsImplementation = (CT.getRunTimeLang() == 0) || CT.isObjcClassComplete();
Eric Christopher21bde872012-01-06 04:35:23 +0000828 }
Eric Christophercf7289f2013-09-05 18:20:16 +0000829 unsigned Flags = IsImplementation ? dwarf::DW_FLAG_type_implementation : 0;
David Blaikie18d33752014-04-24 01:23:49 +0000830 DD->addAccelType(Ty.getName(), TyDIE, Flags);
David Blaikie9d861be2013-11-26 00:15:27 +0000831
David Blaikie98cf1722014-11-02 06:06:14 +0000832 if (!Context || Context.isCompileUnit() || Context.isFile() ||
833 Context.isNameSpace())
834 addGlobalType(Ty, TyDIE, Context);
Eric Christopher21bde872012-01-06 04:35:23 +0000835 }
Devang Patel0e821f42011-04-12 23:21:44 +0000836}
837
838/// addType - Add a new type attribute to the specified entity.
David Blaikie65a74662014-04-25 18:26:14 +0000839void DwarfUnit::addType(DIE &Entity, DIType Ty, dwarf::Attribute Attribute) {
Eric Christopher0df08e22013-08-08 07:40:37 +0000840 assert(Ty && "Trying to add a type that doesn't exist?");
Devang Patel0e821f42011-04-12 23:21:44 +0000841
842 // Check for pre-existence.
843 DIEEntry *Entry = getDIEEntry(Ty);
844 // If it exists then use the existing value.
845 if (Entry) {
Manman Ren4dbdc902013-10-31 17:54:35 +0000846 addDIEEntry(Entity, Attribute, Entry);
Devang Patel0e821f42011-04-12 23:21:44 +0000847 return;
848 }
849
850 // Construct type.
851 DIE *Buffer = getOrCreateTypeDIE(Ty);
852
853 // Set up proxy.
David Blaikie8dbcc3f2014-04-25 19:33:43 +0000854 Entry = createDIEEntry(*Buffer);
Devang Patel0e821f42011-04-12 23:21:44 +0000855 insertDIEEntry(Ty, Entry);
Manman Ren4dbdc902013-10-31 17:54:35 +0000856 addDIEEntry(Entity, Attribute, Entry);
Devang Patel1cb8ab42011-05-31 23:30:30 +0000857}
858
Eric Christopher2c8b7902013-10-17 02:06:06 +0000859/// getParentContextString - Walks the metadata parent chain in a language
860/// specific manner (using the compile unit language) and returns
861/// it as a string. This is done at the metadata level because DIEs may
862/// not currently have been added to the parent context and walking the
863/// DIEs looking for names is more expensive than walking the metadata.
Eric Christophera5a79422013-12-09 23:32:48 +0000864std::string DwarfUnit::getParentContextString(DIScope Context) const {
Eric Christopher2c8b7902013-10-17 02:06:06 +0000865 if (!Context)
866 return "";
867
868 // FIXME: Decide whether to implement this for non-C++ languages.
869 if (getLanguage() != dwarf::DW_LANG_C_plus_plus)
870 return "";
871
Eric Christopher8dba0d52013-10-19 01:04:42 +0000872 std::string CS;
Eric Christopher2c8b7902013-10-17 02:06:06 +0000873 SmallVector<DIScope, 1> Parents;
874 while (!Context.isCompileUnit()) {
875 Parents.push_back(Context);
876 if (Context.getContext())
877 Context = resolve(Context.getContext());
878 else
879 // Structure, etc types will have a NULL context if they're at the top
880 // level.
881 break;
882 }
883
884 // Reverse iterate over our list to go from the outermost construct to the
885 // innermost.
886 for (SmallVectorImpl<DIScope>::reverse_iterator I = Parents.rbegin(),
887 E = Parents.rend();
888 I != E; ++I) {
889 DIScope Ctx = *I;
890 StringRef Name = Ctx.getName();
David Blaikie553eb4a2014-06-06 22:16:56 +0000891 if (Name.empty() && Ctx.isNameSpace())
892 Name = "(anonymous namespace)";
Eric Christopher8dba0d52013-10-19 01:04:42 +0000893 if (!Name.empty()) {
Eric Christopher2c8b7902013-10-17 02:06:06 +0000894 CS += Name;
895 CS += "::";
896 }
897 }
898 return CS;
Devang Patel0e821f42011-04-12 23:21:44 +0000899}
900
901/// constructTypeDIE - Construct basic type die from DIBasicType.
Eric Christophera5a79422013-12-09 23:32:48 +0000902void DwarfUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
Devang Patel0e821f42011-04-12 23:21:44 +0000903 // Get core information.
904 StringRef Name = BTy.getName();
Devang Patel0e821f42011-04-12 23:21:44 +0000905 // Add name if not anonymous or intermediate type.
906 if (!Name.empty())
David Blaikie65a74662014-04-25 18:26:14 +0000907 addString(Buffer, dwarf::DW_AT_name, Name);
Devang Patel04d6d472011-09-14 23:13:28 +0000908
David Blaikiefac56122013-10-04 23:21:16 +0000909 // An unspecified type only has a name attribute.
910 if (BTy.getTag() == dwarf::DW_TAG_unspecified_type)
Devang Patel04d6d472011-09-14 23:13:28 +0000911 return;
Devang Patel04d6d472011-09-14 23:13:28 +0000912
David Blaikie65a74662014-04-25 18:26:14 +0000913 addUInt(Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
Devang Pateld925d1a2012-02-07 23:33:58 +0000914 BTy.getEncoding());
Devang Patel04d6d472011-09-14 23:13:28 +0000915
Devang Patel0e821f42011-04-12 23:21:44 +0000916 uint64_t Size = BTy.getSizeInBits() >> 3;
David Blaikie65a74662014-04-25 18:26:14 +0000917 addUInt(Buffer, dwarf::DW_AT_byte_size, None, Size);
Devang Patel0e821f42011-04-12 23:21:44 +0000918}
919
920/// constructTypeDIE - Construct derived type die from DIDerivedType.
Eric Christophera5a79422013-12-09 23:32:48 +0000921void DwarfUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
Devang Patel0e821f42011-04-12 23:21:44 +0000922 // Get core information.
923 StringRef Name = DTy.getName();
924 uint64_t Size = DTy.getSizeInBits() >> 3;
David Blaikiefac56122013-10-04 23:21:16 +0000925 uint16_t Tag = Buffer.getTag();
Devang Patel0e821f42011-04-12 23:21:44 +0000926
927 // Map to main type, void will not have a type.
Manman Ren93b30902013-10-08 18:42:58 +0000928 DIType FromTy = resolve(DTy.getTypeDerivedFrom());
Eric Christopher0df08e22013-08-08 07:40:37 +0000929 if (FromTy)
David Blaikie65a74662014-04-25 18:26:14 +0000930 addType(Buffer, FromTy);
Devang Patel0e821f42011-04-12 23:21:44 +0000931
932 // Add name if not anonymous or intermediate type.
933 if (!Name.empty())
David Blaikie65a74662014-04-25 18:26:14 +0000934 addString(Buffer, dwarf::DW_AT_name, Name);
Devang Patel0e821f42011-04-12 23:21:44 +0000935
936 // Add size if non-zero (derived types might be zero-sized.)
Adrian Prantl3026a542014-12-24 01:17:51 +0000937 if (Size && Tag != dwarf::DW_TAG_pointer_type
938 && Tag != dwarf::DW_TAG_ptr_to_member_type)
David Blaikie65a74662014-04-25 18:26:14 +0000939 addUInt(Buffer, dwarf::DW_AT_byte_size, None, Size);
Devang Patel0e821f42011-04-12 23:21:44 +0000940
David Blaikie5d3249b2013-01-07 05:51:15 +0000941 if (Tag == dwarf::DW_TAG_ptr_to_member_type)
David Blaikie65a74662014-04-25 18:26:14 +0000942 addDIEEntry(Buffer, dwarf::DW_AT_containing_type,
David Blaikie8dbcc3f2014-04-25 19:33:43 +0000943 *getOrCreateTypeDIE(resolve(DTy.getClassType())));
Devang Patel0e821f42011-04-12 23:21:44 +0000944 // Add source line info if available and TyDesc is not a forward declaration.
945 if (!DTy.isForwardDecl())
David Blaikie65a74662014-04-25 18:26:14 +0000946 addSourceLine(Buffer, DTy);
Devang Patel0e821f42011-04-12 23:21:44 +0000947}
948
Adrian Prantl3f49c892014-02-25 19:57:42 +0000949/// constructSubprogramArguments - Construct function argument DIEs.
Manman Renf8a19672014-07-28 22:24:06 +0000950void DwarfUnit::constructSubprogramArguments(DIE &Buffer, DITypeArray Args) {
Adrian Prantl69140d22014-02-25 22:27:14 +0000951 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
Manman Renf8a19672014-07-28 22:24:06 +0000952 DIType Ty = resolve(Args.getElement(i));
Manman Renf93ac4b2014-07-29 18:20:39 +0000953 if (!Ty) {
Adrian Prantl69140d22014-02-25 22:27:14 +0000954 assert(i == N-1 && "Unspecified parameter must be the last argument");
955 createAndAddDIE(dwarf::DW_TAG_unspecified_parameters, Buffer);
956 } else {
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000957 DIE &Arg = createAndAddDIE(dwarf::DW_TAG_formal_parameter, Buffer);
David Blaikiedf1cca32014-10-26 23:37:04 +0000958 addType(Arg, Ty);
959 if (Ty.isArtificial())
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000960 addFlag(Arg, dwarf::DW_AT_artificial);
Adrian Prantl3f49c892014-02-25 19:57:42 +0000961 }
Adrian Prantl69140d22014-02-25 22:27:14 +0000962 }
Adrian Prantl3f49c892014-02-25 19:57:42 +0000963}
964
Devang Patel0e821f42011-04-12 23:21:44 +0000965/// constructTypeDIE - Construct type DIE from DICompositeType.
Eric Christophera5a79422013-12-09 23:32:48 +0000966void DwarfUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
David Blaikie409dd9c2013-11-19 23:08:21 +0000967 // Add name if not anonymous or intermediate type.
Devang Patel0e821f42011-04-12 23:21:44 +0000968 StringRef Name = CTy.getName();
969
970 uint64_t Size = CTy.getSizeInBits() >> 3;
David Blaikiefac56122013-10-04 23:21:16 +0000971 uint16_t Tag = Buffer.getTag();
Devang Patel0e821f42011-04-12 23:21:44 +0000972
973 switch (Tag) {
Devang Patel0e821f42011-04-12 23:21:44 +0000974 case dwarf::DW_TAG_array_type:
Eric Christopherdf9955d2013-11-11 18:52:31 +0000975 constructArrayTypeDIE(Buffer, CTy);
Devang Patel0e821f42011-04-12 23:21:44 +0000976 break;
Eric Christopheraeb105f2013-11-11 18:52:39 +0000977 case dwarf::DW_TAG_enumeration_type:
978 constructEnumTypeDIE(Buffer, CTy);
979 break;
Devang Patel0e821f42011-04-12 23:21:44 +0000980 case dwarf::DW_TAG_subroutine_type: {
Eric Christopher0df08e22013-08-08 07:40:37 +0000981 // Add return type. A void return won't have a type.
Manman Renf8a19672014-07-28 22:24:06 +0000982 DITypeArray Elements = DISubroutineType(CTy).getTypeArray();
983 DIType RTy(resolve(Elements.getElement(0)));
Eric Christopher0df08e22013-08-08 07:40:37 +0000984 if (RTy)
David Blaikie65a74662014-04-25 18:26:14 +0000985 addType(Buffer, RTy);
Devang Patel0e821f42011-04-12 23:21:44 +0000986
987 bool isPrototyped = true;
Adrian Prantl3f49c892014-02-25 19:57:42 +0000988 if (Elements.getNumElements() == 2 &&
Manman Ren72b07e82014-07-29 22:58:13 +0000989 !Elements.getElement(1))
Adrian Prantl3f49c892014-02-25 19:57:42 +0000990 isPrototyped = false;
991
992 constructSubprogramArguments(Buffer, Elements);
993
Eric Christopher5cd2a9d2012-02-22 08:46:21 +0000994 // Add prototype flag if we're dealing with a C language and the
995 // function has been prototyped.
David Blaikiecb8e4352013-11-15 23:50:53 +0000996 uint16_t Language = getLanguage();
Eric Christopher5cd2a9d2012-02-22 08:46:21 +0000997 if (isPrototyped &&
Eric Christopherc2697f82013-10-19 01:04:47 +0000998 (Language == dwarf::DW_LANG_C89 || Language == dwarf::DW_LANG_C99 ||
Eric Christopherd42b92f2012-05-22 18:45:24 +0000999 Language == dwarf::DW_LANG_ObjC))
David Blaikie65a74662014-04-25 18:26:14 +00001000 addFlag(Buffer, dwarf::DW_AT_prototyped);
Adrian Prantl99c7af22013-12-18 21:48:19 +00001001
1002 if (CTy.isLValueReference())
David Blaikie65a74662014-04-25 18:26:14 +00001003 addFlag(Buffer, dwarf::DW_AT_reference);
Adrian Prantl99c7af22013-12-18 21:48:19 +00001004
1005 if (CTy.isRValueReference())
David Blaikie65a74662014-04-25 18:26:14 +00001006 addFlag(Buffer, dwarf::DW_AT_rvalue_reference);
Eric Christopherc2697f82013-10-19 01:04:47 +00001007 } break;
Devang Patel0e821f42011-04-12 23:21:44 +00001008 case dwarf::DW_TAG_structure_type:
1009 case dwarf::DW_TAG_union_type:
1010 case dwarf::DW_TAG_class_type: {
Devang Patel0e821f42011-04-12 23:21:44 +00001011 // Add elements to structure type.
Manman Renab8ffba2014-07-28 19:14:13 +00001012 DIArray Elements = CTy.getElements();
David Blaikiea1ae0e62013-08-01 20:30:22 +00001013 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
Devang Patel0e821f42011-04-12 23:21:44 +00001014 DIDescriptor Element = Elements.getElement(i);
Adrian Prantlef129fb2014-01-18 02:12:00 +00001015 if (Element.isSubprogram())
David Blaikie65a74662014-04-25 18:26:14 +00001016 getOrCreateSubprogramDIE(DISubprogram(Element));
Adrian Prantlef129fb2014-01-18 02:12:00 +00001017 else if (Element.isDerivedType()) {
Eric Christopherd42b92f2012-05-22 18:45:24 +00001018 DIDerivedType DDTy(Element);
1019 if (DDTy.getTag() == dwarf::DW_TAG_friend) {
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001020 DIE &ElemDie = createAndAddDIE(dwarf::DW_TAG_friend, Buffer);
Manman Ren93b30902013-10-08 18:42:58 +00001021 addType(ElemDie, resolve(DDTy.getTypeDerivedFrom()),
Manman Renb3388602013-10-05 01:43:03 +00001022 dwarf::DW_AT_friend);
Manman Renc6b63922013-10-14 20:33:57 +00001023 } else if (DDTy.isStaticMember()) {
Manman Ren57e6ff72013-10-23 22:57:12 +00001024 getOrCreateStaticMemberDIE(DDTy);
Manman Renc6b63922013-10-14 20:33:57 +00001025 } else {
Manman Ren230ec862013-10-23 23:00:44 +00001026 constructMemberDIE(Buffer, DDTy);
Manman Renc6b63922013-10-14 20:33:57 +00001027 }
Eric Christopher7285c7d2012-03-28 07:34:31 +00001028 } else if (Element.isObjCProperty()) {
Devang Pateld925d1a2012-02-07 23:33:58 +00001029 DIObjCProperty Property(Element);
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001030 DIE &ElemDie = createAndAddDIE(Property.getTag(), Buffer);
Devang Pateld925d1a2012-02-07 23:33:58 +00001031 StringRef PropertyName = Property.getObjCPropertyName();
1032 addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
Eric Christopher4c960562014-01-23 19:16:28 +00001033 if (Property.getType())
1034 addType(ElemDie, Property.getType());
Eric Christopherd42b92f2012-05-22 18:45:24 +00001035 addSourceLine(ElemDie, Property);
Devang Pateld925d1a2012-02-07 23:33:58 +00001036 StringRef GetterName = Property.getObjCPropertyGetterName();
1037 if (!GetterName.empty())
1038 addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
1039 StringRef SetterName = Property.getObjCPropertySetterName();
1040 if (!SetterName.empty())
1041 addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
1042 unsigned PropertyAttributes = 0;
Devang Patel403e8192012-02-04 01:30:32 +00001043 if (Property.isReadOnlyObjCProperty())
1044 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
1045 if (Property.isReadWriteObjCProperty())
1046 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
1047 if (Property.isAssignObjCProperty())
1048 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
1049 if (Property.isRetainObjCProperty())
1050 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
1051 if (Property.isCopyObjCProperty())
1052 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
1053 if (Property.isNonAtomicObjCProperty())
1054 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
1055 if (PropertyAttributes)
David Blaikief2443192013-10-21 17:28:37 +00001056 addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, None,
Eric Christopherc2697f82013-10-19 01:04:47 +00001057 PropertyAttributes);
Devang Patel44882172012-02-06 17:49:43 +00001058
Devang Pateld925d1a2012-02-07 23:33:58 +00001059 DIEEntry *Entry = getDIEEntry(Element);
1060 if (!Entry) {
David Blaikie8dbcc3f2014-04-25 19:33:43 +00001061 Entry = createDIEEntry(ElemDie);
Devang Pateld925d1a2012-02-07 23:33:58 +00001062 insertDIEEntry(Element, Entry);
1063 }
Devang Patel403e8192012-02-04 01:30:32 +00001064 } else
Devang Patel0e821f42011-04-12 23:21:44 +00001065 continue;
Devang Patel0e821f42011-04-12 23:21:44 +00001066 }
1067
1068 if (CTy.isAppleBlockExtension())
David Blaikie65a74662014-04-25 18:26:14 +00001069 addFlag(Buffer, dwarf::DW_AT_APPLE_block);
Devang Patel0e821f42011-04-12 23:21:44 +00001070
Adrian Prantlcf44e782014-12-19 00:01:20 +00001071 // This is outside the DWARF spec, but GDB expects a DW_AT_containing_type
1072 // inside C++ composite types to point to the base class with the vtable.
Eric Christopher9e429ae2013-10-05 00:27:02 +00001073 DICompositeType ContainingType(resolve(CTy.getContainingType()));
David Blaikie4f6bf27a2013-11-18 23:33:32 +00001074 if (ContainingType)
David Blaikie65a74662014-04-25 18:26:14 +00001075 addDIEEntry(Buffer, dwarf::DW_AT_containing_type,
David Blaikie8dbcc3f2014-04-25 19:33:43 +00001076 *getOrCreateTypeDIE(ContainingType));
Devang Patel0e821f42011-04-12 23:21:44 +00001077
Devang Patel12419ae2011-05-12 21:29:42 +00001078 if (CTy.isObjcClassComplete())
David Blaikie65a74662014-04-25 18:26:14 +00001079 addFlag(Buffer, dwarf::DW_AT_APPLE_objc_complete_type);
Devang Patel2409e782011-05-12 19:06:16 +00001080
Eric Christopherda011dd2011-12-16 23:42:42 +00001081 // Add template parameters to a class, structure or union types.
1082 // FIXME: The support isn't in the metadata for this yet.
1083 if (Tag == dwarf::DW_TAG_class_type ||
Eric Christopherc2697f82013-10-19 01:04:47 +00001084 Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type)
Devang Patel0e821f42011-04-12 23:21:44 +00001085 addTemplateParams(Buffer, CTy.getTemplateParams());
1086
1087 break;
1088 }
1089 default:
1090 break;
1091 }
1092
1093 // Add name if not anonymous or intermediate type.
1094 if (!Name.empty())
David Blaikie65a74662014-04-25 18:26:14 +00001095 addString(Buffer, dwarf::DW_AT_name, Name);
Devang Patel0e821f42011-04-12 23:21:44 +00001096
Eric Christopher775cbd22012-05-22 18:45:18 +00001097 if (Tag == dwarf::DW_TAG_enumeration_type ||
Eric Christopherc2697f82013-10-19 01:04:47 +00001098 Tag == dwarf::DW_TAG_class_type || Tag == dwarf::DW_TAG_structure_type ||
Eric Christopher775cbd22012-05-22 18:45:18 +00001099 Tag == dwarf::DW_TAG_union_type) {
Devang Patel0e821f42011-04-12 23:21:44 +00001100 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopher1cf33382012-06-01 00:22:32 +00001101 // TODO: Do we care about size for enum forward declarations?
Devang Patel0e821f42011-04-12 23:21:44 +00001102 if (Size)
David Blaikie65a74662014-04-25 18:26:14 +00001103 addUInt(Buffer, dwarf::DW_AT_byte_size, None, Size);
Eric Christopher1cf33382012-06-01 00:22:32 +00001104 else if (!CTy.isForwardDecl())
Devang Patel0e821f42011-04-12 23:21:44 +00001105 // Add zero size if it is not a forward declaration.
David Blaikie65a74662014-04-25 18:26:14 +00001106 addUInt(Buffer, dwarf::DW_AT_byte_size, None, 0);
Eric Christopher1cf33382012-06-01 00:22:32 +00001107
1108 // If we're a forward decl, say so.
1109 if (CTy.isForwardDecl())
David Blaikie65a74662014-04-25 18:26:14 +00001110 addFlag(Buffer, dwarf::DW_AT_declaration);
Devang Patel0e821f42011-04-12 23:21:44 +00001111
1112 // Add source line info if available.
1113 if (!CTy.isForwardDecl())
David Blaikie65a74662014-04-25 18:26:14 +00001114 addSourceLine(Buffer, CTy);
Eric Christopher54cf8ff2012-03-07 00:15:19 +00001115
1116 // No harm in adding the runtime language to the declaration.
1117 unsigned RLang = CTy.getRunTimeLang();
1118 if (RLang)
David Blaikie65a74662014-04-25 18:26:14 +00001119 addUInt(Buffer, dwarf::DW_AT_APPLE_runtime_class, dwarf::DW_FORM_data1,
Eric Christopherc2697f82013-10-19 01:04:47 +00001120 RLang);
Devang Patel0e821f42011-04-12 23:21:44 +00001121 }
1122}
1123
Manman Renffc9a712013-10-23 23:05:28 +00001124/// constructTemplateTypeParameterDIE - Construct new DIE for the given
1125/// DITemplateTypeParameter.
Eric Christophera5a79422013-12-09 23:32:48 +00001126void DwarfUnit::constructTemplateTypeParameterDIE(DIE &Buffer,
1127 DITemplateTypeParameter TP) {
David Blaikie65a74662014-04-25 18:26:14 +00001128 DIE &ParamDIE =
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001129 createAndAddDIE(dwarf::DW_TAG_template_type_parameter, Buffer);
Eric Christopher056b6472013-08-08 08:09:43 +00001130 // Add the type if it exists, it could be void and therefore no type.
1131 if (TP.getType())
Manman Ren88b0f942013-10-09 19:46:28 +00001132 addType(ParamDIE, resolve(TP.getType()));
David Blaikie2b380232013-06-22 18:59:11 +00001133 if (!TP.getName().empty())
1134 addString(ParamDIE, dwarf::DW_AT_name, TP.getName());
Devang Patel0e821f42011-04-12 23:21:44 +00001135}
1136
Manman Renffc9a712013-10-23 23:05:28 +00001137/// constructTemplateValueParameterDIE - Construct new DIE for the given
1138/// DITemplateValueParameter.
Eric Christophera5a79422013-12-09 23:32:48 +00001139void
1140DwarfUnit::constructTemplateValueParameterDIE(DIE &Buffer,
David Blaikie319a05f2013-12-02 19:33:10 +00001141 DITemplateValueParameter VP) {
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001142 DIE &ParamDIE = createAndAddDIE(VP.getTag(), Buffer);
Eric Christopher0df08e22013-08-08 07:40:37 +00001143
1144 // Add the type if there is one, template template and template parameter
1145 // packs will not have a type.
Eric Christopher691281b2013-10-21 17:48:51 +00001146 if (VP.getTag() == dwarf::DW_TAG_template_value_parameter)
Manman Ren88b0f942013-10-09 19:46:28 +00001147 addType(ParamDIE, resolve(VP.getType()));
Eric Christopherafb2c412013-08-08 07:40:31 +00001148 if (!VP.getName().empty())
1149 addString(ParamDIE, dwarf::DW_AT_name, VP.getName());
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +00001150 if (Metadata *Val = VP.getValue()) {
1151 if (ConstantInt *CI = mdconst::dyn_extract<ConstantInt>(Val))
David Blaikiec0a28412014-05-11 15:56:59 +00001152 addConstantValue(ParamDIE, CI, resolve(VP.getType()));
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +00001153 else if (GlobalValue *GV = mdconst::dyn_extract<GlobalValue>(Val)) {
David Blaikiea1e813d2013-05-10 21:52:07 +00001154 // For declaration non-type template parameters (such as global values and
1155 // functions)
Eric Christopher4a741042014-02-16 08:46:55 +00001156 DIELoc *Loc = new (DIEValueAllocator) DIELoc();
David Blaikie65a74662014-04-25 18:26:14 +00001157 addOpAddress(*Loc, Asm->getSymbol(GV));
David Blaikiea1e813d2013-05-10 21:52:07 +00001158 // Emit DW_OP_stack_value to use the address as the immediate value of the
1159 // parameter, rather than a pointer to it.
David Blaikie65a74662014-04-25 18:26:14 +00001160 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value);
Eric Christopher4a741042014-02-16 08:46:55 +00001161 addBlock(ParamDIE, dwarf::DW_AT_location, Loc);
Eric Christopherafb2c412013-08-08 07:40:31 +00001162 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_template_param) {
David Blaikie2b380232013-06-22 18:59:11 +00001163 assert(isa<MDString>(Val));
1164 addString(ParamDIE, dwarf::DW_AT_GNU_template_name,
1165 cast<MDString>(Val)->getString());
Eric Christopherafb2c412013-08-08 07:40:31 +00001166 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_parameter_pack) {
David Blaikie2b380232013-06-22 18:59:11 +00001167 assert(isa<MDNode>(Val));
1168 DIArray A(cast<MDNode>(Val));
David Blaikie65a74662014-04-25 18:26:14 +00001169 addTemplateParams(ParamDIE, A);
David Blaikiea1e813d2013-05-10 21:52:07 +00001170 }
1171 }
Devang Patel0e821f42011-04-12 23:21:44 +00001172}
1173
Devang Patel17b53272011-05-06 16:57:54 +00001174/// getOrCreateNameSpace - Create a DIE for DINameSpace.
Eric Christophera5a79422013-12-09 23:32:48 +00001175DIE *DwarfUnit::getOrCreateNameSpace(DINameSpace NS) {
Manman Renf6b936b2013-10-29 05:49:41 +00001176 // Construct the context before querying for the existence of the DIE in case
1177 // such construction creates the DIE.
1178 DIE *ContextDIE = getOrCreateContextDIE(NS.getContext());
Manman Renf6b936b2013-10-29 05:49:41 +00001179
David Blaikie65a74662014-04-25 18:26:14 +00001180 if (DIE *NDie = getDIE(NS))
Devang Patel17b53272011-05-06 16:57:54 +00001181 return NDie;
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001182 DIE &NDie = createAndAddDIE(dwarf::DW_TAG_namespace, *ContextDIE, NS);
Manman Renf6b936b2013-10-29 05:49:41 +00001183
David Blaikie553eb4a2014-06-06 22:16:56 +00001184 StringRef Name = NS.getName();
1185 if (!Name.empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +00001186 addString(NDie, dwarf::DW_AT_name, NS.getName());
David Blaikie553eb4a2014-06-06 22:16:56 +00001187 else
1188 Name = "(anonymous namespace)";
1189 DD->addAccelNamespace(Name, NDie);
1190 addGlobalName(Name, NDie, NS.getContext());
Devang Patel17b53272011-05-06 16:57:54 +00001191 addSourceLine(NDie, NS);
David Blaikie65a74662014-04-25 18:26:14 +00001192 return &NDie;
Devang Patel17b53272011-05-06 16:57:54 +00001193}
1194
Devang Patel89543712011-08-15 17:24:54 +00001195/// getOrCreateSubprogramDIE - Create new DIE using SP.
David Blaikie3a443c22014-11-04 22:12:25 +00001196DIE *DwarfUnit::getOrCreateSubprogramDIE(DISubprogram SP, bool Minimal) {
David Blaikie309ffe42013-10-04 01:39:59 +00001197 // Construct the context before querying for the existence of the DIE in case
1198 // such construction creates the DIE (as is the case for member function
1199 // declarations).
David Blaikie3a443c22014-11-04 22:12:25 +00001200 DIE *ContextDIE =
1201 Minimal ? &getUnitDie() : getOrCreateContextDIE(resolve(SP.getContext()));
Adrian Prantld486b342014-03-18 17:41:15 +00001202
David Blaikie65a74662014-04-25 18:26:14 +00001203 if (DIE *SPDie = getDIE(SP))
Devang Patel89543712011-08-15 17:24:54 +00001204 return SPDie;
1205
David Blaikiece7a1bd2014-05-21 18:04:33 +00001206 if (DISubprogram SPDecl = SP.getFunctionDeclaration()) {
David Blaikie3a443c22014-11-04 22:12:25 +00001207 if (!Minimal) {
1208 // Add subprogram definitions to the CU die directly.
1209 ContextDIE = &getUnitDie();
1210 // Build the decl now to ensure it precedes the definition.
1211 getOrCreateSubprogramDIE(SPDecl);
1212 }
David Blaikiece7a1bd2014-05-21 18:04:33 +00001213 }
Peter Collingbourne4d358b52012-05-27 18:36:44 +00001214
1215 // DW_TAG_inlined_subroutine may refer to this DIE.
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001216 DIE &SPDie = createAndAddDIE(dwarf::DW_TAG_subprogram, *ContextDIE, SP);
Peter Collingbourne4d358b52012-05-27 18:36:44 +00001217
David Blaikie6cfa9e12014-06-05 00:25:26 +00001218 // Stop here and fill this in later, depending on whether or not this
David Blaikief7221ad2014-05-27 18:37:43 +00001219 // subprogram turns out to have inlined instances or not.
1220 if (SP.isDefinition())
1221 return &SPDie;
1222
David Blaikie7f916862014-05-27 18:37:38 +00001223 applySubprogramAttributes(SP, SPDie);
1224 return &SPDie;
1225}
1226
David Blaikie3a443c22014-11-04 22:12:25 +00001227bool DwarfUnit::applySubprogramDefinitionAttributes(DISubprogram SP,
1228 DIE &SPDie) {
David Blaikie7f916862014-05-27 18:37:38 +00001229 DIE *DeclDie = nullptr;
1230 StringRef DeclLinkageName;
1231 if (DISubprogram SPDecl = SP.getFunctionDeclaration()) {
David Blaikief7221ad2014-05-27 18:37:43 +00001232 DeclDie = getDIE(SPDecl);
David Blaikie6cfa9e12014-06-05 00:25:26 +00001233 assert(DeclDie && "This DIE should've already been constructed when the "
Alp Toker5c536392014-06-07 21:23:09 +00001234 "definition DIE was created in "
David Blaikie6cfa9e12014-06-05 00:25:26 +00001235 "getOrCreateSubprogramDIE");
David Blaikie7f916862014-05-27 18:37:38 +00001236 DeclLinkageName = SPDecl.getLinkageName();
1237 }
Rafael Espindola79278362011-11-10 22:34:29 +00001238
Devang Patel89543712011-08-15 17:24:54 +00001239 // Add function template parameters.
David Blaikie65a74662014-04-25 18:26:14 +00001240 addTemplateParams(SPDie, SP.getTemplateParams());
Devang Patel89543712011-08-15 17:24:54 +00001241
Adrian Prantl8714aaf2014-04-14 21:16:04 +00001242 // Add the linkage name if we have one and it isn't in the Decl.
1243 StringRef LinkageName = SP.getLinkageName();
David Blaikiece7a1bd2014-05-21 18:04:33 +00001244 assert(((LinkageName.empty() || DeclLinkageName.empty()) ||
1245 LinkageName == DeclLinkageName) &&
1246 "decl has a linkage name and it is different");
1247 if (!LinkageName.empty() && DeclLinkageName.empty())
1248 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
1249 GlobalValue::getRealLinkageName(LinkageName));
Devang Patel89543712011-08-15 17:24:54 +00001250
David Blaikie3a443c22014-11-04 22:12:25 +00001251 if (!DeclDie)
1252 return false;
1253
1254 // Refer to the function declaration where all the other attributes will be
1255 // found.
1256 addDIEEntry(SPDie, dwarf::DW_AT_specification, *DeclDie);
1257 return true;
1258}
1259
1260void DwarfUnit::applySubprogramAttributes(DISubprogram SP, DIE &SPDie,
1261 bool Minimal) {
1262 if (!Minimal)
1263 if (applySubprogramDefinitionAttributes(SP, SPDie))
1264 return;
Eric Christopheracb71152012-08-23 22:52:55 +00001265
Devang Patel89543712011-08-15 17:24:54 +00001266 // Constructors and operators for anonymous aggregates do not have names.
1267 if (!SP.getName().empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +00001268 addString(SPDie, dwarf::DW_AT_name, SP.getName());
Devang Patel89543712011-08-15 17:24:54 +00001269
David Blaikie0b9438b2014-09-19 04:47:46 +00001270 // Skip the rest of the attributes under -gmlt to save space.
David Blaikie279c4512014-11-02 08:18:06 +00001271 if (Minimal)
David Blaikie73b65d22014-09-19 04:30:36 +00001272 return;
1273
Devang Patel89543712011-08-15 17:24:54 +00001274 addSourceLine(SPDie, SP);
1275
Eric Christopher5cd2a9d2012-02-22 08:46:21 +00001276 // Add the prototype if we have a prototype and we have a C like
1277 // language.
David Blaikiecb8e4352013-11-15 23:50:53 +00001278 uint16_t Language = getLanguage();
Eric Christopher5cd2a9d2012-02-22 08:46:21 +00001279 if (SP.isPrototyped() &&
Eric Christopherc2697f82013-10-19 01:04:47 +00001280 (Language == dwarf::DW_LANG_C89 || Language == dwarf::DW_LANG_C99 ||
Eric Christopher5cd2a9d2012-02-22 08:46:21 +00001281 Language == dwarf::DW_LANG_ObjC))
Eric Christopherbb69a272012-08-24 01:14:27 +00001282 addFlag(SPDie, dwarf::DW_AT_prototyped);
Devang Patel89543712011-08-15 17:24:54 +00001283
Manman Renf8a19672014-07-28 22:24:06 +00001284 DISubroutineType SPTy = SP.getType();
David Blaikie5174c842013-05-22 23:22:18 +00001285 assert(SPTy.getTag() == dwarf::DW_TAG_subroutine_type &&
1286 "the type of a subprogram should be a subroutine");
Devang Patel89543712011-08-15 17:24:54 +00001287
Manman Renf8a19672014-07-28 22:24:06 +00001288 DITypeArray Args = SPTy.getTypeArray();
Eric Christopher691281b2013-10-21 17:48:51 +00001289 // Add a return type. If this is a type like a C/C++ void type we don't add a
1290 // return type.
Manman Renf8a19672014-07-28 22:24:06 +00001291 if (resolve(Args.getElement(0)))
1292 addType(SPDie, DIType(resolve(Args.getElement(0))));
Devang Patel89543712011-08-15 17:24:54 +00001293
1294 unsigned VK = SP.getVirtuality();
1295 if (VK) {
Nick Lewyckycfde1a22011-12-14 00:56:07 +00001296 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
Eric Christopher4a741042014-02-16 08:46:55 +00001297 DIELoc *Block = getDIELoc();
David Blaikie65a74662014-04-25 18:26:14 +00001298 addUInt(*Block, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1299 addUInt(*Block, dwarf::DW_FORM_udata, SP.getVirtualIndex());
David Blaikief2443192013-10-21 17:28:37 +00001300 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, Block);
Eric Christopher98b7f172013-11-11 18:52:36 +00001301 ContainingTypeMap.insert(
David Blaikie65a74662014-04-25 18:26:14 +00001302 std::make_pair(&SPDie, resolve(SP.getContainingType())));
Devang Patel89543712011-08-15 17:24:54 +00001303 }
1304
1305 if (!SP.isDefinition()) {
Eric Christopherbb69a272012-08-24 01:14:27 +00001306 addFlag(SPDie, dwarf::DW_AT_declaration);
Eric Christopher92331fd2012-11-21 00:34:38 +00001307
Devang Patel89543712011-08-15 17:24:54 +00001308 // Add arguments. Do not add arguments for subprogram definition. They will
1309 // be handled while processing variables.
David Blaikie899ae612014-04-30 22:58:19 +00001310 constructSubprogramArguments(SPDie, Args);
Devang Patel89543712011-08-15 17:24:54 +00001311 }
1312
1313 if (SP.isArtificial())
Eric Christopherbb69a272012-08-24 01:14:27 +00001314 addFlag(SPDie, dwarf::DW_AT_artificial);
Devang Patel89543712011-08-15 17:24:54 +00001315
1316 if (!SP.isLocalToUnit())
Eric Christopherbb69a272012-08-24 01:14:27 +00001317 addFlag(SPDie, dwarf::DW_AT_external);
Devang Patel89543712011-08-15 17:24:54 +00001318
1319 if (SP.isOptimized())
Eric Christopherbb69a272012-08-24 01:14:27 +00001320 addFlag(SPDie, dwarf::DW_AT_APPLE_optimized);
Devang Patel89543712011-08-15 17:24:54 +00001321
1322 if (unsigned isa = Asm->getISAEncoding()) {
1323 addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1324 }
1325
Adrian Prantl99c7af22013-12-18 21:48:19 +00001326 if (SP.isLValueReference())
1327 addFlag(SPDie, dwarf::DW_AT_reference);
1328
1329 if (SP.isRValueReference())
1330 addFlag(SPDie, dwarf::DW_AT_rvalue_reference);
1331
Adrian Prantlef129fb2014-01-18 02:12:00 +00001332 if (SP.isProtected())
1333 addUInt(SPDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1334 dwarf::DW_ACCESS_protected);
1335 else if (SP.isPrivate())
1336 addUInt(SPDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1337 dwarf::DW_ACCESS_private);
Adrian Prantldaedfda2014-08-29 22:44:07 +00001338 else if (SP.isPublic())
Adrian Prantlef129fb2014-01-18 02:12:00 +00001339 addUInt(SPDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1340 dwarf::DW_ACCESS_public);
1341
1342 if (SP.isExplicit())
1343 addFlag(SPDie, dwarf::DW_AT_explicit);
Devang Patel89543712011-08-15 17:24:54 +00001344}
1345
Devang Patel0e821f42011-04-12 23:21:44 +00001346/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
Eric Christophera5a79422013-12-09 23:32:48 +00001347void DwarfUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy) {
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001348 DIE &DW_Subrange = createAndAddDIE(dwarf::DW_TAG_subrange_type, Buffer);
David Blaikie8dbcc3f2014-04-25 19:33:43 +00001349 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, *IndexTy);
Devang Patel0e821f42011-04-12 23:21:44 +00001350
Bill Wendling28fe9e72012-12-06 07:38:10 +00001351 // The LowerBound value defines the lower bounds which is typically zero for
1352 // C/C++. The Count value is the number of elements. Values are 64 bit. If
1353 // Count == -1 then the array is unbounded and we do not emit
David Blaikie32b0f362014-10-01 00:56:55 +00001354 // DW_AT_lower_bound and DW_AT_count attributes.
Bill Wendling28fe9e72012-12-06 07:38:10 +00001355 int64_t LowerBound = SR.getLo();
Bill Wendling3495f9b2012-12-06 07:55:19 +00001356 int64_t DefaultLowerBound = getDefaultLowerBound();
Bill Wendlingd7767122012-12-04 21:34:03 +00001357 int64_t Count = SR.getCount();
Devang Patel0e821f42011-04-12 23:21:44 +00001358
Bill Wendling3495f9b2012-12-06 07:55:19 +00001359 if (DefaultLowerBound == -1 || LowerBound != DefaultLowerBound)
David Blaikief2443192013-10-21 17:28:37 +00001360 addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, None, LowerBound);
Bill Wendling28fe9e72012-12-06 07:38:10 +00001361
David Blaikie32b0f362014-10-01 00:56:55 +00001362 if (Count != -1)
Bill Wendlingd7767122012-12-04 21:34:03 +00001363 // FIXME: An unbounded array should reference the expression that defines
1364 // the array.
David Blaikie32b0f362014-10-01 00:56:55 +00001365 addUInt(DW_Subrange, dwarf::DW_AT_count, None, Count);
Devang Patel0e821f42011-04-12 23:21:44 +00001366}
1367
David Blaikie871c2d92014-11-02 03:09:13 +00001368DIE *DwarfUnit::getIndexTyDie() {
1369 if (IndexTyDie)
1370 return IndexTyDie;
1371 // Construct an integer type to use for indexes.
1372 IndexTyDie = &createAndAddDIE(dwarf::DW_TAG_base_type, UnitDie);
1373 addString(*IndexTyDie, dwarf::DW_AT_name, "sizetype");
1374 addUInt(*IndexTyDie, dwarf::DW_AT_byte_size, None, sizeof(int64_t));
1375 addUInt(*IndexTyDie, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1376 dwarf::DW_ATE_unsigned);
1377 return IndexTyDie;
1378}
1379
Devang Patel0e821f42011-04-12 23:21:44 +00001380/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
Eric Christophera5a79422013-12-09 23:32:48 +00001381void DwarfUnit::constructArrayTypeDIE(DIE &Buffer, DICompositeType CTy) {
Eric Christopherdf9955d2013-11-11 18:52:31 +00001382 if (CTy.isVector())
David Blaikie65a74662014-04-25 18:26:14 +00001383 addFlag(Buffer, dwarf::DW_AT_GNU_vector);
Devang Patel0e821f42011-04-12 23:21:44 +00001384
Eric Christopher0df08e22013-08-08 07:40:37 +00001385 // Emit the element type.
David Blaikie65a74662014-04-25 18:26:14 +00001386 addType(Buffer, resolve(CTy.getTypeDerivedFrom()));
Devang Patel0e821f42011-04-12 23:21:44 +00001387
1388 // Get an anonymous type for index type.
Eric Christophercad9b532013-01-04 21:51:53 +00001389 // FIXME: This type should be passed down from the front end
1390 // as different languages may have different sizes for indexes.
Devang Patel0e821f42011-04-12 23:21:44 +00001391 DIE *IdxTy = getIndexTyDie();
Devang Patel0e821f42011-04-12 23:21:44 +00001392
1393 // Add subranges to array type.
Manman Renab8ffba2014-07-28 19:14:13 +00001394 DIArray Elements = CTy.getElements();
Devang Patel0e821f42011-04-12 23:21:44 +00001395 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1396 DIDescriptor Element = Elements.getElement(i);
1397 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1398 constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1399 }
1400}
1401
Eric Christopheraeb105f2013-11-11 18:52:39 +00001402/// constructEnumTypeDIE - Construct an enum type DIE from DICompositeType.
Eric Christophera5a79422013-12-09 23:32:48 +00001403void DwarfUnit::constructEnumTypeDIE(DIE &Buffer, DICompositeType CTy) {
Manman Renab8ffba2014-07-28 19:14:13 +00001404 DIArray Elements = CTy.getElements();
Eric Christopheraeb105f2013-11-11 18:52:39 +00001405
1406 // Add enumerators to enumeration type.
1407 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
David Blaikie4f6bf27a2013-11-18 23:33:32 +00001408 DIEnumerator Enum(Elements.getElement(i));
Eric Christopheraeb105f2013-11-11 18:52:39 +00001409 if (Enum.isEnumerator()) {
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001410 DIE &Enumerator = createAndAddDIE(dwarf::DW_TAG_enumerator, Buffer);
David Blaikie4f6bf27a2013-11-18 23:33:32 +00001411 StringRef Name = Enum.getName();
Eric Christopheraeb105f2013-11-11 18:52:39 +00001412 addString(Enumerator, dwarf::DW_AT_name, Name);
David Blaikie4f6bf27a2013-11-18 23:33:32 +00001413 int64_t Value = Enum.getEnumValue();
Eric Christophera07e4f52013-11-19 09:28:34 +00001414 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata,
1415 Value);
Eric Christopheraeb105f2013-11-11 18:52:39 +00001416 }
1417 }
1418 DIType DTy = resolve(CTy.getTypeDerivedFrom());
1419 if (DTy) {
David Blaikie65a74662014-04-25 18:26:14 +00001420 addType(Buffer, DTy);
1421 addFlag(Buffer, dwarf::DW_AT_enum_class);
Eric Christopheraeb105f2013-11-11 18:52:39 +00001422 }
Devang Patel0e821f42011-04-12 23:21:44 +00001423}
1424
Devang Patel89543712011-08-15 17:24:54 +00001425/// constructContainingTypeDIEs - Construct DIEs for types that contain
1426/// vtables.
Eric Christophera5a79422013-12-09 23:32:48 +00001427void DwarfUnit::constructContainingTypeDIEs() {
Devang Patel89543712011-08-15 17:24:54 +00001428 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
Eric Christopherc2697f82013-10-19 01:04:47 +00001429 CE = ContainingTypeMap.end();
1430 CI != CE; ++CI) {
David Blaikie65a74662014-04-25 18:26:14 +00001431 DIE &SPDie = *CI->first;
David Blaikie2ad00162013-11-15 23:09:13 +00001432 DIDescriptor D(CI->second);
1433 if (!D)
Eric Christopherc2697f82013-10-19 01:04:47 +00001434 continue;
David Blaikie2ad00162013-11-15 23:09:13 +00001435 DIE *NDie = getDIE(D);
Eric Christopherc2697f82013-10-19 01:04:47 +00001436 if (!NDie)
1437 continue;
David Blaikie8dbcc3f2014-04-25 19:33:43 +00001438 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, *NDie);
Devang Patel89543712011-08-15 17:24:54 +00001439 }
1440}
1441
Manman Ren230ec862013-10-23 23:00:44 +00001442/// constructMemberDIE - Construct member DIE from DIDerivedType.
Eric Christophera5a79422013-12-09 23:32:48 +00001443void DwarfUnit::constructMemberDIE(DIE &Buffer, DIDerivedType DT) {
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001444 DIE &MemberDie = createAndAddDIE(DT.getTag(), Buffer);
Devang Patel0e821f42011-04-12 23:21:44 +00001445 StringRef Name = DT.getName();
1446 if (!Name.empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +00001447 addString(MemberDie, dwarf::DW_AT_name, Name);
Devang Patel0e821f42011-04-12 23:21:44 +00001448
Manman Ren93b30902013-10-08 18:42:58 +00001449 addType(MemberDie, resolve(DT.getTypeDerivedFrom()));
Devang Patel0e821f42011-04-12 23:21:44 +00001450
1451 addSourceLine(MemberDie, DT);
1452
Eric Christopherc2697f82013-10-19 01:04:47 +00001453 if (DT.getTag() == dwarf::DW_TAG_inheritance && DT.isVirtual()) {
Devang Patel0e821f42011-04-12 23:21:44 +00001454
1455 // For C++, virtual base classes are not at fixed offset. Use following
1456 // expression to extract appropriate offset from vtable.
1457 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1458
Eric Christopher4a741042014-02-16 08:46:55 +00001459 DIELoc *VBaseLocationDie = new (DIEValueAllocator) DIELoc();
David Blaikie65a74662014-04-25 18:26:14 +00001460 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1461 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1462 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1463 addUInt(*VBaseLocationDie, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1464 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1465 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1466 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
Devang Patel0e821f42011-04-12 23:21:44 +00001467
David Blaikief2443192013-10-21 17:28:37 +00001468 addBlock(MemberDie, dwarf::DW_AT_data_member_location, VBaseLocationDie);
David Blaikie71d34a22013-11-01 00:25:45 +00001469 } else {
1470 uint64_t Size = DT.getSizeInBits();
1471 uint64_t FieldSize = getBaseTypeSize(DD, DT);
1472 uint64_t OffsetInBytes;
1473
David Blaikiefa1a3c72015-01-28 02:34:53 +00001474 if (FieldSize && Size != FieldSize) {
Eric Christopher1acdbb82014-03-12 17:14:46 +00001475 // Handle bitfield, assume bytes are 8 bits.
1476 addUInt(MemberDie, dwarf::DW_AT_byte_size, None, FieldSize/8);
1477 addUInt(MemberDie, dwarf::DW_AT_bit_size, None, Size);
David Blaikie71d34a22013-11-01 00:25:45 +00001478
1479 uint64_t Offset = DT.getOffsetInBits();
1480 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1481 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1482 uint64_t FieldOffset = (HiMark - FieldSize);
1483 Offset -= FieldOffset;
1484
1485 // Maybe we need to work from the other end.
1486 if (Asm->getDataLayout().isLittleEndian())
1487 Offset = FieldSize - (Offset + Size);
1488 addUInt(MemberDie, dwarf::DW_AT_bit_offset, None, Offset);
1489
Adrian Prantlc67655a2014-01-28 18:13:47 +00001490 // Here DW_AT_data_member_location points to the anonymous
David Blaikie71d34a22013-11-01 00:25:45 +00001491 // field that includes this bit field.
1492 OffsetInBytes = FieldOffset >> 3;
1493 } else
1494 // This is not a bitfield.
1495 OffsetInBytes = DT.getOffsetInBits() >> 3;
David Blaikie2ada1162014-01-03 00:48:38 +00001496
David Blaikie22b29a52014-01-03 01:30:05 +00001497 if (DD->getDwarfVersion() <= 2) {
Eric Christopher4a741042014-02-16 08:46:55 +00001498 DIELoc *MemLocationDie = new (DIEValueAllocator) DIELoc();
David Blaikie65a74662014-04-25 18:26:14 +00001499 addUInt(*MemLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1500 addUInt(*MemLocationDie, dwarf::DW_FORM_udata, OffsetInBytes);
David Blaikie22b29a52014-01-03 01:30:05 +00001501 addBlock(MemberDie, dwarf::DW_AT_data_member_location, MemLocationDie);
1502 } else
1503 addUInt(MemberDie, dwarf::DW_AT_data_member_location, None,
1504 OffsetInBytes);
David Blaikie71d34a22013-11-01 00:25:45 +00001505 }
Devang Patel0e821f42011-04-12 23:21:44 +00001506
1507 if (DT.isProtected())
Nick Lewyckycb918492011-12-13 05:09:11 +00001508 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001509 dwarf::DW_ACCESS_protected);
1510 else if (DT.isPrivate())
Nick Lewyckycb918492011-12-13 05:09:11 +00001511 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001512 dwarf::DW_ACCESS_private);
1513 // Otherwise C++ member and base classes are considered public.
Adrian Prantldaedfda2014-08-29 22:44:07 +00001514 else if (DT.isPublic())
Nick Lewyckycb918492011-12-13 05:09:11 +00001515 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001516 dwarf::DW_ACCESS_public);
1517 if (DT.isVirtual())
Nick Lewyckycfde1a22011-12-14 00:56:07 +00001518 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001519 dwarf::DW_VIRTUALITY_virtual);
Devang Patel514b4002011-04-16 00:11:51 +00001520
1521 // Objective-C properties.
Devang Patel44882172012-02-06 17:49:43 +00001522 if (MDNode *PNode = DT.getObjCProperty())
1523 if (DIEEntry *PropertyDie = getDIEEntry(PNode))
David Blaikie65a74662014-04-25 18:26:14 +00001524 MemberDie.addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4,
1525 PropertyDie);
Devang Patel44882172012-02-06 17:49:43 +00001526
David Blaikie37fefc32012-12-13 22:43:07 +00001527 if (DT.isArtificial())
1528 addFlag(MemberDie, dwarf::DW_AT_artificial);
Devang Patel0e821f42011-04-12 23:21:44 +00001529}
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001530
Manman Renc6b63922013-10-14 20:33:57 +00001531/// getOrCreateStaticMemberDIE - Create new DIE for C++ static member.
Eric Christophera5a79422013-12-09 23:32:48 +00001532DIE *DwarfUnit::getOrCreateStaticMemberDIE(DIDerivedType DT) {
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001533 if (!DT.Verify())
Craig Topper353eda42014-04-24 06:44:33 +00001534 return nullptr;
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001535
Manman Renc6b63922013-10-14 20:33:57 +00001536 // Construct the context before querying for the existence of the DIE in case
1537 // such construction creates the DIE.
1538 DIE *ContextDIE = getOrCreateContextDIE(resolve(DT.getContext()));
David Blaikiebd700e42013-11-14 21:24:34 +00001539 assert(dwarf::isType(ContextDIE->getTag()) &&
1540 "Static member should belong to a type.");
Manman Renc6b63922013-10-14 20:33:57 +00001541
David Blaikie65a74662014-04-25 18:26:14 +00001542 if (DIE *StaticMemberDIE = getDIE(DT))
Manman Renc6b63922013-10-14 20:33:57 +00001543 return StaticMemberDIE;
1544
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001545 DIE &StaticMemberDIE = createAndAddDIE(DT.getTag(), *ContextDIE, DT);
Manman Renc6b63922013-10-14 20:33:57 +00001546
Manman Ren93b30902013-10-08 18:42:58 +00001547 DIType Ty = resolve(DT.getTypeDerivedFrom());
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001548
1549 addString(StaticMemberDIE, dwarf::DW_AT_name, DT.getName());
1550 addType(StaticMemberDIE, Ty);
1551 addSourceLine(StaticMemberDIE, DT);
1552 addFlag(StaticMemberDIE, dwarf::DW_AT_external);
1553 addFlag(StaticMemberDIE, dwarf::DW_AT_declaration);
1554
1555 // FIXME: We could omit private if the parent is a class_type, and
1556 // public if the parent is something else.
1557 if (DT.isProtected())
1558 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1559 dwarf::DW_ACCESS_protected);
1560 else if (DT.isPrivate())
1561 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1562 dwarf::DW_ACCESS_private);
Adrian Prantldaedfda2014-08-29 22:44:07 +00001563 else if (DT.isPublic())
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001564 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1565 dwarf::DW_ACCESS_public);
1566
1567 if (const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(DT.getConstant()))
David Blaikiec0a28412014-05-11 15:56:59 +00001568 addConstantValue(StaticMemberDIE, CI, Ty);
David Blaikiea39a76e2013-01-20 01:18:01 +00001569 if (const ConstantFP *CFP = dyn_cast_or_null<ConstantFP>(DT.getConstant()))
1570 addConstantFPValue(StaticMemberDIE, CFP);
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001571
David Blaikie65a74662014-04-25 18:26:14 +00001572 return &StaticMemberDIE;
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001573}
David Blaikie6b288cf2013-10-30 20:42:41 +00001574
David Blaikied82b2372014-03-24 20:28:10 +00001575void DwarfUnit::emitHeader(const MCSymbol *ASectionSym) const {
David Blaikieae57e662014-11-01 23:59:23 +00001576 // Emit size of content not including length itself
1577 Asm->OutStreamer.AddComment("Length of Unit");
1578 Asm->EmitInt32(getHeaderSize() + UnitDie.getSize());
1579
David Blaikie6b288cf2013-10-30 20:42:41 +00001580 Asm->OutStreamer.AddComment("DWARF version number");
1581 Asm->EmitInt16(DD->getDwarfVersion());
1582 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
David Blaikie6896e192013-12-04 23:39:02 +00001583 // We share one abbreviations table across all units so it's always at the
1584 // start of the section. Use a relocatable offset where needed to ensure
1585 // linking doesn't invalidate that offset.
David Blaikie3c9a3cc2014-03-24 20:53:02 +00001586 if (ASectionSym)
1587 Asm->EmitSectionOffset(ASectionSym, ASectionSym);
1588 else
David Blaikie326e1fa2014-04-02 02:04:51 +00001589 // Use a constant value when no symbol is provided.
David Blaikie3c9a3cc2014-03-24 20:53:02 +00001590 Asm->EmitInt32(0);
David Blaikie6b288cf2013-10-30 20:42:41 +00001591 Asm->OutStreamer.AddComment("Address Size (in bytes)");
1592 Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
1593}
David Blaikiebc563272013-12-13 21:33:40 +00001594
David Blaikiea34568b2014-11-01 20:06:28 +00001595void DwarfUnit::initSection(const MCSection *Section) {
1596 assert(!this->Section);
1597 this->Section = Section;
David Blaikiea34568b2014-11-01 20:06:28 +00001598}
1599
David Blaikied82b2372014-03-24 20:28:10 +00001600void DwarfTypeUnit::emitHeader(const MCSymbol *ASectionSym) const {
1601 DwarfUnit::emitHeader(ASectionSym);
David Blaikiebc563272013-12-13 21:33:40 +00001602 Asm->OutStreamer.AddComment("Type Signature");
1603 Asm->OutStreamer.EmitIntValue(TypeSignature, sizeof(TypeSignature));
1604 Asm->OutStreamer.AddComment("Type DIE Offset");
David Blaikie15ed5eb2014-01-10 01:38:41 +00001605 // In a skeleton type unit there is no type DIE so emit a zero offset.
1606 Asm->OutStreamer.EmitIntValue(Ty ? Ty->getOffset() : 0,
1607 sizeof(Ty->getOffset()));
David Blaikiebc563272013-12-13 21:33:40 +00001608}
1609
David Blaikiecafd9622014-11-02 08:51:37 +00001610bool DwarfTypeUnit::isDwoUnit() const {
1611 // Since there are no skeleton type units, all type units are dwo type units
1612 // when split DWARF is being used.
1613 return DD->useSplitDwarf();
1614}