diff --git a/clang/test/CodeGen/thinlto-inline-asm.c b/clang/test/CodeGen/thinlto-inline-asm.c new file mode 100644 --- /dev/null +++ b/clang/test/CodeGen/thinlto-inline-asm.c @@ -0,0 +1,21 @@ +// REQUIRES: x86-registered-target + +// RUN: %clang_cc1 -triple x86_64-pc-windows-msvc19.11.0 -emit-llvm-bc \ +// RUN: -flto=thin -mllvm -x86-asm-syntax=intel -v \ +// RUN: -o %t.obj %s 2>&1 | FileCheck --check-prefix=CLANG %s +// +// RUN: llvm-lto2 dump-symtab %t.obj | FileCheck --check-prefix=SYMTAB %s + +// Module-level inline asm is parsed with At&t syntax. Test that the +// -x86-asm-syntax flag does not affect this. + +// CLANG-NOT: unknown token in expression +// SYMTAB: D------X foo +// SYMTAB: D------X bar + +void foo() {} + +asm(".globl bar \n" + "bar: \n" + " xor %eax, %eax\n" + " ret \n"); 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 @@ -23,6 +23,7 @@ #include "llvm/IR/GlobalAlias.h" #include "llvm/IR/GlobalValue.h" #include "llvm/IR/GlobalVariable.h" +#include "llvm/IR/InlineAsm.h" #include "llvm/IR/Module.h" #include "llvm/MC/MCAsmInfo.h" #include "llvm/MC/MCContext.h" @@ -116,6 +117,10 @@ if (!TAP) return; + // Module-level inline asm is assumed to use At&t syntax (see + // AsmPrinter::doInitialization()). + Parser->setAssemblerDialect(InlineAsm::AD_ATT); + Parser->setTargetParser(*TAP); if (Parser->Run(false)) return;