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