Swap affects_type_identity and handler fields in attribute_spec

Message ID 20171215141818.GK2353@tucnak
State New
Headers show
Series
  • Swap affects_type_identity and handler fields in attribute_spec
Related show

Commit Message

Jakub Jelinek Dec. 15, 2017, 2:18 p.m.
Hi!

As I said earlier, I'd like to take the opportunity that Martin has added
new field into attribute_spec and all out of tree FEs and backends need
adjustment anyway to swap the affects_type_identity and handler fields.
Previously we had:
const char *, 2x int, 3x bool, 1x fnptr, 1x bool, 1x exclusions *
fields in the structure, so 48 bytes on LP64 and 28 bytes on ILP32 hosts,
with the patch we have:
const char *, 2x int, 4x bool, 1x fnptr, 1x exclusions *
so 40 bytes on LP64 and 24 bytes on ILP32 hosts.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2017-12-15  Jakub Jelinek  <jakub@redhat.com>

	* tree-core.h (struct attribute_spec): Swap affects_type_identity and
	handler fields.
	* config/alpha/alpha.c (vms_attribute_table): Swap
	affects_type_identity and handler fields, adjust comments.
	* config/mips/mips.c (mips_attribute_table): Likewise.
	* config/visium/visium.c (visium_attribute_table): Likewise.
	* config/epiphany/epiphany.c (epiphany_attribute_table): Likewise.
	* config/microblaze/microblaze.c (microblaze_attribute_table):
	Likewise.
	* config/spu/spu.c (spu_attribute_table): Likewise.
	* config/mcore/mcore.c (mcore_attribute_table): Likewise.
	* config/arc/arc.c (arc_attribute_table): Likewise.
	* config/m68k/m68k.c (m68k_attribute_table): Likewise.
	* config/v850/v850.c (v850_handle_interrupt_attribute,
	v850_handle_data_area_attribute): Formatting fixes.
	(v850_attribute_table): Swap affects_type_identity and handler
	fields, adjust comments.
	* config/m32r/m32r.c (m32r_attribute_table): Likewise.
	* config/arm/arm.c (arm_attribute_table): Likewise.
	* config/avr/avr.c (avr_attribute_table): Likewise.
	* config/s390/s390.c (s390_attribute_table): Likewise.
	* config/sh/sh.c (sh_attribute_table): Likewise.
	* config/i386/i386.c (ix86_handle_cconv_attribute,
	ix86_handle_callee_pop_aggregate_return): Formatting fixes.
	(ix86_attribute_table): Swap affects_type_identity and handler
	fields, adjust comments.
	* config/i386/cygming.h (SUBTARGET_ATTRIBUTE_TABLE): Likewise.
	* config/sparc/sparc.c (sparc_attribute_table): Likewise.
	* config/m32c/m32c.c (m32c_attribute_table): Likewise.
	* config/sol2.h (SOLARIS_ATTRIBUTE_TABLE): Likewise.
	* config/ia64/ia64.c (ia64_attribute_table): Likewise.
	* config/msp430/msp430.c (msp430_attribute_table): Likewise.
	* config/rx/rx.c (rx_attribute_table): Likewise.
	* config/cr16/cr16.c (cr16_attribute_table): Likewise.
	* config/h8300/h8300.c (h8300_attribute_table): Likewise.
	* config/nvptx/nvptx.c (nvptx_attribute_table): Likewise.
	* config/powerpcspe/powerpcspe.c (rs6000_attribute_table): Likewise.
	* config/darwin.h (SUBTARGET_ATTRIBUTE_TABLE): Likewise.
	* config/stormy16/stormy16.c (xstormy16_attribute_table): Likewise.
	* config/bfin/bfin.c (bfin_attribute_table): Likewise.
	* config/rs6000/rs6000.c (rs6000_attribute_table): Likewise.
	* config/rl78/rl78.c (rl78_attribute_table): Likewise.
	* config/nds32/nds32.c (nds32_attribute_table): Likewise.
	* doc/plugins.texi (user_attr): Likewise.  Add NULL for
	exclude.
	* attribs.c (empty_attribute_table): Swap affects_type_identity and
	handler fields.
	(register_scoped_attributes, decl_attributes): Formatting fixes.
ada/
	* gcc-interface/utils.c (gnat_internal_attribute_table): Swap
	affects_type_identity and handler fields, adjust comments.
brig/
	* brig-lang.c (brig_attribute_table): Swap affects_type_identity
	and handler fields, adjust comments.
c-family/
	* c-attribs.c (c_common_attribute_table,
	c_common_format_attribute_table): Swap affects_type_identity
	and handler fields, adjust comments.
cp/
	* tree.c (cxx_attribute_table, std_attribute_table): Swap
	affects_type_identity and handler fields, adjust comments.
fortran/
	* f95-lang.c (gfc_attribute_table): Swap affects_type_identity
	and handler fields, adjust comments.
lto/
	* lto-lang.c (lto_attribute_table, lto_format_attribute_table): Swap
	affects_type_identity and handler fields, adjust comments.
testsuite/
	* g++.dg/plugin/attribute_plugin.c (user_attr): Swap
	affects_type_identity and handler fields, add NULL for exclude.


	Jakub

Comments

Jason Merrill Dec. 15, 2017, 3:05 p.m. | #1
On Fri, Dec 15, 2017 at 9:18 AM, Jakub Jelinek <jakub@redhat.com> wrote:
> Hi!

>

> As I said earlier, I'd like to take the opportunity that Martin has added

> new field into attribute_spec and all out of tree FEs and backends need

> adjustment anyway to swap the affects_type_identity and handler fields.

> Previously we had:

> const char *, 2x int, 3x bool, 1x fnptr, 1x bool, 1x exclusions *

> fields in the structure, so 48 bytes on LP64 and 28 bytes on ILP32 hosts,

> with the patch we have:

> const char *, 2x int, 4x bool, 1x fnptr, 1x exclusions *

> so 40 bytes on LP64 and 24 bytes on ILP32 hosts.

>

> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?


OK.

Patch

--- gcc/tree-core.h.jj	2017-12-08 00:50:28.000000000 +0100
+++ gcc/tree-core.h	2017-12-15 12:13:01.413612746 +0100
@@ -1929,6 +1929,8 @@  struct attribute_spec {
      and from a function return type (which is not itself a function
      pointer type) to the function type.  */
   bool function_type_required;
+  /* Specifies if attribute affects type's identity.  */
+  bool affects_type_identity;
   /* Function to handle this attribute.  NODE points to the node to which
      the attribute is to be applied.  If a DECL, it should be modified in
      place; if a TYPE, a copy should be created.  NAME is the name of the
@@ -1945,8 +1947,6 @@  struct attribute_spec {
      by the rest of this structure.  */
   tree (*handler) (tree *node, tree name, tree args,
 		   int flags, bool *no_add_attrs);
-  /* Specifies if attribute affects type's identity.  */
-  bool affects_type_identity;
 
   /* Specifies the name of an attribute that's mutually exclusive with
      this one, and whether the relationship applies to the function,
--- gcc/config/alpha/alpha.c.jj	2017-12-07 18:05:01.000000000 +0100
+++ gcc/config/alpha/alpha.c	2017-12-15 13:22:51.198000858 +0100
@@ -7505,11 +7505,11 @@  common_object_handler (tree *node, tree
 
 static const struct attribute_spec vms_attribute_table[] =
 {
-  /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       affects_type_identity, exclusions } */
-  { COMMON_OBJECT,   0, 1, true,  false, false, common_object_handler, false,
+  /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
+       affects_type_identity, handler, exclude } */
+  { COMMON_OBJECT,   0, 1, true,  false, false, false, common_object_handler,
     NULL },
-  { NULL,            0, 0, false, false, false, NULL, false, NULL }
+  { NULL,            0, 0, false, false, false, false, NULL, NULL }
 };
 
 void
--- gcc/config/mips/mips.c.jj	2017-12-07 18:05:03.000000000 +0100
+++ gcc/config/mips/mips.c	2017-12-15 13:07:59.457227938 +0100
@@ -595,29 +595,29 @@  static tree mips_handle_use_shadow_regis
 
 /* The value of TARGET_ATTRIBUTE_TABLE.  */
 static const struct attribute_spec mips_attribute_table[] = {
-  /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       om_diagnostic } */
-  { "long_call",   0, 0, false, true,  true,  NULL, false, NULL },
-  { "short_call",  0, 0, false, true,  true,  NULL, false, NULL },
-  { "far",     	   0, 0, false, true,  true,  NULL, false, NULL },
-  { "near",        0, 0, false, true,  true,  NULL, false, NULL },
+  /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
+       affects_type_identity, handler, exclude } */
+  { "long_call",   0, 0, false, true,  true,  false, NULL, NULL },
+  { "short_call",  0, 0, false, true,  true,  false, NULL, NULL },
+  { "far",     	   0, 0, false, true,  true,  false, NULL, NULL },
+  { "near",        0, 0, false, true,  true,  false, NULL, NULL },
   /* We would really like to treat "mips16" and "nomips16" as type
      attributes, but GCC doesn't provide the hooks we need to support
      the right conversion rules.  As declaration attributes, they affect
      code generation but don't carry other semantics.  */
-  { "mips16", 	   0, 0, true,  false, false, NULL, false, NULL },
-  { "nomips16",    0, 0, true,  false, false, NULL, false, NULL },
-  { "micromips",   0, 0, true,  false, false, NULL, false, NULL },
-  { "nomicromips", 0, 0, true,  false, false, NULL, false, NULL },
-  { "nocompression", 0, 0, true,  false, false, NULL, false, NULL },
+  { "mips16", 	   0, 0, true,  false, false, false, NULL, NULL },
+  { "nomips16",    0, 0, true,  false, false, false, NULL, NULL },
+  { "micromips",   0, 0, true,  false, false, false, NULL, NULL },
+  { "nomicromips", 0, 0, true,  false, false, false, NULL, NULL },
+  { "nocompression", 0, 0, true,  false, false, false, NULL, NULL },
   /* Allow functions to be specified as interrupt handlers */
-  { "interrupt",   0, 1, false, true,  true, mips_handle_interrupt_attr,
-    false, NULL },
-  { "use_shadow_register_set",	0, 1, false, true,  true,
-    mips_handle_use_shadow_register_set_attr, false, NULL },
-  { "keep_interrupts_masked",	0, 0, false, true,  true, NULL, false, NULL },
-  { "use_debug_exception_return", 0, 0, false, true,  true, NULL, false, NULL },
-  { NULL,	   0, 0, false, false, false, NULL, false, NULL }
+  { "interrupt",   0, 1, false, true,  true, false, mips_handle_interrupt_attr,
+    NULL },
+  { "use_shadow_register_set",	0, 1, false, true,  true, false,
+    mips_handle_use_shadow_register_set_attr, NULL },
+  { "keep_interrupts_masked",	0, 0, false, true,  true, false, NULL, NULL },
+  { "use_debug_exception_return", 0, 0, false, true, true, false, NULL, NULL },
+  { NULL,	   0, 0, false, false, false, false, NULL, NULL }
 };
 
 /* A table describing all the processors GCC knows about; see
--- gcc/config/visium/visium.c.jj	2017-12-07 18:05:03.000000000 +0100
+++ gcc/config/visium/visium.c	2017-12-15 13:21:32.016996205 +0100
@@ -145,11 +145,11 @@  static inline bool current_function_has_
    interrupt -- specifies this function is an interrupt handler.   */
 static const struct attribute_spec visium_attribute_table[] =
 {
-  /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       affects_type_identity, exclusions } */
-  {"interrupt", 0, 0, true, false, false, visium_handle_interrupt_attr, false,
-   NULL},
-  {NULL, 0, 0, false, false, false, NULL, false, NULL},
+  /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
+       affects_type_identity, handler, exclude } */
+  { "interrupt", 0, 0, true, false, false, false, visium_handle_interrupt_attr,
+    NULL},
+  { NULL, 0, 0, false, false, false, false, NULL, NULL },
 };
 
 static struct machine_function *visium_init_machine_status (void);
--- gcc/config/epiphany/epiphany.c.jj	2017-12-07 18:05:02.000000000 +0100
+++ gcc/config/epiphany/epiphany.c	2017-12-15 12:51:19.600906981 +0100
@@ -460,14 +460,16 @@  epiphany_init_reg_tables (void)
 
 static const struct attribute_spec epiphany_attribute_table[] =
 {
-  /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       affects_type_identity, exclusions } */
-  { "interrupt",  0, 9, true,  false, false, epiphany_handle_interrupt_attribute, true, NULL },
-  { "forwarder_section", 1, 1, true, false, false, epiphany_handle_forwarder_attribute, false, NULL },
-  { "long_call",  0, 0, false, true, true, NULL, false, NULL },
-  { "short_call", 0, 0, false, true, true, NULL, false, NULL },
-  { "disinterrupt", 0, 0, false, true, true, NULL, true, NULL },
-  { NULL,         0, 0, false, false, false, NULL, false, NULL }
+  /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
+       affects_type_identity, handler, exclude } */
+  { "interrupt",  0, 9, true,  false, false, true,
+    epiphany_handle_interrupt_attribute, NULL },
+  { "forwarder_section", 1, 1, true, false, false, false,
+    epiphany_handle_forwarder_attribute, NULL },
+  { "long_call",  0, 0, false, true, true, false, NULL, NULL },
+  { "short_call", 0, 0, false, true, true, false, NULL, NULL },
+  { "disinterrupt", 0, 0, false, true, true, true, NULL, NULL },
+  { NULL,         0, 0, false, false, false, false, NULL, NULL }
 };
 
 /* Handle an "interrupt" attribute; arguments as in
--- gcc/config/microblaze/microblaze.c.jj	2017-12-07 18:05:02.000000000 +0100
+++ gcc/config/microblaze/microblaze.c	2017-12-15 13:06:01.798714172 +0100
@@ -215,18 +215,13 @@  int fast_interrupt;
 int save_volatiles;
 
 const struct attribute_spec microblaze_attribute_table[] = {
-  /* name         min_len, max_len, decl_req, type_req, fn_type, req_handler,
-     affects_type_identity, exclusions */
-  {"interrupt_handler", 0,       0,     true,    false,   false,        NULL,
-    false, NULL },
-  {"break_handler",     0,       0,     true,    false,   false,        NULL,
-    false, NULL },
-  {"fast_interrupt",    0,       0,     true,    false,   false,        NULL,
-    false, NULL },
-  {"save_volatiles"   , 0,       0,     true,    false,   false,        NULL,
-    false, NULL },
-  { NULL,        	0,       0,    false,    false,   false,        NULL,
-    false, NULL }
+  /* name         min_len, max_len, decl_req, type_req, fn_type_req,
+     affects_type_identity, handler, exclude */
+  {"interrupt_handler",	0,       0,    true, false, false, false, NULL, NULL },
+  {"break_handler",	0,       0,    true, false, false, false, NULL, NULL },
+  {"fast_interrupt",	0,       0,    true, false, false, false, NULL, NULL },
+  {"save_volatiles",	0,       0,    true, false, false, false, NULL, NULL },
+  { NULL,        	0,       0,   false, false, false, false, NULL, NULL }
 };
 
 static int microblaze_interrupt_function_p (tree);
