diff options
author | Reid Kleckner <reid@kleckner.net> | 2014-08-01 20:23:29 +0000 |
---|---|---|
committer | Reid Kleckner <reid@kleckner.net> | 2014-08-01 20:23:29 +0000 |
commit | e2d6429493d748e24917f8217f7ddd4d29d21ba2 (patch) | |
tree | 743cfbc69d215f38323e4ae79ec7f8de46f7bc75 /clang/test/CodeGen/ms-inline-asm-functions.c | |
parent | 05d2daf00c8777ef087e0cf0856633df9ea3762d (diff) | |
download | bcm5719-llvm-e2d6429493d748e24917f8217f7ddd4d29d21ba2.tar.gz bcm5719-llvm-e2d6429493d748e24917f8217f7ddd4d29d21ba2.zip |
MS inline asm: Tests for r214550
These tests seem like an exception to the rule against assembly emitting
tests in clang. I made an LLVM side change that can only be tested by
setting up the inline assembly machinery that is only implemented by
Clang.
llvm-svn: 214552
Diffstat (limited to 'clang/test/CodeGen/ms-inline-asm-functions.c')
-rw-r--r-- | clang/test/CodeGen/ms-inline-asm-functions.c | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/clang/test/CodeGen/ms-inline-asm-functions.c b/clang/test/CodeGen/ms-inline-asm-functions.c new file mode 100644 index 00000000000..1a6ead9286d --- /dev/null +++ b/clang/test/CodeGen/ms-inline-asm-functions.c @@ -0,0 +1,60 @@ +// 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())(int); + +int foo() { + // 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 *({{.*}}) + + // Broken case: Call through a global function pointer. + __asm call kptr; + // CHECK: calll _kptr + // CHECK-FIXME: calll *_kptr +} + +int bar() { + // CHECK-LABEL: _bar: + __asm jmp k; + // CHECK: jmp _k +} + +int baz() { + // 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() { + __asm pusha + __asm call k + __asm popa + __asm ret + // CHECK-LABEL: _naked: + // CHECK: pushal + // CHECK-NEXT: calll _k + // CHECK-NEXT: popal + // CHECK-NEXT: retl +} |