From: "Sebastian Perta" <sebastian.perta@renesas.com>
To: <gcc-patches@gcc.gnu.org>
Subject: RE: [PATCH] RL78 new "vector" function attribute
Date: Mon, 29 Jan 2018 13:36:00 -0000 [thread overview]
Message-ID: <000001d39901$6913f910$3b3beb30$@renesas.com> (raw)
Hello,
The below patch adds a new vector attribute for RL78, it is basically a copy
past of what DJ has done for RX a while ago:
https://gcc.gnu.org/ml/gcc-patches/2014-05/msg02387.html
The patch adds also a test case and updates extend.texi with the new
attribute.
Regression test is OK, tested with the following command:
make -k check-gcc RUNTESTFLAGS=--target_board=rl78-sim
As you can see I had to duplicate some of the code from RX for this on the
other hand if I try to make this attribute generic
It will become available for all targets which I'm not sure if it is
desirable. Please let me know if this is OK to checkin or should I
look further into avoiding the code duplication.
Best Regards,
Sebastian
Index: ChangeLog
===================================================================
--- ChangeLog (revision 257142)
+++ ChangeLog (working copy)
@@ -1,3 +1,14 @@
+2018-01-29 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.
+ * testsuite/gcc.target/rl78/test_auto_vector.c: New file.
+ * doc/extend.texi: documentation for the new attribute
+
2018-01-29 Richard Biener <rguenther@suse.de>
PR tree-optimization/84057
Index: config/rl78/rl78.c
===================================================================
--- config/rl78/rl78.c (revision 257142)
+++ config/rl78/rl78.c (working copy)
@@ -809,7 +809,6 @@
bool * no_add_attrs)
{
gcc_assert (DECL_P (* node));
- gcc_assert (args == NULL_TREE);
if (TREE_CODE (* node) != FUNCTION_DECL)
{
@@ -868,6 +867,28 @@
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 @@
{
/* 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 @@
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 @@
#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 @@
rl78_start_function (FILE *file)
{
int i;
+
+ add_vector_labels (file, "interrupt");
+ add_vector_labels (file, "vector");
if (cfun->machine->framesize == 0)
return;
Index: doc/extend.texi
===================================================================
--- doc/extend.texi (revision 257142)
+++ doc/extend.texi (working copy)
@@ -5150,6 +5150,28 @@
handlers intended to be used with the @code{BRK} opcode (i.e.@: those
that must end with @code{RETB} instead of @code{RETI}).
+On RL78, 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
+string @code{"$default"} which causes the function to be used for any
+unfilled slots in the current table.
+
+This example shows a simple assignment of a function to one vector in
+the default table (note that preprocessor macros may be used for
+chip-specific symbolic vector names):
+@smallexample
+void __attribute__ ((interrupt (5))) txd1_handler ();
+@end smallexample
+
+This example assigns a function to two slots in the default table
+(using preprocessor macros defined elsewhere) and makes it the default
+for the @code{dct} table:
+@smallexample
+void __attribute__ ((interrupt (RXD1_VECT,RXD2_VECT,"dct","$default")))
+ txd1_handler ();
+@end smallexample
+
@item naked
@cindex @code{naked} function attribute, RL78
This attribute allows the compiler to construct the
Index: testsuite/gcc.target/rl78/test_auto_vector.c
===================================================================
--- testsuite/gcc.target/rl78/test_auto_vector.c (nonexistent)
+++ testsuite/gcc.target/rl78/test_auto_vector.c (working copy)
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+
+void __attribute__ ((interrupt (5))) interrupt_5_handler ();
+
+void interrupt_5_handler ()
+{
+}
+
+void __attribute__ ((vector (4))) interrupt_4_handler ();
+
+void interrupt_4_handler ()
+{
+}
+
+void __attribute__ ((interrupt)) interrupt_handler ();
+
+void interrupt_handler ()
+{
+}
+
+/* { dg-final { scan-assembler "tableentry" } } */
next reply other threads:[~2018-01-29 13:02 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-01-29 13:36 Sebastian Perta [this message]
2018-01-29 22:01 ` DJ Delorie
2018-02-06 13:39 ` Sebastian Perta
2018-02-06 22:57 ` DJ Delorie
2018-02-12 14:08 ` Sebastian Perta
2018-02-12 23:44 ` DJ Delorie
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='000001d39901$6913f910$3b3beb30$@renesas.com' \
--to=sebastian.perta@renesas.com \
--cc=gcc-patches@gcc.gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).