MCAssembler.cpp revision 456b5012704bcece2c8c28783e6efabb7b998616
1fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar//===- lib/MC/MCAssembler.cpp - Assembler Backend Implementation ----------===//
2fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar//
3fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar//                     The LLVM Compiler Infrastructure
4fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar//
5fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar// This file is distributed under the University of Illinois Open Source
6fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar// License. See LICENSE.TXT for details.
7fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar//
8fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar//===----------------------------------------------------------------------===//
9fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
100adcd35f78b89bf70eb634b7f9ac2103516ca2b2Daniel Dunbar#define DEBUG_TYPE "assembler"
11fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar#include "llvm/MC/MCAssembler.h"
1218ff2cced7e08ac76d8d5bcff8160a5f9a109cbbDaniel Dunbar#include "llvm/MC/MCAsmLayout.h"
13b36052f0e4f59525b34bb4b56648c9121a8beda8Daniel Dunbar#include "llvm/MC/MCCodeEmitter.h"
141253a6fa3b0d79dc6ea25f2578f6473219d40047Daniel Dunbar#include "llvm/MC/MCExpr.h"
1553b2338a1d061ad15a858ff0d641431f4d4ac101Daniel Dunbar#include "llvm/MC/MCObjectWriter.h"
161253a6fa3b0d79dc6ea25f2578f6473219d40047Daniel Dunbar#include "llvm/MC/MCSymbol.h"
171253a6fa3b0d79dc6ea25f2578f6473219d40047Daniel Dunbar#include "llvm/MC/MCValue.h"
181a9158c301b58d8119664f416461d5a5549170c4Daniel Dunbar#include "llvm/ADT/OwningPtr.h"
190adcd35f78b89bf70eb634b7f9ac2103516ca2b2Daniel Dunbar#include "llvm/ADT/Statistic.h"
20b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar#include "llvm/ADT/StringExtras.h"
21d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar#include "llvm/ADT/Twine.h"
22ac2884a717daf3ad2aa8425320795d661e8a980bDaniel Dunbar#include "llvm/Support/Debug.h"
230705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar#include "llvm/Support/ErrorHandling.h"
24fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar#include "llvm/Support/raw_ostream.h"
25ee0d89245eabf93d89b5fef7ac8707680796826dDaniel Dunbar#include "llvm/Target/TargetRegistry.h"
26df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar#include "llvm/Target/TargetAsmBackend.h"
27f6346769b344f9b134f0661e8bd2b4245f6490eaDaniel Dunbar
2823132b188ba651ba172380cd082cc286df73d440Chris Lattner#include <vector>
29fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarusing namespace llvm;
30fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
31ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbarnamespace {
32ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbarnamespace stats {
330adcd35f78b89bf70eb634b7f9ac2103516ca2b2Daniel DunbarSTATISTIC(EmittedFragments, "Number of emitted assembler fragments");
34ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel DunbarSTATISTIC(EvaluateFixup, "Number of evaluated fixups");
35ac2884a717daf3ad2aa8425320795d661e8a980bDaniel DunbarSTATISTIC(FragmentLayouts, "Number of fragment layouts");
36ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel DunbarSTATISTIC(ObjectBytes, "Number of emitted object file bytes");
37ac2884a717daf3ad2aa8425320795d661e8a980bDaniel DunbarSTATISTIC(RelaxationSteps, "Number of assembler layout and relaxation steps");
38ac2884a717daf3ad2aa8425320795d661e8a980bDaniel DunbarSTATISTIC(RelaxedInstructions, "Number of relaxed instructions");
39ac2884a717daf3ad2aa8425320795d661e8a980bDaniel DunbarSTATISTIC(SectionLayouts, "Number of section layouts");
40ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar}
41ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar}
420adcd35f78b89bf70eb634b7f9ac2103516ca2b2Daniel Dunbar
438f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar// FIXME FIXME FIXME: There are number of places in this file where we convert
448f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar// what is a 64-bit assembler value used for computation into a value in the
458f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar// object file, which may truncate it. We should detect that truncation where
468f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar// invalid and report errors back.
478f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar
48fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar/* *** */
49fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
50bc1a0cf13950dcd64d6d0398df5419a0a2931721Daniel DunbarMCAsmLayout::MCAsmLayout(MCAssembler &Asm) : Assembler(Asm) {
51bc1a0cf13950dcd64d6d0398df5419a0a2931721Daniel Dunbar  // Compute the section layout order. Virtual sections must go last.
52bc1a0cf13950dcd64d6d0398df5419a0a2931721Daniel Dunbar  for (MCAssembler::iterator it = Asm.begin(), ie = Asm.end(); it != ie; ++it)
53bc1a0cf13950dcd64d6d0398df5419a0a2931721Daniel Dunbar    if (!Asm.getBackend().isVirtualSection(it->getSection()))
54bc1a0cf13950dcd64d6d0398df5419a0a2931721Daniel Dunbar      SectionOrder.push_back(&*it);
55bc1a0cf13950dcd64d6d0398df5419a0a2931721Daniel Dunbar  for (MCAssembler::iterator it = Asm.begin(), ie = Asm.end(); it != ie; ++it)
56bc1a0cf13950dcd64d6d0398df5419a0a2931721Daniel Dunbar    if (Asm.getBackend().isVirtualSection(it->getSection()))
57bc1a0cf13950dcd64d6d0398df5419a0a2931721Daniel Dunbar      SectionOrder.push_back(&*it);
58bc1a0cf13950dcd64d6d0398df5419a0a2931721Daniel Dunbar}
59bc1a0cf13950dcd64d6d0398df5419a0a2931721Daniel Dunbar
600cc8bd48619b943379f5c2cc11a19fb189342925Daniel Dunbarvoid MCAsmLayout::UpdateForSlide(MCFragment *F, int SlideAmount) {
610cc8bd48619b943379f5c2cc11a19fb189342925Daniel Dunbar  // We shouldn't have to do anything special to support negative slides, and it
62651804c3d63a05f72221a6d133e5b344e6aaa093Daniel Dunbar  // is a perfectly valid thing to do as long as other parts of the system can
63651804c3d63a05f72221a6d133e5b344e6aaa093Daniel Dunbar  // guarantee convergence.
640cc8bd48619b943379f5c2cc11a19fb189342925Daniel Dunbar  assert(SlideAmount >= 0 && "Negative slides not yet supported");
650cc8bd48619b943379f5c2cc11a19fb189342925Daniel Dunbar
660cc8bd48619b943379f5c2cc11a19fb189342925Daniel Dunbar  // Update the layout by simply recomputing the layout for the entire
670cc8bd48619b943379f5c2cc11a19fb189342925Daniel Dunbar  // file. This is trivially correct, but very slow.
680cc8bd48619b943379f5c2cc11a19fb189342925Daniel Dunbar  //
690cc8bd48619b943379f5c2cc11a19fb189342925Daniel Dunbar  // FIXME-PERF: This is O(N^2), but will be eliminated once we get smarter.
700cc8bd48619b943379f5c2cc11a19fb189342925Daniel Dunbar
71d13a0caf726e05c9bd939d752ef371d6d467ef28Daniel Dunbar  // Layout the sections in order.
72d13a0caf726e05c9bd939d752ef371d6d467ef28Daniel Dunbar  for (unsigned i = 0, e = getSectionOrder().size(); i != e; ++i)
73d13a0caf726e05c9bd939d752ef371d6d467ef28Daniel Dunbar    getAssembler().LayoutSection(*this, i);
740cc8bd48619b943379f5c2cc11a19fb189342925Daniel Dunbar}
750cc8bd48619b943379f5c2cc11a19fb189342925Daniel Dunbar
76207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbaruint64_t MCAsmLayout::getFragmentAddress(const MCFragment *F) const {
777c3d45a03e64ac1b5b2ecdb7153989fd7cebfd2cDaniel Dunbar  assert(F->getParent() && "Missing section()!");
78432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar  return getSectionAddress(F->getParent()) + getFragmentOffset(F);
79432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar}
80432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar
81432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbaruint64_t MCAsmLayout::getFragmentEffectiveSize(const MCFragment *F) const {
82432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar  assert(F->EffectiveSize != ~UINT64_C(0) && "Address not set!");
83432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar  return F->EffectiveSize;
84432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar}
85432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar
86432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbarvoid MCAsmLayout::setFragmentEffectiveSize(MCFragment *F, uint64_t Value) {
87432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar  F->EffectiveSize = Value;
88432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar}
89432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar
90432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbaruint64_t MCAsmLayout::getFragmentOffset(const MCFragment *F) const {
91432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar  assert(F->Offset != ~UINT64_C(0) && "Address not set!");
92432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar  return F->Offset;
93432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar}
94432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar
95432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbarvoid MCAsmLayout::setFragmentOffset(MCFragment *F, uint64_t Value) {
96432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar  F->Offset = Value;
97207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar}
98207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar
99207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbaruint64_t MCAsmLayout::getSymbolAddress(const MCSymbolData *SD) const {
1007c3d45a03e64ac1b5b2ecdb7153989fd7cebfd2cDaniel Dunbar  assert(SD->getFragment() && "Invalid getAddress() on undefined symbol!");
1017c3d45a03e64ac1b5b2ecdb7153989fd7cebfd2cDaniel Dunbar  return getFragmentAddress(SD->getFragment()) + SD->getOffset();
102207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar}
103207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar
104207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbaruint64_t MCAsmLayout::getSectionAddress(const MCSectionData *SD) const {
1057c3d45a03e64ac1b5b2ecdb7153989fd7cebfd2cDaniel Dunbar  assert(SD->Address != ~UINT64_C(0) && "Address not set!");
1067c3d45a03e64ac1b5b2ecdb7153989fd7cebfd2cDaniel Dunbar  return SD->Address;
107207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar}
108207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar
109207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbarvoid MCAsmLayout::setSectionAddress(MCSectionData *SD, uint64_t Value) {
1107c3d45a03e64ac1b5b2ecdb7153989fd7cebfd2cDaniel Dunbar  SD->Address = Value;
111207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar}
112207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar
1135d428511ca9607d52a09d3483d0738f483e09934Daniel Dunbaruint64_t MCAsmLayout::getSectionSize(const MCSectionData *SD) const {
1145d428511ca9607d52a09d3483d0738f483e09934Daniel Dunbar  assert(SD->Size != ~UINT64_C(0) && "File size not set!");
1155d428511ca9607d52a09d3483d0738f483e09934Daniel Dunbar  return SD->Size;
1165d428511ca9607d52a09d3483d0738f483e09934Daniel Dunbar}
1175d428511ca9607d52a09d3483d0738f483e09934Daniel Dunbarvoid MCAsmLayout::setSectionSize(MCSectionData *SD, uint64_t Value) {
1185d428511ca9607d52a09d3483d0738f483e09934Daniel Dunbar  SD->Size = Value;
1195d428511ca9607d52a09d3483d0738f483e09934Daniel Dunbar}
1205d428511ca9607d52a09d3483d0738f483e09934Daniel Dunbar
1215d428511ca9607d52a09d3483d0738f483e09934Daniel Dunbaruint64_t MCAsmLayout::getSectionFileSize(const MCSectionData *SD) const {
1225d428511ca9607d52a09d3483d0738f483e09934Daniel Dunbar  assert(SD->FileSize != ~UINT64_C(0) && "File size not set!");
1235d428511ca9607d52a09d3483d0738f483e09934Daniel Dunbar  return SD->FileSize;
1245d428511ca9607d52a09d3483d0738f483e09934Daniel Dunbar}
1255d428511ca9607d52a09d3483d0738f483e09934Daniel Dunbarvoid MCAsmLayout::setSectionFileSize(MCSectionData *SD, uint64_t Value) {
1265d428511ca9607d52a09d3483d0738f483e09934Daniel Dunbar  SD->FileSize = Value;
1275d428511ca9607d52a09d3483d0738f483e09934Daniel Dunbar}
1285d428511ca9607d52a09d3483d0738f483e09934Daniel Dunbar
129b5844ff1c44f0427bcf132eaece945da411e650fDaniel Dunbaruint64_t MCAsmLayout::getSectionAddressSize(const MCSectionData *SD) const {
130b5844ff1c44f0427bcf132eaece945da411e650fDaniel Dunbar  assert(SD->AddressSize != ~UINT64_C(0) && "Address size not set!");
131b5844ff1c44f0427bcf132eaece945da411e650fDaniel Dunbar  return SD->AddressSize;
132b5844ff1c44f0427bcf132eaece945da411e650fDaniel Dunbar}
133b5844ff1c44f0427bcf132eaece945da411e650fDaniel Dunbarvoid MCAsmLayout::setSectionAddressSize(MCSectionData *SD, uint64_t Value) {
134b5844ff1c44f0427bcf132eaece945da411e650fDaniel Dunbar  SD->AddressSize = Value;
135b5844ff1c44f0427bcf132eaece945da411e650fDaniel Dunbar}
136b5844ff1c44f0427bcf132eaece945da411e650fDaniel Dunbar
137207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar/* *** */
138207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar
1390705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel DunbarMCFragment::MCFragment() : Kind(FragmentType(~0)) {
1400705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar}
1410705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
1425e835967dd5dda294d0ef3392f4c1d4a2260f532Daniel DunbarMCFragment::MCFragment(FragmentType _Kind, MCSectionData *_Parent)
143071f73db4a0c3f7f00ef14d38af17f3c8d69827aDaniel Dunbar  : Kind(_Kind), Parent(_Parent), Atom(0), EffectiveSize(~UINT64_C(0))
144fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar{
1455e835967dd5dda294d0ef3392f4c1d4a2260f532Daniel Dunbar  if (Parent)
1465e835967dd5dda294d0ef3392f4c1d4a2260f532Daniel Dunbar    Parent->getFragmentList().push_back(this);
147fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar}
148fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
1490705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel DunbarMCFragment::~MCFragment() {
1500705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar}
1510705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
152fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar/* *** */
153fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
15481e400092f55c2eba157172bfc0dd0df8317638dDaniel DunbarMCSectionData::MCSectionData() : Section(0) {}
155fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
156fb4a6b397665df011348ade24a8e38d2219f095aDaniel DunbarMCSectionData::MCSectionData(const MCSection &_Section, MCAssembler *A)
15781e400092f55c2eba157172bfc0dd0df8317638dDaniel Dunbar  : Section(&_Section),
158fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar    Alignment(1),
1595e835967dd5dda294d0ef3392f4c1d4a2260f532Daniel Dunbar    Address(~UINT64_C(0)),
1606742e34385bff89b897ef0fc930c4bca9e75ac4aDaniel Dunbar    Size(~UINT64_C(0)),
161b5844ff1c44f0427bcf132eaece945da411e650fDaniel Dunbar    AddressSize(~UINT64_C(0)),
1623f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar    FileSize(~UINT64_C(0)),
163e1ec617c6abf0b9dc1eecbbfe483bda3bb2b7795Daniel Dunbar    HasInstructions(false)
164fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar{
165fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  if (A)
166fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar    A->getSectionList().push_back(this);
167fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar}
168fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
169fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar/* *** */
170fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
171efbb5330b8d383a393c83d2da5d631c98b0bb3fdDaniel DunbarMCSymbolData::MCSymbolData() : Symbol(0) {}
172f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar
173cb579b3338fe8d9e4424b138f597a4696cb89de3Daniel DunbarMCSymbolData::MCSymbolData(const MCSymbol &_Symbol, MCFragment *_Fragment,
174f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar                           uint64_t _Offset, MCAssembler *A)
175efbb5330b8d383a393c83d2da5d631c98b0bb3fdDaniel Dunbar  : Symbol(&_Symbol), Fragment(_Fragment), Offset(_Offset),
1768f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar    IsExternal(false), IsPrivateExtern(false),
1778f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar    CommonSize(0), CommonAlign(0), Flags(0), Index(0)
178f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar{
179f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar  if (A)
180f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar    A->getSymbolList().push_back(this);
181f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar}
182f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar
183f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar/* *** */
184f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar
1851f3e445184e5ca2aa4295c2a77f2a4e0b957fea1Daniel DunbarMCAssembler::MCAssembler(MCContext &_Context, TargetAsmBackend &_Backend,
186cf871e5abff63a53f9e97ff9e37fb7297d0cb847Daniel Dunbar                         MCCodeEmitter &_Emitter, raw_ostream &_OS)
187cf871e5abff63a53f9e97ff9e37fb7297d0cb847Daniel Dunbar  : Context(_Context), Backend(_Backend), Emitter(_Emitter),
188ac2884a717daf3ad2aa8425320795d661e8a980bDaniel Dunbar    OS(_OS), RelaxAll(false), SubsectionsViaSymbols(false)
1896009db486e7fba448ccb28dff676c012efade8f0Daniel Dunbar{
1906009db486e7fba448ccb28dff676c012efade8f0Daniel Dunbar}
191fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
192fb4a6b397665df011348ade24a8e38d2219f095aDaniel DunbarMCAssembler::~MCAssembler() {
193fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar}
194fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
195939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbarstatic bool isScatteredFixupFullyResolvedSimple(const MCAssembler &Asm,
196939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar                                                const MCAsmFixup &Fixup,
197939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar                                                const MCValue Target,
198939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar                                                const MCSection *BaseSection) {
199939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  // The effective fixup address is
200939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  //     addr(atom(A)) + offset(A)
201939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  //   - addr(atom(B)) - offset(B)
202939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  //   - addr(<base symbol>) + <fixup offset from base symbol>
203939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  // and the offsets are not relocatable, so the fixup is fully resolved when
204939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  //  addr(atom(A)) - addr(atom(B)) - addr(<base symbol>)) == 0.
205939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  //
206939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  // The simple (Darwin, except on x86_64) way of dealing with this was to
207939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  // assume that any reference to a temporary symbol *must* be a temporary
208939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  // symbol in the same atom, unless the sections differ. Therefore, any PCrel
209939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  // relocation to a temporary symbol (in the same section) is fully
210939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  // resolved. This also works in conjunction with absolutized .set, which
211939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  // requires the compiler to use .set to absolutize the differences between
212939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  // symbols which the compiler knows to be assembly time constants, so we don't
21331e8e1d08566c9b169df003d499a7e22856e5408Daniel Dunbar  // need to worry about considering symbol differences fully resolved.
214939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar
215939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  // Non-relative fixups are only resolved if constant.
216939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  if (!BaseSection)
217939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar    return Target.isAbsolute();
218939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar
219939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  // Otherwise, relative fixups are only resolved if not a difference and the
220939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  // target is a temporary in the same section.
221939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  if (Target.isAbsolute() || Target.getSymB())
222939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar    return false;
223939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar
224939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  const MCSymbol *A = &Target.getSymA()->getSymbol();
225939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  if (!A->isTemporary() || !A->isInSection() ||
226939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar      &A->getSection() != BaseSection)
227939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar    return false;
228939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar
229939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  return true;
230939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar}
231939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar
232034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbarstatic bool isScatteredFixupFullyResolved(const MCAssembler &Asm,
233207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar                                          const MCAsmLayout &Layout,
234034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar                                          const MCAsmFixup &Fixup,
235034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar                                          const MCValue Target,
236034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar                                          const MCSymbolData *BaseSymbol) {
237034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar  // The effective fixup address is
238034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar  //     addr(atom(A)) + offset(A)
239034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar  //   - addr(atom(B)) - offset(B)
240034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar  //   - addr(BaseSymbol) + <fixup offset from base symbol>
241034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar  // and the offsets are not relocatable, so the fixup is fully resolved when
242034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar  //  addr(atom(A)) - addr(atom(B)) - addr(BaseSymbol) == 0.
243034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar  //
244034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar  // Note that "false" is almost always conservatively correct (it means we emit
245034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar  // a relocation which is unnecessary), except when it would force us to emit a
246034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar  // relocation which the target cannot encode.
247034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar
248034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar  const MCSymbolData *A_Base = 0, *B_Base = 0;
249034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar  if (const MCSymbolRefExpr *A = Target.getSymA()) {
250034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar    // Modified symbol references cannot be resolved.
251034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar    if (A->getKind() != MCSymbolRefExpr::VK_None)
252034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar      return false;
253034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar
254207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar    A_Base = Asm.getAtom(Layout, &Asm.getSymbolData(A->getSymbol()));
255034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar    if (!A_Base)
256034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar      return false;
257034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar  }
258034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar
259034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar  if (const MCSymbolRefExpr *B = Target.getSymB()) {
260034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar    // Modified symbol references cannot be resolved.
261034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar    if (B->getKind() != MCSymbolRefExpr::VK_None)
262034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar      return false;
263034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar
264207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar    B_Base = Asm.getAtom(Layout, &Asm.getSymbolData(B->getSymbol()));
265034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar    if (!B_Base)
266034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar      return false;
267034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar  }
268034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar
269034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar  // If there is no base, A and B have to be the same atom for this fixup to be
270034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar  // fully resolved.
271034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar  if (!BaseSymbol)
272034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar    return A_Base == B_Base;
273034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar
274034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar  // Otherwise, B must be missing and A must be the base.
275034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar  return !B_Base && BaseSymbol == A_Base;
276034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar}
277034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar
278238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbarbool MCAssembler::isSymbolLinkerVisible(const MCSymbolData *SD) const {
279238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar  // Non-temporary labels should always be visible to the linker.
280238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar  if (!SD->getSymbol().isTemporary())
281238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar    return true;
282238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar
283238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar  // Absolute temporary labels are never visible.
284238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar  if (!SD->getFragment())
285238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar    return false;
286238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar
287238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar  // Otherwise, check if the section requires symbols even for temporary labels.
288238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar  return getBackend().doesSectionRequireSymbols(
289238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar    SD->getFragment()->getParent()->getSection());
290238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar}
291238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar
292207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbarconst MCSymbolData *MCAssembler::getAtom(const MCAsmLayout &Layout,
293207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar                                         const MCSymbolData *SD) const {
2948ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar  // Linker visible symbols define atoms.
2958ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar  if (isSymbolLinkerVisible(SD))
2968ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar    return SD;
2978ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar
2988ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar  // Absolute and undefined symbols have no defining atom.
2998ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar  if (!SD->getFragment())
3008ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar    return 0;
3018ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar
302a5f1d57f65ae601ec181c0f4e36cf0df5e8d79d8Daniel Dunbar  // Non-linker visible symbols in sections which can't be atomized have no
303a5f1d57f65ae601ec181c0f4e36cf0df5e8d79d8Daniel Dunbar  // defining atom.
304a5f1d57f65ae601ec181c0f4e36cf0df5e8d79d8Daniel Dunbar  if (!getBackend().isSectionAtomizable(
305a5f1d57f65ae601ec181c0f4e36cf0df5e8d79d8Daniel Dunbar        SD->getFragment()->getParent()->getSection()))
306a5f1d57f65ae601ec181c0f4e36cf0df5e8d79d8Daniel Dunbar    return 0;
307a5f1d57f65ae601ec181c0f4e36cf0df5e8d79d8Daniel Dunbar
308651804c3d63a05f72221a6d133e5b344e6aaa093Daniel Dunbar  // Otherwise, return the atom for the containing fragment.
309651804c3d63a05f72221a6d133e5b344e6aaa093Daniel Dunbar  return SD->getFragment()->getAtom();
3108ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar}
3118ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar
3129d39e616cc0f43e91e509e5c8129c7d46327fd0dDaniel Dunbarbool MCAssembler::EvaluateFixup(const MCAsmLayout &Layout,
3139d39e616cc0f43e91e509e5c8129c7d46327fd0dDaniel Dunbar                                const MCAsmFixup &Fixup, const MCFragment *DF,
314df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar                                MCValue &Target, uint64_t &Value) const {
315ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar  ++stats::EvaluateFixup;
316ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar
317df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar  if (!Fixup.Value->EvaluateAsRelocatable(Target, &Layout))
31875361b69f3f327842b9dad69fa7f28ae3b688412Chris Lattner    report_fatal_error("expected relocatable expression");
319df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar
320df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar  // FIXME: How do non-scattered symbols work in ELF? I presume the linker
321df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar  // doesn't support small relocations, but then under what criteria does the
322df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar  // assembler allow symbol differences?
323df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar
324df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar  Value = Target.getConstant();
325df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar
326b36052f0e4f59525b34bb4b56648c9121a8beda8Daniel Dunbar  bool IsPCRel =
327b36052f0e4f59525b34bb4b56648c9121a8beda8Daniel Dunbar    Emitter.getFixupKindInfo(Fixup.Kind).Flags & MCFixupKindInfo::FKF_IsPCRel;
328b36052f0e4f59525b34bb4b56648c9121a8beda8Daniel Dunbar  bool IsResolved = true;
3299a1d20042f6a6ec648a3588f9b13264a4570aab0Daniel Dunbar  if (const MCSymbolRefExpr *A = Target.getSymA()) {
3309a1d20042f6a6ec648a3588f9b13264a4570aab0Daniel Dunbar    if (A->getSymbol().isDefined())
331207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar      Value += Layout.getSymbolAddress(&getSymbolData(A->getSymbol()));
332df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar    else
333df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar      IsResolved = false;
334df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar  }
3359a1d20042f6a6ec648a3588f9b13264a4570aab0Daniel Dunbar  if (const MCSymbolRefExpr *B = Target.getSymB()) {
3369a1d20042f6a6ec648a3588f9b13264a4570aab0Daniel Dunbar    if (B->getSymbol().isDefined())
337207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar      Value -= Layout.getSymbolAddress(&getSymbolData(B->getSymbol()));
338df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar    else
339df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar      IsResolved = false;
340939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  }
341df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar
342939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  // If we are using scattered symbols, determine whether this value is actually
343939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  // resolved; scattering may cause atoms to move.
344939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  if (IsResolved && getBackend().hasScatteredSymbols()) {
345939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar    if (getBackend().hasReliableSymbolDifference()) {
346034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar      // If this is a PCrel relocation, find the base atom (identified by its
347034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar      // symbol) that the fixup value is relative to.
348034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar      const MCSymbolData *BaseSymbol = 0;
349034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar      if (IsPCRel) {
350651804c3d63a05f72221a6d133e5b344e6aaa093Daniel Dunbar        BaseSymbol = DF->getAtom();
351034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar        if (!BaseSymbol)
352034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar          IsResolved = false;
353034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar      }
354034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar
355034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar      if (IsResolved)
356207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar        IsResolved = isScatteredFixupFullyResolved(*this, Layout, Fixup, Target,
357034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar                                                   BaseSymbol);
358939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar    } else {
359939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar      const MCSection *BaseSection = 0;
360939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar      if (IsPCRel)
361939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar        BaseSection = &DF->getParent()->getSection();
362939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar
363c6f598209a6ffc1e5273d867c7fd545359c4f209Daniel Dunbar      IsResolved = isScatteredFixupFullyResolvedSimple(*this, Fixup, Target,
364939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar                                                       BaseSection);
365939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar    }
366df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar  }
367df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar
368df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar  if (IsPCRel)
369207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar    Value -= Layout.getFragmentAddress(DF) + Fixup.Offset;
370df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar
371df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar  return IsResolved;
372df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar}
373df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar
374f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbarvoid MCAssembler::LayoutFragment(MCAsmLayout &Layout, MCFragment &F) {
375f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar  uint64_t StartAddress = Layout.getSectionAddress(F.getParent());
376f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar
377f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar  // Get the fragment start address.
378f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar  uint64_t Address = StartAddress;
379f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar  MCSectionData::iterator it = &F;
380f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar  if (MCFragment *Prev = F.getPrevNode())
381f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar    Address = (StartAddress + Layout.getFragmentOffset(Prev) +
382f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar               Layout.getFragmentEffectiveSize(Prev));
383f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar
384f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar  ++stats::FragmentLayouts;
385f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar
386f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar  uint64_t FragmentOffset = Address - StartAddress;
387f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar  Layout.setFragmentOffset(&F, FragmentOffset);
388f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar
389f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar  // Evaluate fragment size.
390f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar  uint64_t EffectiveSize = 0;
391f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar  switch (F.getKind()) {
392f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar  case MCFragment::FT_Align: {
393f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar    MCAlignFragment &AF = cast<MCAlignFragment>(F);
394f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar
395456b5012704bcece2c8c28783e6efabb7b998616Daniel Dunbar    assert((!AF.hasOnlyAlignAddress() || !AF.getNextNode()) &&
396456b5012704bcece2c8c28783e6efabb7b998616Daniel Dunbar           "Invalid OnlyAlignAddress bit, not the last fragment!");
397456b5012704bcece2c8c28783e6efabb7b998616Daniel Dunbar
398f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar    EffectiveSize = OffsetToAlignment(Address, AF.getAlignment());
399f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar    if (EffectiveSize > AF.getMaxBytesToEmit())
400f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar      EffectiveSize = 0;
401f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar    break;
402f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar  }
403f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar
404f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar  case MCFragment::FT_Data:
405f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar    EffectiveSize = cast<MCDataFragment>(F).getContents().size();
406f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar    break;
407f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar
408f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar  case MCFragment::FT_Fill: {
4094e544870c4c3f81b150e4c3b38a18d629d706b74Daniel Dunbar    EffectiveSize = cast<MCFillFragment>(F).getSize();
410f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar    break;
411f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar  }
412f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar
413f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar  case MCFragment::FT_Inst:
414f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar    EffectiveSize = cast<MCInstFragment>(F).getInstSize();
415f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar    break;
416f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar
417f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar  case MCFragment::FT_Org: {
418f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar    MCOrgFragment &OF = cast<MCOrgFragment>(F);
419f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar
420f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar    int64_t TargetLocation;
421f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar    if (!OF.getOffset().EvaluateAsAbsolute(TargetLocation, &Layout))
422f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar      report_fatal_error("expected assembly-time absolute expression");
423f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar
424f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar    // FIXME: We need a way to communicate this error.
425f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar    int64_t Offset = TargetLocation - FragmentOffset;
426f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar    if (Offset < 0)
427f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar      report_fatal_error("invalid .org offset '" + Twine(TargetLocation) +
428f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar                         "' (at offset '" + Twine(FragmentOffset) + "'");
429f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar
430f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar    EffectiveSize = Offset;
431f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar    break;
432f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar  }
433f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar  }
434f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar
435f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar  Layout.setFragmentEffectiveSize(&F, EffectiveSize);
436f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar}
437f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar
438d13a0caf726e05c9bd939d752ef371d6d467ef28Daniel Dunbarvoid MCAssembler::LayoutSection(MCAsmLayout &Layout,
439d13a0caf726e05c9bd939d752ef371d6d467ef28Daniel Dunbar                                unsigned SectionOrderIndex) {
440d13a0caf726e05c9bd939d752ef371d6d467ef28Daniel Dunbar  MCSectionData &SD = *Layout.getSectionOrder()[SectionOrderIndex];
441f476b00f51c98d12dda1f3a7c8455f8d74812c6dDaniel Dunbar  bool IsVirtual = getBackend().isVirtualSection(SD.getSection());
442f476b00f51c98d12dda1f3a7c8455f8d74812c6dDaniel Dunbar
443ac2884a717daf3ad2aa8425320795d661e8a980bDaniel Dunbar  ++stats::SectionLayouts;
444ac2884a717daf3ad2aa8425320795d661e8a980bDaniel Dunbar
445d13a0caf726e05c9bd939d752ef371d6d467ef28Daniel Dunbar  // Get the section start address.
446d13a0caf726e05c9bd939d752ef371d6d467ef28Daniel Dunbar  uint64_t StartAddress = 0;
447d13a0caf726e05c9bd939d752ef371d6d467ef28Daniel Dunbar  if (SectionOrderIndex) {
448d13a0caf726e05c9bd939d752ef371d6d467ef28Daniel Dunbar    MCSectionData *Prev = Layout.getSectionOrder()[SectionOrderIndex - 1];
449b5844ff1c44f0427bcf132eaece945da411e650fDaniel Dunbar    StartAddress = (Layout.getSectionAddress(Prev) +
450b5844ff1c44f0427bcf132eaece945da411e650fDaniel Dunbar                    Layout.getSectionAddressSize(Prev));
451d13a0caf726e05c9bd939d752ef371d6d467ef28Daniel Dunbar  }
452d13a0caf726e05c9bd939d752ef371d6d467ef28Daniel Dunbar
453f476b00f51c98d12dda1f3a7c8455f8d74812c6dDaniel Dunbar  // Align this section if necessary by adding padding bytes to the previous
454f476b00f51c98d12dda1f3a7c8455f8d74812c6dDaniel Dunbar  // section. It is safe to adjust this out-of-band, because no symbol or
455f476b00f51c98d12dda1f3a7c8455f8d74812c6dDaniel Dunbar  // fragment is allowed to point past the end of the section at any time.
456f476b00f51c98d12dda1f3a7c8455f8d74812c6dDaniel Dunbar  if (uint64_t Pad = OffsetToAlignment(StartAddress, SD.getAlignment())) {
457f476b00f51c98d12dda1f3a7c8455f8d74812c6dDaniel Dunbar    // Unless this section is virtual (where we are allowed to adjust the offset
458f476b00f51c98d12dda1f3a7c8455f8d74812c6dDaniel Dunbar    // freely), the padding goes in the previous section.
459f476b00f51c98d12dda1f3a7c8455f8d74812c6dDaniel Dunbar    if (!IsVirtual) {
46052f8dff671280dc13143ba2a5d09d2da243cbb0aDaniel Dunbar      assert(SectionOrderIndex && "Invalid initial section address!");
46152f8dff671280dc13143ba2a5d09d2da243cbb0aDaniel Dunbar      MCSectionData *Prev = Layout.getSectionOrder()[SectionOrderIndex - 1];
46252f8dff671280dc13143ba2a5d09d2da243cbb0aDaniel Dunbar      Layout.setSectionFileSize(Prev, Layout.getSectionFileSize(Prev) + Pad);
463f476b00f51c98d12dda1f3a7c8455f8d74812c6dDaniel Dunbar    }
464f476b00f51c98d12dda1f3a7c8455f8d74812c6dDaniel Dunbar
465f476b00f51c98d12dda1f3a7c8455f8d74812c6dDaniel Dunbar    StartAddress += Pad;
466f476b00f51c98d12dda1f3a7c8455f8d74812c6dDaniel Dunbar  }
467f476b00f51c98d12dda1f3a7c8455f8d74812c6dDaniel Dunbar
468f476b00f51c98d12dda1f3a7c8455f8d74812c6dDaniel Dunbar  // Set the aligned section address.
469be644a38c09bd0fa03bb07f48f2c1dec32052de8Daniel Dunbar  Layout.setSectionAddress(&SD, StartAddress);
4700705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
471f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar  for (MCSectionData::iterator it = SD.begin(), ie = SD.end(); it != ie; ++it)
472f0d17d2461a6458568672f611ba4a590d26b1e1aDaniel Dunbar    LayoutFragment(Layout, *it);
4730705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
4746742e34385bff89b897ef0fc930c4bca9e75ac4aDaniel Dunbar  // Set the section sizes.
4752d891a20e665136a603cc0a076ed1ebbd4703f47Daniel Dunbar  uint64_t Size = 0;
4762d891a20e665136a603cc0a076ed1ebbd4703f47Daniel Dunbar  if (!SD.getFragmentList().empty()) {
4772d891a20e665136a603cc0a076ed1ebbd4703f47Daniel Dunbar    MCFragment *F = &SD.getFragmentList().back();
4782d891a20e665136a603cc0a076ed1ebbd4703f47Daniel Dunbar    Size = Layout.getFragmentOffset(F) + Layout.getFragmentEffectiveSize(F);
4792d891a20e665136a603cc0a076ed1ebbd4703f47Daniel Dunbar  }
480b5844ff1c44f0427bcf132eaece945da411e650fDaniel Dunbar  Layout.setSectionAddressSize(&SD, Size);
4812d891a20e665136a603cc0a076ed1ebbd4703f47Daniel Dunbar  Layout.setSectionFileSize(&SD, IsVirtual ? 0 : Size);
482456b5012704bcece2c8c28783e6efabb7b998616Daniel Dunbar
483456b5012704bcece2c8c28783e6efabb7b998616Daniel Dunbar  // Handle OnlyAlignAddress bit.
484456b5012704bcece2c8c28783e6efabb7b998616Daniel Dunbar  if (!SD.getFragmentList().empty()) {
485456b5012704bcece2c8c28783e6efabb7b998616Daniel Dunbar    MCAlignFragment *AF =
486456b5012704bcece2c8c28783e6efabb7b998616Daniel Dunbar      dyn_cast<MCAlignFragment>(&SD.getFragmentList().back());
487456b5012704bcece2c8c28783e6efabb7b998616Daniel Dunbar    if (AF && AF->hasOnlyAlignAddress())
488456b5012704bcece2c8c28783e6efabb7b998616Daniel Dunbar      Size -= Layout.getFragmentEffectiveSize(AF);
489456b5012704bcece2c8c28783e6efabb7b998616Daniel Dunbar  }
490456b5012704bcece2c8c28783e6efabb7b998616Daniel Dunbar
491456b5012704bcece2c8c28783e6efabb7b998616Daniel Dunbar  Layout.setSectionSize(&SD, Size);
4920705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar}
4930705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
49453b2338a1d061ad15a858ff0d641431f4d4ac101Daniel Dunbar/// WriteFragmentData - Write the \arg F data to the output file.
495432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbarstatic void WriteFragmentData(const MCAssembler &Asm, const MCAsmLayout &Layout,
496432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar                              const MCFragment &F, MCObjectWriter *OW) {
49753b2338a1d061ad15a858ff0d641431f4d4ac101Daniel Dunbar  uint64_t Start = OW->getStream().tell();
4980705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  (void) Start;
4997eb85194f2b07bc7ba3f274fc00dc389b77b63bfDaniel Dunbar
500ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar  ++stats::EmittedFragments;
5010adcd35f78b89bf70eb634b7f9ac2103516ca2b2Daniel Dunbar
5020705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  // FIXME: Embed in fragments instead?
503432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar  uint64_t FragmentSize = Layout.getFragmentEffectiveSize(&F);
5040705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  switch (F.getKind()) {
505d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar  case MCFragment::FT_Align: {
506d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    MCAlignFragment &AF = cast<MCAlignFragment>(F);
507432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar    uint64_t Count = FragmentSize / AF.getValueSize();
508d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar
509e73d49eda2cb4fc30b52c4a241acf69c8af98302Daniel Dunbar    assert(AF.getValueSize() && "Invalid virtual align in concrete fragment!");
510e73d49eda2cb4fc30b52c4a241acf69c8af98302Daniel Dunbar
511d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    // FIXME: This error shouldn't actually occur (the front end should emit
512d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    // multiple .align directives to enforce the semantics it wants), but is
513d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    // severe enough that we want to report it. How to handle this?
514432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar    if (Count * AF.getValueSize() != FragmentSize)
51575361b69f3f327842b9dad69fa7f28ae3b688412Chris Lattner      report_fatal_error("undefined .align directive, value size '" +
5167eb85194f2b07bc7ba3f274fc00dc389b77b63bfDaniel Dunbar                        Twine(AF.getValueSize()) +
517d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar                        "' is not a divisor of padding size '" +
518432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar                        Twine(FragmentSize) + "'");
519d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar
5206e72048add2a6464e038121c6c275da37528aa0aKevin Enderby    // See if we are aligning with nops, and if so do that first to try to fill
5216e72048add2a6464e038121c6c275da37528aa0aKevin Enderby    // the Count bytes.  Then if that did not fill any bytes or there are any
5226e72048add2a6464e038121c6c275da37528aa0aKevin Enderby    // bytes left to fill use the the Value and ValueSize to fill the rest.
5238f9b80e5df12779a56d763ebf20864dad2bc72daDaniel Dunbar    // If we are aligning with nops, ask that target to emit the right data.
5241c15413ebc8f4a35545a381a789a718627396d03Daniel Dunbar    if (AF.hasEmitNops()) {
5258f9b80e5df12779a56d763ebf20864dad2bc72daDaniel Dunbar      if (!Asm.getBackend().WriteNopData(Count, OW))
52675361b69f3f327842b9dad69fa7f28ae3b688412Chris Lattner        report_fatal_error("unable to write nop sequence of " +
5278f9b80e5df12779a56d763ebf20864dad2bc72daDaniel Dunbar                          Twine(Count) + " bytes");
5288f9b80e5df12779a56d763ebf20864dad2bc72daDaniel Dunbar      break;
5296e72048add2a6464e038121c6c275da37528aa0aKevin Enderby    }
5306e72048add2a6464e038121c6c275da37528aa0aKevin Enderby
5318f9b80e5df12779a56d763ebf20864dad2bc72daDaniel Dunbar    // Otherwise, write out in multiples of the value size.
532d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    for (uint64_t i = 0; i != Count; ++i) {
533d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar      switch (AF.getValueSize()) {
534d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar      default:
535d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar        assert(0 && "Invalid size!");
536bdd9281f356d326155dc2ca5585a708e09e90600Daniel Dunbar      case 1: OW->Write8 (uint8_t (AF.getValue())); break;
537bdd9281f356d326155dc2ca5585a708e09e90600Daniel Dunbar      case 2: OW->Write16(uint16_t(AF.getValue())); break;
538bdd9281f356d326155dc2ca5585a708e09e90600Daniel Dunbar      case 4: OW->Write32(uint32_t(AF.getValue())); break;
539bdd9281f356d326155dc2ca5585a708e09e90600Daniel Dunbar      case 8: OW->Write64(uint64_t(AF.getValue())); break;
540d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar      }
541d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    }
542d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    break;
543d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar  }
5440705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
5453a30b827a5c9bf0ed8f31177b6e447083ce9afecDaniel Dunbar  case MCFragment::FT_Data: {
5463f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar    MCDataFragment &DF = cast<MCDataFragment>(F);
547432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar    assert(FragmentSize == DF.getContents().size() && "Invalid size!");
5483f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar    OW->WriteBytes(DF.getContents().str());
5490705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar    break;
5503a30b827a5c9bf0ed8f31177b6e447083ce9afecDaniel Dunbar  }
5510705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
5520705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  case MCFragment::FT_Fill: {
5530705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar    MCFillFragment &FF = cast<MCFillFragment>(F);
554e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar
555e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar    assert(FF.getValueSize() && "Invalid virtual align in concrete fragment!");
556e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar
5573153fec733acd079a9e681d16d39253b9517e02cDaniel Dunbar    for (uint64_t i = 0, e = FF.getSize() / FF.getValueSize(); i != e; ++i) {
5580705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar      switch (FF.getValueSize()) {
5590705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar      default:
5600705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar        assert(0 && "Invalid size!");
561bdd9281f356d326155dc2ca5585a708e09e90600Daniel Dunbar      case 1: OW->Write8 (uint8_t (FF.getValue())); break;
562bdd9281f356d326155dc2ca5585a708e09e90600Daniel Dunbar      case 2: OW->Write16(uint16_t(FF.getValue())); break;
563bdd9281f356d326155dc2ca5585a708e09e90600Daniel Dunbar      case 4: OW->Write32(uint32_t(FF.getValue())); break;
564bdd9281f356d326155dc2ca5585a708e09e90600Daniel Dunbar      case 8: OW->Write64(uint64_t(FF.getValue())); break;
5650705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar      }
5660705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar    }
5670705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar    break;
5680705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  }
5697eb85194f2b07bc7ba3f274fc00dc389b77b63bfDaniel Dunbar
5703f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  case MCFragment::FT_Inst:
5713f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar    llvm_unreachable("unexpected inst fragment after lowering");
5723f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar    break;
5733f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar
574d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar  case MCFragment::FT_Org: {
575d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    MCOrgFragment &OF = cast<MCOrgFragment>(F);
576d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar
577432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar    for (uint64_t i = 0, e = FragmentSize; i != e; ++i)
578bdd9281f356d326155dc2ca5585a708e09e90600Daniel Dunbar      OW->Write8(uint8_t(OF.getValue()));
579d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar
580d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    break;
581d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar  }
5820705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  }
5830705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
584432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar  assert(OW->getStream().tell() - Start == FragmentSize);
5850705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar}
5860705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
58753b2338a1d061ad15a858ff0d641431f4d4ac101Daniel Dunbarvoid MCAssembler::WriteSectionData(const MCSectionData *SD,
588432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar                                   const MCAsmLayout &Layout,
58953b2338a1d061ad15a858ff0d641431f4d4ac101Daniel Dunbar                                   MCObjectWriter *OW) const {
5905d428511ca9607d52a09d3483d0738f483e09934Daniel Dunbar  uint64_t SectionSize = Layout.getSectionSize(SD);
5915d428511ca9607d52a09d3483d0738f483e09934Daniel Dunbar  uint64_t SectionFileSize = Layout.getSectionFileSize(SD);
5925d428511ca9607d52a09d3483d0738f483e09934Daniel Dunbar
593d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar  // Ignore virtual sections.
594cc5b84c6fba79a798e86ea604e54ca9429273a13Daniel Dunbar  if (getBackend().isVirtualSection(SD->getSection())) {
5955d428511ca9607d52a09d3483d0738f483e09934Daniel Dunbar    assert(SectionFileSize == 0 && "Invalid size for section!");
596e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar
597e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar    // Check that contents are only things legal inside a virtual section.
598e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar    for (MCSectionData::const_iterator it = SD->begin(),
599e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar           ie = SD->end(); it != ie; ++it) {
600e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar      switch (it->getKind()) {
601e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar      default:
602e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar        assert(0 && "Invalid fragment in virtual section!");
603e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar      case MCFragment::FT_Align:
604e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar        assert(!cast<MCAlignFragment>(it)->getValueSize() &&
605e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar               "Invalid align in virtual section!");
606e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar        break;
607e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar      case MCFragment::FT_Fill:
608e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar        assert(!cast<MCFillFragment>(it)->getValueSize() &&
609e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar               "Invalid fill in virtual section!");
610e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar        break;
611e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar      }
612e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar    }
613e2fee5b2369b4d6c31d3ad3b0a7d257e6df22041Daniel Dunbar
614d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar    return;
615d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar  }
616d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar
61753b2338a1d061ad15a858ff0d641431f4d4ac101Daniel Dunbar  uint64_t Start = OW->getStream().tell();
6180705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  (void) Start;
6197eb85194f2b07bc7ba3f274fc00dc389b77b63bfDaniel Dunbar
62053b2338a1d061ad15a858ff0d641431f4d4ac101Daniel Dunbar  for (MCSectionData::const_iterator it = SD->begin(),
62153b2338a1d061ad15a858ff0d641431f4d4ac101Daniel Dunbar         ie = SD->end(); it != ie; ++it)
622432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar    WriteFragmentData(*this, Layout, *it, OW);
6230705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
6246742e34385bff89b897ef0fc930c4bca9e75ac4aDaniel Dunbar  // Add section padding.
6255d428511ca9607d52a09d3483d0738f483e09934Daniel Dunbar  assert(SectionFileSize >= SectionSize && "Invalid section sizes!");
6265d428511ca9607d52a09d3483d0738f483e09934Daniel Dunbar  OW->WriteZeros(SectionFileSize - SectionSize);
6276742e34385bff89b897ef0fc930c4bca9e75ac4aDaniel Dunbar
6285d428511ca9607d52a09d3483d0738f483e09934Daniel Dunbar  assert(OW->getStream().tell() - Start == SectionFileSize);
6290705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar}
6300705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
631fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarvoid MCAssembler::Finish() {
632b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  DEBUG_WITH_TYPE("mc-dump", {
633b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar      llvm::errs() << "assembler backend - pre-layout\n--\n";
634b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar      dump(); });
635b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
6365a6e97a7e4e25265cd491f10cc9b0676ff5c0746Daniel Dunbar  // Assign section and fragment ordinals, all subsequent backend code is
6375a6e97a7e4e25265cd491f10cc9b0676ff5c0746Daniel Dunbar  // responsible for updating these in place.
6385a6e97a7e4e25265cd491f10cc9b0676ff5c0746Daniel Dunbar  unsigned SectionIndex = 0;
6395a6e97a7e4e25265cd491f10cc9b0676ff5c0746Daniel Dunbar  unsigned FragmentIndex = 0;
6405a6e97a7e4e25265cd491f10cc9b0676ff5c0746Daniel Dunbar  for (MCAssembler::iterator it = begin(), ie = end(); it != ie; ++it) {
6415a6e97a7e4e25265cd491f10cc9b0676ff5c0746Daniel Dunbar    it->setOrdinal(SectionIndex++);
6425a6e97a7e4e25265cd491f10cc9b0676ff5c0746Daniel Dunbar
6435a6e97a7e4e25265cd491f10cc9b0676ff5c0746Daniel Dunbar    for (MCSectionData::iterator it2 = it->begin(),
6445a6e97a7e4e25265cd491f10cc9b0676ff5c0746Daniel Dunbar           ie2 = it->end(); it2 != ie2; ++it2)
6455a6e97a7e4e25265cd491f10cc9b0676ff5c0746Daniel Dunbar      it2->setOrdinal(FragmentIndex++);
6465a6e97a7e4e25265cd491f10cc9b0676ff5c0746Daniel Dunbar  }
6475a6e97a7e4e25265cd491f10cc9b0676ff5c0746Daniel Dunbar
648f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar  // Layout until everything fits.
6498d39eb47d6a15d36be7ac0d0154a6897e42f5adcDaniel Dunbar  MCAsmLayout Layout(*this);
6508d39eb47d6a15d36be7ac0d0154a6897e42f5adcDaniel Dunbar  while (LayoutOnce(Layout))
651f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar    continue;
652f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar
653f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar  DEBUG_WITH_TYPE("mc-dump", {
6543f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar      llvm::errs() << "assembler backend - post-relaxation\n--\n";
6553f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar      dump(); });
6563f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar
6573f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  // Finalize the layout, including fragment lowering.
6583f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  FinishLayout(Layout);
6593f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar
6603f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  DEBUG_WITH_TYPE("mc-dump", {
6613f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar      llvm::errs() << "assembler backend - final-layout\n--\n";
662f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar      dump(); });
663f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar
664ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar  uint64_t StartOffset = OS.tell();
6651a9158c301b58d8119664f416461d5a5549170c4Daniel Dunbar  llvm::OwningPtr<MCObjectWriter> Writer(getBackend().createObjectWriter(OS));
6661a9158c301b58d8119664f416461d5a5549170c4Daniel Dunbar  if (!Writer)
66775361b69f3f327842b9dad69fa7f28ae3b688412Chris Lattner    report_fatal_error("unable to create object writer!");
668bacba997782f624d3c43591a913b8f1e3d733a52Daniel Dunbar
669bacba997782f624d3c43591a913b8f1e3d733a52Daniel Dunbar  // Allow the object writer a chance to perform post-layout binding (for
670bacba997782f624d3c43591a913b8f1e3d733a52Daniel Dunbar  // example, to set the index fields in the symbol data).
6711a9158c301b58d8119664f416461d5a5549170c4Daniel Dunbar  Writer->ExecutePostLayoutBinding(*this);
672bacba997782f624d3c43591a913b8f1e3d733a52Daniel Dunbar
673b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar  // Evaluate and apply the fixups, generating relocation entries as necessary.
674b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar  for (MCAssembler::iterator it = begin(), ie = end(); it != ie; ++it) {
675b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar    for (MCSectionData::iterator it2 = it->begin(),
676b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar           ie2 = it->end(); it2 != ie2; ++it2) {
677b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar      MCDataFragment *DF = dyn_cast<MCDataFragment>(it2);
678b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar      if (!DF)
679b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar        continue;
680b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar
681b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar      for (MCDataFragment::fixup_iterator it3 = DF->fixup_begin(),
682b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar             ie3 = DF->fixup_end(); it3 != ie3; ++it3) {
683b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar        MCAsmFixup &Fixup = *it3;
684b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar
685b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar        // Evaluate the fixup.
686b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar        MCValue Target;
687b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar        uint64_t FixedValue;
688b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar        if (!EvaluateFixup(Layout, Fixup, DF, Target, FixedValue)) {
689b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar          // The fixup was unresolved, we need a relocation. Inform the object
690b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar          // writer of the relocation, and give it an opportunity to adjust the
691b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar          // fixup value if need be.
692207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar          Writer->RecordRelocation(*this, Layout, DF, Fixup, Target,FixedValue);
693b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar        }
694b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar
69587190c473c216e481e0a70475577e496b3a3449eDaniel Dunbar        getBackend().ApplyFixup(Fixup, *DF, FixedValue);
696b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar      }
697b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar    }
698b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar  }
699b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar
700bacba997782f624d3c43591a913b8f1e3d733a52Daniel Dunbar  // Write the object file.
701207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar  Writer->WriteObject(*this, Layout);
702f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar  OS.flush();
703ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar
704ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar  stats::ObjectBytes += OS.tell() - StartOffset;
705f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar}
706f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar
7079d39e616cc0f43e91e509e5c8129c7d46327fd0dDaniel Dunbarbool MCAssembler::FixupNeedsRelaxation(const MCAsmFixup &Fixup,
7089d39e616cc0f43e91e509e5c8129c7d46327fd0dDaniel Dunbar                                       const MCFragment *DF,
7098d39eb47d6a15d36be7ac0d0154a6897e42f5adcDaniel Dunbar                                       const MCAsmLayout &Layout) const {
710ac2884a717daf3ad2aa8425320795d661e8a980bDaniel Dunbar  if (getRelaxAll())
711ac2884a717daf3ad2aa8425320795d661e8a980bDaniel Dunbar    return true;
712ac2884a717daf3ad2aa8425320795d661e8a980bDaniel Dunbar
713f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar  // If we cannot resolve the fixup value, it requires relaxation.
714f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar  MCValue Target;
715f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar  uint64_t Value;
716f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar  if (!EvaluateFixup(Layout, Fixup, DF, Target, Value))
717f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar    return true;
718f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar
719f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar  // Otherwise, relax if the value is too big for a (signed) i8.
72031e8e1d08566c9b169df003d499a7e22856e5408Daniel Dunbar  //
72131e8e1d08566c9b169df003d499a7e22856e5408Daniel Dunbar  // FIXME: This is target dependent!
722f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar  return int64_t(Value) != int64_t(int8_t(Value));
723f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar}
724f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar
725d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbarbool MCAssembler::FragmentNeedsRelaxation(const MCInstFragment *IF,
726d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar                                          const MCAsmLayout &Layout) const {
727d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar  // If this inst doesn't ever need relaxation, ignore it. This occurs when we
728d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar  // are intentionally pushing out inst fragments, or because we relaxed a
729d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar  // previous instruction to one that doesn't need relaxation.
730d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar  if (!getBackend().MayNeedRelaxation(IF->getInst(), IF->getFixups()))
731d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar    return false;
732d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar
733d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar  for (MCInstFragment::const_fixup_iterator it = IF->fixup_begin(),
734d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar         ie = IF->fixup_end(); it != ie; ++it)
735d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar    if (FixupNeedsRelaxation(*it, IF, Layout))
736d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      return true;
737d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar
738d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar  return false;
739d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar}
740d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar
7418d39eb47d6a15d36be7ac0d0154a6897e42f5adcDaniel Dunbarbool MCAssembler::LayoutOnce(MCAsmLayout &Layout) {
742ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar  ++stats::RelaxationSteps;
743ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar
744d13a0caf726e05c9bd939d752ef371d6d467ef28Daniel Dunbar  // Layout the sections in order.
745d13a0caf726e05c9bd939d752ef371d6d467ef28Daniel Dunbar  for (unsigned i = 0, e = Layout.getSectionOrder().size(); i != e; ++i)
746d13a0caf726e05c9bd939d752ef371d6d467ef28Daniel Dunbar    LayoutSection(Layout, i);
747d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar
748d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar  // Scan for fragments that need relaxation.
7490cc8bd48619b943379f5c2cc11a19fb189342925Daniel Dunbar  bool WasRelaxed = false;
750f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar  for (iterator it = begin(), ie = end(); it != ie; ++it) {
751f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar    MCSectionData &SD = *it;
752b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
753f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar    for (MCSectionData::iterator it2 = SD.begin(),
754f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar           ie2 = SD.end(); it2 != ie2; ++it2) {
755d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      // Check if this is an instruction fragment that needs relaxation.
756d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      MCInstFragment *IF = dyn_cast<MCInstFragment>(it2);
757d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      if (!IF || !FragmentNeedsRelaxation(IF, Layout))
758f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar        continue;
7590705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
760ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar      ++stats::RelaxedInstructions;
761ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar
762d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      // FIXME-PERF: We could immediately lower out instructions if we can tell
763d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      // they are fully resolved, to avoid retesting on later passes.
764f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar
765d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      // Relax the fragment.
766d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar
767d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      MCInst Relaxed;
768d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      getBackend().RelaxInstruction(IF, Relaxed);
769f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar
770d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      // Encode the new instruction.
771d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      //
772d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      // FIXME-PERF: If it matters, we could let the target do this. It can
773d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      // probably do so more efficiently in many cases.
774d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      SmallVector<MCFixup, 4> Fixups;
775d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      SmallString<256> Code;
776d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      raw_svector_ostream VecOS(Code);
777d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      getEmitter().EncodeInstruction(Relaxed, VecOS, Fixups);
778d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      VecOS.flush();
779d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar
780d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      // Update the instruction fragment.
7810cc8bd48619b943379f5c2cc11a19fb189342925Daniel Dunbar      int SlideAmount = Code.size() - IF->getInstSize();
782d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      IF->setInst(Relaxed);
783d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      IF->getCode() = Code;
784d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      IF->getFixups().clear();
785d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      for (unsigned i = 0, e = Fixups.size(); i != e; ++i) {
786d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar        MCFixup &F = Fixups[i];
787d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar        IF->getFixups().push_back(MCAsmFixup(F.getOffset(), *F.getValue(),
788d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar                                             F.getKind()));
789f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar      }
790d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar
791ac2884a717daf3ad2aa8425320795d661e8a980bDaniel Dunbar      // Update the layout, and remember that we relaxed. If we are relaxing
792ac2884a717daf3ad2aa8425320795d661e8a980bDaniel Dunbar      // everything, we can skip this step since nothing will depend on updating
793ac2884a717daf3ad2aa8425320795d661e8a980bDaniel Dunbar      // the values.
794ac2884a717daf3ad2aa8425320795d661e8a980bDaniel Dunbar      if (!getRelaxAll())
795ac2884a717daf3ad2aa8425320795d661e8a980bDaniel Dunbar        Layout.UpdateForSlide(IF, SlideAmount);
7960cc8bd48619b943379f5c2cc11a19fb189342925Daniel Dunbar      WasRelaxed = true;
797f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar    }
798f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar  }
799f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar
8000cc8bd48619b943379f5c2cc11a19fb189342925Daniel Dunbar  return WasRelaxed;
801f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar}
802b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
8033f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbarvoid MCAssembler::FinishLayout(MCAsmLayout &Layout) {
8043f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  // Lower out any instruction fragments, to simplify the fixup application and
8053f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  // output.
8063f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  //
8073f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  // FIXME-PERF: We don't have to do this, but the assumption is that it is
8083f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  // cheap (we will mostly end up eliminating fragments and appending on to data
8093f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  // fragments), so the extra complexity downstream isn't worth it. Evaluate
8103f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  // this assumption.
8113f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  for (iterator it = begin(), ie = end(); it != ie; ++it) {
8123f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar    MCSectionData &SD = *it;
8133f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar
8143f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar    for (MCSectionData::iterator it2 = SD.begin(),
8153f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar           ie2 = SD.end(); it2 != ie2; ++it2) {
8163f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar      MCInstFragment *IF = dyn_cast<MCInstFragment>(it2);
8173f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar      if (!IF)
8183f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar        continue;
8193f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar
8203f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar      // Create a new data fragment for the instruction.
8213f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar      //
822337055e62f28f18a9a8c4a090633cae1c2256ae1Daniel Dunbar      // FIXME-PERF: Reuse previous data fragment if possible.
8233f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar      MCDataFragment *DF = new MCDataFragment();
8243f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar      SD.getFragmentList().insert(it2, DF);
8253f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar
8263f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar      // Update the data fragments layout data.
827432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar      //
828432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar      // FIXME: Add MCAsmLayout utility for this.
8299799de910e97879bf9f30f359551071a94d61570Daniel Dunbar      DF->setParent(IF->getParent());
830651804c3d63a05f72221a6d133e5b344e6aaa093Daniel Dunbar      DF->setAtom(IF->getAtom());
8315a6e97a7e4e25265cd491f10cc9b0676ff5c0746Daniel Dunbar      DF->setOrdinal(IF->getOrdinal());
832432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar      Layout.setFragmentOffset(DF, Layout.getFragmentOffset(IF));
833432cd5fd9b4c97f1e4a53fcf45e16f7dd6bc085eDaniel Dunbar      Layout.setFragmentEffectiveSize(DF, Layout.getFragmentEffectiveSize(IF));
8343f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar
8359799de910e97879bf9f30f359551071a94d61570Daniel Dunbar      // Copy in the data and the fixups.
8369799de910e97879bf9f30f359551071a94d61570Daniel Dunbar      DF->getContents().append(IF->getCode().begin(), IF->getCode().end());
8379799de910e97879bf9f30f359551071a94d61570Daniel Dunbar      for (unsigned i = 0, e = IF->getFixups().size(); i != e; ++i)
8389799de910e97879bf9f30f359551071a94d61570Daniel Dunbar        DF->getFixups().push_back(IF->getFixups()[i]);
8393f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar
8403f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar      // Delete the instruction fragment and update the iterator.
8413f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar      SD.getFragmentList().erase(IF);
8423f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar      it2 = DF;
8433f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar    }
8443f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  }
8453f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar}
8463f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar
847b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar// Debugging methods
848b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
849b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbarnamespace llvm {
850b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
851b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbarraw_ostream &operator<<(raw_ostream &OS, const MCAsmFixup &AF) {
8522be2fd073003c0988723d2894dfb117ad90be11bDaniel Dunbar  OS << "<MCAsmFixup" << " Offset:" << AF.Offset << " Value:" << *AF.Value
8532be2fd073003c0988723d2894dfb117ad90be11bDaniel Dunbar     << " Kind:" << AF.Kind << ">";
854b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  return OS;
855b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar}
856b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
857b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar}
858b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
859b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbarvoid MCFragment::dump() {
860b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  raw_ostream &OS = llvm::errs();
861b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
862b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "<MCFragment " << (void*) this << " Offset:" << Offset
863b5844ff1c44f0427bcf132eaece945da411e650fDaniel Dunbar     << " EffectiveSize:" << EffectiveSize << ">";
864b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar}
865b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
866b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbarvoid MCAlignFragment::dump() {
867b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  raw_ostream &OS = llvm::errs();
868b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
869b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "<MCAlignFragment ";
870b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  this->MCFragment::dump();
871456b5012704bcece2c8c28783e6efabb7b998616Daniel Dunbar  if (hasEmitNops())
872456b5012704bcece2c8c28783e6efabb7b998616Daniel Dunbar    OS << " (emit nops)";
873456b5012704bcece2c8c28783e6efabb7b998616Daniel Dunbar  if (hasOnlyAlignAddress())
874456b5012704bcece2c8c28783e6efabb7b998616Daniel Dunbar    OS << " (only align section)";
875b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "\n       ";
876b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << " Alignment:" << getAlignment()
877b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar     << " Value:" << getValue() << " ValueSize:" << getValueSize()
878b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar     << " MaxBytesToEmit:" << getMaxBytesToEmit() << ">";
879b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar}
880b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
881b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbarvoid MCDataFragment::dump() {
882b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  raw_ostream &OS = llvm::errs();
883b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
884b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "<MCDataFragment ";
885b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  this->MCFragment::dump();
886b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "\n       ";
887b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << " Contents:[";
888b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  for (unsigned i = 0, e = getContents().size(); i != e; ++i) {
889b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar    if (i) OS << ",";
890b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar    OS << hexdigit((Contents[i] >> 4) & 0xF) << hexdigit(Contents[i] & 0xF);
891b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  }
8922be2fd073003c0988723d2894dfb117ad90be11bDaniel Dunbar  OS << "] (" << getContents().size() << " bytes)";
8930bcf074867d4d366f7988a219c7a53265fcb4f23Daniel Dunbar
8940bcf074867d4d366f7988a219c7a53265fcb4f23Daniel Dunbar  if (!getFixups().empty()) {
8950bcf074867d4d366f7988a219c7a53265fcb4f23Daniel Dunbar    OS << ",\n       ";
8960bcf074867d4d366f7988a219c7a53265fcb4f23Daniel Dunbar    OS << " Fixups:[";
8970bcf074867d4d366f7988a219c7a53265fcb4f23Daniel Dunbar    for (fixup_iterator it = fixup_begin(), ie = fixup_end(); it != ie; ++it) {
89845aefff64c64d5bd7804f39d994883b98ce4415aDaniel Dunbar      if (it != fixup_begin()) OS << ",\n                ";
8990bcf074867d4d366f7988a219c7a53265fcb4f23Daniel Dunbar      OS << *it;
9000bcf074867d4d366f7988a219c7a53265fcb4f23Daniel Dunbar    }
9010bcf074867d4d366f7988a219c7a53265fcb4f23Daniel Dunbar    OS << "]";
9020bcf074867d4d366f7988a219c7a53265fcb4f23Daniel Dunbar  }
9030bcf074867d4d366f7988a219c7a53265fcb4f23Daniel Dunbar
9040bcf074867d4d366f7988a219c7a53265fcb4f23Daniel Dunbar  OS << ">";
905b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar}
906b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
907b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbarvoid MCFillFragment::dump() {
908b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  raw_ostream &OS = llvm::errs();
909b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
910b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "<MCFillFragment ";
911b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  this->MCFragment::dump();
912b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "\n       ";
913b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << " Value:" << getValue() << " ValueSize:" << getValueSize()
9143153fec733acd079a9e681d16d39253b9517e02cDaniel Dunbar     << " Size:" << getSize() << ">";
915b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar}
916b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
9173f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbarvoid MCInstFragment::dump() {
9183f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  raw_ostream &OS = llvm::errs();
9193f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar
9203f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  OS << "<MCInstFragment ";
9213f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  this->MCFragment::dump();
9223f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  OS << "\n       ";
9233f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  OS << " Inst:";
9243f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  getInst().dump_pretty(OS);
9253f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  OS << ">";
9263f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar}
9273f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar
928b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbarvoid MCOrgFragment::dump() {
929b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  raw_ostream &OS = llvm::errs();
930b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
931b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "<MCOrgFragment ";
932b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  this->MCFragment::dump();
933b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "\n       ";
934b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << " Offset:" << getOffset() << " Value:" << getValue() << ">";
935b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar}
936b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
937b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbarvoid MCSectionData::dump() {
938b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  raw_ostream &OS = llvm::errs();
939b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
940b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "<MCSectionData";
941b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << " Alignment:" << getAlignment() << " Address:" << Address
942b5844ff1c44f0427bcf132eaece945da411e650fDaniel Dunbar     << " Size:" << Size << " AddressSize:" << AddressSize
943b5844ff1c44f0427bcf132eaece945da411e650fDaniel Dunbar     << " FileSize:" << FileSize << " Fragments:[\n      ";
944b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  for (iterator it = begin(), ie = end(); it != ie; ++it) {
945b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar    if (it != begin()) OS << ",\n      ";
946b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar    it->dump();
947b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  }
948b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "]>";
949b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar}
950b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
951b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbarvoid MCSymbolData::dump() {
952b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  raw_ostream &OS = llvm::errs();
953b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
954b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "<MCSymbolData Symbol:" << getSymbol()
955b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar     << " Fragment:" << getFragment() << " Offset:" << getOffset()
956b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar     << " Flags:" << getFlags() << " Index:" << getIndex();
957b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  if (isCommon())
958b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar    OS << " (common, size:" << getCommonSize()
959b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar       << " align: " << getCommonAlignment() << ")";
960b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  if (isExternal())
961b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar    OS << " (external)";
962b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  if (isPrivateExtern())
963b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar    OS << " (private extern)";
964b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << ">";
965b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar}
966b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
967b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbarvoid MCAssembler::dump() {
968b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  raw_ostream &OS = llvm::errs();
969b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
970b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "<MCAssembler\n";
97145aefff64c64d5bd7804f39d994883b98ce4415aDaniel Dunbar  OS << "  Sections:[\n    ";
972b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  for (iterator it = begin(), ie = end(); it != ie; ++it) {
973b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar    if (it != begin()) OS << ",\n    ";
974b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar    it->dump();
975b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  }
976b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "],\n";
977b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "  Symbols:[";
978b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
979b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  for (symbol_iterator it = symbol_begin(), ie = symbol_end(); it != ie; ++it) {
98045aefff64c64d5bd7804f39d994883b98ce4415aDaniel Dunbar    if (it != symbol_begin()) OS << ",\n           ";
981b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar    it->dump();
982b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  }
983b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "]>\n";
984b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar}
985