MCAssembler.cpp revision 286c4dc355b8be6806081b23c3097485821c7642
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
100adcd35f78b89bf70eb634b7f9ac2103516ca2b2Daniel Dunbar#define DEBUG_TYPE "assembler"
11fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar#include "llvm/MC/MCAssembler.h"
1218ff2cced7e08ac76d8d5bcff8160a5f9a109cbbDaniel Dunbar#include "llvm/MC/MCAsmLayout.h"
13b36052f0e4f59525b34bb4b56648c9121a8beda8Daniel Dunbar#include "llvm/MC/MCCodeEmitter.h"
14fea753b397823c340608925eb7f3256a64a30017Rafael Espindola#include "llvm/MC/MCContext.h"
151253a6fa3b0d79dc6ea25f2578f6473219d40047Daniel Dunbar#include "llvm/MC/MCExpr.h"
16f1d0f7781e766df878bec4e7977fa3204374f394Craig Topper#include "llvm/MC/MCFixupKindInfo.h"
1753b2338a1d061ad15a858ff0d641431f4d4ac101Daniel Dunbar#include "llvm/MC/MCObjectWriter.h"
18c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby#include "llvm/MC/MCSection.h"
191253a6fa3b0d79dc6ea25f2578f6473219d40047Daniel Dunbar#include "llvm/MC/MCSymbol.h"
201253a6fa3b0d79dc6ea25f2578f6473219d40047Daniel Dunbar#include "llvm/MC/MCValue.h"
21c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby#include "llvm/MC/MCDwarf.h"
2278c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng#include "llvm/MC/MCAsmBackend.h"
230adcd35f78b89bf70eb634b7f9ac2103516ca2b2Daniel Dunbar#include "llvm/ADT/Statistic.h"
24b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar#include "llvm/ADT/StringExtras.h"
25d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar#include "llvm/ADT/Twine.h"
26ac2884a717daf3ad2aa8425320795d661e8a980bDaniel Dunbar#include "llvm/Support/Debug.h"
270705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar#include "llvm/Support/ErrorHandling.h"
28fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar#include "llvm/Support/raw_ostream.h"
293e74d6fdd248e20a280f1dff3da9a6c689c2c4c3Evan Cheng#include "llvm/Support/TargetRegistry.h"
302d39a0e52df9ce050bd4e2de3a2ecca8fd9a87c3Jim Grosbach#include "llvm/Support/LEB128.h"
31f6346769b344f9b134f0661e8bd2b4245f6490eaDaniel Dunbar
32fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarusing namespace llvm;
33fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
34ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbarnamespace {
35ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbarnamespace stats {
360adcd35f78b89bf70eb634b7f9ac2103516ca2b2Daniel DunbarSTATISTIC(EmittedFragments, "Number of emitted assembler fragments");
37f77d5b14af6b92403b93f7ed249f9023e99028ccJim GrosbachSTATISTIC(evaluateFixup, "Number of evaluated fixups");
38ac2884a717daf3ad2aa8425320795d661e8a980bDaniel DunbarSTATISTIC(FragmentLayouts, "Number of fragment layouts");
39ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel DunbarSTATISTIC(ObjectBytes, "Number of emitted object file bytes");
40ac2884a717daf3ad2aa8425320795d661e8a980bDaniel DunbarSTATISTIC(RelaxationSteps, "Number of assembler layout and relaxation steps");
41ac2884a717daf3ad2aa8425320795d661e8a980bDaniel DunbarSTATISTIC(RelaxedInstructions, "Number of relaxed instructions");
42ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar}
43ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar}
440adcd35f78b89bf70eb634b7f9ac2103516ca2b2Daniel Dunbar
458f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar// FIXME FIXME FIXME: There are number of places in this file where we convert
468f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar// what is a 64-bit assembler value used for computation into a value in the
478f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar// object file, which may truncate it. We should detect that truncation where
488f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar// invalid and report errors back.
498f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar
50fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar/* *** */
51fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
529005d45a990ef46f06800bd6bd6a7d1298a33645Daniel DunbarMCAsmLayout::MCAsmLayout(MCAssembler &Asm)
534f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola  : Assembler(Asm), LastValidFragment()
549005d45a990ef46f06800bd6bd6a7d1298a33645Daniel Dunbar {
55bc1a0cf13950dcd64d6d0398df5419a0a2931721Daniel Dunbar  // Compute the section layout order. Virtual sections must go last.
56bc1a0cf13950dcd64d6d0398df5419a0a2931721Daniel Dunbar  for (MCAssembler::iterator it = Asm.begin(), ie = Asm.end(); it != ie; ++it)
57f2dc4aa562e2478a73fe5aeeeec16b1e496a0642Rafael Espindola    if (!it->getSection().isVirtualSection())
58bc1a0cf13950dcd64d6d0398df5419a0a2931721Daniel Dunbar      SectionOrder.push_back(&*it);
59bc1a0cf13950dcd64d6d0398df5419a0a2931721Daniel Dunbar  for (MCAssembler::iterator it = Asm.begin(), ie = Asm.end(); it != ie; ++it)
60f2dc4aa562e2478a73fe5aeeeec16b1e496a0642Rafael Espindola    if (it->getSection().isVirtualSection())
61bc1a0cf13950dcd64d6d0398df5419a0a2931721Daniel Dunbar      SectionOrder.push_back(&*it);
62bc1a0cf13950dcd64d6d0398df5419a0a2931721Daniel Dunbar}
63bc1a0cf13950dcd64d6d0398df5419a0a2931721Daniel Dunbar
649005d45a990ef46f06800bd6bd6a7d1298a33645Daniel Dunbarbool MCAsmLayout::isFragmentUpToDate(const MCFragment *F) const {
654f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola  const MCSectionData &SD = *F->getParent();
664f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola  const MCFragment *LastValid = LastValidFragment.lookup(&SD);
674f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola  if (!LastValid)
684f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola    return false;
694f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola  assert(LastValid->getParent() == F->getParent());
704f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola  return F->getLayoutOrder() <= LastValid->getLayoutOrder();
719005d45a990ef46f06800bd6bd6a7d1298a33645Daniel Dunbar}
729005d45a990ef46f06800bd6bd6a7d1298a33645Daniel Dunbar
73a9d4281cc0557ef679b7917e0741ddb01651dab1Rafael Espindolavoid MCAsmLayout::Invalidate(MCFragment *F) {
7447b3ec4daa12019b98468e8f646501ec285bbb59Daniel Dunbar  // If this fragment wasn't already up-to-date, we don't need to do anything.
7547b3ec4daa12019b98468e8f646501ec285bbb59Daniel Dunbar  if (!isFragmentUpToDate(F))
7647b3ec4daa12019b98468e8f646501ec285bbb59Daniel Dunbar    return;
7747b3ec4daa12019b98468e8f646501ec285bbb59Daniel Dunbar
782bf6afc277edb32b1d940def5b3eb0e0d32a22b9Rafael Espindola  // Otherwise, reset the last valid fragment to this fragment.
794f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola  const MCSectionData &SD = *F->getParent();
802bf6afc277edb32b1d940def5b3eb0e0d32a22b9Rafael Espindola  LastValidFragment[&SD] = F;
8147b3ec4daa12019b98468e8f646501ec285bbb59Daniel Dunbar}
820cc8bd48619b943379f5c2cc11a19fb189342925Daniel Dunbar
8347b3ec4daa12019b98468e8f646501ec285bbb59Daniel Dunbarvoid MCAsmLayout::EnsureValid(const MCFragment *F) const {
844f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola  MCSectionData &SD = *F->getParent();
854f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola
864f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola  MCFragment *Cur = LastValidFragment[&SD];
874f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola  if (!Cur)
884f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola    Cur = &*SD.begin();
894f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola  else
904f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola    Cur = Cur->getNextNode();
914f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola
9247b3ec4daa12019b98468e8f646501ec285bbb59Daniel Dunbar  // Advance the layout position until the fragment is up-to-date.
9347b3ec4daa12019b98468e8f646501ec285bbb59Daniel Dunbar  while (!isFragmentUpToDate(F)) {
9447b3ec4daa12019b98468e8f646501ec285bbb59Daniel Dunbar    const_cast<MCAsmLayout*>(this)->LayoutFragment(Cur);
954f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola    Cur = Cur->getNextNode();
9647b3ec4daa12019b98468e8f646501ec285bbb59Daniel Dunbar  }
970cc8bd48619b943379f5c2cc11a19fb189342925Daniel Dunbar}
980cc8bd48619b943379f5c2cc11a19fb189342925Daniel Dunbar
99432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbaruint64_t MCAsmLayout::getFragmentOffset(const MCFragment *F) const {
10047b3ec4daa12019b98468e8f646501ec285bbb59Daniel Dunbar  EnsureValid(F);
101432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar  assert(F->Offset != ~UINT64_C(0) && "Address not set!");
102432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar  return F->Offset;
103432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar}
104432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar
105ffd902bfb743f0564c8f7689c49403074b6f694dRafael Espindolauint64_t MCAsmLayout::getSymbolOffset(const MCSymbolData *SD) const {
106c8497b6a2565046b5e6b5f2ea9dedc62b53dd966Daniel Dunbar  const MCSymbol &S = SD->getSymbol();
107c8497b6a2565046b5e6b5f2ea9dedc62b53dd966Daniel Dunbar
108c8497b6a2565046b5e6b5f2ea9dedc62b53dd966Daniel Dunbar  // If this is a variable, then recursively evaluate now.
109c8497b6a2565046b5e6b5f2ea9dedc62b53dd966Daniel Dunbar  if (S.isVariable()) {
110c8497b6a2565046b5e6b5f2ea9dedc62b53dd966Daniel Dunbar    MCValue Target;
111c8497b6a2565046b5e6b5f2ea9dedc62b53dd966Daniel Dunbar    if (!S.getVariableValue()->EvaluateAsRelocatable(Target, *this))
112c8497b6a2565046b5e6b5f2ea9dedc62b53dd966Daniel Dunbar      report_fatal_error("unable to evaluate offset for variable '" +
113c8497b6a2565046b5e6b5f2ea9dedc62b53dd966Daniel Dunbar                         S.getName() + "'");
114c8497b6a2565046b5e6b5f2ea9dedc62b53dd966Daniel Dunbar
115c8497b6a2565046b5e6b5f2ea9dedc62b53dd966Daniel Dunbar    // Verify that any used symbols are defined.
116c8497b6a2565046b5e6b5f2ea9dedc62b53dd966Daniel Dunbar    if (Target.getSymA() && Target.getSymA()->getSymbol().isUndefined())
117c8497b6a2565046b5e6b5f2ea9dedc62b53dd966Daniel Dunbar      report_fatal_error("unable to evaluate offset to undefined symbol '" +
118c8497b6a2565046b5e6b5f2ea9dedc62b53dd966Daniel Dunbar                         Target.getSymA()->getSymbol().getName() + "'");
119c8497b6a2565046b5e6b5f2ea9dedc62b53dd966Daniel Dunbar    if (Target.getSymB() && Target.getSymB()->getSymbol().isUndefined())
120c8497b6a2565046b5e6b5f2ea9dedc62b53dd966Daniel Dunbar      report_fatal_error("unable to evaluate offset to undefined symbol '" +
121c8497b6a2565046b5e6b5f2ea9dedc62b53dd966Daniel Dunbar                         Target.getSymB()->getSymbol().getName() + "'");
122684457d179fcfdf8c1f8ee9f66cc40665ecc648cJim Grosbach
123c8497b6a2565046b5e6b5f2ea9dedc62b53dd966Daniel Dunbar    uint64_t Offset = Target.getConstant();
124c8497b6a2565046b5e6b5f2ea9dedc62b53dd966Daniel Dunbar    if (Target.getSymA())
125c8497b6a2565046b5e6b5f2ea9dedc62b53dd966Daniel Dunbar      Offset += getSymbolOffset(&Assembler.getSymbolData(
126c8497b6a2565046b5e6b5f2ea9dedc62b53dd966Daniel Dunbar                                  Target.getSymA()->getSymbol()));
127c8497b6a2565046b5e6b5f2ea9dedc62b53dd966Daniel Dunbar    if (Target.getSymB())
128c8497b6a2565046b5e6b5f2ea9dedc62b53dd966Daniel Dunbar      Offset -= getSymbolOffset(&Assembler.getSymbolData(
129c8497b6a2565046b5e6b5f2ea9dedc62b53dd966Daniel Dunbar                                  Target.getSymB()->getSymbol()));
130c8497b6a2565046b5e6b5f2ea9dedc62b53dd966Daniel Dunbar    return Offset;
131c8497b6a2565046b5e6b5f2ea9dedc62b53dd966Daniel Dunbar  }
132c8497b6a2565046b5e6b5f2ea9dedc62b53dd966Daniel Dunbar
133ffd902bfb743f0564c8f7689c49403074b6f694dRafael Espindola  assert(SD->getFragment() && "Invalid getOffset() on undefined symbol!");
134ffd902bfb743f0564c8f7689c49403074b6f694dRafael Espindola  return getFragmentOffset(SD->getFragment()) + SD->getOffset();
135ffd902bfb743f0564c8f7689c49403074b6f694dRafael Espindola}
136ffd902bfb743f0564c8f7689c49403074b6f694dRafael Espindola
1372661f11e4602ad017fa155f6fdcee0a4f2d1ae86Daniel Dunbaruint64_t MCAsmLayout::getSectionAddressSize(const MCSectionData *SD) const {
138afc6acdab7ba3544d76329ab461f14a93cee67a2Daniel Dunbar  // The size is the last fragment's end offset.
1392661f11e4602ad017fa155f6fdcee0a4f2d1ae86Daniel Dunbar  const MCFragment &F = SD->getFragmentList().back();
140f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbach  return getFragmentOffset(&F) + getAssembler().computeFragmentSize(*this, F);
1415d428511ca9607d52a09d3483d0738f483e09934Daniel Dunbar}
1425d428511ca9607d52a09d3483d0738f483e09934Daniel Dunbar
1435d428511ca9607d52a09d3483d0738f483e09934Daniel Dunbaruint64_t MCAsmLayout::getSectionFileSize(const MCSectionData *SD) const {
1442661f11e4602ad017fa155f6fdcee0a4f2d1ae86Daniel Dunbar  // Virtual sections have no file size.
145f2dc4aa562e2478a73fe5aeeeec16b1e496a0642Rafael Espindola  if (SD->getSection().isVirtualSection())
1462661f11e4602ad017fa155f6fdcee0a4f2d1ae86Daniel Dunbar    return 0;
1475d428511ca9607d52a09d3483d0738f483e09934Daniel Dunbar
1482661f11e4602ad017fa155f6fdcee0a4f2d1ae86Daniel Dunbar  // Otherwise, the file size is the same as the address space size.
1492661f11e4602ad017fa155f6fdcee0a4f2d1ae86Daniel Dunbar  return getSectionAddressSize(SD);
150b5844ff1c44f0427bcf132eaece945da411e650fDaniel Dunbar}
1512661f11e4602ad017fa155f6fdcee0a4f2d1ae86Daniel Dunbar
152207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar/* *** */
153207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar
1540705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel DunbarMCFragment::MCFragment() : Kind(FragmentType(~0)) {
1550705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar}
1560705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
15736880e704f63d4c77a3c5a94047b5afdf79e82dbDaniel DunbarMCFragment::~MCFragment() {
15836880e704f63d4c77a3c5a94047b5afdf79e82dbDaniel Dunbar}
15936880e704f63d4c77a3c5a94047b5afdf79e82dbDaniel Dunbar
1605e835967dd5dda294d0ef3392f4c1d4a2260f532Daniel DunbarMCFragment::MCFragment(FragmentType _Kind, MCSectionData *_Parent)
1612bf6afc277edb32b1d940def5b3eb0e0d32a22b9Rafael Espindola  : Kind(_Kind), Parent(_Parent), Atom(0), Offset(~UINT64_C(0))
162fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar{
1635e835967dd5dda294d0ef3392f4c1d4a2260f532Daniel Dunbar  if (Parent)
1645e835967dd5dda294d0ef3392f4c1d4a2260f532Daniel Dunbar    Parent->getFragmentList().push_back(this);
165fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar}
166fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
167fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar/* *** */
168fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
16981e400092f55c2eba157172bfc0dd0df8317638dDaniel DunbarMCSectionData::MCSectionData() : Section(0) {}
170fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
171fb4a6b397665df011348ade24a8e38d2219f095aDaniel DunbarMCSectionData::MCSectionData(const MCSection &_Section, MCAssembler *A)
17281e400092f55c2eba157172bfc0dd0df8317638dDaniel Dunbar  : Section(&_Section),
173f8803fe4177739f9a6900198f601808eb27934d9Rafael Espindola    Ordinal(~UINT32_C(0)),
174fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar    Alignment(1),
175e1ec617c6abf0b9dc1eecbbfe483bda3bb2b7795Daniel Dunbar    HasInstructions(false)
176fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar{
177fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  if (A)
178fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar    A->getSectionList().push_back(this);
179fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar}
180fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
181fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar/* *** */
182fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
183efbb5330b8d383a393c83d2da5d631c98b0bb3fdDaniel DunbarMCSymbolData::MCSymbolData() : Symbol(0) {}
184f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar
185cb579b3338fe8d9e4424b138f597a4696cb89de3Daniel DunbarMCSymbolData::MCSymbolData(const MCSymbol &_Symbol, MCFragment *_Fragment,
186f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar                           uint64_t _Offset, MCAssembler *A)
187efbb5330b8d383a393c83d2da5d631c98b0bb3fdDaniel Dunbar  : Symbol(&_Symbol), Fragment(_Fragment), Offset(_Offset),
1888f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar    IsExternal(false), IsPrivateExtern(false),
1896c8b3d2f1f6fe6eb6a7ae81eab24c1b6db9232aeMatt Fleming    CommonSize(0), SymbolSize(0), CommonAlign(0),
1906c8b3d2f1f6fe6eb6a7ae81eab24c1b6db9232aeMatt Fleming    Flags(0), Index(0)
191f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar{
192f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar  if (A)
193f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar    A->getSymbolList().push_back(this);
194f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar}
195f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar
196f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar/* *** */
197f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar
19878c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan ChengMCAssembler::MCAssembler(MCContext &Context_, MCAsmBackend &Backend_,
199feb7ba3d9abfa1eb89f6da93c51649baaa931ab8Daniel Dunbar                         MCCodeEmitter &Emitter_, MCObjectWriter &Writer_,
200feb7ba3d9abfa1eb89f6da93c51649baaa931ab8Daniel Dunbar                         raw_ostream &OS_)
201feb7ba3d9abfa1eb89f6da93c51649baaa931ab8Daniel Dunbar  : Context(Context_), Backend(Backend_), Emitter(Emitter_), Writer(Writer_),
20296aa78c8c5ef1a5f268539c9edc86569b436d573Rafael Espindola    OS(OS_), RelaxAll(false), NoExecStack(false), SubsectionsViaSymbols(false)
2036009db486e7fba448ccb28dff676c012efade8f0Daniel Dunbar{
2046009db486e7fba448ccb28dff676c012efade8f0Daniel Dunbar}
205fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
206fb4a6b397665df011348ade24a8e38d2219f095aDaniel DunbarMCAssembler::~MCAssembler() {
207fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar}
208fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
209843aa1f15b06fc3c2b39740ffb5bffd2fa6827ceDaniel Dunbarbool MCAssembler::isSymbolLinkerVisible(const MCSymbol &Symbol) const {
210238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar  // Non-temporary labels should always be visible to the linker.
211843aa1f15b06fc3c2b39740ffb5bffd2fa6827ceDaniel Dunbar  if (!Symbol.isTemporary())
212238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar    return true;
213238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar
214238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar  // Absolute temporary labels are never visible.
215843aa1f15b06fc3c2b39740ffb5bffd2fa6827ceDaniel Dunbar  if (!Symbol.isInSection())
216238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar    return false;
217238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar
218238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar  // Otherwise, check if the section requires symbols even for temporary labels.
219843aa1f15b06fc3c2b39740ffb5bffd2fa6827ceDaniel Dunbar  return getBackend().doesSectionRequireSymbols(Symbol.getSection());
220238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar}
221238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar
222b814110612024a092fd884050fbab9d012b16dc7Rafael Espindolaconst MCSymbolData *MCAssembler::getAtom(const MCSymbolData *SD) const {
2238ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar  // Linker visible symbols define atoms.
224843aa1f15b06fc3c2b39740ffb5bffd2fa6827ceDaniel Dunbar  if (isSymbolLinkerVisible(SD->getSymbol()))
2258ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar    return SD;
2268ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar
2278ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar  // Absolute and undefined symbols have no defining atom.
2288ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar  if (!SD->getFragment())
2298ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar    return 0;
2308ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar
231a5f1d57f65ae601ec181c0f4e36cf0df5e8d79d8Daniel Dunbar  // Non-linker visible symbols in sections which can't be atomized have no
232a5f1d57f65ae601ec181c0f4e36cf0df5e8d79d8Daniel Dunbar  // defining atom.
233a5f1d57f65ae601ec181c0f4e36cf0df5e8d79d8Daniel Dunbar  if (!getBackend().isSectionAtomizable(
234a5f1d57f65ae601ec181c0f4e36cf0df5e8d79d8Daniel Dunbar        SD->getFragment()->getParent()->getSection()))
235a5f1d57f65ae601ec181c0f4e36cf0df5e8d79d8Daniel Dunbar    return 0;
236a5f1d57f65ae601ec181c0f4e36cf0df5e8d79d8Daniel Dunbar
237651804c3d63a05f72221a6d133e5b344e6aaa093Daniel Dunbar  // Otherwise, return the atom for the containing fragment.
238651804c3d63a05f72221a6d133e5b344e6aaa093Daniel Dunbar  return SD->getFragment()->getAtom();
2398ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar}
2408ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar
241f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbachbool MCAssembler::evaluateFixup(const MCAsmLayout &Layout,
242c90e30aa6f3792a460202017523171f435e2ba34Daniel Dunbar                                const MCFixup &Fixup, const MCFragment *DF,
243df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar                                MCValue &Target, uint64_t &Value) const {
244f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbach  ++stats::evaluateFixup;
245ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar
24633a38a1b5a35acd15c867193bc2175f3d4e7b83dRafael Espindola  if (!Fixup.getValue()->EvaluateAsRelocatable(Target, Layout))
247f3c936769b948b53a7c03d2d5fca1ef75284f977Jim Grosbach    getContext().FatalError(Fixup.getLoc(), "expected relocatable expression");
248df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar
249fea753b397823c340608925eb7f3256a64a30017Rafael Espindola  bool IsPCRel = Backend.getFixupKindInfo(
250fea753b397823c340608925eb7f3256a64a30017Rafael Espindola    Fixup.getKind()).Flags & MCFixupKindInfo::FKF_IsPCRel;
251fea753b397823c340608925eb7f3256a64a30017Rafael Espindola
252fea753b397823c340608925eb7f3256a64a30017Rafael Espindola  bool IsResolved;
253fea753b397823c340608925eb7f3256a64a30017Rafael Espindola  if (IsPCRel) {
254fea753b397823c340608925eb7f3256a64a30017Rafael Espindola    if (Target.getSymB()) {
255fea753b397823c340608925eb7f3256a64a30017Rafael Espindola      IsResolved = false;
256fea753b397823c340608925eb7f3256a64a30017Rafael Espindola    } else if (!Target.getSymA()) {
257fea753b397823c340608925eb7f3256a64a30017Rafael Espindola      IsResolved = false;
258fea753b397823c340608925eb7f3256a64a30017Rafael Espindola    } else {
259908159b46ae118d36fccbc1d5145dcedfc3d4185Rafael Espindola      const MCSymbolRefExpr *A = Target.getSymA();
260908159b46ae118d36fccbc1d5145dcedfc3d4185Rafael Espindola      const MCSymbol &SA = A->getSymbol();
261908159b46ae118d36fccbc1d5145dcedfc3d4185Rafael Espindola      if (A->getKind() != MCSymbolRefExpr::VK_None ||
262908159b46ae118d36fccbc1d5145dcedfc3d4185Rafael Espindola          SA.AliasedSymbol().isUndefined()) {
263fea753b397823c340608925eb7f3256a64a30017Rafael Espindola        IsResolved = false;
264fea753b397823c340608925eb7f3256a64a30017Rafael Espindola      } else {
265fea753b397823c340608925eb7f3256a64a30017Rafael Espindola        const MCSymbolData &DataA = getSymbolData(SA);
266fea753b397823c340608925eb7f3256a64a30017Rafael Espindola        IsResolved =
267fea753b397823c340608925eb7f3256a64a30017Rafael Espindola          getWriter().IsSymbolRefDifferenceFullyResolvedImpl(*this, DataA,
268fea753b397823c340608925eb7f3256a64a30017Rafael Espindola                                                             *DF, false, true);
269fea753b397823c340608925eb7f3256a64a30017Rafael Espindola      }
270fea753b397823c340608925eb7f3256a64a30017Rafael Espindola    }
271fea753b397823c340608925eb7f3256a64a30017Rafael Espindola  } else {
272fea753b397823c340608925eb7f3256a64a30017Rafael Espindola    IsResolved = Target.isAbsolute();
273fea753b397823c340608925eb7f3256a64a30017Rafael Espindola  }
274df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar
275df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar  Value = Target.getConstant();
276df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar
2779a1d20042f6a6ec648a3588f9b13264a4570aab0Daniel Dunbar  if (const MCSymbolRefExpr *A = Target.getSymA()) {
27894ed5fca3f5ab5acb74e70b8393b837131e7110cRafael Espindola    const MCSymbol &Sym = A->getSymbol().AliasedSymbol();
27994ed5fca3f5ab5acb74e70b8393b837131e7110cRafael Espindola    if (Sym.isDefined())
28085f2ecc697a8ca6c8cf08093054cbbb9d2060ccfRafael Espindola      Value += Layout.getSymbolOffset(&getSymbolData(Sym));
281df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar  }
2829a1d20042f6a6ec648a3588f9b13264a4570aab0Daniel Dunbar  if (const MCSymbolRefExpr *B = Target.getSymB()) {
28394ed5fca3f5ab5acb74e70b8393b837131e7110cRafael Espindola    const MCSymbol &Sym = B->getSymbol().AliasedSymbol();
28494ed5fca3f5ab5acb74e70b8393b837131e7110cRafael Espindola    if (Sym.isDefined())
28585f2ecc697a8ca6c8cf08093054cbbb9d2060ccfRafael Espindola      Value -= Layout.getSymbolOffset(&getSymbolData(Sym));
286939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  }
287df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar
288df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar
2892761fc427082215c2affcc9d8db8491400bc9e5dDaniel Dunbar  bool ShouldAlignPC = Backend.getFixupKindInfo(Fixup.getKind()).Flags &
29047dbd429daefa9b3f19347194ddfb6f69642465eOwen Anderson                         MCFixupKindInfo::FKF_IsAlignedDownTo32Bits;
29147dbd429daefa9b3f19347194ddfb6f69642465eOwen Anderson  assert((ShouldAlignPC ? IsPCRel : true) &&
29247dbd429daefa9b3f19347194ddfb6f69642465eOwen Anderson    "FKF_IsAlignedDownTo32Bits is only allowed on PC-relative fixups!");
29347dbd429daefa9b3f19347194ddfb6f69642465eOwen Anderson
29405018c2f2872a05b1a2fff1a9934621ba1f38084Owen Anderson  if (IsPCRel) {
295175fb36f101a20df10db90bfe4d0c44a7d05325bOwen Anderson    uint32_t Offset = Layout.getFragmentOffset(DF) + Fixup.getOffset();
296684457d179fcfdf8c1f8ee9f66cc40665ecc648cJim Grosbach
29747dbd429daefa9b3f19347194ddfb6f69642465eOwen Anderson    // A number of ARM fixups in Thumb mode require that the effective PC
29847dbd429daefa9b3f19347194ddfb6f69642465eOwen Anderson    // address be determined as the 32-bit aligned version of the actual offset.
299d18e011cbb3df090166d9f49aa51fda077f09fcdOwen Anderson    if (ShouldAlignPC) Offset &= ~0x3;
300175fb36f101a20df10db90bfe4d0c44a7d05325bOwen Anderson    Value -= Offset;
30105018c2f2872a05b1a2fff1a9934621ba1f38084Owen Anderson  }
302df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar
3037b25ecf6adbf3c4709c48033acfeb6ebbb4452abJim Grosbach  // Let the backend adjust the fixup value if necessary, including whether
3047b25ecf6adbf3c4709c48033acfeb6ebbb4452abJim Grosbach  // we need a relocation.
3057b25ecf6adbf3c4709c48033acfeb6ebbb4452abJim Grosbach  Backend.processFixupValue(*this, Layout, Fixup, DF, Target, Value,
3067b25ecf6adbf3c4709c48033acfeb6ebbb4452abJim Grosbach                            IsResolved);
307475002078848d102b6577fe7283464c039b38af6Jim Grosbach
308df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar  return IsResolved;
309df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar}
310df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar
311f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbachuint64_t MCAssembler::computeFragmentSize(const MCAsmLayout &Layout,
3127a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola                                          const MCFragment &F) const {
313f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar  switch (F.getKind()) {
3142c18d3b0fec25b2b7befc7ac5751e84005f4a869Daniel Dunbar  case MCFragment::FT_Data:
3152c18d3b0fec25b2b7befc7ac5751e84005f4a869Daniel Dunbar    return cast<MCDataFragment>(F).getContents().size();
3162c18d3b0fec25b2b7befc7ac5751e84005f4a869Daniel Dunbar  case MCFragment::FT_Fill:
3172c18d3b0fec25b2b7befc7ac5751e84005f4a869Daniel Dunbar    return cast<MCFillFragment>(F).getSize();
3182c18d3b0fec25b2b7befc7ac5751e84005f4a869Daniel Dunbar  case MCFragment::FT_Inst:
3192c18d3b0fec25b2b7befc7ac5751e84005f4a869Daniel Dunbar    return cast<MCInstFragment>(F).getInstSize();
3202c18d3b0fec25b2b7befc7ac5751e84005f4a869Daniel Dunbar
3213ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  case MCFragment::FT_LEB:
322db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola    return cast<MCLEBFragment>(F).getContents().size();
3233ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola
3247a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola  case MCFragment::FT_Align: {
3257a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola    const MCAlignFragment &AF = cast<MCAlignFragment>(F);
3267a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola    unsigned Offset = Layout.getFragmentOffset(&AF);
3277a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola    unsigned Size = OffsetToAlignment(Offset, AF.getAlignment());
32815b7a98ece81ec275a560c77b814e0479a669bc6Owen Anderson    // If we are padding with nops, force the padding to be larger than the
32915b7a98ece81ec275a560c77b814e0479a669bc6Owen Anderson    // minimum nop size.
33015b7a98ece81ec275a560c77b814e0479a669bc6Owen Anderson    if (Size > 0 && AF.hasEmitNops()) {
33115b7a98ece81ec275a560c77b814e0479a669bc6Owen Anderson      while (Size % getBackend().getMinimumNopSize())
33215b7a98ece81ec275a560c77b814e0479a669bc6Owen Anderson        Size += AF.getAlignment();
33315b7a98ece81ec275a560c77b814e0479a669bc6Owen Anderson    }
3347a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola    if (Size > AF.getMaxBytesToEmit())
3357a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola      return 0;
3367a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola    return Size;
3377a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola  }
338f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar
3397a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola  case MCFragment::FT_Org: {
3407a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola    MCOrgFragment &OF = cast<MCOrgFragment>(F);
3417a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola    int64_t TargetLocation;
3427a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola    if (!OF.getOffset().EvaluateAsAbsolute(TargetLocation, Layout))
3437a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola      report_fatal_error("expected assembly-time absolute expression");
3447a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola
3457a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola    // FIXME: We need a way to communicate this error.
3467a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola    uint64_t FragmentOffset = Layout.getFragmentOffset(&OF);
3477a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola    int64_t Size = TargetLocation - FragmentOffset;
3487a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola    if (Size < 0 || Size >= 0x40000000)
3497a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola      report_fatal_error("invalid .org offset '" + Twine(TargetLocation) +
3507a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola                         "' (at offset '" + Twine(FragmentOffset) + "')");
3517a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola    return Size;
3527a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola  }
353c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby
354187d8339dbc0530850e54a86edf36f1a865a5823Rafael Espindola  case MCFragment::FT_Dwarf:
355db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola    return cast<MCDwarfLineAddrFragment>(F).getContents().size();
356245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  case MCFragment::FT_DwarfFrame:
357245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola    return cast<MCDwarfCallFrameFragment>(F).getContents().size();
358f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar  }
359f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar
360858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper  llvm_unreachable("invalid fragment kind");
3612c18d3b0fec25b2b7befc7ac5751e84005f4a869Daniel Dunbar}
3622c18d3b0fec25b2b7befc7ac5751e84005f4a869Daniel Dunbar
363b69fc044db8c193348b6611f46432bb21b3cbe90Daniel Dunbarvoid MCAsmLayout::LayoutFragment(MCFragment *F) {
3649005d45a990ef46f06800bd6bd6a7d1298a33645Daniel Dunbar  MCFragment *Prev = F->getPrevNode();
3659005d45a990ef46f06800bd6bd6a7d1298a33645Daniel Dunbar
3669005d45a990ef46f06800bd6bd6a7d1298a33645Daniel Dunbar  // We should never try to recompute something which is up-to-date.
3679005d45a990ef46f06800bd6bd6a7d1298a33645Daniel Dunbar  assert(!isFragmentUpToDate(F) && "Attempt to recompute up-to-date fragment!");
3689005d45a990ef46f06800bd6bd6a7d1298a33645Daniel Dunbar  // We should never try to compute the fragment layout if it's predecessor
3699005d45a990ef46f06800bd6bd6a7d1298a33645Daniel Dunbar  // isn't up-to-date.
3709005d45a990ef46f06800bd6bd6a7d1298a33645Daniel Dunbar  assert((!Prev || isFragmentUpToDate(Prev)) &&
3719005d45a990ef46f06800bd6bd6a7d1298a33645Daniel Dunbar         "Attempt to compute fragment before it's predecessor!");
3722c18d3b0fec25b2b7befc7ac5751e84005f4a869Daniel Dunbar
3732c18d3b0fec25b2b7befc7ac5751e84005f4a869Daniel Dunbar  ++stats::FragmentLayouts;
3742c18d3b0fec25b2b7befc7ac5751e84005f4a869Daniel Dunbar
37585f2ecc697a8ca6c8cf08093054cbbb9d2060ccfRafael Espindola  // Compute fragment offset and size.
37685f2ecc697a8ca6c8cf08093054cbbb9d2060ccfRafael Espindola  uint64_t Offset = 0;
3779005d45a990ef46f06800bd6bd6a7d1298a33645Daniel Dunbar  if (Prev)
378f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbach    Offset += Prev->Offset + getAssembler().computeFragmentSize(*this, *Prev);
3799005d45a990ef46f06800bd6bd6a7d1298a33645Daniel Dunbar
38085f2ecc697a8ca6c8cf08093054cbbb9d2060ccfRafael Espindola  F->Offset = Offset;
3814f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola  LastValidFragment[F->getParent()] = F;
3820705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar}
3830705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
38453b2338a1d061ad15a858ff0d641431f4d4ac101Daniel Dunbar/// WriteFragmentData - Write the \arg F data to the output file.
385432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbarstatic void WriteFragmentData(const MCAssembler &Asm, const MCAsmLayout &Layout,
3865d2477cecf53bef911f57423a5cecb743d4286faDaniel Dunbar                              const MCFragment &F) {
3875d2477cecf53bef911f57423a5cecb743d4286faDaniel Dunbar  MCObjectWriter *OW = &Asm.getWriter();
38853b2338a1d061ad15a858ff0d641431f4d4ac101Daniel Dunbar  uint64_t Start = OW->getStream().tell();
3890705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  (void) Start;
3907eb85194f2b07bc7ba3f274fc00dc389b77b63bfDaniel Dunbar
391ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar  ++stats::EmittedFragments;
3920adcd35f78b89bf70eb634b7f9ac2103516ca2b2Daniel Dunbar
3930705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  // FIXME: Embed in fragments instead?
394f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbach  uint64_t FragmentSize = Asm.computeFragmentSize(Layout, F);
3950705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  switch (F.getKind()) {
396d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar  case MCFragment::FT_Align: {
397d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    MCAlignFragment &AF = cast<MCAlignFragment>(F);
398432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar    uint64_t Count = FragmentSize / AF.getValueSize();
399d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar
400e73d49eda2cb4fc30b52c4a241acf69c8af98302Daniel Dunbar    assert(AF.getValueSize() && "Invalid virtual align in concrete fragment!");
401e73d49eda2cb4fc30b52c4a241acf69c8af98302Daniel Dunbar
402d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    // FIXME: This error shouldn't actually occur (the front end should emit
403d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    // multiple .align directives to enforce the semantics it wants), but is
404d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    // severe enough that we want to report it. How to handle this?
405432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar    if (Count * AF.getValueSize() != FragmentSize)
40675361b69f3f327842b9dad69fa7f28ae3b688412Chris Lattner      report_fatal_error("undefined .align directive, value size '" +
4077eb85194f2b07bc7ba3f274fc00dc389b77b63bfDaniel Dunbar                        Twine(AF.getValueSize()) +
408d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar                        "' is not a divisor of padding size '" +
409432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar                        Twine(FragmentSize) + "'");
410d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar
4116e72048add2a6464e038121c6c275da37528aa0aKevin Enderby    // See if we are aligning with nops, and if so do that first to try to fill
4126e72048add2a6464e038121c6c275da37528aa0aKevin Enderby    // the Count bytes.  Then if that did not fill any bytes or there are any
413c8e41c591741b3da1077f7000274ad040bef8002Sylvestre Ledru    // bytes left to fill use the Value and ValueSize to fill the rest.
4148f9b80e5df12779a56d763ebf20864dad2bc72daDaniel Dunbar    // If we are aligning with nops, ask that target to emit the right data.
4151c15413ebc8f4a35545a381a789a718627396d03Daniel Dunbar    if (AF.hasEmitNops()) {
416ec3433852dd11e8ff60c9610b4c84468e5935f2bJim Grosbach      if (!Asm.getBackend().writeNopData(Count, OW))
41775361b69f3f327842b9dad69fa7f28ae3b688412Chris Lattner        report_fatal_error("unable to write nop sequence of " +
4188f9b80e5df12779a56d763ebf20864dad2bc72daDaniel Dunbar                          Twine(Count) + " bytes");
4198f9b80e5df12779a56d763ebf20864dad2bc72daDaniel Dunbar      break;
4206e72048add2a6464e038121c6c275da37528aa0aKevin Enderby    }
4216e72048add2a6464e038121c6c275da37528aa0aKevin Enderby
4228f9b80e5df12779a56d763ebf20864dad2bc72daDaniel Dunbar    // Otherwise, write out in multiples of the value size.
423d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    for (uint64_t i = 0; i != Count; ++i) {
424d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar      switch (AF.getValueSize()) {
425858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper      default: llvm_unreachable("Invalid size!");
426bdd9281f356d326155dc2ca5585a708e09e90600Daniel Dunbar      case 1: OW->Write8 (uint8_t (AF.getValue())); break;
427bdd9281f356d326155dc2ca5585a708e09e90600Daniel Dunbar      case 2: OW->Write16(uint16_t(AF.getValue())); break;
428bdd9281f356d326155dc2ca5585a708e09e90600Daniel Dunbar      case 4: OW->Write32(uint32_t(AF.getValue())); break;
429bdd9281f356d326155dc2ca5585a708e09e90600Daniel Dunbar      case 8: OW->Write64(uint64_t(AF.getValue())); break;
430d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar      }
431d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    }
432d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    break;
433d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar  }
4340705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
4353a30b827a5c9bf0ed8f31177b6e447083ce9afecDaniel Dunbar  case MCFragment::FT_Data: {
4363f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar    MCDataFragment &DF = cast<MCDataFragment>(F);
437432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar    assert(FragmentSize == DF.getContents().size() && "Invalid size!");
4383f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar    OW->WriteBytes(DF.getContents().str());
4390705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar    break;
4403a30b827a5c9bf0ed8f31177b6e447083ce9afecDaniel Dunbar  }
4410705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
4420705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  case MCFragment::FT_Fill: {
4430705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar    MCFillFragment &FF = cast<MCFillFragment>(F);
444e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar
445e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar    assert(FF.getValueSize() && "Invalid virtual align in concrete fragment!");
446e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar
4473153fec733acd079a9e681d16d39253b9517e02cDaniel Dunbar    for (uint64_t i = 0, e = FF.getSize() / FF.getValueSize(); i != e; ++i) {
4480705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar      switch (FF.getValueSize()) {
449858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper      default: llvm_unreachable("Invalid size!");
450bdd9281f356d326155dc2ca5585a708e09e90600Daniel Dunbar      case 1: OW->Write8 (uint8_t (FF.getValue())); break;
451bdd9281f356d326155dc2ca5585a708e09e90600Daniel Dunbar      case 2: OW->Write16(uint16_t(FF.getValue())); break;
452bdd9281f356d326155dc2ca5585a708e09e90600Daniel Dunbar      case 4: OW->Write32(uint32_t(FF.getValue())); break;
453bdd9281f356d326155dc2ca5585a708e09e90600Daniel Dunbar      case 8: OW->Write64(uint64_t(FF.getValue())); break;
4540705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar      }
4550705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar    }
4560705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar    break;
4570705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  }
4587eb85194f2b07bc7ba3f274fc00dc389b77b63bfDaniel Dunbar
459179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola  case MCFragment::FT_Inst: {
460179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola    MCInstFragment &IF = cast<MCInstFragment>(F);
461179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola    OW->WriteBytes(StringRef(IF.getCode().begin(), IF.getCode().size()));
4623f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar    break;
463179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola  }
4643f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar
4653ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  case MCFragment::FT_LEB: {
4663ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola    MCLEBFragment &LF = cast<MCLEBFragment>(F);
467db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola    OW->WriteBytes(LF.getContents().str());
4683ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola    break;
4693ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  }
4703ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola
471d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar  case MCFragment::FT_Org: {
472d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    MCOrgFragment &OF = cast<MCOrgFragment>(F);
473d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar
474432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar    for (uint64_t i = 0, e = FragmentSize; i != e; ++i)
475bdd9281f356d326155dc2ca5585a708e09e90600Daniel Dunbar      OW->Write8(uint8_t(OF.getValue()));
476d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar
477d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    break;
478d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar  }
479c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby
480c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby  case MCFragment::FT_Dwarf: {
481c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby    const MCDwarfLineAddrFragment &OF = cast<MCDwarfLineAddrFragment>(F);
482db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola    OW->WriteBytes(OF.getContents().str());
483c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby    break;
484c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby  }
485245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  case MCFragment::FT_DwarfFrame: {
486245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola    const MCDwarfCallFrameFragment &CF = cast<MCDwarfCallFrameFragment>(F);
487245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola    OW->WriteBytes(CF.getContents().str());
488245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola    break;
489245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  }
4900705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  }
4910705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
492432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar  assert(OW->getStream().tell() - Start == FragmentSize);
4930705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar}
4940705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
495f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbachvoid MCAssembler::writeSectionData(const MCSectionData *SD,
4965d2477cecf53bef911f57423a5cecb743d4286faDaniel Dunbar                                   const MCAsmLayout &Layout) const {
497d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar  // Ignore virtual sections.
498f2dc4aa562e2478a73fe5aeeeec16b1e496a0642Rafael Espindola  if (SD->getSection().isVirtualSection()) {
499054be92e1da7015190377d6bade57196f28cf33aDaniel Dunbar    assert(Layout.getSectionFileSize(SD) == 0 && "Invalid size for section!");
500e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar
501e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar    // Check that contents are only things legal inside a virtual section.
502e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar    for (MCSectionData::const_iterator it = SD->begin(),
503e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar           ie = SD->end(); it != ie; ++it) {
504e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar      switch (it->getKind()) {
505858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper      default: llvm_unreachable("Invalid fragment in virtual section!");
506c983b20661d574b7adb2675478210c03ad1d0a33Daniel Dunbar      case MCFragment::FT_Data: {
507c983b20661d574b7adb2675478210c03ad1d0a33Daniel Dunbar        // Check that we aren't trying to write a non-zero contents (or fixups)
508c983b20661d574b7adb2675478210c03ad1d0a33Daniel Dunbar        // into a virtual section. This is to support clients which use standard
509c983b20661d574b7adb2675478210c03ad1d0a33Daniel Dunbar        // directives to fill the contents of virtual sections.
510c983b20661d574b7adb2675478210c03ad1d0a33Daniel Dunbar        MCDataFragment &DF = cast<MCDataFragment>(*it);
511c983b20661d574b7adb2675478210c03ad1d0a33Daniel Dunbar        assert(DF.fixup_begin() == DF.fixup_end() &&
512c983b20661d574b7adb2675478210c03ad1d0a33Daniel Dunbar               "Cannot have fixups in virtual section!");
513c983b20661d574b7adb2675478210c03ad1d0a33Daniel Dunbar        for (unsigned i = 0, e = DF.getContents().size(); i != e; ++i)
514c983b20661d574b7adb2675478210c03ad1d0a33Daniel Dunbar          assert(DF.getContents()[i] == 0 &&
515c983b20661d574b7adb2675478210c03ad1d0a33Daniel Dunbar                 "Invalid data value for virtual section!");
516c983b20661d574b7adb2675478210c03ad1d0a33Daniel Dunbar        break;
517c983b20661d574b7adb2675478210c03ad1d0a33Daniel Dunbar      }
518e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar      case MCFragment::FT_Align:
519c983b20661d574b7adb2675478210c03ad1d0a33Daniel Dunbar        // Check that we aren't trying to write a non-zero value into a virtual
520c983b20661d574b7adb2675478210c03ad1d0a33Daniel Dunbar        // section.
521c983b20661d574b7adb2675478210c03ad1d0a33Daniel Dunbar        assert((!cast<MCAlignFragment>(it)->getValueSize() ||
522c983b20661d574b7adb2675478210c03ad1d0a33Daniel Dunbar                !cast<MCAlignFragment>(it)->getValue()) &&
523e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar               "Invalid align in virtual section!");
524e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar        break;
525e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar      case MCFragment::FT_Fill:
526e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar        assert(!cast<MCFillFragment>(it)->getValueSize() &&
527e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar               "Invalid fill in virtual section!");
528e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar        break;
529e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar      }
530e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar    }
531e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar
532d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar    return;
533d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar  }
534d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar
5355d2477cecf53bef911f57423a5cecb743d4286faDaniel Dunbar  uint64_t Start = getWriter().getStream().tell();
5360705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  (void) Start;
5377eb85194f2b07bc7ba3f274fc00dc389b77b63bfDaniel Dunbar
53853b2338a1d061ad15a858ff0d641431f4d4ac101Daniel Dunbar  for (MCSectionData::const_iterator it = SD->begin(),
53953b2338a1d061ad15a858ff0d641431f4d4ac101Daniel Dunbar         ie = SD->end(); it != ie; ++it)
5405d2477cecf53bef911f57423a5cecb743d4286faDaniel Dunbar    WriteFragmentData(*this, Layout, *it);
5410705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
5425d2477cecf53bef911f57423a5cecb743d4286faDaniel Dunbar  assert(getWriter().getStream().tell() - Start ==
5435d2477cecf53bef911f57423a5cecb743d4286faDaniel Dunbar         Layout.getSectionAddressSize(SD));
5440705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar}
5450705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
546179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola
547f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbachuint64_t MCAssembler::handleFixup(const MCAsmLayout &Layout,
5485d2477cecf53bef911f57423a5cecb743d4286faDaniel Dunbar                                  MCFragment &F,
5495d2477cecf53bef911f57423a5cecb743d4286faDaniel Dunbar                                  const MCFixup &Fixup) {
550179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola   // Evaluate the fixup.
551179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola   MCValue Target;
552179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola   uint64_t FixedValue;
553f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbach   if (!evaluateFixup(Layout, Fixup, &F, Target, FixedValue)) {
554179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola     // The fixup was unresolved, we need a relocation. Inform the object
555179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola     // writer of the relocation, and give it an opportunity to adjust the
556179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola     // fixup value if need be.
5575d2477cecf53bef911f57423a5cecb743d4286faDaniel Dunbar     getWriter().RecordRelocation(*this, Layout, &F, Fixup, Target, FixedValue);
558179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola   }
559179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola   return FixedValue;
560179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola }
561179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola
562feb7ba3d9abfa1eb89f6da93c51649baaa931ab8Daniel Dunbarvoid MCAssembler::Finish() {
563b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  DEBUG_WITH_TYPE("mc-dump", {
564b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar      llvm::errs() << "assembler backend - pre-layout\n--\n";
565b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar      dump(); });
566b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
56761066dbdf2f035e146c11a40d4cf6531cf2dfd6cDaniel Dunbar  // Create the layout object.
5688d39eb47d6a15d36be7ac0d0154a6897e42f5adcDaniel Dunbar  MCAsmLayout Layout(*this);
56961066dbdf2f035e146c11a40d4cf6531cf2dfd6cDaniel Dunbar
570337718e09c99349939a53643984c04f5dc118bb7Daniel Dunbar  // Create dummy fragments and assign section ordinals.
57149ed9211905ec586f1d23a7f337d335ae63b4635Daniel Dunbar  unsigned SectionIndex = 0;
57249ed9211905ec586f1d23a7f337d335ae63b4635Daniel Dunbar  for (MCAssembler::iterator it = begin(), ie = end(); it != ie; ++it) {
57349ed9211905ec586f1d23a7f337d335ae63b4635Daniel Dunbar    // Create dummy fragments to eliminate any empty sections, this simplifies
57449ed9211905ec586f1d23a7f337d335ae63b4635Daniel Dunbar    // layout.
5756f74f69ff4a6e365272a754f0984c0321755976dDuncan Sands    if (it->getFragmentList().empty())
576d80781b98b771d370730ab7c630018f23e202b57Rafael Espindola      new MCDataFragment(it);
57749ed9211905ec586f1d23a7f337d335ae63b4635Daniel Dunbar
57849ed9211905ec586f1d23a7f337d335ae63b4635Daniel Dunbar    it->setOrdinal(SectionIndex++);
579337718e09c99349939a53643984c04f5dc118bb7Daniel Dunbar  }
58049ed9211905ec586f1d23a7f337d335ae63b4635Daniel Dunbar
581337718e09c99349939a53643984c04f5dc118bb7Daniel Dunbar  // Assign layout order indices to sections and fragments.
582337718e09c99349939a53643984c04f5dc118bb7Daniel Dunbar  for (unsigned i = 0, e = Layout.getSectionOrder().size(); i != e; ++i) {
583337718e09c99349939a53643984c04f5dc118bb7Daniel Dunbar    MCSectionData *SD = Layout.getSectionOrder()[i];
584337718e09c99349939a53643984c04f5dc118bb7Daniel Dunbar    SD->setLayoutOrder(i);
585337718e09c99349939a53643984c04f5dc118bb7Daniel Dunbar
5864f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola    unsigned FragmentIndex = 0;
587337718e09c99349939a53643984c04f5dc118bb7Daniel Dunbar    for (MCSectionData::iterator it2 = SD->begin(),
588337718e09c99349939a53643984c04f5dc118bb7Daniel Dunbar           ie2 = SD->end(); it2 != ie2; ++it2)
589337718e09c99349939a53643984c04f5dc118bb7Daniel Dunbar      it2->setLayoutOrder(FragmentIndex++);
59049ed9211905ec586f1d23a7f337d335ae63b4635Daniel Dunbar  }
59149ed9211905ec586f1d23a7f337d335ae63b4635Daniel Dunbar
59261066dbdf2f035e146c11a40d4cf6531cf2dfd6cDaniel Dunbar  // Layout until everything fits.
593f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbach  while (layoutOnce(Layout))
594f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar    continue;
595f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar
596f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar  DEBUG_WITH_TYPE("mc-dump", {
5973f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar      llvm::errs() << "assembler backend - post-relaxation\n--\n";
5983f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar      dump(); });
5993f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar
6003f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  // Finalize the layout, including fragment lowering.
601f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbach  finishLayout(Layout);
6023f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar
6033f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  DEBUG_WITH_TYPE("mc-dump", {
6043f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar      llvm::errs() << "assembler backend - final-layout\n--\n";
605f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar      dump(); });
606f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar
607ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar  uint64_t StartOffset = OS.tell();
608c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner
609bacba997782f624d3c43591a913b8f1e3d733a52Daniel Dunbar  // Allow the object writer a chance to perform post-layout binding (for
610bacba997782f624d3c43591a913b8f1e3d733a52Daniel Dunbar  // example, to set the index fields in the symbol data).
6115d2477cecf53bef911f57423a5cecb743d4286faDaniel Dunbar  getWriter().ExecutePostLayoutBinding(*this, Layout);
612bacba997782f624d3c43591a913b8f1e3d733a52Daniel Dunbar
613b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar  // Evaluate and apply the fixups, generating relocation entries as necessary.
614b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar  for (MCAssembler::iterator it = begin(), ie = end(); it != ie; ++it) {
615b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar    for (MCSectionData::iterator it2 = it->begin(),
616b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar           ie2 = it->end(); it2 != ie2; ++it2) {
617b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar      MCDataFragment *DF = dyn_cast<MCDataFragment>(it2);
618179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola      if (DF) {
619179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola        for (MCDataFragment::fixup_iterator it3 = DF->fixup_begin(),
620179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola               ie3 = DF->fixup_end(); it3 != ie3; ++it3) {
621179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola          MCFixup &Fixup = *it3;
622f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbach          uint64_t FixedValue = handleFixup(Layout, *DF, Fixup);
623ec3433852dd11e8ff60c9610b4c84468e5935f2bJim Grosbach          getBackend().applyFixup(Fixup, DF->getContents().data(),
624179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola                                  DF->getContents().size(), FixedValue);
625179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola        }
626179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola      }
627179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola      MCInstFragment *IF = dyn_cast<MCInstFragment>(it2);
628179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola      if (IF) {
629179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola        for (MCInstFragment::fixup_iterator it3 = IF->fixup_begin(),
630179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola               ie3 = IF->fixup_end(); it3 != ie3; ++it3) {
631179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola          MCFixup &Fixup = *it3;
632f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbach          uint64_t FixedValue = handleFixup(Layout, *IF, Fixup);
633ec3433852dd11e8ff60c9610b4c84468e5935f2bJim Grosbach          getBackend().applyFixup(Fixup, IF->getCode().data(),
634179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola                                  IF->getCode().size(), FixedValue);
635b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar        }
636b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar      }
637b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar    }
638b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar  }
639b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar
640bacba997782f624d3c43591a913b8f1e3d733a52Daniel Dunbar  // Write the object file.
6415d2477cecf53bef911f57423a5cecb743d4286faDaniel Dunbar  getWriter().WriteObject(*this, Layout);
642ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar
643ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar  stats::ObjectBytes += OS.tell() - StartOffset;
644f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar}
645f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar
646f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbachbool MCAssembler::fixupNeedsRelaxation(const MCFixup &Fixup,
647370b78d795154899a22ca2b4674e890661ff1d59Jim Grosbach                                       const MCInstFragment *DF,
6488d39eb47d6a15d36be7ac0d0154a6897e42f5adcDaniel Dunbar                                       const MCAsmLayout &Layout) const {
649ac2884a717daf3ad2aa8425320795d661e8a980bDaniel Dunbar  if (getRelaxAll())
650ac2884a717daf3ad2aa8425320795d661e8a980bDaniel Dunbar    return true;
651ac2884a717daf3ad2aa8425320795d661e8a980bDaniel Dunbar
652f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar  // If we cannot resolve the fixup value, it requires relaxation.
653f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar  MCValue Target;
654f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar  uint64_t Value;
655f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbach  if (!evaluateFixup(Layout, Fixup, DF, Target, Value))
656f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar    return true;
657f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar
658370b78d795154899a22ca2b4674e890661ff1d59Jim Grosbach  return getBackend().fixupNeedsRelaxation(Fixup, Value, DF, Layout);
659f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar}
660f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar
661f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbachbool MCAssembler::fragmentNeedsRelaxation(const MCInstFragment *IF,
662d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar                                          const MCAsmLayout &Layout) const {
663d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar  // If this inst doesn't ever need relaxation, ignore it. This occurs when we
664d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar  // are intentionally pushing out inst fragments, or because we relaxed a
665d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar  // previous instruction to one that doesn't need relaxation.
666ec3433852dd11e8ff60c9610b4c84468e5935f2bJim Grosbach  if (!getBackend().mayNeedRelaxation(IF->getInst()))
667d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar    return false;
668d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar
669d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar  for (MCInstFragment::const_fixup_iterator it = IF->fixup_begin(),
670d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar         ie = IF->fixup_end(); it != ie; ++it)
671f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbach    if (fixupNeedsRelaxation(*it, IF, Layout))
672d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      return true;
673d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar
674d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar  return false;
675d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar}
676d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar
677f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbachbool MCAssembler::relaxInstruction(MCAsmLayout &Layout,
6783ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola                                   MCInstFragment &IF) {
679f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbach  if (!fragmentNeedsRelaxation(&IF, Layout))
6803ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola    return false;
6813ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola
6823ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  ++stats::RelaxedInstructions;
6833ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola
6843ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  // FIXME-PERF: We could immediately lower out instructions if we can tell
6853ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  // they are fully resolved, to avoid retesting on later passes.
6863ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola
6873ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  // Relax the fragment.
6883ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola
6893ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  MCInst Relaxed;
690ec3433852dd11e8ff60c9610b4c84468e5935f2bJim Grosbach  getBackend().relaxInstruction(IF.getInst(), Relaxed);
6913ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola
6923ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  // Encode the new instruction.
6933ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  //
6943ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  // FIXME-PERF: If it matters, we could let the target do this. It can
6953ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  // probably do so more efficiently in many cases.
6963ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  SmallVector<MCFixup, 4> Fixups;
6973ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  SmallString<256> Code;
6983ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  raw_svector_ostream VecOS(Code);
6993ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  getEmitter().EncodeInstruction(Relaxed, VecOS, Fixups);
7003ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  VecOS.flush();
7013ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola
7023ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  // Update the instruction fragment.
7033ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  IF.setInst(Relaxed);
7043ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  IF.getCode() = Code;
7053ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  IF.getFixups().clear();
7063ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  // FIXME: Eliminate copy.
7073ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  for (unsigned i = 0, e = Fixups.size(); i != e; ++i)
7083ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola    IF.getFixups().push_back(Fixups[i]);
7093ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola
7103ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  return true;
7113ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola}
7123ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola
713f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbachbool MCAssembler::relaxLEB(MCAsmLayout &Layout, MCLEBFragment &LF) {
714db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola  int64_t Value = 0;
715db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola  uint64_t OldSize = LF.getContents().size();
716d88cac0a6e908a366f403b37725e765604bc15d3Rafael Espindola  bool IsAbs = LF.getValue().EvaluateAsAbsolute(Value, Layout);
717d88cac0a6e908a366f403b37725e765604bc15d3Rafael Espindola  (void)IsAbs;
718d88cac0a6e908a366f403b37725e765604bc15d3Rafael Espindola  assert(IsAbs);
719db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola  SmallString<8> &Data = LF.getContents();
720db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola  Data.clear();
721db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola  raw_svector_ostream OSE(Data);
7223ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  if (LF.isSigned())
7232d39a0e52df9ce050bd4e2de3a2ecca8fd9a87c3Jim Grosbach    encodeSLEB128(Value, OSE);
7243ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  else
7252d39a0e52df9ce050bd4e2de3a2ecca8fd9a87c3Jim Grosbach    encodeULEB128(Value, OSE);
726db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola  OSE.flush();
727db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola  return OldSize != LF.getContents().size();
7283ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola}
7293ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola
730f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbachbool MCAssembler::relaxDwarfLineAddr(MCAsmLayout &Layout,
731f68a26b5d8e06a85edba97702884a74673b60807Jim Grosbach                                     MCDwarfLineAddrFragment &DF) {
732db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola  int64_t AddrDelta = 0;
733db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola  uint64_t OldSize = DF.getContents().size();
734835439a397407e421263bd476e5b18bf787ffb6aRafael Espindola  bool IsAbs = DF.getAddrDelta().EvaluateAsAbsolute(AddrDelta, Layout);
735835439a397407e421263bd476e5b18bf787ffb6aRafael Espindola  (void)IsAbs;
736835439a397407e421263bd476e5b18bf787ffb6aRafael Espindola  assert(IsAbs);
737187d8339dbc0530850e54a86edf36f1a865a5823Rafael Espindola  int64_t LineDelta;
738187d8339dbc0530850e54a86edf36f1a865a5823Rafael Espindola  LineDelta = DF.getLineDelta();
739db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola  SmallString<8> &Data = DF.getContents();
740db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola  Data.clear();
741db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola  raw_svector_ostream OSE(Data);
742db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola  MCDwarfLineAddr::Encode(LineDelta, AddrDelta, OSE);
743db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola  OSE.flush();
744db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola  return OldSize != Data.size();
745187d8339dbc0530850e54a86edf36f1a865a5823Rafael Espindola}
746187d8339dbc0530850e54a86edf36f1a865a5823Rafael Espindola
747f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbachbool MCAssembler::relaxDwarfCallFrameFragment(MCAsmLayout &Layout,
748245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola                                              MCDwarfCallFrameFragment &DF) {
749245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  int64_t AddrDelta = 0;
750245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  uint64_t OldSize = DF.getContents().size();
751245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  bool IsAbs = DF.getAddrDelta().EvaluateAsAbsolute(AddrDelta, Layout);
752245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  (void)IsAbs;
753245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  assert(IsAbs);
754245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  SmallString<8> &Data = DF.getContents();
755245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  Data.clear();
756245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  raw_svector_ostream OSE(Data);
7574eafe109459eb115f13f1d19c5ff3cb3678e8c7aRafael Espindola  MCDwarfFrameEmitter::EncodeAdvanceLoc(AddrDelta, OSE);
758245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  OSE.flush();
759245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  return OldSize != Data.size();
760245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola}
761245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola
762f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbachbool MCAssembler::layoutSectionOnce(MCAsmLayout &Layout,
76362b83b62f377ac248038672015dc65970327f786Rafael Espindola                                    MCSectionData &SD) {
76462b83b62f377ac248038672015dc65970327f786Rafael Espindola  MCFragment *FirstInvalidFragment = NULL;
76562b83b62f377ac248038672015dc65970327f786Rafael Espindola  // Scan for fragments that need relaxation.
76662b83b62f377ac248038672015dc65970327f786Rafael Espindola  for (MCSectionData::iterator it2 = SD.begin(),
76762b83b62f377ac248038672015dc65970327f786Rafael Espindola         ie2 = SD.end(); it2 != ie2; ++it2) {
76862b83b62f377ac248038672015dc65970327f786Rafael Espindola    // Check if this is an fragment that needs relaxation.
76962b83b62f377ac248038672015dc65970327f786Rafael Espindola    bool relaxedFrag = false;
77062b83b62f377ac248038672015dc65970327f786Rafael Espindola    switch(it2->getKind()) {
77162b83b62f377ac248038672015dc65970327f786Rafael Espindola    default:
77262b83b62f377ac248038672015dc65970327f786Rafael Espindola          break;
77362b83b62f377ac248038672015dc65970327f786Rafael Espindola    case MCFragment::FT_Inst:
774f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbach      relaxedFrag = relaxInstruction(Layout, *cast<MCInstFragment>(it2));
77562b83b62f377ac248038672015dc65970327f786Rafael Espindola      break;
77662b83b62f377ac248038672015dc65970327f786Rafael Espindola    case MCFragment::FT_Dwarf:
777f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbach      relaxedFrag = relaxDwarfLineAddr(Layout,
77862b83b62f377ac248038672015dc65970327f786Rafael Espindola                                       *cast<MCDwarfLineAddrFragment>(it2));
77962b83b62f377ac248038672015dc65970327f786Rafael Espindola      break;
780245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola    case MCFragment::FT_DwarfFrame:
781245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola      relaxedFrag =
782f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbach        relaxDwarfCallFrameFragment(Layout,
783245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola                                    *cast<MCDwarfCallFrameFragment>(it2));
784245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola      break;
785245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola    case MCFragment::FT_LEB:
786f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbach      relaxedFrag = relaxLEB(Layout, *cast<MCLEBFragment>(it2));
787245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola      break;
78862b83b62f377ac248038672015dc65970327f786Rafael Espindola    }
78962b83b62f377ac248038672015dc65970327f786Rafael Espindola    // Update the layout, and remember that we relaxed.
79062b83b62f377ac248038672015dc65970327f786Rafael Espindola    if (relaxedFrag && !FirstInvalidFragment)
79162b83b62f377ac248038672015dc65970327f786Rafael Espindola      FirstInvalidFragment = it2;
79262b83b62f377ac248038672015dc65970327f786Rafael Espindola  }
79362b83b62f377ac248038672015dc65970327f786Rafael Espindola  if (FirstInvalidFragment) {
79462b83b62f377ac248038672015dc65970327f786Rafael Espindola    Layout.Invalidate(FirstInvalidFragment);
79562b83b62f377ac248038672015dc65970327f786Rafael Espindola    return true;
79662b83b62f377ac248038672015dc65970327f786Rafael Espindola  }
79762b83b62f377ac248038672015dc65970327f786Rafael Espindola  return false;
79862b83b62f377ac248038672015dc65970327f786Rafael Espindola}
79962b83b62f377ac248038672015dc65970327f786Rafael Espindola
800f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbachbool MCAssembler::layoutOnce(MCAsmLayout &Layout) {
801ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar  ++stats::RelaxationSteps;
802ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar
8030cc8bd48619b943379f5c2cc11a19fb189342925Daniel Dunbar  bool WasRelaxed = false;
804f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar  for (iterator it = begin(), ie = end(); it != ie; ++it) {
805f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar    MCSectionData &SD = *it;
806f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbach    while(layoutSectionOnce(Layout, SD))
80762b83b62f377ac248038672015dc65970327f786Rafael Espindola      WasRelaxed = true;
808f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar  }
809f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar
8100cc8bd48619b943379f5c2cc11a19fb189342925Daniel Dunbar  return WasRelaxed;
811f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar}
812b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
813f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbachvoid MCAssembler::finishLayout(MCAsmLayout &Layout) {
814b4172fa72915bd031383e81c83cd313c8c4b2e74Rafael Espindola  // The layout is done. Mark every fragment as valid.
8154f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola  for (unsigned int i = 0, n = Layout.getSectionOrder().size(); i != n; ++i) {
8164f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola    Layout.getFragmentOffset(&*Layout.getSectionOrder()[i]->rbegin());
8174f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola  }
8183f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar}
8193f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar
820b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar// Debugging methods
821b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
822b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbarnamespace llvm {
823b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
824c90e30aa6f3792a460202017523171f435e2ba34Daniel Dunbarraw_ostream &operator<<(raw_ostream &OS, const MCFixup &AF) {
825c90e30aa6f3792a460202017523171f435e2ba34Daniel Dunbar  OS << "<MCFixup" << " Offset:" << AF.getOffset()
826482ad802f1b1885542ea8a30e144a228a1526912Daniel Dunbar     << " Value:" << *AF.getValue()
827482ad802f1b1885542ea8a30e144a228a1526912Daniel Dunbar     << " Kind:" << AF.getKind() << ">";
828b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  return OS;
829b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar}
830b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
831b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar}
832b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
833286c4dc355b8be6806081b23c3097485821c7642Manman Ren#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
834b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbarvoid MCFragment::dump() {
835b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  raw_ostream &OS = llvm::errs();
836b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
837e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  OS << "<";
838e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  switch (getKind()) {
839e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  case MCFragment::FT_Align: OS << "MCAlignFragment"; break;
840e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  case MCFragment::FT_Data:  OS << "MCDataFragment"; break;
841e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  case MCFragment::FT_Fill:  OS << "MCFillFragment"; break;
842e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  case MCFragment::FT_Inst:  OS << "MCInstFragment"; break;
843e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  case MCFragment::FT_Org:   OS << "MCOrgFragment"; break;
844c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby  case MCFragment::FT_Dwarf: OS << "MCDwarfFragment"; break;
845245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  case MCFragment::FT_DwarfFrame: OS << "MCDwarfCallFrameFragment"; break;
8463ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  case MCFragment::FT_LEB:   OS << "MCLEBFragment"; break;
847e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  }
848e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar
849337718e09c99349939a53643984c04f5dc118bb7Daniel Dunbar  OS << "<MCFragment " << (void*) this << " LayoutOrder:" << LayoutOrder
8502bf6afc277edb32b1d940def5b3eb0e0d32a22b9Rafael Espindola     << " Offset:" << Offset << ">";
851b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
852e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  switch (getKind()) {
853e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  case MCFragment::FT_Align: {
854e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    const MCAlignFragment *AF = cast<MCAlignFragment>(this);
855e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    if (AF->hasEmitNops())
856e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar      OS << " (emit nops)";
857e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    OS << "\n       ";
858e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    OS << " Alignment:" << AF->getAlignment()
859e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar       << " Value:" << AF->getValue() << " ValueSize:" << AF->getValueSize()
860e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar       << " MaxBytesToEmit:" << AF->getMaxBytesToEmit() << ">";
861e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    break;
862b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  }
863e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  case MCFragment::FT_Data:  {
864e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    const MCDataFragment *DF = cast<MCDataFragment>(this);
865e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    OS << "\n       ";
866e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    OS << " Contents:[";
867e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    const SmallVectorImpl<char> &Contents = DF->getContents();
868e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    for (unsigned i = 0, e = Contents.size(); i != e; ++i) {
869e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar      if (i) OS << ",";
870e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar      OS << hexdigit((Contents[i] >> 4) & 0xF) << hexdigit(Contents[i] & 0xF);
871e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    }
872e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    OS << "] (" << Contents.size() << " bytes)";
873e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar
874e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    if (!DF->getFixups().empty()) {
875e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar      OS << ",\n       ";
876e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar      OS << " Fixups:[";
877e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar      for (MCDataFragment::const_fixup_iterator it = DF->fixup_begin(),
878e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar             ie = DF->fixup_end(); it != ie; ++it) {
879e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar        if (it != DF->fixup_begin()) OS << ",\n                ";
880e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar        OS << *it;
881e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar      }
882e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar      OS << "]";
8830bcf074867d4d366f7988a219c7a53265fcb4f23Daniel Dunbar    }
884e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    break;
885e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  }
886e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  case MCFragment::FT_Fill:  {
887e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    const MCFillFragment *FF = cast<MCFillFragment>(this);
888e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    OS << " Value:" << FF->getValue() << " ValueSize:" << FF->getValueSize()
889e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar       << " Size:" << FF->getSize();
890e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    break;
891e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  }
892e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  case MCFragment::FT_Inst:  {
893e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    const MCInstFragment *IF = cast<MCInstFragment>(this);
894e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    OS << "\n       ";
895e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    OS << " Inst:";
896e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    IF->getInst().dump_pretty(OS);
897e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    break;
898e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  }
899e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  case MCFragment::FT_Org:  {
900e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    const MCOrgFragment *OF = cast<MCOrgFragment>(this);
901e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    OS << "\n       ";
902e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    OS << " Offset:" << OF->getOffset() << " Value:" << OF->getValue();
903e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    break;
904e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  }
905c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby  case MCFragment::FT_Dwarf:  {
906c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby    const MCDwarfLineAddrFragment *OF = cast<MCDwarfLineAddrFragment>(this);
907c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby    OS << "\n       ";
908c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby    OS << " AddrDelta:" << OF->getAddrDelta()
909c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby       << " LineDelta:" << OF->getLineDelta();
910c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby    break;
911c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby  }
912245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  case MCFragment::FT_DwarfFrame:  {
913245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola    const MCDwarfCallFrameFragment *CF = cast<MCDwarfCallFrameFragment>(this);
914245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola    OS << "\n       ";
915245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola    OS << " AddrDelta:" << CF->getAddrDelta();
916245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola    break;
917245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  }
9183ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  case MCFragment::FT_LEB: {
9193ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola    const MCLEBFragment *LF = cast<MCLEBFragment>(this);
9203ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola    OS << "\n       ";
9213ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola    OS << " Value:" << LF->getValue() << " Signed:" << LF->isSigned();
9223ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola    break;
9233ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  }
9240bcf074867d4d366f7988a219c7a53265fcb4f23Daniel Dunbar  }
9253f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  OS << ">";
9263f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar}
9273f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar
928b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbarvoid MCSectionData::dump() {
929b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  raw_ostream &OS = llvm::errs();
930b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
931b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "<MCSectionData";
93285f2ecc697a8ca6c8cf08093054cbbb9d2060ccfRafael Espindola  OS << " Alignment:" << getAlignment() << " Fragments:[\n      ";
933b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  for (iterator it = begin(), ie = end(); it != ie; ++it) {
934b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar    if (it != begin()) OS << ",\n      ";
935b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar    it->dump();
936b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  }
937b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "]>";
938b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar}
939b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
940b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbarvoid MCSymbolData::dump() {
941b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  raw_ostream &OS = llvm::errs();
942b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
943b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "<MCSymbolData Symbol:" << getSymbol()
944b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar     << " Fragment:" << getFragment() << " Offset:" << getOffset()
945b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar     << " Flags:" << getFlags() << " Index:" << getIndex();
946b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  if (isCommon())
947b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar    OS << " (common, size:" << getCommonSize()
948b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar       << " align: " << getCommonAlignment() << ")";
949b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  if (isExternal())
950b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar    OS << " (external)";
951b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  if (isPrivateExtern())
952b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar    OS << " (private extern)";
953b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << ">";
954b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar}
955b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
956b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbarvoid MCAssembler::dump() {
957b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  raw_ostream &OS = llvm::errs();
958b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
959b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "<MCAssembler\n";
96045aefff64c64d5bd7804f39d994883b98ce4415aDaniel Dunbar  OS << "  Sections:[\n    ";
961b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  for (iterator it = begin(), ie = end(); it != ie; ++it) {
962b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar    if (it != begin()) OS << ",\n    ";
963b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar    it->dump();
964b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  }
965b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "],\n";
966b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "  Symbols:[";
967b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
968b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  for (symbol_iterator it = symbol_begin(), ie = symbol_end(); it != ie; ++it) {
96945aefff64c64d5bd7804f39d994883b98ce4415aDaniel Dunbar    if (it != symbol_begin()) OS << ",\n           ";
970b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar    it->dump();
971b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  }
972b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "]>\n";
973b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar}
974cc77eece74c8db09acc2af425e7e6c88a5bb30d1Manman Ren#endif
9752d24e2a396a1d211baaeedf32148a3b657240170David Blaikie
9762d24e2a396a1d211baaeedf32148a3b657240170David Blaikie// anchors for MC*Fragment vtables
9772d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid MCDataFragment::anchor() { }
9782d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid MCInstFragment::anchor() { }
9792d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid MCAlignFragment::anchor() { }
9802d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid MCFillFragment::anchor() { }
9812d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid MCOrgFragment::anchor() { }
9822d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid MCLEBFragment::anchor() { }
9832d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid MCDwarfLineAddrFragment::anchor() { }
9842d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid MCDwarfCallFrameFragment::anchor() { }
985