forked from OSchip/llvm-project
[WinEH] Strip the \01 character from the __CxxFrameHandler3 thunk name
Add another C++ 32-bit EH table test. llvm-svn: 242044
This commit is contained in:
parent
9ad5c3a324
commit
5f4dd92209
llvm
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue