diff options
Diffstat (limited to 'llvm/lib')
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 |