diff --git a/llvm/lib/CodeGen/StackColoring.cpp b/llvm/lib/CodeGen/StackColoring.cpp index 10597daff54fc..3453b718b453a 100644 --- a/llvm/lib/CodeGen/StackColoring.cpp +++ b/llvm/lib/CodeGen/StackColoring.cpp @@ -709,7 +709,8 @@ unsigned StackColoring::collectMarkers(unsigned NumSlot) { if (WinEHFuncInfo *EHInfo = MF->getWinEHFuncInfo()) for (WinEHTryBlockMapEntry &TBME : EHInfo->TryBlockMap) for (WinEHHandlerType &H : TBME.HandlerArray) - if (H.CatchObj.FrameIndex != std::numeric_limits::max()) + if (H.CatchObj.FrameIndex != std::numeric_limits::max() && + H.CatchObj.FrameIndex >= 0) ConservativeSlots.set(H.CatchObj.FrameIndex); LLVM_DEBUG(dumpBV("Conservative slots", ConservativeSlots)); diff --git a/llvm/test/CodeGen/X86/stack-coloring-wineh.ll b/llvm/test/CodeGen/X86/stack-coloring-wineh.ll index 892c81a12dc1a..79057e0ea78d3 100644 --- a/llvm/test/CodeGen/X86/stack-coloring-wineh.ll +++ b/llvm/test/CodeGen/X86/stack-coloring-wineh.ll @@ -1,74 +1,155 @@ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3 -; RUN: llc -mtriple=i686-windows-msvc < %s | FileCheck %s +; RUN: llc -mtriple=i686-windows-msvc < %s | FileCheck %s --check-prefix=I686 +; RUN: llc -mtriple=x86_64-windows-msvc < %s | FileCheck %s --check-prefix=X86_64 @type_info = external global ptr ; Make sure %a1 and %a2 don't share the same stack offset. define void @pr66984(ptr %arg) personality ptr @__CxxFrameHandler3 { -; CHECK-LABEL: pr66984: -; CHECK: # %bb.0: # %bb -; CHECK-NEXT: pushl %ebp -; CHECK-NEXT: movl %esp, %ebp -; CHECK-NEXT: pushl %ebx -; CHECK-NEXT: pushl %edi -; CHECK-NEXT: pushl %esi -; CHECK-NEXT: subl $24, %esp -; CHECK-NEXT: movl %esp, -28(%ebp) -; CHECK-NEXT: movl $-1, -16(%ebp) -; CHECK-NEXT: leal -24(%ebp), %eax -; CHECK-NEXT: movl $___ehhandler$pr66984, -20(%ebp) -; CHECK-NEXT: movl %fs:0, %ecx -; CHECK-NEXT: movl %ecx, -24(%ebp) -; CHECK-NEXT: movl %eax, %fs:0 -; CHECK-NEXT: movl $1, -16(%ebp) -; CHECK-NEXT: calll _throw -; CHECK-NEXT: # %bb.1: # %bb14 -; CHECK-NEXT: LBB0_3: # Block address taken -; CHECK-NEXT: # %bb17 -; CHECK-NEXT: addl $12, %ebp -; CHECK-NEXT: jmp LBB0_4 -; CHECK-NEXT: LBB0_4: # %exit -; CHECK-NEXT: $ehgcr_0_4: -; CHECK-NEXT: movl -24(%ebp), %eax -; CHECK-NEXT: movl %eax, %fs:0 -; CHECK-NEXT: addl $24, %esp -; CHECK-NEXT: popl %esi -; CHECK-NEXT: popl %edi -; CHECK-NEXT: popl %ebx -; CHECK-NEXT: popl %ebp -; CHECK-NEXT: retl -; CHECK-NEXT: .def "?catch$2@?0?pr66984@4HA"; -; CHECK-NEXT: .scl 3; -; CHECK-NEXT: .type 32; -; CHECK-NEXT: .endef -; CHECK-NEXT: .p2align 4, 0x90 -; CHECK-NEXT: "?catch$2@?0?pr66984@4HA": -; CHECK-NEXT: LBB0_2: # %bb17 -; CHECK-NEXT: pushl %ebp -; CHECK-NEXT: addl $12, %ebp -; CHECK-NEXT: movl %esp, -28(%ebp) -; CHECK-NEXT: movl -36(%ebp), %ecx -; CHECK-NEXT: movl $2, -16(%ebp) -; CHECK-NEXT: calll _cleanup -; CHECK-NEXT: movl $LBB0_3, %eax -; CHECK-NEXT: popl %ebp -; CHECK-NEXT: retl # CATCHRET -; CHECK-NEXT: .def "?dtor$5@?0?pr66984@4HA"; -; CHECK-NEXT: .scl 3; -; CHECK-NEXT: .type 32; -; CHECK-NEXT: .endef -; CHECK-NEXT: .p2align 4, 0x90 -; CHECK-NEXT: "?dtor$5@?0?pr66984@4HA": -; CHECK-NEXT: LBB0_5: # %bb8 -; CHECK-NEXT: pushl %ebp -; CHECK-NEXT: addl $12, %ebp -; CHECK-NEXT: movl 8(%ebp), %eax -; CHECK-NEXT: movl %eax, -32(%ebp) -; CHECK-NEXT: leal -32(%ebp), %ecx -; CHECK-NEXT: calll _foo -; CHECK-NEXT: popl %ebp -; CHECK-NEXT: retl # CLEANUPRET -; CHECK-NEXT: Lfunc_end0: +; I686-LABEL: pr66984: +; I686: # %bb.0: # %bb +; I686-NEXT: pushl %ebp +; I686-NEXT: movl %esp, %ebp +; I686-NEXT: pushl %ebx +; I686-NEXT: pushl %edi +; I686-NEXT: pushl %esi +; I686-NEXT: subl $24, %esp +; I686-NEXT: movl %esp, -28(%ebp) +; I686-NEXT: movl $-1, -16(%ebp) +; I686-NEXT: leal -24(%ebp), %eax +; I686-NEXT: movl $___ehhandler$pr66984, -20(%ebp) +; I686-NEXT: movl %fs:0, %ecx +; I686-NEXT: movl %ecx, -24(%ebp) +; I686-NEXT: movl %eax, %fs:0 +; I686-NEXT: movl $1, -16(%ebp) +; I686-NEXT: calll _throw +; I686-NEXT: # %bb.1: # %bb14 +; I686-NEXT: LBB0_3: # Block address taken +; I686-NEXT: # %bb17 +; I686-NEXT: addl $12, %ebp +; I686-NEXT: jmp LBB0_4 +; I686-NEXT: LBB0_4: # %exit +; I686-NEXT: $ehgcr_0_4: +; I686-NEXT: movl -24(%ebp), %eax +; I686-NEXT: movl %eax, %fs:0 +; I686-NEXT: addl $24, %esp +; I686-NEXT: popl %esi +; I686-NEXT: popl %edi +; I686-NEXT: popl %ebx +; I686-NEXT: popl %ebp +; I686-NEXT: retl +; I686-NEXT: .def "?catch$2@?0?pr66984@4HA"; +; I686-NEXT: .scl 3; +; I686-NEXT: .type 32; +; I686-NEXT: .endef +; I686-NEXT: .p2align 4, 0x90 +; I686-NEXT: "?catch$2@?0?pr66984@4HA": +; I686-NEXT: LBB0_2: # %bb17 +; I686-NEXT: pushl %ebp +; I686-NEXT: addl $12, %ebp +; I686-NEXT: movl %esp, -28(%ebp) +; I686-NEXT: movl -36(%ebp), %ecx +; I686-NEXT: movl $2, -16(%ebp) +; I686-NEXT: calll _cleanup +; I686-NEXT: movl $LBB0_3, %eax +; I686-NEXT: popl %ebp +; I686-NEXT: retl # CATCHRET +; I686-NEXT: .def "?dtor$5@?0?pr66984@4HA"; +; I686-NEXT: .scl 3; +; I686-NEXT: .type 32; +; I686-NEXT: .endef +; I686-NEXT: .p2align 4, 0x90 +; I686-NEXT: "?dtor$5@?0?pr66984@4HA": +; I686-NEXT: LBB0_5: # %bb8 +; I686-NEXT: pushl %ebp +; I686-NEXT: addl $12, %ebp +; I686-NEXT: movl 8(%ebp), %eax +; I686-NEXT: movl %eax, -32(%ebp) +; I686-NEXT: leal -32(%ebp), %ecx +; I686-NEXT: calll _foo +; I686-NEXT: popl %ebp +; I686-NEXT: retl # CLEANUPRET +; I686-NEXT: Lfunc_end0: +; +; X86_64-LABEL: pr66984: +; X86_64: # %bb.0: # %bb +; X86_64-NEXT: pushq %rbp +; X86_64-NEXT: .seh_pushreg %rbp +; X86_64-NEXT: subq $64, %rsp +; X86_64-NEXT: .seh_stackalloc 64 +; X86_64-NEXT: leaq {{[0-9]+}}(%rsp), %rbp +; X86_64-NEXT: .seh_setframe %rbp, 64 +; X86_64-NEXT: .seh_endprologue +; X86_64-NEXT: movq $-2, -16(%rbp) +; X86_64-NEXT: movq %rcx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill +; X86_64-NEXT: .Ltmp0: +; X86_64-NEXT: callq throw +; X86_64-NEXT: .Ltmp1: +; X86_64-NEXT: # %bb.1: # %bb14 +; X86_64-NEXT: .LBB0_3: # Block address taken +; X86_64-NEXT: # %exit +; X86_64-NEXT: $ehgcr_0_3: +; X86_64-NEXT: nop +; X86_64-NEXT: addq $64, %rsp +; X86_64-NEXT: popq %rbp +; X86_64-NEXT: retq +; X86_64-NEXT: .seh_handlerdata +; X86_64-NEXT: .long ($cppxdata$pr66984)@IMGREL +; X86_64-NEXT: .text +; X86_64-NEXT: .seh_endproc +; X86_64-NEXT: .def "?catch$2@?0?pr66984@4HA"; +; X86_64-NEXT: .scl 3; +; X86_64-NEXT: .type 32; +; X86_64-NEXT: .endef +; X86_64-NEXT: .p2align 4, 0x90 +; X86_64-NEXT: "?catch$2@?0?pr66984@4HA": +; X86_64-NEXT: .seh_proc "?catch$2@?0?pr66984@4HA" +; X86_64-NEXT: .seh_handler __CxxFrameHandler3, @unwind, @except +; X86_64-NEXT: .LBB0_2: # %bb17 +; X86_64-NEXT: movq %rdx, {{[0-9]+}}(%rsp) +; X86_64-NEXT: pushq %rbp +; X86_64-NEXT: .seh_pushreg %rbp +; X86_64-NEXT: subq $32, %rsp +; X86_64-NEXT: .seh_stackalloc 32 +; X86_64-NEXT: leaq 64(%rdx), %rbp +; X86_64-NEXT: .seh_endprologue +; X86_64-NEXT: movq -8(%rbp), %rcx +; X86_64-NEXT: callq cleanup +; X86_64-NEXT: leaq .LBB0_3(%rip), %rax +; X86_64-NEXT: addq $32, %rsp +; X86_64-NEXT: popq %rbp +; X86_64-NEXT: retq # CATCHRET +; X86_64-NEXT: .seh_handlerdata +; X86_64-NEXT: .long ($cppxdata$pr66984)@IMGREL +; X86_64-NEXT: .text +; X86_64-NEXT: .seh_endproc +; X86_64-NEXT: .def "?dtor$4@?0?pr66984@4HA"; +; X86_64-NEXT: .scl 3; +; X86_64-NEXT: .type 32; +; X86_64-NEXT: .endef +; X86_64-NEXT: .p2align 4, 0x90 +; X86_64-NEXT: "?dtor$4@?0?pr66984@4HA": +; X86_64-NEXT: .seh_proc "?dtor$4@?0?pr66984@4HA" +; X86_64-NEXT: .LBB0_4: # %bb8 +; X86_64-NEXT: movq %rdx, {{[0-9]+}}(%rsp) +; X86_64-NEXT: pushq %rbp +; X86_64-NEXT: .seh_pushreg %rbp +; X86_64-NEXT: subq $32, %rsp +; X86_64-NEXT: .seh_stackalloc 32 +; X86_64-NEXT: leaq 64(%rdx), %rbp +; X86_64-NEXT: .seh_endprologue +; X86_64-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload +; X86_64-NEXT: movq %rax, -32(%rbp) +; X86_64-NEXT: leaq -32(%rbp), %rcx +; X86_64-NEXT: callq foo +; X86_64-NEXT: nop +; X86_64-NEXT: addq $32, %rsp +; X86_64-NEXT: popq %rbp +; X86_64-NEXT: retq # CLEANUPRET +; X86_64-NEXT: .Lfunc_end0: +; X86_64-NEXT: .seh_handlerdata +; X86_64-NEXT: .text +; X86_64-NEXT: .seh_endproc bb: %a1 = alloca ptr, align 4 %a2 = alloca ptr, align 4