1 //===--- lib/CodeGen/DIE.cpp - DWARF Info Entries -------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // Data structures for DWARF info entries.
12 //===----------------------------------------------------------------------===//
15 #include "llvm/ADT/Twine.h"
16 #include "llvm/CodeGen/AsmPrinter.h"
17 #include "llvm/MC/MCAsmInfo.h"
18 #include "llvm/MC/MCStreamer.h"
19 #include "llvm/MC/MCSymbol.h"
20 #include "llvm/Target/TargetData.h"
21 #include "llvm/Support/Allocator.h"
22 #include "llvm/Support/Debug.h"
23 #include "llvm/Support/ErrorHandling.h"
24 #include "llvm/Support/Format.h"
25 #include "llvm/Support/FormattedStream.h"
28 //===----------------------------------------------------------------------===//
29 // DIEAbbrevData Implementation
30 //===----------------------------------------------------------------------===//
32 /// Profile - Used to gather unique data for the abbreviation folding set.
34 void DIEAbbrevData::Profile(FoldingSetNodeID
&ID
) const {
35 ID
.AddInteger(Attribute
);
39 //===----------------------------------------------------------------------===//
40 // DIEAbbrev Implementation
41 //===----------------------------------------------------------------------===//
43 /// Profile - Used to gather unique data for the abbreviation folding set.
45 void DIEAbbrev::Profile(FoldingSetNodeID
&ID
) const {
47 ID
.AddInteger(ChildrenFlag
);
49 // For each attribute description.
50 for (unsigned i
= 0, N
= Data
.size(); i
< N
; ++i
)
54 /// Emit - Print the abbreviation using the specified asm printer.
56 void DIEAbbrev::Emit(AsmPrinter
*AP
) const {
57 // Emit its Dwarf tag type.
58 // FIXME: Doing work even in non-asm-verbose runs.
59 AP
->EmitULEB128(Tag
, dwarf::TagString(Tag
));
61 // Emit whether it has children DIEs.
62 // FIXME: Doing work even in non-asm-verbose runs.
63 AP
->EmitULEB128(ChildrenFlag
, dwarf::ChildrenString(ChildrenFlag
));
65 // For each attribute description.
66 for (unsigned i
= 0, N
= Data
.size(); i
< N
; ++i
) {
67 const DIEAbbrevData
&AttrData
= Data
[i
];
69 // Emit attribute type.
70 // FIXME: Doing work even in non-asm-verbose runs.
71 AP
->EmitULEB128(AttrData
.getAttribute(),
72 dwarf::AttributeString(AttrData
.getAttribute()));
75 // FIXME: Doing work even in non-asm-verbose runs.
76 AP
->EmitULEB128(AttrData
.getForm(),
77 dwarf::FormEncodingString(AttrData
.getForm()));
80 // Mark end of abbreviation.
81 AP
->EmitULEB128(0, "EOM(1)");
82 AP
->EmitULEB128(0, "EOM(2)");
86 void DIEAbbrev::print(raw_ostream
&O
) {
88 << format("0x%lx", (long)(intptr_t)this)
90 << dwarf::TagString(Tag
)
92 << dwarf::ChildrenString(ChildrenFlag
)
95 for (unsigned i
= 0, N
= Data
.size(); i
< N
; ++i
) {
97 << dwarf::AttributeString(Data
[i
].getAttribute())
99 << dwarf::FormEncodingString(Data
[i
].getForm())
103 void DIEAbbrev::dump() { print(dbgs()); }
106 //===----------------------------------------------------------------------===//
107 // DIE Implementation
108 //===----------------------------------------------------------------------===//
111 for (unsigned i
= 0, N
= Children
.size(); i
< N
; ++i
)
115 /// addSiblingOffset - Add a sibling offset field to the front of the DIE.
117 DIEValue
*DIE::addSiblingOffset(BumpPtrAllocator
&A
) {
118 DIEInteger
*DI
= new (A
) DIEInteger(0);
119 Values
.insert(Values
.begin(), DI
);
120 Abbrev
.AddFirstAttribute(dwarf::DW_AT_sibling
, dwarf::DW_FORM_ref4
);
125 void DIE::print(raw_ostream
&O
, unsigned IncIndent
) {
126 IndentCount
+= IncIndent
;
127 const std::string
Indent(IndentCount
, ' ');
128 bool isBlock
= Abbrev
.getTag() == 0;
133 << format("0x%lx", (long)(intptr_t)this)
134 << ", Offset: " << Offset
135 << ", Size: " << Size
<< "\n";
138 << dwarf::TagString(Abbrev
.getTag())
140 << dwarf::ChildrenString(Abbrev
.getChildrenFlag()) << "\n";
142 O
<< "Size: " << Size
<< "\n";
145 const SmallVector
<DIEAbbrevData
, 8> &Data
= Abbrev
.getData();
148 for (unsigned i
= 0, N
= Data
.size(); i
< N
; ++i
) {
152 O
<< dwarf::AttributeString(Data
[i
].getAttribute());
154 O
<< "Blk[" << i
<< "]";
157 << dwarf::FormEncodingString(Data
[i
].getForm())
164 for (unsigned j
= 0, M
= Children
.size(); j
< M
; ++j
) {
165 Children
[j
]->print(O
, 4);
168 if (!isBlock
) O
<< "\n";
169 IndentCount
-= IncIndent
;
179 void DIEValue::dump() {
184 //===----------------------------------------------------------------------===//
185 // DIEInteger Implementation
186 //===----------------------------------------------------------------------===//
188 /// EmitValue - Emit integer of appropriate size.
190 void DIEInteger::EmitValue(AsmPrinter
*Asm
, unsigned Form
) const {
193 case dwarf::DW_FORM_flag
: // Fall thru
194 case dwarf::DW_FORM_ref1
: // Fall thru
195 case dwarf::DW_FORM_data1
: Size
= 1; break;
196 case dwarf::DW_FORM_ref2
: // Fall thru
197 case dwarf::DW_FORM_data2
: Size
= 2; break;
198 case dwarf::DW_FORM_ref4
: // Fall thru
199 case dwarf::DW_FORM_data4
: Size
= 4; break;
200 case dwarf::DW_FORM_ref8
: // Fall thru
201 case dwarf::DW_FORM_data8
: Size
= 8; break;
202 case dwarf::DW_FORM_udata
: Asm
->EmitULEB128(Integer
); return;
203 case dwarf::DW_FORM_sdata
: Asm
->EmitSLEB128(Integer
); return;
204 case dwarf::DW_FORM_addr
: Size
= Asm
->getTargetData().getPointerSize(); break;
205 default: llvm_unreachable("DIE Value form not supported yet");
207 Asm
->OutStreamer
.EmitIntValue(Integer
, Size
, 0/*addrspace*/);
210 /// SizeOf - Determine size of integer value in bytes.
212 unsigned DIEInteger::SizeOf(AsmPrinter
*AP
, unsigned Form
) const {
214 case dwarf::DW_FORM_flag
: // Fall thru
215 case dwarf::DW_FORM_ref1
: // Fall thru
216 case dwarf::DW_FORM_data1
: return sizeof(int8_t);
217 case dwarf::DW_FORM_ref2
: // Fall thru
218 case dwarf::DW_FORM_data2
: return sizeof(int16_t);
219 case dwarf::DW_FORM_ref4
: // Fall thru
220 case dwarf::DW_FORM_data4
: return sizeof(int32_t);
221 case dwarf::DW_FORM_ref8
: // Fall thru
222 case dwarf::DW_FORM_data8
: return sizeof(int64_t);
223 case dwarf::DW_FORM_udata
: return MCAsmInfo::getULEB128Size(Integer
);
224 case dwarf::DW_FORM_sdata
: return MCAsmInfo::getSLEB128Size(Integer
);
225 case dwarf::DW_FORM_addr
: return AP
->getTargetData().getPointerSize();
226 default: llvm_unreachable("DIE Value form not supported yet"); break;
232 void DIEInteger::print(raw_ostream
&O
) {
233 O
<< "Int: " << (int64_t)Integer
234 << format(" 0x%llx", (unsigned long long)Integer
);
238 //===----------------------------------------------------------------------===//
239 // DIEString Implementation
240 //===----------------------------------------------------------------------===//
242 /// EmitValue - Emit string value.
244 void DIEString::EmitValue(AsmPrinter
*AP
, unsigned Form
) const {
245 AP
->OutStreamer
.EmitBytes(Str
, /*addrspace*/0);
246 // Emit nul terminator.
247 AP
->OutStreamer
.EmitIntValue(0, 1, /*addrspace*/0);
251 void DIEString::print(raw_ostream
&O
) {
252 O
<< "Str: \"" << Str
<< "\"";
256 //===----------------------------------------------------------------------===//
257 // DIELabel Implementation
258 //===----------------------------------------------------------------------===//
260 /// EmitValue - Emit label value.
262 void DIELabel::EmitValue(AsmPrinter
*AP
, unsigned Form
) const {
263 AP
->OutStreamer
.EmitSymbolValue(Label
, SizeOf(AP
, Form
), 0/*AddrSpace*/);
266 /// SizeOf - Determine size of label value in bytes.
268 unsigned DIELabel::SizeOf(AsmPrinter
*AP
, unsigned Form
) const {
269 if (Form
== dwarf::DW_FORM_data4
) return 4;
270 return AP
->getTargetData().getPointerSize();
274 void DIELabel::print(raw_ostream
&O
) {
275 O
<< "Lbl: " << Label
->getName();
279 //===----------------------------------------------------------------------===//
280 // DIEDelta Implementation
281 //===----------------------------------------------------------------------===//
283 /// EmitValue - Emit delta value.
285 void DIEDelta::EmitValue(AsmPrinter
*AP
, unsigned Form
) const {
286 AP
->EmitLabelDifference(LabelHi
, LabelLo
, SizeOf(AP
, Form
));
289 /// SizeOf - Determine size of delta value in bytes.
291 unsigned DIEDelta::SizeOf(AsmPrinter
*AP
, unsigned Form
) const {
292 if (Form
== dwarf::DW_FORM_data4
) return 4;
293 return AP
->getTargetData().getPointerSize();
297 void DIEDelta::print(raw_ostream
&O
) {
298 O
<< "Del: " << LabelHi
->getName() << "-" << LabelLo
->getName();
302 //===----------------------------------------------------------------------===//
303 // DIEEntry Implementation
304 //===----------------------------------------------------------------------===//
306 /// EmitValue - Emit debug information entry offset.
308 void DIEEntry::EmitValue(AsmPrinter
*AP
, unsigned Form
) const {
309 AP
->EmitInt32(Entry
->getOffset());
313 void DIEEntry::print(raw_ostream
&O
) {
314 O
<< format("Die: 0x%lx", (long)(intptr_t)Entry
);
318 //===----------------------------------------------------------------------===//
319 // DIEBlock Implementation
320 //===----------------------------------------------------------------------===//
322 /// ComputeSize - calculate the size of the block.
324 unsigned DIEBlock::ComputeSize(AsmPrinter
*AP
) {
326 const SmallVector
<DIEAbbrevData
, 8> &AbbrevData
= Abbrev
.getData();
327 for (unsigned i
= 0, N
= Values
.size(); i
< N
; ++i
)
328 Size
+= Values
[i
]->SizeOf(AP
, AbbrevData
[i
].getForm());
334 /// EmitValue - Emit block data.
336 void DIEBlock::EmitValue(AsmPrinter
*Asm
, unsigned Form
) const {
338 default: assert(0 && "Improper form for block"); break;
339 case dwarf::DW_FORM_block1
: Asm
->EmitInt8(Size
); break;
340 case dwarf::DW_FORM_block2
: Asm
->EmitInt16(Size
); break;
341 case dwarf::DW_FORM_block4
: Asm
->EmitInt32(Size
); break;
342 case dwarf::DW_FORM_block
: Asm
->EmitULEB128(Size
); break;
345 const SmallVector
<DIEAbbrevData
, 8> &AbbrevData
= Abbrev
.getData();
346 for (unsigned i
= 0, N
= Values
.size(); i
< N
; ++i
)
347 Values
[i
]->EmitValue(Asm
, AbbrevData
[i
].getForm());
350 /// SizeOf - Determine size of block data in bytes.
352 unsigned DIEBlock::SizeOf(AsmPrinter
*AP
, unsigned Form
) const {
354 case dwarf::DW_FORM_block1
: return Size
+ sizeof(int8_t);
355 case dwarf::DW_FORM_block2
: return Size
+ sizeof(int16_t);
356 case dwarf::DW_FORM_block4
: return Size
+ sizeof(int32_t);
357 case dwarf::DW_FORM_block
: return Size
+ MCAsmInfo::getULEB128Size(Size
);
358 default: llvm_unreachable("Improper form for block"); break;
364 void DIEBlock::print(raw_ostream
&O
) {