diff mbox

[2/3] improve detection of attribute conflicts (PR 81544)

Message ID 78c7d491-59a3-51e3-7923-e04fe6f1c0a3@gmail.com
State New
Headers show

Commit Message

Martin Sebor Aug. 8, 2017, 4:13 p.m. UTC
Part 2 of the series contains the mechanical changes to all
the back ends and to front ends other than C and C++.  There
are no functional changes here.

Martin

Comments

Jeff Law Oct. 2, 2017, 10:24 p.m. UTC | #1
On 08/08/2017 10:13 AM, Martin Sebor wrote:
> Part 2 of the series contains the mechanical changes to all
> the back ends and to front ends other than C and C++.  There
> are no functional changes here.
> 
> Martin
> 
> 
> gcc-81544-2.diff
> 
> 
> PR c/81544 - attribute noreturn and warn_unused_result on the same function accepted
> 
> gcc/ChangeLog:
> 
> 	PR c/81544
> 	* config/alpha/alpha.c (vms_attribute_table): Initialize new member
> 	of struct attribute_spec.
> 	* config/arm/arm.c (arm_attribute_table): Same.
> 	* config/avr/avr.c ( avr_attribute_table): Same.
> 	* config/bfin/bfin.c (bfin_attribute_table): Same.
> 	* config/cr16/cr16.c (cr16_attribute_table): Same.
> 	* config/epiphany/epiphany.c (epiphany_attribute_table): Same.
> 	* config/h8300/h8300.c (h8300_attribute_table): Same.
> 	* config/i386/i386.c (ix86_attribute_table): Same.
> 	* config/ia64/ia64.c (ia64_attribute_table): Same.
> 	* config/m32c/m32c.c (m32c_attribute_table): Same.
> 	* config/m32r/m32r.c (m32r_attribute_table): Same.
> 	* config/m68k/m68k.c (m68k_attribute_table): Same.
> 	* config/mcore/mcore.c (mcore_attribute_table): Same.
> 	* config/mips/mips.c (mips_attribute_table): Same.
> 	* config/nds32/nds32.c (nds32_attribute_table): Same.
> 	* config/nvptx/nvptx.c (nvptx_attribute_table): Same.
> 	* config/powerpcspe/powerpcspe.c (rs6000_attribute_table): Same.
> 	* config/rs6000/rs6000.c (rs6000_attribute_table): Same.
> 	* config/s390/s390.c (s390_handle_vectorbool_attribute): Same.
> 	* config/sh/sh.c (sh_attribute_table): Same.
> 	* config/sparc/sparc.c (sparc_attribute_table): Same.
> 	* config/spu/spu.c (spu_attribute_table): Same.
> 	* config/stormy16/stormy16.c (xstormy16_attribute_table): Same.
> 	* config/v850/v850.c (v850_attribute_table): Same.
> 	* config/visium/visium.c (visium_attribute_table): Same.
> 
> gcc/ada/ChangeLog:
> 
> 	PR c/81544
> 	* gcc-interface/utils.c (gnat_internal_attribute_table): Initialize
> 	new member of struct attribute_spec.
> 
> gcc/fortran/ChangeLog:
> 
> 	PR c/81544
> 	* f95-lang.c (gfc_attribute_table): Initialize new member of struct
> 	attribute_spec.
> 
> gcc/lto/ChangeLog:
> 
> 	PR c/81544
> 	* lto-lang.c (lto_attribute_table): Initialize new member of struct
> 	attribute_spec.
OK.
jeff
diff mbox

Patch

PR c/81544 - attribute noreturn and warn_unused_result on the same function accepted

gcc/ChangeLog:

	PR c/81544
	* config/alpha/alpha.c (vms_attribute_table): Initialize new member
	of struct attribute_spec.
	* config/arm/arm.c (arm_attribute_table): Same.
	* config/avr/avr.c ( avr_attribute_table): Same.
	* config/bfin/bfin.c (bfin_attribute_table): Same.
	* config/cr16/cr16.c (cr16_attribute_table): Same.
	* config/epiphany/epiphany.c (epiphany_attribute_table): Same.
	* config/h8300/h8300.c (h8300_attribute_table): Same.
	* config/i386/i386.c (ix86_attribute_table): Same.
	* config/ia64/ia64.c (ia64_attribute_table): Same.
	* config/m32c/m32c.c (m32c_attribute_table): Same.
	* config/m32r/m32r.c (m32r_attribute_table): Same.
	* config/m68k/m68k.c (m68k_attribute_table): Same.
	* config/mcore/mcore.c (mcore_attribute_table): Same.
	* config/mips/mips.c (mips_attribute_table): Same.
	* config/nds32/nds32.c (nds32_attribute_table): Same.
	* config/nvptx/nvptx.c (nvptx_attribute_table): Same.
	* config/powerpcspe/powerpcspe.c (rs6000_attribute_table): Same.
	* config/rs6000/rs6000.c (rs6000_attribute_table): Same.
	* config/s390/s390.c (s390_handle_vectorbool_attribute): Same.
	* config/sh/sh.c (sh_attribute_table): Same.
	* config/sparc/sparc.c (sparc_attribute_table): Same.
	* config/spu/spu.c (spu_attribute_table): Same.
	* config/stormy16/stormy16.c (xstormy16_attribute_table): Same.
	* config/v850/v850.c (v850_attribute_table): Same.
	* config/visium/visium.c (visium_attribute_table): Same.

gcc/ada/ChangeLog:

	PR c/81544
	* gcc-interface/utils.c (gnat_internal_attribute_table): Initialize
	new member of struct attribute_spec.

gcc/fortran/ChangeLog:

	PR c/81544
	* f95-lang.c (gfc_attribute_table): Initialize new member of struct
	attribute_spec.

gcc/lto/ChangeLog:

	PR c/81544
	* lto-lang.c (lto_attribute_table): Initialize new member of struct
	attribute_spec.

