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"
180c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar#include "llvm/MC/MCAsmLayout.h"
1937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/MC/MCAsmInfo.h"
2036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/MC/MCAssembler.h"
213565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming#include "llvm/MC/MCCodeEmitter.h"
22f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola#include "llvm/MC/MCContext.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"
27de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/MC/MCObjectWriter.h"
283565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming#include "llvm/MC/MCSection.h"
29d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/MC/MCSectionELF.h"
306948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#include "llvm/MC/MCSymbolELF.h"
313565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming#include "llvm/MC/MCSymbol.h"
32484291c27319668ad99cb87def000254357736fbRafael Espindola#include "llvm/MC/MCValue.h"
333565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming#include "llvm/Support/Debug.h"
343565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming#include "llvm/Support/ELF.h"
353565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming#include "llvm/Support/ErrorHandling.h"
364c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar#include "llvm/Support/TargetRegistry.h"
373565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming#include "llvm/Support/raw_ostream.h"
383565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
393565a06ebf44a193a8b333cbeff2ee154298d450Matt Flemingusing namespace llvm;
403565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
416948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarbool MCELFStreamer::isBundleLocked() const {
426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  return getCurrentSectionOnly()->isBundleLocked();
436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}
446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
45645016533d1208d2e7a17d917d64b8b63c4f9939Logan ChienMCELFStreamer::~MCELFStreamer() {
46f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola}
47f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola
480c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarvoid MCELFStreamer::mergeFragment(MCDataFragment *DF,
49f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                  MCDataFragment *EF) {
500c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  MCAssembler &Assembler = getAssembler();
510c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
520c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  if (Assembler.isBundlingEnabled() && Assembler.getRelaxAll()) {
530c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    uint64_t FSize = EF->getContents().size();
540c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
550c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    if (FSize > Assembler.getBundleAlignSize())
560c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      report_fatal_error("Fragment can't be larger than a bundle size");
570c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
580c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    uint64_t RequiredBundlePadding = computeBundlePadding(
590c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar        Assembler, EF, DF->getContents().size(), FSize);
600c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
610c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    if (RequiredBundlePadding > UINT8_MAX)
620c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      report_fatal_error("Padding cannot exceed 255 bytes");
630c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
640c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    if (RequiredBundlePadding > 0) {
650c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      SmallString<256> Code;
660c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      raw_svector_ostream VecOS(Code);
670c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      MCObjectWriter *OW = Assembler.getBackend().createObjectWriter(VecOS);
680c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
690c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      EF->setBundlePadding(static_cast<uint8_t>(RequiredBundlePadding));
700c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
710c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      Assembler.writeFragmentPadding(*EF, FSize, OW);
720c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      delete OW;
730c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
740c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      DF->getContents().append(Code.begin(), Code.end());
750c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    }
760c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
770c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
780c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  flushPendingLabels(DF, DF->getContents().size());
790c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
800c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  for (unsigned i = 0, e = EF->getFixups().size(); i != e; ++i) {
810c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    EF->getFixups()[i].setOffset(EF->getFixups()[i].getOffset() +
820c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar                                 DF->getContents().size());
830c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    DF->getFixups().push_back(EF->getFixups()[i]);
840c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
850c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  DF->setHasInstructions(true);
860c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  DF->getContents().append(EF->getContents().begin(), EF->getContents().end());
870c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar}
880c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
8937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesvoid MCELFStreamer::InitSections(bool NoExecStack) {
9037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  MCContext &Ctx = getContext();
9137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  SwitchSection(Ctx.getObjectFileInfo()->getTextSection());
9236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EmitCodeAlignment(4);
9336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
9437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (NoExecStack)
9537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    SwitchSection(Ctx.getAsmInfo()->getNonexecutableStackSection(Ctx));
96d80781b98b771d370730ab7c630018f23e202b57Rafael Espindola}
97d80781b98b771d370730ab7c630018f23e202b57Rafael Espindola
986948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarvoid MCELFStreamer::EmitLabel(MCSymbol *S) {
996948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  auto *Symbol = cast<MCSymbolELF>(S);
100ba210243ef7d325ef6954d459091edf580a241f9Rafael Espindola  assert(Symbol->isUndefined() && "Cannot define a symbol twice!");
101ba210243ef7d325ef6954d459091edf580a241f9Rafael Espindola
102ea4afa91eb453323948588ad1e1706d842fb9007Rafael Espindola  MCObjectStreamer::EmitLabel(Symbol);
10373ffea47d20bc9f559b4ce0c60166ee504073832Rafael Espindola
104e1a2587ee273943390608df096378116ce52ffbaRafael Espindola  const MCSectionELF &Section =
105f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      static_cast<const MCSectionELF &>(*getCurrentSectionOnly());
1061c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola  if (Section.getFlags() & ELF::SHF_TLS)
1076948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Symbol->setType(ELF::STT_TLS);
1083565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming}
1093565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
1103565a06ebf44a193a8b333cbeff2ee154298d450Matt Flemingvoid MCELFStreamer::EmitAssemblerFlag(MCAssemblerFlag Flag) {
11106866a72b0117e15463b0706d994270b3e20948dBill Wendling  // Let the target do whatever target specific stuff it needs to do.
11206866a72b0117e15463b0706d994270b3e20948dBill Wendling  getAssembler().getBackend().handleAssemblerFlag(Flag);
11306866a72b0117e15463b0706d994270b3e20948dBill Wendling  // Do any generic stuff we need to do.
1143565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  switch (Flag) {
115ce79299f78bb04e76e1860ab119b85d69f3a19c7Jim Grosbach  case MCAF_SyntaxUnified: return; // no-op here.
116bd27f5adbd8f3b8ab8def5aa43fbc406ac9b8cbeEvan Cheng  case MCAF_Code16: return; // Change parsing mode; no-op here.
117bd27f5adbd8f3b8ab8def5aa43fbc406ac9b8cbeEvan Cheng  case MCAF_Code32: return; // Change parsing mode; no-op here.
118bd27f5adbd8f3b8ab8def5aa43fbc406ac9b8cbeEvan Cheng  case MCAF_Code64: return; // Change parsing mode; no-op here.
1193565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  case MCAF_SubsectionsViaSymbols:
1203565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming    getAssembler().setSubsectionsViaSymbols(true);
1213565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming    return;
1223565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  }
1233565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
124858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper  llvm_unreachable("invalid assembler flag!");
1253565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming}
1263565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
127f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar// If bundle alignment is used and there are any instructions in the section, it
1286948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar// needs to be aligned to at least the bundle size.
1296948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarstatic void setSectionAlignmentForBundling(const MCAssembler &Assembler,
1306948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                                           MCSection *Section) {
1316948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (Section && Assembler.isBundlingEnabled() && Section->hasInstructions() &&
1326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      Section->getAlignment() < Assembler.getBundleAlignSize())
1336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Section->setAlignment(Assembler.getBundleAlignSize());
1346948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}
1356948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
1366948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarvoid MCELFStreamer::ChangeSection(MCSection *Section,
137df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne                                  const MCExpr *Subsection) {
1386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  MCSection *CurSection = getCurrentSectionOnly();
1396948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (CurSection && isBundleLocked())
1404766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky    report_fatal_error("Unterminated .bundle_lock when changing a section");
14137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
14237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  MCAssembler &Asm = getAssembler();
1436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  // Ensure the previous section gets aligned if necessary.
1446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  setSectionAlignmentForBundling(Asm, CurSection);
14537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  auto *SectionELF = static_cast<const MCSectionELF *>(Section);
14637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  const MCSymbol *Grp = SectionELF->getGroup();
1471f4f9e3d35a2264d86f97dfb6d1e4ccb434f449bRafael Espindola  if (Grp)
1486948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Asm.registerSymbol(*Grp);
14937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
150df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne  this->MCObjectStreamer::ChangeSection(Section, Subsection);
1516948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  MCContext &Ctx = getContext();
1526948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  auto *Begin = cast_or_null<MCSymbolELF>(Section->getBeginSymbol());
1536948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (!Begin) {
1546948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Begin = Ctx.getOrCreateSectionSymbol(*SectionELF);
1556948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Section->setBeginSymbol(Begin);
1566948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
1576948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (Begin->isUndefined()) {
1586948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Asm.registerSymbol(*Begin);
1596948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Begin->setType(ELF::STT_SECTION);
16037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
1611f4f9e3d35a2264d86f97dfb6d1e4ccb434f449bRafael Espindola}
1621f4f9e3d35a2264d86f97dfb6d1e4ccb434f449bRafael Espindola
163484291c27319668ad99cb87def000254357736fbRafael Espindolavoid MCELFStreamer::EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) {
1646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  getAssembler().registerSymbol(*Symbol);
1656948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  const MCExpr *Value = MCSymbolRefExpr::create(
16636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      Symbol, MCSymbolRefExpr::VK_WEAKREF, getContext());
167484291c27319668ad99cb87def000254357736fbRafael Espindola  Alias->setVariableValue(Value);
168484291c27319668ad99cb87def000254357736fbRafael Espindola}
169484291c27319668ad99cb87def000254357736fbRafael Espindola
17001a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne// When GNU as encounters more than one .type declaration for an object it seems
17101a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne// to use a mechanism similar to the one below to decide which type is actually
17201a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne// used in the object file.  The greater of T1 and T2 is selected based on the
17301a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne// following ordering:
17401a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne//  STT_NOTYPE < STT_OBJECT < STT_FUNC < STT_GNU_IFUNC < STT_TLS < anything else
17501a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne// If neither T1 < T2 nor T2 < T1 according to this ordering, use T2 (the user
17601a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne// provided type).
17701a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbournestatic unsigned CombineSymbolTypes(unsigned T1, unsigned T2) {
1784c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  for (unsigned Type : {ELF::STT_NOTYPE, ELF::STT_OBJECT, ELF::STT_FUNC,
1794c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar                        ELF::STT_GNU_IFUNC, ELF::STT_TLS}) {
1804c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    if (T1 == Type)
18101a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne      return T2;
1824c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    if (T2 == Type)
18301a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne      return T1;
18401a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne  }
18501a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne
18601a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne  return T2;
18701a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne}
18801a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne
1896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarbool MCELFStreamer::EmitSymbolAttribute(MCSymbol *S, MCSymbolAttr Attribute) {
1906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  auto *Symbol = cast<MCSymbolELF>(S);
1913565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  // Indirect symbols are handled differently, to match how 'as' handles
1923565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  // them. This makes writing matching .o files easier.
1933565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  if (Attribute == MCSA_IndirectSymbol) {
1943565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming    // Note that we intentionally cannot use the symbol data here; this is
1953565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming    // important for matching the string table that 'as' generates.
1963565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming    IndirectSymbolData ISD;
1973565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming    ISD.Symbol = Symbol;
1986948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    ISD.Section = getCurrentSectionOnly();
1993565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming    getAssembler().getIndirectSymbols().push_back(ISD);
2001c9cd021c8999d9c2c0786dff074d1e75bbd0eb2Saleem Abdulrasool    return true;
2013565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  }
2023565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
2033565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  // Adding a symbol attribute always introduces the symbol, note that an
2046948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  // important side effect of calling registerSymbol here is to register
2053565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  // the symbol with the assembler.
2066948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  getAssembler().registerSymbol(*Symbol);
2073565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
2083565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  // The implementation of symbol attributes is designed to match 'as', but it
2093565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  // leaves much to desired. It doesn't really make sense to arbitrarily add and
2103565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  // remove flags, but 'as' allows this (in particular, see .desc).
2113565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  //
2123565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  // In the future it might be worth trying to make these operations more well
2133565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  // defined.
2143565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  switch (Attribute) {
2153565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  case MCSA_LazyReference:
2163565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  case MCSA_Reference:
217e8e98d7f2eaa0613442ce21ab6a040c0f04f5b4dKevin Enderby  case MCSA_SymbolResolver:
2183565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  case MCSA_PrivateExtern:
2193565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  case MCSA_WeakDefinition:
220f8020a3978b9a56074a3a5f9821c63165e37bff7Eli Friedman  case MCSA_WeakDefAutoPrivate:
2213565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  case MCSA_Invalid:
2223565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  case MCSA_IndirectSymbol:
2231c9cd021c8999d9c2c0786dff074d1e75bbd0eb2Saleem Abdulrasool    return false;
2243565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
2253f90a4c42d1683600e91c2aea325bacf59c37f5eJim Grosbach  case MCSA_NoDeadStrip:
2267e528a1724d8f38dd817396938aaf768887c8b30Rafael Espindola    // Ignore for now.
2277e528a1724d8f38dd817396938aaf768887c8b30Rafael Espindola    break;
2287e528a1724d8f38dd817396938aaf768887c8b30Rafael Espindola
229ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case MCSA_ELF_TypeGnuUniqueObject:
2306948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_OBJECT));
2316948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Symbol->setBinding(ELF::STB_GNU_UNIQUE);
2326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Symbol->setExternal(true);
233ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    break;
234ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
2353565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  case MCSA_Global:
2366948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Symbol->setBinding(ELF::STB_GLOBAL);
2376948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Symbol->setExternal(true);
2383565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming    break;
2393565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
240230c27472458d5f1f52f96347b655d1b5c531f33Benjamin Kramer  case MCSA_WeakReference:
2413565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  case MCSA_Weak:
2426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Symbol->setBinding(ELF::STB_WEAK);
2436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Symbol->setExternal(true);
2443565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming    break;
2453565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
2463565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  case MCSA_Local:
2476948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Symbol->setBinding(ELF::STB_LOCAL);
2486948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Symbol->setExternal(false);
2493565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming    break;
2503565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
2513565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  case MCSA_ELF_TypeFunction:
2526948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_FUNC));
2533565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming    break;
2543565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
255a0c17a495b12debcb7f206993bbc6020e2e6e8dfRoman Divacky  case MCSA_ELF_TypeIndFunction:
2566948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_GNU_IFUNC));
257a0c17a495b12debcb7f206993bbc6020e2e6e8dfRoman Divacky    break;
258a0c17a495b12debcb7f206993bbc6020e2e6e8dfRoman Divacky
2593565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  case MCSA_ELF_TypeObject:
2606948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_OBJECT));
2613565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming    break;
2623565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
2633565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  case MCSA_ELF_TypeTLS:
2646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_TLS));
2653565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming    break;
2663565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
2673565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  case MCSA_ELF_TypeCommon:
26801a7b5c43e113513a3165a60e85372f89f7eaaffPeter Collingbourne    // TODO: Emit these as a common symbol.
2696948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_OBJECT));
2703565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming    break;
2713565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
2723565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  case MCSA_ELF_TypeNoType:
2736948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_NOTYPE));
2743565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming    break;
2753565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
2763565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  case MCSA_Protected:
2776948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Symbol->setVisibility(ELF::STV_PROTECTED);
2783565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming    break;
2793565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
2803565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  case MCSA_Hidden:
2816948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Symbol->setVisibility(ELF::STV_HIDDEN);
2823565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming    break;
2833565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
2843565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  case MCSA_Internal:
2856948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Symbol->setVisibility(ELF::STV_INTERNAL);
2863565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming    break;
287de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
288de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case MCSA_AltEntry:
289de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    llvm_unreachable("ELF doesn't support the .alt_entry attribute");
2903565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  }
2911c9cd021c8999d9c2c0786dff074d1e75bbd0eb2Saleem Abdulrasool
2921c9cd021c8999d9c2c0786dff074d1e75bbd0eb2Saleem Abdulrasool  return true;
2933565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming}
2943565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
2956948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarvoid MCELFStreamer::EmitCommonSymbol(MCSymbol *S, uint64_t Size,
2966948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                                     unsigned ByteAlignment) {
2976948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  auto *Symbol = cast<MCSymbolELF>(S);
2986948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  getAssembler().registerSymbol(*Symbol);
2993565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
3006948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (!Symbol->isBindingSet()) {
3016948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Symbol->setBinding(ELF::STB_GLOBAL);
3026948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Symbol->setExternal(true);
303f7c10a3cff61c70efe8e405d9bdc5386e8e3fc0aRafael Espindola  }
304f7c10a3cff61c70efe8e405d9bdc5386e8e3fc0aRafael Espindola
3056948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Symbol->setType(ELF::STT_OBJECT);
30655d02f3a138badd5b1f96240b4d4b416d9026e2cRafael Espindola
3076948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (Symbol->getBinding() == ELF::STB_LOCAL) {
308f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    MCSection &Section = *getAssembler().getContext().getELFSection(
309ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines        ".bss", ELF::SHT_NOBITS, ELF::SHF_WRITE | ELF::SHF_ALLOC);
310f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    MCSectionSubPair P = getCurrentSection();
311f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    SwitchSection(&Section);
3125cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton
313f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    EmitValueToAlignment(ByteAlignment, 0, 1, 0);
314f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    EmitLabel(Symbol);
315f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    EmitZeros(Size);
3161963572f9de87cd1ac5f16e504e27c3c26267e6fRafael Espindola
317f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    // Update the maximum alignment of the section if necessary.
318f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (ByteAlignment > Section.getAlignment())
319f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      Section.setAlignment(ByteAlignment);
320f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
321f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    SwitchSection(P.first, P.second);
322f7c10a3cff61c70efe8e405d9bdc5386e8e3fc0aRafael Espindola  } else {
3236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    if(Symbol->declareCommon(Size, ByteAlignment))
3246948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      report_fatal_error("Symbol: " + Symbol->getName() +
3256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                         " redeclared as different type");
3263565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  }
3273565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
3286948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  cast<MCSymbolELF>(Symbol)
3296948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      ->setSize(MCConstantExpr::create(Size, getContext()));
3303565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming}
3313565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
3326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarvoid MCELFStreamer::emitELFSize(MCSymbolELF *Symbol, const MCExpr *Value) {
3336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Symbol->setSize(Value);
334645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien}
335645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien
3366948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarvoid MCELFStreamer::EmitLocalCommonSymbol(MCSymbol *S, uint64_t Size,
33736a16015ac108e2f0dd2d6d96a6d364bc74c50d7Benjamin Kramer                                          unsigned ByteAlignment) {
3386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  auto *Symbol = cast<MCSymbolELF>(S);
339f13743bb3c3fb37a59b59f26056bc391bf0adcdcJason W Kim  // FIXME: Should this be caught and done earlier?
3406948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  getAssembler().registerSymbol(*Symbol);
3416948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Symbol->setBinding(ELF::STB_LOCAL);
3426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Symbol->setExternal(false);
34336a16015ac108e2f0dd2d6d96a6d364bc74c50d7Benjamin Kramer  EmitCommonSymbol(Symbol, Size, ByteAlignment);
344f13743bb3c3fb37a59b59f26056bc391bf0adcdcJason W Kim}
345f13743bb3c3fb37a59b59f26056bc391bf0adcdcJason W Kim
346dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid MCELFStreamer::EmitValueImpl(const MCExpr *Value, unsigned Size,
347f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                  SMLoc Loc) {
3486948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (isBundleLocked())
3494766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky    report_fatal_error("Emitting values inside a locked bundle is forbidden");
3505f7692604d44192206fbaf390085a95c9fb1a40bDavid Meyer  fixSymbolsInTLSFixups(Value);
351dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  MCObjectStreamer::EmitValueImpl(Value, Size, Loc);
3525f7692604d44192206fbaf390085a95c9fb1a40bDavid Meyer}
3535f7692604d44192206fbaf390085a95c9fb1a40bDavid Meyer
3544766ef41b31e4f97bce1179c3b0398303bf65356Eli Benderskyvoid MCELFStreamer::EmitValueToAlignment(unsigned ByteAlignment,
3554766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky                                         int64_t Value,
3564766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky                                         unsigned ValueSize,
3574766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky                                         unsigned MaxBytesToEmit) {
3586948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (isBundleLocked())
3594766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky    report_fatal_error("Emitting values inside a locked bundle is forbidden");
3604766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  MCObjectStreamer::EmitValueToAlignment(ByteAlignment, Value,
3614766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky                                         ValueSize, MaxBytesToEmit);
3624766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky}
3634766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky
36472580780a98cb8b0019b7ec4ed88e3f3328b9969Joerg Sonnenberger// Add a symbol for the file name of this module. They start after the
36572580780a98cb8b0019b7ec4ed88e3f3328b9969Joerg Sonnenberger// null symbol and don't count as normal symbol, i.e. a non-STT_FILE symbol
36672580780a98cb8b0019b7ec4ed88e3f3328b9969Joerg Sonnenberger// with the same name may appear.
3673565a06ebf44a193a8b333cbeff2ee154298d450Matt Flemingvoid MCELFStreamer::EmitFileDirective(StringRef Filename) {
36872580780a98cb8b0019b7ec4ed88e3f3328b9969Joerg Sonnenberger  getAssembler().addFileName(Filename);
3693565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming}
3703565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
371c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindolavoid MCELFStreamer::EmitIdent(StringRef IdentString) {
3726948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  MCSection *Comment = getAssembler().getContext().getELFSection(
373ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      ".comment", ELF::SHT_PROGBITS, ELF::SHF_MERGE | ELF::SHF_STRINGS, 1, "");
374c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola  PushSection();
375c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola  SwitchSection(Comment);
376c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola  if (!SeenIdent) {
377c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola    EmitIntValue(0, 1);
378c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola    SeenIdent = true;
379c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola  }
380c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola  EmitBytes(IdentString);
381c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola  EmitIntValue(0, 1);
382c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola  PopSection();
383c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola}
384c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindola
385c7ce3e4f42219003f30382be17d966cb2dfb4e71Rafael Espindolavoid MCELFStreamer::fixSymbolsInTLSFixups(const MCExpr *expr) {
38697551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola  switch (expr->getKind()) {
38772062f5744557e270a38192554c3126ea5f97434Tim Northover  case MCExpr::Target:
38872062f5744557e270a38192554c3126ea5f97434Tim Northover    cast<MCTargetExpr>(expr)->fixELFSymbolsInTLSFixups(getAssembler());
38972062f5744557e270a38192554c3126ea5f97434Tim Northover    break;
39097551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola  case MCExpr::Constant:
39197551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola    break;
39297551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola
39397551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola  case MCExpr::Binary: {
39497551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola    const MCBinaryExpr *be = cast<MCBinaryExpr>(expr);
39597551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola    fixSymbolsInTLSFixups(be->getLHS());
39697551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola    fixSymbolsInTLSFixups(be->getRHS());
39797551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola    break;
39897551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola  }
39997551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola
40097551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola  case MCExpr::SymbolRef: {
40197551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola    const MCSymbolRefExpr &symRef = *cast<MCSymbolRefExpr>(expr);
402bf8209daf875fa533a379290a91d01be5152597dRafael Espindola    switch (symRef.getKind()) {
403bf8209daf875fa533a379290a91d01be5152597dRafael Espindola    default:
40497551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola      return;
405d02c8b6cc1d07bfe37fc055eefdac21b1c9303cbJoerg Sonnenberger    case MCSymbolRefExpr::VK_GOTTPOFF:
406d02c8b6cc1d07bfe37fc055eefdac21b1c9303cbJoerg Sonnenberger    case MCSymbolRefExpr::VK_INDNTPOFF:
407bf8209daf875fa533a379290a91d01be5152597dRafael Espindola    case MCSymbolRefExpr::VK_NTPOFF:
408bf8209daf875fa533a379290a91d01be5152597dRafael Espindola    case MCSymbolRefExpr::VK_GOTNTPOFF:
409bf8209daf875fa533a379290a91d01be5152597dRafael Espindola    case MCSymbolRefExpr::VK_TLSGD:
410d02c8b6cc1d07bfe37fc055eefdac21b1c9303cbJoerg Sonnenberger    case MCSymbolRefExpr::VK_TLSLD:
411bf8209daf875fa533a379290a91d01be5152597dRafael Espindola    case MCSymbolRefExpr::VK_TLSLDM:
412bf8209daf875fa533a379290a91d01be5152597dRafael Espindola    case MCSymbolRefExpr::VK_TPOFF:
413de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case MCSymbolRefExpr::VK_TPREL:
414bf8209daf875fa533a379290a91d01be5152597dRafael Espindola    case MCSymbolRefExpr::VK_DTPOFF:
415de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case MCSymbolRefExpr::VK_DTPREL:
416228e0afcfd0d5f167a95c6ddbec2c6a4a90b6d2bUlrich Weigand    case MCSymbolRefExpr::VK_PPC_DTPMOD:
41792cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_TPREL_LO:
418cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_TPREL_HI:
41992cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_TPREL_HA:
420cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_TPREL_HIGHER:
421cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_TPREL_HIGHERA:
422cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_TPREL_HIGHEST:
423cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_TPREL_HIGHESTA:
42492cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_DTPREL_LO:
425cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_DTPREL_HI:
42692cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_DTPREL_HA:
427cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHER:
428cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHERA:
429cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHEST:
430cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHESTA:
431cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_GOT_TPREL:
43292cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_GOT_TPREL_LO:
433cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_GOT_TPREL_HI:
43492cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_GOT_TPREL_HA:
435cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_GOT_DTPREL:
436cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_GOT_DTPREL_LO:
437cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_GOT_DTPREL_HI:
438cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_GOT_DTPREL_HA:
4393a42989d3ddfe30c6b87fe1f3d7f1164e0868a40Bill Schmidt    case MCSymbolRefExpr::VK_PPC_TLS:
440cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_GOT_TLSGD:
44192cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_GOT_TLSGD_LO:
442cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_GOT_TLSGD_HI:
44392cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_GOT_TLSGD_HA:
4447a34599db017a5486cf7cd11eb124984acec8286Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_TLSGD:
445cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_GOT_TLSLD:
44692cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_GOT_TLSLD_LO:
447cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_GOT_TLSLD_HI:
44892cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_GOT_TLSLD_HA:
4497a34599db017a5486cf7cd11eb124984acec8286Ulrich Weigand    case MCSymbolRefExpr::VK_PPC_TLSLD:
450bf8209daf875fa533a379290a91d01be5152597dRafael Espindola      break;
451bf8209daf875fa533a379290a91d01be5152597dRafael Espindola    }
4526948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    getAssembler().registerSymbol(symRef.getSymbol());
4536948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    cast<MCSymbolELF>(symRef.getSymbol()).setType(ELF::STT_TLS);
45497551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola    break;
45597551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola  }
45697551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola
45797551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola  case MCExpr::Unary:
45897551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola    fixSymbolsInTLSFixups(cast<MCUnaryExpr>(expr)->getSubExpr());
45997551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola    break;
46097551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola  }
46197551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola}
46297551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola
46336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid MCELFStreamer::EmitInstToFragment(const MCInst &Inst,
46436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                       const MCSubtargetInfo &STI) {
46536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  this->MCObjectStreamer::EmitInstToFragment(Inst, STI);
466251040bc18eedfa56d01fe92836e55cfd8c5d990Eli Bendersky  MCRelaxableFragment &F = *cast<MCRelaxableFragment>(getCurrentFragment());
4673565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
468dedb045c3296c831962c4ae101531c38c273ba89Rafael Espindola  for (unsigned i = 0, e = F.getFixups().size(); i != e; ++i)
469dedb045c3296c831962c4ae101531c38c273ba89Rafael Espindola    fixSymbolsInTLSFixups(F.getFixups()[i].getValue());
47093ded7371f5f821c342bdf83b40f4ef607467a3fBenjamin Kramer}
47193ded7371f5f821c342bdf83b40f4ef607467a3fBenjamin Kramer
47236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid MCELFStreamer::EmitInstToData(const MCInst &Inst,
47336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                   const MCSubtargetInfo &STI) {
4744766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  MCAssembler &Assembler = getAssembler();
4753565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  SmallVector<MCFixup, 4> Fixups;
4763565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  SmallString<256> Code;
4773565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  raw_svector_ostream VecOS(Code);
4786948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Assembler.getEmitter().encodeInstruction(Inst, VecOS, Fixups, STI);
4793565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
48097551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola  for (unsigned i = 0, e = Fixups.size(); i != e; ++i)
48197551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola    fixSymbolsInTLSFixups(Fixups[i].getValue());
48297551276c59d4521200d2a4cf312a3fa885f2507Rafael Espindola
4834766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  // There are several possibilities here:
4844766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  //
4854766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  // If bundling is disabled, append the encoded instruction to the current data
4864766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  // fragment (or create a new such fragment if the current fragment is not a
4874766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  // data fragment).
4884766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  //
4894766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  // If bundling is enabled:
4909ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky  // - If we're not in a bundle-locked group, emit the instruction into a
4919ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky  //   fragment of its own. If there are no fixups registered for the
4929ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky  //   instruction, emit a MCCompactEncodedInstFragment. Otherwise, emit a
4939ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky  //   MCDataFragment.
4944766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  // - If we're in a bundle-locked group, append the instruction to the current
4954766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  //   data fragment because we want all the instructions in a group to get into
4964766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  //   the same fragment. Be careful not to do that for the first instruction in
4974766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  //   the group, though.
4984766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  MCDataFragment *DF;
4994766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky
5004766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  if (Assembler.isBundlingEnabled()) {
5016948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    MCSection &Sec = *getCurrentSectionOnly();
5026948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    if (Assembler.getRelaxAll() && isBundleLocked())
5030c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      // If the -mc-relax-all flag is used and we are bundle-locked, we re-use
5040c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      // the current bundle group.
5050c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      DF = BundleGroups.back();
5066948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    else if (Assembler.getRelaxAll() && !isBundleLocked())
5070c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      // When not in a bundle-locked group and the -mc-relax-all flag is used,
5080c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      // we create a new temporary fragment which will be later merged into
5090c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      // the current fragment.
5100c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      DF = new MCDataFragment();
5116948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    else if (isBundleLocked() && !Sec.isBundleGroupBeforeFirstInst())
51267144e37ba5cd35ee917daac631e03963b05a674Derek Schuff      // If we are bundle-locked, we re-use the current fragment.
51367144e37ba5cd35ee917daac631e03963b05a674Derek Schuff      // The bundle-locking directive ensures this is a new data fragment.
51467144e37ba5cd35ee917daac631e03963b05a674Derek Schuff      DF = cast<MCDataFragment>(getCurrentFragment());
5156948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    else if (!isBundleLocked() && Fixups.size() == 0) {
5169ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky      // Optimize memory usage by emitting the instruction to a
5179ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky      // MCCompactEncodedInstFragment when not in a bundle-locked group and
5189ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky      // there are no fixups registered.
519df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne      MCCompactEncodedInstFragment *CEIF = new MCCompactEncodedInstFragment();
520df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne      insert(CEIF);
5219ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky      CEIF->getContents().append(Code.begin(), Code.end());
5229ccb76998f741a7d3f0f217392a783dfb99c6e87Eli Bendersky      return;
52367144e37ba5cd35ee917daac631e03963b05a674Derek Schuff    } else {
524df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne      DF = new MCDataFragment();
525df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne      insert(DF);
52637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    }
5276948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    if (Sec.getBundleLockState() == MCSection::BundleLockedAlignToEnd) {
52837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      // If this fragment is for a group marked "align_to_end", set a flag
52937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      // in the fragment. This can happen after the fragment has already been
53037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      // created if there are nested bundle_align groups and an inner one
53137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      // is the one marked align_to_end.
53237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      DF->setAlignToBundleEnd(true);
5336c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Bendersky    }
5344766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky
5354766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky    // We're now emitting an instruction in a bundle group, so this flag has
5364766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky    // to be turned off.
5376948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Sec.setBundleGroupBeforeFirstInst(false);
5384766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  } else {
5394766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky    DF = getOrCreateDataFragment();
5404766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  }
5414766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky
54293ded7371f5f821c342bdf83b40f4ef607467a3fBenjamin Kramer  // Add the fixups and data.
5433565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  for (unsigned i = 0, e = Fixups.size(); i != e; ++i) {
54493ded7371f5f821c342bdf83b40f4ef607467a3fBenjamin Kramer    Fixups[i].setOffset(Fixups[i].getOffset() + DF->getContents().size());
54564d9a3233476553fc950f0f2fc6a2cdd2a4c05cfEli Bendersky    DF->getFixups().push_back(Fixups[i]);
5463565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  }
5474766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  DF->setHasInstructions(true);
54893ded7371f5f821c342bdf83b40f4ef607467a3fBenjamin Kramer  DF->getContents().append(Code.begin(), Code.end());
5490c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
5500c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  if (Assembler.isBundlingEnabled() && Assembler.getRelaxAll()) {
5516948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    if (!isBundleLocked()) {
5520c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      mergeFragment(getOrCreateDataFragment(), DF);
5530c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      delete DF;
5540c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    }
5550c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
55693ded7371f5f821c342bdf83b40f4ef607467a3fBenjamin Kramer}
5573565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming
5584766ef41b31e4f97bce1179c3b0398303bf65356Eli Benderskyvoid MCELFStreamer::EmitBundleAlignMode(unsigned AlignPow2) {
5594766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  assert(AlignPow2 <= 30 && "Invalid bundle alignment");
5604766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  MCAssembler &Assembler = getAssembler();
56137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (AlignPow2 > 0 && (Assembler.getBundleAlignSize() == 0 ||
56237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                        Assembler.getBundleAlignSize() == 1U << AlignPow2))
56337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    Assembler.setBundleAlignSize(1U << AlignPow2);
5644766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  else
56537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    report_fatal_error(".bundle_align_mode cannot be changed once set");
5664766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky}
5674766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky
5686c1d4972cf1cd6b6072e31c05f97abb1ed7a8497Eli Benderskyvoid MCELFStreamer::EmitBundleLock(bool AlignToEnd) {
5696948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  MCSection &Sec = *getCurrentSectionOnly();
5704766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky
5714766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  // Sanity checks
5724766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  //
5734766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  if (!getAssembler().isBundlingEnabled())
5744766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky    report_fatal_error(".bundle_lock forbidden when bundling is disabled");
57537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
5766948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (!isBundleLocked())
5776948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Sec.setBundleGroupBeforeFirstInst(true);
5784766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky
5796948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (getAssembler().getRelaxAll() && !isBundleLocked()) {
5800c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    // TODO: drop the lock state and set directly in the fragment
5810c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    MCDataFragment *DF = new MCDataFragment();
5820c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    BundleGroups.push_back(DF);
5830c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  }
5840c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
5856948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Sec.setBundleLockState(AlignToEnd ? MCSection::BundleLockedAlignToEnd
5866948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                                    : MCSection::BundleLocked);
5874766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky}
5884766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky
5894766ef41b31e4f97bce1179c3b0398303bf65356Eli Benderskyvoid MCELFStreamer::EmitBundleUnlock() {
5906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  MCSection &Sec = *getCurrentSectionOnly();
5914766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky
5924766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  // Sanity checks
5934766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky  if (!getAssembler().isBundlingEnabled())
5944766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky    report_fatal_error(".bundle_unlock forbidden when bundling is disabled");
5956948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  else if (!isBundleLocked())
5964766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky    report_fatal_error(".bundle_unlock without matching lock");
5976948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  else if (Sec.isBundleGroupBeforeFirstInst())
5984766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky    report_fatal_error("Empty bundle-locked group is forbidden");
5994766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky
6000c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  // When the -mc-relax-all flag is used, we emit instructions to fragments
601f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // stored on a stack. When the bundle unlock is emitted, we pop a fragment
6020c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  // from the stack a merge it to the one below.
6030c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  if (getAssembler().getRelaxAll()) {
6040c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    assert(!BundleGroups.empty() && "There are no bundle groups");
6050c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    MCDataFragment *DF = BundleGroups.back();
6060c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
6070c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    // FIXME: Use BundleGroups to track the lock state instead.
6086948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Sec.setBundleLockState(MCSection::NotBundleLocked);
6090c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
6106948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    // FIXME: Use more separate fragments for nested groups.
6116948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    if (!isBundleLocked()) {
6120c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      mergeFragment(getOrCreateDataFragment(), DF);
6130c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      BundleGroups.pop_back();
6140c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      delete DF;
6150c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    }
6160c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
6176948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    if (Sec.getBundleLockState() != MCSection::BundleLockedAlignToEnd)
6180c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      getOrCreateDataFragment()->setAlignToBundleEnd(false);
6190c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  } else
6206948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Sec.setBundleLockState(MCSection::NotBundleLocked);
6214766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky}
6224766ef41b31e4f97bce1179c3b0398303bf65356Eli Bendersky
6235cc319a42a914b24b164a94d9a563c728a7a4026Richard Mittonvoid MCELFStreamer::FinishImpl() {
6246948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  // Ensure the last section gets aligned if necessary.
6256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  MCSection *CurSection = getCurrentSectionOnly();
6266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  setSectionAlignmentForBundling(getAssembler(), CurSection);
6276948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
628dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  EmitFrames(nullptr);
6295cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton
63099b4237c1647156f0e1d3d7e03efdab23ed79778Rafael Espindola  this->MCObjectStreamer::FinishImpl();
6313565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming}
6325cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton
63336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesMCStreamer *llvm::createELFStreamer(MCContext &Context, MCAsmBackend &MAB,
6340c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar                                    raw_pwrite_stream &OS, MCCodeEmitter *CE,
63537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                    bool RelaxAll) {
63636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  MCELFStreamer *S = new MCELFStreamer(Context, MAB, OS, CE);
6373565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  if (RelaxAll)
6383565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming    S->getAssembler().setRelaxAll(true);
6393565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming  return S;
6403565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming}
641645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien
6426eb3e87df04f8b035562d9865292c23f5b79f1a2Tim Northovervoid MCELFStreamer::EmitThumbFunc(MCSymbol *Func) {
6436eb3e87df04f8b035562d9865292c23f5b79f1a2Tim Northover  llvm_unreachable("Generic ELF doesn't support this directive");
6446eb3e87df04f8b035562d9865292c23f5b79f1a2Tim Northover}
6456eb3e87df04f8b035562d9865292c23f5b79f1a2Tim Northover
646645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chienvoid MCELFStreamer::EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) {
647645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien  llvm_unreachable("ELF doesn't support this directive");
648645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien}
649645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien
650645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chienvoid MCELFStreamer::BeginCOFFSymbolDef(const MCSymbol *Symbol) {
651645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien  llvm_unreachable("ELF doesn't support this directive");
652645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien}
653645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien
654645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chienvoid MCELFStreamer::EmitCOFFSymbolStorageClass(int StorageClass) {
655645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien  llvm_unreachable("ELF doesn't support this directive");
656645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien}
657645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien
658645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chienvoid MCELFStreamer::EmitCOFFSymbolType(int Type) {
659645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien  llvm_unreachable("ELF doesn't support this directive");
660645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien}
661645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien
662645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chienvoid MCELFStreamer::EndCOFFSymbolDef() {
663645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien  llvm_unreachable("ELF doesn't support this directive");
664645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien}
665645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien
6666948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarvoid MCELFStreamer::EmitZerofill(MCSection *Section, MCSymbol *Symbol,
667645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien                                 uint64_t Size, unsigned ByteAlignment) {
668645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien  llvm_unreachable("ELF doesn't support this directive");
669645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien}
670645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien
6716948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarvoid MCELFStreamer::EmitTBSSSymbol(MCSection *Section, MCSymbol *Symbol,
672645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien                                   uint64_t Size, unsigned ByteAlignment) {
673645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien  llvm_unreachable("ELF doesn't support this directive");
674645016533d1208d2e7a17d917d64b8b63c4f9939Logan Chien}
675