Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

llvm: factor out compiler-rt, fix libstdcxxStdenv sanitizer headers #39743

Merged
merged 4 commits into from
May 24, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions pkgs/build-support/cc-wrapper/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
, stdenvNoCC, nativeTools, propagateDoc ? !nativeTools, noLibc ? false, nativeLibc, nativePrefix ? ""
, cc ? null, libc ? null, bintools, coreutils ? null, shell ? stdenvNoCC.shell
, extraPackages ? [], extraBuildCommands ? ""
, isGNU ? false, isClang ? cc.isClang or false, gnugrep ? null
, isGNU ? false, isClang ? cc.isClang or false, isCompilerRT ? false, gnugrep ? null
, buildPackages ? {}
}:

Expand Down Expand Up @@ -90,7 +90,7 @@ stdenv.mkDerivation {
# Binutils, and Apple's "cctools"; "bintools" as an attempt to find an
# unused middle-ground name that evokes both.
inherit bintools;
inherit libc nativeTools nativeLibc nativePrefix isGNU isClang default_cxx_stdlib_compile;
inherit libc nativeTools nativeLibc nativePrefix isGNU isClang isCompilerRT default_cxx_stdlib_compile;

emacsBufferSetup = pkgs: ''
; We should handle propagation here too
Expand Down
9 changes: 2 additions & 7 deletions pkgs/development/compilers/llvm/6/clang/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,7 @@ let
"-DSPHINX_OUTPUT_MAN=ON"
"-DSPHINX_OUTPUT_HTML=OFF"
"-DSPHINX_WARNINGS_AS_ERRORS=OFF"
]
# Maybe with compiler-rt this won't be needed?
++ stdenv.lib.optional stdenv.isLinux "-DGCC_INSTALL_PREFIX=${gcc}"
++ stdenv.lib.optional (stdenv.cc.libc != null) "-DC_INCLUDE_DIRS=${stdenv.cc.libc}/include";
];

patches = [ ./purity.patch ];

Expand All @@ -51,13 +48,11 @@ let
outputs = [ "out" "lib" "python" ];

# Clang expects to find LLVMgold in its own prefix
# Clang expects to find sanitizer libraries in its own prefix
postInstall = ''
if [ -e ${llvm}/lib/LLVMgold.so ]; then
ln -sv ${llvm}/lib/LLVMgold.so $out/lib
fi

ln -sv ${llvm}/lib/clang/${release_version}/lib $out/lib/clang/${release_version}/
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we use a -B flag in libcxxstdenv instead? That is good for parallelism

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't follow. Use -B where to do what?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Eh, I'll just not worry about it for now.

ln -sv $out/bin/clang $out/bin/cpp

# Move libclang to 'lib' output
Expand All @@ -79,7 +74,7 @@ let
passthru = {
isClang = true;
inherit llvm;
} // stdenv.lib.optionalAttrs stdenv.isLinux {
} // stdenv.lib.optionalAttrs stdenv.targetPlatform.isLinux {
inherit gcc;
};

Expand Down
31 changes: 31 additions & 0 deletions pkgs/development/compilers/llvm/6/compiler-rt.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
{ stdenv, version, fetch, cmake, python, llvm }:
with stdenv.lib;
stdenv.mkDerivation rec {
name = "compiler-rt-${version}";
inherit version;
src = fetch "compiler-rt" "16m7rvh3w6vq10iwkjrr1nn293djld3xm62l5zasisaprx117k6h";

nativeBuildInputs = [ cmake python llvm ];
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pretty sure LLVM is just a build tool here? So it is a nativeBuildInput.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reallllyyy??? No wonder you were asking about using a stand-in for llvm-config, wonder what the details here are.


configureFlags = [
"-DCOMPILER_RT_DEFAULT_TARGET_ONLY=ON"
];

outputs = [ "dev" "out" ];

patches = [
./compiler-rt-codesign.patch # Revert compiler-rt commit that makes codesign mandatory
] ++ optional stdenv.hostPlatform.isMusl ./sanitizers-nongnu.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 = stdenv.lib.optionalString stdenv.isDarwin ''
substituteInPlace cmake/config-ix.cmake \
--replace 'set(COMPILER_RT_HAS_TSAN TRUE)' 'set(COMPILER_RT_HAS_TSAN FALSE)'
'';

enableParallelBuilding = true;
}
25 changes: 21 additions & 4 deletions pkgs/development/compilers/llvm/6/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ let
inherit sha256;
};

compiler-rt_src = fetch "compiler-rt" "16m7rvh3w6vq10iwkjrr1nn293djld3xm62l5zasisaprx117k6h";
clang-tools-extra_src = fetch "clang-tools-extra" "1ll9v6r29xfdiywbn9iss49ad39ah3fk91wiv0sr6k6k9i544fq5";

