diff mbox

RFC: [build, ada] Centralize PICFLAG configuration

Message ID ydd4o1dgqrp.fsf@manam.CeBiTec.Uni-Bielefeld.DE
State New
Headers show

Commit Message

Rainer Orth Aug. 19, 2011, 7:11 p.m. UTC
Paolo,

> I've actually changed it to honor both -fpic and -fPIC in CFLAGS
> (resp. CFLAGS_FOR_TARGET).
>
> I'll fire off i386-pc-solaris2.10 and x86_64-unknown-linux-gnu
> bootstraps before leaving for home tonight, but the following patch has
> already been tested lightly with a minimal configure script that
> uses GCC_PICFLAG{, _FOR_TARGET}, exercising it without and with various
> --build/--host/--target settings and specifing -fpic/-fPIC in CFLAGS*.
> At least in this scenario, it works as expected.

the following patch has been fully tested.  Changes from the previous
version include correct quoting of [] in picflag.m4 and substituting
PICFLAG_FOR_TARGET in gcc/configure.ac.

The patch has been bootstrapped without regressions on
i386-pc-solaris2.10 and x86_64-unknown-linux-gnu.  I've also performed
an Ada-only --disable-libada bootstrap on Linux/x86_64 with Arnaud's
patch and confirmed that -fpic was correctly included when running make
gnatlib from gcc.  That make errored out later with

../../xgcc -B../../ -B/usr/local/x86_64-unknown-linux-gnu/bin/ -isystem /usr/local/x86_64-unknown-linux-gnu/include -isystem /usr/local/x86_64-unknown-linux-gnu/sys-include -L/var/gcc/gcc-4.7.0-20110819/2.6.18-gcc-gas-gld-no-libada/gcc/../ld -c     a-assert.adb -o a-assert.o
a-assert.adb:32:01: user-defined descendents of package Ada are not allowed
make[2]: *** [a-assert.o] Error 1
make[2]: Leaving directory `/var/gcc/gcc-4.7.0-20110819/2.6.18-gcc-gas-gld-no-libada/gcc/ada/rts'
make[1]: *** [gnatlib] Error 2
make[1]: Leaving directory `/var/gcc/gcc-4.7.0-20110819/2.6.18-gcc-gas-gld-no-libada/gcc/ada'
make: *** [gnatlib] Error 2

which I haven't investigated further.

Ok for mainline now (or rather after the libgcc1 and before the libgcc2
patch once those are approved)?

Thanks.
        Rainer


2011-07-31  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>

	config:
	* picflag.m4: New file.

	gcc:
	* configure.ac (GCC_PICFLAG_FOR_TARGET): Call it.
	(PICFLAG_FOR_TARGET): Substitute.
	* aclocal.m4: Regenerate.
	* configure: Regenerate.

	gcc/ada:
	* gcc-interface/Makefile.in (PICFLAG_FOR_TARGET): New.
	(GNATLIBCFLAGS_FOR_C): Replace
	TARGET_LIBGCC2_CFLAGS by PICFLAG_FOR_TARGET.
	(gnatlib-shared-default, gnatlib-shared-dual-win32)
	(gnatlib-shared-win32, gnatlib-shared-darwin, gnatlib-shared)
	(gnatlib-sjlj, gnatlib-zcx): Likewise.

	libada:
	* configure.ac: Include ../config/picflag.m4.
	(GCC_PICFLAG): Call it.
	Substitute.
	* configure: Regenerate.
	* Makefile.in (TARGET_LIBGCC2_CFLAGS): Replace by PICFLAG.
	(GNATLIBCFLAGS_FOR_C): Replace TARGET_LIBGCC2_CFLAGS by PICFLAG.
	(LIBADA_FLAGS_TO_PASS): Pass PICFLAG as PICFLAG_FOR_TARGET.
	Don't include $(GCC_DIR)/libgcc.mvars.

	libiberty:
	* aclocal.m4: Include ../config/picflag.m4.
	* configure.ac (GCC_PICFLAG): Call it.
	(enable_shared): Clear PICFLAG unless shared.
	* configure: Regenerate.

