parent
42d3b536c6
commit
659363fb40
@ -0,0 +1,525 @@ |
||||
{ stdenv, targetPackages, fetchurl, fetchpatch, noSysDirs |
||||
, langC ? true, langCC ? true, langFortran ? false |
||||
, langObjC ? targetPlatform.isDarwin |
||||
, langObjCpp ? targetPlatform.isDarwin |
||||
, langJava ? false |
||||
, langGo ? false |
||||
, profiledCompiler ? false |
||||
, staticCompiler ? false |
||||
, enableShared ? true |
||||
, texinfo ? null |
||||
, perl ? null # optional, for texi2pod (then pod2man); required for Java |
||||
, gmp, mpfr, libmpc, gettext, which |
||||
, libelf # optional, for link-time optimizations (LTO) |
||||
, isl ? null # optional, for the Graphite optimization framework. |
||||
, zlib ? null, boehmgc ? null |
||||
, zip ? null, unzip ? null, pkgconfig ? null |
||||
, gtk2 ? null, libart_lgpl ? null |
||||
, libX11 ? null, libXt ? null, libSM ? null, libICE ? null, libXtst ? null |
||||
, libXrender ? null, xproto ? null, renderproto ? null, xextproto ? null |
||||
, libXrandr ? null, libXi ? null, inputproto ? null, randrproto ? null |
||||
, x11Support ? langJava |
||||
, enableMultilib ? false |
||||
, enablePlugin ? hostPlatform == buildPlatform # Whether to support user-supplied plug-ins |
||||
, name ? "gcc" |
||||
, libcCross ? null |
||||
, crossStageStatic ? false |
||||
, libpthread ? null, libpthreadCross ? null # required for GNU/Hurd |
||||
, stripped ? true |
||||
, gnused ? null |
||||
, cloog # unused; just for compat with gcc4, as we override the parameter on some places |
||||
, darwin ? null |
||||
, buildPlatform, hostPlatform, targetPlatform |
||||
, buildPackages |
||||
}: |
||||
|
||||
assert langJava -> zip != null && unzip != null |
||||
&& zlib != null && boehmgc != null |
||||
&& perl != null; # for `--enable-java-home' |
||||
|
||||
# LTO needs libelf and zlib. |
||||
assert libelf != null -> zlib != null; |
||||
|
||||
# Make sure we get GNU sed. |
||||
assert hostPlatform.isDarwin -> gnused != null; |
||||
|
||||
# The go frontend is written in c++ |
||||
assert langGo -> langCC; |
||||
|
||||
with stdenv.lib; |
||||
with builtins; |
||||
|
||||
let version = "8.1.0"; |
||||
|
||||
# Whether building a cross-compiler for GNU/Hurd. |
||||
crossGNU = targetPlatform != hostPlatform && targetPlatform.config == "i586-pc-gnu"; |
||||
|
||||
enableParallelBuilding = true; |
||||
|
||||
patches = |
||||
[ # https://gcc.gnu.org/ml/gcc-patches/2018-02/msg00633.html |
||||
/* ./riscv-pthread-reentrant.patch */ # TODO: is this needed? |
||||
# https://gcc.gnu.org/ml/gcc-patches/2018-03/msg00297.html |
||||
/* ./riscv-no-relax.patch */ |
||||
] |
||||
++ optional (targetPlatform != hostPlatform) ../libstdc++-target.patch |
||||
++ optional noSysDirs ../no-sys-dirs.patch |
||||
/* ++ optional (hostPlatform != buildPlatform) (fetchpatch { # XXX: Refine when this should be applied |
||||
url = "https://git.busybox.net/buildroot/plain/package/gcc/7.1.0/0900-remove-selftests.patch?id=11271540bfe6adafbc133caf6b5b902a816f5f02"; |
||||
sha256 = "0mrvxsdwip2p3l17dscpc1x8vhdsciqw1z5q9i6p5g9yg1cqnmgs"; |
||||
}) */ |
||||
++ optional langFortran ../gfortran-driving.patch; |
||||
|
||||
javaEcj = fetchurl { |
||||
# The `$(top_srcdir)/ecj.jar' file is automatically picked up at |
||||
# `configure' time. |
||||
|
||||
# XXX: Eventually we might want to take it from upstream. |
||||
url = "ftp://sourceware.org/pub/java/ecj-4.3.jar"; |
||||
sha256 = "0jz7hvc0s6iydmhgh5h2m15yza7p2rlss2vkif30vm9y77m97qcx"; |
||||
}; |
||||
|
||||
# Antlr (optional) allows the Java `gjdoc' tool to be built. We want a |
||||
# binary distribution here to allow the whole chain to be bootstrapped. |
||||
javaAntlr = fetchurl { |
||||
url = http://www.antlr.org/download/antlr-4.4-complete.jar; |
||||
sha256 = "02lda2imivsvsis8rnzmbrbp8rh1kb8vmq4i67pqhkwz7lf8y6dz"; |
||||
}; |
||||
|
||||
xlibs = [ |
||||
libX11 libXt libSM libICE libXtst libXrender libXrandr libXi |
||||
xproto renderproto xextproto inputproto randrproto |
||||
]; |
||||
|
||||
javaAwtGtk = langJava && x11Support; |
||||
|
||||
/* Platform flags */ |
||||
platformFlags = let |
||||
gccArch = targetPlatform.platform.gcc.arch or null; |
||||
gccCpu = targetPlatform.platform.gcc.cpu or null; |
||||
gccAbi = targetPlatform.platform.gcc.abi or null; |
||||
gccFpu = targetPlatform.platform.gcc.fpu or null; |
||||
gccFloat = targetPlatform.platform.gcc.float or null; |
||||
gccMode = targetPlatform.platform.gcc.mode or null; |
||||
in |
||||
optional (gccArch != null) "--with-arch=${gccArch}" ++ |
||||
optional (gccCpu != null) "--with-cpu=${gccCpu}" ++ |
||||
optional (gccAbi != null) "--with-abi=${gccAbi}" ++ |
||||
optional (gccFpu != null) "--with-fpu=${gccFpu}" ++ |
||||
optional (gccFloat != null) "--with-float=${gccFloat}" ++ |
||||
optional (gccMode != null) "--with-mode=${gccMode}"; |
||||
|
||||
/* Cross-gcc settings (build == host != target) */ |
||||
crossMingw = targetPlatform != hostPlatform && targetPlatform.libc == "msvcrt"; |
||||
crossDarwin = targetPlatform != hostPlatform && targetPlatform.libc == "libSystem"; |
||||
crossConfigureFlags = |
||||
# Ensure that -print-prog-name is able to find the correct programs. |
||||
[ "--with-as=${targetPackages.stdenv.cc.bintools}/bin/${targetPlatform.config}-as" |
||||
"--with-ld=${targetPackages.stdenv.cc.bintools}/bin/${targetPlatform.config}-ld" ] ++ |
||||
(if crossMingw && crossStageStatic then [ |
||||
"--with-headers=${libcCross}/include" |
||||
"--with-gcc" |
||||
"--with-gnu-as" |
||||
"--with-gnu-ld" |
||||
"--with-gnu-ld" |
||||
"--disable-shared" |
||||
"--disable-nls" |
||||
"--disable-debug" |
||||
"--enable-sjlj-exceptions" |
||||
"--enable-threads=win32" |
||||
"--disable-win32-registry" |
||||
] else if crossStageStatic then [ |
||||
"--disable-libssp" |
||||
"--disable-nls" |
||||
"--without-headers" |
||||
"--disable-threads" |
||||
"--disable-libgomp" |
||||
"--disable-libquadmath" |
||||
"--disable-shared" |
||||
"--disable-libatomic" # libatomic requires libc |
||||
"--disable-decimal-float" # libdecnumber requires libc |
||||
# maybe only needed on musl, PATH_MAX |
||||
# https://github.com/richfelker/musl-cross-make/blob/0867cdf300618d1e3e87a0a939fa4427207ad9d7/litecross/Makefile#L62 |
||||
"--disable-libmpx" |
||||
] else [ |
||||
(if crossDarwin then "--with-sysroot=${getLib libcCross}/share/sysroot" |
||||
else "--with-headers=${getDev libcCross}/include") |
||||
"--enable-__cxa_atexit" |
||||
"--enable-long-long" |
||||
] ++ |
||||
(if crossMingw then [ |
||||
"--enable-threads=win32" |
||||
"--enable-sjlj-exceptions" |
||||
"--enable-hash-synchronization" |
||||
"--enable-libssp" |
||||
"--disable-nls" |
||||
"--with-dwarf2" |
||||
# To keep ABI compatibility with upstream mingw-w64 |
||||
"--enable-fully-dynamic-string" |
||||
] else |
||||
optionals (targetPlatform.libc == "uclibc" || targetPlatform.libc == "musl") [ |
||||
# libsanitizer requires netrom/netrom.h which is not |
||||
# available in uclibc. |
||||
"--disable-libsanitizer" |
||||
# In uclibc cases, libgomp needs an additional '-ldl' |
||||
# and as I don't know how to pass it, I disable libgomp. |
||||
"--disable-libgomp" |
||||
# musl at least, disable: https://git.buildroot.net/buildroot/commit/?id=873d4019f7fb00f6a80592224236b3ba7d657865 |
||||
"--disable-libmpx" |
||||
] ++ [ |
||||
"--enable-threads=posix" |
||||
"--enable-nls" |
||||
"--disable-decimal-float" # No final libdecnumber (it may work only in 386) |
||||
])); |
||||
stageNameAddon = if crossStageStatic then "-stage-static" else "-stage-final"; |
||||
crossNameAddon = if targetPlatform != hostPlatform then "-${targetPlatform.config}" + stageNameAddon else ""; |
||||
|
||||
bootstrap = targetPlatform == hostPlatform; |
||||
|
||||
in |
||||
|
||||
# We need all these X libraries when building AWT with GTK+. |
||||
assert x11Support -> (filter (x: x == null) ([ gtk2 libart_lgpl ] ++ xlibs)) == []; |
||||
|
||||
stdenv.mkDerivation ({ |
||||
name = "${name}${if stripped then "" else "-debug"}-${version}" + crossNameAddon; |
||||
|
||||
builder = ../builder.sh; |
||||
|
||||
src = fetchurl { |
||||
url = "mirror://gcc/releases/gcc-${version}/gcc-${version}.tar.xz"; |
||||
/* sha256 = "0p71bij6bfhzyrs8676a8jmpjsfz392s2rg862sdnsk30jpacb43"; */ |
||||
sha256 = "0lxil8x0jjx7zbf90cy1rli650akaa6hpk8wk8s62vk2jbwnc60x"; |
||||
}; |
||||
|
||||
inherit patches; |
||||
|
||||
outputs = [ "out" "lib" "man" "info" ]; |
||||
setOutputFlags = false; |
||||
NIX_NO_SELF_RPATH = true; |
||||
|
||||
libc_dev = stdenv.cc.libc_dev; |
||||
|
||||
hardeningDisable = [ "format" ]; |
||||
|
||||
# This should kill all the stdinc frameworks that gcc and friends like to |
||||
# insert into default search paths. |
||||
prePatch = stdenv.lib.optionalString hostPlatform.isDarwin '' |
||||
substituteInPlace gcc/config/darwin-c.c \ |
||||
--replace 'if (stdinc)' 'if (0)' |
||||
|
||||
substituteInPlace libgcc/config/t-slibgcc-darwin \ |
||||
--replace "-install_name @shlib_slibdir@/\$(SHLIB_INSTALL_NAME)" "-install_name $lib/lib/\$(SHLIB_INSTALL_NAME)" |
||||
|
||||
substituteInPlace libgfortran/configure \ |
||||
--replace "-install_name \\\$rpath/\\\$soname" "-install_name $lib/lib/\\\$soname" |
||||
''; |
||||
|
||||
postPatch = '' |
||||
configureScripts=$(find . -name configure) |
||||
for configureScript in $configureScripts; do |
||||
patchShebangs $configureScript |
||||
done |
||||
'' + ( |
||||
if (hostPlatform.isHurd |
||||
|| (libcCross != null # e.g., building `gcc.crossDrv' |
||||
&& libcCross ? crossConfig |
||||
&& libcCross.crossConfig == "i586-pc-gnu") |
||||
|| (crossGNU && libcCross != null)) |
||||
then |
||||
# On GNU/Hurd glibc refers to Hurd & Mach headers and libpthread is not |
||||
# in glibc, so add the right `-I' flags to the default spec string. |
||||
assert libcCross != null -> libpthreadCross != null; |
||||
let |
||||
libc = if libcCross != null then libcCross else stdenv.glibc; |
||||
gnu_h = "gcc/config/gnu.h"; |
||||
extraCPPDeps = |
||||
libc.propagatedBuildInputs |
||||
++ stdenv.lib.optional (libpthreadCross != null) libpthreadCross |
||||
++ stdenv.lib.optional (libpthread != null) libpthread; |
||||
extraCPPSpec = |
||||
concatStrings (intersperse " " |
||||
(map (x: "-I${x.dev or x}/include") extraCPPDeps)); |
||||
extraLibSpec = |
||||
if libpthreadCross != null |
||||
then "-L${libpthreadCross}/lib ${libpthreadCross.TARGET_LDFLAGS}" |
||||
else "-L${libpthread}/lib"; |
||||
in |
||||
'' echo "augmenting \`CPP_SPEC' in \`${gnu_h}' with \`${extraCPPSpec}'..." |
||||
sed -i "${gnu_h}" \ |
||||
-es'|CPP_SPEC *"\(.*\)$|CPP_SPEC "${extraCPPSpec} \1|g' |
||||
|
||||
echo "augmenting \`LIB_SPEC' in \`${gnu_h}' with \`${extraLibSpec}'..." |
||||
sed -i "${gnu_h}" \ |
||||
-es'|LIB_SPEC *"\(.*\)$|LIB_SPEC "${extraLibSpec} \1|g' |
||||
|
||||
echo "setting \`NATIVE_SYSTEM_HEADER_DIR' and \`STANDARD_INCLUDE_DIR' to \`${libc.dev}/include'..." |
||||
sed -i "${gnu_h}" \ |
||||
-es'|#define STANDARD_INCLUDE_DIR.*$|#define STANDARD_INCLUDE_DIR "${libc.dev}/include"|g' |
||||
'' |
||||
else if targetPlatform != hostPlatform || stdenv.cc.libc != null then |
||||
# On NixOS, use the right path to the dynamic linker instead of |
||||
# `/lib/ld*.so'. |
||||
let |
||||
libc = if libcCross != null then libcCross else stdenv.cc.libc; |
||||
in |
||||
( |
||||
'' echo "fixing the \`GLIBC_DYNAMIC_LINKER', \`UCLIBC_DYNAMIC_LINKER', and \`MUSL_DYNAMIC_LINKER' macros..." |
||||
for header in "gcc/config/"*-gnu.h "gcc/config/"*"/"*.h |
||||
do |
||||
grep -q _DYNAMIC_LINKER "$header" || continue |
||||
echo " fixing \`$header'..." |
||||
sed -i "$header" \ |
||||
-e 's|define[[:blank:]]*\([UCG]\+\)LIBC_DYNAMIC_LINKER\([0-9]*\)[[:blank:]]"\([^\"]\+\)"$|define \1LIBC_DYNAMIC_LINKER\2 "${libc.out}\3"|g' \ |
||||
-e 's|define[[:blank:]]*MUSL_DYNAMIC_LINKER\([0-9]*\)[[:blank:]]"\([^\"]\+\)"$|define MUSL_DYNAMIC_LINKER\1 "${libc.out}\2"|g' |
||||
done |
||||
'' |
||||
+ stdenv.lib.optionalString (targetPlatform.libc == "musl") |
||||
'' |
||||
sed -i gcc/config/linux.h -e '1i#undef LOCAL_INCLUDE_DIR' |
||||
'' |
||||
) |
||||
else ""); |
||||
|
||||
# TODO(@Ericson2314): Make passthru instead. Weird to avoid mass rebuild, |
||||
crossStageStatic = targetPlatform == hostPlatform || crossStageStatic; |
||||
inherit noSysDirs staticCompiler langJava |
||||
libcCross crossMingw; |
||||
|
||||
depsBuildBuild = [ buildPackages.stdenv.cc ]; |
||||
nativeBuildInputs = [ texinfo which gettext ] |
||||
++ (optional (perl != null) perl) |
||||
++ (optional javaAwtGtk pkgconfig); |
||||
|
||||
# For building runtime libs |
||||
depsBuildTarget = |
||||
if hostPlatform == buildPlatform then [ |
||||
targetPackages.stdenv.cc.bintools # newly-built gcc will be used |
||||
] else assert targetPlatform == hostPlatform; [ # build != host == target |
||||
stdenv.cc |
||||
]; |
||||
|
||||
buildInputs = [ |
||||
gmp mpfr libmpc libelf |
||||
targetPackages.stdenv.cc.bintools # For linking code at run-time |
||||
] ++ (optional (isl != null) isl) |
||||
++ (optional (zlib != null) zlib) |
||||
++ (optionals langJava [ boehmgc zip unzip ]) |
||||
++ (optionals javaAwtGtk ([ gtk2 libart_lgpl ] ++ xlibs)) |
||||
++ (optionals (targetPlatform != hostPlatform) [targetPackages.stdenv.cc.bintools]) |
||||
|
||||
# The builder relies on GNU sed (for instance, Darwin's `sed' fails with |
||||
# "-i may not be used with stdin"), and `stdenvNative' doesn't provide it. |
||||
++ (optional hostPlatform.isDarwin gnused) |
||||
++ (optional hostPlatform.isDarwin targetPackages.stdenv.cc.bintools) |
||||
; |
||||
|
||||
NIX_LDFLAGS = stdenv.lib.optionalString hostPlatform.isSunOS "-lm -ldl"; |
||||
|
||||
preConfigure = stdenv.lib.optionalString (hostPlatform.isSunOS && hostPlatform.is64bit) '' |
||||
export NIX_LDFLAGS=`echo $NIX_LDFLAGS | sed -e s~$prefix/lib~$prefix/lib/amd64~g` |
||||
export LDFLAGS_FOR_TARGET="-Wl,-rpath,$prefix/lib/amd64 $LDFLAGS_FOR_TARGET" |
||||
export CXXFLAGS_FOR_TARGET="-Wl,-rpath,$prefix/lib/amd64 $CXXFLAGS_FOR_TARGET" |
||||
export CFLAGS_FOR_TARGET="-Wl,-rpath,$prefix/lib/amd64 $CFLAGS_FOR_TARGET" |
||||
''; |
||||
|
||||
dontDisableStatic = true; |
||||
|
||||
# TODO(@Ericson2314): Always pass "--target" and always prefix. |
||||
configurePlatforms = |
||||
# TODO(@Ericson2314): Figure out what's going wrong with Arm |
||||
if buildPlatform == hostPlatform && hostPlatform == targetPlatform && targetPlatform.isAarch32 |
||||
then [] |
||||
else [ "build" "host" ] ++ stdenv.lib.optional (targetPlatform != hostPlatform) "target"; |
||||
|
||||
configureFlags = |
||||
# Basic dependencies |
||||
[ |
||||
"--with-gmp-include=${gmp.dev}/include" |
||||
"--with-gmp-lib=${gmp.out}/lib" |
||||
"--with-mpfr-include=${mpfr.dev}/include" |
||||
"--with-mpfr-lib=${mpfr.out}/lib" |
||||
"--with-mpc=${libmpc}" |
||||
] ++ |
||||
optional (libelf != null) "--with-libelf=${libelf}" ++ |
||||
optional (!(crossMingw && crossStageStatic)) |
||||
"--with-native-system-header-dir=${getDev stdenv.cc.libc}/include" ++ |
||||
|
||||
# Basic configuration |
||||
[ |
||||
"--enable-lto" |
||||
"--disable-libstdcxx-pch" |
||||
"--without-included-gettext" |
||||
"--with-system-zlib" |
||||
"--enable-static" |
||||
"--enable-languages=${ |
||||
concatStrings (intersperse "," |
||||
( optional langC "c" |
||||
++ optional langCC "c++" |
||||
++ optional langFortran "fortran" |
||||
++ optional langJava "java" |
||||
++ optional langGo "go" |
||||
++ optional langObjC "objc" |
||||
++ optional langObjCpp "obj-c++" |
||||
++ optionals crossDarwin [ "objc" "obj-c++" ] |
||||
) |
||||
) |
||||
}" |
||||
] ++ |
||||
|
||||
(if enableMultilib |
||||
then ["--enable-multilib" "--disable-libquadmath"] |
||||
else ["--disable-multilib"]) ++ |
||||
optional (!enableShared) "--disable-shared" ++ |
||||
(if enablePlugin |
||||
then ["--enable-plugin"] |
||||
else ["--disable-plugin"]) ++ |
||||
|
||||
# Optional features |
||||
optional (isl != null) "--with-isl=${isl}" ++ |
||||
|
||||
# Java options |
||||
optionals langJava [ |
||||
"--with-ecj-jar=${javaEcj}" |
||||
|
||||
# Follow Sun's layout for the convenience of IcedTea/OpenJDK. See |
||||
# <http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2010-April/008888.html>. |
||||
"--enable-java-home" |
||||
"--with-java-home=\${prefix}/lib/jvm/jre" |
||||
] ++ |
||||
optional javaAwtGtk "--enable-java-awt=gtk" ++ |
||||
optional (langJava && javaAntlr != null) "--with-antlr-jar=${javaAntlr}" ++ |
||||
|
||||
|
||||
platformFlags ++ |
||||
optional (targetPlatform != hostPlatform) crossConfigureFlags ++ |
||||
optional (!bootstrap) "--disable-bootstrap" ++ |
||||
|
||||
# Platform-specific flags |
||||
optional (targetPlatform == hostPlatform && targetPlatform.isi686) "--with-arch=i686" ++ |
||||
optionals hostPlatform.isSunOS [ |
||||
"--enable-long-long" "--enable-libssp" "--enable-threads=posix" "--disable-nls" "--enable-__cxa_atexit" |
||||
# On Illumos/Solaris GNU as is preferred |
||||
"--with-gnu-as" "--without-gnu-ld" |
||||
] |
||||
++ optional (targetPlatform == hostPlatform && targetPlatform.libc == "musl") "--disable-libsanitizer" |
||||
; |
||||
|
||||
targetConfig = if targetPlatform != hostPlatform then targetPlatform.config else null; |
||||
|
||||
buildFlags = |
||||
optional bootstrap (if profiledCompiler then "profiledbootstrap" else "bootstrap"); |
||||
|
||||
installTargets = |
||||
if stripped |
||||
then "install-strip" |
||||
else "install"; |
||||
|
||||
/* For cross-built gcc (build != host == target) */ |
||||
crossAttrs = { |
||||
dontStrip = true; |
||||
buildFlags = ""; |
||||
}; |
||||
|
||||
# http://gcc.gnu.org/install/specific.html#x86-64-x-solaris210 |
||||
${if hostPlatform.system == "x86_64-solaris" then "CC" else null} = "gcc -m64"; |
||||
|
||||
# Setting $CPATH and $LIBRARY_PATH to make sure both `gcc' and `xgcc' find the |
||||
# library headers and binaries, regarless of the language being compiled. |
||||
# |
||||
# Note: When building the Java AWT GTK+ peer, the build system doesn't honor |
||||
# `--with-gmp' et al., e.g., when building |
||||
# `libjava/classpath/native/jni/java-math/gnu_java_math_GMP.c', so we just add |
||||
# them to $CPATH and $LIBRARY_PATH in this case. |
||||
# |
||||
# Likewise, the LTO code doesn't find zlib. |
||||
# |
||||
# Cross-compiling, we need gcc not to read ./specs in order to build the g++ |
||||
# compiler (after the specs for the cross-gcc are created). Having |
||||
# LIBRARY_PATH= makes gcc read the specs from ., and the build breaks. |
||||
|
||||
CPATH = optionals (targetPlatform == hostPlatform) (makeSearchPathOutput "dev" "include" ([] |
||||
++ optional (zlib != null) zlib |
||||
++ optional langJava boehmgc |
||||
++ optionals javaAwtGtk xlibs |
||||
++ optionals javaAwtGtk [ gmp mpfr ] |
||||
++ optional (libpthread != null) libpthread |
||||
++ optional (libpthreadCross != null) libpthreadCross |
||||
|
||||
# On GNU/Hurd glibc refers to Mach & Hurd |
||||
# headers. |
||||
++ optionals (libcCross != null && libcCross ? propagatedBuildInputs) |
||||
libcCross.propagatedBuildInputs |
||||
)); |
||||
|
||||
LIBRARY_PATH = optionals (targetPlatform == hostPlatform) (makeLibraryPath ([] |
||||
++ optional (zlib != null) zlib |
||||
++ optional langJava boehmgc |
||||
++ optionals javaAwtGtk xlibs |
||||
++ optionals javaAwtGtk [ gmp mpfr ] |
||||
++ optional (libpthread != null) libpthread) |
||||
); |
||||
|
||||
EXTRA_TARGET_FLAGS = optionals |
||||
(targetPlatform != hostPlatform && libcCross != null) |
||||
([ |
||||
"-idirafter ${getDev libcCross}/include" |
||||
] ++ optionals (! crossStageStatic) [ |
||||
"-B${libcCross.out}/lib" |
||||
]); |
||||
|
||||
EXTRA_TARGET_LDFLAGS = optionals |
||||
(targetPlatform != hostPlatform && libcCross != null) |
||||
([ |
||||
"-Wl,-L${libcCross.out}/lib" |
||||
] ++ (if crossStageStatic then [ |
||||
"-B${libcCross.out}/lib" |
||||
] else [ |
||||
"-Wl,-rpath,${libcCross.out}/lib" |
||||
"-Wl,-rpath-link,${libcCross.out}/lib" |
||||
]) ++ optionals (libpthreadCross != null) [ |
||||
"-L${libpthreadCross}/lib" |
||||
"-Wl,${libpthreadCross.TARGET_LDFLAGS}" |
||||
]); |
||||
|
||||
passthru = |
||||
{ inherit langC langCC langObjC langObjCpp langFortran langGo version; isGNU = true; }; |
||||
|
||||
inherit enableParallelBuilding enableMultilib; |
||||
|
||||
inherit (stdenv) is64bit; |
||||
|
||||
meta = { |
||||
homepage = http://gcc.gnu.org/; |
||||
license = stdenv.lib.licenses.gpl3Plus; # runtime support libraries are typically LGPLv3+ |
||||
description = "GNU Compiler Collection, version ${version}" |
||||
+ (if stripped then "" else " (with debugging info)"); |
||||
|
||||
longDescription = '' |
||||
The GNU Compiler Collection includes compiler front ends for C, C++, |
||||
Objective-C, Fortran, OpenMP for C/C++/Fortran, Java, and Ada, as well |
||||
as libraries for these languages (libstdc++, libgcj, libgomp,...). |
||||
|
||||
GCC development is a part of the GNU Project, aiming to improve the |
||||
compiler used in the GNU system including the GNU/Linux variant. |
||||
''; |
||||
|
||||
maintainers = with stdenv.lib.maintainers; [ ]; |
||||
|
||||
platforms = |
||||
stdenv.lib.platforms.linux ++ |
||||
stdenv.lib.platforms.freebsd ++ |
||||
stdenv.lib.platforms.darwin; |
||||
}; |
||||
} |
||||
|
||||
// optionalAttrs (targetPlatform != hostPlatform && targetPlatform.libc == "msvcrt" && crossStageStatic) { |
||||
makeFlags = [ "all-gcc" "all-target-libgcc" ]; |
||||
installTargets = "install-gcc install-target-libgcc"; |
||||
} |
||||
|
||||
# Strip kills static libs of other archs (hence targetPlatform != hostPlatform) |
||||
// optionalAttrs (!stripped || targetPlatform != hostPlatform) { dontStrip = true; } |
||||
|
||||
// optionalAttrs (enableMultilib) { dontMoveLib64 = true; } |
||||
) |
@ -0,0 +1,109 @@ |
||||
commit e7c570f37384d824cb9725f237920e9691e57269
|
||||
gpg: Signature made Tue 06 Mar 2018 04:52:46 PM PST
|
||||
gpg: using RSA key 00CE76D1834960DFCE886DF8EF4CA1502CCBAB41
|
||||
gpg: issuer "palmer@dabbelt.com"
|
||||
gpg: Good signature from "Palmer Dabbelt <palmer@dabbelt.com>" [ultimate]
|
||||
gpg: aka "Palmer Dabbelt <palmer@sifive.com>" [ultimate]
|
||||
Author: Palmer Dabbelt <palmer@sifive.com>
|
||||
Date: Thu Mar 1 12:01:06 2018 -0800
|
||||
|
||||
RISC-V: Add and document the "-mno-relax" option
|
||||
|
||||
RISC-V relies on aggressive linker relaxation to get good code size. As
|
||||
a result no text symbol addresses can be known until link time, which
|
||||
means that alignment must be handled during the link. This alignment
|
||||
pass is essentially just another linker relaxation, so this has the
|
||||
unfortunate side effect that linker relaxation is required for
|
||||
correctness on many RISC-V targets.
|
||||
|
||||
The RISC-V assembler has supported an ".option norelax" for a long time
|
||||
because there are situations in which linker relaxation is a bad idea --
|
||||
the canonical example is when trying to materialize the initial value of
|
||||
the global pointer into a register, which would otherwise be relaxed to
|
||||
a NOP. We've been relying on users who want to disable relaxation for
|
||||
an entire link to pass "-Wl,--no-relax", but that still relies on the
|
||||
linker relaxing R_RISCV_ALIGN to handle alignment despite it not being
|
||||
strictly necessary.
|
||||
|
||||
This patch adds a GCC option, "-mno-relax", that disable linker
|
||||
relaxation by adding ".option norelax" to the top of every generated
|
||||
assembly file. The assembler is smart enough to handle alignment at
|
||||
assemble time for files that have never emitted a relaxable relocation,
|
||||
so this is sufficient to really disable all relaxations in the linker,
|
||||
which results in significantly faster link times for large objects.
|
||||
|
||||
This also has the side effect of allowing toolchains that don't support
|
||||
linker relaxation (LLVM and the Linux module loader) to function
|
||||
correctly. Toolchains that don't support linker relaxation should
|
||||
default to "-mno-relax" and error when presented with any R_RISCV_ALIGN
|
||||
relocation as those need to be handled for correctness.
|
||||
|
||||
gcc/ChangeLog
|
||||
|
||||
2018-03-01 Palmer Dabbelt <palmer@sifive.com>
|
||||
|
||||
* config/riscv/riscv.opt (mrelax): New option.
|
||||
* config/riscv/riscv.c (riscv_file_start): Emit ".option
|
||||
"norelax" when riscv_mrelax is disabled.
|
||||
* doc/invoke.texi (RISC-V): Document "-mrelax" and "-mno-relax".
|
||||
|
||||
diff --git a/gcc/config/riscv/riscv.c b/gcc/config/riscv/riscv.c
|
||||
index c38f6c394d54..3e81874de232 100644
|
||||
--- a/gcc/config/riscv/riscv.c
|
||||
+++ b/gcc/config/riscv/riscv.c
|
||||
@@ -3979,6 +3979,11 @@ riscv_file_start (void)
|
||||
|
||||
/* Instruct GAS to generate position-[in]dependent code. */
|
||||
fprintf (asm_out_file, "\t.option %spic\n", (flag_pic ? "" : "no"));
|
||||
+
|
||||
+ /* If the user specifies "-mno-relax" on the command line then disable linker
|
||||
+ relaxation in the assembler. */
|
||||
+ if (! riscv_mrelax)
|
||||
+ fprintf (asm_out_file, "\t.option norelax\n");
|
||||
}
|
||||
|
||||
/* Implement TARGET_ASM_OUTPUT_MI_THUNK. Generate rtl rather than asm text
|
||||
diff --git a/gcc/config/riscv/riscv.opt b/gcc/config/riscv/riscv.opt
|
||||
index 581a26bb5c1e..b37ac75d9bb4 100644
|
||||
--- a/gcc/config/riscv/riscv.opt
|
||||
+++ b/gcc/config/riscv/riscv.opt
|
||||
@@ -106,6 +106,11 @@ mexplicit-relocs
|
||||
Target Report Mask(EXPLICIT_RELOCS)
|
||||
Use %reloc() operators, rather than assembly macros, to load addresses.
|
||||
|
||||
+mrelax
|
||||
+Target Bool Var(riscv_mrelax) Init(1)
|
||||
+Take advantage of linker relaxations to reduce the number of instructions
|
||||
+required to materialize symbol addresses.
|
||||
+
|
||||
Mask(64BIT)
|
||||
|
||||
Mask(MUL)
|
||||
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
|
||||
index 8d366c626bae..deb48af2ecad 100644
|
||||
--- a/gcc/doc/invoke.texi
|
||||
+++ b/gcc/doc/invoke.texi
|
||||
@@ -1042,7 +1042,8 @@ See RS/6000 and PowerPC Options.
|
||||
-msave-restore -mno-save-restore @gol
|
||||
-mstrict-align -mno-strict-align @gol
|
||||
-mcmodel=medlow -mcmodel=medany @gol
|
||||
--mexplicit-relocs -mno-explicit-relocs @gol}
|
||||
+-mexplicit-relocs -mno-explicit-relocs @gol
|
||||
+-mrelax -mno-relax @gol}
|
||||
|
||||
@emph{RL78 Options}
|
||||
@gccoptlist{-msim -mmul=none -mmul=g13 -mmul=g14 -mallregs @gol
|
||||
@@ -23102,6 +23103,12 @@ Use or do not use assembler relocation operators when dealing with symbolic
|
||||
addresses. The alternative is to use assembler macros instead, which may
|
||||
limit optimization.
|
||||
|
||||
+@item -mrelax
|
||||
+@itemx -mno-relax
|
||||
+Take advantage of linker relaxations to reduce the number of instructions
|
||||
+required to materialize symbol addresses. The default is to take advantage of
|
||||
+linker relaxations.
|
||||
+
|
||||
@end table
|
||||
|
||||
@node RL78 Options
|
||||
|
@ -0,0 +1,13 @@ |
||||
Index: gcc/config/riscv/linux.h
|
||||
===================================================================
|
||||
--- a/gcc/config/riscv/linux.h (revision 257620)
|
||||
+++ b/gcc/config/riscv/linux.h (revision 257621)
|
||||
@@ -47,6 +47,8 @@
|
||||
|
||||
#define ICACHE_FLUSH_FUNC "__riscv_flush_icache"
|
||||
|
||||
+#define CPP_SPEC "%{pthread:-D_REENTRANT}"
|
||||
+
|
||||
#define LINK_SPEC "\
|
||||
-melf" XLEN_SPEC "lriscv \
|
||||
%{shared} \
|
Loading…
Reference in new issue