rl78.c (add_vector_labels): New function.
authorSebastian Perta <sebastian.perta@renesas.com>
Tue, 13 Feb 2018 11:55:39 +0000 (11:55 +0000)
committerSebastian Perta <sebastianperta@gcc.gnu.org>
Tue, 13 Feb 2018 11:55:39 +0000 (11:55 +0000)
2018-02-13  Sebastian Perta  <sebastian.perta@renesas.com>

* config/rl78/rl78.c (add_vector_labels): New function.
* config/rl78/rl78.c (rl78_handle_vector_attribute): New function.
* config/rl78/rl78.c (rl78_start_function): Call add_vector_labels.
* config/rl78/rl78.c (rl78_handle_func_attribute): Removed the assert
which checks that no arguments are passed.
* config/rl78/rl78.c (rl78_attribute_table): Add "vector" attribute.
* doc/extend.texi: Documentation for the new attribute.

2018-02-13  Sebastian Perta  <sebastian.perta@renesas.com>

* gcc.target/rl78/test_auto_vector.c: New test.

From-SVN: r257622

gcc/ChangeLog
gcc/config/rl78/rl78.c
gcc/doc/extend.texi
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/rl78/test_auto_vector.c [new file with mode: 0644]

index 1bb2af7f24093fb907308f8837dc9d4fffa6de73..4a79c7b648a327e43c4455f9a4797ddc0eaca99b 100644 (file)
@@ -1,3 +1,13 @@
+2018-02-13  Sebastian Perta  <sebastian.perta@renesas.com>
+
+       * config/rl78/rl78.c (add_vector_labels): New function.
+       * config/rl78/rl78.c (rl78_handle_vector_attribute): New function.
+       * config/rl78/rl78.c (rl78_start_function): Call add_vector_labels.
+       * config/rl78/rl78.c (rl78_handle_func_attribute): Removed the assert 
+       which checks that no arguments are passed.
+       * config/rl78/rl78.c (rl78_attribute_table): Add "vector" attribute.
+       * doc/extend.texi: Documentation for the new attribute.
+
 2018-02-13  Andreas Schwab  <schwab@suse.de>
 
        * config/riscv/linux.h (CPP_SPEC): Define.
