LLVM  6.0.0svn
MCFragment.cpp
Go to the documentation of this file.
1 //===- lib/MC/MCFragment.cpp - Assembler Fragment Implementation ----------===//
2 //
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 
10 #include "llvm/MC/MCFragment.h"
11 #include "llvm/ADT/SmallVector.h"
12 #include "llvm/ADT/StringExtras.h"
13 #include "llvm/ADT/Twine.h"
14 #include "llvm/MC/MCAsmLayout.h"
15 #include "llvm/MC/MCAssembler.h"
16 #include "llvm/MC/MCContext.h"
17 #include "llvm/MC/MCExpr.h"
18 #include "llvm/MC/MCFixup.h"
19 #include "llvm/MC/MCSection.h"
20 #include "llvm/MC/MCSymbol.h"
21 #include "llvm/MC/MCValue.h"
22 #include "llvm/Support/Casting.h"
23 #include "llvm/Support/Compiler.h"
26 #include <cassert>
27 #include <cstdint>
28 #include <utility>
29 
30 using namespace llvm;
31 
33  // Compute the section layout order. Virtual sections must go last.
34  for (MCSection &Sec : Asm)
35  if (!Sec.isVirtualSection())
36  SectionOrder.push_back(&Sec);
37  for (MCSection &Sec : Asm)
38  if (Sec.isVirtualSection())
39  SectionOrder.push_back(&Sec);
40 }
41 
42 bool MCAsmLayout::isFragmentValid(const MCFragment *F) const {
43  const MCSection *Sec = F->getParent();
44  const MCFragment *LastValid = LastValidFragment.lookup(Sec);
45  if (!LastValid)
46  return false;
47  assert(LastValid->getParent() == Sec);
48  return F->getLayoutOrder() <= LastValid->getLayoutOrder();
49 }
50 
52  // If this fragment wasn't already valid, we don't need to do anything.
53  if (!isFragmentValid(F))
54  return;
55 
56  // Otherwise, reset the last valid fragment to the previous fragment
57  // (if this is the first fragment, it will be NULL).
58  LastValidFragment[F->getParent()] = F->getPrevNode();
59 }
60 
61 void MCAsmLayout::ensureValid(const MCFragment *F) const {
62  MCSection *Sec = F->getParent();
64  if (MCFragment *Cur = LastValidFragment[Sec])
65  I = ++MCSection::iterator(Cur);
66  else
67  I = Sec->begin();
68 
69  // Advance the layout position until the fragment is valid.
70  while (!isFragmentValid(F)) {
71  assert(I != Sec->end() && "Layout bookkeeping error");
72  const_cast<MCAsmLayout *>(this)->layoutFragment(&*I);
73  ++I;
74  }
75 }
76 
77 uint64_t MCAsmLayout::getFragmentOffset(const MCFragment *F) const {
78  ensureValid(F);
79  assert(F->Offset != ~UINT64_C(0) && "Address not set!");
80  return F->Offset;
81 }
82 
83 // Simple getSymbolOffset helper for the non-variable case.
84 static bool getLabelOffset(const MCAsmLayout &Layout, const MCSymbol &S,
85  bool ReportError, uint64_t &Val) {
86  if (!S.getFragment()) {
87  if (ReportError)
88  report_fatal_error("unable to evaluate offset to undefined symbol '" +
89  S.getName() + "'");
90  return false;
91  }
92  Val = Layout.getFragmentOffset(S.getFragment()) + S.getOffset();
93  return true;
94 }
95 
96 static bool getSymbolOffsetImpl(const MCAsmLayout &Layout, const MCSymbol &S,
97  bool ReportError, uint64_t &Val) {
98  if (!S.isVariable())
99  return getLabelOffset(Layout, S, ReportError, Val);
100 
101  // If SD is a variable, evaluate it.
102  MCValue Target;
103  if (!S.getVariableValue()->evaluateAsValue(Target, Layout))
104  report_fatal_error("unable to evaluate offset for variable '" +
105  S.getName() + "'");
106 
107  uint64_t Offset = Target.getConstant();
108 
109  const MCSymbolRefExpr *A = Target.getSymA();
110  if (A) {
111  uint64_t ValA;
112  if (!getLabelOffset(Layout, A->getSymbol(), ReportError, ValA))
113  return false;
114  Offset += ValA;
115  }
116 
117  const MCSymbolRefExpr *B = Target.getSymB();
118  if (B) {
119  uint64_t ValB;
120  if (!getLabelOffset(Layout, B->getSymbol(), ReportError, ValB))
121  return false;
122  Offset -= ValB;
123  }
124 
125  Val = Offset;
126  return true;
127 }
128 
129 bool MCAsmLayout::getSymbolOffset(const MCSymbol &S, uint64_t &Val) const {
130  return getSymbolOffsetImpl(*this, S, false, Val);
131 }
132 
133 uint64_t MCAsmLayout::getSymbolOffset(const MCSymbol &S) const {
134  uint64_t Val;
135  getSymbolOffsetImpl(*this, S, true, Val);
136  return Val;
137 }
138 
140  if (!Symbol.isVariable())
141  return &Symbol;
142 
143  const MCExpr *Expr = Symbol.getVariableValue();
144  MCValue Value;
145  if (!Expr->evaluateAsValue(Value, *this)) {
146  Assembler.getContext().reportError(
147  Expr->getLoc(), "expression could not be evaluated");
148  return nullptr;
149  }
150 
151  const MCSymbolRefExpr *RefB = Value.getSymB();
152  if (RefB) {
153  Assembler.getContext().reportError(
154  Expr->getLoc(), Twine("symbol '") + RefB->getSymbol().getName() +
155  "' could not be evaluated in a subtraction expression");
156  return nullptr;
157  }
158 
159  const MCSymbolRefExpr *A = Value.getSymA();
160  if (!A)
161  return nullptr;
162 
163  const MCSymbol &ASym = A->getSymbol();
164  const MCAssembler &Asm = getAssembler();
165  if (ASym.isCommon()) {
166  Asm.getContext().reportError(Expr->getLoc(),
167  "Common symbol '" + ASym.getName() +
168  "' cannot be used in assignment expr");
169  return nullptr;
170  }
171 
172  return &ASym;
173 }
174 
175 uint64_t MCAsmLayout::getSectionAddressSize(const MCSection *Sec) const {
176  // The size is the last fragment's end offset.
177  const MCFragment &F = Sec->getFragmentList().back();
178  return getFragmentOffset(&F) + getAssembler().computeFragmentSize(*this, F);
179 }
180 
181 uint64_t MCAsmLayout::getSectionFileSize(const MCSection *Sec) const {
182  // Virtual sections have no file size.
183  if (Sec->isVirtualSection())
184  return 0;
185 
186  // Otherwise, the file size is the same as the address space size.
187  return getSectionAddressSize(Sec);
188 }
189 
190 uint64_t llvm::computeBundlePadding(const MCAssembler &Assembler,
191  const MCFragment *F,
192  uint64_t FOffset, uint64_t FSize) {
193  uint64_t BundleSize = Assembler.getBundleAlignSize();
194  assert(BundleSize > 0 &&
195  "computeBundlePadding should only be called if bundling is enabled");
196  uint64_t BundleMask = BundleSize - 1;
197  uint64_t OffsetInBundle = FOffset & BundleMask;
198  uint64_t EndOfFragment = OffsetInBundle + FSize;
199 
200  // There are two kinds of bundling restrictions:
201  //
202  // 1) For alignToBundleEnd(), add padding to ensure that the fragment will
203  // *end* on a bundle boundary.
204  // 2) Otherwise, check if the fragment would cross a bundle boundary. If it
205  // would, add padding until the end of the bundle so that the fragment
206  // will start in a new one.
207  if (F->alignToBundleEnd()) {
208  // Three possibilities here:
209  //
210  // A) The fragment just happens to end at a bundle boundary, so we're good.
211  // B) The fragment ends before the current bundle boundary: pad it just
212  // enough to reach the boundary.
213  // C) The fragment ends after the current bundle boundary: pad it until it
214  // reaches the end of the next bundle boundary.
215  //
216  // Note: this code could be made shorter with some modulo trickery, but it's
217  // intentionally kept in its more explicit form for simplicity.
218  if (EndOfFragment == BundleSize)
219  return 0;
220  else if (EndOfFragment < BundleSize)
221  return BundleSize - EndOfFragment;
222  else { // EndOfFragment > BundleSize
223  return 2 * BundleSize - EndOfFragment;
224  }
225  } else if (OffsetInBundle > 0 && EndOfFragment > BundleSize)
226  return BundleSize - OffsetInBundle;
227  else
228  return 0;
229 }
230 
231 /* *** */
232 
234 
235 MCFragment::~MCFragment() = default;
236 
238  uint8_t BundlePadding, MCSection *Parent)
239  : Kind(Kind), HasInstructions(HasInstructions), AlignToBundleEnd(false),
240  BundlePadding(BundlePadding), Parent(Parent), Atom(nullptr),
241  Offset(~UINT64_C(0)) {
242  if (Parent && !isDummy())
243  Parent->getFragmentList().push_back(this);
244 }
245 
247  // First check if we are the sentinal.
248  if (Kind == FragmentType(~0)) {
249  delete this;
250  return;
251  }
252 
253  switch (Kind) {
254  case FT_Align:
255  delete cast<MCAlignFragment>(this);
256  return;
257  case FT_Data:
258  delete cast<MCDataFragment>(this);
259  return;
261  delete cast<MCCompactEncodedInstFragment>(this);
262  return;
263  case FT_Fill:
264  delete cast<MCFillFragment>(this);
265  return;
266  case FT_Relaxable:
267  delete cast<MCRelaxableFragment>(this);
268  return;
269  case FT_Org:
270  delete cast<MCOrgFragment>(this);
271  return;
272  case FT_Dwarf:
273  delete cast<MCDwarfLineAddrFragment>(this);
274  return;
275  case FT_DwarfFrame:
276  delete cast<MCDwarfCallFrameFragment>(this);
277  return;
278  case FT_LEB:
279  delete cast<MCLEBFragment>(this);
280  return;
281  case FT_Padding:
282  delete cast<MCPaddingFragment>(this);
283  return;
284  case FT_SymbolId:
285  delete cast<MCSymbolIdFragment>(this);
286  return;
287  case FT_CVInlineLines:
288  delete cast<MCCVInlineLineTableFragment>(this);
289  return;
290  case FT_CVDefRange:
291  delete cast<MCCVDefRangeFragment>(this);
292  return;
293  case FT_Dummy:
294  delete cast<MCDummyFragment>(this);
295  return;
296  }
297 }
298 
299 // Debugging methods
300 
301 namespace llvm {
302 
304  OS << "<MCFixup" << " Offset:" << AF.getOffset()
305  << " Value:" << *AF.getValue()
306  << " Kind:" << AF.getKind() << ">";
307  return OS;
308 }
309 
310 } // end namespace llvm
311 
312 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
314  raw_ostream &OS = errs();
315 
316  OS << "<";
317  switch (getKind()) {
318  case MCFragment::FT_Align: OS << "MCAlignFragment"; break;
319  case MCFragment::FT_Data: OS << "MCDataFragment"; break;
321  OS << "MCCompactEncodedInstFragment"; break;
322  case MCFragment::FT_Fill: OS << "MCFillFragment"; break;
323  case MCFragment::FT_Relaxable: OS << "MCRelaxableFragment"; break;
324  case MCFragment::FT_Org: OS << "MCOrgFragment"; break;
325  case MCFragment::FT_Dwarf: OS << "MCDwarfFragment"; break;
326  case MCFragment::FT_DwarfFrame: OS << "MCDwarfCallFrameFragment"; break;
327  case MCFragment::FT_LEB: OS << "MCLEBFragment"; break;
328  case MCFragment::FT_Padding: OS << "MCPaddingFragment"; break;
329  case MCFragment::FT_SymbolId: OS << "MCSymbolIdFragment"; break;
330  case MCFragment::FT_CVInlineLines: OS << "MCCVInlineLineTableFragment"; break;
331  case MCFragment::FT_CVDefRange: OS << "MCCVDefRangeTableFragment"; break;
332  case MCFragment::FT_Dummy: OS << "MCDummyFragment"; break;
333  }
334 
335  OS << "<MCFragment " << (const void*) this << " LayoutOrder:" << LayoutOrder
336  << " Offset:" << Offset
337  << " HasInstructions:" << hasInstructions()
338  << " BundlePadding:" << static_cast<unsigned>(getBundlePadding()) << ">";
339 
340  switch (getKind()) {
341  case MCFragment::FT_Align: {
342  const MCAlignFragment *AF = cast<MCAlignFragment>(this);
343  if (AF->hasEmitNops())
344  OS << " (emit nops)";
345  OS << "\n ";
346  OS << " Alignment:" << AF->getAlignment()
347  << " Value:" << AF->getValue() << " ValueSize:" << AF->getValueSize()
348  << " MaxBytesToEmit:" << AF->getMaxBytesToEmit() << ">";
349  break;
350  }
351  case MCFragment::FT_Data: {
352  const MCDataFragment *DF = cast<MCDataFragment>(this);
353  OS << "\n ";
354  OS << " Contents:[";
355  const SmallVectorImpl<char> &Contents = DF->getContents();
356  for (unsigned i = 0, e = Contents.size(); i != e; ++i) {
357  if (i) OS << ",";
358  OS << hexdigit((Contents[i] >> 4) & 0xF) << hexdigit(Contents[i] & 0xF);
359  }
360  OS << "] (" << Contents.size() << " bytes)";
361 
362  if (DF->fixup_begin() != DF->fixup_end()) {
363  OS << ",\n ";
364  OS << " Fixups:[";
366  ie = DF->fixup_end(); it != ie; ++it) {
367  if (it != DF->fixup_begin()) OS << ",\n ";
368  OS << *it;
369  }
370  OS << "]";
371  }
372  break;
373  }
375  const MCCompactEncodedInstFragment *CEIF =
376  cast<MCCompactEncodedInstFragment>(this);
377  OS << "\n ";
378  OS << " Contents:[";
379  const SmallVectorImpl<char> &Contents = CEIF->getContents();
380  for (unsigned i = 0, e = Contents.size(); i != e; ++i) {
381  if (i) OS << ",";
382  OS << hexdigit((Contents[i] >> 4) & 0xF) << hexdigit(Contents[i] & 0xF);
383  }
384  OS << "] (" << Contents.size() << " bytes)";
385  break;
386  }
387  case MCFragment::FT_Fill: {
388  const MCFillFragment *FF = cast<MCFillFragment>(this);
389  OS << " Value:" << static_cast<unsigned>(FF->getValue())
390  << " Size:" << FF->getSize();
391  break;
392  }
394  const MCRelaxableFragment *F = cast<MCRelaxableFragment>(this);
395  OS << "\n ";
396  OS << " Inst:";
397  F->getInst().dump_pretty(OS);
398  break;
399  }
400  case MCFragment::FT_Org: {
401  const MCOrgFragment *OF = cast<MCOrgFragment>(this);
402  OS << "\n ";
403  OS << " Offset:" << OF->getOffset()
404  << " Value:" << static_cast<unsigned>(OF->getValue());
405  break;
406  }
407  case MCFragment::FT_Dwarf: {
408  const MCDwarfLineAddrFragment *OF = cast<MCDwarfLineAddrFragment>(this);
409  OS << "\n ";
410  OS << " AddrDelta:" << OF->getAddrDelta()
411  << " LineDelta:" << OF->getLineDelta();
412  break;
413  }
415  const MCDwarfCallFrameFragment *CF = cast<MCDwarfCallFrameFragment>(this);
416  OS << "\n ";
417  OS << " AddrDelta:" << CF->getAddrDelta();
418  break;
419  }
420  case MCFragment::FT_LEB: {
421  const MCLEBFragment *LF = cast<MCLEBFragment>(this);
422  OS << "\n ";
423  OS << " Value:" << LF->getValue() << " Signed:" << LF->isSigned();
424  break;
425  }
426  case MCFragment::FT_Padding: {
427  const MCPaddingFragment *F = cast<MCPaddingFragment>(this);
428  OS << "\n ";
429  OS << " PaddingPoliciesMask:" << F->getPaddingPoliciesMask()
430  << " IsInsertionPoint:" << F->isInsertionPoint()
431  << " Size:" << F->getSize();
432  OS << "\n ";
433  OS << " Inst:";
434  F->getInst().dump_pretty(OS);
435  OS << " InstSize:" << F->getInstSize();
436  OS << "\n ";
437  break;
438  }
440  const MCSymbolIdFragment *F = cast<MCSymbolIdFragment>(this);
441  OS << "\n ";
442  OS << " Sym:" << F->getSymbol();
443  break;
444  }
446  const auto *F = cast<MCCVInlineLineTableFragment>(this);
447  OS << "\n ";
448  OS << " Sym:" << *F->getFnStartSym();
449  break;
450  }
452  const auto *F = cast<MCCVDefRangeFragment>(this);
453  OS << "\n ";
454  for (std::pair<const MCSymbol *, const MCSymbol *> RangeStartEnd :
455  F->getRanges()) {
456  OS << " RangeStart:" << RangeStartEnd.first;
457  OS << " RangeEnd:" << RangeStartEnd.second;
458  }
459  break;
460  }
462  break;
463  }
464  OS << ">";
465 }
466 
468  raw_ostream &OS = errs();
469 
470  OS << "<MCAssembler\n";
471  OS << " Sections:[\n ";
472  for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
473  if (it != begin()) OS << ",\n ";
474  it->dump();
475  }
476  OS << "],\n";
477  OS << " Symbols:[";
478 
479  for (const_symbol_iterator it = symbol_begin(), ie = symbol_end(); it != ie; ++it) {
480  if (it != symbol_begin()) OS << ",\n ";
481  OS << "(";
482  it->dump();
483  OS << ", Index:" << it->getIndex() << ", ";
484  OS << ")";
485  }
486  OS << "]>\n";
487 }
488 #endif
Instances of this class represent a uniqued identifier for a section in the current translation unit...
Definition: MCSection.h:39
const_iterator end(StringRef path)
Get end iterator over path.
Definition: Path.cpp:244
static bool getSymbolOffsetImpl(const MCAsmLayout &Layout, const MCSymbol &S, bool ReportError, uint64_t &Val)
Definition: MCFragment.cpp:96
Fragment for adding required padding.
Definition: MCFragment.h:333
raw_ostream & errs()
This returns a reference to a raw_ostream for standard error.
bool alignToBundleEnd() const
Should this fragment be placed at the end of an aligned bundle?
Definition: MCFragment.h:118
const_iterator begin(StringRef path, Style style=Style::native)
Get begin iterator over path.
Definition: Path.cpp:235
LLVM_ATTRIBUTE_NORETURN void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
Definition: Error.cpp:115
Compute iterated dominance frontiers using a linear time algorithm.
Definition: AllocatorList.h:24
bool isVariable() const
isVariable - Check if this is a variable symbol.
Definition: MCSymbol.h:295
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds...
Definition: Compiler.h:449
This represents an "assembler immediate".
Definition: MCValue.h:40
uint64_t getSectionAddressSize(const MCSection *Sec) const
Get the address space size of the given section, as it effects layout.
Definition: MCFragment.cpp:175
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition: MCSymbol.h:42
LLVM_ATTRIBUTE_ALWAYS_INLINE size_type size() const
Definition: SmallVector.h:136
void dump_pretty(raw_ostream &OS, const MCInstPrinter *Printer=nullptr, StringRef Separator=" ") const
Dump the MCInst as prettily as possible using the additional MC structures, if given.
Definition: MCInst.cpp:54
int64_t getValue() const
Definition: MCFragment.h:312
uint64_t getSize() const
Definition: MCFragment.h:411
FragmentType getKind() const
Definition: MCFragment.h:102
This is a compact (memory-size-wise) fragment for holding an encoded instruction (non-relaxable) that...
Definition: MCFragment.h:243
F(f)
const MCExpr & getOffset() const
Definition: MCFragment.h:457
void dump() const
Definition: MCFragment.cpp:467
bool isCommon() const
Is this a &#39;common&#39; symbol.
Definition: MCSymbol.h:379
static bool getLabelOffset(const MCAsmLayout &Layout, const MCSymbol &S, bool ReportError, uint64_t &Val)
Definition: MCFragment.cpp:84
SMLoc getLoc() const
Definition: MCExpr.h:74
Encode information on a single operation to perform on a byte sequence (e.g., an encoded instruction)...
Definition: MCFixup.h:66
unsigned getBundleAlignSize() const
Definition: MCAssembler.h:294
MCContext & getContext() const
Definition: MCAssembler.h:259
int64_t getConstant() const
Definition: MCValue.h:47
const MCSymbolRefExpr * getSymB() const
Definition: MCValue.h:49
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition: Twine.h:81
SmallVectorImpl< MCFixup >::const_iterator const_fixup_iterator
Definition: MCFragment.h:205
Encapsulates the layout of an assembly file at a particular point in time.
Definition: MCAsmLayout.h:29
Base class for the full range of assembler expressions which are needed for parsing.
Definition: MCExpr.h:36
Represent a reference to a symbol from inside an expression.
Definition: MCExpr.h:165
void destroy()
Destroys the current fragment.
Definition: MCFragment.cpp:246
const MCExpr & getAddrDelta() const
Definition: MCFragment.h:526
const MCExpr & getAddrDelta() const
Definition: MCFragment.h:554
MCAssembler & getAssembler() const
Get the assembler object this is a layout for.
Definition: MCAsmLayout.h:51
char hexdigit(unsigned X, bool LowerCase=false)
hexdigit - Return the hexadecimal character for the given number X (which should be less than 16)...
Definition: StringExtras.h:37
bool isDummy() const
Return true if given frgment has FT_Dummy type.
Definition: MCFragment.h:133
void layoutFragment(MCFragment *Fragment)
Perform layout for a single fragment, assuming that the previous fragment has already been laid out c...
SmallVectorImpl< char > & getContents()
Definition: MCFragment.h:183
void dump() const
Definition: MCFragment.cpp:313
A relaxable fragment holds on to its MCInst, since it may need to be relaxed during the assembler lay...
Definition: MCFragment.h:257
const MCInst & getInst() const
Definition: MCFragment.h:386
uint8_t getValue() const
Definition: MCFragment.h:431
MCAsmLayout(MCAssembler &Assembler)
Definition: MCFragment.cpp:32
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
void invalidateFragmentsFrom(MCFragment *F)
Invalidate the fragments starting with F because it has been resized.
Definition: MCFragment.cpp:51
bool getSymbolOffset(const MCSymbol &S, uint64_t &Val) const
Get the offset of the given symbol, as computed in the current layout.
Definition: MCFragment.cpp:129
const MCSymbolRefExpr * getSymA() const
Definition: MCValue.h:48
void reportError(SMLoc L, const Twine &Msg)
Definition: MCContext.cpp:570
uint64_t getOffset() const
Definition: MCSymbol.h:320
uint32_t getOffset() const
Definition: MCFixup.h:95
const MCExpr & getValue() const
Definition: MCFragment.h:488
uint64_t getFragmentOffset(const MCFragment *F) const
Get the offset of the given fragment inside its containing section.
Definition: MCFragment.cpp:77
uint64_t computeBundlePadding(const MCAssembler &Assembler, const MCFragment *F, uint64_t FOffset, uint64_t FSize)
Compute the amount of padding required before the fragment F to obey bundling restrictions, where FOffset is the fragment&#39;s offset in its section and FSize is the fragment&#39;s size.
Definition: MCFragment.cpp:190
Iterator for intrusive lists based on ilist_node.
unsigned getMaxBytesToEmit() const
Definition: MCFragment.h:316
bool hasEmitNops() const
Definition: MCFragment.h:318
virtual bool isVirtualSection() const =0
Check whether this section is "virtual", that is has no actual object file contents.
const MCSymbol & getSymbol() const
Definition: MCExpr.h:318
MCFragment * getFragment(bool SetUsed=true) const
Definition: MCSymbol.h:383
Represents a symbol table index fragment.
Definition: MCFragment.h:567
An iterator type that allows iterating over the pointees via some other iterator. ...
Definition: iterator.h:289
unsigned getLayoutOrder() const
Definition: MCFragment.h:110
uint64_t getPaddingPoliciesMask() const
Definition: MCFragment.h:379
static void deleteNode(NodeTy *V)
Definition: ilist.h:42
Target - Wrapper for Target specific information.
MCSection * getParent() const
Definition: MCFragment.h:104
void push_back(pointer val)
Definition: ilist.h:326
bool hasInstructions() const
Does this fragment have instructions emitted into it? By default this is false, but specific fragment...
Definition: MCFragment.h:115
unsigned getValueSize() const
Definition: MCFragment.h:314
unsigned getAlignment() const
Definition: MCFragment.h:310
uint64_t getSize() const
Definition: MCFragment.h:432
int64_t getLineDelta() const
Definition: MCFragment.h:524
size_t getInstSize() const
Definition: MCFragment.h:390
const MCInst & getInst() const
Definition: MCFragment.h:271
#define I(x, y, z)
Definition: MD5.cpp:58
bool evaluateAsValue(MCValue &Res, const MCAsmLayout &Layout) const
Try to evaluate the expression to the form (a - b + constant) where neither a nor b are variables...
Definition: MCExpr.cpp:602
uint64_t computeFragmentSize(const MCAsmLayout &Layout, const MCFragment &F) const
Compute the effective fragment size assuming it is laid out at the given SectionAddress and FragmentO...
const MCSymbol * getSymbol()
Definition: MCFragment.h:577
raw_ostream & operator<<(raw_ostream &OS, const APInt &I)
Definition: APInt.h:2018
StringRef getName() const
getName - Get the symbol name.
Definition: MCSymbol.h:203
const unsigned Kind
Fragment for data and encoded instructions.
Definition: MCFragment.h:226
uint64_t getSectionFileSize(const MCSection *Sec) const
Get the data size of the given section, as emitted to the object file.
Definition: MCFragment.cpp:181
MCFragment()=delete
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
const MCExpr * getVariableValue(bool SetUsed=true) const
getVariableValue - Get the value for variable symbols.
Definition: MCSymbol.h:300
bool isInsertionPoint() const
Definition: MCFragment.h:377
bool isSigned() const
Definition: MCFragment.h:490
LLVM Value Representation.
Definition: Value.h:73
This class implements an extremely fast bulk output stream that can only output to a stream...
Definition: raw_ostream.h:44
const MCExpr * getValue() const
Definition: MCFixup.h:98
FragmentListType::iterator iterator
Definition: MCSection.h:53
uint8_t getValue() const
Definition: MCFragment.h:459
static void LLVM_ATTRIBUTE_NORETURN ReportError(uint32_t StartOffset, const char *ErrorMsg)
MCSection::FragmentListType & getFragmentList()
Definition: MCSection.h:143
const MCSymbol * getBaseSymbol(const MCSymbol &Symbol) const
If this symbol is equivalent to A + Constant, return A.
Definition: MCFragment.cpp:139
MCFixupKind getKind() const
Definition: MCFixup.h:93
uint8_t getBundlePadding() const
Get the padding size that must be inserted before this fragment.
Definition: MCFragment.h:126