tgcc: set of patches for musl - mkports - recipes for building multiple softwares with mk(1)
 (HTM) git clone git://z3bra.org/mkports
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
 (DIR) commit 837e5de1391647d28970eb9c385b4e4a084f3f54
 (DIR) parent f6b57576541c55a3c7d3c4eacbb33f652652ffcc
 (HTM) Author: Willy <willyatmailoodotorg>
       Date:   Tue,  7 Jun 2016 23:34:08 +0200
       
       gcc: set of patches for musl
       
       Diffstat:
         D gcc/patches                         |       1 -
         A gcc/patches/aarch64.diff            |      12 ++++++++++++
         A gcc/patches/gcc-autoconf-musl.diff  |      62 +++++++++++++++++++++++++++++++
         A gcc/patches/gcc-config-musl.diff    |     207 ++++++++++++++++++++++++++++++
         A gcc/patches/gcc-ssp.diff            |      12 ++++++++++++
         A gcc/patches/gomp-posix.diff         |      16 ++++++++++++++++
         A gcc/patches/gthread.diff            |      16 ++++++++++++++++
         A gcc/patches/kill-fixincludes.diff   |      17 +++++++++++++++++
         A gcc/patches/libstdc++-generic.diff  |      31 +++++++++++++++++++++++++++++++
         A gcc/patches/x86.diff                |      55 +++++++++++++++++++++++++++++++
       
       10 files changed, 428 insertions(+), 1 deletion(-)
       ---
 (DIR) diff --git a/gcc/patches b/gcc/patches
       t@@ -1 +0,0 @@
       -Subproject commit 3da6f0cc0990dc0fc12ce674f5dd88d301a000d5
 (DIR) diff --git a/gcc/patches/aarch64.diff b/gcc/patches/aarch64.diff
       t@@ -0,0 +1,12 @@
       +diff -r 9555ffb5873b gcc/config/aarch64/aarch64-linux.h
       +--- a/gcc/config/aarch64/aarch64-linux.h        Thu Dec 24 11:25:06 2015 -0500
       ++++ b/gcc/config/aarch64/aarch64-linux.h        Thu Dec 24 11:25:09 2015 -0500
       +@@ -29,6 +29,8 @@
       + #undef  CC1_SPEC
       + #define CC1_SPEC GNU_USER_TARGET_CC1_SPEC ASAN_CC1_SPEC
       + 
       ++#define MUSL_DYNAMIC_LINKER "/lib/ld-musl-aarch64.so.1"
       ++
       + #define CPP_SPEC "%{pthread:-D_REENTRANT}"
       + 
       + #define LINUX_TARGET_LINK_SPEC  "%{h*}                \
 (DIR) diff --git a/gcc/patches/gcc-autoconf-musl.diff b/gcc/patches/gcc-autoconf-musl.diff
       t@@ -0,0 +1,62 @@
       +diff -r 9ce80db9f342 gcc/configure
       +--- a/gcc/configure        Thu Dec 24 11:24:51 2015 -0500
       ++++ b/gcc/configure        Thu Dec 24 11:24:53 2015 -0500
       +@@ -27802,6 +27802,9 @@
       + else
       +   gcc_cv_libc_provides_ssp=no
       +     case "$target" in
       ++       *-*-musl*)
       ++         # All versions of musl provide stack protector
       ++         gcc_cv_libc_provides_ssp=yes;;
       +        *-*-linux* | *-*-kfreebsd*-gnu | *-*-knetbsd*-gnu)
       +       # glibc 2.4 and later provides __stack_chk_fail and
       +       # either __stack_chk_guard, or TLS access to stack guard canary.
       +@@ -27834,6 +27837,7 @@
       +          # <http://gcc.gnu.org/ml/gcc/2008-10/msg00130.html>) and for now
       +          # simply assert that glibc does provide this, which is true for all
       +          # realistically usable GNU/Hurd configurations.
       ++         # All supported versions of musl provide it as well
       +          gcc_cv_libc_provides_ssp=yes;;
       +        *-*-darwin* | *-*-freebsd*)
       +          ac_fn_c_check_func "$LINENO" "__stack_chk_fail" "ac_cv_func___stack_chk_fail"
       +@@ -27930,6 +27934,9 @@
       +       gcc_cv_target_dl_iterate_phdr=no
       +     fi
       +     ;;
       ++  *-linux-musl*)
       ++    gcc_cv_target_dl_iterate_phdr=yes
       ++    ;;
       + esac
       + 
       + if test x$gcc_cv_target_dl_iterate_phdr = xyes; then
       +diff -r 9ce80db9f342 gcc/configure.ac
       +--- a/gcc/configure.ac        Thu Dec 24 11:24:51 2015 -0500
       ++++ b/gcc/configure.ac        Thu Dec 24 11:24:53 2015 -0500
       +@@ -5282,6 +5282,9 @@
       +       gcc_cv_libc_provides_ssp,
       +       [gcc_cv_libc_provides_ssp=no
       +     case "$target" in
       ++       *-*-musl*)
       ++         # All versions of musl provide stack protector
       ++         gcc_cv_libc_provides_ssp=yes;;
       +        *-*-linux* | *-*-kfreebsd*-gnu | *-*-knetbsd*-gnu)
       +       # glibc 2.4 and later provides __stack_chk_fail and
       +       # either __stack_chk_guard, or TLS access to stack guard canary.
       +@@ -5308,6 +5311,7 @@
       +          # <http://gcc.gnu.org/ml/gcc/2008-10/msg00130.html>) and for now
       +          # simply assert that glibc does provide this, which is true for all
       +          # realistically usable GNU/Hurd configurations.
       ++         # All supported versions of musl provide it as well
       +          gcc_cv_libc_provides_ssp=yes;;
       +        *-*-darwin* | *-*-freebsd*)
       +          AC_CHECK_FUNC(__stack_chk_fail,[gcc_cv_libc_provides_ssp=yes],
       +@@ -5381,6 +5385,9 @@
       +       gcc_cv_target_dl_iterate_phdr=no
       +     fi
       +     ;;
       ++  *-linux-musl*)
       ++    gcc_cv_target_dl_iterate_phdr=yes
       ++    ;;
       + esac
       + GCC_TARGET_TEMPLATE([TARGET_DL_ITERATE_PHDR])
       + if test x$gcc_cv_target_dl_iterate_phdr = xyes; then
 (DIR) diff --git a/gcc/patches/gcc-config-musl.diff b/gcc/patches/gcc-config-musl.diff
       t@@ -0,0 +1,207 @@
       +# HG changeset patch
       +# Parent 30a957f60ddb9ae9611c626b8303858c09efa53b
       +Adding -mmusl as a musl libc specifier, and the necessary hacks for it to know how to find musl's dynamic linker.
       +
       +diff -r 30a957f60ddb gcc/config.gcc
       +--- a/gcc/config.gcc        Thu Dec 24 11:24:45 2015 -0500
       ++++ b/gcc/config.gcc        Thu Dec 24 11:24:47 2015 -0500
       +@@ -575,7 +575,7 @@
       + esac
       + 
       + # Common C libraries.
       +-tm_defines="$tm_defines LIBC_GLIBC=1 LIBC_UCLIBC=2 LIBC_BIONIC=3"
       ++tm_defines="$tm_defines LIBC_GLIBC=1 LIBC_UCLIBC=2 LIBC_BIONIC=3 LIBC_MUSL=4"
       + 
       + # 32-bit x86 processors supported by --with-arch=.  Each processor
       + # MUST be separated by exactly one space.
       +@@ -720,6 +720,9 @@
       +     *-*-*uclibc*)
       +       tm_defines="$tm_defines DEFAULT_LIBC=LIBC_UCLIBC"
       +       ;;
       ++    *-*-*musl*)
       ++      tm_defines="$tm_defines DEFAULT_LIBC=LIBC_MUSL"
       ++      ;;
       +     *)
       +       tm_defines="$tm_defines DEFAULT_LIBC=LIBC_GLIBC"
       +       ;;
       +diff -r 30a957f60ddb gcc/config/linux.h
       +--- a/gcc/config/linux.h        Thu Dec 24 11:24:45 2015 -0500
       ++++ b/gcc/config/linux.h        Thu Dec 24 11:24:47 2015 -0500
       +@@ -32,10 +32,12 @@
       + #define OPTION_GLIBC  (DEFAULT_LIBC == LIBC_GLIBC)
       + #define OPTION_UCLIBC (DEFAULT_LIBC == LIBC_UCLIBC)
       + #define OPTION_BIONIC (DEFAULT_LIBC == LIBC_BIONIC)
       ++#define OPTION_MUSL   (DEFAULT_LIBC == LIBC_MUSL)
       + #else
       + #define OPTION_GLIBC  (linux_libc == LIBC_GLIBC)
       + #define OPTION_UCLIBC (linux_libc == LIBC_UCLIBC)
       + #define OPTION_BIONIC (linux_libc == LIBC_BIONIC)
       ++#define OPTION_MUSL   (linux_libc == LIBC_MUSL)
       + #endif
       + 
       + #define GNU_USER_TARGET_OS_CPP_BUILTINS()                        \
       +@@ -53,18 +55,21 @@
       +    uClibc or Bionic is the default C library and whether
       +    -muclibc or -mglibc or -mbionic has been passed to change the default.  */
       + 
       +-#define CHOOSE_DYNAMIC_LINKER1(LIBC1, LIBC2, LIBC3, LD1, LD2, LD3)        \
       +-  "%{" LIBC2 ":" LD2 ";:%{" LIBC3 ":" LD3 ";:" LD1 "}}"
       ++#define CHOOSE_DYNAMIC_LINKER1(LIBC1, LIBC2, LIBC3, LIBC4, LD1, LD2, LD3, LD4)        \
       ++  "%{" LIBC2 ":" LD2 ";:%{" LIBC3 ":" LD3 ";:%{" LIBC4 ":" LD4 ";:" LD1 "}}}"
       + 
       + #if DEFAULT_LIBC == LIBC_GLIBC
       +-#define CHOOSE_DYNAMIC_LINKER(G, U, B) \
       +-  CHOOSE_DYNAMIC_LINKER1 ("mglibc", "muclibc", "mbionic", G, U, B)
       ++#define CHOOSE_DYNAMIC_LINKER(G, U, B, M) \
       ++  CHOOSE_DYNAMIC_LINKER1 ("mglibc", "muclibc", "mbionic", "mmusl", G, U, B, M)
       + #elif DEFAULT_LIBC == LIBC_UCLIBC
       +-#define CHOOSE_DYNAMIC_LINKER(G, U, B) \
       +-  CHOOSE_DYNAMIC_LINKER1 ("muclibc", "mglibc", "mbionic", U, G, B)
       ++#define CHOOSE_DYNAMIC_LINKER(G, U, B, M) \
       ++  CHOOSE_DYNAMIC_LINKER1 ("muclibc", "mglibc", "mbionic", "mmusl", U, G, B, M)
       + #elif DEFAULT_LIBC == LIBC_BIONIC
       +-#define CHOOSE_DYNAMIC_LINKER(G, U, B) \
       +-  CHOOSE_DYNAMIC_LINKER1 ("mbionic", "mglibc", "muclibc", B, G, U)
       ++#define CHOOSE_DYNAMIC_LINKER(G, U, B, M) \
       ++  CHOOSE_DYNAMIC_LINKER1 ("mbionic", "mglibc", "muclibc", "mmusl", B, G, U, M)
       ++#elif DEFAULT_LIBC == LIBC_MUSL
       ++#define CHOOSE_DYNAMIC_LINKER(G, U, B, M) \
       ++  CHOOSE_DYNAMIC_LINKER1 ("mmusl", "mglibc", "muclibc", "mbionic", M, G, U, B)
       + #else
       + #error "Unsupported DEFAULT_LIBC"
       + #endif /* DEFAULT_LIBC */
       +@@ -84,21 +89,92 @@
       + 
       + #define GNU_USER_DYNAMIC_LINKER                                                \
       +   CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER, UCLIBC_DYNAMIC_LINKER,        \
       +-                         BIONIC_DYNAMIC_LINKER)
       ++                         BIONIC_DYNAMIC_LINKER, MUSL_DYNAMIC_LINKER)
       + #define GNU_USER_DYNAMIC_LINKER32                                        \
       +   CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER32, UCLIBC_DYNAMIC_LINKER32, \
       +-                         BIONIC_DYNAMIC_LINKER32)
       ++                         BIONIC_DYNAMIC_LINKER32, MUSL_DYNAMIC_LINKER32)
       + #define GNU_USER_DYNAMIC_LINKER64                                        \
       +   CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER64, UCLIBC_DYNAMIC_LINKER64, \
       +-                         BIONIC_DYNAMIC_LINKER64)
       ++                         BIONIC_DYNAMIC_LINKER64, MUSL_DYNAMIC_LINKER64)
       + #define GNU_USER_DYNAMIC_LINKERX32                                        \
       +   CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKERX32, UCLIBC_DYNAMIC_LINKERX32, \
       +-                         BIONIC_DYNAMIC_LINKERX32)
       ++                         BIONIC_DYNAMIC_LINKERX32, MUSL_DYNAMIC_LINKERX32)
       + 
       + /* Whether we have Bionic libc runtime */
       + #undef TARGET_HAS_BIONIC
       + #define TARGET_HAS_BIONIC (OPTION_BIONIC)
       + 
       ++/* musl avoids problematic includes by rearranging the include directories.
       ++ * Unfortunately, this is mostly duplicated from cppdefault.c */
       ++#if DEFAULT_LIBC == LIBC_MUSL
       ++#define INCLUDE_DEFAULTS_MUSL_GPP                        \
       ++    { GPLUSPLUS_INCLUDE_DIR, "G++", 1, 1,                \
       ++      GPLUSPLUS_INCLUDE_DIR_ADD_SYSROOT, 0 },                \
       ++    { GPLUSPLUS_TOOL_INCLUDE_DIR, "G++", 1, 1,                \
       ++      GPLUSPLUS_INCLUDE_DIR_ADD_SYSROOT, 1 },                \
       ++    { GPLUSPLUS_BACKWARD_INCLUDE_DIR, "G++", 1, 1,        \
       ++      GPLUSPLUS_INCLUDE_DIR_ADD_SYSROOT, 0 },
       ++
       ++#ifdef LOCAL_INCLUDE_DIR
       ++#define INCLUDE_DEFAULTS_MUSL_LOCAL                        \
       ++    { LOCAL_INCLUDE_DIR, 0, 0, 1, 1, 2 },                \
       ++    { LOCAL_INCLUDE_DIR, 0, 0, 1, 1, 0 },
       ++#else
       ++#define INCLUDE_DEFAULTS_MUSL_LOCAL
       ++#endif
       ++
       ++#ifdef PREFIX_INCLUDE_DIR
       ++#define INCLUDE_DEFAULTS_MUSL_PREFIX                        \
       ++    { PREFIX_INCLUDE_DIR, 0, 0, 1, 0, 0},
       ++#else
       ++#define INCLUDE_DEFAULTS_MUSL_PREFIX
       ++#endif
       ++
       ++#ifdef CROSS_INCLUDE_DIR
       ++#define INCLUDE_DEFAULTS_MUSL_CROSS                        \
       ++    { CROSS_INCLUDE_DIR, "GCC", 0, 0, 0, 0},
       ++#else
       ++#define INCLUDE_DEFAULTS_MUSL_CROSS
       ++#endif
       ++
       ++#ifdef TOOL_INCLUDE_DIR
       ++#define INCLUDE_DEFAULTS_MUSL_TOOL                        \
       ++    { TOOL_INCLUDE_DIR, "BINUTILS", 0, 1, 0, 0},
       ++#else
       ++#define INCLUDE_DEFAULTS_MUSL_TOOL
       ++#endif
       ++
       ++#ifdef NATIVE_SYSTEM_HEADER_DIR
       ++#define INCLUDE_DEFAULTS_MUSL_NATIVE                        \
       ++    { NATIVE_SYSTEM_HEADER_DIR, 0, 0, 0, 1, 2 },        \
       ++    { NATIVE_SYSTEM_HEADER_DIR, 0, 0, 0, 1, 0 },
       ++#else
       ++#define INCLUDE_DEFAULTS_MUSL_NATIVE
       ++#endif
       ++
       ++#if defined (CROSS_DIRECTORY_STRUCTURE) && !defined (TARGET_SYSTEM_ROOT)
       ++# undef INCLUDE_DEFAULTS_MUSL_LOCAL
       ++# define INCLUDE_DEFAULTS_MUSL_LOCAL
       ++# undef INCLUDE_DEFAULTS_MUSL_NATIVE
       ++# define INCLUDE_DEFAULTS_MUSL_NATIVE
       ++#else
       ++# undef INCLUDE_DEFAULTS_MUSL_CROSS
       ++# define INCLUDE_DEFAULTS_MUSL_CROSS
       ++#endif
       ++
       ++#undef INCLUDE_DEFAULTS
       ++#define INCLUDE_DEFAULTS                                \
       ++  {                                                        \
       ++    INCLUDE_DEFAULTS_MUSL_GPP                                \
       ++    INCLUDE_DEFAULTS_MUSL_PREFIX                        \
       ++    INCLUDE_DEFAULTS_MUSL_CROSS                                \
       ++    INCLUDE_DEFAULTS_MUSL_TOOL                                \
       ++    INCLUDE_DEFAULTS_MUSL_NATIVE                        \
       ++    { GCC_INCLUDE_DIR, "GCC", 0, 1, 0, 0 },                \
       ++    { 0, 0, 0, 0, 0, 0 }                                \
       ++  }
       ++#endif
       ++
       + #if (DEFAULT_LIBC == LIBC_UCLIBC) && defined (SINGLE_LIBC) /* uClinux */
       + /* This is a *uclinux* target.  We don't define below macros to normal linux
       +    versions, because doing so would require *uclinux* targets to include
       +diff -r 30a957f60ddb gcc/config/linux.opt
       +--- a/gcc/config/linux.opt        Thu Dec 24 11:24:45 2015 -0500
       ++++ b/gcc/config/linux.opt        Thu Dec 24 11:24:47 2015 -0500
       +@@ -30,3 +30,7 @@
       + muclibc
       + Target Report RejectNegative Var(linux_libc,LIBC_UCLIBC) Negative(mbionic)
       + Use uClibc C library
       ++
       ++mmusl
       ++Target Report RejectNegative Var(linux_libc,LIBC_MUSL) Negative(mglibc)
       ++Use musl C library
       +diff -r 30a957f60ddb gcc/ginclude/stddef.h
       +--- a/gcc/ginclude/stddef.h        Thu Dec 24 11:24:45 2015 -0500
       ++++ b/gcc/ginclude/stddef.h        Thu Dec 24 11:24:47 2015 -0500
       +@@ -184,6 +184,7 @@
       + #ifndef _GCC_SIZE_T
       + #ifndef _SIZET_
       + #ifndef __size_t
       ++#ifndef __DEFINED_size_t /* musl */
       + #define __size_t__        /* BeOS */
       + #define __SIZE_T__        /* Cray Unicos/Mk */
       + #define _SIZE_T
       +@@ -200,6 +201,7 @@
       + #define ___int_size_t_h
       + #define _GCC_SIZE_T
       + #define _SIZET_
       ++#define __DEFINED_size_t /* musl */
       + #if (defined (__FreeBSD__) && (__FreeBSD__ >= 5)) \
       +   || defined(__DragonFly__) \
       +   || defined(__FreeBSD_kernel__)
       +@@ -218,6 +220,7 @@
       + typedef long ssize_t;
       + #endif /* __BEOS__ */
       + #endif /* !(defined (__GNUG__) && defined (size_t)) */
       ++#endif /* __DEFINED_size_t */
       + #endif /* __size_t */
       + #endif /* _SIZET_ */
       + #endif /* _GCC_SIZE_T */
 (DIR) diff --git a/gcc/patches/gcc-ssp.diff b/gcc/patches/gcc-ssp.diff
       t@@ -0,0 +1,12 @@
       +diff -r 1f375ed3689f gcc/gcc.c
       +--- a/gcc/gcc.c        Thu Dec 24 11:24:53 2015 -0500
       ++++ b/gcc/gcc.c        Thu Dec 24 11:24:56 2015 -0500
       +@@ -729,7 +729,7 @@
       + #ifndef LINK_SSP_SPEC
       + #ifdef TARGET_LIBC_PROVIDES_SSP
       + #define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-all" \
       +-                       "|fstack-protector-strong|fstack-protector-explicit:}"
       ++                       "|fstack-protector-strong|fstack-protector-explicit:-lssp_nonshared}"
       + #else
       + #define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-all" \
       +                        "|fstack-protector-strong|fstack-protector-explicit" \
 (DIR) diff --git a/gcc/patches/gomp-posix.diff b/gcc/patches/gomp-posix.diff
       t@@ -0,0 +1,16 @@
       +# HG changeset patch
       +# Parent 90228af47e55eb338c7f672e4aca5ac81cf5f14c
       +A fix for libgomp to correctly request a POSIX version for time support.
       +
       +diff -r 90228af47e55 libgomp/config/posix/time.c
       +--- a/libgomp/config/posix/time.c        Thu Dec 24 11:24:47 2015 -0500
       ++++ b/libgomp/config/posix/time.c        Thu Dec 24 11:24:49 2015 -0500
       +@@ -29,6 +29,8 @@
       +    The following implementation uses the most simple POSIX routines.
       +    If present, POSIX 4 clocks should be used instead.  */
       + 
       ++#define _POSIX_C_SOURCE 199309L /* for clocks */
       ++
       + #include "libgomp.h"
       + #include <unistd.h>
       + #if TIME_WITH_SYS_TIME
 (DIR) diff --git a/gcc/patches/gthread.diff b/gcc/patches/gthread.diff
       t@@ -0,0 +1,16 @@
       +Do not use weak references on any targets for gthread. Necessary on musl, safe elsewhere.
       +
       +diff -r e180e4cfc879 libgcc/gthr.h
       +--- a/libgcc/gthr.h        Thu Dec 24 11:25:15 2015 -0500
       ++++ b/libgcc/gthr.h        Thu Dec 24 11:25:17 2015 -0500
       +@@ -136,10 +136,8 @@
       + /* The pe-coff weak support isn't fully compatible to ELF's weak.
       +    For static libraries it might would work, but as we need to deal
       +    with shared versions too, we disable it for mingw-targets.  */
       +-#ifdef __MINGW32__
       + #undef GTHREAD_USE_WEAK
       + #define GTHREAD_USE_WEAK 0
       +-#endif
       + 
       + #ifndef GTHREAD_USE_WEAK
       + #define GTHREAD_USE_WEAK 1
 (DIR) diff --git a/gcc/patches/kill-fixincludes.diff b/gcc/patches/kill-fixincludes.diff
       t@@ -0,0 +1,17 @@
       +# HG changeset patch
       +# Parent 2efa181e019464316d8babc0edbf301e51daea1f
       +Get rid of ever-broken fixincludes on musl.
       +
       +diff -r 2efa181e0194 fixincludes/mkfixinc.sh
       +--- a/fixincludes/mkfixinc.sh        Thu Dec 24 11:24:56 2015 -0500
       ++++ b/fixincludes/mkfixinc.sh        Thu Dec 24 11:24:58 2015 -0500
       +@@ -19,7 +19,8 @@
       +     powerpc-*-eabi*    | \
       +     powerpc-*-rtems*   | \
       +     powerpcle-*-eabisim* | \
       +-    powerpcle-*-eabi* )
       ++    powerpcle-*-eabi* | \
       ++    *-musl* )
       +         #  IF there is no include fixing,
       +         #  THEN create a no-op fixer and exit
       +         (echo "#! /bin/sh" ; echo "exit 0" ) > ${target}
 (DIR) diff --git a/gcc/patches/libstdc++-generic.diff b/gcc/patches/libstdc++-generic.diff
       t@@ -0,0 +1,31 @@
       +# HG changeset patch
       +# Parent 90a7a3809a7ccb60e357b5e88382260877f82257
       +Use the generic implementation of libstdc++ primitives when we're on musl, not the glibc one.
       +
       +diff -r 90a7a3809a7c libstdc++-v3/configure.host
       +--- a/libstdc++-v3/configure.host        Thu Dec 24 11:22:15 2015 -0500
       ++++ b/libstdc++-v3/configure.host        Thu Dec 24 11:24:45 2015 -0500
       +@@ -274,6 +274,13 @@
       +     os_include_dir="os/bsd/freebsd"
       +     ;;
       +   gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu)
       ++    # check for musl by target
       ++    case "${host_os}" in
       ++      *-musl*)
       ++        os_include_dir="os/generic"
       ++        ;;
       ++      *)
       ++
       +     if [ "$uclibc" = "yes" ]; then
       +       os_include_dir="os/uclibc"
       +     elif [ "$bionic" = "yes" ]; then
       +@@ -282,6 +289,9 @@
       +       os_include_dir="os/gnu-linux"
       +     fi
       +     ;;
       ++
       ++    esac
       ++    ;;
       +   hpux*)
       +     os_include_dir="os/hpux"
       +     ;;
 (DIR) diff --git a/gcc/patches/x86.diff b/gcc/patches/x86.diff
       t@@ -0,0 +1,55 @@
       +# HG changeset patch
       +# Parent 3736940c2173c88ace7fd0ecd39ca7be7fb3cbdf
       +Support for i386-linux-musl and x86_64-linux-musl.
       +
       +diff -r 3736940c2173 gcc/config/i386/linux.h
       +--- a/gcc/config/i386/linux.h        Thu Dec 24 11:24:58 2015 -0500
       ++++ b/gcc/config/i386/linux.h        Thu Dec 24 11:25:00 2015 -0500
       +@@ -21,3 +21,4 @@
       + 
       + #define GNU_USER_LINK_EMULATION "elf_i386"
       + #define GLIBC_DYNAMIC_LINKER "/lib/ld-linux.so.2"
       ++#define MUSL_DYNAMIC_LINKER "/lib/ld-musl-i386.so.1"
       +diff -r 3736940c2173 gcc/config/i386/linux64.h
       +--- a/gcc/config/i386/linux64.h        Thu Dec 24 11:24:58 2015 -0500
       ++++ b/gcc/config/i386/linux64.h        Thu Dec 24 11:25:00 2015 -0500
       +@@ -30,3 +30,7 @@
       + #define GLIBC_DYNAMIC_LINKER32 "/lib/ld-linux.so.2"
       + #define GLIBC_DYNAMIC_LINKER64 "/lib64/ld-linux-x86-64.so.2"
       + #define GLIBC_DYNAMIC_LINKERX32 "/libx32/ld-linux-x32.so.2"
       ++
       ++#define MUSL_DYNAMIC_LINKER32 "/lib/ld-musl-i386.so.1"
       ++#define MUSL_DYNAMIC_LINKER64 "/lib/ld-musl-x86_64.so.1"
       ++#define MUSL_DYNAMIC_LINKERX32 "/lib/ld-musl-x32.so.1"
       +diff -r 3736940c2173 libitm/config/linux/x86/tls.h
       +--- a/libitm/config/linux/x86/tls.h        Thu Dec 24 11:24:58 2015 -0500
       ++++ b/libitm/config/linux/x86/tls.h        Thu Dec 24 11:25:00 2015 -0500
       +@@ -25,16 +25,19 @@
       + #ifndef LIBITM_X86_TLS_H
       + #define LIBITM_X86_TLS_H 1
       + 
       +-#if defined(__GLIBC_PREREQ) && __GLIBC_PREREQ(2, 10)
       ++#if defined(__GLIBC_PREREQ)
       ++#if __GLIBC_PREREQ(2, 10)
       + /* Use slots in the TCB head rather than __thread lookups.
       +    GLIBC has reserved words 10 through 13 for TM.  */
       + #define HAVE_ARCH_GTM_THREAD 1
       + #define HAVE_ARCH_GTM_THREAD_DISP 1
       + #endif
       ++#endif
       + 
       + #include "config/generic/tls.h"
       + 
       +-#if defined(__GLIBC_PREREQ) && __GLIBC_PREREQ(2, 10)
       ++#if defined(__GLIBC_PREREQ)
       ++#if __GLIBC_PREREQ(2, 10)
       + namespace GTM HIDDEN {
       + 
       + #ifdef __x86_64__
       +@@ -101,5 +104,6 @@
       + 
       + } // namespace GTM
       + #endif /* >= GLIBC 2.10 */
       ++#endif
       + 
       + #endif // LIBITM_X86_TLS_H