Comments

Paolo Bonzini Aug. 22, 2011, 6:42 a.m. UTC | #1
On 08/19/2011 09:11 PM, Rainer Orth wrote:
>
> 2011-07-31  Rainer Orth<ro@CeBiTec.Uni-Bielefeld.DE>
>
> 	config:
> 	* picflag.m4: New file.
>
> 	gcc:
> 	* configure.ac (GCC_PICFLAG_FOR_TARGET): Call it.
> 	(PICFLAG_FOR_TARGET): Substitute.
> 	* aclocal.m4: Regenerate.
> 	* configure: Regenerate.
>
> 	gcc/ada:
> 	* gcc-interface/Makefile.in (PICFLAG_FOR_TARGET): New.
> 	(GNATLIBCFLAGS_FOR_C): Replace
> 	TARGET_LIBGCC2_CFLAGS by PICFLAG_FOR_TARGET.
> 	(gnatlib-shared-default, gnatlib-shared-dual-win32)
> 	(gnatlib-shared-win32, gnatlib-shared-darwin, gnatlib-shared)
> 	(gnatlib-sjlj, gnatlib-zcx): Likewise.
>
> 	libada:
> 	* configure.ac: Include ../config/picflag.m4.
> 	(GCC_PICFLAG): Call it.
> 	Substitute.
> 	* configure: Regenerate.
> 	* Makefile.in (TARGET_LIBGCC2_CFLAGS): Replace by PICFLAG.
> 	(GNATLIBCFLAGS_FOR_C): Replace TARGET_LIBGCC2_CFLAGS by PICFLAG.
> 	(LIBADA_FLAGS_TO_PASS): Pass PICFLAG as PICFLAG_FOR_TARGET.
> 	Don't include $(GCC_DIR)/libgcc.mvars.
>
> 	libiberty:
> 	* aclocal.m4: Include ../config/picflag.m4.
> 	* configure.ac (GCC_PICFLAG): Call it.
> 	(enable_shared): Clear PICFLAG unless shared.
> 	* configure: Regenerate.
>

Ok, thanks.

Paolo
Rainer Orth Aug. 22, 2011, 5:11 p.m. UTC | #2
Paolo Bonzini <bonzini@gnu.org> writes:

> On 08/19/2011 09:11 PM, Rainer Orth wrote:
>>
>> 2011-07-31  Rainer Orth<ro@CeBiTec.Uni-Bielefeld.DE>
>>
>> 	config:
>> 	* picflag.m4: New file.
>>
>> 	gcc:
>> 	* configure.ac (GCC_PICFLAG_FOR_TARGET): Call it.
>> 	(PICFLAG_FOR_TARGET): Substitute.
>> 	* aclocal.m4: Regenerate.
>> 	* configure: Regenerate.
>>
>> 	gcc/ada:
>> 	* gcc-interface/Makefile.in (PICFLAG_FOR_TARGET): New.
>> 	(GNATLIBCFLAGS_FOR_C): Replace
>> 	TARGET_LIBGCC2_CFLAGS by PICFLAG_FOR_TARGET.
>> 	(gnatlib-shared-default, gnatlib-shared-dual-win32)
>> 	(gnatlib-shared-win32, gnatlib-shared-darwin, gnatlib-shared)
>> 	(gnatlib-sjlj, gnatlib-zcx): Likewise.
>>
>> 	libada:
>> 	* configure.ac: Include ../config/picflag.m4.
>> 	(GCC_PICFLAG): Call it.
>> 	Substitute.
>> 	* configure: Regenerate.
>> 	* Makefile.in (TARGET_LIBGCC2_CFLAGS): Replace by PICFLAG.
>> 	(GNATLIBCFLAGS_FOR_C): Replace TARGET_LIBGCC2_CFLAGS by PICFLAG.
>> 	(LIBADA_FLAGS_TO_PASS): Pass PICFLAG as PICFLAG_FOR_TARGET.
>> 	Don't include $(GCC_DIR)/libgcc.mvars.
>>
>> 	libiberty:
>> 	* aclocal.m4: Include ../config/picflag.m4.
>> 	* configure.ac (GCC_PICFLAG): Call it.
>> 	(enable_shared): Clear PICFLAG unless shared.
>> 	* configure: Regenerate.
>>
>
> Ok, thanks.

