[WinEH] Strip the \01 character from the __CxxFrameHandler3 thunk name
authorReid Kleckner <reid@kleckner.net>
Mon, 13 Jul 2015 17:55:14 +0000 (17:55 +0000)
committerReid Kleckner <reid@kleckner.net>
Mon, 13 Jul 2015 17:55:14 +0000 (17:55 +0000)
Add another C++ 32-bit EH table test.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@242044 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86WinEHState.cpp
test/CodeGen/WinEH/cppeh-prepared-catch.ll

index 1bbcf704255da8df43c06f11429330c88f7961ef..9190d0be9e4d78b73aa2dae187b4099b669ae55b 100644 (file)
@@ -336,9 +336,11 @@ Function *WinEHStatePass::generateLSDAInEAXThunk(Function *ParentFunc) {
   FunctionType *TargetFuncTy =
       FunctionType::get(Int32Ty, makeArrayRef(&ArgTys[0], 5),
                         /*isVarArg=*/false);
-  Function *Trampoline = Function::Create(
-      TrampolineTy, GlobalValue::InternalLinkage,
-      Twine("__ehhandler$") + ParentFunc->getName(), TheModule);
+  Function *Trampoline =
+      Function::Create(TrampolineTy, GlobalValue::InternalLinkage,
+                       Twine("__ehhandler$") + GlobalValue::getRealLinkageName(
+                                                   ParentFunc->getName()),
+                       TheModule);
   BasicBlock *EntryBB = BasicBlock::Create(Context, "entry", Trampoline);
   IRBuilder<> Builder(EntryBB);
   Value *LSDA = emitEHLSDA(Builder, ParentFunc);
index 255709ceb4ec019553cbf5df09bbcdb115182828..a5d86dceea93d4896395cd6bbd1b9d078683062f 100644 (file)
@@ -1,7 +1,5 @@
-; RUN: llc < %s | FileCheck %s
-
-target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
-target triple = "x86_64-pc-windows-msvc"
+; RUN: llc -mtriple=x86_64-windows-msvc < %s | FileCheck %s --check-prefix=CHECK --check-prefix=X64
+; RUN: llc -mtriple=i686-windows-msvc < %s | FileCheck %s --check-prefix=CHECK --check-prefix=X86
 
 ; This test case is equivalent to:
 ; void f() {
@@ -51,9 +49,9 @@ lpad1:                                            ; preds = %entry
 
 ; CHECK-LABEL: "?f@@YAXXZ.catch":
 ; No code should be generated for the indirectbr.
-; CHECK-NOT: jmpq *
-; CHECK:        .seh_handlerdata
-; CHECK:        .long   ("$cppxdata$?f@@YAXXZ")@IMGREL
+; CHECK-NOT: jmp{{[ql]}} *
+; X64:        .seh_handlerdata
+; X64-NEXT:        .long   ("$cppxdata$?f@@YAXXZ")@IMGREL
 
 
 define internal i8* @"\01?f@@YAXXZ.catch1"(i8*, i8*) #4 personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*) {
@@ -76,11 +74,11 @@ lpad:                                             ; preds = %entry
 
 ; CHECK-LABEL: "?f@@YAXXZ.catch1":
 ; No code should be generated for the indirectbr.
-; CHECK-NOT: jmpq *
-; CHECK: ".L?f@@YAXXZ.catch1$parent_frame_offset" = 16
-; CHECK:         movq    %rdx, 16(%rsp)
-; CHECK:        .seh_handlerdata
-; CHECK:        .long   ("$cppxdata$?f@@YAXXZ")@IMGREL
+; CHECK-NOT: jmp{{[ql]}} *
+; X64: ".L?f@@YAXXZ.catch1$parent_frame_offset" = 16
+; X64:         movq    %rdx, 16(%rsp)
+; X64:        .seh_handlerdata
+; X64:        .long   ("$cppxdata$?f@@YAXXZ")@IMGREL
 
 define void @"\01?f@@YAXXZ"() #0 personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*) {
 entry:
@@ -118,21 +116,38 @@ try.cont8:                                        ; preds = %lpad2, %try.cont
 
 ; CHECK-LABEL: "?f@@YAXXZ":
 ; No code should be generated for the indirectbr.
-; CHECK-NOT: jmpq *
-; CHECK:             .seh_handlerdata
-; CHECK-NEXT:        .long   ("$cppxdata$?f@@YAXXZ")@IMGREL
-; CHECK-NEXT: .align 4
-; CHECK-NEXT:"$cppxdata$?f@@YAXXZ":
-; CHECK-NEXT:        .long   429065506
-; CHECK-NEXT:        .long   4
-; CHECK-NEXT:        .long   ("$stateUnwindMap$?f@@YAXXZ")@IMGREL
-; CHECK-NEXT:        .long   2
-; CHECK-NEXT:        .long   ("$tryMap$?f@@YAXXZ")@IMGREL
-; CHECK-NEXT:        .long   6
-; CHECK-NEXT:        .long   ("$ip2state$?f@@YAXXZ")@IMGREL
-; CHECK-NEXT:        .long   32
-; CHECK-NEXT:        .long   0
-; CHECK-NEXT:        .long   1
+; CHECK-NOT: jmp{{[ql]}} *
+
+; X64:             .seh_handlerdata
+; X64-NEXT:        .long   ("$cppxdata$?f@@YAXXZ")@IMGREL
+; X86:             .section .xdata,"dr"
+
+; CHECK: .align 4
+
+; X64: "$cppxdata$?f@@YAXXZ":
+; X64-NEXT:          .long   429065506
+; X64-NEXT:          .long   4
+; X64-NEXT:          .long   ("$stateUnwindMap$?f@@YAXXZ")@IMGREL
+; X64-NEXT:          .long   2
+; X64-NEXT:          .long   ("$tryMap$?f@@YAXXZ")@IMGREL
+; X64-NEXT:          .long   6
+; X64-NEXT:          .long   ("$ip2state$?f@@YAXXZ")@IMGREL
+; X64-NEXT:          .long   32
+; X64-NEXT:          .long   0
+; X64-NEXT:          .long   1
+
+; X86: "L__ehtable$?f@@YAXXZ":
+; X86-NEXT:          .long   429065506
+; X86-NEXT:          .long   4
+; X86-NEXT:          .long   ("$stateUnwindMap$?f@@YAXXZ")
+; X86-NEXT:          .long   2
+; X86-NEXT:          .long   ("$tryMap$?f@@YAXXZ")
+; X86-NEXT:          .long   0
+; X86-NEXT:          .long   0
+; X86-NEXT:          .long   0
+; X86-NEXT:          .long   1
+
+
 ; CHECK-NEXT:"$stateUnwindMap$?f@@YAXXZ":
 ; CHECK-NEXT:        .long   -1
 ; CHECK-NEXT:        .long   0
@@ -147,37 +162,43 @@ try.cont8:                                        ; preds = %lpad2, %try.cont
 ; CHECK-NEXT:        .long   1
 ; CHECK-NEXT:        .long   2
 ; CHECK-NEXT:        .long   1
-; CHECK-NEXT:        .long   ("$handlerMap$0$?f@@YAXXZ")@IMGREL
+; CHECK-NEXT:        .long   ("$handlerMap$0$?f@@YAXXZ")
 ; CHECK-NEXT:        .long   0
 ; CHECK-NEXT:        .long   2
 ; CHECK-NEXT:        .long   3
 ; CHECK-NEXT:        .long   1
-; CHECK-NEXT:        .long   ("$handlerMap$1$?f@@YAXXZ")@IMGREL
+; CHECK-NEXT:        .long   ("$handlerMap$1$?f@@YAXXZ")
 ; CHECK-NEXT:"$handlerMap$0$?f@@YAXXZ":
 ; CHECK-NEXT:        .long   8
-; CHECK-NEXT:        .long   "??_R0H@8"@IMGREL
-; CHECK-NEXT:        .long   ".L?f@@YAXXZ$frame_escape_0"
-; CHECK-NEXT:        .long   "?f@@YAXXZ.catch"@IMGREL
-; CHECK-NEXT:        .long   ".L?f@@YAXXZ.catch$parent_frame_offset"
+; CHECK-NEXT:        .long   "??_R0H@8"
+; CHECK-NEXT:        .long   "{{.?}}L?f@@YAXXZ$frame_escape_0"
+; CHECK-NEXT:        .long   "?f@@YAXXZ.catch"
+; X64-NEXT:          .long   ".L?f@@YAXXZ.catch$parent_frame_offset"
 ; CHECK-NEXT:"$handlerMap$1$?f@@YAXXZ":
 ; CHECK-NEXT:        .long   0
-; CHECK-NEXT:        .long   "??_R0N@8"@IMGREL
-; CHECK-NEXT:        .long   ".L?f@@YAXXZ$frame_escape_1"
-; CHECK-NEXT:        .long   "?f@@YAXXZ.catch1"@IMGREL
-; CHECK-NEXT:        .long   ".L?f@@YAXXZ.catch1$parent_frame_offset"
-; CHECK-NEXT:"$ip2state$?f@@YAXXZ":
-; CHECK-NEXT:        .long   .Lfunc_begin0@IMGREL
-; CHECK-NEXT:        .long   2
-; CHECK-NEXT:        .long   .Ltmp0@IMGREL
-; CHECK-NEXT:        .long   0
-; CHECK-NEXT:        .long   .Lfunc_begin1@IMGREL
-; CHECK-NEXT:        .long   3
-; CHECK-NEXT:        .long   .Lfunc_begin2@IMGREL
-; CHECK-NEXT:        .long   -1
-; CHECK-NEXT:        .long   .Ltmp13@IMGREL
-; CHECK-NEXT:        .long   1
-; CHECK-NEXT:        .long   .Ltmp16@IMGREL
-; CHECK-NEXT:        .long   0
+; CHECK-NEXT:        .long   "??_R0N@8"
+; CHECK-NEXT:        .long   "{{.?}}L?f@@YAXXZ$frame_escape_1"
+; CHECK-NEXT:        .long   "?f@@YAXXZ.catch1"
+; X64-NEXT:          .long   ".L?f@@YAXXZ.catch1$parent_frame_offset"
+
+; X64-NEXT:"$ip2state$?f@@YAXXZ":
+; X64-NEXT:        .long   .Lfunc_begin0
+; X64-NEXT:        .long   2
+; X64-NEXT:        .long   .Ltmp0
+; X64-NEXT:        .long   0
+; X64-NEXT:        .long   .Lfunc_begin1
+; X64-NEXT:        .long   3
+; X64-NEXT:        .long   .Lfunc_begin2
+; X64-NEXT:        .long   -1
+; X64-NEXT:        .long   .Ltmp13
+; X64-NEXT:        .long   1
+; X64-NEXT:        .long   .Ltmp16
+; X64-NEXT:        .long   0
+
+
+; X86: "___ehhandler$?f@@YAXXZ": # @"__ehhandler$?f@@YAXXZ"
+; X86: movl $"L__ehtable$?f@@YAXXZ", %eax
+; X86: jmp ___CxxFrameHandler3 # TAILCALL
 
 
 declare void @"\01?may_throw@@YAXXZ"() #1