+2016-07-20 Georg-Johann Lay <avr@gjlay.de>
+
+ * target.def (addr_space): Add new diagnose_usage to hook vector.
+ * targhooks.c (default_addr_space_diagnose_usage): Add default
+ implementation and...
+ * targhooks.h (default_addr_space_diagnose_usage): ... its prototype.
+ * c/c-parser.c (c_lex_one_token) [CPP_NAME]: If the token
+ is some address space, call targetm.addr_space.diagnose_usage.
+ * doc/tm.texi.in (Named Address Spaces): Add anchor for
+ TARGET_ADDR_SPACE_DIAGNOSE_USAGE documentation.
+ * doc/tm.texi: Regenerate.
+
2016-07-20 Martin Liska <mliska@suse.cz>
PR middle-end/71898
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;
The result is the value to be used with @code{DW_AT_address_class}.
@end deftypefn
+@deftypefn {Target Hook} void 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 should 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.
+The default implementation does nothing.
+@end deftypefn
+
@node Misc
@section Miscellaneous Parameters
@cindex parameters, miscellaneous
@hook TARGET_ADDR_SPACE_DEBUG
+@hook TARGET_ADDR_SPACE_DIAGNOSE_USAGE
+
@node Misc
@section Miscellaneous Parameters
@cindex parameters, miscellaneous
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 should 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\
+The default implementation does nothing.",
+ void, (addr_space_t as, location_t loc),
+ default_addr_space_diagnose_usage)
+
HOOK_VECTOR_END (addr_space)
#undef HOOK_PREFIX
return as;
}
+/* The default hook implementation for TARGET_ADDR_SPACE_DIAGNOSE_USAGE.
+ Don't complain about any address space. */
+
+void
+default_addr_space_diagnose_usage (addr_space_t, location_t)
+{
+}
+
+
/* The default hook for TARGET_ADDR_SPACE_CONVERT. This hook should never be
called for targets with only a generic address space. */
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 void 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);