From patchwork Tue Aug 23 17:29:57 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Meissner X-Patchwork-Id: 111150 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id EDFC6B6F62 for ; Wed, 24 Aug 2011 03:30:38 +1000 (EST) Received: (qmail 8508 invoked by alias); 23 Aug 2011 17:30:31 -0000 Received: (qmail 8482 invoked by uid 22791); 23 Aug 2011 17:30:24 -0000 X-SWARE-Spam-Status: No, hits=0.3 required=5.0 tests=AWL, BAYES_00, NO_DNS_FOR_FROM, RP_MATCHES_RCVD, URIBL_BLACK X-Spam-Check-By: sourceware.org Received: from e36.co.us.ibm.com (HELO e36.co.us.ibm.com) (32.97.110.154) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 23 Aug 2011 17:30:01 +0000 Received: from d03relay03.boulder.ibm.com (d03relay03.boulder.ibm.com [9.17.195.228]) by e36.co.us.ibm.com (8.14.4/8.13.1) with ESMTP id p7NHNWEF010221 for ; Tue, 23 Aug 2011 11:23:32 -0600 Received: from d03av01.boulder.ibm.com (d03av01.boulder.ibm.com [9.17.195.167]) by d03relay03.boulder.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id p7NHTxCo176770 for ; Tue, 23 Aug 2011 11:30:00 -0600 Received: from d03av01.boulder.ibm.com (loopback [127.0.0.1]) by d03av01.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id p7NHTxVj003317 for ; Tue, 23 Aug 2011 11:29:59 -0600 Received: from hungry-tiger.westford.ibm.com (hungry-tiger.westford.ibm.com [9.33.37.78]) by d03av01.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id p7NHTwqw003282; Tue, 23 Aug 2011 11:29:58 -0600 Received: by hungry-tiger.westford.ibm.com (Postfix, from userid 500) id B12BDF8523; Tue, 23 Aug 2011 13:29:57 -0400 (EDT) Date: Tue, 23 Aug 2011 13:29:57 -0400 From: Michael Meissner To: gcc-patches@gcc.gnu.org, dje.gcc@gmail.com Subject: [PATCH] Add infrastructure to merge standard builtin enums with backend builtins Message-ID: <20110823172957.GA10896@hungry-tiger.westford.ibm.com> Mail-Followup-To: Michael Meissner , gcc-patches@gcc.gnu.org, dje.gcc@gmail.com MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Over the years, it has been a problem for ports like the PowerPC that have more builtins than the standard list. Code that references the built_in_decls and implicit_built_in_decls arrays are supposed to check DECL_BUILT_IN_CLASS being BUILT_IN_NORMAL first, but every so often code doesn't do this check, and it checks random pieces of memory, because the backend builtin function number is greater than the number of machine independent builtins. This patch is an infrastructure patch that lets backends decide to merge their builtin enumerations at the end of the standard set of enumerations. Only the PowerPC port is modified with this patch. If this goes in, the port maintainers for the other ports with a lot of builtins (x86, spu, etc.) can decide whether to move to this new infrastructure. This patch growes the bit field that has the builtin function number by one bit. Strictly speaking for the PowerPC, we don't need it just yet, but it gives us a margin of safety. Right now, there are about 730 machine independent builtins and 950 PowerPC builtins, which gives us a margin of 350 more builtins before the field is full, if I didn't grow the size of the builtin function bitfield. When I was documenting the tm-bu-funcs.def file built by the Makefile, I noticed there was a FIXME comment asking why tm_p.h existed, so I added an explanation. Originally I wanted to allow the MD file to allow all of the builtins to be initialized when the main builtins are setup. This would have fit into the infrastructure, by having MD versions of builtin-attrs.def and builtin-types.def. However, the problem is Fortran doesn't use the C, C++, and LTO common builtin infrastructure, but it does want to initialize the target builtins via the targetm.init_builtins hook. So I decided not to include that support in this patch. These are meant to be committed as a single patch, but I have separated the patches into a machine indendepent patch, and one that moves the PowerPC to use this new infrastructure. I anticipate there will be additional patches in the powerpc builtin area to allow target attributes and pragmas to enable new builtins, but that will be in a later patch. I wanted in this patch to have a fairly minimimal set of changes. I have bootstrapped and done make checks on the PowerPC with no regressions. In addition, I have bootstrapped the x86_64 to make sure it continues to work for a port that wasn't modified. Are these patches ok to commit? [gcc] 2011-08-23 Michael Meissner * doc/configfiles.texi (tm_p.h): Document why tm_p.h is needed. (tm-bu-funcs.def): Document the include file that includes the machine dependent builtin functions. * tree.h (struct tree_function_decl): Grow function code field by 1 bit to allow for machines with lots of builtins. * builtins.def (BUILT_IN_NONE): Reserve builtin index 0 so it is not a legitimate builtin. (DEF_BUILTIN_MD): New macro for defining machine dependent builtins. (toplevel): Include tm-bu-funcs.def. * configure.ac (tm_builtin_funcs): New autoconf variable to merge backend builtins into the main builtin handling. Include rs6000-builtin.def on rs6000. * configure: Regenerate. * config.gcc (rs6000*, powerpc*): Ditto. * Makefile.in (BUILTINS_DEF): Add support for merging machine dependent builtins at the end of the standard builtins. (BUILTIN_FUNCS_MD): Ditto. (c-family/c-common.o): Ditto. (mostlyclean): Ditto. (tm-bu-funcs.def): New header built that includes machine dependent builtins. * config/rs6000/rs6000-protos.h (rs6000_builtin_types): Move here from rs6000.h. Adjust for merging the rs6000 builtins after the standard builtins. (rs6000_builtin_decls): Ditto. * config/rs6000/rs6000-builtin.def (toplevel): Add support for being included in builtins.def to define all rs6000 builtins after the standard builtins. Delete RS6000_BUILTIN_EQUATE. (RS6000_BUILTIN_FIRST): New macros to mark start and end of various classes of builtins. Replace existing overload start and end markers. (ALTIVEC_BUILTIN_FIRST): Ditto. (ALTIVEC_BUILTIN_OVERLOADED_FIRST): Ditto. (ALTIVEC_BUILTIN_OVERLOADED_LAST): Ditto. (ALTIVEC_BUILTIN_LAST): Ditto. (SPE_BUILTIN_FIRST): Ditto. (SPE_BUILTIN_LAST): Ditto. (PAIRED_BUILTIN_FIRST): Ditto. (PAIRED_BUILTIN_LAST): Ditto. (VSX_BUILTIN_FIRST): Ditto. (VSX_BUILTIN_OVERLOADED_FIRST): Ditto. (VSX_BUILTIN_OVERLOADED_LAST): Ditto. (VSX_BUILTIN_LAST): Ditto. (RS6000_BUILTIN_LAST): Ditto. (VECTOR_BUILTIN_*): Move so the builtins are in the Altivec range. * config/rs6000/rs6000-c.c (struct altivec_builtin_types): Adjust for merging the rs6000 builtins after the standard builtins. (altivec_overloaded_builtins): Ditto. * config/rs6000/rs6000.c (rs6000_builtin_decls): Adjust for merging the rs6000 builtins after the standard builtins. (struct builtin_description): Ditto. (builtin_classify): Ditto. (builtin_function_type): Ditto. (rs6000_builtin_decl): Ditto. (enable_mask_for_builtins): Ditto. (rs6000_builtin_vectorized_function): Ditto. (struct builtin_description_predicates): Ditto. (def_builtin): If function is already defined, ignore rather than causing an error. (altivec_expand_builtin): Use OVERLOADED_BUILTIN_P. (altivec_init_builtin): Ditto. (rs6000_init_builtin_types): Split initializing types from the rest of the builtin support. Add initial steps to making rs6000_init_builtins be called more than one. Drop testing for VSX for building basic types, just like occurs for Altivec, SPE, etc. (rs6000_init_builtins): Ditto. (rs6000_common_init_builtins): Ditto. * config/rs6000/rs6000.h (enum rs6000_builtins): Delete, merge rs6000 builtins to the end of the standard builtins. (rs6000_builtin_types): Move to rs6000-protos.h. (rs6000_builtin_decls): Ditto. (ALTIVEC_BUILTIN_P): New macros mapping builtin function index to machine type. (ALTIVEC_BUILTIN_OVERLOADED_P): Ditto. (VSX_BUILTIN_P): Ditto. (VSX_BUILTIN_OVERLOADED_P): Ditto. (OVERLOADED_BUILTIN_P): Ditto. (SPEC_BUILTIN_P): Ditto. (PAIRED_BUILTIN_P): Ditto. (MISC_BUILTIN_P): Ditto. [gcc/lto] 2011-08-19 Michael Meissner * Make-lang.in (lto/lto-lang.o): Adjust dependencies for merging backend builtins into main builtins. Index: gcc/doc/configfiles.texi =================================================================== --- gcc/doc/configfiles.texi (revision 177990) +++ gcc/doc/configfiles.texi (working copy) @@ -60,5 +60,17 @@ machine. @item @file{tm_p.h}, which includes the header @file{@var{machine}-protos.h} that contains prototypes for functions in the target @file{.c} file. -FIXME: why is such a separate header necessary? +The @file{tm_p.h} is needed because the @file{@var{machine}-protos.h} +will often times include declarations that include RTL and TREE +datatypes. These references must be bracketed with @code{#ifdef +RTX_CODE} and @code{#ifdef TREE_CODE} respecitively. These +declarations can't go in the normal @file{@var{machine}.h} file +because that file is included before @file{rtl.h} and/or @file{tree.h} +are included. The @file{tm_p.h} is included after @file{rtl.h} or +@file{tree.h} are included. +@item +@file{tm-bu-funcs.def}, includes the machine dependent builtin +functions that use the @code{DEF_BUILTIN_MD} macro to reserve the +machine dependent builtins in the master builtin enum list after the +standard enumerations. @end itemize Index: gcc/tree.h =================================================================== --- gcc/tree.h (revision 177990) +++ gcc/tree.h (working copy) @@ -3503,7 +3503,7 @@ struct GTY(()) tree_function_decl { DECL_FUNCTION_CODE. Otherwise unused. ??? The bitfield needs to be able to hold all target function codes as well. */ - ENUM_BITFIELD(built_in_function) function_code : 11; + ENUM_BITFIELD(built_in_function) function_code : 12; ENUM_BITFIELD(built_in_class) built_in_class : 2; unsigned static_ctor_flag : 1; @@ -3526,7 +3526,7 @@ struct GTY(()) tree_function_decl { unsigned looping_const_or_pure_flag : 1; unsigned has_debug_args_flag : 1; - /* 2 bits left */ + /* 1 bit left */ }; /* The source language of the translation-unit. */ Index: gcc/configure =================================================================== --- gcc/configure (revision 177990) +++ gcc/configure (working copy) @@ -608,6 +608,7 @@ PPLINC PPLLIBS GMPINC GMPLIBS +tm_builtin_funcs target_cpu_default fortran_target_objs cxx_target_objs @@ -17913,7 +17914,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 17916 "configure" +#line 17917 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -18019,7 +18020,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 18022 "configure" +#line 18023 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -26796,6 +26797,7 @@ fi + # Echo link setup. if test x${build} = x${host} ; then if test x${host} = x${target} ; then Index: gcc/builtins.def =================================================================== --- gcc/builtins.def (revision 177990) +++ gcc/builtins.def (working copy) @@ -134,6 +134,13 @@ along with GCC; see the file COPYING3. DEF_BUILTIN (ENUM, NAME, BUILT_IN_NORMAL, 0, 0, false, false, \ false, 0, false, false) +/* Allocate the enum and the name for a machine dependent builtin, but do not + actually define it here at all. */ +#undef DEF_BUILTIN_MD +#define DEF_BUILTIN_MD(ENUM, NAME) \ + DEF_BUILTIN (ENUM, NAME, BUILT_IN_MD, 0, 0, false, false, \ + false, 0, false, false) + /* Builtin used by the implementation of GNU OpenMP. None of these are actually implemented in the compiler; they're all in libgomp. */ #undef DEF_GOMP_BUILTIN @@ -173,6 +180,10 @@ along with GCC; see the file COPYING3. #undef ATTR_MATHFN_FPROUNDING_STORE #define ATTR_MATHFN_FPROUNDING_STORE ATTR_NOTHROW_LEAF_LIST +/* Avoid problems with fields that are zeroed by making sure index 0 is not a + legitimate builtin. */ +DEF_BUILTIN_STUB (BUILT_IN_NONE, (const char *)0) + /* Category: math builtins. */ DEF_LIB_BUILTIN (BUILT_IN_ACOS, "acos", BT_FN_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO) DEF_C99_C90RES_BUILTIN (BUILT_IN_ACOSF, "acosf", BT_FN_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO) @@ -789,3 +800,6 @@ DEF_BUILTIN_STUB (BUILT_IN_EH_COPY_VALUE /* OpenMP builtins. */ #include "omp-builtins.def" + +/* Target machine builtins. */ +#include "tm-bu-funcs.def" Index: gcc/configure.ac =================================================================== --- gcc/configure.ac (revision 177990) +++ gcc/configure.ac (working copy) @@ -4923,6 +4923,7 @@ AC_SUBST(c_target_objs) AC_SUBST(cxx_target_objs) AC_SUBST(fortran_target_objs) AC_SUBST(target_cpu_default) +AC_SUBST(tm_builtin_funcs) AC_SUBST_FILE(language_hooks) Index: gcc/lto/Make-lang.in =================================================================== --- gcc/lto/Make-lang.in (revision 177990) +++ gcc/lto/Make-lang.in (working copy) @@ -79,7 +79,8 @@ $(LTO_EXE): $(LTO_OBJS) $(BACKEND) $(LIB lto/lto-lang.o: lto/lto-lang.c $(CONFIG_H) coretypes.h debug.h \ flags.h $(GGC_H) langhooks.h $(LANGHOOKS_DEF_H) $(SYSTEM_H) \ $(TARGET_H) $(LTO_H) $(GIMPLE_H) gtype-lto.h gt-lto-lto-lang.h \ - $(EXPR_H) $(LTO_STREAMER_H) + $(EXPR_H) $(LTO_STREAMER_H) builtin-attrs.def builtin-types.def \ + $(BUILTINS_DEF) lto/lto.o: lto/lto.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(OPTS_H) \ toplev.h $(TREE_H) $(TREE_FLOW_H) $(DIAGNOSTIC_CORE_H) $(TM_H) \ $(CGRAPH_H) $(GGC_H) tree-ssa-operands.h $(TREE_PASS_H) \ Index: gcc/config.gcc =================================================================== --- gcc/config.gcc (revision 177990) +++ gcc/config.gcc (working copy) @@ -186,7 +186,10 @@ # configure_default_options # Set to an initializer for configure_default_options # in configargs.h, based on --with-cpu et cetera. - +# +# tm_builtin_funcs Set to additional files in the target directory to +# provide target specific builtin functions. +# # The following variables are used in each case-construct to build up the # outgoing variables: # @@ -238,6 +241,7 @@ default_gnu_indirect_function=no target_gtfiles= need_64bit_hwint= need_64bit_isa= +tm_builtin_funcs= # Don't carry these over build->host->target. Please. xm_file= Index: gcc/Makefile.in =================================================================== --- gcc/Makefile.in (revision 177990) +++ gcc/Makefile.in (working copy) @@ -909,7 +909,9 @@ RTL_H = $(RTL_BASE_H) genrtl.h vecir.h RTL_ERROR_H = $(RTL_H) $(DIAGNOSTIC_CORE_H) READ_MD_H = $(OBSTACK_H) $(HASHTAB_H) read-md.h PARAMS_H = params.h params.def -BUILTINS_DEF = builtins.def sync-builtins.def omp-builtins.def +BUILTIN_FUNCS_MD = @tm_builtin_funcs@ +BUILTINS_DEF = builtins.def sync-builtins.def omp-builtins.def \ + tm-bu-funcs.def $(BUILTIN_FUNCS_MD) INTERNAL_FN_DEF = internal-fn.def INTERNAL_FN_H = internal-fn.h $(INTERNAL_FN_DEF) TREE_H = tree.h all-tree.def tree.def c-family/c-common.def \ @@ -1979,6 +1981,19 @@ $(T)crtbeginT.o: crtstuff.c $(GCC_PASSES $(GCC_FOR_TARGET) $(CRTSTUFF_CFLAGS) $(CRTSTUFF_T_CFLAGS) \ -c $(srcdir)/crtstuff.c -DCRT_BEGIN -DCRTSTUFFT_O \ -o $(T)crtbeginT$(objext) + +# Build the builtin include files that includes the standard builtin file along +# with any machine dependent versions of those files. Note, this files is +# expected to be included multiple times, so don't use mkconfig.sh which adds +# header guards +tm-bu-funcs.def: s-bu-funcs; @true +s-bu-funcs: Makefile + for inc in $(BUILTIN_FUNCS_MD); do \ + echo "#include \"$$inc\""; \ + done > tmp-bu-funcs.def + $(SHELL) $(srcdir)/../move-if-change tmp-bu-funcs.def tm-bu-funcs.def + $(STAMP) s-bu-funcs + # # Compiling object files from source files. @@ -4511,6 +4526,8 @@ mostlyclean: lang.mostlyclean -rm -f gtype.state # Delete genchecksum outputs -rm -f *-checksum.c +# Delete builtin types, attributes, function include files + -rm -f tm-bu-funcs.def # Delete all files made by compilation # that don't exist in the distribution.