--- gcc/config/spu/spu.c.jj	2017-12-08 12:54:15.000000000 +0100
+++ gcc/config/spu/spu.c	2017-12-15 13:18:09.675539743 +0100
@@ -7215,13 +7215,13 @@  spu_constant_alignment (const_tree, HOST
 /*  Table of machine attributes.  */
 static const struct attribute_spec spu_attribute_table[] =
 {
-  /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       affects_type_identity, exclusions } */
-  { "naked",          0, 0, true,  false, false, spu_handle_fndecl_attribute,
-    false, NULL },
-  { "spu_vector",     0, 0, false, true,  false, spu_handle_vector_attribute,
-    false, NULL },
-  { NULL,             0, 0, false, false, false, NULL, false, NULL }
+  /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
+       affects_type_identity, handler, exclude } */
+  { "naked",          0, 0, true,  false, false, false,
+    spu_handle_fndecl_attribute, NULL },
+  { "spu_vector",     0, 0, false, true,  false, false,
+    spu_handle_vector_attribute, NULL },
+  { NULL,             0, 0, false, false, false, false, NULL, NULL }
 };
 
 /*  TARGET overrides.  */
--- gcc/config/mcore/mcore.c.jj	2017-12-07 18:05:03.000000000 +0100
+++ gcc/config/mcore/mcore.c	2017-12-15 13:03:49.981379257 +0100
@@ -151,13 +151,13 @@  static bool	  mcore_modes_tieable_p		(ma
 
 static const struct attribute_spec mcore_attribute_table[] =
 {
-  /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       affects_type_identity, exclusions } */
-  { "dllexport", 0, 0, true,  false, false, NULL, false, NULL },
-  { "dllimport", 0, 0, true,  false, false, NULL, false, NULL },
-  { "naked",     0, 0, true,  false, false, mcore_handle_naked_attribute,
-    false, NULL },
-  { NULL,        0, 0, false, false, false, NULL, false, NULL }
+  /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
+       affects_type_identity, handler, exclude } */
+  { "dllexport", 0, 0, true,  false, false, false, NULL, NULL },
+  { "dllimport", 0, 0, true,  false, false, false, NULL, NULL },
+  { "naked",     0, 0, true,  false, false, false,
+    mcore_handle_naked_attribute, NULL },
+  { NULL,        0, 0, false, false, false, false, NULL, NULL }
 };
 
 /* Initialize the GCC target structure.  */
--- gcc/config/arc/arc.c.jj	2017-12-14 16:25:10.000000000 +0100
+++ gcc/config/arc/arc.c	2017-12-15 13:23:49.610266585 +0100
@@ -217,25 +217,25 @@  static tree arc_handle_fndecl_attribute
    machine specific supported attributes.  */
 const struct attribute_spec arc_attribute_table[] =
 {
- /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-      affects_type_identity, exclusions } */
-  { "interrupt", 1, 1, true, false, false, arc_handle_interrupt_attribute,
-      true, NULL },
+ /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
+      affects_type_identity, handler, exclude } */
+  { "interrupt", 1, 1, true, false, false, true,
+    arc_handle_interrupt_attribute, NULL },
   /* Function calls made to this symbol must be done indirectly, because
      it may lie outside of the 21/25 bit addressing range of a normal function
      call.  */
-  { "long_call",    0, 0, false, true,  true,  NULL, false, NULL },
+  { "long_call",    0, 0, false, true,  true,  false, NULL, NULL },
   /* Whereas these functions are always known to reside within the 25 bit
      addressing range of unconditionalized bl.  */
-  { "medium_call",   0, 0, false, true,  true,  NULL, false, NULL },
+  { "medium_call",   0, 0, false, true,  true, false, NULL, NULL },
   /* And these functions are always known to reside within the 21 bit
      addressing range of blcc.  */
-  { "short_call",   0, 0, false, true,  true,  NULL, false, NULL },
+  { "short_call",   0, 0, false, true,  true,  false, NULL, NULL },
   /* Function which are not having the prologue and epilogue generated
      by the compiler.  */
-  { "naked", 0, 0, true, false, false, arc_handle_fndecl_attribute, false,
+  { "naked", 0, 0, true, false, false,  false, arc_handle_fndecl_attribute,
     NULL },
-  { NULL, 0, 0, false, false, false, NULL, false, NULL }
+  { NULL, 0, 0, false, false, false, false, NULL, NULL }
 };
 static int arc_comp_type_attributes (const_tree, const_tree);
 static void arc_file_start (void);
--- gcc/config/m68k/m68k.c.jj	2017-12-07 18:05:02.000000000 +0100
+++ gcc/config/m68k/m68k.c	2017-12-15 13:03:00.276007123 +0100
@@ -347,15 +347,15 @@  static bool m68k_modes_tieable_p (machin
 
 static const struct attribute_spec m68k_attribute_table[] =
 {
-  /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       affects_type_identity, exclusions } */
-  { "interrupt", 0, 0, true,  false, false, m68k_handle_fndecl_attribute,
-    false },
-  { "interrupt_handler", 0, 0, true,  false, false,
-    m68k_handle_fndecl_attribute, false, NULL },
-  { "interrupt_thread", 0, 0, true,  false, false,
-    m68k_handle_fndecl_attribute, false, NULL },
-  { NULL, 0, 0, false, false, false, NULL, false, NULL }
+  /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
+       affects_type_identity, handler, exclude } */
+  { "interrupt", 0, 0, true,  false, false, false,
+    m68k_handle_fndecl_attribute, NULL },
+  { "interrupt_handler", 0, 0, true,  false, false, false,
+    m68k_handle_fndecl_attribute, NULL },
+  { "interrupt_thread", 0, 0, true,  false, false, false,
+    m68k_handle_fndecl_attribute, NULL },
+  { NULL, 0, 0, false, false, false, false, NULL, NULL }
 };
 
 struct gcc_target targetm = TARGET_INITIALIZER;
--- gcc/config/v850/v850.c.jj	2017-12-07 18:05:03.000000000 +0100
+++ gcc/config/v850/v850.c	2017-12-15 13:19:52.104252160 +0100
@@ -2072,8 +2072,7 @@  v850_set_data_area (tree decl, v850_data
 /* Handle an "interrupt" attribute; arguments as in
    struct attribute_spec.handler.  */
 static tree
-v850_handle_interrupt_attribute (tree * node,
-                                 tree name,
+v850_handle_interrupt_attribute (tree *node, tree name,
                                  tree args ATTRIBUTE_UNUSED,
                                  int flags ATTRIBUTE_UNUSED,
                                  bool * no_add_attrs)
@@ -2091,8 +2090,7 @@  v850_handle_interrupt_attribute (tree *
 /* Handle a "sda", "tda" or "zda" attribute; arguments as in
    struct attribute_spec.handler.  */
 static tree
-v850_handle_data_area_attribute (tree* node,
-                                 tree name,
+v850_handle_data_area_attribute (tree *node, tree name,
                                  tree args ATTRIBUTE_UNUSED,
                                  int flags ATTRIBUTE_UNUSED,
                                  bool * no_add_attrs)
@@ -3187,19 +3185,19 @@  v850_adjust_insn_length (rtx_insn *insn,
 
 static const struct attribute_spec v850_attribute_table[] =
 {
-  /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       affects_type_identity, exclusions } */
-  { "interrupt_handler", 0, 0, true,  false, false,
-    v850_handle_interrupt_attribute, false, NULL },
-  { "interrupt",         0, 0, true,  false, false,
-    v850_handle_interrupt_attribute, false, NULL },
-  { "sda",               0, 0, true,  false, false,
-    v850_handle_data_area_attribute, false, NULL },
-  { "tda",               0, 0, true,  false, false,
-    v850_handle_data_area_attribute, false, NULL },
-  { "zda",               0, 0, true,  false, false,
-    v850_handle_data_area_attribute, false, NULL },
-  { NULL,                0, 0, false, false, false, NULL, false, NULL }
+  /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
+       affects_type_identity, handler, exclude } */
+  { "interrupt_handler", 0, 0, true,  false, false, false,
+    v850_handle_interrupt_attribute, NULL },
+  { "interrupt",         0, 0, true,  false, false, false,
+    v850_handle_interrupt_attribute, NULL },
+  { "sda",               0, 0, true,  false, false, false,
+    v850_handle_data_area_attribute, NULL },
+  { "tda",               0, 0, true,  false, false, false,
+    v850_handle_data_area_attribute, NULL },
+  { "zda",               0, 0, true,  false, false, false,
+    v850_handle_data_area_attribute, NULL },
+  { NULL,                0, 0, false, false, false, false, NULL, NULL }
 };
 
 static void
--- gcc/config/m32r/m32r.c.jj	2017-12-07 18:05:01.000000000 +0100
+++ gcc/config/m32r/m32r.c	2017-12-15 13:02:09.269651423 +0100
@@ -110,12 +110,12 @@  static HOST_WIDE_INT m32r_starting_frame
 
 static const struct attribute_spec m32r_attribute_table[] =
 {
-  /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       affects_type_identity, exclusions } */
-  { "interrupt", 0, 0, true,  false, false, NULL, false, NULL },
-  { "model",     1, 1, true,  false, false, m32r_handle_model_attribute,
-    false, NULL },
-  { NULL,        0, 0, false, false, false, NULL, false, NULL }
+  /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
+       affects_type_identity, handler, exclude } */
+  { "interrupt", 0, 0, true,  false, false, false, NULL, NULL },
+  { "model",     1, 1, true,  false, false, false, m32r_handle_model_attribute,
+    NULL },
+  { NULL,        0, 0, false, false, false, false, NULL, NULL }
 };
 
 /* Initialize the GCC target structure.  */
--- gcc/config/arm/arm.c.jj	2017-12-14 21:11:46.000000000 +0100
+++ gcc/config/arm/arm.c	2017-12-15 12:45:13.629599402 +0100
@@ -322,25 +322,25 @@  static HOST_WIDE_INT arm_constant_alignm
 /* Table of machine attributes.  */
 static const struct attribute_spec arm_attribute_table[] =
 {
-  /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       affects_type_identity, exclusions } */
+  /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
+       affects_type_identity, handler, exclude } */
   /* Function calls made to this symbol must be done indirectly, because
      it may lie outside of the 26 bit addressing range of a normal function
      call.  */
-  { "long_call",    0, 0, false, true,  true,  NULL, false, NULL },
+  { "long_call",    0, 0, false, true,  true,  false, NULL, NULL },
   /* Whereas these functions are always known to reside within the 26 bit
      addressing range.  */
-  { "short_call",   0, 0, false, true,  true,  NULL, false, NULL },
+  { "short_call",   0, 0, false, true,  true,  false, NULL, NULL },
   /* Specify the procedure call conventions for a function.  */
-  { "pcs",          1, 1, false, true,  true,  arm_handle_pcs_attribute,
-    false, NULL },
+  { "pcs",          1, 1, false, true,  true,  false, arm_handle_pcs_attribute,
+    NULL },
   /* Interrupt Service Routines have special prologue and epilogue requirements.  */
-  { "isr",          0, 1, false, false, false, arm_handle_isr_attribute,
-    false, NULL },
-  { "interrupt",    0, 1, false, false, false, arm_handle_isr_attribute,
-    false, NULL },
-  { "naked",        0, 0, true,  false, false, arm_handle_fndecl_attribute,
-    false, NULL },
+  { "isr",          0, 1, false, false, false, false, arm_handle_isr_attribute,
+    NULL },
+  { "interrupt",    0, 1, false, false, false, false, arm_handle_isr_attribute,
+    NULL },
+  { "naked",        0, 0, true,  false, false, false,
+    arm_handle_fndecl_attribute, NULL },
 #ifdef ARM_PE
   /* ARM/PE has three new attributes:
      interfacearm - ?
@@ -351,24 +351,24 @@  static const struct attribute_spec arm_a
      them with spaces.  We do NOT support this.  Instead, use __declspec
      multiple times.
   */
-  { "dllimport",    0, 0, true,  false, false, NULL, false, NULL },
-  { "dllexport",    0, 0, true,  false, false, NULL, false, NULL },
-  { "interfacearm", 0, 0, true,  false, false, arm_handle_fndecl_attribute,
-    false, NULL },
+  { "dllimport",    0, 0, true,  false, false, false, NULL, NULL },
+  { "dllexport",    0, 0, true,  false, false, false, NULL, NULL },
+  { "interfacearm", 0, 0, true,  false, false, false,
+    arm_handle_fndecl_attribute, NULL },
 #elif TARGET_DLLIMPORT_DECL_ATTRIBUTES