index b8c1e7b89dde1b35e53388b7c668bb9ea07bf757..7b2be23577ba8d58328f937d8500468269b6f32c 100644 (file)
@@ -809,7 +809,6 @@ rl78_handle_func_attribute (tree * node,
                            bool * no_add_attrs)
 {
   gcc_assert (DECL_P (* node));
-  gcc_assert (args == NULL_TREE);
 
   if (TREE_CODE (* node) != FUNCTION_DECL)
     {
@@ -868,6 +867,28 @@ rl78_handle_saddr_attribute (tree * node,
   return NULL_TREE;
 }
 
+/* Check "vector" attribute.  */
+
+static tree
+rl78_handle_vector_attribute (tree * node,
+                           tree   name,
+                           tree   args,
+                           int    flags ATTRIBUTE_UNUSED,
+                           bool * no_add_attrs)
+{
+  gcc_assert (DECL_P (* node));
+  gcc_assert (args != NULL_TREE);
+
+  if (TREE_CODE (* node) != FUNCTION_DECL)
+    {
+      warning (OPT_Wattributes, "%qE attribute only applies to functions",
+              name);
+      * no_add_attrs = true;
+    }
+
+  return NULL_TREE;
+}
+
 #undef  TARGET_ATTRIBUTE_TABLE
 #define TARGET_ATTRIBUTE_TABLE         rl78_attribute_table
 
@@ -876,7 +897,7 @@ const struct attribute_spec rl78_attribute_table[] =
 {
   /* Name, min_len, max_len, decl_req, type_req, fn_type_req,
      affects_type_identity, handler, exclude.  */
-  { "interrupt",      0, 0, true, false, false, false,
+  { "interrupt",      0, -1, true, false, false, false,
     rl78_handle_func_attribute, NULL },
   { "brk_interrupt",  0, 0, true, false, false, false,
     rl78_handle_func_attribute, NULL },
@@ -884,6 +905,8 @@ const struct attribute_spec rl78_attribute_table[] =
     rl78_handle_naked_attribute, NULL },
   { "saddr",          0, 0, true, false, false, false,
     rl78_handle_saddr_attribute, NULL },
+  { "vector",         1, -1, true, false, false, 
+       rl78_handle_vector_attribute, false },
   { NULL,             0, 0, false, false, false, false, NULL, NULL }
 };
 
@@ -1583,6 +1606,62 @@ rl78_expand_eh_epilogue (rtx x ATTRIBUTE_UNUSED)
 #undef  TARGET_ASM_FUNCTION_PROLOGUE
 #define TARGET_ASM_FUNCTION_PROLOGUE   rl78_start_function
 
+static void
+add_vector_labels (FILE *file, const char *aname)
+{
+  tree vec_attr;
+  tree val_attr;
+  const char *vname = "vect";
+  const char *s;
+  int vnum;
+
+  /* This node is for the vector/interrupt tag itself */
+  vec_attr = lookup_attribute (aname, DECL_ATTRIBUTES (current_function_decl));
+  if (!vec_attr)
+    return;
+
+  /* Now point it at the first argument */
+  vec_attr = TREE_VALUE (vec_attr);
+
+  /* Iterate through the arguments.  */
+  while (vec_attr)
+    {
+      val_attr = TREE_VALUE (vec_attr);
+      switch (TREE_CODE (val_attr))
+       {
+       case STRING_CST:
+         s = TREE_STRING_POINTER (val_attr);
+         goto string_id_common;
+
+       case IDENTIFIER_NODE:
+         s = IDENTIFIER_POINTER (val_attr);
+
+       string_id_common:
+         if (strcmp (s, "$default") == 0)
+           {
+             fprintf (file, "\t.global\t$tableentry$default$%s\n", vname);
+             fprintf (file, "$tableentry$default$%s:\n", vname);
+           }
+         else
+           vname = s;
+         break;
+
+       case INTEGER_CST:
+         vnum = TREE_INT_CST_LOW (val_attr);
+
+         fprintf (file, "\t.global\t$tableentry$%d$%s\n", vnum, vname);
+         fprintf (file, "$tableentry$%d$%s:\n", vnum, vname);
+         break;
+
+       default:
+         ;
+       }
+
+      vec_attr = TREE_CHAIN (vec_attr);
+    }
+
+}
+
 /* We don't use this to actually emit the function prologue.  We use
    this to insert a comment in the asm file describing the
    function.  */
@@ -1590,6 +1669,9 @@ static void
 rl78_start_function (FILE *file)
 {
   int i;
+  
+  add_vector_labels (file, "interrupt");
+  add_vector_labels (file, "vector");
 
   if (cfun->machine->framesize == 0)
     return;
index cb9df971a5fa5bf87ee84a22345b3bba98a20222..4f79a92fc1d261e46b017dd3fde45dc8f09acb85 100644 (file)
@@ -5182,7 +5182,7 @@ that the specified function is an interrupt handler.  The compiler generates
 function entry and exit sequences suitable for use in an interrupt handler
 when this attribute is present.
 
-On RX targets, you may specify one or more vector numbers as arguments
+On RX and RL78 targets, you may specify one or more vector numbers as arguments
 to the attribute, as well as naming an alternate table name.
 Parameters are handled sequentially, so one handler can be assigned to
 multiple entries in multiple tables.  One may also pass the magic
index 42bd190a87252d8a95b69688f0c4d61dd29dfcda..613a3277e10d6b0adb5570bd8a99a71f12866022 100644 (file)
@@ -1,3 +1,7 @@
+2018-02-13  Sebastian Perta  <sebastian.perta@renesas.com>
+
+       * gcc.target/rl78/test_auto_vector.c: New test.
+
 2018-02-13  Richard Sandiford  <richard.sandiford@linaro.org>
 
        PR c/84305
diff --git a/gcc/testsuite/gcc.target/rl78/test_auto_vector.c b/gcc/testsuite/gcc.target/rl78/test_auto_vector.c
new file mode 100644 (file)
index 0000000..7055363
--- /dev/null
@@ -0,0 +1,21 @@
+/* { dg-do compile } */\r
+\r
+void __attribute__ ((interrupt (5))) interrupt_5_handler ();\r
+\r
+void interrupt_5_handler ()\r
+{\r
+}\r
+\r
+void __attribute__ ((vector (4))) interrupt_4_handler ();\r
+\r
+void interrupt_4_handler ()\r
+{\r
+}\r
+\r
+void __attribute__ ((interrupt)) interrupt_handler ();\r
+\r
+void interrupt_handler ()\r
+{\r
+}\r
+\r
+/* { dg-final { scan-assembler "tableentry" } } */\r