mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-28 17:26:06 +00:00

Summary: This fixes PR20023. In order to implement this scoping rule, we piggy back on the existing LabelDecl machinery, by creating LabelDecl's that will carry the "internal" name of the inline assembly label, which we will rewrite the asm label to. Reviewers: rnk Subscribers: cfe-commits Differential Revision: http://reviews.llvm.org/D4589 llvm-svn: 218230
65 lines
1.9 KiB
C
65 lines
1.9 KiB
C
// REQUIRES: x86-registered-target
|
|
// RUN: %clang_cc1 %s -triple i386-apple-darwin10 -fasm-blocks -emit-llvm -o - | opt -strip -S | FileCheck %s
|
|
|
|
// Some test cases for MS inline asm support from Mozilla code base.
|
|
|
|
void invoke_copy_to_stack() {}
|
|
|
|
void invoke(void* that, unsigned methodIndex,
|
|
unsigned paramCount, void* params)
|
|
{
|
|
// CHECK: @invoke
|
|
// CHECK: %5 = alloca i8*, align 4
|
|
// CHECK: %6 = alloca i32, align 4
|
|
// CHECK: %7 = alloca i32, align 4
|
|
// CHECK: %8 = alloca i8*, align 4
|
|
// CHECK: store i8* %0, i8** %5, align 4
|
|
// CHECK: store i32 %1, i32* %6, align 4
|
|
// CHECK: store i32 %2, i32* %7, align 4
|
|
// CHECK: store i8* %3, i8** %8, align 4
|
|
// CHECK: call void asm sideeffect inteldialect
|
|
// CHECK: mov edx,dword ptr $1
|
|
// CHECK: test edx,edx
|
|
// CHECK: jz {{[^_]*}}__MSASMLABEL_.0__noparams
|
|
// ^ Can't use {{.*}} here because the matching is greedy.
|
|
// CHECK: mov eax,edx
|
|
// CHECK: shl eax,$$3
|
|
// CHECK: sub esp,eax
|
|
// CHECK: mov ecx,esp
|
|
// CHECK: push dword ptr $0
|
|
// CHECK: call dword ptr $2
|
|
// CHECK: {{.*}}__MSASMLABEL_.0__noparams:
|
|
// CHECK: mov ecx,dword ptr $3
|
|
// CHECK: push ecx
|
|
// CHECK: mov edx,[ecx]
|
|
// CHECK: mov eax,dword ptr $4
|
|
// CHECK: call dword ptr[edx+eax*$$4]
|
|
// CHECK: mov esp,ebp
|
|
// CHECK: pop ebp
|
|
// CHECK: ret
|
|
// CHECK: "=*m,*m,*m,*m,*m,~{eax},~{ebp},~{ecx},~{edx},~{flags},~{esp},~{dirflag},~{fpsr},~{flags}"
|
|
// CHECK: (i8** %8, i32* %7, void (...)* bitcast (void ()* @invoke_copy_to_stack to void (...)*), i8** %5, i32* %6)
|
|
// CHECK: ret void
|
|
__asm {
|
|
mov edx,paramCount
|
|
test edx,edx
|
|
jz noparams
|
|
mov eax,edx
|
|
shl eax,3
|
|
sub esp,eax
|
|
mov ecx,esp
|
|
push params
|
|
call invoke_copy_to_stack
|
|
noparams:
|
|
mov ecx,that
|
|
push ecx
|
|
mov edx,[ecx]
|
|
mov eax,methodIndex
|
|
call dword ptr[edx+eax*4]
|
|
mov esp,ebp
|
|
pop ebp
|
|
ret
|
|
}
|
|
}
|
|
|