installed, thanks.

Do I need to sync the config and libiberty parts to src manually or does
this happen by some sort of magic?

	Rainer
DJ Delorie Aug. 22, 2011, 5:17 p.m. UTC | #3
> Do I need to sync the config and libiberty parts to src manually or does
> this happen by some sort of magic?


intl/; config.rhost; libiberty/; libiberty's part of include/ 
	gcc: http://gcc.gnu.org
	Changes need to be done in tandem with the official GCC
	sources or submitted to the master file maintainer and brought
	in via a merge.  Note: approved patches in gcc's libiberty or
	intl are automatically approved in this libiberty and intl also;
	feel free to merge them yourself if needed sooner than the next
	merge.  Otherwise, changes are automatically merged, usually
	within a day.
Rainer Orth Aug. 22, 2011, 6:10 p.m. UTC | #4
DJ Delorie <dj@redhat.com> writes:

>> Do I need to sync the config and libiberty parts to src manually or does
>> this happen by some sort of magic?
>
>
> intl/; config.rhost; libiberty/; libiberty's part of include/ 
> 	gcc: http://gcc.gnu.org
> 	Changes need to be done in tandem with the official GCC
> 	sources or submitted to the master file maintainer and brought
> 	in via a merge.  Note: approved patches in gcc's libiberty or
> 	intl are automatically approved in this libiberty and intl also;
> 	feel free to merge them yourself if needed sooner than the next
> 	merge.  Otherwise, changes are automatically merged, usually
> 	within a day.

Thanks.  I've just installed config/picflag.m4 and rely on the automatic
merge for libiberty.

	Rainer
Paolo Bonzini Aug. 23, 2011, 7:07 a.m. UTC | #5
On 08/22/2011 07:11 PM, Rainer Orth wrote:
> installed, thanks.
>
> Do I need to sync the config and libiberty parts to src manually or does
> this happen by some sort of magic?

I'll take care of that.

Paolo
diff mbox

Patch

# HG changeset patch
# Parent 4f8f991ef1b75c25f4231de1fe5406200c19653d
Centralize PICFLAG configuration

