On Mon, Jun 30, 2025 at 11:46 AM H.J. Lu <hjl.to...@gmail.com> wrote: > > On Mon, Jun 30, 2025 at 11:17 AM H.J. Lu <hjl.to...@gmail.com> wrote: > > > > On Mon, Jun 30, 2025 at 10:41 AM Hongtao Liu <crazy...@gmail.com> wrote: > > > > > > On Mon, Jun 30, 2025 at 10:37 AM Hongtao Liu <crazy...@gmail.com> wrote: > > > > > > > > On Sat, Jun 28, 2025 at 8:30 PM H.J. Lu <hjl.to...@gmail.com> wrote: > > > > > > > > > > Update functions with no_callee_saved_registers/preserve_none > > > > > attribute > > > > > to preserve frame pointer since caller may use it to save the current > > > > > stack: > > > > > > > > > > pushq %rbp > > > > > movq %rsp, %rbp > > > > > ... > > > > > call function > > > > > ... > > > > > leave > > > > > ret > > > > > > > > > > If callee changes frame pointer without restoring it, caller will fail > > > > > to restore its stack after callee returns. > > > > Do we know why the caller failed to restore rbp? Are there any > > > > assumptions in the middle-end that frame pointers must be callee saved > > > > registers(even if it's marked as caller-saved)? > > > > > > > > > > > > > > > > > /* The current function is a function specified with the > > > > "no_callee_saved_registers" attribute. */ > > > > TYPE_NO_CALLEE_SAVED_REGISTERS, > > > > - /* The current function is a function specified with the "noreturn" > > > > - attribute. */ > > > > - TYPE_NO_CALLEE_SAVED_REGISTERS_EXCEPT_BP, > > > > > > > > Comments of "noreturn" part should be merged into that of > > > > TYPE_NO_CALLEE_SAVED_REGISTERS. > > > > > > > > +callee-saved registers. That is, all registers, except for stack and > > > > +frame pointers, can be used as scratch registers. For example, this > > > > > > > > The patch only excludes frame pointers but the document mentions both > > > > stack and frame pointers? > > > > > > And documents of preserve_none attribute should be changed since your > > > patch also exclude frame_pointer for TYPE_PRESERVE_NONE. > > > > Since preserve_none is documented as > > > > This attribute is similar to @code{no_callee_saved_registers}, except > > on x86-64, r12, r13, r14, r15, rdi and rsi registers are used for > > integer parameter passing and this calling convention is subject to > > change. > > > > no_callee_saved_registers covers preserve_none on frame pointer. > > > > > case TYPE_NO_CALLEE_SAVED_REGISTERS: > > > case TYPE_PRESERVE_NONE: > > > - return false; > > > - > > > - case TYPE_NO_CALLEE_SAVED_REGISTERS_EXCEPT_BP: > > > if (regno != HARD_FRAME_POINTER_REGNUM) > > > return false; > > Here is the v2 patch. The only change is > > enum call_saved_registers_type > { > TYPE_DEFAULT_CALL_SAVED_REGISTERS = 0, > /* The current function is a function specified with the "interrupt" > or "no_caller_saved_registers" attribute. */ > TYPE_NO_CALLER_SAVED_REGISTERS, > /* The current function is a function specified with the > "no_callee_saved_registers" attribute or a function specified with > the "noreturn" attribute when compiled with > "-mnoreturn-no-callee-saved-registers". */ > TYPE_NO_CALLEE_SAVED_REGISTERS, > /* The current function is a function specified with the > "preserve_none" attribute. */ > TYPE_PRESERVE_NONE, > }; > > OK for master?
Ok. > > Thanks. > > -- > H.J. -- BR, Hongtao