# Add man output without introducing extra dependencies.
Expand All @@ -27,7 +26,6 @@ let
in {

llvm = overrideManOutput (callPackage ./llvm.nix {
inherit compiler-rt_src;
inherit (targetLlvmLibraries) libcxxabi;
});
clang-unwrapped = overrideManOutput (callPackage ./clang {
Expand All @@ -43,11 +41,28 @@ let
libstdcxxClang = wrapCCWith {
cc = tools.clang-unwrapped;
extraPackages = [ libstdcxxHook ];
extraBuildCommands = stdenv.lib.optionalString stdenv.targetPlatform.isLinux ''
echo "--gcc-toolchain=${tools.clang-unwrapped.gcc}" >> $out/nix-support/cc-cflags
'';
};

libcxxClang = wrapCCWith {
libcxxClang = wrapCCWith rec {
cc = tools.clang-unwrapped;
extraPackages = [ targetLlvmLibraries.libcxx targetLlvmLibraries.libcxxabi ];
extraPackages = [
targetLlvmLibraries.libcxx
targetLlvmLibraries.libcxxabi
targetLlvmLibraries.compiler-rt
];
isCompilerRT = true;
extraBuildCommands = ''
rsrc="$out/resource-root"
mkdir "$rsrc"
ln -s "${cc}/lib/clang/${release_version}/include" "$rsrc"
ln -s "${targetLlvmLibraries.compiler-rt.out}/lib" "$rsrc/lib"
echo "-resource-dir=$rsrc" >> $out/nix-support/cc-cflags
'' + stdenv.lib.optionalString stdenv.targetPlatform.isLinux ''
echo "--gcc-toolchain=${tools.clang-unwrapped.gcc}" >> $out/nix-support/cc-cflags
'';
};

lld = callPackage ./lld.nix {};
Expand All @@ -59,6 +74,8 @@ let
callPackage = newScope (libraries // buildLlvmTools // { inherit stdenv cmake libxml2 python2 isl release_version version fetch; });
in {

compiler-rt = callPackage ./compiler-rt.nix {};

stdenv = overrideCC stdenv buildLlvmTools.clang;

libcxxStdenv = overrideCC stdenv buildLlvmTools.libcxxClang;
Expand Down
16 changes: 0 additions & 16 deletions pkgs/development/compilers/llvm/6/llvm.nix
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
, version
, release_version
, zlib
, compiler-rt_src
, libcxxabi
, debugVersion ? false
, enableManpages ? false
Expand All @@ -33,8 +32,6 @@ in stdenv.mkDerivation (rec {
unpackFile ${src}
mv llvm-${version}* llvm
sourceRoot=$PWD/llvm
unpackFile ${compiler-rt_src}
mv compiler-rt-* $sourceRoot/projects/compiler-rt
'';

outputs = [ "out" "python" ]
Expand All @@ -48,15 +45,7 @@ in stdenv.mkDerivation (rec {

propagatedBuildInputs = [ ncurses zlib ];

# 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 = stdenv.lib.optionalString stdenv.isDarwin ''
substituteInPlace ./projects/compiler-rt/cmake/config-ix.cmake \
--replace 'set(COMPILER_RT_HAS_TSAN TRUE)' 'set(COMPILER_RT_HAS_TSAN FALSE)'

substituteInPlace cmake/modules/AddLLVM.cmake \
--replace 'set(_install_name_dir INSTALL_NAME_DIR "@rpath")' "set(_install_name_dir INSTALL_NAME_DIR "$lib/lib")" \
--replace 'set(_install_rpath "@loader_path/../lib" ''${extra_libdir})' ""
Expand All @@ -70,15 +59,11 @@ in stdenv.mkDerivation (rec {
substituteInPlace unittests/Support/CMakeLists.txt \
--replace "Path.cpp" ""
rm unittests/Support/Path.cpp

# Revert compiler-rt commit that makes codesign mandatory
patch -p1 -i ${./compiler-rt-codesign.patch} -d projects/compiler-rt
'' + stdenv.lib.optionalString stdenv.hostPlatform.isMusl ''
patch -p1 -i ${../TLI-musl.patch}
substituteInPlace unittests/Support/CMakeLists.txt \
--replace "add_subdirectory(DynamicLibrary)" ""
rm unittests/Support/DynamicLibrary/DynamicLibraryTest.cpp
patch -p1 -i ${./sanitizers-nongnu.patch} -d projects/compiler-rt
'';

# hacky fix: created binaries need to be run before installation
Expand All @@ -93,7 +78,6 @@ in stdenv.mkDerivation (rec {
"-DLLVM_BUILD_TESTS=ON"
"-DLLVM_ENABLE_FFI=ON"
"-DLLVM_ENABLE_RTTI=ON"
"-DCOMPILER_RT_INCLUDE_TESTS=OFF" # FIXME: requires clang source code
]
++ stdenv.lib.optional enableSharedLibraries
"-DLLVM_LINK_LLVM_DYLIB=ON"
Expand Down
5 changes: 5 additions & 0 deletions pkgs/test/cc-wrapper/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,11 @@ stdenv.mkDerivation {

NIX_LDFLAGS="-L$NIX_BUILD_TOP/foo/lib -rpath $NIX_BUILD_TOP/foo/lib" $CC -lfoo -o ldflags-check ${./ldflags-main.c}
./ldflags-check
'' + stdenv.lib.optionalString (stdenv.cc.isCompilerRT or false) ''

$CC -o sanitizers -fsanitize=address,undefined ${./sanitizers.c}
./sanitizers
'' + ''

touch $out
'';
Expand Down
8 changes: 8 additions & 0 deletions pkgs/test/cc-wrapper/sanitizers.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#include <sanitizer/asan_interface.h>
#include <stdio.h>

int main(int argc, char **argv)
{
fprintf(stderr, "ok\n");
return 0;
}