Skip to content

Commit

Permalink
[StackColoring] Handle fixed object index
Browse files Browse the repository at this point in the history
This is a followup to #66988. The implementation there did not
account for the possibility of the catch object frame index
referrring to a fixed object, which is the case on win64.
  • Loading branch information
nikic committed Sep 22, 2023
1 parent 06f22c9 commit aa70f4d
Show file tree
Hide file tree
Showing 2 changed files with 148 additions and 66 deletions.
3 changes: 2 additions & 1 deletion llvm/lib/CodeGen/StackColoring.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<int>::max())
if (H.CatchObj.FrameIndex != std::numeric_limits<int>::max() &&
H.CatchObj.FrameIndex >= 0)
ConservativeSlots.set(H.CatchObj.FrameIndex);

LLVM_DEBUG(dumpBV("Conservative slots", ConservativeSlots));
Expand Down
211 changes: 146 additions & 65 deletions llvm/test/CodeGen/X86/stack-coloring-wineh.ll
Original file line number Diff line number Diff line change
@@ -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
Expand Down

0 comments on commit aa70f4d

Please sign in to comment.