===================================================================
@@ -3241,6 +3241,21 @@ The result is the value to be used with
int, (addr_space_t as),
default_addr_space_debug)
+/* Function to emit custom diagnostic if an address space is used. */
+DEFHOOK
+(diagnose_usage,
+ "Define this hook if the availability of an address space depends on\n\
+command line options and some diagnostics shall be printed when the\n\
+address space is used. This hook is called during parsing and allows\n\
+to emit a better diagnostic compared to the case where the address space\n\
+was not registered with @code{c_register_addr_space}. @var{as} is\n\
+the address space as registered with @code{c_register_addr_space}.\n\
+@var{loc} is the location of the address space qualifier token.\n\
+Return true if the hook issued an error and false, otherwise.\n\
+The default implementation does nothing.",
+ bool, (addr_space_t as, location_t loc),
+ default_addr_space_diagnose_usage)
+
HOOK_VECTOR_END (addr_space)
#undef HOOK_PREFIX
===================================================================
@@ -1291,6 +1291,14 @@ default_addr_space_debug (addr_space_t a
return as;
}
+bool
+default_addr_space_diagnose_usage (addr_space_t ARG_UNUSED (as),
+ location_t ARG_UNUSED (loc))
+{
+ return false;
+}
+
+
/* The default hook for TARGET_ADDR_SPACE_CONVERT. This hook should never be
called for targets with only a generic address space. */
===================================================================
@@ -181,6 +181,7 @@ extern rtx default_addr_space_legitimize
extern bool default_addr_space_subset_p (addr_space_t, addr_space_t);
extern bool default_addr_space_zero_address_valid (addr_space_t);
extern int default_addr_space_debug (addr_space_t);
+extern bool default_addr_space_diagnose_usage (addr_space_t, location_t);
extern rtx default_addr_space_convert (rtx, tree, tree);
extern unsigned int default_case_values_threshold (void);
extern bool default_have_conditional_execution (void);
===================================================================
@@ -300,6 +300,9 @@ c_lex_one_token (c_parser *parser, c_tok
else if (rid_code >= RID_FIRST_ADDR_SPACE
&& rid_code <= RID_LAST_ADDR_SPACE)
{
+ addr_space_t as;
+ as = (addr_space_t) (rid_code - RID_FIRST_ADDR_SPACE);
+ targetm.addr_space.diagnose_usage (as, token->location);
token->id_kind = C_ID_ADDRSPACE;
token->keyword = rid_code;
break;
===================================================================
@@ -7486,6 +7486,8 @@ c_register_addr_space ("__ea", ADDR_SPAC
@hook TARGET_ADDR_SPACE_DEBUG
+@hook TARGET_ADDR_SPACE_DIAGNOSE_USAGE
+
@node Misc
@section Miscellaneous Parameters
@cindex parameters, miscellaneous
===================================================================
@@ -10431,6 +10431,18 @@ Define this to define how the address sp
The result is the value to be used with @code{DW_AT_address_class}.
@end deftypefn
+@deftypefn {Target Hook} bool TARGET_ADDR_SPACE_DIAGNOSE_USAGE (addr_space_t @var{as}, location_t @var{loc})
+Define this hook if the availability of an address space depends on
+command line options and some diagnostics shall be printed when the
+address space is used. This hook is called during parsing and allows
+to emit a better diagnostic compared to the case where the address space
+was not registered with @code{c_register_addr_space}. @var{as} is
+the address space as registered with @code{c_register_addr_space}.
+@var{loc} is the location of the address space qualifier token.
+Return true if the hook issued an error and false, otherwise.
+The default implementation does nothing.
+@end deftypefn
+
@node Misc
@section Miscellaneous Parameters
@cindex parameters, miscellaneous