-  { "dllimport",    0, 0, false, false, false, handle_dll_attribute, false,
+  { "dllimport",    0, 0, false, false, false, false, handle_dll_attribute,
     NULL },
-  { "dllexport",    0, 0, false, false, false, handle_dll_attribute, false,
+  { "dllexport",    0, 0, false, false, false, false, handle_dll_attribute,
     NULL },
-  { "notshared",    0, 0, false, true, false, arm_handle_notshared_attribute,
-    false, NULL },
+  { "notshared",    0, 0, false, true, false, false,
+    arm_handle_notshared_attribute, NULL },
 #endif
   /* ARMv8-M Security Extensions support.  */
-  { "cmse_nonsecure_entry", 0, 0, true, false, false,
-    arm_handle_cmse_nonsecure_entry, false, NULL },
-  { "cmse_nonsecure_call", 0, 0, true, false, false,
-    arm_handle_cmse_nonsecure_call, true, NULL },
-  { NULL, 0, 0, false, false, false, NULL, false, NULL }
+  { "cmse_nonsecure_entry", 0, 0, true, false, false, false,
+    arm_handle_cmse_nonsecure_entry, NULL },
+  { "cmse_nonsecure_call", 0, 0, true, false, false, true,
+    arm_handle_cmse_nonsecure_call, NULL },
+  { NULL, 0, 0, false, false, false, false, NULL, NULL }
 };
 
 /* Initialize the GCC target structure.  */
--- gcc/config/avr/avr.c.jj	2017-12-08 12:27:50.000000000 +0100
+++ gcc/config/avr/avr.c	2017-12-15 12:47:16.350025902 +0100
@@ -9871,34 +9871,33 @@  avr_eval_addr_attrib (rtx x)
 
 
 /* AVR attributes.  */
-static const struct attribute_spec
-avr_attribute_table[] =
+static const struct attribute_spec avr_attribute_table[] =
 {
-  /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       affects_type_identity, exclusions } */
-  { "progmem",   0, 0, false, false, false,  avr_handle_progmem_attribute,
-    false, NULL },
-  { "signal",    0, 0, true,  false, false,  avr_handle_fndecl_attribute,
-    false, NULL },
-  { "interrupt", 0, 0, true,  false, false,  avr_handle_fndecl_attribute,
-    false, NULL },
-  { "no_gccisr", 0, 0, true,  false, false,  avr_handle_fndecl_attribute,
-    false, NULL },
-  { "naked",     0, 0, false, true,  true,   avr_handle_fntype_attribute,
-    false, NULL },
-  { "OS_task",   0, 0, false, true,  true,   avr_handle_fntype_attribute,
-    false, NULL },
-  { "OS_main",   0, 0, false, true,  true,   avr_handle_fntype_attribute,
-    false, NULL },
-  { "io",        0, 1, true, false, false,  avr_handle_addr_attribute,
-    false, NULL },
-  { "io_low",    0, 1, true, false, false,  avr_handle_addr_attribute,
-    false, NULL },
-  { "address",   1, 1, true, false, false,  avr_handle_addr_attribute,
-    false, NULL },
-  { "absdata",   0, 0, true, false, false,  avr_handle_absdata_attribute,
-    false, NULL },
-  { NULL,        0, 0, false, false, false, NULL, false, NULL }
+  /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
+       affects_type_identity, handler, exclude } */
+  { "progmem",   0, 0, false, false, false, false,
+    avr_handle_progmem_attribute, NULL },
+  { "signal",    0, 0, true,  false, false, false,
+    avr_handle_fndecl_attribute, NULL },
+  { "interrupt", 0, 0, true,  false, false, false,
+    avr_handle_fndecl_attribute, NULL },
+  { "no_gccisr", 0, 0, true,  false, false, false,
+    avr_handle_fndecl_attribute, NULL },
+  { "naked",     0, 0, false, true,  true,  false,
+    avr_handle_fntype_attribute, NULL },
+  { "OS_task",   0, 0, false, true,  true,  false,
+    avr_handle_fntype_attribute, NULL },
+  { "OS_main",   0, 0, false, true,  true,  false,
+    avr_handle_fntype_attribute, NULL },
+  { "io",        0, 1, true, false, false,  false,
+    avr_handle_addr_attribute, NULL },
+  { "io_low",    0, 1, true, false, false,  false,
+    avr_handle_addr_attribute, NULL },
+  { "address",   1, 1, true, false, false,  false,
+    avr_handle_addr_attribute, NULL },
+  { "absdata",   0, 0, true, false, false,  false,
+    avr_handle_absdata_attribute, NULL },
+  { NULL,        0, 0, false, false, false, false, NULL, NULL }
 };
 
 
--- gcc/config/s390/s390.c.jj	2017-12-07 18:05:01.000000000 +0100
+++ gcc/config/s390/s390.c	2017-12-15 13:15:35.435478621 +0100
@@ -1178,12 +1178,12 @@  s390_handle_vectorbool_attribute (tree *
 }
 
 static const struct attribute_spec s390_attribute_table[] = {
-  { "hotpatch", 2, 2, true, false, false,
-    s390_handle_hotpatch_attribute, false, NULL },
-  { "s390_vector_bool", 0, 0, false, true, false,
-    s390_handle_vectorbool_attribute, true, NULL },
+  { "hotpatch", 2, 2, true, false, false, false,
+    s390_handle_hotpatch_attribute, NULL },
+  { "s390_vector_bool", 0, 0, false, true, false, true,
+    s390_handle_vectorbool_attribute, NULL },
   /* End element.  */
-  { NULL,        0, 0, false, false, false, NULL, false, NULL }
+  { NULL,        0, 0, false, false, false, false, NULL, NULL }
 };
 
 /* Return the alignment for LABEL.  We default to the -falign-labels
--- gcc/config/sh/sh.c.jj	2017-12-14 16:25:10.000000000 +0100
+++ gcc/config/sh/sh.c	2017-12-15 13:16:27.080829412 +0100
@@ -329,25 +329,25 @@  static bool sh_can_change_mode_class (ma
 
 static const struct attribute_spec sh_attribute_table[] =
 {
-  /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       affects_type_identity, exclusions } */
-  { "interrupt_handler", 0, 0, true,  false, false,
-    sh_handle_interrupt_handler_attribute, false, NULL },
-  { "sp_switch",         1, 1, true,  false, false,
-     sh_handle_sp_switch_attribute, false, NULL },
-  { "trap_exit",         1, 1, true,  false, false,
-    sh_handle_trap_exit_attribute, false, NULL },
-  { "renesas",           0, 0, false, true, false,
-    sh_handle_renesas_attribute, false, NULL },
-  { "trapa_handler",     0, 0, true,  false, false,
-    sh_handle_interrupt_handler_attribute, false, NULL },
-  { "nosave_low_regs",   0, 0, true,  false, false,
-    sh_handle_interrupt_handler_attribute, false, NULL },
-  { "resbank",           0, 0, true,  false, false,
-    sh_handle_resbank_handler_attribute, false, NULL },
-  { "function_vector",   1, 1, true,  false, false,
-    sh2a_handle_function_vector_handler_attribute, false, NULL },
-  { NULL,                0, 0, false, false, false, NULL, false, NULL }
+  /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
+       affects_type_identity, handler, exclude } */
+  { "interrupt_handler", 0, 0, true,  false, false, false,
+    sh_handle_interrupt_handler_attribute, NULL },
+  { "sp_switch",         1, 1, true,  false, false, false,
+     sh_handle_sp_switch_attribute, NULL },
+  { "trap_exit",         1, 1, true,  false, false, false,
+    sh_handle_trap_exit_attribute, NULL },
+  { "renesas",           0, 0, false, true, false, false,
+    sh_handle_renesas_attribute, NULL },
+  { "trapa_handler",     0, 0, true,  false, false, false,
+    sh_handle_interrupt_handler_attribute, NULL },
+  { "nosave_low_regs",   0, 0, true,  false, false, false,
+    sh_handle_interrupt_handler_attribute, NULL },
+  { "resbank",           0, 0, true,  false, false, false,
+    sh_handle_resbank_handler_attribute, NULL },
+  { "function_vector",   1, 1, true,  false, false, false,
+    sh2a_handle_function_vector_handler_attribute, NULL },
+  { NULL,                0, 0, false, false, false, false, NULL, NULL }
 };
 
 /* Initialize the GCC target structure.  */
--- gcc/config/i386/i386.c.jj	2017-12-14 16:25:09.000000000 +0100
+++ gcc/config/i386/i386.c	2017-12-15 12:56:20.902051919 +0100
@@ -6270,10 +6270,8 @@  ix86_function_ok_for_sibcall (tree decl,
    arguments as in struct attribute_spec.handler.  */
 
 static tree
-ix86_handle_cconv_attribute (tree *node, tree name,
-				   tree args,
-				   int,
-				   bool *no_add_attrs)
+ix86_handle_cconv_attribute (tree *node, tree name, tree args, int,
+			     bool *no_add_attrs)
 {
   if (TREE_CODE (*node) != FUNCTION_TYPE
       && TREE_CODE (*node) != METHOD_TYPE
@@ -40230,10 +40228,8 @@  x86_order_regs_for_local_alloc (void)
 /* Handle a "callee_pop_aggregate_return" attribute; arguments as
    in struct attribute_spec handler.  */
 static tree
-ix86_handle_callee_pop_aggregate_return (tree *node, tree name,
-					      tree args,
-					      int,
-					      bool *no_add_attrs)
+ix86_handle_callee_pop_aggregate_return (tree *node, tree name, tree args, int,
+					 bool *no_add_attrs)
 {
   if (TREE_CODE (*node) != FUNCTION_TYPE
       && TREE_CODE (*node) != METHOD_TYPE
@@ -44711,72 +44707,74 @@  ix86_expand_round_sse4 (rtx op0, rtx op1
 /* Table of valid machine attributes.  */
 static const struct attribute_spec ix86_attribute_table[] =
 {
-  /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       affects_type_identity, exclusions } */
+  /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
+       affects_type_identity, handler, exclude } */
   /* Stdcall attribute says callee is responsible for popping arguments
      if they are not variable.  */
-  { "stdcall",   0, 0, false, true,  true,  ix86_handle_cconv_attribute,
-    true, NULL },
+  { "stdcall",   0, 0, false, true,  true,  true, ix86_handle_cconv_attribute,
+    NULL },
   /* Fastcall attribute says callee is responsible for popping arguments
      if they are not variable.  */
-  { "fastcall",  0, 0, false, true,  true,  ix86_handle_cconv_attribute,
-    true, NULL },
+  { "fastcall",  0, 0, false, true,  true,  true, ix86_handle_cconv_attribute,
+    NULL },
   /* Thiscall attribute says callee is responsible for popping arguments
      if they are not variable.  */
-  { "thiscall",  0, 0, false, true,  true,  ix86_handle_cconv_attribute,
-    true, NULL },
+  { "thiscall",  0, 0, false, true,  true,  true, ix86_handle_cconv_attribute,
+    NULL },
   /* Cdecl attribute says the callee is a normal C declaration */
-  { "cdecl",     0, 0, false, true,  true,  ix86_handle_cconv_attribute,
-    true, NULL },
+  { "cdecl",     0, 0, false, true,  true,  true, ix86_handle_cconv_attribute,
+    NULL },
   /* Regparm attribute specifies how many integer arguments are to be
      passed in registers.  */
-  { "regparm",   1, 1, false, true,  true,  ix86_handle_cconv_attribute,
-    true, NULL },
+  { "regparm",   1, 1, false, true,  true,  true, ix86_handle_cconv_attribute,
+    NULL },
   /* Sseregparm attribute says we are using x86_64 calling conventions
      for FP arguments.  */
-  { "sseregparm", 0, 0, false, true, true, ix86_handle_cconv_attribute,
-    true, NULL },
+  { "sseregparm", 0, 0, false, true, true,  true, ix86_handle_cconv_attribute,
+    NULL },
   /* The transactional memory builtins are implicitly regparm or fastcall
      depending on the ABI.  Override the generic do-nothing attribute that
      these builtins were declared with.  */
-  { "*tm regparm", 0, 0, false, true, true, ix86_handle_tm_regparm_attribute,
-    true, NULL },
+  { "*tm regparm", 0, 0, false, true, true, true,
+    ix86_handle_tm_regparm_attribute, NULL },
   /* force_align_arg_pointer says this function realigns the stack at entry.  */
   { (const char *)&ix86_force_align_arg_pointer_string, 0, 0,
-    false, true,  true, ix86_handle_force_align_arg_pointer_attribute, false,
+    false, true,  true, false, ix86_handle_force_align_arg_pointer_attribute,
     NULL },
 #if TARGET_DLLIMPORT_DECL_ATTRIBUTES
-  { "dllimport", 0, 0, false, false, false, handle_dll_attribute, false, NULL },
-  { "dllexport", 0, 0, false, false, false, handle_dll_attribute, false, NULL },
-  { "shared",    0, 0, true,  false, false, ix86_handle_shared_attribute,
-    false, NULL },
+  { "dllimport", 0, 0, false, false, false, false, handle_dll_attribute,
+    NULL },
+  { "dllexport", 0, 0, false, false, false, false, handle_dll_attribute,
+    NULL },
+  { "shared",    0, 0, true,  false, false, false,
+    ix86_handle_shared_attribute, false, NULL },
 #endif
-  { "ms_struct", 0, 0, false, false,  false, ix86_handle_struct_attribute,
-    false, NULL },
-  { "gcc_struct", 0, 0, false, false,  false, ix86_handle_struct_attribute,
-    false, NULL },
+  { "ms_struct", 0, 0, false, false,  false, false,
+    ix86_handle_struct_attribute, NULL },
+  { "gcc_struct", 0, 0, false, false,  false, false,
+    ix86_handle_struct_attribute, NULL },
 #ifdef SUBTARGET_ATTRIBUTE_TABLE
   SUBTARGET_ATTRIBUTE_TABLE,
 #endif
   /* ms_abi and sysv_abi calling convention function attributes.  */
-  { "ms_abi", 0, 0, false, true, true, ix86_handle_abi_attribute, true, NULL },
-  { "sysv_abi", 0, 0, false, true, true, ix86_handle_abi_attribute, true,
+  { "ms_abi", 0, 0, false, true, true, true, ix86_handle_abi_attribute, NULL },
+  { "sysv_abi", 0, 0, false, true, true, true, ix86_handle_abi_attribute,
     NULL },
-  { "ms_abi va_list", 0, 0, false, false, false, NULL, false, NULL },
-  { "sysv_abi va_list", 0, 0, false, false, false, NULL, false, NULL },
-  { "ms_hook_prologue", 0, 0, true, false, false, ix86_handle_fndecl_attribute,
-    false, NULL },
-  { "callee_pop_aggregate_return", 1, 1, false, true, true,
-    ix86_handle_callee_pop_aggregate_return, true, NULL },
-  { "interrupt", 0, 0, false, true, true,
-    ix86_handle_interrupt_attribute, false, NULL },
-  { "no_caller_saved_registers", 0, 0, false, true, true,
-    ix86_handle_no_caller_saved_registers_attribute, false, NULL },
-  { "naked", 0, 0, true, false, false,
-    ix86_handle_fndecl_attribute, false, NULL },
+  { "ms_abi va_list", 0, 0, false, false, false, false, NULL, NULL },
+  { "sysv_abi va_list", 0, 0, false, false, false, false, NULL, NULL },
+  { "ms_hook_prologue", 0, 0, true, false, false, false,
+    ix86_handle_fndecl_attribute, NULL },
+  { "callee_pop_aggregate_return", 1, 1, false, true, true, true,
+    ix86_handle_callee_pop_aggregate_return, NULL },
+  { "interrupt", 0, 0, false, true, true, false,
+    ix86_handle_interrupt_attribute, NULL },
+  { "no_caller_saved_registers", 0, 0, false, true, true, false,
+    ix86_handle_no_caller_saved_registers_attribute, NULL },
+  { "naked", 0, 0, true, false, false, false,
+    ix86_handle_fndecl_attribute, NULL },
 
   /* End element.  */
-  { NULL, 0, 0, false, false, false, NULL, false, NULL }
+  { NULL, 0, 0, false, false, false, false, NULL, NULL }
 };
 
 /* Implement targetm.vectorize.builtin_vectorization_cost.  */
--- gcc/config/i386/cygming.h.jj	2017-12-08 12:27:50.000000000 +0100
+++ gcc/config/i386/cygming.h	2017-12-15 12:57:25.518235703 +0100
@@ -447,10 +447,10 @@  do {						\
 #define TARGET_USE_LOCAL_THUNK_ALIAS_P(DECL) (!DECL_ONE_ONLY (DECL))
 
 #define SUBTARGET_ATTRIBUTE_TABLE \
-  { "selectany", 0, 0, true, false, false, ix86_handle_selectany_attribute, \
-    false, NULL }
-  /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       affects_type_identity, exclusions } */
+  { "selectany", 0, 0, true, false, false, false, \
+    ix86_handle_selectany_attribute, NULL }
+  /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
+       affects_type_identity, handler, exclude } */
 
 /*  mcount() does not need a counter variable.  */
 #undef NO_PROFILE_COUNTERS
--- gcc/config/sparc/sparc.c.jj	2017-12-14 09:10:45.000000000 +0100
+++ gcc/config/sparc/sparc.c	2017-12-15 13:16:54.588483627 +0100
@@ -691,10 +691,10 @@  static HOST_WIDE_INT sparc_constant_alig
 /* Table of valid machine attributes.  */
 static const struct attribute_spec sparc_attribute_table[] =
 {
-  /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       do_diagnostic, exclusions } */
+  /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
+       do_diagnostic, handler, exclude } */
   SUBTARGET_ATTRIBUTE_TABLE,
-  { NULL,        0, 0, false, false, false, NULL, false, NULL }
+  { NULL,        0, 0, false, false, false, false, NULL, NULL }
 };
 #endif
 
--- gcc/config/m32c/m32c.c.jj	2017-12-07 18:05:01.000000000 +0100
+++ gcc/config/m32c/m32c.c	2017-12-15 13:01:25.444205016 +0100
@@ -3000,14 +3000,15 @@  current_function_special_page_vector (rt
 #undef TARGET_ATTRIBUTE_TABLE
 #define TARGET_ATTRIBUTE_TABLE m32c_attribute_table
 static const struct attribute_spec m32c_attribute_table[] = {
-  /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       affects_type_identity, exclusions } */
-  {"interrupt", 0, 0, false, false, false, interrupt_handler, false, NULL},
-  {"bank_switch", 0, 0, false, false, false, interrupt_handler, false, NULL},
-  {"fast_interrupt", 0, 0, false, false, false, interrupt_handler, false, NULL},
-  {"function_vector", 1, 1, true,  false, false, function_vector_handler,
-   false, NULL},
-  {0, 0, 0, 0, 0, 0, 0, false, NULL}
+  /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
+       affects_type_identity, handler, exclude } */
+  { "interrupt", 0, 0, false, false, false, false, interrupt_handler, NULL },
+  { "bank_switch", 0, 0, false, false, false, false, interrupt_handler, NULL },
+  { "fast_interrupt", 0, 0, false, false, false, false,
+    interrupt_handler, NULL },
+  { "function_vector", 1, 1, true,  false, false, false,
+    function_vector_handler, NULL },
+  { NULL, 0, 0, false, false, false, false, NULL, NULL }
 };
 
 #undef TARGET_COMP_TYPE_ATTRIBUTES
--- gcc/config/sol2.h.jj	2017-12-08 12:21:56.000000000 +0100
+++ gcc/config/sol2.h	2017-12-15 12:58:56.653084509 +0100
@@ -406,8 +406,8 @@  along with GCC; see the file COPYING3.
 /* #pragma init and #pragma fini are implemented on top of init and
    fini attributes.  */
 #define SOLARIS_ATTRIBUTE_TABLE						\
-  { "init",      0, 0, true,  false,  false, NULL, false, NULL },	\
-  { "fini",      0, 0, true,  false,  false, NULL, false, NULL }
+  { "init",      0, 0, true,  false,  false, false, NULL, NULL },	\
+  { "fini",      0, 0, true,  false,  false, false, NULL, NULL }
 
 /* Solaris-specific #pragmas are implemented on top of attributes.  Hook in
    the bits from config/sol2.c.  */
--- gcc/config/ia64/ia64.c.jj	2017-12-13 18:39:03.000000000 +0100
+++ gcc/config/ia64/ia64.c	2017-12-15 12:59:47.274445072 +0100
@@ -359,18 +359,18 @@  static bool ia64_expand_vec_perm_const_1
 /* Table of valid machine attributes.  */
 static const struct attribute_spec ia64_attribute_table[] =
 {
-  /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       affects_type_identity, exclusions } */
-  { "syscall_linkage", 0, 0, false, true,  true,  NULL, false, NULL },
-  { "model",	       1, 1, true, false, false, ia64_handle_model_attribute,
-    false, NULL },
+  /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
+       affects_type_identity, handler, exclude } */
+  { "syscall_linkage", 0, 0, false, true,  true,  false, NULL, NULL },
+  { "model",	       1, 1, true, false, false,  false,
+    ia64_handle_model_attribute, NULL },
 #if TARGET_ABI_OPEN_VMS