diff --git a/gcc/config/alpha/alpha.c b/gcc/config/alpha/alpha.c
index 341ec20..06147e6 100644
--- a/gcc/config/alpha/alpha.c
+++ b/gcc/config/alpha/alpha.c
@@ -7488,9 +7488,10 @@  common_object_handler (tree *node, tree name ATTRIBUTE_UNUSED,
 static const struct attribute_spec vms_attribute_table[] =
 {
   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       affects_type_identity } */
-  { COMMON_OBJECT,   0, 1, true,  false, false, common_object_handler, false },
-  { NULL,            0, 0, false, false, false, NULL, false }
+       affects_type_identity, exclusions } */
+  { COMMON_OBJECT,   0, 1, true,  false, false, common_object_handler, false,
+    NULL },
+  { NULL,            0, 0, false, false, false, NULL, false, NULL }
 };
 
 void
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index 25677d1..f5d30bd 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -317,24 +317,24 @@  static machine_mode arm_floatn_mode (int, bool);
 static const struct attribute_spec arm_attribute_table[] =
 {
   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       affects_type_identity } */
+       affects_type_identity, exclusions } */
   /* 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 },
+  { "long_call",    0, 0, false, true,  true,  NULL, false, NULL },
   /* Whereas these functions are always known to reside within the 26 bit
      addressing range.  */
-  { "short_call",   0, 0, false, true,  true,  NULL, false },
+  { "short_call",   0, 0, false, true,  true,  NULL, false, NULL },
   /* Specify the procedure call conventions for a function.  */
   { "pcs",          1, 1, false, true,  true,  arm_handle_pcs_attribute,
-    false },
+    false, NULL },
   /* Interrupt Service Routines have special prologue and epilogue requirements.  */
   { "isr",          0, 1, false, false, false, arm_handle_isr_attribute,
-    false },
+    false, NULL },
   { "interrupt",    0, 1, false, false, false, arm_handle_isr_attribute,
-    false },
+    false, NULL },
   { "naked",        0, 0, true,  false, false, arm_handle_fndecl_attribute,
-    false },
+    false, NULL },
 #ifdef ARM_PE
   /* ARM/PE has three new attributes:
      interfacearm - ?
@@ -345,22 +345,24 @@  static const struct attribute_spec arm_attribute_table[] =
      them with spaces.  We do NOT support this.  Instead, use __declspec
      multiple times.
   */
-  { "dllimport",    0, 0, true,  false, false, NULL, false },
-  { "dllexport",    0, 0, true,  false, false, NULL, false },
+  { "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 },
+    false, NULL },
 #elif TARGET_DLLIMPORT_DECL_ATTRIBUTES
-  { "dllimport",    0, 0, false, false, false, handle_dll_attribute, false },
-  { "dllexport",    0, 0, false, false, false, handle_dll_attribute, false },
+  { "dllimport",    0, 0, false, false, false, handle_dll_attribute, false,
+    NULL },
+  { "dllexport",    0, 0, false, false, false, handle_dll_attribute, false,
+    NULL },
   { "notshared",    0, 0, false, true, false, arm_handle_notshared_attribute,
-    false },
+    false, NULL },
 #endif
   /* ARMv8-M Security Extensions support.  */
   { "cmse_nonsecure_entry", 0, 0, true, false, false,
-    arm_handle_cmse_nonsecure_entry, false },
+    arm_handle_cmse_nonsecure_entry, false, NULL },
   { "cmse_nonsecure_call", 0, 0, true, false, false,
-    arm_handle_cmse_nonsecure_call, true },
-  { NULL,           0, 0, false, false, false, NULL, false }
+    arm_handle_cmse_nonsecure_call, true, NULL },
+  { NULL, 0, 0, false, false, false, NULL, false, NULL }
 };
 
 /* Initialize the GCC target structure.  */
diff --git a/gcc/config/avr/avr.c b/gcc/config/avr/avr.c
index 1f333cc..c865a41 100644
--- a/gcc/config/avr/avr.c
+++ b/gcc/config/avr/avr.c
@@ -9869,30 +9869,30 @@  static const struct attribute_spec
 avr_attribute_table[] =
 {
   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       affects_type_identity } */
+       affects_type_identity, exclusions } */
   { "progmem",   0, 0, false, false, false,  avr_handle_progmem_attribute,
-    false },
+    false, NULL },
   { "signal",    0, 0, true,  false, false,  avr_handle_fndecl_attribute,
-    false },
+    false, NULL },
   { "interrupt", 0, 0, true,  false, false,  avr_handle_fndecl_attribute,
-    false },
+    false, NULL },
   { "no_gccisr", 0, 0, true,  false, false,  avr_handle_fndecl_attribute,
-    false },
+    false, NULL },
   { "naked",     0, 0, false, true,  true,   avr_handle_fntype_attribute,
-    false },
+    false, NULL },
   { "OS_task",   0, 0, false, true,  true,   avr_handle_fntype_attribute,
-    false },
+    false, NULL },
   { "OS_main",   0, 0, false, true,  true,   avr_handle_fntype_attribute,
-    false },
+    false, NULL },
   { "io",        0, 1, false, false, false,  avr_handle_addr_attribute,
-    false },
+    false, NULL },
   { "io_low",    0, 1, false, false, false,  avr_handle_addr_attribute,
-    false },
+    false, NULL },
   { "address",   1, 1, false, false, false,  avr_handle_addr_attribute,
-    false },
+    false, NULL },
   { "absdata",   0, 0, true, false, false,  avr_handle_absdata_attribute,
-    false },
-  { NULL,        0, 0, false, false, false, NULL, false }
+    false, NULL },
+  { NULL,        0, 0, false, false, false, NULL, false, NULL }
 };
 
 
