brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.5 KiB · d2dcb35 Raw
135 lines · plain
1; FIXME: Fix machine verifier issues and remove -verify-machineinstrs=0. PR39439.2; RUN: llc -mtriple i386-windows-gnu -exception-model sjlj -filetype asm -o - %s -verify-machineinstrs=0 | FileCheck %s3; RUN: llc -mtriple x86_64-windows-gnu -exception-model sjlj -filetype asm -o - %s -verify-machineinstrs=0 | FileCheck %s -check-prefix CHECK-X644; RUN: llc -mtriple x86_64-linux -exception-model sjlj -filetype asm -o - %s -verify-machineinstrs=0 | FileCheck %s -check-prefix CHECK-X64-LINUX5 6declare void @_Z20function_that_throwsv()7declare i32 @__gxx_personality_sj0(...)8declare ptr @__cxa_begin_catch(ptr)9declare void @__cxa_end_catch()10 11define void @_Z8functionv() personality ptr @__gxx_personality_sj0 {12entry:13  invoke void @_Z20function_that_throwsv()14          to label %try.cont unwind label %lpad15 16lpad:17  %0 = landingpad { ptr, i32 }18          catch ptr null19  %1 = extractvalue { ptr, i32 } %0, 020  %2 = tail call ptr @__cxa_begin_catch(ptr %1)21  tail call void @__cxa_end_catch()22  br label %try.cont23 24try.cont:25  ret void26}27 28;     struct _Unwind_FunctionContext {29; +00   struct _Unwind_FunctionContext *prev;   -64(%ebp)30; +04   uint32_t __callsite;                    -60(%ebp)31; +08   uint32_t __buffer[4];                   -56(%ebp)32; +24   __personality_routine __personality;    -40(%ebp)33; +28   uintptr_t __lsda;                       -36(%ebp)34; +32   ptr__jbuf[];                         -32(%ebp)35;     };36 37 38; CHECK-LABEL: __Z8functionv:39;     struct _Unwind_FunctionContext UFC;40;41;     UFC.__personality = __gxx_personality_sj042; CHECK: movl $___gxx_personality_sj0, -40(%ebp)43;     UFC.__lsda = $LSDA44; CHECK: movl $[[LSDA:GCC_except_table[0-9]+]], -36(%ebp)45;     UFC.__jbuf[0] = $ebp46; CHECK: movl %ebp, -32(%ebp)47;     UFC.__jbuf[2] = $esp48; CHECK: movl %esp, -24(%ebp)49;     UFC.__jbuf[1] = $EIP50; CHECK: movl $[[RESUME:LBB[0-9]+_[0-9]+]], -28(%ebp)51;     _Unwind_SjLj_Register(&UFC);52; CHECK: leal -64(%ebp), %eax53; CHECK: pushl %eax54; CHECK: calll __Unwind_SjLj_Register55; CHECK: addl $4, %esp56;     function_that_throws();57; CHECK: movl $1, -60(%ebp)58; CHECK: calll __Z20function_that_throwsv59;     _Unwind_SjLj_Unregister(&UFC);60; CHECK: leal -64(%ebp), %eax61; CHECK: calll __Unwind_SjLj_Unregister62;63; CHECK: [[RESUME]]:64; CHECK: leal -64(%ebp), %esi65;     assert(UFC.__callsite < 1);66; CHECK: movl -60(%ebp), %eax67; CHECK: cmpl $1, %eax68; CHECK: jb [[CONT:LBB[0-9]+_[0-9]+]]69; CHECK: ud270; CHECK: [[CONT]]:71;     *Handlers[UFC.__callsite]72; CHECK: jmpl *LJTI73 74 75;     struct _Unwind_FunctionContext {76; +00   struct _Unwind_FunctionContext *prev;   -312(%rbp)77; +08   uint32_t __callsite;                    -304(%rbp)78; +12   uint32_t __buffer[4];                   -300(%rbp)79; +32   __personality_routine __personality;    -280(%rbp)80; +40   uintptr_t __lsda;                       -272(%rbp)81; +48   ptr__jbuf[];                         -264(%rbp)82;     };83 84 85; CHECK-X64-LABEL: _Z8functionv:86;     struct _Unwind_FunctionContext UFC;87;88;     UFC.__personality = __gxx_personality_sj089; CHECK-X64: leaq __gxx_personality_sj0(%rip), %rax90; CHECK-X64: movq %rax, -280(%rbp)91;     UFC.__lsda = $LSDA92; CHECK-X64: leaq [[LSDA:GCC_except_table[0-9]+]](%rip), %rax93; CHECK-X64: movq %rax, -272(%rbp)94;     UFC.__jbuf[0] = $rbp95; CHECK-X64: movq %rbp, -264(%rbp)96;     UFC.__jbuf[2] = $rsp97; CHECK-X64: movq %rsp, -248(%rbp)98;     UFC.__jbuf[1] = $RIP99; CHECK-X64: leaq .[[RESUME:LBB[0-9]+_[0-9]+]](%rip), %rax100; CHECK-X64: movq %rax, -256(%rbp)101;     _Unwind_SjLj_Register(&UFC);102; CHECK-X64: leaq -312(%rbp), %rcx103; CHECK-X64: callq _Unwind_SjLj_Register104;     function_that_throws();105; CHECK-X64: movl $1, -304(%rbp)106; CHECK-X64: callq _Z20function_that_throwsv107;     _Unwind_SjLj_Unregister(&UFC);108; CHECK-X64: leaq -312(%rbp), %rcx109; CHECK-X64: callq _Unwind_SjLj_Unregister110;111; CHECK-X64: [[RESUME]]:112;     assert(UFC.__callsite < 1);113; CHECK-X64: movl -304(%rbp), %eax114; CHECK-X64: cmpl $1, %eax115; CHECK-X64: jb .[[CONT:LBB[0-9]+_[0-9]+]]116; CHECK-X64: ud2117; CHECK-X64: [[CONT]]:118;     *Handlers[UFC.__callsite]119; CHECK-X64: leaq .[[TABLE:LJTI[0-9]+_[0-9]+]](%rip), %rcx120; CHECK-X64: movl (%rcx,%rax,4), %eax121; CHECK-X64: cltq122; CHECK-X64: addq %rcx, %rax123; CHECK-X64: jmpq *%rax124 125; CHECK-X64-LINUX: .[[RESUME:LBB[0-9]+_[0-9]+]]:126;     assert(UFC.__callsite < 1);127; CHECK-X64-LINUX: movl -120(%rbp), %eax128; CHECK-X64-LINUX: cmpl $1, %eax129; CHECK-X64-LINUX: jb .[[CONT:LBB[0-9]+_[0-9]+]]130; CHECK-X64-LINUX: ud2131; CHECK-X64-LINUX: [[CONT]]:132;     *Handlers[UFC.__callsite]133; CHECK-X64-LINUX: leaq .[[TABLE:LJTI[0-9]+_[0-9]+]](%rip), %rcx134; CHECK-X64-LINUX: jmpq *(%rcx,%rax,8)135