-  { "common_object",   1, 1, true, false, false,
-    ia64_vms_common_object_attribute, false, NULL },
+  { "common_object",   1, 1, true, false, false, false,
+    ia64_vms_common_object_attribute, NULL },
 #endif
-  { "version_id",      1, 1, true, false, false,
-    ia64_handle_version_id_attribute, false, NULL },
-  { NULL,	       0, 0, false, false, false, NULL, false, NULL }
+  { "version_id",      1, 1, true, false, false, false,
+    ia64_handle_version_id_attribute, NULL },
+  { NULL,	       0, 0, false, false, false, false, NULL, NULL }
 };
 
 /* Initialize the GCC target structure.  */
--- gcc/config/msp430/msp430.c.jj	2017-12-08 12:27:50.000000000 +0100
+++ gcc/config/msp430/msp430.c	2017-12-15 13:09:27.610114412 +0100
@@ -2049,28 +2049,28 @@  msp430_data_attr (tree * node,
 /* Table of MSP430-specific attributes.  */
 const struct attribute_spec msp430_attribute_table[] =
 {
-  /* Name        min_num_args     type_req,             affects_type_identity
-		      max_num_args,     fn_type_req		exclusions
-                          decl_req               handler.  */
-  { ATTR_INTR,        0, 1, true,  false, false, msp430_attr, false, NULL },
-  { ATTR_NAKED,       0, 0, true,  false, false, msp430_attr, false, NULL },
-  { ATTR_REENT,       0, 0, true,  false, false, msp430_attr, false, NULL },
-  { ATTR_CRIT,        0, 0, true,  false, false, msp430_attr, false, NULL },
-  { ATTR_WAKEUP,      0, 0, true,  false, false, msp430_attr, false, NULL },
+  /* Name        min_num_args     type_req,             handler
+		      max_num_args,     fn_type_req		exclude
+                          decl_req               affects_type_identity.  */
+  { ATTR_INTR,        0, 1, true,  false, false, false, msp430_attr, NULL },
+  { ATTR_NAKED,       0, 0, true,  false, false, false, msp430_attr, NULL },
+  { ATTR_REENT,       0, 0, true,  false, false, false, msp430_attr, NULL },
+  { ATTR_CRIT,        0, 0, true,  false, false, false, msp430_attr, NULL },
+  { ATTR_WAKEUP,      0, 0, true,  false, false, false, msp430_attr, NULL },
 
-  { ATTR_LOWER,       0, 0, true,  false, false, msp430_section_attr, false,
+  { ATTR_LOWER,       0, 0, true,  false, false, false, msp430_section_attr,
     NULL },
-  { ATTR_UPPER,       0, 0, true,  false, false, msp430_section_attr, false,
+  { ATTR_UPPER,       0, 0, true,  false, false, false, msp430_section_attr,
     NULL },
-  { ATTR_EITHER,      0, 0, true,  false, false, msp430_section_attr, false,
+  { ATTR_EITHER,      0, 0, true,  false, false, false, msp430_section_attr,
     NULL },
 
-  { ATTR_NOINIT,      0, 0, true,  false, false, msp430_data_attr, false,
+  { ATTR_NOINIT,      0, 0, true,  false, false, false, msp430_data_attr,
     NULL },
-  { ATTR_PERSIST,     0, 0, true,  false, false, msp430_data_attr, false,
+  { ATTR_PERSIST,     0, 0, true,  false, false, false, msp430_data_attr,
     NULL },
 
-  { NULL,             0, 0, false, false, false, NULL, false, NULL }
+  { NULL,             0, 0, false, false, false, false, NULL,  NULL }
 };
 
 #undef  TARGET_ASM_FUNCTION_PROLOGUE
--- gcc/config/rx/rx.c.jj	2017-12-07 18:05:01.000000000 +0100
+++ gcc/config/rx/rx.c	2017-12-15 13:14:52.753015162 +0100
@@ -2731,17 +2731,17 @@  rx_handle_vector_attribute (tree * node,
 /* Table of RX specific attributes.  */
 const struct attribute_spec rx_attribute_table[] =
 {
-  /* Name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-     affects_type_identity, exclusions.  */
-  { "fast_interrupt", 0, 0, true, false, false, rx_handle_func_attribute,
-    false, NULL },
-  { "interrupt",      0, -1, true, false, false, rx_handle_func_attribute,
-    false, NULL },
-  { "naked",          0, 0, true, false, false, rx_handle_func_attribute,
-    false, NULL },
-  { "vector",         1, -1, true, false, false, rx_handle_vector_attribute,
-    false, NULL },
-  { NULL,             0, 0, false, false, false, NULL, false, NULL }
+  /* Name, min_len, max_len, decl_req, type_req, fn_type_req,
+     affects_type_identity, handler, exclude.  */
+  { "fast_interrupt", 0, 0, true, false, false, false,
+    rx_handle_func_attribute, NULL },
+  { "interrupt",      0, -1, true, false, false, false,
+    rx_handle_func_attribute, NULL },
+  { "naked",          0, 0, true, false, false, false,
+    rx_handle_func_attribute, NULL },
+  { "vector",         1, -1, true, false, false, false,
+    rx_handle_vector_attribute, NULL },
+  { NULL,             0, 0, false, false, false, false, NULL, NULL }
 };
 
 /* Implement TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE.  */
--- gcc/config/cr16/cr16.c.jj	2017-12-07 18:05:03.000000000 +0100
+++ gcc/config/cr16/cr16.c	2017-12-15 12:50:16.821711925 +0100
@@ -206,10 +206,10 @@  static void cr16_print_operand_address (
 /* Table of machine attributes.  */
 static const struct attribute_spec cr16_attribute_table[] = {
   /* ISRs have special prologue and epilogue requirements.  */
-  /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       affects_type_identity, exclusions }.  */
-  {"interrupt", 0, 0, false, true, true, NULL, false, NULL},
-  {NULL, 0, 0, false, false, false, NULL, false, NULL}
+  /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
+       affects_type_identity, handler, exclude }.  */
+  {"interrupt", 0, 0, false, true, true, false, NULL, NULL},
+  {NULL, 0, 0, false, false, false, false, NULL, NULL}
 };
 
 /* TARGET_ASM_UNALIGNED_xx_OP generates .?byte directive
--- gcc/config/h8300/h8300.c.jj	2017-12-07 18:05:03.000000000 +0100
+++ gcc/config/h8300/h8300.c	2017-12-15 12:52:15.660188199 +0100
@@ -5424,23 +5424,23 @@  h8300_insert_attributes (tree node, tree
 
 static const struct attribute_spec h8300_attribute_table[] =
 {
-  /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       affects_type_identity, exclusions } */
-  { "interrupt_handler", 0, 0, true,  false, false,
-    h8300_handle_fndecl_attribute, false, NULL },
-  { "saveall",           0, 0, true,  false, false,
-    h8300_handle_fndecl_attribute, false, NULL },
-  { "OS_Task",           0, 0, true,  false, false,
-    h8300_handle_fndecl_attribute, false, NULL },
-  { "monitor",           0, 0, true,  false, false,
-    h8300_handle_fndecl_attribute, false, NULL },
-  { "function_vector",   0, 0, true,  false, false,
-    h8300_handle_fndecl_attribute, false, NULL },
-  { "eightbit_data",     0, 0, true,  false, false,
-    h8300_handle_eightbit_data_attribute, false, NULL },
-  { "tiny_data",         0, 0, true,  false, false,
-    h8300_handle_tiny_data_attribute, false, NULL },
-  { NULL,                0, 0, false, false, false, NULL, false, NULL }
+  /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
+       affects_type_identity, handler, exclude } */
+  { "interrupt_handler", 0, 0, true,  false, false, false,
+    h8300_handle_fndecl_attribute, NULL },
+  { "saveall",           0, 0, true,  false, false, false,
+    h8300_handle_fndecl_attribute, NULL },
+  { "OS_Task",           0, 0, true,  false, false, false,
+    h8300_handle_fndecl_attribute, NULL },
+  { "monitor",           0, 0, true,  false, false, false,
+    h8300_handle_fndecl_attribute, NULL },
+  { "function_vector",   0, 0, true,  false, false, false,
+    h8300_handle_fndecl_attribute, NULL },
+  { "eightbit_data",     0, 0, true,  false, false, false,
+    h8300_handle_eightbit_data_attribute, NULL },
+  { "tiny_data",         0, 0, true,  false, false, false,
+    h8300_handle_tiny_data_attribute, NULL },
+  { NULL,                0, 0, false, false, false, false, NULL, NULL }
 };
 
 
--- gcc/config/nvptx/nvptx.c.jj	2017-12-07 18:05:00.000000000 +0100
+++ gcc/config/nvptx/nvptx.c	2017-12-15 13:11:14.246767404 +0100
@@ -4457,13 +4457,13 @@  nvptx_handle_shared_attribute (tree *nod
 /* Table of valid machine attributes.  */
 static const struct attribute_spec nvptx_attribute_table[] =
 {
-  /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       affects_type_identity, exclusions } */
-  { "kernel", 0, 0, true, false,  false, nvptx_handle_kernel_attribute, false,
+  /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
+       affects_type_identity, handler, exclude } */
+  { "kernel", 0, 0, true, false,  false, false, nvptx_handle_kernel_attribute,
     NULL },
-  { "shared", 0, 0, true, false,  false, nvptx_handle_shared_attribute, false,
+  { "shared", 0, 0, true, false,  false, false, nvptx_handle_shared_attribute,
     NULL },
-  { NULL, 0, 0, false, false, false, NULL, false, NULL }
+  { NULL, 0, 0, false, false, false, false, NULL, NULL }
 };
 
 /* Limit vector alignments to BIGGEST_ALIGNMENT.  */
--- gcc/config/powerpcspe/powerpcspe.c.jj	2017-12-07 18:05:02.000000000 +0100
+++ gcc/config/powerpcspe/powerpcspe.c	2017-12-15 13:12:21.224921352 +0100
@@ -1533,22 +1533,22 @@  static const char alt_reg_names[][8] =
 
 static const struct attribute_spec rs6000_attribute_table[] =
 {
-  /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       affects_type_identity, exclusions } */
-  { "altivec",   1, 1, false, true,  false, rs6000_handle_altivec_attribute,
-    false, NULL },
-  { "longcall",  0, 0, false, true,  true,  rs6000_handle_longcall_attribute,
-    false, NULL },
-  { "shortcall", 0, 0, false, true,  true,  rs6000_handle_longcall_attribute,
-    false, NULL },
-  { "ms_struct", 0, 0, false, false, false, rs6000_handle_struct_attribute,
-    false, NULL },
-  { "gcc_struct", 0, 0, false, false, false, rs6000_handle_struct_attribute,
-    false, NULL },
+  /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
+       affects_type_identity, handler, exclude } */
+  { "altivec",   1, 1, false, true,  false, false,
+    rs6000_handle_altivec_attribute, NULL },
+  { "longcall",  0, 0, false, true,  true,  false,
+    rs6000_handle_longcall_attribute, NULL },
+  { "shortcall", 0, 0, false, true,  true,  false,
+    rs6000_handle_longcall_attribute, NULL },
+  { "ms_struct", 0, 0, false, false, false, false,
+    rs6000_handle_struct_attribute, NULL },
+  { "gcc_struct", 0, 0, false, false, false, false,
+    rs6000_handle_struct_attribute, NULL },
 #ifdef SUBTARGET_ATTRIBUTE_TABLE
   SUBTARGET_ATTRIBUTE_TABLE,
 #endif
-  { NULL,        0, 0, false, false, false, NULL, false, NULL }
+  { NULL,        0, 0, false, false, false, false, NULL, NULL }
 };
 
 #ifndef TARGET_PROFILE_KERNEL
--- gcc/config/darwin.h.jj	2017-12-08 12:27:50.000000000 +0100
+++ gcc/config/darwin.h	2017-12-15 12:58:07.588704279 +0100
@@ -740,12 +740,12 @@  extern GTY(()) section * darwin_sections
 
 /* Extra attributes for Darwin.  */
 #define SUBTARGET_ATTRIBUTE_TABLE					     \
-  /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,     \
-       affects_type_identity, exclusions } */				     \
-  { "apple_kext_compatibility", 0, 0, false, true, false,		     \
-    darwin_handle_kext_attribute, false, NULL },			     \
-  { "weak_import", 0, 0, true, false, false,				     \
-    darwin_handle_weak_import_attribute, false, NULL }
+  /* { name, min_len, max_len, decl_req, type_req, fn_type_req,		     \
+       affects_type_identity, handler, exclude } */			     \
+  { "apple_kext_compatibility", 0, 0, false, true, false, false,	     \
+    darwin_handle_kext_attribute, NULL },				     \
+  { "weak_import", 0, 0, true, false, false, false,			     \
+    darwin_handle_weak_import_attribute, NULL }
 
 /* Make local constant labels linker-visible, so that if one follows a
    weak_global constant, ld64 will be able to separate the atoms.  */
--- gcc/config/stormy16/stormy16.c.jj	2017-12-07 18:05:02.000000000 +0100
+++ gcc/config/stormy16/stormy16.c	2017-12-15 13:18:50.451027174 +0100
@@ -2189,15 +2189,15 @@  static tree xstormy16_handle_below100_at
 
 static const struct attribute_spec xstormy16_attribute_table[] =
 {
-  /* name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-     affects_type_identity, exclusions.  */
-  { "interrupt", 0, 0, false, true,  true,
-    xstormy16_handle_interrupt_attribute , false, NULL },
-  { "BELOW100",  0, 0, false, false, false,
-    xstormy16_handle_below100_attribute, false, NULL },
-  { "below100",  0, 0, false, false, false,
-    xstormy16_handle_below100_attribute, false, NULL },
-  { NULL,        0, 0, false, false, false, NULL, false, NULL }
+  /* name, min_len, max_len, decl_req, type_req, fn_type_req,
+     affects_type_identity, handler, exclude.  */
+  { "interrupt", 0, 0, false, true,  true, false,
+    xstormy16_handle_interrupt_attribute, NULL },
+  { "BELOW100",  0, 0, false, false, false, false,
+    xstormy16_handle_below100_attribute, NULL },
+  { "below100",  0, 0, false, false, false, false,
+    xstormy16_handle_below100_attribute, NULL },
+  { NULL,        0, 0, false, false, false, false, NULL, NULL }
 };
 
 /* Handle an "interrupt" attribute;
--- gcc/config/bfin/bfin.c.jj	2017-12-07 18:05:03.000000000 +0100
+++ gcc/config/bfin/bfin.c	2017-12-15 12:49:33.608266001 +0100
@@ -4905,31 +4905,31 @@  bfin_handle_l2_attribute (tree *node, tr
 /* Table of valid machine attributes.  */
 static const struct attribute_spec bfin_attribute_table[] =
 {
-  /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       affects_type_identity, exclusions } */
-  { "interrupt_handler", 0, 0, false, true,  true, handle_int_attribute,
-    false, NULL },
-  { "exception_handler", 0, 0, false, true,  true, handle_int_attribute,
-    false, NULL },
-  { "nmi_handler", 0, 0, false, true,  true, handle_int_attribute, false,
+  /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
+       affects_type_identity, handler, exclude } */
+  { "interrupt_handler", 0, 0, false, true,  true, false,
+    handle_int_attribute, NULL },
+  { "exception_handler", 0, 0, false, true,  true, false,
+    handle_int_attribute, NULL },
+  { "nmi_handler", 0, 0, false, true,  true, false, handle_int_attribute,
     NULL },
-  { "nesting", 0, 0, false, true,  true, NULL, false, NULL },
-  { "kspisusp", 0, 0, false, true,  true, NULL, false, NULL },
-  { "saveall", 0, 0, false, true,  true, NULL, false, NULL },
-  { "longcall",  0, 0, false, true,  true,  bfin_handle_longcall_attribute,
-    false, NULL },
-  { "shortcall", 0, 0, false, true,  true,  bfin_handle_longcall_attribute,
-    false, NULL },
-  { "l1_text", 0, 0, true, false, false,  bfin_handle_l1_text_attribute,
-    false, NULL },
-  { "l1_data", 0, 0, true, false, false,  bfin_handle_l1_data_attribute,
-    false, NULL },
-  { "l1_data_A", 0, 0, true, false, false, bfin_handle_l1_data_attribute,
-    false, NULL },
-  { "l1_data_B", 0, 0, true, false, false,  bfin_handle_l1_data_attribute,
-    false, NULL },
-  { "l2", 0, 0, true, false, false,  bfin_handle_l2_attribute, false, NULL },
-  { NULL, 0, 0, false, false, false, NULL, false, NULL }
+  { "nesting", 0, 0, false, true,  true, false, NULL, NULL },
+  { "kspisusp", 0, 0, false, true,  true, false, NULL, NULL },
+  { "saveall", 0, 0, false, true,  true, false, NULL, NULL },
+  { "longcall",  0, 0, false, true,  true, false,
+    bfin_handle_longcall_attribute, NULL },
+  { "shortcall", 0, 0, false, true,  true, false,
+    bfin_handle_longcall_attribute, NULL },
+  { "l1_text", 0, 0, true, false, false, false,
+    bfin_handle_l1_text_attribute, NULL },
+  { "l1_data", 0, 0, true, false, false, false,
+    bfin_handle_l1_data_attribute, NULL },
+  { "l1_data_A", 0, 0, true, false, false, false,
+    bfin_handle_l1_data_attribute, NULL },
+  { "l1_data_B", 0, 0, true, false, false, false,
+    bfin_handle_l1_data_attribute, NULL },
+  { "l2", 0, 0, true, false, false, false, bfin_handle_l2_attribute, NULL },
+  { NULL, 0, 0, false, false, false, false, NULL, NULL }
 };
 
 /* Implementation of TARGET_ASM_INTEGER.  When using FD-PIC, we need to
--- gcc/config/rs6000/rs6000.c.jj	2017-12-14 09:10:45.000000000 +0100
+++ gcc/config/rs6000/rs6000.c	2017-12-15 13:14:06.283599307 +0100
@@ -1518,22 +1518,22 @@  static const char alt_reg_names[][8] =
 
 static const struct attribute_spec rs6000_attribute_table[] =
 {
-  /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       affects_type_identity, exclusions } */
-  { "altivec",   1, 1, false, true,  false, rs6000_handle_altivec_attribute,
-    false, NULL },
-  { "longcall",  0, 0, false, true,  true,  rs6000_handle_longcall_attribute,
-    false, NULL },
-  { "shortcall", 0, 0, false, true,  true,  rs6000_handle_longcall_attribute,
-    false, NULL },
-  { "ms_struct", 0, 0, false, false, false, rs6000_handle_struct_attribute,
-    false, NULL },
-  { "gcc_struct", 0, 0, false, false, false, rs6000_handle_struct_attribute,
-    false, NULL },
+  /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
+       affects_type_identity, handler, exclude } */
+  { "altivec",   1, 1, false, true,  false, false,
+    rs6000_handle_altivec_attribute, NULL },
+  { "longcall",  0, 0, false, true,  true,  false,
+    rs6000_handle_longcall_attribute, NULL },
+  { "shortcall", 0, 0, false, true,  true,  false,
+    rs6000_handle_longcall_attribute, NULL },
+  { "ms_struct", 0, 0, false, false, false, false,
+    rs6000_handle_struct_attribute, NULL },
+  { "gcc_struct", 0, 0, false, false, false, false,
+    rs6000_handle_struct_attribute, NULL },
 #ifdef SUBTARGET_ATTRIBUTE_TABLE
   SUBTARGET_ATTRIBUTE_TABLE,
 #endif