diff --git a/gcc/config/bfin/bfin.c b/gcc/config/bfin/bfin.c
index 9fe90fc..f412188 100644
--- a/gcc/config/bfin/bfin.c
+++ b/gcc/config/bfin/bfin.c
@@ -4875,29 +4875,30 @@  bfin_handle_l2_attribute (tree *node, tree ARG_UNUSED (name),
 static const struct attribute_spec bfin_attribute_table[] =
 {
   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       affects_type_identity } */
+       affects_type_identity, exclusions } */
   { "interrupt_handler", 0, 0, false, true,  true, handle_int_attribute,
-    false },
+    false, NULL },
   { "exception_handler", 0, 0, false, true,  true, handle_int_attribute,
-    false },
-  { "nmi_handler", 0, 0, false, true,  true, handle_int_attribute, false },
-  { "nesting", 0, 0, false, true,  true, NULL, false },
-  { "kspisusp", 0, 0, false, true,  true, NULL, false },
-  { "saveall", 0, 0, false, true,  true, NULL, false },
+    false, NULL },
+  { "nmi_handler", 0, 0, false, true,  true, handle_int_attribute, false,
+    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 },
+    false, NULL },
   { "shortcall", 0, 0, false, true,  true,  bfin_handle_longcall_attribute,
-    false },
+    false, NULL },
   { "l1_text", 0, 0, true, false, false,  bfin_handle_l1_text_attribute,
-    false },
+    false, NULL },
   { "l1_data", 0, 0, true, false, false,  bfin_handle_l1_data_attribute,
-    false },
+    false, NULL },
   { "l1_data_A", 0, 0, true, false, false, bfin_handle_l1_data_attribute,
-    false },
+    false, NULL },
   { "l1_data_B", 0, 0, true, false, false,  bfin_handle_l1_data_attribute,
-    false },
-  { "l2", 0, 0, true, false, false,  bfin_handle_l2_attribute, false },
-  { NULL, 0, 0, false, false, false, NULL, false }
+    false, NULL },
+  { "l2", 0, 0, true, false, false,  bfin_handle_l2_attribute, false, NULL },
+  { NULL, 0, 0, false, false, false, NULL, false, NULL }
 };
 
 /* Implementation of TARGET_ASM_INTEGER.  When using FD-PIC, we need to
diff --git a/gcc/config/cr16/cr16.c b/gcc/config/cr16/cr16.c
index 93edd23..2a10019 100644
--- a/gcc/config/cr16/cr16.c
+++ b/gcc/config/cr16/cr16.c
@@ -202,9 +202,9 @@  static void cr16_print_operand_address (FILE *, machine_mode, rtx);
 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 }.  */
-  {"interrupt", 0, 0, false, true, true, NULL, false},
-  {NULL, 0, 0, false, false, false, NULL, false}
+       affects_type_identity, exclusions }.  */
+  {"interrupt", 0, 0, false, true, true, NULL, false, NULL},
+  {NULL, 0, 0, false, false, false, NULL, false, NULL}
 };
 
 /* TARGET_ASM_UNALIGNED_xx_OP generates .?byte directive
diff --git a/gcc/config/epiphany/epiphany.c b/gcc/config/epiphany/epiphany.c
index b9ec0f4..4f1a22c 100644
--- a/gcc/config/epiphany/epiphany.c
+++ b/gcc/config/epiphany/epiphany.c
@@ -449,13 +449,14 @@  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 } */
-  { "interrupt",  0, 9, true,  false, false, epiphany_handle_interrupt_attribute, true },
-  { "forwarder_section", 1, 1, true, false, false, epiphany_handle_forwarder_attribute, false },
-  { "long_call",  0, 0, false, true, true, NULL, false },
-  { "short_call", 0, 0, false, true, true, NULL, false },
-  { "disinterrupt", 0, 0, false, true, true, NULL, true },
-  { NULL,         0, 0, false, false, false, NULL, false }
+  /* { 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 }
 };
 
 /* Handle an "interrupt" attribute; arguments as in
diff --git a/gcc/config/h8300/h8300.c b/gcc/config/h8300/h8300.c
index acdeded..dcd0669 100644
--- a/gcc/config/h8300/h8300.c
+++ b/gcc/config/h8300/h8300.c
@@ -5424,22 +5424,22 @@  h8300_insert_attributes (tree node, tree *attributes)
 static const struct attribute_spec h8300_attribute_table[] =
 {
   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       affects_type_identity } */
+       affects_type_identity, exclusions } */
   { "interrupt_handler", 0, 0, true,  false, false,
-    h8300_handle_fndecl_attribute, false },
+    h8300_handle_fndecl_attribute, false, NULL },
   { "saveall",           0, 0, true,  false, false,
-    h8300_handle_fndecl_attribute, false },
+    h8300_handle_fndecl_attribute, false, NULL },
   { "OS_Task",           0, 0, true,  false, false,
-    h8300_handle_fndecl_attribute, false },
+    h8300_handle_fndecl_attribute, false, NULL },
   { "monitor",           0, 0, true,  false, false,
-    h8300_handle_fndecl_attribute, false },
+    h8300_handle_fndecl_attribute, false, NULL },
   { "function_vector",   0, 0, true,  false, false,
-    h8300_handle_fndecl_attribute, false },
+    h8300_handle_fndecl_attribute, false, NULL },
   { "eightbit_data",     0, 0, true,  false, false,
-    h8300_handle_eightbit_data_attribute, false },
+    h8300_handle_eightbit_data_attribute, false, NULL },
   { "tiny_data",         0, 0, true,  false, false,
-    h8300_handle_tiny_data_attribute, false },
-  { NULL,                0, 0, false, false, false, NULL, false }
+    h8300_handle_tiny_data_attribute, false, NULL },
+  { NULL,                0, 0, false, false, false, NULL, false, NULL }
 };
 
 
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index c0b6015..b2c4b64 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -46495,69 +46495,71 @@  ix86_expand_round_sse4 (rtx op0, rtx op1)
 static const struct attribute_spec ix86_attribute_table[] =
 {
   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       affects_type_identity } */
