1 //===- lib/MC/MCELFStreamer.cpp - ELF Object Output -----------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // This file assembles .s files and emits ELF .o object files.
11 //===----------------------------------------------------------------------===//
13 #include "llvm/MC/MCELFStreamer.h"
14 #include "llvm/ADT/SmallString.h"
15 #include "llvm/ADT/SmallVector.h"
16 #include "llvm/BinaryFormat/ELF.h"
17 #include "llvm/MC/MCAsmBackend.h"
18 #include "llvm/MC/MCAsmInfo.h"
19 #include "llvm/MC/MCAssembler.h"
20 #include "llvm/MC/MCCodeEmitter.h"
21 #include "llvm/MC/MCContext.h"
22 #include "llvm/MC/MCExpr.h"
23 #include "llvm/MC/MCFixup.h"
24 #include "llvm/MC/MCFragment.h"
25 #include "llvm/MC/MCObjectFileInfo.h"
26 #include "llvm/MC/MCObjectWriter.h"
27 #include "llvm/MC/MCSection.h"
28 #include "llvm/MC/MCSectionELF.h"
29 #include "llvm/MC/MCStreamer.h"
30 #include "llvm/MC/MCSymbol.h"
31 #include "llvm/MC/MCSymbolELF.h"
32 #include "llvm/Support/Casting.h"
33 #include "llvm/Support/ErrorHandling.h"
34 #include "llvm/Support/TargetRegistry.h"
35 #include "llvm/Support/raw_ostream.h"
41 MCELFStreamer::MCELFStreamer(MCContext
&Context
,
42 std::unique_ptr
<MCAsmBackend
> TAB
,
43 std::unique_ptr
<MCObjectWriter
> OW
,
44 std::unique_ptr
<MCCodeEmitter
> Emitter
)
45 : MCObjectStreamer(Context
, std::move(TAB
), std::move(OW
),
46 std::move(Emitter
)) {}
48 bool MCELFStreamer::isBundleLocked() const {
49 return getCurrentSectionOnly()->isBundleLocked();
52 void MCELFStreamer::mergeFragment(MCDataFragment
*DF
,
54 MCAssembler
&Assembler
= getAssembler();
56 if (Assembler
.isBundlingEnabled() && Assembler
.getRelaxAll()) {
57 uint64_t FSize
= EF
->getContents().size();
59 if (FSize
> Assembler
.getBundleAlignSize())
60 report_fatal_error("Fragment can't be larger than a bundle size");
62 uint64_t RequiredBundlePadding
= computeBundlePadding(
63 Assembler
, EF
, DF
->getContents().size(), FSize
);
65 if (RequiredBundlePadding
> UINT8_MAX
)
66 report_fatal_error("Padding cannot exceed 255 bytes");
68 if (RequiredBundlePadding
> 0) {
69 SmallString
<256> Code
;
70 raw_svector_ostream
VecOS(Code
);
71 EF
->setBundlePadding(static_cast<uint8_t>(RequiredBundlePadding
));
72 Assembler
.writeFragmentPadding(VecOS
, *EF
, FSize
);
74 DF
->getContents().append(Code
.begin(), Code
.end());
78 flushPendingLabels(DF
, DF
->getContents().size());
80 for (unsigned i
= 0, e
= EF
->getFixups().size(); i
!= e
; ++i
) {
81 EF
->getFixups()[i
].setOffset(EF
->getFixups()[i
].getOffset() +
82 DF
->getContents().size());
83 DF
->getFixups().push_back(EF
->getFixups()[i
]);
85 if (DF
->getSubtargetInfo() == nullptr && EF
->getSubtargetInfo())
86 DF
->setHasInstructions(*EF
->getSubtargetInfo());
87 DF
->getContents().append(EF
->getContents().begin(), EF
->getContents().end());
90 void MCELFStreamer::InitSections(bool NoExecStack
) {
91 MCContext
&Ctx
= getContext();
92 SwitchSection(Ctx
.getObjectFileInfo()->getTextSection());
96 SwitchSection(Ctx
.getAsmInfo()->getNonexecutableStackSection(Ctx
));
99 void MCELFStreamer::EmitLabel(MCSymbol
*S
, SMLoc Loc
) {
100 auto *Symbol
= cast
<MCSymbolELF
>(S
);
101 MCObjectStreamer::EmitLabel(Symbol
, Loc
);
103 const MCSectionELF
&Section
=
104 static_cast<const MCSectionELF
&>(*getCurrentSectionOnly());
105 if (Section
.getFlags() & ELF::SHF_TLS
)
106 Symbol
->setType(ELF::STT_TLS
);
109 void MCELFStreamer::EmitLabel(MCSymbol
*S
, SMLoc Loc
, MCFragment
*F
) {
110 auto *Symbol
= cast
<MCSymbolELF
>(S
);
111 MCObjectStreamer::EmitLabel(Symbol
, Loc
, F
);
113 const MCSectionELF
&Section
=
114 static_cast<const MCSectionELF
&>(*getCurrentSectionOnly());
115 if (Section
.getFlags() & ELF::SHF_TLS
)
116 Symbol
->setType(ELF::STT_TLS
);
119 void MCELFStreamer::EmitAssemblerFlag(MCAssemblerFlag Flag
) {
120 // Let the target do whatever target specific stuff it needs to do.
121 getAssembler().getBackend().handleAssemblerFlag(Flag
);
122 // Do any generic stuff we need to do.
124 case MCAF_SyntaxUnified
: return; // no-op here.
125 case MCAF_Code16
: return; // Change parsing mode; no-op here.
126 case MCAF_Code32
: return; // Change parsing mode; no-op here.
127 case MCAF_Code64
: return; // Change parsing mode; no-op here.
128 case MCAF_SubsectionsViaSymbols
:
129 getAssembler().setSubsectionsViaSymbols(true);
133 llvm_unreachable("invalid assembler flag!");
136 // If bundle alignment is used and there are any instructions in the section, it
137 // needs to be aligned to at least the bundle size.
138 static void setSectionAlignmentForBundling(const MCAssembler
&Assembler
,
139 MCSection
*Section
) {
140 if (Section
&& Assembler
.isBundlingEnabled() && Section
->hasInstructions() &&
141 Section
->getAlignment() < Assembler
.getBundleAlignSize())
142 Section
->setAlignment(Assembler
.getBundleAlignSize());
145 void MCELFStreamer::ChangeSection(MCSection
*Section
,
146 const MCExpr
*Subsection
) {
147 MCSection
*CurSection
= getCurrentSectionOnly();
148 if (CurSection
&& isBundleLocked())
149 report_fatal_error("Unterminated .bundle_lock when changing a section");
151 MCAssembler
&Asm
= getAssembler();
152 // Ensure the previous section gets aligned if necessary.
153 setSectionAlignmentForBundling(Asm
, CurSection
);
154 auto *SectionELF
= static_cast<const MCSectionELF
*>(Section
);
155 const MCSymbol
*Grp
= SectionELF
->getGroup();
157 Asm
.registerSymbol(*Grp
);
159 changeSectionImpl(Section
, Subsection
);
160 Asm
.registerSymbol(*Section
->getBeginSymbol());
163 void MCELFStreamer::EmitWeakReference(MCSymbol
*Alias
, const MCSymbol
*Symbol
) {
164 getAssembler().registerSymbol(*Symbol
);
165 const MCExpr
*Value
= MCSymbolRefExpr::create(
166 Symbol
, MCSymbolRefExpr::VK_WEAKREF
, getContext());
167 Alias
->setVariableValue(Value
);
170 // When GNU as encounters more than one .type declaration for an object it seems
171 // to use a mechanism similar to the one below to decide which type is actually
172 // used in the object file. The greater of T1 and T2 is selected based on the
173 // following ordering:
174 // STT_NOTYPE < STT_OBJECT < STT_FUNC < STT_GNU_IFUNC < STT_TLS < anything else
175 // If neither T1 < T2 nor T2 < T1 according to this ordering, use T2 (the user
177 static unsigned CombineSymbolTypes(unsigned T1
, unsigned T2
) {
178 for (unsigned Type
: {ELF::STT_NOTYPE
, ELF::STT_OBJECT
, ELF::STT_FUNC
,
179 ELF::STT_GNU_IFUNC
, ELF::STT_TLS
}) {
189 bool MCELFStreamer::EmitSymbolAttribute(MCSymbol
*S
, MCSymbolAttr Attribute
) {
190 auto *Symbol
= cast
<MCSymbolELF
>(S
);
192 // Adding a symbol attribute always introduces the symbol, note that an
193 // important side effect of calling registerSymbol here is to register
194 // the symbol with the assembler.
195 getAssembler().registerSymbol(*Symbol
);
197 // The implementation of symbol attributes is designed to match 'as', but it
198 // leaves much to desired. It doesn't really make sense to arbitrarily add and
199 // remove flags, but 'as' allows this (in particular, see .desc).
201 // In the future it might be worth trying to make these operations more well
205 case MCSA_LazyReference
:
207 case MCSA_SymbolResolver
:
208 case MCSA_PrivateExtern
:
209 case MCSA_WeakDefinition
:
210 case MCSA_WeakDefAutoPrivate
:
212 case MCSA_IndirectSymbol
:
215 case MCSA_NoDeadStrip
:
219 case MCSA_ELF_TypeGnuUniqueObject
:
220 Symbol
->setType(CombineSymbolTypes(Symbol
->getType(), ELF::STT_OBJECT
));
221 Symbol
->setBinding(ELF::STB_GNU_UNIQUE
);
222 Symbol
->setExternal(true);
226 Symbol
->setBinding(ELF::STB_GLOBAL
);
227 Symbol
->setExternal(true);
230 case MCSA_WeakReference
:
232 Symbol
->setBinding(ELF::STB_WEAK
);
233 Symbol
->setExternal(true);
237 Symbol
->setBinding(ELF::STB_LOCAL
);
238 Symbol
->setExternal(false);
241 case MCSA_ELF_TypeFunction
:
242 Symbol
->setType(CombineSymbolTypes(Symbol
->getType(), ELF::STT_FUNC
));
245 case MCSA_ELF_TypeIndFunction
:
246 Symbol
->setType(CombineSymbolTypes(Symbol
->getType(), ELF::STT_GNU_IFUNC
));
249 case MCSA_ELF_TypeObject
:
250 Symbol
->setType(CombineSymbolTypes(Symbol
->getType(), ELF::STT_OBJECT
));
253 case MCSA_ELF_TypeTLS
:
254 Symbol
->setType(CombineSymbolTypes(Symbol
->getType(), ELF::STT_TLS
));
257 case MCSA_ELF_TypeCommon
:
258 // TODO: Emit these as a common symbol.
259 Symbol
->setType(CombineSymbolTypes(Symbol
->getType(), ELF::STT_OBJECT
));
262 case MCSA_ELF_TypeNoType
:
263 Symbol
->setType(CombineSymbolTypes(Symbol
->getType(), ELF::STT_NOTYPE
));
267 Symbol
->setVisibility(ELF::STV_PROTECTED
);
271 Symbol
->setVisibility(ELF::STV_HIDDEN
);
275 Symbol
->setVisibility(ELF::STV_INTERNAL
);
279 llvm_unreachable("ELF doesn't support the .alt_entry attribute");
285 void MCELFStreamer::EmitCommonSymbol(MCSymbol
*S
, uint64_t Size
,
286 unsigned ByteAlignment
) {
287 auto *Symbol
= cast
<MCSymbolELF
>(S
);
288 getAssembler().registerSymbol(*Symbol
);
290 if (!Symbol
->isBindingSet()) {
291 Symbol
->setBinding(ELF::STB_GLOBAL
);
292 Symbol
->setExternal(true);
295 Symbol
->setType(ELF::STT_OBJECT
);
297 if (Symbol
->getBinding() == ELF::STB_LOCAL
) {
298 MCSection
&Section
= *getAssembler().getContext().getELFSection(
299 ".bss", ELF::SHT_NOBITS
, ELF::SHF_WRITE
| ELF::SHF_ALLOC
);
300 MCSectionSubPair P
= getCurrentSection();
301 SwitchSection(&Section
);
303 EmitValueToAlignment(ByteAlignment
, 0, 1, 0);
307 // Update the maximum alignment of the section if necessary.
308 if (ByteAlignment
> Section
.getAlignment())
309 Section
.setAlignment(ByteAlignment
);
311 SwitchSection(P
.first
, P
.second
);
313 if(Symbol
->declareCommon(Size
, ByteAlignment
))
314 report_fatal_error("Symbol: " + Symbol
->getName() +
315 " redeclared as different type");
318 cast
<MCSymbolELF
>(Symbol
)
319 ->setSize(MCConstantExpr::create(Size
, getContext()));
322 void MCELFStreamer::emitELFSize(MCSymbol
*Symbol
, const MCExpr
*Value
) {
323 cast
<MCSymbolELF
>(Symbol
)->setSize(Value
);
326 void MCELFStreamer::emitELFSymverDirective(StringRef AliasName
,
327 const MCSymbol
*Aliasee
) {
328 getAssembler().Symvers
.push_back({AliasName
, Aliasee
});
331 void MCELFStreamer::EmitLocalCommonSymbol(MCSymbol
*S
, uint64_t Size
,
332 unsigned ByteAlignment
) {
333 auto *Symbol
= cast
<MCSymbolELF
>(S
);
334 // FIXME: Should this be caught and done earlier?
335 getAssembler().registerSymbol(*Symbol
);
336 Symbol
->setBinding(ELF::STB_LOCAL
);
337 Symbol
->setExternal(false);
338 EmitCommonSymbol(Symbol
, Size
, ByteAlignment
);
341 void MCELFStreamer::EmitValueImpl(const MCExpr
*Value
, unsigned Size
,
343 if (isBundleLocked())
344 report_fatal_error("Emitting values inside a locked bundle is forbidden");
345 fixSymbolsInTLSFixups(Value
);
346 MCObjectStreamer::EmitValueImpl(Value
, Size
, Loc
);
349 void MCELFStreamer::EmitValueToAlignment(unsigned ByteAlignment
,
352 unsigned MaxBytesToEmit
) {
353 if (isBundleLocked())
354 report_fatal_error("Emitting values inside a locked bundle is forbidden");
355 MCObjectStreamer::EmitValueToAlignment(ByteAlignment
, Value
,
356 ValueSize
, MaxBytesToEmit
);
359 void MCELFStreamer::emitCGProfileEntry(const MCSymbolRefExpr
*From
,
360 const MCSymbolRefExpr
*To
,
362 getAssembler().CGProfile
.push_back({From
, To
, Count
});
365 void MCELFStreamer::EmitIdent(StringRef IdentString
) {
366 MCSection
*Comment
= getAssembler().getContext().getELFSection(
367 ".comment", ELF::SHT_PROGBITS
, ELF::SHF_MERGE
| ELF::SHF_STRINGS
, 1, "");
369 SwitchSection(Comment
);
374 EmitBytes(IdentString
);
379 void MCELFStreamer::fixSymbolsInTLSFixups(const MCExpr
*expr
) {
380 switch (expr
->getKind()) {
382 cast
<MCTargetExpr
>(expr
)->fixELFSymbolsInTLSFixups(getAssembler());
384 case MCExpr::Constant
:
387 case MCExpr::Binary
: {
388 const MCBinaryExpr
*be
= cast
<MCBinaryExpr
>(expr
);
389 fixSymbolsInTLSFixups(be
->getLHS());
390 fixSymbolsInTLSFixups(be
->getRHS());
394 case MCExpr::SymbolRef
: {
395 const MCSymbolRefExpr
&symRef
= *cast
<MCSymbolRefExpr
>(expr
);
396 switch (symRef
.getKind()) {
399 case MCSymbolRefExpr::VK_GOTTPOFF
:
400 case MCSymbolRefExpr::VK_INDNTPOFF
:
401 case MCSymbolRefExpr::VK_NTPOFF
:
402 case MCSymbolRefExpr::VK_GOTNTPOFF
:
403 case MCSymbolRefExpr::VK_TLSCALL
:
404 case MCSymbolRefExpr::VK_TLSDESC
:
405 case MCSymbolRefExpr::VK_TLSGD
:
406 case MCSymbolRefExpr::VK_TLSLD
:
407 case MCSymbolRefExpr::VK_TLSLDM
:
408 case MCSymbolRefExpr::VK_TPOFF
:
409 case MCSymbolRefExpr::VK_TPREL
:
410 case MCSymbolRefExpr::VK_DTPOFF
:
411 case MCSymbolRefExpr::VK_DTPREL
:
412 case MCSymbolRefExpr::VK_PPC_DTPMOD
:
413 case MCSymbolRefExpr::VK_PPC_TPREL_LO
:
414 case MCSymbolRefExpr::VK_PPC_TPREL_HI
:
415 case MCSymbolRefExpr::VK_PPC_TPREL_HA
:
416 case MCSymbolRefExpr::VK_PPC_TPREL_HIGH
:
417 case MCSymbolRefExpr::VK_PPC_TPREL_HIGHA
:
418 case MCSymbolRefExpr::VK_PPC_TPREL_HIGHER
:
419 case MCSymbolRefExpr::VK_PPC_TPREL_HIGHERA
:
420 case MCSymbolRefExpr::VK_PPC_TPREL_HIGHEST
:
421 case MCSymbolRefExpr::VK_PPC_TPREL_HIGHESTA
:
422 case MCSymbolRefExpr::VK_PPC_DTPREL_LO
:
423 case MCSymbolRefExpr::VK_PPC_DTPREL_HI
:
424 case MCSymbolRefExpr::VK_PPC_DTPREL_HA
:
425 case MCSymbolRefExpr::VK_PPC_DTPREL_HIGH
:
426 case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHA
:
427 case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHER
:
428 case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHERA
:
429 case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHEST
:
430 case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHESTA
:
431 case MCSymbolRefExpr::VK_PPC_GOT_TPREL
:
432 case MCSymbolRefExpr::VK_PPC_GOT_TPREL_LO
:
433 case MCSymbolRefExpr::VK_PPC_GOT_TPREL_HI
:
434 case MCSymbolRefExpr::VK_PPC_GOT_TPREL_HA
:
435 case MCSymbolRefExpr::VK_PPC_GOT_DTPREL
:
436 case MCSymbolRefExpr::VK_PPC_GOT_DTPREL_LO
:
437 case MCSymbolRefExpr::VK_PPC_GOT_DTPREL_HI
:
438 case MCSymbolRefExpr::VK_PPC_GOT_DTPREL_HA
:
439 case MCSymbolRefExpr::VK_PPC_TLS
:
440 case MCSymbolRefExpr::VK_PPC_GOT_TLSGD
:
441 case MCSymbolRefExpr::VK_PPC_GOT_TLSGD_LO
:
442 case MCSymbolRefExpr::VK_PPC_GOT_TLSGD_HI
:
443 case MCSymbolRefExpr::VK_PPC_GOT_TLSGD_HA
:
444 case MCSymbolRefExpr::VK_PPC_TLSGD
:
445 case MCSymbolRefExpr::VK_PPC_GOT_TLSLD
:
446 case MCSymbolRefExpr::VK_PPC_GOT_TLSLD_LO
:
447 case MCSymbolRefExpr::VK_PPC_GOT_TLSLD_HI
:
448 case MCSymbolRefExpr::VK_PPC_GOT_TLSLD_HA
:
449 case MCSymbolRefExpr::VK_PPC_TLSLD
:
452 getAssembler().registerSymbol(symRef
.getSymbol());
453 cast
<MCSymbolELF
>(symRef
.getSymbol()).setType(ELF::STT_TLS
);
458 fixSymbolsInTLSFixups(cast
<MCUnaryExpr
>(expr
)->getSubExpr());
463 void MCELFStreamer::finalizeCGProfileEntry(const MCSymbolRefExpr
*&SRE
) {
464 const MCSymbol
*S
= &SRE
->getSymbol();
465 if (S
->isTemporary()) {
466 if (!S
->isInSection()) {
467 getContext().reportError(
468 SRE
->getLoc(), Twine("Reference to undefined temporary symbol ") +
469 "`" + S
->getName() + "`");
472 S
= S
->getSection().getBeginSymbol();
475 MCSymbolRefExpr::create(S
, SRE
->getKind(), getContext(), SRE
->getLoc());
478 // Not a temporary, referece it as a weak undefined.
480 getAssembler().registerSymbol(*S
, &Created
);
482 cast
<MCSymbolELF
>(S
)->setBinding(ELF::STB_WEAK
);
483 cast
<MCSymbolELF
>(S
)->setExternal(true);
487 void MCELFStreamer::finalizeCGProfile() {
488 for (MCAssembler::CGProfileEntry
&E
: getAssembler().CGProfile
) {
489 finalizeCGProfileEntry(E
.From
);
490 finalizeCGProfileEntry(E
.To
);
494 void MCELFStreamer::EmitInstToFragment(const MCInst
&Inst
,
495 const MCSubtargetInfo
&STI
) {
496 this->MCObjectStreamer::EmitInstToFragment(Inst
, STI
);
497 MCRelaxableFragment
&F
= *cast
<MCRelaxableFragment
>(getCurrentFragment());
499 for (unsigned i
= 0, e
= F
.getFixups().size(); i
!= e
; ++i
)
500 fixSymbolsInTLSFixups(F
.getFixups()[i
].getValue());
503 // A fragment can only have one Subtarget, and when bundling is enabled we
504 // sometimes need to use the same fragment. We give an error if there
505 // are conflicting Subtargets.
506 static void CheckBundleSubtargets(const MCSubtargetInfo
*OldSTI
,
507 const MCSubtargetInfo
*NewSTI
) {
508 if (OldSTI
&& NewSTI
&& OldSTI
!= NewSTI
)
509 report_fatal_error("A Bundle can only have one Subtarget.");
512 void MCELFStreamer::EmitInstToData(const MCInst
&Inst
,
513 const MCSubtargetInfo
&STI
) {
514 MCAssembler
&Assembler
= getAssembler();
515 SmallVector
<MCFixup
, 4> Fixups
;
516 SmallString
<256> Code
;
517 raw_svector_ostream
VecOS(Code
);
518 Assembler
.getEmitter().encodeInstruction(Inst
, VecOS
, Fixups
, STI
);
520 for (unsigned i
= 0, e
= Fixups
.size(); i
!= e
; ++i
)
521 fixSymbolsInTLSFixups(Fixups
[i
].getValue());
523 // There are several possibilities here:
525 // If bundling is disabled, append the encoded instruction to the current data
526 // fragment (or create a new such fragment if the current fragment is not a
527 // data fragment, or the Subtarget has changed).
529 // If bundling is enabled:
530 // - If we're not in a bundle-locked group, emit the instruction into a
531 // fragment of its own. If there are no fixups registered for the
532 // instruction, emit a MCCompactEncodedInstFragment. Otherwise, emit a
534 // - If we're in a bundle-locked group, append the instruction to the current
535 // data fragment because we want all the instructions in a group to get into
536 // the same fragment. Be careful not to do that for the first instruction in
537 // the group, though.
540 if (Assembler
.isBundlingEnabled()) {
541 MCSection
&Sec
= *getCurrentSectionOnly();
542 if (Assembler
.getRelaxAll() && isBundleLocked()) {
543 // If the -mc-relax-all flag is used and we are bundle-locked, we re-use
544 // the current bundle group.
545 DF
= BundleGroups
.back();
546 CheckBundleSubtargets(DF
->getSubtargetInfo(), &STI
);
548 else if (Assembler
.getRelaxAll() && !isBundleLocked())
549 // When not in a bundle-locked group and the -mc-relax-all flag is used,
550 // we create a new temporary fragment which will be later merged into
551 // the current fragment.
552 DF
= new MCDataFragment();
553 else if (isBundleLocked() && !Sec
.isBundleGroupBeforeFirstInst()) {
554 // If we are bundle-locked, we re-use the current fragment.
555 // The bundle-locking directive ensures this is a new data fragment.
556 DF
= cast
<MCDataFragment
>(getCurrentFragment());
557 CheckBundleSubtargets(DF
->getSubtargetInfo(), &STI
);
559 else if (!isBundleLocked() && Fixups
.size() == 0) {
560 // Optimize memory usage by emitting the instruction to a
561 // MCCompactEncodedInstFragment when not in a bundle-locked group and
562 // there are no fixups registered.
563 MCCompactEncodedInstFragment
*CEIF
= new MCCompactEncodedInstFragment();
565 CEIF
->getContents().append(Code
.begin(), Code
.end());
566 CEIF
->setHasInstructions(STI
);
569 DF
= new MCDataFragment();
572 if (Sec
.getBundleLockState() == MCSection::BundleLockedAlignToEnd
) {
573 // If this fragment is for a group marked "align_to_end", set a flag
574 // in the fragment. This can happen after the fragment has already been
575 // created if there are nested bundle_align groups and an inner one
576 // is the one marked align_to_end.
577 DF
->setAlignToBundleEnd(true);
580 // We're now emitting an instruction in a bundle group, so this flag has
582 Sec
.setBundleGroupBeforeFirstInst(false);
584 DF
= getOrCreateDataFragment(&STI
);
587 // Add the fixups and data.
588 for (unsigned i
= 0, e
= Fixups
.size(); i
!= e
; ++i
) {
589 Fixups
[i
].setOffset(Fixups
[i
].getOffset() + DF
->getContents().size());
590 DF
->getFixups().push_back(Fixups
[i
]);
592 DF
->setHasInstructions(STI
);
593 DF
->getContents().append(Code
.begin(), Code
.end());
595 if (Assembler
.isBundlingEnabled() && Assembler
.getRelaxAll()) {
596 if (!isBundleLocked()) {
597 mergeFragment(getOrCreateDataFragment(&STI
), DF
);
603 void MCELFStreamer::EmitBundleAlignMode(unsigned AlignPow2
) {
604 assert(AlignPow2
<= 30 && "Invalid bundle alignment");
605 MCAssembler
&Assembler
= getAssembler();
606 if (AlignPow2
> 0 && (Assembler
.getBundleAlignSize() == 0 ||
607 Assembler
.getBundleAlignSize() == 1U << AlignPow2
))
608 Assembler
.setBundleAlignSize(1U << AlignPow2
);
610 report_fatal_error(".bundle_align_mode cannot be changed once set");
613 void MCELFStreamer::EmitBundleLock(bool AlignToEnd
) {
614 MCSection
&Sec
= *getCurrentSectionOnly();
618 if (!getAssembler().isBundlingEnabled())
619 report_fatal_error(".bundle_lock forbidden when bundling is disabled");
621 if (!isBundleLocked())
622 Sec
.setBundleGroupBeforeFirstInst(true);
624 if (getAssembler().getRelaxAll() && !isBundleLocked()) {
625 // TODO: drop the lock state and set directly in the fragment
626 MCDataFragment
*DF
= new MCDataFragment();
627 BundleGroups
.push_back(DF
);
630 Sec
.setBundleLockState(AlignToEnd
? MCSection::BundleLockedAlignToEnd
631 : MCSection::BundleLocked
);
634 void MCELFStreamer::EmitBundleUnlock() {
635 MCSection
&Sec
= *getCurrentSectionOnly();
638 if (!getAssembler().isBundlingEnabled())
639 report_fatal_error(".bundle_unlock forbidden when bundling is disabled");
640 else if (!isBundleLocked())
641 report_fatal_error(".bundle_unlock without matching lock");
642 else if (Sec
.isBundleGroupBeforeFirstInst())
643 report_fatal_error("Empty bundle-locked group is forbidden");
645 // When the -mc-relax-all flag is used, we emit instructions to fragments
646 // stored on a stack. When the bundle unlock is emitted, we pop a fragment
647 // from the stack a merge it to the one below.
648 if (getAssembler().getRelaxAll()) {
649 assert(!BundleGroups
.empty() && "There are no bundle groups");
650 MCDataFragment
*DF
= BundleGroups
.back();
652 // FIXME: Use BundleGroups to track the lock state instead.
653 Sec
.setBundleLockState(MCSection::NotBundleLocked
);
655 // FIXME: Use more separate fragments for nested groups.
656 if (!isBundleLocked()) {
657 mergeFragment(getOrCreateDataFragment(DF
->getSubtargetInfo()), DF
);
658 BundleGroups
.pop_back();
662 if (Sec
.getBundleLockState() != MCSection::BundleLockedAlignToEnd
)
663 getOrCreateDataFragment()->setAlignToBundleEnd(false);
665 Sec
.setBundleLockState(MCSection::NotBundleLocked
);
668 void MCELFStreamer::FinishImpl() {
669 // Ensure the last section gets aligned if necessary.
670 MCSection
*CurSection
= getCurrentSectionOnly();
671 setSectionAlignmentForBundling(getAssembler(), CurSection
);
676 this->MCObjectStreamer::FinishImpl();
679 void MCELFStreamer::EmitThumbFunc(MCSymbol
*Func
) {
680 llvm_unreachable("Generic ELF doesn't support this directive");
683 void MCELFStreamer::EmitSymbolDesc(MCSymbol
*Symbol
, unsigned DescValue
) {
684 llvm_unreachable("ELF doesn't support this directive");
687 void MCELFStreamer::EmitZerofill(MCSection
*Section
, MCSymbol
*Symbol
,
688 uint64_t Size
, unsigned ByteAlignment
,
690 llvm_unreachable("ELF doesn't support this directive");
693 void MCELFStreamer::EmitTBSSSymbol(MCSection
*Section
, MCSymbol
*Symbol
,
694 uint64_t Size
, unsigned ByteAlignment
) {
695 llvm_unreachable("ELF doesn't support this directive");
698 MCStreamer
*llvm::createELFStreamer(MCContext
&Context
,
699 std::unique_ptr
<MCAsmBackend
> &&MAB
,
700 std::unique_ptr
<MCObjectWriter
> &&OW
,
701 std::unique_ptr
<MCCodeEmitter
> &&CE
,
704 new MCELFStreamer(Context
, std::move(MAB
), std::move(OW
), std::move(CE
));
706 S
->getAssembler().setRelaxAll(true);