Index: llvm/include/llvm/MC/MCAsmInfo.h =================================================================== --- llvm/include/llvm/MC/MCAsmInfo.h +++ llvm/include/llvm/MC/MCAsmInfo.h @@ -16,6 +16,7 @@ #define LLVM_MC_MCASMINFO_H #include "llvm/ADT/StringRef.h" +#include "llvm/IR/InlineAsm.h" #include "llvm/MC/MCDirectives.h" #include "llvm/MC/MCTargetOptions.h" #include @@ -565,7 +566,13 @@ const char *getCode16Directive() const { return Code16Directive; } const char *getCode32Directive() const { return Code32Directive; } const char *getCode64Directive() const { return Code64Directive; } + // Default assembler dialect for AsmParser and AsmWriter. unsigned getAssemblerDialect() const { return AssemblerDialect; } + // Allow overriding default dialect for inline assembler. + virtual unsigned getInlineAsmDialect(InlineAsm::AsmDialect asmDialect) const { + return getAssemblerDialect(); + } + bool doesAllowAtInName() const { return AllowAtInName; } bool doesAllowSymbolAtNameStart() const { return AllowSymbolAtNameStart; } bool supportsNameQuoting() const { return SupportsQuotedNames; } Index: llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp =================================================================== --- llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp +++ llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp @@ -153,7 +153,7 @@ 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); + Parser->setAssemblerDialect(MAI->getInlineAsmDialect(Dialect)); Parser->setTargetParser(*TAP.get()); // Enable lexing Masm binary and hex integer literals in intel inline // assembly. @@ -543,7 +543,7 @@ raw_svector_ostream OS(StringData); // The variant of the current asmprinter. - int AsmPrinterVariant = MAI->getAssemblerDialect(); + int AsmPrinterVariant = MAI->getInlineAsmDialect(MI->getInlineAsmDialect()); AsmPrinter *AP = const_cast(this); if (MI->getInlineAsmDialect() == InlineAsm::AD_ATT) EmitGCCInlineAsmStr(AsmStr, MI, MMI, AsmPrinterVariant, AP, LocCookie, OS); Index: llvm/lib/Object/ModuleSymbolTable.cpp =================================================================== --- llvm/lib/Object/ModuleSymbolTable.cpp +++ llvm/lib/Object/ModuleSymbolTable.cpp @@ -119,7 +119,7 @@ // Module-level inline asm is assumed to use At&t syntax (see // AsmPrinter::doInitialization()). - Parser->setAssemblerDialect(InlineAsm::AD_ATT); + Parser->setAssemblerDialect(MAI->getInlineAsmDialect(InlineAsm::AD_ATT)); Parser->setTargetParser(*TAP); if (Parser->Run(false)) Index: llvm/lib/Target/X86/MCTargetDesc/X86MCAsmInfo.h =================================================================== --- llvm/lib/Target/X86/MCTargetDesc/X86MCAsmInfo.h +++ llvm/lib/Target/X86/MCTargetDesc/X86MCAsmInfo.h @@ -25,6 +25,7 @@ public: explicit X86MCAsmInfoDarwin(const Triple &Triple); + unsigned getInlineAsmDialect(InlineAsm::AsmDialect asmDialect) const override; }; struct X86_64MCAsmInfoDarwin : public X86MCAsmInfoDarwin { @@ -39,6 +40,7 @@ public: explicit X86ELFMCAsmInfo(const Triple &Triple); + unsigned getInlineAsmDialect(InlineAsm::AsmDialect asmDialect) const override; }; class X86MCAsmInfoMicrosoft : public MCAsmInfoMicrosoft { @@ -46,6 +48,7 @@ public: explicit X86MCAsmInfoMicrosoft(const Triple &Triple); + unsigned getInlineAsmDialect(InlineAsm::AsmDialect asmDialect) const override; }; class X86MCAsmInfoMicrosoftMASM : public X86MCAsmInfoMicrosoft { @@ -60,6 +63,7 @@ public: explicit X86MCAsmInfoGNUCOFF(const Triple &Triple); + unsigned getInlineAsmDialect(InlineAsm::AsmDialect asmDialect) const override; }; } // namespace llvm Index: llvm/lib/Target/X86/MCTargetDesc/X86MCAsmInfo.cpp =================================================================== --- llvm/lib/Target/X86/MCTargetDesc/X86MCAsmInfo.cpp +++ llvm/lib/Target/X86/MCTargetDesc/X86MCAsmInfo.cpp @@ -18,11 +18,17 @@ 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 enum AsmWriterFlavorTy X86InlineAsmDialect(InlineAsm::AsmDialect asmDialect) { + switch (asmDialect) { + case InlineAsm::AD_ATT: return ATT; + case InlineAsm::AD_Intel: return Intel; + } + llvm_unreachable("Invalid inline assembler dialect"); +} + static cl::opt AsmWriterFlavor( "x86-asm-syntax", cl::init(ATT), cl::Hidden, cl::desc("Choose style of code to emit from X86 backend:"), @@ -73,6 +79,10 @@ DwarfFDESymbolsUseAbsDiff = true; } +unsigned X86MCAsmInfoDarwin::getInlineAsmDialect(InlineAsm::AsmDialect asmDialect) const { + return X86InlineAsmDialect(asmDialect); +} + X86_64MCAsmInfoDarwin::X86_64MCAsmInfoDarwin(const Triple &Triple) : X86MCAsmInfoDarwin(Triple) { } @@ -102,6 +112,10 @@ ExceptionsType = ExceptionHandling::DwarfCFI; } +unsigned X86ELFMCAsmInfo::getInlineAsmDialect(InlineAsm::AsmDialect asmDialect) const { + return X86InlineAsmDialect(asmDialect); +} + const MCExpr * X86_64MCAsmInfoDarwin::getExprForPersonalitySymbol(const MCSymbol *Sym, unsigned Encoding, @@ -137,6 +151,10 @@ AllowAtInName = true; } +unsigned X86MCAsmInfoMicrosoft::getInlineAsmDialect(InlineAsm::AsmDialect asmDialect) const { + return X86InlineAsmDialect(asmDialect); +} + void X86MCAsmInfoMicrosoftMASM::anchor() { } X86MCAsmInfoMicrosoftMASM::X86MCAsmInfoMicrosoftMASM(const Triple &Triple) @@ -167,3 +185,7 @@ AllowAtInName = true; } + +unsigned X86MCAsmInfoGNUCOFF::getInlineAsmDialect(InlineAsm::AsmDialect asmDialect) const { + return X86InlineAsmDialect(asmDialect); +}