+       affects_type_identity, exclusions } */
   /* 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 },
+    true, 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 },
+    true, 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 },
+    true, NULL },
   /* Cdecl attribute says the callee is a normal C declaration */
   { "cdecl",     0, 0, false, true,  true,  ix86_handle_cconv_attribute,
-    true },
+    true, 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 },
+    true, 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 },
+    true, 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 },
+    true, 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, ix86_handle_force_align_arg_pointer_attribute, false,
+    NULL },
 #if TARGET_DLLIMPORT_DECL_ATTRIBUTES
-  { "dllimport", 0, 0, false, false, false, handle_dll_attribute, false },
-  { "dllexport", 0, 0, false, false, false, handle_dll_attribute, false },
+  { "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 },
+    false, NULL },
 #endif
   { "ms_struct", 0, 0, false, false,  false, ix86_handle_struct_attribute,
-    false },
+    false, NULL },
   { "gcc_struct", 0, 0, false, false,  false, ix86_handle_struct_attribute,
-    false },
+    false, 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 },
-  { "sysv_abi", 0, 0, false, true, true, ix86_handle_abi_attribute, true },
-  { "ms_abi va_list", 0, 0, false, false, false, NULL, false },
-  { "sysv_abi va_list", 0, 0, false, false, false, NULL, false },
+  { "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,
+    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 },
+    false, NULL },
   { "callee_pop_aggregate_return", 1, 1, false, true, true,
-    ix86_handle_callee_pop_aggregate_return, true },
+    ix86_handle_callee_pop_aggregate_return, true, NULL },
   { "interrupt", 0, 0, false, true, true,
-    ix86_handle_interrupt_attribute, false },
+    ix86_handle_interrupt_attribute, false, NULL },
   { "no_caller_saved_registers", 0, 0, false, true, true,
-    ix86_handle_no_caller_saved_registers_attribute, false },
+    ix86_handle_no_caller_saved_registers_attribute, false, NULL },
   { "naked", 0, 0, true, false, false,
-    ix86_handle_fndecl_attribute, false },
+    ix86_handle_fndecl_attribute, false, NULL },
 
   /* End element.  */
-  { NULL,        0, 0, false, false, false, NULL, false }
+  { NULL, 0, 0, false, false, false, NULL, false, NULL }
 };
 
 /* Implement targetm.vectorize.builtin_vectorization_cost.  */
diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c
index c8e4c74..382d994 100644
--- a/gcc/config/ia64/ia64.c
+++ b/gcc/config/ia64/ia64.c
@@ -353,17 +353,17 @@  static bool ia64_expand_vec_perm_const_1 (struct expand_vec_perm_d *d);
 static const struct attribute_spec ia64_attribute_table[] =
 {
   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       affects_type_identity } */
-  { "syscall_linkage", 0, 0, false, true,  true,  NULL, false },
+       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 },
+    false, NULL },
 #if TARGET_ABI_OPEN_VMS
   { "common_object",   1, 1, true, false, false,
-    ia64_vms_common_object_attribute, false },
+    ia64_vms_common_object_attribute, false, NULL },
 #endif
   { "version_id",      1, 1, true, false, false,
-    ia64_handle_version_id_attribute, false },
-  { NULL,	       0, 0, false, false, false, NULL, false }
+    ia64_handle_version_id_attribute, false, NULL },
+  { NULL,	       0, 0, false, false, false, NULL, false, NULL }
 };
 
 /* Initialize the GCC target structure.  */
diff --git a/gcc/config/m32c/m32c.c b/gcc/config/m32c/m32c.c
index 95e97ab..88e3aa6 100644
--- a/gcc/config/m32c/m32c.c
+++ b/gcc/config/m32c/m32c.c
@@ -2998,12 +2998,14 @@  current_function_special_page_vector (rtx x)
 #undef TARGET_ATTRIBUTE_TABLE
 #define TARGET_ATTRIBUTE_TABLE m32c_attribute_table
 static const struct attribute_spec m32c_attribute_table[] = {
-  {"interrupt", 0, 0, false, false, false, interrupt_handler, false},
-  {"bank_switch", 0, 0, false, false, false, interrupt_handler, false},
-  {"fast_interrupt", 0, 0, false, false, false, interrupt_handler, false},
+  /* { 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},
-  {0, 0, 0, 0, 0, 0, 0, false}
+   false, NULL},
+  {0, 0, 0, 0, 0, 0, 0, false, NULL}
 };
 
 #undef TARGET_COMP_TYPE_ATTRIBUTES
diff --git a/gcc/config/m32r/m32r.c b/gcc/config/m32r/m32r.c
index 4efb4b9..c641aa9 100644
--- a/gcc/config/m32r/m32r.c
+++ b/gcc/config/m32r/m32r.c
@@ -107,11 +107,11 @@  static bool m32r_attribute_identifier (const_tree);
 static const struct attribute_spec m32r_attribute_table[] =
 {
   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       affects_type_identity } */
-  { "interrupt", 0, 0, true,  false, false, NULL, false },
+       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,        0, 0, false, false, false, NULL, false }
+    false, NULL },
+  { NULL,        0, 0, false, false, false, NULL, false, NULL }
 };
 
 /* Initialize the GCC target structure.  */
diff --git a/gcc/config/m68k/m68k.c b/gcc/config/m68k/m68k.c
index c14ce86..b925be8 100644
--- a/gcc/config/m68k/m68k.c
+++ b/gcc/config/m68k/m68k.c
@@ -335,14 +335,14 @@  m68k_excess_precision (enum excess_precision_type);
 static const struct attribute_spec m68k_attribute_table[] =
 {
   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       affects_type_identity } */
+       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 },
+    m68k_handle_fndecl_attribute, false, NULL },
   { "interrupt_thread", 0, 0, true,  false, false,
-    m68k_handle_fndecl_attribute, false },
-  { NULL,                0, 0, false, false, false, NULL, false }
+    m68k_handle_fndecl_attribute, false, NULL },
+  { NULL, 0, 0, false, false, false, NULL, false, NULL }
 };
 
 struct gcc_target targetm = TARGET_INITIALIZER;
