1462bba39c232350894c254d42fbe55f9ff78df56Nick Lewycky//===- lib/MC/MCELFStreamer.cpp - ELF Object Output -----------------------===//
23565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming//
33565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming//                     The LLVM Compiler Infrastructure
43565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming//
53565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming// This file is distributed under the University of Illinois Open Source
63565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming// License. See LICENSE.TXT for details.
73565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming//
83565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming//===----------------------------------------------------------------------===//
93565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming//
103565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming// This file assembles .s files and emits ELF .o object files.
113565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming//
123565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming//===----------------------------------------------------------------------===//
133565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
14645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien#include "llvm/MC/MCELFStreamer.h"
1501a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne#include "llvm/ADT/STLExtras.h"
1636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/ADT/SmallPtrSet.h"
1706866a72b0117e15463b0706d994270b3e20948dBill Wendling#include "llvm/MC/MCAsmBackend.h"
1836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/MC/MCAssembler.h"
193565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming#include "llvm/MC/MCCodeEmitter.h"
20f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola#include "llvm/MC/MCContext.h"
216eb3e87df04f8b035562d9865292c23f5b79f1a2Tim Northover#include "llvm/MC/MCELF.h"
223565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming#include "llvm/MC/MCELFSymbolFlags.h"
233565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming#include "llvm/MC/MCExpr.h"
243565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming#include "llvm/MC/MCInst.h"
2536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/MC/MCObjectFileInfo.h"
26f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola#include "llvm/MC/MCObjectStreamer.h"
273565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming#include "llvm/MC/MCSection.h"
28d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/MC/MCSectionELF.h"
293565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming#include "llvm/MC/MCSymbol.h"
30484291c27319668ad99cb87def000254357736fbRafael Espindola#include "llvm/MC/MCValue.h"
313565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming#include "llvm/Support/Debug.h"
323565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming#include "llvm/Support/ELF.h"
333565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming#include "llvm/Support/ErrorHandling.h"
343565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming#include "llvm/Support/raw_ostream.h"
353565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
363565a06ebf44a193a8b333cbeff2ee154298d450Matt Flemingusing namespace llvm;
373565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
38645016533d1208d2e7a17d917d64b8b63c4f9939Logan ChienMCELFStreamer::~MCELFStreamer() {
39f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola}
40f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola
41d80781b98b771d370730ab7c630018f23e202b57Rafael Espindolavoid MCELFStreamer::InitSections() {
42d80781b98b771d370730ab7c630018f23e202b57Rafael Espindola  // This emulates the same behavior of GNU as. This makes it easier
43d80781b98b771d370730ab7c630018f23e202b57Rafael Espindola  // to compare the output as the major sections are in the same order.
4436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  SwitchSection(getContext().getObjectFileInfo()->getTextSection());
4536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EmitCodeAlignment(4);
4636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
4736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  SwitchSection(getContext().getObjectFileInfo()->getDataSection());
4836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EmitCodeAlignment(4);
4936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
5036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  SwitchSection(getContext().getObjectFileInfo()->getBSSSection());
5136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EmitCodeAlignment(4);
5236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
5336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  SwitchSection(getContext().getObjectFileInfo()->getTextSection());
54d80781b98b771d370730ab7c630018f23e202b57Rafael Espindola}
55d80781b98b771d370730ab7c630018f23e202b57Rafael Espindola
563565a06ebf44a193a8b333cbeff2ee154298d450Matt Flemingvoid MCELFStreamer::EmitLabel(MCSymbol *Symbol) {
57ba210243ef7d325ef6954d459091edf580a241f9Rafael Espindola  assert(Symbol->isUndefined() && "Cannot define a symbol twice!");
58ba210243ef7d325ef6954d459091edf580a241f9Rafael Espindola
59ea4afa91eb453323948588ad1e1706d842fb9007Rafael Espindola  MCObjectStreamer::EmitLabel(Symbol);
6073ffea47d20bc9f559b4ce0c60166ee504073832Rafael Espindola
61e1a2587ee273943390608df096378116ce52ffbaRafael Espindola  const MCSectionELF &Section =
62e1a2587ee273943390608df096378116ce52ffbaRafael Espindola    static_cast<const MCSectionELF&>(Symbol->getSection());
63ea4afa91eb453323948588ad1e1706d842fb9007Rafael Espindola  MCSymbolData &SD = getAssembler().getSymbolData(*Symbol);
641c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola  if (Section.getFlags() & ELF::SHF_TLS)
652ddfd95d40e07f5fdf179a16e15a5d7c131837d8Jan Sjödin    MCELF::SetType(SD, ELF::STT_TLS);
663565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming}
673565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
683565a06ebf44a193a8b333cbeff2ee154298d450Matt Flemingvoid MCELFStreamer::EmitAssemblerFlag(MCAssemblerFlag Flag) {
6906866a72b0117e15463b0706d994270b3e20948dBill Wendling  // Let the target do whatever target specific stuff it needs to do.
7006866a72b0117e15463b0706d994270b3e20948dBill Wendling  getAssembler().getBackend().handleAssemblerFlag(Flag);
7106866a72b0117e15463b0706d994270b3e20948dBill Wendling  // Do any generic stuff we need to do.
723565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  switch (Flag) {
73ce79299f78bb04e76e1860ab119b85d69f3a19c7Jim Grosbach  case MCAF_SyntaxUnified: return; // no-op here.
74bd27f5adbd8f3b8ab8def5aa43fbc406ac9b8cbeEvan Cheng  case MCAF_Code16: return; // Change parsing mode; no-op here.
75bd27f5adbd8f3b8ab8def5aa43fbc406ac9b8cbeEvan Cheng  case MCAF_Code32: return; // Change parsing mode; no-op here.
76bd27f5adbd8f3b8ab8def5aa43fbc406ac9b8cbeEvan Cheng  case MCAF_Code64: return; // Change parsing mode; no-op here.
773565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  case MCAF_SubsectionsViaSymbols:
783565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming    getAssembler().setSubsectionsViaSymbols(true);
793565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming    return;
803565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  }
813565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
82858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper  llvm_unreachable("invalid assembler flag!");
833565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming}
843565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
85df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbournevoid MCELFStreamer::ChangeSection(const MCSection *Section,
86df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne                                  const MCExpr *Subsection) {
874766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  MCSectionData *CurSection = getCurrentSectionData();
884766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  if (CurSection && CurSection->isBundleLocked())
894766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky    report_fatal_error("Unterminated .bundle_lock when changing a section");
901f4f9e3d35a2264d86f97dfb6d1e4ccb434f449bRafael Espindola  const MCSymbol *Grp = static_cast<const MCSectionELF *>(Section)->getGroup();
911f4f9e3d35a2264d86f97dfb6d1e4ccb434f449bRafael Espindola  if (Grp)
921f4f9e3d35a2264d86f97dfb6d1e4ccb434f449bRafael Espindola    getAssembler().getOrCreateSymbolData(*Grp);
93df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne  this->MCObjectStreamer::ChangeSection(Section, Subsection);
941f4f9e3d35a2264d86f97dfb6d1e4ccb434f449bRafael Espindola}
951f4f9e3d35a2264d86f97dfb6d1e4ccb434f449bRafael Espindola
96484291c27319668ad99cb87def000254357736fbRafael Espindolavoid MCELFStreamer::EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) {
97484291c27319668ad99cb87def000254357736fbRafael Espindola  getAssembler().getOrCreateSymbolData(*Symbol);
9836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  const MCExpr *Value = MCSymbolRefExpr::Create(
9936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      Symbol, MCSymbolRefExpr::VK_WEAKREF, getContext());
100484291c27319668ad99cb87def000254357736fbRafael Espindola  Alias->setVariableValue(Value);
101484291c27319668ad99cb87def000254357736fbRafael Espindola}
102484291c27319668ad99cb87def000254357736fbRafael Espindola
10301a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne// When GNU as encounters more than one .type declaration for an object it seems
10401a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne// to use a mechanism similar to the one below to decide which type is actually
10501a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne// used in the object file.  The greater of T1 and T2 is selected based on the
10601a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne// following ordering:
10701a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne//  STT_NOTYPE < STT_OBJECT < STT_FUNC < STT_GNU_IFUNC < STT_TLS < anything else
10801a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne// If neither T1 < T2 nor T2 < T1 according to this ordering, use T2 (the user
10901a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne// provided type).
11001a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbournestatic unsigned CombineSymbolTypes(unsigned T1, unsigned T2) {
11101a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne  unsigned TypeOrdering[] = {ELF::STT_NOTYPE, ELF::STT_OBJECT, ELF::STT_FUNC,
11201a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne                             ELF::STT_GNU_IFUNC, ELF::STT_TLS};
11301a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne  for (unsigned i = 0; i != array_lengthof(TypeOrdering); ++i) {
11401a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne    if (T1 == TypeOrdering[i])
11501a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne      return T2;
11601a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne    if (T2 == TypeOrdering[i])
11701a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne      return T1;
11801a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne  }
11901a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne
12001a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne  return T2;
12101a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne}
12201a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne
1231c9cd021c8999d9c2c0786dff074d1e75bbd0eb2Saleem Abdulrasoolbool MCELFStreamer::EmitSymbolAttribute(MCSymbol *Symbol,
1241c9cd021c8999d9c2c0786dff074d1e75bbd0eb2Saleem Abdulrasool                                        MCSymbolAttr Attribute) {
1253565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  // Indirect symbols are handled differently, to match how 'as' handles
1263565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  // them. This makes writing matching .o files easier.
1273565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  if (Attribute == MCSA_IndirectSymbol) {
1283565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming    // Note that we intentionally cannot use the symbol data here; this is
1293565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming    // important for matching the string table that 'as' generates.
1303565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming    IndirectSymbolData ISD;
1313565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming    ISD.Symbol = Symbol;
1323565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming    ISD.SectionData = getCurrentSectionData();
1333565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming    getAssembler().getIndirectSymbols().push_back(ISD);
1341c9cd021c8999d9c2c0786dff074d1e75bbd0eb2Saleem Abdulrasool    return true;
1353565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  }
1363565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
1373565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  // Adding a symbol attribute always introduces the symbol, note that an
1383565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  // important side effect of calling getOrCreateSymbolData here is to register
1393565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  // the symbol with the assembler.
1403565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  MCSymbolData &SD = getAssembler().getOrCreateSymbolData(*Symbol);
1413565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
1423565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  // The implementation of symbol attributes is designed to match 'as', but it
1433565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  // leaves much to desired. It doesn't really make sense to arbitrarily add and
1443565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  // remove flags, but 'as' allows this (in particular, see .desc).
1453565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  //
1463565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  // In the future it might be worth trying to make these operations more well
1473565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  // defined.
1483565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  switch (Attribute) {
1493565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  case MCSA_LazyReference:
1503565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  case MCSA_Reference:
151e8e98d7f2eaa0613442ce21ab6a040c0f04f5b4dKevin Enderby  case MCSA_SymbolResolver:
1523565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  case MCSA_PrivateExtern:
1533565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  case MCSA_WeakDefinition:
154f8020a3978b9a56074a3a5f9821c63165e37bff7Eli Friedman  case MCSA_WeakDefAutoPrivate:
1553565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  case MCSA_Invalid:
1563565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  case MCSA_IndirectSymbol:
1571c9cd021c8999d9c2c0786dff074d1e75bbd0eb2Saleem Abdulrasool    return false;
1583565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
1593f90a4c42d1683600e91c2aea325bacf59c37f5eJim Grosbach  case MCSA_NoDeadStrip:
1607e528a1724d8f38dd817396938aaf768887c8b30Rafael Espindola  case MCSA_ELF_TypeGnuUniqueObject:
1617e528a1724d8f38dd817396938aaf768887c8b30Rafael Espindola    // Ignore for now.
1627e528a1724d8f38dd817396938aaf768887c8b30Rafael Espindola    break;
1637e528a1724d8f38dd817396938aaf768887c8b30Rafael Espindola
1643565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  case MCSA_Global:
1652ddfd95d40e07f5fdf179a16e15a5d7c131837d8Jan Sjödin    MCELF::SetBinding(SD, ELF::STB_GLOBAL);
1663565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming    SD.setExternal(true);
167f7c10a3cff61c70efe8e405d9bdc5386e8e3fc0aRafael Espindola    BindingExplicitlySet.insert(Symbol);
1683565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming    break;
1693565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
170230c27472458d5f1f52f96347b655d1b5c531f33Benjamin Kramer  case MCSA_WeakReference:
1713565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  case MCSA_Weak:
1722ddfd95d40e07f5fdf179a16e15a5d7c131837d8Jan Sjödin    MCELF::SetBinding(SD, ELF::STB_WEAK);
1733223f19ff0920ffee686faba3bf74babf580e8a5Rafael Espindola    SD.setExternal(true);
174f7c10a3cff61c70efe8e405d9bdc5386e8e3fc0aRafael Espindola    BindingExplicitlySet.insert(Symbol);
1753565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming    break;
1763565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
1773565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  case MCSA_Local:
1782ddfd95d40e07f5fdf179a16e15a5d7c131837d8Jan Sjödin    MCELF::SetBinding(SD, ELF::STB_LOCAL);
179f7c10a3cff61c70efe8e405d9bdc5386e8e3fc0aRafael Espindola    SD.setExternal(false);
180f7c10a3cff61c70efe8e405d9bdc5386e8e3fc0aRafael Espindola    BindingExplicitlySet.insert(Symbol);
1813565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming    break;
1823565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
1833565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  case MCSA_ELF_TypeFunction:
18401a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne    MCELF::SetType(SD, CombineSymbolTypes(MCELF::GetType(SD),
18501a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne                                          ELF::STT_FUNC));
1863565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming    break;
1873565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
188a0c17a495b12debcb7f206993bbc6020e2e6e8dfRoman Divacky  case MCSA_ELF_TypeIndFunction:
18901a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne    MCELF::SetType(SD, CombineSymbolTypes(MCELF::GetType(SD),
19001a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne                                          ELF::STT_GNU_IFUNC));
191a0c17a495b12debcb7f206993bbc6020e2e6e8dfRoman Divacky    break;
192a0c17a495b12debcb7f206993bbc6020e2e6e8dfRoman Divacky
1933565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  case MCSA_ELF_TypeObject:
19401a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne    MCELF::SetType(SD, CombineSymbolTypes(MCELF::GetType(SD),
19501a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne                                          ELF::STT_OBJECT));
1963565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming    break;
1973565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
1983565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  case MCSA_ELF_TypeTLS:
19901a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne    MCELF::SetType(SD, CombineSymbolTypes(MCELF::GetType(SD),
20001a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne                                          ELF::STT_TLS));
2013565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming    break;
2023565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
2033565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  case MCSA_ELF_TypeCommon:
20401a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne    // TODO: Emit these as a common symbol.
20501a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne    MCELF::SetType(SD, CombineSymbolTypes(MCELF::GetType(SD),
20601a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne                                          ELF::STT_OBJECT));
2073565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming    break;
2083565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
2093565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  case MCSA_ELF_TypeNoType:
21001a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne    MCELF::SetType(SD, CombineSymbolTypes(MCELF::GetType(SD),
21101a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne                                          ELF::STT_NOTYPE));
2123565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming    break;
2133565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
2143565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  case MCSA_Protected:
2152ddfd95d40e07f5fdf179a16e15a5d7c131837d8Jan Sjödin    MCELF::SetVisibility(SD, ELF::STV_PROTECTED);
2163565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming    break;
2173565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
2183565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  case MCSA_Hidden:
2192ddfd95d40e07f5fdf179a16e15a5d7c131837d8Jan Sjödin    MCELF::SetVisibility(SD, ELF::STV_HIDDEN);
2203565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming    break;
2213565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
2223565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  case MCSA_Internal:
2232ddfd95d40e07f5fdf179a16e15a5d7c131837d8Jan Sjödin    MCELF::SetVisibility(SD, ELF::STV_INTERNAL);
2243565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming    break;
2253565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  }
2261c9cd021c8999d9c2c0786dff074d1e75bbd0eb2Saleem Abdulrasool
2271c9cd021c8999d9c2c0786dff074d1e75bbd0eb2Saleem Abdulrasool  return true;
2283565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming}
2293565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
2303565a06ebf44a193a8b333cbeff2ee154298d450Matt Flemingvoid MCELFStreamer::EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size,
2313565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming                                       unsigned ByteAlignment) {
2323565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  MCSymbolData &SD = getAssembler().getOrCreateSymbolData(*Symbol);
2333565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
234f7c10a3cff61c70efe8e405d9bdc5386e8e3fc0aRafael Espindola  if (!BindingExplicitlySet.count(Symbol)) {
2352ddfd95d40e07f5fdf179a16e15a5d7c131837d8Jan Sjödin    MCELF::SetBinding(SD, ELF::STB_GLOBAL);
236f7c10a3cff61c70efe8e405d9bdc5386e8e3fc0aRafael Espindola    SD.setExternal(true);
237f7c10a3cff61c70efe8e405d9bdc5386e8e3fc0aRafael Espindola  }
238f7c10a3cff61c70efe8e405d9bdc5386e8e3fc0aRafael Espindola
2392ddfd95d40e07f5fdf179a16e15a5d7c131837d8Jan Sjödin  MCELF::SetType(SD, ELF::STT_OBJECT);
24055d02f3a138badd5b1f96240b4d4b416d9026e2cRafael Espindola
2412ddfd95d40e07f5fdf179a16e15a5d7c131837d8Jan Sjödin  if (MCELF::GetBinding(SD) == ELF_STB_Local) {
2423565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming    const MCSection *Section = getAssembler().getContext().getELFSection(".bss",
243946227d64afcc8cb3f4db94b6ee0cdb1aa55fa31Jim Grosbach                                                         ELF::SHT_NOBITS,
244946227d64afcc8cb3f4db94b6ee0cdb1aa55fa31Jim Grosbach                                                         ELF::SHF_WRITE |
245946227d64afcc8cb3f4db94b6ee0cdb1aa55fa31Jim Grosbach                                                         ELF::SHF_ALLOC,
246946227d64afcc8cb3f4db94b6ee0cdb1aa55fa31Jim Grosbach                                                         SectionKind::getBSS());
2475cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton
2485cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton    AssignSection(Symbol, Section);
2491963572f9de87cd1ac5f16e504e27c3c26267e6fRafael Espindola
2509e3922e94975b7b3d98da42f0d20a524f3deed53Rafael Espindola    struct LocalCommon L = {&SD, Size, ByteAlignment};
2519e3922e94975b7b3d98da42f0d20a524f3deed53Rafael Espindola    LocalCommons.push_back(L);
252f7c10a3cff61c70efe8e405d9bdc5386e8e3fc0aRafael Espindola  } else {
253f7c10a3cff61c70efe8e405d9bdc5386e8e3fc0aRafael Espindola    SD.setCommon(Size, ByteAlignment);
2543565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  }
2553565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
256f7c10a3cff61c70efe8e405d9bdc5386e8e3fc0aRafael Espindola  SD.setSize(MCConstantExpr::Create(Size, getContext()));
2573565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming}
2583565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
259645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chienvoid MCELFStreamer::EmitELFSize(MCSymbol *Symbol, const MCExpr *Value) {
260645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien  MCSymbolData &SD = getAssembler().getOrCreateSymbolData(*Symbol);
261645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien  SD.setSize(Value);
262645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien}
263645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien
26436a16015ac108e2f0dd2d6d96a6d364bc74c50d7Benjamin Kramervoid MCELFStreamer::EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size,
26536a16015ac108e2f0dd2d6d96a6d364bc74c50d7Benjamin Kramer                                          unsigned ByteAlignment) {
266f13743bb3c3fb37a59b59f26056bc391bf0adcdcJason W Kim  // FIXME: Should this be caught and done earlier?
267f13743bb3c3fb37a59b59f26056bc391bf0adcdcJason W Kim  MCSymbolData &SD = getAssembler().getOrCreateSymbolData(*Symbol);
2682ddfd95d40e07f5fdf179a16e15a5d7c131837d8Jan Sjödin  MCELF::SetBinding(SD, ELF::STB_LOCAL);
269f13743bb3c3fb37a59b59f26056bc391bf0adcdcJason W Kim  SD.setExternal(false);
270f13743bb3c3fb37a59b59f26056bc391bf0adcdcJason W Kim  BindingExplicitlySet.insert(Symbol);
27136a16015ac108e2f0dd2d6d96a6d364bc74c50d7Benjamin Kramer  EmitCommonSymbol(Symbol, Size, ByteAlignment);
272f13743bb3c3fb37a59b59f26056bc391bf0adcdcJason W Kim}
273f13743bb3c3fb37a59b59f26056bc391bf0adcdcJason W Kim
274dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid MCELFStreamer::EmitValueImpl(const MCExpr *Value, unsigned Size,
275dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                  const SMLoc &Loc) {
2764766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  if (getCurrentSectionData()->isBundleLocked())
2774766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky    report_fatal_error("Emitting values inside a locked bundle is forbidden");
2785f7692604d44192206fbaf390085a95c9fb1a40bDavid Meyer  fixSymbolsInTLSFixups(Value);
279dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  MCObjectStreamer::EmitValueImpl(Value, Size, Loc);
2805f7692604d44192206fbaf390085a95c9fb1a40bDavid Meyer}
2815f7692604d44192206fbaf390085a95c9fb1a40bDavid Meyer
2824766ef41b31e4f97bce1179c3b0398303bf65356Eli Benderskyvoid MCELFStreamer::EmitValueToAlignment(unsigned ByteAlignment,
2834766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky                                         int64_t Value,
2844766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky                                         unsigned ValueSize,
2854766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky                                         unsigned MaxBytesToEmit) {
2864766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  if (getCurrentSectionData()->isBundleLocked())
2874766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky    report_fatal_error("Emitting values inside a locked bundle is forbidden");
2884766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  MCObjectStreamer::EmitValueToAlignment(ByteAlignment, Value,
2894766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky                                         ValueSize, MaxBytesToEmit);
2904766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky}
2914766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky
29272580780a98cb8b0019b7ec4ed88e3f3328b9969Joerg Sonnenberger// Add a symbol for the file name of this module. They start after the
29372580780a98cb8b0019b7ec4ed88e3f3328b9969Joerg Sonnenberger// null symbol and don't count as normal symbol, i.e. a non-STT_FILE symbol
29472580780a98cb8b0019b7ec4ed88e3f3328b9969Joerg Sonnenberger// with the same name may appear.
2953565a06ebf44a193a8b333cbeff2ee154298d450Matt Flemingvoid MCELFStreamer::EmitFileDirective(StringRef Filename) {
29672580780a98cb8b0019b7ec4ed88e3f3328b9969Joerg Sonnenberger  getAssembler().addFileName(Filename);
2973565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming}
2983565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
299c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindolavoid MCELFStreamer::EmitIdent(StringRef IdentString) {
300c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola  const MCSection *Comment = getAssembler().getContext().getELFSection(
301c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola      ".comment", ELF::SHT_PROGBITS, ELF::SHF_MERGE | ELF::SHF_STRINGS,
302c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola      SectionKind::getReadOnly(), 1, "");
303c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola  PushSection();
304c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola  SwitchSection(Comment);
305c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola  if (!SeenIdent) {
306c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola    EmitIntValue(0, 1);
307c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola    SeenIdent = true;
308c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola  }
309c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola  EmitBytes(IdentString);
310c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola  EmitIntValue(0, 1);
311c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola  PopSection();
312c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola}
313c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola
314c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindolavoid MCELFStreamer::fixSymbolsInTLSFixups(const MCExpr *expr) {
31597551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola  switch (expr->getKind()) {
31672062f5744557e270a38192554c3126ea5f97434Tim Northover  case MCExpr::Target:
31772062f5744557e270a38192554c3126ea5f97434Tim Northover    cast<MCTargetExpr>(expr)->fixELFSymbolsInTLSFixups(getAssembler());
31872062f5744557e270a38192554c3126ea5f97434Tim Northover    break;
31997551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola  case MCExpr::Constant:
32097551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola    break;
32197551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola
32297551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola  case MCExpr::Binary: {
32397551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola    const MCBinaryExpr *be = cast<MCBinaryExpr>(expr);
32497551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola    fixSymbolsInTLSFixups(be->getLHS());
32597551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola    fixSymbolsInTLSFixups(be->getRHS());
32697551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola    break;
32797551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola  }
32897551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola
32997551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola  case MCExpr::SymbolRef: {
33097551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola    const MCSymbolRefExpr &symRef = *cast<MCSymbolRefExpr>(expr);
331bf8209daf875fa533a379290a91d01be5152597dRafael Espindola    switch (symRef.getKind()) {
332bf8209daf875fa533a379290a91d01be5152597dRafael Espindola    default:
33397551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola      return;
334d02c8b6cc1d07bfe37fc055eefdac21b1c9303cbJoerg Sonnenberger    case MCSymbolRefExpr::VK_GOTTPOFF:
335d02c8b6cc1d07bfe37fc055eefdac21b1c9303cbJoerg Sonnenberger    case MCSymbolRefExpr::VK_INDNTPOFF:
336bf8209daf875fa533a379290a91d01be5152597dRafael Espindola    case MCSymbolRefExpr::VK_NTPOFF:
337bf8209daf875fa533a379290a91d01be5152597dRafael Espindola    case MCSymbolRefExpr::VK_GOTNTPOFF:
338bf8209daf875fa533a379290a91d01be5152597dRafael Espindola    case MCSymbolRefExpr::VK_TLSGD:
339d02c8b6cc1d07bfe37fc055eefdac21b1c9303cbJoerg Sonnenberger    case MCSymbolRefExpr::VK_TLSLD:
340bf8209daf875fa533a379290a91d01be5152597dRafael Espindola    case MCSymbolRefExpr::VK_TLSLDM:
341bf8209daf875fa533a379290a91d01be5152597dRafael Espindola    case MCSymbolRefExpr::VK_TPOFF:
342bf8209daf875fa533a379290a91d01be5152597dRafael Espindola    case MCSymbolRefExpr::VK_DTPOFF:
3433507d24547ce668c9a50c72b6748c0a303e295c1Bruno Cardoso Lopes    case MCSymbolRefExpr::VK_Mips_TLSGD:
3443507d24547ce668c9a50c72b6748c0a303e295c1Bruno Cardoso Lopes    case MCSymbolRefExpr::VK_Mips_GOTTPREL:
3453507d24547ce668c9a50c72b6748c0a303e295c1Bruno Cardoso Lopes    case MCSymbolRefExpr::VK_Mips_TPREL_HI:
3463507d24547ce668c9a50c72b6748c0a303e295c1Bruno Cardoso Lopes    case MCSymbolRefExpr::VK_Mips_TPREL_LO:
347228e0afcfd0d5f167a95c6ddbec2c6a4a90b6d2bUlrich Weigand    case MCSymbolRefExpr::VK_PPC_DTPMOD:
348cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_TPREL:
34992cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_TPREL_LO:
350cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_TPREL_HI:
35192cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_TPREL_HA:
352cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_TPREL_HIGHER:
353cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_TPREL_HIGHERA:
354cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_TPREL_HIGHEST:
355cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_TPREL_HIGHESTA:
356cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_DTPREL:
35792cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_DTPREL_LO:
358cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_DTPREL_HI:
35992cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_DTPREL_HA:
360cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHER:
361cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHERA:
362cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHEST:
363cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHESTA:
364cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_GOT_TPREL:
36592cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_GOT_TPREL_LO:
366cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_GOT_TPREL_HI:
36792cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_GOT_TPREL_HA:
368cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_GOT_DTPREL:
369cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_GOT_DTPREL_LO:
370cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_GOT_DTPREL_HI:
371cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_GOT_DTPREL_HA:
3723a42989d3ddfe30c6b87fe1f3d7f1164e0868a40Bill Schmidt    case MCSymbolRefExpr::VK_PPC_TLS:
373cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_GOT_TLSGD:
37492cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_GOT_TLSGD_LO:
375cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_GOT_TLSGD_HI:
37692cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_GOT_TLSGD_HA:
3777a34599db017a5486cf7cd11eb124984acec8286Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_TLSGD:
378cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_GOT_TLSLD:
37992cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_GOT_TLSLD_LO:
380cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_GOT_TLSLD_HI:
38192cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_GOT_TLSLD_HA:
3827a34599db017a5486cf7cd11eb124984acec8286Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_TLSLD:
383bf8209daf875fa533a379290a91d01be5152597dRafael Espindola      break;
384bf8209daf875fa533a379290a91d01be5152597dRafael Espindola    }
38597551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola    MCSymbolData &SD = getAssembler().getOrCreateSymbolData(symRef.getSymbol());
3862ddfd95d40e07f5fdf179a16e15a5d7c131837d8Jan Sjödin    MCELF::SetType(SD, ELF::STT_TLS);
38797551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola    break;
38897551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola  }
38997551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola
39097551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola  case MCExpr::Unary:
39197551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola    fixSymbolsInTLSFixups(cast<MCUnaryExpr>(expr)->getSubExpr());
39297551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola    break;
39397551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola  }
39497551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola}
39597551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola
39636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid MCELFStreamer::EmitInstToFragment(const MCInst &Inst,
39736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                       const MCSubtargetInfo &STI) {
39836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  this->MCObjectStreamer::EmitInstToFragment(Inst, STI);
399251040bc18eedfa56d01fe92836e55cfd8c5d990Eli Bendersky  MCRelaxableFragment &F = *cast<MCRelaxableFragment>(getCurrentFragment());
4003565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
401dedb045c3296c831962c4ae101531c38c273ba89Rafael Espindola  for (unsigned i = 0, e = F.getFixups().size(); i != e; ++i)
402dedb045c3296c831962c4ae101531c38c273ba89Rafael Espindola    fixSymbolsInTLSFixups(F.getFixups()[i].getValue());
40393ded7371f5f821c342bdf83b40f4ef607467a3fBenjamin Kramer}
40493ded7371f5f821c342bdf83b40f4ef607467a3fBenjamin Kramer
40536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid MCELFStreamer::EmitInstToData(const MCInst &Inst,
40636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                   const MCSubtargetInfo &STI) {
4074766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  MCAssembler &Assembler = getAssembler();
4083565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  SmallVector<MCFixup, 4> Fixups;
4093565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  SmallString<256> Code;
4103565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  raw_svector_ostream VecOS(Code);
41136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  Assembler.getEmitter().EncodeInstruction(Inst, VecOS, Fixups, STI);
4123565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  VecOS.flush();
4133565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
41497551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola  for (unsigned i = 0, e = Fixups.size(); i != e; ++i)
41597551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola    fixSymbolsInTLSFixups(Fixups[i].getValue());
41697551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola
4174766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  // There are several possibilities here:
4184766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  //
4194766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  // If bundling is disabled, append the encoded instruction to the current data
4204766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  // fragment (or create a new such fragment if the current fragment is not a
4214766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  // data fragment).
4224766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  //
4234766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  // If bundling is enabled:
4249ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky  // - If we're not in a bundle-locked group, emit the instruction into a
4259ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky  //   fragment of its own. If there are no fixups registered for the
4269ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky  //   instruction, emit a MCCompactEncodedInstFragment. Otherwise, emit a
4279ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky  //   MCDataFragment.
4284766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  // - If we're in a bundle-locked group, append the instruction to the current
4294766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  //   data fragment because we want all the instructions in a group to get into
4304766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  //   the same fragment. Be careful not to do that for the first instruction in
4314766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  //   the group, though.
4324766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  MCDataFragment *DF;
4334766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky
4344766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  if (Assembler.isBundlingEnabled()) {
4354766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky    MCSectionData *SD = getCurrentSectionData();
4364766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky    if (SD->isBundleLocked() && !SD->isBundleGroupBeforeFirstInst())
43767144e37ba5cd35ee917daac631e03963b05a674Derek Schuff      // If we are bundle-locked, we re-use the current fragment.
43867144e37ba5cd35ee917daac631e03963b05a674Derek Schuff      // The bundle-locking directive ensures this is a new data fragment.
43967144e37ba5cd35ee917daac631e03963b05a674Derek Schuff      DF = cast<MCDataFragment>(getCurrentFragment());
4409ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky    else if (!SD->isBundleLocked() && Fixups.size() == 0) {
4419ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky      // Optimize memory usage by emitting the instruction to a
4429ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky      // MCCompactEncodedInstFragment when not in a bundle-locked group and
4439ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky      // there are no fixups registered.
444df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne      MCCompactEncodedInstFragment *CEIF = new MCCompactEncodedInstFragment();
445df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne      insert(CEIF);
4469ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky      CEIF->getContents().append(Code.begin(), Code.end());
4479ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky      return;
44867144e37ba5cd35ee917daac631e03963b05a674Derek Schuff    } else {
449df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne      DF = new MCDataFragment();
450df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne      insert(DF);
4516c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky      if (SD->getBundleLockState() == MCSectionData::BundleLockedAlignToEnd) {
4526c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky        // If this is a new fragment created for a bundle-locked group, and the
4536c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky        // group was marked as "align_to_end", set a flag in the fragment.
4546c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky        DF->setAlignToBundleEnd(true);
4556c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky      }
4566c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky    }
4574766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky
4584766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky    // We're now emitting an instruction in a bundle group, so this flag has
4594766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky    // to be turned off.
4604766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky    SD->setBundleGroupBeforeFirstInst(false);
4614766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  } else {
4624766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky    DF = getOrCreateDataFragment();
4634766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  }
4644766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky
46593ded7371f5f821c342bdf83b40f4ef607467a3fBenjamin Kramer  // Add the fixups and data.
4663565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  for (unsigned i = 0, e = Fixups.size(); i != e; ++i) {
46793ded7371f5f821c342bdf83b40f4ef607467a3fBenjamin Kramer    Fixups[i].setOffset(Fixups[i].getOffset() + DF->getContents().size());
46864d9a3233476553fc950f0f2fc6a2cdd2a4c05cfEli Bendersky    DF->getFixups().push_back(Fixups[i]);
4693565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  }
4704766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  DF->setHasInstructions(true);
47193ded7371f5f821c342bdf83b40f4ef607467a3fBenjamin Kramer  DF->getContents().append(Code.begin(), Code.end());
47293ded7371f5f821c342bdf83b40f4ef607467a3fBenjamin Kramer}
4733565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
4744766ef41b31e4f97bce1179c3b0398303bf65356Eli Benderskyvoid MCELFStreamer::EmitBundleAlignMode(unsigned AlignPow2) {
4754766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  assert(AlignPow2 <= 30 && "Invalid bundle alignment");
4764766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  MCAssembler &Assembler = getAssembler();
4774766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  if (Assembler.getBundleAlignSize() == 0 && AlignPow2 > 0)
4784766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky    Assembler.setBundleAlignSize(1 << AlignPow2);
4794766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  else
4804766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky    report_fatal_error(".bundle_align_mode should be only set once per file");
4814766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky}
4824766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky
4836c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Benderskyvoid MCELFStreamer::EmitBundleLock(bool AlignToEnd) {
4844766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  MCSectionData *SD = getCurrentSectionData();
4854766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky
4864766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  // Sanity checks
4874766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  //
4884766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  if (!getAssembler().isBundlingEnabled())
4894766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky    report_fatal_error(".bundle_lock forbidden when bundling is disabled");
4904766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  else if (SD->isBundleLocked())
4914766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky    report_fatal_error("Nesting of .bundle_lock is forbidden");
4924766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky
4936c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky  SD->setBundleLockState(AlignToEnd ? MCSectionData::BundleLockedAlignToEnd :
4946c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky                                      MCSectionData::BundleLocked);
4954766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  SD->setBundleGroupBeforeFirstInst(true);
4964766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky}
4974766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky
4984766ef41b31e4f97bce1179c3b0398303bf65356Eli Benderskyvoid MCELFStreamer::EmitBundleUnlock() {
4994766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  MCSectionData *SD = getCurrentSectionData();
5004766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky
5014766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  // Sanity checks
5024766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  if (!getAssembler().isBundlingEnabled())
5034766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky    report_fatal_error(".bundle_unlock forbidden when bundling is disabled");
5044766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  else if (!SD->isBundleLocked())
5054766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky    report_fatal_error(".bundle_unlock without matching lock");
5064766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  else if (SD->isBundleGroupBeforeFirstInst())
5074766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky    report_fatal_error("Empty bundle-locked group is forbidden");
5084766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky
5096c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky  SD->setBundleLockState(MCSectionData::NotBundleLocked);
5104766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky}
5114766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky
5125cc319a42a914b24b164a94d9a563c728a7a4026Richard Mittonvoid MCELFStreamer::Flush() {
5139e3922e94975b7b3d98da42f0d20a524f3deed53Rafael Espindola  for (std::vector<LocalCommon>::const_iterator i = LocalCommons.begin(),
5149e3922e94975b7b3d98da42f0d20a524f3deed53Rafael Espindola                                                e = LocalCommons.end();
5159e3922e94975b7b3d98da42f0d20a524f3deed53Rafael Espindola       i != e; ++i) {
5169e3922e94975b7b3d98da42f0d20a524f3deed53Rafael Espindola    MCSymbolData *SD = i->SD;
5179e3922e94975b7b3d98da42f0d20a524f3deed53Rafael Espindola    uint64_t Size = i->Size;
5189e3922e94975b7b3d98da42f0d20a524f3deed53Rafael Espindola    unsigned ByteAlignment = i->ByteAlignment;
5199e3922e94975b7b3d98da42f0d20a524f3deed53Rafael Espindola    const MCSymbol &Symbol = SD->getSymbol();
5209e3922e94975b7b3d98da42f0d20a524f3deed53Rafael Espindola    const MCSection &Section = Symbol.getSection();
5219e3922e94975b7b3d98da42f0d20a524f3deed53Rafael Espindola
5229e3922e94975b7b3d98da42f0d20a524f3deed53Rafael Espindola    MCSectionData &SectData = getAssembler().getOrCreateSectionData(Section);
5239e3922e94975b7b3d98da42f0d20a524f3deed53Rafael Espindola    new MCAlignFragment(ByteAlignment, 0, 1, ByteAlignment, &SectData);
5249e3922e94975b7b3d98da42f0d20a524f3deed53Rafael Espindola
5259e3922e94975b7b3d98da42f0d20a524f3deed53Rafael Espindola    MCFragment *F = new MCFillFragment(0, 0, Size, &SectData);
5269e3922e94975b7b3d98da42f0d20a524f3deed53Rafael Espindola    SD->setFragment(F);
5279e3922e94975b7b3d98da42f0d20a524f3deed53Rafael Espindola
5289e3922e94975b7b3d98da42f0d20a524f3deed53Rafael Espindola    // Update the maximum alignment of the section if necessary.
5299e3922e94975b7b3d98da42f0d20a524f3deed53Rafael Espindola    if (ByteAlignment > SectData.getAlignment())
5309e3922e94975b7b3d98da42f0d20a524f3deed53Rafael Espindola      SectData.setAlignment(ByteAlignment);
5319e3922e94975b7b3d98da42f0d20a524f3deed53Rafael Espindola  }
5329e3922e94975b7b3d98da42f0d20a524f3deed53Rafael Espindola
5335cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton  LocalCommons.clear();
5345cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton}
5355cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton
5365cc319a42a914b24b164a94d9a563c728a7a4026Richard Mittonvoid MCELFStreamer::FinishImpl() {
537dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  EmitFrames(nullptr);
5385cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton
5395cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton  Flush();
5405cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton
54199b4237c1647156f0e1d3d7e03efdab23ed79778Rafael Espindola  this->MCObjectStreamer::FinishImpl();
5423565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming}
5435cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton
54436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesMCStreamer *llvm::createELFStreamer(MCContext &Context, MCAsmBackend &MAB,
54536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                    raw_ostream &OS, MCCodeEmitter *CE,
54636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                    bool RelaxAll, bool NoExecStack) {
54736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  MCELFStreamer *S = new MCELFStreamer(Context, MAB, OS, CE);
5483565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  if (RelaxAll)
5493565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming    S->getAssembler().setRelaxAll(true);
55096aa78c8c5ef1a5f268539c9edc86569b436d573Rafael Espindola  if (NoExecStack)
55196aa78c8c5ef1a5f268539c9edc86569b436d573Rafael Espindola    S->getAssembler().setNoExecStack(true);
5523565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  return S;
5533565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming}
554645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien
5556eb3e87df04f8b035562d9865292c23f5b79f1a2Tim Northovervoid MCELFStreamer::EmitThumbFunc(MCSymbol *Func) {
5566eb3e87df04f8b035562d9865292c23f5b79f1a2Tim Northover  llvm_unreachable("Generic ELF doesn't support this directive");
5576eb3e87df04f8b035562d9865292c23f5b79f1a2Tim Northover}
5586eb3e87df04f8b035562d9865292c23f5b79f1a2Tim Northover
559645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chienvoid MCELFStreamer::EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) {
560645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien  llvm_unreachable("ELF doesn't support this directive");
561645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien}
562645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien
563645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chienvoid MCELFStreamer::BeginCOFFSymbolDef(const MCSymbol *Symbol) {
564645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien  llvm_unreachable("ELF doesn't support this directive");
565645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien}
566645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien
567645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chienvoid MCELFStreamer::EmitCOFFSymbolStorageClass(int StorageClass) {
568645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien  llvm_unreachable("ELF doesn't support this directive");
569645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien}
570645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien
571645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chienvoid MCELFStreamer::EmitCOFFSymbolType(int Type) {
572645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien  llvm_unreachable("ELF doesn't support this directive");
573645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien}
574645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien
575645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chienvoid MCELFStreamer::EndCOFFSymbolDef() {
576645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien  llvm_unreachable("ELF doesn't support this directive");
577645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien}
578645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien
579645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chienvoid MCELFStreamer::EmitZerofill(const MCSection *Section, MCSymbol *Symbol,
580645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien                                 uint64_t Size, unsigned ByteAlignment) {
581645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien  llvm_unreachable("ELF doesn't support this directive");
582645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien}
583645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien
584645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chienvoid MCELFStreamer::EmitTBSSSymbol(const MCSection *Section, MCSymbol *Symbol,
585645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien                                   uint64_t Size, unsigned ByteAlignment) {
586645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien  llvm_unreachable("ELF doesn't support this directive");
587645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien}
588