diff --git a/config/picflag.m4 b/config/picflag.m4
new file mode 100644
--- /dev/null
+++ b/config/picflag.m4
@@ -0,0 +1,95 @@ 
+# _GCC_PICFLAG(FLAG, DISPATCH)
+# ----------------------------
+# Store PIC flag corresponding to DISPATCH triplet in FLAG.
+# Explit use of -fpic in CFLAGS corresponding to FLAG overrides default.
+AC_DEFUN([_GCC_PICFLAG], [
+
+case "${$2}" in
+    # PIC is the default on some targets or must not be used.
+    *-*-darwin*)
+	# PIC is the default on this platform
+	# Common symbols not allowed in MH_DYLIB files
+	$1=-fno-common
+	;;
+    alpha*-dec-osf5*)
+	# PIC is the default.
+	;;
+    hppa*64*-*-hpux*)
+	# PIC is the default for 64-bit PA HP-UX.
+	;;
+    i[[34567]]86-*-cygwin* | i[[34567]]86-*-mingw* | x86_64-*-mingw*)
+	;;
+    i[[34567]]86-*-interix3*)
+	# Interix 3.x gcc -fpic/-fPIC options generate broken code.
+	# Instead, we relocate shared libraries at runtime.
+	;;
+    i[[34567]]86-*-nto-qnx*)
+	# QNX uses GNU C++, but need to define -shared option too, otherwise
+	# it will coredump.
+	$1='-fPIC -shared'
+	;;
+    i[[34567]]86-pc-msdosdjgpp*)
+	# DJGPP does not support shared libraries at all.
+	;;
+    ia64*-*-hpux*)
+	# On IA64 HP-UX, PIC is the default but the pic flag
+	# sets the default TLS model and affects inlining.
+	$1=-fPIC
+	;;
+    mips-sgi-irix6*)
+	# PIC is the default.
+	;;
+    rs6000-ibm-aix* | powerpc-ibm-aix*)
+	# All AIX code is PIC.
+	;;
+
+    # Some targets support both -fPIC and -fpic, but prefer the latter.
+    # FIXME: Why?
+    i[[34567]]86-*-* | x86_64-*-*)
+	$1=-fpic
+	;;
+    m68k-*-*)
+	$1=-fpic
+	;;
+    s390*-*-*)
+	$1=-fpic
+	;;
+    # FIXME: Override -fPIC default in libgcc only? 
+    sh-*-linux* | sh[[2346lbe]]*-*-linux*)
+	$1=-fpic
+	;;
+    # FIXME: Simplify to sh*-*-netbsd*?
+    sh-*-netbsdelf* | shl*-*-netbsdelf* | sh5-*-netbsd* | sh5l*-*-netbsd* | \
+      sh64-*-netbsd* | sh64l*-*-netbsd*)
+	$1=-fpic
+	;;
+    # Default to -fPIC unless specified otherwise.
+    *)
+	$1=-fPIC
+	;;
+esac
+
+# If the user explicitly uses -fpic/-fPIC, keep that.
+case "${m4_bpatsubsts($1, PICFLAG, CFLAGS)}" in
+    *-fpic*)
+	$1=-fpic
+	;;
+    *-fPIC*)
+	$1=-fPIC
+	;;
+esac
+])
+
+# GCC_PICFLAG
+# -----------
+# Store host PIC flag in PICFLAG.
+AC_DEFUN([GCC_PICFLAG], [
+  AC_REQUIRE([AC_CANONICAL_HOST])
+  _GCC_PICFLAG([PICFLAG], [host])])
+
+# GCC_PICFLAG_FOR_TARGET
+# ----------------------
+# Store target PIC flag in PICFLAG_FOR_TARGET.
+AC_DEFUN([GCC_PICFLAG_FOR_TARGET], [
+  AC_REQUIRE([AC_CANONICAL_TARGET])
+  _GCC_PICFLAG([PICFLAG_FOR_TARGET], [target])])
diff --git a/gcc/ada/gcc-interface/Makefile.in b/gcc/ada/gcc-interface/Makefile.in
--- a/gcc/ada/gcc-interface/Makefile.in
+++ b/gcc/ada/gcc-interface/Makefile.in
@@ -111,10 +111,11 @@  NO_SIBLING_ADAFLAGS=-fno-optimize-siblin
 NO_REORDER_ADAFLAGS=-fno-toplevel-reorder
 GNATLIBFLAGS = -gnatpg -nostdinc
 GNATLIBCFLAGS = -g -O2
+PICFLAG_FOR_TARGET = @PICFLAG_FOR_TARGET@
 # Pretend that _Unwind_GetIPInfo is available for the target by default.  This
 # should be autodetected during the configuration of libada and passed down to
 # here, but we need something for --disable-libada and hope for the best.
-GNATLIBCFLAGS_FOR_C = $(GNATLIBCFLAGS) $(TARGET_LIBGCC2_CFLAGS) -fexceptions \
+GNATLIBCFLAGS_FOR_C = $(GNATLIBCFLAGS) $(PICFLAG_FOR_TARGET) -fexceptions \
 	-DIN_RTS -DHAVE_GETIPINFO
 ALL_ADAFLAGS = $(CFLAGS) $(ADA_CFLAGS) $(ADAFLAGS)
 MOST_ADAFLAGS = $(CFLAGS) $(ADA_CFLAGS) $(SOME_ADAFLAGS)