diff --git a/gcc/config/mcore/mcore.c b/gcc/config/mcore/mcore.c
index c4b7c4c..742d54c 100644
--- a/gcc/config/mcore/mcore.c
+++ b/gcc/config/mcore/mcore.c
@@ -149,12 +149,12 @@  static bool	  mcore_legitimate_address_p	(machine_mode, rtx, bool,
 static const struct attribute_spec mcore_attribute_table[] =
 {
   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       affects_type_identity } */
-  { "dllexport", 0, 0, true,  false, false, NULL, false },
-  { "dllimport", 0, 0, true,  false, false, NULL, false },
+       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,        0, 0, false, false, false, NULL, false }
+    false, NULL },
+  { NULL,        0, 0, false, false, false, NULL, false, NULL }
 };
 
 /* Initialize the GCC target structure.  */
diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c
index d2737a6..b1e2b61 100644
--- a/gcc/config/mips/mips.c
+++ b/gcc/config/mips/mips.c
@@ -596,27 +596,27 @@  static tree mips_handle_use_shadow_register_set_attr (tree *, tree, tree, int,
 /* 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 },
-  { "far",     	   0, 0, false, true,  true,  NULL, false },
-  { "near",        0, 0, false, true,  true,  NULL, false },
+       om_diagnostic, exclusions } */
+  { "long_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 },
   /* 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 },
-  { "nomips16",    0, 0, true,  false, false, NULL, false },
-  { "micromips",   0, 0, true,  false, false, NULL, false },
-  { "nomicromips", 0, 0, true,  false, false, NULL, false },
-  { "nocompression", 0, 0, true,  false, false, NULL, false },
+  { "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 },
   /* Allow functions to be specified as interrupt handlers */
   { "interrupt",   0, 1, false, true,  true, mips_handle_interrupt_attr,
-    false },
+    false, NULL },
   { "use_shadow_register_set",	0, 1, false, true,  true,
-    mips_handle_use_shadow_register_set_attr, false },
-  { "keep_interrupts_masked",	0, 0, false, true,  true, NULL, false },
-  { "use_debug_exception_return", 0, 0, false, true,  true, NULL, false },
-  { NULL,	   0, 0, false, false, false, NULL, false }
+    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 }
 };
 
 /* A table describing all the processors GCC knows about; see
diff --git a/gcc/config/nds32/nds32.c b/gcc/config/nds32/nds32.c
index 705d223..0a7e56a 100644
--- a/gcc/config/nds32/nds32.c
+++ b/gcc/config/nds32/nds32.c
@@ -81,33 +81,34 @@  static const char * const nds32_intrinsic_register_names[] =
 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 } */
+               function_type_required, handler, affects_type_identity,
+	       exclusions } */
 
   /* The interrupt vid: [0-63]+ (actual vector number starts from 9 to 72).  */
-  { "interrupt",    1, 64, false, false, false, NULL, false },
+  { "interrupt",    1, 64, false, false, false, NULL, false, NULL },
   /* The exception vid: [1-8]+  (actual vector number starts from 1 to 8).  */
-  { "exception",    1,  8, false, false, false, NULL, false },
+  { "exception",    1,  8, false, false, false, NULL, false, NULL },
   /* Argument is user's interrupt numbers.  The vector number is always 0.  */
-  { "reset",        1,  1, false, false, false, NULL, false },
+  { "reset",        1,  1, false, false, false, NULL, false, NULL },
 
   /* The attributes describing isr nested type.  */
-  { "nested",       0,  0, false, false, false, NULL, false },
-  { "not_nested",   0,  0, false, false, false, NULL, false },
-  { "nested_ready", 0,  0, false, false, false, NULL, false },
+  { "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 },
 
   /* The attributes describing isr register save scheme.  */
-  { "save_all",     0,  0, false, false, false, NULL, false },
-  { "partial_save", 0,  0, false, false, false, NULL, false },
+  { "save_all",     0,  0, false, false, false, NULL, false, NULL },
+  { "partial_save", 0,  0, false, false, false, NULL, false, NULL },
 
   /* The attributes used by reset attribute.  */
-  { "nmi",          1,  1, false, false, false, NULL, false },
-  { "warm",         1,  1, false, false, false, NULL, false },
+  { "nmi",          1,  1, false, false, false, NULL, false, NULL },
+  { "warm",         1,  1, false, false, false, NULL, false, NULL },
 
   /* The attribute telling no prologue/epilogue.  */
-  { "naked",        0,  0, false, false, false, NULL, false },
+  { "naked",        0,  0, false, false, false, NULL, false, NULL },
 
   /* The last attribute spec is set to be NULL.  */
-  { NULL,           0,  0, false, false, false, NULL, false }
+  { NULL,           0,  0, false, false, false, NULL, false, NULL }
 };
 
 
diff --git a/gcc/config/nvptx/nvptx.c b/gcc/config/nvptx/nvptx.c
index dddb952..abc8ab8 100644
--- a/gcc/config/nvptx/nvptx.c
+++ b/gcc/config/nvptx/nvptx.c
@@ -4465,10 +4465,12 @@  nvptx_handle_shared_attribute (tree *node, tree name, tree ARG_UNUSED (args),
 static const struct attribute_spec nvptx_attribute_table[] =
 {
   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       affects_type_identity } */
-  { "kernel", 0, 0, true, false,  false, nvptx_handle_kernel_attribute, false },
-  { "shared", 0, 0, true, false,  false, nvptx_handle_shared_attribute, false },
-  { NULL, 0, 0, false, false, false, NULL, false }
+       affects_type_identity, exclusions } */
+  { "kernel", 0, 0, true, false,  false, nvptx_handle_kernel_attribute, false,
+    NULL },
+  { "shared", 0, 0, true, false,  false, nvptx_handle_shared_attribute, false,
+    NULL },
+  { NULL, 0, 0, false, false, false, NULL, false, NULL }
 };
 
 /* Limit vector alignments to BIGGEST_ALIGNMENT.  */
