1fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar//===- lib/MC/MCAssembler.cpp - Assembler Backend Implementation ----------===//
2fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar//
3fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar//                     The LLVM Compiler Infrastructure
4fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar//
5fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar// This file is distributed under the University of Illinois Open Source
6fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar// License. See LICENSE.TXT for details.
7fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar//
8fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar//===----------------------------------------------------------------------===//
9fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
10fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar#include "llvm/MC/MCAssembler.h"
11d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/Statistic.h"
12d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/StringExtras.h"
13d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/Twine.h"
14d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/MC/MCAsmBackend.h"
1518ff2cced7e08ac76d8d5bcff8160a5f9a109cbbDaniel Dunbar#include "llvm/MC/MCAsmLayout.h"
16b36052f0e4f59525b34bb4b56648c9121a8beda8Daniel Dunbar#include "llvm/MC/MCCodeEmitter.h"
17fea753b397823c340608925eb7f3256a64a30017Rafael Espindola#include "llvm/MC/MCContext.h"
18d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/MC/MCDwarf.h"
191253a6fa3b0d79dc6ea25f2578f6473219d40047Daniel Dunbar#include "llvm/MC/MCExpr.h"
20f1d0f7781e766df878bec4e7977fa3204374f394Craig Topper#include "llvm/MC/MCFixupKindInfo.h"
2153b2338a1d061ad15a858ff0d641431f4d4ac101Daniel Dunbar#include "llvm/MC/MCObjectWriter.h"
22c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby#include "llvm/MC/MCSection.h"
231253a6fa3b0d79dc6ea25f2578f6473219d40047Daniel Dunbar#include "llvm/MC/MCSymbol.h"
241253a6fa3b0d79dc6ea25f2578f6473219d40047Daniel Dunbar#include "llvm/MC/MCValue.h"
25ac2884a717daf3ad2aa8425320795d661e8a980bDaniel Dunbar#include "llvm/Support/Debug.h"
260705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar#include "llvm/Support/ErrorHandling.h"
272d39a0e52df9ce050bd4e2de3a2ecca8fd9a87c3Jim Grosbach#include "llvm/Support/LEB128.h"
28d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Support/TargetRegistry.h"
29d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Support/raw_ostream.h"
30cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "llvm/MC/MCSectionELF.h"
31dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include <tuple>
32fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarusing namespace llvm;
33fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
34dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define DEBUG_TYPE "assembler"
35dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
36ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbarnamespace {
37ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbarnamespace stats {
388ddc5a192935728c15602a4c15501e35f116422dEli BenderskySTATISTIC(EmittedFragments, "Number of emitted assembler fragments - total");
396f6204f2351afcd11fb83125a06c539a40b43b95Eli BenderskySTATISTIC(EmittedRelaxableFragments,
406f6204f2351afcd11fb83125a06c539a40b43b95Eli Bendersky          "Number of emitted assembler fragments - relaxable");
416ac81f59a7954bd883bb194552eef1d91d04ad17Eli BenderskySTATISTIC(EmittedDataFragments,
426ac81f59a7954bd883bb194552eef1d91d04ad17Eli Bendersky          "Number of emitted assembler fragments - data");
439ccb76998f741a7d3f0f217392a783dfb99c6e87Eli BenderskySTATISTIC(EmittedCompactEncodedInstFragments,
449ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky          "Number of emitted assembler fragments - compact encoded inst");
456ac81f59a7954bd883bb194552eef1d91d04ad17Eli BenderskySTATISTIC(EmittedAlignFragments,
466ac81f59a7954bd883bb194552eef1d91d04ad17Eli Bendersky          "Number of emitted assembler fragments - align");
476ac81f59a7954bd883bb194552eef1d91d04ad17Eli BenderskySTATISTIC(EmittedFillFragments,
486ac81f59a7954bd883bb194552eef1d91d04ad17Eli Bendersky          "Number of emitted assembler fragments - fill");
496ac81f59a7954bd883bb194552eef1d91d04ad17Eli BenderskySTATISTIC(EmittedOrgFragments,
506ac81f59a7954bd883bb194552eef1d91d04ad17Eli Bendersky          "Number of emitted assembler fragments - org");
51f77d5b14af6b92403b93f7ed249f9023e99028ccJim GrosbachSTATISTIC(evaluateFixup, "Number of evaluated fixups");
52ac2884a717daf3ad2aa8425320795d661e8a980bDaniel DunbarSTATISTIC(FragmentLayouts, "Number of fragment layouts");
53ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel DunbarSTATISTIC(ObjectBytes, "Number of emitted object file bytes");
54ac2884a717daf3ad2aa8425320795d661e8a980bDaniel DunbarSTATISTIC(RelaxationSteps, "Number of assembler layout and relaxation steps");
55ac2884a717daf3ad2aa8425320795d661e8a980bDaniel DunbarSTATISTIC(RelaxedInstructions, "Number of relaxed instructions");
56ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar}
57ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar}
580adcd35f78b89bf70eb634b7f9ac2103516ca2b2Daniel Dunbar
598f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar// FIXME FIXME FIXME: There are number of places in this file where we convert
608f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar// what is a 64-bit assembler value used for computation into a value in the
618f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar// object file, which may truncate it. We should detect that truncation where
628f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar// invalid and report errors back.
638f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar
64fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar/* *** */
65fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
669005d45a990ef46f06800bd6bd6a7d1298a33645Daniel DunbarMCAsmLayout::MCAsmLayout(MCAssembler &Asm)
674f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola  : Assembler(Asm), LastValidFragment()
689005d45a990ef46f06800bd6bd6a7d1298a33645Daniel Dunbar {
69bc1a0cf13950dcd64d6d0398df5419a0a2931721Daniel Dunbar  // Compute the section layout order. Virtual sections must go last.
70bc1a0cf13950dcd64d6d0398df5419a0a2931721Daniel Dunbar  for (MCAssembler::iterator it = Asm.begin(), ie = Asm.end(); it != ie; ++it)
71f2dc4aa562e2478a73fe5aeeeec16b1e496a0642Rafael Espindola    if (!it->getSection().isVirtualSection())
72bc1a0cf13950dcd64d6d0398df5419a0a2931721Daniel Dunbar      SectionOrder.push_back(&*it);
73bc1a0cf13950dcd64d6d0398df5419a0a2931721Daniel Dunbar  for (MCAssembler::iterator it = Asm.begin(), ie = Asm.end(); it != ie; ++it)
74f2dc4aa562e2478a73fe5aeeeec16b1e496a0642Rafael Espindola    if (it->getSection().isVirtualSection())
75bc1a0cf13950dcd64d6d0398df5419a0a2931721Daniel Dunbar      SectionOrder.push_back(&*it);
76bc1a0cf13950dcd64d6d0398df5419a0a2931721Daniel Dunbar}
77bc1a0cf13950dcd64d6d0398df5419a0a2931721Daniel Dunbar
78d52a2c0a31a49e1a8fa16f6b975d01b1e934a49fEli Benderskybool MCAsmLayout::isFragmentValid(const MCFragment *F) const {
794f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola  const MCSectionData &SD = *F->getParent();
804f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola  const MCFragment *LastValid = LastValidFragment.lookup(&SD);
814f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola  if (!LastValid)
824f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola    return false;
834f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola  assert(LastValid->getParent() == F->getParent());
844f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola  return F->getLayoutOrder() <= LastValid->getLayoutOrder();
859005d45a990ef46f06800bd6bd6a7d1298a33645Daniel Dunbar}
869005d45a990ef46f06800bd6bd6a7d1298a33645Daniel Dunbar
87f918d7fd7393049bc87bc03fda2d2cd3cec1dacbDerek Schuffvoid MCAsmLayout::invalidateFragmentsFrom(MCFragment *F) {
88d52a2c0a31a49e1a8fa16f6b975d01b1e934a49fEli Bendersky  // If this fragment wasn't already valid, we don't need to do anything.
89d52a2c0a31a49e1a8fa16f6b975d01b1e934a49fEli Bendersky  if (!isFragmentValid(F))
9047b3ec4daa12019b98468e8f646501ec285bbb59Daniel Dunbar    return;
9147b3ec4daa12019b98468e8f646501ec285bbb59Daniel Dunbar
92f918d7fd7393049bc87bc03fda2d2cd3cec1dacbDerek Schuff  // Otherwise, reset the last valid fragment to the previous fragment
93f918d7fd7393049bc87bc03fda2d2cd3cec1dacbDerek Schuff  // (if this is the first fragment, it will be NULL).
944f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola  const MCSectionData &SD = *F->getParent();
95f918d7fd7393049bc87bc03fda2d2cd3cec1dacbDerek Schuff  LastValidFragment[&SD] = F->getPrevNode();
9647b3ec4daa12019b98468e8f646501ec285bbb59Daniel Dunbar}
970cc8bd48619b943379f5c2cc11a19fb189342925Daniel Dunbar
98d52a2c0a31a49e1a8fa16f6b975d01b1e934a49fEli Benderskyvoid MCAsmLayout::ensureValid(const MCFragment *F) const {
994f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola  MCSectionData &SD = *F->getParent();
1004f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola
1014f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola  MCFragment *Cur = LastValidFragment[&SD];
1024f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola  if (!Cur)
1034f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola    Cur = &*SD.begin();
1044f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola  else
1054f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola    Cur = Cur->getNextNode();
1064f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola
107d52a2c0a31a49e1a8fa16f6b975d01b1e934a49fEli Bendersky  // Advance the layout position until the fragment is valid.
108d52a2c0a31a49e1a8fa16f6b975d01b1e934a49fEli Bendersky  while (!isFragmentValid(F)) {
109d52a2c0a31a49e1a8fa16f6b975d01b1e934a49fEli Bendersky    assert(Cur && "Layout bookkeeping error");
110d52a2c0a31a49e1a8fa16f6b975d01b1e934a49fEli Bendersky    const_cast<MCAsmLayout*>(this)->layoutFragment(Cur);
1114f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola    Cur = Cur->getNextNode();
11247b3ec4daa12019b98468e8f646501ec285bbb59Daniel Dunbar  }
1130cc8bd48619b943379f5c2cc11a19fb189342925Daniel Dunbar}
1140cc8bd48619b943379f5c2cc11a19fb189342925Daniel Dunbar
115432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbaruint64_t MCAsmLayout::getFragmentOffset(const MCFragment *F) const {
116d52a2c0a31a49e1a8fa16f6b975d01b1e934a49fEli Bendersky  ensureValid(F);
117432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar  assert(F->Offset != ~UINT64_C(0) && "Address not set!");
118432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar  return F->Offset;
119432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar}
120432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar
121dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines// Simple getSymbolOffset helper for the non-varibale case.
122dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesstatic bool getLabelOffset(const MCAsmLayout &Layout, const MCSymbolData &SD,
123dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                           bool ReportError, uint64_t &Val) {
124dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (!SD.getFragment()) {
125dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    if (ReportError)
126dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      report_fatal_error("unable to evaluate offset to undefined symbol '" +
127dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                         SD.getSymbol().getName() + "'");
128dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return false;
129dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  }
130dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Val = Layout.getFragmentOffset(SD.getFragment()) + SD.getOffset();
131dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return true;
132dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
133dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
134dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesstatic bool getSymbolOffsetImpl(const MCAsmLayout &Layout,
135dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                const MCSymbolData *SD, bool ReportError,
136dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                uint64_t &Val) {
137c8497b6a2565046b5e6b5f2ea9dedc62b53dd966Daniel Dunbar  const MCSymbol &S = SD->getSymbol();
138c8497b6a2565046b5e6b5f2ea9dedc62b53dd966Daniel Dunbar
139dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (!S.isVariable())
140dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return getLabelOffset(Layout, *SD, ReportError, Val);
141c8497b6a2565046b5e6b5f2ea9dedc62b53dd966Daniel Dunbar
142dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // If SD is a variable, evaluate it.
143dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  MCValue Target;
144dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (!S.getVariableValue()->EvaluateAsValue(Target, &Layout))
145dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    report_fatal_error("unable to evaluate offset for variable '" +
146dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                       S.getName() + "'");
147dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
148dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  uint64_t Offset = Target.getConstant();
149dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
150dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  const MCAssembler &Asm = Layout.getAssembler();
151dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
152dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  const MCSymbolRefExpr *A = Target.getSymA();
153dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (A) {
154dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    uint64_t ValA;
155dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    if (!getLabelOffset(Layout, Asm.getSymbolData(A->getSymbol()), ReportError,
156dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                        ValA))
157dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return false;
158dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Offset += ValA;
159c8497b6a2565046b5e6b5f2ea9dedc62b53dd966Daniel Dunbar  }
160c8497b6a2565046b5e6b5f2ea9dedc62b53dd966Daniel Dunbar
161dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  const MCSymbolRefExpr *B = Target.getSymB();
162dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (B) {
163dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    uint64_t ValB;
164dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    if (!getLabelOffset(Layout, Asm.getSymbolData(B->getSymbol()), ReportError,
165dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                        ValB))
166dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return false;
167dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Offset -= ValB;
168dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  }
169dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
170dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Val = Offset;
171dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return true;
172dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
173dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
174dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesbool MCAsmLayout::getSymbolOffset(const MCSymbolData *SD, uint64_t &Val) const {
175dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return getSymbolOffsetImpl(*this, SD, false, Val);
176dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
177dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
178dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesuint64_t MCAsmLayout::getSymbolOffset(const MCSymbolData *SD) const {
179dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  uint64_t Val;
180dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  getSymbolOffsetImpl(*this, SD, true, Val);
181dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return Val;
182dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
183dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
184dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesconst MCSymbol *MCAsmLayout::getBaseSymbol(const MCSymbol &Symbol) const {
185dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (!Symbol.isVariable())
186dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return &Symbol;
187dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
188dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  const MCExpr *Expr = Symbol.getVariableValue();
189dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  MCValue Value;
190dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (!Expr->EvaluateAsValue(Value, this))
191dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    llvm_unreachable("Invalid Expression");
192dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
193dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  const MCSymbolRefExpr *RefB = Value.getSymB();
194dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (RefB)
195dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Assembler.getContext().FatalError(
196dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        SMLoc(), Twine("symbol '") + RefB->getSymbol().getName() +
197dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                     "' could not be evaluated in a subtraction expression");
198dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
199dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  const MCSymbolRefExpr *A = Value.getSymA();
200dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (!A)
201dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return nullptr;
202dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
203dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return &A->getSymbol();
204ffd902bfb743f0564c8f7689c49403074b6f694dRafael Espindola}
205ffd902bfb743f0564c8f7689c49403074b6f694dRafael Espindola
2062661f11e4602ad017fa155f6fdcee0a4f2d1ae86Daniel Dunbaruint64_t MCAsmLayout::getSectionAddressSize(const MCSectionData *SD) const {
207afc6acdab7ba3544d76329ab461f14a93cee67a2Daniel Dunbar  // The size is the last fragment's end offset.
2082661f11e4602ad017fa155f6fdcee0a4f2d1ae86Daniel Dunbar  const MCFragment &F = SD->getFragmentList().back();
209f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbach  return getFragmentOffset(&F) + getAssembler().computeFragmentSize(*this, F);
2105d428511ca9607d52a09d3483d0738f483e09934Daniel Dunbar}
2115d428511ca9607d52a09d3483d0738f483e09934Daniel Dunbar
2125d428511ca9607d52a09d3483d0738f483e09934Daniel Dunbaruint64_t MCAsmLayout::getSectionFileSize(const MCSectionData *SD) const {
2132661f11e4602ad017fa155f6fdcee0a4f2d1ae86Daniel Dunbar  // Virtual sections have no file size.
214f2dc4aa562e2478a73fe5aeeeec16b1e496a0642Rafael Espindola  if (SD->getSection().isVirtualSection())
2152661f11e4602ad017fa155f6fdcee0a4f2d1ae86Daniel Dunbar    return 0;
2165d428511ca9607d52a09d3483d0738f483e09934Daniel Dunbar
2172661f11e4602ad017fa155f6fdcee0a4f2d1ae86Daniel Dunbar  // Otherwise, the file size is the same as the address space size.
2182661f11e4602ad017fa155f6fdcee0a4f2d1ae86Daniel Dunbar  return getSectionAddressSize(SD);
219b5844ff1c44f0427bcf132eaece945da411e650fDaniel Dunbar}
2202661f11e4602ad017fa155f6fdcee0a4f2d1ae86Daniel Dunbar
2214766ef41b31e4f97bce1179c3b0398303bf65356Eli Benderskyuint64_t MCAsmLayout::computeBundlePadding(const MCFragment *F,
2224766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky                                           uint64_t FOffset, uint64_t FSize) {
2234766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  uint64_t BundleSize = Assembler.getBundleAlignSize();
224f918d7fd7393049bc87bc03fda2d2cd3cec1dacbDerek Schuff  assert(BundleSize > 0 &&
2254766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky         "computeBundlePadding should only be called if bundling is enabled");
2264766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  uint64_t BundleMask = BundleSize - 1;
2274766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  uint64_t OffsetInBundle = FOffset & BundleMask;
2286c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky  uint64_t EndOfFragment = OffsetInBundle + FSize;
2296c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky
2306c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky  // There are two kinds of bundling restrictions:
231f918d7fd7393049bc87bc03fda2d2cd3cec1dacbDerek Schuff  //
2326c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky  // 1) For alignToBundleEnd(), add padding to ensure that the fragment will
2336c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky  //    *end* on a bundle boundary.
2346c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky  // 2) Otherwise, check if the fragment would cross a bundle boundary. If it
2356c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky  //    would, add padding until the end of the bundle so that the fragment
2366c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky  //    will start in a new one.
2376c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky  if (F->alignToBundleEnd()) {
2386c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky    // Three possibilities here:
2396c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky    //
2406c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky    // A) The fragment just happens to end at a bundle boundary, so we're good.
2416c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky    // B) The fragment ends before the current bundle boundary: pad it just
2426c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky    //    enough to reach the boundary.
2436c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky    // C) The fragment ends after the current bundle boundary: pad it until it
2446c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky    //    reaches the end of the next bundle boundary.
2456c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky    //
2466c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky    // Note: this code could be made shorter with some modulo trickery, but it's
2476c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky    // intentionally kept in its more explicit form for simplicity.
2486c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky    if (EndOfFragment == BundleSize)
2496c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky      return 0;
2506c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky    else if (EndOfFragment < BundleSize)
2516c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky      return BundleSize - EndOfFragment;
2526c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky    else { // EndOfFragment > BundleSize
2536c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky      return 2 * BundleSize - EndOfFragment;
2546c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky    }
2556c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky  } else if (EndOfFragment > BundleSize)
2564766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky    return BundleSize - OffsetInBundle;
2574766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  else
2584766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky    return 0;
2594766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky}
2604766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky
261207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar/* *** */
262207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar
2630705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel DunbarMCFragment::MCFragment() : Kind(FragmentType(~0)) {
2640705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar}
2650705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
26636880e704f63d4c77a3c5a94047b5afdf79e82dbDaniel DunbarMCFragment::~MCFragment() {
26736880e704f63d4c77a3c5a94047b5afdf79e82dbDaniel Dunbar}
26836880e704f63d4c77a3c5a94047b5afdf79e82dbDaniel Dunbar
2695e835967dd5dda294d0ef3392f4c1d4a2260f532Daniel DunbarMCFragment::MCFragment(FragmentType _Kind, MCSectionData *_Parent)
270dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  : Kind(_Kind), Parent(_Parent), Atom(nullptr), Offset(~UINT64_C(0))
271fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar{
2725e835967dd5dda294d0ef3392f4c1d4a2260f532Daniel Dunbar  if (Parent)
2735e835967dd5dda294d0ef3392f4c1d4a2260f532Daniel Dunbar    Parent->getFragmentList().push_back(this);
274fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar}
275fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
276fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar/* *** */
277fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
27864d9a3233476553fc950f0f2fc6a2cdd2a4c05cfEli BenderskyMCEncodedFragment::~MCEncodedFragment() {
27964d9a3233476553fc950f0f2fc6a2cdd2a4c05cfEli Bendersky}
28064d9a3233476553fc950f0f2fc6a2cdd2a4c05cfEli Bendersky
28164d9a3233476553fc950f0f2fc6a2cdd2a4c05cfEli Bendersky/* *** */
28264d9a3233476553fc950f0f2fc6a2cdd2a4c05cfEli Bendersky
2839ccb76998f741a7d3f0f217392a783dfb99c6e87Eli BenderskyMCEncodedFragmentWithFixups::~MCEncodedFragmentWithFixups() {
2849ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky}
2859ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky
2869ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky/* *** */
2879ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky
288dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesMCSectionData::MCSectionData() : Section(nullptr) {}
289fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
290fb4a6b397665df011348ade24a8e38d2219f095aDaniel DunbarMCSectionData::MCSectionData(const MCSection &_Section, MCAssembler *A)
29181e400092f55c2eba157172bfc0dd0df8317638dDaniel Dunbar  : Section(&_Section),
292f8803fe4177739f9a6900198f601808eb27934d9Rafael Espindola    Ordinal(~UINT32_C(0)),
293fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar    Alignment(1),
2946c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky    BundleLockState(NotBundleLocked), BundleGroupBeforeFirstInst(false),
295e1ec617c6abf0b9dc1eecbbfe483bda3bb2b7795Daniel Dunbar    HasInstructions(false)
296fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar{
297fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  if (A)
298fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar    A->getSectionList().push_back(this);
299fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar}
300fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
301df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter CollingbourneMCSectionData::iterator
302df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter CollingbourneMCSectionData::getSubsectionInsertionPoint(unsigned Subsection) {
303df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne  if (Subsection == 0 && SubsectionFragmentMap.empty())
304df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne    return end();
305df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne
306df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne  SmallVectorImpl<std::pair<unsigned, MCFragment *> >::iterator MI =
307df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne    std::lower_bound(SubsectionFragmentMap.begin(), SubsectionFragmentMap.end(),
308dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                     std::make_pair(Subsection, (MCFragment *)nullptr));
309df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne  bool ExactMatch = false;
310df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne  if (MI != SubsectionFragmentMap.end()) {
311df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne    ExactMatch = MI->first == Subsection;
312df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne    if (ExactMatch)
313df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne      ++MI;
314df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne  }
315df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne  iterator IP;
316df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne  if (MI == SubsectionFragmentMap.end())
317df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne    IP = end();
318df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne  else
319df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne    IP = MI->second;
320df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne  if (!ExactMatch && Subsection != 0) {
321df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne    // The GNU as documentation claims that subsections have an alignment of 4,
322df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne    // although this appears not to be the case.
323df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne    MCFragment *F = new MCDataFragment();
324df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne    SubsectionFragmentMap.insert(MI, std::make_pair(Subsection, F));
325df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne    getFragmentList().insert(IP, F);
326df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne    F->setParent(this);
327df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne  }
328df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne  return IP;
329df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne}
330df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne
331fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar/* *** */
332fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
333dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesMCSymbolData::MCSymbolData() : Symbol(nullptr) {}
334f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar
335cb579b3338fe8d9e4424b138f597a4696cb89de3Daniel DunbarMCSymbolData::MCSymbolData(const MCSymbol &_Symbol, MCFragment *_Fragment,
336f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar                           uint64_t _Offset, MCAssembler *A)
337efbb5330b8d383a393c83d2da5d631c98b0bb3fdDaniel Dunbar  : Symbol(&_Symbol), Fragment(_Fragment), Offset(_Offset),
3388f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar    IsExternal(false), IsPrivateExtern(false),
339dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    CommonSize(0), SymbolSize(nullptr), CommonAlign(0),
3406c8b3d2f1f6fe6eb6a7ae81eab24c1b6db9232aeMatt Fleming    Flags(0), Index(0)
341f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar{
342f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar  if (A)
343f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar    A->getSymbolList().push_back(this);
344f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar}
345f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar
346f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar/* *** */
347f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar
34878c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan ChengMCAssembler::MCAssembler(MCContext &Context_, MCAsmBackend &Backend_,
349feb7ba3d9abfa1eb89f6da93c51649baaa931ab8Daniel Dunbar                         MCCodeEmitter &Emitter_, MCObjectWriter &Writer_,
350feb7ba3d9abfa1eb89f6da93c51649baaa931ab8Daniel Dunbar                         raw_ostream &OS_)
35136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  : Context(Context_), Backend(Backend_), Emitter(Emitter_), Writer(Writer_),
352bc87361d25fc6f09745ded50d3cb0b811e1eba1cEli Bendersky    OS(OS_), BundleAlignSize(0), RelaxAll(false), NoExecStack(false),
3539a7bf438b50fed2c77f0e2bc835defa5b4728f82Jack Carter    SubsectionsViaSymbols(false), ELFHeaderEFlags(0) {
35436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  VersionMinInfo.Major = 0; // Major version == 0 for "none specified"
3556009db486e7fba448ccb28dff676c012efade8f0Daniel Dunbar}
356fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
357fb4a6b397665df011348ade24a8e38d2219f095aDaniel DunbarMCAssembler::~MCAssembler() {
358fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar}
359fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
3605399d2502acaf96fe8420e61913e77f0b23650ffPedro Artigasvoid MCAssembler::reset() {
3615399d2502acaf96fe8420e61913e77f0b23650ffPedro Artigas  Sections.clear();
3625399d2502acaf96fe8420e61913e77f0b23650ffPedro Artigas  Symbols.clear();
3635399d2502acaf96fe8420e61913e77f0b23650ffPedro Artigas  SectionMap.clear();
3645399d2502acaf96fe8420e61913e77f0b23650ffPedro Artigas  SymbolMap.clear();
3655399d2502acaf96fe8420e61913e77f0b23650ffPedro Artigas  IndirectSymbols.clear();
3665399d2502acaf96fe8420e61913e77f0b23650ffPedro Artigas  DataRegions.clear();
3675399d2502acaf96fe8420e61913e77f0b23650ffPedro Artigas  ThumbFuncs.clear();
3685399d2502acaf96fe8420e61913e77f0b23650ffPedro Artigas  RelaxAll = false;
3695399d2502acaf96fe8420e61913e77f0b23650ffPedro Artigas  NoExecStack = false;
3705399d2502acaf96fe8420e61913e77f0b23650ffPedro Artigas  SubsectionsViaSymbols = false;
3719a7bf438b50fed2c77f0e2bc835defa5b4728f82Jack Carter  ELFHeaderEFlags = 0;
37299cbdde6198623ff014c776743caec2cf48f4840Pedro Artigas
37399cbdde6198623ff014c776743caec2cf48f4840Pedro Artigas  // reset objects owned by us
37499cbdde6198623ff014c776743caec2cf48f4840Pedro Artigas  getBackend().reset();
37599cbdde6198623ff014c776743caec2cf48f4840Pedro Artigas  getEmitter().reset();
37699cbdde6198623ff014c776743caec2cf48f4840Pedro Artigas  getWriter().reset();
37736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  getLOHContainer().reset();
3785399d2502acaf96fe8420e61913e77f0b23650ffPedro Artigas}
3795399d2502acaf96fe8420e61913e77f0b23650ffPedro Artigas
380dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesbool MCAssembler::isThumbFunc(const MCSymbol *Symbol) const {
381dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (ThumbFuncs.count(Symbol))
382dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return true;
383dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
384dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (!Symbol->isVariable())
385dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return false;
386dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
387dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // FIXME: It looks like gas supports some cases of the form "foo + 2". It
388dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // is not clear if that is a bug or a feature.
389dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  const MCExpr *Expr = Symbol->getVariableValue();
390dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  const MCSymbolRefExpr *Ref = dyn_cast<MCSymbolRefExpr>(Expr);
391dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (!Ref)
392dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return false;
393dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
394dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (Ref->getKind() != MCSymbolRefExpr::VK_None)
395dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return false;
396dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
397dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  const MCSymbol &Sym = Ref->getSymbol();
398dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (!isThumbFunc(&Sym))
399dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return false;
400dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
401dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ThumbFuncs.insert(Symbol); // Cache it.
402dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return true;
403dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
404dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
405843aa1f15b06fc3c2b39740ffb5bffd2fa6827ceDaniel Dunbarbool MCAssembler::isSymbolLinkerVisible(const MCSymbol &Symbol) const {
406238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar  // Non-temporary labels should always be visible to the linker.
407843aa1f15b06fc3c2b39740ffb5bffd2fa6827ceDaniel Dunbar  if (!Symbol.isTemporary())
408238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar    return true;
409238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar
410238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar  // Absolute temporary labels are never visible.
411843aa1f15b06fc3c2b39740ffb5bffd2fa6827ceDaniel Dunbar  if (!Symbol.isInSection())
412238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar    return false;
413238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar
414238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar  // Otherwise, check if the section requires symbols even for temporary labels.
415843aa1f15b06fc3c2b39740ffb5bffd2fa6827ceDaniel Dunbar  return getBackend().doesSectionRequireSymbols(Symbol.getSection());
416238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar}
417238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar
418b814110612024a092fd884050fbab9d012b16dc7Rafael Espindolaconst MCSymbolData *MCAssembler::getAtom(const MCSymbolData *SD) const {
4198ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar  // Linker visible symbols define atoms.
420843aa1f15b06fc3c2b39740ffb5bffd2fa6827ceDaniel Dunbar  if (isSymbolLinkerVisible(SD->getSymbol()))
4218ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar    return SD;
4228ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar
4238ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar  // Absolute and undefined symbols have no defining atom.
4248ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar  if (!SD->getFragment())
425dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return nullptr;
4268ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar
427a5f1d57f65ae601ec181c0f4e36cf0df5e8d79d8Daniel Dunbar  // Non-linker visible symbols in sections which can't be atomized have no
428a5f1d57f65ae601ec181c0f4e36cf0df5e8d79d8Daniel Dunbar  // defining atom.
429a5f1d57f65ae601ec181c0f4e36cf0df5e8d79d8Daniel Dunbar  if (!getBackend().isSectionAtomizable(
430a5f1d57f65ae601ec181c0f4e36cf0df5e8d79d8Daniel Dunbar        SD->getFragment()->getParent()->getSection()))
431dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return nullptr;
432a5f1d57f65ae601ec181c0f4e36cf0df5e8d79d8Daniel Dunbar
433651804c3d63a05f72221a6d133e5b344e6aaa093Daniel Dunbar  // Otherwise, return the atom for the containing fragment.
434651804c3d63a05f72221a6d133e5b344e6aaa093Daniel Dunbar  return SD->getFragment()->getAtom();
4358ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar}
4368ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar
437cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines// Try to fully compute Expr to an absolute value and if that fails produce
438cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines// a relocatable expr.
439cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines// FIXME: Should this be the behavior of EvaluateAsRelocatable itself?
440cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesstatic bool evaluate(const MCExpr &Expr, const MCAsmLayout &Layout,
441cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                     MCValue &Target) {
442cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  if (Expr.EvaluateAsValue(Target, &Layout))
443cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    if (Target.isAbsolute())
444cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      return true;
445cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  return Expr.EvaluateAsRelocatable(Target, &Layout);
446cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines}
447cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
448f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbachbool MCAssembler::evaluateFixup(const MCAsmLayout &Layout,
449c90e30aa6f3792a460202017523171f435e2ba34Daniel Dunbar                                const MCFixup &Fixup, const MCFragment *DF,
450df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar                                MCValue &Target, uint64_t &Value) const {
451f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbach  ++stats::evaluateFixup;
452ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar
453cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // FIXME: This code has some duplication with RecordRelocation. We should
454cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // probably merge the two into a single callback that tries to evaluate a
455cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // fixup and records a relocation if one is needed.
456cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const MCExpr *Expr = Fixup.getValue();
457cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  if (!evaluate(*Expr, Layout, Target))
458f3c936769b948b53a7c03d2d5fca1ef75284f977Jim Grosbach    getContext().FatalError(Fixup.getLoc(), "expected relocatable expression");
459df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar
460fea753b397823c340608925eb7f3256a64a30017Rafael Espindola  bool IsPCRel = Backend.getFixupKindInfo(
461fea753b397823c340608925eb7f3256a64a30017Rafael Espindola    Fixup.getKind()).Flags & MCFixupKindInfo::FKF_IsPCRel;
462fea753b397823c340608925eb7f3256a64a30017Rafael Espindola
463fea753b397823c340608925eb7f3256a64a30017Rafael Espindola  bool IsResolved;
464fea753b397823c340608925eb7f3256a64a30017Rafael Espindola  if (IsPCRel) {
465fea753b397823c340608925eb7f3256a64a30017Rafael Espindola    if (Target.getSymB()) {
466fea753b397823c340608925eb7f3256a64a30017Rafael Espindola      IsResolved = false;
467fea753b397823c340608925eb7f3256a64a30017Rafael Espindola    } else if (!Target.getSymA()) {
468fea753b397823c340608925eb7f3256a64a30017Rafael Espindola      IsResolved = false;
469fea753b397823c340608925eb7f3256a64a30017Rafael Espindola    } else {
470908159b46ae118d36fccbc1d5145dcedfc3d4185Rafael Espindola      const MCSymbolRefExpr *A = Target.getSymA();
471908159b46ae118d36fccbc1d5145dcedfc3d4185Rafael Espindola      const MCSymbol &SA = A->getSymbol();
472908159b46ae118d36fccbc1d5145dcedfc3d4185Rafael Espindola      if (A->getKind() != MCSymbolRefExpr::VK_None ||
473908159b46ae118d36fccbc1d5145dcedfc3d4185Rafael Espindola          SA.AliasedSymbol().isUndefined()) {
474fea753b397823c340608925eb7f3256a64a30017Rafael Espindola        IsResolved = false;
475fea753b397823c340608925eb7f3256a64a30017Rafael Espindola      } else {
476fea753b397823c340608925eb7f3256a64a30017Rafael Espindola        const MCSymbolData &DataA = getSymbolData(SA);
477fea753b397823c340608925eb7f3256a64a30017Rafael Espindola        IsResolved =
478fea753b397823c340608925eb7f3256a64a30017Rafael Espindola          getWriter().IsSymbolRefDifferenceFullyResolvedImpl(*this, DataA,
479fea753b397823c340608925eb7f3256a64a30017Rafael Espindola                                                             *DF, false, true);
480fea753b397823c340608925eb7f3256a64a30017Rafael Espindola      }
481fea753b397823c340608925eb7f3256a64a30017Rafael Espindola    }
482fea753b397823c340608925eb7f3256a64a30017Rafael Espindola  } else {
483fea753b397823c340608925eb7f3256a64a30017Rafael Espindola    IsResolved = Target.isAbsolute();
484fea753b397823c340608925eb7f3256a64a30017Rafael Espindola  }
485df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar
486df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar  Value = Target.getConstant();
487df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar
4889a1d20042f6a6ec648a3588f9b13264a4570aab0Daniel Dunbar  if (const MCSymbolRefExpr *A = Target.getSymA()) {
48994ed5fca3f5ab5acb74e70b8393b837131e7110cRafael Espindola    const MCSymbol &Sym = A->getSymbol().AliasedSymbol();
49094ed5fca3f5ab5acb74e70b8393b837131e7110cRafael Espindola    if (Sym.isDefined())
49185f2ecc697a8ca6c8cf08093054cbbb9d2060ccfRafael Espindola      Value += Layout.getSymbolOffset(&getSymbolData(Sym));
492df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar  }
4939a1d20042f6a6ec648a3588f9b13264a4570aab0Daniel Dunbar  if (const MCSymbolRefExpr *B = Target.getSymB()) {
49494ed5fca3f5ab5acb74e70b8393b837131e7110cRafael Espindola    const MCSymbol &Sym = B->getSymbol().AliasedSymbol();
49594ed5fca3f5ab5acb74e70b8393b837131e7110cRafael Espindola    if (Sym.isDefined())
49685f2ecc697a8ca6c8cf08093054cbbb9d2060ccfRafael Espindola      Value -= Layout.getSymbolOffset(&getSymbolData(Sym));
497939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  }
498df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar
499df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar
5002761fc427082215c2affcc9d8db8491400bc9e5dDaniel Dunbar  bool ShouldAlignPC = Backend.getFixupKindInfo(Fixup.getKind()).Flags &
50147dbd429daefa9b3f19347194ddfb6f69642465eOwen Anderson                         MCFixupKindInfo::FKF_IsAlignedDownTo32Bits;
50247dbd429daefa9b3f19347194ddfb6f69642465eOwen Anderson  assert((ShouldAlignPC ? IsPCRel : true) &&
50347dbd429daefa9b3f19347194ddfb6f69642465eOwen Anderson    "FKF_IsAlignedDownTo32Bits is only allowed on PC-relative fixups!");
50447dbd429daefa9b3f19347194ddfb6f69642465eOwen Anderson
50505018c2f2872a05b1a2fff1a9934621ba1f38084Owen Anderson  if (IsPCRel) {
506175fb36f101a20df10db90bfe4d0c44a7d05325bOwen Anderson    uint32_t Offset = Layout.getFragmentOffset(DF) + Fixup.getOffset();
507684457d179fcfdf8c1f8ee9f66cc40665ecc648cJim Grosbach
50847dbd429daefa9b3f19347194ddfb6f69642465eOwen Anderson    // A number of ARM fixups in Thumb mode require that the effective PC
50947dbd429daefa9b3f19347194ddfb6f69642465eOwen Anderson    // address be determined as the 32-bit aligned version of the actual offset.
510d18e011cbb3df090166d9f49aa51fda077f09fcdOwen Anderson    if (ShouldAlignPC) Offset &= ~0x3;
511175fb36f101a20df10db90bfe4d0c44a7d05325bOwen Anderson    Value -= Offset;
51205018c2f2872a05b1a2fff1a9934621ba1f38084Owen Anderson  }
513df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar
5147b25ecf6adbf3c4709c48033acfeb6ebbb4452abJim Grosbach  // Let the backend adjust the fixup value if necessary, including whether
5157b25ecf6adbf3c4709c48033acfeb6ebbb4452abJim Grosbach  // we need a relocation.
5167b25ecf6adbf3c4709c48033acfeb6ebbb4452abJim Grosbach  Backend.processFixupValue(*this, Layout, Fixup, DF, Target, Value,
5177b25ecf6adbf3c4709c48033acfeb6ebbb4452abJim Grosbach                            IsResolved);
518475002078848d102b6577fe7283464c039b38af6Jim Grosbach
519df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar  return IsResolved;
520df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar}
521df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar
522f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbachuint64_t MCAssembler::computeFragmentSize(const MCAsmLayout &Layout,
5237a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola                                          const MCFragment &F) const {
524f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar  switch (F.getKind()) {
5252c18d3b0fec25b2b7befc7ac5751e84005f4a869Daniel Dunbar  case MCFragment::FT_Data:
5260fdcef6030fb69bee45f604c71c53bebb17c1079Eli Bendersky  case MCFragment::FT_Relaxable:
5279ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky  case MCFragment::FT_CompactEncodedInst:
5280fdcef6030fb69bee45f604c71c53bebb17c1079Eli Bendersky    return cast<MCEncodedFragment>(F).getContents().size();
5292c18d3b0fec25b2b7befc7ac5751e84005f4a869Daniel Dunbar  case MCFragment::FT_Fill:
5302c18d3b0fec25b2b7befc7ac5751e84005f4a869Daniel Dunbar    return cast<MCFillFragment>(F).getSize();
5312c18d3b0fec25b2b7befc7ac5751e84005f4a869Daniel Dunbar
5323ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  case MCFragment::FT_LEB:
533db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola    return cast<MCLEBFragment>(F).getContents().size();
5343ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola
5357a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola  case MCFragment::FT_Align: {
5367a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola    const MCAlignFragment &AF = cast<MCAlignFragment>(F);
5377a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola    unsigned Offset = Layout.getFragmentOffset(&AF);
5387a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola    unsigned Size = OffsetToAlignment(Offset, AF.getAlignment());
53915b7a98ece81ec275a560c77b814e0479a669bc6Owen Anderson    // If we are padding with nops, force the padding to be larger than the
54015b7a98ece81ec275a560c77b814e0479a669bc6Owen Anderson    // minimum nop size.
54115b7a98ece81ec275a560c77b814e0479a669bc6Owen Anderson    if (Size > 0 && AF.hasEmitNops()) {
54215b7a98ece81ec275a560c77b814e0479a669bc6Owen Anderson      while (Size % getBackend().getMinimumNopSize())
54315b7a98ece81ec275a560c77b814e0479a669bc6Owen Anderson        Size += AF.getAlignment();
54415b7a98ece81ec275a560c77b814e0479a669bc6Owen Anderson    }
5457a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola    if (Size > AF.getMaxBytesToEmit())
5467a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola      return 0;
5477a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola    return Size;
5487a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola  }
549f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar
5507a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola  case MCFragment::FT_Org: {
551f12b379448a9f2131feba15c01714e44bedda120David Blaikie    const MCOrgFragment &OF = cast<MCOrgFragment>(F);
5527a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola    int64_t TargetLocation;
5537a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola    if (!OF.getOffset().EvaluateAsAbsolute(TargetLocation, Layout))
5547a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola      report_fatal_error("expected assembly-time absolute expression");
5557a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola
5567a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola    // FIXME: We need a way to communicate this error.
5577a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola    uint64_t FragmentOffset = Layout.getFragmentOffset(&OF);
5587a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola    int64_t Size = TargetLocation - FragmentOffset;
5597a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola    if (Size < 0 || Size >= 0x40000000)
5607a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola      report_fatal_error("invalid .org offset '" + Twine(TargetLocation) +
5617a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola                         "' (at offset '" + Twine(FragmentOffset) + "')");
5627a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola    return Size;
5637a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola  }
564c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby
565187d8339dbc0530850e54a86edf36f1a865a5823Rafael Espindola  case MCFragment::FT_Dwarf:
566db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola    return cast<MCDwarfLineAddrFragment>(F).getContents().size();
567245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  case MCFragment::FT_DwarfFrame:
568245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola    return cast<MCDwarfCallFrameFragment>(F).getContents().size();
569f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar  }
570f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar
571858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper  llvm_unreachable("invalid fragment kind");
5722c18d3b0fec25b2b7befc7ac5751e84005f4a869Daniel Dunbar}
5732c18d3b0fec25b2b7befc7ac5751e84005f4a869Daniel Dunbar
574d52a2c0a31a49e1a8fa16f6b975d01b1e934a49fEli Benderskyvoid MCAsmLayout::layoutFragment(MCFragment *F) {
5759005d45a990ef46f06800bd6bd6a7d1298a33645Daniel Dunbar  MCFragment *Prev = F->getPrevNode();
5769005d45a990ef46f06800bd6bd6a7d1298a33645Daniel Dunbar
577d52a2c0a31a49e1a8fa16f6b975d01b1e934a49fEli Bendersky  // We should never try to recompute something which is valid.
578d52a2c0a31a49e1a8fa16f6b975d01b1e934a49fEli Bendersky  assert(!isFragmentValid(F) && "Attempt to recompute a valid fragment!");
579d52a2c0a31a49e1a8fa16f6b975d01b1e934a49fEli Bendersky  // We should never try to compute the fragment layout if its predecessor
580d52a2c0a31a49e1a8fa16f6b975d01b1e934a49fEli Bendersky  // isn't valid.
581d52a2c0a31a49e1a8fa16f6b975d01b1e934a49fEli Bendersky  assert((!Prev || isFragmentValid(Prev)) &&
582d52a2c0a31a49e1a8fa16f6b975d01b1e934a49fEli Bendersky         "Attempt to compute fragment before its predecessor!");
5832c18d3b0fec25b2b7befc7ac5751e84005f4a869Daniel Dunbar
5842c18d3b0fec25b2b7befc7ac5751e84005f4a869Daniel Dunbar  ++stats::FragmentLayouts;
5852c18d3b0fec25b2b7befc7ac5751e84005f4a869Daniel Dunbar
58685f2ecc697a8ca6c8cf08093054cbbb9d2060ccfRafael Espindola  // Compute fragment offset and size.
5879005d45a990ef46f06800bd6bd6a7d1298a33645Daniel Dunbar  if (Prev)
5884766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky    F->Offset = Prev->Offset + getAssembler().computeFragmentSize(*this, *Prev);
5894766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  else
5904766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky    F->Offset = 0;
5914f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola  LastValidFragment[F->getParent()] = F;
5924766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky
5934766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  // If bundling is enabled and this fragment has instructions in it, it has to
5944766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  // obey the bundling restrictions. With padding, we'll have:
5954766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  //
5964766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  //
5974766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  //        BundlePadding
598b11917c1aa7348a67d80149fa9613f09a8d56f14Derek Schuff  //             |||
5994766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  // -------------------------------------
6004766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  //   Prev  |##########|       F        |
6014766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  // -------------------------------------
6024766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  //                    ^
6034766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  //                    |
6044766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  //                    F->Offset
6054766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  //
6064766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  // The fragment's offset will point to after the padding, and its computed
6074766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  // size won't include the padding.
6084766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  //
6094766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  if (Assembler.isBundlingEnabled() && F->hasInstructions()) {
6104766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky    assert(isa<MCEncodedFragment>(F) &&
6114766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky           "Only MCEncodedFragment implementations have instructions");
6124766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky    uint64_t FSize = Assembler.computeFragmentSize(*this, *F);
6134766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky
6144766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky    if (FSize > Assembler.getBundleAlignSize())
6154766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky      report_fatal_error("Fragment can't be larger than a bundle size");
6164766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky
6174766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky    uint64_t RequiredBundlePadding = computeBundlePadding(F, F->Offset, FSize);
6184766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky    if (RequiredBundlePadding > UINT8_MAX)
6194766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky      report_fatal_error("Padding cannot exceed 255 bytes");
6204766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky    F->setBundlePadding(static_cast<uint8_t>(RequiredBundlePadding));
6214766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky    F->Offset += RequiredBundlePadding;
6224766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  }
6230705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar}
6240705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
62564d9a3233476553fc950f0f2fc6a2cdd2a4c05cfEli Bendersky/// \brief Write the contents of a fragment to the given object writer. Expects
62664d9a3233476553fc950f0f2fc6a2cdd2a4c05cfEli Bendersky///        a MCEncodedFragment.
62764d9a3233476553fc950f0f2fc6a2cdd2a4c05cfEli Benderskystatic void writeFragmentContents(const MCFragment &F, MCObjectWriter *OW) {
628f12b379448a9f2131feba15c01714e44bedda120David Blaikie  const MCEncodedFragment &EF = cast<MCEncodedFragment>(F);
629550f0ade457c3b042fa099ecff2c022c7ab58b1eEli Bendersky  OW->WriteBytes(EF.getContents());
6300705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar}
6310705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
63264d9a3233476553fc950f0f2fc6a2cdd2a4c05cfEli Bendersky/// \brief Write the fragment \p F to the output file.
63364d9a3233476553fc950f0f2fc6a2cdd2a4c05cfEli Benderskystatic void writeFragment(const MCAssembler &Asm, const MCAsmLayout &Layout,
63464d9a3233476553fc950f0f2fc6a2cdd2a4c05cfEli Bendersky                          const MCFragment &F) {
6355d2477cecf53bef911f57423a5cecb743d4286faDaniel Dunbar  MCObjectWriter *OW = &Asm.getWriter();
6364766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky
637b11917c1aa7348a67d80149fa9613f09a8d56f14Derek Schuff  // FIXME: Embed in fragments instead?
638b11917c1aa7348a67d80149fa9613f09a8d56f14Derek Schuff  uint64_t FragmentSize = Asm.computeFragmentSize(Layout, F);
639b11917c1aa7348a67d80149fa9613f09a8d56f14Derek Schuff
6404766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  // Should NOP padding be written out before this fragment?
6414766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  unsigned BundlePadding = F.getBundlePadding();
6424766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  if (BundlePadding > 0) {
6434766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky    assert(Asm.isBundlingEnabled() &&
6444766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky           "Writing bundle padding with disabled bundling");
6454766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky    assert(F.hasInstructions() &&
6464766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky           "Writing bundle padding for a fragment without instructions");
6474766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky
648b11917c1aa7348a67d80149fa9613f09a8d56f14Derek Schuff    unsigned TotalLength = BundlePadding + static_cast<unsigned>(FragmentSize);
649b11917c1aa7348a67d80149fa9613f09a8d56f14Derek Schuff    if (F.alignToBundleEnd() && TotalLength > Asm.getBundleAlignSize()) {
650b11917c1aa7348a67d80149fa9613f09a8d56f14Derek Schuff      // If the padding itself crosses a bundle boundary, it must be emitted
651b11917c1aa7348a67d80149fa9613f09a8d56f14Derek Schuff      // in 2 pieces, since even nop instructions must not cross boundaries.
652b11917c1aa7348a67d80149fa9613f09a8d56f14Derek Schuff      //             v--------------v   <- BundleAlignSize
653b11917c1aa7348a67d80149fa9613f09a8d56f14Derek Schuff      //        v---------v             <- BundlePadding
654b11917c1aa7348a67d80149fa9613f09a8d56f14Derek Schuff      // ----------------------------
655b11917c1aa7348a67d80149fa9613f09a8d56f14Derek Schuff      // | Prev |####|####|    F    |
656b11917c1aa7348a67d80149fa9613f09a8d56f14Derek Schuff      // ----------------------------
657b11917c1aa7348a67d80149fa9613f09a8d56f14Derek Schuff      //        ^-------------------^   <- TotalLength
658b11917c1aa7348a67d80149fa9613f09a8d56f14Derek Schuff      unsigned DistanceToBoundary = TotalLength - Asm.getBundleAlignSize();
659b11917c1aa7348a67d80149fa9613f09a8d56f14Derek Schuff      if (!Asm.getBackend().writeNopData(DistanceToBoundary, OW))
660b11917c1aa7348a67d80149fa9613f09a8d56f14Derek Schuff          report_fatal_error("unable to write NOP sequence of " +
661b11917c1aa7348a67d80149fa9613f09a8d56f14Derek Schuff                             Twine(DistanceToBoundary) + " bytes");
662b11917c1aa7348a67d80149fa9613f09a8d56f14Derek Schuff      BundlePadding -= DistanceToBoundary;
663b11917c1aa7348a67d80149fa9613f09a8d56f14Derek Schuff    }
6644766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky    if (!Asm.getBackend().writeNopData(BundlePadding, OW))
6654766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky      report_fatal_error("unable to write NOP sequence of " +
6664766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky                         Twine(BundlePadding) + " bytes");
6674766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  }
6684766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky
6694766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  // This variable (and its dummy usage) is to participate in the assert at
6704766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  // the end of the function.
67153b2338a1d061ad15a858ff0d641431f4d4ac101Daniel Dunbar  uint64_t Start = OW->getStream().tell();
6720705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  (void) Start;
6737eb85194f2b07bc7ba3f274fc00dc389b77b63bfDaniel Dunbar
674ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar  ++stats::EmittedFragments;
6750adcd35f78b89bf70eb634b7f9ac2103516ca2b2Daniel Dunbar
6760705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  switch (F.getKind()) {
677d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar  case MCFragment::FT_Align: {
6786ac81f59a7954bd883bb194552eef1d91d04ad17Eli Bendersky    ++stats::EmittedAlignFragments;
679f12b379448a9f2131feba15c01714e44bedda120David Blaikie    const MCAlignFragment &AF = cast<MCAlignFragment>(F);
680e73d49eda2cb4fc30b52c4a241acf69c8af98302Daniel Dunbar    assert(AF.getValueSize() && "Invalid virtual align in concrete fragment!");
681e73d49eda2cb4fc30b52c4a241acf69c8af98302Daniel Dunbar
682ee0dcf4b3ef6a0dbc03ceb96ca1bb6eef8b26e70Eric Christopher    uint64_t Count = FragmentSize / AF.getValueSize();
683ee0dcf4b3ef6a0dbc03ceb96ca1bb6eef8b26e70Eric Christopher
684d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    // FIXME: This error shouldn't actually occur (the front end should emit
685d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    // multiple .align directives to enforce the semantics it wants), but is
686d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    // severe enough that we want to report it. How to handle this?
687432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar    if (Count * AF.getValueSize() != FragmentSize)
68875361b69f3f327842b9dad69fa7f28ae3b688412Chris Lattner      report_fatal_error("undefined .align directive, value size '" +
6897eb85194f2b07bc7ba3f274fc00dc389b77b63bfDaniel Dunbar                        Twine(AF.getValueSize()) +
690d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar                        "' is not a divisor of padding size '" +
691432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar                        Twine(FragmentSize) + "'");
692d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar
6936e72048add2a6464e038121c6c275da37528aa0aKevin Enderby    // See if we are aligning with nops, and if so do that first to try to fill
6946e72048add2a6464e038121c6c275da37528aa0aKevin Enderby    // the Count bytes.  Then if that did not fill any bytes or there are any
695c8e41c591741b3da1077f7000274ad040bef8002Sylvestre Ledru    // bytes left to fill use the Value and ValueSize to fill the rest.
6968f9b80e5df12779a56d763ebf20864dad2bc72daDaniel Dunbar    // If we are aligning with nops, ask that target to emit the right data.
6971c15413ebc8f4a35545a381a789a718627396d03Daniel Dunbar    if (AF.hasEmitNops()) {
698ec3433852dd11e8ff60c9610b4c84468e5935f2bJim Grosbach      if (!Asm.getBackend().writeNopData(Count, OW))
69975361b69f3f327842b9dad69fa7f28ae3b688412Chris Lattner        report_fatal_error("unable to write nop sequence of " +
7008f9b80e5df12779a56d763ebf20864dad2bc72daDaniel Dunbar                          Twine(Count) + " bytes");
7018f9b80e5df12779a56d763ebf20864dad2bc72daDaniel Dunbar      break;
7026e72048add2a6464e038121c6c275da37528aa0aKevin Enderby    }
7036e72048add2a6464e038121c6c275da37528aa0aKevin Enderby
7048f9b80e5df12779a56d763ebf20864dad2bc72daDaniel Dunbar    // Otherwise, write out in multiples of the value size.
705d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    for (uint64_t i = 0; i != Count; ++i) {
706d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar      switch (AF.getValueSize()) {
707858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper      default: llvm_unreachable("Invalid size!");
708bdd9281f356d326155dc2ca5585a708e09e90600Daniel Dunbar      case 1: OW->Write8 (uint8_t (AF.getValue())); break;
709bdd9281f356d326155dc2ca5585a708e09e90600Daniel Dunbar      case 2: OW->Write16(uint16_t(AF.getValue())); break;
710bdd9281f356d326155dc2ca5585a708e09e90600Daniel Dunbar      case 4: OW->Write32(uint32_t(AF.getValue())); break;
711bdd9281f356d326155dc2ca5585a708e09e90600Daniel Dunbar      case 8: OW->Write64(uint64_t(AF.getValue())); break;
712d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar      }
713d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    }
714d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    break;
715d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar  }
7160705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
71764d9a3233476553fc950f0f2fc6a2cdd2a4c05cfEli Bendersky  case MCFragment::FT_Data:
7188ddc5a192935728c15602a4c15501e35f116422dEli Bendersky    ++stats::EmittedDataFragments;
71964d9a3233476553fc950f0f2fc6a2cdd2a4c05cfEli Bendersky    writeFragmentContents(F, OW);
72064d9a3233476553fc950f0f2fc6a2cdd2a4c05cfEli Bendersky    break;
72164d9a3233476553fc950f0f2fc6a2cdd2a4c05cfEli Bendersky
722251040bc18eedfa56d01fe92836e55cfd8c5d990Eli Bendersky  case MCFragment::FT_Relaxable:
7236f6204f2351afcd11fb83125a06c539a40b43b95Eli Bendersky    ++stats::EmittedRelaxableFragments;
72464d9a3233476553fc950f0f2fc6a2cdd2a4c05cfEli Bendersky    writeFragmentContents(F, OW);
7250705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar    break;
7260705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
7279ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky  case MCFragment::FT_CompactEncodedInst:
7289ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky    ++stats::EmittedCompactEncodedInstFragments;
7299ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky    writeFragmentContents(F, OW);
7309ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky    break;
7319ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky
7320705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  case MCFragment::FT_Fill: {
7336ac81f59a7954bd883bb194552eef1d91d04ad17Eli Bendersky    ++stats::EmittedFillFragments;
734f12b379448a9f2131feba15c01714e44bedda120David Blaikie    const MCFillFragment &FF = cast<MCFillFragment>(F);
735e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar
736e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar    assert(FF.getValueSize() && "Invalid virtual align in concrete fragment!");
737e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar
7383153fec733acd079a9e681d16d39253b9517e02cDaniel Dunbar    for (uint64_t i = 0, e = FF.getSize() / FF.getValueSize(); i != e; ++i) {
7390705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar      switch (FF.getValueSize()) {
740858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper      default: llvm_unreachable("Invalid size!");
741bdd9281f356d326155dc2ca5585a708e09e90600Daniel Dunbar      case 1: OW->Write8 (uint8_t (FF.getValue())); break;
742bdd9281f356d326155dc2ca5585a708e09e90600Daniel Dunbar      case 2: OW->Write16(uint16_t(FF.getValue())); break;
743bdd9281f356d326155dc2ca5585a708e09e90600Daniel Dunbar      case 4: OW->Write32(uint32_t(FF.getValue())); break;
744bdd9281f356d326155dc2ca5585a708e09e90600Daniel Dunbar      case 8: OW->Write64(uint64_t(FF.getValue())); break;
7450705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar      }
7460705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar    }
7470705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar    break;
7480705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  }
7497eb85194f2b07bc7ba3f274fc00dc389b77b63bfDaniel Dunbar
7503ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  case MCFragment::FT_LEB: {
751f12b379448a9f2131feba15c01714e44bedda120David Blaikie    const MCLEBFragment &LF = cast<MCLEBFragment>(F);
752db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola    OW->WriteBytes(LF.getContents().str());
7533ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola    break;
7543ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  }
7553ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola
756d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar  case MCFragment::FT_Org: {
7576ac81f59a7954bd883bb194552eef1d91d04ad17Eli Bendersky    ++stats::EmittedOrgFragments;
758f12b379448a9f2131feba15c01714e44bedda120David Blaikie    const MCOrgFragment &OF = cast<MCOrgFragment>(F);
759d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar
760432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar    for (uint64_t i = 0, e = FragmentSize; i != e; ++i)
761bdd9281f356d326155dc2ca5585a708e09e90600Daniel Dunbar      OW->Write8(uint8_t(OF.getValue()));
762d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar
763d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    break;
764d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar  }
765c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby
766c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby  case MCFragment::FT_Dwarf: {
767c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby    const MCDwarfLineAddrFragment &OF = cast<MCDwarfLineAddrFragment>(F);
768db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola    OW->WriteBytes(OF.getContents().str());
769c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby    break;
770c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby  }
771245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  case MCFragment::FT_DwarfFrame: {
772245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola    const MCDwarfCallFrameFragment &CF = cast<MCDwarfCallFrameFragment>(F);
773245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola    OW->WriteBytes(CF.getContents().str());
774245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola    break;
775245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  }
7760705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  }
7770705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
7784766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  assert(OW->getStream().tell() - Start == FragmentSize &&
7794766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky         "The stream should advance by fragment size");
7800705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar}
7810705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
782f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbachvoid MCAssembler::writeSectionData(const MCSectionData *SD,
7835d2477cecf53bef911f57423a5cecb743d4286faDaniel Dunbar                                   const MCAsmLayout &Layout) const {
784d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar  // Ignore virtual sections.
785f2dc4aa562e2478a73fe5aeeeec16b1e496a0642Rafael Espindola  if (SD->getSection().isVirtualSection()) {
786054be92e1da7015190377d6bade57196f28cf33aDaniel Dunbar    assert(Layout.getSectionFileSize(SD) == 0 && "Invalid size for section!");
787e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar
788e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar    // Check that contents are only things legal inside a virtual section.
789e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar    for (MCSectionData::const_iterator it = SD->begin(),
790e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar           ie = SD->end(); it != ie; ++it) {
791e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar      switch (it->getKind()) {
792858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper      default: llvm_unreachable("Invalid fragment in virtual section!");
793c983b20661d574b7adb2675478210c03ad1d0a33Daniel Dunbar      case MCFragment::FT_Data: {
794c983b20661d574b7adb2675478210c03ad1d0a33Daniel Dunbar        // Check that we aren't trying to write a non-zero contents (or fixups)
795c983b20661d574b7adb2675478210c03ad1d0a33Daniel Dunbar        // into a virtual section. This is to support clients which use standard
796c983b20661d574b7adb2675478210c03ad1d0a33Daniel Dunbar        // directives to fill the contents of virtual sections.
797f12b379448a9f2131feba15c01714e44bedda120David Blaikie        const MCDataFragment &DF = cast<MCDataFragment>(*it);
798c983b20661d574b7adb2675478210c03ad1d0a33Daniel Dunbar        assert(DF.fixup_begin() == DF.fixup_end() &&
799c983b20661d574b7adb2675478210c03ad1d0a33Daniel Dunbar               "Cannot have fixups in virtual section!");
800c983b20661d574b7adb2675478210c03ad1d0a33Daniel Dunbar        for (unsigned i = 0, e = DF.getContents().size(); i != e; ++i)
801cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          if (DF.getContents()[i]) {
802cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            if (auto *ELFSec = dyn_cast<const MCSectionELF>(&SD->getSection()))
803cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines              report_fatal_error("non-zero initializer found in section '" +
804cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                  ELFSec->getSectionName() + "'");
805cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            else
806cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines              report_fatal_error("non-zero initializer found in virtual section");
807cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          }
808c983b20661d574b7adb2675478210c03ad1d0a33Daniel Dunbar        break;
809c983b20661d574b7adb2675478210c03ad1d0a33Daniel Dunbar      }
810e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar      case MCFragment::FT_Align:
811c983b20661d574b7adb2675478210c03ad1d0a33Daniel Dunbar        // Check that we aren't trying to write a non-zero value into a virtual
812c983b20661d574b7adb2675478210c03ad1d0a33Daniel Dunbar        // section.
813b02f1e9a6bc332ebd77571fdffcdc44d77e76b31Serge Pavlov        assert((cast<MCAlignFragment>(it)->getValueSize() == 0 ||
814b02f1e9a6bc332ebd77571fdffcdc44d77e76b31Serge Pavlov                cast<MCAlignFragment>(it)->getValue() == 0) &&
815e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar               "Invalid align in virtual section!");
816e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar        break;
817e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar      case MCFragment::FT_Fill:
818b02f1e9a6bc332ebd77571fdffcdc44d77e76b31Serge Pavlov        assert((cast<MCFillFragment>(it)->getValueSize() == 0 ||
819b02f1e9a6bc332ebd77571fdffcdc44d77e76b31Serge Pavlov                cast<MCFillFragment>(it)->getValue() == 0) &&
820e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar               "Invalid fill in virtual section!");
821e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar        break;
822e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar      }
823e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar    }
824e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar
825d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar    return;
826d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar  }
827d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar
8285d2477cecf53bef911f57423a5cecb743d4286faDaniel Dunbar  uint64_t Start = getWriter().getStream().tell();
829b5762bfd8cb8238ec34b0b422d074f65f35b8eabJim Grosbach  (void)Start;
8307eb85194f2b07bc7ba3f274fc00dc389b77b63bfDaniel Dunbar
83164d9a3233476553fc950f0f2fc6a2cdd2a4c05cfEli Bendersky  for (MCSectionData::const_iterator it = SD->begin(), ie = SD->end();
83264d9a3233476553fc950f0f2fc6a2cdd2a4c05cfEli Bendersky       it != ie; ++it)
83364d9a3233476553fc950f0f2fc6a2cdd2a4c05cfEli Bendersky    writeFragment(*this, Layout, *it);
8340705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
8355d2477cecf53bef911f57423a5cecb743d4286faDaniel Dunbar  assert(getWriter().getStream().tell() - Start ==
8365d2477cecf53bef911f57423a5cecb743d4286faDaniel Dunbar         Layout.getSectionAddressSize(SD));
8370705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar}
8380705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
83936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstd::pair<uint64_t, bool> MCAssembler::handleFixup(const MCAsmLayout &Layout,
84036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                                   MCFragment &F,
84136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                                   const MCFixup &Fixup) {
84236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // Evaluate the fixup.
84336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  MCValue Target;
84436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  uint64_t FixedValue;
84536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool IsPCRel = Backend.getFixupKindInfo(Fixup.getKind()).Flags &
84636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                 MCFixupKindInfo::FKF_IsPCRel;
84736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (!evaluateFixup(Layout, Fixup, &F, Target, FixedValue)) {
84836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // The fixup was unresolved, we need a relocation. Inform the object
84936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // writer of the relocation, and give it an opportunity to adjust the
85036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // fixup value if need be.
85136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    getWriter().RecordRelocation(*this, Layout, &F, Fixup, Target, IsPCRel,
85236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                 FixedValue);
85336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
85436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return std::make_pair(FixedValue, IsPCRel);
85536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
856179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola
857feb7ba3d9abfa1eb89f6da93c51649baaa931ab8Daniel Dunbarvoid MCAssembler::Finish() {
858b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  DEBUG_WITH_TYPE("mc-dump", {
859b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar      llvm::errs() << "assembler backend - pre-layout\n--\n";
860b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar      dump(); });
861b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
86261066dbdf2f035e146c11a40d4cf6531cf2dfd6cDaniel Dunbar  // Create the layout object.
8638d39eb47d6a15d36be7ac0d0154a6897e42f5adcDaniel Dunbar  MCAsmLayout Layout(*this);
86461066dbdf2f035e146c11a40d4cf6531cf2dfd6cDaniel Dunbar
865337718e09c99349939a53643984c04f5dc118bb7Daniel Dunbar  // Create dummy fragments and assign section ordinals.
86649ed9211905ec586f1d23a7f337d335ae63b4635Daniel Dunbar  unsigned SectionIndex = 0;
86749ed9211905ec586f1d23a7f337d335ae63b4635Daniel Dunbar  for (MCAssembler::iterator it = begin(), ie = end(); it != ie; ++it) {
86849ed9211905ec586f1d23a7f337d335ae63b4635Daniel Dunbar    // Create dummy fragments to eliminate any empty sections, this simplifies
86949ed9211905ec586f1d23a7f337d335ae63b4635Daniel Dunbar    // layout.
8706f74f69ff4a6e365272a754f0984c0321755976dDuncan Sands    if (it->getFragmentList().empty())
871d80781b98b771d370730ab7c630018f23e202b57Rafael Espindola      new MCDataFragment(it);
87249ed9211905ec586f1d23a7f337d335ae63b4635Daniel Dunbar
87349ed9211905ec586f1d23a7f337d335ae63b4635Daniel Dunbar    it->setOrdinal(SectionIndex++);
874337718e09c99349939a53643984c04f5dc118bb7Daniel Dunbar  }
87549ed9211905ec586f1d23a7f337d335ae63b4635Daniel Dunbar
876337718e09c99349939a53643984c04f5dc118bb7Daniel Dunbar  // Assign layout order indices to sections and fragments.
877337718e09c99349939a53643984c04f5dc118bb7Daniel Dunbar  for (unsigned i = 0, e = Layout.getSectionOrder().size(); i != e; ++i) {
878337718e09c99349939a53643984c04f5dc118bb7Daniel Dunbar    MCSectionData *SD = Layout.getSectionOrder()[i];
879337718e09c99349939a53643984c04f5dc118bb7Daniel Dunbar    SD->setLayoutOrder(i);
880337718e09c99349939a53643984c04f5dc118bb7Daniel Dunbar
8814f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola    unsigned FragmentIndex = 0;
882d52a2c0a31a49e1a8fa16f6b975d01b1e934a49fEli Bendersky    for (MCSectionData::iterator iFrag = SD->begin(), iFragEnd = SD->end();
883d52a2c0a31a49e1a8fa16f6b975d01b1e934a49fEli Bendersky         iFrag != iFragEnd; ++iFrag)
884d52a2c0a31a49e1a8fa16f6b975d01b1e934a49fEli Bendersky      iFrag->setLayoutOrder(FragmentIndex++);
88549ed9211905ec586f1d23a7f337d335ae63b4635Daniel Dunbar  }
88649ed9211905ec586f1d23a7f337d335ae63b4635Daniel Dunbar
88761066dbdf2f035e146c11a40d4cf6531cf2dfd6cDaniel Dunbar  // Layout until everything fits.
888f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbach  while (layoutOnce(Layout))
889f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar    continue;
890f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar
891f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar  DEBUG_WITH_TYPE("mc-dump", {
8923f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar      llvm::errs() << "assembler backend - post-relaxation\n--\n";
8933f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar      dump(); });
8943f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar
8953f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  // Finalize the layout, including fragment lowering.
896f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbach  finishLayout(Layout);
8973f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar
8983f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  DEBUG_WITH_TYPE("mc-dump", {
8993f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar      llvm::errs() << "assembler backend - final-layout\n--\n";
900f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar      dump(); });
901f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar
902ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar  uint64_t StartOffset = OS.tell();
903c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner
904bacba997782f624d3c43591a913b8f1e3d733a52Daniel Dunbar  // Allow the object writer a chance to perform post-layout binding (for
905bacba997782f624d3c43591a913b8f1e3d733a52Daniel Dunbar  // example, to set the index fields in the symbol data).
9065d2477cecf53bef911f57423a5cecb743d4286faDaniel Dunbar  getWriter().ExecutePostLayoutBinding(*this, Layout);
907bacba997782f624d3c43591a913b8f1e3d733a52Daniel Dunbar
908b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar  // Evaluate and apply the fixups, generating relocation entries as necessary.
909b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar  for (MCAssembler::iterator it = begin(), ie = end(); it != ie; ++it) {
910b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar    for (MCSectionData::iterator it2 = it->begin(),
911b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar           ie2 = it->end(); it2 != ie2; ++it2) {
9129ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky      MCEncodedFragmentWithFixups *F =
9139ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky        dyn_cast<MCEncodedFragmentWithFixups>(it2);
91464d9a3233476553fc950f0f2fc6a2cdd2a4c05cfEli Bendersky      if (F) {
9159ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky        for (MCEncodedFragmentWithFixups::fixup_iterator it3 = F->fixup_begin(),
91664d9a3233476553fc950f0f2fc6a2cdd2a4c05cfEli Bendersky             ie3 = F->fixup_end(); it3 != ie3; ++it3) {
917179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola          MCFixup &Fixup = *it3;
91836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines          uint64_t FixedValue;
91936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines          bool IsPCRel;
92036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines          std::tie(FixedValue, IsPCRel) = handleFixup(Layout, *F, Fixup);
92164d9a3233476553fc950f0f2fc6a2cdd2a4c05cfEli Bendersky          getBackend().applyFixup(Fixup, F->getContents().data(),
92236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                  F->getContents().size(), FixedValue, IsPCRel);
923b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar        }
924b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar      }
925b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar    }
926b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar  }
927b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar
928bacba997782f624d3c43591a913b8f1e3d733a52Daniel Dunbar  // Write the object file.
9295d2477cecf53bef911f57423a5cecb743d4286faDaniel Dunbar  getWriter().WriteObject(*this, Layout);
930ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar
931ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar  stats::ObjectBytes += OS.tell() - StartOffset;
932f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar}
933f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar
934f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbachbool MCAssembler::fixupNeedsRelaxation(const MCFixup &Fixup,
935251040bc18eedfa56d01fe92836e55cfd8c5d990Eli Bendersky                                       const MCRelaxableFragment *DF,
9368d39eb47d6a15d36be7ac0d0154a6897e42f5adcDaniel Dunbar                                       const MCAsmLayout &Layout) const {
937f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar  // If we cannot resolve the fixup value, it requires relaxation.
938f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar  MCValue Target;
939f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar  uint64_t Value;
940f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbach  if (!evaluateFixup(Layout, Fixup, DF, Target, Value))
941f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar    return true;
942f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar
943370b78d795154899a22ca2b4674e890661ff1d59Jim Grosbach  return getBackend().fixupNeedsRelaxation(Fixup, Value, DF, Layout);
944f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar}
945f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar
946251040bc18eedfa56d01fe92836e55cfd8c5d990Eli Benderskybool MCAssembler::fragmentNeedsRelaxation(const MCRelaxableFragment *F,
947d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar                                          const MCAsmLayout &Layout) const {
948d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar  // If this inst doesn't ever need relaxation, ignore it. This occurs when we
949d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar  // are intentionally pushing out inst fragments, or because we relaxed a
950d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar  // previous instruction to one that doesn't need relaxation.
951251040bc18eedfa56d01fe92836e55cfd8c5d990Eli Bendersky  if (!getBackend().mayNeedRelaxation(F->getInst()))
952d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar    return false;
953d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar
954251040bc18eedfa56d01fe92836e55cfd8c5d990Eli Bendersky  for (MCRelaxableFragment::const_fixup_iterator it = F->fixup_begin(),
955251040bc18eedfa56d01fe92836e55cfd8c5d990Eli Bendersky       ie = F->fixup_end(); it != ie; ++it)
956251040bc18eedfa56d01fe92836e55cfd8c5d990Eli Bendersky    if (fixupNeedsRelaxation(*it, F, Layout))
957d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      return true;
958d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar
959d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar  return false;
960d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar}
961d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar
962f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbachbool MCAssembler::relaxInstruction(MCAsmLayout &Layout,
963251040bc18eedfa56d01fe92836e55cfd8c5d990Eli Bendersky                                   MCRelaxableFragment &F) {
964251040bc18eedfa56d01fe92836e55cfd8c5d990Eli Bendersky  if (!fragmentNeedsRelaxation(&F, Layout))
9653ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola    return false;
9663ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola
9673ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  ++stats::RelaxedInstructions;
9683ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola
9693ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  // FIXME-PERF: We could immediately lower out instructions if we can tell
9703ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  // they are fully resolved, to avoid retesting on later passes.
9713ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola
9723ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  // Relax the fragment.
9733ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola
9743ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  MCInst Relaxed;
975251040bc18eedfa56d01fe92836e55cfd8c5d990Eli Bendersky  getBackend().relaxInstruction(F.getInst(), Relaxed);
9763ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola
9773ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  // Encode the new instruction.
9783ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  //
9793ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  // FIXME-PERF: If it matters, we could let the target do this. It can
9803ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  // probably do so more efficiently in many cases.
9813ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  SmallVector<MCFixup, 4> Fixups;
9823ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  SmallString<256> Code;
9833ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  raw_svector_ostream VecOS(Code);
98436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  getEmitter().EncodeInstruction(Relaxed, VecOS, Fixups, F.getSubtargetInfo());
9853ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  VecOS.flush();
9863ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola
987251040bc18eedfa56d01fe92836e55cfd8c5d990Eli Bendersky  // Update the fragment.
988251040bc18eedfa56d01fe92836e55cfd8c5d990Eli Bendersky  F.setInst(Relaxed);
989251040bc18eedfa56d01fe92836e55cfd8c5d990Eli Bendersky  F.getContents() = Code;
990251040bc18eedfa56d01fe92836e55cfd8c5d990Eli Bendersky  F.getFixups() = Fixups;
9913ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola
9923ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  return true;
9933ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola}
9943ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola
995f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbachbool MCAssembler::relaxLEB(MCAsmLayout &Layout, MCLEBFragment &LF) {
996db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola  int64_t Value = 0;
997db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola  uint64_t OldSize = LF.getContents().size();
998d88cac0a6e908a366f403b37725e765604bc15d3Rafael Espindola  bool IsAbs = LF.getValue().EvaluateAsAbsolute(Value, Layout);
999d88cac0a6e908a366f403b37725e765604bc15d3Rafael Espindola  (void)IsAbs;
1000d88cac0a6e908a366f403b37725e765604bc15d3Rafael Espindola  assert(IsAbs);
1001db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola  SmallString<8> &Data = LF.getContents();
1002db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola  Data.clear();
1003db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola  raw_svector_ostream OSE(Data);
10043ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  if (LF.isSigned())
10052d39a0e52df9ce050bd4e2de3a2ecca8fd9a87c3Jim Grosbach    encodeSLEB128(Value, OSE);
10063ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  else
10072d39a0e52df9ce050bd4e2de3a2ecca8fd9a87c3Jim Grosbach    encodeULEB128(Value, OSE);
1008db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola  OSE.flush();
1009db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola  return OldSize != LF.getContents().size();
10103ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola}
10113ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola
1012f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbachbool MCAssembler::relaxDwarfLineAddr(MCAsmLayout &Layout,
1013f68a26b5d8e06a85edba97702884a74673b60807Jim Grosbach                                     MCDwarfLineAddrFragment &DF) {
1014c1f4a4b2640dfc871bacacef53a95f1c96a9fe48Ulrich Weigand  MCContext &Context = Layout.getAssembler().getContext();
1015db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola  int64_t AddrDelta = 0;
1016db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola  uint64_t OldSize = DF.getContents().size();
1017835439a397407e421263bd476e5b18bf787ffb6aRafael Espindola  bool IsAbs = DF.getAddrDelta().EvaluateAsAbsolute(AddrDelta, Layout);
1018835439a397407e421263bd476e5b18bf787ffb6aRafael Espindola  (void)IsAbs;
1019835439a397407e421263bd476e5b18bf787ffb6aRafael Espindola  assert(IsAbs);
1020187d8339dbc0530850e54a86edf36f1a865a5823Rafael Espindola  int64_t LineDelta;
1021187d8339dbc0530850e54a86edf36f1a865a5823Rafael Espindola  LineDelta = DF.getLineDelta();
1022db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola  SmallString<8> &Data = DF.getContents();
1023db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola  Data.clear();
1024db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola  raw_svector_ostream OSE(Data);
1025c1f4a4b2640dfc871bacacef53a95f1c96a9fe48Ulrich Weigand  MCDwarfLineAddr::Encode(Context, LineDelta, AddrDelta, OSE);
1026db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola  OSE.flush();
1027db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola  return OldSize != Data.size();
1028187d8339dbc0530850e54a86edf36f1a865a5823Rafael Espindola}
1029187d8339dbc0530850e54a86edf36f1a865a5823Rafael Espindola
1030f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbachbool MCAssembler::relaxDwarfCallFrameFragment(MCAsmLayout &Layout,
1031245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola                                              MCDwarfCallFrameFragment &DF) {
1032c1f4a4b2640dfc871bacacef53a95f1c96a9fe48Ulrich Weigand  MCContext &Context = Layout.getAssembler().getContext();
1033245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  int64_t AddrDelta = 0;
1034245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  uint64_t OldSize = DF.getContents().size();
1035245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  bool IsAbs = DF.getAddrDelta().EvaluateAsAbsolute(AddrDelta, Layout);
1036245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  (void)IsAbs;
1037245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  assert(IsAbs);
1038245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  SmallString<8> &Data = DF.getContents();
1039245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  Data.clear();
1040245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  raw_svector_ostream OSE(Data);
1041c1f4a4b2640dfc871bacacef53a95f1c96a9fe48Ulrich Weigand  MCDwarfFrameEmitter::EncodeAdvanceLoc(Context, AddrDelta, OSE);
1042245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  OSE.flush();
1043245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  return OldSize != Data.size();
1044245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola}
1045245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola
1046f43e3fdb4ffddff6f71b5597c813c43e1e206564Eli Benderskybool MCAssembler::layoutSectionOnce(MCAsmLayout &Layout, MCSectionData &SD) {
1047f43e3fdb4ffddff6f71b5597c813c43e1e206564Eli Bendersky  // Holds the first fragment which needed relaxing during this layout. It will
1048f43e3fdb4ffddff6f71b5597c813c43e1e206564Eli Bendersky  // remain NULL if none were relaxed.
1049d52a2c0a31a49e1a8fa16f6b975d01b1e934a49fEli Bendersky  // When a fragment is relaxed, all the fragments following it should get
1050d52a2c0a31a49e1a8fa16f6b975d01b1e934a49fEli Bendersky  // invalidated because their offset is going to change.
1051dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  MCFragment *FirstRelaxedFragment = nullptr;
1052f43e3fdb4ffddff6f71b5597c813c43e1e206564Eli Bendersky
1053d52a2c0a31a49e1a8fa16f6b975d01b1e934a49fEli Bendersky  // Attempt to relax all the fragments in the section.
1054f43e3fdb4ffddff6f71b5597c813c43e1e206564Eli Bendersky  for (MCSectionData::iterator I = SD.begin(), IE = SD.end(); I != IE; ++I) {
1055f43e3fdb4ffddff6f71b5597c813c43e1e206564Eli Bendersky    // Check if this is a fragment that needs relaxation.
1056f43e3fdb4ffddff6f71b5597c813c43e1e206564Eli Bendersky    bool RelaxedFrag = false;
1057f43e3fdb4ffddff6f71b5597c813c43e1e206564Eli Bendersky    switch(I->getKind()) {
105862b83b62f377ac248038672015dc65970327f786Rafael Espindola    default:
1059f43e3fdb4ffddff6f71b5597c813c43e1e206564Eli Bendersky      break;
1060251040bc18eedfa56d01fe92836e55cfd8c5d990Eli Bendersky    case MCFragment::FT_Relaxable:
106137a9830d20018dee5557a3a72f750d965ba383c5Eli Bendersky      assert(!getRelaxAll() &&
1062251040bc18eedfa56d01fe92836e55cfd8c5d990Eli Bendersky             "Did not expect a MCRelaxableFragment in RelaxAll mode");
1063251040bc18eedfa56d01fe92836e55cfd8c5d990Eli Bendersky      RelaxedFrag = relaxInstruction(Layout, *cast<MCRelaxableFragment>(I));
106462b83b62f377ac248038672015dc65970327f786Rafael Espindola      break;
106562b83b62f377ac248038672015dc65970327f786Rafael Espindola    case MCFragment::FT_Dwarf:
1066f43e3fdb4ffddff6f71b5597c813c43e1e206564Eli Bendersky      RelaxedFrag = relaxDwarfLineAddr(Layout,
1067f43e3fdb4ffddff6f71b5597c813c43e1e206564Eli Bendersky                                       *cast<MCDwarfLineAddrFragment>(I));
106862b83b62f377ac248038672015dc65970327f786Rafael Espindola      break;
1069245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola    case MCFragment::FT_DwarfFrame:
1070f43e3fdb4ffddff6f71b5597c813c43e1e206564Eli Bendersky      RelaxedFrag =
1071f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbach        relaxDwarfCallFrameFragment(Layout,
1072f43e3fdb4ffddff6f71b5597c813c43e1e206564Eli Bendersky                                    *cast<MCDwarfCallFrameFragment>(I));
1073245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola      break;
1074245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola    case MCFragment::FT_LEB:
1075f43e3fdb4ffddff6f71b5597c813c43e1e206564Eli Bendersky      RelaxedFrag = relaxLEB(Layout, *cast<MCLEBFragment>(I));
1076245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola      break;
107762b83b62f377ac248038672015dc65970327f786Rafael Espindola    }
1078d52a2c0a31a49e1a8fa16f6b975d01b1e934a49fEli Bendersky    if (RelaxedFrag && !FirstRelaxedFragment)
1079d52a2c0a31a49e1a8fa16f6b975d01b1e934a49fEli Bendersky      FirstRelaxedFragment = I;
108062b83b62f377ac248038672015dc65970327f786Rafael Espindola  }
1081d52a2c0a31a49e1a8fa16f6b975d01b1e934a49fEli Bendersky  if (FirstRelaxedFragment) {
1082f918d7fd7393049bc87bc03fda2d2cd3cec1dacbDerek Schuff    Layout.invalidateFragmentsFrom(FirstRelaxedFragment);
108362b83b62f377ac248038672015dc65970327f786Rafael Espindola    return true;
108462b83b62f377ac248038672015dc65970327f786Rafael Espindola  }
108562b83b62f377ac248038672015dc65970327f786Rafael Espindola  return false;
108662b83b62f377ac248038672015dc65970327f786Rafael Espindola}
108762b83b62f377ac248038672015dc65970327f786Rafael Espindola
1088f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbachbool MCAssembler::layoutOnce(MCAsmLayout &Layout) {
1089ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar  ++stats::RelaxationSteps;
1090ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar
10910cc8bd48619b943379f5c2cc11a19fb189342925Daniel Dunbar  bool WasRelaxed = false;
1092f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar  for (iterator it = begin(), ie = end(); it != ie; ++it) {
1093f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar    MCSectionData &SD = *it;
1094f43e3fdb4ffddff6f71b5597c813c43e1e206564Eli Bendersky    while (layoutSectionOnce(Layout, SD))
109562b83b62f377ac248038672015dc65970327f786Rafael Espindola      WasRelaxed = true;
1096f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar  }
1097f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar
10980cc8bd48619b943379f5c2cc11a19fb189342925Daniel Dunbar  return WasRelaxed;
1099f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar}
1100b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
1101f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbachvoid MCAssembler::finishLayout(MCAsmLayout &Layout) {
1102b4172fa72915bd031383e81c83cd313c8c4b2e74Rafael Espindola  // The layout is done. Mark every fragment as valid.
11034f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola  for (unsigned int i = 0, n = Layout.getSectionOrder().size(); i != n; ++i) {
11044f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola    Layout.getFragmentOffset(&*Layout.getSectionOrder()[i]->rbegin());
11054f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola  }
11063f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar}
11073f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar
1108b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar// Debugging methods
1109b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
1110b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbarnamespace llvm {
1111b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
1112c90e30aa6f3792a460202017523171f435e2ba34Daniel Dunbarraw_ostream &operator<<(raw_ostream &OS, const MCFixup &AF) {
1113c90e30aa6f3792a460202017523171f435e2ba34Daniel Dunbar  OS << "<MCFixup" << " Offset:" << AF.getOffset()
1114482ad802f1b1885542ea8a30e144a228a1526912Daniel Dunbar     << " Value:" << *AF.getValue()
1115482ad802f1b1885542ea8a30e144a228a1526912Daniel Dunbar     << " Kind:" << AF.getKind() << ">";
1116b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  return OS;
1117b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar}
1118b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
1119b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar}
1120b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
1121286c4dc355b8be6806081b23c3097485821c7642Manman Ren#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1122b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbarvoid MCFragment::dump() {
1123b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  raw_ostream &OS = llvm::errs();
1124b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
1125e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  OS << "<";
1126e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  switch (getKind()) {
1127e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  case MCFragment::FT_Align: OS << "MCAlignFragment"; break;
1128e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  case MCFragment::FT_Data:  OS << "MCDataFragment"; break;
11299ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky  case MCFragment::FT_CompactEncodedInst:
11309ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky    OS << "MCCompactEncodedInstFragment"; break;
1131e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  case MCFragment::FT_Fill:  OS << "MCFillFragment"; break;
1132251040bc18eedfa56d01fe92836e55cfd8c5d990Eli Bendersky  case MCFragment::FT_Relaxable:  OS << "MCRelaxableFragment"; break;
1133e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  case MCFragment::FT_Org:   OS << "MCOrgFragment"; break;
1134c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby  case MCFragment::FT_Dwarf: OS << "MCDwarfFragment"; break;
1135245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  case MCFragment::FT_DwarfFrame: OS << "MCDwarfCallFrameFragment"; break;
11363ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  case MCFragment::FT_LEB:   OS << "MCLEBFragment"; break;
1137e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  }
1138e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar
1139337718e09c99349939a53643984c04f5dc118bb7Daniel Dunbar  OS << "<MCFragment " << (void*) this << " LayoutOrder:" << LayoutOrder
11404766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky     << " Offset:" << Offset
11414766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky     << " HasInstructions:" << hasInstructions()
1142f918d7fd7393049bc87bc03fda2d2cd3cec1dacbDerek Schuff     << " BundlePadding:" << static_cast<unsigned>(getBundlePadding()) << ">";
1143b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
1144e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  switch (getKind()) {
1145e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  case MCFragment::FT_Align: {
1146e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    const MCAlignFragment *AF = cast<MCAlignFragment>(this);
1147e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    if (AF->hasEmitNops())
1148e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar      OS << " (emit nops)";
1149e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    OS << "\n       ";
1150e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    OS << " Alignment:" << AF->getAlignment()
1151e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar       << " Value:" << AF->getValue() << " ValueSize:" << AF->getValueSize()
1152e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar       << " MaxBytesToEmit:" << AF->getMaxBytesToEmit() << ">";
1153e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    break;
1154b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  }
1155e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  case MCFragment::FT_Data:  {
1156e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    const MCDataFragment *DF = cast<MCDataFragment>(this);
1157e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    OS << "\n       ";
1158e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    OS << " Contents:[";
1159e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    const SmallVectorImpl<char> &Contents = DF->getContents();
1160e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    for (unsigned i = 0, e = Contents.size(); i != e; ++i) {
1161e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar      if (i) OS << ",";
1162e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar      OS << hexdigit((Contents[i] >> 4) & 0xF) << hexdigit(Contents[i] & 0xF);
1163e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    }
1164e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    OS << "] (" << Contents.size() << " bytes)";
1165e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar
11665c10f509f45820d1198bfb975840e93a782745acEli Bendersky    if (DF->fixup_begin() != DF->fixup_end()) {
1167e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar      OS << ",\n       ";
1168e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar      OS << " Fixups:[";
1169e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar      for (MCDataFragment::const_fixup_iterator it = DF->fixup_begin(),
1170e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar             ie = DF->fixup_end(); it != ie; ++it) {
1171e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar        if (it != DF->fixup_begin()) OS << ",\n                ";
1172e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar        OS << *it;
1173e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar      }
1174e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar      OS << "]";
11750bcf074867d4d366f7988a219c7a53265fcb4f23Daniel Dunbar    }
1176e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    break;
1177e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  }
11789ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky  case MCFragment::FT_CompactEncodedInst: {
11799ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky    const MCCompactEncodedInstFragment *CEIF =
11809ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky      cast<MCCompactEncodedInstFragment>(this);
11819ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky    OS << "\n       ";
11829ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky    OS << " Contents:[";
11839ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky    const SmallVectorImpl<char> &Contents = CEIF->getContents();
11849ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky    for (unsigned i = 0, e = Contents.size(); i != e; ++i) {
11859ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky      if (i) OS << ",";
11869ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky      OS << hexdigit((Contents[i] >> 4) & 0xF) << hexdigit(Contents[i] & 0xF);
11879ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky    }
11889ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky    OS << "] (" << Contents.size() << " bytes)";
11899ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky    break;
11909ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky  }
1191e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  case MCFragment::FT_Fill:  {
1192e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    const MCFillFragment *FF = cast<MCFillFragment>(this);
1193e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    OS << " Value:" << FF->getValue() << " ValueSize:" << FF->getValueSize()
1194e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar       << " Size:" << FF->getSize();
1195e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    break;
1196e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  }
1197251040bc18eedfa56d01fe92836e55cfd8c5d990Eli Bendersky  case MCFragment::FT_Relaxable:  {
1198251040bc18eedfa56d01fe92836e55cfd8c5d990Eli Bendersky    const MCRelaxableFragment *F = cast<MCRelaxableFragment>(this);
1199e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    OS << "\n       ";
1200e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    OS << " Inst:";
1201251040bc18eedfa56d01fe92836e55cfd8c5d990Eli Bendersky    F->getInst().dump_pretty(OS);
1202e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    break;
1203e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  }
1204e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  case MCFragment::FT_Org:  {
1205e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    const MCOrgFragment *OF = cast<MCOrgFragment>(this);
1206e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    OS << "\n       ";
1207e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    OS << " Offset:" << OF->getOffset() << " Value:" << OF->getValue();
1208e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    break;
1209e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  }
1210c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby  case MCFragment::FT_Dwarf:  {
1211c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby    const MCDwarfLineAddrFragment *OF = cast<MCDwarfLineAddrFragment>(this);
1212c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby    OS << "\n       ";
1213c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby    OS << " AddrDelta:" << OF->getAddrDelta()
1214c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby       << " LineDelta:" << OF->getLineDelta();
1215c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby    break;
1216c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby  }
1217245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  case MCFragment::FT_DwarfFrame:  {
1218245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola    const MCDwarfCallFrameFragment *CF = cast<MCDwarfCallFrameFragment>(this);
1219245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola    OS << "\n       ";
1220245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola    OS << " AddrDelta:" << CF->getAddrDelta();
1221245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola    break;
1222245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  }
12233ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  case MCFragment::FT_LEB: {
12243ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola    const MCLEBFragment *LF = cast<MCLEBFragment>(this);
12253ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola    OS << "\n       ";
12263ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola    OS << " Value:" << LF->getValue() << " Signed:" << LF->isSigned();
12273ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola    break;
12283ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  }
12290bcf074867d4d366f7988a219c7a53265fcb4f23Daniel Dunbar  }
12303f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  OS << ">";
12313f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar}
12323f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar
1233b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbarvoid MCSectionData::dump() {
1234b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  raw_ostream &OS = llvm::errs();
1235b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
1236b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "<MCSectionData";
12374766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  OS << " Alignment:" << getAlignment()
12384766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky     << " Fragments:[\n      ";
1239b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  for (iterator it = begin(), ie = end(); it != ie; ++it) {
1240b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar    if (it != begin()) OS << ",\n      ";
1241b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar    it->dump();
1242b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  }
1243b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "]>";
1244b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar}
1245b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
1246cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesvoid MCSymbolData::dump() const {
1247b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  raw_ostream &OS = llvm::errs();
1248b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
1249b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "<MCSymbolData Symbol:" << getSymbol()
1250b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar     << " Fragment:" << getFragment() << " Offset:" << getOffset()
1251b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar     << " Flags:" << getFlags() << " Index:" << getIndex();
1252b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  if (isCommon())
1253b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar    OS << " (common, size:" << getCommonSize()
1254b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar       << " align: " << getCommonAlignment() << ")";
1255b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  if (isExternal())
1256b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar    OS << " (external)";
1257b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  if (isPrivateExtern())
1258b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar    OS << " (private extern)";
1259b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << ">";
1260b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar}
1261b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
1262b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbarvoid MCAssembler::dump() {
1263b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  raw_ostream &OS = llvm::errs();
1264b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
1265b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "<MCAssembler\n";
126645aefff64c64d5bd7804f39d994883b98ce4415aDaniel Dunbar  OS << "  Sections:[\n    ";
1267b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  for (iterator it = begin(), ie = end(); it != ie; ++it) {
1268b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar    if (it != begin()) OS << ",\n    ";
1269b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar    it->dump();
1270b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  }
1271b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "],\n";
1272b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "  Symbols:[";
1273b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
1274b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  for (symbol_iterator it = symbol_begin(), ie = symbol_end(); it != ie; ++it) {
127545aefff64c64d5bd7804f39d994883b98ce4415aDaniel Dunbar    if (it != symbol_begin()) OS << ",\n           ";
1276b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar    it->dump();
1277b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  }
1278b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "]>\n";
1279b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar}
1280cc77eece74c8db09acc2af425e7e6c88a5bb30d1Manman Ren#endif
12812d24e2a396a1d211baaeedf32148a3b657240170David Blaikie
12822d24e2a396a1d211baaeedf32148a3b657240170David Blaikie// anchors for MC*Fragment vtables
128364d9a3233476553fc950f0f2fc6a2cdd2a4c05cfEli Benderskyvoid MCEncodedFragment::anchor() { }
12849ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Benderskyvoid MCEncodedFragmentWithFixups::anchor() { }
12852d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid MCDataFragment::anchor() { }
12869ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Benderskyvoid MCCompactEncodedInstFragment::anchor() { }
1287251040bc18eedfa56d01fe92836e55cfd8c5d990Eli Benderskyvoid MCRelaxableFragment::anchor() { }
12882d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid MCAlignFragment::anchor() { }
12892d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid MCFillFragment::anchor() { }
12902d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid MCOrgFragment::anchor() { }
12912d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid MCLEBFragment::anchor() { }
12922d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid MCDwarfLineAddrFragment::anchor() { }
12932d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid MCDwarfCallFrameFragment::anchor() { }
1294