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)
1618b8825ac164c2e7cce8b6987cea78cd8b301360dShih-wei Liao  : Kind(_Kind), Parent(_Parent), Atom(0), Offset(~UINT64_C(0)),
1628b8825ac164c2e7cce8b6987cea78cd8b301360dShih-wei Liao    LayoutOrder(~(0U))
163fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar{
1645e835967dd5dda294d0ef3392f4c1d4a2260f532Daniel Dunbar  if (Parent)
1655e835967dd5dda294d0ef3392f4c1d4a2260f532Daniel Dunbar    Parent->getFragmentList().push_back(this);
166fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar}
167fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
168fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar/* *** */
169fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
17081e400092f55c2eba157172bfc0dd0df8317638dDaniel DunbarMCSectionData::MCSectionData() : Section(0) {}
171fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
172fb4a6b397665df011348ade24a8e38d2219f095aDaniel DunbarMCSectionData::MCSectionData(const MCSection &_Section, MCAssembler *A)
17381e400092f55c2eba157172bfc0dd0df8317638dDaniel Dunbar  : Section(&_Section),
174f8803fe4177739f9a6900198f601808eb27934d9Rafael Espindola    Ordinal(~UINT32_C(0)),
175fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar    Alignment(1),
176e1ec617c6abf0b9dc1eecbbfe483bda3bb2b7795Daniel Dunbar    HasInstructions(false)
177fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar{
178fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  if (A)
179fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar    A->getSectionList().push_back(this);
180fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar}
181fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
182fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar/* *** */
183fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
184efbb5330b8d383a393c83d2da5d631c98b0bb3fdDaniel DunbarMCSymbolData::MCSymbolData() : Symbol(0) {}
185f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar
186cb579b3338fe8d9e4424b138f597a4696cb89de3Daniel DunbarMCSymbolData::MCSymbolData(const MCSymbol &_Symbol, MCFragment *_Fragment,
187f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar                           uint64_t _Offset, MCAssembler *A)
188efbb5330b8d383a393c83d2da5d631c98b0bb3fdDaniel Dunbar  : Symbol(&_Symbol), Fragment(_Fragment), Offset(_Offset),
1898f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar    IsExternal(false), IsPrivateExtern(false),
1906c8b3d2f1f6fe6eb6a7ae81eab24c1b6db9232aeMatt Fleming    CommonSize(0), SymbolSize(0), CommonAlign(0),
1916c8b3d2f1f6fe6eb6a7ae81eab24c1b6db9232aeMatt Fleming    Flags(0), Index(0)
192f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar{
193f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar  if (A)
194f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar    A->getSymbolList().push_back(this);
195f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar}
196f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar
197f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar/* *** */
198f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar
19978c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan ChengMCAssembler::MCAssembler(MCContext &Context_, MCAsmBackend &Backend_,
200feb7ba3d9abfa1eb89f6da93c51649baaa931ab8Daniel Dunbar                         MCCodeEmitter &Emitter_, MCObjectWriter &Writer_,
201feb7ba3d9abfa1eb89f6da93c51649baaa931ab8Daniel Dunbar                         raw_ostream &OS_)
202014bc6e3ceac59ea7d1d435cfb88642157c5270cTDYa  : Context(Context_), Backend(Backend_), Emitter(Emitter_), Writer(&Writer_),
20396aa78c8c5ef1a5f268539c9edc86569b436d573Rafael Espindola    OS(OS_), RelaxAll(false), NoExecStack(false), SubsectionsViaSymbols(false)
2046009db486e7fba448ccb28dff676c012efade8f0Daniel Dunbar{
2056009db486e7fba448ccb28dff676c012efade8f0Daniel Dunbar}
206fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
207fb4a6b397665df011348ade24a8e38d2219f095aDaniel DunbarMCAssembler::~MCAssembler() {
208fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar}
209fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
210014bc6e3ceac59ea7d1d435cfb88642157c5270cTDYavoid MCAssembler::setWriter(MCObjectWriter &ObjectWriter) {
211014bc6e3ceac59ea7d1d435cfb88642157c5270cTDYa  delete Writer;
212014bc6e3ceac59ea7d1d435cfb88642157c5270cTDYa  Writer = &ObjectWriter;
2138b8825ac164c2e7cce8b6987cea78cd8b301360dShih-wei Liao}
2148b8825ac164c2e7cce8b6987cea78cd8b301360dShih-wei Liao
215843aa1f15b06fc3c2b39740ffb5bffd2fa6827ceDaniel Dunbarbool MCAssembler::isSymbolLinkerVisible(const MCSymbol &Symbol) const {
216238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar  // Non-temporary labels should always be visible to the linker.
217843aa1f15b06fc3c2b39740ffb5bffd2fa6827ceDaniel Dunbar  if (!Symbol.isTemporary())
218238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar    return true;
219238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar
220238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar  // Absolute temporary labels are never visible.
221843aa1f15b06fc3c2b39740ffb5bffd2fa6827ceDaniel Dunbar  if (!Symbol.isInSection())
222238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar    return false;
223238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar
224238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar  // Otherwise, check if the section requires symbols even for temporary labels.
225843aa1f15b06fc3c2b39740ffb5bffd2fa6827ceDaniel Dunbar  return getBackend().doesSectionRequireSymbols(Symbol.getSection());
226238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar}
227238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar
228b814110612024a092fd884050fbab9d012b16dc7Rafael Espindolaconst MCSymbolData *MCAssembler::getAtom(const MCSymbolData *SD) const {
2298ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar  // Linker visible symbols define atoms.
230843aa1f15b06fc3c2b39740ffb5bffd2fa6827ceDaniel Dunbar  if (isSymbolLinkerVisible(SD->getSymbol()))
2318ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar    return SD;
2328ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar
2338ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar  // Absolute and undefined symbols have no defining atom.
2348ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar  if (!SD->getFragment())
2358ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar    return 0;
2368ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar
237a5f1d57f65ae601ec181c0f4e36cf0df5e8d79d8Daniel Dunbar  // Non-linker visible symbols in sections which can't be atomized have no
238a5f1d57f65ae601ec181c0f4e36cf0df5e8d79d8Daniel Dunbar  // defining atom.
239a5f1d57f65ae601ec181c0f4e36cf0df5e8d79d8Daniel Dunbar  if (!getBackend().isSectionAtomizable(
240a5f1d57f65ae601ec181c0f4e36cf0df5e8d79d8Daniel Dunbar        SD->getFragment()->getParent()->getSection()))
241a5f1d57f65ae601ec181c0f4e36cf0df5e8d79d8Daniel Dunbar    return 0;
242a5f1d57f65ae601ec181c0f4e36cf0df5e8d79d8Daniel Dunbar
243651804c3d63a05f72221a6d133e5b344e6aaa093Daniel Dunbar  // Otherwise, return the atom for the containing fragment.
244651804c3d63a05f72221a6d133e5b344e6aaa093Daniel Dunbar  return SD->getFragment()->getAtom();
2458ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar}
2468ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar
247f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbachbool MCAssembler::evaluateFixup(const MCAsmLayout &Layout,
248c90e30aa6f3792a460202017523171f435e2ba34Daniel Dunbar                                const MCFixup &Fixup, const MCFragment *DF,
249df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar                                MCValue &Target, uint64_t &Value) const {
250f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbach  ++stats::evaluateFixup;
251ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar
25233a38a1b5a35acd15c867193bc2175f3d4e7b83dRafael Espindola  if (!Fixup.getValue()->EvaluateAsRelocatable(Target, Layout))
253f3c936769b948b53a7c03d2d5fca1ef75284f977Jim Grosbach    getContext().FatalError(Fixup.getLoc(), "expected relocatable expression");
254df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar
255fea753b397823c340608925eb7f3256a64a30017Rafael Espindola  bool IsPCRel = Backend.getFixupKindInfo(
256fea753b397823c340608925eb7f3256a64a30017Rafael Espindola    Fixup.getKind()).Flags & MCFixupKindInfo::FKF_IsPCRel;
257fea753b397823c340608925eb7f3256a64a30017Rafael Espindola
258fea753b397823c340608925eb7f3256a64a30017Rafael Espindola  bool IsResolved;
259fea753b397823c340608925eb7f3256a64a30017Rafael Espindola  if (IsPCRel) {
260fea753b397823c340608925eb7f3256a64a30017Rafael Espindola    if (Target.getSymB()) {
261fea753b397823c340608925eb7f3256a64a30017Rafael Espindola      IsResolved = false;
262fea753b397823c340608925eb7f3256a64a30017Rafael Espindola    } else if (!Target.getSymA()) {
263fea753b397823c340608925eb7f3256a64a30017Rafael Espindola      IsResolved = false;
264fea753b397823c340608925eb7f3256a64a30017Rafael Espindola    } else {
265908159b46ae118d36fccbc1d5145dcedfc3d4185Rafael Espindola      const MCSymbolRefExpr *A = Target.getSymA();
266908159b46ae118d36fccbc1d5145dcedfc3d4185Rafael Espindola      const MCSymbol &SA = A->getSymbol();
267908159b46ae118d36fccbc1d5145dcedfc3d4185Rafael Espindola      if (A->getKind() != MCSymbolRefExpr::VK_None ||
268908159b46ae118d36fccbc1d5145dcedfc3d4185Rafael Espindola          SA.AliasedSymbol().isUndefined()) {
269fea753b397823c340608925eb7f3256a64a30017Rafael Espindola        IsResolved = false;
270fea753b397823c340608925eb7f3256a64a30017Rafael Espindola      } else {
271fea753b397823c340608925eb7f3256a64a30017Rafael Espindola        const MCSymbolData &DataA = getSymbolData(SA);
272fea753b397823c340608925eb7f3256a64a30017Rafael Espindola        IsResolved =
273fea753b397823c340608925eb7f3256a64a30017Rafael Espindola          getWriter().IsSymbolRefDifferenceFullyResolvedImpl(*this, DataA,
274fea753b397823c340608925eb7f3256a64a30017Rafael Espindola                                                             *DF, false, true);
275fea753b397823c340608925eb7f3256a64a30017Rafael Espindola      }
276fea753b397823c340608925eb7f3256a64a30017Rafael Espindola    }
277fea753b397823c340608925eb7f3256a64a30017Rafael Espindola  } else {
278fea753b397823c340608925eb7f3256a64a30017Rafael Espindola    IsResolved = Target.isAbsolute();
279fea753b397823c340608925eb7f3256a64a30017Rafael Espindola  }
280df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar
281df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar  Value = Target.getConstant();
282df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar
2839a1d20042f6a6ec648a3588f9b13264a4570aab0Daniel Dunbar  if (const MCSymbolRefExpr *A = Target.getSymA()) {
28494ed5fca3f5ab5acb74e70b8393b837131e7110cRafael Espindola    const MCSymbol &Sym = A->getSymbol().AliasedSymbol();
28594ed5fca3f5ab5acb74e70b8393b837131e7110cRafael Espindola    if (Sym.isDefined())
28685f2ecc697a8ca6c8cf08093054cbbb9d2060ccfRafael Espindola      Value += Layout.getSymbolOffset(&getSymbolData(Sym));
287df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar  }
2889a1d20042f6a6ec648a3588f9b13264a4570aab0Daniel Dunbar  if (const MCSymbolRefExpr *B = Target.getSymB()) {
28994ed5fca3f5ab5acb74e70b8393b837131e7110cRafael Espindola    const MCSymbol &Sym = B->getSymbol().AliasedSymbol();
29094ed5fca3f5ab5acb74e70b8393b837131e7110cRafael Espindola    if (Sym.isDefined())
29185f2ecc697a8ca6c8cf08093054cbbb9d2060ccfRafael Espindola      Value -= Layout.getSymbolOffset(&getSymbolData(Sym));
292939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  }
293df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar
294df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar
2952761fc427082215c2affcc9d8db8491400bc9e5dDaniel Dunbar  bool ShouldAlignPC = Backend.getFixupKindInfo(Fixup.getKind()).Flags &
29647dbd429daefa9b3f19347194ddfb6f69642465eOwen Anderson                         MCFixupKindInfo::FKF_IsAlignedDownTo32Bits;
29747dbd429daefa9b3f19347194ddfb6f69642465eOwen Anderson  assert((ShouldAlignPC ? IsPCRel : true) &&
29847dbd429daefa9b3f19347194ddfb6f69642465eOwen Anderson    "FKF_IsAlignedDownTo32Bits is only allowed on PC-relative fixups!");
29947dbd429daefa9b3f19347194ddfb6f69642465eOwen Anderson
30005018c2f2872a05b1a2fff1a9934621ba1f38084Owen Anderson  if (IsPCRel) {
301175fb36f101a20df10db90bfe4d0c44a7d05325bOwen Anderson    uint32_t Offset = Layout.getFragmentOffset(DF) + Fixup.getOffset();
302684457d179fcfdf8c1f8ee9f66cc40665ecc648cJim Grosbach
30347dbd429daefa9b3f19347194ddfb6f69642465eOwen Anderson    // A number of ARM fixups in Thumb mode require that the effective PC
30447dbd429daefa9b3f19347194ddfb6f69642465eOwen Anderson    // address be determined as the 32-bit aligned version of the actual offset.
305d18e011cbb3df090166d9f49aa51fda077f09fcdOwen Anderson    if (ShouldAlignPC) Offset &= ~0x3;
306175fb36f101a20df10db90bfe4d0c44a7d05325bOwen Anderson    Value -= Offset;
30705018c2f2872a05b1a2fff1a9934621ba1f38084Owen Anderson  }
308df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar
3097b25ecf6adbf3c4709c48033acfeb6ebbb4452abJim Grosbach  // Let the backend adjust the fixup value if necessary, including whether
3107b25ecf6adbf3c4709c48033acfeb6ebbb4452abJim Grosbach  // we need a relocation.
3117b25ecf6adbf3c4709c48033acfeb6ebbb4452abJim Grosbach  Backend.processFixupValue(*this, Layout, Fixup, DF, Target, Value,
3127b25ecf6adbf3c4709c48033acfeb6ebbb4452abJim Grosbach                            IsResolved);
313475002078848d102b6577fe7283464c039b38af6Jim Grosbach
314df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar  return IsResolved;
315df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar}
316df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar
317f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbachuint64_t MCAssembler::computeFragmentSize(const MCAsmLayout &Layout,
3187a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola                                          const MCFragment &F) const {
319f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar  switch (F.getKind()) {
3202c18d3b0fec25b2b7befc7ac5751e84005f4a869Daniel Dunbar  case MCFragment::FT_Data:
3212c18d3b0fec25b2b7befc7ac5751e84005f4a869Daniel Dunbar    return cast<MCDataFragment>(F).getContents().size();
3222c18d3b0fec25b2b7befc7ac5751e84005f4a869Daniel Dunbar  case MCFragment::FT_Fill:
3232c18d3b0fec25b2b7befc7ac5751e84005f4a869Daniel Dunbar    return cast<MCFillFragment>(F).getSize();
3242c18d3b0fec25b2b7befc7ac5751e84005f4a869Daniel Dunbar  case MCFragment::FT_Inst:
3252c18d3b0fec25b2b7befc7ac5751e84005f4a869Daniel Dunbar    return cast<MCInstFragment>(F).getInstSize();
3262c18d3b0fec25b2b7befc7ac5751e84005f4a869Daniel Dunbar
3273ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  case MCFragment::FT_LEB:
328db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola    return cast<MCLEBFragment>(F).getContents().size();
3293ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola
3307a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola  case MCFragment::FT_Align: {
3317a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola    const MCAlignFragment &AF = cast<MCAlignFragment>(F);
3327a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola    unsigned Offset = Layout.getFragmentOffset(&AF);
3337a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola    unsigned Size = OffsetToAlignment(Offset, AF.getAlignment());
33415b7a98ece81ec275a560c77b814e0479a669bc6Owen Anderson    // If we are padding with nops, force the padding to be larger than the
33515b7a98ece81ec275a560c77b814e0479a669bc6Owen Anderson    // minimum nop size.
33615b7a98ece81ec275a560c77b814e0479a669bc6Owen Anderson    if (Size > 0 && AF.hasEmitNops()) {
33715b7a98ece81ec275a560c77b814e0479a669bc6Owen Anderson      while (Size % getBackend().getMinimumNopSize())
33815b7a98ece81ec275a560c77b814e0479a669bc6Owen Anderson        Size += AF.getAlignment();
33915b7a98ece81ec275a560c77b814e0479a669bc6Owen Anderson    }
3407a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola    if (Size > AF.getMaxBytesToEmit())
3417a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola      return 0;
3427a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola    return Size;
3437a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola  }
344f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar
3457a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola  case MCFragment::FT_Org: {
3467a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola    MCOrgFragment &OF = cast<MCOrgFragment>(F);
3477a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola    int64_t TargetLocation;
3487a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola    if (!OF.getOffset().EvaluateAsAbsolute(TargetLocation, Layout))
3497a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola      report_fatal_error("expected assembly-time absolute expression");
3507a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola
3517a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola    // FIXME: We need a way to communicate this error.
3527a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola    uint64_t FragmentOffset = Layout.getFragmentOffset(&OF);
3537a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola    int64_t Size = TargetLocation - FragmentOffset;
3547a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola    if (Size < 0 || Size >= 0x40000000)
3557a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola      report_fatal_error("invalid .org offset '" + Twine(TargetLocation) +
3567a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola                         "' (at offset '" + Twine(FragmentOffset) + "')");
3577a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola    return Size;
3587a45903bf40a023ce96f4da953bb6cb2cb1a1b50Rafael Espindola  }
359c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby
360187d8339dbc0530850e54a86edf36f1a865a5823Rafael Espindola  case MCFragment::FT_Dwarf:
361db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola    return cast<MCDwarfLineAddrFragment>(F).getContents().size();
362245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  case MCFragment::FT_DwarfFrame:
363245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola    return cast<MCDwarfCallFrameFragment>(F).getContents().size();
364f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar  }
365f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar
366858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper  llvm_unreachable("invalid fragment kind");
3672c18d3b0fec25b2b7befc7ac5751e84005f4a869Daniel Dunbar}
3682c18d3b0fec25b2b7befc7ac5751e84005f4a869Daniel Dunbar
369b69fc044db8c193348b6611f46432bb21b3cbe90Daniel Dunbarvoid MCAsmLayout::LayoutFragment(MCFragment *F) {
3709005d45a990ef46f06800bd6bd6a7d1298a33645Daniel Dunbar  MCFragment *Prev = F->getPrevNode();
3719005d45a990ef46f06800bd6bd6a7d1298a33645Daniel Dunbar
3729005d45a990ef46f06800bd6bd6a7d1298a33645Daniel Dunbar  // We should never try to recompute something which is up-to-date.
3739005d45a990ef46f06800bd6bd6a7d1298a33645Daniel Dunbar  assert(!isFragmentUpToDate(F) && "Attempt to recompute up-to-date fragment!");
3749005d45a990ef46f06800bd6bd6a7d1298a33645Daniel Dunbar  // We should never try to compute the fragment layout if it's predecessor
3759005d45a990ef46f06800bd6bd6a7d1298a33645Daniel Dunbar  // isn't up-to-date.
3769005d45a990ef46f06800bd6bd6a7d1298a33645Daniel Dunbar  assert((!Prev || isFragmentUpToDate(Prev)) &&
3779005d45a990ef46f06800bd6bd6a7d1298a33645Daniel Dunbar         "Attempt to compute fragment before it's predecessor!");
3782c18d3b0fec25b2b7befc7ac5751e84005f4a869Daniel Dunbar
3792c18d3b0fec25b2b7befc7ac5751e84005f4a869Daniel Dunbar  ++stats::FragmentLayouts;
3802c18d3b0fec25b2b7befc7ac5751e84005f4a869Daniel Dunbar
38185f2ecc697a8ca6c8cf08093054cbbb9d2060ccfRafael Espindola  // Compute fragment offset and size.
38285f2ecc697a8ca6c8cf08093054cbbb9d2060ccfRafael Espindola  uint64_t Offset = 0;
3839005d45a990ef46f06800bd6bd6a7d1298a33645Daniel Dunbar  if (Prev)
384f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbach    Offset += Prev->Offset + getAssembler().computeFragmentSize(*this, *Prev);
3859005d45a990ef46f06800bd6bd6a7d1298a33645Daniel Dunbar
38685f2ecc697a8ca6c8cf08093054cbbb9d2060ccfRafael Espindola  F->Offset = Offset;
3874f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola  LastValidFragment[F->getParent()] = F;
3880705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar}
3890705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
39053b2338a1d061ad15a858ff0d641431f4d4ac101Daniel Dunbar/// WriteFragmentData - Write the \arg F data to the output file.
391432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbarstatic void WriteFragmentData(const MCAssembler &Asm, const MCAsmLayout &Layout,
3925d2477cecf53bef911f57423a5cecb743d4286faDaniel Dunbar                              const MCFragment &F) {
3935d2477cecf53bef911f57423a5cecb743d4286faDaniel Dunbar  MCObjectWriter *OW = &Asm.getWriter();
39453b2338a1d061ad15a858ff0d641431f4d4ac101Daniel Dunbar  uint64_t Start = OW->getStream().tell();
3950705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  (void) Start;
3967eb85194f2b07bc7ba3f274fc00dc389b77b63bfDaniel Dunbar
397ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar  ++stats::EmittedFragments;
3980adcd35f78b89bf70eb634b7f9ac2103516ca2b2Daniel Dunbar
3990705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  // FIXME: Embed in fragments instead?
400f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbach  uint64_t FragmentSize = Asm.computeFragmentSize(Layout, F);
4010705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  switch (F.getKind()) {
402d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar  case MCFragment::FT_Align: {
403d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    MCAlignFragment &AF = cast<MCAlignFragment>(F);
404432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar    uint64_t Count = FragmentSize / AF.getValueSize();
405d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar
406e73d49eda2cb4fc30b52c4a241acf69c8af98302Daniel Dunbar    assert(AF.getValueSize() && "Invalid virtual align in concrete fragment!");
407e73d49eda2cb4fc30b52c4a241acf69c8af98302Daniel Dunbar
408d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    // FIXME: This error shouldn't actually occur (the front end should emit
409d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    // multiple .align directives to enforce the semantics it wants), but is
410d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    // severe enough that we want to report it. How to handle this?
411432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar    if (Count * AF.getValueSize() != FragmentSize)
41275361b69f3f327842b9dad69fa7f28ae3b688412Chris Lattner      report_fatal_error("undefined .align directive, value size '" +
4137eb85194f2b07bc7ba3f274fc00dc389b77b63bfDaniel Dunbar                        Twine(AF.getValueSize()) +
414d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar                        "' is not a divisor of padding size '" +
415432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar                        Twine(FragmentSize) + "'");
416d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar
4176e72048add2a6464e038121c6c275da37528aa0aKevin Enderby    // See if we are aligning with nops, and if so do that first to try to fill
4186e72048add2a6464e038121c6c275da37528aa0aKevin Enderby    // the Count bytes.  Then if that did not fill any bytes or there are any
419c8e41c591741b3da1077f7000274ad040bef8002Sylvestre Ledru    // bytes left to fill use the Value and ValueSize to fill the rest.
4208f9b80e5df12779a56d763ebf20864dad2bc72daDaniel Dunbar    // If we are aligning with nops, ask that target to emit the right data.
4211c15413ebc8f4a35545a381a789a718627396d03Daniel Dunbar    if (AF.hasEmitNops()) {
422ec3433852dd11e8ff60c9610b4c84468e5935f2bJim Grosbach      if (!Asm.getBackend().writeNopData(Count, OW))
42375361b69f3f327842b9dad69fa7f28ae3b688412Chris Lattner        report_fatal_error("unable to write nop sequence of " +
4248f9b80e5df12779a56d763ebf20864dad2bc72daDaniel Dunbar                          Twine(Count) + " bytes");
4258f9b80e5df12779a56d763ebf20864dad2bc72daDaniel Dunbar      break;
4266e72048add2a6464e038121c6c275da37528aa0aKevin Enderby    }
4276e72048add2a6464e038121c6c275da37528aa0aKevin Enderby
4288f9b80e5df12779a56d763ebf20864dad2bc72daDaniel Dunbar    // Otherwise, write out in multiples of the value size.
429d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    for (uint64_t i = 0; i != Count; ++i) {
430d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar      switch (AF.getValueSize()) {
431858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper      default: llvm_unreachable("Invalid size!");
432bdd9281f356d326155dc2ca5585a708e09e90600Daniel Dunbar      case 1: OW->Write8 (uint8_t (AF.getValue())); break;
433bdd9281f356d326155dc2ca5585a708e09e90600Daniel Dunbar      case 2: OW->Write16(uint16_t(AF.getValue())); break;
434bdd9281f356d326155dc2ca5585a708e09e90600Daniel Dunbar      case 4: OW->Write32(uint32_t(AF.getValue())); break;
435bdd9281f356d326155dc2ca5585a708e09e90600Daniel Dunbar      case 8: OW->Write64(uint64_t(AF.getValue())); break;
436d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar      }
437d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    }
438d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    break;
439d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar  }
4400705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
4413a30b827a5c9bf0ed8f31177b6e447083ce9afecDaniel Dunbar  case MCFragment::FT_Data: {
4423f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar    MCDataFragment &DF = cast<MCDataFragment>(F);
443432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar    assert(FragmentSize == DF.getContents().size() && "Invalid size!");
4443f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar    OW->WriteBytes(DF.getContents().str());
4450705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar    break;
4463a30b827a5c9bf0ed8f31177b6e447083ce9afecDaniel Dunbar  }
4470705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
4480705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  case MCFragment::FT_Fill: {
4490705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar    MCFillFragment &FF = cast<MCFillFragment>(F);
450e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar
451e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar    assert(FF.getValueSize() && "Invalid virtual align in concrete fragment!");
452e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar
4533153fec733acd079a9e681d16d39253b9517e02cDaniel Dunbar    for (uint64_t i = 0, e = FF.getSize() / FF.getValueSize(); i != e; ++i) {
4540705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar      switch (FF.getValueSize()) {
455858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper      default: llvm_unreachable("Invalid size!");
456bdd9281f356d326155dc2ca5585a708e09e90600Daniel Dunbar      case 1: OW->Write8 (uint8_t (FF.getValue())); break;
457bdd9281f356d326155dc2ca5585a708e09e90600Daniel Dunbar      case 2: OW->Write16(uint16_t(FF.getValue())); break;
458bdd9281f356d326155dc2ca5585a708e09e90600Daniel Dunbar      case 4: OW->Write32(uint32_t(FF.getValue())); break;
459bdd9281f356d326155dc2ca5585a708e09e90600Daniel Dunbar      case 8: OW->Write64(uint64_t(FF.getValue())); break;
4600705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar      }
4610705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar    }
4620705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar    break;
4630705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  }
4647eb85194f2b07bc7ba3f274fc00dc389b77b63bfDaniel Dunbar
465179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola  case MCFragment::FT_Inst: {
466179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola    MCInstFragment &IF = cast<MCInstFragment>(F);
467179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola    OW->WriteBytes(StringRef(IF.getCode().begin(), IF.getCode().size()));
4683f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar    break;
469179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola  }
4703f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar
4713ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  case MCFragment::FT_LEB: {
4723ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola    MCLEBFragment &LF = cast<MCLEBFragment>(F);
473db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola    OW->WriteBytes(LF.getContents().str());
4743ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola    break;
4753ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  }
4763ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola
477d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar  case MCFragment::FT_Org: {
478d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    MCOrgFragment &OF = cast<MCOrgFragment>(F);
479d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar
480432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar    for (uint64_t i = 0, e = FragmentSize; i != e; ++i)
481bdd9281f356d326155dc2ca5585a708e09e90600Daniel Dunbar      OW->Write8(uint8_t(OF.getValue()));
482d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar
483d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    break;
484d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar  }
485c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby
486c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby  case MCFragment::FT_Dwarf: {
487c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby    const MCDwarfLineAddrFragment &OF = cast<MCDwarfLineAddrFragment>(F);
488db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola    OW->WriteBytes(OF.getContents().str());
489c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby    break;
490c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby  }
491245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  case MCFragment::FT_DwarfFrame: {
492245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola    const MCDwarfCallFrameFragment &CF = cast<MCDwarfCallFrameFragment>(F);
493245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola    OW->WriteBytes(CF.getContents().str());
494245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola    break;
495245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  }
4960705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  }
4970705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
498432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar  assert(OW->getStream().tell() - Start == FragmentSize);
4990705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar}
5000705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
501f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbachvoid MCAssembler::writeSectionData(const MCSectionData *SD,
5025d2477cecf53bef911f57423a5cecb743d4286faDaniel Dunbar                                   const MCAsmLayout &Layout) const {
503d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar  // Ignore virtual sections.
504f2dc4aa562e2478a73fe5aeeeec16b1e496a0642Rafael Espindola  if (SD->getSection().isVirtualSection()) {
505054be92e1da7015190377d6bade57196f28cf33aDaniel Dunbar    assert(Layout.getSectionFileSize(SD) == 0 && "Invalid size for section!");
506e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar
507e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar    // Check that contents are only things legal inside a virtual section.
508e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar    for (MCSectionData::const_iterator it = SD->begin(),
509e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar           ie = SD->end(); it != ie; ++it) {
510e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar      switch (it->getKind()) {
511858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper      default: llvm_unreachable("Invalid fragment in virtual section!");
512c983b20661d574b7adb2675478210c03ad1d0a33Daniel Dunbar      case MCFragment::FT_Data: {
513c983b20661d574b7adb2675478210c03ad1d0a33Daniel Dunbar        // Check that we aren't trying to write a non-zero contents (or fixups)
514c983b20661d574b7adb2675478210c03ad1d0a33Daniel Dunbar        // into a virtual section. This is to support clients which use standard
515c983b20661d574b7adb2675478210c03ad1d0a33Daniel Dunbar        // directives to fill the contents of virtual sections.
516c983b20661d574b7adb2675478210c03ad1d0a33Daniel Dunbar        MCDataFragment &DF = cast<MCDataFragment>(*it);
517c983b20661d574b7adb2675478210c03ad1d0a33Daniel Dunbar        assert(DF.fixup_begin() == DF.fixup_end() &&
518c983b20661d574b7adb2675478210c03ad1d0a33Daniel Dunbar               "Cannot have fixups in virtual section!");
519c983b20661d574b7adb2675478210c03ad1d0a33Daniel Dunbar        for (unsigned i = 0, e = DF.getContents().size(); i != e; ++i)
520c983b20661d574b7adb2675478210c03ad1d0a33Daniel Dunbar          assert(DF.getContents()[i] == 0 &&
521c983b20661d574b7adb2675478210c03ad1d0a33Daniel Dunbar                 "Invalid data value for virtual section!");
522c983b20661d574b7adb2675478210c03ad1d0a33Daniel Dunbar        break;
523c983b20661d574b7adb2675478210c03ad1d0a33Daniel Dunbar      }
524e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar      case MCFragment::FT_Align:
525c983b20661d574b7adb2675478210c03ad1d0a33Daniel Dunbar        // Check that we aren't trying to write a non-zero value into a virtual
526c983b20661d574b7adb2675478210c03ad1d0a33Daniel Dunbar        // section.
527c983b20661d574b7adb2675478210c03ad1d0a33Daniel Dunbar        assert((!cast<MCAlignFragment>(it)->getValueSize() ||
528c983b20661d574b7adb2675478210c03ad1d0a33Daniel Dunbar                !cast<MCAlignFragment>(it)->getValue()) &&
529e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar               "Invalid align in virtual section!");
530e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar        break;
531e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar      case MCFragment::FT_Fill:
532e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar        assert(!cast<MCFillFragment>(it)->getValueSize() &&
533e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar               "Invalid fill in virtual section!");
534e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar        break;
535e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar      }
536e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar    }
537e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar
538d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar    return;
539d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar  }
540d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar
5415d2477cecf53bef911f57423a5cecb743d4286faDaniel Dunbar  uint64_t Start = getWriter().getStream().tell();
5420705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  (void) Start;
5437eb85194f2b07bc7ba3f274fc00dc389b77b63bfDaniel Dunbar
54453b2338a1d061ad15a858ff0d641431f4d4ac101Daniel Dunbar  for (MCSectionData::const_iterator it = SD->begin(),
54553b2338a1d061ad15a858ff0d641431f4d4ac101Daniel Dunbar         ie = SD->end(); it != ie; ++it)
5465d2477cecf53bef911f57423a5cecb743d4286faDaniel Dunbar    WriteFragmentData(*this, Layout, *it);
5470705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
5485d2477cecf53bef911f57423a5cecb743d4286faDaniel Dunbar  assert(getWriter().getStream().tell() - Start ==
5495d2477cecf53bef911f57423a5cecb743d4286faDaniel Dunbar         Layout.getSectionAddressSize(SD));
5500705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar}
5510705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
552179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola
553f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbachuint64_t MCAssembler::handleFixup(const MCAsmLayout &Layout,
5545d2477cecf53bef911f57423a5cecb743d4286faDaniel Dunbar                                  MCFragment &F,
5555d2477cecf53bef911f57423a5cecb743d4286faDaniel Dunbar                                  const MCFixup &Fixup) {
556179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola   // Evaluate the fixup.
557179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola   MCValue Target;
558179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola   uint64_t FixedValue;
559f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbach   if (!evaluateFixup(Layout, Fixup, &F, Target, FixedValue)) {
560179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola     // The fixup was unresolved, we need a relocation. Inform the object
561179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola     // writer of the relocation, and give it an opportunity to adjust the
562179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola     // fixup value if need be.
5635d2477cecf53bef911f57423a5cecb743d4286faDaniel Dunbar     getWriter().RecordRelocation(*this, Layout, &F, Fixup, Target, FixedValue);
564179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola   }
565179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola   return FixedValue;
566179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola }
567179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola
568feb7ba3d9abfa1eb89f6da93c51649baaa931ab8Daniel Dunbarvoid MCAssembler::Finish() {
569b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  DEBUG_WITH_TYPE("mc-dump", {
570b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar      llvm::errs() << "assembler backend - pre-layout\n--\n";
571b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar      dump(); });
572b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
57361066dbdf2f035e146c11a40d4cf6531cf2dfd6cDaniel Dunbar  // Create the layout object.
5748d39eb47d6a15d36be7ac0d0154a6897e42f5adcDaniel Dunbar  MCAsmLayout Layout(*this);
57561066dbdf2f035e146c11a40d4cf6531cf2dfd6cDaniel Dunbar
576337718e09c99349939a53643984c04f5dc118bb7Daniel Dunbar  // Create dummy fragments and assign section ordinals.
57749ed9211905ec586f1d23a7f337d335ae63b4635Daniel Dunbar  unsigned SectionIndex = 0;
57849ed9211905ec586f1d23a7f337d335ae63b4635Daniel Dunbar  for (MCAssembler::iterator it = begin(), ie = end(); it != ie; ++it) {
57949ed9211905ec586f1d23a7f337d335ae63b4635Daniel Dunbar    // Create dummy fragments to eliminate any empty sections, this simplifies
58049ed9211905ec586f1d23a7f337d335ae63b4635Daniel Dunbar    // layout.
5816f74f69ff4a6e365272a754f0984c0321755976dDuncan Sands    if (it->getFragmentList().empty())
582d80781b98b771d370730ab7c630018f23e202b57Rafael Espindola      new MCDataFragment(it);
58349ed9211905ec586f1d23a7f337d335ae63b4635Daniel Dunbar
58449ed9211905ec586f1d23a7f337d335ae63b4635Daniel Dunbar    it->setOrdinal(SectionIndex++);
585337718e09c99349939a53643984c04f5dc118bb7Daniel Dunbar  }
58649ed9211905ec586f1d23a7f337d335ae63b4635Daniel Dunbar
587337718e09c99349939a53643984c04f5dc118bb7Daniel Dunbar  // Assign layout order indices to sections and fragments.
588337718e09c99349939a53643984c04f5dc118bb7Daniel Dunbar  for (unsigned i = 0, e = Layout.getSectionOrder().size(); i != e; ++i) {
589337718e09c99349939a53643984c04f5dc118bb7Daniel Dunbar    MCSectionData *SD = Layout.getSectionOrder()[i];
590337718e09c99349939a53643984c04f5dc118bb7Daniel Dunbar    SD->setLayoutOrder(i);
591337718e09c99349939a53643984c04f5dc118bb7Daniel Dunbar
5924f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola    unsigned FragmentIndex = 0;
593337718e09c99349939a53643984c04f5dc118bb7Daniel Dunbar    for (MCSectionData::iterator it2 = SD->begin(),
594337718e09c99349939a53643984c04f5dc118bb7Daniel Dunbar           ie2 = SD->end(); it2 != ie2; ++it2)
595337718e09c99349939a53643984c04f5dc118bb7Daniel Dunbar      it2->setLayoutOrder(FragmentIndex++);
59649ed9211905ec586f1d23a7f337d335ae63b4635Daniel Dunbar  }
59749ed9211905ec586f1d23a7f337d335ae63b4635Daniel Dunbar
59861066dbdf2f035e146c11a40d4cf6531cf2dfd6cDaniel Dunbar  // Layout until everything fits.
599f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbach  while (layoutOnce(Layout))
600f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar    continue;
601f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar
602f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar  DEBUG_WITH_TYPE("mc-dump", {
6033f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar      llvm::errs() << "assembler backend - post-relaxation\n--\n";
6043f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar      dump(); });
6053f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar
6063f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  // Finalize the layout, including fragment lowering.
607f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbach  finishLayout(Layout);
6083f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar
6093f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  DEBUG_WITH_TYPE("mc-dump", {
6103f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar      llvm::errs() << "assembler backend - final-layout\n--\n";
611f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar      dump(); });
612f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar
613ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar  uint64_t StartOffset = OS.tell();
614c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner
615bacba997782f624d3c43591a913b8f1e3d733a52Daniel Dunbar  // Allow the object writer a chance to perform post-layout binding (for
616bacba997782f624d3c43591a913b8f1e3d733a52Daniel Dunbar  // example, to set the index fields in the symbol data).
6175d2477cecf53bef911f57423a5cecb743d4286faDaniel Dunbar  getWriter().ExecutePostLayoutBinding(*this, Layout);
618bacba997782f624d3c43591a913b8f1e3d733a52Daniel Dunbar
619b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar  // Evaluate and apply the fixups, generating relocation entries as necessary.
620b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar  for (MCAssembler::iterator it = begin(), ie = end(); it != ie; ++it) {
621b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar    for (MCSectionData::iterator it2 = it->begin(),
622b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar           ie2 = it->end(); it2 != ie2; ++it2) {
623b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar      MCDataFragment *DF = dyn_cast<MCDataFragment>(it2);
624179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola      if (DF) {
625179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola        for (MCDataFragment::fixup_iterator it3 = DF->fixup_begin(),
626179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola               ie3 = DF->fixup_end(); it3 != ie3; ++it3) {
627179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola          MCFixup &Fixup = *it3;
628f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbach          uint64_t FixedValue = handleFixup(Layout, *DF, Fixup);
629ec3433852dd11e8ff60c9610b4c84468e5935f2bJim Grosbach          getBackend().applyFixup(Fixup, DF->getContents().data(),
630179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola                                  DF->getContents().size(), FixedValue);
631179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola        }
632179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola      }
633179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola      MCInstFragment *IF = dyn_cast<MCInstFragment>(it2);
634179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola      if (IF) {
635179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola        for (MCInstFragment::fixup_iterator it3 = IF->fixup_begin(),
636179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola               ie3 = IF->fixup_end(); it3 != ie3; ++it3) {
637179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola          MCFixup &Fixup = *it3;
638f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbach          uint64_t FixedValue = handleFixup(Layout, *IF, Fixup);
639ec3433852dd11e8ff60c9610b4c84468e5935f2bJim Grosbach          getBackend().applyFixup(Fixup, IF->getCode().data(),
640179821ac1f282ef6f8d24d5ea346028aee8ba4c7Rafael Espindola                                  IF->getCode().size(), FixedValue);
641b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar        }
642b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar      }
643b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar    }
644b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar  }
645b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar
646bacba997782f624d3c43591a913b8f1e3d733a52Daniel Dunbar  // Write the object file.
6475d2477cecf53bef911f57423a5cecb743d4286faDaniel Dunbar  getWriter().WriteObject(*this, Layout);
648ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar
649ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar  stats::ObjectBytes += OS.tell() - StartOffset;
650f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar}
651f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar
652f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbachbool MCAssembler::fixupNeedsRelaxation(const MCFixup &Fixup,
653370b78d795154899a22ca2b4674e890661ff1d59Jim Grosbach                                       const MCInstFragment *DF,
6548d39eb47d6a15d36be7ac0d0154a6897e42f5adcDaniel Dunbar                                       const MCAsmLayout &Layout) const {
655ac2884a717daf3ad2aa8425320795d661e8a980bDaniel Dunbar  if (getRelaxAll())
656ac2884a717daf3ad2aa8425320795d661e8a980bDaniel Dunbar    return true;
657ac2884a717daf3ad2aa8425320795d661e8a980bDaniel Dunbar
658f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar  // If we cannot resolve the fixup value, it requires relaxation.
659f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar  MCValue Target;
660f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar  uint64_t Value;
661f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbach  if (!evaluateFixup(Layout, Fixup, DF, Target, Value))
662f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar    return true;
663f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar
664370b78d795154899a22ca2b4674e890661ff1d59Jim Grosbach  return getBackend().fixupNeedsRelaxation(Fixup, Value, DF, Layout);
665f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar}
666f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar
667f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbachbool MCAssembler::fragmentNeedsRelaxation(const MCInstFragment *IF,
668d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar                                          const MCAsmLayout &Layout) const {
669d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar  // If this inst doesn't ever need relaxation, ignore it. This occurs when we
670d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar  // are intentionally pushing out inst fragments, or because we relaxed a
671d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar  // previous instruction to one that doesn't need relaxation.
672ec3433852dd11e8ff60c9610b4c84468e5935f2bJim Grosbach  if (!getBackend().mayNeedRelaxation(IF->getInst()))
673d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar    return false;
674d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar
675d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar  for (MCInstFragment::const_fixup_iterator it = IF->fixup_begin(),
676d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar         ie = IF->fixup_end(); it != ie; ++it)
677f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbach    if (fixupNeedsRelaxation(*it, IF, Layout))
678d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      return true;
679d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar
680d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar  return false;
681d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar}
682d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar
683f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbachbool MCAssembler::relaxInstruction(MCAsmLayout &Layout,
6843ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola                                   MCInstFragment &IF) {
685f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbach  if (!fragmentNeedsRelaxation(&IF, Layout))
6863ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola    return false;
6873ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola
6883ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  ++stats::RelaxedInstructions;
6893ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola
6903ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  // FIXME-PERF: We could immediately lower out instructions if we can tell
6913ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  // they are fully resolved, to avoid retesting on later passes.
6923ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola
6933ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  // Relax the fragment.
6943ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola
6953ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  MCInst Relaxed;
696ec3433852dd11e8ff60c9610b4c84468e5935f2bJim Grosbach  getBackend().relaxInstruction(IF.getInst(), Relaxed);
6973ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola
6983ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  // Encode the new instruction.
6993ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  //
7003ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  // FIXME-PERF: If it matters, we could let the target do this. It can
7013ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  // probably do so more efficiently in many cases.
7023ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  SmallVector<MCFixup, 4> Fixups;
7033ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  SmallString<256> Code;
7043ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  raw_svector_ostream VecOS(Code);
7053ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  getEmitter().EncodeInstruction(Relaxed, VecOS, Fixups);
7063ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  VecOS.flush();
7073ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola
7083ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  // Update the instruction fragment.
7093ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  IF.setInst(Relaxed);
7103ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  IF.getCode() = Code;
7113ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  IF.getFixups().clear();
7123ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  // FIXME: Eliminate copy.
7133ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  for (unsigned i = 0, e = Fixups.size(); i != e; ++i)
7143ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola    IF.getFixups().push_back(Fixups[i]);
7153ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola
7163ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  return true;
7173ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola}
7183ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola
719f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbachbool MCAssembler::relaxLEB(MCAsmLayout &Layout, MCLEBFragment &LF) {
720db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola  int64_t Value = 0;
721db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola  uint64_t OldSize = LF.getContents().size();
722d88cac0a6e908a366f403b37725e765604bc15d3Rafael Espindola  bool IsAbs = LF.getValue().EvaluateAsAbsolute(Value, Layout);
723d88cac0a6e908a366f403b37725e765604bc15d3Rafael Espindola  (void)IsAbs;
724d88cac0a6e908a366f403b37725e765604bc15d3Rafael Espindola  assert(IsAbs);
725db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola  SmallString<8> &Data = LF.getContents();
726db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola  Data.clear();
727db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola  raw_svector_ostream OSE(Data);
7283ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  if (LF.isSigned())
7292d39a0e52df9ce050bd4e2de3a2ecca8fd9a87c3Jim Grosbach    encodeSLEB128(Value, OSE);
7303ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  else
7312d39a0e52df9ce050bd4e2de3a2ecca8fd9a87c3Jim Grosbach    encodeULEB128(Value, OSE);
732db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola  OSE.flush();
733db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola  return OldSize != LF.getContents().size();
7343ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola}
7353ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola
736f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbachbool MCAssembler::relaxDwarfLineAddr(MCAsmLayout &Layout,
737f68a26b5d8e06a85edba97702884a74673b60807Jim Grosbach                                     MCDwarfLineAddrFragment &DF) {
738db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola  int64_t AddrDelta = 0;
739db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola  uint64_t OldSize = DF.getContents().size();
740835439a397407e421263bd476e5b18bf787ffb6aRafael Espindola  bool IsAbs = DF.getAddrDelta().EvaluateAsAbsolute(AddrDelta, Layout);
741835439a397407e421263bd476e5b18bf787ffb6aRafael Espindola  (void)IsAbs;
742835439a397407e421263bd476e5b18bf787ffb6aRafael Espindola  assert(IsAbs);
743187d8339dbc0530850e54a86edf36f1a865a5823Rafael Espindola  int64_t LineDelta;
744187d8339dbc0530850e54a86edf36f1a865a5823Rafael Espindola  LineDelta = DF.getLineDelta();
745db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola  SmallString<8> &Data = DF.getContents();
746db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola  Data.clear();
747db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola  raw_svector_ostream OSE(Data);
748db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola  MCDwarfLineAddr::Encode(LineDelta, AddrDelta, OSE);
749db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola  OSE.flush();
750db74aeadcd1b9a597ad0f80c0036e67e63ba20edRafael Espindola  return OldSize != Data.size();
751187d8339dbc0530850e54a86edf36f1a865a5823Rafael Espindola}
752187d8339dbc0530850e54a86edf36f1a865a5823Rafael Espindola
753f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbachbool MCAssembler::relaxDwarfCallFrameFragment(MCAsmLayout &Layout,
754245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola                                              MCDwarfCallFrameFragment &DF) {
755245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  int64_t AddrDelta = 0;
756245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  uint64_t OldSize = DF.getContents().size();
757245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  bool IsAbs = DF.getAddrDelta().EvaluateAsAbsolute(AddrDelta, Layout);
758245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  (void)IsAbs;
759245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  assert(IsAbs);
760245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  SmallString<8> &Data = DF.getContents();
761245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  Data.clear();
762245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  raw_svector_ostream OSE(Data);
7634eafe109459eb115f13f1d19c5ff3cb3678e8c7aRafael Espindola  MCDwarfFrameEmitter::EncodeAdvanceLoc(AddrDelta, OSE);
764245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  OSE.flush();
765245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  return OldSize != Data.size();
766245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola}
767245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola
768f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbachbool MCAssembler::layoutSectionOnce(MCAsmLayout &Layout,
76962b83b62f377ac248038672015dc65970327f786Rafael Espindola                                    MCSectionData &SD) {
77062b83b62f377ac248038672015dc65970327f786Rafael Espindola  MCFragment *FirstInvalidFragment = NULL;
77162b83b62f377ac248038672015dc65970327f786Rafael Espindola  // Scan for fragments that need relaxation.
77262b83b62f377ac248038672015dc65970327f786Rafael Espindola  for (MCSectionData::iterator it2 = SD.begin(),
77362b83b62f377ac248038672015dc65970327f786Rafael Espindola         ie2 = SD.end(); it2 != ie2; ++it2) {
77462b83b62f377ac248038672015dc65970327f786Rafael Espindola    // Check if this is an fragment that needs relaxation.
77562b83b62f377ac248038672015dc65970327f786Rafael Espindola    bool relaxedFrag = false;
77662b83b62f377ac248038672015dc65970327f786Rafael Espindola    switch(it2->getKind()) {
77762b83b62f377ac248038672015dc65970327f786Rafael Espindola    default:
77862b83b62f377ac248038672015dc65970327f786Rafael Espindola          break;
77962b83b62f377ac248038672015dc65970327f786Rafael Espindola    case MCFragment::FT_Inst:
780f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbach      relaxedFrag = relaxInstruction(Layout, *cast<MCInstFragment>(it2));
78162b83b62f377ac248038672015dc65970327f786Rafael Espindola      break;
78262b83b62f377ac248038672015dc65970327f786Rafael Espindola    case MCFragment::FT_Dwarf:
783f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbach      relaxedFrag = relaxDwarfLineAddr(Layout,
78462b83b62f377ac248038672015dc65970327f786Rafael Espindola                                       *cast<MCDwarfLineAddrFragment>(it2));
78562b83b62f377ac248038672015dc65970327f786Rafael Espindola      break;
786245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola    case MCFragment::FT_DwarfFrame:
787245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola      relaxedFrag =
788f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbach        relaxDwarfCallFrameFragment(Layout,
789245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola                                    *cast<MCDwarfCallFrameFragment>(it2));
790245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola      break;
791245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola    case MCFragment::FT_LEB:
792f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbach      relaxedFrag = relaxLEB(Layout, *cast<MCLEBFragment>(it2));
793245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola      break;
79462b83b62f377ac248038672015dc65970327f786Rafael Espindola    }
79562b83b62f377ac248038672015dc65970327f786Rafael Espindola    // Update the layout, and remember that we relaxed.
79662b83b62f377ac248038672015dc65970327f786Rafael Espindola    if (relaxedFrag && !FirstInvalidFragment)
79762b83b62f377ac248038672015dc65970327f786Rafael Espindola      FirstInvalidFragment = it2;
79862b83b62f377ac248038672015dc65970327f786Rafael Espindola  }
79962b83b62f377ac248038672015dc65970327f786Rafael Espindola  if (FirstInvalidFragment) {
80062b83b62f377ac248038672015dc65970327f786Rafael Espindola    Layout.Invalidate(FirstInvalidFragment);
80162b83b62f377ac248038672015dc65970327f786Rafael Espindola    return true;
80262b83b62f377ac248038672015dc65970327f786Rafael Espindola  }
80362b83b62f377ac248038672015dc65970327f786Rafael Espindola  return false;
80462b83b62f377ac248038672015dc65970327f786Rafael Espindola}
80562b83b62f377ac248038672015dc65970327f786Rafael Espindola
806f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbachbool MCAssembler::layoutOnce(MCAsmLayout &Layout) {
807ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar  ++stats::RelaxationSteps;
808ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar
8090cc8bd48619b943379f5c2cc11a19fb189342925Daniel Dunbar  bool WasRelaxed = false;
810f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar  for (iterator it = begin(), ie = end(); it != ie; ++it) {
811f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar    MCSectionData &SD = *it;
812f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbach    while(layoutSectionOnce(Layout, SD))
81362b83b62f377ac248038672015dc65970327f786Rafael Espindola      WasRelaxed = true;
814f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar  }
815f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar
8160cc8bd48619b943379f5c2cc11a19fb189342925Daniel Dunbar  return WasRelaxed;
817f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar}
818b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
819f77d5b14af6b92403b93f7ed249f9023e99028ccJim Grosbachvoid MCAssembler::finishLayout(MCAsmLayout &Layout) {
820b4172fa72915bd031383e81c83cd313c8c4b2e74Rafael Espindola  // The layout is done. Mark every fragment as valid.
8214f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola  for (unsigned int i = 0, n = Layout.getSectionOrder().size(); i != n; ++i) {
8224f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola    Layout.getFragmentOffset(&*Layout.getSectionOrder()[i]->rbegin());
8234f4363a490721fe6e4f275193e783f77fa631ef2Rafael Espindola  }
8243f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar}
8253f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar
826b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar// Debugging methods
827b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
828b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbarnamespace llvm {
829b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
830c90e30aa6f3792a460202017523171f435e2ba34Daniel Dunbarraw_ostream &operator<<(raw_ostream &OS, const MCFixup &AF) {
831c90e30aa6f3792a460202017523171f435e2ba34Daniel Dunbar  OS << "<MCFixup" << " Offset:" << AF.getOffset()
832482ad802f1b1885542ea8a30e144a228a1526912Daniel Dunbar     << " Value:" << *AF.getValue()
833482ad802f1b1885542ea8a30e144a228a1526912Daniel Dunbar     << " Kind:" << AF.getKind() << ">";
834b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  return OS;
835b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar}
836b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
837b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar}
838b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
839cc77eece74c8db09acc2af425e7e6c88a5bb30d1Manman Ren#ifndef NDEBUG
840b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbarvoid MCFragment::dump() {
841b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  raw_ostream &OS = llvm::errs();
842b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
843e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  OS << "<";
844e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  switch (getKind()) {
845e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  case MCFragment::FT_Align: OS << "MCAlignFragment"; break;
846e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  case MCFragment::FT_Data:  OS << "MCDataFragment"; break;
847e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  case MCFragment::FT_Fill:  OS << "MCFillFragment"; break;
848e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  case MCFragment::FT_Inst:  OS << "MCInstFragment"; break;
849e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  case MCFragment::FT_Org:   OS << "MCOrgFragment"; break;
850c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby  case MCFragment::FT_Dwarf: OS << "MCDwarfFragment"; break;
851245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  case MCFragment::FT_DwarfFrame: OS << "MCDwarfCallFrameFragment"; break;
8523ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  case MCFragment::FT_LEB:   OS << "MCLEBFragment"; break;
853e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  }
854e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar
855337718e09c99349939a53643984c04f5dc118bb7Daniel Dunbar  OS << "<MCFragment " << (void*) this << " LayoutOrder:" << LayoutOrder
8562bf6afc277edb32b1d940def5b3eb0e0d32a22b9Rafael Espindola     << " Offset:" << Offset << ">";
857b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
858e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  switch (getKind()) {
859e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  case MCFragment::FT_Align: {
860e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    const MCAlignFragment *AF = cast<MCAlignFragment>(this);
861e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    if (AF->hasEmitNops())
862e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar      OS << " (emit nops)";
863e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    OS << "\n       ";
864e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    OS << " Alignment:" << AF->getAlignment()
865e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar       << " Value:" << AF->getValue() << " ValueSize:" << AF->getValueSize()
866e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar       << " MaxBytesToEmit:" << AF->getMaxBytesToEmit() << ">";
867e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    break;
868b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  }
869e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  case MCFragment::FT_Data:  {
870e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    const MCDataFragment *DF = cast<MCDataFragment>(this);
871e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    OS << "\n       ";
872e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    OS << " Contents:[";
873e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    const SmallVectorImpl<char> &Contents = DF->getContents();
874e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    for (unsigned i = 0, e = Contents.size(); i != e; ++i) {
875e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar      if (i) OS << ",";
876e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar      OS << hexdigit((Contents[i] >> 4) & 0xF) << hexdigit(Contents[i] & 0xF);
877e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    }
878e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    OS << "] (" << Contents.size() << " bytes)";
879e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar
880e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    if (!DF->getFixups().empty()) {
881e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar      OS << ",\n       ";
882e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar      OS << " Fixups:[";
883e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar      for (MCDataFragment::const_fixup_iterator it = DF->fixup_begin(),
884e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar             ie = DF->fixup_end(); it != ie; ++it) {
885e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar        if (it != DF->fixup_begin()) OS << ",\n                ";
886e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar        OS << *it;
887e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar      }
888e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar      OS << "]";
8890bcf074867d4d366f7988a219c7a53265fcb4f23Daniel Dunbar    }
890e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    break;
891e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  }
892e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  case MCFragment::FT_Fill:  {
893e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    const MCFillFragment *FF = cast<MCFillFragment>(this);
894e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    OS << " Value:" << FF->getValue() << " ValueSize:" << FF->getValueSize()
895e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar       << " Size:" << FF->getSize();
896e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    break;
897e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  }
898e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  case MCFragment::FT_Inst:  {
899e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    const MCInstFragment *IF = cast<MCInstFragment>(this);
900e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    OS << "\n       ";
901e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    OS << " Inst:";
902e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    IF->getInst().dump_pretty(OS);
903e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    break;
904e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  }
905e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  case MCFragment::FT_Org:  {
906e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    const MCOrgFragment *OF = cast<MCOrgFragment>(this);
907e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    OS << "\n       ";
908e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    OS << " Offset:" << OF->getOffset() << " Value:" << OF->getValue();
909e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar    break;
910e614e393c7f80a39430b8a69813f5fd1f4c77cf9Daniel Dunbar  }
911c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby  case MCFragment::FT_Dwarf:  {
912c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby    const MCDwarfLineAddrFragment *OF = cast<MCDwarfLineAddrFragment>(this);
913c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby    OS << "\n       ";
914c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby    OS << " AddrDelta:" << OF->getAddrDelta()
915c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby       << " LineDelta:" << OF->getLineDelta();
916c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby    break;
917c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby  }
918245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  case MCFragment::FT_DwarfFrame:  {
919245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola    const MCDwarfCallFrameFragment *CF = cast<MCDwarfCallFrameFragment>(this);
920245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola    OS << "\n       ";
921245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola    OS << " AddrDelta:" << CF->getAddrDelta();
922245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola    break;
923245a1e20419aa5a3c833d7a8e89168e19d5f4d2cRafael Espindola  }
9243ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  case MCFragment::FT_LEB: {
9253ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola    const MCLEBFragment *LF = cast<MCLEBFragment>(this);
9263ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola    OS << "\n       ";
9273ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola    OS << " Value:" << LF->getValue() << " Signed:" << LF->isSigned();
9283ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola    break;
9293ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola  }
9300bcf074867d4d366f7988a219c7a53265fcb4f23Daniel Dunbar  }
9313f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  OS << ">";
9323f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar}
9333f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar
934b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbarvoid MCSectionData::dump() {
935b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  raw_ostream &OS = llvm::errs();
936b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
937b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "<MCSectionData";
93885f2ecc697a8ca6c8cf08093054cbbb9d2060ccfRafael Espindola  OS << " Alignment:" << getAlignment() << " Fragments:[\n      ";
939b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  for (iterator it = begin(), ie = end(); it != ie; ++it) {
940b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar    if (it != begin()) OS << ",\n      ";
941b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar    it->dump();
942b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  }
943b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "]>";
944b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar}
945b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
946b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbarvoid MCSymbolData::dump() {
947b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  raw_ostream &OS = llvm::errs();
948b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
949b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "<MCSymbolData Symbol:" << getSymbol()
950b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar     << " Fragment:" << getFragment() << " Offset:" << getOffset()
951b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar     << " Flags:" << getFlags() << " Index:" << getIndex();
952b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  if (isCommon())
953b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar    OS << " (common, size:" << getCommonSize()
954b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar       << " align: " << getCommonAlignment() << ")";
955b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  if (isExternal())
956b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar    OS << " (external)";
957b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  if (isPrivateExtern())
958b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar    OS << " (private extern)";
959b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << ">";
960b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar}
961b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
962b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbarvoid MCAssembler::dump() {
963b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  raw_ostream &OS = llvm::errs();
964b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
965b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "<MCAssembler\n";
96645aefff64c64d5bd7804f39d994883b98ce4415aDaniel Dunbar  OS << "  Sections:[\n    ";
967b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  for (iterator it = begin(), ie = end(); it != ie; ++it) {
968b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar    if (it != begin()) OS << ",\n    ";
969b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar    it->dump();
970b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  }
971b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "],\n";
972b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "  Symbols:[";
973b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
974b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  for (symbol_iterator it = symbol_begin(), ie = symbol_end(); it != ie; ++it) {
97545aefff64c64d5bd7804f39d994883b98ce4415aDaniel Dunbar    if (it != symbol_begin()) OS << ",\n           ";
976b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar    it->dump();
977b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  }
978b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "]>\n";
979b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar}
980cc77eece74c8db09acc2af425e7e6c88a5bb30d1Manman Ren#endif
9812d24e2a396a1d211baaeedf32148a3b657240170David Blaikie
9822d24e2a396a1d211baaeedf32148a3b657240170David Blaikie// anchors for MC*Fragment vtables
9832d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid MCDataFragment::anchor() { }
9842d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid MCInstFragment::anchor() { }
9852d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid MCAlignFragment::anchor() { }
9862d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid MCFillFragment::anchor() { }
9872d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid MCOrgFragment::anchor() { }
9882d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid MCLEBFragment::anchor() { }
9892d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid MCDwarfLineAddrFragment::anchor() { }
9902d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid MCDwarfCallFrameFragment::anchor() { }
991