diff --git a/gcc/config/powerpcspe/powerpcspe.c b/gcc/config/powerpcspe/powerpcspe.c
index b94afd5..a64ea93 100644
--- a/gcc/config/powerpcspe/powerpcspe.c
+++ b/gcc/config/powerpcspe/powerpcspe.c
@@ -1545,21 +1545,21 @@  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 } */
+       affects_type_identity, exclusions } */
   { "altivec",   1, 1, false, true,  false, rs6000_handle_altivec_attribute,
-    false },
+    false, NULL },
   { "longcall",  0, 0, false, true,  true,  rs6000_handle_longcall_attribute,
-    false },
+    false, NULL },
   { "shortcall", 0, 0, false, true,  true,  rs6000_handle_longcall_attribute,
-    false },
+    false, NULL },
   { "ms_struct", 0, 0, false, false, false, rs6000_handle_struct_attribute,
-    false },
+    false, NULL },
   { "gcc_struct", 0, 0, false, false, false, rs6000_handle_struct_attribute,
-    false },
+    false, NULL },
 #ifdef SUBTARGET_ATTRIBUTE_TABLE
   SUBTARGET_ATTRIBUTE_TABLE,
 #endif
-  { NULL,        0, 0, false, false, false, NULL, false }
+  { NULL,        0, 0, false, false, false, NULL, false, NULL }
 };
 
 #ifndef TARGET_PROFILE_KERNEL
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 1fb9861..2495f4f 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -1537,21 +1537,21 @@  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 } */
+       affects_type_identity, exclusions } */
   { "altivec",   1, 1, false, true,  false, rs6000_handle_altivec_attribute,
-    false },
+    false, NULL },
   { "longcall",  0, 0, false, true,  true,  rs6000_handle_longcall_attribute,
-    false },
+    false, NULL },
   { "shortcall", 0, 0, false, true,  true,  rs6000_handle_longcall_attribute,
-    false },
+    false, NULL },
   { "ms_struct", 0, 0, false, false, false, rs6000_handle_struct_attribute,
-    false },
+    false, NULL },
   { "gcc_struct", 0, 0, false, false, false, rs6000_handle_struct_attribute,
-    false },
+    false, NULL },
 #ifdef SUBTARGET_ATTRIBUTE_TABLE
   SUBTARGET_ATTRIBUTE_TABLE,
 #endif
-  { NULL,        0, 0, false, false, false, NULL, false }
+  { NULL,        0, 0, false, false, false, NULL, false, NULL }
 };
 
 #ifndef TARGET_PROFILE_KERNEL
diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c
index 9f422c8..29f96fb 100644
--- a/gcc/config/s390/s390.c
+++ b/gcc/config/s390/s390.c
@@ -1149,10 +1149,12 @@  s390_handle_vectorbool_attribute (tree *node, tree name ATTRIBUTE_UNUSED,
 }
 
 static const struct attribute_spec s390_attribute_table[] = {
-  { "hotpatch", 2, 2, true, false, false, s390_handle_hotpatch_attribute, false },
-  { "s390_vector_bool", 0, 0, false, true, false, s390_handle_vectorbool_attribute, true },
+  { "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 },
   /* End element.  */
-  { NULL,        0, 0, false, false, false, NULL, false }
+  { NULL,        0, 0, false, false, false, NULL, false, NULL }
 };
 
 /* Return the alignment for LABEL.  We default to the -falign-labels
diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c
index c31776f..c997dfa 100644
--- a/gcc/config/sh/sh.c
+++ b/gcc/config/sh/sh.c
@@ -325,24 +325,24 @@  static void sh_init_sync_libfuncs (void) ATTRIBUTE_UNUSED;
 static const struct attribute_spec sh_attribute_table[] =
 {
   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       affects_type_identity } */
+       affects_type_identity, exclusions } */
   { "interrupt_handler", 0, 0, true,  false, false,
-    sh_handle_interrupt_handler_attribute, false },
+    sh_handle_interrupt_handler_attribute, false, NULL },
   { "sp_switch",         1, 1, true,  false, false,
-     sh_handle_sp_switch_attribute, false },
+     sh_handle_sp_switch_attribute, false, NULL },
   { "trap_exit",         1, 1, true,  false, false,
-    sh_handle_trap_exit_attribute, false },
+    sh_handle_trap_exit_attribute, false, NULL },
   { "renesas",           0, 0, false, true, false,
-    sh_handle_renesas_attribute, false },
+    sh_handle_renesas_attribute, false, NULL },
   { "trapa_handler",     0, 0, true,  false, false,
-    sh_handle_interrupt_handler_attribute, false },
+    sh_handle_interrupt_handler_attribute, false, NULL },
   { "nosave_low_regs",   0, 0, true,  false, false,
-    sh_handle_interrupt_handler_attribute, false },
+    sh_handle_interrupt_handler_attribute, false, NULL },
   { "resbank",           0, 0, true,  false, false,
-    sh_handle_resbank_handler_attribute, false },
+    sh_handle_resbank_handler_attribute, false, NULL },
   { "function_vector",   1, 1, true,  false, false,
-    sh2a_handle_function_vector_handler_attribute, false },
-  { NULL,                0, 0, false, false, false, NULL, false }
+    sh2a_handle_function_vector_handler_attribute, false, NULL },
+  { NULL,                0, 0, false, false, false, NULL, false, NULL }
 };
 
 /* Initialize the GCC target structure.  */
diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c
index 59761aa..ceaf8e8 100644
--- a/gcc/config/sparc/sparc.c
+++ b/gcc/config/sparc/sparc.c
@@ -680,9 +680,9 @@  static unsigned int sparc_min_arithmetic_precision (void);
 static const struct attribute_spec sparc_attribute_table[] =
 {
   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       do_diagnostic } */
