diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/avr/avr.c | 6 | ||||
-rw-r--r-- | gcc/config/avr/avr.h | 3 |
3 files changed, 13 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bcf6c64..27204b4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2008-05-12 Anatoly Sokolov <aesok@post.ru> + + * config/avr/avr.h (machine_function): Add 'is_leaf' field. + * config/avr/avr.c (avr_regs_to_save): Compute 'machine->is_leaf'. + Use 'machine->is_leaf' instead of 'leaf_func_p'. + 2008-05-12 H.J. Lu <hongjiu.lu@intel.com> * config/i386/sse.md (*sse_concatv4sf): Renamed to ... diff --git a/gcc/config/avr/avr.c b/gcc/config/avr/avr.c index 7248fd6..e1d7775 100644 --- a/gcc/config/avr/avr.c +++ b/gcc/config/avr/avr.c @@ -471,7 +471,9 @@ avr_regs_to_save (HARD_REG_SET *set) int reg, count; int int_or_sig_p = (interrupt_function_p (current_function_decl) || signal_function_p (current_function_decl)); - int leaf_func_p = leaf_function_p (); + + if (!reload_completed) + cfun->machine->is_leaf = leaf_function_p (); if (set) CLEAR_HARD_REG_SET (*set); @@ -490,7 +492,7 @@ avr_regs_to_save (HARD_REG_SET *set) if (fixed_regs[reg]) continue; - if ((int_or_sig_p && !leaf_func_p && call_used_regs[reg]) + if ((int_or_sig_p && !cfun->machine->is_leaf && call_used_regs[reg]) || (df_regs_ever_live_p (reg) && (int_or_sig_p || !call_used_regs[reg]) && !(frame_pointer_needed diff --git a/gcc/config/avr/avr.h b/gcc/config/avr/avr.h index 7dbc76c..b56c8e0 100644 --- a/gcc/config/avr/avr.h +++ b/gcc/config/avr/avr.h @@ -1026,6 +1026,9 @@ mmcu=*:-mmcu=%*}" This is added to the cfun structure. */ struct machine_function GTY(()) { + /* 'true' - if the current function is a leaf function. */ + int is_leaf; + /* 'true' - if current function is a naked function. */ int is_naked; |