@@ -2482,7 +2483,7 @@  gnatlib: ../stamp-gnatlib1-$(RTSDIR) ../
 gnatlib-shared-default:
 	$(MAKE) $(FLAGS_TO_PASS) \
              GNATLIBFLAGS="$(GNATLIBFLAGS)" \
-	     GNATLIBCFLAGS="$(GNATLIBCFLAGS) $(TARGET_LIBGCC2_CFLAGS)" \
+	     GNATLIBCFLAGS="$(GNATLIBCFLAGS) $(PICFLAG_FOR_TARGET)" \
 	     GNATLIBCFLAGS_FOR_C="$(GNATLIBCFLAGS_FOR_C)" \
 	     MULTISUBDIR="$(MULTISUBDIR)" \
 	     THREAD_KIND="$(THREAD_KIND)" \
@@ -2490,14 +2491,14 @@  gnatlib-shared-default:
 	$(RM) $(RTSDIR)/libgna*$(soext)
 	cd $(RTSDIR); `echo "$(GCC_FOR_TARGET)" \
                 | sed -e 's,\./xgcc,../../xgcc,' -e 's,-B\./,-B../../,'` -shared $(GNATLIBCFLAGS) \
-		$(TARGET_LIBGCC2_CFLAGS) \
+		$(PICFLAG_FOR_TARGET) \
 		-o libgnat$(hyphen)$(LIBRARY_VERSION)$(soext) \
 		$(GNATRTL_NONTASKING_OBJS) $(LIBGNAT_OBJS) \
 		$(SO_OPTS)libgnat$(hyphen)$(LIBRARY_VERSION)$(soext) \
 		$(MISCLIB) -lm
 	cd $(RTSDIR); `echo "$(GCC_FOR_TARGET)" \
                 | sed -e 's,\./xgcc,../../xgcc,' -e 's,-B\./,-B../../,'` -shared $(GNATLIBCFLAGS) \
-		$(TARGET_LIBGCC2_CFLAGS) \
+		$(PICFLAG_FOR_TARGET) \
 		-o libgnarl$(hyphen)$(LIBRARY_VERSION)$(soext) \
 		$(GNATRTL_TASKING_OBJS) \
 		$(SO_OPTS)libgnarl$(hyphen)$(LIBRARY_VERSION)$(soext) \
@@ -2529,7 +2530,7 @@  gnatlib-shared-dual:
 gnatlib-shared-dual-win32:
 	$(MAKE) $(FLAGS_TO_PASS) \
              GNATLIBFLAGS="$(GNATLIBFLAGS)" \
-	     GNATLIBCFLAGS="$(GNATLIBCFLAGS) $(TARGET_LIBGCC2_CFLAGS)" \
+	     GNATLIBCFLAGS="$(GNATLIBCFLAGS) $(PICFLAG_FOR_TARGET)" \
 	     GNATLIBCFLAGS_FOR_C="$(GNATLIBCFLAGS_FOR_C)" \
 	     MULTISUBDIR="$(MULTISUBDIR)" \
 	     THREAD_KIND="$(THREAD_KIND)" \
@@ -2552,7 +2553,7 @@  gnatlib-shared-dual-win32:
 gnatlib-shared-win32:
 	$(MAKE) $(FLAGS_TO_PASS) \
              GNATLIBFLAGS="$(GNATLIBFLAGS)" \
-	     GNATLIBCFLAGS="$(GNATLIBCFLAGS) $(TARGET_LIBGCC2_CFLAGS)" \
+	     GNATLIBCFLAGS="$(GNATLIBCFLAGS) $(PICFLAG_FOR_TARGET)" \
 	     GNATLIBCFLAGS_FOR_C="$(GNATLIBCFLAGS_FOR_C)" \
 	     MULTISUBDIR="$(MULTISUBDIR)" \
 	     THREAD_KIND="$(THREAD_KIND)" \