+       do_diagnostic, exclusions } */
   SUBTARGET_ATTRIBUTE_TABLE,
-  { NULL,        0, 0, false, false, false, NULL, false }
+  { NULL,        0, 0, false, false, false, NULL, false, NULL }
 };
 #endif
 
diff --git a/gcc/config/spu/spu.c b/gcc/config/spu/spu.c
index ec20bd6..cb19941 100644
--- a/gcc/config/spu/spu.c
+++ b/gcc/config/spu/spu.c
@@ -7145,12 +7145,12 @@  spu_expand_atomic_op (enum rtx_code code, rtx mem, rtx val,
 static const struct attribute_spec spu_attribute_table[] =
 {
   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       affects_type_identity } */
+       affects_type_identity, exclusions } */
   { "naked",          0, 0, true,  false, false, spu_handle_fndecl_attribute,
-    false },
+    false, NULL },
   { "spu_vector",     0, 0, false, true,  false, spu_handle_vector_attribute,
-    false },
-  { NULL,             0, 0, false, false, false, NULL, false }
+    false, NULL },
+  { NULL,             0, 0, false, false, false, NULL, false, NULL }
 };
 
 /*  TARGET overrides.  */
diff --git a/gcc/config/stormy16/stormy16.c b/gcc/config/stormy16/stormy16.c
index aee7742..f1adcfc 100644
--- a/gcc/config/stormy16/stormy16.c
+++ b/gcc/config/stormy16/stormy16.c
@@ -2188,14 +2188,14 @@  static tree xstormy16_handle_below100_attribute
 static const struct attribute_spec xstormy16_attribute_table[] =
 {
   /* name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-     affects_type_identity.  */
+     affects_type_identity, exclusions.  */
   { "interrupt", 0, 0, false, true,  true,
-    xstormy16_handle_interrupt_attribute , false },
+    xstormy16_handle_interrupt_attribute , false, NULL },
   { "BELOW100",  0, 0, false, false, false,
-    xstormy16_handle_below100_attribute, false },
+    xstormy16_handle_below100_attribute, false, NULL },
   { "below100",  0, 0, false, false, false,
-    xstormy16_handle_below100_attribute, false },
-  { NULL,        0, 0, false, false, false, NULL, false }
+    xstormy16_handle_below100_attribute, false, NULL },
+  { NULL,        0, 0, false, false, false, NULL, false, NULL }
 };
 
 /* Handle an "interrupt" attribute;
diff --git a/gcc/config/v850/v850.c b/gcc/config/v850/v850.c
index dd73c96..3a08f7d 100644
--- a/gcc/config/v850/v850.c
+++ b/gcc/config/v850/v850.c
@@ -3189,18 +3189,18 @@  v850_adjust_insn_length (rtx_insn *insn, int length)
 static const struct attribute_spec v850_attribute_table[] =
 {
   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       affects_type_identity } */
+       affects_type_identity, exclusions } */
   { "interrupt_handler", 0, 0, true,  false, false,
-    v850_handle_interrupt_attribute, false },
+    v850_handle_interrupt_attribute, false, NULL },
   { "interrupt",         0, 0, true,  false, false,
-    v850_handle_interrupt_attribute, false },
+    v850_handle_interrupt_attribute, false, NULL },
   { "sda",               0, 0, true,  false, false,
-    v850_handle_data_area_attribute, false },
+    v850_handle_data_area_attribute, false, NULL },
   { "tda",               0, 0, true,  false, false,
-    v850_handle_data_area_attribute, false },
+    v850_handle_data_area_attribute, false, NULL },
   { "zda",               0, 0, true,  false, false,
-    v850_handle_data_area_attribute, false },
-  { NULL,                0, 0, false, false, false, NULL, false }
+    v850_handle_data_area_attribute, false, NULL },
+  { NULL,                0, 0, false, false, false, NULL, false, NULL }
 };
 
 static void
diff --git a/gcc/config/visium/visium.c b/gcc/config/visium/visium.c
index e5d843e..abe3dbc 100644
--- a/gcc/config/visium/visium.c
+++ b/gcc/config/visium/visium.c
@@ -145,9 +145,10 @@  static inline bool current_function_has_lr_slot (void);
 static const struct attribute_spec visium_attribute_table[] =
 {
   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       affects_type_identity } */
-  {"interrupt", 0, 0, true, false, false, visium_handle_interrupt_attr, false},
-  {NULL, 0, 0, false, false, false, NULL, false}
+       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},
 };
 
 static struct machine_function *visium_init_machine_status (void);
diff --git a/gcc/ada/gcc-interface/utils.c b/gcc/ada/gcc-interface/utils.c
index 475261b..af874cb 100644
--- a/gcc/ada/gcc-interface/utils.c
+++ b/gcc/ada/gcc-interface/utils.c
@@ -110,45 +110,47 @@  const struct attribute_spec gnat_internal_attribute_table[] =
   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
        affects_type_identity } */
   { "const",        0, 0,  true,  false, false, handle_const_attribute,
-    false },
+    false, NULL },
   { "nothrow",      0, 0,  true,  false, false, handle_nothrow_attribute,
-    false },
+    false, NULL },
   { "pure",         0, 0,  true,  false, false, handle_pure_attribute,
-    false },
+    false, NULL },
   { "no vops",      0, 0,  true,  false, false, handle_novops_attribute,
-    false },
+    false, NULL },
   { "nonnull",      0, -1, false, true,  true,  handle_nonnull_attribute,
-    false },
+    false, NULL },
   { "sentinel",     0, 1,  false, true,  true,  handle_sentinel_attribute,
-    false },
+    false, NULL },
   { "noreturn",     0, 0,  true,  false, false, handle_noreturn_attribute,
-    false },
+    false, NULL },
   { "noinline",     0, 0,  true,  false, false, handle_noinline_attribute,
-    false },
+    false, NULL },
   { "noclone",      0, 0,  true,  false, false, handle_noclone_attribute,
-    false },
+    false, NULL },
   { "leaf",         0, 0,  true,  false, false, handle_leaf_attribute,
-    false },
+    false, NULL },
   { "always_inline",0, 0,  true,  false, false, handle_always_inline_attribute,
-    false },
+    false, NULL },
   { "malloc",       0, 0,  true,  false, false, handle_malloc_attribute,
-    false },
+    false, NULL },
   { "type generic", 0, 0,  false, true, true, handle_type_generic_attribute,
-    false },
+    false, NULL },
 
   { "vector_size",  1, 1,  false, true, false,  handle_vector_size_attribute,
-    false },
+    false, NULL },
   { "vector_type",  0, 0,  false, true, false,  handle_vector_type_attribute,
-    false },
-  { "may_alias",    0, 0, false, true, false, NULL, false },
+    false, NULL },
+  { "may_alias",    0, 0, false, true, false, NULL, false, 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_arg", 1, 1,  false, true,  true,  fake_attribute_handler, false },
+  { "format",     3, 3,  false, true,  true,  fake_attribute_handler, false,
+    NULL },
+  { "format_arg", 1, 1,  false, true,  true,  fake_attribute_handler, false,
+    NULL },
 
-  { NULL,         0, 0, false, false, false, NULL, false }
+  { NULL,         0, 0, false, false, false, NULL, false, NULL }
 };
 
