Mike Meissner wrote: > On Wed, May 26, 2010 at 10:16:22AM -0700, Mark Mitchell wrote: > > Ulrich Weigand wrote: > > > > >> So the question is: The goal is to have hooks, not macros, right? If > > >> so, can reviewers please take care to reject patches that introduce > > >> new macros? > > > > > > I don't know to which extent this is a formal goal these days, but I > > > personally agree that it would be nice to eliminate macros. > > > > Yes, the (informally agreed) policy is to have hooks, not macros. There > > may be situations where that is technically impossible, but I'd expect > > those to be very rare. > > For the target address space stuff, it is to the __ea keyword. You don't want > a target hook that is called on every identifier, but instead you want a > target > hook that is called in c_parse_init (in c-parser.c) and init_reswords (in > cp/lex.c) to set up the keywords. The target hook would have to duplicate the > functionality of all of the setup that c_parse_init and init_reswords do, > particularly if they have different semantics.
It looks like this may be simpler than I thought. The following patch introduces a "c_register_addr_space" routine that the back-end may call to register a named address space qualifier keyword. (This could be done either statically at start-up, or even dynamically e.g. in respose to a target-specific #pragma.) In the current patch, the SPU back-end uses somewhat of a hack to actually perform that call: it is included in the REGISTER_TARGET_PRAGMAS macro. Note that this macro is already being used by the SPU and several other back-end for similar hacks. It seems that it might be a good idea to replace this by something like a "register_target_extensions" callback in targetcm, but that can probably be done in a separate patch. The patch below passes all the "__ea" related tests on SPU; a full test suite run is ongoing. OK if it passes? Bye, Ulrich ChangeLog: * c-common.h (c_register_addr_space): Add prototype. (ADDR_SPACE_KEYWORD): Remove. * c-common.c (c_register_addr_space): New function. (c_addr_space_name): Reimplement. (c_common_reswords): Do not include TARGET_ADDR_SPACE_KEYWORDS. * config/spu/spu.h (TARGET_ADDR_SPACE_KEYWORDS): Remove. (REGISTER_TARGET_PRAGMAS): Call c_register_addr_space. * doc/tm.texi (Named Address Spaces): Mention c_register_addr_space. Remove TARGET_ADDR_SPACE_KEYWORDS. Index: gcc/doc/tm.texi =================================================================== *** gcc/doc/tm.texi (revision 159889) --- gcc/doc/tm.texi (working copy) *************** Internally, address spaces are represent *** 9966,9982 **** range 0 to 15 with address space 0 being reserved for the generic address space. ! @defmac TARGET_ADDR_SPACE_KEYWORDS ! A list of @code{ADDR_SPACE_KEYWORD} macros to define each named ! address keyword. The @code{ADDR_SPACE_KEYWORD} macro takes two ! arguments, the keyword string and the number of the named address ! space. For example, the SPU port uses the following to declare ! @code{__ea} as the keyword for named address space #1: @smallexample #define ADDR_SPACE_EA 1 ! #define TARGET_ADDR_SPACE_KEYWORDS ADDR_SPACE_KEYWORD ("__ea", ADDR_SPACE_EA) @end smallexample - @end defmac @deftypefn {Target Hook} {enum machine_mode} TARGET_ADDR_SPACE_POINTER_MODE (addr_space_t @var{address_space}) Define this to return the machine mode to use for pointers to --- 9966,9979 ---- range 0 to 15 with address space 0 being reserved for the generic address space. ! To register a named address space qualifier keyword with the C front end, ! the target may call the @code{c_register_addr_space} routine. For example, ! the SPU port uses the following to declare @code{__ea} as the keyword for ! named address space #1: @smallexample #define ADDR_SPACE_EA 1 ! c_register_addr_space ("__ea", ADDR_SPACE_EA); @end smallexample @deftypefn {Target Hook} {enum machine_mode} TARGET_ADDR_SPACE_POINTER_MODE (addr_space_t @var{address_space}) Define this to return the machine mode to use for pointers to Index: gcc/c-common.c =================================================================== *** gcc/c-common.c (revision 159889) --- gcc/c-common.c (working copy) *************** const struct c_common_resword c_common_r *** 718,728 **** { "inout", RID_INOUT, D_OBJC }, { "oneway", RID_ONEWAY, D_OBJC }, { "out", RID_OUT, D_OBJC }, - - #ifdef TARGET_ADDR_SPACE_KEYWORDS - /* Any address space keywords recognized by the target. */ - TARGET_ADDR_SPACE_KEYWORDS, - #endif }; const unsigned int num_c_common_reswords = --- 718,723 ---- *************** const struct attribute_spec c_common_for *** 857,873 **** { NULL, 0, 0, false, false, false, NULL } }; /* Return identifier for address space AS. */ const char * c_addr_space_name (addr_space_t as) { ! unsigned int i; ! ! for (i = 0; i < num_c_common_reswords; i++) ! if (c_common_reswords[i].rid == RID_FIRST_ADDR_SPACE + as) ! return c_common_reswords[i].word; ! ! gcc_unreachable (); } /* Push current bindings for the function name VAR_DECLS. */ --- 852,885 ---- { NULL, 0, 0, false, false, false, NULL } }; + + /* Register reserved keyword WORD as qualifier for address space AS. */ + + void + c_register_addr_space (const char *word, addr_space_t as) + { + int rid = RID_FIRST_ADDR_SPACE + as; + tree id; + + /* Address space qualifiers are only supported + in C with GNU extensions enabled. */ + if (c_dialect_cxx () || c_dialect_objc () || flag_no_asm) + return; + + id = get_identifier (word); + C_SET_RID_CODE (id, rid); + C_IS_RESERVED_WORD (id) = 1; + ridpointers [rid] = id; + } + /* Return identifier for address space AS. */ + const char * c_addr_space_name (addr_space_t as) { ! int rid = RID_FIRST_ADDR_SPACE + as; ! gcc_assert (ridpointers [rid]); ! return IDENTIFIER_POINTER (ridpointers [rid]); } /* Push current bindings for the function name VAR_DECLS. */ Index: gcc/c-common.h =================================================================== *** gcc/c-common.h (revision 159889) --- gcc/c-common.h (working copy) *************** struct c_common_resword *** 288,297 **** #define D_CXX_OBJC 0x100 /* In Objective C, and C++, but not C. */ #define D_CXXWARN 0x200 /* In C warn with -Wcxx-compat. */ - /* Macro for backends to define named address keywords. */ - #define ADDR_SPACE_KEYWORD(STRING, VALUE) \ - { STRING, RID_FIRST_ADDR_SPACE + (VALUE), D_CONLY | D_EXT } - /* The reserved keyword table. */ extern const struct c_common_resword c_common_reswords[]; --- 288,293 ---- *************** extern const struct attribute_spec c_com *** 803,808 **** --- 799,805 ---- extern tree (*make_fname_decl) (location_t, tree, int); + extern void c_register_addr_space (const char *str, addr_space_t as); extern const char *c_addr_space_name (addr_space_t as); extern tree identifier_global_value (tree); extern void record_builtin_type (enum rid, const char *, tree); Index: gcc/config/spu/spu.h =================================================================== *** gcc/config/spu/spu.h (revision 159889) --- gcc/config/spu/spu.h (working copy) *************** enum reg_class { *** 245,250 **** --- 245,251 ---- && GET_MODE_SIZE (FROM) != GET_MODE_SIZE (TO)) #define REGISTER_TARGET_PRAGMAS() do { \ + c_register_addr_space ("__ea", ADDR_SPACE_EA); \ targetm.resolve_overloaded_builtin = spu_resolve_overloaded_builtin; \ }while (0); *************** targetm.resolve_overloaded_builtin = spu *** 608,616 **** /* Address spaces. */ #define ADDR_SPACE_EA 1 - /* Named address space keywords. */ - #define TARGET_ADDR_SPACE_KEYWORDS ADDR_SPACE_KEYWORD ("__ea", ADDR_SPACE_EA) - /* Builtins. */ --- 609,614 ---- -- Dr. Ulrich Weigand GNU Toolchain for Linux on System z and Cell BE ulrich.weig...@de.ibm.com