Skip to content

Commit ccbb04c

Browse files
MaskRayjrtc27
authored andcommitted
[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: llvm/llvm-project#126199 (cherry picked from commit ad61e53)
1 parent d41360b commit ccbb04c

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
@@ -52,7 +52,6 @@ class MCELFStreamer : public MCObjectStreamer {
5252
void emitLabelAtPos(MCSymbol *Symbol, SMLoc Loc, MCFragment *F,
5353
uint64_t Offset) override;
5454
void emitAssemblerFlag(MCAssemblerFlag Flag) override;
55-
void emitThumbFunc(MCSymbol *Func) override;
5655
void emitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) override;
5756
bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override;
5857
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
@@ -69,7 +69,6 @@ class MCObjectStreamer : public MCStreamer {
6969
virtual void emitInstToData(const MCInst &Inst, const MCSubtargetInfo&) = 0;
7070
void emitCFIStartProcImpl(MCDwarfFrameInfo &Frame) override;
7171
void emitCFIEndProcImpl(MCDwarfFrameInfo &Frame) override;
72-
MCSymbol *emitCFILabel() override;
7372
void emitInstructionImpl(const MCInst &Inst, const MCSubtargetInfo &STI);
7473
void resolvePendingFixups();
7574

@@ -87,6 +86,7 @@ class MCObjectStreamer : public MCStreamer {
8786
bool isIntegratedAssemblerRequired() const override { return true; }
8887

8988
void emitFrames(MCAsmBackend *MAB);
89+
MCSymbol *emitCFILabel() override;
9090
void emitCFISections(bool EH, bool Debug) override;
9191

9292
MCFragment *getCurrentFragment() const;

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;
@@ -529,10 +531,6 @@ class MCStreamer {
529531
const Triple *DarwinTargetVariantTriple,
530532
const VersionTuple &DarwinTargetVariantSDKVersion);
531533

532-
/// Note in the output that the specified \p Func is a Thumb mode
533-
/// function (ARM target only).
534-
virtual void emitThumbFunc(MCSymbol *Func);
535-
536534
/// Emit an assignment of \p Value to \p Symbol.
537535
///
538536
/// 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, MCFragment *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
@@ -42,7 +42,6 @@ class MCWinCOFFStreamer : public MCObjectStreamer {
4242
void initSections(bool NoExecStack, const MCSubtargetInfo &STI) override;
4343
void emitLabel(MCSymbol *Symbol, SMLoc Loc = SMLoc()) override;
4444
void emitAssemblerFlag(MCAssemblerFlag Flag) override;
45-
void emitThumbFunc(MCSymbol *Func) override;
4645
bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override;
4746
void emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) override;
4847
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
@@ -170,7 +170,6 @@ class MCAsmStreamer final : public MCStreamer {
170170
void emitDarwinTargetVariantBuildVersion(unsigned Platform, unsigned Major,
171171
unsigned Minor, unsigned Update,
172172
VersionTuple SDKVersion) override;
173-
void emitThumbFunc(MCSymbol *Func) override;
174173

175174
void emitAssignment(MCSymbol *Symbol, const MCExpr *Value) override;
176175
void emitConditionalAssignment(MCSymbol *Symbol,
@@ -670,18 +669,6 @@ void MCAsmStreamer::emitDarwinTargetVariantBuildVersion(
670669
emitBuildVersion(Platform, Major, Minor, Update, SDKVersion);
671670
}
672671

673-
void MCAsmStreamer::emitThumbFunc(MCSymbol *Func) {
674-
// This needs to emit to a temporary string to get properly quoted
675-
// MCSymbols when they have spaces in them.
676-
OS << "\t.thumb_func";
677-
// Only Mach-O hasSubsectionsViaSymbols()
678-
if (MAI->hasSubsectionsViaSymbols()) {
679-
OS << '\t';
680-
Func->print(OS, MAI);
681-
}
682-
EmitEOL();
683-
}
684-
685672
void MCAsmStreamer::emitAssignment(MCSymbol *Symbol, const MCExpr *Value) {
686673
// Do not emit a .set on inlined target assignments.
687674
bool EmitSet = true;

llvm/lib/MC/MCELFStreamer.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -723,10 +723,6 @@ void MCELFStreamer::finishImpl() {
723723
this->MCObjectStreamer::finishImpl();
724724
}
725725

726-
void MCELFStreamer::emitThumbFunc(MCSymbol *Func) {
727-
llvm_unreachable("Generic ELF doesn't support this directive");
728-
}
729-
730726
void MCELFStreamer::emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) {
731727
llvm_unreachable("ELF doesn't support this directive");
732728
}

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, Align ByteAlignment,
@@ -307,13 +306,6 @@ void MCMachOStreamer::emitDarwinTargetVariantBuildVersion(
307306
(MachO::PlatformType)Platform, Major, Minor, Update, SDKVersion);
308307
}
309308

310-
void MCMachOStreamer::emitThumbFunc(MCSymbol *Symbol) {
311-
// Remember that the function is a thumb function. Fixup and relocation
312-
// values will need adjusted.
313-
getAssembler().setIsThumbFunc(Symbol);
314-
cast<MCSymbolMachO>(Symbol)->setThumbFunc();
315-
}
316-
317309
bool MCMachOStreamer::emitSymbolAttribute(MCSymbol *Sym,
318310
MCSymbolAttr Attribute) {
319311
MCSymbolMachO *Symbol = cast<MCSymbolMachO>(Sym);

llvm/lib/MC/MCStreamer.cpp

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

12611261
void MCStreamer::emitAssemblerFlag(MCAssemblerFlag Flag) {}
1262-
void MCStreamer::emitThumbFunc(MCSymbol *Func) {}
12631262
void MCStreamer::emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) {}
12641263
void MCStreamer::beginCOFFSymbolDef(const MCSymbol *Symbol) {
12651264
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
@@ -256,10 +256,6 @@ void MCWasmStreamer::fixSymbolsInTLSFixups(const MCExpr *expr) {
256256
}
257257
}
258258

259-
void MCWasmStreamer::emitThumbFunc(MCSymbol *Func) {
260-
llvm_unreachable("Generic Wasm doesn't support this directive");
261-
}
262-
263259
void MCWasmStreamer::emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) {
264260
llvm_unreachable("Wasm doesn't support this directive");
265261
}

llvm/lib/MC/MCWinCOFFStreamer.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -102,10 +102,6 @@ void MCWinCOFFStreamer::emitAssemblerFlag(MCAssemblerFlag Flag) {
102102
}
103103
}
104104

105-
void MCWinCOFFStreamer::emitThumbFunc(MCSymbol *Func) {
106-
llvm_unreachable("not implemented");
107-
}
108-
109105
bool MCWinCOFFStreamer::emitSymbolAttribute(MCSymbol *S,
110106
MCSymbolAttr Attribute) {
111107
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
@@ -65,9 +65,11 @@ void ARMAsmPrinter::emitFunctionBodyEnd() {
6565
}
6666

6767
void ARMAsmPrinter::emitFunctionEntryLabel() {
68+
auto &TS =
69+
static_cast<ARMTargetStreamer &>(*OutStreamer->getTargetStreamer());
6870
if (AFI->isThumbFunction()) {
6971
OutStreamer->emitAssemblerFlag(MCAF_Code16);
70-
OutStreamer->emitThumbFunc(CurrentFnSym);
72+
TS.emitThumbFunc(CurrentFnSym);
7173
} else {
7274
OutStreamer->emitAssemblerFlag(MCAF_Code32);
7375
}

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

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

1137211372
void ARMAsmParser::onLabelParsed(MCSymbol *Symbol) {
1137311373
if (NextSymbolIsThumb) {
11374-
getParser().getStreamer().emitThumbFunc(Symbol);
11374+
getTargetStreamer().emitThumbFunc(Symbol);
1137511375
NextSymbolIsThumb = false;
1137611376
}
1137711377
}
@@ -11391,7 +11391,7 @@ bool ARMAsmParser::parseDirectiveThumbFunc(SMLoc L) {
1139111391
Parser.getTok().is(AsmToken::String)) {
1139211392
MCSymbol *Func = getParser().getContext().getOrCreateSymbol(
1139311393
Parser.getTok().getIdentifier());
11394-
getParser().getStreamer().emitThumbFunc(Func);
11394+
getTargetStreamer().emitThumbFunc(Func);
1139511395
Parser.Lex();
1139611396
if (parseEOL())
1139711397
return true;

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

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

100100
void annotateTLSDescriptorSequence(const MCSymbolRefExpr *SRE) override;
101+
void emitThumbFunc(MCSymbol *Symbol) override;
101102
void emitThumbSet(MCSymbol *Symbol, const MCExpr *Value) override;
102103

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

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

@@ -420,6 +432,7 @@ class ARMTargetELFStreamer : public ARMTargetStreamer {
420432
void emitLabel(MCSymbol *Symbol) override;
421433

422434
void annotateTLSDescriptorSequence(const MCSymbolRefExpr *SRE) override;
435+
void emitThumbFunc(MCSymbol *Symbol) override;
423436
void emitThumbSet(MCSymbol *Symbol, const MCExpr *Value) override;
424437

425438
// Reset state between object emissions
@@ -691,11 +704,6 @@ class ARMELFStreamer : public MCELFStreamer {
691704
Symbol->setBinding(ELF::STB_LOCAL);
692705
}
693706

694-
void emitThumbFunc(MCSymbol *Func) override {
695-
getAssembler().setIsThumbFunc(Func);
696-
emitSymbolAttribute(Func, MCSA_ELF_TypeFunction);
697-
}
698-
699707
// Helper functions for ARM exception handling directives
700708
void EHReset();
701709

@@ -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
@@ -72,6 +72,7 @@ MCTargetStreamer *createARMTargetAsmStreamer(MCStreamer &S,
7272
MCTargetStreamer *createARMObjectTargetStreamer(MCStreamer &S,
7373
const MCSubtargetInfo &STI);
7474
MCTargetStreamer *createARMObjectTargetELFStreamer(MCStreamer &S);
75+
MCTargetStreamer *createARMObjectTargetMachOStreamer(MCStreamer &S);
7576
MCTargetStreamer *createARMObjectTargetWinCOFFStreamer(MCStreamer &S);
7677

7778
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
@@ -19,8 +19,11 @@
1919
#include "llvm/MC/MCFixup.h"
2020
#include "llvm/MC/MCFixupKindInfo.h"
2121
#include "llvm/MC/MCMachObjectWriter.h"
22+
#include "llvm/MC/MCObjectStreamer.h"
2223
#include "llvm/MC/MCSection.h"
24+
#include "llvm/MC/MCSymbolMachO.h"
2325
#include "llvm/MC/MCValue.h"
26+
#include "llvm/Support/Casting.h"
2427
#include "llvm/Support/ErrorHandling.h"
2528

2629
using namespace llvm;
@@ -509,3 +512,23 @@ llvm::createARMMachObjectWriter(bool Is64Bit, uint32_t CPUType,
509512
uint32_t CPUSubtype) {
510513
return std::make_unique<ARMMachObjectWriter>(Is64Bit, CPUType, CPUSubtype);
511514
}
515+
516+
namespace {
517+
class ARMTargetMachOStreamer : public ARMTargetStreamer {
518+
public:
519+
ARMTargetMachOStreamer(MCStreamer &S) : ARMTargetStreamer(S) {}
520+
MCObjectStreamer &getStreamer() {
521+
return static_cast<MCObjectStreamer &>(Streamer);
522+
}
523+
void emitThumbFunc(MCSymbol *Symbol) override {
524+
// Remember that the function is a thumb function. Fixup and relocation
525+
// values will need adjusted.
526+
getStreamer().getAssembler().setIsThumbFunc(Symbol);
527+
cast<MCSymbolMachO>(Symbol)->setThumbFunc();
528+
}
529+
};
530+
} // namespace
531+
532+
MCTargetStreamer *llvm::createARMObjectTargetMachOStreamer(MCStreamer &S) {
533+
return new ARMTargetMachOStreamer(S);
534+
}

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) {}
@@ -325,5 +326,7 @@ llvm::createARMObjectTargetStreamer(MCStreamer &S, const MCSubtargetInfo &STI) {
325326
return createARMObjectTargetELFStreamer(S);
326327
if (TT.isOSBinFormatCOFF())
327328
return createARMObjectTargetWinCOFFStreamer(S);
329+
if (TT.isOSBinFormatMachO())
330+
return createARMObjectTargetMachOStreamer(S);
328331
return new ARMTargetStreamer(S);
329332
}

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();
@@ -89,6 +84,11 @@ class ARMTargetWinCOFFStreamer : public llvm::ARMTargetStreamer {
8984
public:
9085
ARMTargetWinCOFFStreamer(llvm::MCStreamer &S) : ARMTargetStreamer(S) {}
9186

87+
ARMWinCOFFStreamer &getStreamer() {
88+
return static_cast<ARMWinCOFFStreamer &>(Streamer);
89+
}
90+
void emitThumbFunc(MCSymbol *Symbol) override;
91+
9292
// The unwind codes on ARM Windows are documented at
9393
// https://docs.microsoft.com/en-us/cpp/build/arm-exception-handling
9494
void emitARMWinCFIAllocStack(unsigned Size, bool Wide) override;
@@ -106,6 +106,10 @@ class ARMTargetWinCOFFStreamer : public llvm::ARMTargetStreamer {
106106
void emitARMWinUnwindCode(unsigned UnwindCode, int Reg, int Offset);
107107
};
108108

109+
void ARMTargetWinCOFFStreamer::emitThumbFunc(MCSymbol *Symbol) {
110+
getStreamer().getAssembler().setIsThumbFunc(Symbol);
111+
}
112+
109113
// Helper function to common out unwind code setup for those codes that can
110114
// belong to both prolog and epilog.
111115
void ARMTargetWinCOFFStreamer::emitARMWinUnwindCode(unsigned UnwindCode,

0 commit comments

Comments
 (0)