[ThinLTO] Always parse module level inline asm with At&t dialect (PR46503)
clang-cl passes -x86-asm-syntax=intel to the cc1 invocation so that assembly listings produced by the /FA flag are printed in Intel dialect. That flag however should not affect the *parsing* of inline assembly in the program. (See r322652) When compiling normally, AsmPrinter::emitInlineAsm is used for assembling and defaults to At&t dialect. However, when compiling for ThinLTO, the code which parses module level inline asm to find symbols for the symbol table was failing to set the dialect. This patch fixes that. (See the bug for more details.) Differential revision: https://reviews.llvm.org/D82862
This commit is contained in:
parent
9182316395
commit
a8e582c830
21
clang/test/CodeGen/thinlto-inline-asm.c
Normal file
21
clang/test/CodeGen/thinlto-inline-asm.c
Normal file
@ -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");
|
@ -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 @@ initializeRecordStreamer(const Module &M,
|
||||
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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user