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