annotate llvm/lib/MC/MCFragment.cpp @ 180:680fa57a2f20

fix compile errors.
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 30 May 2020 17:44:06 +0900
parents 0572611fdcc8
children 2e18cbf3894f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===- lib/MC/MCFragment.cpp - Assembler Fragment Implementation ----------===//
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8
anatofuz
parents:
diff changeset
9 #include "llvm/MC/MCFragment.h"
anatofuz
parents:
diff changeset
10 #include "llvm/ADT/SmallVector.h"
anatofuz
parents:
diff changeset
11 #include "llvm/ADT/StringExtras.h"
anatofuz
parents:
diff changeset
12 #include "llvm/ADT/Twine.h"
anatofuz
parents:
diff changeset
13 #include "llvm/Config/llvm-config.h"
anatofuz
parents:
diff changeset
14 #include "llvm/MC/MCAsmLayout.h"
anatofuz
parents:
diff changeset
15 #include "llvm/MC/MCAssembler.h"
anatofuz
parents:
diff changeset
16 #include "llvm/MC/MCContext.h"
anatofuz
parents:
diff changeset
17 #include "llvm/MC/MCExpr.h"
anatofuz
parents:
diff changeset
18 #include "llvm/MC/MCFixup.h"
anatofuz
parents:
diff changeset
19 #include "llvm/MC/MCSection.h"
anatofuz
parents:
diff changeset
20 #include "llvm/MC/MCSymbol.h"
anatofuz
parents:
diff changeset
21 #include "llvm/MC/MCValue.h"
anatofuz
parents:
diff changeset
22 #include "llvm/Support/Casting.h"
anatofuz
parents:
diff changeset
23 #include "llvm/Support/Compiler.h"
anatofuz
parents:
diff changeset
24 #include "llvm/Support/ErrorHandling.h"
anatofuz
parents:
diff changeset
25 #include "llvm/Support/raw_ostream.h"
anatofuz
parents:
diff changeset
26 #include <cassert>
anatofuz
parents:
diff changeset
27 #include <cstdint>
anatofuz
parents:
diff changeset
28 #include <utility>
anatofuz
parents:
diff changeset
29
anatofuz
parents:
diff changeset
30 using namespace llvm;
anatofuz
parents:
diff changeset
31
anatofuz
parents:
diff changeset
32 MCAsmLayout::MCAsmLayout(MCAssembler &Asm) : Assembler(Asm) {
anatofuz
parents:
diff changeset
33 // Compute the section layout order. Virtual sections must go last.
anatofuz
parents:
diff changeset
34 for (MCSection &Sec : Asm)
anatofuz
parents:
diff changeset
35 if (!Sec.isVirtualSection())
anatofuz
parents:
diff changeset
36 SectionOrder.push_back(&Sec);
anatofuz
parents:
diff changeset
37 for (MCSection &Sec : Asm)
anatofuz
parents:
diff changeset
38 if (Sec.isVirtualSection())
anatofuz
parents:
diff changeset
39 SectionOrder.push_back(&Sec);
anatofuz
parents:
diff changeset
40 }
anatofuz
parents:
diff changeset
41
anatofuz
parents:
diff changeset
42 bool MCAsmLayout::isFragmentValid(const MCFragment *F) const {
anatofuz
parents:
diff changeset
43 const MCSection *Sec = F->getParent();
anatofuz
parents:
diff changeset
44 const MCFragment *LastValid = LastValidFragment.lookup(Sec);
anatofuz
parents:
diff changeset
45 if (!LastValid)
anatofuz
parents:
diff changeset
46 return false;
anatofuz
parents:
diff changeset
47 assert(LastValid->getParent() == Sec);
anatofuz
parents:
diff changeset
48 return F->getLayoutOrder() <= LastValid->getLayoutOrder();
anatofuz
parents:
diff changeset
49 }
anatofuz
parents:
diff changeset
50
anatofuz
parents:
diff changeset
51 void MCAsmLayout::invalidateFragmentsFrom(MCFragment *F) {
anatofuz
parents:
diff changeset
52 // If this fragment wasn't already valid, we don't need to do anything.
anatofuz
parents:
diff changeset
53 if (!isFragmentValid(F))
anatofuz
parents:
diff changeset
54 return;
anatofuz
parents:
diff changeset
55
anatofuz
parents:
diff changeset
56 // Otherwise, reset the last valid fragment to the previous fragment
anatofuz
parents:
diff changeset
57 // (if this is the first fragment, it will be NULL).
anatofuz
parents:
diff changeset
58 LastValidFragment[F->getParent()] = F->getPrevNode();
anatofuz
parents:
diff changeset
59 }
anatofuz
parents:
diff changeset
60
anatofuz
parents:
diff changeset
61 void MCAsmLayout::ensureValid(const MCFragment *F) const {
anatofuz
parents:
diff changeset
62 MCSection *Sec = F->getParent();
anatofuz
parents:
diff changeset
63 MCSection::iterator I;
anatofuz
parents:
diff changeset
64 if (MCFragment *Cur = LastValidFragment[Sec])
anatofuz
parents:
diff changeset
65 I = ++MCSection::iterator(Cur);
anatofuz
parents:
diff changeset
66 else
anatofuz
parents:
diff changeset
67 I = Sec->begin();
anatofuz
parents:
diff changeset
68
anatofuz
parents:
diff changeset
69 // Advance the layout position until the fragment is valid.
anatofuz
parents:
diff changeset
70 while (!isFragmentValid(F)) {
anatofuz
parents:
diff changeset
71 assert(I != Sec->end() && "Layout bookkeeping error");
anatofuz
parents:
diff changeset
72 const_cast<MCAsmLayout *>(this)->layoutFragment(&*I);
anatofuz
parents:
diff changeset
73 ++I;
anatofuz
parents:
diff changeset
74 }
anatofuz
parents:
diff changeset
75 }
anatofuz
parents:
diff changeset
76
anatofuz
parents:
diff changeset
77 uint64_t MCAsmLayout::getFragmentOffset(const MCFragment *F) const {
anatofuz
parents:
diff changeset
78 ensureValid(F);
anatofuz
parents:
diff changeset
79 assert(F->Offset != ~UINT64_C(0) && "Address not set!");
anatofuz
parents:
diff changeset
80 return F->Offset;
anatofuz
parents:
diff changeset
81 }
anatofuz
parents:
diff changeset
82
anatofuz
parents:
diff changeset
83 // Simple getSymbolOffset helper for the non-variable case.
anatofuz
parents:
diff changeset
84 static bool getLabelOffset(const MCAsmLayout &Layout, const MCSymbol &S,
anatofuz
parents:
diff changeset
85 bool ReportError, uint64_t &Val) {
anatofuz
parents:
diff changeset
86 if (!S.getFragment()) {
anatofuz
parents:
diff changeset
87 if (ReportError)
anatofuz
parents:
diff changeset
88 report_fatal_error("unable to evaluate offset to undefined symbol '" +
anatofuz
parents:
diff changeset
89 S.getName() + "'");
anatofuz
parents:
diff changeset
90 return false;
anatofuz
parents:
diff changeset
91 }
anatofuz
parents:
diff changeset
92 Val = Layout.getFragmentOffset(S.getFragment()) + S.getOffset();
anatofuz
parents:
diff changeset
93 return true;
anatofuz
parents:
diff changeset
94 }
anatofuz
parents:
diff changeset
95
anatofuz
parents:
diff changeset
96 static bool getSymbolOffsetImpl(const MCAsmLayout &Layout, const MCSymbol &S,
anatofuz
parents:
diff changeset
97 bool ReportError, uint64_t &Val) {
anatofuz
parents:
diff changeset
98 if (!S.isVariable())
anatofuz
parents:
diff changeset
99 return getLabelOffset(Layout, S, ReportError, Val);
anatofuz
parents:
diff changeset
100
anatofuz
parents:
diff changeset
101 // If SD is a variable, evaluate it.
anatofuz
parents:
diff changeset
102 MCValue Target;
anatofuz
parents:
diff changeset
103 if (!S.getVariableValue()->evaluateAsValue(Target, Layout))
anatofuz
parents:
diff changeset
104 report_fatal_error("unable to evaluate offset for variable '" +
anatofuz
parents:
diff changeset
105 S.getName() + "'");
anatofuz
parents:
diff changeset
106
anatofuz
parents:
diff changeset
107 uint64_t Offset = Target.getConstant();
anatofuz
parents:
diff changeset
108
anatofuz
parents:
diff changeset
109 const MCSymbolRefExpr *A = Target.getSymA();
anatofuz
parents:
diff changeset
110 if (A) {
anatofuz
parents:
diff changeset
111 uint64_t ValA;
anatofuz
parents:
diff changeset
112 if (!getLabelOffset(Layout, A->getSymbol(), ReportError, ValA))
anatofuz
parents:
diff changeset
113 return false;
anatofuz
parents:
diff changeset
114 Offset += ValA;
anatofuz
parents:
diff changeset
115 }
anatofuz
parents:
diff changeset
116
anatofuz
parents:
diff changeset
117 const MCSymbolRefExpr *B = Target.getSymB();
anatofuz
parents:
diff changeset
118 if (B) {
anatofuz
parents:
diff changeset
119 uint64_t ValB;
anatofuz
parents:
diff changeset
120 if (!getLabelOffset(Layout, B->getSymbol(), ReportError, ValB))
anatofuz
parents:
diff changeset
121 return false;
anatofuz
parents:
diff changeset
122 Offset -= ValB;
anatofuz
parents:
diff changeset
123 }
anatofuz
parents:
diff changeset
124
anatofuz
parents:
diff changeset
125 Val = Offset;
anatofuz
parents:
diff changeset
126 return true;
anatofuz
parents:
diff changeset
127 }
anatofuz
parents:
diff changeset
128
anatofuz
parents:
diff changeset
129 bool MCAsmLayout::getSymbolOffset(const MCSymbol &S, uint64_t &Val) const {
anatofuz
parents:
diff changeset
130 return getSymbolOffsetImpl(*this, S, false, Val);
anatofuz
parents:
diff changeset
131 }
anatofuz
parents:
diff changeset
132
anatofuz
parents:
diff changeset
133 uint64_t MCAsmLayout::getSymbolOffset(const MCSymbol &S) const {
anatofuz
parents:
diff changeset
134 uint64_t Val;
anatofuz
parents:
diff changeset
135 getSymbolOffsetImpl(*this, S, true, Val);
anatofuz
parents:
diff changeset
136 return Val;
anatofuz
parents:
diff changeset
137 }
anatofuz
parents:
diff changeset
138
anatofuz
parents:
diff changeset
139 const MCSymbol *MCAsmLayout::getBaseSymbol(const MCSymbol &Symbol) const {
anatofuz
parents:
diff changeset
140 if (!Symbol.isVariable())
anatofuz
parents:
diff changeset
141 return &Symbol;
anatofuz
parents:
diff changeset
142
anatofuz
parents:
diff changeset
143 const MCExpr *Expr = Symbol.getVariableValue();
anatofuz
parents:
diff changeset
144 MCValue Value;
anatofuz
parents:
diff changeset
145 if (!Expr->evaluateAsValue(Value, *this)) {
anatofuz
parents:
diff changeset
146 Assembler.getContext().reportError(
anatofuz
parents:
diff changeset
147 Expr->getLoc(), "expression could not be evaluated");
anatofuz
parents:
diff changeset
148 return nullptr;
anatofuz
parents:
diff changeset
149 }
anatofuz
parents:
diff changeset
150
anatofuz
parents:
diff changeset
151 const MCSymbolRefExpr *RefB = Value.getSymB();
anatofuz
parents:
diff changeset
152 if (RefB) {
anatofuz
parents:
diff changeset
153 Assembler.getContext().reportError(
anatofuz
parents:
diff changeset
154 Expr->getLoc(), Twine("symbol '") + RefB->getSymbol().getName() +
anatofuz
parents:
diff changeset
155 "' could not be evaluated in a subtraction expression");
anatofuz
parents:
diff changeset
156 return nullptr;
anatofuz
parents:
diff changeset
157 }
anatofuz
parents:
diff changeset
158
anatofuz
parents:
diff changeset
159 const MCSymbolRefExpr *A = Value.getSymA();
anatofuz
parents:
diff changeset
160 if (!A)
anatofuz
parents:
diff changeset
161 return nullptr;
anatofuz
parents:
diff changeset
162
anatofuz
parents:
diff changeset
163 const MCSymbol &ASym = A->getSymbol();
anatofuz
parents:
diff changeset
164 const MCAssembler &Asm = getAssembler();
anatofuz
parents:
diff changeset
165 if (ASym.isCommon()) {
anatofuz
parents:
diff changeset
166 Asm.getContext().reportError(Expr->getLoc(),
anatofuz
parents:
diff changeset
167 "Common symbol '" + ASym.getName() +
anatofuz
parents:
diff changeset
168 "' cannot be used in assignment expr");
anatofuz
parents:
diff changeset
169 return nullptr;
anatofuz
parents:
diff changeset
170 }
anatofuz
parents:
diff changeset
171
anatofuz
parents:
diff changeset
172 return &ASym;
anatofuz
parents:
diff changeset
173 }
anatofuz
parents:
diff changeset
174
anatofuz
parents:
diff changeset
175 uint64_t MCAsmLayout::getSectionAddressSize(const MCSection *Sec) const {
anatofuz
parents:
diff changeset
176 // The size is the last fragment's end offset.
anatofuz
parents:
diff changeset
177 const MCFragment &F = Sec->getFragmentList().back();
anatofuz
parents:
diff changeset
178 return getFragmentOffset(&F) + getAssembler().computeFragmentSize(*this, F);
anatofuz
parents:
diff changeset
179 }
anatofuz
parents:
diff changeset
180
anatofuz
parents:
diff changeset
181 uint64_t MCAsmLayout::getSectionFileSize(const MCSection *Sec) const {
anatofuz
parents:
diff changeset
182 // Virtual sections have no file size.
anatofuz
parents:
diff changeset
183 if (Sec->isVirtualSection())
anatofuz
parents:
diff changeset
184 return 0;
anatofuz
parents:
diff changeset
185
anatofuz
parents:
diff changeset
186 // Otherwise, the file size is the same as the address space size.
anatofuz
parents:
diff changeset
187 return getSectionAddressSize(Sec);
anatofuz
parents:
diff changeset
188 }
anatofuz
parents:
diff changeset
189
anatofuz
parents:
diff changeset
190 uint64_t llvm::computeBundlePadding(const MCAssembler &Assembler,
anatofuz
parents:
diff changeset
191 const MCEncodedFragment *F,
anatofuz
parents:
diff changeset
192 uint64_t FOffset, uint64_t FSize) {
anatofuz
parents:
diff changeset
193 uint64_t BundleSize = Assembler.getBundleAlignSize();
anatofuz
parents:
diff changeset
194 assert(BundleSize > 0 &&
anatofuz
parents:
diff changeset
195 "computeBundlePadding should only be called if bundling is enabled");
anatofuz
parents:
diff changeset
196 uint64_t BundleMask = BundleSize - 1;
anatofuz
parents:
diff changeset
197 uint64_t OffsetInBundle = FOffset & BundleMask;
anatofuz
parents:
diff changeset
198 uint64_t EndOfFragment = OffsetInBundle + FSize;
anatofuz
parents:
diff changeset
199
anatofuz
parents:
diff changeset
200 // There are two kinds of bundling restrictions:
anatofuz
parents:
diff changeset
201 //
anatofuz
parents:
diff changeset
202 // 1) For alignToBundleEnd(), add padding to ensure that the fragment will
anatofuz
parents:
diff changeset
203 // *end* on a bundle boundary.
anatofuz
parents:
diff changeset
204 // 2) Otherwise, check if the fragment would cross a bundle boundary. If it
anatofuz
parents:
diff changeset
205 // would, add padding until the end of the bundle so that the fragment
anatofuz
parents:
diff changeset
206 // will start in a new one.
anatofuz
parents:
diff changeset
207 if (F->alignToBundleEnd()) {
anatofuz
parents:
diff changeset
208 // Three possibilities here:
anatofuz
parents:
diff changeset
209 //
anatofuz
parents:
diff changeset
210 // A) The fragment just happens to end at a bundle boundary, so we're good.
anatofuz
parents:
diff changeset
211 // B) The fragment ends before the current bundle boundary: pad it just
anatofuz
parents:
diff changeset
212 // enough to reach the boundary.
anatofuz
parents:
diff changeset
213 // C) The fragment ends after the current bundle boundary: pad it until it
anatofuz
parents:
diff changeset
214 // reaches the end of the next bundle boundary.
anatofuz
parents:
diff changeset
215 //
anatofuz
parents:
diff changeset
216 // Note: this code could be made shorter with some modulo trickery, but it's
anatofuz
parents:
diff changeset
217 // intentionally kept in its more explicit form for simplicity.
anatofuz
parents:
diff changeset
218 if (EndOfFragment == BundleSize)
anatofuz
parents:
diff changeset
219 return 0;
anatofuz
parents:
diff changeset
220 else if (EndOfFragment < BundleSize)
anatofuz
parents:
diff changeset
221 return BundleSize - EndOfFragment;
anatofuz
parents:
diff changeset
222 else { // EndOfFragment > BundleSize
anatofuz
parents:
diff changeset
223 return 2 * BundleSize - EndOfFragment;
anatofuz
parents:
diff changeset
224 }
anatofuz
parents:
diff changeset
225 } else if (OffsetInBundle > 0 && EndOfFragment > BundleSize)
anatofuz
parents:
diff changeset
226 return BundleSize - OffsetInBundle;
anatofuz
parents:
diff changeset
227 else
anatofuz
parents:
diff changeset
228 return 0;
anatofuz
parents:
diff changeset
229 }
anatofuz
parents:
diff changeset
230
anatofuz
parents:
diff changeset
231 /* *** */
anatofuz
parents:
diff changeset
232
anatofuz
parents:
diff changeset
233 void ilist_alloc_traits<MCFragment>::deleteNode(MCFragment *V) { V->destroy(); }
anatofuz
parents:
diff changeset
234
anatofuz
parents:
diff changeset
235 MCFragment::MCFragment(FragmentType Kind, bool HasInstructions,
anatofuz
parents:
diff changeset
236 MCSection *Parent)
anatofuz
parents:
diff changeset
237 : Parent(Parent), Atom(nullptr), Offset(~UINT64_C(0)), LayoutOrder(0),
anatofuz
parents:
diff changeset
238 Kind(Kind), HasInstructions(HasInstructions) {
anatofuz
parents:
diff changeset
239 if (Parent && !isa<MCDummyFragment>(*this))
anatofuz
parents:
diff changeset
240 Parent->getFragmentList().push_back(this);
anatofuz
parents:
diff changeset
241 }
anatofuz
parents:
diff changeset
242
anatofuz
parents:
diff changeset
243 void MCFragment::destroy() {
anatofuz
parents:
diff changeset
244 // First check if we are the sentinal.
anatofuz
parents:
diff changeset
245 if (Kind == FragmentType(~0)) {
anatofuz
parents:
diff changeset
246 delete this;
anatofuz
parents:
diff changeset
247 return;
anatofuz
parents:
diff changeset
248 }
anatofuz
parents:
diff changeset
249
anatofuz
parents:
diff changeset
250 switch (Kind) {
anatofuz
parents:
diff changeset
251 case FT_Align:
anatofuz
parents:
diff changeset
252 delete cast<MCAlignFragment>(this);
anatofuz
parents:
diff changeset
253 return;
anatofuz
parents:
diff changeset
254 case FT_Data:
anatofuz
parents:
diff changeset
255 delete cast<MCDataFragment>(this);
anatofuz
parents:
diff changeset
256 return;
anatofuz
parents:
diff changeset
257 case FT_CompactEncodedInst:
anatofuz
parents:
diff changeset
258 delete cast<MCCompactEncodedInstFragment>(this);
anatofuz
parents:
diff changeset
259 return;
anatofuz
parents:
diff changeset
260 case FT_Fill:
anatofuz
parents:
diff changeset
261 delete cast<MCFillFragment>(this);
anatofuz
parents:
diff changeset
262 return;
anatofuz
parents:
diff changeset
263 case FT_Relaxable:
anatofuz
parents:
diff changeset
264 delete cast<MCRelaxableFragment>(this);
anatofuz
parents:
diff changeset
265 return;
anatofuz
parents:
diff changeset
266 case FT_Org:
anatofuz
parents:
diff changeset
267 delete cast<MCOrgFragment>(this);
anatofuz
parents:
diff changeset
268 return;
anatofuz
parents:
diff changeset
269 case FT_Dwarf:
anatofuz
parents:
diff changeset
270 delete cast<MCDwarfLineAddrFragment>(this);
anatofuz
parents:
diff changeset
271 return;
anatofuz
parents:
diff changeset
272 case FT_DwarfFrame:
anatofuz
parents:
diff changeset
273 delete cast<MCDwarfCallFrameFragment>(this);
anatofuz
parents:
diff changeset
274 return;
anatofuz
parents:
diff changeset
275 case FT_LEB:
anatofuz
parents:
diff changeset
276 delete cast<MCLEBFragment>(this);
anatofuz
parents:
diff changeset
277 return;
anatofuz
parents:
diff changeset
278 case FT_BoundaryAlign:
anatofuz
parents:
diff changeset
279 delete cast<MCBoundaryAlignFragment>(this);
anatofuz
parents:
diff changeset
280 return;
anatofuz
parents:
diff changeset
281 case FT_SymbolId:
anatofuz
parents:
diff changeset
282 delete cast<MCSymbolIdFragment>(this);
anatofuz
parents:
diff changeset
283 return;
anatofuz
parents:
diff changeset
284 case FT_CVInlineLines:
anatofuz
parents:
diff changeset
285 delete cast<MCCVInlineLineTableFragment>(this);
anatofuz
parents:
diff changeset
286 return;
anatofuz
parents:
diff changeset
287 case FT_CVDefRange:
anatofuz
parents:
diff changeset
288 delete cast<MCCVDefRangeFragment>(this);
anatofuz
parents:
diff changeset
289 return;
anatofuz
parents:
diff changeset
290 case FT_Dummy:
anatofuz
parents:
diff changeset
291 delete cast<MCDummyFragment>(this);
anatofuz
parents:
diff changeset
292 return;
anatofuz
parents:
diff changeset
293 }
anatofuz
parents:
diff changeset
294 }
anatofuz
parents:
diff changeset
295
anatofuz
parents:
diff changeset
296 // Debugging methods
anatofuz
parents:
diff changeset
297
anatofuz
parents:
diff changeset
298 namespace llvm {
anatofuz
parents:
diff changeset
299
anatofuz
parents:
diff changeset
300 raw_ostream &operator<<(raw_ostream &OS, const MCFixup &AF) {
anatofuz
parents:
diff changeset
301 OS << "<MCFixup" << " Offset:" << AF.getOffset()
anatofuz
parents:
diff changeset
302 << " Value:" << *AF.getValue()
anatofuz
parents:
diff changeset
303 << " Kind:" << AF.getKind() << ">";
anatofuz
parents:
diff changeset
304 return OS;
anatofuz
parents:
diff changeset
305 }
anatofuz
parents:
diff changeset
306
anatofuz
parents:
diff changeset
307 } // end namespace llvm
anatofuz
parents:
diff changeset
308
anatofuz
parents:
diff changeset
309 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
anatofuz
parents:
diff changeset
310 LLVM_DUMP_METHOD void MCFragment::dump() const {
anatofuz
parents:
diff changeset
311 raw_ostream &OS = errs();
anatofuz
parents:
diff changeset
312
anatofuz
parents:
diff changeset
313 OS << "<";
anatofuz
parents:
diff changeset
314 switch (getKind()) {
anatofuz
parents:
diff changeset
315 case MCFragment::FT_Align: OS << "MCAlignFragment"; break;
anatofuz
parents:
diff changeset
316 case MCFragment::FT_Data: OS << "MCDataFragment"; break;
anatofuz
parents:
diff changeset
317 case MCFragment::FT_CompactEncodedInst:
anatofuz
parents:
diff changeset
318 OS << "MCCompactEncodedInstFragment"; break;
anatofuz
parents:
diff changeset
319 case MCFragment::FT_Fill: OS << "MCFillFragment"; break;
anatofuz
parents:
diff changeset
320 case MCFragment::FT_Relaxable: OS << "MCRelaxableFragment"; break;
anatofuz
parents:
diff changeset
321 case MCFragment::FT_Org: OS << "MCOrgFragment"; break;
anatofuz
parents:
diff changeset
322 case MCFragment::FT_Dwarf: OS << "MCDwarfFragment"; break;
anatofuz
parents:
diff changeset
323 case MCFragment::FT_DwarfFrame: OS << "MCDwarfCallFrameFragment"; break;
anatofuz
parents:
diff changeset
324 case MCFragment::FT_LEB: OS << "MCLEBFragment"; break;
anatofuz
parents:
diff changeset
325 case MCFragment::FT_BoundaryAlign: OS<<"MCBoundaryAlignFragment"; break;
anatofuz
parents:
diff changeset
326 case MCFragment::FT_SymbolId: OS << "MCSymbolIdFragment"; break;
anatofuz
parents:
diff changeset
327 case MCFragment::FT_CVInlineLines: OS << "MCCVInlineLineTableFragment"; break;
anatofuz
parents:
diff changeset
328 case MCFragment::FT_CVDefRange: OS << "MCCVDefRangeTableFragment"; break;
anatofuz
parents:
diff changeset
329 case MCFragment::FT_Dummy: OS << "MCDummyFragment"; break;
anatofuz
parents:
diff changeset
330 }
anatofuz
parents:
diff changeset
331
anatofuz
parents:
diff changeset
332 OS << "<MCFragment " << (const void *)this << " LayoutOrder:" << LayoutOrder
anatofuz
parents:
diff changeset
333 << " Offset:" << Offset << " HasInstructions:" << hasInstructions();
anatofuz
parents:
diff changeset
334 if (const auto *EF = dyn_cast<MCEncodedFragment>(this))
anatofuz
parents:
diff changeset
335 OS << " BundlePadding:" << static_cast<unsigned>(EF->getBundlePadding());
anatofuz
parents:
diff changeset
336 OS << ">";
anatofuz
parents:
diff changeset
337
anatofuz
parents:
diff changeset
338 switch (getKind()) {
anatofuz
parents:
diff changeset
339 case MCFragment::FT_Align: {
anatofuz
parents:
diff changeset
340 const auto *AF = cast<MCAlignFragment>(this);
anatofuz
parents:
diff changeset
341 if (AF->hasEmitNops())
anatofuz
parents:
diff changeset
342 OS << " (emit nops)";
anatofuz
parents:
diff changeset
343 OS << "\n ";
anatofuz
parents:
diff changeset
344 OS << " Alignment:" << AF->getAlignment()
anatofuz
parents:
diff changeset
345 << " Value:" << AF->getValue() << " ValueSize:" << AF->getValueSize()
anatofuz
parents:
diff changeset
346 << " MaxBytesToEmit:" << AF->getMaxBytesToEmit() << ">";
anatofuz
parents:
diff changeset
347 break;
anatofuz
parents:
diff changeset
348 }
anatofuz
parents:
diff changeset
349 case MCFragment::FT_Data: {
anatofuz
parents:
diff changeset
350 const auto *DF = cast<MCDataFragment>(this);
anatofuz
parents:
diff changeset
351 OS << "\n ";
anatofuz
parents:
diff changeset
352 OS << " Contents:[";
anatofuz
parents:
diff changeset
353 const SmallVectorImpl<char> &Contents = DF->getContents();
anatofuz
parents:
diff changeset
354 for (unsigned i = 0, e = Contents.size(); i != e; ++i) {
anatofuz
parents:
diff changeset
355 if (i) OS << ",";
anatofuz
parents:
diff changeset
356 OS << hexdigit((Contents[i] >> 4) & 0xF) << hexdigit(Contents[i] & 0xF);
anatofuz
parents:
diff changeset
357 }
anatofuz
parents:
diff changeset
358 OS << "] (" << Contents.size() << " bytes)";
anatofuz
parents:
diff changeset
359
anatofuz
parents:
diff changeset
360 if (DF->fixup_begin() != DF->fixup_end()) {
anatofuz
parents:
diff changeset
361 OS << ",\n ";
anatofuz
parents:
diff changeset
362 OS << " Fixups:[";
anatofuz
parents:
diff changeset
363 for (MCDataFragment::const_fixup_iterator it = DF->fixup_begin(),
anatofuz
parents:
diff changeset
364 ie = DF->fixup_end(); it != ie; ++it) {
anatofuz
parents:
diff changeset
365 if (it != DF->fixup_begin()) OS << ",\n ";
anatofuz
parents:
diff changeset
366 OS << *it;
anatofuz
parents:
diff changeset
367 }
anatofuz
parents:
diff changeset
368 OS << "]";
anatofuz
parents:
diff changeset
369 }
anatofuz
parents:
diff changeset
370 break;
anatofuz
parents:
diff changeset
371 }
anatofuz
parents:
diff changeset
372 case MCFragment::FT_CompactEncodedInst: {
anatofuz
parents:
diff changeset
373 const auto *CEIF =
anatofuz
parents:
diff changeset
374 cast<MCCompactEncodedInstFragment>(this);
anatofuz
parents:
diff changeset
375 OS << "\n ";
anatofuz
parents:
diff changeset
376 OS << " Contents:[";
anatofuz
parents:
diff changeset
377 const SmallVectorImpl<char> &Contents = CEIF->getContents();
anatofuz
parents:
diff changeset
378 for (unsigned i = 0, e = Contents.size(); i != e; ++i) {
anatofuz
parents:
diff changeset
379 if (i) OS << ",";
anatofuz
parents:
diff changeset
380 OS << hexdigit((Contents[i] >> 4) & 0xF) << hexdigit(Contents[i] & 0xF);
anatofuz
parents:
diff changeset
381 }
anatofuz
parents:
diff changeset
382 OS << "] (" << Contents.size() << " bytes)";
anatofuz
parents:
diff changeset
383 break;
anatofuz
parents:
diff changeset
384 }
anatofuz
parents:
diff changeset
385 case MCFragment::FT_Fill: {
anatofuz
parents:
diff changeset
386 const auto *FF = cast<MCFillFragment>(this);
anatofuz
parents:
diff changeset
387 OS << " Value:" << static_cast<unsigned>(FF->getValue())
anatofuz
parents:
diff changeset
388 << " ValueSize:" << static_cast<unsigned>(FF->getValueSize())
anatofuz
parents:
diff changeset
389 << " NumValues:" << FF->getNumValues();
anatofuz
parents:
diff changeset
390 break;
anatofuz
parents:
diff changeset
391 }
anatofuz
parents:
diff changeset
392 case MCFragment::FT_Relaxable: {
anatofuz
parents:
diff changeset
393 const auto *F = cast<MCRelaxableFragment>(this);
anatofuz
parents:
diff changeset
394 OS << "\n ";
anatofuz
parents:
diff changeset
395 OS << " Inst:";
anatofuz
parents:
diff changeset
396 F->getInst().dump_pretty(OS);
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
397 OS << " (" << F->getContents().size() << " bytes)";
150
anatofuz
parents:
diff changeset
398 break;
anatofuz
parents:
diff changeset
399 }
anatofuz
parents:
diff changeset
400 case MCFragment::FT_Org: {
anatofuz
parents:
diff changeset
401 const auto *OF = cast<MCOrgFragment>(this);
anatofuz
parents:
diff changeset
402 OS << "\n ";
anatofuz
parents:
diff changeset
403 OS << " Offset:" << OF->getOffset()
anatofuz
parents:
diff changeset
404 << " Value:" << static_cast<unsigned>(OF->getValue());
anatofuz
parents:
diff changeset
405 break;
anatofuz
parents:
diff changeset
406 }
anatofuz
parents:
diff changeset
407 case MCFragment::FT_Dwarf: {
anatofuz
parents:
diff changeset
408 const auto *OF = cast<MCDwarfLineAddrFragment>(this);
anatofuz
parents:
diff changeset
409 OS << "\n ";
anatofuz
parents:
diff changeset
410 OS << " AddrDelta:" << OF->getAddrDelta()
anatofuz
parents:
diff changeset
411 << " LineDelta:" << OF->getLineDelta();
anatofuz
parents:
diff changeset
412 break;
anatofuz
parents:
diff changeset
413 }
anatofuz
parents:
diff changeset
414 case MCFragment::FT_DwarfFrame: {
anatofuz
parents:
diff changeset
415 const auto *CF = cast<MCDwarfCallFrameFragment>(this);
anatofuz
parents:
diff changeset
416 OS << "\n ";
anatofuz
parents:
diff changeset
417 OS << " AddrDelta:" << CF->getAddrDelta();
anatofuz
parents:
diff changeset
418 break;
anatofuz
parents:
diff changeset
419 }
anatofuz
parents:
diff changeset
420 case MCFragment::FT_LEB: {
anatofuz
parents:
diff changeset
421 const auto *LF = cast<MCLEBFragment>(this);
anatofuz
parents:
diff changeset
422 OS << "\n ";
anatofuz
parents:
diff changeset
423 OS << " Value:" << LF->getValue() << " Signed:" << LF->isSigned();
anatofuz
parents:
diff changeset
424 break;
anatofuz
parents:
diff changeset
425 }
anatofuz
parents:
diff changeset
426 case MCFragment::FT_BoundaryAlign: {
anatofuz
parents:
diff changeset
427 const auto *BF = cast<MCBoundaryAlignFragment>(this);
anatofuz
parents:
diff changeset
428 OS << "\n ";
anatofuz
parents:
diff changeset
429 OS << " BoundarySize:" << BF->getAlignment().value()
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
430 << " LastFragment:" << BF->getLastFragment()
150
anatofuz
parents:
diff changeset
431 << " Size:" << BF->getSize();
anatofuz
parents:
diff changeset
432 break;
anatofuz
parents:
diff changeset
433 }
anatofuz
parents:
diff changeset
434 case MCFragment::FT_SymbolId: {
anatofuz
parents:
diff changeset
435 const auto *F = cast<MCSymbolIdFragment>(this);
anatofuz
parents:
diff changeset
436 OS << "\n ";
anatofuz
parents:
diff changeset
437 OS << " Sym:" << F->getSymbol();
anatofuz
parents:
diff changeset
438 break;
anatofuz
parents:
diff changeset
439 }
anatofuz
parents:
diff changeset
440 case MCFragment::FT_CVInlineLines: {
anatofuz
parents:
diff changeset
441 const auto *F = cast<MCCVInlineLineTableFragment>(this);
anatofuz
parents:
diff changeset
442 OS << "\n ";
anatofuz
parents:
diff changeset
443 OS << " Sym:" << *F->getFnStartSym();
anatofuz
parents:
diff changeset
444 break;
anatofuz
parents:
diff changeset
445 }
anatofuz
parents:
diff changeset
446 case MCFragment::FT_CVDefRange: {
anatofuz
parents:
diff changeset
447 const auto *F = cast<MCCVDefRangeFragment>(this);
anatofuz
parents:
diff changeset
448 OS << "\n ";
anatofuz
parents:
diff changeset
449 for (std::pair<const MCSymbol *, const MCSymbol *> RangeStartEnd :
anatofuz
parents:
diff changeset
450 F->getRanges()) {
anatofuz
parents:
diff changeset
451 OS << " RangeStart:" << RangeStartEnd.first;
anatofuz
parents:
diff changeset
452 OS << " RangeEnd:" << RangeStartEnd.second;
anatofuz
parents:
diff changeset
453 }
anatofuz
parents:
diff changeset
454 break;
anatofuz
parents:
diff changeset
455 }
anatofuz
parents:
diff changeset
456 case MCFragment::FT_Dummy:
anatofuz
parents:
diff changeset
457 break;
anatofuz
parents:
diff changeset
458 }
anatofuz
parents:
diff changeset
459 OS << ">";
anatofuz
parents:
diff changeset
460 }
anatofuz
parents:
diff changeset
461 #endif