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.pe...@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 <rguent...@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" } } */