blob: 65ec21c92f3d1de993c20887899b8259cc0d5b8d [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"
David Blaikie37c52312014-10-04 15:49:50 +000015
Chandler Carruthed0881b2012-12-03 16:50:05 +000016#include "DwarfAccelTable.h"
David Blaikie37c52312014-10-04 15:49:50 +000017#include "DwarfCompileUnit.h"
Devang Patel0e821f42011-04-12 23:21:44 +000018#include "DwarfDebug.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000019#include "llvm/ADT/APFloat.h"
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
David Blaikie2a80e442013-12-02 22:09:48 +000046/// Unit - Unit constructor.
David Blaikiebd579052014-04-28 21:14:27 +000047DwarfUnit::DwarfUnit(unsigned UID, dwarf::Tag UnitTag, DICompileUnit Node,
David Blaikie92a2f8a2014-04-28 21:04:29 +000048 AsmPrinter *A, DwarfDebug *DW, DwarfFile *DWU)
David Blaikiebd579052014-04-28 21:14:27 +000049 : UniqueID(UID), CUNode(Node), UnitDie(UnitTag), DebugInfoOffset(0), Asm(A),
50 DD(DW), DU(DWU), IndexTyDie(nullptr), Section(nullptr),
Craig Topper353eda42014-04-24 06:44:33 +000051 Skeleton(nullptr) {
David Blaikiebd579052014-04-28 21:14:27 +000052 assert(UnitTag == dwarf::DW_TAG_compile_unit ||
53 UnitTag == dwarf::DW_TAG_type_unit);
David Blaikie319a05f2013-12-02 19:33:10 +000054 DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
55}
56
David Blaikiebd579052014-04-28 21:14:27 +000057DwarfTypeUnit::DwarfTypeUnit(unsigned UID, DwarfCompileUnit &CU, AsmPrinter *A,
David Blaikie92a2f8a2014-04-28 21:04:29 +000058 DwarfDebug *DW, DwarfFile *DWU,
David Blaikie8287aff2014-03-18 02:13:23 +000059 MCDwarfDwoLineTable *SplitLineTable)
David Blaikiebd579052014-04-28 21:14:27 +000060 : DwarfUnit(UID, dwarf::DW_TAG_type_unit, CU.getCUNode(), A, DW, DWU),
61 CU(CU), SplitLineTable(SplitLineTable) {
David Blaikie4a2f95f2014-03-18 01:17:26 +000062 if (SplitLineTable)
David Blaikiebd579052014-04-28 21:14:27 +000063 addSectionOffset(UnitDie, dwarf::DW_AT_stmt_list, 0);
David Blaikie4a2f95f2014-03-18 01:17:26 +000064}
David Blaikie409dd9c2013-11-19 23:08:21 +000065
David Blaikie319a05f2013-12-02 19:33:10 +000066/// ~Unit - Destructor for compile unit.
Eric Christophera5a79422013-12-09 23:32:48 +000067DwarfUnit::~DwarfUnit() {
Devang Patel0e821f42011-04-12 23:21:44 +000068 for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
69 DIEBlocks[j]->~DIEBlock();
Eric Christopher4a741042014-02-16 08:46:55 +000070 for (unsigned j = 0, M = DIELocs.size(); j < M; ++j)
71 DIELocs[j]->~DIELoc();
Devang Patel0e821f42011-04-12 23:21:44 +000072}
73
74/// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
75/// information entry.
David Blaikie8dbcc3f2014-04-25 19:33:43 +000076DIEEntry *DwarfUnit::createDIEEntry(DIE &Entry) {
Devang Patel0e821f42011-04-12 23:21:44 +000077 DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
78 return Value;
79}
80
Bill Wendling3495f9b2012-12-06 07:55:19 +000081/// getDefaultLowerBound - Return the default lower bound for an array. If the
Bill Wendling28fe9e72012-12-06 07:38:10 +000082/// DWARF version doesn't handle the language, return -1.
Eric Christophera5a79422013-12-09 23:32:48 +000083int64_t DwarfUnit::getDefaultLowerBound() const {
David Blaikiecb8e4352013-11-15 23:50:53 +000084 switch (getLanguage()) {
Bill Wendling28fe9e72012-12-06 07:38:10 +000085 default:
86 break;
87
88 case dwarf::DW_LANG_C89:
89 case dwarf::DW_LANG_C99:
90 case dwarf::DW_LANG_C:
91 case dwarf::DW_LANG_C_plus_plus:
92 case dwarf::DW_LANG_ObjC:
93 case dwarf::DW_LANG_ObjC_plus_plus:
94 return 0;
95
96 case dwarf::DW_LANG_Fortran77:
97 case dwarf::DW_LANG_Fortran90:
98 case dwarf::DW_LANG_Fortran95:
99 return 1;
100
101 // The languages below have valid values only if the DWARF version >= 4.
102 case dwarf::DW_LANG_Java:
103 case dwarf::DW_LANG_Python:
104 case dwarf::DW_LANG_UPC:
105 case dwarf::DW_LANG_D:
106 if (dwarf::DWARF_VERSION >= 4)
107 return 0;
108 break;
109
110 case dwarf::DW_LANG_Ada83:
111 case dwarf::DW_LANG_Ada95:
112 case dwarf::DW_LANG_Cobol74:
113 case dwarf::DW_LANG_Cobol85:
114 case dwarf::DW_LANG_Modula2:
115 case dwarf::DW_LANG_Pascal83:
116 case dwarf::DW_LANG_PLI:
117 if (dwarf::DWARF_VERSION >= 4)
118 return 1;
119 break;
120 }
121
122 return -1;
123}
124
Manman Ren4dbdc902013-10-31 17:54:35 +0000125/// Check whether the DIE for this MDNode can be shared across CUs.
David Blaikie4201ddf2013-11-15 22:59:36 +0000126static bool isShareableAcrossCUs(DIDescriptor D) {
David Blaikiebcb418e2013-11-20 18:40:16 +0000127 // When the MDNode can be part of the type system, the DIE can be shared
128 // across CUs.
129 // Combining type units and cross-CU DIE sharing is lower value (since
130 // cross-CU DIE sharing is used in LTO and removes type redundancy at that
131 // level already) but may be implementable for some value in projects
132 // building multiple independent libraries with LTO and then linking those
133 // together.
David Blaikie409dd9c2013-11-19 23:08:21 +0000134 return (D.isType() ||
135 (D.isSubprogram() && !DISubprogram(D).isDefinition())) &&
Eric Christopher4287a492013-12-09 23:57:44 +0000136 !GenerateDwarfTypeUnits;
Manman Ren4dbdc902013-10-31 17:54:35 +0000137}
138
139/// getDIE - Returns the debug information entry map slot for the
140/// specified debug variable. We delegate the request to DwarfDebug
141/// when the DIE for this MDNode can be shared across CUs. The mappings
142/// will be kept in DwarfDebug for shareable DIEs.
Eric Christophera5a79422013-12-09 23:32:48 +0000143DIE *DwarfUnit::getDIE(DIDescriptor D) const {
David Blaikie2ad00162013-11-15 23:09:13 +0000144 if (isShareableAcrossCUs(D))
145 return DD->getDIE(D);
146 return MDNodeToDieMap.lookup(D);
Manman Ren4dbdc902013-10-31 17:54:35 +0000147}
148
149/// insertDIE - Insert DIE into the map. We delegate the request to DwarfDebug
150/// when the DIE for this MDNode can be shared across CUs. The mappings
151/// will be kept in DwarfDebug for shareable DIEs.
Eric Christophera5a79422013-12-09 23:32:48 +0000152void DwarfUnit::insertDIE(DIDescriptor Desc, DIE *D) {
David Blaikie2ad00162013-11-15 23:09:13 +0000153 if (isShareableAcrossCUs(Desc)) {
154 DD->insertDIE(Desc, D);
Manman Ren4dbdc902013-10-31 17:54:35 +0000155 return;
156 }
David Blaikie2ad00162013-11-15 23:09:13 +0000157 MDNodeToDieMap.insert(std::make_pair(Desc, D));
Manman Ren4dbdc902013-10-31 17:54:35 +0000158}
159
Eric Christopherbb69a272012-08-24 01:14:27 +0000160/// addFlag - Add a flag that is true.
David Blaikie65a74662014-04-25 18:26:14 +0000161void DwarfUnit::addFlag(DIE &Die, dwarf::Attribute Attribute) {
Michael Gottesmanc89466f2013-09-04 04:39:38 +0000162 if (DD->getDwarfVersion() >= 4)
David Blaikie65a74662014-04-25 18:26:14 +0000163 Die.addValue(Attribute, dwarf::DW_FORM_flag_present, DIEIntegerOne);
Eric Christopherbb69a272012-08-24 01:14:27 +0000164 else
David Blaikie65a74662014-04-25 18:26:14 +0000165 Die.addValue(Attribute, dwarf::DW_FORM_flag, DIEIntegerOne);
Eric Christopherbb69a272012-08-24 01:14:27 +0000166}
167
Devang Patel0e821f42011-04-12 23:21:44 +0000168/// addUInt - Add an unsigned integer attribute data and value.
169///
David Blaikie65a74662014-04-25 18:26:14 +0000170void DwarfUnit::addUInt(DIE &Die, dwarf::Attribute Attribute,
Eric Christophera5a79422013-12-09 23:32:48 +0000171 Optional<dwarf::Form> Form, uint64_t Integer) {
Eric Christopherc2697f82013-10-19 01:04:47 +0000172 if (!Form)
173 Form = DIEInteger::BestForm(false, Integer);
174 DIEValue *Value = Integer == 1 ? DIEIntegerOne : new (DIEValueAllocator)
175 DIEInteger(Integer);
David Blaikie65a74662014-04-25 18:26:14 +0000176 Die.addValue(Attribute, *Form, Value);
David Blaikief2443192013-10-21 17:28:37 +0000177}
178
David Blaikie65a74662014-04-25 18:26:14 +0000179void DwarfUnit::addUInt(DIE &Block, dwarf::Form Form, uint64_t Integer) {
David Blaikief2443192013-10-21 17:28:37 +0000180 addUInt(Block, (dwarf::Attribute)0, Form, Integer);
Devang Patel0e821f42011-04-12 23:21:44 +0000181}
182
183/// addSInt - Add an signed integer attribute data and value.
184///
David Blaikie65a74662014-04-25 18:26:14 +0000185void DwarfUnit::addSInt(DIE &Die, dwarf::Attribute Attribute,
Eric Christophera5a79422013-12-09 23:32:48 +0000186 Optional<dwarf::Form> Form, int64_t Integer) {
Eric Christopherc2697f82013-10-19 01:04:47 +0000187 if (!Form)
188 Form = DIEInteger::BestForm(true, Integer);
Devang Patel0e821f42011-04-12 23:21:44 +0000189 DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
David Blaikie65a74662014-04-25 18:26:14 +0000190 Die.addValue(Attribute, *Form, Value);
David Blaikief2443192013-10-21 17:28:37 +0000191}
192
David Blaikie65a74662014-04-25 18:26:14 +0000193void DwarfUnit::addSInt(DIELoc &Die, Optional<dwarf::Form> Form,
Eric Christophera5a79422013-12-09 23:32:48 +0000194 int64_t Integer) {
David Blaikief2443192013-10-21 17:28:37 +0000195 addSInt(Die, (dwarf::Attribute)0, Form, Integer);
Devang Patel0e821f42011-04-12 23:21:44 +0000196}
197
Nick Lewyckycc64ae12011-10-28 05:29:47 +0000198/// addString - Add a string attribute data and value. We always emit a
199/// reference to the string pool instead of immediate strings so that DIEs have
Eric Christopherfba22602013-01-07 19:32:45 +0000200/// more predictable sizes. In the case of split dwarf we emit an index
201/// into another table which gets us the static offset into the string
202/// table.
David Blaikie65a74662014-04-25 18:26:14 +0000203void DwarfUnit::addString(DIE &Die, dwarf::Attribute Attribute,
Eric Christophera5a79422013-12-09 23:32:48 +0000204 StringRef String) {
Eric Christopher05893f42013-12-30 18:32:31 +0000205
206 if (!DD->useSplitDwarf())
207 return addLocalString(Die, Attribute, String);
208
David Blaikiedaefdbf2014-04-25 21:34:35 +0000209 unsigned idx = DU->getStringPool().getIndex(*Asm, String);
Eric Christopher05893f42013-12-30 18:32:31 +0000210 DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx);
Eric Christopher67646432013-07-26 17:02:41 +0000211 DIEValue *Str = new (DIEValueAllocator) DIEString(Value, String);
David Blaikie65a74662014-04-25 18:26:14 +0000212 Die.addValue(Attribute, dwarf::DW_FORM_GNU_str_index, Str);
Eric Christopher2cbd5762013-01-07 19:32:41 +0000213}
214
215/// addLocalString - Add a string attribute data and value. This is guaranteed
216/// to be in the local string pool instead of indirected.
David Blaikie65a74662014-04-25 18:26:14 +0000217void DwarfUnit::addLocalString(DIE &Die, dwarf::Attribute Attribute,
Eric Christophera5a79422013-12-09 23:32:48 +0000218 StringRef String) {
David Blaikiedaefdbf2014-04-25 21:34:35 +0000219 MCSymbol *Symb = DU->getStringPool().getSymbol(*Asm, String);
Nick Lewyckycc64ae12011-10-28 05:29:47 +0000220 DIEValue *Value;
Eric Christopher84588622013-12-28 01:39:17 +0000221 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000222 Value = new (DIEValueAllocator) DIELabel(Symb);
David Blaikie6741bb02014-09-11 21:12:48 +0000223 else
224 Value = new (DIEValueAllocator) DIEDelta(Symb, DD->getDebugStrSym());
Eric Christopher05893f42013-12-30 18:32:31 +0000225 DIEValue *Str = new (DIEValueAllocator) DIEString(Value, String);
David Blaikie65a74662014-04-25 18:26:14 +0000226 Die.addValue(Attribute, dwarf::DW_FORM_strp, Str);
Devang Patel0e821f42011-04-12 23:21:44 +0000227}
228
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000229/// addExpr - Add a Dwarf expression attribute data and value.
Devang Patel0e821f42011-04-12 23:21:44 +0000230///
David Blaikie65a74662014-04-25 18:26:14 +0000231void DwarfUnit::addExpr(DIELoc &Die, dwarf::Form Form, const MCExpr *Expr) {
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000232 DIEValue *Value = new (DIEValueAllocator) DIEExpr(Expr);
David Blaikie65a74662014-04-25 18:26:14 +0000233 Die.addValue((dwarf::Attribute)0, Form, Value);
Devang Patel0e821f42011-04-12 23:21:44 +0000234}
235
Eric Christophera27220f2014-03-05 22:41:20 +0000236/// addLocationList - Add a Dwarf loclistptr attribute data and value.
237///
David Blaikie65a74662014-04-25 18:26:14 +0000238void DwarfUnit::addLocationList(DIE &Die, dwarf::Attribute Attribute,
Eric Christophera27220f2014-03-05 22:41:20 +0000239 unsigned Index) {
240 DIEValue *Value = new (DIEValueAllocator) DIELocList(Index);
241 dwarf::Form Form = DD->getDwarfVersion() >= 4 ? dwarf::DW_FORM_sec_offset
242 : dwarf::DW_FORM_data4;
David Blaikie65a74662014-04-25 18:26:14 +0000243 Die.addValue(Attribute, Form, Value);
Eric Christophera27220f2014-03-05 22:41:20 +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
Eric Christopher92331fd2012-11-21 00:34:38 +0000415/// addVariableAddress - Add DW_AT_location attribute for a
Devang Patel77dc5412011-04-27 22:45:24 +0000416/// DbgVariable based on provided MachineLocation.
David Blaikie65a74662014-04-25 18:26:14 +0000417void DwarfUnit::addVariableAddress(const DbgVariable &DV, DIE &Die,
Eric Christophera5a79422013-12-09 23:32:48 +0000418 MachineLocation Location) {
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000419 if (DV.variableHasComplexAddress())
Devang Patel0e821f42011-04-12 23:21:44 +0000420 addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000421 else if (DV.isBlockByrefVariable())
Devang Patel0e821f42011-04-12 23:21:44 +0000422 addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location);
423 else
David Blaikieea2605d2013-06-20 00:25:24 +0000424 addAddress(Die, dwarf::DW_AT_location, Location,
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000425 DV.getVariable().isIndirect());
Devang Patel0e821f42011-04-12 23:21:44 +0000426}
427
Devang Patelba5fbf12011-04-26 19:06:18 +0000428/// addRegisterOp - Add register operand.
Adrian Prantlb1416832014-08-01 22:11:58 +0000429// FIXME: Ideally, this would share the implementation with
430// AsmPrinter::EmitDwarfRegOpPiece.
431void DwarfUnit::addRegisterOpPiece(DIELoc &TheDie, unsigned Reg,
432 unsigned SizeInBits, unsigned OffsetInBits) {
Eric Christopherd9134482014-08-04 21:25:23 +0000433 const TargetRegisterInfo *RI = Asm->TM.getSubtargetImpl()->getRegisterInfo();
Adrian Prantlcbcd5782014-02-11 22:22:15 +0000434 int DWReg = RI->getDwarfRegNum(Reg, false);
435 bool isSubRegister = DWReg < 0;
436
437 unsigned Idx = 0;
438
439 // Go up the super-register chain until we hit a valid dwarf register number.
440 for (MCSuperRegIterator SR(Reg, RI); SR.isValid() && DWReg < 0; ++SR) {
441 DWReg = RI->getDwarfRegNum(*SR, false);
442 if (DWReg >= 0)
443 Idx = RI->getSubRegIndex(*SR, Reg);
444 }
445
446 if (DWReg < 0) {
Eric Christophera13839f2014-02-26 23:27:16 +0000447 DEBUG(dbgs() << "Invalid Dwarf register number.\n");
Adrian Prantlcbcd5782014-02-11 22:22:15 +0000448 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_nop);
449 return;
450 }
451
Adrian Prantlb1416832014-08-01 22:11:58 +0000452 // Emit register.
Devang Patelba5fbf12011-04-26 19:06:18 +0000453 if (DWReg < 32)
David Blaikief2443192013-10-21 17:28:37 +0000454 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + DWReg);
Devang Patelba5fbf12011-04-26 19:06:18 +0000455 else {
David Blaikief2443192013-10-21 17:28:37 +0000456 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
457 addUInt(TheDie, dwarf::DW_FORM_udata, DWReg);
Devang Patelba5fbf12011-04-26 19:06:18 +0000458 }
Adrian Prantlcbcd5782014-02-11 22:22:15 +0000459
Adrian Prantlb1416832014-08-01 22:11:58 +0000460 // Emit mask.
461 bool isPiece = SizeInBits > 0;
462 if (isSubRegister || isPiece) {
463 const unsigned SizeOfByte = 8;
464 unsigned RegSizeInBits = RI->getSubRegIdxSize(Idx);
465 unsigned RegOffsetInBits = RI->getSubRegIdxOffset(Idx);
466 unsigned PieceSizeInBits = std::max(SizeInBits, RegSizeInBits);
467 unsigned PieceOffsetInBits = OffsetInBits ? OffsetInBits : RegOffsetInBits;
468 assert(RegSizeInBits >= SizeInBits && "register smaller than value");
469
470 if (RegOffsetInBits != PieceOffsetInBits) {
471 // Manually shift the value into place, since the DW_OP_piece
472 // describes the part of the variable, not the position of the
473 // subregister.
474 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
475 addUInt(TheDie, dwarf::DW_FORM_data1, RegOffsetInBits);
476 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_shr);
477 }
478
479 if (PieceOffsetInBits > 0 || PieceSizeInBits % SizeOfByte) {
480 assert(PieceSizeInBits > 0 && "piece has zero size");
Adrian Prantlcbcd5782014-02-11 22:22:15 +0000481 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_bit_piece);
Adrian Prantlb1416832014-08-01 22:11:58 +0000482 addUInt(TheDie, dwarf::DW_FORM_data1, PieceSizeInBits);
483 addUInt(TheDie, dwarf::DW_FORM_data1, PieceOffsetInBits);
484 } else {
485 assert(PieceSizeInBits > 0 && "piece has zero size");
Adrian Prantlcbcd5782014-02-11 22:22:15 +0000486 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_piece);
Adrian Prantlb1416832014-08-01 22:11:58 +0000487 addUInt(TheDie, dwarf::DW_FORM_data1, PieceSizeInBits/SizeOfByte);
Adrian Prantlcbcd5782014-02-11 22:22:15 +0000488 }
489 }
Devang Patelba5fbf12011-04-26 19:06:18 +0000490}
491
492/// addRegisterOffset - Add register offset.
David Blaikie65a74662014-04-25 18:26:14 +0000493void DwarfUnit::addRegisterOffset(DIELoc &TheDie, unsigned Reg,
Eric Christophera5a79422013-12-09 23:32:48 +0000494 int64_t Offset) {
Eric Christopherd9134482014-08-04 21:25:23 +0000495 const TargetRegisterInfo *RI = Asm->TM.getSubtargetImpl()->getRegisterInfo();
Devang Patelba5fbf12011-04-26 19:06:18 +0000496 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
Eric Christopherd9134482014-08-04 21:25:23 +0000497 const TargetRegisterInfo *TRI = Asm->TM.getSubtargetImpl()->getRegisterInfo();
Devang Patelba5fbf12011-04-26 19:06:18 +0000498 if (Reg == TRI->getFrameRegister(*Asm->MF))
499 // If variable offset is based in frame register then use fbreg.
David Blaikief2443192013-10-21 17:28:37 +0000500 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
Devang Patelba5fbf12011-04-26 19:06:18 +0000501 else if (DWReg < 32)
David Blaikief2443192013-10-21 17:28:37 +0000502 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DWReg);
Devang Patelba5fbf12011-04-26 19:06:18 +0000503 else {
David Blaikief2443192013-10-21 17:28:37 +0000504 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
505 addUInt(TheDie, dwarf::DW_FORM_udata, DWReg);
Devang Patelba5fbf12011-04-26 19:06:18 +0000506 }
David Blaikief2443192013-10-21 17:28:37 +0000507 addSInt(TheDie, dwarf::DW_FORM_sdata, Offset);
Devang Patelba5fbf12011-04-26 19:06:18 +0000508}
509
510/// addAddress - Add an address attribute to a die based on the location
511/// provided.
David Blaikie65a74662014-04-25 18:26:14 +0000512void DwarfUnit::addAddress(DIE &Die, dwarf::Attribute Attribute,
Eric Christophera5a79422013-12-09 23:32:48 +0000513 const MachineLocation &Location, bool Indirect) {
Eric Christopher4a741042014-02-16 08:46:55 +0000514 DIELoc *Loc = new (DIEValueAllocator) DIELoc();
Devang Patelba5fbf12011-04-26 19:06:18 +0000515
David Blaikieea2605d2013-06-20 00:25:24 +0000516 if (Location.isReg() && !Indirect)
Adrian Prantlb1416832014-08-01 22:11:58 +0000517 addRegisterOpPiece(*Loc, Location.getReg());
David Blaikieea2605d2013-06-20 00:25:24 +0000518 else {
David Blaikie65a74662014-04-25 18:26:14 +0000519 addRegisterOffset(*Loc, Location.getReg(), Location.getOffset());
David Blaikieea2605d2013-06-20 00:25:24 +0000520 if (Indirect && !Location.isReg()) {
David Blaikie65a74662014-04-25 18:26:14 +0000521 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
David Blaikieea2605d2013-06-20 00:25:24 +0000522 }
523 }
Devang Patelba5fbf12011-04-26 19:06:18 +0000524
525 // Now attach the location information to the DIE.
Eric Christopher4a741042014-02-16 08:46:55 +0000526 addBlock(Die, Attribute, Loc);
Devang Patelba5fbf12011-04-26 19:06:18 +0000527}
528
Devang Patel0e821f42011-04-12 23:21:44 +0000529/// addComplexAddress - Start with the address based on the location provided,
530/// and generate the DWARF information necessary to find the actual variable
Eric Christopher1c70b672013-12-05 00:13:15 +0000531/// given the extra address information encoded in the DbgVariable, starting
532/// from the starting location. Add the DWARF information to the die.
Devang Patel0e821f42011-04-12 23:21:44 +0000533///
David Blaikie65a74662014-04-25 18:26:14 +0000534void DwarfUnit::addComplexAddress(const DbgVariable &DV, DIE &Die,
Eric Christophera5a79422013-12-09 23:32:48 +0000535 dwarf::Attribute Attribute,
536 const MachineLocation &Location) {
Eric Christopher4a741042014-02-16 08:46:55 +0000537 DIELoc *Loc = new (DIEValueAllocator) DIELoc();
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000538 unsigned N = DV.getNumAddrElements();
Devang Patel3e021532011-04-28 02:22:40 +0000539 unsigned i = 0;
540 if (Location.isReg()) {
Adrian Prantl87b7eb92014-10-01 18:55:02 +0000541 if (N >= 2 && DV.getAddrElement(0) == dwarf::DW_OP_plus) {
542 assert(!DV.getVariable().isIndirect() &&
543 "double indirection not handled");
Devang Patel3e021532011-04-28 02:22:40 +0000544 // If first address element is OpPlus then emit
545 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
David Blaikie65a74662014-04-25 18:26:14 +0000546 addRegisterOffset(*Loc, Location.getReg(), DV.getAddrElement(1));
Devang Patel3e021532011-04-28 02:22:40 +0000547 i = 2;
Adrian Prantl87b7eb92014-10-01 18:55:02 +0000548 } else if (N >= 2 && DV.getAddrElement(0) == dwarf::DW_OP_deref) {
549 assert(!DV.getVariable().isIndirect() &&
550 "double indirection not handled");
551 addRegisterOpPiece(*Loc, Location.getReg(),
552 DV.getExpression().getPieceSize(),
553 DV.getExpression().getPieceOffset());
554 i = 3;
Devang Patel3e021532011-04-28 02:22:40 +0000555 } else
Adrian Prantlb1416832014-08-01 22:11:58 +0000556 addRegisterOpPiece(*Loc, Location.getReg());
Eric Christopherc2697f82013-10-19 01:04:47 +0000557 } else
David Blaikie65a74662014-04-25 18:26:14 +0000558 addRegisterOffset(*Loc, Location.getReg(), Location.getOffset());
Devang Patel0e821f42011-04-12 23:21:44 +0000559
Eric Christopherc2697f82013-10-19 01:04:47 +0000560 for (; i < N; ++i) {
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000561 uint64_t Element = DV.getAddrElement(i);
Adrian Prantl87b7eb92014-10-01 18:55:02 +0000562 if (Element == dwarf::DW_OP_plus) {
David Blaikie65a74662014-04-25 18:26:14 +0000563 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
564 addUInt(*Loc, dwarf::DW_FORM_udata, DV.getAddrElement(++i));
Adrian Prantlb1416832014-08-01 22:11:58 +0000565
Adrian Prantl87b7eb92014-10-01 18:55:02 +0000566 } else if (Element == dwarf::DW_OP_deref) {
Eric Christopher4d250522012-05-08 18:56:00 +0000567 if (!Location.isReg())
David Blaikie65a74662014-04-25 18:26:14 +0000568 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Adrian Prantlb1416832014-08-01 22:11:58 +0000569
Adrian Prantl87b7eb92014-10-01 18:55:02 +0000570 } else if (Element == dwarf::DW_OP_piece) {
Adrian Prantlb1416832014-08-01 22:11:58 +0000571 const unsigned SizeOfByte = 8;
572 unsigned PieceOffsetInBits = DV.getAddrElement(++i)*SizeOfByte;
573 unsigned PieceSizeInBits = DV.getAddrElement(++i)*SizeOfByte;
574 // Emit DW_OP_bit_piece Size Offset.
575 assert(PieceSizeInBits > 0 && "piece has zero size");
576 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_bit_piece);
577 addUInt(*Loc, dwarf::DW_FORM_udata, PieceSizeInBits);
578 addUInt(*Loc, dwarf::DW_FORM_udata, PieceOffsetInBits);
579
Eric Christopherc2697f82013-10-19 01:04:47 +0000580 } else
581 llvm_unreachable("unknown DIBuilder Opcode");
Devang Patel0e821f42011-04-12 23:21:44 +0000582 }
583
584 // Now attach the location information to the DIE.
Eric Christopher4a741042014-02-16 08:46:55 +0000585 addBlock(Die, Attribute, Loc);
Devang Patel0e821f42011-04-12 23:21:44 +0000586}
587
588/* Byref variables, in Blocks, are declared by the programmer as "SomeType
589 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
590 gives the variable VarName either the struct, or a pointer to the struct, as
591 its type. This is necessary for various behind-the-scenes things the
592 compiler needs to do with by-reference variables in Blocks.
593
594 However, as far as the original *programmer* is concerned, the variable
595 should still have type 'SomeType', as originally declared.
596
597 The function getBlockByrefType dives into the __Block_byref_x_VarName
598 struct to find the original type of the variable, which is then assigned to
599 the variable's Debug Information Entry as its real type. So far, so good.
600 However now the debugger will expect the variable VarName to have the type
601 SomeType. So we need the location attribute for the variable to be an
602 expression that explains to the debugger how to navigate through the
603 pointers and struct to find the actual variable of type SomeType.
604
605 The following function does just that. We start by getting
606 the "normal" location for the variable. This will be the location
607 of either the struct __Block_byref_x_VarName or the pointer to the
608 struct __Block_byref_x_VarName.
609
610 The struct will look something like:
611
612 struct __Block_byref_x_VarName {
613 ... <various fields>
614 struct __Block_byref_x_VarName *forwarding;
615 ... <various other fields>
616 SomeType VarName;
617 ... <maybe more fields>
618 };
619
620 If we are given the struct directly (as our starting point) we
621 need to tell the debugger to:
622
623 1). Add the offset of the forwarding field.
624
625 2). Follow that pointer to get the real __Block_byref_x_VarName
626 struct to use (the real one may have been copied onto the heap).
627
628 3). Add the offset for the field VarName, to find the actual variable.
629
630 If we started with a pointer to the struct, then we need to
631 dereference that pointer first, before the other steps.
632 Translating this into DWARF ops, we will need to append the following
633 to the current location description for the variable:
634
635 DW_OP_deref -- optional, if we start with a pointer
636 DW_OP_plus_uconst <forward_fld_offset>
637 DW_OP_deref
638 DW_OP_plus_uconst <varName_fld_offset>
639
640 That is what this function does. */
641
642/// addBlockByrefAddress - Start with the address based on the location
643/// provided, and generate the DWARF information necessary to find the
644/// actual Block variable (navigating the Block struct) based on the
645/// starting location. Add the DWARF information to the die. For
646/// more information, read large comment just above here.
647///
David Blaikie65a74662014-04-25 18:26:14 +0000648void DwarfUnit::addBlockByrefAddress(const DbgVariable &DV, DIE &Die,
Eric Christophera5a79422013-12-09 23:32:48 +0000649 dwarf::Attribute Attribute,
650 const MachineLocation &Location) {
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000651 DIType Ty = DV.getType();
Devang Patel0e821f42011-04-12 23:21:44 +0000652 DIType TmpTy = Ty;
Eric Christopher31b05762013-08-08 01:41:00 +0000653 uint16_t Tag = Ty.getTag();
Devang Patel0e821f42011-04-12 23:21:44 +0000654 bool isPointer = false;
655
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000656 StringRef varName = DV.getName();
Devang Patel0e821f42011-04-12 23:21:44 +0000657
658 if (Tag == dwarf::DW_TAG_pointer_type) {
David Blaikie4f6bf27a2013-11-18 23:33:32 +0000659 DIDerivedType DTy(Ty);
Manman Ren93b30902013-10-08 18:42:58 +0000660 TmpTy = resolve(DTy.getTypeDerivedFrom());
Devang Patel0e821f42011-04-12 23:21:44 +0000661 isPointer = true;
662 }
663
David Blaikie4f6bf27a2013-11-18 23:33:32 +0000664 DICompositeType blockStruct(TmpTy);
Devang Patel0e821f42011-04-12 23:21:44 +0000665
666 // Find the __forwarding field and the variable field in the __Block_byref
667 // struct.
Manman Renab8ffba2014-07-28 19:14:13 +0000668 DIArray Fields = blockStruct.getElements();
David Blaikie4f6bf27a2013-11-18 23:33:32 +0000669 DIDerivedType varField;
670 DIDerivedType forwardingField;
Devang Patel0e821f42011-04-12 23:21:44 +0000671
672 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
David Blaikie4f6bf27a2013-11-18 23:33:32 +0000673 DIDerivedType DT(Fields.getElement(i));
Devang Patel0e821f42011-04-12 23:21:44 +0000674 StringRef fieldName = DT.getName();
675 if (fieldName == "__forwarding")
David Blaikie4f6bf27a2013-11-18 23:33:32 +0000676 forwardingField = DT;
Devang Patel0e821f42011-04-12 23:21:44 +0000677 else if (fieldName == varName)
David Blaikie4f6bf27a2013-11-18 23:33:32 +0000678 varField = DT;
Devang Patel0e821f42011-04-12 23:21:44 +0000679 }
680
681 // Get the offsets for the forwarding field and the variable field.
David Blaikie4f6bf27a2013-11-18 23:33:32 +0000682 unsigned forwardingFieldOffset = forwardingField.getOffsetInBits() >> 3;
683 unsigned varFieldOffset = varField.getOffsetInBits() >> 2;
Devang Patel0e821f42011-04-12 23:21:44 +0000684
685 // Decode the original location, and use that as the start of the byref
686 // variable's location.
Eric Christopher4a741042014-02-16 08:46:55 +0000687 DIELoc *Loc = new (DIEValueAllocator) DIELoc();
Devang Patel0e821f42011-04-12 23:21:44 +0000688
Eric Christopheref9d7102012-07-04 02:02:18 +0000689 if (Location.isReg())
Adrian Prantlb1416832014-08-01 22:11:58 +0000690 addRegisterOpPiece(*Loc, Location.getReg());
Eric Christopheref9d7102012-07-04 02:02:18 +0000691 else
David Blaikie65a74662014-04-25 18:26:14 +0000692 addRegisterOffset(*Loc, Location.getReg(), Location.getOffset());
Devang Patel0e821f42011-04-12 23:21:44 +0000693
694 // If we started with a pointer to the __Block_byref... struct, then
695 // the first thing we need to do is dereference the pointer (DW_OP_deref).
696 if (isPointer)
David Blaikie65a74662014-04-25 18:26:14 +0000697 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Devang Patel0e821f42011-04-12 23:21:44 +0000698
699 // Next add the offset for the '__forwarding' field:
700 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
701 // adding the offset if it's 0.
702 if (forwardingFieldOffset > 0) {
David Blaikie65a74662014-04-25 18:26:14 +0000703 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
704 addUInt(*Loc, dwarf::DW_FORM_udata, forwardingFieldOffset);
Devang Patel0e821f42011-04-12 23:21:44 +0000705 }
706
707 // Now dereference the __forwarding field to get to the real __Block_byref
708 // struct: DW_OP_deref.
David Blaikie65a74662014-04-25 18:26:14 +0000709 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Devang Patel0e821f42011-04-12 23:21:44 +0000710
711 // Now that we've got the real __Block_byref... struct, add the offset
712 // for the variable's field to get to the location of the actual variable:
713 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
714 if (varFieldOffset > 0) {
David Blaikie65a74662014-04-25 18:26:14 +0000715 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
716 addUInt(*Loc, dwarf::DW_FORM_udata, varFieldOffset);
Devang Patel0e821f42011-04-12 23:21:44 +0000717 }
718
719 // Now attach the location information to the DIE.
Eric Christopher4a741042014-02-16 08:46:55 +0000720 addBlock(Die, Attribute, Loc);
Devang Patel0e821f42011-04-12 23:21:44 +0000721}
722
Manman Renb3388602013-10-05 01:43:03 +0000723/// Return true if type encoding is unsigned.
724static bool isUnsignedDIType(DwarfDebug *DD, DIType Ty) {
725 DIDerivedType DTy(Ty);
David Blaikiee0f14742014-05-11 17:04:05 +0000726 if (DTy.isDerivedType()) {
David Blaikie2af1c802014-05-20 18:21:51 +0000727 dwarf::Tag T = (dwarf::Tag)Ty.getTag();
728 // Encode pointer constants as unsigned bytes. This is used at least for
David Blaikie93ef46b2014-05-20 21:40:13 +0000729 // null pointer constant emission.
730 // FIXME: reference and rvalue_reference /probably/ shouldn't be allowed
731 // here, but accept them for now due to a bug in SROA producing bogus
732 // dbg.values.
David Blaikie2af1c802014-05-20 18:21:51 +0000733 if (T == dwarf::DW_TAG_pointer_type ||
David Blaikie93ef46b2014-05-20 21:40:13 +0000734 T == dwarf::DW_TAG_ptr_to_member_type ||
735 T == dwarf::DW_TAG_reference_type ||
736 T == dwarf::DW_TAG_rvalue_reference_type)
David Blaikie2af1c802014-05-20 18:21:51 +0000737 return true;
738 assert(T == dwarf::DW_TAG_typedef || T == dwarf::DW_TAG_const_type ||
739 T == dwarf::DW_TAG_volatile_type ||
David Blaikie1d9aec62014-05-20 18:36:35 +0000740 T == dwarf::DW_TAG_restrict_type ||
741 T == dwarf::DW_TAG_enumeration_type);
David Blaikie2af1c802014-05-20 18:21:51 +0000742 if (DITypeRef Deriv = DTy.getTypeDerivedFrom())
743 return isUnsignedDIType(DD, DD->resolve(Deriv));
David Blaikiee0f14742014-05-11 17:04:05 +0000744 // FIXME: Enums without a fixed underlying type have unknown signedness
745 // here, leading to incorrectly emitted constants.
746 assert(DTy.getTag() == dwarf::DW_TAG_enumeration_type);
747 return false;
748 }
Manman Renb3388602013-10-05 01:43:03 +0000749
750 DIBasicType BTy(Ty);
David Blaikiee0f14742014-05-11 17:04:05 +0000751 assert(BTy.isBasicType());
David Blaikie60cae1b2014-05-11 16:08:41 +0000752 unsigned Encoding = BTy.getEncoding();
Saleem Abdulrasoolfba09d42014-05-12 06:08:18 +0000753 assert((Encoding == dwarf::DW_ATE_unsigned ||
754 Encoding == dwarf::DW_ATE_unsigned_char ||
755 Encoding == dwarf::DW_ATE_signed ||
756 Encoding == dwarf::DW_ATE_signed_char ||
David Blaikiec405c9c2014-05-16 21:53:09 +0000757 Encoding == dwarf::DW_ATE_UTF || Encoding == dwarf::DW_ATE_boolean) &&
758 "Unsupported encoding");
David Blaikie60cae1b2014-05-11 16:08:41 +0000759 return (Encoding == dwarf::DW_ATE_unsigned ||
760 Encoding == dwarf::DW_ATE_unsigned_char ||
David Blaikiec405c9c2014-05-16 21:53:09 +0000761 Encoding == dwarf::DW_ATE_UTF || Encoding == dwarf::DW_ATE_boolean);
Manman Renb3388602013-10-05 01:43:03 +0000762}
763
764/// If this type is derived from a base type then return base type size.
Manman Renbda410f2013-10-08 18:46:58 +0000765static uint64_t getBaseTypeSize(DwarfDebug *DD, DIDerivedType Ty) {
Manman Renb3388602013-10-05 01:43:03 +0000766 unsigned Tag = Ty.getTag();
767
768 if (Tag != dwarf::DW_TAG_member && Tag != dwarf::DW_TAG_typedef &&
769 Tag != dwarf::DW_TAG_const_type && Tag != dwarf::DW_TAG_volatile_type &&
770 Tag != dwarf::DW_TAG_restrict_type)
771 return Ty.getSizeInBits();
772
773 DIType BaseType = DD->resolve(Ty.getTypeDerivedFrom());
774
Eric Christopher8cc04fc2014-03-12 18:18:05 +0000775 // If this type is not derived from any type or the type is a declaration then
776 // take conservative approach.
777 if (!BaseType.isValid() || BaseType.isForwardDecl())
Manman Renb3388602013-10-05 01:43:03 +0000778 return Ty.getSizeInBits();
779
780 // If this is a derived type, go ahead and get the base type, unless it's a
781 // reference then it's just the size of the field. Pointer types have no need
782 // of this since they're a different type of qualification on the type.
783 if (BaseType.getTag() == dwarf::DW_TAG_reference_type ||
784 BaseType.getTag() == dwarf::DW_TAG_rvalue_reference_type)
785 return Ty.getSizeInBits();
786
787 if (BaseType.isDerivedType())
Manman Renbda410f2013-10-08 18:46:58 +0000788 return getBaseTypeSize(DD, DIDerivedType(BaseType));
Manman Renb3388602013-10-05 01:43:03 +0000789
790 return BaseType.getSizeInBits();
791}
792
Devang Patel0e821f42011-04-12 23:21:44 +0000793/// addConstantFPValue - Add constant value entry in variable DIE.
David Blaikie65a74662014-04-25 18:26:14 +0000794void DwarfUnit::addConstantFPValue(DIE &Die, const MachineOperand &MO) {
Eric Christopherc2697f82013-10-19 01:04:47 +0000795 assert(MO.isFPImm() && "Invalid machine operand!");
Devang Patel0e821f42011-04-12 23:21:44 +0000796 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
797 APFloat FPImm = MO.getFPImm()->getValueAPF();
798
799 // Get the raw data form of the floating point.
800 const APInt FltVal = FPImm.bitcastToAPInt();
Eric Christopherc2697f82013-10-19 01:04:47 +0000801 const char *FltPtr = (const char *)FltVal.getRawData();
Devang Patel0e821f42011-04-12 23:21:44 +0000802
803 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
Micah Villmowcdfe20b2012-10-08 16:38:25 +0000804 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel0e821f42011-04-12 23:21:44 +0000805 int Incr = (LittleEndian ? 1 : -1);
806 int Start = (LittleEndian ? 0 : NumBytes - 1);
807 int Stop = (LittleEndian ? NumBytes : -1);
808
809 // Output the constant to DWARF one byte at a time.
810 for (; Start != Stop; Start += Incr)
David Blaikie65a74662014-04-25 18:26:14 +0000811 addUInt(*Block, dwarf::DW_FORM_data1, (unsigned char)0xFF & FltPtr[Start]);
Devang Patel0e821f42011-04-12 23:21:44 +0000812
David Blaikief2443192013-10-21 17:28:37 +0000813 addBlock(Die, dwarf::DW_AT_const_value, Block);
Devang Patel0e821f42011-04-12 23:21:44 +0000814}
815
David Blaikiea39a76e2013-01-20 01:18:01 +0000816/// addConstantFPValue - Add constant value entry in variable DIE.
David Blaikie65a74662014-04-25 18:26:14 +0000817void DwarfUnit::addConstantFPValue(DIE &Die, const ConstantFP *CFP) {
Eric Christopher9d1daa82013-08-27 23:49:04 +0000818 // Pass this down to addConstantValue as an unsigned bag of bits.
819 addConstantValue(Die, CFP->getValueAPF().bitcastToAPInt(), true);
David Blaikiea39a76e2013-01-20 01:18:01 +0000820}
821
Devang Patel0e821f42011-04-12 23:21:44 +0000822/// addConstantValue - Add constant value entry in variable DIE.
David Blaikiec0a28412014-05-11 15:56:59 +0000823void DwarfUnit::addConstantValue(DIE &Die, const ConstantInt *CI, DIType Ty) {
824 addConstantValue(Die, CI->getValue(), Ty);
David Blaikiea39a76e2013-01-20 01:18:01 +0000825}
826
David Blaikiec05c8f42014-05-11 15:47:39 +0000827/// addConstantValue - Add constant value entry in variable DIE.
828void DwarfUnit::addConstantValue(DIE &Die, const MachineOperand &MO,
829 DIType Ty) {
830 assert(MO.isImm() && "Invalid machine operand!");
831
David Blaikie60cae1b2014-05-11 16:08:41 +0000832 addConstantValue(Die, isUnsignedDIType(DD, Ty), MO.getImm());
David Blaikiec05c8f42014-05-11 15:47:39 +0000833}
834
David Blaikie60cae1b2014-05-11 16:08:41 +0000835void DwarfUnit::addConstantValue(DIE &Die, bool Unsigned, uint64_t Val) {
David Blaikiec05c8f42014-05-11 15:47:39 +0000836 // FIXME: This is a bit conservative/simple - it emits negative values always
837 // sign extended to 64 bits rather than minimizing the number of bytes.
838 addUInt(Die, dwarf::DW_AT_const_value,
David Blaikie60cae1b2014-05-11 16:08:41 +0000839 Unsigned ? dwarf::DW_FORM_udata : dwarf::DW_FORM_sdata, Val);
David Blaikiec05c8f42014-05-11 15:47:39 +0000840}
841
David Blaikiec0a28412014-05-11 15:56:59 +0000842void DwarfUnit::addConstantValue(DIE &Die, const APInt &Val, DIType Ty) {
843 addConstantValue(Die, Val, isUnsignedDIType(DD, Ty));
844}
845
David Blaikiea39a76e2013-01-20 01:18:01 +0000846// addConstantValue - Add constant value entry in variable DIE.
David Blaikie65a74662014-04-25 18:26:14 +0000847void DwarfUnit::addConstantValue(DIE &Die, const APInt &Val, bool Unsigned) {
David Blaikiea39a76e2013-01-20 01:18:01 +0000848 unsigned CIBitWidth = Val.getBitWidth();
Devang Patel8816bbc2011-05-28 00:39:18 +0000849 if (CIBitWidth <= 64) {
David Blaikie60cae1b2014-05-11 16:08:41 +0000850 addConstantValue(Die, Unsigned,
851 Unsigned ? Val.getZExtValue() : Val.getSExtValue());
Eric Christopher78fcf4902013-07-03 01:08:30 +0000852 return;
Devang Patel0e821f42011-04-12 23:21:44 +0000853 }
854
855 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
856
857 // Get the raw data form of the large APInt.
NAKAMURA Takumi29ccdd82011-10-28 14:12:22 +0000858 const uint64_t *Ptr64 = Val.getRawData();
Devang Patel0e821f42011-04-12 23:21:44 +0000859
860 int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
Micah Villmowcdfe20b2012-10-08 16:38:25 +0000861 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel0e821f42011-04-12 23:21:44 +0000862
863 // Output the constant to DWARF one byte at a time.
NAKAMURA Takumi29ccdd82011-10-28 14:12:22 +0000864 for (int i = 0; i < NumBytes; i++) {
865 uint8_t c;
866 if (LittleEndian)
867 c = Ptr64[i / 8] >> (8 * (i & 7));
868 else
869 c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7));
David Blaikie65a74662014-04-25 18:26:14 +0000870 addUInt(*Block, dwarf::DW_FORM_data1, c);
NAKAMURA Takumi29ccdd82011-10-28 14:12:22 +0000871 }
Devang Patel0e821f42011-04-12 23:21:44 +0000872
David Blaikief2443192013-10-21 17:28:37 +0000873 addBlock(Die, dwarf::DW_AT_const_value, Block);
Devang Patel0e821f42011-04-12 23:21:44 +0000874}
875
Eric Christopher25e35092013-04-22 07:47:40 +0000876/// addTemplateParams - Add template parameters into buffer.
Eric Christophera5a79422013-12-09 23:32:48 +0000877void DwarfUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
Devang Patel0e821f42011-04-12 23:21:44 +0000878 // Add template parameters.
879 for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) {
880 DIDescriptor Element = TParams.getElement(i);
881 if (Element.isTemplateTypeParameter())
Manman Renffc9a712013-10-23 23:05:28 +0000882 constructTemplateTypeParameterDIE(Buffer,
883 DITemplateTypeParameter(Element));
Devang Patel0e821f42011-04-12 23:21:44 +0000884 else if (Element.isTemplateValueParameter())
Manman Renffc9a712013-10-23 23:05:28 +0000885 constructTemplateValueParameterDIE(Buffer,
886 DITemplateValueParameter(Element));
Devang Patel0e821f42011-04-12 23:21:44 +0000887 }
Devang Patel0e821f42011-04-12 23:21:44 +0000888}
Nick Lewycky654f5ce2011-10-26 22:55:33 +0000889
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000890/// getOrCreateContextDIE - Get context owner's DIE.
Eric Christophera5a79422013-12-09 23:32:48 +0000891DIE *DwarfUnit::getOrCreateContextDIE(DIScope Context) {
David Blaikiebd700e42013-11-14 21:24:34 +0000892 if (!Context || Context.isFile())
David Blaikieadcde362014-04-25 18:35:57 +0000893 return &getUnitDie();
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000894 if (Context.isType())
895 return getOrCreateTypeDIE(DIType(Context));
David Blaikie1dbca702013-11-14 19:37:56 +0000896 if (Context.isNameSpace())
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000897 return getOrCreateNameSpace(DINameSpace(Context));
David Blaikie1dbca702013-11-14 19:37:56 +0000898 if (Context.isSubprogram())
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000899 return getOrCreateSubprogramDIE(DISubprogram(Context));
Adrian Prantl7d828bb2013-11-15 21:05:09 +0000900 return getDIE(Context);
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000901}
902
Eric Christophera5a79422013-12-09 23:32:48 +0000903DIE *DwarfUnit::createTypeDIE(DICompositeType Ty) {
David Blaikie9d861be2013-11-26 00:15:27 +0000904 DIScope Context = resolve(Ty.getContext());
905 DIE *ContextDIE = getOrCreateContextDIE(Context);
David Blaikie409dd9c2013-11-19 23:08:21 +0000906
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000907 if (DIE *TyDIE = getDIE(Ty))
David Blaikie409dd9c2013-11-19 23:08:21 +0000908 return TyDIE;
909
910 // Create new type.
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000911 DIE &TyDIE = createAndAddDIE(Ty.getTag(), *ContextDIE, Ty);
David Blaikie409dd9c2013-11-19 23:08:21 +0000912
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000913 constructTypeDIE(TyDIE, Ty);
David Blaikie409dd9c2013-11-19 23:08:21 +0000914
David Blaikie9d861be2013-11-26 00:15:27 +0000915 updateAcceleratorTables(Context, Ty, TyDIE);
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000916 return &TyDIE;
David Blaikie409dd9c2013-11-19 23:08:21 +0000917}
918
Devang Patel0e821f42011-04-12 23:21:44 +0000919/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
920/// given DIType.
Eric Christophera5a79422013-12-09 23:32:48 +0000921DIE *DwarfUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
David Blaikie32887552013-11-14 22:25:02 +0000922 if (!TyNode)
Craig Topper353eda42014-04-24 06:44:33 +0000923 return nullptr;
Manman Renf4c339e2013-10-29 22:49:29 +0000924
David Blaikie32887552013-11-14 22:25:02 +0000925 DIType Ty(TyNode);
926 assert(Ty.isType());
Adrian Prantlc95ec912014-03-24 21:33:01 +0000927 assert(Ty == resolve(Ty.getRef()) &&
Adrian Prantl0aa1aa22014-03-18 02:35:03 +0000928 "type was not uniqued, possible ODR violation.");
David Blaikie32887552013-11-14 22:25:02 +0000929
David Blaikieee11f222014-04-12 05:35:59 +0000930 // DW_TAG_restrict_type is not supported in DWARF2
931 if (Ty.getTag() == dwarf::DW_TAG_restrict_type && DD->getDwarfVersion() <= 2)
932 return getOrCreateTypeDIE(resolve(DIDerivedType(Ty).getTypeDerivedFrom()));
933
Manman Renf4c339e2013-10-29 22:49:29 +0000934 // Construct the context before querying for the existence of the DIE in case
935 // such construction creates the DIE.
David Blaikie9d861be2013-11-26 00:15:27 +0000936 DIScope Context = resolve(Ty.getContext());
937 DIE *ContextDIE = getOrCreateContextDIE(Context);
Adrian Prantl4583f7d2013-11-15 23:21:39 +0000938 assert(ContextDIE);
Manman Renf4c339e2013-10-29 22:49:29 +0000939
David Blaikie65a74662014-04-25 18:26:14 +0000940 if (DIE *TyDIE = getDIE(Ty))
Devang Patel0e821f42011-04-12 23:21:44 +0000941 return TyDIE;
942
943 // Create new type.
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000944 DIE &TyDIE = createAndAddDIE(Ty.getTag(), *ContextDIE, Ty);
Manman Renf4c339e2013-10-29 22:49:29 +0000945
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000946 updateAcceleratorTables(Context, Ty, TyDIE);
David Blaikiec3d9e9e2014-03-06 01:42:00 +0000947
Devang Patel0e821f42011-04-12 23:21:44 +0000948 if (Ty.isBasicType())
David Blaikie65a74662014-04-25 18:26:14 +0000949 constructTypeDIE(TyDIE, DIBasicType(Ty));
David Blaikie8a263cb2013-11-26 00:22:37 +0000950 else if (Ty.isCompositeType()) {
951 DICompositeType CTy(Ty);
David Blaikiecfb21152014-01-03 18:59:42 +0000952 if (GenerateDwarfTypeUnits && !Ty.isForwardDecl())
953 if (MDString *TypeId = CTy.getIdentifier()) {
David Blaikie15632ae2014-02-12 00:31:30 +0000954 DD->addDwarfTypeUnitType(getCU(), TypeId->getString(), TyDIE, CTy);
Adrian Prantle2da17f2014-03-14 23:08:17 +0000955 // Skip updating the accelerator tables since this is not the full type.
David Blaikie65a74662014-04-25 18:26:14 +0000956 return &TyDIE;
David Blaikiecfb21152014-01-03 18:59:42 +0000957 }
David Blaikie65a74662014-04-25 18:26:14 +0000958 constructTypeDIE(TyDIE, CTy);
David Blaikie8a263cb2013-11-26 00:22:37 +0000959 } else {
Devang Patel0e821f42011-04-12 23:21:44 +0000960 assert(Ty.isDerivedType() && "Unknown kind of DIType");
David Blaikie65a74662014-04-25 18:26:14 +0000961 constructTypeDIE(TyDIE, DIDerivedType(Ty));
Devang Patel0e821f42011-04-12 23:21:44 +0000962 }
David Blaikie2ea848b2013-11-19 22:51:04 +0000963
David Blaikie65a74662014-04-25 18:26:14 +0000964 return &TyDIE;
David Blaikie2ea848b2013-11-19 22:51:04 +0000965}
966
Eric Christophera5a79422013-12-09 23:32:48 +0000967void DwarfUnit::updateAcceleratorTables(DIScope Context, DIType Ty,
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000968 const DIE &TyDIE) {
Eric Christopher21bde872012-01-06 04:35:23 +0000969 if (!Ty.getName().empty() && !Ty.isForwardDecl()) {
970 bool IsImplementation = 0;
971 if (Ty.isCompositeType()) {
972 DICompositeType CT(Ty);
Eric Christopher8ea8e4f2012-01-06 23:03:37 +0000973 // A runtime language of 0 actually means C/C++ and that any
974 // non-negative value is some version of Objective-C/C++.
Eric Christopherc2697f82013-10-19 01:04:47 +0000975 IsImplementation = (CT.getRunTimeLang() == 0) || CT.isObjcClassComplete();
Eric Christopher21bde872012-01-06 04:35:23 +0000976 }
Eric Christophercf7289f2013-09-05 18:20:16 +0000977 unsigned Flags = IsImplementation ? dwarf::DW_FLAG_type_implementation : 0;
David Blaikie18d33752014-04-24 01:23:49 +0000978 DD->addAccelType(Ty.getName(), TyDIE, Flags);
David Blaikie9d861be2013-11-26 00:15:27 +0000979
David Blaikieadbea1e2014-03-12 03:34:38 +0000980 if ((!Context || Context.isCompileUnit() || Context.isFile() ||
981 Context.isNameSpace()) &&
982 getCUNode().getEmissionKind() != DIBuilder::LineTablesOnly)
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000983 GlobalTypes[getParentContextString(Context) + Ty.getName().str()] =
984 &TyDIE;
Eric Christopher21bde872012-01-06 04:35:23 +0000985 }
Devang Patel0e821f42011-04-12 23:21:44 +0000986}
987
988/// addType - Add a new type attribute to the specified entity.
David Blaikie65a74662014-04-25 18:26:14 +0000989void DwarfUnit::addType(DIE &Entity, DIType Ty, dwarf::Attribute Attribute) {
Eric Christopher0df08e22013-08-08 07:40:37 +0000990 assert(Ty && "Trying to add a type that doesn't exist?");
Devang Patel0e821f42011-04-12 23:21:44 +0000991
992 // Check for pre-existence.
993 DIEEntry *Entry = getDIEEntry(Ty);
994 // If it exists then use the existing value.
995 if (Entry) {
Manman Ren4dbdc902013-10-31 17:54:35 +0000996 addDIEEntry(Entity, Attribute, Entry);
Devang Patel0e821f42011-04-12 23:21:44 +0000997 return;
998 }
999
1000 // Construct type.
1001 DIE *Buffer = getOrCreateTypeDIE(Ty);
1002
1003 // Set up proxy.
David Blaikie8dbcc3f2014-04-25 19:33:43 +00001004 Entry = createDIEEntry(*Buffer);
Devang Patel0e821f42011-04-12 23:21:44 +00001005 insertDIEEntry(Ty, Entry);
Manman Ren4dbdc902013-10-31 17:54:35 +00001006 addDIEEntry(Entity, Attribute, Entry);
Devang Patel1cb8ab42011-05-31 23:30:30 +00001007}
1008
Eric Christopher9c58f312013-09-20 22:20:55 +00001009/// addGlobalName - Add a new global name to the compile unit.
David Blaikie65a74662014-04-25 18:26:14 +00001010void DwarfUnit::addGlobalName(StringRef Name, DIE &Die, DIScope Context) {
David Blaikieadbea1e2014-03-12 03:34:38 +00001011 if (getCUNode().getEmissionKind() == DIBuilder::LineTablesOnly)
1012 return;
Eric Christopher8dba0d52013-10-19 01:04:42 +00001013 std::string FullName = getParentContextString(Context) + Name.str();
David Blaikie65a74662014-04-25 18:26:14 +00001014 GlobalNames[FullName] = &Die;
Eric Christopher9c58f312013-09-20 22:20:55 +00001015}
1016
Eric Christopher2c8b7902013-10-17 02:06:06 +00001017/// getParentContextString - Walks the metadata parent chain in a language
1018/// specific manner (using the compile unit language) and returns
1019/// it as a string. This is done at the metadata level because DIEs may
1020/// not currently have been added to the parent context and walking the
1021/// DIEs looking for names is more expensive than walking the metadata.
Eric Christophera5a79422013-12-09 23:32:48 +00001022std::string DwarfUnit::getParentContextString(DIScope Context) const {
Eric Christopher2c8b7902013-10-17 02:06:06 +00001023 if (!Context)
1024 return "";
1025
1026 // FIXME: Decide whether to implement this for non-C++ languages.
1027 if (getLanguage() != dwarf::DW_LANG_C_plus_plus)
1028 return "";
1029
Eric Christopher8dba0d52013-10-19 01:04:42 +00001030 std::string CS;
Eric Christopher2c8b7902013-10-17 02:06:06 +00001031 SmallVector<DIScope, 1> Parents;
1032 while (!Context.isCompileUnit()) {
1033 Parents.push_back(Context);
1034 if (Context.getContext())
1035 Context = resolve(Context.getContext());
1036 else
1037 // Structure, etc types will have a NULL context if they're at the top
1038 // level.
1039 break;
1040 }
1041
1042 // Reverse iterate over our list to go from the outermost construct to the
1043 // innermost.
1044 for (SmallVectorImpl<DIScope>::reverse_iterator I = Parents.rbegin(),
1045 E = Parents.rend();
1046 I != E; ++I) {
1047 DIScope Ctx = *I;
1048 StringRef Name = Ctx.getName();
David Blaikie553eb4a2014-06-06 22:16:56 +00001049 if (Name.empty() && Ctx.isNameSpace())
1050 Name = "(anonymous namespace)";
Eric Christopher8dba0d52013-10-19 01:04:42 +00001051 if (!Name.empty()) {
Eric Christopher2c8b7902013-10-17 02:06:06 +00001052 CS += Name;
1053 CS += "::";
1054 }
1055 }
1056 return CS;
Devang Patel0e821f42011-04-12 23:21:44 +00001057}
1058
1059/// constructTypeDIE - Construct basic type die from DIBasicType.
Eric Christophera5a79422013-12-09 23:32:48 +00001060void DwarfUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
Devang Patel0e821f42011-04-12 23:21:44 +00001061 // Get core information.
1062 StringRef Name = BTy.getName();
Devang Patel0e821f42011-04-12 23:21:44 +00001063 // Add name if not anonymous or intermediate type.
1064 if (!Name.empty())
David Blaikie65a74662014-04-25 18:26:14 +00001065 addString(Buffer, dwarf::DW_AT_name, Name);
Devang Patel04d6d472011-09-14 23:13:28 +00001066
David Blaikiefac56122013-10-04 23:21:16 +00001067 // An unspecified type only has a name attribute.
1068 if (BTy.getTag() == dwarf::DW_TAG_unspecified_type)
Devang Patel04d6d472011-09-14 23:13:28 +00001069 return;
Devang Patel04d6d472011-09-14 23:13:28 +00001070
David Blaikie65a74662014-04-25 18:26:14 +00001071 addUInt(Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
Devang Pateld925d1a2012-02-07 23:33:58 +00001072 BTy.getEncoding());
Devang Patel04d6d472011-09-14 23:13:28 +00001073
Devang Patel0e821f42011-04-12 23:21:44 +00001074 uint64_t Size = BTy.getSizeInBits() >> 3;
David Blaikie65a74662014-04-25 18:26:14 +00001075 addUInt(Buffer, dwarf::DW_AT_byte_size, None, Size);
Devang Patel0e821f42011-04-12 23:21:44 +00001076}
1077
1078/// constructTypeDIE - Construct derived type die from DIDerivedType.
Eric Christophera5a79422013-12-09 23:32:48 +00001079void DwarfUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
Devang Patel0e821f42011-04-12 23:21:44 +00001080 // Get core information.
1081 StringRef Name = DTy.getName();
1082 uint64_t Size = DTy.getSizeInBits() >> 3;
David Blaikiefac56122013-10-04 23:21:16 +00001083 uint16_t Tag = Buffer.getTag();
Devang Patel0e821f42011-04-12 23:21:44 +00001084
1085 // Map to main type, void will not have a type.
Manman Ren93b30902013-10-08 18:42:58 +00001086 DIType FromTy = resolve(DTy.getTypeDerivedFrom());
Eric Christopher0df08e22013-08-08 07:40:37 +00001087 if (FromTy)
David Blaikie65a74662014-04-25 18:26:14 +00001088 addType(Buffer, FromTy);
Devang Patel0e821f42011-04-12 23:21:44 +00001089
1090 // Add name if not anonymous or intermediate type.
1091 if (!Name.empty())
David Blaikie65a74662014-04-25 18:26:14 +00001092 addString(Buffer, dwarf::DW_AT_name, Name);
Devang Patel0e821f42011-04-12 23:21:44 +00001093
1094 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopher85757902012-02-21 22:25:53 +00001095 if (Size && Tag != dwarf::DW_TAG_pointer_type)
David Blaikie65a74662014-04-25 18:26:14 +00001096 addUInt(Buffer, dwarf::DW_AT_byte_size, None, Size);
Devang Patel0e821f42011-04-12 23:21:44 +00001097
David Blaikie5d3249b2013-01-07 05:51:15 +00001098 if (Tag == dwarf::DW_TAG_ptr_to_member_type)
David Blaikie65a74662014-04-25 18:26:14 +00001099 addDIEEntry(Buffer, dwarf::DW_AT_containing_type,
David Blaikie8dbcc3f2014-04-25 19:33:43 +00001100 *getOrCreateTypeDIE(resolve(DTy.getClassType())));
Devang Patel0e821f42011-04-12 23:21:44 +00001101 // Add source line info if available and TyDesc is not a forward declaration.
1102 if (!DTy.isForwardDecl())
David Blaikie65a74662014-04-25 18:26:14 +00001103 addSourceLine(Buffer, DTy);
Devang Patel0e821f42011-04-12 23:21:44 +00001104}
1105
Adrian Prantl3f49c892014-02-25 19:57:42 +00001106/// constructSubprogramArguments - Construct function argument DIEs.
Manman Renf8a19672014-07-28 22:24:06 +00001107void DwarfUnit::constructSubprogramArguments(DIE &Buffer, DITypeArray Args) {
Adrian Prantl69140d22014-02-25 22:27:14 +00001108 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
Manman Renf8a19672014-07-28 22:24:06 +00001109 DIType Ty = resolve(Args.getElement(i));
Manman Renf93ac4b2014-07-29 18:20:39 +00001110 if (!Ty) {
Adrian Prantl69140d22014-02-25 22:27:14 +00001111 assert(i == N-1 && "Unspecified parameter must be the last argument");
1112 createAndAddDIE(dwarf::DW_TAG_unspecified_parameters, Buffer);
1113 } else {
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001114 DIE &Arg = createAndAddDIE(dwarf::DW_TAG_formal_parameter, Buffer);
David Blaikiedf1cca32014-10-26 23:37:04 +00001115 addType(Arg, Ty);
1116 if (Ty.isArtificial())
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001117 addFlag(Arg, dwarf::DW_AT_artificial);
Adrian Prantl3f49c892014-02-25 19:57:42 +00001118 }
Adrian Prantl69140d22014-02-25 22:27:14 +00001119 }
Adrian Prantl3f49c892014-02-25 19:57:42 +00001120}
1121
Devang Patel0e821f42011-04-12 23:21:44 +00001122/// constructTypeDIE - Construct type DIE from DICompositeType.
Eric Christophera5a79422013-12-09 23:32:48 +00001123void DwarfUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
David Blaikie409dd9c2013-11-19 23:08:21 +00001124 // Add name if not anonymous or intermediate type.
Devang Patel0e821f42011-04-12 23:21:44 +00001125 StringRef Name = CTy.getName();
1126
1127 uint64_t Size = CTy.getSizeInBits() >> 3;
David Blaikiefac56122013-10-04 23:21:16 +00001128 uint16_t Tag = Buffer.getTag();
Devang Patel0e821f42011-04-12 23:21:44 +00001129
1130 switch (Tag) {
Devang Patel0e821f42011-04-12 23:21:44 +00001131 case dwarf::DW_TAG_array_type:
Eric Christopherdf9955d2013-11-11 18:52:31 +00001132 constructArrayTypeDIE(Buffer, CTy);
Devang Patel0e821f42011-04-12 23:21:44 +00001133 break;
Eric Christopheraeb105f2013-11-11 18:52:39 +00001134 case dwarf::DW_TAG_enumeration_type:
1135 constructEnumTypeDIE(Buffer, CTy);
1136 break;
Devang Patel0e821f42011-04-12 23:21:44 +00001137 case dwarf::DW_TAG_subroutine_type: {
Eric Christopher0df08e22013-08-08 07:40:37 +00001138 // Add return type. A void return won't have a type.
Manman Renf8a19672014-07-28 22:24:06 +00001139 DITypeArray Elements = DISubroutineType(CTy).getTypeArray();
1140 DIType RTy(resolve(Elements.getElement(0)));
Eric Christopher0df08e22013-08-08 07:40:37 +00001141 if (RTy)
David Blaikie65a74662014-04-25 18:26:14 +00001142 addType(Buffer, RTy);
Devang Patel0e821f42011-04-12 23:21:44 +00001143
1144 bool isPrototyped = true;
Adrian Prantl3f49c892014-02-25 19:57:42 +00001145 if (Elements.getNumElements() == 2 &&
Manman Ren72b07e82014-07-29 22:58:13 +00001146 !Elements.getElement(1))
Adrian Prantl3f49c892014-02-25 19:57:42 +00001147 isPrototyped = false;
1148
1149 constructSubprogramArguments(Buffer, Elements);
1150
Eric Christopher5cd2a9d2012-02-22 08:46:21 +00001151 // Add prototype flag if we're dealing with a C language and the
1152 // function has been prototyped.
David Blaikiecb8e4352013-11-15 23:50:53 +00001153 uint16_t Language = getLanguage();
Eric Christopher5cd2a9d2012-02-22 08:46:21 +00001154 if (isPrototyped &&
Eric Christopherc2697f82013-10-19 01:04:47 +00001155 (Language == dwarf::DW_LANG_C89 || Language == dwarf::DW_LANG_C99 ||
Eric Christopherd42b92f2012-05-22 18:45:24 +00001156 Language == dwarf::DW_LANG_ObjC))
David Blaikie65a74662014-04-25 18:26:14 +00001157 addFlag(Buffer, dwarf::DW_AT_prototyped);
Adrian Prantl99c7af22013-12-18 21:48:19 +00001158
1159 if (CTy.isLValueReference())
David Blaikie65a74662014-04-25 18:26:14 +00001160 addFlag(Buffer, dwarf::DW_AT_reference);
Adrian Prantl99c7af22013-12-18 21:48:19 +00001161
1162 if (CTy.isRValueReference())
David Blaikie65a74662014-04-25 18:26:14 +00001163 addFlag(Buffer, dwarf::DW_AT_rvalue_reference);
Eric Christopherc2697f82013-10-19 01:04:47 +00001164 } break;
Devang Patel0e821f42011-04-12 23:21:44 +00001165 case dwarf::DW_TAG_structure_type:
1166 case dwarf::DW_TAG_union_type:
1167 case dwarf::DW_TAG_class_type: {
Devang Patel0e821f42011-04-12 23:21:44 +00001168 // Add elements to structure type.
Manman Renab8ffba2014-07-28 19:14:13 +00001169 DIArray Elements = CTy.getElements();
David Blaikiea1ae0e62013-08-01 20:30:22 +00001170 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
Devang Patel0e821f42011-04-12 23:21:44 +00001171 DIDescriptor Element = Elements.getElement(i);
Adrian Prantlef129fb2014-01-18 02:12:00 +00001172 if (Element.isSubprogram())
David Blaikie65a74662014-04-25 18:26:14 +00001173 getOrCreateSubprogramDIE(DISubprogram(Element));
Adrian Prantlef129fb2014-01-18 02:12:00 +00001174 else if (Element.isDerivedType()) {
Eric Christopherd42b92f2012-05-22 18:45:24 +00001175 DIDerivedType DDTy(Element);
1176 if (DDTy.getTag() == dwarf::DW_TAG_friend) {
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001177 DIE &ElemDie = createAndAddDIE(dwarf::DW_TAG_friend, Buffer);
Manman Ren93b30902013-10-08 18:42:58 +00001178 addType(ElemDie, resolve(DDTy.getTypeDerivedFrom()),
Manman Renb3388602013-10-05 01:43:03 +00001179 dwarf::DW_AT_friend);
Manman Renc6b63922013-10-14 20:33:57 +00001180 } else if (DDTy.isStaticMember()) {
Manman Ren57e6ff72013-10-23 22:57:12 +00001181 getOrCreateStaticMemberDIE(DDTy);
Manman Renc6b63922013-10-14 20:33:57 +00001182 } else {
Manman Ren230ec862013-10-23 23:00:44 +00001183 constructMemberDIE(Buffer, DDTy);
Manman Renc6b63922013-10-14 20:33:57 +00001184 }
Eric Christopher7285c7d2012-03-28 07:34:31 +00001185 } else if (Element.isObjCProperty()) {
Devang Pateld925d1a2012-02-07 23:33:58 +00001186 DIObjCProperty Property(Element);
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001187 DIE &ElemDie = createAndAddDIE(Property.getTag(), Buffer);
Devang Pateld925d1a2012-02-07 23:33:58 +00001188 StringRef PropertyName = Property.getObjCPropertyName();
1189 addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
Eric Christopher4c960562014-01-23 19:16:28 +00001190 if (Property.getType())
1191 addType(ElemDie, Property.getType());
Eric Christopherd42b92f2012-05-22 18:45:24 +00001192 addSourceLine(ElemDie, Property);
Devang Pateld925d1a2012-02-07 23:33:58 +00001193 StringRef GetterName = Property.getObjCPropertyGetterName();
1194 if (!GetterName.empty())
1195 addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
1196 StringRef SetterName = Property.getObjCPropertySetterName();
1197 if (!SetterName.empty())
1198 addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
1199 unsigned PropertyAttributes = 0;
Devang Patel403e8192012-02-04 01:30:32 +00001200 if (Property.isReadOnlyObjCProperty())
1201 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
1202 if (Property.isReadWriteObjCProperty())
1203 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
1204 if (Property.isAssignObjCProperty())
1205 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
1206 if (Property.isRetainObjCProperty())
1207 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
1208 if (Property.isCopyObjCProperty())
1209 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
1210 if (Property.isNonAtomicObjCProperty())
1211 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
1212 if (PropertyAttributes)
David Blaikief2443192013-10-21 17:28:37 +00001213 addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, None,
Eric Christopherc2697f82013-10-19 01:04:47 +00001214 PropertyAttributes);
Devang Patel44882172012-02-06 17:49:43 +00001215
Devang Pateld925d1a2012-02-07 23:33:58 +00001216 DIEEntry *Entry = getDIEEntry(Element);
1217 if (!Entry) {
David Blaikie8dbcc3f2014-04-25 19:33:43 +00001218 Entry = createDIEEntry(ElemDie);
Devang Pateld925d1a2012-02-07 23:33:58 +00001219 insertDIEEntry(Element, Entry);
1220 }
Devang Patel403e8192012-02-04 01:30:32 +00001221 } else
Devang Patel0e821f42011-04-12 23:21:44 +00001222 continue;
Devang Patel0e821f42011-04-12 23:21:44 +00001223 }
1224
1225 if (CTy.isAppleBlockExtension())
David Blaikie65a74662014-04-25 18:26:14 +00001226 addFlag(Buffer, dwarf::DW_AT_APPLE_block);
Devang Patel0e821f42011-04-12 23:21:44 +00001227
Eric Christopher9e429ae2013-10-05 00:27:02 +00001228 DICompositeType ContainingType(resolve(CTy.getContainingType()));
David Blaikie4f6bf27a2013-11-18 23:33:32 +00001229 if (ContainingType)
David Blaikie65a74662014-04-25 18:26:14 +00001230 addDIEEntry(Buffer, dwarf::DW_AT_containing_type,
David Blaikie8dbcc3f2014-04-25 19:33:43 +00001231 *getOrCreateTypeDIE(ContainingType));
Devang Patel0e821f42011-04-12 23:21:44 +00001232
Devang Patel12419ae2011-05-12 21:29:42 +00001233 if (CTy.isObjcClassComplete())
David Blaikie65a74662014-04-25 18:26:14 +00001234 addFlag(Buffer, dwarf::DW_AT_APPLE_objc_complete_type);
Devang Patel2409e782011-05-12 19:06:16 +00001235
Eric Christopherda011dd2011-12-16 23:42:42 +00001236 // Add template parameters to a class, structure or union types.
1237 // FIXME: The support isn't in the metadata for this yet.
1238 if (Tag == dwarf::DW_TAG_class_type ||
Eric Christopherc2697f82013-10-19 01:04:47 +00001239 Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type)
Devang Patel0e821f42011-04-12 23:21:44 +00001240 addTemplateParams(Buffer, CTy.getTemplateParams());
1241
1242 break;
1243 }
1244 default:
1245 break;
1246 }
1247
1248 // Add name if not anonymous or intermediate type.
1249 if (!Name.empty())
David Blaikie65a74662014-04-25 18:26:14 +00001250 addString(Buffer, dwarf::DW_AT_name, Name);
Devang Patel0e821f42011-04-12 23:21:44 +00001251
Eric Christopher775cbd22012-05-22 18:45:18 +00001252 if (Tag == dwarf::DW_TAG_enumeration_type ||
Eric Christopherc2697f82013-10-19 01:04:47 +00001253 Tag == dwarf::DW_TAG_class_type || Tag == dwarf::DW_TAG_structure_type ||
Eric Christopher775cbd22012-05-22 18:45:18 +00001254 Tag == dwarf::DW_TAG_union_type) {
Devang Patel0e821f42011-04-12 23:21:44 +00001255 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopher1cf33382012-06-01 00:22:32 +00001256 // TODO: Do we care about size for enum forward declarations?
Devang Patel0e821f42011-04-12 23:21:44 +00001257 if (Size)
David Blaikie65a74662014-04-25 18:26:14 +00001258 addUInt(Buffer, dwarf::DW_AT_byte_size, None, Size);
Eric Christopher1cf33382012-06-01 00:22:32 +00001259 else if (!CTy.isForwardDecl())
Devang Patel0e821f42011-04-12 23:21:44 +00001260 // Add zero size if it is not a forward declaration.
David Blaikie65a74662014-04-25 18:26:14 +00001261 addUInt(Buffer, dwarf::DW_AT_byte_size, None, 0);
Eric Christopher1cf33382012-06-01 00:22:32 +00001262
1263 // If we're a forward decl, say so.
1264 if (CTy.isForwardDecl())
David Blaikie65a74662014-04-25 18:26:14 +00001265 addFlag(Buffer, dwarf::DW_AT_declaration);
Devang Patel0e821f42011-04-12 23:21:44 +00001266
1267 // Add source line info if available.
1268 if (!CTy.isForwardDecl())
David Blaikie65a74662014-04-25 18:26:14 +00001269 addSourceLine(Buffer, CTy);
Eric Christopher54cf8ff2012-03-07 00:15:19 +00001270
1271 // No harm in adding the runtime language to the declaration.
1272 unsigned RLang = CTy.getRunTimeLang();
1273 if (RLang)
David Blaikie65a74662014-04-25 18:26:14 +00001274 addUInt(Buffer, dwarf::DW_AT_APPLE_runtime_class, dwarf::DW_FORM_data1,
Eric Christopherc2697f82013-10-19 01:04:47 +00001275 RLang);
Devang Patel0e821f42011-04-12 23:21:44 +00001276 }
1277}
1278
Manman Renffc9a712013-10-23 23:05:28 +00001279/// constructTemplateTypeParameterDIE - Construct new DIE for the given
1280/// DITemplateTypeParameter.
Eric Christophera5a79422013-12-09 23:32:48 +00001281void DwarfUnit::constructTemplateTypeParameterDIE(DIE &Buffer,
1282 DITemplateTypeParameter TP) {
David Blaikie65a74662014-04-25 18:26:14 +00001283 DIE &ParamDIE =
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001284 createAndAddDIE(dwarf::DW_TAG_template_type_parameter, Buffer);
Eric Christopher056b6472013-08-08 08:09:43 +00001285 // Add the type if it exists, it could be void and therefore no type.
1286 if (TP.getType())
Manman Ren88b0f942013-10-09 19:46:28 +00001287 addType(ParamDIE, resolve(TP.getType()));
David Blaikie2b380232013-06-22 18:59:11 +00001288 if (!TP.getName().empty())
1289 addString(ParamDIE, dwarf::DW_AT_name, TP.getName());
Devang Patel0e821f42011-04-12 23:21:44 +00001290}
1291
Manman Renffc9a712013-10-23 23:05:28 +00001292/// constructTemplateValueParameterDIE - Construct new DIE for the given
1293/// DITemplateValueParameter.
Eric Christophera5a79422013-12-09 23:32:48 +00001294void
1295DwarfUnit::constructTemplateValueParameterDIE(DIE &Buffer,
David Blaikie319a05f2013-12-02 19:33:10 +00001296 DITemplateValueParameter VP) {
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001297 DIE &ParamDIE = createAndAddDIE(VP.getTag(), Buffer);
Eric Christopher0df08e22013-08-08 07:40:37 +00001298
1299 // Add the type if there is one, template template and template parameter
1300 // packs will not have a type.
Eric Christopher691281b2013-10-21 17:48:51 +00001301 if (VP.getTag() == dwarf::DW_TAG_template_value_parameter)
Manman Ren88b0f942013-10-09 19:46:28 +00001302 addType(ParamDIE, resolve(VP.getType()));
Eric Christopherafb2c412013-08-08 07:40:31 +00001303 if (!VP.getName().empty())
1304 addString(ParamDIE, dwarf::DW_AT_name, VP.getName());
1305 if (Value *Val = VP.getValue()) {
David Blaikiea1e813d2013-05-10 21:52:07 +00001306 if (ConstantInt *CI = dyn_cast<ConstantInt>(Val))
David Blaikiec0a28412014-05-11 15:56:59 +00001307 addConstantValue(ParamDIE, CI, resolve(VP.getType()));
David Blaikiea1e813d2013-05-10 21:52:07 +00001308 else if (GlobalValue *GV = dyn_cast<GlobalValue>(Val)) {
1309 // For declaration non-type template parameters (such as global values and
1310 // functions)
Eric Christopher4a741042014-02-16 08:46:55 +00001311 DIELoc *Loc = new (DIEValueAllocator) DIELoc();
David Blaikie65a74662014-04-25 18:26:14 +00001312 addOpAddress(*Loc, Asm->getSymbol(GV));
David Blaikiea1e813d2013-05-10 21:52:07 +00001313 // Emit DW_OP_stack_value to use the address as the immediate value of the
1314 // parameter, rather than a pointer to it.
David Blaikie65a74662014-04-25 18:26:14 +00001315 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value);
Eric Christopher4a741042014-02-16 08:46:55 +00001316 addBlock(ParamDIE, dwarf::DW_AT_location, Loc);
Eric Christopherafb2c412013-08-08 07:40:31 +00001317 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_template_param) {
David Blaikie2b380232013-06-22 18:59:11 +00001318 assert(isa<MDString>(Val));
1319 addString(ParamDIE, dwarf::DW_AT_GNU_template_name,
1320 cast<MDString>(Val)->getString());
Eric Christopherafb2c412013-08-08 07:40:31 +00001321 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_parameter_pack) {
David Blaikie2b380232013-06-22 18:59:11 +00001322 assert(isa<MDNode>(Val));
1323 DIArray A(cast<MDNode>(Val));
David Blaikie65a74662014-04-25 18:26:14 +00001324 addTemplateParams(ParamDIE, A);
David Blaikiea1e813d2013-05-10 21:52:07 +00001325 }
1326 }
Devang Patel0e821f42011-04-12 23:21:44 +00001327}
1328
Devang Patel17b53272011-05-06 16:57:54 +00001329/// getOrCreateNameSpace - Create a DIE for DINameSpace.
Eric Christophera5a79422013-12-09 23:32:48 +00001330DIE *DwarfUnit::getOrCreateNameSpace(DINameSpace NS) {
Manman Renf6b936b2013-10-29 05:49:41 +00001331 // Construct the context before querying for the existence of the DIE in case
1332 // such construction creates the DIE.
1333 DIE *ContextDIE = getOrCreateContextDIE(NS.getContext());
Manman Renf6b936b2013-10-29 05:49:41 +00001334
David Blaikie65a74662014-04-25 18:26:14 +00001335 if (DIE *NDie = getDIE(NS))
Devang Patel17b53272011-05-06 16:57:54 +00001336 return NDie;
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001337 DIE &NDie = createAndAddDIE(dwarf::DW_TAG_namespace, *ContextDIE, NS);
Manman Renf6b936b2013-10-29 05:49:41 +00001338
David Blaikie553eb4a2014-06-06 22:16:56 +00001339 StringRef Name = NS.getName();
1340 if (!Name.empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +00001341 addString(NDie, dwarf::DW_AT_name, NS.getName());
David Blaikie553eb4a2014-06-06 22:16:56 +00001342 else
1343 Name = "(anonymous namespace)";
1344 DD->addAccelNamespace(Name, NDie);
1345 addGlobalName(Name, NDie, NS.getContext());
Devang Patel17b53272011-05-06 16:57:54 +00001346 addSourceLine(NDie, NS);
David Blaikie65a74662014-04-25 18:26:14 +00001347 return &NDie;
Devang Patel17b53272011-05-06 16:57:54 +00001348}
1349
Devang Patel89543712011-08-15 17:24:54 +00001350/// getOrCreateSubprogramDIE - Create new DIE using SP.
Eric Christophera5a79422013-12-09 23:32:48 +00001351DIE *DwarfUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
David Blaikie309ffe42013-10-04 01:39:59 +00001352 // Construct the context before querying for the existence of the DIE in case
1353 // such construction creates the DIE (as is the case for member function
1354 // declarations).
David Blaikie7f916862014-05-27 18:37:38 +00001355 DIE *ContextDIE = getOrCreateContextDIE(resolve(SP.getContext()));
Adrian Prantld486b342014-03-18 17:41:15 +00001356
David Blaikie65a74662014-04-25 18:26:14 +00001357 if (DIE *SPDie = getDIE(SP))
Devang Patel89543712011-08-15 17:24:54 +00001358 return SPDie;
1359
David Blaikiece7a1bd2014-05-21 18:04:33 +00001360 if (DISubprogram SPDecl = SP.getFunctionDeclaration()) {
Manman Ren73d697c2013-10-29 00:58:04 +00001361 // Add subprogram definitions to the CU die directly.
David Blaikiebd579052014-04-28 21:14:27 +00001362 ContextDIE = &getUnitDie();
Alp Tokerda0c7932014-05-31 21:26:28 +00001363 // Build the decl now to ensure it precedes the definition.
David Blaikie7f916862014-05-27 18:37:38 +00001364 getOrCreateSubprogramDIE(SPDecl);
David Blaikiece7a1bd2014-05-21 18:04:33 +00001365 }
Peter Collingbourne4d358b52012-05-27 18:36:44 +00001366
1367 // DW_TAG_inlined_subroutine may refer to this DIE.
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001368 DIE &SPDie = createAndAddDIE(dwarf::DW_TAG_subprogram, *ContextDIE, SP);
Peter Collingbourne4d358b52012-05-27 18:36:44 +00001369
David Blaikie6cfa9e12014-06-05 00:25:26 +00001370 // Stop here and fill this in later, depending on whether or not this
David Blaikief7221ad2014-05-27 18:37:43 +00001371 // subprogram turns out to have inlined instances or not.
1372 if (SP.isDefinition())
1373 return &SPDie;
1374
David Blaikie7f916862014-05-27 18:37:38 +00001375 applySubprogramAttributes(SP, SPDie);
1376 return &SPDie;
1377}
1378
David Blaikie3dca5992014-06-06 22:29:05 +00001379void DwarfUnit::applySubprogramAttributesToDefinition(DISubprogram SP, DIE &SPDie) {
1380 DISubprogram SPDecl = SP.getFunctionDeclaration();
1381 DIScope Context = resolve(SPDecl ? SPDecl.getContext() : SP.getContext());
1382 applySubprogramAttributes(SP, SPDie);
1383 addGlobalName(SP.getName(), SPDie, Context);
1384}
1385
David Blaikie7f916862014-05-27 18:37:38 +00001386void DwarfUnit::applySubprogramAttributes(DISubprogram SP, DIE &SPDie) {
1387 DIE *DeclDie = nullptr;
1388 StringRef DeclLinkageName;
1389 if (DISubprogram SPDecl = SP.getFunctionDeclaration()) {
David Blaikief7221ad2014-05-27 18:37:43 +00001390 DeclDie = getDIE(SPDecl);
David Blaikie6cfa9e12014-06-05 00:25:26 +00001391 assert(DeclDie && "This DIE should've already been constructed when the "
Alp Toker5c536392014-06-07 21:23:09 +00001392 "definition DIE was created in "
David Blaikie6cfa9e12014-06-05 00:25:26 +00001393 "getOrCreateSubprogramDIE");
David Blaikie7f916862014-05-27 18:37:38 +00001394 DeclLinkageName = SPDecl.getLinkageName();
1395 }
Rafael Espindola79278362011-11-10 22:34:29 +00001396
Devang Patel89543712011-08-15 17:24:54 +00001397 // Add function template parameters.
David Blaikie65a74662014-04-25 18:26:14 +00001398 addTemplateParams(SPDie, SP.getTemplateParams());
Devang Patel89543712011-08-15 17:24:54 +00001399
Adrian Prantl8714aaf2014-04-14 21:16:04 +00001400 // Add the linkage name if we have one and it isn't in the Decl.
1401 StringRef LinkageName = SP.getLinkageName();
David Blaikiece7a1bd2014-05-21 18:04:33 +00001402 assert(((LinkageName.empty() || DeclLinkageName.empty()) ||
1403 LinkageName == DeclLinkageName) &&
1404 "decl has a linkage name and it is different");
1405 if (!LinkageName.empty() && DeclLinkageName.empty())
1406 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
1407 GlobalValue::getRealLinkageName(LinkageName));
Devang Patel89543712011-08-15 17:24:54 +00001408
David Blaikiece7a1bd2014-05-21 18:04:33 +00001409 if (DeclDie) {
1410 // Refer to the function declaration where all the other attributes will be
1411 // found.
1412 addDIEEntry(SPDie, dwarf::DW_AT_specification, *DeclDie);
David Blaikie7f916862014-05-27 18:37:38 +00001413 return;
David Blaikiece7a1bd2014-05-21 18:04:33 +00001414 }
Eric Christopheracb71152012-08-23 22:52:55 +00001415
Devang Patel89543712011-08-15 17:24:54 +00001416 // Constructors and operators for anonymous aggregates do not have names.
1417 if (!SP.getName().empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +00001418 addString(SPDie, dwarf::DW_AT_name, SP.getName());
Devang Patel89543712011-08-15 17:24:54 +00001419
David Blaikie0b9438b2014-09-19 04:47:46 +00001420 // Skip the rest of the attributes under -gmlt to save space.
David Blaikie73b65d22014-09-19 04:30:36 +00001421 if(getCUNode().getEmissionKind() == DIBuilder::LineTablesOnly)
1422 return;
1423
Devang Patel89543712011-08-15 17:24:54 +00001424 addSourceLine(SPDie, SP);
1425
Eric Christopher5cd2a9d2012-02-22 08:46:21 +00001426 // Add the prototype if we have a prototype and we have a C like
1427 // language.
David Blaikiecb8e4352013-11-15 23:50:53 +00001428 uint16_t Language = getLanguage();
Eric Christopher5cd2a9d2012-02-22 08:46:21 +00001429 if (SP.isPrototyped() &&
Eric Christopherc2697f82013-10-19 01:04:47 +00001430 (Language == dwarf::DW_LANG_C89 || Language == dwarf::DW_LANG_C99 ||
Eric Christopher5cd2a9d2012-02-22 08:46:21 +00001431 Language == dwarf::DW_LANG_ObjC))
Eric Christopherbb69a272012-08-24 01:14:27 +00001432 addFlag(SPDie, dwarf::DW_AT_prototyped);
Devang Patel89543712011-08-15 17:24:54 +00001433
Manman Renf8a19672014-07-28 22:24:06 +00001434 DISubroutineType SPTy = SP.getType();
David Blaikie5174c842013-05-22 23:22:18 +00001435 assert(SPTy.getTag() == dwarf::DW_TAG_subroutine_type &&
1436 "the type of a subprogram should be a subroutine");
Devang Patel89543712011-08-15 17:24:54 +00001437
Manman Renf8a19672014-07-28 22:24:06 +00001438 DITypeArray Args = SPTy.getTypeArray();
Eric Christopher691281b2013-10-21 17:48:51 +00001439 // Add a return type. If this is a type like a C/C++ void type we don't add a
1440 // return type.
Manman Renf8a19672014-07-28 22:24:06 +00001441 if (resolve(Args.getElement(0)))
1442 addType(SPDie, DIType(resolve(Args.getElement(0))));
Devang Patel89543712011-08-15 17:24:54 +00001443
1444 unsigned VK = SP.getVirtuality();
1445 if (VK) {
Nick Lewyckycfde1a22011-12-14 00:56:07 +00001446 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
Eric Christopher4a741042014-02-16 08:46:55 +00001447 DIELoc *Block = getDIELoc();
David Blaikie65a74662014-04-25 18:26:14 +00001448 addUInt(*Block, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1449 addUInt(*Block, dwarf::DW_FORM_udata, SP.getVirtualIndex());
David Blaikief2443192013-10-21 17:28:37 +00001450 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, Block);
Eric Christopher98b7f172013-11-11 18:52:36 +00001451 ContainingTypeMap.insert(
David Blaikie65a74662014-04-25 18:26:14 +00001452 std::make_pair(&SPDie, resolve(SP.getContainingType())));
Devang Patel89543712011-08-15 17:24:54 +00001453 }
1454
1455 if (!SP.isDefinition()) {
Eric Christopherbb69a272012-08-24 01:14:27 +00001456 addFlag(SPDie, dwarf::DW_AT_declaration);
Eric Christopher92331fd2012-11-21 00:34:38 +00001457
Devang Patel89543712011-08-15 17:24:54 +00001458 // Add arguments. Do not add arguments for subprogram definition. They will
1459 // be handled while processing variables.
David Blaikie899ae612014-04-30 22:58:19 +00001460 constructSubprogramArguments(SPDie, Args);
Devang Patel89543712011-08-15 17:24:54 +00001461 }
1462
1463 if (SP.isArtificial())
Eric Christopherbb69a272012-08-24 01:14:27 +00001464 addFlag(SPDie, dwarf::DW_AT_artificial);
Devang Patel89543712011-08-15 17:24:54 +00001465
1466 if (!SP.isLocalToUnit())
Eric Christopherbb69a272012-08-24 01:14:27 +00001467 addFlag(SPDie, dwarf::DW_AT_external);
Devang Patel89543712011-08-15 17:24:54 +00001468
1469 if (SP.isOptimized())
Eric Christopherbb69a272012-08-24 01:14:27 +00001470 addFlag(SPDie, dwarf::DW_AT_APPLE_optimized);
Devang Patel89543712011-08-15 17:24:54 +00001471
1472 if (unsigned isa = Asm->getISAEncoding()) {
1473 addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1474 }
1475
Adrian Prantl99c7af22013-12-18 21:48:19 +00001476 if (SP.isLValueReference())
1477 addFlag(SPDie, dwarf::DW_AT_reference);
1478
1479 if (SP.isRValueReference())
1480 addFlag(SPDie, dwarf::DW_AT_rvalue_reference);
1481
Adrian Prantlef129fb2014-01-18 02:12:00 +00001482 if (SP.isProtected())
1483 addUInt(SPDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1484 dwarf::DW_ACCESS_protected);
1485 else if (SP.isPrivate())
1486 addUInt(SPDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1487 dwarf::DW_ACCESS_private);
Adrian Prantldaedfda2014-08-29 22:44:07 +00001488 else if (SP.isPublic())
Adrian Prantlef129fb2014-01-18 02:12:00 +00001489 addUInt(SPDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1490 dwarf::DW_ACCESS_public);
1491
1492 if (SP.isExplicit())
1493 addFlag(SPDie, dwarf::DW_AT_explicit);
Devang Patel89543712011-08-15 17:24:54 +00001494}
1495
David Blaikieeb1a2722014-06-13 22:18:23 +00001496void DwarfUnit::applyVariableAttributes(const DbgVariable &Var,
1497 DIE &VariableDie) {
1498 StringRef Name = Var.getName();
1499 if (!Name.empty())
1500 addString(VariableDie, dwarf::DW_AT_name, Name);
1501 addSourceLine(VariableDie, Var.getVariable());
1502 addType(VariableDie, Var.getType());
1503 if (Var.isArtificial())
1504 addFlag(VariableDie, dwarf::DW_AT_artificial);
1505}
1506
Devang Patel0e821f42011-04-12 23:21:44 +00001507/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
Eric Christophera5a79422013-12-09 23:32:48 +00001508void DwarfUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy) {
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001509 DIE &DW_Subrange = createAndAddDIE(dwarf::DW_TAG_subrange_type, Buffer);
David Blaikie8dbcc3f2014-04-25 19:33:43 +00001510 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, *IndexTy);
Devang Patel0e821f42011-04-12 23:21:44 +00001511
Bill Wendling28fe9e72012-12-06 07:38:10 +00001512 // The LowerBound value defines the lower bounds which is typically zero for
1513 // C/C++. The Count value is the number of elements. Values are 64 bit. If
1514 // Count == -1 then the array is unbounded and we do not emit
David Blaikie32b0f362014-10-01 00:56:55 +00001515 // DW_AT_lower_bound and DW_AT_count attributes.
Bill Wendling28fe9e72012-12-06 07:38:10 +00001516 int64_t LowerBound = SR.getLo();
Bill Wendling3495f9b2012-12-06 07:55:19 +00001517 int64_t DefaultLowerBound = getDefaultLowerBound();
Bill Wendlingd7767122012-12-04 21:34:03 +00001518 int64_t Count = SR.getCount();
Devang Patel0e821f42011-04-12 23:21:44 +00001519
Bill Wendling3495f9b2012-12-06 07:55:19 +00001520 if (DefaultLowerBound == -1 || LowerBound != DefaultLowerBound)
David Blaikief2443192013-10-21 17:28:37 +00001521 addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, None, LowerBound);
Bill Wendling28fe9e72012-12-06 07:38:10 +00001522
David Blaikie32b0f362014-10-01 00:56:55 +00001523 if (Count != -1)
Bill Wendlingd7767122012-12-04 21:34:03 +00001524 // FIXME: An unbounded array should reference the expression that defines
1525 // the array.
David Blaikie32b0f362014-10-01 00:56:55 +00001526 addUInt(DW_Subrange, dwarf::DW_AT_count, None, Count);
Devang Patel0e821f42011-04-12 23:21:44 +00001527}
1528
1529/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
Eric Christophera5a79422013-12-09 23:32:48 +00001530void DwarfUnit::constructArrayTypeDIE(DIE &Buffer, DICompositeType CTy) {
Eric Christopherdf9955d2013-11-11 18:52:31 +00001531 if (CTy.isVector())
David Blaikie65a74662014-04-25 18:26:14 +00001532 addFlag(Buffer, dwarf::DW_AT_GNU_vector);
Devang Patel0e821f42011-04-12 23:21:44 +00001533
Eric Christopher0df08e22013-08-08 07:40:37 +00001534 // Emit the element type.
David Blaikie65a74662014-04-25 18:26:14 +00001535 addType(Buffer, resolve(CTy.getTypeDerivedFrom()));
Devang Patel0e821f42011-04-12 23:21:44 +00001536
1537 // Get an anonymous type for index type.
Eric Christophercad9b532013-01-04 21:51:53 +00001538 // FIXME: This type should be passed down from the front end
1539 // as different languages may have different sizes for indexes.
Devang Patel0e821f42011-04-12 23:21:44 +00001540 DIE *IdxTy = getIndexTyDie();
1541 if (!IdxTy) {
David Blaikie12e00fc2014-04-03 06:28:20 +00001542 // Construct an integer type to use for indexes.
David Blaikiebd579052014-04-28 21:14:27 +00001543 IdxTy = &createAndAddDIE(dwarf::DW_TAG_base_type, UnitDie);
David Blaikie65a74662014-04-25 18:26:14 +00001544 addString(*IdxTy, dwarf::DW_AT_name, "sizetype");
1545 addUInt(*IdxTy, dwarf::DW_AT_byte_size, None, sizeof(int64_t));
1546 addUInt(*IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
David Blaikie12e00fc2014-04-03 06:28:20 +00001547 dwarf::DW_ATE_unsigned);
Devang Patel0e821f42011-04-12 23:21:44 +00001548 setIndexTyDie(IdxTy);
1549 }
1550
1551 // Add subranges to array type.
Manman Renab8ffba2014-07-28 19:14:13 +00001552 DIArray Elements = CTy.getElements();
Devang Patel0e821f42011-04-12 23:21:44 +00001553 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1554 DIDescriptor Element = Elements.getElement(i);
1555 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1556 constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1557 }
1558}
1559
Eric Christopheraeb105f2013-11-11 18:52:39 +00001560/// constructEnumTypeDIE - Construct an enum type DIE from DICompositeType.
Eric Christophera5a79422013-12-09 23:32:48 +00001561void DwarfUnit::constructEnumTypeDIE(DIE &Buffer, DICompositeType CTy) {
Manman Renab8ffba2014-07-28 19:14:13 +00001562 DIArray Elements = CTy.getElements();
Eric Christopheraeb105f2013-11-11 18:52:39 +00001563
1564 // Add enumerators to enumeration type.
1565 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
David Blaikie4f6bf27a2013-11-18 23:33:32 +00001566 DIEnumerator Enum(Elements.getElement(i));
Eric Christopheraeb105f2013-11-11 18:52:39 +00001567 if (Enum.isEnumerator()) {
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001568 DIE &Enumerator = createAndAddDIE(dwarf::DW_TAG_enumerator, Buffer);
David Blaikie4f6bf27a2013-11-18 23:33:32 +00001569 StringRef Name = Enum.getName();
Eric Christopheraeb105f2013-11-11 18:52:39 +00001570 addString(Enumerator, dwarf::DW_AT_name, Name);
David Blaikie4f6bf27a2013-11-18 23:33:32 +00001571 int64_t Value = Enum.getEnumValue();
Eric Christophera07e4f52013-11-19 09:28:34 +00001572 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata,
1573 Value);
Eric Christopheraeb105f2013-11-11 18:52:39 +00001574 }
1575 }
1576 DIType DTy = resolve(CTy.getTypeDerivedFrom());
1577 if (DTy) {
David Blaikie65a74662014-04-25 18:26:14 +00001578 addType(Buffer, DTy);
1579 addFlag(Buffer, dwarf::DW_AT_enum_class);
Eric Christopheraeb105f2013-11-11 18:52:39 +00001580 }
Devang Patel0e821f42011-04-12 23:21:44 +00001581}
1582
Devang Patel89543712011-08-15 17:24:54 +00001583/// constructContainingTypeDIEs - Construct DIEs for types that contain
1584/// vtables.
Eric Christophera5a79422013-12-09 23:32:48 +00001585void DwarfUnit::constructContainingTypeDIEs() {
Devang Patel89543712011-08-15 17:24:54 +00001586 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
Eric Christopherc2697f82013-10-19 01:04:47 +00001587 CE = ContainingTypeMap.end();
1588 CI != CE; ++CI) {
David Blaikie65a74662014-04-25 18:26:14 +00001589 DIE &SPDie = *CI->first;
David Blaikie2ad00162013-11-15 23:09:13 +00001590 DIDescriptor D(CI->second);
1591 if (!D)
Eric Christopherc2697f82013-10-19 01:04:47 +00001592 continue;
David Blaikie2ad00162013-11-15 23:09:13 +00001593 DIE *NDie = getDIE(D);
Eric Christopherc2697f82013-10-19 01:04:47 +00001594 if (!NDie)
1595 continue;
David Blaikie8dbcc3f2014-04-25 19:33:43 +00001596 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, *NDie);
Devang Patel89543712011-08-15 17:24:54 +00001597 }
1598}
1599
Manman Ren230ec862013-10-23 23:00:44 +00001600/// constructMemberDIE - Construct member DIE from DIDerivedType.
Eric Christophera5a79422013-12-09 23:32:48 +00001601void DwarfUnit::constructMemberDIE(DIE &Buffer, DIDerivedType DT) {
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001602 DIE &MemberDie = createAndAddDIE(DT.getTag(), Buffer);
Devang Patel0e821f42011-04-12 23:21:44 +00001603 StringRef Name = DT.getName();
1604 if (!Name.empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +00001605 addString(MemberDie, dwarf::DW_AT_name, Name);
Devang Patel0e821f42011-04-12 23:21:44 +00001606
Manman Ren93b30902013-10-08 18:42:58 +00001607 addType(MemberDie, resolve(DT.getTypeDerivedFrom()));
Devang Patel0e821f42011-04-12 23:21:44 +00001608
1609 addSourceLine(MemberDie, DT);
1610
Eric Christopherc2697f82013-10-19 01:04:47 +00001611 if (DT.getTag() == dwarf::DW_TAG_inheritance && DT.isVirtual()) {
Devang Patel0e821f42011-04-12 23:21:44 +00001612
1613 // For C++, virtual base classes are not at fixed offset. Use following
1614 // expression to extract appropriate offset from vtable.
1615 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1616
Eric Christopher4a741042014-02-16 08:46:55 +00001617 DIELoc *VBaseLocationDie = new (DIEValueAllocator) DIELoc();
David Blaikie65a74662014-04-25 18:26:14 +00001618 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1619 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1620 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1621 addUInt(*VBaseLocationDie, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1622 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1623 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1624 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
Devang Patel0e821f42011-04-12 23:21:44 +00001625
David Blaikief2443192013-10-21 17:28:37 +00001626 addBlock(MemberDie, dwarf::DW_AT_data_member_location, VBaseLocationDie);
David Blaikie71d34a22013-11-01 00:25:45 +00001627 } else {
1628 uint64_t Size = DT.getSizeInBits();
1629 uint64_t FieldSize = getBaseTypeSize(DD, DT);
1630 uint64_t OffsetInBytes;
1631
1632 if (Size != FieldSize) {
Eric Christopher1acdbb82014-03-12 17:14:46 +00001633 // Handle bitfield, assume bytes are 8 bits.
1634 addUInt(MemberDie, dwarf::DW_AT_byte_size, None, FieldSize/8);
1635 addUInt(MemberDie, dwarf::DW_AT_bit_size, None, Size);
David Blaikie71d34a22013-11-01 00:25:45 +00001636
1637 uint64_t Offset = DT.getOffsetInBits();
1638 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1639 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1640 uint64_t FieldOffset = (HiMark - FieldSize);
1641 Offset -= FieldOffset;
1642
1643 // Maybe we need to work from the other end.
1644 if (Asm->getDataLayout().isLittleEndian())
1645 Offset = FieldSize - (Offset + Size);
1646 addUInt(MemberDie, dwarf::DW_AT_bit_offset, None, Offset);
1647
Adrian Prantlc67655a2014-01-28 18:13:47 +00001648 // Here DW_AT_data_member_location points to the anonymous
David Blaikie71d34a22013-11-01 00:25:45 +00001649 // field that includes this bit field.
1650 OffsetInBytes = FieldOffset >> 3;
1651 } else
1652 // This is not a bitfield.
1653 OffsetInBytes = DT.getOffsetInBits() >> 3;
David Blaikie2ada1162014-01-03 00:48:38 +00001654
David Blaikie22b29a52014-01-03 01:30:05 +00001655 if (DD->getDwarfVersion() <= 2) {
Eric Christopher4a741042014-02-16 08:46:55 +00001656 DIELoc *MemLocationDie = new (DIEValueAllocator) DIELoc();
David Blaikie65a74662014-04-25 18:26:14 +00001657 addUInt(*MemLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1658 addUInt(*MemLocationDie, dwarf::DW_FORM_udata, OffsetInBytes);
David Blaikie22b29a52014-01-03 01:30:05 +00001659 addBlock(MemberDie, dwarf::DW_AT_data_member_location, MemLocationDie);
1660 } else
1661 addUInt(MemberDie, dwarf::DW_AT_data_member_location, None,
1662 OffsetInBytes);
David Blaikie71d34a22013-11-01 00:25:45 +00001663 }
Devang Patel0e821f42011-04-12 23:21:44 +00001664
1665 if (DT.isProtected())
Nick Lewyckycb918492011-12-13 05:09:11 +00001666 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001667 dwarf::DW_ACCESS_protected);
1668 else if (DT.isPrivate())
Nick Lewyckycb918492011-12-13 05:09:11 +00001669 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001670 dwarf::DW_ACCESS_private);
1671 // Otherwise C++ member and base classes are considered public.
Adrian Prantldaedfda2014-08-29 22:44:07 +00001672 else if (DT.isPublic())
Nick Lewyckycb918492011-12-13 05:09:11 +00001673 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001674 dwarf::DW_ACCESS_public);
1675 if (DT.isVirtual())
Nick Lewyckycfde1a22011-12-14 00:56:07 +00001676 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001677 dwarf::DW_VIRTUALITY_virtual);
Devang Patel514b4002011-04-16 00:11:51 +00001678
1679 // Objective-C properties.
Devang Patel44882172012-02-06 17:49:43 +00001680 if (MDNode *PNode = DT.getObjCProperty())
1681 if (DIEEntry *PropertyDie = getDIEEntry(PNode))
David Blaikie65a74662014-04-25 18:26:14 +00001682 MemberDie.addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4,
1683 PropertyDie);
Devang Patel44882172012-02-06 17:49:43 +00001684
David Blaikie37fefc32012-12-13 22:43:07 +00001685 if (DT.isArtificial())
1686 addFlag(MemberDie, dwarf::DW_AT_artificial);
Devang Patel0e821f42011-04-12 23:21:44 +00001687}
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001688
Manman Renc6b63922013-10-14 20:33:57 +00001689/// getOrCreateStaticMemberDIE - Create new DIE for C++ static member.
Eric Christophera5a79422013-12-09 23:32:48 +00001690DIE *DwarfUnit::getOrCreateStaticMemberDIE(DIDerivedType DT) {
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001691 if (!DT.Verify())
Craig Topper353eda42014-04-24 06:44:33 +00001692 return nullptr;
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001693
Manman Renc6b63922013-10-14 20:33:57 +00001694 // Construct the context before querying for the existence of the DIE in case
1695 // such construction creates the DIE.
1696 DIE *ContextDIE = getOrCreateContextDIE(resolve(DT.getContext()));
David Blaikiebd700e42013-11-14 21:24:34 +00001697 assert(dwarf::isType(ContextDIE->getTag()) &&
1698 "Static member should belong to a type.");
Manman Renc6b63922013-10-14 20:33:57 +00001699
David Blaikie65a74662014-04-25 18:26:14 +00001700 if (DIE *StaticMemberDIE = getDIE(DT))
Manman Renc6b63922013-10-14 20:33:57 +00001701 return StaticMemberDIE;
1702
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001703 DIE &StaticMemberDIE = createAndAddDIE(DT.getTag(), *ContextDIE, DT);
Manman Renc6b63922013-10-14 20:33:57 +00001704
Manman Ren93b30902013-10-08 18:42:58 +00001705 DIType Ty = resolve(DT.getTypeDerivedFrom());
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001706
1707 addString(StaticMemberDIE, dwarf::DW_AT_name, DT.getName());
1708 addType(StaticMemberDIE, Ty);
1709 addSourceLine(StaticMemberDIE, DT);
1710 addFlag(StaticMemberDIE, dwarf::DW_AT_external);
1711 addFlag(StaticMemberDIE, dwarf::DW_AT_declaration);
1712
1713 // FIXME: We could omit private if the parent is a class_type, and
1714 // public if the parent is something else.
1715 if (DT.isProtected())
1716 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1717 dwarf::DW_ACCESS_protected);
1718 else if (DT.isPrivate())
1719 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1720 dwarf::DW_ACCESS_private);
Adrian Prantldaedfda2014-08-29 22:44:07 +00001721 else if (DT.isPublic())
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001722 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1723 dwarf::DW_ACCESS_public);
1724
1725 if (const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(DT.getConstant()))
David Blaikiec0a28412014-05-11 15:56:59 +00001726 addConstantValue(StaticMemberDIE, CI, Ty);
David Blaikiea39a76e2013-01-20 01:18:01 +00001727 if (const ConstantFP *CFP = dyn_cast_or_null<ConstantFP>(DT.getConstant()))
1728 addConstantFPValue(StaticMemberDIE, CFP);
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001729
David Blaikie65a74662014-04-25 18:26:14 +00001730 return &StaticMemberDIE;
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001731}
David Blaikie6b288cf2013-10-30 20:42:41 +00001732
David Blaikied82b2372014-03-24 20:28:10 +00001733void DwarfUnit::emitHeader(const MCSymbol *ASectionSym) const {
David Blaikie6b288cf2013-10-30 20:42:41 +00001734 Asm->OutStreamer.AddComment("DWARF version number");
1735 Asm->EmitInt16(DD->getDwarfVersion());
1736 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
David Blaikie6896e192013-12-04 23:39:02 +00001737 // We share one abbreviations table across all units so it's always at the
1738 // start of the section. Use a relocatable offset where needed to ensure
1739 // linking doesn't invalidate that offset.
David Blaikie3c9a3cc2014-03-24 20:53:02 +00001740 if (ASectionSym)
1741 Asm->EmitSectionOffset(ASectionSym, ASectionSym);
1742 else
David Blaikie326e1fa2014-04-02 02:04:51 +00001743 // Use a constant value when no symbol is provided.
David Blaikie3c9a3cc2014-03-24 20:53:02 +00001744 Asm->EmitInt32(0);
David Blaikie6b288cf2013-10-30 20:42:41 +00001745 Asm->OutStreamer.AddComment("Address Size (in bytes)");
1746 Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
1747}
David Blaikiebc563272013-12-13 21:33:40 +00001748
David Blaikied82b2372014-03-24 20:28:10 +00001749void DwarfTypeUnit::emitHeader(const MCSymbol *ASectionSym) const {
1750 DwarfUnit::emitHeader(ASectionSym);
David Blaikiebc563272013-12-13 21:33:40 +00001751 Asm->OutStreamer.AddComment("Type Signature");
1752 Asm->OutStreamer.EmitIntValue(TypeSignature, sizeof(TypeSignature));
1753 Asm->OutStreamer.AddComment("Type DIE Offset");
David Blaikie15ed5eb2014-01-10 01:38:41 +00001754 // In a skeleton type unit there is no type DIE so emit a zero offset.
1755 Asm->OutStreamer.EmitIntValue(Ty ? Ty->getOffset() : 0,
1756 sizeof(Ty->getOffset()));
David Blaikiebc563272013-12-13 21:33:40 +00001757}
1758
1759void DwarfTypeUnit::initSection(const MCSection *Section) {
1760 assert(!this->Section);
1761 this->Section = Section;
1762 // Since each type unit is contained in its own COMDAT section, the begin
1763 // label and the section label are the same. Using the begin label emission in
1764 // DwarfDebug to emit the section label as well is slightly subtle/sneaky, but
1765 // the only other alternative of lazily constructing start-of-section labels
1766 // and storing a mapping in DwarfDebug (or AsmPrinter).
1767 this->SectionSym = this->LabelBegin =
1768 Asm->GetTempSymbol(Section->getLabelBeginName(), getUniqueID());
1769 this->LabelEnd =
1770 Asm->GetTempSymbol(Section->getLabelEndName(), getUniqueID());
David Blaikiebc563272013-12-13 21:33:40 +00001771}