MCMachOStreamer.cpp revision 97f7f4e43d2df00253b794d936be65d2afa78716
1fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar//===- lib/MC/MCMachOStreamer.cpp - Mach-O Object Output ------------===//
2fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar//
3fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar//                     The LLVM Compiler Infrastructure
4fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar//
5fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar// This file is distributed under the University of Illinois Open Source
6fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar// License. See LICENSE.TXT for details.
7fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar//
8fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar//===----------------------------------------------------------------------===//
9fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
10fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar#include "llvm/MC/MCStreamer.h"
11fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
12fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar#include "llvm/MC/MCAssembler.h"
13fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar#include "llvm/MC/MCContext.h"
144fac74950a1ff08b995b366bfb84369c1507faefDaniel Dunbar#include "llvm/MC/MCCodeEmitter.h"
158c2eebe4074ef218b30d94358f6b2e45c079605cDaniel Dunbar#include "llvm/MC/MCExpr.h"
164fac74950a1ff08b995b366bfb84369c1507faefDaniel Dunbar#include "llvm/MC/MCInst.h"
178dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel Dunbar#include "llvm/MC/MCObjectStreamer.h"
18fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar#include "llvm/MC/MCSection.h"
19fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar#include "llvm/MC/MCSymbol.h"
20a6eeb6e226d7d86d04e34e3b6464f66e0a052f43Kevin Enderby#include "llvm/MC/MCMachOSymbolFlags.h"
21b07ce60981368f816af4caa3257e1e4ebf059133Kevin Enderby#include "llvm/MC/MCSectionMachO.h"
22b07ce60981368f816af4caa3257e1e4ebf059133Kevin Enderby#include "llvm/MC/MCDwarf.h"
23c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby#include "llvm/Support/Dwarf.h"
24fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar#include "llvm/Support/ErrorHandling.h"
254fac74950a1ff08b995b366bfb84369c1507faefDaniel Dunbar#include "llvm/Support/raw_ostream.h"
26d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar#include "llvm/Target/TargetAsmBackend.h"
2789b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola#include "llvm/Target/TargetAsmInfo.h"
28d8036fb0deb7daff7959b0a5407c8a45acb5e603Daniel Dunbar
29fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarusing namespace llvm;
30fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
31fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarnamespace {
32fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
338dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel Dunbarclass MCMachOStreamer : public MCObjectStreamer {
346aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbarprivate:
35f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola  virtual void EmitInstToData(const MCInst &Inst);
362ac0c453b2de1029f35d9ccb933c1ef303be00a2Daniel Dunbar
37fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarpublic:
381f3e445184e5ca2aa4295c2a77f2a4e0b957fea1Daniel Dunbar  MCMachOStreamer(MCContext &Context, TargetAsmBackend &TAB,
398dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel Dunbar                  raw_ostream &OS, MCCodeEmitter *Emitter)
4085f2ecc697a8ca6c8cf08093054cbbb9d2060ccfRafael Espindola    : MCObjectStreamer(Context, TAB, OS, Emitter) {}
41ac2884a717daf3ad2aa8425320795d661e8a980bDaniel Dunbar
42fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  /// @name MCStreamer Interface
43fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  /// @{
44fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
45d80781b98b771d370730ab7c630018f23e202b57Rafael Espindola  virtual void InitSections();
46fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  virtual void EmitLabel(MCSymbol *Symbol);
478bca4106dfc2945723251db10e340183f3e372ddRafael Espindola  virtual void EmitEHSymAttributes(const MCSymbol *Symbol,
488bca4106dfc2945723251db10e340183f3e372ddRafael Espindola                                   MCSymbol *EHSymbol);
49a5ad93a10a5435f21090b09edb6b3a7e44967648Chris Lattner  virtual void EmitAssemblerFlag(MCAssemblerFlag Flag);
50ce79299f78bb04e76e1860ab119b85d69f3a19c7Jim Grosbach  virtual void EmitThumbFunc(MCSymbol *Func);
51821e3334ed3390d931f497300e6a5f1dc21bcfb3Daniel Dunbar  virtual void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value);
52a5ad93a10a5435f21090b09edb6b3a7e44967648Chris Lattner  virtual void EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute);
53fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  virtual void EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue);
549eb158d5b4cd4f6fc80912e2dd77bdf13c3ca0e7Chris Lattner  virtual void EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size,
557092c7e1dcf9d05741b400dd54bbd7d3419773b2Daniel Dunbar                                unsigned ByteAlignment);
56b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner  virtual void BeginCOFFSymbolDef(const MCSymbol *Symbol) {
57b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner    assert(0 && "macho doesn't support this directive");
58b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner  }
59b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner  virtual void EmitCOFFSymbolStorageClass(int StorageClass) {
60b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner    assert(0 && "macho doesn't support this directive");
61b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner  }
62b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner  virtual void EmitCOFFSymbolType(int Type) {
63b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner    assert(0 && "macho doesn't support this directive");
64b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner  }
65b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner  virtual void EndCOFFSymbolDef() {
66b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner    assert(0 && "macho doesn't support this directive");
67b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner  }
6899328add833807f12a4950c7de29fb2a5df04703Chris Lattner  virtual void EmitELFSize(MCSymbol *Symbol, const MCExpr *Value) {
6999328add833807f12a4950c7de29fb2a5df04703Chris Lattner    assert(0 && "macho doesn't support this directive");
7099328add833807f12a4950c7de29fb2a5df04703Chris Lattner  }
719eb158d5b4cd4f6fc80912e2dd77bdf13c3ca0e7Chris Lattner  virtual void EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size) {
729eb158d5b4cd4f6fc80912e2dd77bdf13c3ca0e7Chris Lattner    assert(0 && "macho doesn't support this directive");
739eb158d5b4cd4f6fc80912e2dd77bdf13c3ca0e7Chris Lattner  }
748751b94ffbd9c49df8949a37f78d6bd0be87b256Daniel Dunbar  virtual void EmitZerofill(const MCSection *Section, MCSymbol *Symbol = 0,
757092c7e1dcf9d05741b400dd54bbd7d3419773b2Daniel Dunbar                            unsigned Size = 0, unsigned ByteAlignment = 0);
76011c3f110bca748db66e437924f936a62f1969bfEric Christopher  virtual void EmitTBSSSymbol(const MCSection *Section, MCSymbol *Symbol,
77011c3f110bca748db66e437924f936a62f1969bfEric Christopher                              uint64_t Size, unsigned ByteAlignment = 0);
78aaec205b87637cd0d59d4f11630db603686eb73dChris Lattner  virtual void EmitBytes(StringRef Data, unsigned AddrSpace);
79fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  virtual void EmitValueToAlignment(unsigned ByteAlignment, int64_t Value = 0,
80fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar                                    unsigned ValueSize = 1,
81fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar                                    unsigned MaxBytesToEmit = 0);
826e72048add2a6464e038121c6c275da37528aa0aKevin Enderby  virtual void EmitCodeAlignment(unsigned ByteAlignment,
836e72048add2a6464e038121c6c275da37528aa0aKevin Enderby                                 unsigned MaxBytesToEmit = 0);
842ac0c453b2de1029f35d9ccb933c1ef303be00a2Daniel Dunbar
85a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattner  virtual void EmitFileDirective(StringRef Filename) {
8696749678c9d4cf73d8cbc108a2f2f4872e4e4413Daniel Dunbar    // FIXME: Just ignore the .file; it isn't important enough to fail the
8796749678c9d4cf73d8cbc108a2f2f4872e4e4413Daniel Dunbar    // entire assembly.
8896749678c9d4cf73d8cbc108a2f2f4872e4e4413Daniel Dunbar
8996749678c9d4cf73d8cbc108a2f2f4872e4e4413Daniel Dunbar    //report_fatal_error("unsupported directive: '.file'");
90a6594fc7156c0afbe6fd5a6aab9b099aaf950c53Chris Lattner  }
912ac0c453b2de1029f35d9ccb933c1ef303be00a2Daniel Dunbar
92a86de1050889b61df2cd42cdc2acc5f9796b7f0cDaniel Dunbar  virtual void Finish();
93a86de1050889b61df2cd42cdc2acc5f9796b7f0cDaniel Dunbar
94fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar  /// @}
95fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar};
96fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
97fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar} // end anonymous namespace.
98fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
99d80781b98b771d370730ab7c630018f23e202b57Rafael Espindolavoid MCMachOStreamer::InitSections() {
100d80781b98b771d370730ab7c630018f23e202b57Rafael Espindola  SwitchSection(getContext().getMachOSection("__TEXT", "__text",
101d80781b98b771d370730ab7c630018f23e202b57Rafael Espindola                                    MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS,
102d80781b98b771d370730ab7c630018f23e202b57Rafael Espindola                                    0, SectionKind::getText()));
103d80781b98b771d370730ab7c630018f23e202b57Rafael Espindola
104d80781b98b771d370730ab7c630018f23e202b57Rafael Espindola}
105d80781b98b771d370730ab7c630018f23e202b57Rafael Espindola
1068bca4106dfc2945723251db10e340183f3e372ddRafael Espindolavoid MCMachOStreamer::EmitEHSymAttributes(const MCSymbol *Symbol,
1078bca4106dfc2945723251db10e340183f3e372ddRafael Espindola                                          MCSymbol *EHSymbol) {
1088bca4106dfc2945723251db10e340183f3e372ddRafael Espindola  MCSymbolData &SD =
1098bca4106dfc2945723251db10e340183f3e372ddRafael Espindola    getAssembler().getOrCreateSymbolData(*Symbol);
1108bca4106dfc2945723251db10e340183f3e372ddRafael Espindola  if (SD.isExternal())
1118bca4106dfc2945723251db10e340183f3e372ddRafael Espindola    EmitSymbolAttribute(EHSymbol, MCSA_Global);
1128bca4106dfc2945723251db10e340183f3e372ddRafael Espindola  if (SD.getFlags() & SF_WeakDefinition)
1138bca4106dfc2945723251db10e340183f3e372ddRafael Espindola    EmitSymbolAttribute(EHSymbol, MCSA_WeakDefinition);
11497f7f4e43d2df00253b794d936be65d2afa78716Rafael Espindola  if (SD.isPrivateExtern())
11597f7f4e43d2df00253b794d936be65d2afa78716Rafael Espindola    EmitSymbolAttribute(EHSymbol, MCSA_PrivateExtern);
1168bca4106dfc2945723251db10e340183f3e372ddRafael Espindola}
1178bca4106dfc2945723251db10e340183f3e372ddRafael Espindola
118fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarvoid MCMachOStreamer::EmitLabel(MCSymbol *Symbol) {
119ba210243ef7d325ef6954d459091edf580a241f9Rafael Espindola  assert(Symbol->isUndefined() && "Cannot define a symbol twice!");
120ba210243ef7d325ef6954d459091edf580a241f9Rafael Espindola
121ea4afa91eb453323948588ad1e1706d842fb9007Rafael Espindola  // isSymbolLinkerVisible uses the section.
1227768a9dce14431018133cd586f5c8ce3e057f069Rafael Espindola  Symbol->setSection(*getCurrentSection());
123a86de1050889b61df2cd42cdc2acc5f9796b7f0cDaniel Dunbar  // We have to create a new fragment if this is an atom defining symbol,
124a86de1050889b61df2cd42cdc2acc5f9796b7f0cDaniel Dunbar  // fragments cannot span atoms.
125ea4afa91eb453323948588ad1e1706d842fb9007Rafael Espindola  if (getAssembler().isSymbolLinkerVisible(*Symbol))
126a86de1050889b61df2cd42cdc2acc5f9796b7f0cDaniel Dunbar    new MCDataFragment(getCurrentSectionData());
127071f73db4a0c3f7f00ef14d38af17f3c8d69827aDaniel Dunbar
128ea4afa91eb453323948588ad1e1706d842fb9007Rafael Espindola  MCObjectStreamer::EmitLabel(Symbol);
1296aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar
130ea4afa91eb453323948588ad1e1706d842fb9007Rafael Espindola  MCSymbolData &SD = getAssembler().getSymbolData(*Symbol);
131b18d2dd115d8ff3fd75bbaa90849473266236dc3Daniel Dunbar  // This causes the reference type flag to be cleared. Darwin 'as' was "trying"
132b18d2dd115d8ff3fd75bbaa90849473266236dc3Daniel Dunbar  // to clear the weak reference and weak definition bits too, but the
133b18d2dd115d8ff3fd75bbaa90849473266236dc3Daniel Dunbar  // implementation was buggy. For now we just try to match 'as', for
134b18d2dd115d8ff3fd75bbaa90849473266236dc3Daniel Dunbar  // diffability.
135b18d2dd115d8ff3fd75bbaa90849473266236dc3Daniel Dunbar  //
136b18d2dd115d8ff3fd75bbaa90849473266236dc3Daniel Dunbar  // FIXME: Cleanup this code, these bits should be emitted based on semantic
137b18d2dd115d8ff3fd75bbaa90849473266236dc3Daniel Dunbar  // properties, not on the order of definition, etc.
138b18d2dd115d8ff3fd75bbaa90849473266236dc3Daniel Dunbar  SD.setFlags(SD.getFlags() & ~SF_ReferenceTypeMask);
139fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar}
140fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
141a5ad93a10a5435f21090b09edb6b3a7e44967648Chris Lattnervoid MCMachOStreamer::EmitAssemblerFlag(MCAssemblerFlag Flag) {
1425be6d2af38c29e3653998978345220974cc40c01Jim Grosbach  // Let the target do whatever target specific stuff it needs to do.
1435be6d2af38c29e3653998978345220974cc40c01Jim Grosbach  getAssembler().getBackend().HandleAssemblerFlag(Flag);
1445be6d2af38c29e3653998978345220974cc40c01Jim Grosbach  // Do any generic stuff we need to do.
1456009db486e7fba448ccb28dff676c012efade8f0Daniel Dunbar  switch (Flag) {
146ce79299f78bb04e76e1860ab119b85d69f3a19c7Jim Grosbach  case MCAF_SyntaxUnified: return; // no-op here.
147ce79299f78bb04e76e1860ab119b85d69f3a19c7Jim Grosbach  case MCAF_Code16: return; // no-op here.
148ba21957cbd7b25e3d25a3e9befe6151000242853Jim Grosbach  case MCAF_Code32: return; // no-op here.
149a5ad93a10a5435f21090b09edb6b3a7e44967648Chris Lattner  case MCAF_SubsectionsViaSymbols:
1508dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel Dunbar    getAssembler().setSubsectionsViaSymbols(true);
1518c3eaf46a1fb69004723ce78aaa82965d6474175Daniel Dunbar    return;
1525c0d472b6ebc4408b97d12e1e545cafdcbd50adfChandler Carruth  default:
1535c0d472b6ebc4408b97d12e1e545cafdcbd50adfChandler Carruth    llvm_unreachable("invalid assembler flag!");
1546009db486e7fba448ccb28dff676c012efade8f0Daniel Dunbar  }
155fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar}
156fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
157b2624eda5ad0ead99ec5ab7ead47b586c96d1109Daniel Dunbarvoid MCMachOStreamer::EmitThumbFunc(MCSymbol *Symbol) {
158ce79299f78bb04e76e1860ab119b85d69f3a19c7Jim Grosbach  // FIXME: Flag the function ISA as thumb with DW_AT_APPLE_isa.
159475002078848d102b6577fe7283464c039b38af6Jim Grosbach
160475002078848d102b6577fe7283464c039b38af6Jim Grosbach  // Remember that the function is a thumb function. Fixup and relocation
161475002078848d102b6577fe7283464c039b38af6Jim Grosbach  // values will need adjusted.
162b2624eda5ad0ead99ec5ab7ead47b586c96d1109Daniel Dunbar  getAssembler().setIsThumbFunc(Symbol);
163b2624eda5ad0ead99ec5ab7ead47b586c96d1109Daniel Dunbar
164b2624eda5ad0ead99ec5ab7ead47b586c96d1109Daniel Dunbar  // Mark the thumb bit on the symbol.
165b2624eda5ad0ead99ec5ab7ead47b586c96d1109Daniel Dunbar  MCSymbolData &SD = getAssembler().getOrCreateSymbolData(*Symbol);
166b2624eda5ad0ead99ec5ab7ead47b586c96d1109Daniel Dunbar  SD.setFlags(SD.getFlags() | SF_ThumbFunc);
167ce79299f78bb04e76e1860ab119b85d69f3a19c7Jim Grosbach}
168ce79299f78bb04e76e1860ab119b85d69f3a19c7Jim Grosbach
169821e3334ed3390d931f497300e6a5f1dc21bcfb3Daniel Dunbarvoid MCMachOStreamer::EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) {
1708067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer  // TODO: This is exactly the same as WinCOFFStreamer. Consider merging into
1718067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer  // MCObjectStreamer.
172a4d8667c870759a70aa9bea99e64b7f7e938b1a1Daniel Dunbar  // FIXME: Lift context changes into super class.
1738dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel Dunbar  getAssembler().getOrCreateSymbolData(*Symbol);
17408a408a4b3224627db07eb27e174085d8e1d2426Daniel Dunbar  Symbol->setVariableValue(AddValueSymbols(Value));
175fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar}
176fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
177fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarvoid MCMachOStreamer::EmitSymbolAttribute(MCSymbol *Symbol,
178a5ad93a10a5435f21090b09edb6b3a7e44967648Chris Lattner                                          MCSymbolAttr Attribute) {
1790c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar  // Indirect symbols are handled differently, to match how 'as' handles
1800c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar  // them. This makes writing matching .o files easier.
181a5ad93a10a5435f21090b09edb6b3a7e44967648Chris Lattner  if (Attribute == MCSA_IndirectSymbol) {
182ad7c3d55932f949e6bd428232999088a53f54a4fDaniel Dunbar    // Note that we intentionally cannot use the symbol data here; this is
183ad7c3d55932f949e6bd428232999088a53f54a4fDaniel Dunbar    // important for matching the string table that 'as' generates.
1840c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar    IndirectSymbolData ISD;
1850c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar    ISD.Symbol = Symbol;
18683b467178a8295048f3ee7b44ff9c7ea244a96ccDaniel Dunbar    ISD.SectionData = getCurrentSectionData();
1878dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel Dunbar    getAssembler().getIndirectSymbols().push_back(ISD);
1880c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar    return;
1890c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar  }
1900c7761b3f98fee270d73f5b9c440fe15e82af263Daniel Dunbar
1916aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar  // Adding a symbol attribute always introduces the symbol, note that an
19246836a783ab29f9cb49655d8b9cb8f5538a626feDaniel Dunbar  // important side effect of calling getOrCreateSymbolData here is to register
19346836a783ab29f9cb49655d8b9cb8f5538a626feDaniel Dunbar  // the symbol with the assembler.
1948dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel Dunbar  MCSymbolData &SD = getAssembler().getOrCreateSymbolData(*Symbol);
1956aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar
1966aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar  // The implementation of symbol attributes is designed to match 'as', but it
1976aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar  // leaves much to desired. It doesn't really make sense to arbitrarily add and
1986aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar  // remove flags, but 'as' allows this (in particular, see .desc).
1996aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar  //
2006aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar  // In the future it might be worth trying to make these operations more well
2016aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar  // defined.
2023edd9bb7a3da8526eb2f4a5dae2962a987d3d566Daniel Dunbar  switch (Attribute) {
203a5ad93a10a5435f21090b09edb6b3a7e44967648Chris Lattner  case MCSA_Invalid:
204ed0ab15170f0f8fc4269d58757378bc8726b56a1Chris Lattner  case MCSA_ELF_TypeFunction:
205ed0ab15170f0f8fc4269d58757378bc8726b56a1Chris Lattner  case MCSA_ELF_TypeIndFunction:
206ed0ab15170f0f8fc4269d58757378bc8726b56a1Chris Lattner  case MCSA_ELF_TypeObject:
207ed0ab15170f0f8fc4269d58757378bc8726b56a1Chris Lattner  case MCSA_ELF_TypeTLS:
208ed0ab15170f0f8fc4269d58757378bc8726b56a1Chris Lattner  case MCSA_ELF_TypeCommon:
209ed0ab15170f0f8fc4269d58757378bc8726b56a1Chris Lattner  case MCSA_ELF_TypeNoType:
210e13a0ff8ac6c86a04397801061e1a702d4e0eab1Rafael Espindola  case MCSA_ELF_TypeGnuUniqueObject:
211a5ad93a10a5435f21090b09edb6b3a7e44967648Chris Lattner  case MCSA_IndirectSymbol:
212a5ad93a10a5435f21090b09edb6b3a7e44967648Chris Lattner  case MCSA_Hidden:
213a5ad93a10a5435f21090b09edb6b3a7e44967648Chris Lattner  case MCSA_Internal:
214a5ad93a10a5435f21090b09edb6b3a7e44967648Chris Lattner  case MCSA_Protected:
215a5ad93a10a5435f21090b09edb6b3a7e44967648Chris Lattner  case MCSA_Weak:
216a5ad93a10a5435f21090b09edb6b3a7e44967648Chris Lattner  case MCSA_Local:
2176aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar    assert(0 && "Invalid symbol attribute for Mach-O!");
2186aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar    break;
2193edd9bb7a3da8526eb2f4a5dae2962a987d3d566Daniel Dunbar
220a5ad93a10a5435f21090b09edb6b3a7e44967648Chris Lattner  case MCSA_Global:
2218f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar    SD.setExternal(true);
222b18d2dd115d8ff3fd75bbaa90849473266236dc3Daniel Dunbar    // This effectively clears the undefined lazy bit, in Darwin 'as', although
223b18d2dd115d8ff3fd75bbaa90849473266236dc3Daniel Dunbar    // it isn't very consistent because it implements this as part of symbol
224b18d2dd115d8ff3fd75bbaa90849473266236dc3Daniel Dunbar    // lookup.
225b18d2dd115d8ff3fd75bbaa90849473266236dc3Daniel Dunbar    //
226b18d2dd115d8ff3fd75bbaa90849473266236dc3Daniel Dunbar    // FIXME: Cleanup this code, these bits should be emitted based on semantic
227b18d2dd115d8ff3fd75bbaa90849473266236dc3Daniel Dunbar    // properties, not on the order of definition, etc.
228b18d2dd115d8ff3fd75bbaa90849473266236dc3Daniel Dunbar    SD.setFlags(SD.getFlags() & ~SF_ReferenceTypeUndefinedLazy);
2293edd9bb7a3da8526eb2f4a5dae2962a987d3d566Daniel Dunbar    break;
2306aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar
231a5ad93a10a5435f21090b09edb6b3a7e44967648Chris Lattner  case MCSA_LazyReference:
2326aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar    // FIXME: This requires -dynamic.
2336aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar    SD.setFlags(SD.getFlags() | SF_NoDeadStrip);
2346aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar    if (Symbol->isUndefined())
2356aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar      SD.setFlags(SD.getFlags() | SF_ReferenceTypeUndefinedLazy);
2366aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar    break;
2376aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar
2386aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar    // Since .reference sets the no dead strip bit, it is equivalent to
2396aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar    // .no_dead_strip in practice.
240a5ad93a10a5435f21090b09edb6b3a7e44967648Chris Lattner  case MCSA_Reference:
241a5ad93a10a5435f21090b09edb6b3a7e44967648Chris Lattner  case MCSA_NoDeadStrip:
2426aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar    SD.setFlags(SD.getFlags() | SF_NoDeadStrip);
2436aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar    break;
2446aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar
245e8e98d7f2eaa0613442ce21ab6a040c0f04f5b4dKevin Enderby  case MCSA_SymbolResolver:
246e8e98d7f2eaa0613442ce21ab6a040c0f04f5b4dKevin Enderby    SD.setFlags(SD.getFlags() | SF_SymbolResolver);
247e8e98d7f2eaa0613442ce21ab6a040c0f04f5b4dKevin Enderby    break;
248e8e98d7f2eaa0613442ce21ab6a040c0f04f5b4dKevin Enderby
249a5ad93a10a5435f21090b09edb6b3a7e44967648Chris Lattner  case MCSA_PrivateExtern:
2506aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar    SD.setExternal(true);
2516aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar    SD.setPrivateExtern(true);
2526aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar    break;
2536aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar
254a5ad93a10a5435f21090b09edb6b3a7e44967648Chris Lattner  case MCSA_WeakReference:
2556aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar    // FIXME: This requires -dynamic.
2566aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar    if (Symbol->isUndefined())
2576aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar      SD.setFlags(SD.getFlags() | SF_WeakReference);
2586aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar    break;
2596aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar
260a5ad93a10a5435f21090b09edb6b3a7e44967648Chris Lattner  case MCSA_WeakDefinition:
2616aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar    // FIXME: 'as' enforces that this is defined and global. The manual claims
2626aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar    // it has to be in a coalesced section, but this isn't enforced.
2636aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar    SD.setFlags(SD.getFlags() | SF_WeakDefinition);
2646aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar    break;
265f59cac5ed36360b4c462781051f996b3499d7e0fKevin Enderby
266f59cac5ed36360b4c462781051f996b3499d7e0fKevin Enderby  case MCSA_WeakDefAutoPrivate:
267f59cac5ed36360b4c462781051f996b3499d7e0fKevin Enderby    SD.setFlags(SD.getFlags() | SF_WeakDefinition | SF_WeakReference);
268f59cac5ed36360b4c462781051f996b3499d7e0fKevin Enderby    break;
2693edd9bb7a3da8526eb2f4a5dae2962a987d3d566Daniel Dunbar  }
270fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar}
271fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
272fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarvoid MCMachOStreamer::EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) {
2736aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar  // Encode the 'desc' value into the lowest implementation defined bits.
2742ac0c453b2de1029f35d9ccb933c1ef303be00a2Daniel Dunbar  assert(DescValue == (DescValue & SF_DescFlagsMask) &&
2756aff2fbd56d4bc2d6029f7c9bd49a97f6dc01213Daniel Dunbar         "Invalid .desc value!");
2768dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel Dunbar  getAssembler().getOrCreateSymbolData(*Symbol).setFlags(
2778dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel Dunbar    DescValue & SF_DescFlagsMask);
278fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar}
279fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
2809eb158d5b4cd4f6fc80912e2dd77bdf13c3ca0e7Chris Lattnervoid MCMachOStreamer::EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size,
2817092c7e1dcf9d05741b400dd54bbd7d3419773b2Daniel Dunbar                                       unsigned ByteAlignment) {
2828f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar  // FIXME: Darwin 'as' does appear to allow redef of a .comm by itself.
2838f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar  assert(Symbol->isUndefined() && "Cannot define a symbol twice!");
2848f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar
2858dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel Dunbar  MCSymbolData &SD = getAssembler().getOrCreateSymbolData(*Symbol);
2868f4d146c340c9423271ebd7bb3fd32b880000bc9Daniel Dunbar  SD.setExternal(true);
2877092c7e1dcf9d05741b400dd54bbd7d3419773b2Daniel Dunbar  SD.setCommon(Size, ByteAlignment);
288fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar}
289fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
2908751b94ffbd9c49df8949a37f78d6bd0be87b256Daniel Dunbarvoid MCMachOStreamer::EmitZerofill(const MCSection *Section, MCSymbol *Symbol,
2917092c7e1dcf9d05741b400dd54bbd7d3419773b2Daniel Dunbar                                   unsigned Size, unsigned ByteAlignment) {
2928dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel Dunbar  MCSectionData &SectData = getAssembler().getOrCreateSectionData(*Section);
293d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar
294d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar  // The symbol may not be present, which only creates the section.
295d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar  if (!Symbol)
296d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar    return;
297d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar
298d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar  // FIXME: Assert that this section has the zerofill type.
299d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar
300d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar  assert(Symbol->isUndefined() && "Cannot define a symbol twice!");
301d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar
3028dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel Dunbar  MCSymbolData &SD = getAssembler().getOrCreateSymbolData(*Symbol);
303d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar
304e73d49eda2cb4fc30b52c4a241acf69c8af98302Daniel Dunbar  // Emit an align fragment if necessary.
305e73d49eda2cb4fc30b52c4a241acf69c8af98302Daniel Dunbar  if (ByteAlignment != 1)
3061c15413ebc8f4a35545a381a789a718627396d03Daniel Dunbar    new MCAlignFragment(ByteAlignment, 0, 0, ByteAlignment, &SectData);
307e73d49eda2cb4fc30b52c4a241acf69c8af98302Daniel Dunbar
3084e544870c4c3f81b150e4c3b38a18d629d706b74Daniel Dunbar  MCFragment *F = new MCFillFragment(0, 0, Size, &SectData);
309d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar  SD.setFragment(F);
310d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar
311d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar  Symbol->setSection(*Section);
312d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar
313d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar  // Update the maximum alignment on the zero fill section if necessary.
314d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar  if (ByteAlignment > SectData.getAlignment())
315d5a8e98ef627a35284c9b5989664514f8f163968Daniel Dunbar    SectData.setAlignment(ByteAlignment);
316fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar}
317fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
318070c1abbc9b78fd8eef9365c5e776a13b64b9631Eric Christopher// This should always be called with the thread local bss section.  Like the
319070c1abbc9b78fd8eef9365c5e776a13b64b9631Eric Christopher// .zerofill directive this doesn't actually switch sections on us.
320011c3f110bca748db66e437924f936a62f1969bfEric Christophervoid MCMachOStreamer::EmitTBSSSymbol(const MCSection *Section, MCSymbol *Symbol,
321011c3f110bca748db66e437924f936a62f1969bfEric Christopher                                     uint64_t Size, unsigned ByteAlignment) {
322011c3f110bca748db66e437924f936a62f1969bfEric Christopher  EmitZerofill(Section, Symbol, Size, ByteAlignment);
323011c3f110bca748db66e437924f936a62f1969bfEric Christopher  return;
324482eba054ab3543ee0e1f453d3d6441092f4b76dEric Christopher}
325482eba054ab3543ee0e1f453d3d6441092f4b76dEric Christopher
326aaec205b87637cd0d59d4f11630db603686eb73dChris Lattnervoid MCMachOStreamer::EmitBytes(StringRef Data, unsigned AddrSpace) {
3278067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer  // TODO: This is exactly the same as WinCOFFStreamer. Consider merging into
3288067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer  // MCObjectStreamer.
329f70f477024a23408d3a535920e6d4750478ac9aeDaniel Dunbar  getOrCreateDataFragment()->getContents().append(Data.begin(), Data.end());
330fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar}
331fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
332fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarvoid MCMachOStreamer::EmitValueToAlignment(unsigned ByteAlignment,
333fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar                                           int64_t Value, unsigned ValueSize,
334fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar                                           unsigned MaxBytesToEmit) {
3358067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer  // TODO: This is exactly the same as WinCOFFStreamer. Consider merging into
3368067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer  // MCObjectStreamer.
337d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar  if (MaxBytesToEmit == 0)
338d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar    MaxBytesToEmit = ByteAlignment;
339a86de1050889b61df2cd42cdc2acc5f9796b7f0cDaniel Dunbar  new MCAlignFragment(ByteAlignment, Value, ValueSize, MaxBytesToEmit,
340a86de1050889b61df2cd42cdc2acc5f9796b7f0cDaniel Dunbar                      getCurrentSectionData());
3416e72048add2a6464e038121c6c275da37528aa0aKevin Enderby
3426e72048add2a6464e038121c6c275da37528aa0aKevin Enderby  // Update the maximum alignment on the current section if necessary.
34383b467178a8295048f3ee7b44ff9c7ea244a96ccDaniel Dunbar  if (ByteAlignment > getCurrentSectionData()->getAlignment())
34483b467178a8295048f3ee7b44ff9c7ea244a96ccDaniel Dunbar    getCurrentSectionData()->setAlignment(ByteAlignment);
3456e72048add2a6464e038121c6c275da37528aa0aKevin Enderby}
3466e72048add2a6464e038121c6c275da37528aa0aKevin Enderby
3476e72048add2a6464e038121c6c275da37528aa0aKevin Enderbyvoid MCMachOStreamer::EmitCodeAlignment(unsigned ByteAlignment,
3486e72048add2a6464e038121c6c275da37528aa0aKevin Enderby                                        unsigned MaxBytesToEmit) {
3498067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer  // TODO: This is exactly the same as WinCOFFStreamer. Consider merging into
3508067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer  // MCObjectStreamer.
3516e72048add2a6464e038121c6c275da37528aa0aKevin Enderby  if (MaxBytesToEmit == 0)
3526e72048add2a6464e038121c6c275da37528aa0aKevin Enderby    MaxBytesToEmit = ByteAlignment;
3531c15413ebc8f4a35545a381a789a718627396d03Daniel Dunbar  MCAlignFragment *F = new MCAlignFragment(ByteAlignment, 0, 1, MaxBytesToEmit,
35483b467178a8295048f3ee7b44ff9c7ea244a96ccDaniel Dunbar                                           getCurrentSectionData());
3551c15413ebc8f4a35545a381a789a718627396d03Daniel Dunbar  F->setEmitNops(true);
3560705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar
357f3d2ef0c9712381a105118336975adcfbf733db0Daniel Dunbar  // Update the maximum alignment on the current section if necessary.
35883b467178a8295048f3ee7b44ff9c7ea244a96ccDaniel Dunbar  if (ByteAlignment > getCurrentSectionData()->getAlignment())
35983b467178a8295048f3ee7b44ff9c7ea244a96ccDaniel Dunbar    getCurrentSectionData()->setAlignment(ByteAlignment);
360fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar}
361fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar
3622ac0c453b2de1029f35d9ccb933c1ef303be00a2Daniel Dunbarvoid MCMachOStreamer::EmitInstToData(const MCInst &Inst) {
3632ac0c453b2de1029f35d9ccb933c1ef303be00a2Daniel Dunbar  MCDataFragment *DF = getOrCreateDataFragment();
3643f4dcd92daef80f87919507b6baf2a97d4bfaa2eDaniel Dunbar
36573c557458c0e28899f37c557bcaf36c2b6701260Daniel Dunbar  SmallVector<MCFixup, 4> Fixups;
3664fac74950a1ff08b995b366bfb84369c1507faefDaniel Dunbar  SmallString<256> Code;
3674fac74950a1ff08b995b366bfb84369c1507faefDaniel Dunbar  raw_svector_ostream VecOS(Code);
3688dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel Dunbar  getAssembler().getEmitter().EncodeInstruction(Inst, VecOS, Fixups);
369f6346769b344f9b134f0661e8bd2b4245f6490eaDaniel Dunbar  VecOS.flush();
370f6346769b344f9b134f0661e8bd2b4245f6490eaDaniel Dunbar
3712ac0c453b2de1029f35d9ccb933c1ef303be00a2Daniel Dunbar  // Add the fixups and data.
3722ac0c453b2de1029f35d9ccb933c1ef303be00a2Daniel Dunbar  for (unsigned i = 0, e = Fixups.size(); i != e; ++i) {
3732ac0c453b2de1029f35d9ccb933c1ef303be00a2Daniel Dunbar    Fixups[i].setOffset(Fixups[i].getOffset() + DF->getContents().size());
3742ac0c453b2de1029f35d9ccb933c1ef303be00a2Daniel Dunbar    DF->addFixup(Fixups[i]);
3752ac0c453b2de1029f35d9ccb933c1ef303be00a2Daniel Dunbar  }
3762ac0c453b2de1029f35d9ccb933c1ef303be00a2Daniel Dunbar  DF->getContents().append(Code.begin(), Code.end());
3772ac0c453b2de1029f35d9ccb933c1ef303be00a2Daniel Dunbar}
3782ac0c453b2de1029f35d9ccb933c1ef303be00a2Daniel Dunbar
379c095793b4ab027181605c79c9808df12afe45d63Kevin Enderbyvoid MCMachOStreamer::Finish() {
380a86de1050889b61df2cd42cdc2acc5f9796b7f0cDaniel Dunbar  // We have to set the fragment atom associations so we can relax properly for
381a86de1050889b61df2cd42cdc2acc5f9796b7f0cDaniel Dunbar  // Mach-O.
382a86de1050889b61df2cd42cdc2acc5f9796b7f0cDaniel Dunbar
383a86de1050889b61df2cd42cdc2acc5f9796b7f0cDaniel Dunbar  // First, scan the symbol table to build a lookup table from fragments to
384a86de1050889b61df2cd42cdc2acc5f9796b7f0cDaniel Dunbar  // defining symbols.
385a86de1050889b61df2cd42cdc2acc5f9796b7f0cDaniel Dunbar  DenseMap<const MCFragment*, MCSymbolData*> DefiningSymbolMap;
386a86de1050889b61df2cd42cdc2acc5f9796b7f0cDaniel Dunbar  for (MCAssembler::symbol_iterator it = getAssembler().symbol_begin(),
387a86de1050889b61df2cd42cdc2acc5f9796b7f0cDaniel Dunbar         ie = getAssembler().symbol_end(); it != ie; ++it) {
388a86de1050889b61df2cd42cdc2acc5f9796b7f0cDaniel Dunbar    if (getAssembler().isSymbolLinkerVisible(it->getSymbol()) &&
389a86de1050889b61df2cd42cdc2acc5f9796b7f0cDaniel Dunbar        it->getFragment()) {
390a86de1050889b61df2cd42cdc2acc5f9796b7f0cDaniel Dunbar      // An atom defining symbol should never be internal to a fragment.
391a86de1050889b61df2cd42cdc2acc5f9796b7f0cDaniel Dunbar      assert(it->getOffset() == 0 && "Invalid offset in atom defining symbol!");
392a86de1050889b61df2cd42cdc2acc5f9796b7f0cDaniel Dunbar      DefiningSymbolMap[it->getFragment()] = it;
393a86de1050889b61df2cd42cdc2acc5f9796b7f0cDaniel Dunbar    }
394a86de1050889b61df2cd42cdc2acc5f9796b7f0cDaniel Dunbar  }
395a86de1050889b61df2cd42cdc2acc5f9796b7f0cDaniel Dunbar
396a86de1050889b61df2cd42cdc2acc5f9796b7f0cDaniel Dunbar  // Set the fragment atom associations by tracking the last seen atom defining
397a86de1050889b61df2cd42cdc2acc5f9796b7f0cDaniel Dunbar  // symbol.
398a86de1050889b61df2cd42cdc2acc5f9796b7f0cDaniel Dunbar  for (MCAssembler::iterator it = getAssembler().begin(),
399a86de1050889b61df2cd42cdc2acc5f9796b7f0cDaniel Dunbar         ie = getAssembler().end(); it != ie; ++it) {
400a86de1050889b61df2cd42cdc2acc5f9796b7f0cDaniel Dunbar    MCSymbolData *CurrentAtom = 0;
401a86de1050889b61df2cd42cdc2acc5f9796b7f0cDaniel Dunbar    for (MCSectionData::iterator it2 = it->begin(),
402a86de1050889b61df2cd42cdc2acc5f9796b7f0cDaniel Dunbar           ie2 = it->end(); it2 != ie2; ++it2) {
403a86de1050889b61df2cd42cdc2acc5f9796b7f0cDaniel Dunbar      if (MCSymbolData *SD = DefiningSymbolMap.lookup(it2))
404a86de1050889b61df2cd42cdc2acc5f9796b7f0cDaniel Dunbar        CurrentAtom = SD;
405a86de1050889b61df2cd42cdc2acc5f9796b7f0cDaniel Dunbar      it2->setAtom(CurrentAtom);
406a86de1050889b61df2cd42cdc2acc5f9796b7f0cDaniel Dunbar    }
407a86de1050889b61df2cd42cdc2acc5f9796b7f0cDaniel Dunbar  }
408a86de1050889b61df2cd42cdc2acc5f9796b7f0cDaniel Dunbar
409a86de1050889b61df2cd42cdc2acc5f9796b7f0cDaniel Dunbar  this->MCObjectStreamer::Finish();
410a86de1050889b61df2cd42cdc2acc5f9796b7f0cDaniel Dunbar}
411a86de1050889b61df2cd42cdc2acc5f9796b7f0cDaniel Dunbar
4121f3e445184e5ca2aa4295c2a77f2a4e0b957fea1Daniel DunbarMCStreamer *llvm::createMachOStreamer(MCContext &Context, TargetAsmBackend &TAB,
413ac2884a717daf3ad2aa8425320795d661e8a980bDaniel Dunbar                                      raw_ostream &OS, MCCodeEmitter *CE,
414ac2884a717daf3ad2aa8425320795d661e8a980bDaniel Dunbar                                      bool RelaxAll) {
415ac2884a717daf3ad2aa8425320795d661e8a980bDaniel Dunbar  MCMachOStreamer *S = new MCMachOStreamer(Context, TAB, OS, CE);
416ac2884a717daf3ad2aa8425320795d661e8a980bDaniel Dunbar  if (RelaxAll)
417ac2884a717daf3ad2aa8425320795d661e8a980bDaniel Dunbar    S->getAssembler().setRelaxAll(true);
418ac2884a717daf3ad2aa8425320795d661e8a980bDaniel Dunbar  return S;
419fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar}
420