[WinEH] Emit .safeseh directives for all 32-bit exception handlers
[oota-llvm.git] / test / CodeGen / X86 / win64_frame.ll
index a450a83f56fa470257ab821c63d168d0bd308425..2c62f4918a7f081e8050bfeb59341ae491d24f4c 100644 (file)
@@ -9,10 +9,10 @@ define i32 @f1(i32 %p1, i32 %p2, i32 %p3, i32 %p4, i32 %p5) "no-frame-pointer-el
 define void @f2(i32 %p, ...) "no-frame-pointer-elim"="true" {
   ; CHECK-LABEL: f2:
   ; CHECK:      .seh_stackalloc 8
-  ; CHECK:      leaq    16(%rsp), %rbp
-  ; CHECK:      .seh_setframe 5, 16
-  ; CHECK:      movq    %rdx, 16(%rbp)
-  ; CHECK:      leaq    16(%rbp), %rax
+  ; CHECK:      movq    %rsp, %rbp
+  ; CHECK:      .seh_setframe 5, 0
+  ; CHECK:      movq    %rdx, 32(%rbp)
+  ; CHECK:      leaq    32(%rbp), %rax
   %ap = alloca i8, align 8
   call void @llvm.va_start(i8* %ap)
   ret void
@@ -20,7 +20,7 @@ define void @f2(i32 %p, ...) "no-frame-pointer-elim"="true" {
 
 define i8* @f3() "no-frame-pointer-elim"="true" {
   ; CHECK-LABEL: f3:
-  ; CHECK:      leaq    (%rsp), %rbp
+  ; CHECK:      movq    %rsp, %rbp
   ; CHECK:      .seh_setframe 5, 0
   ; CHECK:      movq    8(%rbp), %rax
   %ra = call i8* @llvm.returnaddress(i32 0)
@@ -53,7 +53,7 @@ define void @f5() "no-frame-pointer-elim"="true" {
   ; CHECK:      leaq    -92(%rbp), %rcx
   ; CHECK:      callq   external
   %a = alloca [300 x i8]
-  %gep = getelementptr [300 x i8]* %a, i32 0, i32 0
+  %gep = getelementptr [300 x i8], [300 x i8]* %a, i32 0, i32 0
   call void @external(i8* %gep)
   ret void
 }
@@ -67,7 +67,7 @@ define void @f6(i32 %p, ...) "no-frame-pointer-elim"="true" {
   ; CHECK:      leaq    -92(%rbp), %rcx
   ; CHECK:      callq   external
   %a = alloca [300 x i8]
-  %gep = getelementptr [300 x i8]* %a, i32 0, i32 0
+  %gep = getelementptr [300 x i8], [300 x i8]* %a, i32 0, i32 0
   call void @external(i8* %gep)
   ret void
 }
@@ -76,20 +76,21 @@ define i32 @f7(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) "no-frame-pointer-elim"="
   ; CHECK-LABEL: f7:
   ; CHECK:      pushq   %rbp
   ; CHECK:      .seh_pushreg 5
-  ; CHECK:      subq    $320, %rsp
-  ; CHECK:      .seh_stackalloc 320
+  ; CHECK:      subq    $304, %rsp
+  ; CHECK:      .seh_stackalloc 304
   ; CHECK:      leaq    128(%rsp), %rbp
   ; CHECK:      .seh_setframe 5, 128
-  ; CHECK:      movl    240(%rbp), %eax
-  ; CHECK:      leaq    192(%rbp), %rsp
+  ; CHECK:      andq    $-64, %rsp
+  ; CHECK:      movl    224(%rbp), %eax
+  ; CHECK:      leaq    176(%rbp), %rsp
   alloca [300 x i8], align 64
   ret i32 %e
 }
 
 define i32 @f8(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) "no-frame-pointer-elim"="true" {
   ; CHECK-LABEL: f8:
-  ; CHECK:        subq    $384, %rsp
-  ; CHECK:        .seh_stackalloc 384
+  ; CHECK:        subq    $352, %rsp
+  ; CHECK:        .seh_stackalloc 352
   ; CHECK:        leaq    128(%rsp), %rbp
   ; CHECK:        .seh_setframe 5, 128
 
@@ -104,7 +105,7 @@ define i32 @f8(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) "no-frame-pointer-elim"="
   ; CHECK:        callq   __chkstk
   ; CHECK:        subq    %rax, %rsp
 
-  %gep = getelementptr [300 x i8]* %alloca, i32 0, i32 0
+  %gep = getelementptr [300 x i8], [300 x i8]* %alloca, i32 0, i32 0
   call void @external(i8* %gep)
   ; CHECK:        subq    $32, %rsp
   ; CHECK:        leaq    (%rbx), %rcx
@@ -113,7 +114,7 @@ define i32 @f8(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) "no-frame-pointer-elim"="
 
   ret i32 %e
   ; CHECK:        movl    %esi, %eax
-  ; CHECK:        leaq    256(%rbp), %rsp
+  ; CHECK:        leaq    224(%rbp), %rsp
 }
 
 declare i8* @llvm.returnaddress(i32) nounwind readnone