-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[ARM] Move MCStreamer::emitThumbFunc to ARMTargetStreamer #126199
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[ARM] Move MCStreamer::emitThumbFunc to ARMTargetStreamer #126199
Conversation
Created using spr 1.3.5-bogner
@llvm/pr-subscribers-backend-arm Author: Fangrui Song (MaskRay) ChangesMCStreamer should not declare arch-specific functions. Such functions Move MCMachOStreamer::emitThumbFunc to ARMTargetMachOStreamer, which is
Full diff: https://github.com/llvm/llvm-project/pull/126199.diff 18 Files Affected:
diff --git a/llvm/include/llvm/MC/MCELFStreamer.h b/llvm/include/llvm/MC/MCELFStreamer.h
index 5a1cdd9e96cad46..9c86b4ecc659992 100644
--- a/llvm/include/llvm/MC/MCELFStreamer.h
+++ b/llvm/include/llvm/MC/MCELFStreamer.h
@@ -54,7 +54,6 @@ class MCELFStreamer : public MCObjectStreamer {
void emitLabelAtPos(MCSymbol *Symbol, SMLoc Loc, MCDataFragment &F,
uint64_t Offset) override;
void emitAssemblerFlag(MCAssemblerFlag Flag) override;
- void emitThumbFunc(MCSymbol *Func) override;
void emitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) override;
bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override;
void emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) override;
diff --git a/llvm/include/llvm/MC/MCObjectStreamer.h b/llvm/include/llvm/MC/MCObjectStreamer.h
index aaa13be6b298687..2e3ef417ce89a53 100644
--- a/llvm/include/llvm/MC/MCObjectStreamer.h
+++ b/llvm/include/llvm/MC/MCObjectStreamer.h
@@ -63,7 +63,6 @@ class MCObjectStreamer : public MCStreamer {
virtual void emitInstToData(const MCInst &Inst, const MCSubtargetInfo&) = 0;
void emitCFIStartProcImpl(MCDwarfFrameInfo &Frame) override;
void emitCFIEndProcImpl(MCDwarfFrameInfo &Frame) override;
- MCSymbol *emitCFILabel() override;
void emitInstructionImpl(const MCInst &Inst, const MCSubtargetInfo &STI);
void resolvePendingFixups();
@@ -81,6 +80,7 @@ class MCObjectStreamer : public MCStreamer {
bool isIntegratedAssemblerRequired() const override { return true; }
void emitFrames(MCAsmBackend *MAB);
+ MCSymbol *emitCFILabel() override;
void emitCFISections(bool EH, bool Debug) override;
void insert(MCFragment *F) {
diff --git a/llvm/include/llvm/MC/MCStreamer.h b/llvm/include/llvm/MC/MCStreamer.h
index bf1bbd888591723..b6ddec6ebc4befb 100644
--- a/llvm/include/llvm/MC/MCStreamer.h
+++ b/llvm/include/llvm/MC/MCStreamer.h
@@ -168,6 +168,7 @@ class ARMTargetStreamer : public MCTargetStreamer {
virtual void annotateTLSDescriptorSequence(const MCSymbolRefExpr *SRE);
+ virtual void emitThumbFunc(MCSymbol *Symbol);
virtual void emitThumbSet(MCSymbol *Symbol, const MCExpr *Value);
void emitConstantPools() override;
@@ -501,10 +502,6 @@ class MCStreamer {
const Triple *DarwinTargetVariantTriple,
const VersionTuple &DarwinTargetVariantSDKVersion);
- /// Note in the output that the specified \p Func is a Thumb mode
- /// function (ARM target only).
- virtual void emitThumbFunc(MCSymbol *Func);
-
/// Emit an assignment of \p Value to \p Symbol.
///
/// This corresponds to an assembler statement such as:
diff --git a/llvm/include/llvm/MC/MCWasmStreamer.h b/llvm/include/llvm/MC/MCWasmStreamer.h
index 77b5625efdfe85e..4dffd83b12d0d7b 100644
--- a/llvm/include/llvm/MC/MCWasmStreamer.h
+++ b/llvm/include/llvm/MC/MCWasmStreamer.h
@@ -45,7 +45,6 @@ class MCWasmStreamer : public MCObjectStreamer {
void emitLabelAtPos(MCSymbol *Symbol, SMLoc Loc, MCDataFragment &F,
uint64_t Offset) override;
void emitAssemblerFlag(MCAssemblerFlag Flag) override;
- void emitThumbFunc(MCSymbol *Func) override;
void emitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) override;
bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override;
void emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) override;
diff --git a/llvm/include/llvm/MC/MCWinCOFFStreamer.h b/llvm/include/llvm/MC/MCWinCOFFStreamer.h
index 2425abe51e6dd91..4e2a49548098017 100644
--- a/llvm/include/llvm/MC/MCWinCOFFStreamer.h
+++ b/llvm/include/llvm/MC/MCWinCOFFStreamer.h
@@ -46,7 +46,6 @@ class MCWinCOFFStreamer : public MCObjectStreamer {
void changeSection(MCSection *Section, uint32_t Subsection = 0) override;
void emitLabel(MCSymbol *Symbol, SMLoc Loc = SMLoc()) override;
void emitAssemblerFlag(MCAssemblerFlag Flag) override;
- void emitThumbFunc(MCSymbol *Func) override;
bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override;
void emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) override;
void beginCOFFSymbolDef(MCSymbol const *Symbol) override;
diff --git a/llvm/lib/MC/MCAsmStreamer.cpp b/llvm/lib/MC/MCAsmStreamer.cpp
index 55024656566270b..4db405051f7f349 100644
--- a/llvm/lib/MC/MCAsmStreamer.cpp
+++ b/llvm/lib/MC/MCAsmStreamer.cpp
@@ -191,7 +191,6 @@ class MCAsmStreamer final : public MCStreamer {
void emitDarwinTargetVariantBuildVersion(unsigned Platform, unsigned Major,
unsigned Minor, unsigned Update,
VersionTuple SDKVersion) override;
- void emitThumbFunc(MCSymbol *Func) override;
void emitAssignment(MCSymbol *Symbol, const MCExpr *Value) override;
void emitConditionalAssignment(MCSymbol *Symbol,
@@ -697,18 +696,6 @@ void MCAsmStreamer::emitDarwinTargetVariantBuildVersion(
emitBuildVersion(Platform, Major, Minor, Update, SDKVersion);
}
-void MCAsmStreamer::emitThumbFunc(MCSymbol *Func) {
- // This needs to emit to a temporary string to get properly quoted
- // MCSymbols when they have spaces in them.
- OS << "\t.thumb_func";
- // Only Mach-O hasSubsectionsViaSymbols()
- if (MAI->hasSubsectionsViaSymbols()) {
- OS << '\t';
- Func->print(OS, MAI);
- }
- EmitEOL();
-}
-
void MCAsmStreamer::emitAssignment(MCSymbol *Symbol, const MCExpr *Value) {
// Do not emit a .set on inlined target assignments.
bool EmitSet = true;
diff --git a/llvm/lib/MC/MCELFStreamer.cpp b/llvm/lib/MC/MCELFStreamer.cpp
index 282c82198507d74..65bb88eb6f32adf 100644
--- a/llvm/lib/MC/MCELFStreamer.cpp
+++ b/llvm/lib/MC/MCELFStreamer.cpp
@@ -616,10 +616,6 @@ void MCELFStreamer::finishImpl() {
this->MCObjectStreamer::finishImpl();
}
-void MCELFStreamer::emitThumbFunc(MCSymbol *Func) {
- llvm_unreachable("Generic ELF doesn't support this directive");
-}
-
void MCELFStreamer::emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) {
llvm_unreachable("ELF doesn't support this directive");
}
diff --git a/llvm/lib/MC/MCMachOStreamer.cpp b/llvm/lib/MC/MCMachOStreamer.cpp
index aa79d1bc5b869a0..25352a0e1d5c9e6 100644
--- a/llvm/lib/MC/MCMachOStreamer.cpp
+++ b/llvm/lib/MC/MCMachOStreamer.cpp
@@ -99,7 +99,6 @@ class MCMachOStreamer : public MCObjectStreamer {
void emitDarwinTargetVariantBuildVersion(unsigned Platform, unsigned Major,
unsigned Minor, unsigned Update,
VersionTuple SDKVersion) override;
- void emitThumbFunc(MCSymbol *Func) override;
bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override;
void emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) override;
void emitCommonSymbol(MCSymbol *Symbol, uint64_t Size,
@@ -269,13 +268,6 @@ void MCMachOStreamer::emitDarwinTargetVariantBuildVersion(
Minor, Update, SDKVersion);
}
-void MCMachOStreamer::emitThumbFunc(MCSymbol *Symbol) {
- // Remember that the function is a thumb function. Fixup and relocation
- // values will need adjusted.
- getAssembler().setIsThumbFunc(Symbol);
- cast<MCSymbolMachO>(Symbol)->setThumbFunc();
-}
-
bool MCMachOStreamer::emitSymbolAttribute(MCSymbol *Sym,
MCSymbolAttr Attribute) {
MCSymbolMachO *Symbol = cast<MCSymbolMachO>(Sym);
diff --git a/llvm/lib/MC/MCStreamer.cpp b/llvm/lib/MC/MCStreamer.cpp
index 462ebfedeba0485..dd04e1e30720a83 100644
--- a/llvm/lib/MC/MCStreamer.cpp
+++ b/llvm/lib/MC/MCStreamer.cpp
@@ -1229,7 +1229,6 @@ void MCStreamer::emitAbsoluteSymbolDiffAsULEB128(const MCSymbol *Hi,
}
void MCStreamer::emitAssemblerFlag(MCAssemblerFlag Flag) {}
-void MCStreamer::emitThumbFunc(MCSymbol *Func) {}
void MCStreamer::emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) {}
void MCStreamer::beginCOFFSymbolDef(const MCSymbol *Symbol) {
llvm_unreachable("this directive only supported on COFF targets");
diff --git a/llvm/lib/MC/MCWasmStreamer.cpp b/llvm/lib/MC/MCWasmStreamer.cpp
index 8560f0ebeb1d897..d4806b3a5ecb605 100644
--- a/llvm/lib/MC/MCWasmStreamer.cpp
+++ b/llvm/lib/MC/MCWasmStreamer.cpp
@@ -238,10 +238,6 @@ void MCWasmStreamer::fixSymbolsInTLSFixups(const MCExpr *expr) {
}
}
-void MCWasmStreamer::emitThumbFunc(MCSymbol *Func) {
- llvm_unreachable("Generic Wasm doesn't support this directive");
-}
-
void MCWasmStreamer::emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) {
llvm_unreachable("Wasm doesn't support this directive");
}
diff --git a/llvm/lib/MC/MCWinCOFFStreamer.cpp b/llvm/lib/MC/MCWinCOFFStreamer.cpp
index 8fd46bc8b025543..3d7eb525392e100 100644
--- a/llvm/lib/MC/MCWinCOFFStreamer.cpp
+++ b/llvm/lib/MC/MCWinCOFFStreamer.cpp
@@ -208,10 +208,6 @@ void MCWinCOFFStreamer::emitAssemblerFlag(MCAssemblerFlag Flag) {
}
}
-void MCWinCOFFStreamer::emitThumbFunc(MCSymbol *Func) {
- llvm_unreachable("not implemented");
-}
-
bool MCWinCOFFStreamer::emitSymbolAttribute(MCSymbol *S,
MCSymbolAttr Attribute) {
auto *Symbol = cast<MCSymbolCOFF>(S);
diff --git a/llvm/lib/Target/ARM/ARMAsmPrinter.cpp b/llvm/lib/Target/ARM/ARMAsmPrinter.cpp
index af47d0e176f362c..b8772e1665f8a92 100644
--- a/llvm/lib/Target/ARM/ARMAsmPrinter.cpp
+++ b/llvm/lib/Target/ARM/ARMAsmPrinter.cpp
@@ -63,9 +63,11 @@ void ARMAsmPrinter::emitFunctionBodyEnd() {
}
void ARMAsmPrinter::emitFunctionEntryLabel() {
+ auto &TS =
+ static_cast<ARMTargetStreamer &>(*OutStreamer->getTargetStreamer());
if (AFI->isThumbFunction()) {
OutStreamer->emitAssemblerFlag(MCAF_Code16);
- OutStreamer->emitThumbFunc(CurrentFnSym);
+ TS.emitThumbFunc(CurrentFnSym);
} else {
OutStreamer->emitAssemblerFlag(MCAF_Code32);
}
diff --git a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp b/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
index dad91c6a969e879..fb669cdfd2dc75e 100644
--- a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
+++ b/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
@@ -11681,7 +11681,7 @@ void ARMAsmParser::doBeforeLabelEmit(MCSymbol *Symbol, SMLoc IDLoc) {
void ARMAsmParser::onLabelParsed(MCSymbol *Symbol) {
if (NextSymbolIsThumb) {
- getParser().getStreamer().emitThumbFunc(Symbol);
+ getTargetStreamer().emitThumbFunc(Symbol);
NextSymbolIsThumb = false;
}
}
@@ -11701,7 +11701,7 @@ bool ARMAsmParser::parseDirectiveThumbFunc(SMLoc L) {
Parser.getTok().is(AsmToken::String)) {
MCSymbol *Func = getParser().getContext().getOrCreateSymbol(
Parser.getTok().getIdentifier());
- getParser().getStreamer().emitThumbFunc(Func);
+ getTargetStreamer().emitThumbFunc(Func);
Parser.Lex();
if (parseEOL())
return true;
diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp
index c528526382a2b42..2e3a6c7cba08212 100644
--- a/llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp
+++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp
@@ -100,6 +100,7 @@ class ARMTargetAsmStreamer : public ARMTargetStreamer {
void finishAttributeSection() override;
void annotateTLSDescriptorSequence(const MCSymbolRefExpr *SRE) override;
+ void emitThumbFunc(MCSymbol *Symbol) override;
void emitThumbSet(MCSymbol *Symbol, const MCExpr *Value) override;
void emitARMWinCFIAllocStack(unsigned Size, bool Wide) override;
@@ -260,6 +261,19 @@ void ARMTargetAsmStreamer::annotateTLSDescriptorSequence(
OS << "\t.tlsdescseq\t" << S->getSymbol().getName() << "\n";
}
+void ARMTargetAsmStreamer::emitThumbFunc(MCSymbol *Symbol) {
+ const MCAsmInfo *MAI = Streamer.getContext().getAsmInfo();
+ // This needs to emit to a temporary string to get properly quoted
+ // MCSymbols when they have spaces in them.
+ OS << "\t.thumb_func";
+ // Only Mach-O hasSubsectionsViaSymbols()
+ if (MAI->hasSubsectionsViaSymbols()) {
+ OS << '\t';
+ Symbol->print(OS, MAI);
+ }
+ OS << '\n';
+}
+
void ARMTargetAsmStreamer::emitThumbSet(MCSymbol *Symbol, const MCExpr *Value) {
const MCAsmInfo *MAI = Streamer.getContext().getAsmInfo();
@@ -422,6 +436,7 @@ class ARMTargetELFStreamer : public ARMTargetStreamer {
void emitLabel(MCSymbol *Symbol) override;
void annotateTLSDescriptorSequence(const MCSymbolRefExpr *SRE) override;
+ void emitThumbFunc(MCSymbol *Symbol) override;
void emitThumbSet(MCSymbol *Symbol, const MCExpr *Value) override;
// Reset state between object emissions
@@ -686,11 +701,6 @@ class ARMELFStreamer : public MCELFStreamer {
Symbol->setBinding(ELF::STB_LOCAL);
}
- void emitThumbFunc(MCSymbol *Func) override {
- getAssembler().setIsThumbFunc(Func);
- emitSymbolAttribute(Func, MCSA_ELF_TypeFunction);
- }
-
// Helper functions for ARM exception handling directives
void EHReset();
@@ -1089,7 +1099,7 @@ void ARMTargetELFStreamer::emitLabel(MCSymbol *Symbol) {
Streamer.getAssembler().registerSymbol(*Symbol);
unsigned Type = cast<MCSymbolELF>(Symbol)->getType();
if (Type == ELF::STT_FUNC || Type == ELF::STT_GNU_IFUNC)
- Streamer.emitThumbFunc(Symbol);
+ emitThumbFunc(Symbol);
}
void ARMTargetELFStreamer::annotateTLSDescriptorSequence(
@@ -1097,6 +1107,11 @@ void ARMTargetELFStreamer::annotateTLSDescriptorSequence(
getStreamer().EmitFixup(S, FK_Data_4);
}
+void ARMTargetELFStreamer::emitThumbFunc(MCSymbol *Func) {
+ getStreamer().getAssembler().setIsThumbFunc(Func);
+ getStreamer().emitSymbolAttribute(Func, MCSA_ELF_TypeFunction);
+}
+
void ARMTargetELFStreamer::emitThumbSet(MCSymbol *Symbol, const MCExpr *Value) {
if (const MCSymbolRefExpr *SRE = dyn_cast<MCSymbolRefExpr>(Value)) {
const MCSymbol &Sym = SRE->getSymbol();
@@ -1106,7 +1121,7 @@ void ARMTargetELFStreamer::emitThumbSet(MCSymbol *Symbol, const MCExpr *Value) {
}
}
- getStreamer().emitThumbFunc(Symbol);
+ emitThumbFunc(Symbol);
getStreamer().emitAssignment(Symbol, Value);
}
diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.h b/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.h
index 39b189780f1ffe8..5a67417351f81cc 100644
--- a/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.h
+++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.h
@@ -71,6 +71,7 @@ MCTargetStreamer *createARMTargetAsmStreamer(MCStreamer &S,
MCTargetStreamer *createARMObjectTargetStreamer(MCStreamer &S,
const MCSubtargetInfo &STI);
MCTargetStreamer *createARMObjectTargetELFStreamer(MCStreamer &S);
+MCTargetStreamer *createARMObjectTargetMachOStreamer(MCStreamer &S);
MCTargetStreamer *createARMObjectTargetWinCOFFStreamer(MCStreamer &S);
MCCodeEmitter *createARMLEMCCodeEmitter(const MCInstrInfo &MCII,
diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMMachObjectWriter.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMMachObjectWriter.cpp
index 357654615e00244..c37ed1198c3bbe0 100644
--- a/llvm/lib/Target/ARM/MCTargetDesc/ARMMachObjectWriter.cpp
+++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMMachObjectWriter.cpp
@@ -16,8 +16,11 @@
#include "llvm/MC/MCExpr.h"
#include "llvm/MC/MCFixup.h"
#include "llvm/MC/MCMachObjectWriter.h"
+#include "llvm/MC/MCObjectStreamer.h"
#include "llvm/MC/MCSection.h"
+#include "llvm/MC/MCSymbolMachO.h"
#include "llvm/MC/MCValue.h"
+#include "llvm/Support/Casting.h"
#include "llvm/Support/ErrorHandling.h"
using namespace llvm;
@@ -489,3 +492,23 @@ llvm::createARMMachObjectWriter(bool Is64Bit, uint32_t CPUType,
uint32_t CPUSubtype) {
return std::make_unique<ARMMachObjectWriter>(Is64Bit, CPUType, CPUSubtype);
}
+
+namespace {
+class ARMTargetMachOStreamer : public ARMTargetStreamer {
+public:
+ ARMTargetMachOStreamer(MCStreamer &S) : ARMTargetStreamer(S) {}
+ MCObjectStreamer &getStreamer() {
+ return static_cast<MCObjectStreamer &>(Streamer);
+ }
+ void emitThumbFunc(MCSymbol *Symbol) override {
+ // Remember that the function is a thumb function. Fixup and relocation
+ // values will need adjusted.
+ getStreamer().getAssembler().setIsThumbFunc(Symbol);
+ cast<MCSymbolMachO>(Symbol)->setThumbFunc();
+ }
+};
+} // namespace
+
+MCTargetStreamer *llvm::createARMObjectTargetMachOStreamer(MCStreamer &S) {
+ return new ARMTargetMachOStreamer(S);
+}
diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMTargetStreamer.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMTargetStreamer.cpp
index 84a0fb44c9acdf0..1dc79438d2fc572 100644
--- a/llvm/lib/Target/ARM/MCTargetDesc/ARMTargetStreamer.cpp
+++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMTargetStreamer.cpp
@@ -115,6 +115,7 @@ void ARMTargetStreamer::emitFPU(ARM::FPUKind FPU) {}
void ARMTargetStreamer::finishAttributeSection() {}
void ARMTargetStreamer::annotateTLSDescriptorSequence(
const MCSymbolRefExpr *SRE) {}
+void ARMTargetStreamer::emitThumbFunc(MCSymbol *Symbol) {}
void ARMTargetStreamer::emitThumbSet(MCSymbol *Symbol, const MCExpr *Value) {}
void ARMTargetStreamer::emitARMWinCFIAllocStack(unsigned Size, bool Wide) {}
@@ -329,5 +330,7 @@ llvm::createARMObjectTargetStreamer(MCStreamer &S, const MCSubtargetInfo &STI) {
return createARMObjectTargetELFStreamer(S);
if (TT.isOSBinFormatCOFF())
return createARMObjectTargetWinCOFFStreamer(S);
+ if (TT.isOSBinFormatMachO())
+ return createARMObjectTargetMachOStreamer(S);
return new ARMTargetStreamer(S);
}
diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMWinCOFFStreamer.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMWinCOFFStreamer.cpp
index bb51d716311b8a9..6566aa4c243be31 100644
--- a/llvm/lib/Target/ARM/MCTargetDesc/ARMWinCOFFStreamer.cpp
+++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMWinCOFFStreamer.cpp
@@ -31,7 +31,6 @@ class ARMWinCOFFStreamer : public MCWinCOFFStreamer {
void emitWindowsUnwindTables() override;
void emitWindowsUnwindTables(WinEH::FrameInfo *Frame) override;
- void emitThumbFunc(MCSymbol *Symbol) override;
void finishImpl() override;
};
@@ -54,10 +53,6 @@ void ARMWinCOFFStreamer::emitWindowsUnwindTables() {
EHStreamer.Emit(*this);
}
-void ARMWinCOFFStreamer::emitThumbFunc(MCSymbol *Symbol) {
- getAssembler().setIsThumbFunc(Symbol);
-}
-
void ARMWinCOFFStreamer::finishImpl() {
emitFrames(nullptr);
emitWindowsUnwindTables();
@@ -80,6 +75,11 @@ class ARMTargetWinCOFFStreamer : public llvm::ARMTargetStreamer {
public:
ARMTargetWinCOFFStreamer(llvm::MCStreamer &S) : ARMTargetStreamer(S) {}
+ ARMWinCOFFStreamer &getStreamer() {
+ return static_cast<ARMWinCOFFStreamer &>(Streamer);
+ }
+ void emitThumbFunc(MCSymbol *Symbol) override;
+
// The unwind codes on ARM Windows are documented at
// https://docs.microsoft.com/en-us/cpp/build/arm-exception-handling
void emitARMWinCFIAllocStack(unsigned Size, bool Wide) override;
@@ -97,6 +97,10 @@ class ARMTargetWinCOFFStreamer : public llvm::ARMTargetStreamer {
void emitARMWinUnwindCode(unsigned UnwindCode, int Reg, int Offset);
};
+void ARMTargetWinCOFFStreamer::emitThumbFunc(MCSymbol *Symbol) {
+ getStreamer().getAssembler().setIsThumbFunc(Symbol);
+}
+
// Helper function to common out unwind code setup for those codes that can
// belong to both prolog and epilog.
void ARMTargetWinCOFFStreamer::emitARMWinUnwindCode(unsigned UnwindCode,
|
@llvm/pr-subscribers-mc Author: Fangrui Song (MaskRay) ChangesMCStreamer should not declare arch-specific functions. Such functions Move MCMachOStreamer::emitThumbFunc to ARMTargetMachOStreamer, which is
Full diff: https://github.com/llvm/llvm-project/pull/126199.diff 18 Files Affected:
diff --git a/llvm/include/llvm/MC/MCELFStreamer.h b/llvm/include/llvm/MC/MCELFStreamer.h
index 5a1cdd9e96cad46..9c86b4ecc659992 100644
--- a/llvm/include/llvm/MC/MCELFStreamer.h
+++ b/llvm/include/llvm/MC/MCELFStreamer.h
@@ -54,7 +54,6 @@ class MCELFStreamer : public MCObjectStreamer {
void emitLabelAtPos(MCSymbol *Symbol, SMLoc Loc, MCDataFragment &F,
uint64_t Offset) override;
void emitAssemblerFlag(MCAssemblerFlag Flag) override;
- void emitThumbFunc(MCSymbol *Func) override;
void emitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) override;
bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override;
void emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) override;
diff --git a/llvm/include/llvm/MC/MCObjectStreamer.h b/llvm/include/llvm/MC/MCObjectStreamer.h
index aaa13be6b298687..2e3ef417ce89a53 100644
--- a/llvm/include/llvm/MC/MCObjectStreamer.h
+++ b/llvm/include/llvm/MC/MCObjectStreamer.h
@@ -63,7 +63,6 @@ class MCObjectStreamer : public MCStreamer {
virtual void emitInstToData(const MCInst &Inst, const MCSubtargetInfo&) = 0;
void emitCFIStartProcImpl(MCDwarfFrameInfo &Frame) override;
void emitCFIEndProcImpl(MCDwarfFrameInfo &Frame) override;
- MCSymbol *emitCFILabel() override;
void emitInstructionImpl(const MCInst &Inst, const MCSubtargetInfo &STI);
void resolvePendingFixups();
@@ -81,6 +80,7 @@ class MCObjectStreamer : public MCStreamer {
bool isIntegratedAssemblerRequired() const override { return true; }
void emitFrames(MCAsmBackend *MAB);
+ MCSymbol *emitCFILabel() override;
void emitCFISections(bool EH, bool Debug) override;
void insert(MCFragment *F) {
diff --git a/llvm/include/llvm/MC/MCStreamer.h b/llvm/include/llvm/MC/MCStreamer.h
index bf1bbd888591723..b6ddec6ebc4befb 100644
--- a/llvm/include/llvm/MC/MCStreamer.h
+++ b/llvm/include/llvm/MC/MCStreamer.h
@@ -168,6 +168,7 @@ class ARMTargetStreamer : public MCTargetStreamer {
virtual void annotateTLSDescriptorSequence(const MCSymbolRefExpr *SRE);
+ virtual void emitThumbFunc(MCSymbol *Symbol);
virtual void emitThumbSet(MCSymbol *Symbol, const MCExpr *Value);
void emitConstantPools() override;
@@ -501,10 +502,6 @@ class MCStreamer {
const Triple *DarwinTargetVariantTriple,
const VersionTuple &DarwinTargetVariantSDKVersion);
- /// Note in the output that the specified \p Func is a Thumb mode
- /// function (ARM target only).
- virtual void emitThumbFunc(MCSymbol *Func);
-
/// Emit an assignment of \p Value to \p Symbol.
///
/// This corresponds to an assembler statement such as:
diff --git a/llvm/include/llvm/MC/MCWasmStreamer.h b/llvm/include/llvm/MC/MCWasmStreamer.h
index 77b5625efdfe85e..4dffd83b12d0d7b 100644
--- a/llvm/include/llvm/MC/MCWasmStreamer.h
+++ b/llvm/include/llvm/MC/MCWasmStreamer.h
@@ -45,7 +45,6 @@ class MCWasmStreamer : public MCObjectStreamer {
void emitLabelAtPos(MCSymbol *Symbol, SMLoc Loc, MCDataFragment &F,
uint64_t Offset) override;
void emitAssemblerFlag(MCAssemblerFlag Flag) override;
- void emitThumbFunc(MCSymbol *Func) override;
void emitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) override;
bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override;
void emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) override;
diff --git a/llvm/include/llvm/MC/MCWinCOFFStreamer.h b/llvm/include/llvm/MC/MCWinCOFFStreamer.h
index 2425abe51e6dd91..4e2a49548098017 100644
--- a/llvm/include/llvm/MC/MCWinCOFFStreamer.h
+++ b/llvm/include/llvm/MC/MCWinCOFFStreamer.h
@@ -46,7 +46,6 @@ class MCWinCOFFStreamer : public MCObjectStreamer {
void changeSection(MCSection *Section, uint32_t Subsection = 0) override;
void emitLabel(MCSymbol *Symbol, SMLoc Loc = SMLoc()) override;
void emitAssemblerFlag(MCAssemblerFlag Flag) override;
- void emitThumbFunc(MCSymbol *Func) override;
bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override;
void emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) override;
void beginCOFFSymbolDef(MCSymbol const *Symbol) override;
diff --git a/llvm/lib/MC/MCAsmStreamer.cpp b/llvm/lib/MC/MCAsmStreamer.cpp
index 55024656566270b..4db405051f7f349 100644
--- a/llvm/lib/MC/MCAsmStreamer.cpp
+++ b/llvm/lib/MC/MCAsmStreamer.cpp
@@ -191,7 +191,6 @@ class MCAsmStreamer final : public MCStreamer {
void emitDarwinTargetVariantBuildVersion(unsigned Platform, unsigned Major,
unsigned Minor, unsigned Update,
VersionTuple SDKVersion) override;
- void emitThumbFunc(MCSymbol *Func) override;
void emitAssignment(MCSymbol *Symbol, const MCExpr *Value) override;
void emitConditionalAssignment(MCSymbol *Symbol,
@@ -697,18 +696,6 @@ void MCAsmStreamer::emitDarwinTargetVariantBuildVersion(
emitBuildVersion(Platform, Major, Minor, Update, SDKVersion);
}
-void MCAsmStreamer::emitThumbFunc(MCSymbol *Func) {
- // This needs to emit to a temporary string to get properly quoted
- // MCSymbols when they have spaces in them.
- OS << "\t.thumb_func";
- // Only Mach-O hasSubsectionsViaSymbols()
- if (MAI->hasSubsectionsViaSymbols()) {
- OS << '\t';
- Func->print(OS, MAI);
- }
- EmitEOL();
-}
-
void MCAsmStreamer::emitAssignment(MCSymbol *Symbol, const MCExpr *Value) {
// Do not emit a .set on inlined target assignments.
bool EmitSet = true;
diff --git a/llvm/lib/MC/MCELFStreamer.cpp b/llvm/lib/MC/MCELFStreamer.cpp
index 282c82198507d74..65bb88eb6f32adf 100644
--- a/llvm/lib/MC/MCELFStreamer.cpp
+++ b/llvm/lib/MC/MCELFStreamer.cpp
@@ -616,10 +616,6 @@ void MCELFStreamer::finishImpl() {
this->MCObjectStreamer::finishImpl();
}
-void MCELFStreamer::emitThumbFunc(MCSymbol *Func) {
- llvm_unreachable("Generic ELF doesn't support this directive");
-}
-
void MCELFStreamer::emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) {
llvm_unreachable("ELF doesn't support this directive");
}
diff --git a/llvm/lib/MC/MCMachOStreamer.cpp b/llvm/lib/MC/MCMachOStreamer.cpp
index aa79d1bc5b869a0..25352a0e1d5c9e6 100644
--- a/llvm/lib/MC/MCMachOStreamer.cpp
+++ b/llvm/lib/MC/MCMachOStreamer.cpp
@@ -99,7 +99,6 @@ class MCMachOStreamer : public MCObjectStreamer {
void emitDarwinTargetVariantBuildVersion(unsigned Platform, unsigned Major,
unsigned Minor, unsigned Update,
VersionTuple SDKVersion) override;
- void emitThumbFunc(MCSymbol *Func) override;
bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override;
void emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) override;
void emitCommonSymbol(MCSymbol *Symbol, uint64_t Size,
@@ -269,13 +268,6 @@ void MCMachOStreamer::emitDarwinTargetVariantBuildVersion(
Minor, Update, SDKVersion);
}
-void MCMachOStreamer::emitThumbFunc(MCSymbol *Symbol) {
- // Remember that the function is a thumb function. Fixup and relocation
- // values will need adjusted.
- getAssembler().setIsThumbFunc(Symbol);
- cast<MCSymbolMachO>(Symbol)->setThumbFunc();
-}
-
bool MCMachOStreamer::emitSymbolAttribute(MCSymbol *Sym,
MCSymbolAttr Attribute) {
MCSymbolMachO *Symbol = cast<MCSymbolMachO>(Sym);
diff --git a/llvm/lib/MC/MCStreamer.cpp b/llvm/lib/MC/MCStreamer.cpp
index 462ebfedeba0485..dd04e1e30720a83 100644
--- a/llvm/lib/MC/MCStreamer.cpp
+++ b/llvm/lib/MC/MCStreamer.cpp
@@ -1229,7 +1229,6 @@ void MCStreamer::emitAbsoluteSymbolDiffAsULEB128(const MCSymbol *Hi,
}
void MCStreamer::emitAssemblerFlag(MCAssemblerFlag Flag) {}
-void MCStreamer::emitThumbFunc(MCSymbol *Func) {}
void MCStreamer::emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) {}
void MCStreamer::beginCOFFSymbolDef(const MCSymbol *Symbol) {
llvm_unreachable("this directive only supported on COFF targets");
diff --git a/llvm/lib/MC/MCWasmStreamer.cpp b/llvm/lib/MC/MCWasmStreamer.cpp
index 8560f0ebeb1d897..d4806b3a5ecb605 100644
--- a/llvm/lib/MC/MCWasmStreamer.cpp
+++ b/llvm/lib/MC/MCWasmStreamer.cpp
@@ -238,10 +238,6 @@ void MCWasmStreamer::fixSymbolsInTLSFixups(const MCExpr *expr) {
}
}
-void MCWasmStreamer::emitThumbFunc(MCSymbol *Func) {
- llvm_unreachable("Generic Wasm doesn't support this directive");
-}
-
void MCWasmStreamer::emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) {
llvm_unreachable("Wasm doesn't support this directive");
}
diff --git a/llvm/lib/MC/MCWinCOFFStreamer.cpp b/llvm/lib/MC/MCWinCOFFStreamer.cpp
index 8fd46bc8b025543..3d7eb525392e100 100644
--- a/llvm/lib/MC/MCWinCOFFStreamer.cpp
+++ b/llvm/lib/MC/MCWinCOFFStreamer.cpp
@@ -208,10 +208,6 @@ void MCWinCOFFStreamer::emitAssemblerFlag(MCAssemblerFlag Flag) {
}
}
-void MCWinCOFFStreamer::emitThumbFunc(MCSymbol *Func) {
- llvm_unreachable("not implemented");
-}
-
bool MCWinCOFFStreamer::emitSymbolAttribute(MCSymbol *S,
MCSymbolAttr Attribute) {
auto *Symbol = cast<MCSymbolCOFF>(S);
diff --git a/llvm/lib/Target/ARM/ARMAsmPrinter.cpp b/llvm/lib/Target/ARM/ARMAsmPrinter.cpp
index af47d0e176f362c..b8772e1665f8a92 100644
--- a/llvm/lib/Target/ARM/ARMAsmPrinter.cpp
+++ b/llvm/lib/Target/ARM/ARMAsmPrinter.cpp
@@ -63,9 +63,11 @@ void ARMAsmPrinter::emitFunctionBodyEnd() {
}
void ARMAsmPrinter::emitFunctionEntryLabel() {
+ auto &TS =
+ static_cast<ARMTargetStreamer &>(*OutStreamer->getTargetStreamer());
if (AFI->isThumbFunction()) {
OutStreamer->emitAssemblerFlag(MCAF_Code16);
- OutStreamer->emitThumbFunc(CurrentFnSym);
+ TS.emitThumbFunc(CurrentFnSym);
} else {
OutStreamer->emitAssemblerFlag(MCAF_Code32);
}
diff --git a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp b/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
index dad91c6a969e879..fb669cdfd2dc75e 100644
--- a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
+++ b/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
@@ -11681,7 +11681,7 @@ void ARMAsmParser::doBeforeLabelEmit(MCSymbol *Symbol, SMLoc IDLoc) {
void ARMAsmParser::onLabelParsed(MCSymbol *Symbol) {
if (NextSymbolIsThumb) {
- getParser().getStreamer().emitThumbFunc(Symbol);
+ getTargetStreamer().emitThumbFunc(Symbol);
NextSymbolIsThumb = false;
}
}
@@ -11701,7 +11701,7 @@ bool ARMAsmParser::parseDirectiveThumbFunc(SMLoc L) {
Parser.getTok().is(AsmToken::String)) {
MCSymbol *Func = getParser().getContext().getOrCreateSymbol(
Parser.getTok().getIdentifier());
- getParser().getStreamer().emitThumbFunc(Func);
+ getTargetStreamer().emitThumbFunc(Func);
Parser.Lex();
if (parseEOL())
return true;
diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp
index c528526382a2b42..2e3a6c7cba08212 100644
--- a/llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp
+++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp
@@ -100,6 +100,7 @@ class ARMTargetAsmStreamer : public ARMTargetStreamer {
void finishAttributeSection() override;
void annotateTLSDescriptorSequence(const MCSymbolRefExpr *SRE) override;
+ void emitThumbFunc(MCSymbol *Symbol) override;
void emitThumbSet(MCSymbol *Symbol, const MCExpr *Value) override;
void emitARMWinCFIAllocStack(unsigned Size, bool Wide) override;
@@ -260,6 +261,19 @@ void ARMTargetAsmStreamer::annotateTLSDescriptorSequence(
OS << "\t.tlsdescseq\t" << S->getSymbol().getName() << "\n";
}
+void ARMTargetAsmStreamer::emitThumbFunc(MCSymbol *Symbol) {
+ const MCAsmInfo *MAI = Streamer.getContext().getAsmInfo();
+ // This needs to emit to a temporary string to get properly quoted
+ // MCSymbols when they have spaces in them.
+ OS << "\t.thumb_func";
+ // Only Mach-O hasSubsectionsViaSymbols()
+ if (MAI->hasSubsectionsViaSymbols()) {
+ OS << '\t';
+ Symbol->print(OS, MAI);
+ }
+ OS << '\n';
+}
+
void ARMTargetAsmStreamer::emitThumbSet(MCSymbol *Symbol, const MCExpr *Value) {
const MCAsmInfo *MAI = Streamer.getContext().getAsmInfo();
@@ -422,6 +436,7 @@ class ARMTargetELFStreamer : public ARMTargetStreamer {
void emitLabel(MCSymbol *Symbol) override;
void annotateTLSDescriptorSequence(const MCSymbolRefExpr *SRE) override;
+ void emitThumbFunc(MCSymbol *Symbol) override;
void emitThumbSet(MCSymbol *Symbol, const MCExpr *Value) override;
// Reset state between object emissions
@@ -686,11 +701,6 @@ class ARMELFStreamer : public MCELFStreamer {
Symbol->setBinding(ELF::STB_LOCAL);
}
- void emitThumbFunc(MCSymbol *Func) override {
- getAssembler().setIsThumbFunc(Func);
- emitSymbolAttribute(Func, MCSA_ELF_TypeFunction);
- }
-
// Helper functions for ARM exception handling directives
void EHReset();
@@ -1089,7 +1099,7 @@ void ARMTargetELFStreamer::emitLabel(MCSymbol *Symbol) {
Streamer.getAssembler().registerSymbol(*Symbol);
unsigned Type = cast<MCSymbolELF>(Symbol)->getType();
if (Type == ELF::STT_FUNC || Type == ELF::STT_GNU_IFUNC)
- Streamer.emitThumbFunc(Symbol);
+ emitThumbFunc(Symbol);
}
void ARMTargetELFStreamer::annotateTLSDescriptorSequence(
@@ -1097,6 +1107,11 @@ void ARMTargetELFStreamer::annotateTLSDescriptorSequence(
getStreamer().EmitFixup(S, FK_Data_4);
}
+void ARMTargetELFStreamer::emitThumbFunc(MCSymbol *Func) {
+ getStreamer().getAssembler().setIsThumbFunc(Func);
+ getStreamer().emitSymbolAttribute(Func, MCSA_ELF_TypeFunction);
+}
+
void ARMTargetELFStreamer::emitThumbSet(MCSymbol *Symbol, const MCExpr *Value) {
if (const MCSymbolRefExpr *SRE = dyn_cast<MCSymbolRefExpr>(Value)) {
const MCSymbol &Sym = SRE->getSymbol();
@@ -1106,7 +1121,7 @@ void ARMTargetELFStreamer::emitThumbSet(MCSymbol *Symbol, const MCExpr *Value) {
}
}
- getStreamer().emitThumbFunc(Symbol);
+ emitThumbFunc(Symbol);
getStreamer().emitAssignment(Symbol, Value);
}
diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.h b/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.h
index 39b189780f1ffe8..5a67417351f81cc 100644
--- a/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.h
+++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.h
@@ -71,6 +71,7 @@ MCTargetStreamer *createARMTargetAsmStreamer(MCStreamer &S,
MCTargetStreamer *createARMObjectTargetStreamer(MCStreamer &S,
const MCSubtargetInfo &STI);
MCTargetStreamer *createARMObjectTargetELFStreamer(MCStreamer &S);
+MCTargetStreamer *createARMObjectTargetMachOStreamer(MCStreamer &S);
MCTargetStreamer *createARMObjectTargetWinCOFFStreamer(MCStreamer &S);
MCCodeEmitter *createARMLEMCCodeEmitter(const MCInstrInfo &MCII,
diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMMachObjectWriter.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMMachObjectWriter.cpp
index 357654615e00244..c37ed1198c3bbe0 100644
--- a/llvm/lib/Target/ARM/MCTargetDesc/ARMMachObjectWriter.cpp
+++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMMachObjectWriter.cpp
@@ -16,8 +16,11 @@
#include "llvm/MC/MCExpr.h"
#include "llvm/MC/MCFixup.h"
#include "llvm/MC/MCMachObjectWriter.h"
+#include "llvm/MC/MCObjectStreamer.h"
#include "llvm/MC/MCSection.h"
+#include "llvm/MC/MCSymbolMachO.h"
#include "llvm/MC/MCValue.h"
+#include "llvm/Support/Casting.h"
#include "llvm/Support/ErrorHandling.h"
using namespace llvm;
@@ -489,3 +492,23 @@ llvm::createARMMachObjectWriter(bool Is64Bit, uint32_t CPUType,
uint32_t CPUSubtype) {
return std::make_unique<ARMMachObjectWriter>(Is64Bit, CPUType, CPUSubtype);
}
+
+namespace {
+class ARMTargetMachOStreamer : public ARMTargetStreamer {
+public:
+ ARMTargetMachOStreamer(MCStreamer &S) : ARMTargetStreamer(S) {}
+ MCObjectStreamer &getStreamer() {
+ return static_cast<MCObjectStreamer &>(Streamer);
+ }
+ void emitThumbFunc(MCSymbol *Symbol) override {
+ // Remember that the function is a thumb function. Fixup and relocation
+ // values will need adjusted.
+ getStreamer().getAssembler().setIsThumbFunc(Symbol);
+ cast<MCSymbolMachO>(Symbol)->setThumbFunc();
+ }
+};
+} // namespace
+
+MCTargetStreamer *llvm::createARMObjectTargetMachOStreamer(MCStreamer &S) {
+ return new ARMTargetMachOStreamer(S);
+}
diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMTargetStreamer.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMTargetStreamer.cpp
index 84a0fb44c9acdf0..1dc79438d2fc572 100644
--- a/llvm/lib/Target/ARM/MCTargetDesc/ARMTargetStreamer.cpp
+++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMTargetStreamer.cpp
@@ -115,6 +115,7 @@ void ARMTargetStreamer::emitFPU(ARM::FPUKind FPU) {}
void ARMTargetStreamer::finishAttributeSection() {}
void ARMTargetStreamer::annotateTLSDescriptorSequence(
const MCSymbolRefExpr *SRE) {}
+void ARMTargetStreamer::emitThumbFunc(MCSymbol *Symbol) {}
void ARMTargetStreamer::emitThumbSet(MCSymbol *Symbol, const MCExpr *Value) {}
void ARMTargetStreamer::emitARMWinCFIAllocStack(unsigned Size, bool Wide) {}
@@ -329,5 +330,7 @@ llvm::createARMObjectTargetStreamer(MCStreamer &S, const MCSubtargetInfo &STI) {
return createARMObjectTargetELFStreamer(S);
if (TT.isOSBinFormatCOFF())
return createARMObjectTargetWinCOFFStreamer(S);
+ if (TT.isOSBinFormatMachO())
+ return createARMObjectTargetMachOStreamer(S);
return new ARMTargetStreamer(S);
}
diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMWinCOFFStreamer.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMWinCOFFStreamer.cpp
index bb51d716311b8a9..6566aa4c243be31 100644
--- a/llvm/lib/Target/ARM/MCTargetDesc/ARMWinCOFFStreamer.cpp
+++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMWinCOFFStreamer.cpp
@@ -31,7 +31,6 @@ class ARMWinCOFFStreamer : public MCWinCOFFStreamer {
void emitWindowsUnwindTables() override;
void emitWindowsUnwindTables(WinEH::FrameInfo *Frame) override;
- void emitThumbFunc(MCSymbol *Symbol) override;
void finishImpl() override;
};
@@ -54,10 +53,6 @@ void ARMWinCOFFStreamer::emitWindowsUnwindTables() {
EHStreamer.Emit(*this);
}
-void ARMWinCOFFStreamer::emitThumbFunc(MCSymbol *Symbol) {
- getAssembler().setIsThumbFunc(Symbol);
-}
-
void ARMWinCOFFStreamer::finishImpl() {
emitFrames(nullptr);
emitWindowsUnwindTables();
@@ -80,6 +75,11 @@ class ARMTargetWinCOFFStreamer : public llvm::ARMTargetStreamer {
public:
ARMTargetWinCOFFStreamer(llvm::MCStreamer &S) : ARMTargetStreamer(S) {}
+ ARMWinCOFFStreamer &getStreamer() {
+ return static_cast<ARMWinCOFFStreamer &>(Streamer);
+ }
+ void emitThumbFunc(MCSymbol *Symbol) override;
+
// The unwind codes on ARM Windows are documented at
// https://docs.microsoft.com/en-us/cpp/build/arm-exception-handling
void emitARMWinCFIAllocStack(unsigned Size, bool Wide) override;
@@ -97,6 +97,10 @@ class ARMTargetWinCOFFStreamer : public llvm::ARMTargetStreamer {
void emitARMWinUnwindCode(unsigned UnwindCode, int Reg, int Offset);
};
+void ARMTargetWinCOFFStreamer::emitThumbFunc(MCSymbol *Symbol) {
+ getStreamer().getAssembler().setIsThumbFunc(Symbol);
+}
+
// Helper function to common out unwind code setup for those codes that can
// belong to both prolog and epilog.
void ARMTargetWinCOFFStreamer::emitARMWinUnwindCode(unsigned UnwindCode,
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This looks fine to me. I've added some more Arm reviewers just in case.
Not sure whether anyone on the Macho/Windows side would be interested.
@@ -168,6 +168,7 @@ class ARMTargetStreamer : public MCTargetStreamer { | |||
|
|||
virtual void annotateTLSDescriptorSequence(const MCSymbolRefExpr *SRE); | |||
|
|||
virtual void emitThumbFunc(MCSymbol *Symbol); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Could we preserve the comment, minus the ARM only part
Note in the output that the specified \p Func is a Thumb mode function.
@@ -81,6 +80,7 @@ class MCObjectStreamer : public MCStreamer { | |||
bool isIntegratedAssemblerRequired() const override { return true; } | |||
|
|||
void emitFrames(MCAsmBackend *MAB); | |||
MCSymbol *emitCFILabel() override; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Just to check this was intentional. I don't see any problems with it, but at first glance it doesn't look related.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Making the function public is intentional as mentioned by the description:
emitCFILabel, called by ARMWinCOFFStreamer.cpp, has to be made public.
In the call site, the previous getParser().getStreamer().emitThumbFunc(Symbol);
somehow was able to access emitThumbFunc
, despite it being private. Perhaps there was a friend
somewhere.
The new getTargetStreamer().emitThumbFunc(Symbol);
does require emitThumbFunc
to be public.
@@ -260,6 +261,19 @@ void ARMTargetAsmStreamer::annotateTLSDescriptorSequence( | |||
OS << "\t.tlsdescseq\t" << S->getSymbol().getName() << "\n"; | |||
} | |||
|
|||
void ARMTargetAsmStreamer::emitThumbFunc(MCSymbol *Symbol) { | |||
const MCAsmInfo *MAI = Streamer.getContext().getAsmInfo(); | |||
// This needs to emit to a temporary string to get properly quoted |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This comment doesn't make sense to me, there is no temporary string here. Can it be removed, or is there something I've missed?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Aha, there was a temporary string until 2010(!), this comment has been wrong since then so can be removed: 5a2c68d
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM if you remove the old comment
@@ -260,6 +261,19 @@ void ARMTargetAsmStreamer::annotateTLSDescriptorSequence( | |||
OS << "\t.tlsdescseq\t" << S->getSymbol().getName() << "\n"; | |||
} | |||
|
|||
void ARMTargetAsmStreamer::emitThumbFunc(MCSymbol *Symbol) { | |||
const MCAsmInfo *MAI = Streamer.getContext().getAsmInfo(); | |||
// This needs to emit to a temporary string to get properly quoted |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Aha, there was a temporary string until 2010(!), this comment has been wrong since then so can be removed: 5a2c68d
Created using spr 1.3.5-bogner
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
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#126199
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#126199
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#126199
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)
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)
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.