From 17b962bd33aa88fbe170ffd67a5273d56350066e Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Fri, 17 May 2013 07:51:53 +0000 Subject: [PATCH] rl78.c (rl78_attribute_table): Add naked. * config/rl78/rl78.c (rl78_attribute_table): Add naked. (rl78_is_naked_func): New function. (rl78_expand_prologue): Skip prologue generation for naked functions. (rl78_expand_epilogue): Skip epilogue generation for naked functions. * doc/extend.texi (naked): Add RL78 to the list of processors that supports this attribute. From-SVN: r199001 --- gcc/ChangeLog | 11 +++++++++++ gcc/config/rl78/rl78.c | 14 ++++++++++++++ gcc/doc/extend.texi | 2 +- 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 38e8f183ac9..e47c76046c9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2013-05-16 Nick Clifton + + * config/rl78/rl78.c (rl78_attribute_table): Add naked. + (rl78_is_naked_func): New function. + (rl78_expand_prologue): Skip prologue generation for naked + functions. + (rl78_expand_epilogue): Skip epilogue generation for naked + functions. + * doc/extend.texi (naked): Add RL78 to the list of processors + that supports this attribute. + 2013-05-16 Jeff Law * Makefile.in (tree-switch-conversion.o): Depend on $(OPTABS_H). diff --git a/gcc/config/rl78/rl78.c b/gcc/config/rl78/rl78.c index 895d7db9a44..2e18bebf3d8 100644 --- a/gcc/config/rl78/rl78.c +++ b/gcc/config/rl78/rl78.c @@ -499,6 +499,8 @@ const struct attribute_spec rl78_attribute_table[] = false }, { "brk_interrupt", 0, 0, true, false, false, rl78_handle_func_attribute, false }, + { "naked", 0, 0, true, false, false, rl78_handle_func_attribute, + false }, { NULL, 0, 0, false, false, false, NULL, false } }; @@ -825,6 +827,12 @@ rl78_initial_elimination_offset (int from, int to) return rv; } +static int +rl78_is_naked_func (void) +{ + return (lookup_attribute ("naked", DECL_ATTRIBUTES (current_function_decl)) != NULL_TREE); +} + /* Expand the function prologue (from the prologue pattern). */ void rl78_expand_prologue (void) @@ -833,6 +841,9 @@ rl78_expand_prologue (void) rtx sp = gen_rtx_REG (HImode, STACK_POINTER_REGNUM); int rb = 0; + if (rl78_is_naked_func ()) + return; + if (!cfun->machine->computed) rl78_compute_frame_info (); @@ -877,6 +888,9 @@ rl78_expand_epilogue (void) rtx sp = gen_rtx_REG (HImode, STACK_POINTER_REGNUM); int rb = 0; + if (rl78_is_naked_func ()) + return; + if (frame_pointer_needed) { emit_move_insn (gen_rtx_REG (HImode, STACK_POINTER_REGNUM), diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi index 1e1f8b35a32..76a90ecb31f 100644 --- a/gcc/doc/extend.texi +++ b/gcc/doc/extend.texi @@ -3142,7 +3142,7 @@ and newer. @item naked @cindex function without a prologue/epilogue code -Use this attribute on the ARM, AVR, MCORE, RX and SPU ports to indicate that +Use this attribute on the ARM, AVR, MCORE, RL78, RX and SPU ports to indicate that the specified function does not need prologue/epilogue sequences generated by the compiler. It is up to the programmer to provide these sequences. The only statements that can be safely included in naked functions are