mirror of
https://github.com/NixOS/nixpkgs.git
synced 2025-01-04 03:53:56 +00:00
98ebcd28e1
compiler-rt has accumulated several regressions that prevent it from building on ARMv6. It is important to note that there are two major versions of ARMv6: base ARMv6 and ARMv6K. ARMv6K includes several important new instructions, such as non-word size atomic operations (ldrexd, strexd, etc.) and the yield instruction. Most ARMv6 CPUs actually implement ARMv6K, including all those used in Raspberry Pis, but nixpkgs' "raspberryPi" platform targets base ARMv6. compiler-rt versions 8-14 fail to build on ARMv6 and ARMv6K. compiler-rt 15 (not yet in nixpkgs) builds on ARMv6K but not ARMv6. This patch fixes versions 9-14 on both ARMv6 variants. The patches don't apply cleanly to version 8, and I figured it wasn't worth carrying another version of the patches for such an old version. A total of five patches are required to get compiler-rt building on ARMv6: * armv6-mcr-dmb.patch: use `mcr` to provide the equivalent of `dmb` on ARMv6. Included in LLVM 15. * armv6-sync-ops-no-thumb.patch: prevent certain atomic operation functions from using Thumb mode. Included in LLVM 15. * armv6-no-ldrexd-strexd.patch: don't use ldrexd or strexd, which are not available in base ARMv6. Submitted upstream by me. * armv6-scudo-no-yield.patch: use nop instead of yield on ARMv6 in standalone scudo. Required by versions >=13, since they enable standalone scudo. Submitted upstream by me. * armv6-scudo-libatomic.patch: link standlone scudo to libatomic on ARMv6 (and any other platforms that need it). Not yet submitted because the backport is a bit different from the upstream version and I need to test it.
140 lines
5.9 KiB
Nix
140 lines
5.9 KiB
Nix
{ lib, stdenv, llvm_meta, version
|
|
, monorepoSrc, runCommand
|
|
, cmake, python3, xcbuild, libllvm, libcxxabi, libxcrypt
|
|
, doFakeLibgcc ? stdenv.hostPlatform.isFreeBSD
|
|
}:
|
|
|
|
let
|
|
|
|
useLLVM = stdenv.hostPlatform.useLLVM or false;
|
|
bareMetal = stdenv.hostPlatform.parsed.kernel.name == "none";
|
|
haveLibc = stdenv.cc.libc != null;
|
|
inherit (stdenv.hostPlatform) isMusl;
|
|
|
|
baseName = "compiler-rt";
|
|
|
|
src = runCommand "${baseName}-src-${version}" {} ''
|
|
mkdir -p "$out"
|
|
cp -r ${monorepoSrc}/cmake "$out"
|
|
cp -r ${monorepoSrc}/${baseName} "$out"
|
|
'';
|
|
in
|
|
|
|
stdenv.mkDerivation {
|
|
pname = baseName + lib.optionalString (haveLibc) "-libc";
|
|
inherit version;
|
|
|
|
inherit src;
|
|
sourceRoot = "${src.name}/${baseName}";
|
|
|
|
nativeBuildInputs = [ cmake python3 libllvm.dev ]
|
|
++ lib.optional stdenv.isDarwin xcbuild.xcrun;
|
|
buildInputs = lib.optional stdenv.hostPlatform.isDarwin libcxxabi;
|
|
|
|
env.NIX_CFLAGS_COMPILE = toString [
|
|
"-DSCUDO_DEFAULT_OPTIONS=DeleteSizeMismatch=0:DeallocationTypeMismatch=0"
|
|
];
|
|
|
|
cmakeFlags = [
|
|
"-DCOMPILER_RT_DEFAULT_TARGET_ONLY=ON"
|
|
"-DCMAKE_C_COMPILER_TARGET=${stdenv.hostPlatform.config}"
|
|
"-DCMAKE_ASM_COMPILER_TARGET=${stdenv.hostPlatform.config}"
|
|
] ++ lib.optionals (haveLibc && stdenv.hostPlatform.isGnu) [
|
|
"-DSANITIZER_COMMON_CFLAGS=-I${libxcrypt}/include"
|
|
] ++ lib.optionals (useLLVM || bareMetal || isMusl) [
|
|
"-DCOMPILER_RT_BUILD_SANITIZERS=OFF"
|
|
"-DCOMPILER_RT_BUILD_XRAY=OFF"
|
|
"-DCOMPILER_RT_BUILD_LIBFUZZER=OFF"
|
|
"-DCOMPILER_RT_BUILD_MEMPROF=OFF"
|
|
"-DCOMPILER_RT_BUILD_ORC=OFF" # may be possible to build with musl if necessary
|
|
] ++ lib.optionals (useLLVM || bareMetal) [
|
|
"-DCOMPILER_RT_BUILD_PROFILE=OFF"
|
|
] ++ lib.optionals ((useLLVM && !haveLibc) || bareMetal) [
|
|
"-DCMAKE_C_COMPILER_WORKS=ON"
|
|
"-DCMAKE_CXX_COMPILER_WORKS=ON"
|
|
"-DCOMPILER_RT_BAREMETAL_BUILD=ON"
|
|
"-DCMAKE_SIZEOF_VOID_P=${toString (stdenv.hostPlatform.parsed.cpu.bits / 8)}"
|
|
] ++ lib.optionals (useLLVM && !haveLibc) [
|
|
"-DCMAKE_C_FLAGS=-nodefaultlibs"
|
|
] ++ lib.optionals (useLLVM) [
|
|
"-DCOMPILER_RT_BUILD_BUILTINS=ON"
|
|
#https://stackoverflow.com/questions/53633705/cmake-the-c-compiler-is-not-able-to-compile-a-simple-test-program
|
|
"-DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY"
|
|
] ++ lib.optionals (bareMetal) [
|
|
"-DCOMPILER_RT_OS_DIR=baremetal"
|
|
] ++ lib.optionals (stdenv.hostPlatform.isDarwin) [
|
|
"-DDARWIN_macosx_OVERRIDE_SDK_VERSION=ON"
|
|
"-DDARWIN_osx_ARCHS=${stdenv.hostPlatform.darwinArch}"
|
|
"-DDARWIN_osx_BUILTIN_ARCHS=${stdenv.hostPlatform.darwinArch}"
|
|
];
|
|
|
|
outputs = [ "out" "dev" ];
|
|
|
|
patches = [
|
|
./codesign.patch # Revert compiler-rt commit that makes codesign mandatory
|
|
./X86-support-extension.patch # Add support for i486 i586 i686 by reusing i386 config
|
|
./gnu-install-dirs.patch
|
|
# ld-wrapper dislikes `-rpath-link //nix/store`, so we normalize away the
|
|
# extra `/`.
|
|
./normalize-var.patch
|
|
# Prevent a compilation error on darwin
|
|
./darwin-targetconditionals.patch
|
|
../../common/compiler-rt/darwin-plistbuddy-workaround.patch
|
|
./armv7l.patch
|
|
# Fix build on armv6l
|
|
../../common/compiler-rt/armv6-mcr-dmb.patch
|
|
../../common/compiler-rt/armv6-sync-ops-no-thumb.patch
|
|
../../common/compiler-rt/armv6-no-ldrexd-strexd.patch
|
|
../../common/compiler-rt/armv6-scudo-no-yield.patch
|
|
../../common/compiler-rt/armv6-scudo-libatomic.patch
|
|
];
|
|
|
|
# TSAN requires XPC on Darwin, which we have no public/free source files for. We can depend on the Apple frameworks
|
|
# to get it, but they're unfree. Since LLVM is rather central to the stdenv, we patch out TSAN support so that Hydra
|
|
# can build this. If we didn't do it, basically the entire nixpkgs on Darwin would have an unfree dependency and we'd
|
|
# get no binary cache for the entire platform. If you really find yourself wanting the TSAN, make this controllable by
|
|
# a flag and turn the flag off during the stdenv build.
|
|
postPatch = lib.optionalString (!stdenv.isDarwin) ''
|
|
substituteInPlace cmake/builtin-config-ix.cmake \
|
|
--replace 'set(X86 i386)' 'set(X86 i386 i486 i586 i686)'
|
|
'' + lib.optionalString stdenv.isDarwin ''
|
|
substituteInPlace cmake/config-ix.cmake \
|
|
--replace 'set(COMPILER_RT_HAS_TSAN TRUE)' 'set(COMPILER_RT_HAS_TSAN FALSE)'
|
|
'' + lib.optionalString (useLLVM) ''
|
|
substituteInPlace lib/builtins/int_util.c \
|
|
--replace "#include <stdlib.h>" ""
|
|
substituteInPlace lib/builtins/clear_cache.c \
|
|
--replace "#include <assert.h>" ""
|
|
substituteInPlace lib/builtins/cpu_model.c \
|
|
--replace "#include <assert.h>" ""
|
|
'';
|
|
|
|
# Hack around weird upsream RPATH bug
|
|
postInstall = lib.optionalString (stdenv.hostPlatform.isDarwin || stdenv.hostPlatform.isWasm) ''
|
|
ln -s "$out/lib"/*/* "$out/lib"
|
|
'' + lib.optionalString (useLLVM) ''
|
|
ln -s $out/lib/*/clang_rt.crtbegin-*.o $out/lib/crtbegin.o
|
|
ln -s $out/lib/*/clang_rt.crtend-*.o $out/lib/crtend.o
|
|
ln -s $out/lib/*/clang_rt.crtbegin_shared-*.o $out/lib/crtbeginS.o
|
|
ln -s $out/lib/*/clang_rt.crtend_shared-*.o $out/lib/crtendS.o
|
|
'' + lib.optionalString doFakeLibgcc ''
|
|
ln -s $out/lib/freebsd/libclang_rt.builtins-*.a $out/lib/libgcc.a
|
|
'';
|
|
|
|
meta = llvm_meta // {
|
|
homepage = "https://compiler-rt.llvm.org/";
|
|
description = "Compiler runtime libraries";
|
|
longDescription = ''
|
|
The compiler-rt project provides highly tuned implementations of the
|
|
low-level code generator support routines like "__fixunsdfdi" and other
|
|
calls generated when a target doesn't have a short sequence of native
|
|
instructions to implement a core IR operation. It also provides
|
|
implementations of run-time libraries for dynamic testing tools such as
|
|
AddressSanitizer, ThreadSanitizer, MemorySanitizer, and DataFlowSanitizer.
|
|
'';
|
|
# "All of the code in the compiler-rt project is dual licensed under the MIT
|
|
# license and the UIUC License (a BSD-like license)":
|
|
license = with lib.licenses; [ mit ncsa ];
|
|
};
|
|
}
|