Skip to content

probe-stack=inline-asm will produce invalid uwtables #48944

Open
@nagisa

Description

@nagisa
Bugzilla Link 49600
Version trunk
OS All
CC @topperc,@RKSimon,@phoebewang,@rotateright

Extended Description

Given a function as such

; RUN: llc < %s
define void @​big_stack() "probe-stack"="inline-asm" uwtable {
start:
%_two_page_stack = alloca [8192 x i8], align 1
ret void
}

the following assembly will be generated:

big_stack:
.cfi_startproc
subq $4096, %rsp
movq $0, (%rsp)
subq $3968, %rsp
.cfi_def_cfa_offset 8072
addq $8064, %rsp
.cfi_def_cfa_offset 8
retq

Here the unwind tables are not accurate while stack probing is ongoing – the rsp is adjusted, but not the cfa_offsets. And so attempts to obtain a stack trace will fail if the current instruction is somewhere in between the instructions implementing the stack probing.

This also occurs with the non-unrolled implementation of the stack probing:

; RUN: llc < %s
define void @​big_stack() "probe-stack"="inline-asm" uwtable {
start:
%_two_page_stack = alloca [64000 x i8], align 1
ret void
}

--->

big_stack:
.cfi_startproc
movq %rsp, %r11
subq $61440, %r11
.LBB0_1:
subq $4096, %rsp
movq $0, (%rsp)
cmpq %r11, %rsp
jne .LBB0_1
subq $2432, %rsp
.cfi_def_cfa_offset 63880
addq $63872, %rsp
.cfi_def_cfa_offset 8
retq

however in the loop case the solution needs to involve allocation of a separate register as insertion of .cfi directives in a loop won't help in any way.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions