MCELFStreamer.cpp revision 256281
1//===- lib/MC/MCELFStreamer.cpp - ELF Object Output -----------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file assembles .s files and emits ELF .o object files.
11//
12//===----------------------------------------------------------------------===//
13
14#include "llvm/MC/MCELFStreamer.h"
15#include "llvm/ADT/SmallPtrSet.h"
16#include "llvm/ADT/STLExtras.h"
17#include "llvm/MC/MCAssembler.h"
18#include "llvm/MC/MCCodeEmitter.h"
19#include "llvm/MC/MCContext.h"
20#include "llvm/MC/MCELF.h"
21#include "llvm/MC/MCELFSymbolFlags.h"
22#include "llvm/MC/MCExpr.h"
23#include "llvm/MC/MCInst.h"
24#include "llvm/MC/MCObjectStreamer.h"
25#include "llvm/MC/MCSection.h"
26#include "llvm/MC/MCSectionELF.h"
27#include "llvm/MC/MCSymbol.h"
28#include "llvm/MC/MCValue.h"
29#include "llvm/Support/Debug.h"
30#include "llvm/Support/ELF.h"
31#include "llvm/Support/ErrorHandling.h"
32#include "llvm/Support/raw_ostream.h"
33
34using namespace llvm;
35
36
37inline void MCELFStreamer::SetSection(StringRef Section, unsigned Type,
38                                      unsigned Flags, SectionKind Kind) {
39  SwitchSection(getContext().getELFSection(Section, Type, Flags, Kind));
40}
41
42inline void MCELFStreamer::SetSectionData() {
43  SetSection(".data",
44             ELF::SHT_PROGBITS,
45             ELF::SHF_WRITE | ELF::SHF_ALLOC,
46             SectionKind::getDataRel());
47  EmitCodeAlignment(4, 0);
48}
49
50inline void MCELFStreamer::SetSectionText() {
51  SetSection(".text",
52             ELF::SHT_PROGBITS,
53             ELF::SHF_EXECINSTR | ELF::SHF_ALLOC,
54             SectionKind::getText());
55  EmitCodeAlignment(4, 0);
56}
57
58inline void MCELFStreamer::SetSectionBss() {
59  SetSection(".bss",
60             ELF::SHT_NOBITS,
61             ELF::SHF_WRITE | ELF::SHF_ALLOC,
62             SectionKind::getBSS());
63  EmitCodeAlignment(4, 0);
64}
65
66MCELFStreamer::~MCELFStreamer() {
67}
68
69void MCELFStreamer::InitToTextSection() {
70  SetSectionText();
71}
72
73void MCELFStreamer::InitSections() {
74  // This emulates the same behavior of GNU as. This makes it easier
75  // to compare the output as the major sections are in the same order.
76  SetSectionText();
77  SetSectionData();
78  SetSectionBss();
79  SetSectionText();
80}
81
82void MCELFStreamer::EmitLabel(MCSymbol *Symbol) {
83  assert(Symbol->isUndefined() && "Cannot define a symbol twice!");
84
85  MCObjectStreamer::EmitLabel(Symbol);
86
87  const MCSectionELF &Section =
88    static_cast<const MCSectionELF&>(Symbol->getSection());
89  MCSymbolData &SD = getAssembler().getSymbolData(*Symbol);
90  if (Section.getFlags() & ELF::SHF_TLS)
91    MCELF::SetType(SD, ELF::STT_TLS);
92}
93
94void MCELFStreamer::EmitDebugLabel(MCSymbol *Symbol) {
95  EmitLabel(Symbol);
96}
97
98void MCELFStreamer::EmitAssemblerFlag(MCAssemblerFlag Flag) {
99  switch (Flag) {
100  case MCAF_SyntaxUnified: return; // no-op here.
101  case MCAF_Code16: return; // Change parsing mode; no-op here.
102  case MCAF_Code32: return; // Change parsing mode; no-op here.
103  case MCAF_Code64: return; // Change parsing mode; no-op here.
104  case MCAF_SubsectionsViaSymbols:
105    getAssembler().setSubsectionsViaSymbols(true);
106    return;
107  }
108
109  llvm_unreachable("invalid assembler flag!");
110}
111
112void MCELFStreamer::ChangeSection(const MCSection *Section,
113                                  const MCExpr *Subsection) {
114  MCSectionData *CurSection = getCurrentSectionData();
115  if (CurSection && CurSection->isBundleLocked())
116    report_fatal_error("Unterminated .bundle_lock when changing a section");
117  const MCSymbol *Grp = static_cast<const MCSectionELF *>(Section)->getGroup();
118  if (Grp)
119    getAssembler().getOrCreateSymbolData(*Grp);
120  this->MCObjectStreamer::ChangeSection(Section, Subsection);
121}
122
123void MCELFStreamer::EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) {
124  getAssembler().getOrCreateSymbolData(*Symbol);
125  MCSymbolData &AliasSD = getAssembler().getOrCreateSymbolData(*Alias);
126  AliasSD.setFlags(AliasSD.getFlags() | ELF_Other_Weakref);
127  const MCExpr *Value = MCSymbolRefExpr::Create(Symbol, getContext());
128  Alias->setVariableValue(Value);
129}
130
131// When GNU as encounters more than one .type declaration for an object it seems
132// to use a mechanism similar to the one below to decide which type is actually
133// used in the object file.  The greater of T1 and T2 is selected based on the
134// following ordering:
135//  STT_NOTYPE < STT_OBJECT < STT_FUNC < STT_GNU_IFUNC < STT_TLS < anything else
136// If neither T1 < T2 nor T2 < T1 according to this ordering, use T2 (the user
137// provided type).
138static unsigned CombineSymbolTypes(unsigned T1, unsigned T2) {
139  unsigned TypeOrdering[] = {ELF::STT_NOTYPE, ELF::STT_OBJECT, ELF::STT_FUNC,
140                             ELF::STT_GNU_IFUNC, ELF::STT_TLS};
141  for (unsigned i = 0; i != array_lengthof(TypeOrdering); ++i) {
142    if (T1 == TypeOrdering[i])
143      return T2;
144    if (T2 == TypeOrdering[i])
145      return T1;
146  }
147
148  return T2;
149}
150
151void MCELFStreamer::EmitSymbolAttribute(MCSymbol *Symbol,
152                                          MCSymbolAttr Attribute) {
153  // Indirect symbols are handled differently, to match how 'as' handles
154  // them. This makes writing matching .o files easier.
155  if (Attribute == MCSA_IndirectSymbol) {
156    // Note that we intentionally cannot use the symbol data here; this is
157    // important for matching the string table that 'as' generates.
158    IndirectSymbolData ISD;
159    ISD.Symbol = Symbol;
160    ISD.SectionData = getCurrentSectionData();
161    getAssembler().getIndirectSymbols().push_back(ISD);
162    return;
163  }
164
165  // Adding a symbol attribute always introduces the symbol, note that an
166  // important side effect of calling getOrCreateSymbolData here is to register
167  // the symbol with the assembler.
168  MCSymbolData &SD = getAssembler().getOrCreateSymbolData(*Symbol);
169
170  // The implementation of symbol attributes is designed to match 'as', but it
171  // leaves much to desired. It doesn't really make sense to arbitrarily add and
172  // remove flags, but 'as' allows this (in particular, see .desc).
173  //
174  // In the future it might be worth trying to make these operations more well
175  // defined.
176  switch (Attribute) {
177  case MCSA_LazyReference:
178  case MCSA_Reference:
179  case MCSA_SymbolResolver:
180  case MCSA_PrivateExtern:
181  case MCSA_WeakDefinition:
182  case MCSA_WeakDefAutoPrivate:
183  case MCSA_Invalid:
184  case MCSA_IndirectSymbol:
185    llvm_unreachable("Invalid symbol attribute for ELF!");
186
187  case MCSA_NoDeadStrip:
188  case MCSA_ELF_TypeGnuUniqueObject:
189    // Ignore for now.
190    break;
191
192  case MCSA_Global:
193    MCELF::SetBinding(SD, ELF::STB_GLOBAL);
194    SD.setExternal(true);
195    BindingExplicitlySet.insert(Symbol);
196    break;
197
198  case MCSA_WeakReference:
199  case MCSA_Weak:
200    MCELF::SetBinding(SD, ELF::STB_WEAK);
201    SD.setExternal(true);
202    BindingExplicitlySet.insert(Symbol);
203    break;
204
205  case MCSA_Local:
206    MCELF::SetBinding(SD, ELF::STB_LOCAL);
207    SD.setExternal(false);
208    BindingExplicitlySet.insert(Symbol);
209    break;
210
211  case MCSA_ELF_TypeFunction:
212    MCELF::SetType(SD, CombineSymbolTypes(MCELF::GetType(SD),
213                                          ELF::STT_FUNC));
214    break;
215
216  case MCSA_ELF_TypeIndFunction:
217    MCELF::SetType(SD, CombineSymbolTypes(MCELF::GetType(SD),
218                                          ELF::STT_GNU_IFUNC));
219    break;
220
221  case MCSA_ELF_TypeObject:
222    MCELF::SetType(SD, CombineSymbolTypes(MCELF::GetType(SD),
223                                          ELF::STT_OBJECT));
224    break;
225
226  case MCSA_ELF_TypeTLS:
227    MCELF::SetType(SD, CombineSymbolTypes(MCELF::GetType(SD),
228                                          ELF::STT_TLS));
229    break;
230
231  case MCSA_ELF_TypeCommon:
232    // TODO: Emit these as a common symbol.
233    MCELF::SetType(SD, CombineSymbolTypes(MCELF::GetType(SD),
234                                          ELF::STT_OBJECT));
235    break;
236
237  case MCSA_ELF_TypeNoType:
238    MCELF::SetType(SD, CombineSymbolTypes(MCELF::GetType(SD),
239                                          ELF::STT_NOTYPE));
240    break;
241
242  case MCSA_Protected:
243    MCELF::SetVisibility(SD, ELF::STV_PROTECTED);
244    break;
245
246  case MCSA_Hidden:
247    MCELF::SetVisibility(SD, ELF::STV_HIDDEN);
248    break;
249
250  case MCSA_Internal:
251    MCELF::SetVisibility(SD, ELF::STV_INTERNAL);
252    break;
253  }
254}
255
256void MCELFStreamer::EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size,
257                                       unsigned ByteAlignment) {
258  MCSymbolData &SD = getAssembler().getOrCreateSymbolData(*Symbol);
259
260  if (!BindingExplicitlySet.count(Symbol)) {
261    MCELF::SetBinding(SD, ELF::STB_GLOBAL);
262    SD.setExternal(true);
263  }
264
265  MCELF::SetType(SD, ELF::STT_OBJECT);
266
267  if (MCELF::GetBinding(SD) == ELF_STB_Local) {
268    const MCSection *Section = getAssembler().getContext().getELFSection(".bss",
269                                                         ELF::SHT_NOBITS,
270                                                         ELF::SHF_WRITE |
271                                                         ELF::SHF_ALLOC,
272                                                         SectionKind::getBSS());
273    Symbol->setSection(*Section);
274
275    struct LocalCommon L = {&SD, Size, ByteAlignment};
276    LocalCommons.push_back(L);
277  } else {
278    SD.setCommon(Size, ByteAlignment);
279  }
280
281  SD.setSize(MCConstantExpr::Create(Size, getContext()));
282}
283
284void MCELFStreamer::EmitELFSize(MCSymbol *Symbol, const MCExpr *Value) {
285  MCSymbolData &SD = getAssembler().getOrCreateSymbolData(*Symbol);
286  SD.setSize(Value);
287}
288
289void MCELFStreamer::EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size,
290                                          unsigned ByteAlignment) {
291  // FIXME: Should this be caught and done earlier?
292  MCSymbolData &SD = getAssembler().getOrCreateSymbolData(*Symbol);
293  MCELF::SetBinding(SD, ELF::STB_LOCAL);
294  SD.setExternal(false);
295  BindingExplicitlySet.insert(Symbol);
296  EmitCommonSymbol(Symbol, Size, ByteAlignment);
297}
298
299void MCELFStreamer::EmitValueImpl(const MCExpr *Value, unsigned Size,
300                                  unsigned AddrSpace) {
301  if (getCurrentSectionData()->isBundleLocked())
302    report_fatal_error("Emitting values inside a locked bundle is forbidden");
303  fixSymbolsInTLSFixups(Value);
304  MCObjectStreamer::EmitValueImpl(Value, Size, AddrSpace);
305}
306
307void MCELFStreamer::EmitValueToAlignment(unsigned ByteAlignment,
308                                         int64_t Value,
309                                         unsigned ValueSize,
310                                         unsigned MaxBytesToEmit) {
311  if (getCurrentSectionData()->isBundleLocked())
312    report_fatal_error("Emitting values inside a locked bundle is forbidden");
313  MCObjectStreamer::EmitValueToAlignment(ByteAlignment, Value,
314                                         ValueSize, MaxBytesToEmit);
315}
316
317
318// Add a symbol for the file name of this module. This is the second
319// entry in the module's symbol table (the first being the null symbol).
320void MCELFStreamer::EmitFileDirective(StringRef Filename) {
321  MCSymbol *Symbol = getAssembler().getContext().GetOrCreateSymbol(Filename);
322  Symbol->setSection(*getCurrentSection().first);
323  Symbol->setAbsolute();
324
325  MCSymbolData &SD = getAssembler().getOrCreateSymbolData(*Symbol);
326
327  SD.setFlags(ELF_STT_File | ELF_STB_Local | ELF_STV_Default);
328}
329
330void  MCELFStreamer::fixSymbolsInTLSFixups(const MCExpr *expr) {
331  switch (expr->getKind()) {
332  case MCExpr::Target:
333    cast<MCTargetExpr>(expr)->fixELFSymbolsInTLSFixups(getAssembler());
334    break;
335  case MCExpr::Constant:
336    break;
337
338  case MCExpr::Binary: {
339    const MCBinaryExpr *be = cast<MCBinaryExpr>(expr);
340    fixSymbolsInTLSFixups(be->getLHS());
341    fixSymbolsInTLSFixups(be->getRHS());
342    break;
343  }
344
345  case MCExpr::SymbolRef: {
346    const MCSymbolRefExpr &symRef = *cast<MCSymbolRefExpr>(expr);
347    switch (symRef.getKind()) {
348    default:
349      return;
350    case MCSymbolRefExpr::VK_GOTTPOFF:
351    case MCSymbolRefExpr::VK_INDNTPOFF:
352    case MCSymbolRefExpr::VK_NTPOFF:
353    case MCSymbolRefExpr::VK_GOTNTPOFF:
354    case MCSymbolRefExpr::VK_TLSGD:
355    case MCSymbolRefExpr::VK_TLSLD:
356    case MCSymbolRefExpr::VK_TLSLDM:
357    case MCSymbolRefExpr::VK_TPOFF:
358    case MCSymbolRefExpr::VK_DTPOFF:
359    case MCSymbolRefExpr::VK_ARM_TLSGD:
360    case MCSymbolRefExpr::VK_ARM_TPOFF:
361    case MCSymbolRefExpr::VK_ARM_GOTTPOFF:
362    case MCSymbolRefExpr::VK_Mips_TLSGD:
363    case MCSymbolRefExpr::VK_Mips_GOTTPREL:
364    case MCSymbolRefExpr::VK_Mips_TPREL_HI:
365    case MCSymbolRefExpr::VK_Mips_TPREL_LO:
366    case MCSymbolRefExpr::VK_PPC_TPREL16_HA:
367    case MCSymbolRefExpr::VK_PPC_TPREL16_LO:
368    case MCSymbolRefExpr::VK_PPC_DTPREL16_HA:
369    case MCSymbolRefExpr::VK_PPC_DTPREL16_LO:
370    case MCSymbolRefExpr::VK_PPC_GOT_TPREL16_HA:
371    case MCSymbolRefExpr::VK_PPC_GOT_TPREL16_LO:
372    case MCSymbolRefExpr::VK_PPC_TLS:
373    case MCSymbolRefExpr::VK_PPC_GOT_TLSGD16_HA:
374    case MCSymbolRefExpr::VK_PPC_GOT_TLSGD16_LO:
375    case MCSymbolRefExpr::VK_PPC_TLSGD:
376    case MCSymbolRefExpr::VK_PPC_GOT_TLSLD16_HA:
377    case MCSymbolRefExpr::VK_PPC_GOT_TLSLD16_LO:
378    case MCSymbolRefExpr::VK_PPC_TLSLD:
379      break;
380    }
381    MCSymbolData &SD = getAssembler().getOrCreateSymbolData(symRef.getSymbol());
382    MCELF::SetType(SD, ELF::STT_TLS);
383    break;
384  }
385
386  case MCExpr::Unary:
387    fixSymbolsInTLSFixups(cast<MCUnaryExpr>(expr)->getSubExpr());
388    break;
389  }
390}
391
392void MCELFStreamer::EmitInstToFragment(const MCInst &Inst) {
393  this->MCObjectStreamer::EmitInstToFragment(Inst);
394  MCRelaxableFragment &F = *cast<MCRelaxableFragment>(getCurrentFragment());
395
396  for (unsigned i = 0, e = F.getFixups().size(); i != e; ++i)
397    fixSymbolsInTLSFixups(F.getFixups()[i].getValue());
398}
399
400void MCELFStreamer::EmitInstToData(const MCInst &Inst) {
401  MCAssembler &Assembler = getAssembler();
402  SmallVector<MCFixup, 4> Fixups;
403  SmallString<256> Code;
404  raw_svector_ostream VecOS(Code);
405  Assembler.getEmitter().EncodeInstruction(Inst, VecOS, Fixups);
406  VecOS.flush();
407
408  for (unsigned i = 0, e = Fixups.size(); i != e; ++i)
409    fixSymbolsInTLSFixups(Fixups[i].getValue());
410
411  // There are several possibilities here:
412  //
413  // If bundling is disabled, append the encoded instruction to the current data
414  // fragment (or create a new such fragment if the current fragment is not a
415  // data fragment).
416  //
417  // If bundling is enabled:
418  // - If we're not in a bundle-locked group, emit the instruction into a
419  //   fragment of its own. If there are no fixups registered for the
420  //   instruction, emit a MCCompactEncodedInstFragment. Otherwise, emit a
421  //   MCDataFragment.
422  // - If we're in a bundle-locked group, append the instruction to the current
423  //   data fragment because we want all the instructions in a group to get into
424  //   the same fragment. Be careful not to do that for the first instruction in
425  //   the group, though.
426  MCDataFragment *DF;
427
428  if (Assembler.isBundlingEnabled()) {
429    MCSectionData *SD = getCurrentSectionData();
430    if (SD->isBundleLocked() && !SD->isBundleGroupBeforeFirstInst())
431      // If we are bundle-locked, we re-use the current fragment.
432      // The bundle-locking directive ensures this is a new data fragment.
433      DF = cast<MCDataFragment>(getCurrentFragment());
434    else if (!SD->isBundleLocked() && Fixups.size() == 0) {
435      // Optimize memory usage by emitting the instruction to a
436      // MCCompactEncodedInstFragment when not in a bundle-locked group and
437      // there are no fixups registered.
438      MCCompactEncodedInstFragment *CEIF = new MCCompactEncodedInstFragment();
439      insert(CEIF);
440      CEIF->getContents().append(Code.begin(), Code.end());
441      return;
442    } else {
443      DF = new MCDataFragment();
444      insert(DF);
445      if (SD->getBundleLockState() == MCSectionData::BundleLockedAlignToEnd) {
446        // If this is a new fragment created for a bundle-locked group, and the
447        // group was marked as "align_to_end", set a flag in the fragment.
448        DF->setAlignToBundleEnd(true);
449      }
450    }
451
452    // We're now emitting an instruction in a bundle group, so this flag has
453    // to be turned off.
454    SD->setBundleGroupBeforeFirstInst(false);
455  } else {
456    DF = getOrCreateDataFragment();
457  }
458
459  // Add the fixups and data.
460  for (unsigned i = 0, e = Fixups.size(); i != e; ++i) {
461    Fixups[i].setOffset(Fixups[i].getOffset() + DF->getContents().size());
462    DF->getFixups().push_back(Fixups[i]);
463  }
464  DF->setHasInstructions(true);
465  DF->getContents().append(Code.begin(), Code.end());
466}
467
468void MCELFStreamer::EmitBundleAlignMode(unsigned AlignPow2) {
469  assert(AlignPow2 <= 30 && "Invalid bundle alignment");
470  MCAssembler &Assembler = getAssembler();
471  if (Assembler.getBundleAlignSize() == 0 && AlignPow2 > 0)
472    Assembler.setBundleAlignSize(1 << AlignPow2);
473  else
474    report_fatal_error(".bundle_align_mode should be only set once per file");
475}
476
477void MCELFStreamer::EmitBundleLock(bool AlignToEnd) {
478  MCSectionData *SD = getCurrentSectionData();
479
480  // Sanity checks
481  //
482  if (!getAssembler().isBundlingEnabled())
483    report_fatal_error(".bundle_lock forbidden when bundling is disabled");
484  else if (SD->isBundleLocked())
485    report_fatal_error("Nesting of .bundle_lock is forbidden");
486
487  SD->setBundleLockState(AlignToEnd ? MCSectionData::BundleLockedAlignToEnd :
488                                      MCSectionData::BundleLocked);
489  SD->setBundleGroupBeforeFirstInst(true);
490}
491
492void MCELFStreamer::EmitBundleUnlock() {
493  MCSectionData *SD = getCurrentSectionData();
494
495  // Sanity checks
496  if (!getAssembler().isBundlingEnabled())
497    report_fatal_error(".bundle_unlock forbidden when bundling is disabled");
498  else if (!SD->isBundleLocked())
499    report_fatal_error(".bundle_unlock without matching lock");
500  else if (SD->isBundleGroupBeforeFirstInst())
501    report_fatal_error("Empty bundle-locked group is forbidden");
502
503  SD->setBundleLockState(MCSectionData::NotBundleLocked);
504}
505
506void MCELFStreamer::FinishImpl() {
507  EmitFrames(true);
508
509  for (std::vector<LocalCommon>::const_iterator i = LocalCommons.begin(),
510                                                e = LocalCommons.end();
511       i != e; ++i) {
512    MCSymbolData *SD = i->SD;
513    uint64_t Size = i->Size;
514    unsigned ByteAlignment = i->ByteAlignment;
515    const MCSymbol &Symbol = SD->getSymbol();
516    const MCSection &Section = Symbol.getSection();
517
518    MCSectionData &SectData = getAssembler().getOrCreateSectionData(Section);
519    new MCAlignFragment(ByteAlignment, 0, 1, ByteAlignment, &SectData);
520
521    MCFragment *F = new MCFillFragment(0, 0, Size, &SectData);
522    SD->setFragment(F);
523
524    // Update the maximum alignment of the section if necessary.
525    if (ByteAlignment > SectData.getAlignment())
526      SectData.setAlignment(ByteAlignment);
527  }
528
529  this->MCObjectStreamer::FinishImpl();
530}
531void MCELFStreamer::EmitTCEntry(const MCSymbol &S) {
532  // Creates a R_PPC64_TOC relocation
533  MCObjectStreamer::EmitSymbolValue(&S, 8);
534}
535
536MCStreamer *llvm::createELFStreamer(MCContext &Context, MCAsmBackend &MAB,
537                                    raw_ostream &OS, MCCodeEmitter *CE,
538                                    bool RelaxAll, bool NoExecStack) {
539  MCELFStreamer *S = new MCELFStreamer(Context, MAB, OS, CE);
540  if (RelaxAll)
541    S->getAssembler().setRelaxAll(true);
542  if (NoExecStack)
543    S->getAssembler().setNoExecStack(true);
544  return S;
545}
546
547void MCELFStreamer::EmitThumbFunc(MCSymbol *Func) {
548  llvm_unreachable("Generic ELF doesn't support this directive");
549}
550
551MCSymbolData &MCELFStreamer::getOrCreateSymbolData(MCSymbol *Symbol) {
552  return getAssembler().getOrCreateSymbolData(*Symbol);
553}
554
555void MCELFStreamer::EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) {
556  llvm_unreachable("ELF doesn't support this directive");
557}
558
559void MCELFStreamer::BeginCOFFSymbolDef(const MCSymbol *Symbol) {
560  llvm_unreachable("ELF doesn't support this directive");
561}
562
563void MCELFStreamer::EmitCOFFSymbolStorageClass(int StorageClass) {
564  llvm_unreachable("ELF doesn't support this directive");
565}
566
567void MCELFStreamer::EmitCOFFSymbolType(int Type) {
568  llvm_unreachable("ELF doesn't support this directive");
569}
570
571void MCELFStreamer::EndCOFFSymbolDef() {
572  llvm_unreachable("ELF doesn't support this directive");
573}
574
575void MCELFStreamer::EmitZerofill(const MCSection *Section, MCSymbol *Symbol,
576                                 uint64_t Size, unsigned ByteAlignment) {
577  llvm_unreachable("ELF doesn't support this directive");
578}
579
580void MCELFStreamer::EmitTBSSSymbol(const MCSection *Section, MCSymbol *Symbol,
581                                   uint64_t Size, unsigned ByteAlignment) {
582  llvm_unreachable("ELF doesn't support this directive");
583}
584