blob: 0d1979d7d83019a80b0fd3f6958fc0485c4c8b32 [file] [log] [blame]
David Blaikie319a05f2013-12-02 19:33:10 +00001//===-- llvm/CodeGen/DwarfUnit.cpp - Dwarf Type and Compile Units ---------===//
Devang Patel0e821f42011-04-12 23:21:44 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
Eric Christopher160522c2012-08-14 05:13:29 +000010// This file contains support for constructing a dwarf compile unit.
Devang Patel0e821f42011-04-12 23:21:44 +000011//
12//===----------------------------------------------------------------------===//
13
David Blaikie2c86a722013-12-02 19:33:15 +000014#include "DwarfUnit.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000015#include "DwarfAccelTable.h"
David Blaikie37c52312014-10-04 15:49:50 +000016#include "DwarfCompileUnit.h"
Devang Patel0e821f42011-04-12 23:21:44 +000017#include "DwarfDebug.h"
Adrian Prantl00dbc2a2015-01-12 22:19:26 +000018#include "DwarfExpression.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000019#include "llvm/ADT/APFloat.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000020#include "llvm/IR/Constants.h"
Chandler Carruth12664a02014-03-06 00:22:06 +000021#include "llvm/IR/DIBuilder.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000022#include "llvm/IR/DataLayout.h"
23#include "llvm/IR/GlobalVariable.h"
24#include "llvm/IR/Instructions.h"
Rafael Espindola894843c2014-01-07 21:19:40 +000025#include "llvm/IR/Mangler.h"
Eric Christopher84588622013-12-28 01:39:17 +000026#include "llvm/MC/MCAsmInfo.h"
Adrian Prantlcbcd5782014-02-11 22:22:15 +000027#include "llvm/MC/MCContext.h"
David Blaikie6b288cf2013-10-30 20:42:41 +000028#include "llvm/MC/MCSection.h"
29#include "llvm/MC/MCStreamer.h"
Chandler Carruth8a8cd2b2014-01-07 11:48:04 +000030#include "llvm/Support/CommandLine.h"
Devang Patel0e821f42011-04-12 23:21:44 +000031#include "llvm/Target/TargetFrameLowering.h"
David Blaikief2694972013-06-28 20:05:11 +000032#include "llvm/Target/TargetLoweringObjectFile.h"
Chandler Carruth8a8cd2b2014-01-07 11:48:04 +000033#include "llvm/Target/TargetMachine.h"
Devang Patel0e821f42011-04-12 23:21:44 +000034#include "llvm/Target/TargetRegisterInfo.h"
Eric Christopherd9134482014-08-04 21:25:23 +000035#include "llvm/Target/TargetSubtargetInfo.h"
Devang Patel0e821f42011-04-12 23:21:44 +000036
37using namespace llvm;
38
Chandler Carruth1b9dde02014-04-22 02:02:50 +000039#define DEBUG_TYPE "dwarfdebug"
40
Eric Christopher4287a492013-12-09 23:57:44 +000041static cl::opt<bool>
42GenerateDwarfTypeUnits("generate-type-units", cl::Hidden,
43 cl::desc("Generate DWARF4 type units."),
44 cl::init(false));
David Blaikie409dd9c2013-11-19 23:08:21 +000045
Adrian Prantl00dbc2a2015-01-12 22:19:26 +000046void DIEDwarfExpression::EmitOp(uint8_t Op, const char* Comment) {
47 DU.addUInt(DIE, dwarf::DW_FORM_data1, Op);
48}
49void DIEDwarfExpression::EmitSigned(int Value) {
50 DU.addSInt(DIE, dwarf::DW_FORM_sdata, Value);
51}
52void DIEDwarfExpression::EmitUnsigned(unsigned Value) {
53 DU.addUInt(DIE, dwarf::DW_FORM_udata, Value);
54}
Adrian Prantl8995f5c2015-01-13 23:10:43 +000055bool DIEDwarfExpression::isFrameRegister(unsigned MachineReg) {
56 return MachineReg == getTRI()->getFrameRegister(*AP.MF);
Adrian Prantl00dbc2a2015-01-12 22:19:26 +000057}
58
59
David Blaikie2a80e442013-12-02 22:09:48 +000060/// Unit - Unit constructor.
David Blaikiebd579052014-04-28 21:14:27 +000061DwarfUnit::DwarfUnit(unsigned UID, dwarf::Tag UnitTag, DICompileUnit Node,
David Blaikie92a2f8a2014-04-28 21:04:29 +000062 AsmPrinter *A, DwarfDebug *DW, DwarfFile *DWU)
David Blaikiebd579052014-04-28 21:14:27 +000063 : UniqueID(UID), CUNode(Node), UnitDie(UnitTag), DebugInfoOffset(0), Asm(A),
David Blaikie7cbf58a2014-11-01 18:18:07 +000064 DD(DW), DU(DWU), IndexTyDie(nullptr), Section(nullptr) {
David Blaikiebd579052014-04-28 21:14:27 +000065 assert(UnitTag == dwarf::DW_TAG_compile_unit ||
66 UnitTag == dwarf::DW_TAG_type_unit);
David Blaikie319a05f2013-12-02 19:33:10 +000067 DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
68}
69
David Blaikiebd579052014-04-28 21:14:27 +000070DwarfTypeUnit::DwarfTypeUnit(unsigned UID, DwarfCompileUnit &CU, AsmPrinter *A,
David Blaikie92a2f8a2014-04-28 21:04:29 +000071 DwarfDebug *DW, DwarfFile *DWU,
David Blaikie8287aff2014-03-18 02:13:23 +000072 MCDwarfDwoLineTable *SplitLineTable)
David Blaikiebd579052014-04-28 21:14:27 +000073 : DwarfUnit(UID, dwarf::DW_TAG_type_unit, CU.getCUNode(), A, DW, DWU),
74 CU(CU), SplitLineTable(SplitLineTable) {
David Blaikie4a2f95f2014-03-18 01:17:26 +000075 if (SplitLineTable)
David Blaikiebd579052014-04-28 21:14:27 +000076 addSectionOffset(UnitDie, dwarf::DW_AT_stmt_list, 0);
David Blaikie4a2f95f2014-03-18 01:17:26 +000077}
David Blaikie409dd9c2013-11-19 23:08:21 +000078
David Blaikie319a05f2013-12-02 19:33:10 +000079/// ~Unit - Destructor for compile unit.
Eric Christophera5a79422013-12-09 23:32:48 +000080DwarfUnit::~DwarfUnit() {
Devang Patel0e821f42011-04-12 23:21:44 +000081 for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
82 DIEBlocks[j]->~DIEBlock();
Eric Christopher4a741042014-02-16 08:46:55 +000083 for (unsigned j = 0, M = DIELocs.size(); j < M; ++j)
84 DIELocs[j]->~DIELoc();
Devang Patel0e821f42011-04-12 23:21:44 +000085}
86
87/// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
88/// information entry.
David Blaikie8dbcc3f2014-04-25 19:33:43 +000089DIEEntry *DwarfUnit::createDIEEntry(DIE &Entry) {
Devang Patel0e821f42011-04-12 23:21:44 +000090 DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
91 return Value;
92}
93
Bill Wendling3495f9b2012-12-06 07:55:19 +000094/// getDefaultLowerBound - Return the default lower bound for an array. If the
Bill Wendling28fe9e72012-12-06 07:38:10 +000095/// DWARF version doesn't handle the language, return -1.
Eric Christophera5a79422013-12-09 23:32:48 +000096int64_t DwarfUnit::getDefaultLowerBound() const {
David Blaikiecb8e4352013-11-15 23:50:53 +000097 switch (getLanguage()) {
Bill Wendling28fe9e72012-12-06 07:38:10 +000098 default:
99 break;
100
101 case dwarf::DW_LANG_C89:
102 case dwarf::DW_LANG_C99:
103 case dwarf::DW_LANG_C:
104 case dwarf::DW_LANG_C_plus_plus:
105 case dwarf::DW_LANG_ObjC:
106 case dwarf::DW_LANG_ObjC_plus_plus:
107 return 0;
108
109 case dwarf::DW_LANG_Fortran77:
110 case dwarf::DW_LANG_Fortran90:
111 case dwarf::DW_LANG_Fortran95:
112 return 1;
113
114 // The languages below have valid values only if the DWARF version >= 4.
115 case dwarf::DW_LANG_Java:
116 case dwarf::DW_LANG_Python:
117 case dwarf::DW_LANG_UPC:
118 case dwarf::DW_LANG_D:
119 if (dwarf::DWARF_VERSION >= 4)
120 return 0;
121 break;
122
123 case dwarf::DW_LANG_Ada83:
124 case dwarf::DW_LANG_Ada95:
125 case dwarf::DW_LANG_Cobol74:
126 case dwarf::DW_LANG_Cobol85:
127 case dwarf::DW_LANG_Modula2:
128 case dwarf::DW_LANG_Pascal83:
129 case dwarf::DW_LANG_PLI:
130 if (dwarf::DWARF_VERSION >= 4)
131 return 1;
132 break;
133 }
134
135 return -1;
136}
137
Manman Ren4dbdc902013-10-31 17:54:35 +0000138/// Check whether the DIE for this MDNode can be shared across CUs.
David Blaikie4201ddf2013-11-15 22:59:36 +0000139static bool isShareableAcrossCUs(DIDescriptor D) {
David Blaikiebcb418e2013-11-20 18:40:16 +0000140 // When the MDNode can be part of the type system, the DIE can be shared
141 // across CUs.
142 // Combining type units and cross-CU DIE sharing is lower value (since
143 // cross-CU DIE sharing is used in LTO and removes type redundancy at that
144 // level already) but may be implementable for some value in projects
145 // building multiple independent libraries with LTO and then linking those
146 // together.
David Blaikie409dd9c2013-11-19 23:08:21 +0000147 return (D.isType() ||
148 (D.isSubprogram() && !DISubprogram(D).isDefinition())) &&
Eric Christopher4287a492013-12-09 23:57:44 +0000149 !GenerateDwarfTypeUnits;
Manman Ren4dbdc902013-10-31 17:54:35 +0000150}
151
152/// getDIE - Returns the debug information entry map slot for the
153/// specified debug variable. We delegate the request to DwarfDebug
154/// when the DIE for this MDNode can be shared across CUs. The mappings
155/// will be kept in DwarfDebug for shareable DIEs.
Eric Christophera5a79422013-12-09 23:32:48 +0000156DIE *DwarfUnit::getDIE(DIDescriptor D) const {
David Blaikie2ad00162013-11-15 23:09:13 +0000157 if (isShareableAcrossCUs(D))
David Blaikie9bfd7a92014-11-04 22:12:18 +0000158 return DU->getDIE(D);
David Blaikie2ad00162013-11-15 23:09:13 +0000159 return MDNodeToDieMap.lookup(D);
Manman Ren4dbdc902013-10-31 17:54:35 +0000160}
161
162/// insertDIE - Insert DIE into the map. We delegate the request to DwarfDebug
163/// when the DIE for this MDNode can be shared across CUs. The mappings
164/// will be kept in DwarfDebug for shareable DIEs.
Eric Christophera5a79422013-12-09 23:32:48 +0000165void DwarfUnit::insertDIE(DIDescriptor Desc, DIE *D) {
David Blaikie2ad00162013-11-15 23:09:13 +0000166 if (isShareableAcrossCUs(Desc)) {
David Blaikie9bfd7a92014-11-04 22:12:18 +0000167 DU->insertDIE(Desc, D);
Manman Ren4dbdc902013-10-31 17:54:35 +0000168 return;
169 }
David Blaikie2ad00162013-11-15 23:09:13 +0000170 MDNodeToDieMap.insert(std::make_pair(Desc, D));
Manman Ren4dbdc902013-10-31 17:54:35 +0000171}
172
Eric Christopherbb69a272012-08-24 01:14:27 +0000173/// addFlag - Add a flag that is true.
David Blaikie65a74662014-04-25 18:26:14 +0000174void DwarfUnit::addFlag(DIE &Die, dwarf::Attribute Attribute) {
Michael Gottesmanc89466f2013-09-04 04:39:38 +0000175 if (DD->getDwarfVersion() >= 4)
David Blaikie65a74662014-04-25 18:26:14 +0000176 Die.addValue(Attribute, dwarf::DW_FORM_flag_present, DIEIntegerOne);
Eric Christopherbb69a272012-08-24 01:14:27 +0000177 else
David Blaikie65a74662014-04-25 18:26:14 +0000178 Die.addValue(Attribute, dwarf::DW_FORM_flag, DIEIntegerOne);
Eric Christopherbb69a272012-08-24 01:14:27 +0000179}
180
Devang Patel0e821f42011-04-12 23:21:44 +0000181/// addUInt - Add an unsigned integer attribute data and value.
182///
David Blaikie65a74662014-04-25 18:26:14 +0000183void DwarfUnit::addUInt(DIE &Die, dwarf::Attribute Attribute,
Eric Christophera5a79422013-12-09 23:32:48 +0000184 Optional<dwarf::Form> Form, uint64_t Integer) {
Eric Christopherc2697f82013-10-19 01:04:47 +0000185 if (!Form)
186 Form = DIEInteger::BestForm(false, Integer);
187 DIEValue *Value = Integer == 1 ? DIEIntegerOne : new (DIEValueAllocator)
188 DIEInteger(Integer);
David Blaikie65a74662014-04-25 18:26:14 +0000189 Die.addValue(Attribute, *Form, Value);
David Blaikief2443192013-10-21 17:28:37 +0000190}
191
David Blaikie65a74662014-04-25 18:26:14 +0000192void DwarfUnit::addUInt(DIE &Block, dwarf::Form Form, uint64_t Integer) {
David Blaikief2443192013-10-21 17:28:37 +0000193 addUInt(Block, (dwarf::Attribute)0, Form, Integer);
Devang Patel0e821f42011-04-12 23:21:44 +0000194}
195
196/// addSInt - Add an signed integer attribute data and value.
197///
David Blaikie65a74662014-04-25 18:26:14 +0000198void DwarfUnit::addSInt(DIE &Die, dwarf::Attribute Attribute,
Eric Christophera5a79422013-12-09 23:32:48 +0000199 Optional<dwarf::Form> Form, int64_t Integer) {
Eric Christopherc2697f82013-10-19 01:04:47 +0000200 if (!Form)
201 Form = DIEInteger::BestForm(true, Integer);
Devang Patel0e821f42011-04-12 23:21:44 +0000202 DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
David Blaikie65a74662014-04-25 18:26:14 +0000203 Die.addValue(Attribute, *Form, Value);
David Blaikief2443192013-10-21 17:28:37 +0000204}
205
David Blaikie65a74662014-04-25 18:26:14 +0000206void DwarfUnit::addSInt(DIELoc &Die, Optional<dwarf::Form> Form,
Eric Christophera5a79422013-12-09 23:32:48 +0000207 int64_t Integer) {
David Blaikief2443192013-10-21 17:28:37 +0000208 addSInt(Die, (dwarf::Attribute)0, Form, Integer);
Devang Patel0e821f42011-04-12 23:21:44 +0000209}
210
Nick Lewyckycc64ae12011-10-28 05:29:47 +0000211/// addString - Add a string attribute data and value. We always emit a
212/// reference to the string pool instead of immediate strings so that DIEs have
Eric Christopherfba22602013-01-07 19:32:45 +0000213/// more predictable sizes. In the case of split dwarf we emit an index
214/// into another table which gets us the static offset into the string
215/// table.
David Blaikie65a74662014-04-25 18:26:14 +0000216void DwarfUnit::addString(DIE &Die, dwarf::Attribute Attribute,
Eric Christophera5a79422013-12-09 23:32:48 +0000217 StringRef String) {
David Blaikiecafd9622014-11-02 08:51:37 +0000218 if (!isDwoUnit())
Eric Christopher05893f42013-12-30 18:32:31 +0000219 return addLocalString(Die, Attribute, String);
220
David Blaikiecafd9622014-11-02 08:51:37 +0000221 addIndexedString(Die, Attribute, String);
222}
223
224void DwarfUnit::addIndexedString(DIE &Die, dwarf::Attribute Attribute,
225 StringRef String) {
David Blaikiedaefdbf2014-04-25 21:34:35 +0000226 unsigned idx = DU->getStringPool().getIndex(*Asm, String);
Eric Christopher05893f42013-12-30 18:32:31 +0000227 DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx);
Eric Christopher67646432013-07-26 17:02:41 +0000228 DIEValue *Str = new (DIEValueAllocator) DIEString(Value, String);
David Blaikie65a74662014-04-25 18:26:14 +0000229 Die.addValue(Attribute, dwarf::DW_FORM_GNU_str_index, Str);
Eric Christopher2cbd5762013-01-07 19:32:41 +0000230}
231
232/// addLocalString - Add a string attribute data and value. This is guaranteed
233/// to be in the local string pool instead of indirected.
David Blaikie65a74662014-04-25 18:26:14 +0000234void DwarfUnit::addLocalString(DIE &Die, dwarf::Attribute Attribute,
Eric Christophera5a79422013-12-09 23:32:48 +0000235 StringRef String) {
David Blaikiedaefdbf2014-04-25 21:34:35 +0000236 MCSymbol *Symb = DU->getStringPool().getSymbol(*Asm, String);
Nick Lewyckycc64ae12011-10-28 05:29:47 +0000237 DIEValue *Value;
Eric Christopher84588622013-12-28 01:39:17 +0000238 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000239 Value = new (DIEValueAllocator) DIELabel(Symb);
David Blaikie6741bb02014-09-11 21:12:48 +0000240 else
241 Value = new (DIEValueAllocator) DIEDelta(Symb, DD->getDebugStrSym());
Eric Christopher05893f42013-12-30 18:32:31 +0000242 DIEValue *Str = new (DIEValueAllocator) DIEString(Value, String);
David Blaikie65a74662014-04-25 18:26:14 +0000243 Die.addValue(Attribute, dwarf::DW_FORM_strp, Str);
Devang Patel0e821f42011-04-12 23:21:44 +0000244}
245
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000246/// addLabel - Add a Dwarf label attribute data and value.
247///
David Blaikie65a74662014-04-25 18:26:14 +0000248void DwarfUnit::addLabel(DIE &Die, dwarf::Attribute Attribute, dwarf::Form Form,
Eric Christophera5a79422013-12-09 23:32:48 +0000249 const MCSymbol *Label) {
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000250 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
David Blaikie65a74662014-04-25 18:26:14 +0000251 Die.addValue(Attribute, Form, Value);
David Blaikief3cd7c52013-06-28 20:05:04 +0000252}
253
David Blaikie65a74662014-04-25 18:26:14 +0000254void DwarfUnit::addLabel(DIELoc &Die, dwarf::Form Form, const MCSymbol *Label) {
David Blaikief2443192013-10-21 17:28:37 +0000255 addLabel(Die, (dwarf::Attribute)0, Form, Label);
256}
257
Eric Christopher33ff6972013-11-21 23:46:41 +0000258/// addSectionOffset - Add an offset into a section attribute data and value.
259///
David Blaikie65a74662014-04-25 18:26:14 +0000260void DwarfUnit::addSectionOffset(DIE &Die, dwarf::Attribute Attribute,
Eric Christophera5a79422013-12-09 23:32:48 +0000261 uint64_t Integer) {
Eric Christopher33ff6972013-11-21 23:46:41 +0000262 if (DD->getDwarfVersion() >= 4)
263 addUInt(Die, Attribute, dwarf::DW_FORM_sec_offset, Integer);
264 else
265 addUInt(Die, Attribute, dwarf::DW_FORM_data4, Integer);
266}
267
David Blaikie4a2f95f2014-03-18 01:17:26 +0000268unsigned DwarfTypeUnit::getOrCreateSourceID(StringRef FileName, StringRef DirName) {
269 return SplitLineTable ? SplitLineTable->getFile(DirName, FileName)
270 : getCU().getOrCreateSourceID(FileName, DirName);
271}
272
Eric Christophere9ec2452013-01-18 22:11:33 +0000273/// addOpAddress - Add a dwarf op address data and value using the
274/// form given and an op of either DW_FORM_addr or DW_FORM_GNU_addr_index.
275///
David Blaikie65a74662014-04-25 18:26:14 +0000276void DwarfUnit::addOpAddress(DIELoc &Die, const MCSymbol *Sym) {
Eric Christophere9ec2452013-01-18 22:11:33 +0000277 if (!DD->useSplitDwarf()) {
David Blaikief2443192013-10-21 17:28:37 +0000278 addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
279 addLabel(Die, dwarf::DW_FORM_udata, Sym);
Eric Christophere9ec2452013-01-18 22:11:33 +0000280 } else {
David Blaikief2443192013-10-21 17:28:37 +0000281 addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_addr_index);
David Blaikiee226b082014-04-23 21:04:59 +0000282 addUInt(Die, dwarf::DW_FORM_GNU_addr_index,
David Blaikied75fb282014-04-23 21:20:10 +0000283 DD->getAddressPool().getIndex(Sym));
Eric Christophere9ec2452013-01-18 22:11:33 +0000284 }
285}
286
David Blaikie65a74662014-04-25 18:26:14 +0000287void DwarfUnit::addLabelDelta(DIE &Die, dwarf::Attribute Attribute,
David Blaikie48b1bdc2014-03-07 01:30:55 +0000288 const MCSymbol *Hi, const MCSymbol *Lo) {
289 DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
David Blaikie65a74662014-04-25 18:26:14 +0000290 Die.addValue(Attribute, dwarf::DW_FORM_data4, Value);
David Blaikie48b1bdc2014-03-07 01:30:55 +0000291}
292
Devang Patel0e821f42011-04-12 23:21:44 +0000293/// addDIEEntry - Add a DIE attribute data and value.
294///
David Blaikie8dbcc3f2014-04-25 19:33:43 +0000295void DwarfUnit::addDIEEntry(DIE &Die, dwarf::Attribute Attribute, DIE &Entry) {
Manman Ren4dbdc902013-10-31 17:54:35 +0000296 addDIEEntry(Die, Attribute, createDIEEntry(Entry));
297}
298
David Blaikie65a74662014-04-25 18:26:14 +0000299void DwarfUnit::addDIETypeSignature(DIE &Die, const DwarfTypeUnit &Type) {
David Blaikief3de2ab2014-04-26 16:26:41 +0000300 // Flag the type unit reference as a declaration so that if it contains
301 // members (implicit special members, static data member definitions, member
302 // declarations for definitions in this CU, etc) consumers don't get confused
303 // and think this is a full definition.
304 addFlag(Die, dwarf::DW_AT_declaration);
305
David Blaikie65a74662014-04-25 18:26:14 +0000306 Die.addValue(dwarf::DW_AT_signature, dwarf::DW_FORM_ref_sig8,
307 new (DIEValueAllocator) DIETypeSignature(Type));
David Blaikie47f615e2013-12-17 23:32:35 +0000308}
309
David Blaikie65a74662014-04-25 18:26:14 +0000310void DwarfUnit::addDIEEntry(DIE &Die, dwarf::Attribute Attribute,
Eric Christophera5a79422013-12-09 23:32:48 +0000311 DIEEntry *Entry) {
David Blaikie65a74662014-04-25 18:26:14 +0000312 const DIE *DieCU = Die.getUnitOrNull();
David Blaikie8dbcc3f2014-04-25 19:33:43 +0000313 const DIE *EntryCU = Entry->getEntry().getUnitOrNull();
Manman Ren4dbdc902013-10-31 17:54:35 +0000314 if (!DieCU)
315 // We assume that Die belongs to this CU, if it is not linked to any CU yet.
David Blaikieadcde362014-04-25 18:35:57 +0000316 DieCU = &getUnitDie();
Manman Ren4dbdc902013-10-31 17:54:35 +0000317 if (!EntryCU)
David Blaikieadcde362014-04-25 18:35:57 +0000318 EntryCU = &getUnitDie();
David Blaikie65a74662014-04-25 18:26:14 +0000319 Die.addValue(Attribute,
320 EntryCU == DieCU ? dwarf::DW_FORM_ref4 : dwarf::DW_FORM_ref_addr,
321 Entry);
Devang Patel0e821f42011-04-12 23:21:44 +0000322}
323
Manman Renb987e512013-10-29 00:53:03 +0000324/// Create a DIE with the given Tag, add the DIE to its parent, and
325/// call insertDIE if MD is not null.
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000326DIE &DwarfUnit::createAndAddDIE(unsigned Tag, DIE &Parent, DIDescriptor N) {
David Blaikieefc403b2014-04-12 02:24:04 +0000327 assert(Tag != dwarf::DW_TAG_auto_variable &&
328 Tag != dwarf::DW_TAG_arg_variable);
David Blaikie914046e2014-04-25 20:00:34 +0000329 Parent.addChild(make_unique<DIE>((dwarf::Tag)Tag));
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000330 DIE &Die = *Parent.getChildren().back();
David Blaikie52c50202013-11-16 00:29:01 +0000331 if (N)
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000332 insertDIE(N, &Die);
Manman Renb987e512013-10-29 00:53:03 +0000333 return Die;
334}
335
Devang Patel0e821f42011-04-12 23:21:44 +0000336/// addBlock - Add block data.
337///
David Blaikie65a74662014-04-25 18:26:14 +0000338void DwarfUnit::addBlock(DIE &Die, dwarf::Attribute Attribute, DIELoc *Loc) {
Eric Christopher8bdab432014-02-27 18:36:10 +0000339 Loc->ComputeSize(Asm);
Eric Christopher4a741042014-02-16 08:46:55 +0000340 DIELocs.push_back(Loc); // Memoize so we can call the destructor later on.
David Blaikie65a74662014-04-25 18:26:14 +0000341 Die.addValue(Attribute, Loc->BestForm(DD->getDwarfVersion()), Loc);
Eric Christopher4a741042014-02-16 08:46:55 +0000342}
343
David Blaikie65a74662014-04-25 18:26:14 +0000344void DwarfUnit::addBlock(DIE &Die, dwarf::Attribute Attribute,
Eric Christophera5a79422013-12-09 23:32:48 +0000345 DIEBlock *Block) {
Eric Christopher8bdab432014-02-27 18:36:10 +0000346 Block->ComputeSize(Asm);
Devang Patel0e821f42011-04-12 23:21:44 +0000347 DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
David Blaikie65a74662014-04-25 18:26:14 +0000348 Die.addValue(Attribute, Block->BestForm(), Block);
Devang Patel0e821f42011-04-12 23:21:44 +0000349}
350
351/// addSourceLine - Add location information to specified debug information
352/// entry.
David Blaikie65a74662014-04-25 18:26:14 +0000353void DwarfUnit::addSourceLine(DIE &Die, unsigned Line, StringRef File,
David Blaikie101613e2014-02-12 00:11:25 +0000354 StringRef Directory) {
Devang Patel0e821f42011-04-12 23:21:44 +0000355 if (Line == 0)
356 return;
David Blaikie101613e2014-02-12 00:11:25 +0000357
David Blaikie4a2f95f2014-03-18 01:17:26 +0000358 unsigned FileID = getOrCreateSourceID(File, Directory);
Devang Patel0e821f42011-04-12 23:21:44 +0000359 assert(FileID && "Invalid file id");
David Blaikief2443192013-10-21 17:28:37 +0000360 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
361 addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
Devang Patel0e821f42011-04-12 23:21:44 +0000362}
363
364/// addSourceLine - Add location information to specified debug information
365/// entry.
David Blaikie65a74662014-04-25 18:26:14 +0000366void DwarfUnit::addSourceLine(DIE &Die, DIVariable V) {
David Blaikie101613e2014-02-12 00:11:25 +0000367 assert(V.isVariable());
368
Eric Christopher89a575c2014-02-12 22:38:04 +0000369 addSourceLine(Die, V.getLineNumber(), V.getContext().getFilename(),
370 V.getContext().getDirectory());
David Blaikie101613e2014-02-12 00:11:25 +0000371}
372
373/// addSourceLine - Add location information to specified debug information
374/// entry.
David Blaikie65a74662014-04-25 18:26:14 +0000375void DwarfUnit::addSourceLine(DIE &Die, DIGlobalVariable G) {
David Blaikie52019302014-02-11 23:57:03 +0000376 assert(G.isGlobalVariable());
Devang Patel0e821f42011-04-12 23:21:44 +0000377
David Blaikie101613e2014-02-12 00:11:25 +0000378 addSourceLine(Die, G.getLineNumber(), G.getFilename(), G.getDirectory());
Devang Patel0e821f42011-04-12 23:21:44 +0000379}
380
381/// addSourceLine - Add location information to specified debug information
382/// entry.
David Blaikie65a74662014-04-25 18:26:14 +0000383void DwarfUnit::addSourceLine(DIE &Die, DISubprogram SP) {
David Blaikie52019302014-02-11 23:57:03 +0000384 assert(SP.isSubprogram());
Eric Christopher7734ca22012-03-15 23:55:40 +0000385
David Blaikie101613e2014-02-12 00:11:25 +0000386 addSourceLine(Die, SP.getLineNumber(), SP.getFilename(), SP.getDirectory());
Devang Patel0e821f42011-04-12 23:21:44 +0000387}
388
389/// addSourceLine - Add location information to specified debug information
390/// entry.
David Blaikie65a74662014-04-25 18:26:14 +0000391void DwarfUnit::addSourceLine(DIE &Die, DIType Ty) {
David Blaikie52019302014-02-11 23:57:03 +0000392 assert(Ty.isType());
Devang Patel0e821f42011-04-12 23:21:44 +0000393
David Blaikie101613e2014-02-12 00:11:25 +0000394 addSourceLine(Die, Ty.getLineNumber(), Ty.getFilename(), Ty.getDirectory());
Devang Patel0e821f42011-04-12 23:21:44 +0000395}
396
397/// addSourceLine - Add location information to specified debug information
398/// entry.
David Blaikie65a74662014-04-25 18:26:14 +0000399void DwarfUnit::addSourceLine(DIE &Die, DIObjCProperty Ty) {
David Blaikie52019302014-02-11 23:57:03 +0000400 assert(Ty.isObjCProperty());
Eric Christopher70e1bd82012-03-29 08:42:56 +0000401
Eric Christopher70e1bd82012-03-29 08:42:56 +0000402 DIFile File = Ty.getFile();
David Blaikie101613e2014-02-12 00:11:25 +0000403 addSourceLine(Die, Ty.getLineNumber(), File.getFilename(),
404 File.getDirectory());
Eric Christopher70e1bd82012-03-29 08:42:56 +0000405}
406
407/// addSourceLine - Add location information to specified debug information
408/// entry.
David Blaikie65a74662014-04-25 18:26:14 +0000409void DwarfUnit::addSourceLine(DIE &Die, DINameSpace NS) {
David Blaikie52019302014-02-11 23:57:03 +0000410 assert(NS.Verify());
Devang Patel0e821f42011-04-12 23:21:44 +0000411
David Blaikie101613e2014-02-12 00:11:25 +0000412 addSourceLine(Die, NS.getLineNumber(), NS.getFilename(), NS.getDirectory());
Devang Patel0e821f42011-04-12 23:21:44 +0000413}
414
Devang Patelba5fbf12011-04-26 19:06:18 +0000415/// addRegisterOp - Add register operand.
Adrian Prantlab255fc2014-12-05 01:02:46 +0000416bool DwarfUnit::addRegisterOpPiece(DIELoc &TheDie, unsigned Reg,
Adrian Prantlb1416832014-08-01 22:11:58 +0000417 unsigned SizeInBits, unsigned OffsetInBits) {
Adrian Prantla4c30d62015-01-12 23:36:56 +0000418 DIEDwarfExpression Expr(*Asm, *this, TheDie);
Adrian Prantl0e6ffb92015-01-12 22:37:16 +0000419 Expr.AddMachineRegPiece(Reg, SizeInBits, OffsetInBits);
Adrian Prantlab255fc2014-12-05 01:02:46 +0000420 return true;
Devang Patelba5fbf12011-04-26 19:06:18 +0000421}
422
423/// addRegisterOffset - Add register offset.
Adrian Prantlab255fc2014-12-05 01:02:46 +0000424bool DwarfUnit::addRegisterOffset(DIELoc &TheDie, unsigned Reg,
Eric Christophera5a79422013-12-09 23:32:48 +0000425 int64_t Offset) {
Adrian Prantla4c30d62015-01-12 23:36:56 +0000426 DIEDwarfExpression Expr(*Asm, *this, TheDie);
Adrian Prantl00dbc2a2015-01-12 22:19:26 +0000427 return Expr.AddMachineRegIndirect(Reg, Offset);
Devang Patelba5fbf12011-04-26 19:06:18 +0000428}
429
Devang Patel0e821f42011-04-12 23:21:44 +0000430/* Byref variables, in Blocks, are declared by the programmer as "SomeType
431 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
432 gives the variable VarName either the struct, or a pointer to the struct, as
433 its type. This is necessary for various behind-the-scenes things the
434 compiler needs to do with by-reference variables in Blocks.
435
436 However, as far as the original *programmer* is concerned, the variable
437 should still have type 'SomeType', as originally declared.
438
439 The function getBlockByrefType dives into the __Block_byref_x_VarName
440 struct to find the original type of the variable, which is then assigned to
441 the variable's Debug Information Entry as its real type. So far, so good.
442 However now the debugger will expect the variable VarName to have the type
443 SomeType. So we need the location attribute for the variable to be an
444 expression that explains to the debugger how to navigate through the
445 pointers and struct to find the actual variable of type SomeType.
446
447 The following function does just that. We start by getting
448 the "normal" location for the variable. This will be the location
449 of either the struct __Block_byref_x_VarName or the pointer to the
450 struct __Block_byref_x_VarName.
451
452 The struct will look something like:
453
454 struct __Block_byref_x_VarName {
455 ... <various fields>
456 struct __Block_byref_x_VarName *forwarding;
457 ... <various other fields>
458 SomeType VarName;
459 ... <maybe more fields>
460 };
461
462 If we are given the struct directly (as our starting point) we
463 need to tell the debugger to:
464
465 1). Add the offset of the forwarding field.
466
467 2). Follow that pointer to get the real __Block_byref_x_VarName
468 struct to use (the real one may have been copied onto the heap).
469
470 3). Add the offset for the field VarName, to find the actual variable.
471
472 If we started with a pointer to the struct, then we need to
473 dereference that pointer first, before the other steps.
474 Translating this into DWARF ops, we will need to append the following
475 to the current location description for the variable:
476
477 DW_OP_deref -- optional, if we start with a pointer
478 DW_OP_plus_uconst <forward_fld_offset>
479 DW_OP_deref
480 DW_OP_plus_uconst <varName_fld_offset>
481
482 That is what this function does. */
483
484/// addBlockByrefAddress - Start with the address based on the location
485/// provided, and generate the DWARF information necessary to find the
486/// actual Block variable (navigating the Block struct) based on the
487/// starting location. Add the DWARF information to the die. For
488/// more information, read large comment just above here.
489///
David Blaikie65a74662014-04-25 18:26:14 +0000490void DwarfUnit::addBlockByrefAddress(const DbgVariable &DV, DIE &Die,
Eric Christophera5a79422013-12-09 23:32:48 +0000491 dwarf::Attribute Attribute,
492 const MachineLocation &Location) {
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000493 DIType Ty = DV.getType();
Devang Patel0e821f42011-04-12 23:21:44 +0000494 DIType TmpTy = Ty;
Eric Christopher31b05762013-08-08 01:41:00 +0000495 uint16_t Tag = Ty.getTag();
Devang Patel0e821f42011-04-12 23:21:44 +0000496 bool isPointer = false;
497
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000498 StringRef varName = DV.getName();
Devang Patel0e821f42011-04-12 23:21:44 +0000499
500 if (Tag == dwarf::DW_TAG_pointer_type) {
David Blaikie4f6bf27a2013-11-18 23:33:32 +0000501 DIDerivedType DTy(Ty);
Manman Ren93b30902013-10-08 18:42:58 +0000502 TmpTy = resolve(DTy.getTypeDerivedFrom());
Devang Patel0e821f42011-04-12 23:21:44 +0000503 isPointer = true;
504 }
505
David Blaikie4f6bf27a2013-11-18 23:33:32 +0000506 DICompositeType blockStruct(TmpTy);
Devang Patel0e821f42011-04-12 23:21:44 +0000507
508 // Find the __forwarding field and the variable field in the __Block_byref
509 // struct.
Manman Renab8ffba2014-07-28 19:14:13 +0000510 DIArray Fields = blockStruct.getElements();
David Blaikie4f6bf27a2013-11-18 23:33:32 +0000511 DIDerivedType varField;
512 DIDerivedType forwardingField;
Devang Patel0e821f42011-04-12 23:21:44 +0000513
514 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
David Blaikie4f6bf27a2013-11-18 23:33:32 +0000515 DIDerivedType DT(Fields.getElement(i));
Devang Patel0e821f42011-04-12 23:21:44 +0000516 StringRef fieldName = DT.getName();
517 if (fieldName == "__forwarding")
David Blaikie4f6bf27a2013-11-18 23:33:32 +0000518 forwardingField = DT;
Devang Patel0e821f42011-04-12 23:21:44 +0000519 else if (fieldName == varName)
David Blaikie4f6bf27a2013-11-18 23:33:32 +0000520 varField = DT;
Devang Patel0e821f42011-04-12 23:21:44 +0000521 }
522
523 // Get the offsets for the forwarding field and the variable field.
David Blaikie4f6bf27a2013-11-18 23:33:32 +0000524 unsigned forwardingFieldOffset = forwardingField.getOffsetInBits() >> 3;
525 unsigned varFieldOffset = varField.getOffsetInBits() >> 2;
Devang Patel0e821f42011-04-12 23:21:44 +0000526
527 // Decode the original location, and use that as the start of the byref
528 // variable's location.
Eric Christopher4a741042014-02-16 08:46:55 +0000529 DIELoc *Loc = new (DIEValueAllocator) DIELoc();
Devang Patel0e821f42011-04-12 23:21:44 +0000530
Adrian Prantlab255fc2014-12-05 01:02:46 +0000531 bool validReg;
Eric Christopheref9d7102012-07-04 02:02:18 +0000532 if (Location.isReg())
Adrian Prantlab255fc2014-12-05 01:02:46 +0000533 validReg = addRegisterOpPiece(*Loc, Location.getReg());
Eric Christopheref9d7102012-07-04 02:02:18 +0000534 else
Adrian Prantlab255fc2014-12-05 01:02:46 +0000535 validReg = addRegisterOffset(*Loc, Location.getReg(), Location.getOffset());
536
537 if (!validReg)
538 return;
Devang Patel0e821f42011-04-12 23:21:44 +0000539
540 // If we started with a pointer to the __Block_byref... struct, then
541 // the first thing we need to do is dereference the pointer (DW_OP_deref).
542 if (isPointer)
David Blaikie65a74662014-04-25 18:26:14 +0000543 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Devang Patel0e821f42011-04-12 23:21:44 +0000544
545 // Next add the offset for the '__forwarding' field:
546 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
547 // adding the offset if it's 0.
548 if (forwardingFieldOffset > 0) {
David Blaikie65a74662014-04-25 18:26:14 +0000549 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
550 addUInt(*Loc, dwarf::DW_FORM_udata, forwardingFieldOffset);
Devang Patel0e821f42011-04-12 23:21:44 +0000551 }
552
553 // Now dereference the __forwarding field to get to the real __Block_byref
554 // struct: DW_OP_deref.
David Blaikie65a74662014-04-25 18:26:14 +0000555 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Devang Patel0e821f42011-04-12 23:21:44 +0000556
557 // Now that we've got the real __Block_byref... struct, add the offset
558 // for the variable's field to get to the location of the actual variable:
559 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
560 if (varFieldOffset > 0) {
David Blaikie65a74662014-04-25 18:26:14 +0000561 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
562 addUInt(*Loc, dwarf::DW_FORM_udata, varFieldOffset);
Devang Patel0e821f42011-04-12 23:21:44 +0000563 }
564
565 // Now attach the location information to the DIE.
Eric Christopher4a741042014-02-16 08:46:55 +0000566 addBlock(Die, Attribute, Loc);
Devang Patel0e821f42011-04-12 23:21:44 +0000567}
568
Manman Renb3388602013-10-05 01:43:03 +0000569/// Return true if type encoding is unsigned.
570static bool isUnsignedDIType(DwarfDebug *DD, DIType Ty) {
571 DIDerivedType DTy(Ty);
David Blaikiee0f14742014-05-11 17:04:05 +0000572 if (DTy.isDerivedType()) {
David Blaikie2af1c802014-05-20 18:21:51 +0000573 dwarf::Tag T = (dwarf::Tag)Ty.getTag();
574 // Encode pointer constants as unsigned bytes. This is used at least for
David Blaikie93ef46b2014-05-20 21:40:13 +0000575 // null pointer constant emission.
Adrian Prantld88af272015-01-07 21:35:13 +0000576 // (Pieces of) aggregate types that get hacked apart by SROA may also be
577 // represented by a constant. Encode them as unsigned bytes.
David Blaikie93ef46b2014-05-20 21:40:13 +0000578 // FIXME: reference and rvalue_reference /probably/ shouldn't be allowed
579 // here, but accept them for now due to a bug in SROA producing bogus
580 // dbg.values.
Adrian Prantl3dd48c62015-01-07 20:48:58 +0000581 if (T == dwarf::DW_TAG_array_type ||
582 T == dwarf::DW_TAG_class_type ||
583 T == dwarf::DW_TAG_pointer_type ||
David Blaikie93ef46b2014-05-20 21:40:13 +0000584 T == dwarf::DW_TAG_ptr_to_member_type ||
585 T == dwarf::DW_TAG_reference_type ||
Adrian Prantl3dd48c62015-01-07 20:48:58 +0000586 T == dwarf::DW_TAG_rvalue_reference_type ||
Adrian Prantl577feba2015-01-23 18:01:39 +0000587 T == dwarf::DW_TAG_structure_type ||
588 T == dwarf::DW_TAG_union_type)
David Blaikie2af1c802014-05-20 18:21:51 +0000589 return true;
590 assert(T == dwarf::DW_TAG_typedef || T == dwarf::DW_TAG_const_type ||
591 T == dwarf::DW_TAG_volatile_type ||
David Blaikie1d9aec62014-05-20 18:36:35 +0000592 T == dwarf::DW_TAG_restrict_type ||
593 T == dwarf::DW_TAG_enumeration_type);
David Blaikie2af1c802014-05-20 18:21:51 +0000594 if (DITypeRef Deriv = DTy.getTypeDerivedFrom())
595 return isUnsignedDIType(DD, DD->resolve(Deriv));
David Blaikiee0f14742014-05-11 17:04:05 +0000596 // FIXME: Enums without a fixed underlying type have unknown signedness
597 // here, leading to incorrectly emitted constants.
598 assert(DTy.getTag() == dwarf::DW_TAG_enumeration_type);
599 return false;
600 }
Manman Renb3388602013-10-05 01:43:03 +0000601
602 DIBasicType BTy(Ty);
David Blaikiee0f14742014-05-11 17:04:05 +0000603 assert(BTy.isBasicType());
David Blaikie60cae1b2014-05-11 16:08:41 +0000604 unsigned Encoding = BTy.getEncoding();
Saleem Abdulrasoolfba09d42014-05-12 06:08:18 +0000605 assert((Encoding == dwarf::DW_ATE_unsigned ||
606 Encoding == dwarf::DW_ATE_unsigned_char ||
607 Encoding == dwarf::DW_ATE_signed ||
608 Encoding == dwarf::DW_ATE_signed_char ||
David Blaikie8b979f02014-12-17 00:43:22 +0000609 Encoding == dwarf::DW_ATE_UTF || Encoding == dwarf::DW_ATE_boolean ||
610 (Ty.getTag() == dwarf::DW_TAG_unspecified_type &&
611 Ty.getName() == "decltype(nullptr)")) &&
David Blaikiec405c9c2014-05-16 21:53:09 +0000612 "Unsupported encoding");
David Blaikie60cae1b2014-05-11 16:08:41 +0000613 return (Encoding == dwarf::DW_ATE_unsigned ||
614 Encoding == dwarf::DW_ATE_unsigned_char ||
David Blaikie8b979f02014-12-17 00:43:22 +0000615 Encoding == dwarf::DW_ATE_UTF || Encoding == dwarf::DW_ATE_boolean ||
616 Ty.getTag() == dwarf::DW_TAG_unspecified_type);
Manman Renb3388602013-10-05 01:43:03 +0000617}
618
619/// If this type is derived from a base type then return base type size.
Manman Renbda410f2013-10-08 18:46:58 +0000620static uint64_t getBaseTypeSize(DwarfDebug *DD, DIDerivedType Ty) {
Manman Renb3388602013-10-05 01:43:03 +0000621 unsigned Tag = Ty.getTag();
622
623 if (Tag != dwarf::DW_TAG_member && Tag != dwarf::DW_TAG_typedef &&
624 Tag != dwarf::DW_TAG_const_type && Tag != dwarf::DW_TAG_volatile_type &&
625 Tag != dwarf::DW_TAG_restrict_type)
626 return Ty.getSizeInBits();
627
628 DIType BaseType = DD->resolve(Ty.getTypeDerivedFrom());
629
Eric Christopher8cc04fc2014-03-12 18:18:05 +0000630 // If this type is not derived from any type or the type is a declaration then
631 // take conservative approach.
632 if (!BaseType.isValid() || BaseType.isForwardDecl())
Manman Renb3388602013-10-05 01:43:03 +0000633 return Ty.getSizeInBits();
634
635 // If this is a derived type, go ahead and get the base type, unless it's a
636 // reference then it's just the size of the field. Pointer types have no need
637 // of this since they're a different type of qualification on the type.
638 if (BaseType.getTag() == dwarf::DW_TAG_reference_type ||
639 BaseType.getTag() == dwarf::DW_TAG_rvalue_reference_type)
640 return Ty.getSizeInBits();
641
642 if (BaseType.isDerivedType())
Manman Renbda410f2013-10-08 18:46:58 +0000643 return getBaseTypeSize(DD, DIDerivedType(BaseType));
Manman Renb3388602013-10-05 01:43:03 +0000644
645 return BaseType.getSizeInBits();
646}
647
Devang Patel0e821f42011-04-12 23:21:44 +0000648/// addConstantFPValue - Add constant value entry in variable DIE.
David Blaikie65a74662014-04-25 18:26:14 +0000649void DwarfUnit::addConstantFPValue(DIE &Die, const MachineOperand &MO) {
Eric Christopherc2697f82013-10-19 01:04:47 +0000650 assert(MO.isFPImm() && "Invalid machine operand!");
Devang Patel0e821f42011-04-12 23:21:44 +0000651 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
652 APFloat FPImm = MO.getFPImm()->getValueAPF();
653
654 // Get the raw data form of the floating point.
655 const APInt FltVal = FPImm.bitcastToAPInt();
Eric Christopherc2697f82013-10-19 01:04:47 +0000656 const char *FltPtr = (const char *)FltVal.getRawData();
Devang Patel0e821f42011-04-12 23:21:44 +0000657
658 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
Micah Villmowcdfe20b2012-10-08 16:38:25 +0000659 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel0e821f42011-04-12 23:21:44 +0000660 int Incr = (LittleEndian ? 1 : -1);
661 int Start = (LittleEndian ? 0 : NumBytes - 1);
662 int Stop = (LittleEndian ? NumBytes : -1);
663
664 // Output the constant to DWARF one byte at a time.
665 for (; Start != Stop; Start += Incr)
David Blaikie65a74662014-04-25 18:26:14 +0000666 addUInt(*Block, dwarf::DW_FORM_data1, (unsigned char)0xFF & FltPtr[Start]);
Devang Patel0e821f42011-04-12 23:21:44 +0000667
David Blaikief2443192013-10-21 17:28:37 +0000668 addBlock(Die, dwarf::DW_AT_const_value, Block);
Devang Patel0e821f42011-04-12 23:21:44 +0000669}
670
David Blaikiea39a76e2013-01-20 01:18:01 +0000671/// addConstantFPValue - Add constant value entry in variable DIE.
David Blaikie65a74662014-04-25 18:26:14 +0000672void DwarfUnit::addConstantFPValue(DIE &Die, const ConstantFP *CFP) {
Eric Christopher9d1daa82013-08-27 23:49:04 +0000673 // Pass this down to addConstantValue as an unsigned bag of bits.
674 addConstantValue(Die, CFP->getValueAPF().bitcastToAPInt(), true);
David Blaikiea39a76e2013-01-20 01:18:01 +0000675}
676
Devang Patel0e821f42011-04-12 23:21:44 +0000677/// addConstantValue - Add constant value entry in variable DIE.
David Blaikiec0a28412014-05-11 15:56:59 +0000678void DwarfUnit::addConstantValue(DIE &Die, const ConstantInt *CI, DIType Ty) {
679 addConstantValue(Die, CI->getValue(), Ty);
David Blaikiea39a76e2013-01-20 01:18:01 +0000680}
681
David Blaikiec05c8f42014-05-11 15:47:39 +0000682/// addConstantValue - Add constant value entry in variable DIE.
683void DwarfUnit::addConstantValue(DIE &Die, const MachineOperand &MO,
684 DIType Ty) {
685 assert(MO.isImm() && "Invalid machine operand!");
686
David Blaikie60cae1b2014-05-11 16:08:41 +0000687 addConstantValue(Die, isUnsignedDIType(DD, Ty), MO.getImm());
David Blaikiec05c8f42014-05-11 15:47:39 +0000688}
689
David Blaikie60cae1b2014-05-11 16:08:41 +0000690void DwarfUnit::addConstantValue(DIE &Die, bool Unsigned, uint64_t Val) {
David Blaikiec05c8f42014-05-11 15:47:39 +0000691 // FIXME: This is a bit conservative/simple - it emits negative values always
692 // sign extended to 64 bits rather than minimizing the number of bytes.
693 addUInt(Die, dwarf::DW_AT_const_value,
David Blaikie60cae1b2014-05-11 16:08:41 +0000694 Unsigned ? dwarf::DW_FORM_udata : dwarf::DW_FORM_sdata, Val);
David Blaikiec05c8f42014-05-11 15:47:39 +0000695}
696
David Blaikiec0a28412014-05-11 15:56:59 +0000697void DwarfUnit::addConstantValue(DIE &Die, const APInt &Val, DIType Ty) {
698 addConstantValue(Die, Val, isUnsignedDIType(DD, Ty));
699}
700
David Blaikiea39a76e2013-01-20 01:18:01 +0000701// addConstantValue - Add constant value entry in variable DIE.
David Blaikie65a74662014-04-25 18:26:14 +0000702void DwarfUnit::addConstantValue(DIE &Die, const APInt &Val, bool Unsigned) {
David Blaikiea39a76e2013-01-20 01:18:01 +0000703 unsigned CIBitWidth = Val.getBitWidth();
Devang Patel8816bbc2011-05-28 00:39:18 +0000704 if (CIBitWidth <= 64) {
David Blaikie60cae1b2014-05-11 16:08:41 +0000705 addConstantValue(Die, Unsigned,
706 Unsigned ? Val.getZExtValue() : Val.getSExtValue());
Eric Christopher78fcf4902013-07-03 01:08:30 +0000707 return;
Devang Patel0e821f42011-04-12 23:21:44 +0000708 }
709
710 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
711
712 // Get the raw data form of the large APInt.
NAKAMURA Takumi29ccdd82011-10-28 14:12:22 +0000713 const uint64_t *Ptr64 = Val.getRawData();
Devang Patel0e821f42011-04-12 23:21:44 +0000714
715 int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
Micah Villmowcdfe20b2012-10-08 16:38:25 +0000716 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel0e821f42011-04-12 23:21:44 +0000717
718 // Output the constant to DWARF one byte at a time.
NAKAMURA Takumi29ccdd82011-10-28 14:12:22 +0000719 for (int i = 0; i < NumBytes; i++) {
720 uint8_t c;
721 if (LittleEndian)
722 c = Ptr64[i / 8] >> (8 * (i & 7));
723 else
724 c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7));
David Blaikie65a74662014-04-25 18:26:14 +0000725 addUInt(*Block, dwarf::DW_FORM_data1, c);
NAKAMURA Takumi29ccdd82011-10-28 14:12:22 +0000726 }
Devang Patel0e821f42011-04-12 23:21:44 +0000727
David Blaikief2443192013-10-21 17:28:37 +0000728 addBlock(Die, dwarf::DW_AT_const_value, Block);
Devang Patel0e821f42011-04-12 23:21:44 +0000729}
730
Eric Christopher25e35092013-04-22 07:47:40 +0000731/// addTemplateParams - Add template parameters into buffer.
Eric Christophera5a79422013-12-09 23:32:48 +0000732void DwarfUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
Devang Patel0e821f42011-04-12 23:21:44 +0000733 // Add template parameters.
734 for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) {
735 DIDescriptor Element = TParams.getElement(i);
736 if (Element.isTemplateTypeParameter())
Manman Renffc9a712013-10-23 23:05:28 +0000737 constructTemplateTypeParameterDIE(Buffer,
738 DITemplateTypeParameter(Element));
Devang Patel0e821f42011-04-12 23:21:44 +0000739 else if (Element.isTemplateValueParameter())
Manman Renffc9a712013-10-23 23:05:28 +0000740 constructTemplateValueParameterDIE(Buffer,
741 DITemplateValueParameter(Element));
Devang Patel0e821f42011-04-12 23:21:44 +0000742 }
Devang Patel0e821f42011-04-12 23:21:44 +0000743}
Nick Lewycky654f5ce2011-10-26 22:55:33 +0000744
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000745/// getOrCreateContextDIE - Get context owner's DIE.
Eric Christophera5a79422013-12-09 23:32:48 +0000746DIE *DwarfUnit::getOrCreateContextDIE(DIScope Context) {
David Blaikiebd700e42013-11-14 21:24:34 +0000747 if (!Context || Context.isFile())
David Blaikieadcde362014-04-25 18:35:57 +0000748 return &getUnitDie();
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000749 if (Context.isType())
750 return getOrCreateTypeDIE(DIType(Context));
David Blaikie1dbca702013-11-14 19:37:56 +0000751 if (Context.isNameSpace())
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000752 return getOrCreateNameSpace(DINameSpace(Context));
David Blaikie1dbca702013-11-14 19:37:56 +0000753 if (Context.isSubprogram())
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000754 return getOrCreateSubprogramDIE(DISubprogram(Context));
Adrian Prantl7d828bb2013-11-15 21:05:09 +0000755 return getDIE(Context);
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000756}
757
Eric Christophera5a79422013-12-09 23:32:48 +0000758DIE *DwarfUnit::createTypeDIE(DICompositeType Ty) {
David Blaikie9d861be2013-11-26 00:15:27 +0000759 DIScope Context = resolve(Ty.getContext());
760 DIE *ContextDIE = getOrCreateContextDIE(Context);
David Blaikie409dd9c2013-11-19 23:08:21 +0000761
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000762 if (DIE *TyDIE = getDIE(Ty))
David Blaikie409dd9c2013-11-19 23:08:21 +0000763 return TyDIE;
764
765 // Create new type.
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000766 DIE &TyDIE = createAndAddDIE(Ty.getTag(), *ContextDIE, Ty);
David Blaikie409dd9c2013-11-19 23:08:21 +0000767
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000768 constructTypeDIE(TyDIE, Ty);
David Blaikie409dd9c2013-11-19 23:08:21 +0000769
David Blaikie9d861be2013-11-26 00:15:27 +0000770 updateAcceleratorTables(Context, Ty, TyDIE);
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000771 return &TyDIE;
David Blaikie409dd9c2013-11-19 23:08:21 +0000772}
773
Devang Patel0e821f42011-04-12 23:21:44 +0000774/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
775/// given DIType.
Eric Christophera5a79422013-12-09 23:32:48 +0000776DIE *DwarfUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
David Blaikie32887552013-11-14 22:25:02 +0000777 if (!TyNode)
Craig Topper353eda42014-04-24 06:44:33 +0000778 return nullptr;
Manman Renf4c339e2013-10-29 22:49:29 +0000779
David Blaikie32887552013-11-14 22:25:02 +0000780 DIType Ty(TyNode);
781 assert(Ty.isType());
Adrian Prantlc95ec912014-03-24 21:33:01 +0000782 assert(Ty == resolve(Ty.getRef()) &&
Adrian Prantl0aa1aa22014-03-18 02:35:03 +0000783 "type was not uniqued, possible ODR violation.");
David Blaikie32887552013-11-14 22:25:02 +0000784
David Blaikieee11f222014-04-12 05:35:59 +0000785 // DW_TAG_restrict_type is not supported in DWARF2
786 if (Ty.getTag() == dwarf::DW_TAG_restrict_type && DD->getDwarfVersion() <= 2)
787 return getOrCreateTypeDIE(resolve(DIDerivedType(Ty).getTypeDerivedFrom()));
788
Manman Renf4c339e2013-10-29 22:49:29 +0000789 // Construct the context before querying for the existence of the DIE in case
790 // such construction creates the DIE.
David Blaikie9d861be2013-11-26 00:15:27 +0000791 DIScope Context = resolve(Ty.getContext());
792 DIE *ContextDIE = getOrCreateContextDIE(Context);
Adrian Prantl4583f7d2013-11-15 23:21:39 +0000793 assert(ContextDIE);
Manman Renf4c339e2013-10-29 22:49:29 +0000794
David Blaikie65a74662014-04-25 18:26:14 +0000795 if (DIE *TyDIE = getDIE(Ty))
Devang Patel0e821f42011-04-12 23:21:44 +0000796 return TyDIE;
797
798 // Create new type.
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000799 DIE &TyDIE = createAndAddDIE(Ty.getTag(), *ContextDIE, Ty);
Manman Renf4c339e2013-10-29 22:49:29 +0000800
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000801 updateAcceleratorTables(Context, Ty, TyDIE);
David Blaikiec3d9e9e2014-03-06 01:42:00 +0000802
Devang Patel0e821f42011-04-12 23:21:44 +0000803 if (Ty.isBasicType())
David Blaikie65a74662014-04-25 18:26:14 +0000804 constructTypeDIE(TyDIE, DIBasicType(Ty));
David Blaikie8a263cb2013-11-26 00:22:37 +0000805 else if (Ty.isCompositeType()) {
806 DICompositeType CTy(Ty);
David Blaikiecfb21152014-01-03 18:59:42 +0000807 if (GenerateDwarfTypeUnits && !Ty.isForwardDecl())
808 if (MDString *TypeId = CTy.getIdentifier()) {
David Blaikie15632ae2014-02-12 00:31:30 +0000809 DD->addDwarfTypeUnitType(getCU(), TypeId->getString(), TyDIE, CTy);
Adrian Prantle2da17f2014-03-14 23:08:17 +0000810 // Skip updating the accelerator tables since this is not the full type.
David Blaikie65a74662014-04-25 18:26:14 +0000811 return &TyDIE;
David Blaikiecfb21152014-01-03 18:59:42 +0000812 }
David Blaikie65a74662014-04-25 18:26:14 +0000813 constructTypeDIE(TyDIE, CTy);
David Blaikie8a263cb2013-11-26 00:22:37 +0000814 } else {
Devang Patel0e821f42011-04-12 23:21:44 +0000815 assert(Ty.isDerivedType() && "Unknown kind of DIType");
David Blaikie65a74662014-04-25 18:26:14 +0000816 constructTypeDIE(TyDIE, DIDerivedType(Ty));
Devang Patel0e821f42011-04-12 23:21:44 +0000817 }
David Blaikie2ea848b2013-11-19 22:51:04 +0000818
David Blaikie65a74662014-04-25 18:26:14 +0000819 return &TyDIE;
David Blaikie2ea848b2013-11-19 22:51:04 +0000820}
821
Eric Christophera5a79422013-12-09 23:32:48 +0000822void DwarfUnit::updateAcceleratorTables(DIScope Context, DIType Ty,
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000823 const DIE &TyDIE) {
Eric Christopher21bde872012-01-06 04:35:23 +0000824 if (!Ty.getName().empty() && !Ty.isForwardDecl()) {
825 bool IsImplementation = 0;
826 if (Ty.isCompositeType()) {
827 DICompositeType CT(Ty);
Eric Christopher8ea8e4f2012-01-06 23:03:37 +0000828 // A runtime language of 0 actually means C/C++ and that any
829 // non-negative value is some version of Objective-C/C++.
Eric Christopherc2697f82013-10-19 01:04:47 +0000830 IsImplementation = (CT.getRunTimeLang() == 0) || CT.isObjcClassComplete();
Eric Christopher21bde872012-01-06 04:35:23 +0000831 }
Eric Christophercf7289f2013-09-05 18:20:16 +0000832 unsigned Flags = IsImplementation ? dwarf::DW_FLAG_type_implementation : 0;
David Blaikie18d33752014-04-24 01:23:49 +0000833 DD->addAccelType(Ty.getName(), TyDIE, Flags);
David Blaikie9d861be2013-11-26 00:15:27 +0000834
David Blaikie98cf1722014-11-02 06:06:14 +0000835 if (!Context || Context.isCompileUnit() || Context.isFile() ||
836 Context.isNameSpace())
837 addGlobalType(Ty, TyDIE, Context);
Eric Christopher21bde872012-01-06 04:35:23 +0000838 }
Devang Patel0e821f42011-04-12 23:21:44 +0000839}
840
841/// addType - Add a new type attribute to the specified entity.
David Blaikie65a74662014-04-25 18:26:14 +0000842void DwarfUnit::addType(DIE &Entity, DIType Ty, dwarf::Attribute Attribute) {
Eric Christopher0df08e22013-08-08 07:40:37 +0000843 assert(Ty && "Trying to add a type that doesn't exist?");
Devang Patel0e821f42011-04-12 23:21:44 +0000844
845 // Check for pre-existence.
846 DIEEntry *Entry = getDIEEntry(Ty);
847 // If it exists then use the existing value.
848 if (Entry) {
Manman Ren4dbdc902013-10-31 17:54:35 +0000849 addDIEEntry(Entity, Attribute, Entry);
Devang Patel0e821f42011-04-12 23:21:44 +0000850 return;
851 }
852
853 // Construct type.
854 DIE *Buffer = getOrCreateTypeDIE(Ty);
855
856 // Set up proxy.
David Blaikie8dbcc3f2014-04-25 19:33:43 +0000857 Entry = createDIEEntry(*Buffer);
Devang Patel0e821f42011-04-12 23:21:44 +0000858 insertDIEEntry(Ty, Entry);
Manman Ren4dbdc902013-10-31 17:54:35 +0000859 addDIEEntry(Entity, Attribute, Entry);
Devang Patel1cb8ab42011-05-31 23:30:30 +0000860}
861
Eric Christopher2c8b7902013-10-17 02:06:06 +0000862/// getParentContextString - Walks the metadata parent chain in a language
863/// specific manner (using the compile unit language) and returns
864/// it as a string. This is done at the metadata level because DIEs may
865/// not currently have been added to the parent context and walking the
866/// DIEs looking for names is more expensive than walking the metadata.
Eric Christophera5a79422013-12-09 23:32:48 +0000867std::string DwarfUnit::getParentContextString(DIScope Context) const {
Eric Christopher2c8b7902013-10-17 02:06:06 +0000868 if (!Context)
869 return "";
870
871 // FIXME: Decide whether to implement this for non-C++ languages.
872 if (getLanguage() != dwarf::DW_LANG_C_plus_plus)
873 return "";
874
Eric Christopher8dba0d52013-10-19 01:04:42 +0000875 std::string CS;
Eric Christopher2c8b7902013-10-17 02:06:06 +0000876 SmallVector<DIScope, 1> Parents;
877 while (!Context.isCompileUnit()) {
878 Parents.push_back(Context);
879 if (Context.getContext())
880 Context = resolve(Context.getContext());
881 else
882 // Structure, etc types will have a NULL context if they're at the top
883 // level.
884 break;
885 }
886
887 // Reverse iterate over our list to go from the outermost construct to the
888 // innermost.
889 for (SmallVectorImpl<DIScope>::reverse_iterator I = Parents.rbegin(),
890 E = Parents.rend();
891 I != E; ++I) {
892 DIScope Ctx = *I;
893 StringRef Name = Ctx.getName();
David Blaikie553eb4a2014-06-06 22:16:56 +0000894 if (Name.empty() && Ctx.isNameSpace())
895 Name = "(anonymous namespace)";
Eric Christopher8dba0d52013-10-19 01:04:42 +0000896 if (!Name.empty()) {
Eric Christopher2c8b7902013-10-17 02:06:06 +0000897 CS += Name;
898 CS += "::";
899 }
900 }
901 return CS;
Devang Patel0e821f42011-04-12 23:21:44 +0000902}
903
904/// constructTypeDIE - Construct basic type die from DIBasicType.
Eric Christophera5a79422013-12-09 23:32:48 +0000905void DwarfUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
Devang Patel0e821f42011-04-12 23:21:44 +0000906 // Get core information.
907 StringRef Name = BTy.getName();
Devang Patel0e821f42011-04-12 23:21:44 +0000908 // Add name if not anonymous or intermediate type.
909 if (!Name.empty())
David Blaikie65a74662014-04-25 18:26:14 +0000910 addString(Buffer, dwarf::DW_AT_name, Name);
Devang Patel04d6d472011-09-14 23:13:28 +0000911
David Blaikiefac56122013-10-04 23:21:16 +0000912 // An unspecified type only has a name attribute.
913 if (BTy.getTag() == dwarf::DW_TAG_unspecified_type)
Devang Patel04d6d472011-09-14 23:13:28 +0000914 return;
Devang Patel04d6d472011-09-14 23:13:28 +0000915
David Blaikie65a74662014-04-25 18:26:14 +0000916 addUInt(Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
Devang Pateld925d1a2012-02-07 23:33:58 +0000917 BTy.getEncoding());
Devang Patel04d6d472011-09-14 23:13:28 +0000918
Devang Patel0e821f42011-04-12 23:21:44 +0000919 uint64_t Size = BTy.getSizeInBits() >> 3;
David Blaikie65a74662014-04-25 18:26:14 +0000920 addUInt(Buffer, dwarf::DW_AT_byte_size, None, Size);
Devang Patel0e821f42011-04-12 23:21:44 +0000921}
922
923/// constructTypeDIE - Construct derived type die from DIDerivedType.
Eric Christophera5a79422013-12-09 23:32:48 +0000924void DwarfUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
Devang Patel0e821f42011-04-12 23:21:44 +0000925 // Get core information.
926 StringRef Name = DTy.getName();
927 uint64_t Size = DTy.getSizeInBits() >> 3;
David Blaikiefac56122013-10-04 23:21:16 +0000928 uint16_t Tag = Buffer.getTag();
Devang Patel0e821f42011-04-12 23:21:44 +0000929
930 // Map to main type, void will not have a type.
Manman Ren93b30902013-10-08 18:42:58 +0000931 DIType FromTy = resolve(DTy.getTypeDerivedFrom());
Eric Christopher0df08e22013-08-08 07:40:37 +0000932 if (FromTy)
David Blaikie65a74662014-04-25 18:26:14 +0000933 addType(Buffer, FromTy);
Devang Patel0e821f42011-04-12 23:21:44 +0000934
935 // Add name if not anonymous or intermediate type.
936 if (!Name.empty())
David Blaikie65a74662014-04-25 18:26:14 +0000937 addString(Buffer, dwarf::DW_AT_name, Name);
Devang Patel0e821f42011-04-12 23:21:44 +0000938
939 // Add size if non-zero (derived types might be zero-sized.)
Adrian Prantl3026a542014-12-24 01:17:51 +0000940 if (Size && Tag != dwarf::DW_TAG_pointer_type
941 && Tag != dwarf::DW_TAG_ptr_to_member_type)
David Blaikie65a74662014-04-25 18:26:14 +0000942 addUInt(Buffer, dwarf::DW_AT_byte_size, None, Size);
Devang Patel0e821f42011-04-12 23:21:44 +0000943
David Blaikie5d3249b2013-01-07 05:51:15 +0000944 if (Tag == dwarf::DW_TAG_ptr_to_member_type)
David Blaikie65a74662014-04-25 18:26:14 +0000945 addDIEEntry(Buffer, dwarf::DW_AT_containing_type,
David Blaikie8dbcc3f2014-04-25 19:33:43 +0000946 *getOrCreateTypeDIE(resolve(DTy.getClassType())));
Devang Patel0e821f42011-04-12 23:21:44 +0000947 // Add source line info if available and TyDesc is not a forward declaration.
948 if (!DTy.isForwardDecl())
David Blaikie65a74662014-04-25 18:26:14 +0000949 addSourceLine(Buffer, DTy);
Devang Patel0e821f42011-04-12 23:21:44 +0000950}
951
Adrian Prantl3f49c892014-02-25 19:57:42 +0000952/// constructSubprogramArguments - Construct function argument DIEs.
Manman Renf8a19672014-07-28 22:24:06 +0000953void DwarfUnit::constructSubprogramArguments(DIE &Buffer, DITypeArray Args) {
Adrian Prantl69140d22014-02-25 22:27:14 +0000954 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
Manman Renf8a19672014-07-28 22:24:06 +0000955 DIType Ty = resolve(Args.getElement(i));
Manman Renf93ac4b2014-07-29 18:20:39 +0000956 if (!Ty) {
Adrian Prantl69140d22014-02-25 22:27:14 +0000957 assert(i == N-1 && "Unspecified parameter must be the last argument");
958 createAndAddDIE(dwarf::DW_TAG_unspecified_parameters, Buffer);
959 } else {
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000960 DIE &Arg = createAndAddDIE(dwarf::DW_TAG_formal_parameter, Buffer);
David Blaikiedf1cca32014-10-26 23:37:04 +0000961 addType(Arg, Ty);
962 if (Ty.isArtificial())
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000963 addFlag(Arg, dwarf::DW_AT_artificial);
Adrian Prantl3f49c892014-02-25 19:57:42 +0000964 }
Adrian Prantl69140d22014-02-25 22:27:14 +0000965 }
Adrian Prantl3f49c892014-02-25 19:57:42 +0000966}
967
Devang Patel0e821f42011-04-12 23:21:44 +0000968/// constructTypeDIE - Construct type DIE from DICompositeType.
Eric Christophera5a79422013-12-09 23:32:48 +0000969void DwarfUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
David Blaikie409dd9c2013-11-19 23:08:21 +0000970 // Add name if not anonymous or intermediate type.
Devang Patel0e821f42011-04-12 23:21:44 +0000971 StringRef Name = CTy.getName();
972
973 uint64_t Size = CTy.getSizeInBits() >> 3;
David Blaikiefac56122013-10-04 23:21:16 +0000974 uint16_t Tag = Buffer.getTag();
Devang Patel0e821f42011-04-12 23:21:44 +0000975
976 switch (Tag) {
Devang Patel0e821f42011-04-12 23:21:44 +0000977 case dwarf::DW_TAG_array_type:
Eric Christopherdf9955d2013-11-11 18:52:31 +0000978 constructArrayTypeDIE(Buffer, CTy);
Devang Patel0e821f42011-04-12 23:21:44 +0000979 break;
Eric Christopheraeb105f2013-11-11 18:52:39 +0000980 case dwarf::DW_TAG_enumeration_type:
981 constructEnumTypeDIE(Buffer, CTy);
982 break;
Devang Patel0e821f42011-04-12 23:21:44 +0000983 case dwarf::DW_TAG_subroutine_type: {
Eric Christopher0df08e22013-08-08 07:40:37 +0000984 // Add return type. A void return won't have a type.
Manman Renf8a19672014-07-28 22:24:06 +0000985 DITypeArray Elements = DISubroutineType(CTy).getTypeArray();
986 DIType RTy(resolve(Elements.getElement(0)));
Eric Christopher0df08e22013-08-08 07:40:37 +0000987 if (RTy)
David Blaikie65a74662014-04-25 18:26:14 +0000988 addType(Buffer, RTy);
Devang Patel0e821f42011-04-12 23:21:44 +0000989
990 bool isPrototyped = true;
Adrian Prantl3f49c892014-02-25 19:57:42 +0000991 if (Elements.getNumElements() == 2 &&
Manman Ren72b07e82014-07-29 22:58:13 +0000992 !Elements.getElement(1))
Adrian Prantl3f49c892014-02-25 19:57:42 +0000993 isPrototyped = false;
994
995 constructSubprogramArguments(Buffer, Elements);
996
Eric Christopher5cd2a9d2012-02-22 08:46:21 +0000997 // Add prototype flag if we're dealing with a C language and the
998 // function has been prototyped.
David Blaikiecb8e4352013-11-15 23:50:53 +0000999 uint16_t Language = getLanguage();
Eric Christopher5cd2a9d2012-02-22 08:46:21 +00001000 if (isPrototyped &&
Eric Christopherc2697f82013-10-19 01:04:47 +00001001 (Language == dwarf::DW_LANG_C89 || Language == dwarf::DW_LANG_C99 ||
Eric Christopherd42b92f2012-05-22 18:45:24 +00001002 Language == dwarf::DW_LANG_ObjC))
David Blaikie65a74662014-04-25 18:26:14 +00001003 addFlag(Buffer, dwarf::DW_AT_prototyped);
Adrian Prantl99c7af22013-12-18 21:48:19 +00001004
1005 if (CTy.isLValueReference())
David Blaikie65a74662014-04-25 18:26:14 +00001006 addFlag(Buffer, dwarf::DW_AT_reference);
Adrian Prantl99c7af22013-12-18 21:48:19 +00001007
1008 if (CTy.isRValueReference())
David Blaikie65a74662014-04-25 18:26:14 +00001009 addFlag(Buffer, dwarf::DW_AT_rvalue_reference);
Eric Christopherc2697f82013-10-19 01:04:47 +00001010 } break;
Devang Patel0e821f42011-04-12 23:21:44 +00001011 case dwarf::DW_TAG_structure_type:
1012 case dwarf::DW_TAG_union_type:
1013 case dwarf::DW_TAG_class_type: {
Devang Patel0e821f42011-04-12 23:21:44 +00001014 // Add elements to structure type.
Manman Renab8ffba2014-07-28 19:14:13 +00001015 DIArray Elements = CTy.getElements();
David Blaikiea1ae0e62013-08-01 20:30:22 +00001016 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
Devang Patel0e821f42011-04-12 23:21:44 +00001017 DIDescriptor Element = Elements.getElement(i);
Adrian Prantlef129fb2014-01-18 02:12:00 +00001018 if (Element.isSubprogram())
David Blaikie65a74662014-04-25 18:26:14 +00001019 getOrCreateSubprogramDIE(DISubprogram(Element));
Adrian Prantlef129fb2014-01-18 02:12:00 +00001020 else if (Element.isDerivedType()) {
Eric Christopherd42b92f2012-05-22 18:45:24 +00001021 DIDerivedType DDTy(Element);
1022 if (DDTy.getTag() == dwarf::DW_TAG_friend) {
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001023 DIE &ElemDie = createAndAddDIE(dwarf::DW_TAG_friend, Buffer);
Manman Ren93b30902013-10-08 18:42:58 +00001024 addType(ElemDie, resolve(DDTy.getTypeDerivedFrom()),
Manman Renb3388602013-10-05 01:43:03 +00001025 dwarf::DW_AT_friend);
Manman Renc6b63922013-10-14 20:33:57 +00001026 } else if (DDTy.isStaticMember()) {
Manman Ren57e6ff72013-10-23 22:57:12 +00001027 getOrCreateStaticMemberDIE(DDTy);
Manman Renc6b63922013-10-14 20:33:57 +00001028 } else {
Manman Ren230ec862013-10-23 23:00:44 +00001029 constructMemberDIE(Buffer, DDTy);
Manman Renc6b63922013-10-14 20:33:57 +00001030 }
Eric Christopher7285c7d2012-03-28 07:34:31 +00001031 } else if (Element.isObjCProperty()) {
Devang Pateld925d1a2012-02-07 23:33:58 +00001032 DIObjCProperty Property(Element);
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001033 DIE &ElemDie = createAndAddDIE(Property.getTag(), Buffer);
Devang Pateld925d1a2012-02-07 23:33:58 +00001034 StringRef PropertyName = Property.getObjCPropertyName();
1035 addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
Eric Christopher4c960562014-01-23 19:16:28 +00001036 if (Property.getType())
1037 addType(ElemDie, Property.getType());
Eric Christopherd42b92f2012-05-22 18:45:24 +00001038 addSourceLine(ElemDie, Property);
Devang Pateld925d1a2012-02-07 23:33:58 +00001039 StringRef GetterName = Property.getObjCPropertyGetterName();
1040 if (!GetterName.empty())
1041 addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
1042 StringRef SetterName = Property.getObjCPropertySetterName();
1043 if (!SetterName.empty())
1044 addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
1045 unsigned PropertyAttributes = 0;
Devang Patel403e8192012-02-04 01:30:32 +00001046 if (Property.isReadOnlyObjCProperty())
1047 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
1048 if (Property.isReadWriteObjCProperty())
1049 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
1050 if (Property.isAssignObjCProperty())
1051 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
1052 if (Property.isRetainObjCProperty())
1053 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
1054 if (Property.isCopyObjCProperty())
1055 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
1056 if (Property.isNonAtomicObjCProperty())
1057 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
1058 if (PropertyAttributes)
David Blaikief2443192013-10-21 17:28:37 +00001059 addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, None,
Eric Christopherc2697f82013-10-19 01:04:47 +00001060 PropertyAttributes);
Devang Patel44882172012-02-06 17:49:43 +00001061
Devang Pateld925d1a2012-02-07 23:33:58 +00001062 DIEEntry *Entry = getDIEEntry(Element);
1063 if (!Entry) {
David Blaikie8dbcc3f2014-04-25 19:33:43 +00001064 Entry = createDIEEntry(ElemDie);
Devang Pateld925d1a2012-02-07 23:33:58 +00001065 insertDIEEntry(Element, Entry);
1066 }
Devang Patel403e8192012-02-04 01:30:32 +00001067 } else
Devang Patel0e821f42011-04-12 23:21:44 +00001068 continue;
Devang Patel0e821f42011-04-12 23:21:44 +00001069 }
1070
1071 if (CTy.isAppleBlockExtension())
David Blaikie65a74662014-04-25 18:26:14 +00001072 addFlag(Buffer, dwarf::DW_AT_APPLE_block);
Devang Patel0e821f42011-04-12 23:21:44 +00001073
Adrian Prantlcf44e782014-12-19 00:01:20 +00001074 // This is outside the DWARF spec, but GDB expects a DW_AT_containing_type
1075 // inside C++ composite types to point to the base class with the vtable.
Eric Christopher9e429ae2013-10-05 00:27:02 +00001076 DICompositeType ContainingType(resolve(CTy.getContainingType()));
David Blaikie4f6bf27a2013-11-18 23:33:32 +00001077 if (ContainingType)
David Blaikie65a74662014-04-25 18:26:14 +00001078 addDIEEntry(Buffer, dwarf::DW_AT_containing_type,
David Blaikie8dbcc3f2014-04-25 19:33:43 +00001079 *getOrCreateTypeDIE(ContainingType));
Devang Patel0e821f42011-04-12 23:21:44 +00001080
Devang Patel12419ae2011-05-12 21:29:42 +00001081 if (CTy.isObjcClassComplete())
David Blaikie65a74662014-04-25 18:26:14 +00001082 addFlag(Buffer, dwarf::DW_AT_APPLE_objc_complete_type);
Devang Patel2409e782011-05-12 19:06:16 +00001083
Eric Christopherda011dd2011-12-16 23:42:42 +00001084 // Add template parameters to a class, structure or union types.
1085 // FIXME: The support isn't in the metadata for this yet.
1086 if (Tag == dwarf::DW_TAG_class_type ||
Eric Christopherc2697f82013-10-19 01:04:47 +00001087 Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type)
Devang Patel0e821f42011-04-12 23:21:44 +00001088 addTemplateParams(Buffer, CTy.getTemplateParams());
1089
1090 break;
1091 }
1092 default:
1093 break;
1094 }
1095
1096 // Add name if not anonymous or intermediate type.
1097 if (!Name.empty())
David Blaikie65a74662014-04-25 18:26:14 +00001098 addString(Buffer, dwarf::DW_AT_name, Name);
Devang Patel0e821f42011-04-12 23:21:44 +00001099
Eric Christopher775cbd22012-05-22 18:45:18 +00001100 if (Tag == dwarf::DW_TAG_enumeration_type ||
Eric Christopherc2697f82013-10-19 01:04:47 +00001101 Tag == dwarf::DW_TAG_class_type || Tag == dwarf::DW_TAG_structure_type ||
Eric Christopher775cbd22012-05-22 18:45:18 +00001102 Tag == dwarf::DW_TAG_union_type) {
Devang Patel0e821f42011-04-12 23:21:44 +00001103 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopher1cf33382012-06-01 00:22:32 +00001104 // TODO: Do we care about size for enum forward declarations?
Devang Patel0e821f42011-04-12 23:21:44 +00001105 if (Size)
David Blaikie65a74662014-04-25 18:26:14 +00001106 addUInt(Buffer, dwarf::DW_AT_byte_size, None, Size);
Eric Christopher1cf33382012-06-01 00:22:32 +00001107 else if (!CTy.isForwardDecl())
Devang Patel0e821f42011-04-12 23:21:44 +00001108 // Add zero size if it is not a forward declaration.
David Blaikie65a74662014-04-25 18:26:14 +00001109 addUInt(Buffer, dwarf::DW_AT_byte_size, None, 0);
Eric Christopher1cf33382012-06-01 00:22:32 +00001110
1111 // If we're a forward decl, say so.
1112 if (CTy.isForwardDecl())
David Blaikie65a74662014-04-25 18:26:14 +00001113 addFlag(Buffer, dwarf::DW_AT_declaration);
Devang Patel0e821f42011-04-12 23:21:44 +00001114
1115 // Add source line info if available.
1116 if (!CTy.isForwardDecl())
David Blaikie65a74662014-04-25 18:26:14 +00001117 addSourceLine(Buffer, CTy);
Eric Christopher54cf8ff2012-03-07 00:15:19 +00001118
1119 // No harm in adding the runtime language to the declaration.
1120 unsigned RLang = CTy.getRunTimeLang();
1121 if (RLang)
David Blaikie65a74662014-04-25 18:26:14 +00001122 addUInt(Buffer, dwarf::DW_AT_APPLE_runtime_class, dwarf::DW_FORM_data1,
Eric Christopherc2697f82013-10-19 01:04:47 +00001123 RLang);
Devang Patel0e821f42011-04-12 23:21:44 +00001124 }
1125}
1126
Manman Renffc9a712013-10-23 23:05:28 +00001127/// constructTemplateTypeParameterDIE - Construct new DIE for the given
1128/// DITemplateTypeParameter.
Eric Christophera5a79422013-12-09 23:32:48 +00001129void DwarfUnit::constructTemplateTypeParameterDIE(DIE &Buffer,
1130 DITemplateTypeParameter TP) {
David Blaikie65a74662014-04-25 18:26:14 +00001131 DIE &ParamDIE =
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001132 createAndAddDIE(dwarf::DW_TAG_template_type_parameter, Buffer);
Eric Christopher056b6472013-08-08 08:09:43 +00001133 // Add the type if it exists, it could be void and therefore no type.
1134 if (TP.getType())
Manman Ren88b0f942013-10-09 19:46:28 +00001135 addType(ParamDIE, resolve(TP.getType()));
David Blaikie2b380232013-06-22 18:59:11 +00001136 if (!TP.getName().empty())
1137 addString(ParamDIE, dwarf::DW_AT_name, TP.getName());
Devang Patel0e821f42011-04-12 23:21:44 +00001138}
1139
Manman Renffc9a712013-10-23 23:05:28 +00001140/// constructTemplateValueParameterDIE - Construct new DIE for the given
1141/// DITemplateValueParameter.
Eric Christophera5a79422013-12-09 23:32:48 +00001142void
1143DwarfUnit::constructTemplateValueParameterDIE(DIE &Buffer,
David Blaikie319a05f2013-12-02 19:33:10 +00001144 DITemplateValueParameter VP) {
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001145 DIE &ParamDIE = createAndAddDIE(VP.getTag(), Buffer);
Eric Christopher0df08e22013-08-08 07:40:37 +00001146
1147 // Add the type if there is one, template template and template parameter
1148 // packs will not have a type.
Eric Christopher691281b2013-10-21 17:48:51 +00001149 if (VP.getTag() == dwarf::DW_TAG_template_value_parameter)
Manman Ren88b0f942013-10-09 19:46:28 +00001150 addType(ParamDIE, resolve(VP.getType()));
Eric Christopherafb2c412013-08-08 07:40:31 +00001151 if (!VP.getName().empty())
1152 addString(ParamDIE, dwarf::DW_AT_name, VP.getName());
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +00001153 if (Metadata *Val = VP.getValue()) {
1154 if (ConstantInt *CI = mdconst::dyn_extract<ConstantInt>(Val))
David Blaikiec0a28412014-05-11 15:56:59 +00001155 addConstantValue(ParamDIE, CI, resolve(VP.getType()));
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +00001156 else if (GlobalValue *GV = mdconst::dyn_extract<GlobalValue>(Val)) {
David Blaikiea1e813d2013-05-10 21:52:07 +00001157 // For declaration non-type template parameters (such as global values and
1158 // functions)
Eric Christopher4a741042014-02-16 08:46:55 +00001159 DIELoc *Loc = new (DIEValueAllocator) DIELoc();
David Blaikie65a74662014-04-25 18:26:14 +00001160 addOpAddress(*Loc, Asm->getSymbol(GV));
David Blaikiea1e813d2013-05-10 21:52:07 +00001161 // Emit DW_OP_stack_value to use the address as the immediate value of the
1162 // parameter, rather than a pointer to it.
David Blaikie65a74662014-04-25 18:26:14 +00001163 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value);
Eric Christopher4a741042014-02-16 08:46:55 +00001164 addBlock(ParamDIE, dwarf::DW_AT_location, Loc);
Eric Christopherafb2c412013-08-08 07:40:31 +00001165 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_template_param) {
David Blaikie2b380232013-06-22 18:59:11 +00001166 assert(isa<MDString>(Val));
1167 addString(ParamDIE, dwarf::DW_AT_GNU_template_name,
1168 cast<MDString>(Val)->getString());
Eric Christopherafb2c412013-08-08 07:40:31 +00001169 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_parameter_pack) {
David Blaikie2b380232013-06-22 18:59:11 +00001170 assert(isa<MDNode>(Val));
1171 DIArray A(cast<MDNode>(Val));
David Blaikie65a74662014-04-25 18:26:14 +00001172 addTemplateParams(ParamDIE, A);
David Blaikiea1e813d2013-05-10 21:52:07 +00001173 }
1174 }
Devang Patel0e821f42011-04-12 23:21:44 +00001175}
1176
Devang Patel17b53272011-05-06 16:57:54 +00001177/// getOrCreateNameSpace - Create a DIE for DINameSpace.
Eric Christophera5a79422013-12-09 23:32:48 +00001178DIE *DwarfUnit::getOrCreateNameSpace(DINameSpace NS) {
Manman Renf6b936b2013-10-29 05:49:41 +00001179 // Construct the context before querying for the existence of the DIE in case
1180 // such construction creates the DIE.
1181 DIE *ContextDIE = getOrCreateContextDIE(NS.getContext());
Manman Renf6b936b2013-10-29 05:49:41 +00001182
David Blaikie65a74662014-04-25 18:26:14 +00001183 if (DIE *NDie = getDIE(NS))
Devang Patel17b53272011-05-06 16:57:54 +00001184 return NDie;
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001185 DIE &NDie = createAndAddDIE(dwarf::DW_TAG_namespace, *ContextDIE, NS);
Manman Renf6b936b2013-10-29 05:49:41 +00001186
David Blaikie553eb4a2014-06-06 22:16:56 +00001187 StringRef Name = NS.getName();
1188 if (!Name.empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +00001189 addString(NDie, dwarf::DW_AT_name, NS.getName());
David Blaikie553eb4a2014-06-06 22:16:56 +00001190 else
1191 Name = "(anonymous namespace)";
1192 DD->addAccelNamespace(Name, NDie);
1193 addGlobalName(Name, NDie, NS.getContext());
Devang Patel17b53272011-05-06 16:57:54 +00001194 addSourceLine(NDie, NS);
David Blaikie65a74662014-04-25 18:26:14 +00001195 return &NDie;
Devang Patel17b53272011-05-06 16:57:54 +00001196}
1197
Devang Patel89543712011-08-15 17:24:54 +00001198/// getOrCreateSubprogramDIE - Create new DIE using SP.
David Blaikie3a443c22014-11-04 22:12:25 +00001199DIE *DwarfUnit::getOrCreateSubprogramDIE(DISubprogram SP, bool Minimal) {
David Blaikie309ffe42013-10-04 01:39:59 +00001200 // Construct the context before querying for the existence of the DIE in case
1201 // such construction creates the DIE (as is the case for member function
1202 // declarations).
David Blaikie3a443c22014-11-04 22:12:25 +00001203 DIE *ContextDIE =
1204 Minimal ? &getUnitDie() : getOrCreateContextDIE(resolve(SP.getContext()));
Adrian Prantld486b342014-03-18 17:41:15 +00001205
David Blaikie65a74662014-04-25 18:26:14 +00001206 if (DIE *SPDie = getDIE(SP))
Devang Patel89543712011-08-15 17:24:54 +00001207 return SPDie;
1208
David Blaikiece7a1bd2014-05-21 18:04:33 +00001209 if (DISubprogram SPDecl = SP.getFunctionDeclaration()) {
David Blaikie3a443c22014-11-04 22:12:25 +00001210 if (!Minimal) {
1211 // Add subprogram definitions to the CU die directly.
1212 ContextDIE = &getUnitDie();
1213 // Build the decl now to ensure it precedes the definition.
1214 getOrCreateSubprogramDIE(SPDecl);
1215 }
David Blaikiece7a1bd2014-05-21 18:04:33 +00001216 }
Peter Collingbourne4d358b52012-05-27 18:36:44 +00001217
1218 // DW_TAG_inlined_subroutine may refer to this DIE.
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001219 DIE &SPDie = createAndAddDIE(dwarf::DW_TAG_subprogram, *ContextDIE, SP);
Peter Collingbourne4d358b52012-05-27 18:36:44 +00001220
David Blaikie6cfa9e12014-06-05 00:25:26 +00001221 // Stop here and fill this in later, depending on whether or not this
David Blaikief7221ad2014-05-27 18:37:43 +00001222 // subprogram turns out to have inlined instances or not.
1223 if (SP.isDefinition())
1224 return &SPDie;
1225
David Blaikie7f916862014-05-27 18:37:38 +00001226 applySubprogramAttributes(SP, SPDie);
1227 return &SPDie;
1228}
1229
David Blaikie3a443c22014-11-04 22:12:25 +00001230bool DwarfUnit::applySubprogramDefinitionAttributes(DISubprogram SP,
1231 DIE &SPDie) {
David Blaikie7f916862014-05-27 18:37:38 +00001232 DIE *DeclDie = nullptr;
1233 StringRef DeclLinkageName;
1234 if (DISubprogram SPDecl = SP.getFunctionDeclaration()) {
David Blaikief7221ad2014-05-27 18:37:43 +00001235 DeclDie = getDIE(SPDecl);
David Blaikie6cfa9e12014-06-05 00:25:26 +00001236 assert(DeclDie && "This DIE should've already been constructed when the "
Alp Toker5c536392014-06-07 21:23:09 +00001237 "definition DIE was created in "
David Blaikie6cfa9e12014-06-05 00:25:26 +00001238 "getOrCreateSubprogramDIE");
David Blaikie7f916862014-05-27 18:37:38 +00001239 DeclLinkageName = SPDecl.getLinkageName();
1240 }
Rafael Espindola79278362011-11-10 22:34:29 +00001241
Devang Patel89543712011-08-15 17:24:54 +00001242 // Add function template parameters.
David Blaikie65a74662014-04-25 18:26:14 +00001243 addTemplateParams(SPDie, SP.getTemplateParams());
Devang Patel89543712011-08-15 17:24:54 +00001244
Adrian Prantl8714aaf2014-04-14 21:16:04 +00001245 // Add the linkage name if we have one and it isn't in the Decl.
1246 StringRef LinkageName = SP.getLinkageName();
David Blaikiece7a1bd2014-05-21 18:04:33 +00001247 assert(((LinkageName.empty() || DeclLinkageName.empty()) ||
1248 LinkageName == DeclLinkageName) &&
1249 "decl has a linkage name and it is different");
1250 if (!LinkageName.empty() && DeclLinkageName.empty())
1251 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
1252 GlobalValue::getRealLinkageName(LinkageName));
Devang Patel89543712011-08-15 17:24:54 +00001253
David Blaikie3a443c22014-11-04 22:12:25 +00001254 if (!DeclDie)
1255 return false;
1256
1257 // Refer to the function declaration where all the other attributes will be
1258 // found.
1259 addDIEEntry(SPDie, dwarf::DW_AT_specification, *DeclDie);
1260 return true;
1261}
1262
1263void DwarfUnit::applySubprogramAttributes(DISubprogram SP, DIE &SPDie,
1264 bool Minimal) {
1265 if (!Minimal)
1266 if (applySubprogramDefinitionAttributes(SP, SPDie))
1267 return;
Eric Christopheracb71152012-08-23 22:52:55 +00001268
Devang Patel89543712011-08-15 17:24:54 +00001269 // Constructors and operators for anonymous aggregates do not have names.
1270 if (!SP.getName().empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +00001271 addString(SPDie, dwarf::DW_AT_name, SP.getName());
Devang Patel89543712011-08-15 17:24:54 +00001272
David Blaikie0b9438b2014-09-19 04:47:46 +00001273 // Skip the rest of the attributes under -gmlt to save space.
David Blaikie279c4512014-11-02 08:18:06 +00001274 if (Minimal)
David Blaikie73b65d22014-09-19 04:30:36 +00001275 return;
1276
Devang Patel89543712011-08-15 17:24:54 +00001277 addSourceLine(SPDie, SP);
1278
Eric Christopher5cd2a9d2012-02-22 08:46:21 +00001279 // Add the prototype if we have a prototype and we have a C like
1280 // language.
David Blaikiecb8e4352013-11-15 23:50:53 +00001281 uint16_t Language = getLanguage();
Eric Christopher5cd2a9d2012-02-22 08:46:21 +00001282 if (SP.isPrototyped() &&
Eric Christopherc2697f82013-10-19 01:04:47 +00001283 (Language == dwarf::DW_LANG_C89 || Language == dwarf::DW_LANG_C99 ||
Eric Christopher5cd2a9d2012-02-22 08:46:21 +00001284 Language == dwarf::DW_LANG_ObjC))
Eric Christopherbb69a272012-08-24 01:14:27 +00001285 addFlag(SPDie, dwarf::DW_AT_prototyped);
Devang Patel89543712011-08-15 17:24:54 +00001286
Manman Renf8a19672014-07-28 22:24:06 +00001287 DISubroutineType SPTy = SP.getType();
David Blaikie5174c842013-05-22 23:22:18 +00001288 assert(SPTy.getTag() == dwarf::DW_TAG_subroutine_type &&
1289 "the type of a subprogram should be a subroutine");
Devang Patel89543712011-08-15 17:24:54 +00001290
Manman Renf8a19672014-07-28 22:24:06 +00001291 DITypeArray Args = SPTy.getTypeArray();
Eric Christopher691281b2013-10-21 17:48:51 +00001292 // Add a return type. If this is a type like a C/C++ void type we don't add a
1293 // return type.
Manman Renf8a19672014-07-28 22:24:06 +00001294 if (resolve(Args.getElement(0)))
1295 addType(SPDie, DIType(resolve(Args.getElement(0))));
Devang Patel89543712011-08-15 17:24:54 +00001296
1297 unsigned VK = SP.getVirtuality();
1298 if (VK) {
Nick Lewyckycfde1a22011-12-14 00:56:07 +00001299 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
Eric Christopher4a741042014-02-16 08:46:55 +00001300 DIELoc *Block = getDIELoc();
David Blaikie65a74662014-04-25 18:26:14 +00001301 addUInt(*Block, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1302 addUInt(*Block, dwarf::DW_FORM_udata, SP.getVirtualIndex());
David Blaikief2443192013-10-21 17:28:37 +00001303 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, Block);
Eric Christopher98b7f172013-11-11 18:52:36 +00001304 ContainingTypeMap.insert(
David Blaikie65a74662014-04-25 18:26:14 +00001305 std::make_pair(&SPDie, resolve(SP.getContainingType())));
Devang Patel89543712011-08-15 17:24:54 +00001306 }
1307
1308 if (!SP.isDefinition()) {
Eric Christopherbb69a272012-08-24 01:14:27 +00001309 addFlag(SPDie, dwarf::DW_AT_declaration);
Eric Christopher92331fd2012-11-21 00:34:38 +00001310
Devang Patel89543712011-08-15 17:24:54 +00001311 // Add arguments. Do not add arguments for subprogram definition. They will
1312 // be handled while processing variables.
David Blaikie899ae612014-04-30 22:58:19 +00001313 constructSubprogramArguments(SPDie, Args);
Devang Patel89543712011-08-15 17:24:54 +00001314 }
1315
1316 if (SP.isArtificial())
Eric Christopherbb69a272012-08-24 01:14:27 +00001317 addFlag(SPDie, dwarf::DW_AT_artificial);
Devang Patel89543712011-08-15 17:24:54 +00001318
1319 if (!SP.isLocalToUnit())
Eric Christopherbb69a272012-08-24 01:14:27 +00001320 addFlag(SPDie, dwarf::DW_AT_external);
Devang Patel89543712011-08-15 17:24:54 +00001321
1322 if (SP.isOptimized())
Eric Christopherbb69a272012-08-24 01:14:27 +00001323 addFlag(SPDie, dwarf::DW_AT_APPLE_optimized);
Devang Patel89543712011-08-15 17:24:54 +00001324
1325 if (unsigned isa = Asm->getISAEncoding()) {
1326 addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1327 }
1328
Adrian Prantl99c7af22013-12-18 21:48:19 +00001329 if (SP.isLValueReference())
1330 addFlag(SPDie, dwarf::DW_AT_reference);
1331
1332 if (SP.isRValueReference())
1333 addFlag(SPDie, dwarf::DW_AT_rvalue_reference);
1334
Adrian Prantlef129fb2014-01-18 02:12:00 +00001335 if (SP.isProtected())
1336 addUInt(SPDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1337 dwarf::DW_ACCESS_protected);
1338 else if (SP.isPrivate())
1339 addUInt(SPDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1340 dwarf::DW_ACCESS_private);
Adrian Prantldaedfda2014-08-29 22:44:07 +00001341 else if (SP.isPublic())
Adrian Prantlef129fb2014-01-18 02:12:00 +00001342 addUInt(SPDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1343 dwarf::DW_ACCESS_public);
1344
1345 if (SP.isExplicit())
1346 addFlag(SPDie, dwarf::DW_AT_explicit);
Devang Patel89543712011-08-15 17:24:54 +00001347}
1348
Devang Patel0e821f42011-04-12 23:21:44 +00001349/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
Eric Christophera5a79422013-12-09 23:32:48 +00001350void DwarfUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy) {
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001351 DIE &DW_Subrange = createAndAddDIE(dwarf::DW_TAG_subrange_type, Buffer);
David Blaikie8dbcc3f2014-04-25 19:33:43 +00001352 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, *IndexTy);
Devang Patel0e821f42011-04-12 23:21:44 +00001353
Bill Wendling28fe9e72012-12-06 07:38:10 +00001354 // The LowerBound value defines the lower bounds which is typically zero for
1355 // C/C++. The Count value is the number of elements. Values are 64 bit. If
1356 // Count == -1 then the array is unbounded and we do not emit
David Blaikie32b0f362014-10-01 00:56:55 +00001357 // DW_AT_lower_bound and DW_AT_count attributes.
Bill Wendling28fe9e72012-12-06 07:38:10 +00001358 int64_t LowerBound = SR.getLo();
Bill Wendling3495f9b2012-12-06 07:55:19 +00001359 int64_t DefaultLowerBound = getDefaultLowerBound();
Bill Wendlingd7767122012-12-04 21:34:03 +00001360 int64_t Count = SR.getCount();
Devang Patel0e821f42011-04-12 23:21:44 +00001361
Bill Wendling3495f9b2012-12-06 07:55:19 +00001362 if (DefaultLowerBound == -1 || LowerBound != DefaultLowerBound)
David Blaikief2443192013-10-21 17:28:37 +00001363 addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, None, LowerBound);
Bill Wendling28fe9e72012-12-06 07:38:10 +00001364
David Blaikie32b0f362014-10-01 00:56:55 +00001365 if (Count != -1)
Bill Wendlingd7767122012-12-04 21:34:03 +00001366 // FIXME: An unbounded array should reference the expression that defines
1367 // the array.
David Blaikie32b0f362014-10-01 00:56:55 +00001368 addUInt(DW_Subrange, dwarf::DW_AT_count, None, Count);
Devang Patel0e821f42011-04-12 23:21:44 +00001369}
1370
David Blaikie871c2d92014-11-02 03:09:13 +00001371DIE *DwarfUnit::getIndexTyDie() {
1372 if (IndexTyDie)
1373 return IndexTyDie;
1374 // Construct an integer type to use for indexes.
1375 IndexTyDie = &createAndAddDIE(dwarf::DW_TAG_base_type, UnitDie);
1376 addString(*IndexTyDie, dwarf::DW_AT_name, "sizetype");
1377 addUInt(*IndexTyDie, dwarf::DW_AT_byte_size, None, sizeof(int64_t));
1378 addUInt(*IndexTyDie, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1379 dwarf::DW_ATE_unsigned);
1380 return IndexTyDie;
1381}
1382
Devang Patel0e821f42011-04-12 23:21:44 +00001383/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
Eric Christophera5a79422013-12-09 23:32:48 +00001384void DwarfUnit::constructArrayTypeDIE(DIE &Buffer, DICompositeType CTy) {
Eric Christopherdf9955d2013-11-11 18:52:31 +00001385 if (CTy.isVector())
David Blaikie65a74662014-04-25 18:26:14 +00001386 addFlag(Buffer, dwarf::DW_AT_GNU_vector);
Devang Patel0e821f42011-04-12 23:21:44 +00001387
Eric Christopher0df08e22013-08-08 07:40:37 +00001388 // Emit the element type.
David Blaikie65a74662014-04-25 18:26:14 +00001389 addType(Buffer, resolve(CTy.getTypeDerivedFrom()));
Devang Patel0e821f42011-04-12 23:21:44 +00001390
1391 // Get an anonymous type for index type.
Eric Christophercad9b532013-01-04 21:51:53 +00001392 // FIXME: This type should be passed down from the front end
1393 // as different languages may have different sizes for indexes.
Devang Patel0e821f42011-04-12 23:21:44 +00001394 DIE *IdxTy = getIndexTyDie();
Devang Patel0e821f42011-04-12 23:21:44 +00001395
1396 // Add subranges to array type.
Manman Renab8ffba2014-07-28 19:14:13 +00001397 DIArray Elements = CTy.getElements();
Devang Patel0e821f42011-04-12 23:21:44 +00001398 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1399 DIDescriptor Element = Elements.getElement(i);
1400 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1401 constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1402 }
1403}
1404
Eric Christopheraeb105f2013-11-11 18:52:39 +00001405/// constructEnumTypeDIE - Construct an enum type DIE from DICompositeType.
Eric Christophera5a79422013-12-09 23:32:48 +00001406void DwarfUnit::constructEnumTypeDIE(DIE &Buffer, DICompositeType CTy) {
Manman Renab8ffba2014-07-28 19:14:13 +00001407 DIArray Elements = CTy.getElements();
Eric Christopheraeb105f2013-11-11 18:52:39 +00001408
1409 // Add enumerators to enumeration type.
1410 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
David Blaikie4f6bf27a2013-11-18 23:33:32 +00001411 DIEnumerator Enum(Elements.getElement(i));
Eric Christopheraeb105f2013-11-11 18:52:39 +00001412 if (Enum.isEnumerator()) {
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001413 DIE &Enumerator = createAndAddDIE(dwarf::DW_TAG_enumerator, Buffer);
David Blaikie4f6bf27a2013-11-18 23:33:32 +00001414 StringRef Name = Enum.getName();
Eric Christopheraeb105f2013-11-11 18:52:39 +00001415 addString(Enumerator, dwarf::DW_AT_name, Name);
David Blaikie4f6bf27a2013-11-18 23:33:32 +00001416 int64_t Value = Enum.getEnumValue();
Eric Christophera07e4f52013-11-19 09:28:34 +00001417 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata,
1418 Value);
Eric Christopheraeb105f2013-11-11 18:52:39 +00001419 }
1420 }
1421 DIType DTy = resolve(CTy.getTypeDerivedFrom());
1422 if (DTy) {
David Blaikie65a74662014-04-25 18:26:14 +00001423 addType(Buffer, DTy);
1424 addFlag(Buffer, dwarf::DW_AT_enum_class);
Eric Christopheraeb105f2013-11-11 18:52:39 +00001425 }
Devang Patel0e821f42011-04-12 23:21:44 +00001426}
1427
Devang Patel89543712011-08-15 17:24:54 +00001428/// constructContainingTypeDIEs - Construct DIEs for types that contain
1429/// vtables.
Eric Christophera5a79422013-12-09 23:32:48 +00001430void DwarfUnit::constructContainingTypeDIEs() {
Devang Patel89543712011-08-15 17:24:54 +00001431 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
Eric Christopherc2697f82013-10-19 01:04:47 +00001432 CE = ContainingTypeMap.end();
1433 CI != CE; ++CI) {
David Blaikie65a74662014-04-25 18:26:14 +00001434 DIE &SPDie = *CI->first;
David Blaikie2ad00162013-11-15 23:09:13 +00001435 DIDescriptor D(CI->second);
1436 if (!D)
Eric Christopherc2697f82013-10-19 01:04:47 +00001437 continue;
David Blaikie2ad00162013-11-15 23:09:13 +00001438 DIE *NDie = getDIE(D);
Eric Christopherc2697f82013-10-19 01:04:47 +00001439 if (!NDie)
1440 continue;
David Blaikie8dbcc3f2014-04-25 19:33:43 +00001441 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, *NDie);
Devang Patel89543712011-08-15 17:24:54 +00001442 }
1443}
1444
Manman Ren230ec862013-10-23 23:00:44 +00001445/// constructMemberDIE - Construct member DIE from DIDerivedType.
Eric Christophera5a79422013-12-09 23:32:48 +00001446void DwarfUnit::constructMemberDIE(DIE &Buffer, DIDerivedType DT) {
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001447 DIE &MemberDie = createAndAddDIE(DT.getTag(), Buffer);
Devang Patel0e821f42011-04-12 23:21:44 +00001448 StringRef Name = DT.getName();
1449 if (!Name.empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +00001450 addString(MemberDie, dwarf::DW_AT_name, Name);
Devang Patel0e821f42011-04-12 23:21:44 +00001451
Manman Ren93b30902013-10-08 18:42:58 +00001452 addType(MemberDie, resolve(DT.getTypeDerivedFrom()));
Devang Patel0e821f42011-04-12 23:21:44 +00001453
1454 addSourceLine(MemberDie, DT);
1455
Eric Christopherc2697f82013-10-19 01:04:47 +00001456 if (DT.getTag() == dwarf::DW_TAG_inheritance && DT.isVirtual()) {
Devang Patel0e821f42011-04-12 23:21:44 +00001457
1458 // For C++, virtual base classes are not at fixed offset. Use following
1459 // expression to extract appropriate offset from vtable.
1460 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1461
Eric Christopher4a741042014-02-16 08:46:55 +00001462 DIELoc *VBaseLocationDie = new (DIEValueAllocator) DIELoc();
David Blaikie65a74662014-04-25 18:26:14 +00001463 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1464 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1465 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1466 addUInt(*VBaseLocationDie, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1467 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1468 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1469 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
Devang Patel0e821f42011-04-12 23:21:44 +00001470
David Blaikief2443192013-10-21 17:28:37 +00001471 addBlock(MemberDie, dwarf::DW_AT_data_member_location, VBaseLocationDie);
David Blaikie71d34a22013-11-01 00:25:45 +00001472 } else {
1473 uint64_t Size = DT.getSizeInBits();
1474 uint64_t FieldSize = getBaseTypeSize(DD, DT);
1475 uint64_t OffsetInBytes;
1476
1477 if (Size != FieldSize) {
Eric Christopher1acdbb82014-03-12 17:14:46 +00001478 // Handle bitfield, assume bytes are 8 bits.
1479 addUInt(MemberDie, dwarf::DW_AT_byte_size, None, FieldSize/8);
1480 addUInt(MemberDie, dwarf::DW_AT_bit_size, None, Size);
David Blaikie71d34a22013-11-01 00:25:45 +00001481
1482 uint64_t Offset = DT.getOffsetInBits();
1483 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1484 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1485 uint64_t FieldOffset = (HiMark - FieldSize);
1486 Offset -= FieldOffset;
1487
1488 // Maybe we need to work from the other end.
1489 if (Asm->getDataLayout().isLittleEndian())
1490 Offset = FieldSize - (Offset + Size);
1491 addUInt(MemberDie, dwarf::DW_AT_bit_offset, None, Offset);
1492
Adrian Prantlc67655a2014-01-28 18:13:47 +00001493 // Here DW_AT_data_member_location points to the anonymous
David Blaikie71d34a22013-11-01 00:25:45 +00001494 // field that includes this bit field.
1495 OffsetInBytes = FieldOffset >> 3;
1496 } else
1497 // This is not a bitfield.
1498 OffsetInBytes = DT.getOffsetInBits() >> 3;
David Blaikie2ada1162014-01-03 00:48:38 +00001499
David Blaikie22b29a52014-01-03 01:30:05 +00001500 if (DD->getDwarfVersion() <= 2) {
Eric Christopher4a741042014-02-16 08:46:55 +00001501 DIELoc *MemLocationDie = new (DIEValueAllocator) DIELoc();
David Blaikie65a74662014-04-25 18:26:14 +00001502 addUInt(*MemLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1503 addUInt(*MemLocationDie, dwarf::DW_FORM_udata, OffsetInBytes);
David Blaikie22b29a52014-01-03 01:30:05 +00001504 addBlock(MemberDie, dwarf::DW_AT_data_member_location, MemLocationDie);
1505 } else
1506 addUInt(MemberDie, dwarf::DW_AT_data_member_location, None,
1507 OffsetInBytes);
David Blaikie71d34a22013-11-01 00:25:45 +00001508 }
Devang Patel0e821f42011-04-12 23:21:44 +00001509
1510 if (DT.isProtected())
Nick Lewyckycb918492011-12-13 05:09:11 +00001511 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001512 dwarf::DW_ACCESS_protected);
1513 else if (DT.isPrivate())
Nick Lewyckycb918492011-12-13 05:09:11 +00001514 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001515 dwarf::DW_ACCESS_private);
1516 // Otherwise C++ member and base classes are considered public.
Adrian Prantldaedfda2014-08-29 22:44:07 +00001517 else if (DT.isPublic())
Nick Lewyckycb918492011-12-13 05:09:11 +00001518 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001519 dwarf::DW_ACCESS_public);
1520 if (DT.isVirtual())
Nick Lewyckycfde1a22011-12-14 00:56:07 +00001521 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001522 dwarf::DW_VIRTUALITY_virtual);
Devang Patel514b4002011-04-16 00:11:51 +00001523
1524 // Objective-C properties.
Devang Patel44882172012-02-06 17:49:43 +00001525 if (MDNode *PNode = DT.getObjCProperty())
1526 if (DIEEntry *PropertyDie = getDIEEntry(PNode))
David Blaikie65a74662014-04-25 18:26:14 +00001527 MemberDie.addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4,
1528 PropertyDie);
Devang Patel44882172012-02-06 17:49:43 +00001529
David Blaikie37fefc32012-12-13 22:43:07 +00001530 if (DT.isArtificial())
1531 addFlag(MemberDie, dwarf::DW_AT_artificial);
Devang Patel0e821f42011-04-12 23:21:44 +00001532}
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001533
Manman Renc6b63922013-10-14 20:33:57 +00001534/// getOrCreateStaticMemberDIE - Create new DIE for C++ static member.
Eric Christophera5a79422013-12-09 23:32:48 +00001535DIE *DwarfUnit::getOrCreateStaticMemberDIE(DIDerivedType DT) {
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001536 if (!DT.Verify())
Craig Topper353eda42014-04-24 06:44:33 +00001537 return nullptr;
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001538
Manman Renc6b63922013-10-14 20:33:57 +00001539 // Construct the context before querying for the existence of the DIE in case
1540 // such construction creates the DIE.
1541 DIE *ContextDIE = getOrCreateContextDIE(resolve(DT.getContext()));
David Blaikiebd700e42013-11-14 21:24:34 +00001542 assert(dwarf::isType(ContextDIE->getTag()) &&
1543 "Static member should belong to a type.");
Manman Renc6b63922013-10-14 20:33:57 +00001544
David Blaikie65a74662014-04-25 18:26:14 +00001545 if (DIE *StaticMemberDIE = getDIE(DT))
Manman Renc6b63922013-10-14 20:33:57 +00001546 return StaticMemberDIE;
1547
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001548 DIE &StaticMemberDIE = createAndAddDIE(DT.getTag(), *ContextDIE, DT);
Manman Renc6b63922013-10-14 20:33:57 +00001549
Manman Ren93b30902013-10-08 18:42:58 +00001550 DIType Ty = resolve(DT.getTypeDerivedFrom());
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001551
1552 addString(StaticMemberDIE, dwarf::DW_AT_name, DT.getName());
1553 addType(StaticMemberDIE, Ty);
1554 addSourceLine(StaticMemberDIE, DT);
1555 addFlag(StaticMemberDIE, dwarf::DW_AT_external);
1556 addFlag(StaticMemberDIE, dwarf::DW_AT_declaration);
1557
1558 // FIXME: We could omit private if the parent is a class_type, and
1559 // public if the parent is something else.
1560 if (DT.isProtected())
1561 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1562 dwarf::DW_ACCESS_protected);
1563 else if (DT.isPrivate())
1564 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1565 dwarf::DW_ACCESS_private);
Adrian Prantldaedfda2014-08-29 22:44:07 +00001566 else if (DT.isPublic())
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001567 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1568 dwarf::DW_ACCESS_public);
1569
1570 if (const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(DT.getConstant()))
David Blaikiec0a28412014-05-11 15:56:59 +00001571 addConstantValue(StaticMemberDIE, CI, Ty);
David Blaikiea39a76e2013-01-20 01:18:01 +00001572 if (const ConstantFP *CFP = dyn_cast_or_null<ConstantFP>(DT.getConstant()))
1573 addConstantFPValue(StaticMemberDIE, CFP);
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001574
David Blaikie65a74662014-04-25 18:26:14 +00001575 return &StaticMemberDIE;
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001576}
David Blaikie6b288cf2013-10-30 20:42:41 +00001577
David Blaikied82b2372014-03-24 20:28:10 +00001578void DwarfUnit::emitHeader(const MCSymbol *ASectionSym) const {
David Blaikieae57e662014-11-01 23:59:23 +00001579 // Emit size of content not including length itself
1580 Asm->OutStreamer.AddComment("Length of Unit");
1581 Asm->EmitInt32(getHeaderSize() + UnitDie.getSize());
1582
David Blaikie6b288cf2013-10-30 20:42:41 +00001583 Asm->OutStreamer.AddComment("DWARF version number");
1584 Asm->EmitInt16(DD->getDwarfVersion());
1585 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
David Blaikie6896e192013-12-04 23:39:02 +00001586 // We share one abbreviations table across all units so it's always at the
1587 // start of the section. Use a relocatable offset where needed to ensure
1588 // linking doesn't invalidate that offset.
David Blaikie3c9a3cc2014-03-24 20:53:02 +00001589 if (ASectionSym)
1590 Asm->EmitSectionOffset(ASectionSym, ASectionSym);
1591 else
David Blaikie326e1fa2014-04-02 02:04:51 +00001592 // Use a constant value when no symbol is provided.
David Blaikie3c9a3cc2014-03-24 20:53:02 +00001593 Asm->EmitInt32(0);
David Blaikie6b288cf2013-10-30 20:42:41 +00001594 Asm->OutStreamer.AddComment("Address Size (in bytes)");
1595 Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
1596}
David Blaikiebc563272013-12-13 21:33:40 +00001597
David Blaikiea34568b2014-11-01 20:06:28 +00001598void DwarfUnit::initSection(const MCSection *Section) {
1599 assert(!this->Section);
1600 this->Section = Section;
David Blaikiea34568b2014-11-01 20:06:28 +00001601}
1602
David Blaikied82b2372014-03-24 20:28:10 +00001603void DwarfTypeUnit::emitHeader(const MCSymbol *ASectionSym) const {
1604 DwarfUnit::emitHeader(ASectionSym);
David Blaikiebc563272013-12-13 21:33:40 +00001605 Asm->OutStreamer.AddComment("Type Signature");
1606 Asm->OutStreamer.EmitIntValue(TypeSignature, sizeof(TypeSignature));
1607 Asm->OutStreamer.AddComment("Type DIE Offset");
David Blaikie15ed5eb2014-01-10 01:38:41 +00001608 // In a skeleton type unit there is no type DIE so emit a zero offset.
1609 Asm->OutStreamer.EmitIntValue(Ty ? Ty->getOffset() : 0,
1610 sizeof(Ty->getOffset()));
David Blaikiebc563272013-12-13 21:33:40 +00001611}
1612
David Blaikiecafd9622014-11-02 08:51:37 +00001613bool DwarfTypeUnit::isDwoUnit() const {
1614 // Since there are no skeleton type units, all type units are dwo type units
1615 // when split DWARF is being used.
1616 return DD->useSplitDwarf();
1617}