On Thu, Mar 21, 2024 at 12:57:07PM +0000, David Laight wrote: > From: Russell King > > Sent: 21 March 2024 12:23 > ... > > > That might mean you can get the BL in the middle of a function > > > but where the following instruction is for the 'no stack frame' > > > side of the branch. > > > That is very likely to break any stack offset calculations. > > > > No it can't. At any one point in the function, the stack has to be in > > a well defined state, so that access to local variables can work, and > > also the stack can be correctly unwound. If there exists a point in > > the function body which can be reached where the stack could be in two > > different states, then the stack can't be restored to the parent > > context. > > Actually you can get there with a function that has a lot of args. > So you can have: > if (...) { > push x > bl func > add %sp, #8 > } > code; > which is fine. No you can't.... and that isn't even Arm code. Arm doesn't use %sp. Moreover, that "bl" will stomp over the link register, meaning this function can not return. > But if 'func' is 'noreturn' then the 'add %sp, #8' can be discarded > and then the saved LR is that of 'code' - but the stack offset is wrong. If func is noreturn, then the remainder of that path isn't expected to be executed, so anything that happens after the "bl" is irrelevant. > A PC from LR will always be the next instruction. > It is only the PC from a fault frame that is the current one. That sentence makes no sense to me, as I don't think it's even proper English, so I can't parse it. > The unwinder probably need to be told which one it has. > (Or add 4 the fault frame PC so that the unwinder can subtract > 4 from it.) That's basically what I said. -- RMK's Patch system: https://www.armlinux.org.uk/developer/patches/ FTTP is here! 80Mbps down 10Mbps up. Decent connectivity at last!