-  { NULL,        0, 0, false, false, false, NULL, false, NULL }
+  { NULL,        0, 0, false, false, false, false, NULL, NULL }
 };
 
 #ifndef TARGET_PROFILE_KERNEL
--- gcc/config/rl78/rl78.c.jj	2017-12-08 12:27:50.000000000 +0100
+++ gcc/config/rl78/rl78.c	2017-12-15 13:13:09.685310777 +0100
@@ -857,17 +857,17 @@  rl78_handle_saddr_attribute (tree * node
 /* Table of RL78-specific attributes.  */
 const struct attribute_spec rl78_attribute_table[] =
 {
-  /* Name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-     affects_type_identity, exclusions.  */
-  { "interrupt",      0, 0, true, false, false, rl78_handle_func_attribute,
-    false, NULL },
-  { "brk_interrupt",  0, 0, true, false, false, rl78_handle_func_attribute,
-    false, NULL },
-  { "naked",          0, 0, true, false, false, rl78_handle_naked_attribute,
-    false, NULL },
-  { "saddr",          0, 0, true, false, false, rl78_handle_saddr_attribute,
-    false, NULL },
-  { NULL,             0, 0, false, false, false, NULL, false, NULL }
+  /* Name, min_len, max_len, decl_req, type_req, fn_type_req,
+     affects_type_identity, handler, exclude.  */
+  { "interrupt",      0, 0, true, false, false, false,
+    rl78_handle_func_attribute, NULL },
+  { "brk_interrupt",  0, 0, true, false, false, false,
+    rl78_handle_func_attribute, NULL },
+  { "naked",          0, 0, true, false, false, false,
+    rl78_handle_naked_attribute, NULL },
+  { "saddr",          0, 0, true, false, false, false,
+    rl78_handle_saddr_attribute, NULL },
+  { NULL,             0, 0, false, false, false, false, NULL, NULL }
 };
 
 
--- gcc/config/nds32/nds32.c.jj	2017-12-08 12:27:50.000000000 +0100
+++ gcc/config/nds32/nds32.c	2017-12-15 13:10:28.209348937 +0100
@@ -83,34 +83,34 @@  static const char * const nds32_intrinsi
 static const struct attribute_spec nds32_attribute_table[] =
 {
   /* Syntax: { name, min_len, max_len, decl_required, type_required,
-	       function_type_required, handler, affects_type_identity,
-	       exclusions } */
+	       function_type_required, affects_type_identity, handler,
+	       exclude } */
 
   /* The interrupt vid: [0-63]+ (actual vector number starts from 9 to 72).  */
-  { "interrupt",    1, 64, false, false, false, NULL, false, NULL },
+  { "interrupt",    1, 64, false, false, false, false, NULL, NULL },
   /* The exception vid: [1-8]+  (actual vector number starts from 1 to 8).  */
-  { "exception",    1,  8, false, false, false, NULL, false, NULL },
+  { "exception",    1,  8, false, false, false, false, NULL, NULL },
   /* Argument is user's interrupt numbers.  The vector number is always 0.  */
-  { "reset",        1,  1, false, false, false, NULL, false, NULL },
+  { "reset",        1,  1, false, false, false, false, NULL, NULL },
 
   /* The attributes describing isr nested type.  */
-  { "nested",       0,  0, false, false, false, NULL, false, NULL },
-  { "not_nested",   0,  0, false, false, false, NULL, false, NULL },
-  { "nested_ready", 0,  0, false, false, false, NULL, false, NULL },
+  { "nested",       0,  0, false, false, false, false, NULL, NULL },
+  { "not_nested",   0,  0, false, false, false, false, NULL, NULL },
+  { "nested_ready", 0,  0, false, false, false, false, NULL, NULL },
 
   /* The attributes describing isr register save scheme.  */
-  { "save_all",     0,  0, false, false, false, NULL, false, NULL },
-  { "partial_save", 0,  0, false, false, false, NULL, false, NULL },
+  { "save_all",     0,  0, false, false, false, false, NULL, NULL },
+  { "partial_save", 0,  0, false, false, false, false, NULL, NULL },
 
   /* The attributes used by reset attribute.  */
-  { "nmi",          1,  1, false, false, false, NULL, false, NULL },
-  { "warm",         1,  1, false, false, false, NULL, false, NULL },
+  { "nmi",          1,  1, false, false, false, false, NULL, NULL },
+  { "warm",         1,  1, false, false, false, false, NULL, NULL },
 
   /* The attribute telling no prologue/epilogue.  */
-  { "naked",        0,  0, false, false, false, NULL, false, NULL },
+  { "naked",        0,  0, false, false, false, false, NULL, NULL },
 
   /* The last attribute spec is set to be NULL.  */
-  { NULL,           0,  0, false, false, false, NULL, false, NULL }
+  { NULL,           0,  0, false, false, false, false, NULL, NULL }
 };
 
 
