diff --git a/llvm/include/llvm/MC/MCAsmInfo.h b/llvm/include/llvm/MC/MCAsmInfo.h --- a/llvm/include/llvm/MC/MCAsmInfo.h +++ b/llvm/include/llvm/MC/MCAsmInfo.h @@ -51,6 +51,41 @@ } // end namespace LCOMM +namespace AsmDialect { + +enum Type { + Generic = 0, + AArch64_Generic = 0, + AArch64_Apple = 1, + AMDGPU_Generic = 0, + ARM_Generic = 0, + AVR_Generic = 0, + BPF_Generic = 0, + Hexagon_Generic = 0, + Lanai_Generic = 0, + LoongArch_Generic = 0, + MSP430_Generic = 0, + Mips_Generic = 0, + NVPTX_Generic = 0, + PPC_XCOFF = 0, + PPC_ELF = 1, + RISCV_Generic = 0, + Sparc_Generic = 0, + SystemZ_ATT = 0, + SystemZ_HLASM = 1, + VE_Generic = 0, + WebAssembly_Generic = 0, + + // Note: This numbering has to match the GCC assembler dialects for inline + // asm alternatives to work right. + X86_ATT = 0, + X86_Intel = 1, + + XCore_Generic = 0, +}; + +} // end namespace AsmDialect + /// This class is intended to be used as a base class for asm /// properties and features specific to the target. class MCAsmInfo { @@ -189,8 +224,8 @@ const char *Code32Directive; const char *Code64Directive; - /// Which dialect of an assembler variant to use. Defaults to 0 - unsigned AssemblerDialect = 0; + /// Which dialect of an assembler variant to use. Defaults to 0 / Generic + AsmDialect::Type AssemblerDialect = AsmDialect::Generic; /// This is true if the assembler allows @ characters in symbol names. /// Defaults to false. @@ -683,7 +718,7 @@ const char *getCode16Directive() const { return Code16Directive; } const char *getCode32Directive() const { return Code32Directive; } const char *getCode64Directive() const { return Code64Directive; } - unsigned getAssemblerDialect() const { return AssemblerDialect; } + AsmDialect::Type getAssemblerDialect() const { return AssemblerDialect; } bool doesAllowAtInName() const { return AllowAtInName; } void setAllowAtInName(bool V) { AllowAtInName = V; } bool doesAllowQuestionAtStartOfIdentifier() const { diff --git a/llvm/include/llvm/MC/MCParser/MCAsmParser.h b/llvm/include/llvm/MC/MCParser/MCAsmParser.h --- a/llvm/include/llvm/MC/MCParser/MCAsmParser.h +++ b/llvm/include/llvm/MC/MCParser/MCAsmParser.h @@ -14,6 +14,7 @@ #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringRef.h" #include "llvm/ADT/Twine.h" +#include "llvm/MC/MCAsmInfo.h" #include "llvm/MC/MCAsmMacro.h" #include "llvm/Support/SMLoc.h" #include @@ -170,8 +171,11 @@ MCTargetAsmParser &getTargetParser() const { return *TargetParser; } void setTargetParser(MCTargetAsmParser &P); - virtual unsigned getAssemblerDialect() { return 0;} - virtual void setAssemblerDialect(unsigned i) { } + virtual AsmDialect::Type getAssemblerDialect() { + return AsmDialect::Generic; + } + + virtual void setAssemblerDialect(AsmDialect::Type i) {} bool getShowParsedOperands() const { return ShowParsedOperands; } void setShowParsedOperands(bool Value) { ShowParsedOperands = Value; } diff --git a/llvm/include/llvm/MC/TargetRegistry.h b/llvm/include/llvm/MC/TargetRegistry.h --- a/llvm/include/llvm/MC/TargetRegistry.h +++ b/llvm/include/llvm/MC/TargetRegistry.h @@ -21,6 +21,7 @@ #include "llvm-c/DisassemblerTypes.h" #include "llvm/ADT/StringRef.h" #include "llvm/ADT/iterator_range.h" +#include "llvm/MC/MCAsmInfo.h" #include "llvm/MC/MCObjectFileInfo.h" #include "llvm/Support/CodeGen.h" #include "llvm/Support/ErrorHandling.h" @@ -184,7 +185,7 @@ const MCSubtargetInfo &STI, MCContext &Ctx); using MCInstPrinterCtorTy = MCInstPrinter *(*)(const Triple &T, - unsigned SyntaxVariant, + AsmDialect::Type Variant, const MCAsmInfo &MAI, const MCInstrInfo &MII, const MCRegisterInfo &MRI); @@ -527,7 +528,8 @@ return MCDisassemblerCtorFn(*this, STI, Ctx); } - MCInstPrinter *createMCInstPrinter(const Triple &T, unsigned SyntaxVariant, + MCInstPrinter *createMCInstPrinter(const Triple &T, + AsmDialect::Type SyntaxVariant, const MCAsmInfo &MAI, const MCInstrInfo &MII, const MCRegisterInfo &MRI) const { diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp --- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp @@ -116,7 +116,26 @@ if (!TAP) report_fatal_error("Inline asm not supported by this streamer because" " we don't have an asm parser for this target\n"); - Parser->setAssemblerDialect(Dialect); + + // Resolve `InlineAsm::AsmDialect` to `AsmDialect`. + AsmDialect::Type CorrespondingAsmDialect; + + switch (Dialect) { + case InlineAsm::AD_ATT: + CorrespondingAsmDialect = AsmDialect::X86_ATT; + break; + + case InlineAsm::AD_Intel: + CorrespondingAsmDialect = AsmDialect::X86_Intel; + break; + + default: + assert(false && "Inline Assembly Dialect not supported."); + break; + } + + Parser->setAssemblerDialect(CorrespondingAsmDialect); + Parser->setTargetParser(*TAP); // Enable lexing Masm binary and hex integer literals in intel inline // assembly. diff --git a/llvm/lib/MC/MCDisassembler/Disassembler.cpp b/llvm/lib/MC/MCDisassembler/Disassembler.cpp --- a/llvm/lib/MC/MCDisassembler/Disassembler.cpp +++ b/llvm/lib/MC/MCDisassembler/Disassembler.cpp @@ -94,7 +94,7 @@ DisAsm->setSymbolizer(std::move(Symbolizer)); // Set up the instruction printer. - int AsmPrinterVariant = MAI->getAssemblerDialect(); + AsmDialect::Type AsmPrinterVariant = MAI->getAssemblerDialect(); std::unique_ptr IP(TheTarget->createMCInstPrinter( Triple(TT), AsmPrinterVariant, *MAI, *MII, *MRI)); if (!IP) @@ -320,8 +320,9 @@ const MCAsmInfo *MAI = DC->getAsmInfo(); const MCInstrInfo *MII = DC->getInstrInfo(); const MCRegisterInfo *MRI = DC->getRegisterInfo(); - int AsmPrinterVariant = MAI->getAssemblerDialect(); - AsmPrinterVariant = AsmPrinterVariant == 0 ? 1 : 0; + AsmDialect::Type AsmPrinterVariant = MAI->getAssemblerDialect(); + // what is the following line supposed to achieve? Do we want this? + AsmPrinterVariant = (AsmDialect::Type)(AsmPrinterVariant == 0 ? 1 : 0); MCInstPrinter *IP = DC->getTarget()->createMCInstPrinter( Triple(DC->getTripleName()), AsmPrinterVariant, *MAI, *MII, *MRI); if (IP) { diff --git a/llvm/lib/MC/MCParser/AsmParser.cpp b/llvm/lib/MC/MCParser/AsmParser.cpp --- a/llvm/lib/MC/MCParser/AsmParser.cpp +++ b/llvm/lib/MC/MCParser/AsmParser.cpp @@ -169,7 +169,7 @@ SmallSet LTODiscardSymbols; /// AssemblerDialect. ~OU means unset value and use value provided by MAI. - unsigned AssemblerDialect = ~0U; + AsmDialect::Type AssemblerDialect = (AsmDialect::Type)~0U; /// is Darwin compatibility enabled? bool IsDarwin = false; @@ -227,13 +227,13 @@ CodeViewContext &getCVContext() { return Ctx.getCVContext(); } - unsigned getAssemblerDialect() override { + AsmDialect::Type getAssemblerDialect() override { if (AssemblerDialect == ~0U) return MAI.getAssemblerDialect(); else return AssemblerDialect; } - void setAssemblerDialect(unsigned i) override { + void setAssemblerDialect(AsmDialect::Type i) override { AssemblerDialect = i; } diff --git a/llvm/lib/MC/MCParser/MasmParser.cpp b/llvm/lib/MC/MCParser/MasmParser.cpp --- a/llvm/lib/MC/MCParser/MasmParser.cpp +++ b/llvm/lib/MC/MCParser/MasmParser.cpp @@ -449,8 +449,8 @@ SmallVector, 4> DirLabels; /// AssemblerDialect. ~OU means unset value and use value provided by MAI. - /// Defaults to 1U, meaning Intel. - unsigned AssemblerDialect = 1U; + /// Defaults to Intel. + AsmDialect::Type AssemblerDialect = AsmDialect::X86_Intel; /// is Darwin compatibility enabled? bool IsDarwin = false; @@ -498,13 +498,13 @@ CodeViewContext &getCVContext() { return Ctx.getCVContext(); } - unsigned getAssemblerDialect() override { + AsmDialect::Type getAssemblerDialect() override { if (AssemblerDialect == ~0U) return MAI.getAssemblerDialect(); else return AssemblerDialect; } - void setAssemblerDialect(unsigned i) override { + void setAssemblerDialect(AsmDialect::Type i) override { AssemblerDialect = i; } diff --git a/llvm/lib/Object/ModuleSymbolTable.cpp b/llvm/lib/Object/ModuleSymbolTable.cpp --- a/llvm/lib/Object/ModuleSymbolTable.cpp +++ b/llvm/lib/Object/ModuleSymbolTable.cpp @@ -118,7 +118,7 @@ // Module-level inline asm is assumed to use At&t syntax (see // AsmPrinter::doInitialization()). - Parser->setAssemblerDialect(InlineAsm::AD_ATT); + Parser->setAssemblerDialect(AsmDialect::X86_ATT); Parser->setTargetParser(*TAP); if (Parser->Run(false)) diff --git a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCAsmInfo.cpp b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCAsmInfo.cpp --- a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCAsmInfo.cpp +++ b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCAsmInfo.cpp @@ -18,22 +18,19 @@ #include "llvm/TargetParser/Triple.h" using namespace llvm; -enum AsmWriterVariantTy { - Default = -1, - Generic = 0, - Apple = 1 -}; - -static cl::opt AsmWriterVariant( - "aarch64-neon-syntax", cl::init(Default), +static cl::opt AsmWriterVariant( + "aarch64-neon-syntax", cl::init((AsmDialect::Type)-1), cl::desc("Choose style of NEON code to emit from AArch64 backend:"), - cl::values(clEnumValN(Generic, "generic", "Emit generic NEON assembly"), - clEnumValN(Apple, "apple", "Emit Apple-style NEON assembly"))); + cl::values(clEnumValN(AsmDialect::AArch64_Generic, "generic", + "Emit generic NEON assembly"), + clEnumValN(AsmDialect::AArch64_Apple, "apple", + "Emit Apple-style NEON assembly"))); AArch64MCAsmInfoDarwin::AArch64MCAsmInfoDarwin(bool IsILP32) { // We prefer NEON instructions to be printed in the short, Apple-specific // form when targeting Darwin. - AssemblerDialect = AsmWriterVariant == Default ? Apple : AsmWriterVariant; + AssemblerDialect = AsmWriterVariant == -1 ? AsmDialect::AArch64_Apple + : AsmDialect::AArch64_Generic; PrivateGlobalPrefix = "L"; PrivateLabelPrefix = "L"; @@ -71,7 +68,7 @@ // We prefer NEON instructions to be printed in the generic form when // targeting ELF. - AssemblerDialect = AsmWriterVariant == Default ? Generic : AsmWriterVariant; + AssemblerDialect = AsmWriterVariant == -1 ? AsmDialect::AArch64_Generic : AsmWriterVariant; CodePointerSize = T.getEnvironment() == Triple::GNUILP32 ? 4 : 8; diff --git a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCTargetDesc.cpp b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCTargetDesc.cpp --- a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCTargetDesc.cpp +++ b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCTargetDesc.cpp @@ -363,15 +363,17 @@ } static MCInstPrinter *createAArch64MCInstPrinter(const Triple &T, - unsigned SyntaxVariant, + AsmDialect::Type Variant, const MCAsmInfo &MAI, const MCInstrInfo &MII, const MCRegisterInfo &MRI) { - if (SyntaxVariant == 0) + if (Variant == AsmDialect::AArch64_Generic) return new AArch64InstPrinter(MAI, MII, MRI); - if (SyntaxVariant == 1) + else if (Variant == AsmDialect::AArch64_Apple) return new AArch64AppleInstPrinter(MAI, MII, MRI); + assert(false && "Unknown or unsupported syntax variant."); + return nullptr; } diff --git a/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUMCTargetDesc.cpp b/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUMCTargetDesc.cpp --- a/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUMCTargetDesc.cpp +++ b/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUMCTargetDesc.cpp @@ -82,10 +82,13 @@ } static MCInstPrinter *createAMDGPUMCInstPrinter(const Triple &T, - unsigned SyntaxVariant, + AsmDialect::Type Variant, const MCAsmInfo &MAI, const MCInstrInfo &MII, const MCRegisterInfo &MRI) { + assert(Variant == AsmDialect::AMDGPU_Generic && + "Unknown or unsupported syntax variant."); + if (T.getArch() == Triple::r600) return new R600InstPrinter(MAI, MII, MRI); else diff --git a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp b/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp --- a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp +++ b/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp @@ -6959,7 +6959,7 @@ // MatchInstructionImpl(), but that's too late for aliases that include // any sort of suffix. const FeatureBitset &AvailableFeatures = getAvailableFeatures(); - unsigned AssemblerDialect = getParser().getAssemblerDialect(); + AsmDialect::Type AssemblerDialect = getParser().getAssemblerDialect(); applyMnemonicAliases(Name, AvailableFeatures, AssemblerDialect); // First check for the ARM-specific .req directive. diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp --- a/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp +++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp @@ -377,12 +377,15 @@ } static MCInstPrinter *createARMMCInstPrinter(const Triple &T, - unsigned SyntaxVariant, + AsmDialect::Type Variant, const MCAsmInfo &MAI, const MCInstrInfo &MII, const MCRegisterInfo &MRI) { - if (SyntaxVariant == 0) + if (Variant == AsmDialect::ARM_Generic) return new ARMInstPrinter(MAI, MII, MRI); + + assert(false && "Unknown or unsupported syntax variant."); + return nullptr; } diff --git a/llvm/lib/Target/AVR/MCTargetDesc/AVRMCTargetDesc.cpp b/llvm/lib/Target/AVR/MCTargetDesc/AVRMCTargetDesc.cpp --- a/llvm/lib/Target/AVR/MCTargetDesc/AVRMCTargetDesc.cpp +++ b/llvm/lib/Target/AVR/MCTargetDesc/AVRMCTargetDesc.cpp @@ -58,13 +58,14 @@ } static MCInstPrinter *createAVRMCInstPrinter(const Triple &T, - unsigned SyntaxVariant, + AsmDialect::Type Variant, const MCAsmInfo &MAI, const MCInstrInfo &MII, const MCRegisterInfo &MRI) { - if (SyntaxVariant == 0) { + if (Variant == AsmDialect::AVR_Generic) return new AVRInstPrinter(MAI, MII, MRI); - } + + assert(false && "Unknown or unsupported syntax variant."); return nullptr; } diff --git a/llvm/lib/Target/BPF/MCTargetDesc/BPFMCTargetDesc.cpp b/llvm/lib/Target/BPF/MCTargetDesc/BPFMCTargetDesc.cpp --- a/llvm/lib/Target/BPF/MCTargetDesc/BPFMCTargetDesc.cpp +++ b/llvm/lib/Target/BPF/MCTargetDesc/BPFMCTargetDesc.cpp @@ -60,12 +60,15 @@ } static MCInstPrinter *createBPFMCInstPrinter(const Triple &T, - unsigned SyntaxVariant, + AsmDialect::Type Variant, const MCAsmInfo &MAI, const MCInstrInfo &MII, const MCRegisterInfo &MRI) { - if (SyntaxVariant == 0) + if (Variant == AsmDialect::BPF_Generic) return new BPFInstPrinter(MAI, MII, MRI); + + assert(false && "Unknown or unsupported syntax variant."); + return nullptr; } diff --git a/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCTargetDesc.cpp b/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCTargetDesc.cpp --- a/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCTargetDesc.cpp +++ b/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCTargetDesc.cpp @@ -328,15 +328,17 @@ } static MCInstPrinter *createHexagonMCInstPrinter(const Triple &T, - unsigned SyntaxVariant, + AsmDialect::Type Variant, const MCAsmInfo &MAI, const MCInstrInfo &MII, const MCRegisterInfo &MRI) { - if (SyntaxVariant == 0) + if (Variant == AsmDialect::Hexagon_Generic) return new HexagonInstPrinter(MAI, MII, MRI); - else - return nullptr; + + assert(false && "Unknown or unsupported syntax variant."); + + return nullptr; } static MCTargetStreamer * diff --git a/llvm/lib/Target/Lanai/MCTargetDesc/LanaiMCTargetDesc.cpp b/llvm/lib/Target/Lanai/MCTargetDesc/LanaiMCTargetDesc.cpp --- a/llvm/lib/Target/Lanai/MCTargetDesc/LanaiMCTargetDesc.cpp +++ b/llvm/lib/Target/Lanai/MCTargetDesc/LanaiMCTargetDesc.cpp @@ -73,12 +73,15 @@ } static MCInstPrinter *createLanaiMCInstPrinter(const Triple & /*T*/, - unsigned SyntaxVariant, + AsmDialect::Type Variant, const MCAsmInfo &MAI, const MCInstrInfo &MII, const MCRegisterInfo &MRI) { - if (SyntaxVariant == 0) + if (Variant == AsmDialect::Lanai_Generic) return new LanaiInstPrinter(MAI, MII, MRI); + + assert(false && "Unknown or unsupported syntax variant."); + return nullptr; } diff --git a/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCTargetDesc.cpp b/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCTargetDesc.cpp --- a/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCTargetDesc.cpp +++ b/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCTargetDesc.cpp @@ -73,11 +73,16 @@ } static MCInstPrinter *createLoongArchMCInstPrinter(const Triple &T, - unsigned SyntaxVariant, + AsmDialect::Type Variant, const MCAsmInfo &MAI, const MCInstrInfo &MII, const MCRegisterInfo &MRI) { - return new LoongArchInstPrinter(MAI, MII, MRI); + if (Variant == AsmDialect::LoongArch_Generic) + return new LoongArchInstPrinter(MAI, MII, MRI); + + assert(false && "Unknown or unsupported syntax variant."); + + return nullptr; } static MCTargetStreamer * diff --git a/llvm/lib/Target/MSP430/MCTargetDesc/MSP430MCTargetDesc.cpp b/llvm/lib/Target/MSP430/MCTargetDesc/MSP430MCTargetDesc.cpp --- a/llvm/lib/Target/MSP430/MCTargetDesc/MSP430MCTargetDesc.cpp +++ b/llvm/lib/Target/MSP430/MCTargetDesc/MSP430MCTargetDesc.cpp @@ -71,12 +71,15 @@ } static MCInstPrinter *createMSP430MCInstPrinter(const Triple &T, - unsigned SyntaxVariant, + AsmDialect::Type Variant, const MCAsmInfo &MAI, const MCInstrInfo &MII, const MCRegisterInfo &MRI) { - if (SyntaxVariant == 0) + if (Variant == AsmDialect::MSP430_Generic) return new MSP430InstPrinter(MAI, MII, MRI); + + assert(false && "Unknown or unsupported syntax variant."); + return nullptr; } diff --git a/llvm/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.cpp b/llvm/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.cpp --- a/llvm/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.cpp +++ b/llvm/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.cpp @@ -94,11 +94,16 @@ } static MCInstPrinter *createMipsMCInstPrinter(const Triple &T, - unsigned SyntaxVariant, + AsmDialect::Type Variant, const MCAsmInfo &MAI, const MCInstrInfo &MII, const MCRegisterInfo &MRI) { - return new MipsInstPrinter(MAI, MII, MRI); + if (Variant == AsmDialect::Mips_Generic) + return new MipsInstPrinter(MAI, MII, MRI); + + assert(false && "Unknown or unsupported syntax variant."); + + return nullptr; } static MCStreamer *createMCStreamer(const Triple &T, MCContext &Context, diff --git a/llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXMCTargetDesc.cpp b/llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXMCTargetDesc.cpp --- a/llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXMCTargetDesc.cpp +++ b/llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXMCTargetDesc.cpp @@ -51,12 +51,15 @@ } static MCInstPrinter *createNVPTXMCInstPrinter(const Triple &T, - unsigned SyntaxVariant, + AsmDialect::Type Variant, const MCAsmInfo &MAI, const MCInstrInfo &MII, const MCRegisterInfo &MRI) { - if (SyntaxVariant == 0) + if (Variant == AsmDialect::NVPTX_Generic) return new NVPTXInstPrinter(MAI, MII, MRI); + + assert(false && "Unknown or unsupported syntax variant."); + return nullptr; } diff --git a/llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCAsmInfo.cpp b/llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCAsmInfo.cpp --- a/llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCAsmInfo.cpp +++ b/llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCAsmInfo.cpp @@ -50,7 +50,7 @@ ZeroDirective = "\t.space\t"; Data64bitsDirective = is64Bit ? "\t.quad\t" : nullptr; - AssemblerDialect = 1; // New-Style mnemonics. + AssemblerDialect = AsmDialect::PPC_ELF; // New-Style mnemonics. LCOMMDirectiveAlignmentType = LCOMM::ByteAlignment; } diff --git a/llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCTargetDesc.cpp b/llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCTargetDesc.cpp --- a/llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCTargetDesc.cpp +++ b/llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCTargetDesc.cpp @@ -366,11 +366,16 @@ } static MCInstPrinter *createPPCMCInstPrinter(const Triple &T, - unsigned SyntaxVariant, + AsmDialect::Type Variant, const MCAsmInfo &MAI, const MCInstrInfo &MII, const MCRegisterInfo &MRI) { - return new PPCInstPrinter(MAI, MII, MRI, T); + if (Variant == AsmDialect::PPC_XCOFF || Variant == AsmDialect::PPC_ELF) + return new PPCInstPrinter(MAI, MII, MRI, T); + + assert(false && "Unknown or unsupported syntax variant."); + + return nullptr; } namespace { diff --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCTargetDesc.cpp b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCTargetDesc.cpp --- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCTargetDesc.cpp +++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCTargetDesc.cpp @@ -85,11 +85,16 @@ } static MCInstPrinter *createRISCVMCInstPrinter(const Triple &T, - unsigned SyntaxVariant, + AsmDialect::Type Variant, const MCAsmInfo &MAI, const MCInstrInfo &MII, const MCRegisterInfo &MRI) { - return new RISCVInstPrinter(MAI, MII, MRI); + if (Variant == AsmDialect::RISCV_Generic) + return new RISCVInstPrinter(MAI, MII, MRI); + + assert(false && "Unknown or unsupported syntax variant."); + + return nullptr; } static MCTargetStreamer * diff --git a/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCTargetDesc.cpp b/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCTargetDesc.cpp --- a/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCTargetDesc.cpp +++ b/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCTargetDesc.cpp @@ -89,11 +89,16 @@ } static MCInstPrinter *createSparcMCInstPrinter(const Triple &T, - unsigned SyntaxVariant, + AsmDialect::Type Variant, const MCAsmInfo &MAI, const MCInstrInfo &MII, const MCRegisterInfo &MRI) { - return new SparcInstPrinter(MAI, MII, MRI); + if (Variant == AsmDialect::Sparc_Generic) + return new SparcInstPrinter(MAI, MII, MRI); + + assert(false && "Unknown or unsupported syntax variant."); + + return nullptr; } extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeSparcTargetMC() { diff --git a/llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp b/llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp --- a/llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp +++ b/llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp @@ -460,7 +460,7 @@ // For this purpose, we explicitly query the SystemZMCAsmInfo instance // here, to get the "correct" assembler dialect, and use it in various // functions. - unsigned getMAIAssemblerDialect() { + AsmDialect::Type getMAIAssemblerDialect() { return Parser.getContext().getAsmInfo()->getAssemblerDialect(); } @@ -474,10 +474,14 @@ inline bool isHLASMAlnum(char C) { return isHLASMAlpha(C) || isDigit(C); } // Are we parsing using the AD_HLASM dialect? - inline bool isParsingHLASM() { return getMAIAssemblerDialect() == AD_HLASM; } + inline bool isParsingHLASM() { + return getMAIAssemblerDialect() == AsmDialect::SystemZ_HLASM; + } // Are we parsing using the AD_ATT dialect? - inline bool isParsingATT() { return getMAIAssemblerDialect() == AD_ATT; } + inline bool isParsingATT() { + return getMAIAssemblerDialect() == AsmDialect::SystemZ_ATT; + } public: SystemZAsmParser(const MCSubtargetInfo &sti, MCAsmParser &parser, diff --git a/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZInstPrinter.cpp b/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZInstPrinter.cpp --- a/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZInstPrinter.cpp +++ b/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZInstPrinter.cpp @@ -61,7 +61,7 @@ MCRegister Reg, raw_ostream &O) const { const char *RegName = getRegisterName(Reg); - if (MAI->getAssemblerDialect() == AD_HLASM) { + if (MAI->getAssemblerDialect() == AsmDialect::SystemZ_HLASM) { // Skip register prefix so that only register number is left assert(isalpha(RegName[0]) && isdigit(RegName[1])); O << markup(""); diff --git a/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCAsmInfo.h b/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCAsmInfo.h --- a/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCAsmInfo.h +++ b/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCAsmInfo.h @@ -15,7 +15,6 @@ namespace llvm { class Triple; -enum SystemZAsmDialect { AD_ATT = 0, AD_HLASM = 1 }; class SystemZMCAsmInfoELF : public MCAsmInfoELF { public: diff --git a/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCAsmInfo.cpp b/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCAsmInfo.cpp --- a/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCAsmInfo.cpp +++ b/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCAsmInfo.cpp @@ -13,7 +13,7 @@ using namespace llvm; SystemZMCAsmInfoELF::SystemZMCAsmInfoELF(const Triple &TT) { - AssemblerDialect = AD_ATT; + AssemblerDialect = AsmDialect::SystemZ_ATT; CalleeSaveStackSlotSize = 8; CodePointerSize = 8; Data64bitsDirective = "\t.quad\t"; @@ -31,7 +31,7 @@ AllowAtAtStartOfIdentifier = true; AllowDollarAtStartOfIdentifier = true; AllowHashAtStartOfIdentifier = true; - AssemblerDialect = AD_HLASM; + AssemblerDialect = AsmDialect::SystemZ_HLASM; CalleeSaveStackSlotSize = 8; CodePointerSize = 8; CommentString = "*"; diff --git a/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCTargetDesc.cpp b/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCTargetDesc.cpp --- a/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCTargetDesc.cpp +++ b/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCTargetDesc.cpp @@ -182,11 +182,17 @@ } static MCInstPrinter *createSystemZMCInstPrinter(const Triple &T, - unsigned SyntaxVariant, + AsmDialect::Type Variant, const MCAsmInfo &MAI, const MCInstrInfo &MII, const MCRegisterInfo &MRI) { - return new SystemZInstPrinter(MAI, MII, MRI); + if (Variant == AsmDialect::SystemZ_ATT || + Variant == AsmDialect::SystemZ_HLASM) + return new SystemZInstPrinter(MAI, MII, MRI); + + assert(false && "Unknown or unsupported syntax variant."); + + return nullptr; } void SystemZTargetStreamer::emitConstantPools() { diff --git a/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp b/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp --- a/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp +++ b/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp @@ -877,7 +877,7 @@ static void printFormattedRegName(const MCAsmInfo *MAI, unsigned RegNo, raw_ostream &OS) { const char *RegName = SystemZInstPrinter::getRegisterName(RegNo); - if (MAI->getAssemblerDialect() == AD_HLASM) { + if (MAI->getAssemblerDialect() == AsmDialect::SystemZ_HLASM) { // Skip register prefix so that only register number is left assert(isalpha(RegName[0]) && isdigit(RegName[1])); OS << (RegName + 1); diff --git a/llvm/lib/Target/VE/MCTargetDesc/VEMCTargetDesc.cpp b/llvm/lib/Target/VE/MCTargetDesc/VEMCTargetDesc.cpp --- a/llvm/lib/Target/VE/MCTargetDesc/VEMCTargetDesc.cpp +++ b/llvm/lib/Target/VE/MCTargetDesc/VEMCTargetDesc.cpp @@ -78,11 +78,16 @@ } static MCInstPrinter *createVEMCInstPrinter(const Triple &T, - unsigned SyntaxVariant, + AsmDialect::Type Variant, const MCAsmInfo &MAI, const MCInstrInfo &MII, const MCRegisterInfo &MRI) { - return new VEInstPrinter(MAI, MII, MRI); + if (Variant == AsmDialect::VE_Generic) + return new VEInstPrinter(MAI, MII, MRI); + + assert(false && "Unknown or unsupported syntax variant."); + + return nullptr; } extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeVETargetMC() { diff --git a/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.cpp b/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.cpp --- a/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.cpp +++ b/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.cpp @@ -74,12 +74,16 @@ } static MCInstPrinter *createMCInstPrinter(const Triple & /*T*/, - unsigned SyntaxVariant, + AsmDialect::Type Variant, const MCAsmInfo &MAI, const MCInstrInfo &MII, const MCRegisterInfo &MRI) { - assert(SyntaxVariant == 0 && "WebAssembly only has one syntax variant"); - return new WebAssemblyInstPrinter(MAI, MII, MRI); + if (Variant == AsmDialect::WebAssembly_Generic) + return new WebAssemblyInstPrinter(MAI, MII, MRI); + + assert(false && "Unknown or unsupported syntax variant."); + + return nullptr; } static MCCodeEmitter *createCodeEmitter(const MCInstrInfo &MCII, diff --git a/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp b/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp --- a/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp +++ b/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp @@ -1243,7 +1243,7 @@ } bool isParsingIntelSyntax() { - return getParser().getAssemblerDialect(); + return getParser().getAssemblerDialect() == AsmDialect::X86_Intel; } /// @name Auto-generated Matcher Functions @@ -4471,10 +4471,10 @@ "supported: registers must have a " "'%' prefix in .att_syntax"); } - getParser().setAssemblerDialect(0); + getParser().setAssemblerDialect(AsmDialect::X86_ATT); return false; } else if (IDVal.startswith(".intel_syntax")) { - getParser().setAssemblerDialect(1); + getParser().setAssemblerDialect(AsmDialect::X86_Intel); if (getLexer().isNot(AsmToken::EndOfStatement)) { if (Parser.getTok().getString() == "noprefix") Parser.Lex(); diff --git a/llvm/lib/Target/X86/MCTargetDesc/X86MCAsmInfo.cpp b/llvm/lib/Target/X86/MCTargetDesc/X86MCAsmInfo.cpp --- a/llvm/lib/Target/X86/MCTargetDesc/X86MCAsmInfo.cpp +++ b/llvm/lib/Target/X86/MCTargetDesc/X86MCAsmInfo.cpp @@ -17,17 +17,13 @@ #include "llvm/TargetParser/Triple.h" using namespace llvm; -enum AsmWriterFlavorTy { - // Note: This numbering has to match the GCC assembler dialects for inline - // asm alternatives to work right. - ATT = 0, Intel = 1 -}; - -static cl::opt AsmWriterFlavor( - "x86-asm-syntax", cl::init(ATT), cl::Hidden, +static cl::opt AsmWriterFlavor( + "x86-asm-syntax", cl::init(AsmDialect::X86_ATT), cl::Hidden, cl::desc("Choose style of code to emit from X86 backend:"), - cl::values(clEnumValN(ATT, "att", "Emit AT&T-style assembly"), - clEnumValN(Intel, "intel", "Emit Intel-style assembly"))); + cl::values(clEnumValN(AsmDialect::X86_ATT, "att", + "Emit AT&T-style assembly"), + clEnumValN(AsmDialect::X86_Intel, "intel", + "Emit Intel-style assembly"))); static cl::opt MarkedJTDataRegions("mark-data-regions", cl::init(true), diff --git a/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp b/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp --- a/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp +++ b/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp @@ -468,14 +468,17 @@ } static MCInstPrinter *createX86MCInstPrinter(const Triple &T, - unsigned SyntaxVariant, + AsmDialect::Type Variant, const MCAsmInfo &MAI, const MCInstrInfo &MII, const MCRegisterInfo &MRI) { - if (SyntaxVariant == 0) + if (Variant == AsmDialect::X86_ATT) return new X86ATTInstPrinter(MAI, MII, MRI); - if (SyntaxVariant == 1) + else if (Variant == AsmDialect::X86_Intel) return new X86IntelInstPrinter(MAI, MII, MRI); + + assert(false && "Unknown or unsupported syntax variant."); + return nullptr; } diff --git a/llvm/lib/Target/XCore/MCTargetDesc/XCoreMCTargetDesc.cpp b/llvm/lib/Target/XCore/MCTargetDesc/XCoreMCTargetDesc.cpp --- a/llvm/lib/Target/XCore/MCTargetDesc/XCoreMCTargetDesc.cpp +++ b/llvm/lib/Target/XCore/MCTargetDesc/XCoreMCTargetDesc.cpp @@ -68,11 +68,16 @@ } static MCInstPrinter *createXCoreMCInstPrinter(const Triple &T, - unsigned SyntaxVariant, + AsmDialect::Type Variant, const MCAsmInfo &MAI, const MCInstrInfo &MII, const MCRegisterInfo &MRI) { - return new XCoreInstPrinter(MAI, MII, MRI); + if (Variant == AsmDialect::XCore_Generic) + return new XCoreInstPrinter(MAI, MII, MRI); + + assert(false && "Unknown or unsupported syntax variant."); + + return nullptr; } XCoreTargetStreamer::XCoreTargetStreamer(MCStreamer &S) : MCTargetStreamer(S) {} diff --git a/llvm/tools/llvm-exegesis/lib/DisassemblerHelper.cpp b/llvm/tools/llvm-exegesis/lib/DisassemblerHelper.cpp --- a/llvm/tools/llvm-exegesis/lib/DisassemblerHelper.cpp +++ b/llvm/tools/llvm-exegesis/lib/DisassemblerHelper.cpp @@ -20,7 +20,7 @@ AsmInfo_.reset(TM.getTarget().createMCAsmInfo(State_.getRegInfo(), Triple.str(), MCOptions)); InstPrinter_.reset(TM.getTarget().createMCInstPrinter( - Triple, 0 /*default variant*/, *AsmInfo_, State_.getInstrInfo(), + Triple, AsmDialect::Generic, *AsmInfo_, State_.getInstrInfo(), State_.getRegInfo())); Context_ = std::make_unique( diff --git a/llvm/tools/llvm-mc/llvm-mc.cpp b/llvm/tools/llvm-mc/llvm-mc.cpp --- a/llvm/tools/llvm-mc/llvm-mc.cpp +++ b/llvm/tools/llvm-mc/llvm-mc.cpp @@ -516,8 +516,9 @@ MCInstPrinter *IP = nullptr; if (FileType == OFT_AssemblyFile) { - IP = TheTarget->createMCInstPrinter(Triple(TripleName), OutputAsmVariant, - *MAI, *MCII, *MRI); + IP = TheTarget->createMCInstPrinter( + Triple(TripleName), (AsmDialect::Type)OutputAsmVariant.getValue(), + *MAI, *MCII, *MRI); if (!IP) { WithColor::error() diff --git a/llvm/tools/llvm-mca/CodeRegionGenerator.h b/llvm/tools/llvm-mca/CodeRegionGenerator.h --- a/llvm/tools/llvm-mca/CodeRegionGenerator.h +++ b/llvm/tools/llvm-mca/CodeRegionGenerator.h @@ -186,7 +186,7 @@ const MCAsmInfo &MAI; const MCSubtargetInfo &STI; const MCInstrInfo &MCII; - unsigned AssemblerDialect; // This is set during parsing. + AsmDialect::Type AssemblerDialect; // This is set during parsing. protected: MCContext &Ctx; @@ -194,13 +194,14 @@ public: AsmCodeRegionGenerator(const Target &T, MCContext &C, const MCAsmInfo &A, const MCSubtargetInfo &S, const MCInstrInfo &I) - : TheTarget(T), MAI(A), STI(S), MCII(I), AssemblerDialect(0), Ctx(C) {} + : TheTarget(T), MAI(A), STI(S), MCII(I), + AssemblerDialect(AsmDialect::Generic), Ctx(C) {} virtual MCACommentConsumer *getCommentConsumer() = 0; virtual CodeRegions &getRegions() = 0; virtual MCStreamerWrapper *getMCStreamer() = 0; - unsigned getAssemblerDialect() const { return AssemblerDialect; } + AsmDialect::Type getAssemblerDialect() const { return AssemblerDialect; } Expected parseCodeRegions(const std::unique_ptr &IP) override; }; diff --git a/llvm/tools/llvm-mca/llvm-mca.cpp b/llvm/tools/llvm-mca/llvm-mca.cpp --- a/llvm/tools/llvm-mca/llvm-mca.cpp +++ b/llvm/tools/llvm-mca/llvm-mca.cpp @@ -415,8 +415,8 @@ // Without an MCTargetStreamer, certain assembly directives can trigger a // segfault. (For example, the .cv_fpo_proc directive on x86 will segfault if // we don't initialize the MCTargetStreamer.) - unsigned IPtempOutputAsmVariant = - OutputAsmVariant == -1 ? 0 : OutputAsmVariant; + const AsmDialect::Type IPtempOutputAsmVariant = + (AsmDialect::Type)(OutputAsmVariant == -1 ? 0 : OutputAsmVariant); std::unique_ptr IPtemp(TheTarget->createMCInstPrinter( Triple(TripleName), IPtempOutputAsmVariant, *MAI, *MCII, *MRI)); if (!IPtemp) { @@ -501,9 +501,9 @@ return 1; } - unsigned AssemblerDialect = CRG.getAssemblerDialect(); + AsmDialect::Type AssemblerDialect = CRG.getAssemblerDialect(); if (OutputAsmVariant >= 0) - AssemblerDialect = static_cast(OutputAsmVariant); + AssemblerDialect = (AsmDialect::Type)OutputAsmVariant.getValue(); std::unique_ptr IP(TheTarget->createMCInstPrinter( Triple(TripleName), AssemblerDialect, *MAI, *MCII, *MRI)); if (!IP) {