LLVM  8.0.1
MCAssembler.cpp
Go to the documentation of this file.
1 //===- lib/MC/MCAssembler.cpp - Assembler Backend 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/MCAssembler.h"
11 #include "llvm/ADT/ArrayRef.h"
12 #include "llvm/ADT/SmallString.h"
13 #include "llvm/ADT/SmallVector.h"
14 #include "llvm/ADT/Statistic.h"
15 #include "llvm/ADT/StringRef.h"
16 #include "llvm/ADT/Twine.h"
17 #include "llvm/MC/MCAsmBackend.h"
18 #include "llvm/MC/MCAsmInfo.h"
19 #include "llvm/MC/MCAsmLayout.h"
20 #include "llvm/MC/MCCodeEmitter.h"
21 #include "llvm/MC/MCCodeView.h"
22 #include "llvm/MC/MCContext.h"
23 #include "llvm/MC/MCDwarf.h"
24 #include "llvm/MC/MCExpr.h"
25 #include "llvm/MC/MCFixup.h"
27 #include "llvm/MC/MCFragment.h"
28 #include "llvm/MC/MCInst.h"
29 #include "llvm/MC/MCObjectWriter.h"
30 #include "llvm/MC/MCSection.h"
31 #include "llvm/MC/MCSectionELF.h"
32 #include "llvm/MC/MCSymbol.h"
33 #include "llvm/MC/MCValue.h"
34 #include "llvm/Support/Casting.h"
35 #include "llvm/Support/Debug.h"
37 #include "llvm/Support/LEB128.h"
40 #include <cassert>
41 #include <cstdint>
42 #include <cstring>
43 #include <tuple>
44 #include <utility>
45 
46 using namespace llvm;
47 
48 #define DEBUG_TYPE "assembler"
49 
50 namespace {
51 namespace stats {
52 
53 STATISTIC(EmittedFragments, "Number of emitted assembler fragments - total");
54 STATISTIC(EmittedRelaxableFragments,
55  "Number of emitted assembler fragments - relaxable");
56 STATISTIC(EmittedDataFragments,
57  "Number of emitted assembler fragments - data");
58 STATISTIC(EmittedCompactEncodedInstFragments,
59  "Number of emitted assembler fragments - compact encoded inst");
60 STATISTIC(EmittedAlignFragments,
61  "Number of emitted assembler fragments - align");
62 STATISTIC(EmittedFillFragments,
63  "Number of emitted assembler fragments - fill");
64 STATISTIC(EmittedOrgFragments,
65  "Number of emitted assembler fragments - org");
66 STATISTIC(evaluateFixup, "Number of evaluated fixups");
67 STATISTIC(FragmentLayouts, "Number of fragment layouts");
68 STATISTIC(ObjectBytes, "Number of emitted object file bytes");
69 STATISTIC(RelaxationSteps, "Number of assembler layout and relaxation steps");
70 STATISTIC(RelaxedInstructions, "Number of relaxed instructions");
71 STATISTIC(PaddingFragmentsRelaxations,
72  "Number of Padding Fragments relaxations");
73 STATISTIC(PaddingFragmentsBytes,
74  "Total size of all padding from adding Fragments");
75 
76 } // end namespace stats
77 } // end anonymous namespace
78 
79 // FIXME FIXME FIXME: There are number of places in this file where we convert
80 // what is a 64-bit assembler value used for computation into a value in the
81 // object file, which may truncate it. We should detect that truncation where
82 // invalid and report errors back.
83 
84 /* *** */
85 
87  std::unique_ptr<MCAsmBackend> Backend,
88  std::unique_ptr<MCCodeEmitter> Emitter,
89  std::unique_ptr<MCObjectWriter> Writer)
90  : Context(Context), Backend(std::move(Backend)),
91  Emitter(std::move(Emitter)), Writer(std::move(Writer)),
92  BundleAlignSize(0), RelaxAll(false), SubsectionsViaSymbols(false),
93  IncrementalLinkerCompatible(false), ELFHeaderEFlags(0) {
94  VersionInfo.Major = 0; // Major version == 0 for "none specified"
95 }
96 
97 MCAssembler::~MCAssembler() = default;
98 
100  Sections.clear();
101  Symbols.clear();
102  IndirectSymbols.clear();
103  DataRegions.clear();
104  LinkerOptions.clear();
105  FileNames.clear();
106  ThumbFuncs.clear();
107  BundleAlignSize = 0;
108  RelaxAll = false;
109  SubsectionsViaSymbols = false;
110  IncrementalLinkerCompatible = false;
111  ELFHeaderEFlags = 0;
112  LOHContainer.reset();
113  VersionInfo.Major = 0;
114  VersionInfo.SDKVersion = VersionTuple();
115 
116  // reset objects owned by us
117  if (getBackendPtr())
118  getBackendPtr()->reset();
119  if (getEmitterPtr())
120  getEmitterPtr()->reset();
121  if (getWriterPtr())
122  getWriterPtr()->reset();
124 }
125 
127  if (Section.isRegistered())
128  return false;
129  Sections.push_back(&Section);
130  Section.setIsRegistered(true);
131  return true;
132 }
133 
135  if (ThumbFuncs.count(Symbol))
136  return true;
137 
138  if (!Symbol->isVariable())
139  return false;
140 
141  const MCExpr *Expr = Symbol->getVariableValue();
142 
143  MCValue V;
144  if (!Expr->evaluateAsRelocatable(V, nullptr, nullptr))
145  return false;
146 
147  if (V.getSymB() || V.getRefKind() != MCSymbolRefExpr::VK_None)
148  return false;
149 
150  const MCSymbolRefExpr *Ref = V.getSymA();
151  if (!Ref)
152  return false;
153 
154  if (Ref->getKind() != MCSymbolRefExpr::VK_None)
155  return false;
156 
157  const MCSymbol &Sym = Ref->getSymbol();
158  if (!isThumbFunc(&Sym))
159  return false;
160 
161  ThumbFuncs.insert(Symbol); // Cache it.
162  return true;
163 }
164 
166  // Non-temporary labels should always be visible to the linker.
167  if (!Symbol.isTemporary())
168  return true;
169 
170  // Absolute temporary labels are never visible.
171  if (!Symbol.isInSection())
172  return false;
173 
174  if (Symbol.isUsedInReloc())
175  return true;
176 
177  return false;
178 }
179 
180 const MCSymbol *MCAssembler::getAtom(const MCSymbol &S) const {
181  // Linker visible symbols define atoms.
182  if (isSymbolLinkerVisible(S))
183  return &S;
184 
185  // Absolute and undefined symbols have no defining atom.
186  if (!S.isInSection())
187  return nullptr;
188 
189  // Non-linker visible symbols in sections which can't be atomized have no
190  // defining atom.
192  *S.getFragment()->getParent()))
193  return nullptr;
194 
195  // Otherwise, return the atom for the containing fragment.
196  return S.getFragment()->getAtom();
197 }
198 
199 bool MCAssembler::evaluateFixup(const MCAsmLayout &Layout,
200  const MCFixup &Fixup, const MCFragment *DF,
201  MCValue &Target, uint64_t &Value,
202  bool &WasForced) const {
203  ++stats::evaluateFixup;
204 
205  // FIXME: This code has some duplication with recordRelocation. We should
206  // probably merge the two into a single callback that tries to evaluate a
207  // fixup and records a relocation if one is needed.
208 
209  // On error claim to have completely evaluated the fixup, to prevent any
210  // further processing from being done.
211  const MCExpr *Expr = Fixup.getValue();
212  MCContext &Ctx = getContext();
213  Value = 0;
214  WasForced = false;
215  if (!Expr->evaluateAsRelocatable(Target, &Layout, &Fixup)) {
216  Ctx.reportError(Fixup.getLoc(), "expected relocatable expression");
217  return true;
218  }
219  if (const MCSymbolRefExpr *RefB = Target.getSymB()) {
220  if (RefB->getKind() != MCSymbolRefExpr::VK_None) {
221  Ctx.reportError(Fixup.getLoc(),
222  "unsupported subtraction of qualified symbol");
223  return true;
224  }
225  }
226 
227  assert(getBackendPtr() && "Expected assembler backend");
228  bool IsPCRel = getBackendPtr()->getFixupKindInfo(Fixup.getKind()).Flags &
230 
231  bool IsResolved = false;
232  if (IsPCRel) {
233  if (Target.getSymB()) {
234  IsResolved = false;
235  } else if (!Target.getSymA()) {
236  IsResolved = false;
237  } else {
238  const MCSymbolRefExpr *A = Target.getSymA();
239  const MCSymbol &SA = A->getSymbol();
240  if (A->getKind() != MCSymbolRefExpr::VK_None || SA.isUndefined()) {
241  IsResolved = false;
242  } else if (auto *Writer = getWriterPtr()) {
243  IsResolved = Writer->isSymbolRefDifferenceFullyResolvedImpl(
244  *this, SA, *DF, false, true);
245  }
246  }
247  } else {
248  IsResolved = Target.isAbsolute();
249  }
250 
251  Value = Target.getConstant();
252 
253  if (const MCSymbolRefExpr *A = Target.getSymA()) {
254  const MCSymbol &Sym = A->getSymbol();
255  if (Sym.isDefined())
256  Value += Layout.getSymbolOffset(Sym);
257  }
258  if (const MCSymbolRefExpr *B = Target.getSymB()) {
259  const MCSymbol &Sym = B->getSymbol();
260  if (Sym.isDefined())
261  Value -= Layout.getSymbolOffset(Sym);
262  }
263 
264  bool ShouldAlignPC = getBackend().getFixupKindInfo(Fixup.getKind()).Flags &
266  assert((ShouldAlignPC ? IsPCRel : true) &&
267  "FKF_IsAlignedDownTo32Bits is only allowed on PC-relative fixups!");
268 
269  if (IsPCRel) {
270  uint32_t Offset = Layout.getFragmentOffset(DF) + Fixup.getOffset();
271 
272  // A number of ARM fixups in Thumb mode require that the effective PC
273  // address be determined as the 32-bit aligned version of the actual offset.
274  if (ShouldAlignPC) Offset &= ~0x3;
275  Value -= Offset;
276  }
277 
278  // Let the backend force a relocation if needed.
279  if (IsResolved && getBackend().shouldForceRelocation(*this, Fixup, Target)) {
280  IsResolved = false;
281  WasForced = true;
282  }
283 
284  return IsResolved;
285 }
286 
288  const MCFragment &F) const {
289  assert(getBackendPtr() && "Requires assembler backend");
290  switch (F.getKind()) {
291  case MCFragment::FT_Data:
292  return cast<MCDataFragment>(F).getContents().size();
294  return cast<MCRelaxableFragment>(F).getContents().size();
296  return cast<MCCompactEncodedInstFragment>(F).getContents().size();
297  case MCFragment::FT_Fill: {
298  auto &FF = cast<MCFillFragment>(F);
299  int64_t NumValues = 0;
300  if (!FF.getNumValues().evaluateAsAbsolute(NumValues, Layout)) {
301  getContext().reportError(FF.getLoc(),
302  "expected assembly-time absolute expression");
303  return 0;
304  }
305  int64_t Size = NumValues * FF.getValueSize();
306  if (Size < 0) {
307  getContext().reportError(FF.getLoc(), "invalid number of bytes");
308  return 0;
309  }
310  return Size;
311  }
312 
313  case MCFragment::FT_LEB:
314  return cast<MCLEBFragment>(F).getContents().size();
315 
317  return cast<MCPaddingFragment>(F).getSize();
318 
320  return 4;
321 
322  case MCFragment::FT_Align: {
323  const MCAlignFragment &AF = cast<MCAlignFragment>(F);
324  unsigned Offset = Layout.getFragmentOffset(&AF);
325  unsigned Size = OffsetToAlignment(Offset, AF.getAlignment());
326  // If we are padding with nops, force the padding to be larger than the
327  // minimum nop size.
328  if (Size > 0 && AF.hasEmitNops()) {
329  while (Size % getBackend().getMinimumNopSize())
330  Size += AF.getAlignment();
331  }
332  if (Size > AF.getMaxBytesToEmit())
333  return 0;
334  return Size;
335  }
336 
337  case MCFragment::FT_Org: {
338  const MCOrgFragment &OF = cast<MCOrgFragment>(F);
339  MCValue Value;
340  if (!OF.getOffset().evaluateAsValue(Value, Layout)) {
342  "expected assembly-time absolute expression");
343  return 0;
344  }
345 
346  uint64_t FragmentOffset = Layout.getFragmentOffset(&OF);
347  int64_t TargetLocation = Value.getConstant();
348  if (const MCSymbolRefExpr *A = Value.getSymA()) {
349  uint64_t Val;
350  if (!Layout.getSymbolOffset(A->getSymbol(), Val)) {
351  getContext().reportError(OF.getLoc(), "expected absolute expression");
352  return 0;
353  }
354  TargetLocation += Val;
355  }
356  int64_t Size = TargetLocation - FragmentOffset;
357  if (Size < 0 || Size >= 0x40000000) {
359  OF.getLoc(), "invalid .org offset '" + Twine(TargetLocation) +
360  "' (at offset '" + Twine(FragmentOffset) + "')");
361  return 0;
362  }
363  return Size;
364  }
365 
367  return cast<MCDwarfLineAddrFragment>(F).getContents().size();
369  return cast<MCDwarfCallFrameFragment>(F).getContents().size();
371  return cast<MCCVInlineLineTableFragment>(F).getContents().size();
373  return cast<MCCVDefRangeFragment>(F).getContents().size();
375  llvm_unreachable("Should not have been added");
376  }
377 
378  llvm_unreachable("invalid fragment kind");
379 }
380 
382  MCFragment *Prev = F->getPrevNode();
383 
384  // We should never try to recompute something which is valid.
385  assert(!isFragmentValid(F) && "Attempt to recompute a valid fragment!");
386  // We should never try to compute the fragment layout if its predecessor
387  // isn't valid.
388  assert((!Prev || isFragmentValid(Prev)) &&
389  "Attempt to compute fragment before its predecessor!");
390 
391  ++stats::FragmentLayouts;
392 
393  // Compute fragment offset and size.
394  if (Prev)
395  F->Offset = Prev->Offset + getAssembler().computeFragmentSize(*this, *Prev);
396  else
397  F->Offset = 0;
398  LastValidFragment[F->getParent()] = F;
399 
400  // If bundling is enabled and this fragment has instructions in it, it has to
401  // obey the bundling restrictions. With padding, we'll have:
402  //
403  //
404  // BundlePadding
405  // |||
406  // -------------------------------------
407  // Prev |##########| F |
408  // -------------------------------------
409  // ^
410  // |
411  // F->Offset
412  //
413  // The fragment's offset will point to after the padding, and its computed
414  // size won't include the padding.
415  //
416  // When the -mc-relax-all flag is used, we optimize bundling by writting the
417  // padding directly into fragments when the instructions are emitted inside
418  // the streamer. When the fragment is larger than the bundle size, we need to
419  // ensure that it's bundle aligned. This means that if we end up with
420  // multiple fragments, we must emit bundle padding between fragments.
421  //
422  // ".align N" is an example of a directive that introduces multiple
423  // fragments. We could add a special case to handle ".align N" by emitting
424  // within-fragment padding (which would produce less padding when N is less
425  // than the bundle size), but for now we don't.
426  //
427  if (Assembler.isBundlingEnabled() && F->hasInstructions()) {
428  assert(isa<MCEncodedFragment>(F) &&
429  "Only MCEncodedFragment implementations have instructions");
430  MCEncodedFragment *EF = cast<MCEncodedFragment>(F);
431  uint64_t FSize = Assembler.computeFragmentSize(*this, *EF);
432 
433  if (!Assembler.getRelaxAll() && FSize > Assembler.getBundleAlignSize())
434  report_fatal_error("Fragment can't be larger than a bundle size");
435 
436  uint64_t RequiredBundlePadding =
437  computeBundlePadding(Assembler, EF, EF->Offset, FSize);
438  if (RequiredBundlePadding > UINT8_MAX)
439  report_fatal_error("Padding cannot exceed 255 bytes");
440  EF->setBundlePadding(static_cast<uint8_t>(RequiredBundlePadding));
441  EF->Offset += RequiredBundlePadding;
442  }
443 }
444 
445 void MCAssembler::registerSymbol(const MCSymbol &Symbol, bool *Created) {
446  bool New = !Symbol.isRegistered();
447  if (Created)
448  *Created = New;
449  if (New) {
450  Symbol.setIsRegistered(true);
451  Symbols.push_back(&Symbol);
452  }
453 }
454 
456  const MCEncodedFragment &EF,
457  uint64_t FSize) const {
458  assert(getBackendPtr() && "Expected assembler backend");
459  // Should NOP padding be written out before this fragment?
460  unsigned BundlePadding = EF.getBundlePadding();
461  if (BundlePadding > 0) {
463  "Writing bundle padding with disabled bundling");
464  assert(EF.hasInstructions() &&
465  "Writing bundle padding for a fragment without instructions");
466 
467  unsigned TotalLength = BundlePadding + static_cast<unsigned>(FSize);
468  if (EF.alignToBundleEnd() && TotalLength > getBundleAlignSize()) {
469  // If the padding itself crosses a bundle boundary, it must be emitted
470  // in 2 pieces, since even nop instructions must not cross boundaries.
471  // v--------------v <- BundleAlignSize
472  // v---------v <- BundlePadding
473  // ----------------------------
474  // | Prev |####|####| F |
475  // ----------------------------
476  // ^-------------------^ <- TotalLength
477  unsigned DistanceToBoundary = TotalLength - getBundleAlignSize();
478  if (!getBackend().writeNopData(OS, DistanceToBoundary))
479  report_fatal_error("unable to write NOP sequence of " +
480  Twine(DistanceToBoundary) + " bytes");
481  BundlePadding -= DistanceToBoundary;
482  }
483  if (!getBackend().writeNopData(OS, BundlePadding))
484  report_fatal_error("unable to write NOP sequence of " +
485  Twine(BundlePadding) + " bytes");
486  }
487 }
488 
489 /// Write the fragment \p F to the output file.
490 static void writeFragment(raw_ostream &OS, const MCAssembler &Asm,
491  const MCAsmLayout &Layout, const MCFragment &F) {
492  // FIXME: Embed in fragments instead?
493  uint64_t FragmentSize = Asm.computeFragmentSize(Layout, F);
494 
495  support::endianness Endian = Asm.getBackend().Endian;
496 
497  if (const MCEncodedFragment *EF = dyn_cast<MCEncodedFragment>(&F))
498  Asm.writeFragmentPadding(OS, *EF, FragmentSize);
499 
500  // This variable (and its dummy usage) is to participate in the assert at
501  // the end of the function.
502  uint64_t Start = OS.tell();
503  (void) Start;
504 
505  ++stats::EmittedFragments;
506 
507  switch (F.getKind()) {
508  case MCFragment::FT_Align: {
509  ++stats::EmittedAlignFragments;
510  const MCAlignFragment &AF = cast<MCAlignFragment>(F);
511  assert(AF.getValueSize() && "Invalid virtual align in concrete fragment!");
512 
513  uint64_t Count = FragmentSize / AF.getValueSize();
514 
515  // FIXME: This error shouldn't actually occur (the front end should emit
516  // multiple .align directives to enforce the semantics it wants), but is
517  // severe enough that we want to report it. How to handle this?
518  if (Count * AF.getValueSize() != FragmentSize)
519  report_fatal_error("undefined .align directive, value size '" +
520  Twine(AF.getValueSize()) +
521  "' is not a divisor of padding size '" +
522  Twine(FragmentSize) + "'");
523 
524  // See if we are aligning with nops, and if so do that first to try to fill
525  // the Count bytes. Then if that did not fill any bytes or there are any
526  // bytes left to fill use the Value and ValueSize to fill the rest.
527  // If we are aligning with nops, ask that target to emit the right data.
528  if (AF.hasEmitNops()) {
529  if (!Asm.getBackend().writeNopData(OS, Count))
530  report_fatal_error("unable to write nop sequence of " +
531  Twine(Count) + " bytes");
532  break;
533  }
534 
535  // Otherwise, write out in multiples of the value size.
536  for (uint64_t i = 0; i != Count; ++i) {
537  switch (AF.getValueSize()) {
538  default: llvm_unreachable("Invalid size!");
539  case 1: OS << char(AF.getValue()); break;
540  case 2:
541  support::endian::write<uint16_t>(OS, AF.getValue(), Endian);
542  break;
543  case 4:
544  support::endian::write<uint32_t>(OS, AF.getValue(), Endian);
545  break;
546  case 8:
547  support::endian::write<uint64_t>(OS, AF.getValue(), Endian);
548  break;
549  }
550  }
551  break;
552  }
553 
554  case MCFragment::FT_Data:
555  ++stats::EmittedDataFragments;
556  OS << cast<MCDataFragment>(F).getContents();
557  break;
558 
560  ++stats::EmittedRelaxableFragments;
561  OS << cast<MCRelaxableFragment>(F).getContents();
562  break;
563 
565  ++stats::EmittedCompactEncodedInstFragments;
566  OS << cast<MCCompactEncodedInstFragment>(F).getContents();
567  break;
568 
569  case MCFragment::FT_Fill: {
570  ++stats::EmittedFillFragments;
571  const MCFillFragment &FF = cast<MCFillFragment>(F);
572  uint64_t V = FF.getValue();
573  unsigned VSize = FF.getValueSize();
574  const unsigned MaxChunkSize = 16;
575  char Data[MaxChunkSize];
576  // Duplicate V into Data as byte vector to reduce number of
577  // writes done. As such, do endian conversion here.
578  for (unsigned I = 0; I != VSize; ++I) {
579  unsigned index = Endian == support::little ? I : (VSize - I - 1);
580  Data[I] = uint8_t(V >> (index * 8));
581  }
582  for (unsigned I = VSize; I < MaxChunkSize; ++I)
583  Data[I] = Data[I - VSize];
584 
585  // Set to largest multiple of VSize in Data.
586  const unsigned NumPerChunk = MaxChunkSize / VSize;
587  // Set ChunkSize to largest multiple of VSize in Data
588  const unsigned ChunkSize = VSize * NumPerChunk;
589 
590  // Do copies by chunk.
591  StringRef Ref(Data, ChunkSize);
592  for (uint64_t I = 0, E = FragmentSize / ChunkSize; I != E; ++I)
593  OS << Ref;
594 
595  // do remainder if needed.
596  unsigned TrailingCount = FragmentSize % ChunkSize;
597  if (TrailingCount)
598  OS.write(Data, TrailingCount);
599  break;
600  }
601 
602  case MCFragment::FT_LEB: {
603  const MCLEBFragment &LF = cast<MCLEBFragment>(F);
604  OS << LF.getContents();
605  break;
606  }
607 
608  case MCFragment::FT_Padding: {
609  if (!Asm.getBackend().writeNopData(OS, FragmentSize))
610  report_fatal_error("unable to write nop sequence of " +
611  Twine(FragmentSize) + " bytes");
612  break;
613  }
614 
616  const MCSymbolIdFragment &SF = cast<MCSymbolIdFragment>(F);
617  support::endian::write<uint32_t>(OS, SF.getSymbol()->getIndex(), Endian);
618  break;
619  }
620 
621  case MCFragment::FT_Org: {
622  ++stats::EmittedOrgFragments;
623  const MCOrgFragment &OF = cast<MCOrgFragment>(F);
624 
625  for (uint64_t i = 0, e = FragmentSize; i != e; ++i)
626  OS << char(OF.getValue());
627 
628  break;
629  }
630 
631  case MCFragment::FT_Dwarf: {
632  const MCDwarfLineAddrFragment &OF = cast<MCDwarfLineAddrFragment>(F);
633  OS << OF.getContents();
634  break;
635  }
637  const MCDwarfCallFrameFragment &CF = cast<MCDwarfCallFrameFragment>(F);
638  OS << CF.getContents();
639  break;
640  }
642  const auto &OF = cast<MCCVInlineLineTableFragment>(F);
643  OS << OF.getContents();
644  break;
645  }
647  const auto &DRF = cast<MCCVDefRangeFragment>(F);
648  OS << DRF.getContents();
649  break;
650  }
652  llvm_unreachable("Should not have been added");
653  }
654 
655  assert(OS.tell() - Start == FragmentSize &&
656  "The stream should advance by fragment size");
657 }
658 
660  const MCAsmLayout &Layout) const {
661  assert(getBackendPtr() && "Expected assembler backend");
662 
663  // Ignore virtual sections.
664  if (Sec->isVirtualSection()) {
665  assert(Layout.getSectionFileSize(Sec) == 0 && "Invalid size for section!");
666 
667  // Check that contents are only things legal inside a virtual section.
668  for (const MCFragment &F : *Sec) {
669  switch (F.getKind()) {
670  default: llvm_unreachable("Invalid fragment in virtual section!");
671  case MCFragment::FT_Data: {
672  // Check that we aren't trying to write a non-zero contents (or fixups)
673  // into a virtual section. This is to support clients which use standard
674  // directives to fill the contents of virtual sections.
675  const MCDataFragment &DF = cast<MCDataFragment>(F);
676  if (DF.fixup_begin() != DF.fixup_end())
677  report_fatal_error("cannot have fixups in virtual section!");
678  for (unsigned i = 0, e = DF.getContents().size(); i != e; ++i)
679  if (DF.getContents()[i]) {
680  if (auto *ELFSec = dyn_cast<const MCSectionELF>(Sec))
681  report_fatal_error("non-zero initializer found in section '" +
682  ELFSec->getSectionName() + "'");
683  else
684  report_fatal_error("non-zero initializer found in virtual section");
685  }
686  break;
687  }
689  // Check that we aren't trying to write a non-zero value into a virtual
690  // section.
691  assert((cast<MCAlignFragment>(F).getValueSize() == 0 ||
692  cast<MCAlignFragment>(F).getValue() == 0) &&
693  "Invalid align in virtual section!");
694  break;
695  case MCFragment::FT_Fill:
696  assert((cast<MCFillFragment>(F).getValue() == 0) &&
697  "Invalid fill in virtual section!");
698  break;
699  }
700  }
701 
702  return;
703  }
704 
705  uint64_t Start = OS.tell();
706  (void)Start;
707 
708  for (const MCFragment &F : *Sec)
709  writeFragment(OS, *this, Layout, F);
710 
711  assert(OS.tell() - Start == Layout.getSectionAddressSize(Sec));
712 }
713 
714 std::tuple<MCValue, uint64_t, bool>
715 MCAssembler::handleFixup(const MCAsmLayout &Layout, MCFragment &F,
716  const MCFixup &Fixup) {
717  // Evaluate the fixup.
718  MCValue Target;
719  uint64_t FixedValue;
720  bool WasForced;
721  bool IsResolved = evaluateFixup(Layout, Fixup, &F, Target, FixedValue,
722  WasForced);
723  if (!IsResolved) {
724  // The fixup was unresolved, we need a relocation. Inform the object
725  // writer of the relocation, and give it an opportunity to adjust the
726  // fixup value if need be.
727  if (Target.getSymA() && Target.getSymB() &&
729  // The fixup represents the difference between two symbols, which the
730  // backend has indicated must be resolved at link time. Split up the fixup
731  // into two relocations, one for the add, and one for the sub, and emit
732  // both of these. The constant will be associated with the add half of the
733  // expression.
734  MCFixup FixupAdd = MCFixup::createAddFor(Fixup);
735  MCValue TargetAdd =
736  MCValue::get(Target.getSymA(), nullptr, Target.getConstant());
737  getWriter().recordRelocation(*this, Layout, &F, FixupAdd, TargetAdd,
738  FixedValue);
739  MCFixup FixupSub = MCFixup::createSubFor(Fixup);
740  MCValue TargetSub = MCValue::get(Target.getSymB());
741  getWriter().recordRelocation(*this, Layout, &F, FixupSub, TargetSub,
742  FixedValue);
743  } else {
744  getWriter().recordRelocation(*this, Layout, &F, Fixup, Target,
745  FixedValue);
746  }
747  }
748  return std::make_tuple(Target, FixedValue, IsResolved);
749 }
750 
752  assert(getBackendPtr() && "Expected assembler backend");
753  DEBUG_WITH_TYPE("mc-dump", {
754  errs() << "assembler backend - pre-layout\n--\n";
755  dump(); });
756 
757  // Create dummy fragments and assign section ordinals.
758  unsigned SectionIndex = 0;
759  for (MCSection &Sec : *this) {
760  // Create dummy fragments to eliminate any empty sections, this simplifies
761  // layout.
762  if (Sec.getFragmentList().empty())
763  new MCDataFragment(&Sec);
764 
765  Sec.setOrdinal(SectionIndex++);
766  }
767 
768  // Assign layout order indices to sections and fragments.
769  for (unsigned i = 0, e = Layout.getSectionOrder().size(); i != e; ++i) {
770  MCSection *Sec = Layout.getSectionOrder()[i];
771  Sec->setLayoutOrder(i);
772 
773  unsigned FragmentIndex = 0;
774  for (MCFragment &Frag : *Sec)
775  Frag.setLayoutOrder(FragmentIndex++);
776  }
777 
778  // Layout until everything fits.
779  while (layoutOnce(Layout))
780  if (getContext().hadError())
781  return;
782 
783  DEBUG_WITH_TYPE("mc-dump", {
784  errs() << "assembler backend - post-relaxation\n--\n";
785  dump(); });
786 
787  // Finalize the layout, including fragment lowering.
788  finishLayout(Layout);
789 
790  DEBUG_WITH_TYPE("mc-dump", {
791  errs() << "assembler backend - final-layout\n--\n";
792  dump(); });
793 
794  // Allow the object writer a chance to perform post-layout binding (for
795  // example, to set the index fields in the symbol data).
796  getWriter().executePostLayoutBinding(*this, Layout);
797 
798  // Evaluate and apply the fixups, generating relocation entries as necessary.
799  for (MCSection &Sec : *this) {
800  for (MCFragment &Frag : Sec) {
801  // Data and relaxable fragments both have fixups. So only process
802  // those here.
803  // FIXME: Is there a better way to do this? MCEncodedFragmentWithFixups
804  // being templated makes this tricky.
805  if (isa<MCEncodedFragment>(&Frag) &&
806  isa<MCCompactEncodedInstFragment>(&Frag))
807  continue;
808  if (!isa<MCEncodedFragment>(&Frag) && !isa<MCCVDefRangeFragment>(&Frag))
809  continue;
811  MutableArrayRef<char> Contents;
812  const MCSubtargetInfo *STI = nullptr;
813  if (auto *FragWithFixups = dyn_cast<MCDataFragment>(&Frag)) {
814  Fixups = FragWithFixups->getFixups();
815  Contents = FragWithFixups->getContents();
816  STI = FragWithFixups->getSubtargetInfo();
817  assert(!FragWithFixups->hasInstructions() || STI != nullptr);
818  } else if (auto *FragWithFixups = dyn_cast<MCRelaxableFragment>(&Frag)) {
819  Fixups = FragWithFixups->getFixups();
820  Contents = FragWithFixups->getContents();
821  STI = FragWithFixups->getSubtargetInfo();
822  assert(!FragWithFixups->hasInstructions() || STI != nullptr);
823  } else if (auto *FragWithFixups = dyn_cast<MCCVDefRangeFragment>(&Frag)) {
824  Fixups = FragWithFixups->getFixups();
825  Contents = FragWithFixups->getContents();
826  } else if (auto *FragWithFixups = dyn_cast<MCDwarfLineAddrFragment>(&Frag)) {
827  Fixups = FragWithFixups->getFixups();
828  Contents = FragWithFixups->getContents();
829  } else
830  llvm_unreachable("Unknown fragment with fixups!");
831  for (const MCFixup &Fixup : Fixups) {
832  uint64_t FixedValue;
833  bool IsResolved;
834  MCValue Target;
835  std::tie(Target, FixedValue, IsResolved) =
836  handleFixup(Layout, Frag, Fixup);
837  getBackend().applyFixup(*this, Fixup, Target, Contents, FixedValue,
838  IsResolved, STI);
839  }
840  }
841  }
842 }
843 
845  // Create the layout object.
846  MCAsmLayout Layout(*this);
847  layout(Layout);
848 
849  // Write the object file.
850  stats::ObjectBytes += getWriter().writeObject(*this, Layout);
851 }
852 
853 bool MCAssembler::fixupNeedsRelaxation(const MCFixup &Fixup,
854  const MCRelaxableFragment *DF,
855  const MCAsmLayout &Layout) const {
856  assert(getBackendPtr() && "Expected assembler backend");
857  MCValue Target;
858  uint64_t Value;
859  bool WasForced;
860  bool Resolved = evaluateFixup(Layout, Fixup, DF, Target, Value, WasForced);
861  if (Target.getSymA() &&
863  Fixup.getKind() == FK_Data_1)
864  return false;
865  return getBackend().fixupNeedsRelaxationAdvanced(Fixup, Resolved, Value, DF,
866  Layout, WasForced);
867 }
868 
869 bool MCAssembler::fragmentNeedsRelaxation(const MCRelaxableFragment *F,
870  const MCAsmLayout &Layout) const {
871  assert(getBackendPtr() && "Expected assembler backend");
872  // If this inst doesn't ever need relaxation, ignore it. This occurs when we
873  // are intentionally pushing out inst fragments, or because we relaxed a
874  // previous instruction to one that doesn't need relaxation.
875  if (!getBackend().mayNeedRelaxation(F->getInst(), *F->getSubtargetInfo()))
876  return false;
877 
878  for (const MCFixup &Fixup : F->getFixups())
879  if (fixupNeedsRelaxation(Fixup, F, Layout))
880  return true;
881 
882  return false;
883 }
884 
885 bool MCAssembler::relaxInstruction(MCAsmLayout &Layout,
886  MCRelaxableFragment &F) {
887  assert(getEmitterPtr() &&
888  "Expected CodeEmitter defined for relaxInstruction");
889  if (!fragmentNeedsRelaxation(&F, Layout))
890  return false;
891 
892  ++stats::RelaxedInstructions;
893 
894  // FIXME-PERF: We could immediately lower out instructions if we can tell
895  // they are fully resolved, to avoid retesting on later passes.
896 
897  // Relax the fragment.
898 
899  MCInst Relaxed;
900  getBackend().relaxInstruction(F.getInst(), *F.getSubtargetInfo(), Relaxed);
901 
902  // Encode the new instruction.
903  //
904  // FIXME-PERF: If it matters, we could let the target do this. It can
905  // probably do so more efficiently in many cases.
907  SmallString<256> Code;
908  raw_svector_ostream VecOS(Code);
909  getEmitter().encodeInstruction(Relaxed, VecOS, Fixups, *F.getSubtargetInfo());
910 
911  // Update the fragment.
912  F.setInst(Relaxed);
913  F.getContents() = Code;
914  F.getFixups() = Fixups;
915 
916  return true;
917 }
918 
919 bool MCAssembler::relaxPaddingFragment(MCAsmLayout &Layout,
920  MCPaddingFragment &PF) {
921  assert(getBackendPtr() && "Expected assembler backend");
922  uint64_t OldSize = PF.getSize();
923  if (!getBackend().relaxFragment(&PF, Layout))
924  return false;
925  uint64_t NewSize = PF.getSize();
926 
927  ++stats::PaddingFragmentsRelaxations;
928  stats::PaddingFragmentsBytes += NewSize;
929  stats::PaddingFragmentsBytes -= OldSize;
930  return true;
931 }
932 
933 bool MCAssembler::relaxLEB(MCAsmLayout &Layout, MCLEBFragment &LF) {
934  uint64_t OldSize = LF.getContents().size();
935  int64_t Value;
936  bool Abs = LF.getValue().evaluateKnownAbsolute(Value, Layout);
937  if (!Abs)
938  report_fatal_error("sleb128 and uleb128 expressions must be absolute");
940  Data.clear();
941  raw_svector_ostream OSE(Data);
942  // The compiler can generate EH table assembly that is impossible to assemble
943  // without either adding padding to an LEB fragment or adding extra padding
944  // to a later alignment fragment. To accommodate such tables, relaxation can
945  // only increase an LEB fragment size here, not decrease it. See PR35809.
946  if (LF.isSigned())
947  encodeSLEB128(Value, OSE, OldSize);
948  else
949  encodeULEB128(Value, OSE, OldSize);
950  return OldSize != LF.getContents().size();
951 }
952 
953 bool MCAssembler::relaxDwarfLineAddr(MCAsmLayout &Layout,
955  MCContext &Context = Layout.getAssembler().getContext();
956  uint64_t OldSize = DF.getContents().size();
957  int64_t AddrDelta;
958  bool Abs;
959  if (getBackend().requiresDiffExpressionRelocations())
960  Abs = DF.getAddrDelta().evaluateAsAbsolute(AddrDelta, Layout);
961  else {
962  Abs = DF.getAddrDelta().evaluateKnownAbsolute(AddrDelta, Layout);
963  assert(Abs && "We created a line delta with an invalid expression");
964  }
965  int64_t LineDelta;
966  LineDelta = DF.getLineDelta();
968  Data.clear();
969  raw_svector_ostream OSE(Data);
970  DF.getFixups().clear();
971 
972  if (Abs) {
973  MCDwarfLineAddr::Encode(Context, getDWARFLinetableParams(), LineDelta,
974  AddrDelta, OSE);
975  } else {
977  uint32_t Size;
978  bool SetDelta = MCDwarfLineAddr::FixedEncode(Context,
980  LineDelta, AddrDelta,
981  OSE, &Offset, &Size);
982  // Add Fixups for address delta or new address.
983  const MCExpr *FixupExpr;
984  if (SetDelta) {
985  FixupExpr = &DF.getAddrDelta();
986  } else {
987  const MCBinaryExpr *ABE = cast<MCBinaryExpr>(&DF.getAddrDelta());
988  FixupExpr = ABE->getLHS();
989  }
990  DF.getFixups().push_back(
991  MCFixup::create(Offset, FixupExpr,
992  MCFixup::getKindForSize(Size, false /*isPCRel*/)));
993  }
994 
995  return OldSize != Data.size();
996 }
997 
998 bool MCAssembler::relaxDwarfCallFrameFragment(MCAsmLayout &Layout,
1000  MCContext &Context = Layout.getAssembler().getContext();
1001  uint64_t OldSize = DF.getContents().size();
1002  int64_t AddrDelta;
1003  bool Abs = DF.getAddrDelta().evaluateKnownAbsolute(AddrDelta, Layout);
1004  assert(Abs && "We created call frame with an invalid expression");
1005  (void) Abs;
1007  Data.clear();
1008  raw_svector_ostream OSE(Data);
1009  MCDwarfFrameEmitter::EncodeAdvanceLoc(Context, AddrDelta, OSE);
1010  return OldSize != Data.size();
1011 }
1012 
1013 bool MCAssembler::relaxCVInlineLineTable(MCAsmLayout &Layout,
1015  unsigned OldSize = F.getContents().size();
1017  return OldSize != F.getContents().size();
1018 }
1019 
1020 bool MCAssembler::relaxCVDefRange(MCAsmLayout &Layout,
1021  MCCVDefRangeFragment &F) {
1022  unsigned OldSize = F.getContents().size();
1023  getContext().getCVContext().encodeDefRange(Layout, F);
1024  return OldSize != F.getContents().size();
1025 }
1026 
1027 bool MCAssembler::layoutSectionOnce(MCAsmLayout &Layout, MCSection &Sec) {
1028  // Holds the first fragment which needed relaxing during this layout. It will
1029  // remain NULL if none were relaxed.
1030  // When a fragment is relaxed, all the fragments following it should get
1031  // invalidated because their offset is going to change.
1032  MCFragment *FirstRelaxedFragment = nullptr;
1033 
1034  // Attempt to relax all the fragments in the section.
1035  for (MCSection::iterator I = Sec.begin(), IE = Sec.end(); I != IE; ++I) {
1036  // Check if this is a fragment that needs relaxation.
1037  bool RelaxedFrag = false;
1038  switch(I->getKind()) {
1039  default:
1040  break;
1042  assert(!getRelaxAll() &&
1043  "Did not expect a MCRelaxableFragment in RelaxAll mode");
1044  RelaxedFrag = relaxInstruction(Layout, *cast<MCRelaxableFragment>(I));
1045  break;
1046  case MCFragment::FT_Dwarf:
1047  RelaxedFrag = relaxDwarfLineAddr(Layout,
1048  *cast<MCDwarfLineAddrFragment>(I));
1049  break;
1051  RelaxedFrag =
1052  relaxDwarfCallFrameFragment(Layout,
1053  *cast<MCDwarfCallFrameFragment>(I));
1054  break;
1055  case MCFragment::FT_LEB:
1056  RelaxedFrag = relaxLEB(Layout, *cast<MCLEBFragment>(I));
1057  break;
1059  RelaxedFrag = relaxPaddingFragment(Layout, *cast<MCPaddingFragment>(I));
1060  break;
1062  RelaxedFrag =
1063  relaxCVInlineLineTable(Layout, *cast<MCCVInlineLineTableFragment>(I));
1064  break;
1066  RelaxedFrag = relaxCVDefRange(Layout, *cast<MCCVDefRangeFragment>(I));
1067  break;
1068  }
1069  if (RelaxedFrag && !FirstRelaxedFragment)
1070  FirstRelaxedFragment = &*I;
1071  }
1072  if (FirstRelaxedFragment) {
1073  Layout.invalidateFragmentsFrom(FirstRelaxedFragment);
1074  return true;
1075  }
1076  return false;
1077 }
1078 
1079 bool MCAssembler::layoutOnce(MCAsmLayout &Layout) {
1080  ++stats::RelaxationSteps;
1081 
1082  bool WasRelaxed = false;
1083  for (iterator it = begin(), ie = end(); it != ie; ++it) {
1084  MCSection &Sec = *it;
1085  while (layoutSectionOnce(Layout, Sec))
1086  WasRelaxed = true;
1087  }
1088 
1089  return WasRelaxed;
1090 }
1091 
1092 void MCAssembler::finishLayout(MCAsmLayout &Layout) {
1093  assert(getBackendPtr() && "Expected assembler backend");
1094  // The layout is done. Mark every fragment as valid.
1095  for (unsigned int i = 0, n = Layout.getSectionOrder().size(); i != n; ++i) {
1096  MCSection &Section = *Layout.getSectionOrder()[i];
1097  Layout.getFragmentOffset(&*Section.rbegin());
1098  computeFragmentSize(Layout, *Section.rbegin());
1099  }
1100  getBackend().finishLayout(*this, Layout);
1101 }
1102 
1103 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1105  raw_ostream &OS = errs();
1106 
1107  OS << "<MCAssembler\n";
1108  OS << " Sections:[\n ";
1109  for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
1110  if (it != begin()) OS << ",\n ";
1111  it->dump();
1112  }
1113  OS << "],\n";
1114  OS << " Symbols:[";
1115 
1116  for (const_symbol_iterator it = symbol_begin(), ie = symbol_end(); it != ie; ++it) {
1117  if (it != symbol_begin()) OS << ",\n ";
1118  OS << "(";
1119  it->dump();
1120  OS << ", Index:" << it->getIndex() << ", ";
1121  OS << ")";
1122  }
1123  OS << "]>\n";
1124 }
1125 #endif
const MCAsmInfo * getAsmInfo() const
Definition: MCContext.h:293
Instances of this class represent a uniqued identifier for a section in the current translation unit...
Definition: MCSection.h:39
bool alignToBundleEnd() const
Should this fragment be placed at the end of an aligned bundle?
Definition: MCFragment.h:158
Fragment for adding required padding.
Definition: MCFragment.h:341
void encodeDefRange(MCAsmLayout &Layout, MCCVDefRangeFragment &F)
Definition: MCCodeView.cpp:609
raw_ostream & errs()
This returns a reference to a raw_ostream for standard error.
uint32_t getIndex() const
Get the (implementation defined) index.
Definition: MCSymbol.h:310
LLVMContext & Context
static void writeFragment(raw_ostream &OS, const MCAssembler &Asm, const MCAsmLayout &Layout, const MCFragment &F)
Write the fragment F to the output file.
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:140
This class represents lattice values for constants.
Definition: AllocatorList.h:24
MCObjectWriter * getWriterPtr() const
Definition: MCAssembler.h:291
bool isVariable() const
isVariable - Check if this is a variable symbol.
Definition: MCSymbol.h:294
This represents an "assembler immediate".
Definition: MCValue.h:40
const support::endianness Endian
Definition: MCAsmBackend.h:53
uint64_t getSectionAddressSize(const MCSection *Sec) const
Get the address space size of the given section, as it effects layout.
Definition: MCFragment.cpp:176
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition: MCSymbol.h:42
VariantKind getKind() const
Definition: MCExpr.h:338
virtual bool requiresDiffExpressionRelocations() const
Check whether the given target requires emitting differences of two symbols as a set of relocations...
Definition: MCAsmBackend.h:104
virtual void relaxInstruction(const MCInst &Inst, const MCSubtargetInfo &STI, MCInst &Res) const =0
Relax the instruction in the given fragment to the next wider instruction.
uint8_t getValueSize() const
Definition: MCFragment.h:445
iterator begin()
Definition: MCAssembler.h:337
SmallString< 8 > & getContents()
Definition: MCFragment.h:625
void setLayoutOrder(unsigned Value)
Definition: MCSection.h:128
static bool FixedEncode(MCContext &Context, MCDwarfLineTableParams Params, int64_t LineDelta, uint64_t AddrDelta, raw_ostream &OS, uint32_t *Offset, uint32_t *Size)
Utility function to encode a Dwarf pair of LineDelta and AddrDeltas using fixed length operands...
Definition: MCDwarf.cpp:731
virtual const MCFixupKindInfo & getFixupKindInfo(MCFixupKind Kind) const
Get information on a fixup kind.
virtual void executePostLayoutBinding(MCAssembler &Asm, const MCAsmLayout &Layout)=0
Perform any late binding of symbols (for example, to assign symbol indices for use when generating re...
int64_t getValue() const
Definition: MCFragment.h:320
uint64_t getSize() const
Definition: MCFragment.h:419
const MCExpr * getLHS() const
Get the left-hand side expression of the binary operator.
Definition: MCExpr.h:564
bool isAbsolute() const
Is this an absolute (as opposed to relocatable) value.
Definition: MCValue.h:53
A raw_ostream that writes to an SmallVector or SmallString.
Definition: raw_ostream.h:510
void registerSymbol(const MCSymbol &Symbol, bool *Created=nullptr)
static MCFixupKind getKindForSize(unsigned Size, bool isPCRel)
Return the generic fixup kind for a value with the given size.
Definition: MCFixup.h:132
FragmentType getKind() const
Definition: MCFragment.h:97
STATISTIC(NumFunctions, "Total number of functions")
F(f)
const MCExpr & getOffset() const
Definition: MCFragment.h:473
void dump() const
bool isBundlingEnabled() const
Definition: MCAssembler.h:324
static void Encode(MCContext &Context, MCDwarfLineTableParams Params, int64_t LineDelta, uint64_t AddrDelta, raw_ostream &OS)
Utility function to encode a Dwarf pair of LineDelta and AddrDeltas.
Definition: MCDwarf.cpp:649
symbol_iterator symbol_begin()
Definition: MCAssembler.h:348
Encode information on a single operation to perform on a byte sequence (e.g., an encoded instruction)...
Definition: MCFixup.h:74
unsigned getBundleAlignSize() const
Definition: MCAssembler.h:326
Is this fixup kind PCrelative? This is used by the assembler backend to evaluate fixup values in a ta...
#define DEBUG_WITH_TYPE(TYPE, X)
DEBUG_WITH_TYPE macro - This macro should be used by passes to emit debug information.
Definition: Debug.h:65
MCContext & getContext() const
Definition: MCAssembler.h:285
int64_t getConstant() const
Definition: MCValue.h:47
const MCSymbolRefExpr * getSymB() const
Definition: MCValue.h:49
Definition: BitVector.h:938
Interface implemented by fragments that contain encoded instructions and/or data. ...
Definition: MCFragment.h:128
virtual uint64_t writeObject(MCAssembler &Asm, const MCAsmLayout &Layout)=0
Write the object file and returns the number of bytes written.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition: Twine.h:81
MCDwarfLineTableParams getDWARFLinetableParams() const
Definition: MCAssembler.h:299
Encapsulates the layout of an assembly file at a particular point in time.
Definition: MCAsmLayout.h:29
bool isSymbolLinkerVisible(const MCSymbol &SD) const
Check whether a particular symbol is visible to the linker and is required in the symbol table...
MCCodeEmitter & getEmitter() const
Definition: MCAssembler.h:295
virtual void encodeInstruction(const MCInst &Inst, raw_ostream &OS, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const =0
EncodeInstruction - Encode the given Inst to bytes on the output stream OS.
Base class for the full range of assembler expressions which are needed for parsing.
Definition: MCExpr.h:36
bool isInSection() const
isInSection - Check if this symbol is defined in some section (i.e., it is defined but not absolute)...
Definition: MCSymbol.h:252
bool registerSection(MCSection &Section)
The access may reference the value stored in memory.
static MCFixup createSubFor(const MCFixup &Fixup)
Return a fixup corresponding to the sub half of a add/sub fixup pair for the given Fixup...
Definition: MCFixup.h:114
Represent a reference to a symbol from inside an expression.
Definition: MCExpr.h:166
MCObjectWriter & getWriter() const
Definition: MCAssembler.h:297
#define LLVM_DUMP_METHOD
Definition: Compiler.h:74
virtual bool fixupNeedsRelaxationAdvanced(const MCFixup &Fixup, bool Resolved, uint64_t Value, const MCRelaxableFragment *DF, const MCAsmLayout &Layout, const bool WasForced) const
Target specific predicate for whether a given fixup requires the associated instruction to be relaxed...
SMLoc getLoc() const
Definition: MCFragment.h:477
Context object for machine code objects.
Definition: MCContext.h:63
const MCExpr & getAddrDelta() const
Definition: MCFragment.h:538
bool evaluateAsRelocatable(MCValue &Res, const MCAsmLayout *Layout, const MCFixup *Fixup) const
Try to evaluate the expression to a relocatable value, i.e.
Definition: MCExpr.cpp:647
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory)...
Definition: APInt.h:33
const MCExpr & getAddrDelta() const
Definition: MCFragment.h:563
reverse_iterator rbegin()
Definition: MCSection.h:169
MCAssembler & getAssembler() const
Get the assembler object this is a layout for.
Definition: MCAsmLayout.h:51
void layoutFragment(MCFragment *Fragment)
Perform layout for a single fragment, assuming that the previous fragment has already been laid out c...
iterator end()
Definition: MCAssembler.h:340
SmallVectorImpl< char > & getContents()
Definition: MCFragment.h:198
Instances of this class represent a single low-level machine instruction.
Definition: MCInst.h:161
virtual unsigned getMinimumNopSize() const
Returns the minimum size of a nop in bytes on this target.
Definition: MCAsmBackend.h:147
uint8_t getBundlePadding() const
Get the padding size that must be inserted before this fragment.
Definition: MCFragment.h:166
void encodeInlineLineTable(MCAsmLayout &Layout, MCCVInlineLineTableFragment &F)
Encodes the binary annotations once we have a layout.
Definition: MCCodeView.cpp:462
A relaxable fragment holds on to its MCInst, since it may need to be relaxed during the assembler lay...
Definition: MCFragment.h:271
virtual bool writeNopData(raw_ostream &OS, uint64_t Count) const =0
Write an (optimal) nop sequence of Count bytes to the given output.
bool evaluateKnownAbsolute(int64_t &Res, const MCAsmLayout &Layout) const
Definition: MCExpr.cpp:470
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
Definition: ArrayRef.h:291
virtual void reset()
Lifetime management.
Definition: MCCodeEmitter.h:32
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
void invalidateFragmentsFrom(MCFragment *F)
Invalidate the fragments starting with F because it has been resized.
Definition: MCFragment.cpp:52
virtual void reset()
lifetime management
bool isRegistered() const
Definition: MCSection.h:147
SmallVectorImpl< MCFixup > & getFixups()
Definition: MCFragment.h:224
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:130
virtual bool isSectionAtomizableBySymbols(const MCSection &Section) const
True if the section is atomized using the symbols in it.
Definition: MCAsmInfo.cpp:74
const MCSymbol * getAtom(const MCSymbol &S) const
Find the symbol which defines the atom containing the given symbol, or null if there is no such symbo...
bool isTemporary() const
isTemporary - Check if this is an assembler temporary symbol.
Definition: MCSymbol.h:220
const MCSymbolRefExpr * getSymA() const
Definition: MCValue.h:48
void reportError(SMLoc L, const Twine &Msg)
Definition: MCContext.cpp:612
Should this fixup kind force a 4-byte aligned effective PC value?
const MCSymbol * getAtom() const
Definition: MCFragment.h:102
llvm::SmallVectorImpl< MCSection * > & getSectionOrder()
Definition: MCAsmLayout.h:66
void setIsRegistered(bool Value)
Definition: MCSection.h:148
uint32_t getOffset() const
Definition: MCFixup.h:125
void writeSectionData(raw_ostream &OS, const MCSection *Section, const MCAsmLayout &Layout) const
Emit the section contents to OS.
Binary assembler expressions.
Definition: MCExpr.h:417
static MCFixup create(uint32_t Offset, const MCExpr *Value, MCFixupKind Kind, SMLoc Loc=SMLoc())
Definition: MCFixup.h:90
size_t size() const
Definition: SmallVector.h:53
Fragment representing the .cv_def_range directive.
Definition: MCFragment.h:636
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
A one-byte fixup.
Definition: MCFixup.h:24
raw_ostream & write(unsigned char C)
void layout(MCAsmLayout &Layout)
const MCExpr & getValue() const
Definition: MCFragment.h:504
uint64_t getFragmentOffset(const MCFragment *F) const
Get the offset of the given fragment inside its containing section.
Definition: MCFragment.cpp:78
PowerPC TLS Dynamic Call Fixup
void setOrdinal(unsigned Value)
Definition: MCSection.h:125
SMLoc getLoc() const
Definition: MCFixup.h:166
Iterator for intrusive lists based on ilist_node.
unsigned getMaxBytesToEmit() const
Definition: MCFragment.h:324
bool hasEmitNops() const
Definition: MCFragment.h:326
MCAsmBackend * getBackendPtr() const
Definition: MCAssembler.h:287
void writeFragmentPadding(raw_ostream &OS, const MCEncodedFragment &F, uint64_t FSize) const
Write the necessary bundle padding to OS.
MCAssembler(MCContext &Context, std::unique_ptr< MCAsmBackend > Backend, std::unique_ptr< MCCodeEmitter > Emitter, std::unique_ptr< MCObjectWriter > Writer)
Construct a new assembler instance.
Definition: MCAssembler.cpp:86
virtual bool isVirtualSection() const =0
Check whether this section is "virtual", that is has no actual object file contents.
MCAsmBackend & getBackend() const
Definition: MCAssembler.h:293
unsigned encodeULEB128(uint64_t Value, raw_ostream &OS, unsigned PadTo=0)
Utility function to encode a ULEB128 value to an output stream.
Definition: LEB128.h:81
const MCSymbol & getSymbol() const
Definition: MCExpr.h:336
bool isUndefined(bool SetUsed=true) const
isUndefined - Check if this symbol undefined (i.e., implicitly defined).
Definition: MCSymbol.h:257
MCFragment * getFragment(bool SetUsed=true) const
Definition: MCSymbol.h:384
unsigned encodeSLEB128(int64_t Value, raw_ostream &OS, unsigned PadTo=0)
Utility function to encode a SLEB128 value to an output stream.
Definition: LEB128.h:24
This is a &#39;vector&#39; (really, a variable-sized array), optimized for the case when the array is small...
Definition: SmallVector.h:847
bool isRegistered() const
Definition: MCSymbol.h:210
Represents a symbol table index fragment.
Definition: MCFragment.h:576
An iterator type that allows iterating over the pointees via some other iterator. ...
Definition: iterator.h:287
virtual void recordRelocation(MCAssembler &Asm, const MCAsmLayout &Layout, const MCFragment *Fragment, const MCFixup &Fixup, MCValue Target, uint64_t &FixedValue)=0
Record a relocation entry.
static void EncodeAdvanceLoc(MCContext &Context, uint64_t AddrDelta, raw_ostream &OS)
Definition: MCDwarf.cpp:1861
MCLOHContainer & getLOHContainer()
Definition: MCAssembler.h:424
void setBundlePadding(uint8_t N)
Set the padding size for this fragment.
Definition: MCFragment.h:170
uint64_t computeBundlePadding(const MCAssembler &Assembler, const MCEncodedFragment *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:191
bool getRelaxAll() const
Definition: MCAssembler.h:321
bool isDefined() const
isDefined - Check if this symbol is defined (i.e., it has an address).
Definition: MCSymbol.h:248
Target - Wrapper for Target specific information.
bool isThumbFunc(const MCSymbol *Func) const
Check whether a given symbol has been flagged with .thumb_func.
MCSection * getParent() const
Definition: MCFragment.h:99
uint64_t getValue() const
Definition: MCFragment.h:444
bool hasInstructions() const
Does this fragment have instructions emitted into it? By default this is false, but specific fragment...
Definition: MCFragment.h:110
const MCSubtargetInfo * getSubtargetInfo() const
Retrieve the MCSubTargetInfo in effect when the instruction was encoded.
Definition: MCFragment.h:174
SmallString< 8 > & getContents()
Definition: MCFragment.h:565
void setIsRegistered(bool Value) const
Definition: MCSymbol.h:211
Fragment representing the binary annotations produced by the .cv_inline_linetable directive...
Definition: MCFragment.h:598
bool isUsedInReloc() const
Definition: MCSymbol.h:214
unsigned getValueSize() const
Definition: MCFragment.h:322
unsigned getAlignment() const
Definition: MCFragment.h:318
Represents a version number in the form major[.minor[.subminor[.build]]].
Definition: VersionTuple.h:27
int64_t getLineDelta() const
Definition: MCFragment.h:536
const MCInst & getInst() const
Definition: MCFragment.h:282
static MCFixup createAddFor(const MCFixup &Fixup)
Return a fixup corresponding to the add half of a add/sub fixup pair for the given Fixup...
Definition: MCFixup.h:103
static MCValue get(const MCSymbolRefExpr *SymA, const MCSymbolRefExpr *SymB=nullptr, int64_t Val=0, uint32_t RefKind=0)
Definition: MCValue.h:63
#define I(x, y, z)
Definition: MD5.cpp:58
Generic base class for all target subtargets.
uint32_t Size
Definition: Profile.cpp:47
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:655
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...
SmallString< 8 > & getContents()
Definition: MCFragment.h:508
const MCSymbol * getSymbol()
Definition: MCFragment.h:586
uint32_t getRefKind() const
Definition: MCValue.h:50
CodeViewContext & getCVContext()
Definition: MCContext.cpp:602
void reset()
Reuse an assembler instance.
Definition: MCAssembler.cpp:99
Fragment for data and encoded instructions.
Definition: MCFragment.h:242
uint64_t getSectionFileSize(const MCSection *Sec) const
Get the data size of the given section, as emitted to the object file.
Definition: MCFragment.cpp:182
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
const MCExpr * getVariableValue(bool SetUsed=true) const
getVariableValue - Get the value for variable symbols.
Definition: MCSymbol.h:299
bool isSigned() const
Definition: MCFragment.h:506
LLVM Value Representation.
Definition: Value.h:73
uint64_t OffsetToAlignment(uint64_t Value, uint64_t Align)
Returns the offset to the next integer (mod 2**64) that is greater than or equal to Value and is a mu...
Definition: MathExtras.h:727
uint64_t tell() const
tell - Return the current offset with the file.
Definition: raw_ostream.h:100
This class implements an extremely fast bulk output stream that can only output to a stream...
Definition: raw_ostream.h:46
const MCExpr * getValue() const
Definition: MCFixup.h:128
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:49
iterator end()
Definition: MCSection.h:166
uint8_t getValue() const
Definition: MCFragment.h:475
virtual void reset()
lifetime management
Definition: MCAsmBackend.h:56
void Finish()
Finish - Do final processing and write the object to the output stream.
MCSection::FragmentListType & getFragmentList()
Definition: MCSection.h:150
virtual void applyFixup(const MCAssembler &Asm, const MCFixup &Fixup, const MCValue &Target, MutableArrayRef< char > Data, uint64_t Value, bool IsResolved, const MCSubtargetInfo *STI) const =0
Apply the Value for given Fixup into the provided data fragment, at the offset specified by the fixup...
virtual void finishLayout(MCAssembler const &Asm, MCAsmLayout &Layout) const
Give backend an opportunity to finish layout after relaxation.
Definition: MCAsmBackend.h:156
void setInst(const MCInst &Value)
Definition: MCFragment.h:283
MCCodeEmitter * getEmitterPtr() const
Definition: MCAssembler.h:289
MCFixupKind getKind() const
Definition: MCFixup.h:123
iterator begin()
Definition: MCSection.h:163
symbol_iterator symbol_end()
Definition: MCAssembler.h:351