blob: 902c9c248c5633cd8ba89e451c8d0c352cd4d582 [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),
David Blaikie7cbf58a2014-11-01 18:18:07 +000050 DD(DW), DU(DWU), IndexTyDie(nullptr), Section(nullptr) {
David Blaikiebd579052014-04-28 21:14:27 +000051 assert(UnitTag == dwarf::DW_TAG_compile_unit ||
52 UnitTag == dwarf::DW_TAG_type_unit);
David Blaikie319a05f2013-12-02 19:33:10 +000053 DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
54}
55
David Blaikiebd579052014-04-28 21:14:27 +000056DwarfTypeUnit::DwarfTypeUnit(unsigned UID, DwarfCompileUnit &CU, AsmPrinter *A,
David Blaikie92a2f8a2014-04-28 21:04:29 +000057 DwarfDebug *DW, DwarfFile *DWU,
David Blaikie8287aff2014-03-18 02:13:23 +000058 MCDwarfDwoLineTable *SplitLineTable)
David Blaikiebd579052014-04-28 21:14:27 +000059 : DwarfUnit(UID, dwarf::DW_TAG_type_unit, CU.getCUNode(), A, DW, DWU),
60 CU(CU), SplitLineTable(SplitLineTable) {
David Blaikie4a2f95f2014-03-18 01:17:26 +000061 if (SplitLineTable)
David Blaikiebd579052014-04-28 21:14:27 +000062 addSectionOffset(UnitDie, dwarf::DW_AT_stmt_list, 0);
David Blaikie4a2f95f2014-03-18 01:17:26 +000063}
David Blaikie409dd9c2013-11-19 23:08:21 +000064
David Blaikie319a05f2013-12-02 19:33:10 +000065/// ~Unit - Destructor for compile unit.
Eric Christophera5a79422013-12-09 23:32:48 +000066DwarfUnit::~DwarfUnit() {
Devang Patel0e821f42011-04-12 23:21:44 +000067 for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
68 DIEBlocks[j]->~DIEBlock();
Eric Christopher4a741042014-02-16 08:46:55 +000069 for (unsigned j = 0, M = DIELocs.size(); j < M; ++j)
70 DIELocs[j]->~DIELoc();
Devang Patel0e821f42011-04-12 23:21:44 +000071}
72
73/// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
74/// information entry.
David Blaikie8dbcc3f2014-04-25 19:33:43 +000075DIEEntry *DwarfUnit::createDIEEntry(DIE &Entry) {
Devang Patel0e821f42011-04-12 23:21:44 +000076 DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
77 return Value;
78}
79
Bill Wendling3495f9b2012-12-06 07:55:19 +000080/// getDefaultLowerBound - Return the default lower bound for an array. If the
Bill Wendling28fe9e72012-12-06 07:38:10 +000081/// DWARF version doesn't handle the language, return -1.
Eric Christophera5a79422013-12-09 23:32:48 +000082int64_t DwarfUnit::getDefaultLowerBound() const {
David Blaikiecb8e4352013-11-15 23:50:53 +000083 switch (getLanguage()) {
Bill Wendling28fe9e72012-12-06 07:38:10 +000084 default:
85 break;
86
87 case dwarf::DW_LANG_C89:
88 case dwarf::DW_LANG_C99:
89 case dwarf::DW_LANG_C:
90 case dwarf::DW_LANG_C_plus_plus:
91 case dwarf::DW_LANG_ObjC:
92 case dwarf::DW_LANG_ObjC_plus_plus:
93 return 0;
94
95 case dwarf::DW_LANG_Fortran77:
96 case dwarf::DW_LANG_Fortran90:
97 case dwarf::DW_LANG_Fortran95:
98 return 1;
99
100 // The languages below have valid values only if the DWARF version >= 4.
101 case dwarf::DW_LANG_Java:
102 case dwarf::DW_LANG_Python:
103 case dwarf::DW_LANG_UPC:
104 case dwarf::DW_LANG_D:
105 if (dwarf::DWARF_VERSION >= 4)
106 return 0;
107 break;
108
109 case dwarf::DW_LANG_Ada83:
110 case dwarf::DW_LANG_Ada95:
111 case dwarf::DW_LANG_Cobol74:
112 case dwarf::DW_LANG_Cobol85:
113 case dwarf::DW_LANG_Modula2:
114 case dwarf::DW_LANG_Pascal83:
115 case dwarf::DW_LANG_PLI:
116 if (dwarf::DWARF_VERSION >= 4)
117 return 1;
118 break;
119 }
120
121 return -1;
122}
123
Manman Ren4dbdc902013-10-31 17:54:35 +0000124/// Check whether the DIE for this MDNode can be shared across CUs.
David Blaikie4201ddf2013-11-15 22:59:36 +0000125static bool isShareableAcrossCUs(DIDescriptor D) {
David Blaikiebcb418e2013-11-20 18:40:16 +0000126 // When the MDNode can be part of the type system, the DIE can be shared
127 // across CUs.
128 // Combining type units and cross-CU DIE sharing is lower value (since
129 // cross-CU DIE sharing is used in LTO and removes type redundancy at that
130 // level already) but may be implementable for some value in projects
131 // building multiple independent libraries with LTO and then linking those
132 // together.
David Blaikie409dd9c2013-11-19 23:08:21 +0000133 return (D.isType() ||
134 (D.isSubprogram() && !DISubprogram(D).isDefinition())) &&
Eric Christopher4287a492013-12-09 23:57:44 +0000135 !GenerateDwarfTypeUnits;
Manman Ren4dbdc902013-10-31 17:54:35 +0000136}
137
138/// getDIE - Returns the debug information entry map slot for the
139/// specified debug variable. We delegate the request to DwarfDebug
140/// when the DIE for this MDNode can be shared across CUs. The mappings
141/// will be kept in DwarfDebug for shareable DIEs.
Eric Christophera5a79422013-12-09 23:32:48 +0000142DIE *DwarfUnit::getDIE(DIDescriptor D) const {
David Blaikie2ad00162013-11-15 23:09:13 +0000143 if (isShareableAcrossCUs(D))
144 return DD->getDIE(D);
145 return MDNodeToDieMap.lookup(D);
Manman Ren4dbdc902013-10-31 17:54:35 +0000146}
147
148/// insertDIE - Insert DIE into the map. We delegate the request to DwarfDebug
149/// when the DIE for this MDNode can be shared across CUs. The mappings
150/// will be kept in DwarfDebug for shareable DIEs.
Eric Christophera5a79422013-12-09 23:32:48 +0000151void DwarfUnit::insertDIE(DIDescriptor Desc, DIE *D) {
David Blaikie2ad00162013-11-15 23:09:13 +0000152 if (isShareableAcrossCUs(Desc)) {
153 DD->insertDIE(Desc, D);
Manman Ren4dbdc902013-10-31 17:54:35 +0000154 return;
155 }
David Blaikie2ad00162013-11-15 23:09:13 +0000156 MDNodeToDieMap.insert(std::make_pair(Desc, D));
Manman Ren4dbdc902013-10-31 17:54:35 +0000157}
158
Eric Christopherbb69a272012-08-24 01:14:27 +0000159/// addFlag - Add a flag that is true.
David Blaikie65a74662014-04-25 18:26:14 +0000160void DwarfUnit::addFlag(DIE &Die, dwarf::Attribute Attribute) {
Michael Gottesmanc89466f2013-09-04 04:39:38 +0000161 if (DD->getDwarfVersion() >= 4)
David Blaikie65a74662014-04-25 18:26:14 +0000162 Die.addValue(Attribute, dwarf::DW_FORM_flag_present, DIEIntegerOne);
Eric Christopherbb69a272012-08-24 01:14:27 +0000163 else
David Blaikie65a74662014-04-25 18:26:14 +0000164 Die.addValue(Attribute, dwarf::DW_FORM_flag, DIEIntegerOne);
Eric Christopherbb69a272012-08-24 01:14:27 +0000165}
166
Devang Patel0e821f42011-04-12 23:21:44 +0000167/// addUInt - Add an unsigned integer attribute data and value.
168///
David Blaikie65a74662014-04-25 18:26:14 +0000169void DwarfUnit::addUInt(DIE &Die, dwarf::Attribute Attribute,
Eric Christophera5a79422013-12-09 23:32:48 +0000170 Optional<dwarf::Form> Form, uint64_t Integer) {
Eric Christopherc2697f82013-10-19 01:04:47 +0000171 if (!Form)
172 Form = DIEInteger::BestForm(false, Integer);
173 DIEValue *Value = Integer == 1 ? DIEIntegerOne : new (DIEValueAllocator)
174 DIEInteger(Integer);
David Blaikie65a74662014-04-25 18:26:14 +0000175 Die.addValue(Attribute, *Form, Value);
David Blaikief2443192013-10-21 17:28:37 +0000176}
177
David Blaikie65a74662014-04-25 18:26:14 +0000178void DwarfUnit::addUInt(DIE &Block, dwarf::Form Form, uint64_t Integer) {
David Blaikief2443192013-10-21 17:28:37 +0000179 addUInt(Block, (dwarf::Attribute)0, Form, Integer);
Devang Patel0e821f42011-04-12 23:21:44 +0000180}
181
182/// addSInt - Add an signed integer attribute data and value.
183///
David Blaikie65a74662014-04-25 18:26:14 +0000184void DwarfUnit::addSInt(DIE &Die, dwarf::Attribute Attribute,
Eric Christophera5a79422013-12-09 23:32:48 +0000185 Optional<dwarf::Form> Form, int64_t Integer) {
Eric Christopherc2697f82013-10-19 01:04:47 +0000186 if (!Form)
187 Form = DIEInteger::BestForm(true, Integer);
Devang Patel0e821f42011-04-12 23:21:44 +0000188 DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
David Blaikie65a74662014-04-25 18:26:14 +0000189 Die.addValue(Attribute, *Form, Value);
David Blaikief2443192013-10-21 17:28:37 +0000190}
191
David Blaikie65a74662014-04-25 18:26:14 +0000192void DwarfUnit::addSInt(DIELoc &Die, Optional<dwarf::Form> Form,
Eric Christophera5a79422013-12-09 23:32:48 +0000193 int64_t Integer) {
David Blaikief2443192013-10-21 17:28:37 +0000194 addSInt(Die, (dwarf::Attribute)0, Form, Integer);
Devang Patel0e821f42011-04-12 23:21:44 +0000195}
196
Nick Lewyckycc64ae12011-10-28 05:29:47 +0000197/// addString - Add a string attribute data and value. We always emit a
198/// reference to the string pool instead of immediate strings so that DIEs have
Eric Christopherfba22602013-01-07 19:32:45 +0000199/// more predictable sizes. In the case of split dwarf we emit an index
200/// into another table which gets us the static offset into the string
201/// table.
David Blaikie65a74662014-04-25 18:26:14 +0000202void DwarfUnit::addString(DIE &Die, dwarf::Attribute Attribute,
Eric Christophera5a79422013-12-09 23:32:48 +0000203 StringRef String) {
Eric Christopher05893f42013-12-30 18:32:31 +0000204
205 if (!DD->useSplitDwarf())
206 return addLocalString(Die, Attribute, String);
207
David Blaikiedaefdbf2014-04-25 21:34:35 +0000208 unsigned idx = DU->getStringPool().getIndex(*Asm, String);
Eric Christopher05893f42013-12-30 18:32:31 +0000209 DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx);
Eric Christopher67646432013-07-26 17:02:41 +0000210 DIEValue *Str = new (DIEValueAllocator) DIEString(Value, String);
David Blaikie65a74662014-04-25 18:26:14 +0000211 Die.addValue(Attribute, dwarf::DW_FORM_GNU_str_index, Str);
Eric Christopher2cbd5762013-01-07 19:32:41 +0000212}
213
214/// addLocalString - Add a string attribute data and value. This is guaranteed
215/// to be in the local string pool instead of indirected.
David Blaikie65a74662014-04-25 18:26:14 +0000216void DwarfUnit::addLocalString(DIE &Die, dwarf::Attribute Attribute,
Eric Christophera5a79422013-12-09 23:32:48 +0000217 StringRef String) {
David Blaikiedaefdbf2014-04-25 21:34:35 +0000218 MCSymbol *Symb = DU->getStringPool().getSymbol(*Asm, String);
Nick Lewyckycc64ae12011-10-28 05:29:47 +0000219 DIEValue *Value;
Eric Christopher84588622013-12-28 01:39:17 +0000220 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000221 Value = new (DIEValueAllocator) DIELabel(Symb);
David Blaikie6741bb02014-09-11 21:12:48 +0000222 else
223 Value = new (DIEValueAllocator) DIEDelta(Symb, DD->getDebugStrSym());
Eric Christopher05893f42013-12-30 18:32:31 +0000224 DIEValue *Str = new (DIEValueAllocator) DIEString(Value, String);
David Blaikie65a74662014-04-25 18:26:14 +0000225 Die.addValue(Attribute, dwarf::DW_FORM_strp, Str);
Devang Patel0e821f42011-04-12 23:21:44 +0000226}
227
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000228/// addExpr - Add a Dwarf expression attribute data and value.
Devang Patel0e821f42011-04-12 23:21:44 +0000229///
David Blaikie65a74662014-04-25 18:26:14 +0000230void DwarfUnit::addExpr(DIELoc &Die, dwarf::Form Form, const MCExpr *Expr) {
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000231 DIEValue *Value = new (DIEValueAllocator) DIEExpr(Expr);
David Blaikie65a74662014-04-25 18:26:14 +0000232 Die.addValue((dwarf::Attribute)0, Form, Value);
Devang Patel0e821f42011-04-12 23:21:44 +0000233}
234
Eric Christophera27220f2014-03-05 22:41:20 +0000235/// addLocationList - Add a Dwarf loclistptr attribute data and value.
236///
David Blaikie65a74662014-04-25 18:26:14 +0000237void DwarfUnit::addLocationList(DIE &Die, dwarf::Attribute Attribute,
Eric Christophera27220f2014-03-05 22:41:20 +0000238 unsigned Index) {
239 DIEValue *Value = new (DIEValueAllocator) DIELocList(Index);
240 dwarf::Form Form = DD->getDwarfVersion() >= 4 ? dwarf::DW_FORM_sec_offset
241 : dwarf::DW_FORM_data4;
David Blaikie65a74662014-04-25 18:26:14 +0000242 Die.addValue(Attribute, Form, Value);
Eric Christophera27220f2014-03-05 22:41:20 +0000243}
244
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000245/// addLabel - Add a Dwarf label attribute data and value.
246///
David Blaikie65a74662014-04-25 18:26:14 +0000247void DwarfUnit::addLabel(DIE &Die, dwarf::Attribute Attribute, dwarf::Form Form,
Eric Christophera5a79422013-12-09 23:32:48 +0000248 const MCSymbol *Label) {
Ulrich Weigand396ba8b2013-07-02 18:46:26 +0000249 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
David Blaikie65a74662014-04-25 18:26:14 +0000250 Die.addValue(Attribute, Form, Value);
David Blaikief3cd7c52013-06-28 20:05:04 +0000251}
252
David Blaikie65a74662014-04-25 18:26:14 +0000253void DwarfUnit::addLabel(DIELoc &Die, dwarf::Form Form, const MCSymbol *Label) {
David Blaikief2443192013-10-21 17:28:37 +0000254 addLabel(Die, (dwarf::Attribute)0, Form, Label);
255}
256
Eric Christopher33ff6972013-11-21 23:46:41 +0000257/// addSectionOffset - Add an offset into a section attribute data and value.
258///
David Blaikie65a74662014-04-25 18:26:14 +0000259void DwarfUnit::addSectionOffset(DIE &Die, dwarf::Attribute Attribute,
Eric Christophera5a79422013-12-09 23:32:48 +0000260 uint64_t Integer) {
Eric Christopher33ff6972013-11-21 23:46:41 +0000261 if (DD->getDwarfVersion() >= 4)
262 addUInt(Die, Attribute, dwarf::DW_FORM_sec_offset, Integer);
263 else
264 addUInt(Die, Attribute, dwarf::DW_FORM_data4, Integer);
265}
266
David Blaikie4a2f95f2014-03-18 01:17:26 +0000267unsigned DwarfTypeUnit::getOrCreateSourceID(StringRef FileName, StringRef DirName) {
268 return SplitLineTable ? SplitLineTable->getFile(DirName, FileName)
269 : getCU().getOrCreateSourceID(FileName, DirName);
270}
271
Eric Christophere9ec2452013-01-18 22:11:33 +0000272/// addOpAddress - Add a dwarf op address data and value using the
273/// form given and an op of either DW_FORM_addr or DW_FORM_GNU_addr_index.
274///
David Blaikie65a74662014-04-25 18:26:14 +0000275void DwarfUnit::addOpAddress(DIELoc &Die, const MCSymbol *Sym) {
Eric Christophere9ec2452013-01-18 22:11:33 +0000276 if (!DD->useSplitDwarf()) {
David Blaikief2443192013-10-21 17:28:37 +0000277 addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
278 addLabel(Die, dwarf::DW_FORM_udata, Sym);
Eric Christophere9ec2452013-01-18 22:11:33 +0000279 } else {
David Blaikief2443192013-10-21 17:28:37 +0000280 addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_addr_index);
David Blaikiee226b082014-04-23 21:04:59 +0000281 addUInt(Die, dwarf::DW_FORM_GNU_addr_index,
David Blaikied75fb282014-04-23 21:20:10 +0000282 DD->getAddressPool().getIndex(Sym));
Eric Christophere9ec2452013-01-18 22:11:33 +0000283 }
284}
285
David Blaikie65a74662014-04-25 18:26:14 +0000286void DwarfUnit::addLabelDelta(DIE &Die, dwarf::Attribute Attribute,
David Blaikie48b1bdc2014-03-07 01:30:55 +0000287 const MCSymbol *Hi, const MCSymbol *Lo) {
288 DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
David Blaikie65a74662014-04-25 18:26:14 +0000289 Die.addValue(Attribute, dwarf::DW_FORM_data4, Value);
David Blaikie48b1bdc2014-03-07 01:30:55 +0000290}
291
Devang Patel0e821f42011-04-12 23:21:44 +0000292/// addDIEEntry - Add a DIE attribute data and value.
293///
David Blaikie8dbcc3f2014-04-25 19:33:43 +0000294void DwarfUnit::addDIEEntry(DIE &Die, dwarf::Attribute Attribute, DIE &Entry) {
Manman Ren4dbdc902013-10-31 17:54:35 +0000295 addDIEEntry(Die, Attribute, createDIEEntry(Entry));
296}
297
David Blaikie65a74662014-04-25 18:26:14 +0000298void DwarfUnit::addDIETypeSignature(DIE &Die, const DwarfTypeUnit &Type) {
David Blaikief3de2ab2014-04-26 16:26:41 +0000299 // Flag the type unit reference as a declaration so that if it contains
300 // members (implicit special members, static data member definitions, member
301 // declarations for definitions in this CU, etc) consumers don't get confused
302 // and think this is a full definition.
303 addFlag(Die, dwarf::DW_AT_declaration);
304
David Blaikie65a74662014-04-25 18:26:14 +0000305 Die.addValue(dwarf::DW_AT_signature, dwarf::DW_FORM_ref_sig8,
306 new (DIEValueAllocator) DIETypeSignature(Type));
David Blaikie47f615e2013-12-17 23:32:35 +0000307}
308
David Blaikie65a74662014-04-25 18:26:14 +0000309void DwarfUnit::addDIEEntry(DIE &Die, dwarf::Attribute Attribute,
Eric Christophera5a79422013-12-09 23:32:48 +0000310 DIEEntry *Entry) {
David Blaikie65a74662014-04-25 18:26:14 +0000311 const DIE *DieCU = Die.getUnitOrNull();
David Blaikie8dbcc3f2014-04-25 19:33:43 +0000312 const DIE *EntryCU = Entry->getEntry().getUnitOrNull();
Manman Ren4dbdc902013-10-31 17:54:35 +0000313 if (!DieCU)
314 // We assume that Die belongs to this CU, if it is not linked to any CU yet.
David Blaikieadcde362014-04-25 18:35:57 +0000315 DieCU = &getUnitDie();
Manman Ren4dbdc902013-10-31 17:54:35 +0000316 if (!EntryCU)
David Blaikieadcde362014-04-25 18:35:57 +0000317 EntryCU = &getUnitDie();
David Blaikie65a74662014-04-25 18:26:14 +0000318 Die.addValue(Attribute,
319 EntryCU == DieCU ? dwarf::DW_FORM_ref4 : dwarf::DW_FORM_ref_addr,
320 Entry);
Devang Patel0e821f42011-04-12 23:21:44 +0000321}
322
Manman Renb987e512013-10-29 00:53:03 +0000323/// Create a DIE with the given Tag, add the DIE to its parent, and
324/// call insertDIE if MD is not null.
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000325DIE &DwarfUnit::createAndAddDIE(unsigned Tag, DIE &Parent, DIDescriptor N) {
David Blaikieefc403b2014-04-12 02:24:04 +0000326 assert(Tag != dwarf::DW_TAG_auto_variable &&
327 Tag != dwarf::DW_TAG_arg_variable);
David Blaikie914046e2014-04-25 20:00:34 +0000328 Parent.addChild(make_unique<DIE>((dwarf::Tag)Tag));
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000329 DIE &Die = *Parent.getChildren().back();
David Blaikie52c50202013-11-16 00:29:01 +0000330 if (N)
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000331 insertDIE(N, &Die);
Manman Renb987e512013-10-29 00:53:03 +0000332 return Die;
333}
334
Devang Patel0e821f42011-04-12 23:21:44 +0000335/// addBlock - Add block data.
336///
David Blaikie65a74662014-04-25 18:26:14 +0000337void DwarfUnit::addBlock(DIE &Die, dwarf::Attribute Attribute, DIELoc *Loc) {
Eric Christopher8bdab432014-02-27 18:36:10 +0000338 Loc->ComputeSize(Asm);
Eric Christopher4a741042014-02-16 08:46:55 +0000339 DIELocs.push_back(Loc); // Memoize so we can call the destructor later on.
David Blaikie65a74662014-04-25 18:26:14 +0000340 Die.addValue(Attribute, Loc->BestForm(DD->getDwarfVersion()), Loc);
Eric Christopher4a741042014-02-16 08:46:55 +0000341}
342
David Blaikie65a74662014-04-25 18:26:14 +0000343void DwarfUnit::addBlock(DIE &Die, dwarf::Attribute Attribute,
Eric Christophera5a79422013-12-09 23:32:48 +0000344 DIEBlock *Block) {
Eric Christopher8bdab432014-02-27 18:36:10 +0000345 Block->ComputeSize(Asm);
Devang Patel0e821f42011-04-12 23:21:44 +0000346 DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
David Blaikie65a74662014-04-25 18:26:14 +0000347 Die.addValue(Attribute, Block->BestForm(), Block);
Devang Patel0e821f42011-04-12 23:21:44 +0000348}
349
350/// addSourceLine - Add location information to specified debug information
351/// entry.
David Blaikie65a74662014-04-25 18:26:14 +0000352void DwarfUnit::addSourceLine(DIE &Die, unsigned Line, StringRef File,
David Blaikie101613e2014-02-12 00:11:25 +0000353 StringRef Directory) {
Devang Patel0e821f42011-04-12 23:21:44 +0000354 if (Line == 0)
355 return;
David Blaikie101613e2014-02-12 00:11:25 +0000356
David Blaikie4a2f95f2014-03-18 01:17:26 +0000357 unsigned FileID = getOrCreateSourceID(File, Directory);
Devang Patel0e821f42011-04-12 23:21:44 +0000358 assert(FileID && "Invalid file id");
David Blaikief2443192013-10-21 17:28:37 +0000359 addUInt(Die, dwarf::DW_AT_decl_file, None, FileID);
360 addUInt(Die, dwarf::DW_AT_decl_line, None, Line);
Devang Patel0e821f42011-04-12 23:21:44 +0000361}
362
363/// addSourceLine - Add location information to specified debug information
364/// entry.
David Blaikie65a74662014-04-25 18:26:14 +0000365void DwarfUnit::addSourceLine(DIE &Die, DIVariable V) {
David Blaikie101613e2014-02-12 00:11:25 +0000366 assert(V.isVariable());
367
Eric Christopher89a575c2014-02-12 22:38:04 +0000368 addSourceLine(Die, V.getLineNumber(), V.getContext().getFilename(),
369 V.getContext().getDirectory());
David Blaikie101613e2014-02-12 00:11:25 +0000370}
371
372/// addSourceLine - Add location information to specified debug information
373/// entry.
David Blaikie65a74662014-04-25 18:26:14 +0000374void DwarfUnit::addSourceLine(DIE &Die, DIGlobalVariable G) {
David Blaikie52019302014-02-11 23:57:03 +0000375 assert(G.isGlobalVariable());
Devang Patel0e821f42011-04-12 23:21:44 +0000376
David Blaikie101613e2014-02-12 00:11:25 +0000377 addSourceLine(Die, G.getLineNumber(), G.getFilename(), G.getDirectory());
Devang Patel0e821f42011-04-12 23:21:44 +0000378}
379
380/// addSourceLine - Add location information to specified debug information
381/// entry.
David Blaikie65a74662014-04-25 18:26:14 +0000382void DwarfUnit::addSourceLine(DIE &Die, DISubprogram SP) {
David Blaikie52019302014-02-11 23:57:03 +0000383 assert(SP.isSubprogram());
Eric Christopher7734ca22012-03-15 23:55:40 +0000384
David Blaikie101613e2014-02-12 00:11:25 +0000385 addSourceLine(Die, SP.getLineNumber(), SP.getFilename(), SP.getDirectory());
Devang Patel0e821f42011-04-12 23:21:44 +0000386}
387
388/// addSourceLine - Add location information to specified debug information
389/// entry.
David Blaikie65a74662014-04-25 18:26:14 +0000390void DwarfUnit::addSourceLine(DIE &Die, DIType Ty) {
David Blaikie52019302014-02-11 23:57:03 +0000391 assert(Ty.isType());
Devang Patel0e821f42011-04-12 23:21:44 +0000392
David Blaikie101613e2014-02-12 00:11:25 +0000393 addSourceLine(Die, Ty.getLineNumber(), Ty.getFilename(), Ty.getDirectory());
Devang Patel0e821f42011-04-12 23:21:44 +0000394}
395
396/// addSourceLine - Add location information to specified debug information
397/// entry.
David Blaikie65a74662014-04-25 18:26:14 +0000398void DwarfUnit::addSourceLine(DIE &Die, DIObjCProperty Ty) {
David Blaikie52019302014-02-11 23:57:03 +0000399 assert(Ty.isObjCProperty());
Eric Christopher70e1bd82012-03-29 08:42:56 +0000400
Eric Christopher70e1bd82012-03-29 08:42:56 +0000401 DIFile File = Ty.getFile();
David Blaikie101613e2014-02-12 00:11:25 +0000402 addSourceLine(Die, Ty.getLineNumber(), File.getFilename(),
403 File.getDirectory());
Eric Christopher70e1bd82012-03-29 08:42:56 +0000404}
405
406/// addSourceLine - Add location information to specified debug information
407/// entry.
David Blaikie65a74662014-04-25 18:26:14 +0000408void DwarfUnit::addSourceLine(DIE &Die, DINameSpace NS) {
David Blaikie52019302014-02-11 23:57:03 +0000409 assert(NS.Verify());
Devang Patel0e821f42011-04-12 23:21:44 +0000410
David Blaikie101613e2014-02-12 00:11:25 +0000411 addSourceLine(Die, NS.getLineNumber(), NS.getFilename(), NS.getDirectory());
Devang Patel0e821f42011-04-12 23:21:44 +0000412}
413
Eric Christopher92331fd2012-11-21 00:34:38 +0000414/// addVariableAddress - Add DW_AT_location attribute for a
Devang Patel77dc5412011-04-27 22:45:24 +0000415/// DbgVariable based on provided MachineLocation.
David Blaikie65a74662014-04-25 18:26:14 +0000416void DwarfUnit::addVariableAddress(const DbgVariable &DV, DIE &Die,
Eric Christophera5a79422013-12-09 23:32:48 +0000417 MachineLocation Location) {
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000418 if (DV.variableHasComplexAddress())
Devang Patel0e821f42011-04-12 23:21:44 +0000419 addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000420 else if (DV.isBlockByrefVariable())
Devang Patel0e821f42011-04-12 23:21:44 +0000421 addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location);
422 else
David Blaikieea2605d2013-06-20 00:25:24 +0000423 addAddress(Die, dwarf::DW_AT_location, Location,
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000424 DV.getVariable().isIndirect());
Devang Patel0e821f42011-04-12 23:21:44 +0000425}
426
Devang Patelba5fbf12011-04-26 19:06:18 +0000427/// addRegisterOp - Add register operand.
Adrian Prantlb1416832014-08-01 22:11:58 +0000428// FIXME: Ideally, this would share the implementation with
429// AsmPrinter::EmitDwarfRegOpPiece.
430void DwarfUnit::addRegisterOpPiece(DIELoc &TheDie, unsigned Reg,
431 unsigned SizeInBits, unsigned OffsetInBits) {
Eric Christopherd9134482014-08-04 21:25:23 +0000432 const TargetRegisterInfo *RI = Asm->TM.getSubtargetImpl()->getRegisterInfo();
Adrian Prantlcbcd5782014-02-11 22:22:15 +0000433 int DWReg = RI->getDwarfRegNum(Reg, false);
434 bool isSubRegister = DWReg < 0;
435
436 unsigned Idx = 0;
437
438 // Go up the super-register chain until we hit a valid dwarf register number.
439 for (MCSuperRegIterator SR(Reg, RI); SR.isValid() && DWReg < 0; ++SR) {
440 DWReg = RI->getDwarfRegNum(*SR, false);
441 if (DWReg >= 0)
442 Idx = RI->getSubRegIndex(*SR, Reg);
443 }
444
445 if (DWReg < 0) {
Eric Christophera13839f2014-02-26 23:27:16 +0000446 DEBUG(dbgs() << "Invalid Dwarf register number.\n");
Adrian Prantlcbcd5782014-02-11 22:22:15 +0000447 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_nop);
448 return;
449 }
450
Adrian Prantlb1416832014-08-01 22:11:58 +0000451 // Emit register.
Devang Patelba5fbf12011-04-26 19:06:18 +0000452 if (DWReg < 32)
David Blaikief2443192013-10-21 17:28:37 +0000453 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + DWReg);
Devang Patelba5fbf12011-04-26 19:06:18 +0000454 else {
David Blaikief2443192013-10-21 17:28:37 +0000455 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
456 addUInt(TheDie, dwarf::DW_FORM_udata, DWReg);
Devang Patelba5fbf12011-04-26 19:06:18 +0000457 }
Adrian Prantlcbcd5782014-02-11 22:22:15 +0000458
Adrian Prantlb1416832014-08-01 22:11:58 +0000459 // Emit mask.
460 bool isPiece = SizeInBits > 0;
461 if (isSubRegister || isPiece) {
462 const unsigned SizeOfByte = 8;
463 unsigned RegSizeInBits = RI->getSubRegIdxSize(Idx);
464 unsigned RegOffsetInBits = RI->getSubRegIdxOffset(Idx);
465 unsigned PieceSizeInBits = std::max(SizeInBits, RegSizeInBits);
466 unsigned PieceOffsetInBits = OffsetInBits ? OffsetInBits : RegOffsetInBits;
467 assert(RegSizeInBits >= SizeInBits && "register smaller than value");
468
469 if (RegOffsetInBits != PieceOffsetInBits) {
470 // Manually shift the value into place, since the DW_OP_piece
471 // describes the part of the variable, not the position of the
472 // subregister.
473 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
474 addUInt(TheDie, dwarf::DW_FORM_data1, RegOffsetInBits);
475 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_shr);
476 }
477
478 if (PieceOffsetInBits > 0 || PieceSizeInBits % SizeOfByte) {
479 assert(PieceSizeInBits > 0 && "piece has zero size");
Adrian Prantlcbcd5782014-02-11 22:22:15 +0000480 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_bit_piece);
Adrian Prantlb1416832014-08-01 22:11:58 +0000481 addUInt(TheDie, dwarf::DW_FORM_data1, PieceSizeInBits);
482 addUInt(TheDie, dwarf::DW_FORM_data1, PieceOffsetInBits);
483 } else {
484 assert(PieceSizeInBits > 0 && "piece has zero size");
Adrian Prantlcbcd5782014-02-11 22:22:15 +0000485 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_piece);
Adrian Prantlb1416832014-08-01 22:11:58 +0000486 addUInt(TheDie, dwarf::DW_FORM_data1, PieceSizeInBits/SizeOfByte);
Adrian Prantlcbcd5782014-02-11 22:22:15 +0000487 }
488 }
Devang Patelba5fbf12011-04-26 19:06:18 +0000489}
490
491/// addRegisterOffset - Add register offset.
David Blaikie65a74662014-04-25 18:26:14 +0000492void DwarfUnit::addRegisterOffset(DIELoc &TheDie, unsigned Reg,
Eric Christophera5a79422013-12-09 23:32:48 +0000493 int64_t Offset) {
Eric Christopherd9134482014-08-04 21:25:23 +0000494 const TargetRegisterInfo *RI = Asm->TM.getSubtargetImpl()->getRegisterInfo();
Devang Patelba5fbf12011-04-26 19:06:18 +0000495 unsigned DWReg = RI->getDwarfRegNum(Reg, false);
Eric Christopherd9134482014-08-04 21:25:23 +0000496 const TargetRegisterInfo *TRI = Asm->TM.getSubtargetImpl()->getRegisterInfo();
Devang Patelba5fbf12011-04-26 19:06:18 +0000497 if (Reg == TRI->getFrameRegister(*Asm->MF))
498 // If variable offset is based in frame register then use fbreg.
David Blaikief2443192013-10-21 17:28:37 +0000499 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
Devang Patelba5fbf12011-04-26 19:06:18 +0000500 else if (DWReg < 32)
David Blaikief2443192013-10-21 17:28:37 +0000501 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DWReg);
Devang Patelba5fbf12011-04-26 19:06:18 +0000502 else {
David Blaikief2443192013-10-21 17:28:37 +0000503 addUInt(TheDie, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
504 addUInt(TheDie, dwarf::DW_FORM_udata, DWReg);
Devang Patelba5fbf12011-04-26 19:06:18 +0000505 }
David Blaikief2443192013-10-21 17:28:37 +0000506 addSInt(TheDie, dwarf::DW_FORM_sdata, Offset);
Devang Patelba5fbf12011-04-26 19:06:18 +0000507}
508
509/// addAddress - Add an address attribute to a die based on the location
510/// provided.
David Blaikie65a74662014-04-25 18:26:14 +0000511void DwarfUnit::addAddress(DIE &Die, dwarf::Attribute Attribute,
Eric Christophera5a79422013-12-09 23:32:48 +0000512 const MachineLocation &Location, bool Indirect) {
Eric Christopher4a741042014-02-16 08:46:55 +0000513 DIELoc *Loc = new (DIEValueAllocator) DIELoc();
Devang Patelba5fbf12011-04-26 19:06:18 +0000514
David Blaikieea2605d2013-06-20 00:25:24 +0000515 if (Location.isReg() && !Indirect)
Adrian Prantlb1416832014-08-01 22:11:58 +0000516 addRegisterOpPiece(*Loc, Location.getReg());
David Blaikieea2605d2013-06-20 00:25:24 +0000517 else {
David Blaikie65a74662014-04-25 18:26:14 +0000518 addRegisterOffset(*Loc, Location.getReg(), Location.getOffset());
David Blaikieea2605d2013-06-20 00:25:24 +0000519 if (Indirect && !Location.isReg()) {
David Blaikie65a74662014-04-25 18:26:14 +0000520 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
David Blaikieea2605d2013-06-20 00:25:24 +0000521 }
522 }
Devang Patelba5fbf12011-04-26 19:06:18 +0000523
524 // Now attach the location information to the DIE.
Eric Christopher4a741042014-02-16 08:46:55 +0000525 addBlock(Die, Attribute, Loc);
Devang Patelba5fbf12011-04-26 19:06:18 +0000526}
527
Devang Patel0e821f42011-04-12 23:21:44 +0000528/// addComplexAddress - Start with the address based on the location provided,
529/// and generate the DWARF information necessary to find the actual variable
Eric Christopher1c70b672013-12-05 00:13:15 +0000530/// given the extra address information encoded in the DbgVariable, starting
531/// from the starting location. Add the DWARF information to the die.
Devang Patel0e821f42011-04-12 23:21:44 +0000532///
David Blaikie65a74662014-04-25 18:26:14 +0000533void DwarfUnit::addComplexAddress(const DbgVariable &DV, DIE &Die,
Eric Christophera5a79422013-12-09 23:32:48 +0000534 dwarf::Attribute Attribute,
535 const MachineLocation &Location) {
Eric Christopher4a741042014-02-16 08:46:55 +0000536 DIELoc *Loc = new (DIEValueAllocator) DIELoc();
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000537 unsigned N = DV.getNumAddrElements();
Devang Patel3e021532011-04-28 02:22:40 +0000538 unsigned i = 0;
539 if (Location.isReg()) {
Adrian Prantl87b7eb92014-10-01 18:55:02 +0000540 if (N >= 2 && DV.getAddrElement(0) == dwarf::DW_OP_plus) {
541 assert(!DV.getVariable().isIndirect() &&
542 "double indirection not handled");
Devang Patel3e021532011-04-28 02:22:40 +0000543 // If first address element is OpPlus then emit
544 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
David Blaikie65a74662014-04-25 18:26:14 +0000545 addRegisterOffset(*Loc, Location.getReg(), DV.getAddrElement(1));
Devang Patel3e021532011-04-28 02:22:40 +0000546 i = 2;
Adrian Prantl87b7eb92014-10-01 18:55:02 +0000547 } else if (N >= 2 && DV.getAddrElement(0) == dwarf::DW_OP_deref) {
548 assert(!DV.getVariable().isIndirect() &&
549 "double indirection not handled");
550 addRegisterOpPiece(*Loc, Location.getReg(),
551 DV.getExpression().getPieceSize(),
552 DV.getExpression().getPieceOffset());
553 i = 3;
Devang Patel3e021532011-04-28 02:22:40 +0000554 } else
Adrian Prantlb1416832014-08-01 22:11:58 +0000555 addRegisterOpPiece(*Loc, Location.getReg());
Eric Christopherc2697f82013-10-19 01:04:47 +0000556 } else
David Blaikie65a74662014-04-25 18:26:14 +0000557 addRegisterOffset(*Loc, Location.getReg(), Location.getOffset());
Devang Patel0e821f42011-04-12 23:21:44 +0000558
Eric Christopherc2697f82013-10-19 01:04:47 +0000559 for (; i < N; ++i) {
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000560 uint64_t Element = DV.getAddrElement(i);
Adrian Prantl87b7eb92014-10-01 18:55:02 +0000561 if (Element == dwarf::DW_OP_plus) {
David Blaikie65a74662014-04-25 18:26:14 +0000562 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
563 addUInt(*Loc, dwarf::DW_FORM_udata, DV.getAddrElement(++i));
Adrian Prantlb1416832014-08-01 22:11:58 +0000564
Adrian Prantl87b7eb92014-10-01 18:55:02 +0000565 } else if (Element == dwarf::DW_OP_deref) {
Eric Christopher4d250522012-05-08 18:56:00 +0000566 if (!Location.isReg())
David Blaikie65a74662014-04-25 18:26:14 +0000567 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Adrian Prantlb1416832014-08-01 22:11:58 +0000568
Adrian Prantl87b7eb92014-10-01 18:55:02 +0000569 } else if (Element == dwarf::DW_OP_piece) {
Adrian Prantlb1416832014-08-01 22:11:58 +0000570 const unsigned SizeOfByte = 8;
571 unsigned PieceOffsetInBits = DV.getAddrElement(++i)*SizeOfByte;
572 unsigned PieceSizeInBits = DV.getAddrElement(++i)*SizeOfByte;
573 // Emit DW_OP_bit_piece Size Offset.
574 assert(PieceSizeInBits > 0 && "piece has zero size");
575 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_bit_piece);
576 addUInt(*Loc, dwarf::DW_FORM_udata, PieceSizeInBits);
577 addUInt(*Loc, dwarf::DW_FORM_udata, PieceOffsetInBits);
578
Eric Christopherc2697f82013-10-19 01:04:47 +0000579 } else
580 llvm_unreachable("unknown DIBuilder Opcode");
Devang Patel0e821f42011-04-12 23:21:44 +0000581 }
582
583 // Now attach the location information to the DIE.
Eric Christopher4a741042014-02-16 08:46:55 +0000584 addBlock(Die, Attribute, Loc);
Devang Patel0e821f42011-04-12 23:21:44 +0000585}
586
587/* Byref variables, in Blocks, are declared by the programmer as "SomeType
588 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
589 gives the variable VarName either the struct, or a pointer to the struct, as
590 its type. This is necessary for various behind-the-scenes things the
591 compiler needs to do with by-reference variables in Blocks.
592
593 However, as far as the original *programmer* is concerned, the variable
594 should still have type 'SomeType', as originally declared.
595
596 The function getBlockByrefType dives into the __Block_byref_x_VarName
597 struct to find the original type of the variable, which is then assigned to
598 the variable's Debug Information Entry as its real type. So far, so good.
599 However now the debugger will expect the variable VarName to have the type
600 SomeType. So we need the location attribute for the variable to be an
601 expression that explains to the debugger how to navigate through the
602 pointers and struct to find the actual variable of type SomeType.
603
604 The following function does just that. We start by getting
605 the "normal" location for the variable. This will be the location
606 of either the struct __Block_byref_x_VarName or the pointer to the
607 struct __Block_byref_x_VarName.
608
609 The struct will look something like:
610
611 struct __Block_byref_x_VarName {
612 ... <various fields>
613 struct __Block_byref_x_VarName *forwarding;
614 ... <various other fields>
615 SomeType VarName;
616 ... <maybe more fields>
617 };
618
619 If we are given the struct directly (as our starting point) we
620 need to tell the debugger to:
621
622 1). Add the offset of the forwarding field.
623
624 2). Follow that pointer to get the real __Block_byref_x_VarName
625 struct to use (the real one may have been copied onto the heap).
626
627 3). Add the offset for the field VarName, to find the actual variable.
628
629 If we started with a pointer to the struct, then we need to
630 dereference that pointer first, before the other steps.
631 Translating this into DWARF ops, we will need to append the following
632 to the current location description for the variable:
633
634 DW_OP_deref -- optional, if we start with a pointer
635 DW_OP_plus_uconst <forward_fld_offset>
636 DW_OP_deref
637 DW_OP_plus_uconst <varName_fld_offset>
638
639 That is what this function does. */
640
641/// addBlockByrefAddress - Start with the address based on the location
642/// provided, and generate the DWARF information necessary to find the
643/// actual Block variable (navigating the Block struct) based on the
644/// starting location. Add the DWARF information to the die. For
645/// more information, read large comment just above here.
646///
David Blaikie65a74662014-04-25 18:26:14 +0000647void DwarfUnit::addBlockByrefAddress(const DbgVariable &DV, DIE &Die,
Eric Christophera5a79422013-12-09 23:32:48 +0000648 dwarf::Attribute Attribute,
649 const MachineLocation &Location) {
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000650 DIType Ty = DV.getType();
Devang Patel0e821f42011-04-12 23:21:44 +0000651 DIType TmpTy = Ty;
Eric Christopher31b05762013-08-08 01:41:00 +0000652 uint16_t Tag = Ty.getTag();
Devang Patel0e821f42011-04-12 23:21:44 +0000653 bool isPointer = false;
654
Eric Christopherbf2d23c2013-06-24 21:07:27 +0000655 StringRef varName = DV.getName();
Devang Patel0e821f42011-04-12 23:21:44 +0000656
657 if (Tag == dwarf::DW_TAG_pointer_type) {
David Blaikie4f6bf27a2013-11-18 23:33:32 +0000658 DIDerivedType DTy(Ty);
Manman Ren93b30902013-10-08 18:42:58 +0000659 TmpTy = resolve(DTy.getTypeDerivedFrom());
Devang Patel0e821f42011-04-12 23:21:44 +0000660 isPointer = true;
661 }
662
David Blaikie4f6bf27a2013-11-18 23:33:32 +0000663 DICompositeType blockStruct(TmpTy);
Devang Patel0e821f42011-04-12 23:21:44 +0000664
665 // Find the __forwarding field and the variable field in the __Block_byref
666 // struct.
Manman Renab8ffba2014-07-28 19:14:13 +0000667 DIArray Fields = blockStruct.getElements();
David Blaikie4f6bf27a2013-11-18 23:33:32 +0000668 DIDerivedType varField;
669 DIDerivedType forwardingField;
Devang Patel0e821f42011-04-12 23:21:44 +0000670
671 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
David Blaikie4f6bf27a2013-11-18 23:33:32 +0000672 DIDerivedType DT(Fields.getElement(i));
Devang Patel0e821f42011-04-12 23:21:44 +0000673 StringRef fieldName = DT.getName();
674 if (fieldName == "__forwarding")
David Blaikie4f6bf27a2013-11-18 23:33:32 +0000675 forwardingField = DT;
Devang Patel0e821f42011-04-12 23:21:44 +0000676 else if (fieldName == varName)
David Blaikie4f6bf27a2013-11-18 23:33:32 +0000677 varField = DT;
Devang Patel0e821f42011-04-12 23:21:44 +0000678 }
679
680 // Get the offsets for the forwarding field and the variable field.
David Blaikie4f6bf27a2013-11-18 23:33:32 +0000681 unsigned forwardingFieldOffset = forwardingField.getOffsetInBits() >> 3;
682 unsigned varFieldOffset = varField.getOffsetInBits() >> 2;
Devang Patel0e821f42011-04-12 23:21:44 +0000683
684 // Decode the original location, and use that as the start of the byref
685 // variable's location.
Eric Christopher4a741042014-02-16 08:46:55 +0000686 DIELoc *Loc = new (DIEValueAllocator) DIELoc();
Devang Patel0e821f42011-04-12 23:21:44 +0000687
Eric Christopheref9d7102012-07-04 02:02:18 +0000688 if (Location.isReg())
Adrian Prantlb1416832014-08-01 22:11:58 +0000689 addRegisterOpPiece(*Loc, Location.getReg());
Eric Christopheref9d7102012-07-04 02:02:18 +0000690 else
David Blaikie65a74662014-04-25 18:26:14 +0000691 addRegisterOffset(*Loc, Location.getReg(), Location.getOffset());
Devang Patel0e821f42011-04-12 23:21:44 +0000692
693 // If we started with a pointer to the __Block_byref... struct, then
694 // the first thing we need to do is dereference the pointer (DW_OP_deref).
695 if (isPointer)
David Blaikie65a74662014-04-25 18:26:14 +0000696 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Devang Patel0e821f42011-04-12 23:21:44 +0000697
698 // Next add the offset for the '__forwarding' field:
699 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
700 // adding the offset if it's 0.
701 if (forwardingFieldOffset > 0) {
David Blaikie65a74662014-04-25 18:26:14 +0000702 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
703 addUInt(*Loc, dwarf::DW_FORM_udata, forwardingFieldOffset);
Devang Patel0e821f42011-04-12 23:21:44 +0000704 }
705
706 // Now dereference the __forwarding field to get to the real __Block_byref
707 // struct: DW_OP_deref.
David Blaikie65a74662014-04-25 18:26:14 +0000708 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Devang Patel0e821f42011-04-12 23:21:44 +0000709
710 // Now that we've got the real __Block_byref... struct, add the offset
711 // for the variable's field to get to the location of the actual variable:
712 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
713 if (varFieldOffset > 0) {
David Blaikie65a74662014-04-25 18:26:14 +0000714 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
715 addUInt(*Loc, dwarf::DW_FORM_udata, varFieldOffset);
Devang Patel0e821f42011-04-12 23:21:44 +0000716 }
717
718 // Now attach the location information to the DIE.
Eric Christopher4a741042014-02-16 08:46:55 +0000719 addBlock(Die, Attribute, Loc);
Devang Patel0e821f42011-04-12 23:21:44 +0000720}
721
Manman Renb3388602013-10-05 01:43:03 +0000722/// Return true if type encoding is unsigned.
723static bool isUnsignedDIType(DwarfDebug *DD, DIType Ty) {
724 DIDerivedType DTy(Ty);
David Blaikiee0f14742014-05-11 17:04:05 +0000725 if (DTy.isDerivedType()) {
David Blaikie2af1c802014-05-20 18:21:51 +0000726 dwarf::Tag T = (dwarf::Tag)Ty.getTag();
727 // Encode pointer constants as unsigned bytes. This is used at least for
David Blaikie93ef46b2014-05-20 21:40:13 +0000728 // null pointer constant emission.
729 // FIXME: reference and rvalue_reference /probably/ shouldn't be allowed
730 // here, but accept them for now due to a bug in SROA producing bogus
731 // dbg.values.
David Blaikie2af1c802014-05-20 18:21:51 +0000732 if (T == dwarf::DW_TAG_pointer_type ||
David Blaikie93ef46b2014-05-20 21:40:13 +0000733 T == dwarf::DW_TAG_ptr_to_member_type ||
734 T == dwarf::DW_TAG_reference_type ||
735 T == dwarf::DW_TAG_rvalue_reference_type)
David Blaikie2af1c802014-05-20 18:21:51 +0000736 return true;
737 assert(T == dwarf::DW_TAG_typedef || T == dwarf::DW_TAG_const_type ||
738 T == dwarf::DW_TAG_volatile_type ||
David Blaikie1d9aec62014-05-20 18:36:35 +0000739 T == dwarf::DW_TAG_restrict_type ||
740 T == dwarf::DW_TAG_enumeration_type);
David Blaikie2af1c802014-05-20 18:21:51 +0000741 if (DITypeRef Deriv = DTy.getTypeDerivedFrom())
742 return isUnsignedDIType(DD, DD->resolve(Deriv));
David Blaikiee0f14742014-05-11 17:04:05 +0000743 // FIXME: Enums without a fixed underlying type have unknown signedness
744 // here, leading to incorrectly emitted constants.
745 assert(DTy.getTag() == dwarf::DW_TAG_enumeration_type);
746 return false;
747 }
Manman Renb3388602013-10-05 01:43:03 +0000748
749 DIBasicType BTy(Ty);
David Blaikiee0f14742014-05-11 17:04:05 +0000750 assert(BTy.isBasicType());
David Blaikie60cae1b2014-05-11 16:08:41 +0000751 unsigned Encoding = BTy.getEncoding();
Saleem Abdulrasoolfba09d42014-05-12 06:08:18 +0000752 assert((Encoding == dwarf::DW_ATE_unsigned ||
753 Encoding == dwarf::DW_ATE_unsigned_char ||
754 Encoding == dwarf::DW_ATE_signed ||
755 Encoding == dwarf::DW_ATE_signed_char ||
David Blaikiec405c9c2014-05-16 21:53:09 +0000756 Encoding == dwarf::DW_ATE_UTF || Encoding == dwarf::DW_ATE_boolean) &&
757 "Unsupported encoding");
David Blaikie60cae1b2014-05-11 16:08:41 +0000758 return (Encoding == dwarf::DW_ATE_unsigned ||
759 Encoding == dwarf::DW_ATE_unsigned_char ||
David Blaikiec405c9c2014-05-16 21:53:09 +0000760 Encoding == dwarf::DW_ATE_UTF || Encoding == dwarf::DW_ATE_boolean);
Manman Renb3388602013-10-05 01:43:03 +0000761}
762
763/// If this type is derived from a base type then return base type size.
Manman Renbda410f2013-10-08 18:46:58 +0000764static uint64_t getBaseTypeSize(DwarfDebug *DD, DIDerivedType Ty) {
Manman Renb3388602013-10-05 01:43:03 +0000765 unsigned Tag = Ty.getTag();
766
767 if (Tag != dwarf::DW_TAG_member && Tag != dwarf::DW_TAG_typedef &&
768 Tag != dwarf::DW_TAG_const_type && Tag != dwarf::DW_TAG_volatile_type &&
769 Tag != dwarf::DW_TAG_restrict_type)
770 return Ty.getSizeInBits();
771
772 DIType BaseType = DD->resolve(Ty.getTypeDerivedFrom());
773
Eric Christopher8cc04fc2014-03-12 18:18:05 +0000774 // If this type is not derived from any type or the type is a declaration then
775 // take conservative approach.
776 if (!BaseType.isValid() || BaseType.isForwardDecl())
Manman Renb3388602013-10-05 01:43:03 +0000777 return Ty.getSizeInBits();
778
779 // If this is a derived type, go ahead and get the base type, unless it's a
780 // reference then it's just the size of the field. Pointer types have no need
781 // of this since they're a different type of qualification on the type.
782 if (BaseType.getTag() == dwarf::DW_TAG_reference_type ||
783 BaseType.getTag() == dwarf::DW_TAG_rvalue_reference_type)
784 return Ty.getSizeInBits();
785
786 if (BaseType.isDerivedType())
Manman Renbda410f2013-10-08 18:46:58 +0000787 return getBaseTypeSize(DD, DIDerivedType(BaseType));
Manman Renb3388602013-10-05 01:43:03 +0000788
789 return BaseType.getSizeInBits();
790}
791
Devang Patel0e821f42011-04-12 23:21:44 +0000792/// addConstantFPValue - Add constant value entry in variable DIE.
David Blaikie65a74662014-04-25 18:26:14 +0000793void DwarfUnit::addConstantFPValue(DIE &Die, const MachineOperand &MO) {
Eric Christopherc2697f82013-10-19 01:04:47 +0000794 assert(MO.isFPImm() && "Invalid machine operand!");
Devang Patel0e821f42011-04-12 23:21:44 +0000795 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
796 APFloat FPImm = MO.getFPImm()->getValueAPF();
797
798 // Get the raw data form of the floating point.
799 const APInt FltVal = FPImm.bitcastToAPInt();
Eric Christopherc2697f82013-10-19 01:04:47 +0000800 const char *FltPtr = (const char *)FltVal.getRawData();
Devang Patel0e821f42011-04-12 23:21:44 +0000801
802 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
Micah Villmowcdfe20b2012-10-08 16:38:25 +0000803 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel0e821f42011-04-12 23:21:44 +0000804 int Incr = (LittleEndian ? 1 : -1);
805 int Start = (LittleEndian ? 0 : NumBytes - 1);
806 int Stop = (LittleEndian ? NumBytes : -1);
807
808 // Output the constant to DWARF one byte at a time.
809 for (; Start != Stop; Start += Incr)
David Blaikie65a74662014-04-25 18:26:14 +0000810 addUInt(*Block, dwarf::DW_FORM_data1, (unsigned char)0xFF & FltPtr[Start]);
Devang Patel0e821f42011-04-12 23:21:44 +0000811
David Blaikief2443192013-10-21 17:28:37 +0000812 addBlock(Die, dwarf::DW_AT_const_value, Block);
Devang Patel0e821f42011-04-12 23:21:44 +0000813}
814
David Blaikiea39a76e2013-01-20 01:18:01 +0000815/// addConstantFPValue - Add constant value entry in variable DIE.
David Blaikie65a74662014-04-25 18:26:14 +0000816void DwarfUnit::addConstantFPValue(DIE &Die, const ConstantFP *CFP) {
Eric Christopher9d1daa82013-08-27 23:49:04 +0000817 // Pass this down to addConstantValue as an unsigned bag of bits.
818 addConstantValue(Die, CFP->getValueAPF().bitcastToAPInt(), true);
David Blaikiea39a76e2013-01-20 01:18:01 +0000819}
820
Devang Patel0e821f42011-04-12 23:21:44 +0000821/// addConstantValue - Add constant value entry in variable DIE.
David Blaikiec0a28412014-05-11 15:56:59 +0000822void DwarfUnit::addConstantValue(DIE &Die, const ConstantInt *CI, DIType Ty) {
823 addConstantValue(Die, CI->getValue(), Ty);
David Blaikiea39a76e2013-01-20 01:18:01 +0000824}
825
David Blaikiec05c8f42014-05-11 15:47:39 +0000826/// addConstantValue - Add constant value entry in variable DIE.
827void DwarfUnit::addConstantValue(DIE &Die, const MachineOperand &MO,
828 DIType Ty) {
829 assert(MO.isImm() && "Invalid machine operand!");
830
David Blaikie60cae1b2014-05-11 16:08:41 +0000831 addConstantValue(Die, isUnsignedDIType(DD, Ty), MO.getImm());
David Blaikiec05c8f42014-05-11 15:47:39 +0000832}
833
David Blaikie60cae1b2014-05-11 16:08:41 +0000834void DwarfUnit::addConstantValue(DIE &Die, bool Unsigned, uint64_t Val) {
David Blaikiec05c8f42014-05-11 15:47:39 +0000835 // FIXME: This is a bit conservative/simple - it emits negative values always
836 // sign extended to 64 bits rather than minimizing the number of bytes.
837 addUInt(Die, dwarf::DW_AT_const_value,
David Blaikie60cae1b2014-05-11 16:08:41 +0000838 Unsigned ? dwarf::DW_FORM_udata : dwarf::DW_FORM_sdata, Val);
David Blaikiec05c8f42014-05-11 15:47:39 +0000839}
840
David Blaikiec0a28412014-05-11 15:56:59 +0000841void DwarfUnit::addConstantValue(DIE &Die, const APInt &Val, DIType Ty) {
842 addConstantValue(Die, Val, isUnsignedDIType(DD, Ty));
843}
844
David Blaikiea39a76e2013-01-20 01:18:01 +0000845// addConstantValue - Add constant value entry in variable DIE.
David Blaikie65a74662014-04-25 18:26:14 +0000846void DwarfUnit::addConstantValue(DIE &Die, const APInt &Val, bool Unsigned) {
David Blaikiea39a76e2013-01-20 01:18:01 +0000847 unsigned CIBitWidth = Val.getBitWidth();
Devang Patel8816bbc2011-05-28 00:39:18 +0000848 if (CIBitWidth <= 64) {
David Blaikie60cae1b2014-05-11 16:08:41 +0000849 addConstantValue(Die, Unsigned,
850 Unsigned ? Val.getZExtValue() : Val.getSExtValue());
Eric Christopher78fcf4902013-07-03 01:08:30 +0000851 return;
Devang Patel0e821f42011-04-12 23:21:44 +0000852 }
853
854 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
855
856 // Get the raw data form of the large APInt.
NAKAMURA Takumi29ccdd82011-10-28 14:12:22 +0000857 const uint64_t *Ptr64 = Val.getRawData();
Devang Patel0e821f42011-04-12 23:21:44 +0000858
859 int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
Micah Villmowcdfe20b2012-10-08 16:38:25 +0000860 bool LittleEndian = Asm->getDataLayout().isLittleEndian();
Devang Patel0e821f42011-04-12 23:21:44 +0000861
862 // Output the constant to DWARF one byte at a time.
NAKAMURA Takumi29ccdd82011-10-28 14:12:22 +0000863 for (int i = 0; i < NumBytes; i++) {
864 uint8_t c;
865 if (LittleEndian)
866 c = Ptr64[i / 8] >> (8 * (i & 7));
867 else
868 c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7));
David Blaikie65a74662014-04-25 18:26:14 +0000869 addUInt(*Block, dwarf::DW_FORM_data1, c);
NAKAMURA Takumi29ccdd82011-10-28 14:12:22 +0000870 }
Devang Patel0e821f42011-04-12 23:21:44 +0000871
David Blaikief2443192013-10-21 17:28:37 +0000872 addBlock(Die, dwarf::DW_AT_const_value, Block);
Devang Patel0e821f42011-04-12 23:21:44 +0000873}
874
Eric Christopher25e35092013-04-22 07:47:40 +0000875/// addTemplateParams - Add template parameters into buffer.
Eric Christophera5a79422013-12-09 23:32:48 +0000876void DwarfUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
Devang Patel0e821f42011-04-12 23:21:44 +0000877 // Add template parameters.
878 for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) {
879 DIDescriptor Element = TParams.getElement(i);
880 if (Element.isTemplateTypeParameter())
Manman Renffc9a712013-10-23 23:05:28 +0000881 constructTemplateTypeParameterDIE(Buffer,
882 DITemplateTypeParameter(Element));
Devang Patel0e821f42011-04-12 23:21:44 +0000883 else if (Element.isTemplateValueParameter())
Manman Renffc9a712013-10-23 23:05:28 +0000884 constructTemplateValueParameterDIE(Buffer,
885 DITemplateValueParameter(Element));
Devang Patel0e821f42011-04-12 23:21:44 +0000886 }
Devang Patel0e821f42011-04-12 23:21:44 +0000887}
Nick Lewycky654f5ce2011-10-26 22:55:33 +0000888
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000889/// getOrCreateContextDIE - Get context owner's DIE.
Eric Christophera5a79422013-12-09 23:32:48 +0000890DIE *DwarfUnit::getOrCreateContextDIE(DIScope Context) {
David Blaikiebd700e42013-11-14 21:24:34 +0000891 if (!Context || Context.isFile())
David Blaikieadcde362014-04-25 18:35:57 +0000892 return &getUnitDie();
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000893 if (Context.isType())
894 return getOrCreateTypeDIE(DIType(Context));
David Blaikie1dbca702013-11-14 19:37:56 +0000895 if (Context.isNameSpace())
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000896 return getOrCreateNameSpace(DINameSpace(Context));
David Blaikie1dbca702013-11-14 19:37:56 +0000897 if (Context.isSubprogram())
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000898 return getOrCreateSubprogramDIE(DISubprogram(Context));
Adrian Prantl7d828bb2013-11-15 21:05:09 +0000899 return getDIE(Context);
Eric Christopher4d23a4a2013-01-16 01:22:23 +0000900}
901
Eric Christophera5a79422013-12-09 23:32:48 +0000902DIE *DwarfUnit::createTypeDIE(DICompositeType Ty) {
David Blaikie9d861be2013-11-26 00:15:27 +0000903 DIScope Context = resolve(Ty.getContext());
904 DIE *ContextDIE = getOrCreateContextDIE(Context);
David Blaikie409dd9c2013-11-19 23:08:21 +0000905
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000906 if (DIE *TyDIE = getDIE(Ty))
David Blaikie409dd9c2013-11-19 23:08:21 +0000907 return TyDIE;
908
909 // Create new type.
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000910 DIE &TyDIE = createAndAddDIE(Ty.getTag(), *ContextDIE, Ty);
David Blaikie409dd9c2013-11-19 23:08:21 +0000911
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000912 constructTypeDIE(TyDIE, Ty);
David Blaikie409dd9c2013-11-19 23:08:21 +0000913
David Blaikie9d861be2013-11-26 00:15:27 +0000914 updateAcceleratorTables(Context, Ty, TyDIE);
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000915 return &TyDIE;
David Blaikie409dd9c2013-11-19 23:08:21 +0000916}
917
Devang Patel0e821f42011-04-12 23:21:44 +0000918/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
919/// given DIType.
Eric Christophera5a79422013-12-09 23:32:48 +0000920DIE *DwarfUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
David Blaikie32887552013-11-14 22:25:02 +0000921 if (!TyNode)
Craig Topper353eda42014-04-24 06:44:33 +0000922 return nullptr;
Manman Renf4c339e2013-10-29 22:49:29 +0000923
David Blaikie32887552013-11-14 22:25:02 +0000924 DIType Ty(TyNode);
925 assert(Ty.isType());
Adrian Prantlc95ec912014-03-24 21:33:01 +0000926 assert(Ty == resolve(Ty.getRef()) &&
Adrian Prantl0aa1aa22014-03-18 02:35:03 +0000927 "type was not uniqued, possible ODR violation.");
David Blaikie32887552013-11-14 22:25:02 +0000928
David Blaikieee11f222014-04-12 05:35:59 +0000929 // DW_TAG_restrict_type is not supported in DWARF2
930 if (Ty.getTag() == dwarf::DW_TAG_restrict_type && DD->getDwarfVersion() <= 2)
931 return getOrCreateTypeDIE(resolve(DIDerivedType(Ty).getTypeDerivedFrom()));
932
Manman Renf4c339e2013-10-29 22:49:29 +0000933 // Construct the context before querying for the existence of the DIE in case
934 // such construction creates the DIE.
David Blaikie9d861be2013-11-26 00:15:27 +0000935 DIScope Context = resolve(Ty.getContext());
936 DIE *ContextDIE = getOrCreateContextDIE(Context);
Adrian Prantl4583f7d2013-11-15 23:21:39 +0000937 assert(ContextDIE);
Manman Renf4c339e2013-10-29 22:49:29 +0000938
David Blaikie65a74662014-04-25 18:26:14 +0000939 if (DIE *TyDIE = getDIE(Ty))
Devang Patel0e821f42011-04-12 23:21:44 +0000940 return TyDIE;
941
942 // Create new type.
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000943 DIE &TyDIE = createAndAddDIE(Ty.getTag(), *ContextDIE, Ty);
Manman Renf4c339e2013-10-29 22:49:29 +0000944
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000945 updateAcceleratorTables(Context, Ty, TyDIE);
David Blaikiec3d9e9e2014-03-06 01:42:00 +0000946
Devang Patel0e821f42011-04-12 23:21:44 +0000947 if (Ty.isBasicType())
David Blaikie65a74662014-04-25 18:26:14 +0000948 constructTypeDIE(TyDIE, DIBasicType(Ty));
David Blaikie8a263cb2013-11-26 00:22:37 +0000949 else if (Ty.isCompositeType()) {
950 DICompositeType CTy(Ty);
David Blaikiecfb21152014-01-03 18:59:42 +0000951 if (GenerateDwarfTypeUnits && !Ty.isForwardDecl())
952 if (MDString *TypeId = CTy.getIdentifier()) {
David Blaikie15632ae2014-02-12 00:31:30 +0000953 DD->addDwarfTypeUnitType(getCU(), TypeId->getString(), TyDIE, CTy);
Adrian Prantle2da17f2014-03-14 23:08:17 +0000954 // Skip updating the accelerator tables since this is not the full type.
David Blaikie65a74662014-04-25 18:26:14 +0000955 return &TyDIE;
David Blaikiecfb21152014-01-03 18:59:42 +0000956 }
David Blaikie65a74662014-04-25 18:26:14 +0000957 constructTypeDIE(TyDIE, CTy);
David Blaikie8a263cb2013-11-26 00:22:37 +0000958 } else {
Devang Patel0e821f42011-04-12 23:21:44 +0000959 assert(Ty.isDerivedType() && "Unknown kind of DIType");
David Blaikie65a74662014-04-25 18:26:14 +0000960 constructTypeDIE(TyDIE, DIDerivedType(Ty));
Devang Patel0e821f42011-04-12 23:21:44 +0000961 }
David Blaikie2ea848b2013-11-19 22:51:04 +0000962
David Blaikie65a74662014-04-25 18:26:14 +0000963 return &TyDIE;
David Blaikie2ea848b2013-11-19 22:51:04 +0000964}
965
Eric Christophera5a79422013-12-09 23:32:48 +0000966void DwarfUnit::updateAcceleratorTables(DIScope Context, DIType Ty,
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000967 const DIE &TyDIE) {
Eric Christopher21bde872012-01-06 04:35:23 +0000968 if (!Ty.getName().empty() && !Ty.isForwardDecl()) {
969 bool IsImplementation = 0;
970 if (Ty.isCompositeType()) {
971 DICompositeType CT(Ty);
Eric Christopher8ea8e4f2012-01-06 23:03:37 +0000972 // A runtime language of 0 actually means C/C++ and that any
973 // non-negative value is some version of Objective-C/C++.
Eric Christopherc2697f82013-10-19 01:04:47 +0000974 IsImplementation = (CT.getRunTimeLang() == 0) || CT.isObjcClassComplete();
Eric Christopher21bde872012-01-06 04:35:23 +0000975 }
Eric Christophercf7289f2013-09-05 18:20:16 +0000976 unsigned Flags = IsImplementation ? dwarf::DW_FLAG_type_implementation : 0;
David Blaikie18d33752014-04-24 01:23:49 +0000977 DD->addAccelType(Ty.getName(), TyDIE, Flags);
David Blaikie9d861be2013-11-26 00:15:27 +0000978
David Blaikieadbea1e2014-03-12 03:34:38 +0000979 if ((!Context || Context.isCompileUnit() || Context.isFile() ||
980 Context.isNameSpace()) &&
981 getCUNode().getEmissionKind() != DIBuilder::LineTablesOnly)
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000982 GlobalTypes[getParentContextString(Context) + Ty.getName().str()] =
983 &TyDIE;
Eric Christopher21bde872012-01-06 04:35:23 +0000984 }
Devang Patel0e821f42011-04-12 23:21:44 +0000985}
986
987/// addType - Add a new type attribute to the specified entity.
David Blaikie65a74662014-04-25 18:26:14 +0000988void DwarfUnit::addType(DIE &Entity, DIType Ty, dwarf::Attribute Attribute) {
Eric Christopher0df08e22013-08-08 07:40:37 +0000989 assert(Ty && "Trying to add a type that doesn't exist?");
Devang Patel0e821f42011-04-12 23:21:44 +0000990
991 // Check for pre-existence.
992 DIEEntry *Entry = getDIEEntry(Ty);
993 // If it exists then use the existing value.
994 if (Entry) {
Manman Ren4dbdc902013-10-31 17:54:35 +0000995 addDIEEntry(Entity, Attribute, Entry);
Devang Patel0e821f42011-04-12 23:21:44 +0000996 return;
997 }
998
999 // Construct type.
1000 DIE *Buffer = getOrCreateTypeDIE(Ty);
1001
1002 // Set up proxy.
David Blaikie8dbcc3f2014-04-25 19:33:43 +00001003 Entry = createDIEEntry(*Buffer);
Devang Patel0e821f42011-04-12 23:21:44 +00001004 insertDIEEntry(Ty, Entry);
Manman Ren4dbdc902013-10-31 17:54:35 +00001005 addDIEEntry(Entity, Attribute, Entry);
Devang Patel1cb8ab42011-05-31 23:30:30 +00001006}
1007
Eric Christopher9c58f312013-09-20 22:20:55 +00001008/// addGlobalName - Add a new global name to the compile unit.
David Blaikie65a74662014-04-25 18:26:14 +00001009void DwarfUnit::addGlobalName(StringRef Name, DIE &Die, DIScope Context) {
David Blaikieadbea1e2014-03-12 03:34:38 +00001010 if (getCUNode().getEmissionKind() == DIBuilder::LineTablesOnly)
1011 return;
Eric Christopher8dba0d52013-10-19 01:04:42 +00001012 std::string FullName = getParentContextString(Context) + Name.str();
David Blaikie65a74662014-04-25 18:26:14 +00001013 GlobalNames[FullName] = &Die;
Eric Christopher9c58f312013-09-20 22:20:55 +00001014}
1015
Eric Christopher2c8b7902013-10-17 02:06:06 +00001016/// getParentContextString - Walks the metadata parent chain in a language
1017/// specific manner (using the compile unit language) and returns
1018/// it as a string. This is done at the metadata level because DIEs may
1019/// not currently have been added to the parent context and walking the
1020/// DIEs looking for names is more expensive than walking the metadata.
Eric Christophera5a79422013-12-09 23:32:48 +00001021std::string DwarfUnit::getParentContextString(DIScope Context) const {
Eric Christopher2c8b7902013-10-17 02:06:06 +00001022 if (!Context)
1023 return "";
1024
1025 // FIXME: Decide whether to implement this for non-C++ languages.
1026 if (getLanguage() != dwarf::DW_LANG_C_plus_plus)
1027 return "";
1028
Eric Christopher8dba0d52013-10-19 01:04:42 +00001029 std::string CS;
Eric Christopher2c8b7902013-10-17 02:06:06 +00001030 SmallVector<DIScope, 1> Parents;
1031 while (!Context.isCompileUnit()) {
1032 Parents.push_back(Context);
1033 if (Context.getContext())
1034 Context = resolve(Context.getContext());
1035 else
1036 // Structure, etc types will have a NULL context if they're at the top
1037 // level.
1038 break;
1039 }
1040
1041 // Reverse iterate over our list to go from the outermost construct to the
1042 // innermost.
1043 for (SmallVectorImpl<DIScope>::reverse_iterator I = Parents.rbegin(),
1044 E = Parents.rend();
1045 I != E; ++I) {
1046 DIScope Ctx = *I;
1047 StringRef Name = Ctx.getName();
David Blaikie553eb4a2014-06-06 22:16:56 +00001048 if (Name.empty() && Ctx.isNameSpace())
1049 Name = "(anonymous namespace)";
Eric Christopher8dba0d52013-10-19 01:04:42 +00001050 if (!Name.empty()) {
Eric Christopher2c8b7902013-10-17 02:06:06 +00001051 CS += Name;
1052 CS += "::";
1053 }
1054 }
1055 return CS;
Devang Patel0e821f42011-04-12 23:21:44 +00001056}
1057
1058/// constructTypeDIE - Construct basic type die from DIBasicType.
Eric Christophera5a79422013-12-09 23:32:48 +00001059void DwarfUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
Devang Patel0e821f42011-04-12 23:21:44 +00001060 // Get core information.
1061 StringRef Name = BTy.getName();
Devang Patel0e821f42011-04-12 23:21:44 +00001062 // Add name if not anonymous or intermediate type.
1063 if (!Name.empty())
David Blaikie65a74662014-04-25 18:26:14 +00001064 addString(Buffer, dwarf::DW_AT_name, Name);
Devang Patel04d6d472011-09-14 23:13:28 +00001065
David Blaikiefac56122013-10-04 23:21:16 +00001066 // An unspecified type only has a name attribute.
1067 if (BTy.getTag() == dwarf::DW_TAG_unspecified_type)
Devang Patel04d6d472011-09-14 23:13:28 +00001068 return;
Devang Patel04d6d472011-09-14 23:13:28 +00001069
David Blaikie65a74662014-04-25 18:26:14 +00001070 addUInt(Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
Devang Pateld925d1a2012-02-07 23:33:58 +00001071 BTy.getEncoding());
Devang Patel04d6d472011-09-14 23:13:28 +00001072
Devang Patel0e821f42011-04-12 23:21:44 +00001073 uint64_t Size = BTy.getSizeInBits() >> 3;
David Blaikie65a74662014-04-25 18:26:14 +00001074 addUInt(Buffer, dwarf::DW_AT_byte_size, None, Size);
Devang Patel0e821f42011-04-12 23:21:44 +00001075}
1076
1077/// constructTypeDIE - Construct derived type die from DIDerivedType.
Eric Christophera5a79422013-12-09 23:32:48 +00001078void DwarfUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
Devang Patel0e821f42011-04-12 23:21:44 +00001079 // Get core information.
1080 StringRef Name = DTy.getName();
1081 uint64_t Size = DTy.getSizeInBits() >> 3;
David Blaikiefac56122013-10-04 23:21:16 +00001082 uint16_t Tag = Buffer.getTag();
Devang Patel0e821f42011-04-12 23:21:44 +00001083
1084 // Map to main type, void will not have a type.
Manman Ren93b30902013-10-08 18:42:58 +00001085 DIType FromTy = resolve(DTy.getTypeDerivedFrom());
Eric Christopher0df08e22013-08-08 07:40:37 +00001086 if (FromTy)
David Blaikie65a74662014-04-25 18:26:14 +00001087 addType(Buffer, FromTy);
Devang Patel0e821f42011-04-12 23:21:44 +00001088
1089 // Add name if not anonymous or intermediate type.
1090 if (!Name.empty())
David Blaikie65a74662014-04-25 18:26:14 +00001091 addString(Buffer, dwarf::DW_AT_name, Name);
Devang Patel0e821f42011-04-12 23:21:44 +00001092
1093 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopher85757902012-02-21 22:25:53 +00001094 if (Size && Tag != dwarf::DW_TAG_pointer_type)
David Blaikie65a74662014-04-25 18:26:14 +00001095 addUInt(Buffer, dwarf::DW_AT_byte_size, None, Size);
Devang Patel0e821f42011-04-12 23:21:44 +00001096
David Blaikie5d3249b2013-01-07 05:51:15 +00001097 if (Tag == dwarf::DW_TAG_ptr_to_member_type)
David Blaikie65a74662014-04-25 18:26:14 +00001098 addDIEEntry(Buffer, dwarf::DW_AT_containing_type,
David Blaikie8dbcc3f2014-04-25 19:33:43 +00001099 *getOrCreateTypeDIE(resolve(DTy.getClassType())));
Devang Patel0e821f42011-04-12 23:21:44 +00001100 // Add source line info if available and TyDesc is not a forward declaration.
1101 if (!DTy.isForwardDecl())
David Blaikie65a74662014-04-25 18:26:14 +00001102 addSourceLine(Buffer, DTy);
Devang Patel0e821f42011-04-12 23:21:44 +00001103}
1104
Adrian Prantl3f49c892014-02-25 19:57:42 +00001105/// constructSubprogramArguments - Construct function argument DIEs.
Manman Renf8a19672014-07-28 22:24:06 +00001106void DwarfUnit::constructSubprogramArguments(DIE &Buffer, DITypeArray Args) {
Adrian Prantl69140d22014-02-25 22:27:14 +00001107 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
Manman Renf8a19672014-07-28 22:24:06 +00001108 DIType Ty = resolve(Args.getElement(i));
Manman Renf93ac4b2014-07-29 18:20:39 +00001109 if (!Ty) {
Adrian Prantl69140d22014-02-25 22:27:14 +00001110 assert(i == N-1 && "Unspecified parameter must be the last argument");
1111 createAndAddDIE(dwarf::DW_TAG_unspecified_parameters, Buffer);
1112 } else {
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001113 DIE &Arg = createAndAddDIE(dwarf::DW_TAG_formal_parameter, Buffer);
David Blaikiedf1cca32014-10-26 23:37:04 +00001114 addType(Arg, Ty);
1115 if (Ty.isArtificial())
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001116 addFlag(Arg, dwarf::DW_AT_artificial);
Adrian Prantl3f49c892014-02-25 19:57:42 +00001117 }
Adrian Prantl69140d22014-02-25 22:27:14 +00001118 }
Adrian Prantl3f49c892014-02-25 19:57:42 +00001119}
1120
Devang Patel0e821f42011-04-12 23:21:44 +00001121/// constructTypeDIE - Construct type DIE from DICompositeType.
Eric Christophera5a79422013-12-09 23:32:48 +00001122void DwarfUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
David Blaikie409dd9c2013-11-19 23:08:21 +00001123 // Add name if not anonymous or intermediate type.
Devang Patel0e821f42011-04-12 23:21:44 +00001124 StringRef Name = CTy.getName();
1125
1126 uint64_t Size = CTy.getSizeInBits() >> 3;
David Blaikiefac56122013-10-04 23:21:16 +00001127 uint16_t Tag = Buffer.getTag();
Devang Patel0e821f42011-04-12 23:21:44 +00001128
1129 switch (Tag) {
Devang Patel0e821f42011-04-12 23:21:44 +00001130 case dwarf::DW_TAG_array_type:
Eric Christopherdf9955d2013-11-11 18:52:31 +00001131 constructArrayTypeDIE(Buffer, CTy);
Devang Patel0e821f42011-04-12 23:21:44 +00001132 break;
Eric Christopheraeb105f2013-11-11 18:52:39 +00001133 case dwarf::DW_TAG_enumeration_type:
1134 constructEnumTypeDIE(Buffer, CTy);
1135 break;
Devang Patel0e821f42011-04-12 23:21:44 +00001136 case dwarf::DW_TAG_subroutine_type: {
Eric Christopher0df08e22013-08-08 07:40:37 +00001137 // Add return type. A void return won't have a type.
Manman Renf8a19672014-07-28 22:24:06 +00001138 DITypeArray Elements = DISubroutineType(CTy).getTypeArray();
1139 DIType RTy(resolve(Elements.getElement(0)));
Eric Christopher0df08e22013-08-08 07:40:37 +00001140 if (RTy)
David Blaikie65a74662014-04-25 18:26:14 +00001141 addType(Buffer, RTy);
Devang Patel0e821f42011-04-12 23:21:44 +00001142
1143 bool isPrototyped = true;
Adrian Prantl3f49c892014-02-25 19:57:42 +00001144 if (Elements.getNumElements() == 2 &&
Manman Ren72b07e82014-07-29 22:58:13 +00001145 !Elements.getElement(1))
Adrian Prantl3f49c892014-02-25 19:57:42 +00001146 isPrototyped = false;
1147
1148 constructSubprogramArguments(Buffer, Elements);
1149
Eric Christopher5cd2a9d2012-02-22 08:46:21 +00001150 // Add prototype flag if we're dealing with a C language and the
1151 // function has been prototyped.
David Blaikiecb8e4352013-11-15 23:50:53 +00001152 uint16_t Language = getLanguage();
Eric Christopher5cd2a9d2012-02-22 08:46:21 +00001153 if (isPrototyped &&
Eric Christopherc2697f82013-10-19 01:04:47 +00001154 (Language == dwarf::DW_LANG_C89 || Language == dwarf::DW_LANG_C99 ||
Eric Christopherd42b92f2012-05-22 18:45:24 +00001155 Language == dwarf::DW_LANG_ObjC))
David Blaikie65a74662014-04-25 18:26:14 +00001156 addFlag(Buffer, dwarf::DW_AT_prototyped);
Adrian Prantl99c7af22013-12-18 21:48:19 +00001157
1158 if (CTy.isLValueReference())
David Blaikie65a74662014-04-25 18:26:14 +00001159 addFlag(Buffer, dwarf::DW_AT_reference);
Adrian Prantl99c7af22013-12-18 21:48:19 +00001160
1161 if (CTy.isRValueReference())
David Blaikie65a74662014-04-25 18:26:14 +00001162 addFlag(Buffer, dwarf::DW_AT_rvalue_reference);
Eric Christopherc2697f82013-10-19 01:04:47 +00001163 } break;
Devang Patel0e821f42011-04-12 23:21:44 +00001164 case dwarf::DW_TAG_structure_type:
1165 case dwarf::DW_TAG_union_type:
1166 case dwarf::DW_TAG_class_type: {
Devang Patel0e821f42011-04-12 23:21:44 +00001167 // Add elements to structure type.
Manman Renab8ffba2014-07-28 19:14:13 +00001168 DIArray Elements = CTy.getElements();
David Blaikiea1ae0e62013-08-01 20:30:22 +00001169 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
Devang Patel0e821f42011-04-12 23:21:44 +00001170 DIDescriptor Element = Elements.getElement(i);
Adrian Prantlef129fb2014-01-18 02:12:00 +00001171 if (Element.isSubprogram())
David Blaikie65a74662014-04-25 18:26:14 +00001172 getOrCreateSubprogramDIE(DISubprogram(Element));
Adrian Prantlef129fb2014-01-18 02:12:00 +00001173 else if (Element.isDerivedType()) {
Eric Christopherd42b92f2012-05-22 18:45:24 +00001174 DIDerivedType DDTy(Element);
1175 if (DDTy.getTag() == dwarf::DW_TAG_friend) {
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001176 DIE &ElemDie = createAndAddDIE(dwarf::DW_TAG_friend, Buffer);
Manman Ren93b30902013-10-08 18:42:58 +00001177 addType(ElemDie, resolve(DDTy.getTypeDerivedFrom()),
Manman Renb3388602013-10-05 01:43:03 +00001178 dwarf::DW_AT_friend);
Manman Renc6b63922013-10-14 20:33:57 +00001179 } else if (DDTy.isStaticMember()) {
Manman Ren57e6ff72013-10-23 22:57:12 +00001180 getOrCreateStaticMemberDIE(DDTy);
Manman Renc6b63922013-10-14 20:33:57 +00001181 } else {
Manman Ren230ec862013-10-23 23:00:44 +00001182 constructMemberDIE(Buffer, DDTy);
Manman Renc6b63922013-10-14 20:33:57 +00001183 }
Eric Christopher7285c7d2012-03-28 07:34:31 +00001184 } else if (Element.isObjCProperty()) {
Devang Pateld925d1a2012-02-07 23:33:58 +00001185 DIObjCProperty Property(Element);
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001186 DIE &ElemDie = createAndAddDIE(Property.getTag(), Buffer);
Devang Pateld925d1a2012-02-07 23:33:58 +00001187 StringRef PropertyName = Property.getObjCPropertyName();
1188 addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
Eric Christopher4c960562014-01-23 19:16:28 +00001189 if (Property.getType())
1190 addType(ElemDie, Property.getType());
Eric Christopherd42b92f2012-05-22 18:45:24 +00001191 addSourceLine(ElemDie, Property);
Devang Pateld925d1a2012-02-07 23:33:58 +00001192 StringRef GetterName = Property.getObjCPropertyGetterName();
1193 if (!GetterName.empty())
1194 addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
1195 StringRef SetterName = Property.getObjCPropertySetterName();
1196 if (!SetterName.empty())
1197 addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
1198 unsigned PropertyAttributes = 0;
Devang Patel403e8192012-02-04 01:30:32 +00001199 if (Property.isReadOnlyObjCProperty())
1200 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
1201 if (Property.isReadWriteObjCProperty())
1202 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
1203 if (Property.isAssignObjCProperty())
1204 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
1205 if (Property.isRetainObjCProperty())
1206 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
1207 if (Property.isCopyObjCProperty())
1208 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
1209 if (Property.isNonAtomicObjCProperty())
1210 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
1211 if (PropertyAttributes)
David Blaikief2443192013-10-21 17:28:37 +00001212 addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, None,
Eric Christopherc2697f82013-10-19 01:04:47 +00001213 PropertyAttributes);
Devang Patel44882172012-02-06 17:49:43 +00001214
Devang Pateld925d1a2012-02-07 23:33:58 +00001215 DIEEntry *Entry = getDIEEntry(Element);
1216 if (!Entry) {
David Blaikie8dbcc3f2014-04-25 19:33:43 +00001217 Entry = createDIEEntry(ElemDie);
Devang Pateld925d1a2012-02-07 23:33:58 +00001218 insertDIEEntry(Element, Entry);
1219 }
Devang Patel403e8192012-02-04 01:30:32 +00001220 } else
Devang Patel0e821f42011-04-12 23:21:44 +00001221 continue;
Devang Patel0e821f42011-04-12 23:21:44 +00001222 }
1223
1224 if (CTy.isAppleBlockExtension())
David Blaikie65a74662014-04-25 18:26:14 +00001225 addFlag(Buffer, dwarf::DW_AT_APPLE_block);
Devang Patel0e821f42011-04-12 23:21:44 +00001226
Eric Christopher9e429ae2013-10-05 00:27:02 +00001227 DICompositeType ContainingType(resolve(CTy.getContainingType()));
David Blaikie4f6bf27a2013-11-18 23:33:32 +00001228 if (ContainingType)
David Blaikie65a74662014-04-25 18:26:14 +00001229 addDIEEntry(Buffer, dwarf::DW_AT_containing_type,
David Blaikie8dbcc3f2014-04-25 19:33:43 +00001230 *getOrCreateTypeDIE(ContainingType));
Devang Patel0e821f42011-04-12 23:21:44 +00001231
Devang Patel12419ae2011-05-12 21:29:42 +00001232 if (CTy.isObjcClassComplete())
David Blaikie65a74662014-04-25 18:26:14 +00001233 addFlag(Buffer, dwarf::DW_AT_APPLE_objc_complete_type);
Devang Patel2409e782011-05-12 19:06:16 +00001234
Eric Christopherda011dd2011-12-16 23:42:42 +00001235 // Add template parameters to a class, structure or union types.
1236 // FIXME: The support isn't in the metadata for this yet.
1237 if (Tag == dwarf::DW_TAG_class_type ||
Eric Christopherc2697f82013-10-19 01:04:47 +00001238 Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type)
Devang Patel0e821f42011-04-12 23:21:44 +00001239 addTemplateParams(Buffer, CTy.getTemplateParams());
1240
1241 break;
1242 }
1243 default:
1244 break;
1245 }
1246
1247 // Add name if not anonymous or intermediate type.
1248 if (!Name.empty())
David Blaikie65a74662014-04-25 18:26:14 +00001249 addString(Buffer, dwarf::DW_AT_name, Name);
Devang Patel0e821f42011-04-12 23:21:44 +00001250
Eric Christopher775cbd22012-05-22 18:45:18 +00001251 if (Tag == dwarf::DW_TAG_enumeration_type ||
Eric Christopherc2697f82013-10-19 01:04:47 +00001252 Tag == dwarf::DW_TAG_class_type || Tag == dwarf::DW_TAG_structure_type ||
Eric Christopher775cbd22012-05-22 18:45:18 +00001253 Tag == dwarf::DW_TAG_union_type) {
Devang Patel0e821f42011-04-12 23:21:44 +00001254 // Add size if non-zero (derived types might be zero-sized.)
Eric Christopher1cf33382012-06-01 00:22:32 +00001255 // TODO: Do we care about size for enum forward declarations?
Devang Patel0e821f42011-04-12 23:21:44 +00001256 if (Size)
David Blaikie65a74662014-04-25 18:26:14 +00001257 addUInt(Buffer, dwarf::DW_AT_byte_size, None, Size);
Eric Christopher1cf33382012-06-01 00:22:32 +00001258 else if (!CTy.isForwardDecl())
Devang Patel0e821f42011-04-12 23:21:44 +00001259 // Add zero size if it is not a forward declaration.
David Blaikie65a74662014-04-25 18:26:14 +00001260 addUInt(Buffer, dwarf::DW_AT_byte_size, None, 0);
Eric Christopher1cf33382012-06-01 00:22:32 +00001261
1262 // If we're a forward decl, say so.
1263 if (CTy.isForwardDecl())
David Blaikie65a74662014-04-25 18:26:14 +00001264 addFlag(Buffer, dwarf::DW_AT_declaration);
Devang Patel0e821f42011-04-12 23:21:44 +00001265
1266 // Add source line info if available.
1267 if (!CTy.isForwardDecl())
David Blaikie65a74662014-04-25 18:26:14 +00001268 addSourceLine(Buffer, CTy);
Eric Christopher54cf8ff2012-03-07 00:15:19 +00001269
1270 // No harm in adding the runtime language to the declaration.
1271 unsigned RLang = CTy.getRunTimeLang();
1272 if (RLang)
David Blaikie65a74662014-04-25 18:26:14 +00001273 addUInt(Buffer, dwarf::DW_AT_APPLE_runtime_class, dwarf::DW_FORM_data1,
Eric Christopherc2697f82013-10-19 01:04:47 +00001274 RLang);
Devang Patel0e821f42011-04-12 23:21:44 +00001275 }
1276}
1277
Manman Renffc9a712013-10-23 23:05:28 +00001278/// constructTemplateTypeParameterDIE - Construct new DIE for the given
1279/// DITemplateTypeParameter.
Eric Christophera5a79422013-12-09 23:32:48 +00001280void DwarfUnit::constructTemplateTypeParameterDIE(DIE &Buffer,
1281 DITemplateTypeParameter TP) {
David Blaikie65a74662014-04-25 18:26:14 +00001282 DIE &ParamDIE =
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001283 createAndAddDIE(dwarf::DW_TAG_template_type_parameter, Buffer);
Eric Christopher056b6472013-08-08 08:09:43 +00001284 // Add the type if it exists, it could be void and therefore no type.
1285 if (TP.getType())
Manman Ren88b0f942013-10-09 19:46:28 +00001286 addType(ParamDIE, resolve(TP.getType()));
David Blaikie2b380232013-06-22 18:59:11 +00001287 if (!TP.getName().empty())
1288 addString(ParamDIE, dwarf::DW_AT_name, TP.getName());
Devang Patel0e821f42011-04-12 23:21:44 +00001289}
1290
Manman Renffc9a712013-10-23 23:05:28 +00001291/// constructTemplateValueParameterDIE - Construct new DIE for the given
1292/// DITemplateValueParameter.
Eric Christophera5a79422013-12-09 23:32:48 +00001293void
1294DwarfUnit::constructTemplateValueParameterDIE(DIE &Buffer,
David Blaikie319a05f2013-12-02 19:33:10 +00001295 DITemplateValueParameter VP) {
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001296 DIE &ParamDIE = createAndAddDIE(VP.getTag(), Buffer);
Eric Christopher0df08e22013-08-08 07:40:37 +00001297
1298 // Add the type if there is one, template template and template parameter
1299 // packs will not have a type.
Eric Christopher691281b2013-10-21 17:48:51 +00001300 if (VP.getTag() == dwarf::DW_TAG_template_value_parameter)
Manman Ren88b0f942013-10-09 19:46:28 +00001301 addType(ParamDIE, resolve(VP.getType()));
Eric Christopherafb2c412013-08-08 07:40:31 +00001302 if (!VP.getName().empty())
1303 addString(ParamDIE, dwarf::DW_AT_name, VP.getName());
1304 if (Value *Val = VP.getValue()) {
David Blaikiea1e813d2013-05-10 21:52:07 +00001305 if (ConstantInt *CI = dyn_cast<ConstantInt>(Val))
David Blaikiec0a28412014-05-11 15:56:59 +00001306 addConstantValue(ParamDIE, CI, resolve(VP.getType()));
David Blaikiea1e813d2013-05-10 21:52:07 +00001307 else if (GlobalValue *GV = dyn_cast<GlobalValue>(Val)) {
1308 // For declaration non-type template parameters (such as global values and
1309 // functions)
Eric Christopher4a741042014-02-16 08:46:55 +00001310 DIELoc *Loc = new (DIEValueAllocator) DIELoc();
David Blaikie65a74662014-04-25 18:26:14 +00001311 addOpAddress(*Loc, Asm->getSymbol(GV));
David Blaikiea1e813d2013-05-10 21:52:07 +00001312 // Emit DW_OP_stack_value to use the address as the immediate value of the
1313 // parameter, rather than a pointer to it.
David Blaikie65a74662014-04-25 18:26:14 +00001314 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value);
Eric Christopher4a741042014-02-16 08:46:55 +00001315 addBlock(ParamDIE, dwarf::DW_AT_location, Loc);
Eric Christopherafb2c412013-08-08 07:40:31 +00001316 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_template_param) {
David Blaikie2b380232013-06-22 18:59:11 +00001317 assert(isa<MDString>(Val));
1318 addString(ParamDIE, dwarf::DW_AT_GNU_template_name,
1319 cast<MDString>(Val)->getString());
Eric Christopherafb2c412013-08-08 07:40:31 +00001320 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_parameter_pack) {
David Blaikie2b380232013-06-22 18:59:11 +00001321 assert(isa<MDNode>(Val));
1322 DIArray A(cast<MDNode>(Val));
David Blaikie65a74662014-04-25 18:26:14 +00001323 addTemplateParams(ParamDIE, A);
David Blaikiea1e813d2013-05-10 21:52:07 +00001324 }
1325 }
Devang Patel0e821f42011-04-12 23:21:44 +00001326}
1327
Devang Patel17b53272011-05-06 16:57:54 +00001328/// getOrCreateNameSpace - Create a DIE for DINameSpace.
Eric Christophera5a79422013-12-09 23:32:48 +00001329DIE *DwarfUnit::getOrCreateNameSpace(DINameSpace NS) {
Manman Renf6b936b2013-10-29 05:49:41 +00001330 // Construct the context before querying for the existence of the DIE in case
1331 // such construction creates the DIE.
1332 DIE *ContextDIE = getOrCreateContextDIE(NS.getContext());
Manman Renf6b936b2013-10-29 05:49:41 +00001333
David Blaikie65a74662014-04-25 18:26:14 +00001334 if (DIE *NDie = getDIE(NS))
Devang Patel17b53272011-05-06 16:57:54 +00001335 return NDie;
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001336 DIE &NDie = createAndAddDIE(dwarf::DW_TAG_namespace, *ContextDIE, NS);
Manman Renf6b936b2013-10-29 05:49:41 +00001337
David Blaikie553eb4a2014-06-06 22:16:56 +00001338 StringRef Name = NS.getName();
1339 if (!Name.empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +00001340 addString(NDie, dwarf::DW_AT_name, NS.getName());
David Blaikie553eb4a2014-06-06 22:16:56 +00001341 else
1342 Name = "(anonymous namespace)";
1343 DD->addAccelNamespace(Name, NDie);
1344 addGlobalName(Name, NDie, NS.getContext());
Devang Patel17b53272011-05-06 16:57:54 +00001345 addSourceLine(NDie, NS);
David Blaikie65a74662014-04-25 18:26:14 +00001346 return &NDie;
Devang Patel17b53272011-05-06 16:57:54 +00001347}
1348
Devang Patel89543712011-08-15 17:24:54 +00001349/// getOrCreateSubprogramDIE - Create new DIE using SP.
Eric Christophera5a79422013-12-09 23:32:48 +00001350DIE *DwarfUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
David Blaikie309ffe42013-10-04 01:39:59 +00001351 // Construct the context before querying for the existence of the DIE in case
1352 // such construction creates the DIE (as is the case for member function
1353 // declarations).
David Blaikie7f916862014-05-27 18:37:38 +00001354 DIE *ContextDIE = getOrCreateContextDIE(resolve(SP.getContext()));
Adrian Prantld486b342014-03-18 17:41:15 +00001355
David Blaikie65a74662014-04-25 18:26:14 +00001356 if (DIE *SPDie = getDIE(SP))
Devang Patel89543712011-08-15 17:24:54 +00001357 return SPDie;
1358
David Blaikiece7a1bd2014-05-21 18:04:33 +00001359 if (DISubprogram SPDecl = SP.getFunctionDeclaration()) {
Manman Ren73d697c2013-10-29 00:58:04 +00001360 // Add subprogram definitions to the CU die directly.
David Blaikiebd579052014-04-28 21:14:27 +00001361 ContextDIE = &getUnitDie();
Alp Tokerda0c7932014-05-31 21:26:28 +00001362 // Build the decl now to ensure it precedes the definition.
David Blaikie7f916862014-05-27 18:37:38 +00001363 getOrCreateSubprogramDIE(SPDecl);
David Blaikiece7a1bd2014-05-21 18:04:33 +00001364 }
Peter Collingbourne4d358b52012-05-27 18:36:44 +00001365
1366 // DW_TAG_inlined_subroutine may refer to this DIE.
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001367 DIE &SPDie = createAndAddDIE(dwarf::DW_TAG_subprogram, *ContextDIE, SP);
Peter Collingbourne4d358b52012-05-27 18:36:44 +00001368
David Blaikie6cfa9e12014-06-05 00:25:26 +00001369 // Stop here and fill this in later, depending on whether or not this
David Blaikief7221ad2014-05-27 18:37:43 +00001370 // subprogram turns out to have inlined instances or not.
1371 if (SP.isDefinition())
1372 return &SPDie;
1373
David Blaikie7f916862014-05-27 18:37:38 +00001374 applySubprogramAttributes(SP, SPDie);
1375 return &SPDie;
1376}
1377
David Blaikie3dca5992014-06-06 22:29:05 +00001378void DwarfUnit::applySubprogramAttributesToDefinition(DISubprogram SP, DIE &SPDie) {
1379 DISubprogram SPDecl = SP.getFunctionDeclaration();
1380 DIScope Context = resolve(SPDecl ? SPDecl.getContext() : SP.getContext());
1381 applySubprogramAttributes(SP, SPDie);
1382 addGlobalName(SP.getName(), SPDie, Context);
1383}
1384
David Blaikie7f916862014-05-27 18:37:38 +00001385void DwarfUnit::applySubprogramAttributes(DISubprogram SP, DIE &SPDie) {
1386 DIE *DeclDie = nullptr;
1387 StringRef DeclLinkageName;
1388 if (DISubprogram SPDecl = SP.getFunctionDeclaration()) {
David Blaikief7221ad2014-05-27 18:37:43 +00001389 DeclDie = getDIE(SPDecl);
David Blaikie6cfa9e12014-06-05 00:25:26 +00001390 assert(DeclDie && "This DIE should've already been constructed when the "
Alp Toker5c536392014-06-07 21:23:09 +00001391 "definition DIE was created in "
David Blaikie6cfa9e12014-06-05 00:25:26 +00001392 "getOrCreateSubprogramDIE");
David Blaikie7f916862014-05-27 18:37:38 +00001393 DeclLinkageName = SPDecl.getLinkageName();
1394 }
Rafael Espindola79278362011-11-10 22:34:29 +00001395
Devang Patel89543712011-08-15 17:24:54 +00001396 // Add function template parameters.
David Blaikie65a74662014-04-25 18:26:14 +00001397 addTemplateParams(SPDie, SP.getTemplateParams());
Devang Patel89543712011-08-15 17:24:54 +00001398
Adrian Prantl8714aaf2014-04-14 21:16:04 +00001399 // Add the linkage name if we have one and it isn't in the Decl.
1400 StringRef LinkageName = SP.getLinkageName();
David Blaikiece7a1bd2014-05-21 18:04:33 +00001401 assert(((LinkageName.empty() || DeclLinkageName.empty()) ||
1402 LinkageName == DeclLinkageName) &&
1403 "decl has a linkage name and it is different");
1404 if (!LinkageName.empty() && DeclLinkageName.empty())
1405 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
1406 GlobalValue::getRealLinkageName(LinkageName));
Devang Patel89543712011-08-15 17:24:54 +00001407
David Blaikiece7a1bd2014-05-21 18:04:33 +00001408 if (DeclDie) {
1409 // Refer to the function declaration where all the other attributes will be
1410 // found.
1411 addDIEEntry(SPDie, dwarf::DW_AT_specification, *DeclDie);
David Blaikie7f916862014-05-27 18:37:38 +00001412 return;
David Blaikiece7a1bd2014-05-21 18:04:33 +00001413 }
Eric Christopheracb71152012-08-23 22:52:55 +00001414
Devang Patel89543712011-08-15 17:24:54 +00001415 // Constructors and operators for anonymous aggregates do not have names.
1416 if (!SP.getName().empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +00001417 addString(SPDie, dwarf::DW_AT_name, SP.getName());
Devang Patel89543712011-08-15 17:24:54 +00001418
David Blaikie0b9438b2014-09-19 04:47:46 +00001419 // Skip the rest of the attributes under -gmlt to save space.
David Blaikie73b65d22014-09-19 04:30:36 +00001420 if(getCUNode().getEmissionKind() == DIBuilder::LineTablesOnly)
1421 return;
1422
Devang Patel89543712011-08-15 17:24:54 +00001423 addSourceLine(SPDie, SP);
1424
Eric Christopher5cd2a9d2012-02-22 08:46:21 +00001425 // Add the prototype if we have a prototype and we have a C like
1426 // language.
David Blaikiecb8e4352013-11-15 23:50:53 +00001427 uint16_t Language = getLanguage();
Eric Christopher5cd2a9d2012-02-22 08:46:21 +00001428 if (SP.isPrototyped() &&
Eric Christopherc2697f82013-10-19 01:04:47 +00001429 (Language == dwarf::DW_LANG_C89 || Language == dwarf::DW_LANG_C99 ||
Eric Christopher5cd2a9d2012-02-22 08:46:21 +00001430 Language == dwarf::DW_LANG_ObjC))
Eric Christopherbb69a272012-08-24 01:14:27 +00001431 addFlag(SPDie, dwarf::DW_AT_prototyped);
Devang Patel89543712011-08-15 17:24:54 +00001432
Manman Renf8a19672014-07-28 22:24:06 +00001433 DISubroutineType SPTy = SP.getType();
David Blaikie5174c842013-05-22 23:22:18 +00001434 assert(SPTy.getTag() == dwarf::DW_TAG_subroutine_type &&
1435 "the type of a subprogram should be a subroutine");
Devang Patel89543712011-08-15 17:24:54 +00001436
Manman Renf8a19672014-07-28 22:24:06 +00001437 DITypeArray Args = SPTy.getTypeArray();
Eric Christopher691281b2013-10-21 17:48:51 +00001438 // Add a return type. If this is a type like a C/C++ void type we don't add a
1439 // return type.
Manman Renf8a19672014-07-28 22:24:06 +00001440 if (resolve(Args.getElement(0)))
1441 addType(SPDie, DIType(resolve(Args.getElement(0))));
Devang Patel89543712011-08-15 17:24:54 +00001442
1443 unsigned VK = SP.getVirtuality();
1444 if (VK) {
Nick Lewyckycfde1a22011-12-14 00:56:07 +00001445 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
Eric Christopher4a741042014-02-16 08:46:55 +00001446 DIELoc *Block = getDIELoc();
David Blaikie65a74662014-04-25 18:26:14 +00001447 addUInt(*Block, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1448 addUInt(*Block, dwarf::DW_FORM_udata, SP.getVirtualIndex());
David Blaikief2443192013-10-21 17:28:37 +00001449 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, Block);
Eric Christopher98b7f172013-11-11 18:52:36 +00001450 ContainingTypeMap.insert(
David Blaikie65a74662014-04-25 18:26:14 +00001451 std::make_pair(&SPDie, resolve(SP.getContainingType())));
Devang Patel89543712011-08-15 17:24:54 +00001452 }
1453
1454 if (!SP.isDefinition()) {
Eric Christopherbb69a272012-08-24 01:14:27 +00001455 addFlag(SPDie, dwarf::DW_AT_declaration);
Eric Christopher92331fd2012-11-21 00:34:38 +00001456
Devang Patel89543712011-08-15 17:24:54 +00001457 // Add arguments. Do not add arguments for subprogram definition. They will
1458 // be handled while processing variables.
David Blaikie899ae612014-04-30 22:58:19 +00001459 constructSubprogramArguments(SPDie, Args);
Devang Patel89543712011-08-15 17:24:54 +00001460 }
1461
1462 if (SP.isArtificial())
Eric Christopherbb69a272012-08-24 01:14:27 +00001463 addFlag(SPDie, dwarf::DW_AT_artificial);
Devang Patel89543712011-08-15 17:24:54 +00001464
1465 if (!SP.isLocalToUnit())
Eric Christopherbb69a272012-08-24 01:14:27 +00001466 addFlag(SPDie, dwarf::DW_AT_external);
Devang Patel89543712011-08-15 17:24:54 +00001467
1468 if (SP.isOptimized())
Eric Christopherbb69a272012-08-24 01:14:27 +00001469 addFlag(SPDie, dwarf::DW_AT_APPLE_optimized);
Devang Patel89543712011-08-15 17:24:54 +00001470
1471 if (unsigned isa = Asm->getISAEncoding()) {
1472 addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1473 }
1474
Adrian Prantl99c7af22013-12-18 21:48:19 +00001475 if (SP.isLValueReference())
1476 addFlag(SPDie, dwarf::DW_AT_reference);
1477
1478 if (SP.isRValueReference())
1479 addFlag(SPDie, dwarf::DW_AT_rvalue_reference);
1480
Adrian Prantlef129fb2014-01-18 02:12:00 +00001481 if (SP.isProtected())
1482 addUInt(SPDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1483 dwarf::DW_ACCESS_protected);
1484 else if (SP.isPrivate())
1485 addUInt(SPDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1486 dwarf::DW_ACCESS_private);
Adrian Prantldaedfda2014-08-29 22:44:07 +00001487 else if (SP.isPublic())
Adrian Prantlef129fb2014-01-18 02:12:00 +00001488 addUInt(SPDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1489 dwarf::DW_ACCESS_public);
1490
1491 if (SP.isExplicit())
1492 addFlag(SPDie, dwarf::DW_AT_explicit);
Devang Patel89543712011-08-15 17:24:54 +00001493}
1494
David Blaikieeb1a2722014-06-13 22:18:23 +00001495void DwarfUnit::applyVariableAttributes(const DbgVariable &Var,
1496 DIE &VariableDie) {
1497 StringRef Name = Var.getName();
1498 if (!Name.empty())
1499 addString(VariableDie, dwarf::DW_AT_name, Name);
1500 addSourceLine(VariableDie, Var.getVariable());
1501 addType(VariableDie, Var.getType());
1502 if (Var.isArtificial())
1503 addFlag(VariableDie, dwarf::DW_AT_artificial);
1504}
1505
Devang Patel0e821f42011-04-12 23:21:44 +00001506/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
Eric Christophera5a79422013-12-09 23:32:48 +00001507void DwarfUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy) {
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001508 DIE &DW_Subrange = createAndAddDIE(dwarf::DW_TAG_subrange_type, Buffer);
David Blaikie8dbcc3f2014-04-25 19:33:43 +00001509 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, *IndexTy);
Devang Patel0e821f42011-04-12 23:21:44 +00001510
Bill Wendling28fe9e72012-12-06 07:38:10 +00001511 // The LowerBound value defines the lower bounds which is typically zero for
1512 // C/C++. The Count value is the number of elements. Values are 64 bit. If
1513 // Count == -1 then the array is unbounded and we do not emit
David Blaikie32b0f362014-10-01 00:56:55 +00001514 // DW_AT_lower_bound and DW_AT_count attributes.
Bill Wendling28fe9e72012-12-06 07:38:10 +00001515 int64_t LowerBound = SR.getLo();
Bill Wendling3495f9b2012-12-06 07:55:19 +00001516 int64_t DefaultLowerBound = getDefaultLowerBound();
Bill Wendlingd7767122012-12-04 21:34:03 +00001517 int64_t Count = SR.getCount();
Devang Patel0e821f42011-04-12 23:21:44 +00001518
Bill Wendling3495f9b2012-12-06 07:55:19 +00001519 if (DefaultLowerBound == -1 || LowerBound != DefaultLowerBound)
David Blaikief2443192013-10-21 17:28:37 +00001520 addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, None, LowerBound);
Bill Wendling28fe9e72012-12-06 07:38:10 +00001521
David Blaikie32b0f362014-10-01 00:56:55 +00001522 if (Count != -1)
Bill Wendlingd7767122012-12-04 21:34:03 +00001523 // FIXME: An unbounded array should reference the expression that defines
1524 // the array.
David Blaikie32b0f362014-10-01 00:56:55 +00001525 addUInt(DW_Subrange, dwarf::DW_AT_count, None, Count);
Devang Patel0e821f42011-04-12 23:21:44 +00001526}
1527
1528/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
Eric Christophera5a79422013-12-09 23:32:48 +00001529void DwarfUnit::constructArrayTypeDIE(DIE &Buffer, DICompositeType CTy) {
Eric Christopherdf9955d2013-11-11 18:52:31 +00001530 if (CTy.isVector())
David Blaikie65a74662014-04-25 18:26:14 +00001531 addFlag(Buffer, dwarf::DW_AT_GNU_vector);
Devang Patel0e821f42011-04-12 23:21:44 +00001532
Eric Christopher0df08e22013-08-08 07:40:37 +00001533 // Emit the element type.
David Blaikie65a74662014-04-25 18:26:14 +00001534 addType(Buffer, resolve(CTy.getTypeDerivedFrom()));
Devang Patel0e821f42011-04-12 23:21:44 +00001535
1536 // Get an anonymous type for index type.
Eric Christophercad9b532013-01-04 21:51:53 +00001537 // FIXME: This type should be passed down from the front end
1538 // as different languages may have different sizes for indexes.
Devang Patel0e821f42011-04-12 23:21:44 +00001539 DIE *IdxTy = getIndexTyDie();
1540 if (!IdxTy) {
David Blaikie12e00fc2014-04-03 06:28:20 +00001541 // Construct an integer type to use for indexes.
David Blaikiebd579052014-04-28 21:14:27 +00001542 IdxTy = &createAndAddDIE(dwarf::DW_TAG_base_type, UnitDie);
David Blaikie65a74662014-04-25 18:26:14 +00001543 addString(*IdxTy, dwarf::DW_AT_name, "sizetype");
1544 addUInt(*IdxTy, dwarf::DW_AT_byte_size, None, sizeof(int64_t));
1545 addUInt(*IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
David Blaikie12e00fc2014-04-03 06:28:20 +00001546 dwarf::DW_ATE_unsigned);
Devang Patel0e821f42011-04-12 23:21:44 +00001547 setIndexTyDie(IdxTy);
1548 }
1549
1550 // Add subranges to array type.
Manman Renab8ffba2014-07-28 19:14:13 +00001551 DIArray Elements = CTy.getElements();
Devang Patel0e821f42011-04-12 23:21:44 +00001552 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1553 DIDescriptor Element = Elements.getElement(i);
1554 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1555 constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1556 }
1557}
1558
Eric Christopheraeb105f2013-11-11 18:52:39 +00001559/// constructEnumTypeDIE - Construct an enum type DIE from DICompositeType.
Eric Christophera5a79422013-12-09 23:32:48 +00001560void DwarfUnit::constructEnumTypeDIE(DIE &Buffer, DICompositeType CTy) {
Manman Renab8ffba2014-07-28 19:14:13 +00001561 DIArray Elements = CTy.getElements();
Eric Christopheraeb105f2013-11-11 18:52:39 +00001562
1563 // Add enumerators to enumeration type.
1564 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
David Blaikie4f6bf27a2013-11-18 23:33:32 +00001565 DIEnumerator Enum(Elements.getElement(i));
Eric Christopheraeb105f2013-11-11 18:52:39 +00001566 if (Enum.isEnumerator()) {
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001567 DIE &Enumerator = createAndAddDIE(dwarf::DW_TAG_enumerator, Buffer);
David Blaikie4f6bf27a2013-11-18 23:33:32 +00001568 StringRef Name = Enum.getName();
Eric Christopheraeb105f2013-11-11 18:52:39 +00001569 addString(Enumerator, dwarf::DW_AT_name, Name);
David Blaikie4f6bf27a2013-11-18 23:33:32 +00001570 int64_t Value = Enum.getEnumValue();
Eric Christophera07e4f52013-11-19 09:28:34 +00001571 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata,
1572 Value);
Eric Christopheraeb105f2013-11-11 18:52:39 +00001573 }
1574 }
1575 DIType DTy = resolve(CTy.getTypeDerivedFrom());
1576 if (DTy) {
David Blaikie65a74662014-04-25 18:26:14 +00001577 addType(Buffer, DTy);
1578 addFlag(Buffer, dwarf::DW_AT_enum_class);
Eric Christopheraeb105f2013-11-11 18:52:39 +00001579 }
Devang Patel0e821f42011-04-12 23:21:44 +00001580}
1581
Devang Patel89543712011-08-15 17:24:54 +00001582/// constructContainingTypeDIEs - Construct DIEs for types that contain
1583/// vtables.
Eric Christophera5a79422013-12-09 23:32:48 +00001584void DwarfUnit::constructContainingTypeDIEs() {
Devang Patel89543712011-08-15 17:24:54 +00001585 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
Eric Christopherc2697f82013-10-19 01:04:47 +00001586 CE = ContainingTypeMap.end();
1587 CI != CE; ++CI) {
David Blaikie65a74662014-04-25 18:26:14 +00001588 DIE &SPDie = *CI->first;
David Blaikie2ad00162013-11-15 23:09:13 +00001589 DIDescriptor D(CI->second);
1590 if (!D)
Eric Christopherc2697f82013-10-19 01:04:47 +00001591 continue;
David Blaikie2ad00162013-11-15 23:09:13 +00001592 DIE *NDie = getDIE(D);
Eric Christopherc2697f82013-10-19 01:04:47 +00001593 if (!NDie)
1594 continue;
David Blaikie8dbcc3f2014-04-25 19:33:43 +00001595 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, *NDie);
Devang Patel89543712011-08-15 17:24:54 +00001596 }
1597}
1598
Manman Ren230ec862013-10-23 23:00:44 +00001599/// constructMemberDIE - Construct member DIE from DIDerivedType.
Eric Christophera5a79422013-12-09 23:32:48 +00001600void DwarfUnit::constructMemberDIE(DIE &Buffer, DIDerivedType DT) {
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001601 DIE &MemberDie = createAndAddDIE(DT.getTag(), Buffer);
Devang Patel0e821f42011-04-12 23:21:44 +00001602 StringRef Name = DT.getName();
1603 if (!Name.empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +00001604 addString(MemberDie, dwarf::DW_AT_name, Name);
Devang Patel0e821f42011-04-12 23:21:44 +00001605
Manman Ren93b30902013-10-08 18:42:58 +00001606 addType(MemberDie, resolve(DT.getTypeDerivedFrom()));
Devang Patel0e821f42011-04-12 23:21:44 +00001607
1608 addSourceLine(MemberDie, DT);
1609
Eric Christopherc2697f82013-10-19 01:04:47 +00001610 if (DT.getTag() == dwarf::DW_TAG_inheritance && DT.isVirtual()) {
Devang Patel0e821f42011-04-12 23:21:44 +00001611
1612 // For C++, virtual base classes are not at fixed offset. Use following
1613 // expression to extract appropriate offset from vtable.
1614 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1615
Eric Christopher4a741042014-02-16 08:46:55 +00001616 DIELoc *VBaseLocationDie = new (DIEValueAllocator) DIELoc();
David Blaikie65a74662014-04-25 18:26:14 +00001617 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1618 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1619 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1620 addUInt(*VBaseLocationDie, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1621 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1622 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1623 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
Devang Patel0e821f42011-04-12 23:21:44 +00001624
David Blaikief2443192013-10-21 17:28:37 +00001625 addBlock(MemberDie, dwarf::DW_AT_data_member_location, VBaseLocationDie);
David Blaikie71d34a22013-11-01 00:25:45 +00001626 } else {
1627 uint64_t Size = DT.getSizeInBits();
1628 uint64_t FieldSize = getBaseTypeSize(DD, DT);
1629 uint64_t OffsetInBytes;
1630
1631 if (Size != FieldSize) {
Eric Christopher1acdbb82014-03-12 17:14:46 +00001632 // Handle bitfield, assume bytes are 8 bits.
1633 addUInt(MemberDie, dwarf::DW_AT_byte_size, None, FieldSize/8);
1634 addUInt(MemberDie, dwarf::DW_AT_bit_size, None, Size);
David Blaikie71d34a22013-11-01 00:25:45 +00001635
1636 uint64_t Offset = DT.getOffsetInBits();
1637 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1638 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1639 uint64_t FieldOffset = (HiMark - FieldSize);
1640 Offset -= FieldOffset;
1641
1642 // Maybe we need to work from the other end.
1643 if (Asm->getDataLayout().isLittleEndian())
1644 Offset = FieldSize - (Offset + Size);
1645 addUInt(MemberDie, dwarf::DW_AT_bit_offset, None, Offset);
1646
Adrian Prantlc67655a2014-01-28 18:13:47 +00001647 // Here DW_AT_data_member_location points to the anonymous
David Blaikie71d34a22013-11-01 00:25:45 +00001648 // field that includes this bit field.
1649 OffsetInBytes = FieldOffset >> 3;
1650 } else
1651 // This is not a bitfield.
1652 OffsetInBytes = DT.getOffsetInBits() >> 3;
David Blaikie2ada1162014-01-03 00:48:38 +00001653
David Blaikie22b29a52014-01-03 01:30:05 +00001654 if (DD->getDwarfVersion() <= 2) {
Eric Christopher4a741042014-02-16 08:46:55 +00001655 DIELoc *MemLocationDie = new (DIEValueAllocator) DIELoc();
David Blaikie65a74662014-04-25 18:26:14 +00001656 addUInt(*MemLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1657 addUInt(*MemLocationDie, dwarf::DW_FORM_udata, OffsetInBytes);
David Blaikie22b29a52014-01-03 01:30:05 +00001658 addBlock(MemberDie, dwarf::DW_AT_data_member_location, MemLocationDie);
1659 } else
1660 addUInt(MemberDie, dwarf::DW_AT_data_member_location, None,
1661 OffsetInBytes);
David Blaikie71d34a22013-11-01 00:25:45 +00001662 }
Devang Patel0e821f42011-04-12 23:21:44 +00001663
1664 if (DT.isProtected())
Nick Lewyckycb918492011-12-13 05:09:11 +00001665 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001666 dwarf::DW_ACCESS_protected);
1667 else if (DT.isPrivate())
Nick Lewyckycb918492011-12-13 05:09:11 +00001668 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001669 dwarf::DW_ACCESS_private);
1670 // Otherwise C++ member and base classes are considered public.
Adrian Prantldaedfda2014-08-29 22:44:07 +00001671 else if (DT.isPublic())
Nick Lewyckycb918492011-12-13 05:09:11 +00001672 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001673 dwarf::DW_ACCESS_public);
1674 if (DT.isVirtual())
Nick Lewyckycfde1a22011-12-14 00:56:07 +00001675 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
Devang Patel0e821f42011-04-12 23:21:44 +00001676 dwarf::DW_VIRTUALITY_virtual);
Devang Patel514b4002011-04-16 00:11:51 +00001677
1678 // Objective-C properties.
Devang Patel44882172012-02-06 17:49:43 +00001679 if (MDNode *PNode = DT.getObjCProperty())
1680 if (DIEEntry *PropertyDie = getDIEEntry(PNode))
David Blaikie65a74662014-04-25 18:26:14 +00001681 MemberDie.addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4,
1682 PropertyDie);
Devang Patel44882172012-02-06 17:49:43 +00001683
David Blaikie37fefc32012-12-13 22:43:07 +00001684 if (DT.isArtificial())
1685 addFlag(MemberDie, dwarf::DW_AT_artificial);
Devang Patel0e821f42011-04-12 23:21:44 +00001686}
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001687
Manman Renc6b63922013-10-14 20:33:57 +00001688/// getOrCreateStaticMemberDIE - Create new DIE for C++ static member.
Eric Christophera5a79422013-12-09 23:32:48 +00001689DIE *DwarfUnit::getOrCreateStaticMemberDIE(DIDerivedType DT) {
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001690 if (!DT.Verify())
Craig Topper353eda42014-04-24 06:44:33 +00001691 return nullptr;
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001692
Manman Renc6b63922013-10-14 20:33:57 +00001693 // Construct the context before querying for the existence of the DIE in case
1694 // such construction creates the DIE.
1695 DIE *ContextDIE = getOrCreateContextDIE(resolve(DT.getContext()));
David Blaikiebd700e42013-11-14 21:24:34 +00001696 assert(dwarf::isType(ContextDIE->getTag()) &&
1697 "Static member should belong to a type.");
Manman Renc6b63922013-10-14 20:33:57 +00001698
David Blaikie65a74662014-04-25 18:26:14 +00001699 if (DIE *StaticMemberDIE = getDIE(DT))
Manman Renc6b63922013-10-14 20:33:57 +00001700 return StaticMemberDIE;
1701
David Blaikieb0b3fcf2014-04-25 18:52:29 +00001702 DIE &StaticMemberDIE = createAndAddDIE(DT.getTag(), *ContextDIE, DT);
Manman Renc6b63922013-10-14 20:33:57 +00001703
Manman Ren93b30902013-10-08 18:42:58 +00001704 DIType Ty = resolve(DT.getTypeDerivedFrom());
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001705
1706 addString(StaticMemberDIE, dwarf::DW_AT_name, DT.getName());
1707 addType(StaticMemberDIE, Ty);
1708 addSourceLine(StaticMemberDIE, DT);
1709 addFlag(StaticMemberDIE, dwarf::DW_AT_external);
1710 addFlag(StaticMemberDIE, dwarf::DW_AT_declaration);
1711
1712 // FIXME: We could omit private if the parent is a class_type, and
1713 // public if the parent is something else.
1714 if (DT.isProtected())
1715 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1716 dwarf::DW_ACCESS_protected);
1717 else if (DT.isPrivate())
1718 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1719 dwarf::DW_ACCESS_private);
Adrian Prantldaedfda2014-08-29 22:44:07 +00001720 else if (DT.isPublic())
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001721 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1722 dwarf::DW_ACCESS_public);
1723
1724 if (const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(DT.getConstant()))
David Blaikiec0a28412014-05-11 15:56:59 +00001725 addConstantValue(StaticMemberDIE, CI, Ty);
David Blaikiea39a76e2013-01-20 01:18:01 +00001726 if (const ConstantFP *CFP = dyn_cast_or_null<ConstantFP>(DT.getConstant()))
1727 addConstantFPValue(StaticMemberDIE, CFP);
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001728
David Blaikie65a74662014-04-25 18:26:14 +00001729 return &StaticMemberDIE;
Eric Christopher4d23a4a2013-01-16 01:22:23 +00001730}
David Blaikie6b288cf2013-10-30 20:42:41 +00001731
David Blaikied82b2372014-03-24 20:28:10 +00001732void DwarfUnit::emitHeader(const MCSymbol *ASectionSym) const {
David Blaikie6b288cf2013-10-30 20:42:41 +00001733 Asm->OutStreamer.AddComment("DWARF version number");
1734 Asm->EmitInt16(DD->getDwarfVersion());
1735 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
David Blaikie6896e192013-12-04 23:39:02 +00001736 // We share one abbreviations table across all units so it's always at the
1737 // start of the section. Use a relocatable offset where needed to ensure
1738 // linking doesn't invalidate that offset.
David Blaikie3c9a3cc2014-03-24 20:53:02 +00001739 if (ASectionSym)
1740 Asm->EmitSectionOffset(ASectionSym, ASectionSym);
1741 else
David Blaikie326e1fa2014-04-02 02:04:51 +00001742 // Use a constant value when no symbol is provided.
David Blaikie3c9a3cc2014-03-24 20:53:02 +00001743 Asm->EmitInt32(0);
David Blaikie6b288cf2013-10-30 20:42:41 +00001744 Asm->OutStreamer.AddComment("Address Size (in bytes)");
1745 Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
1746}
David Blaikiebc563272013-12-13 21:33:40 +00001747
David Blaikied82b2372014-03-24 20:28:10 +00001748void DwarfTypeUnit::emitHeader(const MCSymbol *ASectionSym) const {
1749 DwarfUnit::emitHeader(ASectionSym);
David Blaikiebc563272013-12-13 21:33:40 +00001750 Asm->OutStreamer.AddComment("Type Signature");
1751 Asm->OutStreamer.EmitIntValue(TypeSignature, sizeof(TypeSignature));
1752 Asm->OutStreamer.AddComment("Type DIE Offset");
David Blaikie15ed5eb2014-01-10 01:38:41 +00001753 // In a skeleton type unit there is no type DIE so emit a zero offset.
1754 Asm->OutStreamer.EmitIntValue(Ty ? Ty->getOffset() : 0,
1755 sizeof(Ty->getOffset()));
David Blaikiebc563272013-12-13 21:33:40 +00001756}
1757
1758void DwarfTypeUnit::initSection(const MCSection *Section) {
1759 assert(!this->Section);
1760 this->Section = Section;
1761 // Since each type unit is contained in its own COMDAT section, the begin
1762 // label and the section label are the same. Using the begin label emission in
1763 // DwarfDebug to emit the section label as well is slightly subtle/sneaky, but
1764 // the only other alternative of lazily constructing start-of-section labels
1765 // and storing a mapping in DwarfDebug (or AsmPrinter).
1766 this->SectionSym = this->LabelBegin =
1767 Asm->GetTempSymbol(Section->getLabelBeginName(), getUniqueID());
1768 this->LabelEnd =
1769 Asm->GetTempSymbol(Section->getLabelEndName(), getUniqueID());
David Blaikiebc563272013-12-13 21:33:40 +00001770}