@@ -2560,13 +2561,13 @@  gnatlib-shared-win32:
 	$(RM) $(RTSDIR)/libgna*$(soext)
 	cd $(RTSDIR); `echo "$(GCC_FOR_TARGET)" \
                 | sed -e 's,\./xgcc,../../xgcc,' -e 's,-B\./,-B../../,'` -shared -shared-libgcc \
-		$(TARGET_LIBGCC2_CFLAGS) \
+		$(PICFLAG_FOR_TARGET) \
 		-o libgnat$(hyphen)$(LIBRARY_VERSION)$(soext) \
 		$(GNATRTL_NONTASKING_OBJS) $(LIBGNAT_OBJS) \
 		$(SO_OPTS)libgnat$(hyphen)$(LIBRARY_VERSION)$(soext) $(MISCLIB)
 	cd $(RTSDIR); `echo "$(GCC_FOR_TARGET)" \
                 | sed -e 's,\./xgcc,../../xgcc,' -e 's,-B\./,-B../../,'` -shared -shared-libgcc \
-		$(TARGET_LIBGCC2_CFLAGS) \
+		$(PICFLAG_FOR_TARGET) \
 		-o libgnarl$(hyphen)$(LIBRARY_VERSION)$(soext) \
 		$(GNATRTL_TASKING_OBJS) \
 		$(SO_OPTS)libgnarl$(hyphen)$(LIBRARY_VERSION)$(soext) \
@@ -2575,21 +2576,21 @@  gnatlib-shared-win32:
 gnatlib-shared-darwin:
 	$(MAKE) $(FLAGS_TO_PASS) \
 	     GNATLIBFLAGS="$(GNATLIBFLAGS)" \
-	     GNATLIBCFLAGS="$(GNATLIBCFLAGS) $(TARGET_LIBGCC2_CFLAGS)" \
+	     GNATLIBCFLAGS="$(GNATLIBCFLAGS) $(PICFLAG_FOR_TARGET)" \
 	     GNATLIBCFLAGS_FOR_C="$(GNATLIBCFLAGS_FOR_C) -fno-common" \
 	     MULTISUBDIR="$(MULTISUBDIR)" \
 	     THREAD_KIND="$(THREAD_KIND)" \
 	     gnatlib
 	$(RM) $(RTSDIR)/libgnat$(soext) $(RTSDIR)/libgnarl$(soext)
 	cd $(RTSDIR); `echo "$(GCC_FOR_TARGET)" \
-                | sed -e 's,\./xgcc,../../xgcc,' -e 's,-B\./,-B../../,'` -dynamiclib $(TARGET_LIBGCC2_CFLAGS) \
+                | sed -e 's,\./xgcc,../../xgcc,' -e 's,-B\./,-B../../,'` -dynamiclib $(PICFLAG_FOR_TARGET) \
 		-o libgnat$(hyphen)$(LIBRARY_VERSION)$(soext) \
 		$(GNATRTL_NONTASKING_OBJS) $(LIBGNAT_OBJS) \
 		$(SO_OPTS) \
 		-Wl,-install_name,@rpath/libgnat$(hyphen)$(LIBRARY_VERSION)$(soext) \
 		$(MISCLIB) -lm
 	cd $(RTSDIR); `echo "$(GCC_FOR_TARGET)" \
-                | sed -e 's,\./xgcc,../../xgcc,' -e 's,-B\./,-B../../,'` -dynamiclib $(TARGET_LIBGCC2_CFLAGS) \
+                | sed -e 's,\./xgcc,../../xgcc,' -e 's,-B\./,-B../../,'` -dynamiclib $(PICFLAG_FOR_TARGET) \
 		-o libgnarl$(hyphen)$(LIBRARY_VERSION)$(soext) \
 		$(GNATRTL_TASKING_OBJS) \
 		$(SO_OPTS) \
@@ -2638,7 +2639,7 @@  gnatlib-shared:
 	     GNATLIBCFLAGS_FOR_C="$(GNATLIBCFLAGS_FOR_C)" \
 	     MULTISUBDIR="$(MULTISUBDIR)" \
 	     THREAD_KIND="$(THREAD_KIND)" \
