[clang] [AArch64] Stack probing for function prologues (PR #66524)
Oskar Wirga via cfe-commits
cfe-commits at lists.llvm.org
Wed Oct 25 19:31:27 PDT 2023
oskarwirga wrote:
Apologies for still not being able to create a reproducible example I can share but what I am seeing is the stack probe write overwriting the value at the tip of the stack when I step debug execution:
```
str xzr, [sp, #-0x10 {var_70}]! {0x0}
...
stur x8, [x29, #-0x10 {var_70}]
...
from the inlined function:
str xzr, [x20] {0x0}
mov sp, x20
...
ldur x8, [x29, #-0x10 {var_70}] << null deref
```
I also was able to isolate the issue to the non-fast register allocators. When building with optimized code, the greedy register allocator and the basic register allocator ended up choosing registers that were being clobbered (? don't know the term) by the stack probe write.
> All the stack probing should have already finished before the call to `malloc`.
Only for the containing function, the functions which have their stack probes inlined will be in the middle of the function which then results in this null-deref. I think there's some re-arranging happening during optimization and inlining which causes the registers not to be expired (? don't know the term here)
> Just to make things simpler, can you try disabling the shrink-wrapping and see what happens?
I haven't seen noticeable difference with this, I tried passing it in with `-Wl,-mllvm,-enable-shrink-wrap=false`
https://github.com/llvm/llvm-project/pull/66524
More information about the cfe-commits
mailing list