1*9880d681SAndroid Build Coastguard Worker //===--- lib/CodeGen/DIE.cpp - DWARF Info Entries -------------------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // Data structures for DWARF info entries.
11*9880d681SAndroid Build Coastguard Worker //
12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/DIE.h"
15*9880d681SAndroid Build Coastguard Worker #include "DwarfCompileUnit.h"
16*9880d681SAndroid Build Coastguard Worker #include "DwarfDebug.h"
17*9880d681SAndroid Build Coastguard Worker #include "DwarfUnit.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/Twine.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/AsmPrinter.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/DataLayout.h"
21*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCAsmInfo.h"
22*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCContext.h"
23*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCStreamer.h"
24*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCSymbol.h"
25*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Debug.h"
26*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ErrorHandling.h"
27*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Format.h"
28*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/FormattedStream.h"
29*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/LEB128.h"
30*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/MD5.h"
31*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/raw_ostream.h"
32*9880d681SAndroid Build Coastguard Worker using namespace llvm;
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
35*9880d681SAndroid Build Coastguard Worker // DIEAbbrevData Implementation
36*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Worker /// Profile - Used to gather unique data for the abbreviation folding set.
39*9880d681SAndroid Build Coastguard Worker ///
Profile(FoldingSetNodeID & ID) const40*9880d681SAndroid Build Coastguard Worker void DIEAbbrevData::Profile(FoldingSetNodeID &ID) const {
41*9880d681SAndroid Build Coastguard Worker // Explicitly cast to an integer type for which FoldingSetNodeID has
42*9880d681SAndroid Build Coastguard Worker // overloads. Otherwise MSVC 2010 thinks this call is ambiguous.
43*9880d681SAndroid Build Coastguard Worker ID.AddInteger(unsigned(Attribute));
44*9880d681SAndroid Build Coastguard Worker ID.AddInteger(unsigned(Form));
45*9880d681SAndroid Build Coastguard Worker }
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
48*9880d681SAndroid Build Coastguard Worker // DIEAbbrev Implementation
49*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Worker /// Profile - Used to gather unique data for the abbreviation folding set.
52*9880d681SAndroid Build Coastguard Worker ///
Profile(FoldingSetNodeID & ID) const53*9880d681SAndroid Build Coastguard Worker void DIEAbbrev::Profile(FoldingSetNodeID &ID) const {
54*9880d681SAndroid Build Coastguard Worker ID.AddInteger(unsigned(Tag));
55*9880d681SAndroid Build Coastguard Worker ID.AddInteger(unsigned(Children));
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Worker // For each attribute description.
58*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0, N = Data.size(); i < N; ++i)
59*9880d681SAndroid Build Coastguard Worker Data[i].Profile(ID);
60*9880d681SAndroid Build Coastguard Worker }
61*9880d681SAndroid Build Coastguard Worker
62*9880d681SAndroid Build Coastguard Worker /// Emit - Print the abbreviation using the specified asm printer.
63*9880d681SAndroid Build Coastguard Worker ///
Emit(const AsmPrinter * AP) const64*9880d681SAndroid Build Coastguard Worker void DIEAbbrev::Emit(const AsmPrinter *AP) const {
65*9880d681SAndroid Build Coastguard Worker // Emit its Dwarf tag type.
66*9880d681SAndroid Build Coastguard Worker AP->EmitULEB128(Tag, dwarf::TagString(Tag));
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Worker // Emit whether it has children DIEs.
69*9880d681SAndroid Build Coastguard Worker AP->EmitULEB128((unsigned)Children, dwarf::ChildrenString(Children));
70*9880d681SAndroid Build Coastguard Worker
71*9880d681SAndroid Build Coastguard Worker // For each attribute description.
72*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0, N = Data.size(); i < N; ++i) {
73*9880d681SAndroid Build Coastguard Worker const DIEAbbrevData &AttrData = Data[i];
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Worker // Emit attribute type.
76*9880d681SAndroid Build Coastguard Worker AP->EmitULEB128(AttrData.getAttribute(),
77*9880d681SAndroid Build Coastguard Worker dwarf::AttributeString(AttrData.getAttribute()));
78*9880d681SAndroid Build Coastguard Worker
79*9880d681SAndroid Build Coastguard Worker // Emit form type.
80*9880d681SAndroid Build Coastguard Worker AP->EmitULEB128(AttrData.getForm(),
81*9880d681SAndroid Build Coastguard Worker dwarf::FormEncodingString(AttrData.getForm()));
82*9880d681SAndroid Build Coastguard Worker }
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Worker // Mark end of abbreviation.
85*9880d681SAndroid Build Coastguard Worker AP->EmitULEB128(0, "EOM(1)");
86*9880d681SAndroid Build Coastguard Worker AP->EmitULEB128(0, "EOM(2)");
87*9880d681SAndroid Build Coastguard Worker }
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Worker LLVM_DUMP_METHOD
print(raw_ostream & O)90*9880d681SAndroid Build Coastguard Worker void DIEAbbrev::print(raw_ostream &O) {
91*9880d681SAndroid Build Coastguard Worker O << "Abbreviation @"
92*9880d681SAndroid Build Coastguard Worker << format("0x%lx", (long)(intptr_t)this)
93*9880d681SAndroid Build Coastguard Worker << " "
94*9880d681SAndroid Build Coastguard Worker << dwarf::TagString(Tag)
95*9880d681SAndroid Build Coastguard Worker << " "
96*9880d681SAndroid Build Coastguard Worker << dwarf::ChildrenString(Children)
97*9880d681SAndroid Build Coastguard Worker << '\n';
98*9880d681SAndroid Build Coastguard Worker
99*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0, N = Data.size(); i < N; ++i) {
100*9880d681SAndroid Build Coastguard Worker O << " "
101*9880d681SAndroid Build Coastguard Worker << dwarf::AttributeString(Data[i].getAttribute())
102*9880d681SAndroid Build Coastguard Worker << " "
103*9880d681SAndroid Build Coastguard Worker << dwarf::FormEncodingString(Data[i].getForm())
104*9880d681SAndroid Build Coastguard Worker << '\n';
105*9880d681SAndroid Build Coastguard Worker }
106*9880d681SAndroid Build Coastguard Worker }
107*9880d681SAndroid Build Coastguard Worker
108*9880d681SAndroid Build Coastguard Worker LLVM_DUMP_METHOD
dump()109*9880d681SAndroid Build Coastguard Worker void DIEAbbrev::dump() { print(dbgs()); }
110*9880d681SAndroid Build Coastguard Worker
generateAbbrev() const111*9880d681SAndroid Build Coastguard Worker DIEAbbrev DIE::generateAbbrev() const {
112*9880d681SAndroid Build Coastguard Worker DIEAbbrev Abbrev(Tag, hasChildren());
113*9880d681SAndroid Build Coastguard Worker for (const DIEValue &V : values())
114*9880d681SAndroid Build Coastguard Worker Abbrev.AddAttribute(V.getAttribute(), V.getForm());
115*9880d681SAndroid Build Coastguard Worker return Abbrev;
116*9880d681SAndroid Build Coastguard Worker }
117*9880d681SAndroid Build Coastguard Worker
118*9880d681SAndroid Build Coastguard Worker /// Climb up the parent chain to get the unit DIE to which this DIE
119*9880d681SAndroid Build Coastguard Worker /// belongs.
getUnit() const120*9880d681SAndroid Build Coastguard Worker const DIE *DIE::getUnit() const {
121*9880d681SAndroid Build Coastguard Worker const DIE *Cu = getUnitOrNull();
122*9880d681SAndroid Build Coastguard Worker assert(Cu && "We should not have orphaned DIEs.");
123*9880d681SAndroid Build Coastguard Worker return Cu;
124*9880d681SAndroid Build Coastguard Worker }
125*9880d681SAndroid Build Coastguard Worker
126*9880d681SAndroid Build Coastguard Worker /// Climb up the parent chain to get the unit DIE this DIE belongs
127*9880d681SAndroid Build Coastguard Worker /// to. Return NULL if DIE is not added to an owner yet.
getUnitOrNull() const128*9880d681SAndroid Build Coastguard Worker const DIE *DIE::getUnitOrNull() const {
129*9880d681SAndroid Build Coastguard Worker const DIE *p = this;
130*9880d681SAndroid Build Coastguard Worker while (p) {
131*9880d681SAndroid Build Coastguard Worker if (p->getTag() == dwarf::DW_TAG_compile_unit ||
132*9880d681SAndroid Build Coastguard Worker p->getTag() == dwarf::DW_TAG_type_unit)
133*9880d681SAndroid Build Coastguard Worker return p;
134*9880d681SAndroid Build Coastguard Worker p = p->getParent();
135*9880d681SAndroid Build Coastguard Worker }
136*9880d681SAndroid Build Coastguard Worker return nullptr;
137*9880d681SAndroid Build Coastguard Worker }
138*9880d681SAndroid Build Coastguard Worker
findAttribute(dwarf::Attribute Attribute) const139*9880d681SAndroid Build Coastguard Worker DIEValue DIE::findAttribute(dwarf::Attribute Attribute) const {
140*9880d681SAndroid Build Coastguard Worker // Iterate through all the attributes until we find the one we're
141*9880d681SAndroid Build Coastguard Worker // looking for, if we can't find it return NULL.
142*9880d681SAndroid Build Coastguard Worker for (const auto &V : values())
143*9880d681SAndroid Build Coastguard Worker if (V.getAttribute() == Attribute)
144*9880d681SAndroid Build Coastguard Worker return V;
145*9880d681SAndroid Build Coastguard Worker return DIEValue();
146*9880d681SAndroid Build Coastguard Worker }
147*9880d681SAndroid Build Coastguard Worker
148*9880d681SAndroid Build Coastguard Worker LLVM_DUMP_METHOD
printValues(raw_ostream & O,const DIEValueList & Values,StringRef Type,unsigned Size,unsigned IndentCount)149*9880d681SAndroid Build Coastguard Worker static void printValues(raw_ostream &O, const DIEValueList &Values,
150*9880d681SAndroid Build Coastguard Worker StringRef Type, unsigned Size, unsigned IndentCount) {
151*9880d681SAndroid Build Coastguard Worker O << Type << ": Size: " << Size << "\n";
152*9880d681SAndroid Build Coastguard Worker
153*9880d681SAndroid Build Coastguard Worker unsigned I = 0;
154*9880d681SAndroid Build Coastguard Worker const std::string Indent(IndentCount, ' ');
155*9880d681SAndroid Build Coastguard Worker for (const auto &V : Values.values()) {
156*9880d681SAndroid Build Coastguard Worker O << Indent;
157*9880d681SAndroid Build Coastguard Worker O << "Blk[" << I++ << "]";
158*9880d681SAndroid Build Coastguard Worker O << " " << dwarf::FormEncodingString(V.getForm()) << " ";
159*9880d681SAndroid Build Coastguard Worker V.print(O);
160*9880d681SAndroid Build Coastguard Worker O << "\n";
161*9880d681SAndroid Build Coastguard Worker }
162*9880d681SAndroid Build Coastguard Worker }
163*9880d681SAndroid Build Coastguard Worker
164*9880d681SAndroid Build Coastguard Worker LLVM_DUMP_METHOD
print(raw_ostream & O,unsigned IndentCount) const165*9880d681SAndroid Build Coastguard Worker void DIE::print(raw_ostream &O, unsigned IndentCount) const {
166*9880d681SAndroid Build Coastguard Worker const std::string Indent(IndentCount, ' ');
167*9880d681SAndroid Build Coastguard Worker O << Indent << "Die: " << format("0x%lx", (long)(intptr_t) this)
168*9880d681SAndroid Build Coastguard Worker << ", Offset: " << Offset << ", Size: " << Size << "\n";
169*9880d681SAndroid Build Coastguard Worker
170*9880d681SAndroid Build Coastguard Worker O << Indent << dwarf::TagString(getTag()) << " "
171*9880d681SAndroid Build Coastguard Worker << dwarf::ChildrenString(hasChildren()) << "\n";
172*9880d681SAndroid Build Coastguard Worker
173*9880d681SAndroid Build Coastguard Worker IndentCount += 2;
174*9880d681SAndroid Build Coastguard Worker for (const auto &V : values()) {
175*9880d681SAndroid Build Coastguard Worker O << Indent;
176*9880d681SAndroid Build Coastguard Worker O << dwarf::AttributeString(V.getAttribute());
177*9880d681SAndroid Build Coastguard Worker O << " " << dwarf::FormEncodingString(V.getForm()) << " ";
178*9880d681SAndroid Build Coastguard Worker V.print(O);
179*9880d681SAndroid Build Coastguard Worker O << "\n";
180*9880d681SAndroid Build Coastguard Worker }
181*9880d681SAndroid Build Coastguard Worker IndentCount -= 2;
182*9880d681SAndroid Build Coastguard Worker
183*9880d681SAndroid Build Coastguard Worker for (const auto &Child : children())
184*9880d681SAndroid Build Coastguard Worker Child.print(O, IndentCount + 4);
185*9880d681SAndroid Build Coastguard Worker
186*9880d681SAndroid Build Coastguard Worker O << "\n";
187*9880d681SAndroid Build Coastguard Worker }
188*9880d681SAndroid Build Coastguard Worker
189*9880d681SAndroid Build Coastguard Worker LLVM_DUMP_METHOD
dump()190*9880d681SAndroid Build Coastguard Worker void DIE::dump() {
191*9880d681SAndroid Build Coastguard Worker print(dbgs());
192*9880d681SAndroid Build Coastguard Worker }
193*9880d681SAndroid Build Coastguard Worker
EmitValue(const AsmPrinter * AP) const194*9880d681SAndroid Build Coastguard Worker void DIEValue::EmitValue(const AsmPrinter *AP) const {
195*9880d681SAndroid Build Coastguard Worker switch (Ty) {
196*9880d681SAndroid Build Coastguard Worker case isNone:
197*9880d681SAndroid Build Coastguard Worker llvm_unreachable("Expected valid DIEValue");
198*9880d681SAndroid Build Coastguard Worker #define HANDLE_DIEVALUE(T) \
199*9880d681SAndroid Build Coastguard Worker case is##T: \
200*9880d681SAndroid Build Coastguard Worker getDIE##T().EmitValue(AP, Form); \
201*9880d681SAndroid Build Coastguard Worker break;
202*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/DIEValue.def"
203*9880d681SAndroid Build Coastguard Worker }
204*9880d681SAndroid Build Coastguard Worker }
205*9880d681SAndroid Build Coastguard Worker
SizeOf(const AsmPrinter * AP) const206*9880d681SAndroid Build Coastguard Worker unsigned DIEValue::SizeOf(const AsmPrinter *AP) const {
207*9880d681SAndroid Build Coastguard Worker switch (Ty) {
208*9880d681SAndroid Build Coastguard Worker case isNone:
209*9880d681SAndroid Build Coastguard Worker llvm_unreachable("Expected valid DIEValue");
210*9880d681SAndroid Build Coastguard Worker #define HANDLE_DIEVALUE(T) \
211*9880d681SAndroid Build Coastguard Worker case is##T: \
212*9880d681SAndroid Build Coastguard Worker return getDIE##T().SizeOf(AP, Form);
213*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/DIEValue.def"
214*9880d681SAndroid Build Coastguard Worker }
215*9880d681SAndroid Build Coastguard Worker llvm_unreachable("Unknown DIE kind");
216*9880d681SAndroid Build Coastguard Worker }
217*9880d681SAndroid Build Coastguard Worker
218*9880d681SAndroid Build Coastguard Worker LLVM_DUMP_METHOD
print(raw_ostream & O) const219*9880d681SAndroid Build Coastguard Worker void DIEValue::print(raw_ostream &O) const {
220*9880d681SAndroid Build Coastguard Worker switch (Ty) {
221*9880d681SAndroid Build Coastguard Worker case isNone:
222*9880d681SAndroid Build Coastguard Worker llvm_unreachable("Expected valid DIEValue");
223*9880d681SAndroid Build Coastguard Worker #define HANDLE_DIEVALUE(T) \
224*9880d681SAndroid Build Coastguard Worker case is##T: \
225*9880d681SAndroid Build Coastguard Worker getDIE##T().print(O); \
226*9880d681SAndroid Build Coastguard Worker break;
227*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/DIEValue.def"
228*9880d681SAndroid Build Coastguard Worker }
229*9880d681SAndroid Build Coastguard Worker }
230*9880d681SAndroid Build Coastguard Worker
231*9880d681SAndroid Build Coastguard Worker LLVM_DUMP_METHOD
dump() const232*9880d681SAndroid Build Coastguard Worker void DIEValue::dump() const {
233*9880d681SAndroid Build Coastguard Worker print(dbgs());
234*9880d681SAndroid Build Coastguard Worker }
235*9880d681SAndroid Build Coastguard Worker
236*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
237*9880d681SAndroid Build Coastguard Worker // DIEInteger Implementation
238*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
239*9880d681SAndroid Build Coastguard Worker
240*9880d681SAndroid Build Coastguard Worker /// EmitValue - Emit integer of appropriate size.
241*9880d681SAndroid Build Coastguard Worker ///
EmitValue(const AsmPrinter * Asm,dwarf::Form Form) const242*9880d681SAndroid Build Coastguard Worker void DIEInteger::EmitValue(const AsmPrinter *Asm, dwarf::Form Form) const {
243*9880d681SAndroid Build Coastguard Worker unsigned Size = ~0U;
244*9880d681SAndroid Build Coastguard Worker switch (Form) {
245*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_flag_present:
246*9880d681SAndroid Build Coastguard Worker // Emit something to keep the lines and comments in sync.
247*9880d681SAndroid Build Coastguard Worker // FIXME: Is there a better way to do this?
248*9880d681SAndroid Build Coastguard Worker Asm->OutStreamer->AddBlankLine();
249*9880d681SAndroid Build Coastguard Worker return;
250*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_flag: // Fall thru
251*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_ref1: // Fall thru
252*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_data1: Size = 1; break;
253*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_ref2: // Fall thru
254*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_data2: Size = 2; break;
255*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_sec_offset: // Fall thru
256*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_strp: // Fall thru
257*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_ref4: // Fall thru
258*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_data4: Size = 4; break;
259*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_ref8: // Fall thru
260*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_ref_sig8: // Fall thru
261*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_data8: Size = 8; break;
262*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_GNU_str_index: Asm->EmitULEB128(Integer); return;
263*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_GNU_addr_index: Asm->EmitULEB128(Integer); return;
264*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_udata: Asm->EmitULEB128(Integer); return;
265*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_sdata: Asm->EmitSLEB128(Integer); return;
266*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_addr:
267*9880d681SAndroid Build Coastguard Worker Size = Asm->getPointerSize();
268*9880d681SAndroid Build Coastguard Worker break;
269*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_ref_addr:
270*9880d681SAndroid Build Coastguard Worker Size = SizeOf(Asm, dwarf::DW_FORM_ref_addr);
271*9880d681SAndroid Build Coastguard Worker break;
272*9880d681SAndroid Build Coastguard Worker default: llvm_unreachable("DIE Value form not supported yet");
273*9880d681SAndroid Build Coastguard Worker }
274*9880d681SAndroid Build Coastguard Worker Asm->OutStreamer->EmitIntValue(Integer, Size);
275*9880d681SAndroid Build Coastguard Worker }
276*9880d681SAndroid Build Coastguard Worker
277*9880d681SAndroid Build Coastguard Worker /// SizeOf - Determine size of integer value in bytes.
278*9880d681SAndroid Build Coastguard Worker ///
SizeOf(const AsmPrinter * AP,dwarf::Form Form) const279*9880d681SAndroid Build Coastguard Worker unsigned DIEInteger::SizeOf(const AsmPrinter *AP, dwarf::Form Form) const {
280*9880d681SAndroid Build Coastguard Worker switch (Form) {
281*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_flag_present: return 0;
282*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_flag: // Fall thru
283*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_ref1: // Fall thru
284*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_data1: return sizeof(int8_t);
285*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_ref2: // Fall thru
286*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_data2: return sizeof(int16_t);
287*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_sec_offset: // Fall thru
288*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_strp: // Fall thru
289*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_ref4: // Fall thru
290*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_data4: return sizeof(int32_t);
291*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_ref8: // Fall thru
292*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_ref_sig8: // Fall thru
293*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_data8: return sizeof(int64_t);
294*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_GNU_str_index: return getULEB128Size(Integer);
295*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_GNU_addr_index: return getULEB128Size(Integer);
296*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_udata: return getULEB128Size(Integer);
297*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_sdata: return getSLEB128Size(Integer);
298*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_addr:
299*9880d681SAndroid Build Coastguard Worker return AP->getPointerSize();
300*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_ref_addr:
301*9880d681SAndroid Build Coastguard Worker if (AP->OutStreamer->getContext().getDwarfVersion() == 2)
302*9880d681SAndroid Build Coastguard Worker return AP->getPointerSize();
303*9880d681SAndroid Build Coastguard Worker return sizeof(int32_t);
304*9880d681SAndroid Build Coastguard Worker default: llvm_unreachable("DIE Value form not supported yet");
305*9880d681SAndroid Build Coastguard Worker }
306*9880d681SAndroid Build Coastguard Worker }
307*9880d681SAndroid Build Coastguard Worker
308*9880d681SAndroid Build Coastguard Worker LLVM_DUMP_METHOD
print(raw_ostream & O) const309*9880d681SAndroid Build Coastguard Worker void DIEInteger::print(raw_ostream &O) const {
310*9880d681SAndroid Build Coastguard Worker O << "Int: " << (int64_t)Integer << " 0x";
311*9880d681SAndroid Build Coastguard Worker O.write_hex(Integer);
312*9880d681SAndroid Build Coastguard Worker }
313*9880d681SAndroid Build Coastguard Worker
314*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
315*9880d681SAndroid Build Coastguard Worker // DIEExpr Implementation
316*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
317*9880d681SAndroid Build Coastguard Worker
318*9880d681SAndroid Build Coastguard Worker /// EmitValue - Emit expression value.
319*9880d681SAndroid Build Coastguard Worker ///
EmitValue(const AsmPrinter * AP,dwarf::Form Form) const320*9880d681SAndroid Build Coastguard Worker void DIEExpr::EmitValue(const AsmPrinter *AP, dwarf::Form Form) const {
321*9880d681SAndroid Build Coastguard Worker AP->OutStreamer->EmitValue(Expr, SizeOf(AP, Form));
322*9880d681SAndroid Build Coastguard Worker }
323*9880d681SAndroid Build Coastguard Worker
324*9880d681SAndroid Build Coastguard Worker /// SizeOf - Determine size of expression value in bytes.
325*9880d681SAndroid Build Coastguard Worker ///
SizeOf(const AsmPrinter * AP,dwarf::Form Form) const326*9880d681SAndroid Build Coastguard Worker unsigned DIEExpr::SizeOf(const AsmPrinter *AP, dwarf::Form Form) const {
327*9880d681SAndroid Build Coastguard Worker if (Form == dwarf::DW_FORM_data4) return 4;
328*9880d681SAndroid Build Coastguard Worker if (Form == dwarf::DW_FORM_sec_offset) return 4;
329*9880d681SAndroid Build Coastguard Worker if (Form == dwarf::DW_FORM_strp) return 4;
330*9880d681SAndroid Build Coastguard Worker return AP->getPointerSize();
331*9880d681SAndroid Build Coastguard Worker }
332*9880d681SAndroid Build Coastguard Worker
333*9880d681SAndroid Build Coastguard Worker LLVM_DUMP_METHOD
print(raw_ostream & O) const334*9880d681SAndroid Build Coastguard Worker void DIEExpr::print(raw_ostream &O) const { O << "Expr: " << *Expr; }
335*9880d681SAndroid Build Coastguard Worker
336*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
337*9880d681SAndroid Build Coastguard Worker // DIELabel Implementation
338*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
339*9880d681SAndroid Build Coastguard Worker
340*9880d681SAndroid Build Coastguard Worker /// EmitValue - Emit label value.
341*9880d681SAndroid Build Coastguard Worker ///
EmitValue(const AsmPrinter * AP,dwarf::Form Form) const342*9880d681SAndroid Build Coastguard Worker void DIELabel::EmitValue(const AsmPrinter *AP, dwarf::Form Form) const {
343*9880d681SAndroid Build Coastguard Worker AP->EmitLabelReference(Label, SizeOf(AP, Form),
344*9880d681SAndroid Build Coastguard Worker Form == dwarf::DW_FORM_strp ||
345*9880d681SAndroid Build Coastguard Worker Form == dwarf::DW_FORM_sec_offset ||
346*9880d681SAndroid Build Coastguard Worker Form == dwarf::DW_FORM_ref_addr);
347*9880d681SAndroid Build Coastguard Worker }
348*9880d681SAndroid Build Coastguard Worker
349*9880d681SAndroid Build Coastguard Worker /// SizeOf - Determine size of label value in bytes.
350*9880d681SAndroid Build Coastguard Worker ///
SizeOf(const AsmPrinter * AP,dwarf::Form Form) const351*9880d681SAndroid Build Coastguard Worker unsigned DIELabel::SizeOf(const AsmPrinter *AP, dwarf::Form Form) const {
352*9880d681SAndroid Build Coastguard Worker if (Form == dwarf::DW_FORM_data4) return 4;
353*9880d681SAndroid Build Coastguard Worker if (Form == dwarf::DW_FORM_sec_offset) return 4;
354*9880d681SAndroid Build Coastguard Worker if (Form == dwarf::DW_FORM_strp) return 4;
355*9880d681SAndroid Build Coastguard Worker return AP->getPointerSize();
356*9880d681SAndroid Build Coastguard Worker }
357*9880d681SAndroid Build Coastguard Worker
358*9880d681SAndroid Build Coastguard Worker LLVM_DUMP_METHOD
print(raw_ostream & O) const359*9880d681SAndroid Build Coastguard Worker void DIELabel::print(raw_ostream &O) const { O << "Lbl: " << Label->getName(); }
360*9880d681SAndroid Build Coastguard Worker
361*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
362*9880d681SAndroid Build Coastguard Worker // DIEDelta Implementation
363*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
364*9880d681SAndroid Build Coastguard Worker
365*9880d681SAndroid Build Coastguard Worker /// EmitValue - Emit delta value.
366*9880d681SAndroid Build Coastguard Worker ///
EmitValue(const AsmPrinter * AP,dwarf::Form Form) const367*9880d681SAndroid Build Coastguard Worker void DIEDelta::EmitValue(const AsmPrinter *AP, dwarf::Form Form) const {
368*9880d681SAndroid Build Coastguard Worker AP->EmitLabelDifference(LabelHi, LabelLo, SizeOf(AP, Form));
369*9880d681SAndroid Build Coastguard Worker }
370*9880d681SAndroid Build Coastguard Worker
371*9880d681SAndroid Build Coastguard Worker /// SizeOf - Determine size of delta value in bytes.
372*9880d681SAndroid Build Coastguard Worker ///
SizeOf(const AsmPrinter * AP,dwarf::Form Form) const373*9880d681SAndroid Build Coastguard Worker unsigned DIEDelta::SizeOf(const AsmPrinter *AP, dwarf::Form Form) const {
374*9880d681SAndroid Build Coastguard Worker if (Form == dwarf::DW_FORM_data4) return 4;
375*9880d681SAndroid Build Coastguard Worker if (Form == dwarf::DW_FORM_sec_offset) return 4;
376*9880d681SAndroid Build Coastguard Worker if (Form == dwarf::DW_FORM_strp) return 4;
377*9880d681SAndroid Build Coastguard Worker return AP->getPointerSize();
378*9880d681SAndroid Build Coastguard Worker }
379*9880d681SAndroid Build Coastguard Worker
380*9880d681SAndroid Build Coastguard Worker LLVM_DUMP_METHOD
print(raw_ostream & O) const381*9880d681SAndroid Build Coastguard Worker void DIEDelta::print(raw_ostream &O) const {
382*9880d681SAndroid Build Coastguard Worker O << "Del: " << LabelHi->getName() << "-" << LabelLo->getName();
383*9880d681SAndroid Build Coastguard Worker }
384*9880d681SAndroid Build Coastguard Worker
385*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
386*9880d681SAndroid Build Coastguard Worker // DIEString Implementation
387*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
388*9880d681SAndroid Build Coastguard Worker
389*9880d681SAndroid Build Coastguard Worker /// EmitValue - Emit string value.
390*9880d681SAndroid Build Coastguard Worker ///
EmitValue(const AsmPrinter * AP,dwarf::Form Form) const391*9880d681SAndroid Build Coastguard Worker void DIEString::EmitValue(const AsmPrinter *AP, dwarf::Form Form) const {
392*9880d681SAndroid Build Coastguard Worker assert(
393*9880d681SAndroid Build Coastguard Worker (Form == dwarf::DW_FORM_strp || Form == dwarf::DW_FORM_GNU_str_index) &&
394*9880d681SAndroid Build Coastguard Worker "Expected valid string form");
395*9880d681SAndroid Build Coastguard Worker
396*9880d681SAndroid Build Coastguard Worker // Index of string in symbol table.
397*9880d681SAndroid Build Coastguard Worker if (Form == dwarf::DW_FORM_GNU_str_index) {
398*9880d681SAndroid Build Coastguard Worker DIEInteger(S.getIndex()).EmitValue(AP, Form);
399*9880d681SAndroid Build Coastguard Worker return;
400*9880d681SAndroid Build Coastguard Worker }
401*9880d681SAndroid Build Coastguard Worker
402*9880d681SAndroid Build Coastguard Worker // Relocatable symbol.
403*9880d681SAndroid Build Coastguard Worker assert(Form == dwarf::DW_FORM_strp);
404*9880d681SAndroid Build Coastguard Worker if (AP->MAI->doesDwarfUseRelocationsAcrossSections()) {
405*9880d681SAndroid Build Coastguard Worker DIELabel(S.getSymbol()).EmitValue(AP, Form);
406*9880d681SAndroid Build Coastguard Worker return;
407*9880d681SAndroid Build Coastguard Worker }
408*9880d681SAndroid Build Coastguard Worker
409*9880d681SAndroid Build Coastguard Worker // Offset into symbol table.
410*9880d681SAndroid Build Coastguard Worker DIEInteger(S.getOffset()).EmitValue(AP, Form);
411*9880d681SAndroid Build Coastguard Worker }
412*9880d681SAndroid Build Coastguard Worker
413*9880d681SAndroid Build Coastguard Worker /// SizeOf - Determine size of delta value in bytes.
414*9880d681SAndroid Build Coastguard Worker ///
SizeOf(const AsmPrinter * AP,dwarf::Form Form) const415*9880d681SAndroid Build Coastguard Worker unsigned DIEString::SizeOf(const AsmPrinter *AP, dwarf::Form Form) const {
416*9880d681SAndroid Build Coastguard Worker assert(
417*9880d681SAndroid Build Coastguard Worker (Form == dwarf::DW_FORM_strp || Form == dwarf::DW_FORM_GNU_str_index) &&
418*9880d681SAndroid Build Coastguard Worker "Expected valid string form");
419*9880d681SAndroid Build Coastguard Worker
420*9880d681SAndroid Build Coastguard Worker // Index of string in symbol table.
421*9880d681SAndroid Build Coastguard Worker if (Form == dwarf::DW_FORM_GNU_str_index)
422*9880d681SAndroid Build Coastguard Worker return DIEInteger(S.getIndex()).SizeOf(AP, Form);
423*9880d681SAndroid Build Coastguard Worker
424*9880d681SAndroid Build Coastguard Worker // Relocatable symbol.
425*9880d681SAndroid Build Coastguard Worker if (AP->MAI->doesDwarfUseRelocationsAcrossSections())
426*9880d681SAndroid Build Coastguard Worker return DIELabel(S.getSymbol()).SizeOf(AP, Form);
427*9880d681SAndroid Build Coastguard Worker
428*9880d681SAndroid Build Coastguard Worker // Offset into symbol table.
429*9880d681SAndroid Build Coastguard Worker return DIEInteger(S.getOffset()).SizeOf(AP, Form);
430*9880d681SAndroid Build Coastguard Worker }
431*9880d681SAndroid Build Coastguard Worker
432*9880d681SAndroid Build Coastguard Worker LLVM_DUMP_METHOD
print(raw_ostream & O) const433*9880d681SAndroid Build Coastguard Worker void DIEString::print(raw_ostream &O) const {
434*9880d681SAndroid Build Coastguard Worker O << "String: " << S.getString();
435*9880d681SAndroid Build Coastguard Worker }
436*9880d681SAndroid Build Coastguard Worker
437*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
438*9880d681SAndroid Build Coastguard Worker // DIEEntry Implementation
439*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
440*9880d681SAndroid Build Coastguard Worker
441*9880d681SAndroid Build Coastguard Worker /// EmitValue - Emit debug information entry offset.
442*9880d681SAndroid Build Coastguard Worker ///
EmitValue(const AsmPrinter * AP,dwarf::Form Form) const443*9880d681SAndroid Build Coastguard Worker void DIEEntry::EmitValue(const AsmPrinter *AP, dwarf::Form Form) const {
444*9880d681SAndroid Build Coastguard Worker
445*9880d681SAndroid Build Coastguard Worker if (Form == dwarf::DW_FORM_ref_addr) {
446*9880d681SAndroid Build Coastguard Worker const DwarfDebug *DD = AP->getDwarfDebug();
447*9880d681SAndroid Build Coastguard Worker unsigned Addr = Entry->getOffset();
448*9880d681SAndroid Build Coastguard Worker assert(!DD->useSplitDwarf() && "TODO: dwo files can't have relocations.");
449*9880d681SAndroid Build Coastguard Worker // For DW_FORM_ref_addr, output the offset from beginning of debug info
450*9880d681SAndroid Build Coastguard Worker // section. Entry->getOffset() returns the offset from start of the
451*9880d681SAndroid Build Coastguard Worker // compile unit.
452*9880d681SAndroid Build Coastguard Worker DwarfCompileUnit *CU = DD->lookupUnit(Entry->getUnit());
453*9880d681SAndroid Build Coastguard Worker assert(CU && "CUDie should belong to a CU.");
454*9880d681SAndroid Build Coastguard Worker Addr += CU->getDebugInfoOffset();
455*9880d681SAndroid Build Coastguard Worker if (AP->MAI->doesDwarfUseRelocationsAcrossSections())
456*9880d681SAndroid Build Coastguard Worker AP->EmitLabelPlusOffset(CU->getSectionSym(), Addr,
457*9880d681SAndroid Build Coastguard Worker DIEEntry::getRefAddrSize(AP));
458*9880d681SAndroid Build Coastguard Worker else
459*9880d681SAndroid Build Coastguard Worker AP->OutStreamer->EmitIntValue(Addr, DIEEntry::getRefAddrSize(AP));
460*9880d681SAndroid Build Coastguard Worker } else
461*9880d681SAndroid Build Coastguard Worker AP->EmitInt32(Entry->getOffset());
462*9880d681SAndroid Build Coastguard Worker }
463*9880d681SAndroid Build Coastguard Worker
getRefAddrSize(const AsmPrinter * AP)464*9880d681SAndroid Build Coastguard Worker unsigned DIEEntry::getRefAddrSize(const AsmPrinter *AP) {
465*9880d681SAndroid Build Coastguard Worker // DWARF4: References that use the attribute form DW_FORM_ref_addr are
466*9880d681SAndroid Build Coastguard Worker // specified to be four bytes in the DWARF 32-bit format and eight bytes
467*9880d681SAndroid Build Coastguard Worker // in the DWARF 64-bit format, while DWARF Version 2 specifies that such
468*9880d681SAndroid Build Coastguard Worker // references have the same size as an address on the target system.
469*9880d681SAndroid Build Coastguard Worker const DwarfDebug *DD = AP->getDwarfDebug();
470*9880d681SAndroid Build Coastguard Worker assert(DD && "Expected Dwarf Debug info to be available");
471*9880d681SAndroid Build Coastguard Worker if (DD->getDwarfVersion() == 2)
472*9880d681SAndroid Build Coastguard Worker return AP->getPointerSize();
473*9880d681SAndroid Build Coastguard Worker return sizeof(int32_t);
474*9880d681SAndroid Build Coastguard Worker }
475*9880d681SAndroid Build Coastguard Worker
476*9880d681SAndroid Build Coastguard Worker LLVM_DUMP_METHOD
print(raw_ostream & O) const477*9880d681SAndroid Build Coastguard Worker void DIEEntry::print(raw_ostream &O) const {
478*9880d681SAndroid Build Coastguard Worker O << format("Die: 0x%lx", (long)(intptr_t)&Entry);
479*9880d681SAndroid Build Coastguard Worker }
480*9880d681SAndroid Build Coastguard Worker
481*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
482*9880d681SAndroid Build Coastguard Worker // DIELoc Implementation
483*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
484*9880d681SAndroid Build Coastguard Worker
485*9880d681SAndroid Build Coastguard Worker /// ComputeSize - calculate the size of the location expression.
486*9880d681SAndroid Build Coastguard Worker ///
ComputeSize(const AsmPrinter * AP) const487*9880d681SAndroid Build Coastguard Worker unsigned DIELoc::ComputeSize(const AsmPrinter *AP) const {
488*9880d681SAndroid Build Coastguard Worker if (!Size) {
489*9880d681SAndroid Build Coastguard Worker for (const auto &V : values())
490*9880d681SAndroid Build Coastguard Worker Size += V.SizeOf(AP);
491*9880d681SAndroid Build Coastguard Worker }
492*9880d681SAndroid Build Coastguard Worker
493*9880d681SAndroid Build Coastguard Worker return Size;
494*9880d681SAndroid Build Coastguard Worker }
495*9880d681SAndroid Build Coastguard Worker
496*9880d681SAndroid Build Coastguard Worker /// EmitValue - Emit location data.
497*9880d681SAndroid Build Coastguard Worker ///
EmitValue(const AsmPrinter * Asm,dwarf::Form Form) const498*9880d681SAndroid Build Coastguard Worker void DIELoc::EmitValue(const AsmPrinter *Asm, dwarf::Form Form) const {
499*9880d681SAndroid Build Coastguard Worker switch (Form) {
500*9880d681SAndroid Build Coastguard Worker default: llvm_unreachable("Improper form for block");
501*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_block1: Asm->EmitInt8(Size); break;
502*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_block2: Asm->EmitInt16(Size); break;
503*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_block4: Asm->EmitInt32(Size); break;
504*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_block:
505*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_exprloc:
506*9880d681SAndroid Build Coastguard Worker Asm->EmitULEB128(Size); break;
507*9880d681SAndroid Build Coastguard Worker }
508*9880d681SAndroid Build Coastguard Worker
509*9880d681SAndroid Build Coastguard Worker for (const auto &V : values())
510*9880d681SAndroid Build Coastguard Worker V.EmitValue(Asm);
511*9880d681SAndroid Build Coastguard Worker }
512*9880d681SAndroid Build Coastguard Worker
513*9880d681SAndroid Build Coastguard Worker /// SizeOf - Determine size of location data in bytes.
514*9880d681SAndroid Build Coastguard Worker ///
SizeOf(const AsmPrinter * AP,dwarf::Form Form) const515*9880d681SAndroid Build Coastguard Worker unsigned DIELoc::SizeOf(const AsmPrinter *AP, dwarf::Form Form) const {
516*9880d681SAndroid Build Coastguard Worker switch (Form) {
517*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_block1: return Size + sizeof(int8_t);
518*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_block2: return Size + sizeof(int16_t);
519*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_block4: return Size + sizeof(int32_t);
520*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_block:
521*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_exprloc:
522*9880d681SAndroid Build Coastguard Worker return Size + getULEB128Size(Size);
523*9880d681SAndroid Build Coastguard Worker default: llvm_unreachable("Improper form for block");
524*9880d681SAndroid Build Coastguard Worker }
525*9880d681SAndroid Build Coastguard Worker }
526*9880d681SAndroid Build Coastguard Worker
527*9880d681SAndroid Build Coastguard Worker LLVM_DUMP_METHOD
print(raw_ostream & O) const528*9880d681SAndroid Build Coastguard Worker void DIELoc::print(raw_ostream &O) const {
529*9880d681SAndroid Build Coastguard Worker printValues(O, *this, "ExprLoc", Size, 5);
530*9880d681SAndroid Build Coastguard Worker }
531*9880d681SAndroid Build Coastguard Worker
532*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
533*9880d681SAndroid Build Coastguard Worker // DIEBlock Implementation
534*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
535*9880d681SAndroid Build Coastguard Worker
536*9880d681SAndroid Build Coastguard Worker /// ComputeSize - calculate the size of the block.
537*9880d681SAndroid Build Coastguard Worker ///
ComputeSize(const AsmPrinter * AP) const538*9880d681SAndroid Build Coastguard Worker unsigned DIEBlock::ComputeSize(const AsmPrinter *AP) const {
539*9880d681SAndroid Build Coastguard Worker if (!Size) {
540*9880d681SAndroid Build Coastguard Worker for (const auto &V : values())
541*9880d681SAndroid Build Coastguard Worker Size += V.SizeOf(AP);
542*9880d681SAndroid Build Coastguard Worker }
543*9880d681SAndroid Build Coastguard Worker
544*9880d681SAndroid Build Coastguard Worker return Size;
545*9880d681SAndroid Build Coastguard Worker }
546*9880d681SAndroid Build Coastguard Worker
547*9880d681SAndroid Build Coastguard Worker /// EmitValue - Emit block data.
548*9880d681SAndroid Build Coastguard Worker ///
EmitValue(const AsmPrinter * Asm,dwarf::Form Form) const549*9880d681SAndroid Build Coastguard Worker void DIEBlock::EmitValue(const AsmPrinter *Asm, dwarf::Form Form) const {
550*9880d681SAndroid Build Coastguard Worker switch (Form) {
551*9880d681SAndroid Build Coastguard Worker default: llvm_unreachable("Improper form for block");
552*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_block1: Asm->EmitInt8(Size); break;
553*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_block2: Asm->EmitInt16(Size); break;
554*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_block4: Asm->EmitInt32(Size); break;
555*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_block: Asm->EmitULEB128(Size); break;
556*9880d681SAndroid Build Coastguard Worker }
557*9880d681SAndroid Build Coastguard Worker
558*9880d681SAndroid Build Coastguard Worker for (const auto &V : values())
559*9880d681SAndroid Build Coastguard Worker V.EmitValue(Asm);
560*9880d681SAndroid Build Coastguard Worker }
561*9880d681SAndroid Build Coastguard Worker
562*9880d681SAndroid Build Coastguard Worker /// SizeOf - Determine size of block data in bytes.
563*9880d681SAndroid Build Coastguard Worker ///
SizeOf(const AsmPrinter * AP,dwarf::Form Form) const564*9880d681SAndroid Build Coastguard Worker unsigned DIEBlock::SizeOf(const AsmPrinter *AP, dwarf::Form Form) const {
565*9880d681SAndroid Build Coastguard Worker switch (Form) {
566*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_block1: return Size + sizeof(int8_t);
567*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_block2: return Size + sizeof(int16_t);
568*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_block4: return Size + sizeof(int32_t);
569*9880d681SAndroid Build Coastguard Worker case dwarf::DW_FORM_block: return Size + getULEB128Size(Size);
570*9880d681SAndroid Build Coastguard Worker default: llvm_unreachable("Improper form for block");
571*9880d681SAndroid Build Coastguard Worker }
572*9880d681SAndroid Build Coastguard Worker }
573*9880d681SAndroid Build Coastguard Worker
574*9880d681SAndroid Build Coastguard Worker LLVM_DUMP_METHOD
print(raw_ostream & O) const575*9880d681SAndroid Build Coastguard Worker void DIEBlock::print(raw_ostream &O) const {
576*9880d681SAndroid Build Coastguard Worker printValues(O, *this, "Blk", Size, 5);
577*9880d681SAndroid Build Coastguard Worker }
578*9880d681SAndroid Build Coastguard Worker
579*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
580*9880d681SAndroid Build Coastguard Worker // DIELocList Implementation
581*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
582*9880d681SAndroid Build Coastguard Worker
SizeOf(const AsmPrinter * AP,dwarf::Form Form) const583*9880d681SAndroid Build Coastguard Worker unsigned DIELocList::SizeOf(const AsmPrinter *AP, dwarf::Form Form) const {
584*9880d681SAndroid Build Coastguard Worker if (Form == dwarf::DW_FORM_data4)
585*9880d681SAndroid Build Coastguard Worker return 4;
586*9880d681SAndroid Build Coastguard Worker if (Form == dwarf::DW_FORM_sec_offset)
587*9880d681SAndroid Build Coastguard Worker return 4;
588*9880d681SAndroid Build Coastguard Worker return AP->getPointerSize();
589*9880d681SAndroid Build Coastguard Worker }
590*9880d681SAndroid Build Coastguard Worker
591*9880d681SAndroid Build Coastguard Worker /// EmitValue - Emit label value.
592*9880d681SAndroid Build Coastguard Worker ///
EmitValue(const AsmPrinter * AP,dwarf::Form Form) const593*9880d681SAndroid Build Coastguard Worker void DIELocList::EmitValue(const AsmPrinter *AP, dwarf::Form Form) const {
594*9880d681SAndroid Build Coastguard Worker DwarfDebug *DD = AP->getDwarfDebug();
595*9880d681SAndroid Build Coastguard Worker MCSymbol *Label = DD->getDebugLocs().getList(Index).Label;
596*9880d681SAndroid Build Coastguard Worker AP->emitDwarfSymbolReference(Label, /*ForceOffset*/ DD->useSplitDwarf());
597*9880d681SAndroid Build Coastguard Worker }
598*9880d681SAndroid Build Coastguard Worker
599*9880d681SAndroid Build Coastguard Worker LLVM_DUMP_METHOD
print(raw_ostream & O) const600*9880d681SAndroid Build Coastguard Worker void DIELocList::print(raw_ostream &O) const { O << "LocList: " << Index; }
601