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