On Wed, Aug 09, 2017 at 09:06:18PM +0000, Segher Boessenkool wrote:
> We can have SAVE_MULTIPLE while we do not have REST_MULTIPLE. If the
> inline restore does not restore all registers, the CFI for the save
> and restore can conflict if things are shrink-wrapped.
> We could restore all registers that are saved (not ideal),
No, we can't do that. A -ffixed-reg register should not be restored
even if it is saved, as such regs should never be written. For
example, a fixed reg might be counting interrupts. If you restore it,
you may lose count. Another example is a fixed reg used as some sort
of context pointer. If you restore in a function that sets a new
context you're obviously breaking user code.
> or emit
> the CFI notes to say we did (which will work fine,
No, you can't do that either. Unwinding might then restore a
> but is also not
> so great); instead, let's not save the registers that are unused.
Ick, looks like papering over the real problem to me, and will no
doubt cause -Os size regressions. Also, if SAVE_MULTIPLE causes this
bad interaction with shrink-wrap, does using the out-of-line register
save functions cause the same problem?
I haven't looked yet, but at a guess I suspect the correct solution is
to modify cfa_restores in rs6000_emit_epilogue.
Australia Development Lab, IBM