aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/MC/MCAsmInfo.cpp3
-rw-r--r--llvm/lib/MC/MCAsmStreamer.cpp13
-rw-r--r--llvm/lib/MC/MCELFStreamer.cpp5
-rw-r--r--llvm/lib/MC/MCMachOStreamer.cpp17
-rw-r--r--llvm/lib/MC/MCNullStreamer.cpp1
-rw-r--r--llvm/lib/MC/MCParser/DarwinAsmParser.cpp2
-rw-r--r--llvm/lib/MC/MCStreamer.cpp5
-rw-r--r--llvm/lib/MC/MCWasmStreamer.cpp8
-rw-r--r--llvm/lib/MC/MCWinCOFFStreamer.cpp16
-rw-r--r--llvm/lib/Object/RecordStreamer.h7
-rw-r--r--llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp2
-rw-r--r--llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCAsmInfo.cpp1
-rw-r--r--llvm/lib/Target/ARM/ARMAsmPrinter.cpp26
-rw-r--r--llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp16
-rw-r--r--llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp20
-rw-r--r--llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.h10
-rw-r--r--llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackendDarwin.h5
-rw-r--r--llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackendELF.h5
-rw-r--r--llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackendWinCOFF.h4
-rw-r--r--llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp36
-rw-r--r--llvm/lib/Target/ARM/MCTargetDesc/ARMMCAsmInfo.cpp6
-rw-r--r--llvm/lib/Target/ARM/MCTargetDesc/ARMTargetStreamer.cpp3
-rw-r--r--llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp8
-rw-r--r--llvm/lib/Target/X86/MCTargetDesc/X86TargetStreamer.h4
-rw-r--r--llvm/lib/Target/X86/MCTargetDesc/X86WinCOFFTargetStreamer.cpp14
-rw-r--r--llvm/lib/Target/X86/X86AsmPrinter.cpp9
26 files changed, 100 insertions, 146 deletions
diff --git a/llvm/lib/MC/MCAsmInfo.cpp b/llvm/lib/MC/MCAsmInfo.cpp
index 49e8db2..86759c3 100644
--- a/llvm/lib/MC/MCAsmInfo.cpp
+++ b/llvm/lib/MC/MCAsmInfo.cpp
@@ -48,9 +48,6 @@ MCAsmInfo::MCAsmInfo() {
LinkerPrivateGlobalPrefix = "";
InlineAsmStart = "APP";
InlineAsmEnd = "NO_APP";
- Code16Directive = ".code16";
- Code32Directive = ".code32";
- Code64Directive = ".code64";
ZeroDirective = "\t.zero\t";
AsciiDirective = "\t.ascii\t";
AscizDirective = "\t.asciz\t";
diff --git a/llvm/lib/MC/MCAsmStreamer.cpp b/llvm/lib/MC/MCAsmStreamer.cpp
index 42e6245..f670335 100644
--- a/llvm/lib/MC/MCAsmStreamer.cpp
+++ b/llvm/lib/MC/MCAsmStreamer.cpp
@@ -182,7 +182,7 @@ public:
void emitLabel(MCSymbol *Symbol, SMLoc Loc = SMLoc()) override;
- void emitAssemblerFlag(MCAssemblerFlag Flag) override;
+ void emitSubsectionsViaSymbols() override;
void emitLinkerOptions(ArrayRef<std::string> Options) override;
void emitDataRegion(MCDataRegionType Kind) override;
void emitVersionMin(MCVersionMinType Kind, unsigned Major, unsigned Minor,
@@ -597,15 +597,8 @@ void MCAsmStreamer::emitGNUAttribute(unsigned Tag, unsigned Value) {
OS << "\t.gnu_attribute " << Tag << ", " << Value << "\n";
}
-void MCAsmStreamer::emitAssemblerFlag(MCAssemblerFlag Flag) {
- switch (Flag) {
- case MCAF_SyntaxUnified: OS << "\t.syntax unified"; break;
- case MCAF_SubsectionsViaSymbols: OS << ".subsections_via_symbols"; break;
- case MCAF_Code16: OS << '\t'<< MAI->getCode16Directive();break;
- case MCAF_Code32: OS << '\t'<< MAI->getCode32Directive();break;
- case MCAF_Code64: OS << '\t'<< MAI->getCode64Directive();break;
- }
- EmitEOL();
+void MCAsmStreamer::emitSubsectionsViaSymbols() {
+ OS << ".subsections_via_symbols\n";
}
void MCAsmStreamer::emitLinkerOptions(ArrayRef<std::string> Options) {
diff --git a/llvm/lib/MC/MCELFStreamer.cpp b/llvm/lib/MC/MCELFStreamer.cpp
index 5cf67f0..7006ac9 100644
--- a/llvm/lib/MC/MCELFStreamer.cpp
+++ b/llvm/lib/MC/MCELFStreamer.cpp
@@ -84,11 +84,6 @@ void MCELFStreamer::emitLabelAtPos(MCSymbol *S, SMLoc Loc, MCDataFragment &F,
Symbol->setType(ELF::STT_TLS);
}
-void MCELFStreamer::emitAssemblerFlag(MCAssemblerFlag Flag) {
- // Let the target do whatever target specific stuff it needs to do.
- getAssembler().getBackend().handleAssemblerFlag(Flag);
-}
-
// If bundle alignment is used and there are any instructions in the section, it
// needs to be aligned to at least the bundle size.
static void setSectionAlignmentForBundling(const MCAssembler &Assembler,
diff --git a/llvm/lib/MC/MCMachOStreamer.cpp b/llvm/lib/MC/MCMachOStreamer.cpp
index 9b7152f..4cf602b 100644
--- a/llvm/lib/MC/MCMachOStreamer.cpp
+++ b/llvm/lib/MC/MCMachOStreamer.cpp
@@ -89,7 +89,7 @@ public:
void emitLabel(MCSymbol *Symbol, SMLoc Loc = SMLoc()) override;
void emitAssignment(MCSymbol *Symbol, const MCExpr *Value) override;
void emitEHSymAttributes(const MCSymbol *Symbol, MCSymbol *EHSymbol) override;
- void emitAssemblerFlag(MCAssemblerFlag Flag) override;
+ void emitSubsectionsViaSymbols() override;
void emitLinkerOptions(ArrayRef<std::string> Options) override;
void emitDataRegion(MCDataRegionType Kind) override;
void emitVersionMin(MCVersionMinType Kind, unsigned Major, unsigned Minor,
@@ -209,19 +209,8 @@ void MCMachOStreamer::emitDataRegionEnd() {
emitLabel(Data.End);
}
-void MCMachOStreamer::emitAssemblerFlag(MCAssemblerFlag Flag) {
- // Let the target do whatever target specific stuff it needs to do.
- getAssembler().getBackend().handleAssemblerFlag(Flag);
- // Do any generic stuff we need to do.
- switch (Flag) {
- case MCAF_SyntaxUnified: return; // no-op here.
- case MCAF_Code16: return; // Change parsing mode; no-op here.
- case MCAF_Code32: return; // Change parsing mode; no-op here.
- case MCAF_Code64: return; // Change parsing mode; no-op here.
- case MCAF_SubsectionsViaSymbols:
- getWriter().setSubsectionsViaSymbols(true);
- return;
- }
+void MCMachOStreamer::emitSubsectionsViaSymbols() {
+ getWriter().setSubsectionsViaSymbols(true);
}
void MCMachOStreamer::emitLinkerOptions(ArrayRef<std::string> Options) {
diff --git a/llvm/lib/MC/MCNullStreamer.cpp b/llvm/lib/MC/MCNullStreamer.cpp
index e84830e..f76b2f7 100644
--- a/llvm/lib/MC/MCNullStreamer.cpp
+++ b/llvm/lib/MC/MCNullStreamer.cpp
@@ -38,6 +38,7 @@ namespace {
void emitCommonSymbol(MCSymbol *Symbol, uint64_t Size,
Align ByteAlignment) override {}
+ void emitSubsectionsViaSymbols() override {};
void beginCOFFSymbolDef(const MCSymbol *Symbol) override {}
void emitCOFFSymbolStorageClass(int StorageClass) override {}
void emitCOFFSymbolType(int Type) override {}
diff --git a/llvm/lib/MC/MCParser/DarwinAsmParser.cpp b/llvm/lib/MC/MCParser/DarwinAsmParser.cpp
index 5dc9cb6..de134e2 100644
--- a/llvm/lib/MC/MCParser/DarwinAsmParser.cpp
+++ b/llvm/lib/MC/MCParser/DarwinAsmParser.cpp
@@ -817,7 +817,7 @@ bool DarwinAsmParser::parseDirectiveSubsectionsViaSymbols(StringRef, SMLoc) {
Lex();
- getStreamer().emitAssemblerFlag(MCAF_SubsectionsViaSymbols);
+ getStreamer().emitSubsectionsViaSymbols();
return false;
}
diff --git a/llvm/lib/MC/MCStreamer.cpp b/llvm/lib/MC/MCStreamer.cpp
index a196842..618a35b 100644
--- a/llvm/lib/MC/MCStreamer.cpp
+++ b/llvm/lib/MC/MCStreamer.cpp
@@ -1245,7 +1245,10 @@ void MCStreamer::emitAbsoluteSymbolDiffAsULEB128(const MCSymbol *Hi,
emitULEB128Value(Diff);
}
-void MCStreamer::emitAssemblerFlag(MCAssemblerFlag Flag) {}
+void MCStreamer::emitSubsectionsViaSymbols() {
+ llvm_unreachable(
+ "emitSubsectionsViaSymbols only supported on Mach-O targets");
+}
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 cddd250..9920ff9 100644
--- a/llvm/lib/MC/MCWasmStreamer.cpp
+++ b/llvm/lib/MC/MCWasmStreamer.cpp
@@ -59,14 +59,6 @@ void MCWasmStreamer::emitLabelAtPos(MCSymbol *S, SMLoc Loc, MCDataFragment &F,
Symbol->setTLS();
}
-void MCWasmStreamer::emitAssemblerFlag(MCAssemblerFlag Flag) {
- // Let the target do whatever target specific stuff it needs to do.
- getAssembler().getBackend().handleAssemblerFlag(Flag);
-
- // Do any generic stuff we need to do.
- llvm_unreachable("invalid assembler flag!");
-}
-
void MCWasmStreamer::changeSection(MCSection *Section, uint32_t Subsection) {
MCAssembler &Asm = getAssembler();
auto *SectionWasm = cast<MCSectionWasm>(Section);
diff --git a/llvm/lib/MC/MCWinCOFFStreamer.cpp b/llvm/lib/MC/MCWinCOFFStreamer.cpp
index e03f7b5..ee7a7c87 100644
--- a/llvm/lib/MC/MCWinCOFFStreamer.cpp
+++ b/llvm/lib/MC/MCWinCOFFStreamer.cpp
@@ -184,22 +184,6 @@ void MCWinCOFFStreamer::emitLabel(MCSymbol *S, SMLoc Loc) {
MCObjectStreamer::emitLabel(Symbol, Loc);
}
-void MCWinCOFFStreamer::emitAssemblerFlag(MCAssemblerFlag Flag) {
- // Let the target do whatever target specific stuff it needs to do.
- getAssembler().getBackend().handleAssemblerFlag(Flag);
-
- switch (Flag) {
- // None of these require COFF specific handling.
- case MCAF_SyntaxUnified:
- case MCAF_Code16:
- case MCAF_Code32:
- case MCAF_Code64:
- break;
- case MCAF_SubsectionsViaSymbols:
- llvm_unreachable("COFF doesn't support .subsections_via_symbols");
- }
-}
-
bool MCWinCOFFStreamer::emitSymbolAttribute(MCSymbol *S,
MCSymbolAttr Attribute) {
auto *Symbol = cast<MCSymbolCOFF>(S);
diff --git a/llvm/lib/Object/RecordStreamer.h b/llvm/lib/Object/RecordStreamer.h
index d9ef27c..edb6e3a 100644
--- a/llvm/lib/Object/RecordStreamer.h
+++ b/llvm/lib/Object/RecordStreamer.h
@@ -54,9 +54,10 @@ public:
void emitCommonSymbol(MCSymbol *Symbol, uint64_t Size,
Align ByteAlignment) override;
- // Ignore COFF-specific directives; we do not need any information from them,
- // but the default implementation of these methods crashes, so we override
- // them with versions that do nothing.
+ // Ignore format-specific directives; we do not need any information from
+ // them, but the default implementation of these methods crashes, so we
+ // override them with versions that do nothing.
+ void emitSubsectionsViaSymbols() override {};
void beginCOFFSymbolDef(const MCSymbol *Symbol) override {}
void emitCOFFSymbolStorageClass(int StorageClass) override {}
void emitCOFFSymbolType(int Type) override {}
diff --git a/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp b/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp
index f55b7ef..e9ccc35 100644
--- a/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp
+++ b/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp
@@ -961,7 +961,7 @@ void AArch64AsmPrinter::emitEndOfAsmFile(Module &M) {
// implementation of multiple entry points). If this doesn't occur, the
// linker can safely perform dead code stripping. Since LLVM never
// generates code that does this, it is always safe to set.
- OutStreamer->emitAssemblerFlag(MCAF_SubsectionsViaSymbols);
+ OutStreamer->emitSubsectionsViaSymbols();
}
if (TT.isOSBinFormatELF()) {
diff --git a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCAsmInfo.cpp b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCAsmInfo.cpp
index 83daa83..e8a88f7 100644
--- a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCAsmInfo.cpp
+++ b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCAsmInfo.cpp
@@ -108,7 +108,6 @@ AArch64MCAsmInfoELF::AArch64MCAsmInfoELF(const Triple &T) {
CommentString = "//";
PrivateGlobalPrefix = ".L";
PrivateLabelPrefix = ".L";
- Code32Directive = ".code\t32";
Data16bitsDirective = "\t.hword\t";
Data32bitsDirective = "\t.word\t";
diff --git a/llvm/lib/Target/ARM/ARMAsmPrinter.cpp b/llvm/lib/Target/ARM/ARMAsmPrinter.cpp
index 2505a67..13efd70 100644
--- a/llvm/lib/Target/ARM/ARMAsmPrinter.cpp
+++ b/llvm/lib/Target/ARM/ARMAsmPrinter.cpp
@@ -66,10 +66,10 @@ void ARMAsmPrinter::emitFunctionEntryLabel() {
auto &TS =
static_cast<ARMTargetStreamer &>(*OutStreamer->getTargetStreamer());
if (AFI->isThumbFunction()) {
- OutStreamer->emitAssemblerFlag(MCAF_Code16);
+ TS.emitCode16();
TS.emitThumbFunc(CurrentFnSym);
} else {
- OutStreamer->emitAssemblerFlag(MCAF_Code32);
+ TS.emitCode32();
}
// Emit symbol for CMSE non-secure entry point
@@ -171,7 +171,9 @@ bool ARMAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
// These are created per function, rather than per TU, since it's
// relatively easy to exceed the thumb branch range within a TU.
if (! ThumbIndirectPads.empty()) {
- OutStreamer->emitAssemblerFlag(MCAF_Code16);
+ auto &TS =
+ static_cast<ARMTargetStreamer &>(*OutStreamer->getTargetStreamer());
+ TS.emitCode16();
emitAlignment(Align(2));
for (std::pair<unsigned, MCSymbol *> &TIP : ThumbIndirectPads) {
OutStreamer->emitLabel(TIP.second);
@@ -489,24 +491,30 @@ void ARMAsmPrinter::emitInlineAsmEnd(const MCSubtargetInfo &StartInfo,
// the start mode, then restore the start mode.
const bool WasThumb = isThumb(StartInfo);
if (!EndInfo || WasThumb != isThumb(*EndInfo)) {
- OutStreamer->emitAssemblerFlag(WasThumb ? MCAF_Code16 : MCAF_Code32);
+ auto &TS =
+ static_cast<ARMTargetStreamer &>(*OutStreamer->getTargetStreamer());
+ if (WasThumb)
+ TS.emitCode16();
+ else
+ TS.emitCode32();
}
}
void ARMAsmPrinter::emitStartOfAsmFile(Module &M) {
const Triple &TT = TM.getTargetTriple();
+ auto &TS =
+ static_cast<ARMTargetStreamer &>(*OutStreamer->getTargetStreamer());
// Use unified assembler syntax.
- OutStreamer->emitAssemblerFlag(MCAF_SyntaxUnified);
+ TS.emitSyntaxUnified();
// Emit ARM Build Attributes
if (TT.isOSBinFormatELF())
emitAttributes();
// Use the triple's architecture and subarchitecture to determine
- // if we're thumb for the purposes of the top level code16 assembler
- // flag.
+ // if we're thumb for the purposes of the top level code16 state.
if (!M.getModuleInlineAsm().empty() && TT.isThumb())
- OutStreamer->emitAssemblerFlag(MCAF_Code16);
+ TS.emitCode16();
}
static void
@@ -575,7 +583,7 @@ void ARMAsmPrinter::emitEndOfAsmFile(Module &M) {
// implementation of multiple entry points). If this doesn't occur, the
// linker can safely perform dead code stripping. Since LLVM never
// generates code that does this, it is always safe to set.
- OutStreamer->emitAssemblerFlag(MCAF_SubsectionsViaSymbols);
+ OutStreamer->emitSubsectionsViaSymbols();
}
// The last attribute to be emitted is ABI_optimization_goals
diff --git a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp b/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
index 48ad8a8..85b107c 100644
--- a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
+++ b/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
@@ -11654,7 +11654,7 @@ bool ARMAsmParser::parseDirectiveThumb(SMLoc L) {
if (!isThumb())
SwitchMode();
- getParser().getStreamer().emitAssemblerFlag(MCAF_Code16);
+ getTargetStreamer().emitCode16();
getParser().getStreamer().emitCodeAlignment(Align(2), &getSTI(), 0);
return false;
}
@@ -11667,7 +11667,7 @@ bool ARMAsmParser::parseDirectiveARM(SMLoc L) {
if (isThumb())
SwitchMode();
- getParser().getStreamer().emitAssemblerFlag(MCAF_Code32);
+ getTargetStreamer().emitCode32();
getParser().getStreamer().emitCodeAlignment(Align(4), &getSTI(), 0);
return false;
}
@@ -11715,7 +11715,7 @@ bool ARMAsmParser::parseDirectiveThumbFunc(SMLoc L) {
if (!isThumb())
SwitchMode();
- getParser().getStreamer().emitAssemblerFlag(MCAF_Code16);
+ getTargetStreamer().emitCode16();
NextSymbolIsThumb = true;
return false;
@@ -11768,14 +11768,14 @@ bool ARMAsmParser::parseDirectiveCode(SMLoc L) {
if (!isThumb())
SwitchMode();
- getParser().getStreamer().emitAssemblerFlag(MCAF_Code16);
+ getTargetStreamer().emitCode16();
} else {
if (!hasARM())
return Error(L, "target does not support ARM mode");
if (isThumb())
SwitchMode();
- getParser().getStreamer().emitAssemblerFlag(MCAF_Code32);
+ getTargetStreamer().emitCode32();
}
return false;
@@ -11824,8 +11824,10 @@ void ARMAsmParser::FixModeAfterArchChange(bool WasThumb, SMLoc Loc) {
SwitchMode();
} else {
// Mode switch forced, because the new arch doesn't support the old mode.
- getParser().getStreamer().emitAssemblerFlag(isThumb() ? MCAF_Code16
- : MCAF_Code32);
+ if (isThumb())
+ getTargetStreamer().emitCode16();
+ else
+ getTargetStreamer().emitCode32();
// Warn about the implcit mode switch. GAS does not switch modes here,
// but instead stays in the old mode, reporting an error on any following
// instructions as the mode does not exist on the target.
diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp
index 266ae1f..9b0aafe 100644
--- a/llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp
+++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp
@@ -206,19 +206,6 @@ MCFixupKindInfo ARMAsmBackend::getFixupKindInfo(MCFixupKind Kind) const {
: InfosBE)[Kind - FirstTargetFixupKind];
}
-void ARMAsmBackend::handleAssemblerFlag(MCAssemblerFlag Flag) {
- switch (Flag) {
- default:
- break;
- case MCAF_Code16:
- setIsThumb(true);
- break;
- case MCAF_Code32:
- setIsThumb(false);
- break;
- }
-}
-
unsigned ARMAsmBackend::getRelaxedOpcode(unsigned Op,
const MCSubtargetInfo &STI) const {
bool HasThumb2 = STI.hasFeature(ARM::FeatureThumb2);
@@ -405,7 +392,7 @@ bool ARMAsmBackend::writeNopData(raw_ostream &OS, uint64_t Count,
const uint16_t Thumb2_16bitNopEncoding = 0xbf00; // NOP
const uint32_t ARMv4_NopEncoding = 0xe1a00000; // using MOV r0,r0
const uint32_t ARMv6T2_NopEncoding = 0xe320f000; // NOP
- if (isThumb()) {
+ if (STI->hasFeature(ARM::ModeThumb)) {
const uint16_t nopEncoding =
hasNOP(STI) ? Thumb2_16bitNopEncoding : Thumb1_16bitNopEncoding;
uint64_t NumNops = Count / 2;
@@ -1407,14 +1394,13 @@ static MCAsmBackend *createARMAsmBackend(const Target &T,
return new ARMAsmBackendDarwin(T, STI, MRI);
case Triple::COFF:
assert(TheTriple.isOSWindows() && "non-Windows ARM COFF is not supported");
- return new ARMAsmBackendWinCOFF(T, STI.getTargetTriple().isThumb());
+ return new ARMAsmBackendWinCOFF(T);
case Triple::ELF:
assert(TheTriple.isOSBinFormatELF() && "using ELF for non-ELF target");
uint8_t OSABI = Options.FDPIC
? static_cast<uint8_t>(ELF::ELFOSABI_ARM_FDPIC)
: MCELFObjectTargetWriter::getOSABI(TheTriple.getOS());
- return new ARMAsmBackendELF(T, STI.getTargetTriple().isThumb(), OSABI,
- Endian);
+ return new ARMAsmBackendELF(T, OSABI, Endian);
}
}
diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.h b/llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.h
index bcf044b..4f017d8 100644
--- a/llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.h
+++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.h
@@ -18,11 +18,9 @@
namespace llvm {
class ARMAsmBackend : public MCAsmBackend {
- bool isThumbMode; // Currently emitting Thumb code.
public:
- ARMAsmBackend(const Target &T, bool isThumb, llvm::endianness Endian)
- : MCAsmBackend(Endian), isThumbMode(isThumb) {}
-
+ ARMAsmBackend(const Target &T, llvm::endianness Endian)
+ : MCAsmBackend(Endian) {}
bool hasNOP(const MCSubtargetInfo *STI) const {
return STI->hasFeature(ARM::HasV6T2Ops);
@@ -64,11 +62,7 @@ public:
bool writeNopData(raw_ostream &OS, uint64_t Count,
const MCSubtargetInfo *STI) const override;
- void handleAssemblerFlag(MCAssemblerFlag Flag) override;
-
unsigned getPointerSize() const { return 4; }
- bool isThumb() const { return isThumbMode; }
- void setIsThumb(bool it) { isThumbMode = it; }
};
} // end namespace llvm
diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackendDarwin.h b/llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackendDarwin.h
index 9c95800..29cbc40 100644
--- a/llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackendDarwin.h
+++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackendDarwin.h
@@ -22,9 +22,8 @@ public:
const MachO::CPUSubTypeARM Subtype;
ARMAsmBackendDarwin(const Target &T, const MCSubtargetInfo &STI,
const MCRegisterInfo &MRI)
- : ARMAsmBackend(T, STI.getTargetTriple().isThumb(),
- llvm::endianness::little),
- MRI(MRI), TT(STI.getTargetTriple()),
+ : ARMAsmBackend(T, llvm::endianness::little), MRI(MRI),
+ TT(STI.getTargetTriple()),
Subtype((MachO::CPUSubTypeARM)cantFail(
MachO::getCPUSubType(STI.getTargetTriple()))) {}
diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackendELF.h b/llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackendELF.h
index 17ae262..d0b598d 100644
--- a/llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackendELF.h
+++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackendELF.h
@@ -17,9 +17,8 @@ namespace llvm {
class ARMAsmBackendELF : public ARMAsmBackend {
public:
uint8_t OSABI;
- ARMAsmBackendELF(const Target &T, bool isThumb, uint8_t OSABI,
- llvm::endianness Endian)
- : ARMAsmBackend(T, isThumb, Endian), OSABI(OSABI) {}
+ ARMAsmBackendELF(const Target &T, uint8_t OSABI, llvm::endianness Endian)
+ : ARMAsmBackend(T, Endian), OSABI(OSABI) {}
std::unique_ptr<MCObjectTargetWriter>
createObjectTargetWriter() const override {
diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackendWinCOFF.h b/llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackendWinCOFF.h
index 9b50fb7..8a1137e 100644
--- a/llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackendWinCOFF.h
+++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackendWinCOFF.h
@@ -15,8 +15,8 @@
namespace llvm {
class ARMAsmBackendWinCOFF : public ARMAsmBackend {
public:
- ARMAsmBackendWinCOFF(const Target &T, bool isThumb)
- : ARMAsmBackend(T, isThumb, llvm::endianness::little) {}
+ ARMAsmBackendWinCOFF(const Target &T)
+ : ARMAsmBackend(T, llvm::endianness::little) {}
std::unique_ptr<MCObjectTargetWriter>
createObjectTargetWriter() const override {
return createARMWinCOFFObjectWriter();
diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp
index 3d45ecf..8318397 100644
--- a/llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp
+++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp
@@ -101,6 +101,9 @@ class ARMTargetAsmStreamer : public ARMTargetStreamer {
void finishAttributeSection() override;
void annotateTLSDescriptorSequence(const MCSymbolRefExpr *SRE) override;
+ void emitSyntaxUnified() override;
+ void emitCode16() override;
+ void emitCode32() override;
void emitThumbFunc(MCSymbol *Symbol) override;
void emitThumbSet(MCSymbol *Symbol, const MCExpr *Value) override;
@@ -262,6 +265,12 @@ void ARMTargetAsmStreamer::annotateTLSDescriptorSequence(
OS << "\t.tlsdescseq\t" << S->getSymbol().getName() << "\n";
}
+void ARMTargetAsmStreamer::emitSyntaxUnified() { OS << "\t.syntax\tunified\n"; }
+
+void ARMTargetAsmStreamer::emitCode16() { OS << "\t.code\t16\n"; }
+
+void ARMTargetAsmStreamer::emitCode32() { OS << "\t.code\t32\n"; }
+
void ARMTargetAsmStreamer::emitThumbFunc(MCSymbol *Symbol) {
const MCAsmInfo *MAI = Streamer.getContext().getAsmInfo();
OS << "\t.thumb_func";
@@ -435,6 +444,8 @@ private:
void emitLabel(MCSymbol *Symbol) override;
void annotateTLSDescriptorSequence(const MCSymbolRefExpr *SRE) override;
+ void emitCode16() override;
+ void emitCode32() override;
void emitThumbFunc(MCSymbol *Symbol) override;
void emitThumbSet(MCSymbol *Symbol, const MCExpr *Value) override;
@@ -590,25 +601,6 @@ public:
MCELFStreamer::emitValueImpl(Value, Size, Loc);
}
- void emitAssemblerFlag(MCAssemblerFlag Flag) override {
- MCELFStreamer::emitAssemblerFlag(Flag);
-
- switch (Flag) {
- case MCAF_SyntaxUnified:
- return; // no-op here.
- case MCAF_Code16:
- IsThumb = true;
- return; // Change to Thumb mode
- case MCAF_Code32:
- IsThumb = false;
- return; // Change to ARM mode
- case MCAF_Code64:
- return;
- case MCAF_SubsectionsViaSymbols:
- return;
- }
- }
-
/// If a label is defined before the .type directive sets the label's type
/// then the label can't be recorded as thumb function when the label is
/// defined. We override emitSymbolAttribute() which is called as part of the
@@ -631,6 +623,8 @@ public:
return Val;
};
+ void setIsThumb(bool Val) { IsThumb = Val; }
+
private:
enum ElfMappingSymbol {
EMS_None,
@@ -1107,6 +1101,10 @@ void ARMTargetELFStreamer::annotateTLSDescriptorSequence(
getStreamer().EmitFixup(S, FK_Data_4);
}
+void ARMTargetELFStreamer::emitCode16() { getStreamer().setIsThumb(true); }
+
+void ARMTargetELFStreamer::emitCode32() { getStreamer().setIsThumb(false); }
+
void ARMTargetELFStreamer::emitThumbFunc(MCSymbol *Symbol) {
getStreamer().getAssembler().setIsThumbFunc(Symbol);
getStreamer().emitSymbolAttribute(Symbol, MCSA_ELF_TypeFunction);
diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMMCAsmInfo.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMMCAsmInfo.cpp
index 789f7ec..92121dd 100644
--- a/llvm/lib/Target/ARM/MCTargetDesc/ARMMCAsmInfo.cpp
+++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMMCAsmInfo.cpp
@@ -53,8 +53,6 @@ ARMMCAsmInfoDarwin::ARMMCAsmInfoDarwin(const Triple &TheTriple) {
Data64bitsDirective = nullptr;
CommentString = "@";
- Code16Directive = ".code\t16";
- Code32Directive = ".code\t32";
UseDataRegionDirectives = true;
SupportsDebugInformation = true;
@@ -82,8 +80,6 @@ ARMELFMCAsmInfo::ARMELFMCAsmInfo(const Triple &TheTriple) {
Data64bitsDirective = nullptr;
CommentString = "@";
- Code16Directive = ".code\t16";
- Code32Directive = ".code\t32";
SupportsDebugInformation = true;
@@ -141,8 +137,6 @@ ARMCOFFMCAsmInfoGNU::ARMCOFFMCAsmInfoGNU() {
HasSingleParameterDotFile = true;
CommentString = "@";
- Code16Directive = ".code\t16";
- Code32Directive = ".code\t32";
PrivateGlobalPrefix = ".L";
PrivateLabelPrefix = ".L";
diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMTargetStreamer.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMTargetStreamer.cpp
index 632dbeb..130b6a6 100644
--- a/llvm/lib/Target/ARM/MCTargetDesc/ARMTargetStreamer.cpp
+++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMTargetStreamer.cpp
@@ -115,6 +115,9 @@ void ARMTargetStreamer::emitFPU(ARM::FPUKind FPU) {}
void ARMTargetStreamer::finishAttributeSection() {}
void ARMTargetStreamer::annotateTLSDescriptorSequence(
const MCSymbolRefExpr *SRE) {}
+void ARMTargetStreamer::emitSyntaxUnified() {}
+void ARMTargetStreamer::emitCode16() {}
+void ARMTargetStreamer::emitCode32() {}
void ARMTargetStreamer::emitThumbFunc(MCSymbol *Symbol) {}
void ARMTargetStreamer::emitThumbSet(MCSymbol *Symbol, const MCExpr *Value) {}
diff --git a/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp b/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp
index 1119330..300f795 100644
--- a/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp
+++ b/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp
@@ -4795,7 +4795,7 @@ bool X86AsmParser::ParseDirectiveCode(StringRef IDVal, SMLoc L) {
Parser.Lex();
if (!is16BitMode()) {
SwitchMode(X86::Is16Bit);
- getParser().getStreamer().emitAssemblerFlag(MCAF_Code16);
+ getTargetStreamer().emitCode16();
}
} else if (IDVal == ".code16gcc") {
// .code16gcc parses as if in 32-bit mode, but emits code in 16-bit mode.
@@ -4803,19 +4803,19 @@ bool X86AsmParser::ParseDirectiveCode(StringRef IDVal, SMLoc L) {
Code16GCC = true;
if (!is16BitMode()) {
SwitchMode(X86::Is16Bit);
- getParser().getStreamer().emitAssemblerFlag(MCAF_Code16);
+ getTargetStreamer().emitCode16();
}
} else if (IDVal == ".code32") {
Parser.Lex();
if (!is32BitMode()) {
SwitchMode(X86::Is32Bit);
- getParser().getStreamer().emitAssemblerFlag(MCAF_Code32);
+ getTargetStreamer().emitCode32();
}
} else if (IDVal == ".code64") {
Parser.Lex();
if (!is64BitMode()) {
SwitchMode(X86::Is64Bit);
- getParser().getStreamer().emitAssemblerFlag(MCAF_Code64);
+ getTargetStreamer().emitCode64();
}
} else {
Error(L, "unknown directive " + IDVal);
diff --git a/llvm/lib/Target/X86/MCTargetDesc/X86TargetStreamer.h b/llvm/lib/Target/X86/MCTargetDesc/X86TargetStreamer.h
index 8cfd938..486795f 100644
--- a/llvm/lib/Target/X86/MCTargetDesc/X86TargetStreamer.h
+++ b/llvm/lib/Target/X86/MCTargetDesc/X86TargetStreamer.h
@@ -18,6 +18,10 @@ class X86TargetStreamer : public MCTargetStreamer {
public:
X86TargetStreamer(MCStreamer &S) : MCTargetStreamer(S) {}
+ virtual void emitCode16() {}
+ virtual void emitCode32() {}
+ virtual void emitCode64() {}
+
virtual bool emitFPOProc(const MCSymbol *ProcSym, unsigned ParamsSize,
SMLoc L = {}) {
return false;
diff --git a/llvm/lib/Target/X86/MCTargetDesc/X86WinCOFFTargetStreamer.cpp b/llvm/lib/Target/X86/MCTargetDesc/X86WinCOFFTargetStreamer.cpp
index 0d0b43f..16e878d 100644
--- a/llvm/lib/Target/X86/MCTargetDesc/X86WinCOFFTargetStreamer.cpp
+++ b/llvm/lib/Target/X86/MCTargetDesc/X86WinCOFFTargetStreamer.cpp
@@ -32,6 +32,10 @@ public:
MCInstPrinter &InstPrinter)
: X86TargetStreamer(S), OS(OS), InstPrinter(InstPrinter) {}
+ void emitCode16() override;
+ void emitCode32() override;
+ void emitCode64() override;
+
bool emitFPOProc(const MCSymbol *ProcSym, unsigned ParamsSize,
SMLoc L) override;
bool emitFPOEndPrologue(SMLoc L) override;
@@ -96,6 +100,12 @@ public:
};
} // end namespace
+void X86WinCOFFAsmTargetStreamer::emitCode16() { OS << "\t.code16\n"; }
+
+void X86WinCOFFAsmTargetStreamer::emitCode32() { OS << "\t.code32\n"; }
+
+void X86WinCOFFAsmTargetStreamer::emitCode64() { OS << "\t.code64\n"; }
+
bool X86WinCOFFAsmTargetStreamer::emitFPOProc(const MCSymbol *ProcSym,
unsigned ParamsSize, SMLoc L) {
OS << "\t.cv_fpo_proc\t";
@@ -452,9 +462,9 @@ MCTargetStreamer *llvm::createX86AsmTargetStreamer(MCStreamer &S,
MCTargetStreamer *
llvm::createX86ObjectTargetStreamer(MCStreamer &S, const MCSubtargetInfo &STI) {
- // No need to register a target streamer.
+ // No need for a special target streamer.
if (!STI.getTargetTriple().isOSBinFormatCOFF())
- return nullptr;
+ return new X86TargetStreamer(S);
// Registers itself to the MCStreamer.
return new X86WinCOFFTargetStreamer(S);
}
diff --git a/llvm/lib/Target/X86/X86AsmPrinter.cpp b/llvm/lib/Target/X86/X86AsmPrinter.cpp
index ce9a7c4..247b792 100644
--- a/llvm/lib/Target/X86/X86AsmPrinter.cpp
+++ b/llvm/lib/Target/X86/X86AsmPrinter.cpp
@@ -918,8 +918,11 @@ void X86AsmPrinter::emitStartOfAsmFile(Module &M) {
// If this is not inline asm and we're in 16-bit
// mode prefix assembly with .code16.
bool is16 = TT.getEnvironment() == Triple::CODE16;
- if (M.getModuleInlineAsm().empty() && is16)
- OutStreamer->emitAssemblerFlag(MCAF_Code16);
+ if (M.getModuleInlineAsm().empty() && is16) {
+ auto *XTS =
+ static_cast<X86TargetStreamer *>(OutStreamer->getTargetStreamer());
+ XTS->emitCode16();
+ }
}
static void
@@ -1011,7 +1014,7 @@ void X86AsmPrinter::emitEndOfAsmFile(Module &M) {
// points). If this doesn't occur, the linker can safely perform dead code
// stripping. Since LLVM never generates code that does this, it is always
// safe to set.
- OutStreamer->emitAssemblerFlag(MCAF_SubsectionsViaSymbols);
+ OutStreamer->emitSubsectionsViaSymbols();
} else if (TT.isOSBinFormatCOFF()) {
if (usesMSVCFloatingPoint(TT, M)) {
// In Windows' libcmt.lib, there is a file which is linked in only if the