target.def (addr_space): Add new diagnose_usage to hook vector.
authorGeorg-Johann Lay <avr@gjlay.de>
Wed, 20 Jul 2016 13:07:43 +0000 (13:07 +0000)
committerGeorg-Johann Lay <gjl@gcc.gnu.org>
Wed, 20 Jul 2016 13:07:43 +0000 (13:07 +0000)
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.

From-SVN: r238514

gcc/ChangeLog
gcc/c/c-parser.c
gcc/doc/tm.texi
gcc/doc/tm.texi.in
gcc/target.def
gcc/targhooks.c
gcc/targhooks.h

index 32e90ce66cd94abc3ecb89a75e393f5556f48ac5..8cafd56b5b26ddcd705308a84b72fb8eef845371 100644 (file)
@@ -1,3 +1,15 @@
+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
index ef585fb99906160e0ada504fb10540a7156b3584..45e32ba49d4fdd7bfe9576b97eff0adfeecdb34b 100644 (file)
@@ -301,6 +301,9 @@ c_lex_one_token (c_parser *parser, c_token *token)
            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 b318615b7b35ab93ad13e5e535a1d4e6d02cb7f7..160ced1d284526c031e930e8c4d2c694756ffeca 100644 (file)
@@ -10431,6 +10431,17 @@ Define this to define how the address space is encoded in dwarf.
 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 1e8423cb4e255acd8144e4b105186cee3d1d04fd..6a114961e2732b467c555ba54c510df40a38dee1 100644 (file)
@@ -7486,6 +7486,8 @@ c_register_addr_space ("__ea", ADDR_SPACE_EA);
 
 @hook TARGET_ADDR_SPACE_DEBUG
 
+@hook TARGET_ADDR_SPACE_DIAGNOSE_USAGE
+
 @node Misc
 @section Miscellaneous Parameters
 @cindex parameters, miscellaneous
index a4df363698ce776b51d11c187baed2069ba88a52..4a849227de46773863637819f18f7a0de5197a82 100644 (file)
@@ -3241,6 +3241,20 @@ The result is the value to be used with @code{DW_AT_address_class}.",
  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 3e089e759ce9414eb3ed44aa855b38d9fb17ba07..65055b4b443ca744ad59aca7f4b599d463e50dbd 100644 (file)
@@ -1291,6 +1291,15 @@ default_addr_space_debug (addr_space_t as)
   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 d6581cfab893e0da619c6bc0f98ff722a7ab4404..bcec7a3027e9bfef9af74f7a0037a783fabd31da 100644 (file)
@@ -181,6 +181,7 @@ extern rtx default_addr_space_legitimize_address (rtx, rtx, machine_mode,
 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);