blob: 1224ac8f500bea2860bf4af5ca7e7c913d56d1de [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 ||
Adrian Prantl9013c4b2015-02-02 18:31:58 +0000609 Encoding == dwarf::DW_ATE_float ||
David Blaikie8b979f02014-12-17 00:43:22 +0000610 Encoding == dwarf::DW_ATE_UTF || Encoding == dwarf::DW_ATE_boolean ||
611 (Ty.getTag() == dwarf::DW_TAG_unspecified_type &&
612 Ty.getName() == "decltype(nullptr)")) &&
David Blaikiec405c9c2014-05-16 21:53:09 +0000613 "Unsupported encoding");
David Blaikie60cae1b2014-05-11 16:08:41 +0000614 return (Encoding == dwarf::DW_ATE_unsigned ||
615 Encoding == dwarf::DW_ATE_unsigned_char ||
David Blaikie8b979f02014-12-17 00:43:22 +0000616 Encoding == dwarf::DW_ATE_UTF || Encoding == dwarf::DW_ATE_boolean ||
617 Ty.getTag() == dwarf::DW_TAG_unspecified_type);
Manman Renb3388602013-10-05 01:43:03 +0000618}
619
620/// If this type is derived from a base type then return base type size.
Manman Renbda410f2013-10-08 18:46:58 +0000621static uint64_t getBaseTypeSize(DwarfDebug *DD, DIDerivedType Ty) {
Manman Renb3388602013-10-05 01:43:03 +0000622 unsigned Tag = Ty.getTag();
623
624 if (Tag != dwarf::DW_TAG_member && Tag != dwarf::DW_TAG_typedef &&
625 Tag != dwarf::DW_TAG_const_type && Tag != dwarf::DW_TAG_volatile_type &&
626 Tag != dwarf::DW_TAG_restrict_type)
627 return Ty.getSizeInBits();
628
629 DIType BaseType = DD->resolve(Ty.getTypeDerivedFrom());
630
David Blaikiee2452282015-01-28 02:43:15 +0000631 assert(BaseType.isValid() && "Unexpected invalid base type");
Manman Renb3388602013-10-05 01:43:03 +0000632
633 // If this is a derived type, go ahead and get the base type, unless it's a
634 // reference then it's just the size of the field. Pointer types have no need
635 // of this since they're a different type of qualification on the type.
636 if (BaseType.getTag() == dwarf::DW_TAG_reference_type ||
637 BaseType.getTag() == dwarf::DW_TAG_rvalue_reference_type)
638 return Ty.getSizeInBits();
639
640 if (BaseType.isDerivedType())
Manman Renbda410f2013-10-08 18:46:58 +0000641 return getBaseTypeSize(DD, DIDerivedType(BaseType));
Manman Renb3388602013-10-05 01:43:03 +0000642
643 return BaseType.getSizeInBits();
644}
645
Devang Patel0e821f42011-04-12 23:21:44 +0000646/// addConstantFPValue - Add constant value entry in variable DIE.
David Blaikie65a74662014-04-25 18:26:14 +0000647void DwarfUnit::addConstantFPValue(DIE &Die, const MachineOperand &MO) {
Eric Christopherc2697f82013-10-19 01:04:47 +0000648 assert(MO.isFPImm() && "Invalid machine operand!");
Devang Patel0e821f42011-04-12 23:21:44 +0000649 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
650 APFloat FPImm = MO.getFPImm()->getValueAPF();
651
652 // Get the raw data form of the floating point.
653 const APInt FltVal = FPImm.bitcastToAPInt();
Eric Christopherc2697f82013-10-19 01:04:47 +0000654 const char *FltPtr = (const char *)FltVal.getRawData();
Devang Patel0e821f42011-04-12 23:21:44 +0000655
656 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
Micah Villmowcdfe20b2012-10-08 16:38:25 +0000657 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel0e821f42011-04-12 23:21:44 +0000658 int Incr = (LittleEndian ? 1 : -1);
659 int Start = (LittleEndian ? 0 : NumBytes - 1);
660 int Stop = (LittleEndian ? NumBytes : -1);
661
662 // Output the constant to DWARF one byte at a time.
663 for (; Start != Stop; Start += Incr)
David Blaikie65a74662014-04-25 18:26:14 +0000664 addUInt(*Block, dwarf::DW_FORM_data1, (unsigned char)0xFF & FltPtr[Start]);
Devang Patel0e821f42011-04-12 23:21:44 +0000665
David Blaikief2443192013-10-21 17:28:37 +0000666 addBlock(Die, dwarf::DW_AT_const_value, Block);
Devang Patel0e821f42011-04-12 23:21:44 +0000667}
668
David Blaikiea39a76e2013-01-20 01:18:01 +0000669/// addConstantFPValue - Add constant value entry in variable DIE.
David Blaikie65a74662014-04-25 18:26:14 +0000670void DwarfUnit::addConstantFPValue(DIE &Die, const ConstantFP *CFP) {
Eric Christopher9d1daa82013-08-27 23:49:04 +0000671 // Pass this down to addConstantValue as an unsigned bag of bits.
672 addConstantValue(Die, CFP->getValueAPF().bitcastToAPInt(), true);
David Blaikiea39a76e2013-01-20 01:18:01 +0000673}
674
Devang Patel0e821f42011-04-12 23:21:44 +0000675/// addConstantValue - Add constant value entry in variable DIE.
David Blaikiec0a28412014-05-11 15:56:59 +0000676void DwarfUnit::addConstantValue(DIE &Die, const ConstantInt *CI, DIType Ty) {
677 addConstantValue(Die, CI->getValue(), Ty);
David Blaikiea39a76e2013-01-20 01:18:01 +0000678}
679
David Blaikiec05c8f42014-05-11 15:47:39 +0000680/// addConstantValue - Add constant value entry in variable DIE.
681void DwarfUnit::addConstantValue(DIE &Die, const MachineOperand &MO,
682 DIType Ty) {
683 assert(MO.isImm() && "Invalid machine operand!");
684
David Blaikie60cae1b2014-05-11 16:08:41 +0000685 addConstantValue(Die, isUnsignedDIType(DD, Ty), MO.getImm());
David Blaikiec05c8f42014-05-11 15:47:39 +0000686}
687
David Blaikie60cae1b2014-05-11 16:08:41 +0000688void DwarfUnit::addConstantValue(DIE &Die, bool Unsigned, uint64_t Val) {
David Blaikiec05c8f42014-05-11 15:47:39 +0000689 // FIXME: This is a bit conservative/simple - it emits negative values always
690 // sign extended to 64 bits rather than minimizing the number of bytes.
691 addUInt(Die, dwarf::DW_AT_const_value,
David Blaikie60cae1b2014-05-11 16:08:41 +0000692 Unsigned ? dwarf::DW_FORM_udata : dwarf::DW_FORM_sdata, Val);
David Blaikiec05c8f42014-05-11 15:47:39 +0000693}
694
David Blaikiec0a28412014-05-11 15:56:59 +0000695void DwarfUnit::addConstantValue(DIE &Die, const APInt &Val, DIType Ty) {
696 addConstantValue(Die, Val, isUnsignedDIType(DD, Ty));
697}
698
David Blaikiea39a76e2013-01-20 01:18:01 +0000699// addConstantValue - Add constant value entry in variable DIE.
David Blaikie65a74662014-04-25 18:26:14 +0000700void DwarfUnit::addConstantValue(DIE &Die, const APInt &Val, bool Unsigned) {
David Blaikiea39a76e2013-01-20 01:18:01 +0000701 unsigned CIBitWidth = Val.getBitWidth();
Devang Patel8816bbc2011-05-28 00:39:18 +0000702 if (CIBitWidth <= 64) {
David Blaikie60cae1b2014-05-11 16:08:41 +0000703 addConstantValue(Die, Unsigned,
704 Unsigned ? Val.getZExtValue() : Val.getSExtValue());
Eric Christopher78fcf4902013-07-03 01:08:30 +0000705 return;
Devang Patel0e821f42011-04-12 23:21:44 +0000706 }
707
708 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
709
710 // Get the raw data form of the large APInt.
NAKAMURA Takumi29ccdd82011-10-28 14:12:22 +0000711 const uint64_t *Ptr64 = Val.getRawData();
Devang Patel0e821f42011-04-12 23:21:44 +0000712
713 int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
Micah Villmowcdfe20b2012-10-08 16:38:25 +0000714 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel0e821f42011-04-12 23:21:44 +0000715
716 // Output the constant to DWARF one byte at a time.
NAKAMURA Takumi29ccdd82011-10-28 14:12:22 +0000717 for (int i = 0; i < NumBytes; i++) {
718 uint8_t c;
719 if (LittleEndian)
720 c = Ptr64[i / 8] >> (8 * (i & 7));
721 else
722 c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7));
David Blaikie65a74662014-04-25 18:26:14 +0000723 addUInt(*Block, dwarf::DW_FORM_data1, c);
NAKAMURA Takumi29ccdd82011-10-28 14:12:22 +0000724 }
Devang Patel0e821f42011-04-12 23:21:44 +0000725
David Blaikief2443192013-10-21 17:28:37 +0000726 addBlock(Die, dwarf::DW_AT_const_value, Block);
Devang Patel0e821f42011-04-12 23:21:44 +0000727}
728
Eric Christopher25e35092013-04-22 07:47:40 +0000729/// addTemplateParams - Add template parameters into buffer.
Eric Christophera5a79422013-12-09 23:32:48 +0000730void DwarfUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
Devang Patel0e821f42011-04-12 23:21:44 +0000731 // Add template parameters.
732 for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) {
733 DIDescriptor Element = TParams.getElement(i);
734 if (Element.isTemplateTypeParameter())
Manman Renffc9a712013-10-23 23:05:28 +0000735 constructTemplateTypeParameterDIE(Buffer,
736 DITemplateTypeParameter(Element));
Devang Patel0e821f42011-04-12 23:21:44 +0000737 else if (Element.isTemplateValueParameter())
Manman Renffc9a712013-10-23 23:05:28 +0000738 constructTemplateValueParameterDIE(Buffer,
739 DITemplateValueParameter(Element));
Devang Patel0e821f42011-04-12 23:21:44 +0000740 }
Devang Patel0e821f42011-04-12 23:21:44 +0000741}
Nick Lewycky654f5ce2011-10-26 22:55:33 +0000742
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000743/// getOrCreateContextDIE - Get context owner's DIE.
Eric Christophera5a79422013-12-09 23:32:48 +0000744DIE *DwarfUnit::getOrCreateContextDIE(DIScope Context) {
David Blaikiebd700e42013-11-14 21:24:34 +0000745 if (!Context || Context.isFile())
David Blaikieadcde362014-04-25 18:35:57 +0000746 return &getUnitDie();
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000747 if (Context.isType())
748 return getOrCreateTypeDIE(DIType(Context));
David Blaikie1dbca702013-11-14 19:37:56 +0000749 if (Context.isNameSpace())
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000750 return getOrCreateNameSpace(DINameSpace(Context));
David Blaikie1dbca702013-11-14 19:37:56 +0000751 if (Context.isSubprogram())
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000752 return getOrCreateSubprogramDIE(DISubprogram(Context));
Adrian Prantl7d828bb2013-11-15 21:05:09 +0000753 return getDIE(Context);
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000754}
755
Eric Christophera5a79422013-12-09 23:32:48 +0000756DIE *DwarfUnit::createTypeDIE(DICompositeType Ty) {
David Blaikie9d861be2013-11-26 00:15:27 +0000757 DIScope Context = resolve(Ty.getContext());
758 DIE *ContextDIE = getOrCreateContextDIE(Context);
David Blaikie409dd9c2013-11-19 23:08:21 +0000759
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000760 if (DIE *TyDIE = getDIE(Ty))
David Blaikie409dd9c2013-11-19 23:08:21 +0000761 return TyDIE;
762
763 // Create new type.
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000764 DIE &TyDIE = createAndAddDIE(Ty.getTag(), *ContextDIE, Ty);
David Blaikie409dd9c2013-11-19 23:08:21 +0000765
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000766 constructTypeDIE(TyDIE, Ty);
David Blaikie409dd9c2013-11-19 23:08:21 +0000767
David Blaikie9d861be2013-11-26 00:15:27 +0000768 updateAcceleratorTables(Context, Ty, TyDIE);
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000769 return &TyDIE;
David Blaikie409dd9c2013-11-19 23:08:21 +0000770}
771
Devang Patel0e821f42011-04-12 23:21:44 +0000772/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
773/// given DIType.
Eric Christophera5a79422013-12-09 23:32:48 +0000774DIE *DwarfUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
David Blaikie32887552013-11-14 22:25:02 +0000775 if (!TyNode)
Craig Topper353eda42014-04-24 06:44:33 +0000776 return nullptr;
Manman Renf4c339e2013-10-29 22:49:29 +0000777
David Blaikie32887552013-11-14 22:25:02 +0000778 DIType Ty(TyNode);
779 assert(Ty.isType());
Adrian Prantlc95ec912014-03-24 21:33:01 +0000780 assert(Ty == resolve(Ty.getRef()) &&
Adrian Prantl0aa1aa22014-03-18 02:35:03 +0000781 "type was not uniqued, possible ODR violation.");
David Blaikie32887552013-11-14 22:25:02 +0000782
David Blaikieee11f222014-04-12 05:35:59 +0000783 // DW_TAG_restrict_type is not supported in DWARF2
784 if (Ty.getTag() == dwarf::DW_TAG_restrict_type && DD->getDwarfVersion() <= 2)
785 return getOrCreateTypeDIE(resolve(DIDerivedType(Ty).getTypeDerivedFrom()));
786
Manman Renf4c339e2013-10-29 22:49:29 +0000787 // Construct the context before querying for the existence of the DIE in case
788 // such construction creates the DIE.
David Blaikie9d861be2013-11-26 00:15:27 +0000789 DIScope Context = resolve(Ty.getContext());
790 DIE *ContextDIE = getOrCreateContextDIE(Context);
Adrian Prantl4583f7d2013-11-15 23:21:39 +0000791 assert(ContextDIE);
Manman Renf4c339e2013-10-29 22:49:29 +0000792
David Blaikie65a74662014-04-25 18:26:14 +0000793 if (DIE *TyDIE = getDIE(Ty))
Devang Patel0e821f42011-04-12 23:21:44 +0000794 return TyDIE;
795
796 // Create new type.
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000797 DIE &TyDIE = createAndAddDIE(Ty.getTag(), *ContextDIE, Ty);
Manman Renf4c339e2013-10-29 22:49:29 +0000798
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000799 updateAcceleratorTables(Context, Ty, TyDIE);
David Blaikiec3d9e9e2014-03-06 01:42:00 +0000800
Devang Patel0e821f42011-04-12 23:21:44 +0000801 if (Ty.isBasicType())
David Blaikie65a74662014-04-25 18:26:14 +0000802 constructTypeDIE(TyDIE, DIBasicType(Ty));
David Blaikie8a263cb2013-11-26 00:22:37 +0000803 else if (Ty.isCompositeType()) {
804 DICompositeType CTy(Ty);
David Blaikiecfb21152014-01-03 18:59:42 +0000805 if (GenerateDwarfTypeUnits && !Ty.isForwardDecl())
806 if (MDString *TypeId = CTy.getIdentifier()) {
David Blaikie15632ae2014-02-12 00:31:30 +0000807 DD->addDwarfTypeUnitType(getCU(), TypeId->getString(), TyDIE, CTy);
Adrian Prantle2da17f2014-03-14 23:08:17 +0000808 // Skip updating the accelerator tables since this is not the full type.
David Blaikie65a74662014-04-25 18:26:14 +0000809 return &TyDIE;
David Blaikiecfb21152014-01-03 18:59:42 +0000810 }
David Blaikie65a74662014-04-25 18:26:14 +0000811 constructTypeDIE(TyDIE, CTy);
David Blaikie8a263cb2013-11-26 00:22:37 +0000812 } else {
Devang Patel0e821f42011-04-12 23:21:44 +0000813 assert(Ty.isDerivedType() && "Unknown kind of DIType");
David Blaikie65a74662014-04-25 18:26:14 +0000814 constructTypeDIE(TyDIE, DIDerivedType(Ty));
Devang Patel0e821f42011-04-12 23:21:44 +0000815 }
David Blaikie2ea848b2013-11-19 22:51:04 +0000816
David Blaikie65a74662014-04-25 18:26:14 +0000817 return &TyDIE;
David Blaikie2ea848b2013-11-19 22:51:04 +0000818}
819
Eric Christophera5a79422013-12-09 23:32:48 +0000820void DwarfUnit::updateAcceleratorTables(DIScope Context, DIType Ty,
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000821 const DIE &TyDIE) {
Eric Christopher21bde872012-01-06 04:35:23 +0000822 if (!Ty.getName().empty() && !Ty.isForwardDecl()) {
823 bool IsImplementation = 0;
824 if (Ty.isCompositeType()) {
825 DICompositeType CT(Ty);
Eric Christopher8ea8e4f2012-01-06 23:03:37 +0000826 // A runtime language of 0 actually means C/C++ and that any
827 // non-negative value is some version of Objective-C/C++.
Eric Christopherc2697f82013-10-19 01:04:47 +0000828 IsImplementation = (CT.getRunTimeLang() == 0) || CT.isObjcClassComplete();
Eric Christopher21bde872012-01-06 04:35:23 +0000829 }
Eric Christophercf7289f2013-09-05 18:20:16 +0000830 unsigned Flags = IsImplementation ? dwarf::DW_FLAG_type_implementation : 0;
David Blaikie18d33752014-04-24 01:23:49 +0000831 DD->addAccelType(Ty.getName(), TyDIE, Flags);
David Blaikie9d861be2013-11-26 00:15:27 +0000832
David Blaikie98cf1722014-11-02 06:06:14 +0000833 if (!Context || Context.isCompileUnit() || Context.isFile() ||
834 Context.isNameSpace())
835 addGlobalType(Ty, TyDIE, Context);
Eric Christopher21bde872012-01-06 04:35:23 +0000836 }
Devang Patel0e821f42011-04-12 23:21:44 +0000837}
838
839/// addType - Add a new type attribute to the specified entity.
David Blaikie65a74662014-04-25 18:26:14 +0000840void DwarfUnit::addType(DIE &Entity, DIType Ty, dwarf::Attribute Attribute) {
Eric Christopher0df08e22013-08-08 07:40:37 +0000841 assert(Ty && "Trying to add a type that doesn't exist?");
Devang Patel0e821f42011-04-12 23:21:44 +0000842
843 // Check for pre-existence.
844 DIEEntry *Entry = getDIEEntry(Ty);
845 // If it exists then use the existing value.
846 if (Entry) {
Manman Ren4dbdc902013-10-31 17:54:35 +0000847 addDIEEntry(Entity, Attribute, Entry);
Devang Patel0e821f42011-04-12 23:21:44 +0000848 return;
849 }
850
851 // Construct type.
852 DIE *Buffer = getOrCreateTypeDIE(Ty);
853
854 // Set up proxy.
David Blaikie8dbcc3f2014-04-25 19:33:43 +0000855 Entry = createDIEEntry(*Buffer);
Devang Patel0e821f42011-04-12 23:21:44 +0000856 insertDIEEntry(Ty, Entry);
Manman Ren4dbdc902013-10-31 17:54:35 +0000857 addDIEEntry(Entity, Attribute, Entry);
Devang Patel1cb8ab42011-05-31 23:30:30 +0000858}
859
Eric Christopher2c8b7902013-10-17 02:06:06 +0000860/// getParentContextString - Walks the metadata parent chain in a language
861/// specific manner (using the compile unit language) and returns
862/// it as a string. This is done at the metadata level because DIEs may
863/// not currently have been added to the parent context and walking the
864/// DIEs looking for names is more expensive than walking the metadata.
Eric Christophera5a79422013-12-09 23:32:48 +0000865std::string DwarfUnit::getParentContextString(DIScope Context) const {
Eric Christopher2c8b7902013-10-17 02:06:06 +0000866 if (!Context)
867 return "";
868
869 // FIXME: Decide whether to implement this for non-C++ languages.
870 if (getLanguage() != dwarf::DW_LANG_C_plus_plus)
871 return "";
872
Eric Christopher8dba0d52013-10-19 01:04:42 +0000873 std::string CS;
Eric Christopher2c8b7902013-10-17 02:06:06 +0000874 SmallVector<DIScope, 1> Parents;
875 while (!Context.isCompileUnit()) {
876 Parents.push_back(Context);
877 if (Context.getContext())
878 Context = resolve(Context.getContext());
879 else
880 // Structure, etc types will have a NULL context if they're at the top
881 // level.
882 break;
883 }
884
885 // Reverse iterate over our list to go from the outermost construct to the
886 // innermost.
887 for (SmallVectorImpl<DIScope>::reverse_iterator I = Parents.rbegin(),
888 E = Parents.rend();
889 I != E; ++I) {
890 DIScope Ctx = *I;
891 StringRef Name = Ctx.getName();
David Blaikie553eb4a2014-06-06 22:16:56 +0000892 if (Name.empty() && Ctx.isNameSpace())
893 Name = "(anonymous namespace)";
Eric Christopher8dba0d52013-10-19 01:04:42 +0000894 if (!Name.empty()) {
Eric Christopher2c8b7902013-10-17 02:06:06 +0000895 CS += Name;
896 CS += "::";
897 }
898 }
899 return CS;
Devang Patel0e821f42011-04-12 23:21:44 +0000900}
901
902/// constructTypeDIE - Construct basic type die from DIBasicType.
Eric Christophera5a79422013-12-09 23:32:48 +0000903void DwarfUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
Devang Patel0e821f42011-04-12 23:21:44 +0000904 // Get core information.
905 StringRef Name = BTy.getName();
Devang Patel0e821f42011-04-12 23:21:44 +0000906 // Add name if not anonymous or intermediate type.
907 if (!Name.empty())
David Blaikie65a74662014-04-25 18:26:14 +0000908 addString(Buffer, dwarf::DW_AT_name, Name);
Devang Patel04d6d472011-09-14 23:13:28 +0000909
David Blaikiefac56122013-10-04 23:21:16 +0000910 // An unspecified type only has a name attribute.
911 if (BTy.getTag() == dwarf::DW_TAG_unspecified_type)
Devang Patel04d6d472011-09-14 23:13:28 +0000912 return;
Devang Patel04d6d472011-09-14 23:13:28 +0000913
David Blaikie65a74662014-04-25 18:26:14 +0000914 addUInt(Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
Devang Pateld925d1a2012-02-07 23:33:58 +0000915 BTy.getEncoding());
Devang Patel04d6d472011-09-14 23:13:28 +0000916
Devang Patel0e821f42011-04-12 23:21:44 +0000917 uint64_t Size = BTy.getSizeInBits() >> 3;
David Blaikie65a74662014-04-25 18:26:14 +0000918 addUInt(Buffer, dwarf::DW_AT_byte_size, None, Size);
Devang Patel0e821f42011-04-12 23:21:44 +0000919}
920
921/// constructTypeDIE - Construct derived type die from DIDerivedType.
Eric Christophera5a79422013-12-09 23:32:48 +0000922void DwarfUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
Devang Patel0e821f42011-04-12 23:21:44 +0000923 // Get core information.
924 StringRef Name = DTy.getName();
925 uint64_t Size = DTy.getSizeInBits() >> 3;
David Blaikiefac56122013-10-04 23:21:16 +0000926 uint16_t Tag = Buffer.getTag();
Devang Patel0e821f42011-04-12 23:21:44 +0000927
928 // Map to main type, void will not have a type.
Manman Ren93b30902013-10-08 18:42:58 +0000929 DIType FromTy = resolve(DTy.getTypeDerivedFrom());
Eric Christopher0df08e22013-08-08 07:40:37 +0000930 if (FromTy)
David Blaikie65a74662014-04-25 18:26:14 +0000931 addType(Buffer, FromTy);
Devang Patel0e821f42011-04-12 23:21:44 +0000932
933 // Add name if not anonymous or intermediate type.
934 if (!Name.empty())
David Blaikie65a74662014-04-25 18:26:14 +0000935 addString(Buffer, dwarf::DW_AT_name, Name);
Devang Patel0e821f42011-04-12 23:21:44 +0000936
937 // Add size if non-zero (derived types might be zero-sized.)
Adrian Prantl3026a542014-12-24 01:17:51 +0000938 if (Size && Tag != dwarf::DW_TAG_pointer_type
939 && Tag != dwarf::DW_TAG_ptr_to_member_type)
David Blaikie65a74662014-04-25 18:26:14 +0000940 addUInt(Buffer, dwarf::DW_AT_byte_size, None, Size);
Devang Patel0e821f42011-04-12 23:21:44 +0000941
David Blaikie5d3249b2013-01-07 05:51:15 +0000942 if (Tag == dwarf::DW_TAG_ptr_to_member_type)
David Blaikie65a74662014-04-25 18:26:14 +0000943 addDIEEntry(Buffer, dwarf::DW_AT_containing_type,
David Blaikie8dbcc3f2014-04-25 19:33:43 +0000944 *getOrCreateTypeDIE(resolve(DTy.getClassType())));
Devang Patel0e821f42011-04-12 23:21:44 +0000945 // Add source line info if available and TyDesc is not a forward declaration.
946 if (!DTy.isForwardDecl())
David Blaikie65a74662014-04-25 18:26:14 +0000947 addSourceLine(Buffer, DTy);
Devang Patel0e821f42011-04-12 23:21:44 +0000948}
949
Adrian Prantl3f49c892014-02-25 19:57:42 +0000950/// constructSubprogramArguments - Construct function argument DIEs.
Manman Renf8a19672014-07-28 22:24:06 +0000951void DwarfUnit::constructSubprogramArguments(DIE &Buffer, DITypeArray Args) {
Adrian Prantl69140d22014-02-25 22:27:14 +0000952 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
Manman Renf8a19672014-07-28 22:24:06 +0000953 DIType Ty = resolve(Args.getElement(i));
Manman Renf93ac4b2014-07-29 18:20:39 +0000954 if (!Ty) {
Adrian Prantl69140d22014-02-25 22:27:14 +0000955 assert(i == N-1 && "Unspecified parameter must be the last argument");
956 createAndAddDIE(dwarf::DW_TAG_unspecified_parameters, Buffer);
957 } else {
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000958 DIE &Arg = createAndAddDIE(dwarf::DW_TAG_formal_parameter, Buffer);
David Blaikiedf1cca32014-10-26 23:37:04 +0000959 addType(Arg, Ty);
960 if (Ty.isArtificial())
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000961 addFlag(Arg, dwarf::DW_AT_artificial);
Adrian Prantl3f49c892014-02-25 19:57:42 +0000962 }
Adrian Prantl69140d22014-02-25 22:27:14 +0000963 }
Adrian Prantl3f49c892014-02-25 19:57:42 +0000964}
965
Devang Patel0e821f42011-04-12 23:21:44 +0000966/// constructTypeDIE - Construct type DIE from DICompositeType.
Eric Christophera5a79422013-12-09 23:32:48 +0000967void DwarfUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
David Blaikie409dd9c2013-11-19 23:08:21 +0000968 // Add name if not anonymous or intermediate type.
Devang Patel0e821f42011-04-12 23:21:44 +0000969 StringRef Name = CTy.getName();
970
971 uint64_t Size = CTy.getSizeInBits() >> 3;
David Blaikiefac56122013-10-04 23:21:16 +0000972 uint16_t Tag = Buffer.getTag();
Devang Patel0e821f42011-04-12 23:21:44 +0000973
974 switch (Tag) {
Devang Patel0e821f42011-04-12 23:21:44 +0000975 case dwarf::DW_TAG_array_type:
Eric Christopherdf9955d2013-11-11 18:52:31 +0000976 constructArrayTypeDIE(Buffer, CTy);
Devang Patel0e821f42011-04-12 23:21:44 +0000977 break;
Eric Christopheraeb105f2013-11-11 18:52:39 +0000978 case dwarf::DW_TAG_enumeration_type:
979 constructEnumTypeDIE(Buffer, CTy);
980 break;
Devang Patel0e821f42011-04-12 23:21:44 +0000981 case dwarf::DW_TAG_subroutine_type: {
Eric Christopher0df08e22013-08-08 07:40:37 +0000982 // Add return type. A void return won't have a type.
Manman Renf8a19672014-07-28 22:24:06 +0000983 DITypeArray Elements = DISubroutineType(CTy).getTypeArray();
984 DIType RTy(resolve(Elements.getElement(0)));
Eric Christopher0df08e22013-08-08 07:40:37 +0000985 if (RTy)
David Blaikie65a74662014-04-25 18:26:14 +0000986 addType(Buffer, RTy);
Devang Patel0e821f42011-04-12 23:21:44 +0000987
988 bool isPrototyped = true;
Adrian Prantl3f49c892014-02-25 19:57:42 +0000989 if (Elements.getNumElements() == 2 &&
Manman Ren72b07e82014-07-29 22:58:13 +0000990 !Elements.getElement(1))
Adrian Prantl3f49c892014-02-25 19:57:42 +0000991 isPrototyped = false;
992
993 constructSubprogramArguments(Buffer, Elements);
994
Eric Christopher5cd2a9d2012-02-22 08:46:21 +0000995 // Add prototype flag if we're dealing with a C language and the
996 // function has been prototyped.
David Blaikiecb8e4352013-11-15 23:50:53 +0000997 uint16_t Language = getLanguage();
Eric Christopher5cd2a9d2012-02-22 08:46:21 +0000998 if (isPrototyped &&
Eric Christopherc2697f82013-10-19 01:04:47 +0000999 (Language == dwarf::DW_LANG_C89 || Language == dwarf::DW_LANG_C99 ||
Eric Christopherd42b92f2012-05-22 18:45:24 +00001000 Language == dwarf::DW_LANG_ObjC))
David Blaikie65a74662014-04-25 18:26:14 +00001001 addFlag(Buffer, dwarf::DW_AT_prototyped);
Adrian Prantl99c7af22013-12-18 21:48:19 +00001002
1003 if (CTy.isLValueReference())
David Blaikie65a74662014-04-25 18:26:14 +00001004 addFlag(Buffer, dwarf::DW_AT_reference);
Adrian Prantl99c7af22013-12-18 21:48:19 +00001005
1006 if (CTy.isRValueReference())
David Blaikie65a74662014-04-25 18:26:14 +00001007 addFlag(Buffer, dwarf::DW_AT_rvalue_reference);
Eric Christopherc2697f82013-10-19 01:04:47 +00001008 } break;
Devang Patel0e821f42011-04-12 23:21:44 +00001009 case dwarf::DW_TAG_structure_type:
1010 case dwarf::DW_TAG_union_type:
1011 case dwarf::DW_TAG_class_type: {
Devang Patel0e821f42011-04-12 23:21:44 +00001012 // Add elements to structure type.
Manman Renab8ffba2014-07-28 19:14:13 +00001013 DIArray Elements = CTy.getElements();
David Blaikiea1ae0e62013-08-01 20:30:22 +00001014 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
Devang Patel0e821f42011-04-12 23:21:44 +00001015 DIDescriptor Element = Elements.getElement(i);
Adrian Prantlef129fb2014-01-18 02:12:00 +00001016 if (Element.isSubprogram())
David Blaikie65a74662014-04-25 18:26:14 +00001017 getOrCreateSubprogramDIE(DISubprogram(Element));
Adrian Prantlef129fb2014-01-18 02:12:00 +00001018 else if (Element.isDerivedType()) {
Eric Christopherd42b92f2012-05-22 18:45:24 +00001019 DIDerivedType DDTy(Element);
1020 if (DDTy.getTag() == dwarf::DW_TAG_friend) {
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001021 DIE &ElemDie = createAndAddDIE(dwarf::DW_TAG_friend, Buffer);
Manman Ren93b30902013-10-08 18:42:58 +00001022 addType(ElemDie, resolve(DDTy.getTypeDerivedFrom()),
Manman Renb3388602013-10-05 01:43:03 +00001023 dwarf::DW_AT_friend);
Manman Renc6b63922013-10-14 20:33:57 +00001024 } else if (DDTy.isStaticMember()) {
Manman Ren57e6ff72013-10-23 22:57:12 +00001025 getOrCreateStaticMemberDIE(DDTy);
Manman Renc6b63922013-10-14 20:33:57 +00001026 } else {
Manman Ren230ec862013-10-23 23:00:44 +00001027 constructMemberDIE(Buffer, DDTy);
Manman Renc6b63922013-10-14 20:33:57 +00001028 }
Eric Christopher7285c7d2012-03-28 07:34:31 +00001029 } else if (Element.isObjCProperty()) {
Devang Pateld925d1a2012-02-07 23:33:58 +00001030 DIObjCProperty Property(Element);
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001031 DIE &ElemDie = createAndAddDIE(Property.getTag(), Buffer);
Devang Pateld925d1a2012-02-07 23:33:58 +00001032 StringRef PropertyName = Property.getObjCPropertyName();
1033 addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
Eric Christopher4c960562014-01-23 19:16:28 +00001034 if (Property.getType())
1035 addType(ElemDie, Property.getType());
Eric Christopherd42b92f2012-05-22 18:45:24 +00001036 addSourceLine(ElemDie, Property);
Devang Pateld925d1a2012-02-07 23:33:58 +00001037 StringRef GetterName = Property.getObjCPropertyGetterName();
1038 if (!GetterName.empty())
1039 addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
1040 StringRef SetterName = Property.getObjCPropertySetterName();
1041 if (!SetterName.empty())
1042 addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
1043 unsigned PropertyAttributes = 0;
Devang Patel403e8192012-02-04 01:30:32 +00001044 if (Property.isReadOnlyObjCProperty())
1045 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
1046 if (Property.isReadWriteObjCProperty())
1047 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
1048 if (Property.isAssignObjCProperty())
1049 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
1050 if (Property.isRetainObjCProperty())
1051 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
1052 if (Property.isCopyObjCProperty())
1053 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
1054 if (Property.isNonAtomicObjCProperty())
1055 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
1056 if (PropertyAttributes)
David Blaikief2443192013-10-21 17:28:37 +00001057 addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, None,
Eric Christopherc2697f82013-10-19 01:04:47 +00001058 PropertyAttributes);
Devang Patel44882172012-02-06 17:49:43 +00001059
Devang Pateld925d1a2012-02-07 23:33:58 +00001060 DIEEntry *Entry = getDIEEntry(Element);
1061 if (!Entry) {
David Blaikie8dbcc3f2014-04-25 19:33:43 +00001062 Entry = createDIEEntry(ElemDie);
Devang Pateld925d1a2012-02-07 23:33:58 +00001063 insertDIEEntry(Element, Entry);
1064 }
Devang Patel403e8192012-02-04 01:30:32 +00001065 } else
Devang Patel0e821f42011-04-12 23:21:44 +00001066 continue;
Devang Patel0e821f42011-04-12 23:21:44 +00001067 }
1068
1069 if (CTy.isAppleBlockExtension())
David Blaikie65a74662014-04-25 18:26:14 +00001070 addFlag(Buffer, dwarf::DW_AT_APPLE_block);
Devang Patel0e821f42011-04-12 23:21:44 +00001071
Adrian Prantlcf44e782014-12-19 00:01:20 +00001072 // This is outside the DWARF spec, but GDB expects a DW_AT_containing_type
1073 // inside C++ composite types to point to the base class with the vtable.
Eric Christopher9e429ae2013-10-05 00:27:02 +00001074 DICompositeType ContainingType(resolve(CTy.getContainingType()));
David Blaikie4f6bf27a2013-11-18 23:33:32 +00001075 if (ContainingType)
David Blaikie65a74662014-04-25 18:26:14 +00001076 addDIEEntry(Buffer, dwarf::DW_AT_containing_type,
David Blaikie8dbcc3f2014-04-25 19:33:43 +00001077 *getOrCreateTypeDIE(ContainingType));
Devang Patel0e821f42011-04-12 23:21:44 +00001078
Devang Patel12419ae2011-05-12 21:29:42 +00001079 if (CTy.isObjcClassComplete())
David Blaikie65a74662014-04-25 18:26:14 +00001080 addFlag(Buffer, dwarf::DW_AT_APPLE_objc_complete_type);
Devang Patel2409e782011-05-12 19:06:16 +00001081
Eric Christopherda011dd2011-12-16 23:42:42 +00001082 // Add template parameters to a class, structure or union types.
1083 // FIXME: The support isn't in the metadata for this yet.
1084 if (Tag == dwarf::DW_TAG_class_type ||
Eric Christopherc2697f82013-10-19 01:04:47 +00001085 Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type)
Devang Patel0e821f42011-04-12 23:21:44 +00001086 addTemplateParams(Buffer, CTy.getTemplateParams());
1087
1088 break;
1089 }
1090 default:
1091 break;
1092 }
1093
1094 // Add name if not anonymous or intermediate type.
1095 if (!Name.empty())
David Blaikie65a74662014-04-25 18:26:14 +00001096 addString(Buffer, dwarf::DW_AT_name, Name);
Devang Patel0e821f42011-04-12 23:21:44 +00001097
Eric Christopher775cbd22012-05-22 18:45:18 +00001098 if (Tag == dwarf::DW_TAG_enumeration_type ||
Eric Christopherc2697f82013-10-19 01:04:47 +00001099 Tag == dwarf::DW_TAG_class_type || Tag == dwarf::DW_TAG_structure_type ||
Eric Christopher775cbd22012-05-22 18:45:18 +00001100 Tag == dwarf::DW_TAG_union_type) {
Devang Patel0e821f42011-04-12 23:21:44 +00001101 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopher1cf33382012-06-01 00:22:32 +00001102 // TODO: Do we care about size for enum forward declarations?
Devang Patel0e821f42011-04-12 23:21:44 +00001103 if (Size)
David Blaikie65a74662014-04-25 18:26:14 +00001104 addUInt(Buffer, dwarf::DW_AT_byte_size, None, Size);
Eric Christopher1cf33382012-06-01 00:22:32 +00001105 else if (!CTy.isForwardDecl())
Devang Patel0e821f42011-04-12 23:21:44 +00001106 // Add zero size if it is not a forward declaration.
David Blaikie65a74662014-04-25 18:26:14 +00001107 addUInt(Buffer, dwarf::DW_AT_byte_size, None, 0);
Eric Christopher1cf33382012-06-01 00:22:32 +00001108
1109 // If we're a forward decl, say so.
1110 if (CTy.isForwardDecl())
David Blaikie65a74662014-04-25 18:26:14 +00001111 addFlag(Buffer, dwarf::DW_AT_declaration);
Devang Patel0e821f42011-04-12 23:21:44 +00001112
1113 // Add source line info if available.
1114 if (!CTy.isForwardDecl())
David Blaikie65a74662014-04-25 18:26:14 +00001115 addSourceLine(Buffer, CTy);
Eric Christopher54cf8ff2012-03-07 00:15:19 +00001116
1117 // No harm in adding the runtime language to the declaration.
1118 unsigned RLang = CTy.getRunTimeLang();
1119 if (RLang)
David Blaikie65a74662014-04-25 18:26:14 +00001120 addUInt(Buffer, dwarf::DW_AT_APPLE_runtime_class, dwarf::DW_FORM_data1,
Eric Christopherc2697f82013-10-19 01:04:47 +00001121 RLang);
Devang Patel0e821f42011-04-12 23:21:44 +00001122 }
1123}
1124
Manman Renffc9a712013-10-23 23:05:28 +00001125/// constructTemplateTypeParameterDIE - Construct new DIE for the given
1126/// DITemplateTypeParameter.
Eric Christophera5a79422013-12-09 23:32:48 +00001127void DwarfUnit::constructTemplateTypeParameterDIE(DIE &Buffer,
1128 DITemplateTypeParameter TP) {
David Blaikie65a74662014-04-25 18:26:14 +00001129 DIE &ParamDIE =
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001130 createAndAddDIE(dwarf::DW_TAG_template_type_parameter, Buffer);
Eric Christopher056b6472013-08-08 08:09:43 +00001131 // Add the type if it exists, it could be void and therefore no type.
1132 if (TP.getType())
Manman Ren88b0f942013-10-09 19:46:28 +00001133 addType(ParamDIE, resolve(TP.getType()));
David Blaikie2b380232013-06-22 18:59:11 +00001134 if (!TP.getName().empty())
1135 addString(ParamDIE, dwarf::DW_AT_name, TP.getName());
Devang Patel0e821f42011-04-12 23:21:44 +00001136}
1137
Manman Renffc9a712013-10-23 23:05:28 +00001138/// constructTemplateValueParameterDIE - Construct new DIE for the given
1139/// DITemplateValueParameter.
Eric Christophera5a79422013-12-09 23:32:48 +00001140void
1141DwarfUnit::constructTemplateValueParameterDIE(DIE &Buffer,
David Blaikie319a05f2013-12-02 19:33:10 +00001142 DITemplateValueParameter VP) {
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001143 DIE &ParamDIE = createAndAddDIE(VP.getTag(), Buffer);
Eric Christopher0df08e22013-08-08 07:40:37 +00001144
1145 // Add the type if there is one, template template and template parameter
1146 // packs will not have a type.
Eric Christopher691281b2013-10-21 17:48:51 +00001147 if (VP.getTag() == dwarf::DW_TAG_template_value_parameter)
Manman Ren88b0f942013-10-09 19:46:28 +00001148 addType(ParamDIE, resolve(VP.getType()));
Eric Christopherafb2c412013-08-08 07:40:31 +00001149 if (!VP.getName().empty())
1150 addString(ParamDIE, dwarf::DW_AT_name, VP.getName());
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +00001151 if (Metadata *Val = VP.getValue()) {
1152 if (ConstantInt *CI = mdconst::dyn_extract<ConstantInt>(Val))
David Blaikiec0a28412014-05-11 15:56:59 +00001153 addConstantValue(ParamDIE, CI, resolve(VP.getType()));
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +00001154 else if (GlobalValue *GV = mdconst::dyn_extract<GlobalValue>(Val)) {
David Blaikiea1e813d2013-05-10 21:52:07 +00001155 // For declaration non-type template parameters (such as global values and
1156 // functions)
Eric Christopher4a741042014-02-16 08:46:55 +00001157 DIELoc *Loc = new (DIEValueAllocator) DIELoc();
David Blaikie65a74662014-04-25 18:26:14 +00001158 addOpAddress(*Loc, Asm->getSymbol(GV));
David Blaikiea1e813d2013-05-10 21:52:07 +00001159 // Emit DW_OP_stack_value to use the address as the immediate value of the
1160 // parameter, rather than a pointer to it.
David Blaikie65a74662014-04-25 18:26:14 +00001161 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value);
Eric Christopher4a741042014-02-16 08:46:55 +00001162 addBlock(ParamDIE, dwarf::DW_AT_location, Loc);
Eric Christopherafb2c412013-08-08 07:40:31 +00001163 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_template_param) {
David Blaikie2b380232013-06-22 18:59:11 +00001164 assert(isa<MDString>(Val));
1165 addString(ParamDIE, dwarf::DW_AT_GNU_template_name,
1166 cast<MDString>(Val)->getString());
Eric Christopherafb2c412013-08-08 07:40:31 +00001167 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_parameter_pack) {
David Blaikie2b380232013-06-22 18:59:11 +00001168 assert(isa<MDNode>(Val));
1169 DIArray A(cast<MDNode>(Val));
David Blaikie65a74662014-04-25 18:26:14 +00001170 addTemplateParams(ParamDIE, A);
David Blaikiea1e813d2013-05-10 21:52:07 +00001171 }
1172 }
Devang Patel0e821f42011-04-12 23:21:44 +00001173}
1174
Devang Patel17b53272011-05-06 16:57:54 +00001175/// getOrCreateNameSpace - Create a DIE for DINameSpace.
Eric Christophera5a79422013-12-09 23:32:48 +00001176DIE *DwarfUnit::getOrCreateNameSpace(DINameSpace NS) {
Manman Renf6b936b2013-10-29 05:49:41 +00001177 // Construct the context before querying for the existence of the DIE in case
1178 // such construction creates the DIE.
1179 DIE *ContextDIE = getOrCreateContextDIE(NS.getContext());
Manman Renf6b936b2013-10-29 05:49:41 +00001180
David Blaikie65a74662014-04-25 18:26:14 +00001181 if (DIE *NDie = getDIE(NS))
Devang Patel17b53272011-05-06 16:57:54 +00001182 return NDie;
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001183 DIE &NDie = createAndAddDIE(dwarf::DW_TAG_namespace, *ContextDIE, NS);
Manman Renf6b936b2013-10-29 05:49:41 +00001184
David Blaikie553eb4a2014-06-06 22:16:56 +00001185 StringRef Name = NS.getName();
1186 if (!Name.empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +00001187 addString(NDie, dwarf::DW_AT_name, NS.getName());
David Blaikie553eb4a2014-06-06 22:16:56 +00001188 else
1189 Name = "(anonymous namespace)";
1190 DD->addAccelNamespace(Name, NDie);
1191 addGlobalName(Name, NDie, NS.getContext());
Devang Patel17b53272011-05-06 16:57:54 +00001192 addSourceLine(NDie, NS);
David Blaikie65a74662014-04-25 18:26:14 +00001193 return &NDie;
Devang Patel17b53272011-05-06 16:57:54 +00001194}
1195
Devang Patel89543712011-08-15 17:24:54 +00001196/// getOrCreateSubprogramDIE - Create new DIE using SP.
David Blaikie3a443c22014-11-04 22:12:25 +00001197DIE *DwarfUnit::getOrCreateSubprogramDIE(DISubprogram SP, bool Minimal) {
David Blaikie309ffe42013-10-04 01:39:59 +00001198 // Construct the context before querying for the existence of the DIE in case
1199 // such construction creates the DIE (as is the case for member function
1200 // declarations).
David Blaikie3a443c22014-11-04 22:12:25 +00001201 DIE *ContextDIE =
1202 Minimal ? &getUnitDie() : getOrCreateContextDIE(resolve(SP.getContext()));
Adrian Prantld486b342014-03-18 17:41:15 +00001203
David Blaikie65a74662014-04-25 18:26:14 +00001204 if (DIE *SPDie = getDIE(SP))
Devang Patel89543712011-08-15 17:24:54 +00001205 return SPDie;
1206
David Blaikiece7a1bd2014-05-21 18:04:33 +00001207 if (DISubprogram SPDecl = SP.getFunctionDeclaration()) {
David Blaikie3a443c22014-11-04 22:12:25 +00001208 if (!Minimal) {
1209 // Add subprogram definitions to the CU die directly.
1210 ContextDIE = &getUnitDie();
1211 // Build the decl now to ensure it precedes the definition.
1212 getOrCreateSubprogramDIE(SPDecl);
1213 }
David Blaikiece7a1bd2014-05-21 18:04:33 +00001214 }
Peter Collingbourne4d358b52012-05-27 18:36:44 +00001215
1216 // DW_TAG_inlined_subroutine may refer to this DIE.
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001217 DIE &SPDie = createAndAddDIE(dwarf::DW_TAG_subprogram, *ContextDIE, SP);
Peter Collingbourne4d358b52012-05-27 18:36:44 +00001218
David Blaikie6cfa9e12014-06-05 00:25:26 +00001219 // Stop here and fill this in later, depending on whether or not this
David Blaikief7221ad2014-05-27 18:37:43 +00001220 // subprogram turns out to have inlined instances or not.
1221 if (SP.isDefinition())
1222 return &SPDie;
1223
David Blaikie7f916862014-05-27 18:37:38 +00001224 applySubprogramAttributes(SP, SPDie);
1225 return &SPDie;
1226}
1227
David Blaikie3a443c22014-11-04 22:12:25 +00001228bool DwarfUnit::applySubprogramDefinitionAttributes(DISubprogram SP,
1229 DIE &SPDie) {
David Blaikie7f916862014-05-27 18:37:38 +00001230 DIE *DeclDie = nullptr;
1231 StringRef DeclLinkageName;
1232 if (DISubprogram SPDecl = SP.getFunctionDeclaration()) {
David Blaikief7221ad2014-05-27 18:37:43 +00001233 DeclDie = getDIE(SPDecl);
David Blaikie6cfa9e12014-06-05 00:25:26 +00001234 assert(DeclDie && "This DIE should've already been constructed when the "
Alp Toker5c536392014-06-07 21:23:09 +00001235 "definition DIE was created in "
David Blaikie6cfa9e12014-06-05 00:25:26 +00001236 "getOrCreateSubprogramDIE");
David Blaikie7f916862014-05-27 18:37:38 +00001237 DeclLinkageName = SPDecl.getLinkageName();
1238 }
Rafael Espindola79278362011-11-10 22:34:29 +00001239
Devang Patel89543712011-08-15 17:24:54 +00001240 // Add function template parameters.
David Blaikie65a74662014-04-25 18:26:14 +00001241 addTemplateParams(SPDie, SP.getTemplateParams());
Devang Patel89543712011-08-15 17:24:54 +00001242
Adrian Prantl8714aaf2014-04-14 21:16:04 +00001243 // Add the linkage name if we have one and it isn't in the Decl.
1244 StringRef LinkageName = SP.getLinkageName();
David Blaikiece7a1bd2014-05-21 18:04:33 +00001245 assert(((LinkageName.empty() || DeclLinkageName.empty()) ||
1246 LinkageName == DeclLinkageName) &&
1247 "decl has a linkage name and it is different");
1248 if (!LinkageName.empty() && DeclLinkageName.empty())
1249 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
1250 GlobalValue::getRealLinkageName(LinkageName));
Devang Patel89543712011-08-15 17:24:54 +00001251
David Blaikie3a443c22014-11-04 22:12:25 +00001252 if (!DeclDie)
1253 return false;
1254
1255 // Refer to the function declaration where all the other attributes will be
1256 // found.
1257 addDIEEntry(SPDie, dwarf::DW_AT_specification, *DeclDie);
1258 return true;
1259}
1260
1261void DwarfUnit::applySubprogramAttributes(DISubprogram SP, DIE &SPDie,
1262 bool Minimal) {
1263 if (!Minimal)
1264 if (applySubprogramDefinitionAttributes(SP, SPDie))
1265 return;
Eric Christopheracb71152012-08-23 22:52:55 +00001266
Devang Patel89543712011-08-15 17:24:54 +00001267 // Constructors and operators for anonymous aggregates do not have names.
1268 if (!SP.getName().empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +00001269 addString(SPDie, dwarf::DW_AT_name, SP.getName());
Devang Patel89543712011-08-15 17:24:54 +00001270
David Blaikie0b9438b2014-09-19 04:47:46 +00001271 // Skip the rest of the attributes under -gmlt to save space.
David Blaikie279c4512014-11-02 08:18:06 +00001272 if (Minimal)
David Blaikie73b65d22014-09-19 04:30:36 +00001273 return;
1274
Devang Patel89543712011-08-15 17:24:54 +00001275 addSourceLine(SPDie, SP);
1276
Eric Christopher5cd2a9d2012-02-22 08:46:21 +00001277 // Add the prototype if we have a prototype and we have a C like
1278 // language.
David Blaikiecb8e4352013-11-15 23:50:53 +00001279 uint16_t Language = getLanguage();
Eric Christopher5cd2a9d2012-02-22 08:46:21 +00001280 if (SP.isPrototyped() &&
Eric Christopherc2697f82013-10-19 01:04:47 +00001281 (Language == dwarf::DW_LANG_C89 || Language == dwarf::DW_LANG_C99 ||
Eric Christopher5cd2a9d2012-02-22 08:46:21 +00001282 Language == dwarf::DW_LANG_ObjC))
Eric Christopherbb69a272012-08-24 01:14:27 +00001283 addFlag(SPDie, dwarf::DW_AT_prototyped);
Devang Patel89543712011-08-15 17:24:54 +00001284
Manman Renf8a19672014-07-28 22:24:06 +00001285 DISubroutineType SPTy = SP.getType();
David Blaikie5174c842013-05-22 23:22:18 +00001286 assert(SPTy.getTag() == dwarf::DW_TAG_subroutine_type &&
1287 "the type of a subprogram should be a subroutine");
Devang Patel89543712011-08-15 17:24:54 +00001288
Manman Renf8a19672014-07-28 22:24:06 +00001289 DITypeArray Args = SPTy.getTypeArray();
Eric Christopher691281b2013-10-21 17:48:51 +00001290 // Add a return type. If this is a type like a C/C++ void type we don't add a
1291 // return type.
Manman Renf8a19672014-07-28 22:24:06 +00001292 if (resolve(Args.getElement(0)))
1293 addType(SPDie, DIType(resolve(Args.getElement(0))));
Devang Patel89543712011-08-15 17:24:54 +00001294
1295 unsigned VK = SP.getVirtuality();
1296 if (VK) {
Nick Lewyckycfde1a22011-12-14 00:56:07 +00001297 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
Eric Christopher4a741042014-02-16 08:46:55 +00001298 DIELoc *Block = getDIELoc();
David Blaikie65a74662014-04-25 18:26:14 +00001299 addUInt(*Block, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1300 addUInt(*Block, dwarf::DW_FORM_udata, SP.getVirtualIndex());
David Blaikief2443192013-10-21 17:28:37 +00001301 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, Block);
Eric Christopher98b7f172013-11-11 18:52:36 +00001302 ContainingTypeMap.insert(
David Blaikie65a74662014-04-25 18:26:14 +00001303 std::make_pair(&SPDie, resolve(SP.getContainingType())));
Devang Patel89543712011-08-15 17:24:54 +00001304 }
1305
1306 if (!SP.isDefinition()) {
Eric Christopherbb69a272012-08-24 01:14:27 +00001307 addFlag(SPDie, dwarf::DW_AT_declaration);
Eric Christopher92331fd2012-11-21 00:34:38 +00001308
Devang Patel89543712011-08-15 17:24:54 +00001309 // Add arguments. Do not add arguments for subprogram definition. They will
1310 // be handled while processing variables.
David Blaikie899ae612014-04-30 22:58:19 +00001311 constructSubprogramArguments(SPDie, Args);
Devang Patel89543712011-08-15 17:24:54 +00001312 }
1313
1314 if (SP.isArtificial())
Eric Christopherbb69a272012-08-24 01:14:27 +00001315 addFlag(SPDie, dwarf::DW_AT_artificial);
Devang Patel89543712011-08-15 17:24:54 +00001316
1317 if (!SP.isLocalToUnit())
Eric Christopherbb69a272012-08-24 01:14:27 +00001318 addFlag(SPDie, dwarf::DW_AT_external);
Devang Patel89543712011-08-15 17:24:54 +00001319
1320 if (SP.isOptimized())
Eric Christopherbb69a272012-08-24 01:14:27 +00001321 addFlag(SPDie, dwarf::DW_AT_APPLE_optimized);
Devang Patel89543712011-08-15 17:24:54 +00001322
1323 if (unsigned isa = Asm->getISAEncoding()) {
1324 addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1325 }
1326
Adrian Prantl99c7af22013-12-18 21:48:19 +00001327 if (SP.isLValueReference())
1328 addFlag(SPDie, dwarf::DW_AT_reference);
1329
1330 if (SP.isRValueReference())
1331 addFlag(SPDie, dwarf::DW_AT_rvalue_reference);
1332
Adrian Prantlef129fb2014-01-18 02:12:00 +00001333 if (SP.isProtected())
1334 addUInt(SPDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1335 dwarf::DW_ACCESS_protected);
1336 else if (SP.isPrivate())
1337 addUInt(SPDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1338 dwarf::DW_ACCESS_private);
Adrian Prantldaedfda2014-08-29 22:44:07 +00001339 else if (SP.isPublic())
Adrian Prantlef129fb2014-01-18 02:12:00 +00001340 addUInt(SPDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1341 dwarf::DW_ACCESS_public);
1342
1343 if (SP.isExplicit())
1344 addFlag(SPDie, dwarf::DW_AT_explicit);
Devang Patel89543712011-08-15 17:24:54 +00001345}
1346
Devang Patel0e821f42011-04-12 23:21:44 +00001347/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
Eric Christophera5a79422013-12-09 23:32:48 +00001348void DwarfUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy) {
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001349 DIE &DW_Subrange = createAndAddDIE(dwarf::DW_TAG_subrange_type, Buffer);
David Blaikie8dbcc3f2014-04-25 19:33:43 +00001350 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, *IndexTy);
Devang Patel0e821f42011-04-12 23:21:44 +00001351
Bill Wendling28fe9e72012-12-06 07:38:10 +00001352 // The LowerBound value defines the lower bounds which is typically zero for
1353 // C/C++. The Count value is the number of elements. Values are 64 bit. If
1354 // Count == -1 then the array is unbounded and we do not emit
David Blaikie32b0f362014-10-01 00:56:55 +00001355 // DW_AT_lower_bound and DW_AT_count attributes.
Bill Wendling28fe9e72012-12-06 07:38:10 +00001356 int64_t LowerBound = SR.getLo();
Bill Wendling3495f9b2012-12-06 07:55:19 +00001357 int64_t DefaultLowerBound = getDefaultLowerBound();
Bill Wendlingd7767122012-12-04 21:34:03 +00001358 int64_t Count = SR.getCount();
Devang Patel0e821f42011-04-12 23:21:44 +00001359
Bill Wendling3495f9b2012-12-06 07:55:19 +00001360 if (DefaultLowerBound == -1 || LowerBound != DefaultLowerBound)
David Blaikief2443192013-10-21 17:28:37 +00001361 addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, None, LowerBound);
Bill Wendling28fe9e72012-12-06 07:38:10 +00001362
David Blaikie32b0f362014-10-01 00:56:55 +00001363 if (Count != -1)
Bill Wendlingd7767122012-12-04 21:34:03 +00001364 // FIXME: An unbounded array should reference the expression that defines
1365 // the array.
David Blaikie32b0f362014-10-01 00:56:55 +00001366 addUInt(DW_Subrange, dwarf::DW_AT_count, None, Count);
Devang Patel0e821f42011-04-12 23:21:44 +00001367}
1368
David Blaikie871c2d92014-11-02 03:09:13 +00001369DIE *DwarfUnit::getIndexTyDie() {
1370 if (IndexTyDie)
1371 return IndexTyDie;
1372 // Construct an integer type to use for indexes.
1373 IndexTyDie = &createAndAddDIE(dwarf::DW_TAG_base_type, UnitDie);
1374 addString(*IndexTyDie, dwarf::DW_AT_name, "sizetype");
1375 addUInt(*IndexTyDie, dwarf::DW_AT_byte_size, None, sizeof(int64_t));
1376 addUInt(*IndexTyDie, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1377 dwarf::DW_ATE_unsigned);
1378 return IndexTyDie;
1379}
1380
Devang Patel0e821f42011-04-12 23:21:44 +00001381/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
Eric Christophera5a79422013-12-09 23:32:48 +00001382void DwarfUnit::constructArrayTypeDIE(DIE &Buffer, DICompositeType CTy) {
Eric Christopherdf9955d2013-11-11 18:52:31 +00001383 if (CTy.isVector())
David Blaikie65a74662014-04-25 18:26:14 +00001384 addFlag(Buffer, dwarf::DW_AT_GNU_vector);
Devang Patel0e821f42011-04-12 23:21:44 +00001385
Eric Christopher0df08e22013-08-08 07:40:37 +00001386 // Emit the element type.
David Blaikie65a74662014-04-25 18:26:14 +00001387 addType(Buffer, resolve(CTy.getTypeDerivedFrom()));
Devang Patel0e821f42011-04-12 23:21:44 +00001388
1389 // Get an anonymous type for index type.
Eric Christophercad9b532013-01-04 21:51:53 +00001390 // FIXME: This type should be passed down from the front end
1391 // as different languages may have different sizes for indexes.
Devang Patel0e821f42011-04-12 23:21:44 +00001392 DIE *IdxTy = getIndexTyDie();
Devang Patel0e821f42011-04-12 23:21:44 +00001393
1394 // Add subranges to array type.
Manman Renab8ffba2014-07-28 19:14:13 +00001395 DIArray Elements = CTy.getElements();
Devang Patel0e821f42011-04-12 23:21:44 +00001396 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1397 DIDescriptor Element = Elements.getElement(i);
1398 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1399 constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1400 }
1401}
1402
Eric Christopheraeb105f2013-11-11 18:52:39 +00001403/// constructEnumTypeDIE - Construct an enum type DIE from DICompositeType.
Eric Christophera5a79422013-12-09 23:32:48 +00001404void DwarfUnit::constructEnumTypeDIE(DIE &Buffer, DICompositeType CTy) {
Manman Renab8ffba2014-07-28 19:14:13 +00001405 DIArray Elements = CTy.getElements();
Eric Christopheraeb105f2013-11-11 18:52:39 +00001406
1407 // Add enumerators to enumeration type.
1408 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
David Blaikie4f6bf27a2013-11-18 23:33:32 +00001409 DIEnumerator Enum(Elements.getElement(i));
Eric Christopheraeb105f2013-11-11 18:52:39 +00001410 if (Enum.isEnumerator()) {
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001411 DIE &Enumerator = createAndAddDIE(dwarf::DW_TAG_enumerator, Buffer);
David Blaikie4f6bf27a2013-11-18 23:33:32 +00001412 StringRef Name = Enum.getName();
Eric Christopheraeb105f2013-11-11 18:52:39 +00001413 addString(Enumerator, dwarf::DW_AT_name, Name);
David Blaikie4f6bf27a2013-11-18 23:33:32 +00001414 int64_t Value = Enum.getEnumValue();
Eric Christophera07e4f52013-11-19 09:28:34 +00001415 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata,
1416 Value);
Eric Christopheraeb105f2013-11-11 18:52:39 +00001417 }
1418 }
1419 DIType DTy = resolve(CTy.getTypeDerivedFrom());
1420 if (DTy) {
David Blaikie65a74662014-04-25 18:26:14 +00001421 addType(Buffer, DTy);
1422 addFlag(Buffer, dwarf::DW_AT_enum_class);
Eric Christopheraeb105f2013-11-11 18:52:39 +00001423 }
Devang Patel0e821f42011-04-12 23:21:44 +00001424}
1425
Devang Patel89543712011-08-15 17:24:54 +00001426/// constructContainingTypeDIEs - Construct DIEs for types that contain
1427/// vtables.
Eric Christophera5a79422013-12-09 23:32:48 +00001428void DwarfUnit::constructContainingTypeDIEs() {
Devang Patel89543712011-08-15 17:24:54 +00001429 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
Eric Christopherc2697f82013-10-19 01:04:47 +00001430 CE = ContainingTypeMap.end();
1431 CI != CE; ++CI) {
David Blaikie65a74662014-04-25 18:26:14 +00001432 DIE &SPDie = *CI->first;
David Blaikie2ad00162013-11-15 23:09:13 +00001433 DIDescriptor D(CI->second);
1434 if (!D)
Eric Christopherc2697f82013-10-19 01:04:47 +00001435 continue;
David Blaikie2ad00162013-11-15 23:09:13 +00001436 DIE *NDie = getDIE(D);
Eric Christopherc2697f82013-10-19 01:04:47 +00001437 if (!NDie)
1438 continue;
David Blaikie8dbcc3f2014-04-25 19:33:43 +00001439 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, *NDie);
Devang Patel89543712011-08-15 17:24:54 +00001440 }
1441}
1442
Manman Ren230ec862013-10-23 23:00:44 +00001443/// constructMemberDIE - Construct member DIE from DIDerivedType.
Eric Christophera5a79422013-12-09 23:32:48 +00001444void DwarfUnit::constructMemberDIE(DIE &Buffer, DIDerivedType DT) {
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001445 DIE &MemberDie = createAndAddDIE(DT.getTag(), Buffer);
Devang Patel0e821f42011-04-12 23:21:44 +00001446 StringRef Name = DT.getName();
1447 if (!Name.empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +00001448 addString(MemberDie, dwarf::DW_AT_name, Name);
Devang Patel0e821f42011-04-12 23:21:44 +00001449
Manman Ren93b30902013-10-08 18:42:58 +00001450 addType(MemberDie, resolve(DT.getTypeDerivedFrom()));
Devang Patel0e821f42011-04-12 23:21:44 +00001451
1452 addSourceLine(MemberDie, DT);
1453
Eric Christopherc2697f82013-10-19 01:04:47 +00001454 if (DT.getTag() == dwarf::DW_TAG_inheritance && DT.isVirtual()) {
Devang Patel0e821f42011-04-12 23:21:44 +00001455
1456 // For C++, virtual base classes are not at fixed offset. Use following
1457 // expression to extract appropriate offset from vtable.
1458 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1459
Eric Christopher4a741042014-02-16 08:46:55 +00001460 DIELoc *VBaseLocationDie = new (DIEValueAllocator) DIELoc();
David Blaikie65a74662014-04-25 18:26:14 +00001461 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1462 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1463 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1464 addUInt(*VBaseLocationDie, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1465 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1466 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1467 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
Devang Patel0e821f42011-04-12 23:21:44 +00001468
David Blaikief2443192013-10-21 17:28:37 +00001469 addBlock(MemberDie, dwarf::DW_AT_data_member_location, VBaseLocationDie);
David Blaikie71d34a22013-11-01 00:25:45 +00001470 } else {
1471 uint64_t Size = DT.getSizeInBits();
1472 uint64_t FieldSize = getBaseTypeSize(DD, DT);
1473 uint64_t OffsetInBytes;
1474
David Blaikiefa1a3c72015-01-28 02:34:53 +00001475 if (FieldSize && Size != FieldSize) {
Eric Christopher1acdbb82014-03-12 17:14:46 +00001476 // Handle bitfield, assume bytes are 8 bits.
1477 addUInt(MemberDie, dwarf::DW_AT_byte_size, None, FieldSize/8);
1478 addUInt(MemberDie, dwarf::DW_AT_bit_size, None, Size);
David Blaikie71d34a22013-11-01 00:25:45 +00001479
1480 uint64_t Offset = DT.getOffsetInBits();
1481 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1482 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1483 uint64_t FieldOffset = (HiMark - FieldSize);
1484 Offset -= FieldOffset;
1485
1486 // Maybe we need to work from the other end.
1487 if (Asm->getDataLayout().isLittleEndian())
1488 Offset = FieldSize - (Offset + Size);
1489 addUInt(MemberDie, dwarf::DW_AT_bit_offset, None, Offset);
1490
Adrian Prantlc67655a2014-01-28 18:13:47 +00001491 // Here DW_AT_data_member_location points to the anonymous
David Blaikie71d34a22013-11-01 00:25:45 +00001492 // field that includes this bit field.
1493 OffsetInBytes = FieldOffset >> 3;
1494 } else
1495 // This is not a bitfield.
1496 OffsetInBytes = DT.getOffsetInBits() >> 3;
David Blaikie2ada1162014-01-03 00:48:38 +00001497
David Blaikie22b29a52014-01-03 01:30:05 +00001498 if (DD->getDwarfVersion() <= 2) {
Eric Christopher4a741042014-02-16 08:46:55 +00001499 DIELoc *MemLocationDie = new (DIEValueAllocator) DIELoc();
David Blaikie65a74662014-04-25 18:26:14 +00001500 addUInt(*MemLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1501 addUInt(*MemLocationDie, dwarf::DW_FORM_udata, OffsetInBytes);
David Blaikie22b29a52014-01-03 01:30:05 +00001502 addBlock(MemberDie, dwarf::DW_AT_data_member_location, MemLocationDie);
1503 } else
1504 addUInt(MemberDie, dwarf::DW_AT_data_member_location, None,
1505 OffsetInBytes);
David Blaikie71d34a22013-11-01 00:25:45 +00001506 }
Devang Patel0e821f42011-04-12 23:21:44 +00001507
1508 if (DT.isProtected())
Nick Lewyckycb918492011-12-13 05:09:11 +00001509 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001510 dwarf::DW_ACCESS_protected);
1511 else if (DT.isPrivate())
Nick Lewyckycb918492011-12-13 05:09:11 +00001512 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001513 dwarf::DW_ACCESS_private);
1514 // Otherwise C++ member and base classes are considered public.
Adrian Prantldaedfda2014-08-29 22:44:07 +00001515 else if (DT.isPublic())
Nick Lewyckycb918492011-12-13 05:09:11 +00001516 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001517 dwarf::DW_ACCESS_public);
1518 if (DT.isVirtual())
Nick Lewyckycfde1a22011-12-14 00:56:07 +00001519 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001520 dwarf::DW_VIRTUALITY_virtual);
Devang Patel514b4002011-04-16 00:11:51 +00001521
1522 // Objective-C properties.
Devang Patel44882172012-02-06 17:49:43 +00001523 if (MDNode *PNode = DT.getObjCProperty())
1524 if (DIEEntry *PropertyDie = getDIEEntry(PNode))
David Blaikie65a74662014-04-25 18:26:14 +00001525 MemberDie.addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4,
1526 PropertyDie);
Devang Patel44882172012-02-06 17:49:43 +00001527
David Blaikie37fefc32012-12-13 22:43:07 +00001528 if (DT.isArtificial())
1529 addFlag(MemberDie, dwarf::DW_AT_artificial);
Devang Patel0e821f42011-04-12 23:21:44 +00001530}
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001531
Manman Renc6b63922013-10-14 20:33:57 +00001532/// getOrCreateStaticMemberDIE - Create new DIE for C++ static member.
Eric Christophera5a79422013-12-09 23:32:48 +00001533DIE *DwarfUnit::getOrCreateStaticMemberDIE(DIDerivedType DT) {
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001534 if (!DT.Verify())
Craig Topper353eda42014-04-24 06:44:33 +00001535 return nullptr;
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001536
Manman Renc6b63922013-10-14 20:33:57 +00001537 // Construct the context before querying for the existence of the DIE in case
1538 // such construction creates the DIE.
1539 DIE *ContextDIE = getOrCreateContextDIE(resolve(DT.getContext()));
David Blaikiebd700e42013-11-14 21:24:34 +00001540 assert(dwarf::isType(ContextDIE->getTag()) &&
1541 "Static member should belong to a type.");
Manman Renc6b63922013-10-14 20:33:57 +00001542
David Blaikie65a74662014-04-25 18:26:14 +00001543 if (DIE *StaticMemberDIE = getDIE(DT))
Manman Renc6b63922013-10-14 20:33:57 +00001544 return StaticMemberDIE;
1545
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001546 DIE &StaticMemberDIE = createAndAddDIE(DT.getTag(), *ContextDIE, DT);
Manman Renc6b63922013-10-14 20:33:57 +00001547
Manman Ren93b30902013-10-08 18:42:58 +00001548 DIType Ty = resolve(DT.getTypeDerivedFrom());
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001549
1550 addString(StaticMemberDIE, dwarf::DW_AT_name, DT.getName());
1551 addType(StaticMemberDIE, Ty);
1552 addSourceLine(StaticMemberDIE, DT);
1553 addFlag(StaticMemberDIE, dwarf::DW_AT_external);
1554 addFlag(StaticMemberDIE, dwarf::DW_AT_declaration);
1555
1556 // FIXME: We could omit private if the parent is a class_type, and
1557 // public if the parent is something else.
1558 if (DT.isProtected())
1559 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1560 dwarf::DW_ACCESS_protected);
1561 else if (DT.isPrivate())
1562 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1563 dwarf::DW_ACCESS_private);
Adrian Prantldaedfda2014-08-29 22:44:07 +00001564 else if (DT.isPublic())
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001565 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1566 dwarf::DW_ACCESS_public);
1567
1568 if (const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(DT.getConstant()))
David Blaikiec0a28412014-05-11 15:56:59 +00001569 addConstantValue(StaticMemberDIE, CI, Ty);
David Blaikiea39a76e2013-01-20 01:18:01 +00001570 if (const ConstantFP *CFP = dyn_cast_or_null<ConstantFP>(DT.getConstant()))
1571 addConstantFPValue(StaticMemberDIE, CFP);
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001572
David Blaikie65a74662014-04-25 18:26:14 +00001573 return &StaticMemberDIE;
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001574}
David Blaikie6b288cf2013-10-30 20:42:41 +00001575
David Blaikied82b2372014-03-24 20:28:10 +00001576void DwarfUnit::emitHeader(const MCSymbol *ASectionSym) const {
David Blaikieae57e662014-11-01 23:59:23 +00001577 // Emit size of content not including length itself
1578 Asm->OutStreamer.AddComment("Length of Unit");
1579 Asm->EmitInt32(getHeaderSize() + UnitDie.getSize());
1580
David Blaikie6b288cf2013-10-30 20:42:41 +00001581 Asm->OutStreamer.AddComment("DWARF version number");
1582 Asm->EmitInt16(DD->getDwarfVersion());
1583 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
David Blaikie6896e192013-12-04 23:39:02 +00001584 // We share one abbreviations table across all units so it's always at the
1585 // start of the section. Use a relocatable offset where needed to ensure
1586 // linking doesn't invalidate that offset.
David Blaikie3c9a3cc2014-03-24 20:53:02 +00001587 if (ASectionSym)
1588 Asm->EmitSectionOffset(ASectionSym, ASectionSym);
1589 else
David Blaikie326e1fa2014-04-02 02:04:51 +00001590 // Use a constant value when no symbol is provided.
David Blaikie3c9a3cc2014-03-24 20:53:02 +00001591 Asm->EmitInt32(0);
David Blaikie6b288cf2013-10-30 20:42:41 +00001592 Asm->OutStreamer.AddComment("Address Size (in bytes)");
1593 Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
1594}
David Blaikiebc563272013-12-13 21:33:40 +00001595
David Blaikiea34568b2014-11-01 20:06:28 +00001596void DwarfUnit::initSection(const MCSection *Section) {
1597 assert(!this->Section);
1598 this->Section = Section;
David Blaikiea34568b2014-11-01 20:06:28 +00001599}
1600
David Blaikied82b2372014-03-24 20:28:10 +00001601void DwarfTypeUnit::emitHeader(const MCSymbol *ASectionSym) const {
1602 DwarfUnit::emitHeader(ASectionSym);
David Blaikiebc563272013-12-13 21:33:40 +00001603 Asm->OutStreamer.AddComment("Type Signature");
1604 Asm->OutStreamer.EmitIntValue(TypeSignature, sizeof(TypeSignature));
1605 Asm->OutStreamer.AddComment("Type DIE Offset");
David Blaikie15ed5eb2014-01-10 01:38:41 +00001606 // In a skeleton type unit there is no type DIE so emit a zero offset.
1607 Asm->OutStreamer.EmitIntValue(Ty ? Ty->getOffset() : 0,
1608 sizeof(Ty->getOffset()));
David Blaikiebc563272013-12-13 21:33:40 +00001609}
1610
David Blaikiecafd9622014-11-02 08:51:37 +00001611bool DwarfTypeUnit::isDwoUnit() const {
1612 // Since there are no skeleton type units, all type units are dwo type units
1613 // when split DWARF is being used.
1614 return DD->useSplitDwarf();
1615}