llvm-project/clang/test/CodeGen/ms-inline-asm-functions.c
Alvin Wong 8cd90fd1a8 [X86][MC] Fix parsing Intel syntax indirect branch with symbol only
Clang on Windows targets often requires indirect calls through the
import address table (IAT), and also .refptr stubs for MinGW target.
On 32-bit this generates assembly in the form of
`call dword ptr [__imp__func]`, which MC had failed to handle correctly.
64-bit targets are not affected because rip-relative addressing is used.

Reported on: https://github.com/llvm/llvm-project/issues/62010

Depends on D149695, D149920

Differential Revision: https://reviews.llvm.org/D149579
2023-05-09 00:07:40 +08:00

72 lines
1.6 KiB
C

// REQUIRES: x86-registered-target
// RUN: %clang_cc1 %s -triple i386-pc-windows-msvc -fms-extensions -S -o - | FileCheck %s
// Yes, this is an assembly test from Clang, because we need to make it all the
// way through code generation to know if our call became a direct, pc-relative
// call or an indirect call through memory.
int k(int);
__declspec(dllimport) int kimport(int);
int (*kptr)(int);
int (*gptr(void))(int);
int foo(void) {
// CHECK-LABEL: _foo:
int (*r)(int) = gptr();
// Simple case: direct call.
__asm call k;
// CHECK: calll _k
// Marginally harder: indirect calls, via dllimport or function pointer.
__asm call r;
// CHECK: calll *({{.*}})
__asm call kimport;
// CHECK: calll *({{.*}})
// Call through a global function pointer.
__asm call kptr;
// CHECK: calll *_kptr
}
int bar(void) {
// CHECK-LABEL: _bar:
__asm {
jmp k
ja k
JAE k
LOOP k
loope k
loopne k
};
// CHECK: jmp _k
// CHECK-NEXT: ja _k
// CHECK-NEXT: jae _k
// CHECK-NEXT: loop _k
// CHECK-NEXT: loope _k
// CHECK-NEXT: loopne _k
}
int baz(void) {
// CHECK-LABEL: _baz:
__asm mov eax, k;
// CHECK: movl _k, %eax
__asm mov eax, kptr;
// CHECK: movl _kptr, %eax
}
// Test that this asm blob doesn't require more registers than available. This
// has to be an LLVM code generation test.
void __declspec(naked) naked(void) {
__asm pusha
__asm call k
__asm popa
__asm ret
// CHECK-LABEL: _naked:
// CHECK: pushal
// CHECK-NEXT: calll _k
// CHECK-NEXT: popal
// CHECK-NEXT: retl
}