--- gcc/cp/tree.c.jj	2017-12-07 18:04:58.000000000 +0100
+++ gcc/cp/tree.c	2017-12-15 12:34:38.119776117 +0100
@@ -4329,25 +4329,25 @@  handle_nodiscard_attribute (tree *node,
 /* Table of valid C++ attributes.  */
 const struct attribute_spec cxx_attribute_table[] =
 {
-  /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       affects_type_identity, exclusions } */
-  { "init_priority",  1, 1, true,  false, false,
-    handle_init_priority_attribute, false, NULL },
-  { "abi_tag", 1, -1, false, false, false,
-    handle_abi_tag_attribute, true, NULL },
-  { NULL, 0, 0, false, false, false, NULL, false, NULL }
+  /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
+       affects_type_identity, handler, exclude } */
+  { "init_priority",  1, 1, true,  false, false, false,
+    handle_init_priority_attribute, NULL },
+  { "abi_tag", 1, -1, false, false, false, true,
+    handle_abi_tag_attribute, NULL },
+  { NULL, 0, 0, false, false, false, false, NULL, NULL }
 };
 
 /* Table of C++ standard attributes.  */
 const struct attribute_spec std_attribute_table[] =
 {
-  /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       affects_type_identity, exclusions } */
-  { "maybe_unused", 0, 0, false, false, false,
-    handle_unused_attribute, false, NULL },
-  { "nodiscard", 0, 0, false, false, false,
-    handle_nodiscard_attribute, false, NULL },
-  { NULL, 0, 0, false, false, false, NULL, false, NULL }
+  /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
+       affects_type_identity, handler, exclude } */
+  { "maybe_unused", 0, 0, false, false, false, false,
+    handle_unused_attribute, NULL },
+  { "nodiscard", 0, 0, false, false, false, false,
+    handle_nodiscard_attribute, NULL },
+  { NULL, 0, 0, false, false, false, false, NULL, NULL }
 };
 
 /* Handle an "init_priority" attribute; arguments as in
--- gcc/ada/gcc-interface/utils.c.jj	2017-12-14 13:12:38.000000000 +0100
+++ gcc/ada/gcc-interface/utils.c	2017-12-15 12:39:57.166657036 +0100
@@ -107,50 +107,50 @@  static tree fake_attribute_handler (tree
    this minimal set of attributes to accommodate the needs of builtins.  */
 const struct attribute_spec gnat_internal_attribute_table[] =
 {
-  /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       affects_type_identity, exclusions } */
-  { "const",        0, 0,  true,  false, false, handle_const_attribute,
-    false, NULL },
-  { "nothrow",      0, 0,  true,  false, false, handle_nothrow_attribute,
-    false, NULL },
-  { "pure",         0, 0,  true,  false, false, handle_pure_attribute,
-    false, NULL },
-  { "no vops",      0, 0,  true,  false, false, handle_novops_attribute,
-    false, NULL },
-  { "nonnull",      0, -1, false, true,  true,  handle_nonnull_attribute,
-    false, NULL },
-  { "sentinel",     0, 1,  false, true,  true,  handle_sentinel_attribute,
-    false, NULL },
-  { "noreturn",     0, 0,  true,  false, false, handle_noreturn_attribute,
-    false, NULL },
-  { "noinline",     0, 0,  true,  false, false, handle_noinline_attribute,
-    false, NULL },
-  { "noclone",      0, 0,  true,  false, false, handle_noclone_attribute,
-    false, NULL },
-  { "leaf",         0, 0,  true,  false, false, handle_leaf_attribute,
-    false, NULL },
-  { "always_inline",0, 0,  true,  false, false, handle_always_inline_attribute,
-    false, NULL },
-  { "malloc",       0, 0,  true,  false, false, handle_malloc_attribute,
-    false, NULL },
-  { "type generic", 0, 0,  false, true, true, handle_type_generic_attribute,
-    false, NULL },
+  /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
+       affects_type_identity, handler, exclude } */
+  { "const",        0, 0,  true,  false, false, false,
+    handle_const_attribute, NULL },
+  { "nothrow",      0, 0,  true,  false, false, false,
+    handle_nothrow_attribute, NULL },
+  { "pure",         0, 0,  true,  false, false, false,
+    handle_pure_attribute, NULL },
+  { "no vops",      0, 0,  true,  false, false, false,
+    handle_novops_attribute, NULL },
+  { "nonnull",      0, -1, false, true,  true,  false,
+    handle_nonnull_attribute, NULL },
+  { "sentinel",     0, 1,  false, true,  true,  false,
+    handle_sentinel_attribute, NULL },
+  { "noreturn",     0, 0,  true,  false, false, false,
+    handle_noreturn_attribute, NULL },
+  { "noinline",     0, 0,  true,  false, false, false,
+    handle_noinline_attribute, NULL },
+  { "noclone",      0, 0,  true,  false, false, false,
+    handle_noclone_attribute, NULL },
+  { "leaf",         0, 0,  true,  false, false, false,
+    handle_leaf_attribute, NULL },
+  { "always_inline",0, 0,  true,  false, false, false,
+    handle_always_inline_attribute, NULL },
+  { "malloc",       0, 0,  true,  false, false, false,
+    handle_malloc_attribute, NULL },
+  { "type generic", 0, 0,  false, true, true, false,
+    handle_type_generic_attribute, NULL },
 
-  { "vector_size",  1, 1,  false, true, false,  handle_vector_size_attribute,
-    false, NULL },
-  { "vector_type",  0, 0,  false, true, false,  handle_vector_type_attribute,
-    false, NULL },
-  { "may_alias",    0, 0, false, true, false, NULL, false, NULL },
+  { "vector_size",  1, 1,  false, true, false,  false,
+    handle_vector_size_attribute, NULL },
+  { "vector_type",  0, 0,  false, true, false,  false,
+    handle_vector_type_attribute, NULL },
+  { "may_alias",    0, 0, false, true, false, false, NULL, NULL },
 
   /* ??? format and format_arg are heavy and not supported, which actually
      prevents support for stdio builtins, which we however declare as part
      of the common builtins.def contents.  */
-  { "format",     3, 3,  false, true,  true,  fake_attribute_handler, false,
+  { "format",     3, 3,  false, true,  true,  false, fake_attribute_handler,
     NULL },
-  { "format_arg", 1, 1,  false, true,  true,  fake_attribute_handler, false,
+  { "format_arg", 1, 1,  false, true,  true,  false, fake_attribute_handler,
     NULL },
 
-  { NULL,         0, 0, false, false, false, NULL, false, NULL }
+  { NULL,         0, 0, false, false, false, false, NULL, NULL }
 };
 
 /* Associates a GNAT tree node to a GCC tree node. It is used in
--- gcc/brig/brig-lang.c.jj	2017-12-08 12:27:50.000000000 +0100
+++ gcc/brig/brig-lang.c	2017-12-15 12:36:15.352517694 +0100
@@ -447,19 +447,19 @@  brig_localize_identifier (const char *id
 /* Table of machine-independent attributes supported in GIMPLE.  */
 const struct attribute_spec brig_attribute_table[] =
 {
-  /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       affects_type_identity, exclusions } */
-  { "leaf",		      0, 0, true,  false, false,
-			      handle_leaf_attribute, false, NULL },
-  { "const",                  0, 0, true,  false, false,
-			      handle_const_attribute, false, NULL },
-  { "pure",                   0, 0, true,  false, false,
-			      handle_pure_attribute, false, NULL },
-  { "nothrow",                0, 0, true,  false, false,
-			      handle_nothrow_attribute, false, NULL },
-  { "returns_twice",          0, 0, true,  false, false,
-			      handle_returns_twice_attribute, false, NULL },
-  { NULL,                     0, 0, false, false, false, NULL, false, NULL }
+  /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
+       affects_type_identity, handler, exclude } */
+  { "leaf",		      0, 0, true,  false, false, false,
+			      handle_leaf_attribute, NULL },
+  { "const",                  0, 0, true,  false, false, false,
+			      handle_const_attribute, NULL },
+  { "pure",                   0, 0, true,  false, false, false,
+			      handle_pure_attribute, NULL },
+  { "nothrow",                0, 0, true,  false, false, false,
+			      handle_nothrow_attribute, NULL },
+  { "returns_twice",          0, 0, true,  false, false, false,
+			      handle_returns_twice_attribute, NULL },
+  { NULL,                     0, 0, false, false, false, false, NULL, NULL }
 };
 
 /* Attribute handlers.  */
--- gcc/c-family/c-attribs.c.jj	2017-12-07 18:04:56.000000000 +0100
+++ gcc/c-family/c-attribs.c	2017-12-15 12:27:47.523090213 +0100
@@ -245,236 +245,229 @@  static const struct attribute_spec::excl
    Current list of processed common attributes: nonnull.  */
 const struct attribute_spec c_common_attribute_table[] =
 {
-  /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       affects_type_identity } */
-  { "packed",                 0, 0, false, false, false,
-			      handle_packed_attribute, false,
+  /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
+       affects_type_identity, handler, exclude } */
+  { "packed",                 0, 0, false, false, false, false,
+			      handle_packed_attribute,
 	                      attr_aligned_exclusions },