-	     TARGET_LIBGCC2_CFLAGS="$(TARGET_LIBGCC2_CFLAGS)" \
+	     PICFLAG_FOR_TARGET="$(PICFLAG_FOR_TARGET)" \
              $(GNATLIB_SHARED)
 
 gnatlib-sjlj:
@@ -2653,7 +2654,7 @@  gnatlib-sjlj:
 	     GNATLIBCFLAGS_FOR_C="$(GNATLIBCFLAGS_FOR_C)" \
 	     MULTISUBDIR="$(MULTISUBDIR)" \
 	     THREAD_KIND="$(THREAD_KIND)" \
-	     TARGET_LIBGCC2_CFLAGS="$(TARGET_LIBGCC2_CFLAGS)" gnatlib
+	     PICFLAG_FOR_TARGET="$(PICFLAG_FOR_TARGET)" gnatlib
 
 gnatlib-zcx:
 	$(MAKE) $(FLAGS_TO_PASS) EH_MECHANISM="-gcc" \
@@ -2667,7 +2668,7 @@  gnatlib-zcx:
 	     GNATLIBCFLAGS_FOR_C="$(GNATLIBCFLAGS_FOR_C)" \
 	     MULTISUBDIR="$(MULTISUBDIR)" \
 	     THREAD_KIND="$(THREAD_KIND)" \
-	     TARGET_LIBGCC2_CFLAGS="$(TARGET_LIBGCC2_CFLAGS)" gnatlib
+	     PICFLAG_FOR_TARGET="$(PICFLAG_FOR_TARGET)" gnatlib
 
 # .s files for cross-building
 gnat-cross: force
diff --git a/gcc/configure.ac b/gcc/configure.ac
--- a/gcc/configure.ac
+++ b/gcc/configure.ac
@@ -297,6 +297,10 @@  case "$CC" in
 esac
 AC_SUBST(CFLAGS)
 
+# Determine PICFLAG for target gnatlib.
+GCC_PICFLAG_FOR_TARGET
+AC_SUBST(PICFLAG_FOR_TARGET)
+
 # -------------------------
 # Check C compiler features
 # -------------------------
diff --git a/libada/Makefile.in b/libada/Makefile.in
--- a/libada/Makefile.in
+++ b/libada/Makefile.in
@@ -1,5 +1,5 @@ 
 # Makefile for libada.
-#   Copyright 2003, 2004, 2009, 2010 Free Software Foundation, Inc.
+#   Copyright 2003, 2004, 2009, 2010, 2011 Free Software Foundation, Inc.
 #
 # This file is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -56,15 +56,13 @@  LOOSE_WARN = -W -Wall -Wwrite-strings -W
 GCC_WARN_CFLAGS = $(LOOSE_WARN)
 WARN_CFLAGS = @warn_cflags@
 
-TARGET_LIBGCC2_CFLAGS=
+PICFLAG = @PICFLAG@
 GNATLIBCFLAGS= -g -O2
-GNATLIBCFLAGS_FOR_C = $(GNATLIBCFLAGS) $(TARGET_LIBGCC2_CFLAGS) -fexceptions \
+GNATLIBCFLAGS_FOR_C = $(GNATLIBCFLAGS) $(PICFLAG) -fexceptions \
 	-DIN_RTS @have_getipinfo@
 
-# Get target-specific overrides for TARGET_LIBGCC2_CFLAGS.
 host_subdir = @host_subdir@
 GCC_DIR=$(MULTIBUILDTOP)../../$(host_subdir)/gcc
-include $(GCC_DIR)/libgcc.mvars
 
 target_noncanonical:=@target_noncanonical@
 version := $(shell cat $(srcdir)/../gcc/BASE-VER)
@@ -83,7 +81,7 @@  LIBADA_FLAGS_TO_PASS = \
         "GNATLIBFLAGS=$(GNATLIBFLAGS) $(MULTIFLAGS)" \
         "GNATLIBCFLAGS=$(GNATLIBCFLAGS) $(MULTIFLAGS)" \
         "GNATLIBCFLAGS_FOR_C=$(GNATLIBCFLAGS_FOR_C) $(MULTIFLAGS)" \
