Skip to content

Commit 8a33fbc

Browse files
committed
Use haskell-wasm versions llvm and wasilibc
1 parent 799eac7 commit 8a33fbc

File tree

4 files changed

+205
-3
lines changed

4 files changed

+205
-3
lines changed

compiler/ghc/default.nix

+8-3
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,6 @@ let
122122
(buildPackages.haskell-nix.tool "ghc912" "libffi-wasm" {
123123
src = buildPackages.haskell-nix.sources.libffi-wasm;
124124
})
125-
buildPackages.clang
126125
targetPackages.buildPackages.clang
127126
targetPackages.buildPackages.llvm
128127
targetPackages.buildPackages.binaryen
@@ -228,7 +227,8 @@ let
228227
"--datadir=$doc/share/doc/ghc"
229228
] ++ lib.optionals (!targetPlatform.isGhcjs && !targetPlatform.isWasm && !targetPlatform.isAndroid) ["--with-curses-includes=${targetPackages.ncurses.dev}/include" "--with-curses-libraries=${targetPackages.ncurses.out}/lib"
230229
] ++ lib.optionals (targetLibffi != null && !targetPlatform.isGhcjs && !targetPlatform.isWasm) ["--with-system-libffi" "--with-ffi-includes=${targetLibffi.dev}/include" "--with-ffi-libraries=${targetLibffi.out}/lib"
231-
] ++ lib.optionals (targetPlatform.isWasm) ["--with-system-libffi"
230+
] ++ lib.optionals (targetPlatform.isWasm) [
231+
"--with-system-libffi"
232232
] ++ lib.optionals (!enableIntegerSimple && !targetPlatform.isGhcjs && !targetPlatform.isWasm) [
233233
"--with-gmp-includes=${targetGmp.dev}/include" "--with-gmp-libraries=${targetGmp.out}/lib"
234234
] ++ lib.optionals (targetPlatform == hostPlatform && hostPlatform.libc != "glibc" && !targetPlatform.isWindows) [
@@ -355,8 +355,12 @@ let
355355
+ lib.optionalString (!hostPlatform.isAarch64 && targetPlatform.isLinux && targetPlatform.isAarch64)
356356
" '*.rts.ghc.c.opts += -optc-mno-outline-atomics'"
357357
# PIC breaks GHC annotations on windows (see test/annotations for a test case)
358-
+ lib.optionalString (enableRelocatedStaticLibs && !targetPlatform.isWindows)
358+
+ lib.optionalString (enableRelocatedStaticLibs && !targetPlatform.isWindows && !targetPlatform.isWasm)
359359
" '*.*.ghc.*.opts += -fPIC' '*.*.cc.*.opts += -fPIC'"
360+
# C options for wasm
361+
+ lib.optionalString targetPlatform.isWasm (
362+
" 'stage1.*.ghc.*.opts += -optc-Wno-error=int-conversion -optc-O3 -optc-mcpu=lime1 -optc-mreference-types -optc-msimd128 -optc-mtail-call -optc-DXXH_NO_XXH3'"
363+
+ " 'stage1.*.ghc.cpp.opts += -optc-fno-exceptions'")
360364
# `-fexternal-dynamic-refs` causes `undefined reference` errors when building GHC cross compiler for windows
361365
+ lib.optionalString (enableRelocatedStaticLibs && targetPlatform.isx86_64 && !targetPlatform.isWindows)
362366
" '*.*.ghc.*.opts += -fexternal-dynamic-refs'"
@@ -469,6 +473,7 @@ haskell-nix.haskellLib.makeCompilerDeps (stdenv.mkDerivation (rec {
469473
export STRIP="${bintoolsFor.strip}/bin/${bintoolsFor.strip.targetPrefix}strip"
470474
export NIX_CFLAGS_COMPILE_FOR_BUILD+=" -I${libffi.dev}/include -L${libffi.out}/lib"
471475
export NIX_CFLAGS_COMPILE_FOR_TARGET+=" -I${targetLibffi.dev}/include -L${targetLibffi.out}/lib"
476+
substituteInPlace compiler/GHC.hs --replace-fail "panic \"corrupted wasi-sdk installation\"" "pure \"${targetPackages.wasilibc}\""
472477
''
473478
# GHC is a bit confused on its cross terminology, as these would normally be
474479
# the *host* tools.

overlays/default.nix

+2
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ let
9292
cacheCompilerDeps = import ./cache-compiler-deps.nix;
9393
lazy-inputs = import ../lazy-inputs;
9494
rcodesign = import ./rcodesign.nix;
95+
wasm = import ./wasm.nix;
9596
};
9697

9798
composeExtensions = f: g: final: prev:
@@ -126,6 +127,7 @@ let
126127
cabalPkgConfig
127128
gobject-introspection
128129
hix
130+
wasm
129131
# Restore nixpkgs haskell and haskellPackages
130132
(_: prev: { inherit (prev.haskell-nix-prev) haskell haskellPackages; })
131133
cacheCompilerDeps
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
diff --git a/CMakeLists.txt b/CMakeLists.txt
2+
index c9ff3696e22d..bd96aab5e237 100644
3+
--- a/CMakeLists.txt
4+
+++ b/CMakeLists.txt
5+
@@ -1133,9 +1133,9 @@ if (NOT TENSORFLOW_AOT_PATH STREQUAL "")
6+
add_subdirectory(${TENSORFLOW_AOT_PATH}/xla_aot_runtime_src
7+
${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/tf_runtime)
8+
install(TARGETS tf_xla_runtime EXPORT LLVMExports
9+
- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} COMPONENT tf_xla_runtime)
10+
+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX} COMPONENT tf_xla_runtime)
11+
install(TARGETS tf_xla_runtime EXPORT LLVMDevelopmentExports
12+
- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} COMPONENT tf_xla_runtime)
13+
+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX} COMPONENT tf_xla_runtime)
14+
set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS tf_xla_runtime)
15+
# Once we add more modules, we should handle this more automatically.
16+
if (DEFINED LLVM_OVERRIDE_MODEL_HEADER_INLINERSIZEMODEL)
17+
diff --git a/cmake/modules/AddLLVM.cmake b/cmake/modules/AddLLVM.cmake
18+
index baf47677b247..81954240a9bf 100644
19+
--- a/cmake/modules/AddLLVM.cmake
20+
+++ b/cmake/modules/AddLLVM.cmake
21+
@@ -974,8 +974,8 @@ macro(add_llvm_library name)
22+
endif()
23+
install(TARGETS ${name}
24+
${export_to_llvmexports}
25+
- LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} COMPONENT ${name}
26+
- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} COMPONENT ${name}
27+
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX} COMPONENT ${name}
28+
+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX} COMPONENT ${name}
29+
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT ${name})
30+
31+
if (NOT LLVM_ENABLE_IDE)
32+
@@ -2240,7 +2240,7 @@ function(llvm_install_library_symlink name dest type)
33+
set(LLVM_LINK_OR_COPY copy)
34+
endif()
35+
36+
- set(output_dir lib${LLVM_LIBDIR_SUFFIX})
37+
+ set(output_dir ${CMAKE_INSTALL_FULL_LIBDIR}${LLVM_LIBDIR_SUFFIX})
38+
if(WIN32 AND "${type}" STREQUAL "SHARED")
39+
set(output_dir "${CMAKE_INSTALL_BINDIR}")
40+
endif()
41+
@@ -2516,15 +2516,37 @@ function(llvm_setup_rpath name)
42+
43+
if (APPLE)
44+
set(_install_name_dir INSTALL_NAME_DIR "@rpath")
45+
- set(_install_rpath "@loader_path/../lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir})
46+
+ set(_install_rpath ${extra_libdir})
47+
elseif(${CMAKE_SYSTEM_NAME} MATCHES "AIX" AND BUILD_SHARED_LIBS)
48+
# $ORIGIN is not interpreted at link time by aix ld.
49+
# Since BUILD_SHARED_LIBS is only recommended for use by developers,
50+
# hardcode the rpath to build/install lib dir first in this mode.
51+
# FIXME: update this when there is better solution.
52+
- set(_install_rpath "${LLVM_LIBRARY_OUTPUT_INTDIR}" "${CMAKE_INSTALL_PREFIX}/lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir})
53+
+ set(_install_rpath "${LLVM_LIBRARY_OUTPUT_INTDIR}" "${CMAKE_INSTALL_FULL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" ${extra_libdir})
54+
elseif(UNIX)
55+
- set(_install_rpath "\$ORIGIN/../lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir})
56+
+ # Note that we add `extra_libdir` (aka `LLVM_LIBRARY_DIR` in our case) back
57+
+ # to `_install_rpath` here.
58+
+ #
59+
+ # In nixpkgs we do not build and install LLVM alongside rdeps of LLVM (i.e.
60+
+ # clang); instead LLVM is its own package and thus lands at its own nix
61+
+ # store path. This makes it so that the default relative rpath (`../lib/`)
62+
+ # does not point at the LLVM shared objects.
63+
+ #
64+
+ # More discussion here:
65+
+ # - https://github.com/NixOS/nixpkgs/pull/235624#discussion_r1220150329
66+
+ # - https://reviews.llvm.org/D146918 (16.0.5+)
67+
+ #
68+
+ # Note that we leave `extra_libdir` in `_build_rpath`: without FHS there is
69+
+ # no potential that this will result in us pulling in the "wrong" LLVM.
70+
+ # Adding this to the build rpath means we aren't forced to use
71+
+ # `installCheckPhase` instead of `checkPhase` (i.e. binaries in the build
72+
+ # dir, pre-install, will have the right rpath for LLVM).
73+
+ #
74+
+ # As noted in the differential above, an alternative solution is to have
75+
+ # all rdeps of nixpkgs' LLVM (that use the AddLLVM.cmake machinery) set
76+
+ # `CMAKE_INSTALL_RPATH`.
77+
+ set(_build_rpath "\$ORIGIN/../lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir})
78+
+ set(_install_rpath ${extra_libdir})
79+
if(${CMAKE_SYSTEM_NAME} MATCHES "(FreeBSD|DragonFly)")
80+
set_property(TARGET ${name} APPEND_STRING PROPERTY
81+
LINK_FLAGS " -Wl,-z,origin ")
82+
@@ -2539,9 +2561,9 @@ function(llvm_setup_rpath name)
83+
endif()
84+
85+
# Enable BUILD_WITH_INSTALL_RPATH unless CMAKE_BUILD_RPATH is set.
86+
- if("${CMAKE_BUILD_RPATH}" STREQUAL "")
87+
- set_property(TARGET ${name} PROPERTY BUILD_WITH_INSTALL_RPATH ON)
88+
- endif()
89+
+ #if("${CMAKE_BUILD_RPATH}" STREQUAL "")
90+
+ # set_property(TARGET ${name} PROPERTY BUILD_WITH_INSTALL_RPATH ON)
91+
+ #endif()
92+
93+
set_target_properties(${name} PROPERTIES
94+
INSTALL_RPATH "${_install_rpath}"
95+
diff --git a/cmake/modules/AddOCaml.cmake b/cmake/modules/AddOCaml.cmake
96+
index 2d9116b08a52..2dd7cad4ec66 100644
97+
--- a/cmake/modules/AddOCaml.cmake
98+
+++ b/cmake/modules/AddOCaml.cmake
99+
@@ -147,9 +147,9 @@ function(add_ocaml_library name)
100+
endforeach()
101+
102+
if( APPLE )
103+
- set(ocaml_rpath "@executable_path/../../../lib${LLVM_LIBDIR_SUFFIX}")
104+
+ set(ocaml_rpath ${LLVM_LIBRARY_DIR})
105+
elseif( UNIX )
106+
- set(ocaml_rpath "\\$ORIGIN/../../../lib${LLVM_LIBDIR_SUFFIX}")
107+
+ set(ocaml_rpath ${LLVM_LIBRARY_DIR})
108+
endif()
109+
list(APPEND ocaml_flags "-ldopt" "-Wl,-rpath,${ocaml_rpath}")
110+
111+
diff --git a/cmake/modules/CMakeLists.txt b/cmake/modules/CMakeLists.txt
112+
index ef4cfa3acdb5..7478e157a7c2 100644
113+
--- a/cmake/modules/CMakeLists.txt
114+
+++ b/cmake/modules/CMakeLists.txt
115+
@@ -130,7 +130,7 @@ set(LLVM_CONFIG_INCLUDE_DIRS
116+
)
117+
list(REMOVE_DUPLICATES LLVM_CONFIG_INCLUDE_DIRS)
118+
119+
-extend_path(LLVM_CONFIG_LIBRARY_DIR "\${LLVM_INSTALL_PREFIX}" "lib\${LLVM_LIBDIR_SUFFIX}")
120+
+extend_path(LLVM_CONFIG_LIBRARY_DIR "\${LLVM_INSTALL_PREFIX}" "${CMAKE_INSTALL_LIBDIR}\${LLVM_LIBDIR_SUFFIX}")
121+
set(LLVM_CONFIG_LIBRARY_DIRS
122+
"${LLVM_CONFIG_LIBRARY_DIR}"
123+
# FIXME: Should there be other entries here?
124+
diff --git a/tools/llvm-config/BuildVariables.inc.in b/tools/llvm-config/BuildVariables.inc.in
125+
index 370005cd8d7d..7e790bc52111 100644
126+
--- a/tools/llvm-config/BuildVariables.inc.in
127+
+++ b/tools/llvm-config/BuildVariables.inc.in
128+
@@ -23,6 +23,7 @@
129+
#define LLVM_CXXFLAGS "@LLVM_CXXFLAGS@"
130+
#define LLVM_BUILDMODE "@LLVM_BUILDMODE@"
131+
#define LLVM_LIBDIR_SUFFIX "@LLVM_LIBDIR_SUFFIX@"
132+
+#define LLVM_INSTALL_LIBDIR "@CMAKE_INSTALL_LIBDIR@"
133+
#define LLVM_INSTALL_INCLUDEDIR "@CMAKE_INSTALL_INCLUDEDIR@"
134+
#define LLVM_INSTALL_PACKAGE_DIR "@LLVM_INSTALL_PACKAGE_DIR@"
135+
#define LLVM_TARGETS_BUILT "@LLVM_TARGETS_BUILT@"
136+
diff --git a/tools/llvm-config/llvm-config.cpp b/tools/llvm-config/llvm-config.cpp
137+
index d5b76b1bb6c1..1dbdb2a8f10d 100644
138+
--- a/tools/llvm-config/llvm-config.cpp
139+
+++ b/tools/llvm-config/llvm-config.cpp
140+
@@ -366,7 +366,11 @@ int main(int argc, char **argv) {
141+
sys::fs::make_absolute(ActivePrefix, Path);
142+
ActiveBinDir = std::string(Path);
143+
}
144+
- ActiveLibDir = ActivePrefix + "/lib" + LLVM_LIBDIR_SUFFIX;
145+
+ {
146+
+ SmallString<256> Path(LLVM_INSTALL_LIBDIR LLVM_LIBDIR_SUFFIX);
147+
+ sys::fs::make_absolute(ActivePrefix, Path);
148+
+ ActiveLibDir = std::string(Path);
149+
+ }
150+
{
151+
SmallString<256> Path(LLVM_INSTALL_PACKAGE_DIR);
152+
sys::fs::make_absolute(ActivePrefix, Path);

overlays/wasm.nix

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
final: prev: prev.lib.optionalAttrs prev.stdenv.targetPlatform.isWasm {
2+
llvmPackages = final.llvmPackages_20.override {
3+
version = "20.1.0-haskel-wasm";
4+
gitRelease.rev-version = "20.1.0-haskell-wasm";
5+
officialRelease = null;
6+
patchesFn = p: p // { "llvm/gnu-install-dirs.patch" = [{path = ./patches/wasm;}]; };
7+
monorepoSrc = final.buildPackages.fetchFromGitLab {
8+
domain = "gitlab.haskell.org";
9+
owner = "haskell-wasm";
10+
repo = "llvm-project";
11+
rev = "3af5c33f0010c300d23adff0c576c637ba381580";
12+
hash = "sha256-GnOP0tpyk+cWjMCJtxGi7FT78Wckl8fb6eibfdFWAJk=";
13+
fetchSubmodules = true;
14+
};
15+
};
16+
wasilibc = prev.wasilibc.overrideAttrs (old: {
17+
version = "25";
18+
src = final.buildPackages.fetchFromGitLab {
19+
domain = "gitlab.haskell.org";
20+
owner = "haskell-wasm";
21+
repo = "wasi-libc";
22+
rev = "f8f0d3101e02aa3aaf37c5e31db23de34963053d";
23+
hash = "sha256-EvqbvVP9EH63C7KUmN4QaYjYbc4yGPU7vNev9u6a46o=";
24+
fetchSubmodules = true;
25+
};
26+
preBuild = ''
27+
patchShebangs ./scripts
28+
makeFlagsArray+=(
29+
"default"
30+
"libc_so"
31+
)
32+
'';
33+
postBuild = ''
34+
mkdir -p ${builtins.placeholder "out"}
35+
mkdir -p ${builtins.placeholder "dev"}
36+
mkdir -p ${builtins.placeholder "share"}
37+
cp -r sysroot/lib/wasm32-wasi ${builtins.placeholder "out"}/lib
38+
cp -r sysroot/include/wasm32-wasi ${builtins.placeholder "dev"}/include
39+
cp -r sysroot/share/wasm32-wasi ${builtins.placeholder "share"}/share
40+
'';
41+
nativeBuildInputs = old.nativeBuildInputs or [] ++ [ final.buildPackages.lld ];
42+
});
43+
}

0 commit comments

Comments
 (0)