add optional global visibility override

this is implemented via the build system and does not affect source
files. the idea is to use protected or hidden visibility to prevent
the compiler from pessimizing function calls within a shared (or
position-independent static) libc in the form of overhead setting up
for a call through the PLT. the ld-time symbol binding via the
-Bsymbolic-functions option already optimized out the PLT itself, but
not the code in the caller needed to support a call through the PLT.
on some archs this overhead can be substantial; on others it's
trivial.
diff --git a/configure b/configure
index 41a73b4..0e39694 100755
--- a/configure
+++ b/configure
@@ -27,6 +27,7 @@
   --enable-optimize=...   optimize listed components for speed over size [auto]
   --enable-debug          build with debugging information [disabled]
   --enable-warnings       build with recommended warnings flags [disabled]
+  --enable-visibility     use global visibility options to optimize PIC [auto]
   --enable-gcc-wrapper    build musl-gcc toolchain wrapper [auto]
   --disable-shared        inhibit building shared library [enabled]
   --disable-static        inhibit building static library [enabled]
@@ -79,7 +80,7 @@
 tryflag () {
 printf "checking whether compiler accepts %s... " "$2"
 echo "typedef int x;" > "$tmpc"
-if $CC "$2" -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then
+if $CC $2 -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then
 printf "yes\n"
 eval "$1=\"\${$1} \$2\""
 eval "$1=\${$1# }"
@@ -124,6 +125,7 @@
 optimize=auto
 debug=no
 warnings=no
+visibility=auto
 shared=auto
 static=yes
 wrapper=auto
@@ -148,6 +150,8 @@
 --disable-debug|--enable-debug=no) debug=no ;;
 --enable-warnings|--enable-warnings=yes) warnings=yes ;;
 --disable-warnings|--enable-warnings=no) warnings=no ;;
+--enable-visibility|--enable-visibility=yes) visibility=yes ;;
+--disable-visibility|--enable-visibility=no) visibility=no ;;
 --enable-gcc-wrapper|--enable-gcc-wrapper=yes) wrapper=yes ;;
 --disable-gcc-wrapper|--enable-gcc-wrapper=no) wrapper=no ;;
 --enable-*|--disable-*|--with-*|--without-*|--*dir=*|--build=*) ;;
@@ -415,6 +419,31 @@
 tryflag CFLAGS_AUTO -Wno-pointer-to-int-cast
 fi
 
+if test "x$visibility" == xauto ; then
+# This test checks toolchain support for several things:
+# - the -include option
+# - the attributes/pragmas used in vis.h
+# - linking code that takes the address of protected symbols
+printf "checking whether global visibility preinclude works... "
+echo 'int (*fp)(void);' > "$tmpc"
+echo 'int foo(void) { }' >> "$tmpc"
+echo 'int bar(void) { fp = foo; return foo(); }' >> "$tmpc"
+if $CC $CFLAGS_C99FSE -I./arch/$ARCH -I src/internal -I./include \
+  $CPPFLAGS $CFLAGS -DSHARED -fPIC -include vis.h \
+  -nostdlib -shared -Wl,-Bsymbolic-functions \
+  -o /dev/null "$tmpc" >/dev/null 2>&1 ; then
+visibility=yes
+else
+visibility=no
+fi
+printf "%s\n" "$visibility"
+fi
+
+if test "x$visibility" == xyes ; then
+CFLAGS_AUTO="$CFLAGS_AUTO -include vis.h"
+CFLAGS_AUTO="${CFLAGS_AUTO# }"
+fi
+
 # Some patched GCC builds have these defaults messed up...
 tryldflag LDFLAGS_AUTO -Wl,--hash-style=both