aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorBernd Schmidt <bernds@codesourcery.com>2011-05-25 12:11:42 +0000
committerBernd Schmidt <bernds@gcc.gnu.org>2011-05-25 12:11:42 +0000
commitcdbf45414aecd8ec143a0f2634ba7c53b11053ca (patch)
tree76324632de5089be2fc6b436d8ac4682fc89b374 /gcc
parentf242c0a5c0415bda56f33a13ef65e962ac995797 (diff)
downloadgcc-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/ChangeLog39
-rw-r--r--gcc/Makefile.in5
-rw-r--r--gcc/config/fixed-bit.h83
-rw-r--r--gcc/config/frv/t-linux2
-rw-r--r--gcc/config/i386/t-cygming2
-rw-r--r--gcc/config/i386/t-linux2
-rw-r--r--gcc/config/mips/t-slibgcc-irix2
-rw-r--r--gcc/config/rs6000/t-aix432
-rw-r--r--gcc/config/rs6000/t-aix522
-rw-r--r--gcc/config/sparc/t-linux2
-rw-r--r--gcc/config/t-slibgcc-elf-ver2
-rw-r--r--gcc/config/t-slibgcc-sld2
-rw-r--r--gcc/doc/tm.texi18
-rw-r--r--gcc/doc/tm.texi.in11
-rw-r--r--gcc/libgcc2.h50
-rw-r--r--gcc/optabs.c50
-rw-r--r--gcc/system.h4
-rw-r--r--gcc/target.def11
-rw-r--r--gcc/tree.c16
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. */
diff --git a/gcc/tree.c b/gcc/tree.c
index 3357d84..63f50b0 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -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);
}
}
}