MCAssembler.cpp revision 7c3d45a03e64ac1b5b2ecdb7153989fd7cebfd2c
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"
220705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar#include "llvm/Support/ErrorHandling.h"
23fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar#include "llvm/Support/raw_ostream.h"
24b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar#include "llvm/Support/Debug.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 {
33ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel DunbarSTATISTIC(RelaxedInstructions, "Number of relaxed instructions");
34ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel DunbarSTATISTIC(RelaxationSteps, "Number of assembler layout and relaxation steps");
350adcd35f78b89bf70eb634b7f9ac2103516ca2b2Daniel DunbarSTATISTIC(EmittedFragments, "Number of emitted assembler fragments");
36ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel DunbarSTATISTIC(EvaluateFixup, "Number of evaluated fixups");
37ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel DunbarSTATISTIC(ObjectBytes, "Number of emitted object file bytes");
38ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar}
39ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar}
400adcd35f78b89bf70eb634b7f9ac2103516ca2b2Daniel Dunbar
418f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar// FIXME FIXME FIXME: There are number of places in this file where we convert
428f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar// what is a 64-bit assembler value used for computation into a value in the
438f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar// object file, which may truncate it. We should detect that truncation where
448f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar// invalid and report errors back.
458f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar
46fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar/* *** */
47fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
48207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbaruint64_t MCAsmLayout::getFragmentAddress(const MCFragment *F) const {
497c3d45a03e64ac1b5b2ecdb7153989fd7cebfd2cDaniel Dunbar  assert(F->getParent() && "Missing section()!");
507c3d45a03e64ac1b5b2ecdb7153989fd7cebfd2cDaniel Dunbar  return getSectionAddress(F->getParent()) + F->getOffset();
51207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar}
52207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar
53207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbaruint64_t MCAsmLayout::getSymbolAddress(const MCSymbolData *SD) const {
547c3d45a03e64ac1b5b2ecdb7153989fd7cebfd2cDaniel Dunbar  assert(SD->getFragment() && "Invalid getAddress() on undefined symbol!");
557c3d45a03e64ac1b5b2ecdb7153989fd7cebfd2cDaniel Dunbar  return getFragmentAddress(SD->getFragment()) + SD->getOffset();
56207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar}
57207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar
58207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbaruint64_t MCAsmLayout::getSectionAddress(const MCSectionData *SD) const {
597c3d45a03e64ac1b5b2ecdb7153989fd7cebfd2cDaniel Dunbar  assert(SD->Address != ~UINT64_C(0) && "Address not set!");
607c3d45a03e64ac1b5b2ecdb7153989fd7cebfd2cDaniel Dunbar  return SD->Address;
61207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar}
62207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar
63207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbarvoid MCAsmLayout::setSectionAddress(MCSectionData *SD, uint64_t Value) {
647c3d45a03e64ac1b5b2ecdb7153989fd7cebfd2cDaniel Dunbar  SD->Address = Value;
65207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar}
66207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar
67207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar/* *** */
68207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar
690705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel DunbarMCFragment::MCFragment() : Kind(FragmentType(~0)) {
700705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar}
710705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
725e835967dd5dda294d0ef3392f4c1d4a2260f532Daniel DunbarMCFragment::MCFragment(FragmentType _Kind, MCSectionData *_Parent)
730705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  : Kind(_Kind),
745e835967dd5dda294d0ef3392f4c1d4a2260f532Daniel Dunbar    Parent(_Parent),
750705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar    FileSize(~UINT64_C(0))
76fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar{
775e835967dd5dda294d0ef3392f4c1d4a2260f532Daniel Dunbar  if (Parent)
785e835967dd5dda294d0ef3392f4c1d4a2260f532Daniel Dunbar    Parent->getFragmentList().push_back(this);
79fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar}
80fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
810705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel DunbarMCFragment::~MCFragment() {
820705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar}
830705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
84fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar/* *** */
85fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
8681e400092f55c2eba157172bfc0dd0df8317638dDaniel DunbarMCSectionData::MCSectionData() : Section(0) {}
87fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
88fb4a6b397665df011348ade24a8e38d2219f095aDaniel DunbarMCSectionData::MCSectionData(const MCSection &_Section, MCAssembler *A)
8981e400092f55c2eba157172bfc0dd0df8317638dDaniel Dunbar  : Section(&_Section),
90fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar    Alignment(1),
915e835967dd5dda294d0ef3392f4c1d4a2260f532Daniel Dunbar    Address(~UINT64_C(0)),
926742e34385bff89b897ef0fc930c4bca9e75ac4aDaniel Dunbar    Size(~UINT64_C(0)),
933f6a960f9c9ad27f2ac573020df414e8b8cdda04Daniel Dunbar    FileSize(~UINT64_C(0)),
94e1ec617c6abf0b9dc1eecbbfe483bda3bb2b7795Daniel Dunbar    HasInstructions(false)
95fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar{
96fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  if (A)
97fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar    A->getSectionList().push_back(this);
98fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar}
99fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
100fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar/* *** */
101fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
102efbb5330b8d383a393c83d2da5d631c98b0bb3fdDaniel DunbarMCSymbolData::MCSymbolData() : Symbol(0) {}
103f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar
104cb579b3338fe8d9e4424b138f597a4696cb89de3Daniel DunbarMCSymbolData::MCSymbolData(const MCSymbol &_Symbol, MCFragment *_Fragment,
105f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar                           uint64_t _Offset, MCAssembler *A)
106efbb5330b8d383a393c83d2da5d631c98b0bb3fdDaniel Dunbar  : Symbol(&_Symbol), Fragment(_Fragment), Offset(_Offset),
1078f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar    IsExternal(false), IsPrivateExtern(false),
1088f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar    CommonSize(0), CommonAlign(0), Flags(0), Index(0)
109f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar{
110f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar  if (A)
111f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar    A->getSymbolList().push_back(this);
112f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar}
113f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar
114f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar/* *** */
115f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar
1161f3e445184e5ca2aa4295c2a77f2a4e0b957fea1Daniel DunbarMCAssembler::MCAssembler(MCContext &_Context, TargetAsmBackend &_Backend,
117cf871e5abff63a53f9e97ff9e37fb7297d0cb847Daniel Dunbar                         MCCodeEmitter &_Emitter, raw_ostream &_OS)
118cf871e5abff63a53f9e97ff9e37fb7297d0cb847Daniel Dunbar  : Context(_Context), Backend(_Backend), Emitter(_Emitter),
119cf871e5abff63a53f9e97ff9e37fb7297d0cb847Daniel Dunbar    OS(_OS), SubsectionsViaSymbols(false)
1206009db486e7fba448ccb28dff676c012efade8f0Daniel Dunbar{
1216009db486e7fba448ccb28dff676c012efade8f0Daniel Dunbar}
122fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
123fb4a6b397665df011348ade24a8e38d2219f095aDaniel DunbarMCAssembler::~MCAssembler() {
124fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar}
125fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
126939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbarstatic bool isScatteredFixupFullyResolvedSimple(const MCAssembler &Asm,
127939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar                                                const MCAsmFixup &Fixup,
128939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar                                                const MCValue Target,
129939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar                                                const MCSection *BaseSection) {
130939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  // The effective fixup address is
131939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  //     addr(atom(A)) + offset(A)
132939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  //   - addr(atom(B)) - offset(B)
133939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  //   - addr(<base symbol>) + <fixup offset from base symbol>
134939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  // and the offsets are not relocatable, so the fixup is fully resolved when
135939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  //  addr(atom(A)) - addr(atom(B)) - addr(<base symbol>)) == 0.
136939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  //
137939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  // The simple (Darwin, except on x86_64) way of dealing with this was to
138939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  // assume that any reference to a temporary symbol *must* be a temporary
139939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  // symbol in the same atom, unless the sections differ. Therefore, any PCrel
140939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  // relocation to a temporary symbol (in the same section) is fully
141939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  // resolved. This also works in conjunction with absolutized .set, which
142939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  // requires the compiler to use .set to absolutize the differences between
143939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  // symbols which the compiler knows to be assembly time constants, so we don't
144939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  // need to worry about consider symbol differences fully resolved.
145939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar
146939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  // Non-relative fixups are only resolved if constant.
147939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  if (!BaseSection)
148939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar    return Target.isAbsolute();
149939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar
150939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  // Otherwise, relative fixups are only resolved if not a difference and the
151939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  // target is a temporary in the same section.
152939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  if (Target.isAbsolute() || Target.getSymB())
153939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar    return false;
154939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar
155939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  const MCSymbol *A = &Target.getSymA()->getSymbol();
156939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  if (!A->isTemporary() || !A->isInSection() ||
157939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar      &A->getSection() != BaseSection)
158939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar    return false;
159939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar
160939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  return true;
161939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar}
162939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar
163034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbarstatic bool isScatteredFixupFullyResolved(const MCAssembler &Asm,
164207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar                                          const MCAsmLayout &Layout,
165034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar                                          const MCAsmFixup &Fixup,
166034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar                                          const MCValue Target,
167034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar                                          const MCSymbolData *BaseSymbol) {
168034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar  // The effective fixup address is
169034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar  //     addr(atom(A)) + offset(A)
170034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar  //   - addr(atom(B)) - offset(B)
171034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar  //   - addr(BaseSymbol) + <fixup offset from base symbol>
172034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar  // and the offsets are not relocatable, so the fixup is fully resolved when
173034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar  //  addr(atom(A)) - addr(atom(B)) - addr(BaseSymbol) == 0.
174034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar  //
175034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar  // Note that "false" is almost always conservatively correct (it means we emit
176034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar  // a relocation which is unnecessary), except when it would force us to emit a
177034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar  // relocation which the target cannot encode.
178034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar
179034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar  const MCSymbolData *A_Base = 0, *B_Base = 0;
180034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar  if (const MCSymbolRefExpr *A = Target.getSymA()) {
181034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar    // Modified symbol references cannot be resolved.
182034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar    if (A->getKind() != MCSymbolRefExpr::VK_None)
183034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar      return false;
184034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar
185207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar    A_Base = Asm.getAtom(Layout, &Asm.getSymbolData(A->getSymbol()));
186034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar    if (!A_Base)
187034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar      return false;
188034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar  }
189034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar
190034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar  if (const MCSymbolRefExpr *B = Target.getSymB()) {
191034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar    // Modified symbol references cannot be resolved.
192034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar    if (B->getKind() != MCSymbolRefExpr::VK_None)
193034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar      return false;
194034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar
195207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar    B_Base = Asm.getAtom(Layout, &Asm.getSymbolData(B->getSymbol()));
196034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar    if (!B_Base)
197034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar      return false;
198034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar  }
199034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar
200034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar  // If there is no base, A and B have to be the same atom for this fixup to be
201034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar  // fully resolved.
202034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar  if (!BaseSymbol)
203034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar    return A_Base == B_Base;
204034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar
205034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar  // Otherwise, B must be missing and A must be the base.
206034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar  return !B_Base && BaseSymbol == A_Base;
207034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar}
208034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar
209238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbarbool MCAssembler::isSymbolLinkerVisible(const MCSymbolData *SD) const {
210238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar  // Non-temporary labels should always be visible to the linker.
211238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar  if (!SD->getSymbol().isTemporary())
212238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar    return true;
213238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar
214238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar  // Absolute temporary labels are never visible.
215238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar  if (!SD->getFragment())
216238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar    return false;
217238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar
218238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar  // Otherwise, check if the section requires symbols even for temporary labels.
219238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar  return getBackend().doesSectionRequireSymbols(
220238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar    SD->getFragment()->getParent()->getSection());
221238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar}
222238698566311e9dba4092dfa6c0bfe253279702eDaniel Dunbar
223207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar// FIXME-PERF: This routine is really slow.
224207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbarconst MCSymbolData *MCAssembler::getAtomForAddress(const MCAsmLayout &Layout,
225207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar                                                   const MCSectionData *Section,
2268ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar                                                   uint64_t Address) const {
2278ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar  const MCSymbolData *Best = 0;
228207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar  uint64_t BestAddress = 0;
229207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar
2308ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar  for (MCAssembler::const_symbol_iterator it = symbol_begin(),
2318ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar         ie = symbol_end(); it != ie; ++it) {
2328ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar    // Ignore non-linker visible symbols.
2338ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar    if (!isSymbolLinkerVisible(it))
2348ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar      continue;
2358ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar
2368ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar    // Ignore symbols not in the same section.
2378ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar    if (!it->getFragment() || it->getFragment()->getParent() != Section)
2388ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar      continue;
2398ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar
2408ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar    // Otherwise, find the closest symbol preceding this address (ties are
2418ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar    // resolved in favor of the last defined symbol).
242207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar    uint64_t SymbolAddress = Layout.getSymbolAddress(it);
243207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar    if (SymbolAddress <= Address && (!Best || SymbolAddress >= BestAddress)) {
2448ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar      Best = it;
245207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar      BestAddress = SymbolAddress;
246207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar    }
2478ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar  }
2488ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar
2498ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar  return Best;
2508ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar}
2518ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar
252207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar// FIXME-PERF: This routine is really slow.
253207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbarconst MCSymbolData *MCAssembler::getAtom(const MCAsmLayout &Layout,
254207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar                                         const MCSymbolData *SD) const {
2558ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar  // Linker visible symbols define atoms.
2568ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar  if (isSymbolLinkerVisible(SD))
2578ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar    return SD;
2588ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar
2598ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar  // Absolute and undefined symbols have no defining atom.
2608ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar  if (!SD->getFragment())
2618ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar    return 0;
2628ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar
2638ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar  // Otherwise, search by address.
264207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar  return getAtomForAddress(Layout, SD->getFragment()->getParent(),
265207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar                           Layout.getSymbolAddress(SD));
2668ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar}
2678ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1bDaniel Dunbar
2689d39e616cc0f43e91e509e5c8129c7d46327fd0dDaniel Dunbarbool MCAssembler::EvaluateFixup(const MCAsmLayout &Layout,
2699d39e616cc0f43e91e509e5c8129c7d46327fd0dDaniel Dunbar                                const MCAsmFixup &Fixup, const MCFragment *DF,
270df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar                                MCValue &Target, uint64_t &Value) const {
271ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar  ++stats::EvaluateFixup;
272ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar
273df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar  if (!Fixup.Value->EvaluateAsRelocatable(Target, &Layout))
274df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar    llvm_report_error("expected relocatable expression");
275df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar
276df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar  // FIXME: How do non-scattered symbols work in ELF? I presume the linker
277df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar  // doesn't support small relocations, but then under what criteria does the
278df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar  // assembler allow symbol differences?
279df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar
280df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar  Value = Target.getConstant();
281df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar
282b36052f0e4f59525b34bb4b56648c9121a8beda8Daniel Dunbar  bool IsPCRel =
283b36052f0e4f59525b34bb4b56648c9121a8beda8Daniel Dunbar    Emitter.getFixupKindInfo(Fixup.Kind).Flags & MCFixupKindInfo::FKF_IsPCRel;
284b36052f0e4f59525b34bb4b56648c9121a8beda8Daniel Dunbar  bool IsResolved = true;
2859a1d20042f6a6ec648a3588f9b13264a4570aab0Daniel Dunbar  if (const MCSymbolRefExpr *A = Target.getSymA()) {
2869a1d20042f6a6ec648a3588f9b13264a4570aab0Daniel Dunbar    if (A->getSymbol().isDefined())
287207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar      Value += Layout.getSymbolAddress(&getSymbolData(A->getSymbol()));
288df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar    else
289df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar      IsResolved = false;
290df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar  }
2919a1d20042f6a6ec648a3588f9b13264a4570aab0Daniel Dunbar  if (const MCSymbolRefExpr *B = Target.getSymB()) {
2929a1d20042f6a6ec648a3588f9b13264a4570aab0Daniel Dunbar    if (B->getSymbol().isDefined())
293207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar      Value -= Layout.getSymbolAddress(&getSymbolData(B->getSymbol()));
294df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar    else
295df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar      IsResolved = false;
296939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  }
297df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar
298939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  // If we are using scattered symbols, determine whether this value is actually
299939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  // resolved; scattering may cause atoms to move.
300939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar  if (IsResolved && getBackend().hasScatteredSymbols()) {
301939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar    if (getBackend().hasReliableSymbolDifference()) {
302034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar      // If this is a PCrel relocation, find the base atom (identified by its
303034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar      // symbol) that the fixup value is relative to.
304034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar      const MCSymbolData *BaseSymbol = 0;
305034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar      if (IsPCRel) {
306034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar        BaseSymbol = getAtomForAddress(
307207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar          Layout, DF->getParent(), Layout.getFragmentAddress(DF)+Fixup.Offset);
308034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar        if (!BaseSymbol)
309034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar          IsResolved = false;
310034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar      }
311034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar
312034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar      if (IsResolved)
313207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar        IsResolved = isScatteredFixupFullyResolved(*this, Layout, Fixup, Target,
314034843ac8bca36d14ef9d83b50596354b5f3420fDaniel Dunbar                                                   BaseSymbol);
315939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar    } else {
316939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar      const MCSection *BaseSection = 0;
317939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar      if (IsPCRel)
318939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar        BaseSection = &DF->getParent()->getSection();
319939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar
320c6f598209a6ffc1e5273d867c7fd545359c4f209Daniel Dunbar      IsResolved = isScatteredFixupFullyResolvedSimple(*this, Fixup, Target,
321939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar                                                       BaseSection);
322939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6Daniel Dunbar    }
323df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar  }
324df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar
325df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar  if (IsPCRel)
326207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar    Value -= Layout.getFragmentAddress(DF) + Fixup.Offset;
327df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar
328df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar  return IsResolved;
329df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar}
330df3c8f29691a1e3f9ac4afbf05be52dbc898dae9Daniel Dunbar
3318d39eb47d6a15d36be7ac0d0154a6897e42f5adcDaniel Dunbarvoid MCAssembler::LayoutSection(MCSectionData &SD,
3328d39eb47d6a15d36be7ac0d0154a6897e42f5adcDaniel Dunbar                                MCAsmLayout &Layout) {
333207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar  uint64_t Address, StartAddress = Address = Layout.getSectionAddress(&SD);
3340705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
3350705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  for (MCSectionData::iterator it = SD.begin(), ie = SD.end(); it != ie; ++it) {
3360705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar    MCFragment &F = *it;
337d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar
338207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar    F.setOffset(Address - StartAddress);
339d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar
340d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    // Evaluate fragment size.
341d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    switch (F.getKind()) {
342d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    case MCFragment::FT_Align: {
343d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar      MCAlignFragment &AF = cast<MCAlignFragment>(F);
3447eb85194f2b07bc7ba3f274fc00dc389b77b63bfDaniel Dunbar
345d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar      uint64_t Size = OffsetToAlignment(Address, AF.getAlignment());
3466742e34385bff89b897ef0fc930c4bca9e75ac4aDaniel Dunbar      if (Size > AF.getMaxBytesToEmit())
347d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar        AF.setFileSize(0);
348d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar      else
3496742e34385bff89b897ef0fc930c4bca9e75ac4aDaniel Dunbar        AF.setFileSize(Size);
350d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar      break;
351d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    }
352d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar
353d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    case MCFragment::FT_Data:
3542a6e3f5be21fdcb1fa81533ec81ba879df815607Daniel Dunbar      F.setFileSize(cast<MCDataFragment>(F).getContents().size());
355d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar      break;
356d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar
3572a6e3f5be21fdcb1fa81533ec81ba879df815607Daniel Dunbar    case MCFragment::FT_Fill: {
3582a6e3f5be21fdcb1fa81533ec81ba879df815607Daniel Dunbar      MCFillFragment &FF = cast<MCFillFragment>(F);
3592a6e3f5be21fdcb1fa81533ec81ba879df815607Daniel Dunbar      F.setFileSize(FF.getValueSize() * FF.getCount());
3602a6e3f5be21fdcb1fa81533ec81ba879df815607Daniel Dunbar      break;
3612a6e3f5be21fdcb1fa81533ec81ba879df815607Daniel Dunbar    }
3622a6e3f5be21fdcb1fa81533ec81ba879df815607Daniel Dunbar
3633f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar    case MCFragment::FT_Inst:
3643f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar      F.setFileSize(cast<MCInstFragment>(F).getInstSize());
3653f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar      break;
3663f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar
367d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    case MCFragment::FT_Org: {
368d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar      MCOrgFragment &OF = cast<MCOrgFragment>(F);
369d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar
37018ff2cced7e08ac76d8d5bcff8160a5f9a109cbbDaniel Dunbar      int64_t TargetLocation;
37118ff2cced7e08ac76d8d5bcff8160a5f9a109cbbDaniel Dunbar      if (!OF.getOffset().EvaluateAsAbsolute(TargetLocation, &Layout))
37218ff2cced7e08ac76d8d5bcff8160a5f9a109cbbDaniel Dunbar        llvm_report_error("expected assembly-time absolute expression");
373d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar
374d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar      // FIXME: We need a way to communicate this error.
37518ff2cced7e08ac76d8d5bcff8160a5f9a109cbbDaniel Dunbar      int64_t Offset = TargetLocation - F.getOffset();
37618ff2cced7e08ac76d8d5bcff8160a5f9a109cbbDaniel Dunbar      if (Offset < 0)
37718ff2cced7e08ac76d8d5bcff8160a5f9a109cbbDaniel Dunbar        llvm_report_error("invalid .org offset '" + Twine(TargetLocation) +
37818ff2cced7e08ac76d8d5bcff8160a5f9a109cbbDaniel Dunbar                          "' (at offset '" + Twine(F.getOffset()) + "'");
3797eb85194f2b07bc7ba3f274fc00dc389b77b63bfDaniel Dunbar
38018ff2cced7e08ac76d8d5bcff8160a5f9a109cbbDaniel Dunbar      F.setFileSize(Offset);
381d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar      break;
3827eb85194f2b07bc7ba3f274fc00dc389b77b63bfDaniel Dunbar    }
383d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar
384d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar    case MCFragment::FT_ZeroFill: {
385d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar      MCZeroFillFragment &ZFF = cast<MCZeroFillFragment>(F);
386d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar
387d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar      // Align the fragment offset; it is safe to adjust the offset freely since
388d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar      // this is only in virtual sections.
38937fad5ce4d81fd459fafe1517d6cd17e7ab49958Daniel Dunbar      Address = RoundUpToAlignment(Address, ZFF.getAlignment());
390207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar      F.setOffset(Address - StartAddress);
391d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar
392d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar      // FIXME: This is misnamed.
393d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar      F.setFileSize(ZFF.getSize());
394d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar      break;
395d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar    }
396d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    }
397d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar
3986742e34385bff89b897ef0fc930c4bca9e75ac4aDaniel Dunbar    Address += F.getFileSize();
3990705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  }
4000705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
4016742e34385bff89b897ef0fc930c4bca9e75ac4aDaniel Dunbar  // Set the section sizes.
402207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar  SD.setSize(Address - StartAddress);
403cc5b84c6fba79a798e86ea604e54ca9429273a13Daniel Dunbar  if (getBackend().isVirtualSection(SD.getSection()))
404d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar    SD.setFileSize(0);
405d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar  else
406207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar    SD.setFileSize(Address - StartAddress);
4070705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar}
4080705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
40953b2338a1d061ad15a858ff0d641431f4d4ac101Daniel Dunbar/// WriteFragmentData - Write the \arg F data to the output file.
4108f9b80e5df12779a56d763ebf20864dad2bc72daDaniel Dunbarstatic void WriteFragmentData(const MCAssembler &Asm, const MCFragment &F,
4118f9b80e5df12779a56d763ebf20864dad2bc72daDaniel Dunbar                              MCObjectWriter *OW) {
41253b2338a1d061ad15a858ff0d641431f4d4ac101Daniel Dunbar  uint64_t Start = OW->getStream().tell();
4130705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  (void) Start;
4147eb85194f2b07bc7ba3f274fc00dc389b77b63bfDaniel Dunbar
415ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar  ++stats::EmittedFragments;
4160adcd35f78b89bf70eb634b7f9ac2103516ca2b2Daniel Dunbar
4170705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  // FIXME: Embed in fragments instead?
4180705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  switch (F.getKind()) {
419d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar  case MCFragment::FT_Align: {
420d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    MCAlignFragment &AF = cast<MCAlignFragment>(F);
421d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    uint64_t Count = AF.getFileSize() / AF.getValueSize();
422d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar
423d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    // FIXME: This error shouldn't actually occur (the front end should emit
424d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    // multiple .align directives to enforce the semantics it wants), but is
425d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    // severe enough that we want to report it. How to handle this?
426d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    if (Count * AF.getValueSize() != AF.getFileSize())
4277eb85194f2b07bc7ba3f274fc00dc389b77b63bfDaniel Dunbar      llvm_report_error("undefined .align directive, value size '" +
4287eb85194f2b07bc7ba3f274fc00dc389b77b63bfDaniel Dunbar                        Twine(AF.getValueSize()) +
429d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar                        "' is not a divisor of padding size '" +
430d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar                        Twine(AF.getFileSize()) + "'");
431d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar
4326e72048add2a6464e038121c6c275da37528aa0aKevin Enderby    // See if we are aligning with nops, and if so do that first to try to fill
4336e72048add2a6464e038121c6c275da37528aa0aKevin Enderby    // the Count bytes.  Then if that did not fill any bytes or there are any
4346e72048add2a6464e038121c6c275da37528aa0aKevin Enderby    // bytes left to fill use the the Value and ValueSize to fill the rest.
4358f9b80e5df12779a56d763ebf20864dad2bc72daDaniel Dunbar    // If we are aligning with nops, ask that target to emit the right data.
4366e72048add2a6464e038121c6c275da37528aa0aKevin Enderby    if (AF.getEmitNops()) {
4378f9b80e5df12779a56d763ebf20864dad2bc72daDaniel Dunbar      if (!Asm.getBackend().WriteNopData(Count, OW))
4388f9b80e5df12779a56d763ebf20864dad2bc72daDaniel Dunbar        llvm_report_error("unable to write nop sequence of " +
4398f9b80e5df12779a56d763ebf20864dad2bc72daDaniel Dunbar                          Twine(Count) + " bytes");
4408f9b80e5df12779a56d763ebf20864dad2bc72daDaniel Dunbar      break;
4416e72048add2a6464e038121c6c275da37528aa0aKevin Enderby    }
4426e72048add2a6464e038121c6c275da37528aa0aKevin Enderby
4438f9b80e5df12779a56d763ebf20864dad2bc72daDaniel Dunbar    // Otherwise, write out in multiples of the value size.
444d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    for (uint64_t i = 0; i != Count; ++i) {
445d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar      switch (AF.getValueSize()) {
446d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar      default:
447d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar        assert(0 && "Invalid size!");
448bdd9281f356d326155dc2ca5585a708e09e90600Daniel Dunbar      case 1: OW->Write8 (uint8_t (AF.getValue())); break;
449bdd9281f356d326155dc2ca5585a708e09e90600Daniel Dunbar      case 2: OW->Write16(uint16_t(AF.getValue())); break;
450bdd9281f356d326155dc2ca5585a708e09e90600Daniel Dunbar      case 4: OW->Write32(uint32_t(AF.getValue())); break;
451bdd9281f356d326155dc2ca5585a708e09e90600Daniel Dunbar      case 8: OW->Write64(uint64_t(AF.getValue())); break;
452d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar      }
453d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    }
454d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    break;
455d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar  }
4560705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
4573a30b827a5c9bf0ed8f31177b6e447083ce9afecDaniel Dunbar  case MCFragment::FT_Data: {
4583f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar    MCDataFragment &DF = cast<MCDataFragment>(F);
4593f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar    assert(DF.getFileSize() == DF.getContents().size() && "Invalid size!");
4603f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar    OW->WriteBytes(DF.getContents().str());
4610705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar    break;
4623a30b827a5c9bf0ed8f31177b6e447083ce9afecDaniel Dunbar  }
4630705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
4640705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  case MCFragment::FT_Fill: {
4650705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar    MCFillFragment &FF = cast<MCFillFragment>(F);
4660705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar    for (uint64_t i = 0, e = FF.getCount(); i != e; ++i) {
4670705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar      switch (FF.getValueSize()) {
4680705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar      default:
4690705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar        assert(0 && "Invalid size!");
470bdd9281f356d326155dc2ca5585a708e09e90600Daniel Dunbar      case 1: OW->Write8 (uint8_t (FF.getValue())); break;
471bdd9281f356d326155dc2ca5585a708e09e90600Daniel Dunbar      case 2: OW->Write16(uint16_t(FF.getValue())); break;
472bdd9281f356d326155dc2ca5585a708e09e90600Daniel Dunbar      case 4: OW->Write32(uint32_t(FF.getValue())); break;
473bdd9281f356d326155dc2ca5585a708e09e90600Daniel Dunbar      case 8: OW->Write64(uint64_t(FF.getValue())); break;
4740705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar      }
4750705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar    }
4760705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar    break;
4770705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  }
4787eb85194f2b07bc7ba3f274fc00dc389b77b63bfDaniel Dunbar
4793f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  case MCFragment::FT_Inst:
4803f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar    llvm_unreachable("unexpected inst fragment after lowering");
4813f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar    break;
4823f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar
483d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar  case MCFragment::FT_Org: {
484d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    MCOrgFragment &OF = cast<MCOrgFragment>(F);
485d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar
486d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    for (uint64_t i = 0, e = OF.getFileSize(); i != e; ++i)
487bdd9281f356d326155dc2ca5585a708e09e90600Daniel Dunbar      OW->Write8(uint8_t(OF.getValue()));
488d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar
489d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    break;
490d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar  }
491d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar
492d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar  case MCFragment::FT_ZeroFill: {
493d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar    assert(0 && "Invalid zero fill fragment in concrete section!");
494d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar    break;
495d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar  }
4960705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  }
4970705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
49853b2338a1d061ad15a858ff0d641431f4d4ac101Daniel Dunbar  assert(OW->getStream().tell() - Start == F.getFileSize());
4990705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar}
5000705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
50153b2338a1d061ad15a858ff0d641431f4d4ac101Daniel Dunbarvoid MCAssembler::WriteSectionData(const MCSectionData *SD,
50253b2338a1d061ad15a858ff0d641431f4d4ac101Daniel Dunbar                                   MCObjectWriter *OW) const {
503d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar  // Ignore virtual sections.
504cc5b84c6fba79a798e86ea604e54ca9429273a13Daniel Dunbar  if (getBackend().isVirtualSection(SD->getSection())) {
50553b2338a1d061ad15a858ff0d641431f4d4ac101Daniel Dunbar    assert(SD->getFileSize() == 0);
506d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar    return;
507d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar  }
508d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar
50953b2338a1d061ad15a858ff0d641431f4d4ac101Daniel Dunbar  uint64_t Start = OW->getStream().tell();
5100705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar  (void) Start;
5117eb85194f2b07bc7ba3f274fc00dc389b77b63bfDaniel Dunbar
51253b2338a1d061ad15a858ff0d641431f4d4ac101Daniel Dunbar  for (MCSectionData::const_iterator it = SD->begin(),
51353b2338a1d061ad15a858ff0d641431f4d4ac101Daniel Dunbar         ie = SD->end(); it != ie; ++it)
5148f9b80e5df12779a56d763ebf20864dad2bc72daDaniel Dunbar    WriteFragmentData(*this, *it, OW);
5150705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
5166742e34385bff89b897ef0fc930c4bca9e75ac4aDaniel Dunbar  // Add section padding.
51753b2338a1d061ad15a858ff0d641431f4d4ac101Daniel Dunbar  assert(SD->getFileSize() >= SD->getSize() && "Invalid section sizes!");
51853b2338a1d061ad15a858ff0d641431f4d4ac101Daniel Dunbar  OW->WriteZeros(SD->getFileSize() - SD->getSize());
5196742e34385bff89b897ef0fc930c4bca9e75ac4aDaniel Dunbar
52053b2338a1d061ad15a858ff0d641431f4d4ac101Daniel Dunbar  assert(OW->getStream().tell() - Start == SD->getFileSize());
5210705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar}
5220705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
523fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarvoid MCAssembler::Finish() {
524b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  DEBUG_WITH_TYPE("mc-dump", {
525b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar      llvm::errs() << "assembler backend - pre-layout\n--\n";
526b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar      dump(); });
527b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
528f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar  // Layout until everything fits.
5298d39eb47d6a15d36be7ac0d0154a6897e42f5adcDaniel Dunbar  MCAsmLayout Layout(*this);
5308d39eb47d6a15d36be7ac0d0154a6897e42f5adcDaniel Dunbar  while (LayoutOnce(Layout))
531f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar    continue;
532f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar
533f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar  DEBUG_WITH_TYPE("mc-dump", {
5343f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar      llvm::errs() << "assembler backend - post-relaxation\n--\n";
5353f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar      dump(); });
5363f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar
5373f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  // Finalize the layout, including fragment lowering.
5383f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  FinishLayout(Layout);
5393f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar
5403f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  DEBUG_WITH_TYPE("mc-dump", {
5413f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar      llvm::errs() << "assembler backend - final-layout\n--\n";
542f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar      dump(); });
543f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar
544ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar  uint64_t StartOffset = OS.tell();
5451a9158c301b58d8119664f416461d5a5549170c4Daniel Dunbar  llvm::OwningPtr<MCObjectWriter> Writer(getBackend().createObjectWriter(OS));
5461a9158c301b58d8119664f416461d5a5549170c4Daniel Dunbar  if (!Writer)
5471a9158c301b58d8119664f416461d5a5549170c4Daniel Dunbar    llvm_report_error("unable to create object writer!");
548bacba997782f624d3c43591a913b8f1e3d733a52Daniel Dunbar
549bacba997782f624d3c43591a913b8f1e3d733a52Daniel Dunbar  // Allow the object writer a chance to perform post-layout binding (for
550bacba997782f624d3c43591a913b8f1e3d733a52Daniel Dunbar  // example, to set the index fields in the symbol data).
5511a9158c301b58d8119664f416461d5a5549170c4Daniel Dunbar  Writer->ExecutePostLayoutBinding(*this);
552bacba997782f624d3c43591a913b8f1e3d733a52Daniel Dunbar
553b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar  // Evaluate and apply the fixups, generating relocation entries as necessary.
554b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar  for (MCAssembler::iterator it = begin(), ie = end(); it != ie; ++it) {
555b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar    for (MCSectionData::iterator it2 = it->begin(),
556b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar           ie2 = it->end(); it2 != ie2; ++it2) {
557b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar      MCDataFragment *DF = dyn_cast<MCDataFragment>(it2);
558b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar      if (!DF)
559b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar        continue;
560b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar
561b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar      for (MCDataFragment::fixup_iterator it3 = DF->fixup_begin(),
562b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar             ie3 = DF->fixup_end(); it3 != ie3; ++it3) {
563b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar        MCAsmFixup &Fixup = *it3;
564b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar
565b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar        // Evaluate the fixup.
566b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar        MCValue Target;
567b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar        uint64_t FixedValue;
568b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar        if (!EvaluateFixup(Layout, Fixup, DF, Target, FixedValue)) {
569b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar          // The fixup was unresolved, we need a relocation. Inform the object
570b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar          // writer of the relocation, and give it an opportunity to adjust the
571b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar          // fixup value if need be.
572207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar          Writer->RecordRelocation(*this, Layout, DF, Fixup, Target,FixedValue);
573b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar        }
574b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar
57587190c473c216e481e0a70475577e496b3a3449eDaniel Dunbar        getBackend().ApplyFixup(Fixup, *DF, FixedValue);
576b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar      }
577b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar    }
578b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar  }
579b1e98945e4b107eb3f2ac1b54706c49864842dc4Daniel Dunbar
580bacba997782f624d3c43591a913b8f1e3d733a52Daniel Dunbar  // Write the object file.
581207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar  Writer->WriteObject(*this, Layout);
582f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar  OS.flush();
583ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar
584ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar  stats::ObjectBytes += OS.tell() - StartOffset;
585f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar}
586f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar
5879d39e616cc0f43e91e509e5c8129c7d46327fd0dDaniel Dunbarbool MCAssembler::FixupNeedsRelaxation(const MCAsmFixup &Fixup,
5889d39e616cc0f43e91e509e5c8129c7d46327fd0dDaniel Dunbar                                       const MCFragment *DF,
5898d39eb47d6a15d36be7ac0d0154a6897e42f5adcDaniel Dunbar                                       const MCAsmLayout &Layout) const {
590f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar  // If we cannot resolve the fixup value, it requires relaxation.
591f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar  MCValue Target;
592f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar  uint64_t Value;
593f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar  if (!EvaluateFixup(Layout, Fixup, DF, Target, Value))
594f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar    return true;
595f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar
596f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar  // Otherwise, relax if the value is too big for a (signed) i8.
597f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar  return int64_t(Value) != int64_t(int8_t(Value));
598f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar}
599f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar
600d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbarbool MCAssembler::FragmentNeedsRelaxation(const MCInstFragment *IF,
601d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar                                          const MCAsmLayout &Layout) const {
602d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar  // If this inst doesn't ever need relaxation, ignore it. This occurs when we
603d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar  // are intentionally pushing out inst fragments, or because we relaxed a
604d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar  // previous instruction to one that doesn't need relaxation.
605d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar  if (!getBackend().MayNeedRelaxation(IF->getInst(), IF->getFixups()))
606d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar    return false;
607d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar
608d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar  for (MCInstFragment::const_fixup_iterator it = IF->fixup_begin(),
609d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar         ie = IF->fixup_end(); it != ie; ++it)
610d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar    if (FixupNeedsRelaxation(*it, IF, Layout))
611d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      return true;
612d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar
613d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar  return false;
614d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar}
615d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar
6168d39eb47d6a15d36be7ac0d0154a6897e42f5adcDaniel Dunbarbool MCAssembler::LayoutOnce(MCAsmLayout &Layout) {
617ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar  ++stats::RelaxationSteps;
618ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar
619d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar  // Layout the concrete sections and fragments.
6205e835967dd5dda294d0ef3392f4c1d4a2260f532Daniel Dunbar  uint64_t Address = 0;
621edc670f3f2ba629b6803a1a7ed4aa47061afd276Daniel Dunbar  MCSectionData *Prev = 0;
622edc670f3f2ba629b6803a1a7ed4aa47061afd276Daniel Dunbar  for (iterator it = begin(), ie = end(); it != ie; ++it) {
6236742e34385bff89b897ef0fc930c4bca9e75ac4aDaniel Dunbar    MCSectionData &SD = *it;
6246742e34385bff89b897ef0fc930c4bca9e75ac4aDaniel Dunbar
625d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar    // Skip virtual sections.
626cc5b84c6fba79a798e86ea604e54ca9429273a13Daniel Dunbar    if (getBackend().isVirtualSection(SD.getSection()))
627d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar      continue;
628d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar
629edc670f3f2ba629b6803a1a7ed4aa47061afd276Daniel Dunbar    // Align this section if necessary by adding padding bytes to the previous
630edc670f3f2ba629b6803a1a7ed4aa47061afd276Daniel Dunbar    // section.
631edc670f3f2ba629b6803a1a7ed4aa47061afd276Daniel Dunbar    if (uint64_t Pad = OffsetToAlignment(Address, it->getAlignment())) {
632edc670f3f2ba629b6803a1a7ed4aa47061afd276Daniel Dunbar      assert(Prev && "Missing prev section!");
633edc670f3f2ba629b6803a1a7ed4aa47061afd276Daniel Dunbar      Prev->setFileSize(Prev->getFileSize() + Pad);
634edc670f3f2ba629b6803a1a7ed4aa47061afd276Daniel Dunbar      Address += Pad;
635edc670f3f2ba629b6803a1a7ed4aa47061afd276Daniel Dunbar    }
6366742e34385bff89b897ef0fc930c4bca9e75ac4aDaniel Dunbar
6376742e34385bff89b897ef0fc930c4bca9e75ac4aDaniel Dunbar    // Layout the section fragments and its size.
638207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar    Layout.setSectionAddress(&SD, Address);
6398d39eb47d6a15d36be7ac0d0154a6897e42f5adcDaniel Dunbar    LayoutSection(SD, Layout);
6406742e34385bff89b897ef0fc930c4bca9e75ac4aDaniel Dunbar    Address += SD.getFileSize();
641edc670f3f2ba629b6803a1a7ed4aa47061afd276Daniel Dunbar
642edc670f3f2ba629b6803a1a7ed4aa47061afd276Daniel Dunbar    Prev = &SD;
6435e835967dd5dda294d0ef3392f4c1d4a2260f532Daniel Dunbar  }
6440705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
645d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar  // Layout the virtual sections.
646d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar  for (iterator it = begin(), ie = end(); it != ie; ++it) {
647d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar    MCSectionData &SD = *it;
648d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar
649cc5b84c6fba79a798e86ea604e54ca9429273a13Daniel Dunbar    if (!getBackend().isVirtualSection(SD.getSection()))
650d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar      continue;
651d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar
652b2b4acd757194b4b75e571ec7225811f94e753f3Daniel Dunbar    // Align this section if necessary by adding padding bytes to the previous
653b2b4acd757194b4b75e571ec7225811f94e753f3Daniel Dunbar    // section.
654f8b8ad77a8b5632886a4cfe41d798bae7277efcbDaniel Dunbar    if (uint64_t Pad = OffsetToAlignment(Address, it->getAlignment()))
655b2b4acd757194b4b75e571ec7225811f94e753f3Daniel Dunbar      Address += Pad;
656b2b4acd757194b4b75e571ec7225811f94e753f3Daniel Dunbar
657207e06ea0446c51cb1d89f6400ec7becc46487f8Daniel Dunbar    Layout.setSectionAddress(&SD, Address);
6588d39eb47d6a15d36be7ac0d0154a6897e42f5adcDaniel Dunbar    LayoutSection(SD, Layout);
659d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar    Address += SD.getSize();
660d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar  }
661d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar
662d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar  // Scan for fragments that need relaxation.
663f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar  for (iterator it = begin(), ie = end(); it != ie; ++it) {
664f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar    MCSectionData &SD = *it;
665b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
666f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar    for (MCSectionData::iterator it2 = SD.begin(),
667f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar           ie2 = SD.end(); it2 != ie2; ++it2) {
668d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      // Check if this is an instruction fragment that needs relaxation.
669d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      MCInstFragment *IF = dyn_cast<MCInstFragment>(it2);
670d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      if (!IF || !FragmentNeedsRelaxation(IF, Layout))
671f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar        continue;
6720705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
673ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar      ++stats::RelaxedInstructions;
674ff54784683591b2cdbdc18690aeac12c8d87f97bDaniel Dunbar
675d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      // FIXME-PERF: We could immediately lower out instructions if we can tell
676d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      // they are fully resolved, to avoid retesting on later passes.
677f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar
678d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      // Relax the fragment.
679d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar
680d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      MCInst Relaxed;
681d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      getBackend().RelaxInstruction(IF, Relaxed);
682f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar
683d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      // Encode the new instruction.
684d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      //
685d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      // FIXME-PERF: If it matters, we could let the target do this. It can
686d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      // probably do so more efficiently in many cases.
687d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      SmallVector<MCFixup, 4> Fixups;
688d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      SmallString<256> Code;
689d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      raw_svector_ostream VecOS(Code);
690d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      getEmitter().EncodeInstruction(Relaxed, VecOS, Fixups);
691d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      VecOS.flush();
692d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar
693d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      // Update the instruction fragment.
694d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      IF->setInst(Relaxed);
695d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      IF->getCode() = Code;
696d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      IF->getFixups().clear();
697d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      for (unsigned i = 0, e = Fixups.size(); i != e; ++i) {
698d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar        MCFixup &F = Fixups[i];
699d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar        IF->getFixups().push_back(MCAsmFixup(F.getOffset(), *F.getValue(),
700d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar                                             F.getKind()));
701f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar      }
702d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar
703d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      // Restart layout.
704d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      //
705d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      // FIXME-PERF: This is O(N^2), but will be eliminated once we have a
706d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      // smart MCAsmLayout object.
707d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar      return true;
708f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar    }
709f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar  }
710f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar
711f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar  return false;
712f08fde41f34d739c157b1d75dadbb864e7957cabDaniel Dunbar}
713b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
7143f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbarvoid MCAssembler::FinishLayout(MCAsmLayout &Layout) {
7153f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  // Lower out any instruction fragments, to simplify the fixup application and
7163f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  // output.
7173f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  //
7183f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  // FIXME-PERF: We don't have to do this, but the assumption is that it is
7193f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  // cheap (we will mostly end up eliminating fragments and appending on to data
7203f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  // fragments), so the extra complexity downstream isn't worth it. Evaluate
7213f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  // this assumption.
7223f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  for (iterator it = begin(), ie = end(); it != ie; ++it) {
7233f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar    MCSectionData &SD = *it;
7243f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar
7253f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar    for (MCSectionData::iterator it2 = SD.begin(),
7263f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar           ie2 = SD.end(); it2 != ie2; ++it2) {
7273f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar      MCInstFragment *IF = dyn_cast<MCInstFragment>(it2);
7283f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar      if (!IF)
7293f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar        continue;
7303f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar
7313f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar      // Create a new data fragment for the instruction.
7323f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar      //
733337055e62f28f18a9a8c4a090633cae1c2256ae1Daniel Dunbar      // FIXME-PERF: Reuse previous data fragment if possible.
7343f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar      MCDataFragment *DF = new MCDataFragment();
7353f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar      SD.getFragmentList().insert(it2, DF);
7363f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar
7373f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar      // Update the data fragments layout data.
7389799de910e97879bf9f30f359551071a94d61570Daniel Dunbar      DF->setParent(IF->getParent());
7393f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar      DF->setOffset(IF->getOffset());
7403f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar      DF->setFileSize(IF->getInstSize());
7413f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar
7429799de910e97879bf9f30f359551071a94d61570Daniel Dunbar      // Copy in the data and the fixups.
7439799de910e97879bf9f30f359551071a94d61570Daniel Dunbar      DF->getContents().append(IF->getCode().begin(), IF->getCode().end());
7449799de910e97879bf9f30f359551071a94d61570Daniel Dunbar      for (unsigned i = 0, e = IF->getFixups().size(); i != e; ++i)
7459799de910e97879bf9f30f359551071a94d61570Daniel Dunbar        DF->getFixups().push_back(IF->getFixups()[i]);
7463f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar
7473f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar      // Delete the instruction fragment and update the iterator.
7483f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar      SD.getFragmentList().erase(IF);
7493f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar      it2 = DF;
7503f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar    }
7513f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  }
7523f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar}
7533f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar
754b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar// Debugging methods
755b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
756b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbarnamespace llvm {
757b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
758b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbarraw_ostream &operator<<(raw_ostream &OS, const MCAsmFixup &AF) {
7592be2fd073003c0988723d2894dfb117ad90be11bDaniel Dunbar  OS << "<MCAsmFixup" << " Offset:" << AF.Offset << " Value:" << *AF.Value
7602be2fd073003c0988723d2894dfb117ad90be11bDaniel Dunbar     << " Kind:" << AF.Kind << ">";
761b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  return OS;
762b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar}
763b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
764b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar}
765b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
766b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbarvoid MCFragment::dump() {
767b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  raw_ostream &OS = llvm::errs();
768b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
769b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "<MCFragment " << (void*) this << " Offset:" << Offset
770b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar     << " FileSize:" << FileSize;
771b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
772b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << ">";
773b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar}
774b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
775b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbarvoid MCAlignFragment::dump() {
776b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  raw_ostream &OS = llvm::errs();
777b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
778b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "<MCAlignFragment ";
779b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  this->MCFragment::dump();
780b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "\n       ";
781b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << " Alignment:" << getAlignment()
782b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar     << " Value:" << getValue() << " ValueSize:" << getValueSize()
783b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar     << " MaxBytesToEmit:" << getMaxBytesToEmit() << ">";
784b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar}
785b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
786b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbarvoid MCDataFragment::dump() {
787b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  raw_ostream &OS = llvm::errs();
788b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
789b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "<MCDataFragment ";
790b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  this->MCFragment::dump();
791b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "\n       ";
792b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << " Contents:[";
793b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  for (unsigned i = 0, e = getContents().size(); i != e; ++i) {
794b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar    if (i) OS << ",";
795b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar    OS << hexdigit((Contents[i] >> 4) & 0xF) << hexdigit(Contents[i] & 0xF);
796b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  }
7972be2fd073003c0988723d2894dfb117ad90be11bDaniel Dunbar  OS << "] (" << getContents().size() << " bytes)";
7980bcf074867d4d366f7988a219c7a53265fcb4f23Daniel Dunbar
7990bcf074867d4d366f7988a219c7a53265fcb4f23Daniel Dunbar  if (!getFixups().empty()) {
8000bcf074867d4d366f7988a219c7a53265fcb4f23Daniel Dunbar    OS << ",\n       ";
8010bcf074867d4d366f7988a219c7a53265fcb4f23Daniel Dunbar    OS << " Fixups:[";
8020bcf074867d4d366f7988a219c7a53265fcb4f23Daniel Dunbar    for (fixup_iterator it = fixup_begin(), ie = fixup_end(); it != ie; ++it) {
80345aefff64c64d5bd7804f39d994883b98ce4415aDaniel Dunbar      if (it != fixup_begin()) OS << ",\n                ";
8040bcf074867d4d366f7988a219c7a53265fcb4f23Daniel Dunbar      OS << *it;
8050bcf074867d4d366f7988a219c7a53265fcb4f23Daniel Dunbar    }
8060bcf074867d4d366f7988a219c7a53265fcb4f23Daniel Dunbar    OS << "]";
8070bcf074867d4d366f7988a219c7a53265fcb4f23Daniel Dunbar  }
8080bcf074867d4d366f7988a219c7a53265fcb4f23Daniel Dunbar
8090bcf074867d4d366f7988a219c7a53265fcb4f23Daniel Dunbar  OS << ">";
810b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar}
811b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
812b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbarvoid MCFillFragment::dump() {
813b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  raw_ostream &OS = llvm::errs();
814b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
815b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "<MCFillFragment ";
816b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  this->MCFragment::dump();
817b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "\n       ";
818b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << " Value:" << getValue() << " ValueSize:" << getValueSize()
819b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar     << " Count:" << getCount() << ">";
820b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar}
821b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
8223f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbarvoid MCInstFragment::dump() {
8233f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  raw_ostream &OS = llvm::errs();
8243f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar
8253f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  OS << "<MCInstFragment ";
8263f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  this->MCFragment::dump();
8273f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  OS << "\n       ";
8283f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  OS << " Inst:";
8293f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  getInst().dump_pretty(OS);
8303f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar  OS << ">";
8313f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar}
8323f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar
833b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbarvoid MCOrgFragment::dump() {
834b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  raw_ostream &OS = llvm::errs();
835b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
836b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "<MCOrgFragment ";
837b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  this->MCFragment::dump();
838b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "\n       ";
839b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << " Offset:" << getOffset() << " Value:" << getValue() << ">";
840b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar}
841b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
842b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbarvoid MCZeroFillFragment::dump() {
843b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  raw_ostream &OS = llvm::errs();
844b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
845b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "<MCZeroFillFragment ";
846b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  this->MCFragment::dump();
847b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "\n       ";
848b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << " Size:" << getSize() << " Alignment:" << getAlignment() << ">";
849b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar}
850b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
851b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbarvoid MCSectionData::dump() {
852b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  raw_ostream &OS = llvm::errs();
853b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
854b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "<MCSectionData";
855b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << " Alignment:" << getAlignment() << " Address:" << Address
856b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar     << " Size:" << Size << " FileSize:" << FileSize
85745aefff64c64d5bd7804f39d994883b98ce4415aDaniel Dunbar     << " Fragments:[\n      ";
858b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  for (iterator it = begin(), ie = end(); it != ie; ++it) {
859b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar    if (it != begin()) OS << ",\n      ";
860b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar    it->dump();
861b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  }
862b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "]>";
863b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar}
864b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
865b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbarvoid MCSymbolData::dump() {
866b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  raw_ostream &OS = llvm::errs();
867b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
868b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "<MCSymbolData Symbol:" << getSymbol()
869b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar     << " Fragment:" << getFragment() << " Offset:" << getOffset()
870b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar     << " Flags:" << getFlags() << " Index:" << getIndex();
871b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  if (isCommon())
872b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar    OS << " (common, size:" << getCommonSize()
873b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar       << " align: " << getCommonAlignment() << ")";
874b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  if (isExternal())
875b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar    OS << " (external)";
876b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  if (isPrivateExtern())
877b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar    OS << " (private extern)";
878b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << ">";
879b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar}
880b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
881b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbarvoid MCAssembler::dump() {
882b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  raw_ostream &OS = llvm::errs();
883b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
884b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "<MCAssembler\n";
88545aefff64c64d5bd7804f39d994883b98ce4415aDaniel Dunbar  OS << "  Sections:[\n    ";
886b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  for (iterator it = begin(), ie = end(); it != ie; ++it) {
887b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar    if (it != begin()) OS << ",\n    ";
888b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar    it->dump();
889b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  }
890b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "],\n";
891b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "  Symbols:[";
892b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar
893b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  for (symbol_iterator it = symbol_begin(), ie = symbol_end(); it != ie; ++it) {
89445aefff64c64d5bd7804f39d994883b98ce4415aDaniel Dunbar    if (it != symbol_begin()) OS << ",\n           ";
895b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar    it->dump();
896b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  }
897b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar  OS << "]>\n";
898b7c3a4b195597848e7c2559937914ae1087f3131Daniel Dunbar}
899