-  { "nocommon",               0, 0, true,  false, false,
-			      handle_nocommon_attribute, false,
+  { "nocommon",               0, 0, true,  false, false, false,
+			      handle_nocommon_attribute,
 	                      attr_common_exclusions },
-  { "common",                 0, 0, true,  false, false,
-			      handle_common_attribute, false,
+  { "common",                 0, 0, true,  false, false, false,
+			      handle_common_attribute,
 	                      attr_common_exclusions },
   /* FIXME: logically, noreturn attributes should be listed as
      "false, true, true" and apply to function types.  But implementing this
      would require all the places in the compiler that use TREE_THIS_VOLATILE
      on a decl to identify non-returning functions to be located and fixed
      to check the function type instead.  */
-  { "noreturn",               0, 0, true,  false, false,
-			      handle_noreturn_attribute, false,
+  { "noreturn",               0, 0, true,  false, false, false,
+			      handle_noreturn_attribute,
 	                      attr_noreturn_exclusions },
-  { "volatile",               0, 0, true,  false, false,
-			      handle_noreturn_attribute, false, NULL },
-  { "stack_protect",          0, 0, true,  false, false,
-			      handle_stack_protect_attribute, false, NULL },
-  { "noinline",               0, 0, true,  false, false,
-			      handle_noinline_attribute, false,
+  { "volatile",               0, 0, true,  false, false, false,
+			      handle_noreturn_attribute, NULL },
+  { "stack_protect",          0, 0, true,  false, false, false,
+			      handle_stack_protect_attribute, NULL },
+  { "noinline",               0, 0, true,  false, false, false,
+			      handle_noinline_attribute,
 	                      attr_noinline_exclusions },
-  { "noclone",                0, 0, true,  false, false,
-			      handle_noclone_attribute, false, NULL },
-  { "no_icf",                 0, 0, true,  false, false,
-			      handle_noicf_attribute, false, NULL },
-  { "noipa",		      0, 0, true,  false, false,
-			      handle_noipa_attribute, false, NULL },
-  { "leaf",                   0, 0, true,  false, false,
-			      handle_leaf_attribute, false, NULL },
-  { "always_inline",          0, 0, true,  false, false,
-			      handle_always_inline_attribute, false,
+  { "noclone",                0, 0, true,  false, false, false,
+			      handle_noclone_attribute, NULL },
+  { "no_icf",                 0, 0, true,  false, false, false,
+			      handle_noicf_attribute, NULL },
+  { "noipa",		      0, 0, true,  false, false, false,
+			      handle_noipa_attribute, NULL },
+  { "leaf",                   0, 0, true,  false, false, false,
+			      handle_leaf_attribute, NULL },
+  { "always_inline",          0, 0, true,  false, false, false,
+			      handle_always_inline_attribute,
 	                      attr_inline_exclusions },
-  { "gnu_inline",             0, 0, true,  false, false,
-			      handle_gnu_inline_attribute, false,
+  { "gnu_inline",             0, 0, true,  false, false, false,
+			      handle_gnu_inline_attribute,
 	                      attr_inline_exclusions },
-  { "artificial",             0, 0, true,  false, false,
-			      handle_artificial_attribute, false, NULL },
-  { "flatten",                0, 0, true,  false, false,
-			      handle_flatten_attribute, false, NULL },
-  { "used",                   0, 0, true,  false, false,
-			      handle_used_attribute, false, NULL },
-  { "unused",                 0, 0, false, false, false,
-			      handle_unused_attribute, false, NULL },
-  { "externally_visible",     0, 0, true,  false, false,
-			      handle_externally_visible_attribute, false, NULL },
-  { "no_reorder",	      0, 0, true, false, false,
-	                      handle_no_reorder_attribute, false, NULL },
+  { "artificial",             0, 0, true,  false, false, false,
+			      handle_artificial_attribute, NULL },
+  { "flatten",                0, 0, true,  false, false, false,
+			      handle_flatten_attribute, NULL },
+  { "used",                   0, 0, true,  false, false, false,
+			      handle_used_attribute, NULL },
+  { "unused",                 0, 0, false, false, false, false,
+			      handle_unused_attribute, NULL },
+  { "externally_visible",     0, 0, true,  false, false, false,
+			      handle_externally_visible_attribute, NULL },
+  { "no_reorder",	      0, 0, true, false, false, false,
+	                      handle_no_reorder_attribute, NULL },
   /* The same comments as for noreturn attributes apply to const ones.  */
-  { "const",                  0, 0, true,  false, false,
-			      handle_const_attribute, false,
+  { "const",                  0, 0, true,  false, false, false,
+			      handle_const_attribute,
 	                      attr_const_pure_exclusions },
-  { "scalar_storage_order",   1, 1, false, false, false,
-			      handle_scalar_storage_order_attribute, false, NULL },
-  { "transparent_union",      0, 0, false, false, false,
-			      handle_transparent_union_attribute, false, NULL },
-  { "constructor",            0, 1, true,  false, false,
-			      handle_constructor_attribute, false, NULL },
-  { "destructor",             0, 1, true,  false, false,
-			      handle_destructor_attribute, false, NULL },
-  { "mode",                   1, 1, false,  true, false,
-			      handle_mode_attribute, false, NULL },
-  { "section",                1, 1, true,  false, false,
-			      handle_section_attribute, false, NULL },
-  { "aligned",                0, 1, false, false, false,
-			      handle_aligned_attribute, false,
+  { "scalar_storage_order",   1, 1, false, false, false, false,
+			      handle_scalar_storage_order_attribute, NULL },
+  { "transparent_union",      0, 0, false, false, false, false,
+			      handle_transparent_union_attribute, NULL },
+  { "constructor",            0, 1, true,  false, false, false,
+			      handle_constructor_attribute, NULL },
+  { "destructor",             0, 1, true,  false, false, false,
+			      handle_destructor_attribute, NULL },
+  { "mode",                   1, 1, false,  true, false, false,
+			      handle_mode_attribute, NULL },
+  { "section",                1, 1, true,  false, false, false,
+			      handle_section_attribute, NULL },
+  { "aligned",                0, 1, false, false, false, false,
+			      handle_aligned_attribute,
 	                      attr_aligned_exclusions },
-  { "warn_if_not_aligned",    0, 1, false, false, false,
-			      handle_warn_if_not_aligned_attribute,
-			      false, NULL },
-  { "weak",                   0, 0, true,  false, false,
-			      handle_weak_attribute, false, NULL },
-  { "noplt",                   0, 0, true,  false, false,
-			      handle_noplt_attribute, false, NULL },
-  { "ifunc",                  1, 1, true,  false, false,
-			      handle_ifunc_attribute, false, NULL },
-  { "alias",                  1, 1, true,  false, false,
-			      handle_alias_attribute, false, NULL },
-  { "weakref",                0, 1, true,  false, false,
-			      handle_weakref_attribute, false, NULL },
-  { "no_instrument_function", 0, 0, true,  false, false,
+  { "warn_if_not_aligned",    0, 1, false, false, false, false,
+			      handle_warn_if_not_aligned_attribute, NULL },
+  { "weak",                   0, 0, true,  false, false, false,
+			      handle_weak_attribute, NULL },
+  { "noplt",                   0, 0, true,  false, false, false,
+			      handle_noplt_attribute, NULL },
+  { "ifunc",                  1, 1, true,  false, false, false,
+			      handle_ifunc_attribute, NULL },
+  { "alias",                  1, 1, true,  false, false, false,
+			      handle_alias_attribute, NULL },
+  { "weakref",                0, 1, true,  false, false, false,
+			      handle_weakref_attribute, NULL },
+  { "no_instrument_function", 0, 0, true,  false, false, false,
 			      handle_no_instrument_function_attribute,
-			      false, NULL },
-  { "no_profile_instrument_function",  0, 0, true, false, false,
+			      NULL },
+  { "no_profile_instrument_function",  0, 0, true, false, false, false,
 			      handle_no_profile_instrument_function_attribute,
-			      false, NULL },
-  { "malloc",                 0, 0, true,  false, false,
-			      handle_malloc_attribute, false,
-	                      attr_alloc_exclusions },
-  { "returns_twice",          0, 0, true,  false, false,
-			      handle_returns_twice_attribute, false,
+			      NULL },
+  { "malloc",                 0, 0, true,  false, false, false,
+			      handle_malloc_attribute, attr_alloc_exclusions },
+  { "returns_twice",          0, 0, true,  false, false, false,
+			      handle_returns_twice_attribute,
 	                      attr_returns_twice_exclusions },
-  { "no_stack_limit",         0, 0, true,  false, false,
-			      handle_no_limit_stack_attribute, false, NULL },
-  { "pure",                   0, 0, true,  false, false,
-			      handle_pure_attribute, false,
+  { "no_stack_limit",         0, 0, true,  false, false, false,
+			      handle_no_limit_stack_attribute, NULL },
+  { "pure",                   0, 0, true,  false, false, false,
+			      handle_pure_attribute,
 	                      attr_const_pure_exclusions },
-  { "transaction_callable",   0, 0, false, true,  false,
-			      handle_tm_attribute, false, NULL },
-  { "transaction_unsafe",     0, 0, false, true,  false,
-			      handle_tm_attribute, true, NULL },
-  { "transaction_safe",       0, 0, false, true,  false,
-			      handle_tm_attribute, true, NULL },
-  { "transaction_safe_dynamic", 0, 0, true, false,  false,
-			      handle_tm_attribute, false, NULL },
-  { "transaction_may_cancel_outer", 0, 0, false, true, false,
-			      handle_tm_attribute, false, NULL },
+  { "transaction_callable",   0, 0, false, true,  false, false,
+			      handle_tm_attribute, NULL },
+  { "transaction_unsafe",     0, 0, false, true,  false, true,
+			      handle_tm_attribute, NULL },
+  { "transaction_safe",       0, 0, false, true,  false, true,
+			      handle_tm_attribute, NULL },
+  { "transaction_safe_dynamic", 0, 0, true, false,  false, false,
+			      handle_tm_attribute, NULL },
+  { "transaction_may_cancel_outer", 0, 0, false, true, false, false,
+			      handle_tm_attribute, NULL },
   /* ??? These two attributes didn't make the transition from the
      Intel language document to the multi-vendor language document.  */
-  { "transaction_pure",       0, 0, false, true,  false,
-			      handle_tm_attribute, false, NULL },
-  { "transaction_wrap",       1, 1, true,  false,  false,
-			     handle_tm_wrap_attribute, false, NULL },
+  { "transaction_pure",       0, 0, false, true,  false, false,
+			      handle_tm_attribute, NULL },
+  { "transaction_wrap",       1, 1, true,  false,  false, false,
+			     handle_tm_wrap_attribute, NULL },
   /* For internal use (marking of builtins) only.  The name contains space
      to prevent its usage in source code.  */
-  { "no vops",                0, 0, true,  false, false,
-			      handle_novops_attribute, false, NULL },
-  { "deprecated",             0, 1, false, false, false,
-			      handle_deprecated_attribute, false, NULL },
-  { "vector_size",	      1, 1, false, true, false,
-			      handle_vector_size_attribute, true, NULL },
-  { "visibility",	      1, 1, false, false, false,
-			      handle_visibility_attribute, false, NULL },
-  { "tls_model",	      1, 1, true,  false, false,
-			      handle_tls_model_attribute, false, NULL },
-  { "nonnull",                0, -1, false, true, true,
-			      handle_nonnull_attribute, false, NULL },
-  { "nonstring",              0, 0, true, false, false,
-			      handle_nonstring_attribute, false, NULL },
-  { "nothrow",                0, 0, true,  false, false,
-			      handle_nothrow_attribute, false, NULL },
-  { "may_alias",	      0, 0, false, true, false, NULL, false, NULL },
-  { "cleanup",		      1, 1, true, false, false,
-			      handle_cleanup_attribute, false, NULL },
-  { "warn_unused_result",     0, 0, false, true, true,
-			      handle_warn_unused_result_attribute, false,
+  { "no vops",                0, 0, true,  false, false, false,
+			      handle_novops_attribute, NULL },
+  { "deprecated",             0, 1, false, false, false, false,
+			      handle_deprecated_attribute, NULL },
+  { "vector_size",	      1, 1, false, true, false, true,
+			      handle_vector_size_attribute, NULL },
+  { "visibility",	      1, 1, false, false, false, false,
+			      handle_visibility_attribute, NULL },
+  { "tls_model",	      1, 1, true,  false, false, false,
+			      handle_tls_model_attribute, NULL },
+  { "nonnull",                0, -1, false, true, true, false,
+			      handle_nonnull_attribute, NULL },
+  { "nonstring",              0, 0, true, false, false, false,
+			      handle_nonstring_attribute, NULL },
+  { "nothrow",                0, 0, true,  false, false, false,
+			      handle_nothrow_attribute, NULL },
+  { "may_alias",	      0, 0, false, true, false, false, NULL, NULL },
+  { "cleanup",		      1, 1, true, false, false, false,
+			      handle_cleanup_attribute, NULL },
+  { "warn_unused_result",     0, 0, false, true, true, false,
+			      handle_warn_unused_result_attribute,
 	                      attr_warn_unused_result_exclusions },
-  { "sentinel",               0, 1, false, true, true,
-			      handle_sentinel_attribute, false, NULL },
+  { "sentinel",               0, 1, false, true, true, false,
+			      handle_sentinel_attribute, NULL },
   /* For internal use (marking of builtins) only.  The name contains space
      to prevent its usage in source code.  */
-  { "type generic",           0, 0, false, true, true,
-			      handle_type_generic_attribute, false, NULL },
-  { "alloc_size",	      1, 2, false, true, true,
-			      handle_alloc_size_attribute, false,
+  { "type generic",           0, 0, false, true, true, false,
+			      handle_type_generic_attribute, NULL },
+  { "alloc_size",	      1, 2, false, true, true, false,
+			      handle_alloc_size_attribute,
 	                      attr_alloc_exclusions },
-  { "cold",                   0, 0, true,  false, false,
-			      handle_cold_attribute, false,
+  { "cold",                   0, 0, true,  false, false, false,
+			      handle_cold_attribute,
 	                      attr_cold_hot_exclusions },
-  { "hot",                    0, 0, true,  false, false,
-			      handle_hot_attribute, false,
+  { "hot",                    0, 0, true,  false, false, false,
+			      handle_hot_attribute,
 	                      attr_cold_hot_exclusions },
   { "no_address_safety_analysis",
-			      0, 0, true, false, false,
+			      0, 0, true, false, false, false,
 			      handle_no_address_safety_analysis_attribute,
-			      false, NULL },
-  { "no_sanitize",	      1, 1, true, false, false,
-			      handle_no_sanitize_attribute,
-			      false, NULL },
-  { "no_sanitize_address",    0, 0, true, false, false,
-			      handle_no_sanitize_address_attribute,
-			      false, NULL },
-  { "no_sanitize_thread",     0, 0, true, false, false,
-			      handle_no_sanitize_thread_attribute,
-			      false, NULL },
-  { "no_sanitize_undefined",  0, 0, true, false, false,
-			      handle_no_sanitize_undefined_attribute,
-			      false, NULL },
-  { "asan odr indicator",     0, 0, true, false, false,
-			      handle_asan_odr_indicator_attribute,
-			      false, NULL },
-  { "warning",		      1, 1, true,  false, false,
-			      handle_error_attribute, false, NULL },
-  { "error",		      1, 1, true,  false, false,
-			      handle_error_attribute, false, NULL },
-  { "target",                 1, -1, true, false, false,
-			      handle_target_attribute, false, NULL },
-  { "target_clones",          1, -1, true, false, false,
-			      handle_target_clones_attribute, false, NULL },
-  { "optimize",               1, -1, true, false, false,
-			      handle_optimize_attribute, false, NULL },
+			      NULL },
+  { "no_sanitize",	      1, 1, true, false, false, false,
+			      handle_no_sanitize_attribute, NULL },
+  { "no_sanitize_address",    0, 0, true, false, false, false,
+			      handle_no_sanitize_address_attribute, NULL },
+  { "no_sanitize_thread",     0, 0, true, false, false, false,
+			      handle_no_sanitize_thread_attribute, NULL },
+  { "no_sanitize_undefined",  0, 0, true, false, false, false,
+			      handle_no_sanitize_undefined_attribute, NULL },
+  { "asan odr indicator",     0, 0, true, false, false, false,
+			      handle_asan_odr_indicator_attribute, NULL },
+  { "warning",		      1, 1, true,  false, false, false,
+			      handle_error_attribute, NULL },
+  { "error",		      1, 1, true,  false, false, false,
+			      handle_error_attribute, NULL },
+  { "target",                 1, -1, true, false, false, false,
+			      handle_target_attribute, NULL },
+  { "target_clones",          1, -1, true, false, false, false,
+			      handle_target_clones_attribute, NULL },
+  { "optimize",               1, -1, true, false, false, false,
+			      handle_optimize_attribute, NULL },
   /* For internal use only.  The leading '*' both prevents its usage in
      source code and signals that it may be overridden by machine tables.  */
-  { "*tm regparm",            0, 0, false, true, true,
-			      ignore_attribute, false, NULL },
-  { "no_split_stack",	      0, 0, true,  false, false,
-			      handle_no_split_stack_attribute, false, NULL },
+  { "*tm regparm",            0, 0, false, true, true, false,
+			      ignore_attribute, NULL },
+  { "no_split_stack",	      0, 0, true,  false, false, false,
+			      handle_no_split_stack_attribute, NULL },
   /* For internal use (marking of builtins and runtime functions) only.
      The name contains space to prevent its usage in source code.  */
-  { "fn spec",		      1, 1, false, true, true,
-			      handle_fnspec_attribute, false, NULL },
-  { "warn_unused",            0, 0, false, false, false,
-			      handle_warn_unused_attribute, false, NULL },
-  { "returns_nonnull",        0, 0, false, true, true,
-			      handle_returns_nonnull_attribute, false, NULL },
-  { "omp declare simd",       0, -1, true,  false, false,
-			      handle_omp_declare_simd_attribute, false, NULL },
-  { "cilk simd function",     0, -1, true,  false, false,
-			      handle_omp_declare_simd_attribute, false, NULL },
-  { "simd",		      0, 1, true,  false, false,
-			      handle_simd_attribute, false, NULL },
-  { "omp declare target",     0, 0, true, false, false,
-			      handle_omp_declare_target_attribute, false, NULL },
-  { "omp declare target link", 0, 0, true, false, false,
-			      handle_omp_declare_target_attribute, false, NULL },
-  { "alloc_align",	      1, 1, false, true, true,
-			      handle_alloc_align_attribute, false,
+  { "fn spec",		      1, 1, false, true, true, false,
+			      handle_fnspec_attribute, NULL },
+  { "warn_unused",            0, 0, false, false, false, false,
+			      handle_warn_unused_attribute, NULL },
+  { "returns_nonnull",        0, 0, false, true, true, false,
+			      handle_returns_nonnull_attribute, NULL },
+  { "omp declare simd",       0, -1, true,  false, false, false,
+			      handle_omp_declare_simd_attribute, NULL },
+  { "cilk simd function",     0, -1, true,  false, false, false,
+			      handle_omp_declare_simd_attribute, NULL },
+  { "simd",		      0, 1, true,  false, false, false,
+			      handle_simd_attribute, NULL },
+  { "omp declare target",     0, 0, true, false, false, false,
+			      handle_omp_declare_target_attribute, NULL },
+  { "omp declare target link", 0, 0, true, false, false, false,
+			      handle_omp_declare_target_attribute, NULL },
+  { "alloc_align",	      1, 1, false, true, true, false,
+			      handle_alloc_align_attribute,
 	                      attr_alloc_exclusions },
-  { "assume_aligned",	      1, 2, false, true, true,
-			      handle_assume_aligned_attribute, false, NULL },
-  { "designated_init",        0, 0, false, true, false,
-			      handle_designated_init_attribute, false, NULL },
-  { "bnd_variable_size",      0, 0, true,  false, false,
-			      handle_bnd_variable_size_attribute, false, NULL },
-  { "bnd_legacy",             0, 0, true, false, false,
-			      handle_bnd_legacy, false, NULL },
-  { "bnd_instrument",         0, 0, true, false, false,
-			      handle_bnd_instrument, false, NULL },
-  { "fallthrough",	      0, 0, false, false, false,
-			      handle_fallthrough_attribute, false, NULL },
-  { "patchable_function_entry",	1, 2, true, false, false,
+  { "assume_aligned",	      1, 2, false, true, true, false,
+			      handle_assume_aligned_attribute, NULL },
+  { "designated_init",        0, 0, false, true, false, false,
+			      handle_designated_init_attribute, NULL },
+  { "bnd_variable_size",      0, 0, true,  false, false, false,
+			      handle_bnd_variable_size_attribute, NULL },
+  { "bnd_legacy",             0, 0, true, false, false, false,
+			      handle_bnd_legacy, NULL },
+  { "bnd_instrument",         0, 0, true, false, false, false,
+			      handle_bnd_instrument, NULL },
+  { "fallthrough",	      0, 0, false, false, false, false,
+			      handle_fallthrough_attribute, NULL },
+  { "patchable_function_entry",	1, 2, true, false, false, false,
 			      handle_patchable_function_entry_attribute,
-			      false, NULL },
-  { "nocf_check",	      0, 0, false, true, true,
-			      handle_nocf_check_attribute, true, NULL },
-  { NULL,                     0, 0, false, false, false, NULL, false, NULL }
+			      NULL },
+  { "nocf_check",	      0, 0, false, true, true, true,
+			      handle_nocf_check_attribute, NULL },
+  { NULL,                     0, 0, false, false, false, false, NULL, NULL }
 };
 
 /* Give the specifications for the format attributes, used by C and all
@@ -486,13 +479,13 @@  const struct attribute_spec c_common_att
    Current list of processed format attributes: format, format_arg.  */
 const struct attribute_spec c_common_format_attribute_table[] =
 {
-  /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       affects_type_identity } */
-  { "format",                 3, 3, false, true,  true,
-			      handle_format_attribute, false, NULL },
-  { "format_arg",             1, 1, false, true,  true,
-			      handle_format_arg_attribute, false, NULL },
-  { NULL,                     0, 0, false, false, false, NULL, false, NULL }
+  /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
+       affects_type_identity, handler, exclude } */
+  { "format",                 3, 3, false, true,  true, false,
+			      handle_format_attribute, NULL },
+  { "format_arg",             1, 1, false, true,  true, false,
+			      handle_format_arg_attribute, NULL },
+  { NULL,                     0, 0, false, false, false, false, NULL, NULL }
 };
 
 /* Returns TRUE iff the attribute indicated by ATTR_ID takes a plain
--- gcc/doc/plugins.texi.jj	2017-11-27 09:27:39.000000000 +0100
+++ gcc/doc/plugins.texi	2017-12-15 12:33:20.612779241 +0100
@@ -381,7 +381,7 @@  handle_user_attribute (tree *node, tree
 
 /* Attribute definition */
 static struct attribute_spec user_attr =
-  @{ "user", 1, 1, false,  false, false, handle_user_attribute, false @};
+  @{ "user", 1, 1, false,  false, false, false, handle_user_attribute, NULL @};
 
 /* Plugin callback called during attribute registration.
 Registered with register_callback (plugin_name, PLUGIN_ATTRIBUTES, register_attributes, NULL)
--- gcc/fortran/f95-lang.c.jj	2017-12-07 18:04:59.000000000 +0100
+++ gcc/fortran/f95-lang.c	2017-12-15 12:32:00.248819342 +0100
@@ -89,15 +89,15 @@  gfc_handle_omp_declare_target_attribute
 /* Table of valid Fortran attributes.  */
 static const struct attribute_spec gfc_attribute_table[] =
 {
-  /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       affects_type_identity } */
-  { "omp declare target", 0, 0, true,  false, false,
-    gfc_handle_omp_declare_target_attribute, false, NULL },
-  { "omp declare target link", 0, 0, true,  false, false,
-    gfc_handle_omp_declare_target_attribute, false, NULL },
-  { "oacc function", 0, -1, true,  false, false,
-    gfc_handle_omp_declare_target_attribute, false, NULL },
-  { NULL,		  0, 0, false, false, false, NULL, false, NULL }
+  /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
+       affects_type_identity, handler, exclude } */
+  { "omp declare target", 0, 0, true,  false, false, false,
+    gfc_handle_omp_declare_target_attribute, NULL },
+  { "omp declare target link", 0, 0, true,  false, false, false,
+    gfc_handle_omp_declare_target_attribute, NULL },
+  { "oacc function", 0, -1, true,  false, false, false,
+    gfc_handle_omp_declare_target_attribute, NULL },
+  { NULL,		  0, 0, false, false, false, false, NULL, NULL }
 };
 
 #undef LANG_HOOKS_NAME
--- gcc/lto/lto-lang.c.jj	2017-12-07 18:04:59.000000000 +0100
+++ gcc/lto/lto-lang.c	2017-12-15 13:24:25.021821443 +0100
@@ -92,47 +92,47 @@  static const struct attribute_spec::excl
 /* Table of machine-independent attributes supported in GIMPLE.  */
 const struct attribute_spec lto_attribute_table[] =
 {
-  /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       do_diagnostic, exclusions } */
-  { "noreturn",               0, 0, true,  false, false,
-			      handle_noreturn_attribute, false,
+  /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
+       affects_type_identity, handler, exclude } */
+  { "noreturn",               0, 0, true,  false, false, false,
+			      handle_noreturn_attribute,
 			      attr_noreturn_exclusions },
-  { "leaf",		      0, 0, true,  false, false,
-			      handle_leaf_attribute, false, NULL },
+  { "leaf",		      0, 0, true,  false, false, false,
+			      handle_leaf_attribute, NULL },
   /* The same comments as for noreturn attributes apply to const ones.  */
-  { "const",                  0, 0, true,  false, false,
-			      handle_const_attribute, false,
+  { "const",                  0, 0, true,  false, false, false,
+			      handle_const_attribute,
 			      attr_const_pure_exclusions },
-  { "malloc",                 0, 0, true,  false, false,
-			      handle_malloc_attribute, false, NULL },
-  { "pure",                   0, 0, true,  false, false,
-			      handle_pure_attribute, false,
+  { "malloc",                 0, 0, true,  false, false, false,
+			      handle_malloc_attribute, NULL },
+  { "pure",                   0, 0, true,  false, false, false,
+			      handle_pure_attribute,
 			      attr_const_pure_exclusions },
-  { "no vops",                0, 0, true,  false, false,
-			      handle_novops_attribute, false, NULL },
-  { "nonnull",                0, -1, false, true, true,
-			      handle_nonnull_attribute, false, NULL },
-  { "nothrow",                0, 0, true,  false, false,
-			      handle_nothrow_attribute, false, NULL },
-  { "patchable_function_entry", 1, 2, true, false, false,
+  { "no vops",                0, 0, true,  false, false, false,
+			      handle_novops_attribute, NULL },
+  { "nonnull",                0, -1, false, true, true, false,
+			      handle_nonnull_attribute, NULL },
+  { "nothrow",                0, 0, true,  false, false, false,
+			      handle_nothrow_attribute, NULL },
+  { "patchable_function_entry", 1, 2, true, false, false, false,
 			      handle_patchable_function_entry_attribute,
-			      false, NULL },
-  { "returns_twice",          0, 0, true,  false, false,
-			      handle_returns_twice_attribute, false,
+			      NULL },
+  { "returns_twice",          0, 0, true,  false, false, false,
+			      handle_returns_twice_attribute,
 			      attr_returns_twice_exclusions },
-  { "sentinel",               0, 1, false, true, true,
-			      handle_sentinel_attribute, false, NULL },
-  { "type generic",           0, 0, false, true, true,
-			      handle_type_generic_attribute, false, NULL },
-  { "fn spec",	 	      1, 1, false, true, true,
-			      handle_fnspec_attribute, false, NULL },
-  { "transaction_pure",	      0, 0, false, true, true,
-			      handle_transaction_pure_attribute, false, NULL },
+  { "sentinel",               0, 1, false, true, true, false,
+			      handle_sentinel_attribute, NULL },
+  { "type generic",           0, 0, false, true, true, false,
+			      handle_type_generic_attribute, NULL },
+  { "fn spec",	 	      1, 1, false, true, true, false,
+			      handle_fnspec_attribute, NULL },
+  { "transaction_pure",	      0, 0, false, true, true, false,
+			      handle_transaction_pure_attribute, NULL },
   /* For internal use only.  The leading '*' both prevents its usage in
      source code and signals that it may be overridden by machine tables.  */
-  { "*tm regparm",            0, 0, false, true, true,
-			      ignore_attribute, false, NULL },
-  { NULL,                     0, 0, false, false, false, NULL, false, NULL }
+  { "*tm regparm",            0, 0, false, true, true, false,
+			      ignore_attribute, NULL },
+  { NULL,                     0, 0, false, false, false, false, NULL, NULL }
 };
 
 /* Give the specifications for the format attributes, used by C and all
@@ -140,13 +140,13 @@  const struct attribute_spec lto_attribut
 
 const struct attribute_spec lto_format_attribute_table[] =
 {
-  /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       affects_type_identity, exclusions } */
-  { "format",                 3, 3, false, true,  true,
-			      handle_format_attribute, false, NULL },
-  { "format_arg",             1, 1, false, true,  true,
-			      handle_format_arg_attribute, false, NULL },
-  { NULL,                     0, 0, false, false, false, NULL, false, NULL }
+  /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
+       affects_type_identity, handler, exclude } */
+  { "format",                 3, 3, false, true,  true, false,
+			      handle_format_attribute, NULL },
+  { "format_arg",             1, 1, false, true,  true, false,
+			      handle_format_arg_attribute, NULL },
+  { NULL,                     0, 0, false, false, false, false, NULL, NULL }
 };
 
 enum built_in_attribute
--- gcc/attribs.c.jj	2017-12-07 18:04:55.000000000 +0100
+++ gcc/attribs.c	2017-12-15 12:14:55.290126583 +0100
@@ -96,7 +96,7 @@  static bool attributes_initialized = fal
 
 static const struct attribute_spec empty_attribute_table[] =
 {
-  { NULL, 0, 0, false, false, false, NULL, false, NULL }
+  { NULL, 0, 0, false, false, false, false, NULL, NULL }
 };
 
 /* Return base name of the attribute.  Ie '__attr__' is turned into 'attr'.
@@ -118,9 +118,9 @@  extract_attribute_substring (struct subs
    namespace.  The function returns the namespace into which the
    attributes have been registered.  */
 
-scoped_attributes*
-register_scoped_attributes (const struct attribute_spec * attributes,
-			    const char* ns)
+scoped_attributes *
+register_scoped_attributes (const struct attribute_spec *attributes,
+			    const char *ns)
 {
   scoped_attributes *result = NULL;
 
@@ -535,8 +535,8 @@  decl_attributes (tree *node, tree attrib
       tree name = get_attribute_name (a);
       tree args = TREE_VALUE (a);
       tree *anode = node;
-      const struct attribute_spec *spec =
-	lookup_scoped_attribute_spec (ns, name);
+      const struct attribute_spec *spec
+	= lookup_scoped_attribute_spec (ns, name);
       int fn_ptr_quals = 0;
       tree fn_ptr_tmp = NULL_TREE;
 
--- gcc/testsuite/g++.dg/plugin/attribute_plugin.c.jj	2014-09-25 15:02:36.000000000 +0200
+++ gcc/testsuite/g++.dg/plugin/attribute_plugin.c	2017-12-15 15:10:19.523605598 +0100
@@ -26,7 +26,7 @@  handle_user_attribute (tree *node, tree
 /* Attribute definition */
 
 static struct attribute_spec user_attr =
-  { "user", 1, 1, false,  false, false, handle_user_attribute, false };
+  { "user", 1, 1, false,  false, false, false, handle_user_attribute, NULL };
 
 /* Plugin callback called during attribute registration */