diff --git a/gcc/fortran/f95-lang.c b/gcc/fortran/f95-lang.c
index 44bd8dc..ae7207c 100644
--- a/gcc/fortran/f95-lang.c
+++ b/gcc/fortran/f95-lang.c
@@ -92,12 +92,12 @@  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 },
+    gfc_handle_omp_declare_target_attribute, false, NULL },
   { "omp declare target link", 0, 0, true,  false, false,
-    gfc_handle_omp_declare_target_attribute, false },
+    gfc_handle_omp_declare_target_attribute, false, NULL },
   { "oacc function", 0, -1, true,  false, false,
-    gfc_handle_omp_declare_target_attribute, false },
-  { NULL,		  0, 0, false, false, false, NULL, false }
+    gfc_handle_omp_declare_target_attribute, false, NULL },
+  { NULL, 0, 0, false, false, false, NULL, false, NULL }
 };
 
 #undef LANG_HOOKS_NAME
diff --git a/gcc/lto/lto-lang.c b/gcc/lto/lto-lang.c
index 6e9a138..61c02bb 100644
--- a/gcc/lto/lto-lang.c
+++ b/gcc/lto/lto-lang.c
@@ -60,42 +60,42 @@  static tree handle_format_arg_attribute (tree *, tree, tree, int, bool *);
 const struct attribute_spec lto_attribute_table[] =
 {
   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       do_diagnostic } */
+       do_diagnostic, exclusions } */
   { "noreturn",               0, 0, true,  false, false,
-			      handle_noreturn_attribute, false },
+			      handle_noreturn_attribute, false, NULL },
   { "leaf",		      0, 0, true,  false, false,
-			      handle_leaf_attribute, false },
+			      handle_leaf_attribute, false, NULL },
   /* The same comments as for noreturn attributes apply to const ones.  */
   { "const",                  0, 0, true,  false, false,
-			      handle_const_attribute, false },
+			      handle_const_attribute, false, NULL },
   { "malloc",                 0, 0, true,  false, false,
-			      handle_malloc_attribute, false },
+			      handle_malloc_attribute, false, NULL },
   { "pure",                   0, 0, true,  false, false,
-			      handle_pure_attribute, false },
+			      handle_pure_attribute, false, NULL },
   { "no vops",                0, 0, true,  false, false,
-			      handle_novops_attribute, false },
+			      handle_novops_attribute, false, NULL },
   { "nonnull",                0, -1, false, true, true,
-			      handle_nonnull_attribute, false },
+			      handle_nonnull_attribute, false, NULL },
   { "nothrow",                0, 0, true,  false, false,
-			      handle_nothrow_attribute, false },
+			      handle_nothrow_attribute, false, NULL },
   { "patchable_function_entry", 1, 2, true, false, false,
 			      handle_patchable_function_entry_attribute,
-			      false },
+			      false, NULL },
   { "returns_twice",          0, 0, true,  false, false,
-			      handle_returns_twice_attribute, false },
+			      handle_returns_twice_attribute, false, NULL },
   { "sentinel",               0, 1, false, true, true,
-			      handle_sentinel_attribute, false },
+			      handle_sentinel_attribute, false, NULL },
   { "type generic",           0, 0, false, true, true,
-			      handle_type_generic_attribute, false },
+			      handle_type_generic_attribute, false, NULL },
   { "fn spec",	 	      1, 1, false, true, true,
-			      handle_fnspec_attribute, false },
+			      handle_fnspec_attribute, false, NULL },
   { "transaction_pure",	      0, 0, false, true, true,
-			      handle_transaction_pure_attribute, false },
+			      handle_transaction_pure_attribute, false, 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,                     0, 0, false, false, false, NULL, false }
+			      ignore_attribute, false, NULL },
+  { NULL,                     0, 0, false, false, false, NULL, false, NULL }
 };
 
 /* Give the specifications for the format attributes, used by C and all
@@ -104,12 +104,12 @@  const struct attribute_spec lto_attribute_table[] =
 const struct attribute_spec lto_format_attribute_table[] =
 {
   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
-       affects_type_identity } */
+       affects_type_identity, exclusions } */
   { "format",                 3, 3, false, true,  true,
-			      handle_format_attribute, false },
+			      handle_format_attribute, false, NULL },
   { "format_arg",             1, 1, false, true,  true,
-			      handle_format_arg_attribute, false },
-  { NULL,                     0, 0, false, false, false, NULL, false }
+			      handle_format_arg_attribute, false, NULL },
+  { NULL,                     0, 0, false, false, false, NULL, false, NULL }
 };
 
 enum built_in_attribute