-        "TARGET_LIBGCC2_CFLAGS=$(TARGET_LIBGCC2_CFLAGS)" \
+        "PICFLAG_FOR_TARGET=$(PICFLAG)" \
         "THREAD_KIND=$(THREAD_KIND)" \
         "TRACE=$(TRACE)" \
         "MULTISUBDIR=$(MULTISUBDIR)" \
diff --git a/libada/configure.ac b/libada/configure.ac
--- a/libada/configure.ac
+++ b/libada/configure.ac
@@ -1,5 +1,5 @@ 
 # Configure script for libada.
-#   Copyright 2003, 2004, 2009 Free Software Foundation, Inc.
+#   Copyright 2003, 2004, 2009, 2011 Free Software Foundation, Inc.
 #
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
@@ -18,6 +18,7 @@ 
 sinclude(../config/acx.m4)
 sinclude(../config/multi.m4)
 sinclude(../config/override.m4)
+sinclude(../config/picflag.m4)
 sinclude(../config/unwind_ipinfo.m4)
 
 AC_INIT
@@ -118,6 +119,9 @@  esac
 ], [enable_shared=yes])
 AC_SUBST([enable_shared])
 
+GCC_PICFLAG
+AC_SUBST([PICFLAG])
+
 # These must be passed down, or are needed by gcc/libgcc.mvars
 AC_PROG_AWK
 AC_PROG_LN_S
diff --git a/libiberty/aclocal.m4 b/libiberty/aclocal.m4
--- a/libiberty/aclocal.m4
+++ b/libiberty/aclocal.m4
@@ -1,6 +1,7 @@ 
 sinclude(../config/acx.m4)
 sinclude(../config/no-executables.m4)
 sinclude(../config/override.m4)
+sinclude(../config/picflag.m4)
 sinclude(../config/warnings.m4)
 
 dnl See whether strncmp reads past the end of its string parameters.
diff --git a/libiberty/configure.ac b/libiberty/configure.ac
--- a/libiberty/configure.ac
+++ b/libiberty/configure.ac
@@ -191,6 +191,8 @@  if [[ -n "${frag}" ]]; then
   frag=${libiberty_topdir}/libiberty/config/$frag
 fi
 
+GCC_PICFLAG
+
 # If they didn't specify --enable-shared, don't generate shared libs.
 case "${enable_shared}" in
   yes) shared=yes ;;
@@ -198,27 +200,8 @@  case "${enable_shared}" in
   "") shared=no ;;
   *) shared=yes ;;
 esac
-if [[ "${shared}" = "yes" ]]; then
-  case "${host}" in
-    *-*-cygwin*)	;;
-    alpha*-*-linux*)	PICFLAG=-fPIC ;;
-    arm*-*-*)		PICFLAG=-fPIC ;;
-    hppa*-*-*)		PICFLAG=-fPIC ;;
-    i370-*-*)		PICFLAG=-fPIC ;;
-    ia64-*-*)		PICFLAG=-fpic ;;
-    i[[34567]]86-*-* | x86_64-*-*)
-			PICFLAG=-fpic ;;
-    m68k-*-*)		PICFLAG=-fpic ;;
-    mips*-*-linux*)	PICFLAG=-fPIC ;;
-    powerpc*-*-aix*)	;;
-    powerpc*-*-*)	PICFLAG=-fPIC ;;
-    sparc*-*-*)		case "${CFLAGS}" in
-			  *-fpic* ) PICFLAG=-fpic ;;
-			  * ) PICFLAG=-fPIC ;;
-			esac ;;
-    s390*-*-*)		PICFLAG=-fpic ;;
-    sh*-*-*)		PICFLAG=-fPIC ;;
-  esac
+if [[ "${shared}" != "yes" ]]; then
+  PICFLAG=
 fi
 AC_SUBST(PICFLAG)