On 18.07.2016 16:13, Bernd Schmidt wrote:
On 07/14/2016 05:11 PM, Georg-Johann Lay wrote:
The hook allows better diagnostics:  The address spaces are registered
with c_register_addr_space and if the parser comes across an address
space it provides the hook with the needed information, in particular
the location of the token so that the message would be something like

Looks reasonable, except...

+(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\

"should", not "shall", I think.

Fixed.

+bool
+default_addr_space_diagnose_usage (addr_space_t ARG_UNUSED (as),
+                   location_t ARG_UNUSED (loc))
+{
+  return false;
+}

The return value is not used, so it should return void. That would also match
the documentation you added (which says "does nothing" rather than "returns
false").

Fixed, the hook returns void now.

The idea was that in a future version the c-parser might take decision depending on whether an error has been issued.

Remove unused arg names in default hook implementations, I think.


Bernd



Done. Attached is the updated version of the change, log entry is the same as before.

Johann


gcc/
        * 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.

Index: c/c-parser.c
===================================================================
--- c/c-parser.c	(revision 238425)
+++ c/c-parser.c	(working copy)
@@ -301,6 +301,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;
Index: doc/tm.texi
===================================================================
--- doc/tm.texi	(revision 238425)
+++ doc/tm.texi	(working copy)
@@ -10431,6 +10431,17 @@ 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} 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
Index: doc/tm.texi.in
===================================================================
--- doc/tm.texi.in	(revision 238425)
+++ doc/tm.texi.in	(working copy)
@@ -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
Index: target.def
===================================================================
--- target.def	(revision 238425)
+++ target.def	(working copy)
@@ -3241,6 +3241,20 @@ 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 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
Index: targhooks.c
===================================================================
--- targhooks.c	(revision 238425)
+++ targhooks.c	(working copy)
@@ -1291,6 +1291,15 @@ default_addr_space_debug (addr_space_t a
   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.  */
 
Index: targhooks.h
===================================================================
--- targhooks.h	(revision 238425)
+++ targhooks.h	(working copy)
@@ -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 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);

Reply via email to