diff options
author | Bernd Schmidt <bernds@codesourcery.com> | 2011-05-25 12:11:42 +0000 |
---|---|---|
committer | Bernd Schmidt <bernds@gcc.gnu.org> | 2011-05-25 12:11:42 +0000 |
commit | cdbf45414aecd8ec143a0f2634ba7c53b11053ca (patch) | |
tree | 76324632de5089be2fc6b436d8ac4682fc89b374 /gcc | |
parent | f242c0a5c0415bda56f33a13ef65e962ac995797 (diff) | |
download | gcc-cdbf45414aecd8ec143a0f2634ba7c53b11053ca.zip gcc-cdbf45414aecd8ec143a0f2634ba7c53b11053ca.tar.gz gcc-cdbf45414aecd8ec143a0f2634ba7c53b11053ca.tar.bz2 |
libgcc2.h (__NW, __NDW): Define using a __gnu_ prefix if LIBGCC2_GNU_PREFIX is defined.
gcc/
* libgcc2.h (__NW, __NDW): Define using a __gnu_ prefix if
LIBGCC2_GNU_PREFIX is defined.
(__N): New macro.
(__powisf2, __powidf2, __powitf2, __powixf2, __bswapsi2, __bswapdi2,
__mulsc3, __muldc3, __mulxc3, __multc3, __divsc3, __divdc3, __divxc3,
__divtc3, __udiv_w_sdiv, __clear_cache, __enable_execute_stack,
__clz_tab): Define using __N.
(__absvsi2, __negvsi2, __addvsi3, __subvsi3, __mulvsi3): Likewise if
COMPAT_SIMODE_TRAPPING_ARITHMETIC.
* target.def (libfunc_gnu_prefix): New hook.
* doc/tm.texi.in (LIBGCC2_GNU_PREFIX): Document.
(TARGET_LIBFUNC_GNU_PREFIX): Add hook.
* doc/tm.texi: Regenerate.
* system.h (LIBGCC2_GNU_PREFIX): Poison.
* optabs.c (gen_libfunc): Take the libfunc_gnu_prefix hook into
account.
(gen_interclass_conv_libfunc, gen_intraclass_conv_libfunc): Likewise.
(init_optabs): Likewise for the bswap libfuncs.
* tree.c (build_common_builtin_nodes): Likewise for complex multiply
and divide.
* config/t-slibgcc-elf-ver (SHLIB_MAPFILES): Use $$(libgcc_objdir).
* config/t-slibgcc-sld (SHLIB_MAPFILES): Likewise.
* libgcc-std.ver: Remove.
* Makefile.in (srcdirify): Handle $$(libgcc_objdir).
* config/frv/t-linux (SHLIB_MAPFILES): Use $$(libgcc_objdir) for
libgcc-std.ver.
* config/i386/t-linux (SHLIB_MAPFILES): Likewise.
* config/mips/t-slibgcc-irix (SHLIB_MAPFILES): Likewise.
* config/rs6000/t-aix43 (SHLIB_MAPFILES): Likewise.
* config/rs6000/t-aix52 (SHLIB_MAPFILES): Likewise.
* config/sparc/t-linux (SHLIB_MAPFILES): Likewise.
* config/i386/t-linux (SHLIB_MAPFILES): Likewise.
* config/i386/t-linux (SHLIB_MAPFILES): Likewise.
* config/fixed-bit.h (FIXED_OP): Define differently depending on
LIBGCC2_GNU_PREFIX. All uses changed not to pass leading underscores.
(FIXED_CONVERT_OP, FIXED_CONVERT_OP2): Likewise.
libgcc/
* libgcc-std.ver.in: New file.
* Makefile.in (LIBGCC_VER_GNU_PREFIX, LIBGCC_VER_SYMBOLS_PREFIX): New
variables.
(libgcc-std.ver): New rule.
* config/t-gnu-prefix: New file.
From-SVN: r174187
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 39 | ||||
-rw-r--r-- | gcc/Makefile.in | 5 | ||||
-rw-r--r-- | gcc/config/fixed-bit.h | 83 | ||||
-rw-r--r-- | gcc/config/frv/t-linux | 2 | ||||
-rw-r--r-- | gcc/config/i386/t-cygming | 2 | ||||
-rw-r--r-- | gcc/config/i386/t-linux | 2 | ||||
-rw-r--r-- | gcc/config/mips/t-slibgcc-irix | 2 | ||||
-rw-r--r-- | gcc/config/rs6000/t-aix43 | 2 | ||||
-rw-r--r-- | gcc/config/rs6000/t-aix52 | 2 | ||||
-rw-r--r-- | gcc/config/sparc/t-linux | 2 | ||||
-rw-r--r-- | gcc/config/t-slibgcc-elf-ver | 2 | ||||
-rw-r--r-- | gcc/config/t-slibgcc-sld | 2 | ||||
-rw-r--r-- | gcc/doc/tm.texi | 18 | ||||
-rw-r--r-- | gcc/doc/tm.texi.in | 11 | ||||
-rw-r--r-- | gcc/libgcc2.h | 50 | ||||
-rw-r--r-- | gcc/optabs.c | 50 | ||||
-rw-r--r-- | gcc/system.h | 4 | ||||
-rw-r--r-- | gcc/target.def | 11 | ||||
-rw-r--r-- | gcc/tree.c | 16 |
19 files changed, 244 insertions, 61 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1143fae..03f6792 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,42 @@ +2011-05-25 Bernd Schmidt <bernds@codesourcery.com> + + * libgcc2.h (__NW, __NDW): Define using a __gnu_ prefix if + LIBGCC2_GNU_PREFIX is defined. + (__N): New macro. + (__powisf2, __powidf2, __powitf2, __powixf2, __bswapsi2, __bswapdi2, + __mulsc3, __muldc3, __mulxc3, __multc3, __divsc3, __divdc3, __divxc3, + __divtc3, __udiv_w_sdiv, __clear_cache, __enable_execute_stack, + __clz_tab): Define using __N. + (__absvsi2, __negvsi2, __addvsi3, __subvsi3, __mulvsi3): Likewise if + COMPAT_SIMODE_TRAPPING_ARITHMETIC. + * target.def (libfunc_gnu_prefix): New hook. + * doc/tm.texi.in (LIBGCC2_GNU_PREFIX): Document. + (TARGET_LIBFUNC_GNU_PREFIX): Add hook. + * doc/tm.texi: Regenerate. + * system.h (LIBGCC2_GNU_PREFIX): Poison. + * optabs.c (gen_libfunc): Take the libfunc_gnu_prefix hook into + account. + (gen_interclass_conv_libfunc, gen_intraclass_conv_libfunc): Likewise. + (init_optabs): Likewise for the bswap libfuncs. + * tree.c (build_common_builtin_nodes): Likewise for complex multiply + and divide. + * config/t-slibgcc-elf-ver (SHLIB_MAPFILES): Use $$(libgcc_objdir). + * config/t-slibgcc-sld (SHLIB_MAPFILES): Likewise. + * libgcc-std.ver: Remove. + * Makefile.in (srcdirify): Handle $$(libgcc_objdir). + * config/frv/t-linux (SHLIB_MAPFILES): Use $$(libgcc_objdir) for + libgcc-std.ver. + * config/i386/t-linux (SHLIB_MAPFILES): Likewise. + * config/mips/t-slibgcc-irix (SHLIB_MAPFILES): Likewise. + * config/rs6000/t-aix43 (SHLIB_MAPFILES): Likewise. + * config/rs6000/t-aix52 (SHLIB_MAPFILES): Likewise. + * config/sparc/t-linux (SHLIB_MAPFILES): Likewise. + * config/i386/t-linux (SHLIB_MAPFILES): Likewise. + * config/i386/t-linux (SHLIB_MAPFILES): Likewise. + * config/fixed-bit.h (FIXED_OP): Define differently depending on + LIBGCC2_GNU_PREFIX. All uses changed not to pass leading underscores. + (FIXED_CONVERT_OP, FIXED_CONVERT_OP2): Likewise. + 2011-05-25 Jan Hubicka <jh@suse.cz> * lto-streamer-out.c (output_record_start): Use lto_output_enum diff --git a/gcc/Makefile.in b/gcc/Makefile.in index 2aee948..06a4ebc 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -1898,7 +1898,10 @@ LIB2ADD_ST = $(LIB2FUNCS_STATIC_EXTRA) # which case they will start with $(srcdir)), or generated into the build # directory (in which case they will be relative paths). srcdirify = $(patsubst $(srcdir)%,$$(gcc_srcdir)%,$(filter $(srcdir)%,$(1))) \ - $(patsubst %,$$(gcc_objdir)/%,$(filter-out $(srcdir)%,$(1))) + $(patsubst $$(libgcc_objdir)/%,%, \ + $(filter $$(libgcc_objdir)%,$(1))) \ + $(patsubst %,$$(gcc_objdir)/%, \ + $(filter-out $(srcdir)% $$(libgcc_objdir)%,$(1))) # The distinction between these two variables is no longer relevant, # so we combine them. Sort removes duplicates. diff --git a/gcc/config/fixed-bit.h b/gcc/config/fixed-bit.h index 562772d..620742c 100644 --- a/gcc/config/fixed-bit.h +++ b/gcc/config/fixed-bit.h @@ -445,35 +445,39 @@ typedef union #define IBITS IBITS2(MODE_NAME) #define I_F_BITS (FBITS + IBITS) -#define FIXED_OP(OP,MODE,NUM) OP ## MODE ## NUM - -#define FIXED_SATURATE1_TEMP(NAME) FIXED_OP(__saturate1,NAME,) -#define FIXED_SATURATE2_TEMP(NAME) FIXED_OP(__saturate2,NAME,) -#define FIXED_MULHELPER_TEMP(NAME) FIXED_OP(__mulhelper,NAME,) -#define FIXED_DIVHELPER_TEMP(NAME) FIXED_OP(__divhelper,NAME,) -#define FIXED_ASHLHELPER_TEMP(NAME) FIXED_OP(__ashlhelper,NAME,) -#define FIXED_ADD_TEMP(NAME) FIXED_OP(__add,NAME,3) -#define FIXED_SSADD_TEMP(NAME) FIXED_OP(__ssadd,NAME,3) -#define FIXED_USADD_TEMP(NAME) FIXED_OP(__usadd,NAME,3) -#define FIXED_SUB_TEMP(NAME) FIXED_OP(__sub,NAME,3) -#define FIXED_SSSUB_TEMP(NAME) FIXED_OP(__sssub,NAME,3) -#define FIXED_USSUB_TEMP(NAME) FIXED_OP(__ussub,NAME,3) -#define FIXED_MUL_TEMP(NAME) FIXED_OP(__mul,NAME,3) -#define FIXED_SSMUL_TEMP(NAME) FIXED_OP(__ssmul,NAME,3) -#define FIXED_USMUL_TEMP(NAME) FIXED_OP(__usmul,NAME,3) -#define FIXED_DIV_TEMP(NAME) FIXED_OP(__div,NAME,3) -#define FIXED_UDIV_TEMP(NAME) FIXED_OP(__udiv,NAME,3) -#define FIXED_SSDIV_TEMP(NAME) FIXED_OP(__ssdiv,NAME,3) -#define FIXED_USDIV_TEMP(NAME) FIXED_OP(__usdiv,NAME,3) -#define FIXED_NEG_TEMP(NAME) FIXED_OP(__neg,NAME,2) -#define FIXED_SSNEG_TEMP(NAME) FIXED_OP(__ssneg,NAME,2) -#define FIXED_USNEG_TEMP(NAME) FIXED_OP(__usneg,NAME,2) -#define FIXED_ASHL_TEMP(NAME) FIXED_OP(__ashl,NAME,3) -#define FIXED_ASHR_TEMP(NAME) FIXED_OP(__ashr,NAME,3) -#define FIXED_LSHR_TEMP(NAME) FIXED_OP(__lshr,NAME,3) -#define FIXED_SSASHL_TEMP(NAME) FIXED_OP(__ssashl,NAME,3) -#define FIXED_USASHL_TEMP(NAME) FIXED_OP(__usashl,NAME,3) -#define FIXED_CMP_TEMP(NAME) FIXED_OP(__cmp,NAME,2) +#ifdef LIBGCC2_GNU_PREFIX +#define FIXED_OP(OP,MODE,NUM) __gnu_ ## OP ## MODE ## NUM +#else +#define FIXED_OP(OP,MODE,NUM) __ ## OP ## MODE ## NUM +#endif + +#define FIXED_SATURATE1_TEMP(NAME) FIXED_OP(saturate1,NAME,) +#define FIXED_SATURATE2_TEMP(NAME) FIXED_OP(saturate2,NAME,) +#define FIXED_MULHELPER_TEMP(NAME) FIXED_OP(mulhelper,NAME,) +#define FIXED_DIVHELPER_TEMP(NAME) FIXED_OP(divhelper,NAME,) +#define FIXED_ASHLHELPER_TEMP(NAME) FIXED_OP(ashlhelper,NAME,) +#define FIXED_ADD_TEMP(NAME) FIXED_OP(add,NAME,3) +#define FIXED_SSADD_TEMP(NAME) FIXED_OP(ssadd,NAME,3) +#define FIXED_USADD_TEMP(NAME) FIXED_OP(usadd,NAME,3) +#define FIXED_SUB_TEMP(NAME) FIXED_OP(sub,NAME,3) +#define FIXED_SSSUB_TEMP(NAME) FIXED_OP(sssub,NAME,3) +#define FIXED_USSUB_TEMP(NAME) FIXED_OP(ussub,NAME,3) +#define FIXED_MUL_TEMP(NAME) FIXED_OP(mul,NAME,3) +#define FIXED_SSMUL_TEMP(NAME) FIXED_OP(ssmul,NAME,3) +#define FIXED_USMUL_TEMP(NAME) FIXED_OP(usmul,NAME,3) +#define FIXED_DIV_TEMP(NAME) FIXED_OP(div,NAME,3) +#define FIXED_UDIV_TEMP(NAME) FIXED_OP(udiv,NAME,3) +#define FIXED_SSDIV_TEMP(NAME) FIXED_OP(ssdiv,NAME,3) +#define FIXED_USDIV_TEMP(NAME) FIXED_OP(usdiv,NAME,3) +#define FIXED_NEG_TEMP(NAME) FIXED_OP(neg,NAME,2) +#define FIXED_SSNEG_TEMP(NAME) FIXED_OP(ssneg,NAME,2) +#define FIXED_USNEG_TEMP(NAME) FIXED_OP(usneg,NAME,2) +#define FIXED_ASHL_TEMP(NAME) FIXED_OP(ashl,NAME,3) +#define FIXED_ASHR_TEMP(NAME) FIXED_OP(ashr,NAME,3) +#define FIXED_LSHR_TEMP(NAME) FIXED_OP(lshr,NAME,3) +#define FIXED_SSASHL_TEMP(NAME) FIXED_OP(ssashl,NAME,3) +#define FIXED_USASHL_TEMP(NAME) FIXED_OP(usashl,NAME,3) +#define FIXED_CMP_TEMP(NAME) FIXED_OP(cmp,NAME,2) #if defined (MODE_NAME) #if defined (DINT_C_TYPE) @@ -1146,14 +1150,19 @@ extern FIXED_C_TYPE FIXED_USASHL (FIXED_C_TYPE, word_type); #define TO_HAVE_PADDING_BITS (TO_PADDING_BITS > 0) #endif /* TO_TYPE == 4 */ -#define FIXED_CONVERT_OP(OP,FROM,TO) OP ## FROM ## TO -#define FIXED_CONVERT_OP2(OP,FROM,TO) OP ## FROM ## TO ## 2 -#define FRACT_TEMP(N1,N2) FIXED_CONVERT_OP(__fract,N1,N2) -#define FRACT2_TEMP(N1,N2) FIXED_CONVERT_OP2(__fract,N1,N2) -#define SATFRACT_TEMP(N1,N2) FIXED_CONVERT_OP(__satfract,N1,N2) -#define SATFRACT2_TEMP(N1,N2) FIXED_CONVERT_OP2(__satfract,N1,N2) -#define FRACTUNS_TEMP(N1,N2) FIXED_CONVERT_OP(__fractuns,N1,N2) -#define SATFRACTUNS_TEMP(N1,N2) FIXED_CONVERT_OP(__satfractuns,N1,N2) +#ifdef LIBGCC2_GNU_PREFIX +#define FIXED_CONVERT_OP(OP,FROM,TO) __gnu_ ## OP ## FROM ## TO +#define FIXED_CONVERT_OP2(OP,FROM,TO) __gnu_ ## OP ## FROM ## TO ## 2 +#else +#define FIXED_CONVERT_OP(OP,FROM,TO) __ ## OP ## FROM ## TO +#define FIXED_CONVERT_OP2(OP,FROM,TO) __ ## OP ## FROM ## TO ## 2 +#endif +#define FRACT_TEMP(N1,N2) FIXED_CONVERT_OP(fract,N1,N2) +#define FRACT2_TEMP(N1,N2) FIXED_CONVERT_OP2(fract,N1,N2) +#define SATFRACT_TEMP(N1,N2) FIXED_CONVERT_OP(satfract,N1,N2) +#define SATFRACT2_TEMP(N1,N2) FIXED_CONVERT_OP2(satfract,N1,N2) +#define FRACTUNS_TEMP(N1,N2) FIXED_CONVERT_OP(fractuns,N1,N2) +#define SATFRACTUNS_TEMP(N1,N2) FIXED_CONVERT_OP(satfractuns,N1,N2) /* Define conversions from fixed-point to fixed-point. */ #if FROM_TYPE == 4 && TO_TYPE == 4 diff --git a/gcc/config/frv/t-linux b/gcc/config/frv/t-linux index 13eb536..5b09451 100644 --- a/gcc/config/frv/t-linux +++ b/gcc/config/frv/t-linux @@ -29,5 +29,5 @@ EXTRA_MULTILIB_PARTS = CRTSTUFF_T_CFLAGS = -fPIC TARGET_LIBGCC2_CFLAGS = -fPIC -SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver \ +SHLIB_MAPFILES = $$(libgcc_objdir)/libgcc-std.ver \ $(srcdir)/config/frv/libgcc-frv.ver diff --git a/gcc/config/i386/t-cygming b/gcc/config/i386/t-cygming index c4807a0..af2c9e4 100644 --- a/gcc/config/i386/t-cygming +++ b/gcc/config/i386/t-cygming @@ -113,4 +113,4 @@ SHLIB_MKMAP = $(srcdir)/mkmap-flat.awk # We'd like to use SHLIB_SONAME here too, but shlib_base_name # does not get substituted before mkmap-flat.awk is run. SHLIB_MKMAP_OPTS = -v pe_dll=libgcc_s_$(EH_MODEL)-$(SHLIB_SOVERSION)$(SHLIB_EXT) -SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver +SHLIB_MAPFILES = $$(libgcc_objdir)/libgcc-std.ver diff --git a/gcc/config/i386/t-linux b/gcc/config/i386/t-linux index 4c6bb51..500d932 100644 --- a/gcc/config/i386/t-linux +++ b/gcc/config/i386/t-linux @@ -1,5 +1,5 @@ # On 64bit we do not need any exports for glibc for 64-bit libgcc_s. # Need to support TImode for x86. Override the settings from # t-slibgcc-elf-ver and t-linux -SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver \ +SHLIB_MAPFILES = $$(libgcc_objdir)/libgcc-std.ver \ $(srcdir)/config/i386/libgcc-glibc.ver diff --git a/gcc/config/mips/t-slibgcc-irix b/gcc/config/mips/t-slibgcc-irix index 6227cce..e9f168e 100644 --- a/gcc/config/mips/t-slibgcc-irix +++ b/gcc/config/mips/t-slibgcc-irix @@ -49,4 +49,4 @@ SHLIB_INSTALL = \ $(LN_S) $(SHLIB_SONAME) \ $$(DESTDIR)$$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_SOLINK) SHLIB_MKMAP = $(srcdir)/mkmap-flat.awk -SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver +SHLIB_MAPFILES = $$(libgcc_objdir)/libgcc-std.ver diff --git a/gcc/config/rs6000/t-aix43 b/gcc/config/rs6000/t-aix43 index 3cac73b..705e053 100644 --- a/gcc/config/rs6000/t-aix43 +++ b/gcc/config/rs6000/t-aix43 @@ -82,7 +82,7 @@ SHLIB_INSTALL = \ $$(DESTDIR)$$(slibdir)@shlib_slibdir_qual@/ SHLIB_LIBS = -lc `case @multilib_dir@ in *pthread*) echo -lpthread ;; esac` SHLIB_MKMAP = $(srcdir)/mkmap-flat.awk -SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver $(srcdir)/config/rs6000/libgcc-ppc64.ver +SHLIB_MAPFILES = $$(libgcc_objdir)/libgcc-std.ver $(srcdir)/config/rs6000/libgcc-ppc64.ver SHLIB_NM_FLAGS = -Bpg -X32_64 # GCC 128-bit long double support routines. diff --git a/gcc/config/rs6000/t-aix52 b/gcc/config/rs6000/t-aix52 index 0b45402..e918a2e 100644 --- a/gcc/config/rs6000/t-aix52 +++ b/gcc/config/rs6000/t-aix52 @@ -63,7 +63,7 @@ SHLIB_INSTALL = \ $$(DESTDIR)$$(slibdir)@shlib_slibdir_qual@/ SHLIB_LIBS = -lc `case @multilib_dir@ in *pthread*) echo -lpthread ;; esac` SHLIB_MKMAP = $(srcdir)/mkmap-flat.awk -SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver $(srcdir)/config/rs6000/libgcc-ppc64.ver +SHLIB_MAPFILES = $$(libgcc_objdir)/libgcc-std.ver $(srcdir)/config/rs6000/libgcc-ppc64.ver SHLIB_NM_FLAGS = -Bpg -X32_64 # GCC 128-bit long double support routines. diff --git a/gcc/config/sparc/t-linux b/gcc/config/sparc/t-linux index a3e5130..30daa37 100644 --- a/gcc/config/sparc/t-linux +++ b/gcc/config/sparc/t-linux @@ -1,5 +1,5 @@ # Override t-slibgcc-elf-ver to export some libgcc symbols with # the symbol versions that glibc used. # Avoid the t-linux version file. -SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver \ +SHLIB_MAPFILES = $$(libgcc_objdir)/libgcc-std.ver \ $(srcdir)/config/sparc/libgcc-sparc-glibc.ver diff --git a/gcc/config/t-slibgcc-elf-ver b/gcc/config/t-slibgcc-elf-ver index d5ef9ca..b90f4fc 100644 --- a/gcc/config/t-slibgcc-elf-ver +++ b/gcc/config/t-slibgcc-elf-ver @@ -53,4 +53,4 @@ SHLIB_INSTALL = \ rm -f $$(DESTDIR)$$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_SOLINK); \ $(SHLIB_INSTALL_SOLINK) SHLIB_MKMAP = $(srcdir)/mkmap-symver.awk -SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver +SHLIB_MAPFILES = $$(libgcc_objdir)/libgcc-std.ver diff --git a/gcc/config/t-slibgcc-sld b/gcc/config/t-slibgcc-sld index 3a343f5..013a0d7 100644 --- a/gcc/config/t-slibgcc-sld +++ b/gcc/config/t-slibgcc-sld @@ -47,4 +47,4 @@ SHLIB_INSTALL = \ $(LN_S) $(SHLIB_SONAME) \ $$(DESTDIR)$$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_SOLINK) SHLIB_MKMAP = $(srcdir)/mkmap-symver.awk -SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver +SHLIB_MAPFILES = $$(libgcc_objdir)/libgcc-std.ver diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi index 68d1bb0..c2aa216 100644 --- a/gcc/doc/tm.texi +++ b/gcc/doc/tm.texi @@ -1581,6 +1581,15 @@ anyway. If you don't define this and @code{LIBGCC2_LONG_DOUBLE_TYPE_SIZE} is 128 then the default is 1, otherwise it is 0. @end defmac +@defmac LIBGCC2_GNU_PREFIX +This macro corresponds to the @code{TARGET_LIBFUNC_GNU_PREFIX} target +hook and should be defined if that hook is overriden to be true. It +causes function names in libgcc to be changed to use a @code{__gnu_} +prefix for their name rather than the default @code{__}. A port which +uses this macro should also arrange to use @file{t-gnu-prefix} in +the libgcc @file{config.host}. +@end defmac + @defmac SF_SIZE @defmacx DF_SIZE @defmacx XF_SIZE @@ -5245,6 +5254,15 @@ library routines. The default is to do nothing. Most ports don't need to define this hook. @end deftypefn +@deftypevr {Target Hook} bool TARGET_LIBFUNC_GNU_PREFIX +If false (the default), internal library routines start with two +underscores. If set to true, these routines start with @code{__gnu_} +instead. E.g., @code{__muldi3} changes to @code{__gnu_muldi3}. This +currently only affects functions defined in @file{libgcc2.c}. If this +is set to true, the @file{tm.h} file must also +@code{#define LIBGCC2_GNU_PREFIX}. +@end deftypevr + @defmac FLOAT_LIB_COMPARE_RETURNS_BOOL (@var{mode}, @var{comparison}) This macro should return @code{true} if the library routine that implements the floating point comparison operator @var{comparison} in diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in index d31e5e3..ab0b39b 100644 --- a/gcc/doc/tm.texi.in +++ b/gcc/doc/tm.texi.in @@ -1571,6 +1571,15 @@ anyway. If you don't define this and @code{LIBGCC2_LONG_DOUBLE_TYPE_SIZE} is 128 then the default is 1, otherwise it is 0. @end defmac +@defmac LIBGCC2_GNU_PREFIX +This macro corresponds to the @code{TARGET_LIBFUNC_GNU_PREFIX} target +hook and should be defined if that hook is overriden to be true. It +causes function names in libgcc to be changed to use a @code{__gnu_} +prefix for their name rather than the default @code{__}. A port which +uses this macro should also arrange to use @file{t-gnu-prefix} in +the libgcc @file{config.host}. +@end defmac + @defmac SF_SIZE @defmacx DF_SIZE @defmacx XF_SIZE @@ -5197,6 +5206,8 @@ library routines. The default is to do nothing. Most ports don't need to define this hook. @end deftypefn +@hook TARGET_LIBFUNC_GNU_PREFIX + @defmac FLOAT_LIB_COMPARE_RETURNS_BOOL (@var{mode}, @var{comparison}) This macro should return @code{true} if the library routine that implements the floating point comparison operator @var{comparison} in diff --git a/gcc/libgcc2.h b/gcc/libgcc2.h index 4e6fd23..aee6d19 100644 --- a/gcc/libgcc2.h +++ b/gcc/libgcc2.h @@ -193,8 +193,13 @@ typedef int shift_count_type __attribute__((mode (__libgcc_shift_count__))); #define UHWtype UDItype #define DWtype TItype #define UDWtype UTItype +#ifdef LIBGCC2_GNU_PREFIX +#define __NW(a,b) __gnu_ ## a ## di ## b +#define __NDW(a,b) __gnu_ ## a ## ti ## b +#else #define __NW(a,b) __ ## a ## di ## b #define __NDW(a,b) __ ## a ## ti ## b +#endif #define COMPAT_SIMODE_TRAPPING_ARITHMETIC #elif LIBGCC2_UNITS_PER_WORD == 4 #define W_TYPE_SIZE (4 * BITS_PER_UNIT) @@ -204,8 +209,13 @@ typedef int shift_count_type __attribute__((mode (__libgcc_shift_count__))); #define UHWtype USItype #define DWtype DItype #define UDWtype UDItype +#ifdef LIBGCC2_GNU_PREFIX +#define __NW(a,b) __gnu_ ## a ## si ## b +#define __NDW(a,b) __gnu_ ## a ## di ## b +#else #define __NW(a,b) __ ## a ## si ## b #define __NDW(a,b) __ ## a ## di ## b +#endif #elif LIBGCC2_UNITS_PER_WORD == 2 #define W_TYPE_SIZE (2 * BITS_PER_UNIT) #define Wtype HItype @@ -214,8 +224,13 @@ typedef int shift_count_type __attribute__((mode (__libgcc_shift_count__))); #define UHWtype UHItype #define DWtype SItype #define UDWtype USItype +#ifdef LIBGCC2_GNU_PREFIX +#define __NW(a,b) __gnu_ ## a ## hi ## b +#define __NDW(a,b) __gnu_ ## a ## si ## b +#else #define __NW(a,b) __ ## a ## hi ## b #define __NDW(a,b) __ ## a ## si ## b +#endif #else #define W_TYPE_SIZE BITS_PER_UNIT #define Wtype QItype @@ -224,10 +239,20 @@ typedef int shift_count_type __attribute__((mode (__libgcc_shift_count__))); #define UHWtype UQItype #define DWtype HItype #define UDWtype UHItype +#ifdef LIBGCC2_GNU_PREFIX +#define __NW(a,b) __gnu_ ## a ## qi ## b +#define __NDW(a,b) __gnu_ ## a ## hi ## b +#else #define __NW(a,b) __ ## a ## qi ## b #define __NDW(a,b) __ ## a ## hi ## b #endif +#endif +#ifdef LIBGCC2_GNU_PREFIX +#define __N(a) __gnu_ ## a +#else +#define __N(a) __ ## a +#endif #define Wtype_MAX ((Wtype)(((UWtype)1 << (W_TYPE_SIZE - 1)) - 1)) #define Wtype_MIN (- Wtype_MAX - 1) @@ -298,6 +323,25 @@ typedef int shift_count_type __attribute__((mode (__libgcc_shift_count__))); #define __popcountDI2 __NDW(popcount,2) #define __parityDI2 __NDW(parity,2) +#define __clz_tab __N(clz_tab) +#define __powisf2 __N(powisf2) +#define __powidf2 __N(powidf2) +#define __powitf2 __N(powitf2) +#define __powixf2 __N(powixf2) +#define __bswapsi2 __N(bswapsi2) +#define __bswapdi2 __N(bswapdi2) +#define __mulsc3 __N(mulsc3) +#define __muldc3 __N(muldc3) +#define __mulxc3 __N(mulxc3) +#define __multc3 __N(multc3) +#define __divsc3 __N(divsc3) +#define __divdc3 __N(divdc3) +#define __divxc3 __N(divxc3) +#define __divtc3 __N(divtc3) +#define __udiv_w_sdiv __N(udiv_w_sdiv) +#define __clear_cache __N(clear_cache) +#define __enable_execute_stack __N(enable_execute_stack) + extern DWtype __muldi3 (DWtype, DWtype); extern DWtype __divdi3 (DWtype, DWtype); extern UDWtype __udivdi3 (UDWtype, UDWtype); @@ -347,6 +391,12 @@ extern DWtype __mulvDI3 (DWtype, DWtype); extern DWtype __negvDI2 (DWtype); #ifdef COMPAT_SIMODE_TRAPPING_ARITHMETIC +#define __absvsi2 __N(absvsi2) +#define __negvsi2 __N(negvsi2) +#define __addvsi3 __N(addvsi3) +#define __subvsi3 __N(subvsi3) +#define __mulvsi3 __N(mulvsi3) + extern SItype __absvsi2 (SItype); extern SItype __addvsi3 (SItype, SItype); extern SItype __subvsi3 (SItype, SItype); diff --git a/gcc/optabs.c b/gcc/optabs.c index 62e123b..1473b0f 100644 --- a/gcc/optabs.c +++ b/gcc/optabs.c @@ -5152,13 +5152,22 @@ gen_libfunc (optab optable, const char *opname, int suffix, enum machine_mode mo unsigned opname_len = strlen (opname); const char *mname = GET_MODE_NAME (mode); unsigned mname_len = strlen (mname); - char *libfunc_name = XALLOCAVEC (char, 2 + opname_len + mname_len + 1 + 1); + int prefix_len = targetm.libfunc_gnu_prefix ? 6 : 2; + int len = prefix_len + opname_len + mname_len + 1 + 1; + char *libfunc_name = XALLOCAVEC (char, len); char *p; const char *q; p = libfunc_name; *p++ = '_'; *p++ = '_'; + if (targetm.libfunc_gnu_prefix) + { + *p++ = 'g'; + *p++ = 'n'; + *p++ = 'u'; + *p++ = '_'; + } for (q = opname; *q; ) *p++ = *q++; for (q = mname; *q; q++) @@ -5362,6 +5371,7 @@ gen_interclass_conv_libfunc (convert_optab tab, const char *fname, *tname; const char *q; + int prefix_len = targetm.libfunc_gnu_prefix ? 6 : 2; char *libfunc_name, *suffix; char *nondec_name, *dec_name, *nondec_suffix, *dec_suffix; char *p; @@ -5372,11 +5382,19 @@ gen_interclass_conv_libfunc (convert_optab tab, mname_len = strlen (GET_MODE_NAME (tmode)) + strlen (GET_MODE_NAME (fmode)); - nondec_name = XALLOCAVEC (char, 2 + opname_len + mname_len + 1 + 1); + nondec_name = XALLOCAVEC (char, prefix_len + opname_len + mname_len + 1 + 1); nondec_name[0] = '_'; nondec_name[1] = '_'; - memcpy (&nondec_name[2], opname, opname_len); - nondec_suffix = nondec_name + opname_len + 2; + if (targetm.libfunc_gnu_prefix) + { + nondec_name[2] = 'g'; + nondec_name[3] = 'n'; + nondec_name[4] = 'u'; + nondec_name[5] = '_'; + } + + memcpy (&nondec_name[prefix_len], opname, opname_len); + nondec_suffix = nondec_name + opname_len + prefix_len; dec_name = XALLOCAVEC (char, 2 + dec_len + opname_len + mname_len + 1 + 1); dec_name[0] = '_'; @@ -5487,6 +5505,7 @@ gen_intraclass_conv_libfunc (convert_optab tab, const char *opname, const char *fname, *tname; const char *q; + int prefix_len = targetm.libfunc_gnu_prefix ? 6 : 2; char *nondec_name, *dec_name, *nondec_suffix, *dec_suffix; char *libfunc_name, *suffix; char *p; @@ -5500,8 +5519,15 @@ gen_intraclass_conv_libfunc (convert_optab tab, const char *opname, nondec_name = XALLOCAVEC (char, 2 + opname_len + mname_len + 1 + 1); nondec_name[0] = '_'; nondec_name[1] = '_'; - memcpy (&nondec_name[2], opname, opname_len); - nondec_suffix = nondec_name + opname_len + 2; + if (targetm.libfunc_gnu_prefix) + { + nondec_name[2] = 'g'; + nondec_name[3] = 'n'; + nondec_name[4] = 'u'; + nondec_name[5] = '_'; + } + memcpy (&nondec_name[prefix_len], opname, opname_len); + nondec_suffix = nondec_name + opname_len + prefix_len; dec_name = XALLOCAVEC (char, 2 + dec_len + opname_len + mname_len + 1 + 1); dec_name[0] = '_'; @@ -6231,8 +6257,16 @@ init_optabs (void) /* Explicitly initialize the bswap libfuncs since we need them to be valid for things other than word_mode. */ - set_optab_libfunc (bswap_optab, SImode, "__bswapsi2"); - set_optab_libfunc (bswap_optab, DImode, "__bswapdi2"); + if (targetm.libfunc_gnu_prefix) + { + set_optab_libfunc (bswap_optab, SImode, "__gnu_bswapsi2"); + set_optab_libfunc (bswap_optab, DImode, "__gnu_bswapdi2"); + } + else + { + set_optab_libfunc (bswap_optab, SImode, "__bswapsi2"); + set_optab_libfunc (bswap_optab, DImode, "__bswapdi2"); + } /* Use cabs for double complex abs, since systems generally have cabs. Don't define any libcall for float complex, so that cabs will be used. */ diff --git a/gcc/system.h b/gcc/system.h index a57df7c..e39a6f9 100644 --- a/gcc/system.h +++ b/gcc/system.h @@ -762,8 +762,8 @@ extern void fancy_abort (const char *, int, const char *) ATTRIBUTE_NORETURN; HOT_TEXT_SECTION_NAME LEGITIMATE_CONSTANT_P /* Target macros only used for code built for the target, that have - moved to libgcc-tm.h. */ - #pragma GCC poison DECLARE_LIBRARY_RENAMES + moved to libgcc-tm.h or have never been present elsewhere. */ + #pragma GCC poison DECLARE_LIBRARY_RENAMES LIBGCC2_GNU_PREFIX /* Other obsolete target macros, or macros that used to be in target headers and were not used, and may be obsolete or may never have diff --git a/gcc/target.def b/gcc/target.def index 754713f..6137e97 100644 --- a/gcc/target.def +++ b/gcc/target.def @@ -1242,6 +1242,17 @@ DEFHOOK void, (void), hook_void_void) + /* Add a __gnu_ prefix to library functions rather than just __. */ +DEFHOOKPOD +(libfunc_gnu_prefix, + "If false (the default), internal library routines start with two\n\ +underscores. If set to true, these routines start with @code{__gnu_}\n\ +instead. E.g., @code{__muldi3} changes to @code{__gnu_muldi3}. This\n\ +currently only affects functions defined in @file{libgcc2.c}. If this\n\ +is set to true, the @file{tm.h} file must also\n\ +@code{#define LIBGCC2_GNU_PREFIX}.", + bool, false) + /* Given a decl, a section name, and whether the decl initializer has relocs, choose attributes for the section. */ /* ??? Should be merged with SELECT_SECTION and UNIQUE_SECTION. */ @@ -9525,6 +9525,10 @@ build_common_builtin_nodes (void) const char *p; enum built_in_function mcode, dcode; tree type, inner_type; + const char *prefix = "__"; + + if (targetm.libfunc_gnu_prefix) + prefix = "__gnu_"; type = lang_hooks.types.type_for_mode ((enum machine_mode) mode, 0); if (type == NULL) @@ -9543,13 +9547,17 @@ build_common_builtin_nodes (void) *q = TOLOWER (*p); *q = '\0'; - built_in_names[mcode] = concat ("__mul", mode_name_buf, "3", NULL); + built_in_names[mcode] = concat (prefix, "mul", mode_name_buf, "3", + NULL); local_define_builtin (built_in_names[mcode], ftype, mcode, - built_in_names[mcode], ECF_CONST | ECF_NOTHROW | ECF_LEAF); + built_in_names[mcode], + ECF_CONST | ECF_NOTHROW | ECF_LEAF); - built_in_names[dcode] = concat ("__div", mode_name_buf, "3", NULL); + built_in_names[dcode] = concat (prefix, "div", mode_name_buf, "3", + NULL); local_define_builtin (built_in_names[dcode], ftype, dcode, - built_in_names[dcode], ECF_CONST | ECF_NOTHROW | ECF_LEAF); + built_in_names[dcode], + ECF_CONST | ECF_NOTHROW | ECF_LEAF); } } } |