Skip to content

Commit ad61e53

Browse files
authored
[ARM] Move MCStreamer::emitThumbFunc to ARMTargetStreamer
MCStreamer should not declare arch-specific functions. Such functions should go to MCTargetStreamer. Move MCMachOStreamer::emitThumbFunc to ARMTargetMachOStreamer, which is a new subclass of ARMTargetStreamer. (The new class is just placed in ARMMachObjectWriter.cpp. The conventional split like ARMELFObjectWriter.cpp/ARMELFObjectWriter.cpp is overkill.) `emitCFILabel`, called by ARMWinCOFFStreamer.cpp, has to be made public. Pull Request: #126199
1 parent 5d2e284 commit ad61e53

18 files changed

+64
-57
lines changed

llvm/include/llvm/MC/MCELFStreamer.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@ class MCELFStreamer : public MCObjectStreamer {
5454
void emitLabelAtPos(MCSymbol *Symbol, SMLoc Loc, MCDataFragment &F,
5555
uint64_t Offset) override;
5656
void emitAssemblerFlag(MCAssemblerFlag Flag) override;
57-
void emitThumbFunc(MCSymbol *Func) override;
5857
void emitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) override;
5958
bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override;
6059
void emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) override;

llvm/include/llvm/MC/MCObjectStreamer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ class MCObjectStreamer : public MCStreamer {
6363
virtual void emitInstToData(const MCInst &Inst, const MCSubtargetInfo&) = 0;
6464
void emitCFIStartProcImpl(MCDwarfFrameInfo &Frame) override;
6565
void emitCFIEndProcImpl(MCDwarfFrameInfo &Frame) override;
66-
MCSymbol *emitCFILabel() override;
6766
void emitInstructionImpl(const MCInst &Inst, const MCSubtargetInfo &STI);
6867
void resolvePendingFixups();
6968

@@ -81,6 +80,7 @@ class MCObjectStreamer : public MCStreamer {
8180
bool isIntegratedAssemblerRequired() const override { return true; }
8281

8382
void emitFrames(MCAsmBackend *MAB);
83+
MCSymbol *emitCFILabel() override;
8484
void emitCFISections(bool EH, bool Debug) override;
8585

8686
void insert(MCFragment *F) {

llvm/include/llvm/MC/MCStreamer.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,8 @@ class ARMTargetStreamer : public MCTargetStreamer {
168168

169169
virtual void annotateTLSDescriptorSequence(const MCSymbolRefExpr *SRE);
170170

171+
// Note in the output that the specified \p Symbol is a Thumb mode function.
172+
virtual void emitThumbFunc(MCSymbol *Symbol);
171173
virtual void emitThumbSet(MCSymbol *Symbol, const MCExpr *Value);
172174

173175
void emitConstantPools() override;
@@ -501,10 +503,6 @@ class MCStreamer {
501503
const Triple *DarwinTargetVariantTriple,
502504
const VersionTuple &DarwinTargetVariantSDKVersion);
503505

504-
/// Note in the output that the specified \p Func is a Thumb mode
505-
/// function (ARM target only).
506-
virtual void emitThumbFunc(MCSymbol *Func);
507-
508506
/// Emit an assignment of \p Value to \p Symbol.
509507
///
510508
/// This corresponds to an assembler statement such as:

llvm/include/llvm/MC/MCWasmStreamer.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ class MCWasmStreamer : public MCObjectStreamer {
4545
void emitLabelAtPos(MCSymbol *Symbol, SMLoc Loc, MCDataFragment &F,
4646
uint64_t Offset) override;
4747
void emitAssemblerFlag(MCAssemblerFlag Flag) override;
48-
void emitThumbFunc(MCSymbol *Func) override;
4948
void emitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) override;
5049
bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override;
5150
void emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) override;

llvm/include/llvm/MC/MCWinCOFFStreamer.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ class MCWinCOFFStreamer : public MCObjectStreamer {
4646
void changeSection(MCSection *Section, uint32_t Subsection = 0) override;
4747
void emitLabel(MCSymbol *Symbol, SMLoc Loc = SMLoc()) override;
4848
void emitAssemblerFlag(MCAssemblerFlag Flag) override;
49-
void emitThumbFunc(MCSymbol *Func) override;
5049
bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override;
5150
void emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) override;
5251
void beginCOFFSymbolDef(MCSymbol const *Symbol) override;

llvm/lib/MC/MCAsmStreamer.cpp

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,6 @@ class MCAsmStreamer final : public MCStreamer {
191191
void emitDarwinTargetVariantBuildVersion(unsigned Platform, unsigned Major,
192192
unsigned Minor, unsigned Update,
193193
VersionTuple SDKVersion) override;
194-
void emitThumbFunc(MCSymbol *Func) override;
195194

196195
void emitAssignment(MCSymbol *Symbol, const MCExpr *Value) override;
197196
void emitConditionalAssignment(MCSymbol *Symbol,
@@ -697,18 +696,6 @@ void MCAsmStreamer::emitDarwinTargetVariantBuildVersion(
697696
emitBuildVersion(Platform, Major, Minor, Update, SDKVersion);
698697
}
699698

700-
void MCAsmStreamer::emitThumbFunc(MCSymbol *Func) {
701-
// This needs to emit to a temporary string to get properly quoted
702-
// MCSymbols when they have spaces in them.
703-
OS << "\t.thumb_func";
704-
// Only Mach-O hasSubsectionsViaSymbols()
705-
if (MAI->hasSubsectionsViaSymbols()) {
706-
OS << '\t';
707-
Func->print(OS, MAI);
708-
}
709-
EmitEOL();
710-
}
711-
712699
void MCAsmStreamer::emitAssignment(MCSymbol *Symbol, const MCExpr *Value) {
713700
// Do not emit a .set on inlined target assignments.
714701
bool EmitSet = true;

llvm/lib/MC/MCELFStreamer.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -616,10 +616,6 @@ void MCELFStreamer::finishImpl() {
616616
this->MCObjectStreamer::finishImpl();
617617
}
618618

619-
void MCELFStreamer::emitThumbFunc(MCSymbol *Func) {
620-
llvm_unreachable("Generic ELF doesn't support this directive");
621-
}
622-
623619
void MCELFStreamer::emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) {
624620
llvm_unreachable("ELF doesn't support this directive");
625621
}

llvm/lib/MC/MCMachOStreamer.cpp

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,6 @@ class MCMachOStreamer : public MCObjectStreamer {
9999
void emitDarwinTargetVariantBuildVersion(unsigned Platform, unsigned Major,
100100
unsigned Minor, unsigned Update,
101101
VersionTuple SDKVersion) override;
102-
void emitThumbFunc(MCSymbol *Func) override;
103102
bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override;
104103
void emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) override;
105104
void emitCommonSymbol(MCSymbol *Symbol, uint64_t Size,
@@ -269,13 +268,6 @@ void MCMachOStreamer::emitDarwinTargetVariantBuildVersion(
269268
Minor, Update, SDKVersion);
270269
}
271270

272-
void MCMachOStreamer::emitThumbFunc(MCSymbol *Symbol) {
273-
// Remember that the function is a thumb function. Fixup and relocation
274-
// values will need adjusted.
275-
getAssembler().setIsThumbFunc(Symbol);
276-
cast<MCSymbolMachO>(Symbol)->setThumbFunc();
277-
}
278-
279271
bool MCMachOStreamer::emitSymbolAttribute(MCSymbol *Sym,
280272
MCSymbolAttr Attribute) {
281273
MCSymbolMachO *Symbol = cast<MCSymbolMachO>(Sym);

llvm/lib/MC/MCStreamer.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1229,7 +1229,6 @@ void MCStreamer::emitAbsoluteSymbolDiffAsULEB128(const MCSymbol *Hi,
12291229
}
12301230

12311231
void MCStreamer::emitAssemblerFlag(MCAssemblerFlag Flag) {}
1232-
void MCStreamer::emitThumbFunc(MCSymbol *Func) {}
12331232
void MCStreamer::emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) {}
12341233
void MCStreamer::beginCOFFSymbolDef(const MCSymbol *Symbol) {
12351234
llvm_unreachable("this directive only supported on COFF targets");

llvm/lib/MC/MCWasmStreamer.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -238,10 +238,6 @@ void MCWasmStreamer::fixSymbolsInTLSFixups(const MCExpr *expr) {
238238
}
239239
}
240240

241-
void MCWasmStreamer::emitThumbFunc(MCSymbol *Func) {
242-
llvm_unreachable("Generic Wasm doesn't support this directive");
243-
}
244-
245241
void MCWasmStreamer::emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) {
246242
llvm_unreachable("Wasm doesn't support this directive");
247243
}

llvm/lib/MC/MCWinCOFFStreamer.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -208,10 +208,6 @@ void MCWinCOFFStreamer::emitAssemblerFlag(MCAssemblerFlag Flag) {
208208
}
209209
}
210210

211-
void MCWinCOFFStreamer::emitThumbFunc(MCSymbol *Func) {
212-
llvm_unreachable("not implemented");
213-
}
214-
215211
bool MCWinCOFFStreamer::emitSymbolAttribute(MCSymbol *S,
216212
MCSymbolAttr Attribute) {
217213
auto *Symbol = cast<MCSymbolCOFF>(S);

llvm/lib/Target/ARM/ARMAsmPrinter.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,11 @@ void ARMAsmPrinter::emitFunctionBodyEnd() {
6363
}
6464

6565
void ARMAsmPrinter::emitFunctionEntryLabel() {
66+
auto &TS =
67+
static_cast<ARMTargetStreamer &>(*OutStreamer->getTargetStreamer());
6668
if (AFI->isThumbFunction()) {
6769
OutStreamer->emitAssemblerFlag(MCAF_Code16);
68-
OutStreamer->emitThumbFunc(CurrentFnSym);
70+
TS.emitThumbFunc(CurrentFnSym);
6971
} else {
7072
OutStreamer->emitAssemblerFlag(MCAF_Code32);
7173
}

llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11712,7 +11712,7 @@ void ARMAsmParser::doBeforeLabelEmit(MCSymbol *Symbol, SMLoc IDLoc) {
1171211712

1171311713
void ARMAsmParser::onLabelParsed(MCSymbol *Symbol) {
1171411714
if (NextSymbolIsThumb) {
11715-
getParser().getStreamer().emitThumbFunc(Symbol);
11715+
getTargetStreamer().emitThumbFunc(Symbol);
1171611716
NextSymbolIsThumb = false;
1171711717
}
1171811718
}
@@ -11732,7 +11732,7 @@ bool ARMAsmParser::parseDirectiveThumbFunc(SMLoc L) {
1173211732
Parser.getTok().is(AsmToken::String)) {
1173311733
MCSymbol *Func = getParser().getContext().getOrCreateSymbol(
1173411734
Parser.getTok().getIdentifier());
11735-
getParser().getStreamer().emitThumbFunc(Func);
11735+
getTargetStreamer().emitThumbFunc(Func);
1173611736
Parser.Lex();
1173711737
if (parseEOL())
1173811738
return true;

llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ class ARMTargetAsmStreamer : public ARMTargetStreamer {
100100
void finishAttributeSection() override;
101101

102102
void annotateTLSDescriptorSequence(const MCSymbolRefExpr *SRE) override;
103+
void emitThumbFunc(MCSymbol *Symbol) override;
103104
void emitThumbSet(MCSymbol *Symbol, const MCExpr *Value) override;
104105

105106
void emitARMWinCFIAllocStack(unsigned Size, bool Wide) override;
@@ -260,6 +261,17 @@ void ARMTargetAsmStreamer::annotateTLSDescriptorSequence(
260261
OS << "\t.tlsdescseq\t" << S->getSymbol().getName() << "\n";
261262
}
262263

264+
void ARMTargetAsmStreamer::emitThumbFunc(MCSymbol *Symbol) {
265+
const MCAsmInfo *MAI = Streamer.getContext().getAsmInfo();
266+
OS << "\t.thumb_func";
267+
// Only Mach-O hasSubsectionsViaSymbols()
268+
if (MAI->hasSubsectionsViaSymbols()) {
269+
OS << '\t';
270+
Symbol->print(OS, MAI);
271+
}
272+
OS << '\n';
273+
}
274+
263275
void ARMTargetAsmStreamer::emitThumbSet(MCSymbol *Symbol, const MCExpr *Value) {
264276
const MCAsmInfo *MAI = Streamer.getContext().getAsmInfo();
265277

@@ -422,6 +434,7 @@ class ARMTargetELFStreamer : public ARMTargetStreamer {
422434
void emitLabel(MCSymbol *Symbol) override;
423435

424436
void annotateTLSDescriptorSequence(const MCSymbolRefExpr *SRE) override;
437+
void emitThumbFunc(MCSymbol *Symbol) override;
425438
void emitThumbSet(MCSymbol *Symbol, const MCExpr *Value) override;
426439

427440
// Reset state between object emissions
@@ -686,11 +699,6 @@ class ARMELFStreamer : public MCELFStreamer {
686699
Symbol->setBinding(ELF::STB_LOCAL);
687700
}
688701

689-
void emitThumbFunc(MCSymbol *Func) override {
690-
getAssembler().setIsThumbFunc(Func);
691-
emitSymbolAttribute(Func, MCSA_ELF_TypeFunction);
692-
}
693-
694702
// Helper functions for ARM exception handling directives
695703
void EHReset();
696704

@@ -1089,14 +1097,19 @@ void ARMTargetELFStreamer::emitLabel(MCSymbol *Symbol) {
10891097
Streamer.getAssembler().registerSymbol(*Symbol);
10901098
unsigned Type = cast<MCSymbolELF>(Symbol)->getType();
10911099
if (Type == ELF::STT_FUNC || Type == ELF::STT_GNU_IFUNC)
1092-
Streamer.emitThumbFunc(Symbol);
1100+
emitThumbFunc(Symbol);
10931101
}
10941102

10951103
void ARMTargetELFStreamer::annotateTLSDescriptorSequence(
10961104
const MCSymbolRefExpr *S) {
10971105
getStreamer().EmitFixup(S, FK_Data_4);
10981106
}
10991107

1108+
void ARMTargetELFStreamer::emitThumbFunc(MCSymbol *Symbol) {
1109+
getStreamer().getAssembler().setIsThumbFunc(Symbol);
1110+
getStreamer().emitSymbolAttribute(Symbol, MCSA_ELF_TypeFunction);
1111+
}
1112+
11001113
void ARMTargetELFStreamer::emitThumbSet(MCSymbol *Symbol, const MCExpr *Value) {
11011114
if (const MCSymbolRefExpr *SRE = dyn_cast<MCSymbolRefExpr>(Value)) {
11021115
const MCSymbol &Sym = SRE->getSymbol();
@@ -1106,7 +1119,7 @@ void ARMTargetELFStreamer::emitThumbSet(MCSymbol *Symbol, const MCExpr *Value) {
11061119
}
11071120
}
11081121

1109-
getStreamer().emitThumbFunc(Symbol);
1122+
emitThumbFunc(Symbol);
11101123
getStreamer().emitAssignment(Symbol, Value);
11111124
}
11121125

llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ MCTargetStreamer *createARMTargetAsmStreamer(MCStreamer &S,
7171
MCTargetStreamer *createARMObjectTargetStreamer(MCStreamer &S,
7272
const MCSubtargetInfo &STI);
7373
MCTargetStreamer *createARMObjectTargetELFStreamer(MCStreamer &S);
74+
MCTargetStreamer *createARMObjectTargetMachOStreamer(MCStreamer &S);
7475
MCTargetStreamer *createARMObjectTargetWinCOFFStreamer(MCStreamer &S);
7576

7677
MCCodeEmitter *createARMLEMCCodeEmitter(const MCInstrInfo &MCII,

llvm/lib/Target/ARM/MCTargetDesc/ARMMachObjectWriter.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,11 @@
1616
#include "llvm/MC/MCExpr.h"
1717
#include "llvm/MC/MCFixup.h"
1818
#include "llvm/MC/MCMachObjectWriter.h"
19+
#include "llvm/MC/MCObjectStreamer.h"
1920
#include "llvm/MC/MCSection.h"
21+
#include "llvm/MC/MCSymbolMachO.h"
2022
#include "llvm/MC/MCValue.h"
23+
#include "llvm/Support/Casting.h"
2124
#include "llvm/Support/ErrorHandling.h"
2225

2326
using namespace llvm;
@@ -489,3 +492,23 @@ llvm::createARMMachObjectWriter(bool Is64Bit, uint32_t CPUType,
489492
uint32_t CPUSubtype) {
490493
return std::make_unique<ARMMachObjectWriter>(Is64Bit, CPUType, CPUSubtype);
491494
}
495+
496+
namespace {
497+
class ARMTargetMachOStreamer : public ARMTargetStreamer {
498+
public:
499+
ARMTargetMachOStreamer(MCStreamer &S) : ARMTargetStreamer(S) {}
500+
MCObjectStreamer &getStreamer() {
501+
return static_cast<MCObjectStreamer &>(Streamer);
502+
}
503+
void emitThumbFunc(MCSymbol *Symbol) override {
504+
// Remember that the function is a thumb function. Fixup and relocation
505+
// values will need adjusted.
506+
getStreamer().getAssembler().setIsThumbFunc(Symbol);
507+
cast<MCSymbolMachO>(Symbol)->setThumbFunc();
508+
}
509+
};
510+
} // namespace
511+
512+
MCTargetStreamer *llvm::createARMObjectTargetMachOStreamer(MCStreamer &S) {
513+
return new ARMTargetMachOStreamer(S);
514+
}

llvm/lib/Target/ARM/MCTargetDesc/ARMTargetStreamer.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ void ARMTargetStreamer::emitFPU(ARM::FPUKind FPU) {}
115115
void ARMTargetStreamer::finishAttributeSection() {}
116116
void ARMTargetStreamer::annotateTLSDescriptorSequence(
117117
const MCSymbolRefExpr *SRE) {}
118+
void ARMTargetStreamer::emitThumbFunc(MCSymbol *Symbol) {}
118119
void ARMTargetStreamer::emitThumbSet(MCSymbol *Symbol, const MCExpr *Value) {}
119120

120121
void ARMTargetStreamer::emitARMWinCFIAllocStack(unsigned Size, bool Wide) {}
@@ -329,5 +330,7 @@ llvm::createARMObjectTargetStreamer(MCStreamer &S, const MCSubtargetInfo &STI) {
329330
return createARMObjectTargetELFStreamer(S);
330331
if (TT.isOSBinFormatCOFF())
331332
return createARMObjectTargetWinCOFFStreamer(S);
333+
if (TT.isOSBinFormatMachO())
334+
return createARMObjectTargetMachOStreamer(S);
332335
return new ARMTargetStreamer(S);
333336
}

llvm/lib/Target/ARM/MCTargetDesc/ARMWinCOFFStreamer.cpp

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ class ARMWinCOFFStreamer : public MCWinCOFFStreamer {
3131
void emitWindowsUnwindTables() override;
3232
void emitWindowsUnwindTables(WinEH::FrameInfo *Frame) override;
3333

34-
void emitThumbFunc(MCSymbol *Symbol) override;
3534
void finishImpl() override;
3635
};
3736

@@ -54,10 +53,6 @@ void ARMWinCOFFStreamer::emitWindowsUnwindTables() {
5453
EHStreamer.Emit(*this);
5554
}
5655

57-
void ARMWinCOFFStreamer::emitThumbFunc(MCSymbol *Symbol) {
58-
getAssembler().setIsThumbFunc(Symbol);
59-
}
60-
6156
void ARMWinCOFFStreamer::finishImpl() {
6257
emitFrames(nullptr);
6358
emitWindowsUnwindTables();
@@ -80,6 +75,11 @@ class ARMTargetWinCOFFStreamer : public llvm::ARMTargetStreamer {
8075
public:
8176
ARMTargetWinCOFFStreamer(llvm::MCStreamer &S) : ARMTargetStreamer(S) {}
8277

78+
ARMWinCOFFStreamer &getStreamer() {
79+
return static_cast<ARMWinCOFFStreamer &>(Streamer);
80+
}
81+
void emitThumbFunc(MCSymbol *Symbol) override;
82+
8383
// The unwind codes on ARM Windows are documented at
8484
// https://docs.microsoft.com/en-us/cpp/build/arm-exception-handling
8585
void emitARMWinCFIAllocStack(unsigned Size, bool Wide) override;
@@ -97,6 +97,10 @@ class ARMTargetWinCOFFStreamer : public llvm::ARMTargetStreamer {
9797
void emitARMWinUnwindCode(unsigned UnwindCode, int Reg, int Offset);
9898
};
9999

100+
void ARMTargetWinCOFFStreamer::emitThumbFunc(MCSymbol *Symbol) {
101+
getStreamer().getAssembler().setIsThumbFunc(Symbol);
102+
}
103+
100104
// Helper function to common out unwind code setup for those codes that can
101105
// belong to both prolog and epilog.
102106
void ARMTargetWinCOFFStreamer::emitARMWinUnwindCode(unsigned UnwindCode,

0 commit comments

Comments
 (0)