Patchwork RFA: RL78: Add support for naked function attribute.

login
register
mail settings
Submitter Nick Clifton
Date May 16, 2013, 3:32 p.m.
Message ID <87ehd7549u.fsf@redhat.com>
Download mbox | patch
Permalink /patch/244351/
State New
Headers show

Comments

Nick Clifton - May 16, 2013, 3:32 p.m.
Hi DJ,

  OK, I am abandoning my RL78 interrupt prologue patch for now.  There
  are just too many complications to make it work.  Instead here is a
  much simpler patch to add support for a naked function attribute.

  OK to apply ?

Cheers
  Nick

gcc/ChangeLog
2013-05-16  Nick Clifton  <nickc@redhat.com>

	* 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.
DJ Delorie - May 16, 2013, 4:34 p.m.
This one is OK.

> 2013-05-16  Nick Clifton  <nickc@redhat.com>
> 
> 	* 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.

Patch

Index: gcc/config/rl78/rl78.c
===================================================================
--- gcc/config/rl78/rl78.c	(revision 198971)
+++ gcc/config/rl78/rl78.c	(working copy)
@@ -499,6 +499,8 @@ 
     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 @@ 
   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 @@ 
   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 @@ 
   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),
Index: gcc/doc/extend.texi
===================================================================
--- gcc/doc/extend.texi	(revision 198959)
+++ gcc/doc/extend.texi	(working copy)
@@ -3142,7 +3142,7 @@ 
 
 @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