summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRaito Bezarius <masterancpp@gmail.com>2023-03-11 22:47:34 +0100
committerRaito Bezarius <masterancpp@gmail.com>2023-03-11 22:47:42 +0100
commit6b48d8f3c2343848ecac4d0aa1b41b2619e8b8f7 (patch)
treee68511c0ee36863a44954394dc917652f51f9a60
parentqmmp: add missing plugins (diff)
downloadnixpkgs-6b48d8f3c2343848ecac4d0aa1b41b2619e8b8f7.tar.gz
llvmPackages_16: init
-rw-r--r--pkgs/development/compilers/llvm/16/bintools/default.nix37
-rw-r--r--pkgs/development/compilers/llvm/16/clang/default.nix129
-rw-r--r--pkgs/development/compilers/llvm/16/clang/gnu-install-dirs.patch105
-rw-r--r--pkgs/development/compilers/llvm/16/clang/purity.patch29
-rw-r--r--pkgs/development/compilers/llvm/16/compiler-rt/X86-support-extension.patch21
-rw-r--r--pkgs/development/compilers/llvm/16/compiler-rt/armv7l.patch32
-rw-r--r--pkgs/development/compilers/llvm/16/compiler-rt/darwin-targetconditionals.patch71
-rw-r--r--pkgs/development/compilers/llvm/16/compiler-rt/default.nix140
-rw-r--r--pkgs/development/compilers/llvm/16/compiler-rt/gnu-install-dirs.patch20
-rw-r--r--pkgs/development/compilers/llvm/16/compiler-rt/normalize-var.patch16
-rw-r--r--pkgs/development/compilers/llvm/16/default.nix365
-rw-r--r--pkgs/development/compilers/llvm/16/libcxx/default.nix110
-rw-r--r--pkgs/development/compilers/llvm/16/libcxx/gnu-install-dirs.patch22
-rw-r--r--pkgs/development/compilers/llvm/16/libcxxabi/default.nix108
-rw-r--r--pkgs/development/compilers/llvm/16/libcxxabi/gnu-install-dirs.patch22
-rw-r--r--pkgs/development/compilers/llvm/16/libcxxabi/wasm.patch16
-rw-r--r--pkgs/development/compilers/llvm/16/libunwind/default.nix62
-rw-r--r--pkgs/development/compilers/llvm/16/libunwind/gnu-install-dirs.patch22
-rw-r--r--pkgs/development/compilers/llvm/16/lld/default.nix55
-rw-r--r--pkgs/development/compilers/llvm/16/lld/gnu-install-dirs.patch46
-rw-r--r--pkgs/development/compilers/llvm/16/lldb/cpu_subtype_arm64e_replacement.patch12
-rw-r--r--pkgs/development/compilers/llvm/16/lldb/default.nix186
-rw-r--r--pkgs/development/compilers/llvm/16/lldb/gnu-install-dirs.patch23
-rw-r--r--pkgs/development/compilers/llvm/16/lldb/procfs.patch46
-rw-r--r--pkgs/development/compilers/llvm/16/lldb/resource-dir.patch13
-rw-r--r--pkgs/development/compilers/llvm/16/llvm/default.nix430
-rw-r--r--pkgs/development/compilers/llvm/16/llvm/gnu-install-dirs-polly.patch19
-rw-r--r--pkgs/development/compilers/llvm/16/llvm/gnu-install-dirs.patch138
-rw-r--r--pkgs/development/compilers/llvm/16/llvm/lit-shell-script-runner-set-dyld-library-path.patch26
-rw-r--r--pkgs/development/compilers/llvm/16/llvm/llvm-lit-cfg-add-libs-to-dylib-path.patch79
-rw-r--r--pkgs/development/compilers/llvm/16/llvm/polly-lit-cfg-add-libs-to-dylib-path.patch24
-rw-r--r--pkgs/development/compilers/llvm/16/openmp/default.nix74
-rw-r--r--pkgs/development/compilers/llvm/16/openmp/fix-find-tool.patch18
-rw-r--r--pkgs/development/compilers/llvm/16/openmp/gnu-install-dirs.patch22
-rw-r--r--pkgs/development/compilers/llvm/16/openmp/run-lit-directly.patch12
-rw-r--r--pkgs/development/compilers/p4c/bmv2.nix56
-rw-r--r--pkgs/development/compilers/p4c/test.nix2
-rw-r--r--pkgs/top-level/all-packages.nix7
38 files changed, 2615 insertions, 0 deletions
diff --git a/pkgs/development/compilers/llvm/16/bintools/default.nix b/pkgs/development/compilers/llvm/16/bintools/default.nix
new file mode 100644
index 000000000000..c7b20dd28e23
--- /dev/null
+++ b/pkgs/development/compilers/llvm/16/bintools/default.nix
@@ -0,0 +1,37 @@
+{ lib, runCommand, stdenv, llvm, lld, version }:
+
+let
+ prefix = lib.optionalString (stdenv.hostPlatform != stdenv.targetPlatform) "${stdenv.targetPlatform.config}-";
+in runCommand "llvm-binutils-${version}" {
+ preferLocalBuild = true;
+ passthru = {
+ isLLVM = true;
+ };
+} ''
+ mkdir -p $out/bin
+ for prog in ${lld}/bin/*; do
+ ln -s $prog $out/bin/${prefix}$(basename $prog)
+ done
+ for prog in ${llvm}/bin/*; do
+ ln -sf $prog $out/bin/${prefix}$(basename $prog)
+ done
+
+ ln -s ${llvm}/bin/llvm-ar $out/bin/${prefix}ar
+ ln -s ${llvm}/bin/llvm-ar $out/bin/${prefix}dlltool
+ ln -s ${llvm}/bin/llvm-ar $out/bin/${prefix}ranlib
+ ln -s ${llvm}/bin/llvm-cxxfilt $out/bin/${prefix}c++filt
+ ln -s ${llvm}/bin/llvm-debuginfod $out/bin/${prefix}debuginfod
+ ln -s ${llvm}/bin/llvm-debuginfod-find $out/bin/${prefix}debuginfod-find
+ ln -s ${llvm}/bin/llvm-dwp $out/bin/${prefix}dwp
+ ln -s ${llvm}/bin/llvm-nm $out/bin/${prefix}nm
+ ln -s ${llvm}/bin/llvm-objcopy $out/bin/${prefix}objcopy
+ ln -s ${llvm}/bin/llvm-objcopy $out/bin/${prefix}strip
+ ln -s ${llvm}/bin/llvm-objdump $out/bin/${prefix}objdump
+ ln -s ${llvm}/bin/llvm-rc $out/bin/${prefix}windres
+ ln -s ${llvm}/bin/llvm-readobj $out/bin/${prefix}readelf
+ ln -s ${llvm}/bin/llvm-size $out/bin/${prefix}size
+ ln -s ${llvm}/bin/llvm-strings $out/bin/${prefix}strings
+ ln -s ${llvm}/bin/llvm-symbolizer $out/bin/${prefix}addr2line
+
+ ln -s ${lld}/bin/lld $out/bin/${prefix}ld
+''
diff --git a/pkgs/development/compilers/llvm/16/clang/default.nix b/pkgs/development/compilers/llvm/16/clang/default.nix
new file mode 100644
index 000000000000..b0671150a7bd
--- /dev/null
+++ b/pkgs/development/compilers/llvm/16/clang/default.nix
@@ -0,0 +1,129 @@
+{ lib, stdenv, llvm_meta
+, monorepoSrc, runCommand
+, substituteAll, cmake, ninja, libxml2, libllvm, version, python3
+, buildLlvmTools
+, fixDarwinDylibNames
+, enableManpages ? false
+}:
+
+let
+ self = stdenv.mkDerivation (rec {
+ pname = "clang";
+ inherit version;
+
+ src = runCommand "${pname}-src-${version}" {} ''
+ mkdir -p "$out"
+ cp -r ${monorepoSrc}/cmake "$out"
+ cp -r ${monorepoSrc}/${pname} "$out"
+ cp -r ${monorepoSrc}/clang-tools-extra "$out"
+ '';
+
+ sourceRoot = "${src.name}/${pname}";
+
+ nativeBuildInputs = [ cmake ninja python3 ]
+ ++ lib.optional enableManpages python3.pkgs.sphinx
+ ++ lib.optional stdenv.hostPlatform.isDarwin fixDarwinDylibNames;
+
+ buildInputs = [ libxml2 libllvm ];
+
+ cmakeFlags = [
+ "-DCLANG_INSTALL_PACKAGE_DIR=${placeholder "dev"}/lib/cmake/clang"
+ "-DCLANGD_BUILD_XPC=OFF"
+ "-DLLVM_ENABLE_RTTI=ON"
+ ] ++ lib.optionals enableManpages [
+ "-DCLANG_INCLUDE_DOCS=ON"
+ "-DLLVM_ENABLE_SPHINX=ON"
+ "-DSPHINX_OUTPUT_MAN=ON"
+ "-DSPHINX_OUTPUT_HTML=OFF"
+ "-DSPHINX_WARNINGS_AS_ERRORS=OFF"
+ ] ++ lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [
+ "-DLLVM_TABLEGEN_EXE=${buildLlvmTools.llvm}/bin/llvm-tblgen"
+ "-DCLANG_TABLEGEN=${buildLlvmTools.libclang.dev}/bin/clang-tblgen"
+ ];
+
+ patches = [
+ ./purity.patch
+ # https://reviews.llvm.org/D51899
+ ./gnu-install-dirs.patch
+ (substituteAll {
+ src = ../../clang-11-12-LLVMgold-path.patch;
+ libllvmLibdir = "${libllvm.lib}/lib";
+ })
+ ];
+
+ postPatch = ''
+ (cd tools && ln -s ../../clang-tools-extra extra)
+
+ sed -i -e 's/DriverArgs.hasArg(options::OPT_nostdlibinc)/true/' \
+ -e 's/Args.hasArg(options::OPT_nostdlibinc)/true/' \
+ lib/Driver/ToolChains/*.cpp
+ '' + lib.optionalString stdenv.hostPlatform.isMusl ''
+ sed -i -e 's/lgcc_s/lgcc_eh/' lib/Driver/ToolChains/*.cpp
+ '';
+
+ outputs = [ "out" "lib" "dev" "python" ];
+
+ postInstall = ''
+ ln -sv $out/bin/clang $out/bin/cpp
+
+ # Move libclang to 'lib' output
+ moveToOutput "lib/libclang.*" "$lib"
+ moveToOutput "lib/libclang-cpp.*" "$lib"
+ substituteInPlace $dev/lib/cmake/clang/ClangTargets-release.cmake \
+ --replace "\''${_IMPORT_PREFIX}/lib/libclang." "$lib/lib/libclang." \
+ --replace "\''${_IMPORT_PREFIX}/lib/libclang-cpp." "$lib/lib/libclang-cpp."
+
+ mkdir -p $python/bin $python/share/clang/
+ mv $out/bin/{git-clang-format,scan-view} $python/bin
+ if [ -e $out/bin/set-xcode-analyzer ]; then
+ mv $out/bin/set-xcode-analyzer $python/bin
+ fi
+ mv $out/share/clang/*.py $python/share/clang
+ rm $out/bin/c-index-test
+ patchShebangs $python/bin
+
+ mkdir -p $dev/bin
+ cp bin/clang-tblgen $dev/bin
+ '';
+
+ passthru = {
+ isClang = true;
+ inherit libllvm;
+ };
+
+ meta = llvm_meta // {
+ homepage = "https://clang.llvm.org/";
+ description = "A C language family frontend for LLVM";
+ longDescription = ''
+ The Clang project provides a language front-end and tooling
+ infrastructure for languages in the C language family (C, C++, Objective
+ C/C++, OpenCL, CUDA, and RenderScript) for the LLVM project.
+ It aims to deliver amazingly fast compiles, extremely useful error and
+ warning messages and to provide a platform for building great source
+ level tools. The Clang Static Analyzer and clang-tidy are tools that
+ automatically find bugs in your code, and are great examples of the sort
+ of tools that can be built using the Clang frontend as a library to
+ parse C/C++ code.
+ '';
+ mainProgram = "clang";
+ };
+ } // lib.optionalAttrs enableManpages {
+ pname = "clang-manpages";
+
+ ninjaFlags = [ "docs-clang-man" ];
+
+ installPhase = ''
+ mkdir -p $out/share/man/man1
+ # Manually install clang manpage
+ cp docs/man/*.1 $out/share/man/man1/
+ '';
+
+ outputs = [ "out" ];
+
+ doCheck = false;
+
+ meta = llvm_meta // {
+ description = "man page for Clang ${version}";
+ };
+ });
+in self
diff --git a/pkgs/development/compilers/llvm/16/clang/gnu-install-dirs.patch b/pkgs/development/compilers/llvm/16/clang/gnu-install-dirs.patch
new file mode 100644
index 000000000000..f767c56836d5
--- /dev/null
+++ b/pkgs/development/compilers/llvm/16/clang/gnu-install-dirs.patch
@@ -0,0 +1,105 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index c27beec313d7..480f13e73c9f 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -78,15 +78,17 @@ if(CLANG_BUILT_STANDALONE)
+ if (NOT LLVM_CONFIG_FOUND)
+ # Pull values from LLVMConfig.cmake. We can drop this once the llvm-config
+ # path is removed.
+- set(MAIN_INCLUDE_DIR "${LLVM_INCLUDE_DIR}")
++ set(INCLUDE_DIRS ${LLVM_INCLUDE_DIRS})
+ set(LLVM_OBJ_DIR "${LLVM_BINARY_DIR}")
+ # N.B. this is just a default value, the CACHE PATHs below can be overriden.
+ set(MAIN_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../llvm")
+ set(TOOLS_BINARY_DIR "${LLVM_TOOLS_BINARY_DIR}")
+ set(LIBRARY_DIR "${LLVM_LIBRARY_DIR}")
++ else()
++ set(INCLUDE_DIRS "${LLVM_BINARY_DIR}/include" "${MAIN_INCLUDE_DIR}")
+ endif()
+
+- set(LLVM_MAIN_INCLUDE_DIR "${MAIN_INCLUDE_DIR}" CACHE PATH "Path to llvm/include")
++ set(LLVM_INCLUDE_DIRS ${INCLUDE_DIRS} CACHE PATH "Path to llvm/include and any other header dirs needed")
+ set(LLVM_BINARY_DIR "${LLVM_OBJ_ROOT}" CACHE PATH "Path to LLVM build tree")
+ set(LLVM_MAIN_SRC_DIR "${MAIN_SRC_DIR}" CACHE PATH "Path to LLVM source tree")
+ set(LLVM_TOOLS_BINARY_DIR "${TOOLS_BINARY_DIR}" CACHE PATH "Path to llvm/bin")
+@@ -128,7 +130,7 @@ if(CLANG_BUILT_STANDALONE)
+ set(LLVM_INCLUDE_TESTS ON)
+ endif()
+
+- include_directories("${LLVM_BINARY_DIR}/include" "${LLVM_MAIN_INCLUDE_DIR}")
++ include_directories(${LLVM_INCLUDE_DIRS})
+ link_directories("${LLVM_LIBRARY_DIR}")
+
+ set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin )
+diff --git a/cmake/modules/AddClang.cmake b/cmake/modules/AddClang.cmake
+index 21ac332e4f5f..b16c314bd1e2 100644
+--- a/cmake/modules/AddClang.cmake
++++ b/cmake/modules/AddClang.cmake
+@@ -119,8 +119,8 @@ macro(add_clang_library name)
+ install(TARGETS ${lib}
+ COMPONENT ${lib}
+ ${export_to_clangtargets}
+- LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX}
+- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX}
++ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}"
++ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}"
+ RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
+
+ if (NOT LLVM_ENABLE_IDE)
+diff --git a/lib/Headers/CMakeLists.txt b/lib/Headers/CMakeLists.txt
+index 6e2060991b92..b9bc930d26b8 100644
+--- a/lib/Headers/CMakeLists.txt
++++ b/lib/Headers/CMakeLists.txt
+@@ -420,7 +420,7 @@ add_header_target("openmp-resource-headers" ${openmp_wrapper_files})
+ add_header_target("windows-resource-headers" ${windows_only_files})
+ add_header_target("utility-resource-headers" ${utility_files})
+
+-set(header_install_dir lib${LLVM_LIBDIR_SUFFIX}/clang/${CLANG_VERSION}/include)
++set(header_install_dir ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}/clang/${CLANG_VERSION}/include)
+
+ #############################################################
+ # Install rules for the catch-all clang-resource-headers target
+diff --git a/tools/libclang/CMakeLists.txt b/tools/libclang/CMakeLists.txt
+index 8d95d0900e8c..ebc70ff7526d 100644
+--- a/tools/libclang/CMakeLists.txt
++++ b/tools/libclang/CMakeLists.txt
+@@ -180,7 +180,7 @@ foreach(PythonVersion ${CLANG_PYTHON_BINDINGS_VERSIONS})
+ COMPONENT
+ libclang-python-bindings
+ DESTINATION
+- "lib${LLVM_LIBDIR_SUFFIX}/python${PythonVersion}/site-packages")
++ "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}/python${PythonVersion}/site-packages")
+ endforeach()
+ if(NOT LLVM_ENABLE_IDE)
+ add_custom_target(libclang-python-bindings)
+diff --git a/tools/scan-build-py/CMakeLists.txt b/tools/scan-build-py/CMakeLists.txt
+index 061dc7ef4dd9..adc54b2edc32 100644
+--- a/tools/scan-build-py/CMakeLists.txt
++++ b/tools/scan-build-py/CMakeLists.txt
+@@ -88,7 +88,7 @@ foreach(lib ${LibScanbuild})
+ DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/lib/libscanbuild/${lib})
+ list(APPEND Depends ${CMAKE_BINARY_DIR}/lib/libscanbuild/${lib})
+ install(PROGRAMS lib/libscanbuild/${lib}
+- DESTINATION lib/libscanbuild
++ DESTINATION "${CMAKE_INSTALL_LIBDIR}/libscanbuild"
+ COMPONENT scan-build-py)
+ endforeach()
+
+@@ -106,7 +106,7 @@ foreach(resource ${LibScanbuildResources})
+ DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/lib/libscanbuild/resources/${resource})
+ list(APPEND Depends ${CMAKE_BINARY_DIR}/lib/libscanbuild/resources/${resource})
+ install(PROGRAMS lib/libscanbuild/resources/${resource}
+- DESTINATION lib/libscanbuild/resources
++ DESTINATION "${CMAKE_INSTALL_LIBDIR}/libscanbuild/resources"
+ COMPONENT scan-build-py)
+ endforeach()
+
+@@ -122,7 +122,7 @@ foreach(lib ${LibEar})
+ DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/lib/libear/${lib})
+ list(APPEND Depends ${CMAKE_BINARY_DIR}/lib/libear/${lib})
+ install(PROGRAMS lib/libear/${lib}
+- DESTINATION lib/libear
++ DESTINATION "${CMAKE_INSTALL_LIBDIR}/libear"
+ COMPONENT scan-build-py)
+ endforeach()
+
diff --git a/pkgs/development/compilers/llvm/16/clang/purity.patch b/pkgs/development/compilers/llvm/16/clang/purity.patch
new file mode 100644
index 000000000000..1c94f293eb93
--- /dev/null
+++ b/pkgs/development/compilers/llvm/16/clang/purity.patch
@@ -0,0 +1,29 @@
+From 4add81bba40dcec62c4ea4481be8e35ac53e89d8 Mon Sep 17 00:00:00 2001
+From: Will Dietz <w@wdtz.org>
+Date: Thu, 18 May 2017 11:56:12 -0500
+Subject: [PATCH] "purity" patch for 5.0
+
+---
+ lib/Driver/ToolChains/Gnu.cpp | 7 -------
+ 1 file changed, 7 deletions(-)
+
+diff --git a/lib/Driver/ToolChains/Gnu.cpp b/lib/Driver/ToolChains/Gnu.cpp
+index fe3c0191bb..c6a482bece 100644
+--- a/lib/Driver/ToolChains/Gnu.cpp
++++ b/lib/Driver/ToolChains/Gnu.cpp
+@@ -487,13 +487,7 @@ void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
+ } else {
+ if (Args.hasArg(options::OPT_rdynamic))
+ CmdArgs.push_back("-export-dynamic");
+
+- if (!Args.hasArg(options::OPT_shared) && !IsStaticPIE &&
+- !Args.hasArg(options::OPT_r)) {
+- CmdArgs.push_back("-dynamic-linker");
+- CmdArgs.push_back(Args.MakeArgString(Twine(D.DyldPrefix) +
+- ToolChain.getDynamicLinker(Args)));
+- }
+ }
+
+ CmdArgs.push_back("-o");
+--
+2.11.0
diff --git a/pkgs/development/compilers/llvm/16/compiler-rt/X86-support-extension.patch b/pkgs/development/compilers/llvm/16/compiler-rt/X86-support-extension.patch
new file mode 100644
index 000000000000..07013e5a6825
--- /dev/null
+++ b/pkgs/development/compilers/llvm/16/compiler-rt/X86-support-extension.patch
@@ -0,0 +1,21 @@
+diff --git a/lib/builtins/CMakeLists.txt b/lib/builtins/CMakeLists.txt
+index 3a66dd9c3fb..7efc85d9f9f 100644
+--- a/lib/builtins/CMakeLists.txt
++++ b/lib/builtins/CMakeLists.txt
+@@ -348,4 +348,8 @@ if (NOT MSVC)
+
++ set(i486_SOURCES ${i386_SOURCES})
++ set(i586_SOURCES ${i386_SOURCES})
++ set(i686_SOURCES ${i386_SOURCES})
++
+ if (WIN32)
+ set(i386_SOURCES
+ ${i386_SOURCES}
+@@ -723,6 +723,7 @@ else ()
+ endif()
+
+ foreach (arch ${BUILTIN_SUPPORTED_ARCH})
++ message("arch: ${arch}")
+ if (CAN_TARGET_${arch})
+ # For ARM archs, exclude any VFP builtins if VFP is not supported
+ if (${arch} MATCHES "^(arm|armhf|armv7|armv7s|armv7k|armv7m|armv7em)$")
diff --git a/pkgs/development/compilers/llvm/16/compiler-rt/armv7l.patch b/pkgs/development/compilers/llvm/16/compiler-rt/armv7l.patch
new file mode 100644
index 000000000000..ca1c2332abd9
--- /dev/null
+++ b/pkgs/development/compilers/llvm/16/compiler-rt/armv7l.patch
@@ -0,0 +1,32 @@
+diff -ur a/cmake/builtin-config-ix.cmake b/cmake/builtin-config-ix.cmake
+--- a/cmake/builtin-config-ix.cmake @llvm 15.0.6
++++ b/cmake/builtin-config-ix.cmake
+@@ -46,7 +46,7 @@
+
+ set(ARM64 aarch64)
+-set(ARM32 arm armhf armv6m armv7m armv7em armv7 armv7s armv7k armv8m.main armv8.1m.main)
++set(ARM32 arm armhf armv6m armv7m armv7em armv7 armv7s armv7k armv7l armv8m.main armv8.1m.main)
+ set(AVR avr)
+ set(HEXAGON hexagon)
+ set(X86 i386)
+ set(X86_64 x86_64)
+diff -ur a/lib/builtins/CMakeLists.txt b/lib/builtins/CMakeLists.txt
+--- a/lib/builtins/CMakeLists.txt @llvm 15.0.6
++++ b/lib/builtins/CMakeLists.txt
+@@ -565,6 +565,7 @@
+ set(armv7_SOURCES ${arm_SOURCES})
+ set(armv7s_SOURCES ${arm_SOURCES})
+ set(armv7k_SOURCES ${arm_SOURCES})
++set(armv7l_SOURCES ${arm_SOURCES})
+ set(arm64_SOURCES ${aarch64_SOURCES})
+
+ # macho_embedded archs
+@@ -734,7 +735,7 @@
+ foreach (arch ${BUILTIN_SUPPORTED_ARCH})
+ if (CAN_TARGET_${arch})
+ # For ARM archs, exclude any VFP builtins if VFP is not supported
+- if (${arch} MATCHES "^(arm|armhf|armv7|armv7s|armv7k|armv7m|armv7em|armv8m.main|armv8.1m.main)$")
++ if (${arch} MATCHES "^(arm|armhf|armv7|armv7s|armv7k|armv7l|armv7m|armv7em|armv8m.main|armv8.1m.main)$")
+ string(REPLACE ";" " " _TARGET_${arch}_CFLAGS "${TARGET_${arch}_CFLAGS}")
+ check_compile_definition(__VFP_FP__ "${CMAKE_C_FLAGS} ${_TARGET_${arch}_CFLAGS}" COMPILER_RT_HAS_${arch}_VFP)
+ if(NOT COMPILER_RT_HAS_${arch}_VFP)
diff --git a/pkgs/development/compilers/llvm/16/compiler-rt/darwin-targetconditionals.patch b/pkgs/development/compilers/llvm/16/compiler-rt/darwin-targetconditionals.patch
new file mode 100644
index 000000000000..425dc2af01e7
--- /dev/null
+++ b/pkgs/development/compilers/llvm/16/compiler-rt/darwin-targetconditionals.patch
@@ -0,0 +1,71 @@
+diff --git a/lib/sanitizer_common/sanitizer_mac.cpp b/lib/sanitizer_common/sanitizer_mac.cpp
+--- a/lib/sanitizer_common/sanitizer_mac.cpp
++++ b/lib/sanitizer_common/sanitizer_mac.cpp
+@@ -613,9 +613,15 @@ HandleSignalMode GetHandleSignalMode(int signum) {
+ // Offset example:
+ // XNU 17 -- macOS 10.13 -- iOS 11 -- tvOS 11 -- watchOS 4
+ constexpr u16 GetOSMajorKernelOffset() {
+- if (TARGET_OS_OSX) return 4;
+- if (TARGET_OS_IOS || TARGET_OS_TV) return 6;
+- if (TARGET_OS_WATCH) return 13;
++#if TARGET_OS_OSX
++ return 4;
++#endif
++#if TARGET_OS_IOS || TARGET_OS_TV
++ return 6;
++#endif
++#if TARGET_OS_WATCH
++ return 13;
++#endif
+ }
+
+ using VersStr = char[64];
+@@ -627,13 +633,13 @@ static uptr ApproximateOSVersionViaKernelVersion(VersStr vers) {
+ u16 os_major = kernel_major - offset;
+
+ const char *format = "%d.0";
+- if (TARGET_OS_OSX) {
+- if (os_major >= 16) { // macOS 11+
+- os_major -= 5;
+- } else { // macOS 10.15 and below
+- format = "10.%d";
+- }
++#if TARGET_OS_OSX
++ if (os_major >= 16) { // macOS 11+
++ os_major -= 5;
++ } else { // macOS 10.15 and below
++ format = "10.%d";
+ }
++#endif
+ return internal_snprintf(vers, sizeof(VersStr), format, os_major);
+ }
+
+@@ -681,15 +687,14 @@ void ParseVersion(const char *vers, u16 *major, u16 *minor) {
+ // Aligned versions example:
+ // macOS 10.15 -- iOS 13 -- tvOS 13 -- watchOS 6
+ static void MapToMacos(u16 *major, u16 *minor) {
+- if (TARGET_OS_OSX)
+- return;
+-
+- if (TARGET_OS_IOS || TARGET_OS_TV)
++#if !TARGET_OS_OSX
++#if TARGET_OS_IOS || TARGET_OS_TV
+ *major += 2;
+- else if (TARGET_OS_WATCH)
++#elif TARGET_OS_WATCH
+ *major += 9;
+- else
++#else
+ UNREACHABLE("unsupported platform");
++#endif
+
+ if (*major >= 16) { // macOS 11+
+ *major -= 5;
+@@ -697,6 +702,7 @@ static void MapToMacos(u16 *major, u16 *minor) {
+ *minor = *major;
+ *major = 10;
+ }
++#endif
+ }
+
+ static MacosVersion GetMacosAlignedVersionInternal() {
diff --git a/pkgs/development/compilers/llvm/16/compiler-rt/default.nix b/pkgs/development/compilers/llvm/16/compiler-rt/default.nix
new file mode 100644
index 000000000000..b1a3b09cb72c
--- /dev/null
+++ b/pkgs/development/compilers/llvm/16/compiler-rt/default.nix
@@ -0,0 +1,140 @@
+{ lib, stdenv, llvm_meta, version
+, monorepoSrc, runCommand
+, cmake, ninja, 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 isGnu;
+
+ 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 ninja 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.libc == "glibc") [
+ "-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}"
+
+ # `COMPILER_RT_DEFAULT_TARGET_ONLY` does not apply to Darwin:
+ # https://github.com/llvm/llvm-project/blob/27ef42bec80b6c010b7b3729ed0528619521a690/compiler-rt/cmake/base-config-ix.cmake#L153
+ "-DCOMPILER_RT_ENABLE_IOS=OFF"
+ ];
+
+ outputs = [ "out" "dev" ];
+
+ patches = [
+ ./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
+ # See: https://github.com/NixOS/nixpkgs/pull/186575
+ ../../common/compiler-rt/darwin-plistbuddy-workaround.patch
+ # See: https://github.com/NixOS/nixpkgs/pull/194634#discussion_r999829893
+ ./armv7l.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/builtin-config-ix.cmake \
+ --replace 'set(ARM64 arm64 arm64e)' 'set(ARM64)'
+ 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 ];
+ };
+}
diff --git a/pkgs/development/compilers/llvm/16/compiler-rt/gnu-install-dirs.patch b/pkgs/development/compilers/llvm/16/compiler-rt/gnu-install-dirs.patch
new file mode 100644
index 000000000000..f3b1f63a7d71
--- /dev/null
+++ b/pkgs/development/compilers/llvm/16/compiler-rt/gnu-install-dirs.patch
@@ -0,0 +1,20 @@
+diff --git a/cmake/base-config-ix.cmake b/cmake/base-config-ix.cmake
+index 8a6219568b3f..30ee68a47ccf 100644
+--- a/cmake/base-config-ix.cmake
++++ b/cmake/base-config-ix.cmake
+@@ -100,13 +100,13 @@ endif()
+ if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE)
+ set(COMPILER_RT_OUTPUT_LIBRARY_DIR
+ ${COMPILER_RT_OUTPUT_DIR}/lib)
+- extend_path(default_install_path "${COMPILER_RT_INSTALL_PATH}" lib)
++ extend_path(default_install_path "${COMPILER_RT_INSTALL_PATH}" "${CMAKE_INSTALL_LIBDIR}")
+ set(COMPILER_RT_INSTALL_LIBRARY_DIR "${default_install_path}" CACHE PATH
+ "Path where built compiler-rt libraries should be installed.")
+ else(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE)
+ set(COMPILER_RT_OUTPUT_LIBRARY_DIR
+ ${COMPILER_RT_OUTPUT_DIR}/lib/${COMPILER_RT_OS_DIR})
+- extend_path(default_install_path "${COMPILER_RT_INSTALL_PATH}" "lib/${COMPILER_RT_OS_DIR}")
++ extend_path(default_install_path "${COMPILER_RT_INSTALL_PATH}" "${CMAKE_INSTALL_LIBDIR}/${COMPILER_RT_OS_DIR}")
+ set(COMPILER_RT_INSTALL_LIBRARY_DIR "${default_install_path}" CACHE PATH
+ "Path where built compiler-rt libraries should be installed.")
+ endif()
diff --git a/pkgs/development/compilers/llvm/16/compiler-rt/normalize-var.patch b/pkgs/development/compilers/llvm/16/compiler-rt/normalize-var.patch
new file mode 100644
index 000000000000..135cf625ef78
--- /dev/null
+++ b/pkgs/development/compilers/llvm/16/compiler-rt/normalize-var.patch
@@ -0,0 +1,16 @@
+diff --git a/compiler-rt/cmake/Modules/CompilerRTUtils.cmake b/compiler-rt/cmake/Modules/CompilerRTUtils.cmake
+index f1f46fb9599c..6f19e69507ba 100644
+--- a/cmake/Modules/CompilerRTUtils.cmake
++++ b/cmake/Modules/CompilerRTUtils.cmake
+@@ -302,8 +302,9 @@ macro(load_llvm_config)
+ # Get some LLVM variables from LLVMConfig.
+ include("${LLVM_CMAKE_PATH}/LLVMConfig.cmake")
+
+- set(LLVM_LIBRARY_OUTPUT_INTDIR
+- ${LLVM_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX})
++ get_filename_component(LLVM_LIBRARY_OUTPUT_INTDIR
++ ${LLVM_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX}
++ REALPATH)
+ endif()
+ endmacro()
+
diff --git a/pkgs/development/compilers/llvm/16/default.nix b/pkgs/development/compilers/llvm/16/default.nix
new file mode 100644
index 000000000000..6911493d8d78
--- /dev/null
+++ b/pkgs/development/compilers/llvm/16/default.nix
@@ -0,0 +1,365 @@
+{ lowPrio, newScope, pkgs, lib, stdenv, stdenvNoCC, cmake, ninja
+, gccForLibs, preLibcCrossHeaders
+, libxml2, python3, fetchFromGitHub, overrideCC, wrapCCWith, wrapBintoolsWith
+, buildLlvmTools # tools, but from the previous stage, for cross
+, targetLlvmLibraries # libraries, but from the next stage, for cross
+, targetLlvm
+# This is the default binutils, but with *this* version of LLD rather
+# than the default LLVM verion's, if LLD is the choice. We use these for
+# the `useLLVM` bootstrapping below.
+, bootBintoolsNoLibc ?
+ if stdenv.targetPlatform.linker == "lld"
+ then null
+ else pkgs.bintoolsNoLibc
+, bootBintools ?
+ if stdenv.targetPlatform.linker == "lld"
+ then null
+ else pkgs.bintools
+, darwin
+# LLVM release information; specify one of these but not both:
+, gitRelease ? null
+ # i.e.:
+ # {
+ # version = /* i.e. "15.0.0" */;
+ # rev = /* commit SHA */;
+ # rev-version = /* human readable version; i.e. "unstable-2022-26-07" */;
+ # sha256 = /* checksum for this release, can omit if specifying your own `monorepoSrc` */;
+ # }
+, officialRelease ? { version = "16.0.0"; candidate = "rc4"; sha256 = "sha256-htvV0zwnx88Wb7gHT4dnmBSSCQMjHWswdqjtWHNLuf0="; }
+ # i.e.:
+ # {
+ # version = /* i.e. "15.0.0" */;
+ # candidate = /* optional; if specified, should be: "rcN" */
+ # sha256 = /* checksum for this release, can omit if specifying your own `monorepoSrc` */;
+ # }
+# By default, we'll try to fetch a release from `github:llvm/llvm-project`
+# corresponding to the `gitRelease` or `officialRelease` specified.
+#
+# You can provide your own LLVM source by specifying this arg but then it's up
+# to you to make sure that the LLVM repo given matches the release configuration
+# specified.
+, monorepoSrc ? null
+}:
+
+assert let
+ int = a: if a then 1 else 0;
+ xor = a: b: ((builtins.bitXor (int a) (int b)) == 1);
+in
+ lib.assertMsg
+ (xor
+ (gitRelease != null)
+ (officialRelease != null))
+ ("must specify `gitRelease` or `officialRelease`" +
+ (lib.optionalString (gitRelease != null) " — not both"));
+let
+ monorepoSrc' = monorepoSrc;
+in let
+ releaseInfo = if gitRelease != null then rec {
+ original = gitRelease;
+ release_version = original.version;
+ version = gitRelease.rev-version;
+ } else rec {
+ original = officialRelease;
+ release_version = original.version;
+ version = if original ? candidate then
+ "${release_version}-${original.candidate}"
+ else
+ release_version;
+ };
+
+ monorepoSrc = if monorepoSrc' != null then
+ monorepoSrc'
+ else let
+ sha256 = releaseInfo.original.sha256;
+ rev = if gitRelease != null then
+ gitRelease.rev
+ else
+ "llvmorg-${releaseInfo.version}";
+ in fetchFromGitHub {
+ owner = "llvm";
+ repo = "llvm-project";
+ inherit rev sha256;
+ };
+
+ inherit (releaseInfo) release_version version;
+
+ llvm_meta = {
+ license = lib.licenses.ncsa;
+ maintainers = lib.teams.llvm.members;
+
+ # See llvm/cmake/config-ix.cmake.
+ platforms =
+ lib.platforms.aarch64 ++
+ lib.platforms.arm ++
+ lib.platforms.m68k ++
+ lib.platforms.mips ++
+ lib.platforms.power ++
+ lib.platforms.riscv ++
+ lib.platforms.s390x ++
+ lib.platforms.wasi ++
+ lib.platforms.x86;
+ };
+
+ tools = lib.makeExtensible (tools: let
+ callPackage = newScope (tools // { inherit stdenv cmake ninja libxml2 python3 release_version version monorepoSrc buildLlvmTools; });
+ mkExtraBuildCommands0 = cc: ''
+ rsrc="$out/resource-root"
+ mkdir "$rsrc"
+ ln -s "${cc.lib}/lib/clang/${release_version}/include" "$rsrc"
+ echo "-resource-dir=$rsrc" >> $out/nix-support/cc-cflags
+ '';
+ mkExtraBuildCommands = cc: mkExtraBuildCommands0 cc + ''
+ ln -s "${targetLlvmLibraries.compiler-rt.out}/lib" "$rsrc/lib"
+ ln -s "${targetLlvmLibraries.compiler-rt.out}/share" "$rsrc/share"
+ '';
+
+ bintoolsNoLibc' =
+ if bootBintoolsNoLibc == null
+ then tools.bintoolsNoLibc
+ else bootBintoolsNoLibc;
+ bintools' =
+ if bootBintools == null
+ then tools.bintools
+ else bootBintools;
+
+ in {
+
+ libllvm = callPackage ./llvm {
+ inherit llvm_meta;
+ };
+
+ # `llvm` historically had the binaries. When choosing an output explicitly,
+ # we need to reintroduce `outputSpecified` to get the expected behavior e.g. of lib.get*
+ llvm = tools.libllvm;
+
+ libclang = callPackage ./clang {
+ inherit llvm_meta;
+ };
+
+ clang-unwrapped = tools.libclang;
+
+ llvm-manpages = lowPrio (tools.libllvm.override {
+ enableManpages = true;
+ python3 = pkgs.python3; # don't use python-boot
+ });
+
+ clang-manpages = lowPrio (tools.libclang.override {
+ enableManpages = true;
+ python3 = pkgs.python3; # don't use python-boot
+ });
+
+ lldb-manpages = lowPrio (tools.lldb.override {
+ enableManpages = true;
+ python3 = pkgs.python3; # don't use python-boot
+ });
+
+ # pick clang appropriate for package set we are targeting
+ clang =
+ /**/ if stdenv.targetPlatform.useLLVM or false then tools.clangUseLLVM
+ else if (pkgs.targetPackages.stdenv or stdenv).cc.isGNU then tools.libstdcxxClang
+ else tools.libcxxClang;
+
+ libstdcxxClang = wrapCCWith rec {
+ cc = tools.clang-unwrapped;
+ # libstdcxx is taken from gcc in an ad-hoc way in cc-wrapper.
+ libcxx = null;
+ extraPackages = [
+ targetLlvmLibraries.compiler-rt
+ ];
+ extraBuildCommands = mkExtraBuildCommands cc;
+ };
+
+ libcxxClang = wrapCCWith rec {
+ cc = tools.clang-unwrapped;
+ libcxx = targetLlvmLibraries.libcxx;
+ extraPackages = [
+ libcxx.cxxabi
+ targetLlvmLibraries.compiler-rt
+ ];
+ extraBuildCommands = mkExtraBuildCommands cc;
+ };
+
+ lld = callPackage ./lld {
+ inherit llvm_meta;
+ };
+
+ lldb = callPackage ./lldb {
+ inherit llvm_meta;
+ inherit (darwin) libobjc bootstrap_cmds;
+ inherit (darwin.apple_sdk.libs) xpc;
+ inherit (darwin.apple_sdk.frameworks) Foundation Carbon Cocoa;
+ };
+
+ # Below, is the LLVM bootstrapping logic. It handles building a
+ # fully LLVM toolchain from scratch. No GCC toolchain should be
+ # pulled in. As a consequence, it is very quick to build different
+ # targets provided by LLVM and we can also build for what GCC
+ # doesn’t support like LLVM. Probably we should move to some other
+ # file.
+
+ bintools-unwrapped = callPackage ./bintools {};
+
+ bintoolsNoLibc = wrapBintoolsWith {
+ bintools = tools.bintools-unwrapped;
+ libc = preLibcCrossHeaders;
+ };
+
+ bintools = wrapBintoolsWith {
+ bintools = tools.bintools-unwrapped;
+ };
+
+ clangUseLLVM = wrapCCWith rec {
+ cc = tools.clang-unwrapped;
+ libcxx = targetLlvmLibraries.libcxx;
+ bintools = bintools';
+ extraPackages = [
+ libcxx.cxxabi
+ targetLlvmLibraries.compiler-rt
+ ] ++ lib.optionals (!stdenv.targetPlatform.isWasm) [
+ targetLlvmLibraries.libunwind
+ ];
+ extraBuildCommands = mkExtraBuildCommands cc;
+ nixSupport.cc-cflags =
+ [ "-rtlib=compiler-rt"
+ "-Wno-unused-command-line-argument"
+ "-B${targetLlvmLibraries.compiler-rt}/lib"
+ ]
+ ++ lib.optional (!stdenv.targetPlatform.isWasm) "--unwindlib=libunwind"
+ ++ lib.optional
+ (!stdenv.targetPlatform.isWasm && stdenv.targetPlatform.useLLVM or false)
+ "-lunwind"
+ ++ lib.optional stdenv.targetPlatform.isWasm "-fno-exceptions";
+ };
+
+ clangNoLibcxx = wrapCCWith rec {
+ cc = tools.clang-unwrapped;
+ libcxx = null;
+ bintools = bintools';
+ extraPackages = [
+ targetLlvmLibraries.compiler-rt
+ ];
+ extraBuildCommands = mkExtraBuildCommands cc;
+ nixSupport.cc-cflags = [
+ "-rtlib=compiler-rt"
+ "-B${targetLlvmLibraries.compiler-rt}/lib"
+ "-nostdlib++"
+ ];
+ };
+
+ clangNoLibc = wrapCCWith rec {
+ cc = tools.clang-unwrapped;
+ libcxx = null;
+ bintools = bintoolsNoLibc';
+ extraPackages = [
+ targetLlvmLibraries.compiler-rt
+ ];
+ extraBuildCommands = mkExtraBuildCommands cc;
+ nixSupport.cc-cflags = [
+ "-rtlib=compiler-rt"
+ "-B${targetLlvmLibraries.compiler-rt}/lib"
+ ];
+ };
+
+ clangNoCompilerRt = wrapCCWith rec {
+ cc = tools.clang-unwrapped;
+ libcxx = null;
+ bintools = bintoolsNoLibc';
+ extraPackages = [ ];
+ extraBuildCommands = mkExtraBuildCommands0 cc;
+ nixSupport.cc-cflags = [ "-nostartfiles" ];
+ };
+
+ clangNoCompilerRtWithLibc = wrapCCWith rec {
+ cc = tools.clang-unwrapped;
+ libcxx = null;
+ bintools = bintools';
+ extraPackages = [ ];
+ extraBuildCommands = mkExtraBuildCommands0 cc;
+ };
+
+ });
+
+ libraries = lib.makeExtensible (libraries: let
+ callPackage = newScope (libraries // buildLlvmTools // { inherit stdenv cmake ninja libxml2 python3 release_version version monorepoSrc; });
+ in {
+
+ compiler-rt-libc = callPackage ./compiler-rt {
+ inherit llvm_meta;
+ stdenv = if stdenv.hostPlatform.useLLVM or false
+ then overrideCC stdenv buildLlvmTools.clangNoCompilerRtWithLibc
+ else stdenv;
+ };
+
+ compiler-rt-no-libc = callPackage ./compiler-rt {
+ inherit llvm_meta;
+ stdenv = if stdenv.hostPlatform.useLLVM or false
+ then overrideCC stdenv buildLlvmTools.clangNoCompilerRt
+ else stdenv;
+ };
+
+ # N.B. condition is safe because without useLLVM both are the same.
+ compiler-rt = if stdenv.hostPlatform.isAndroid
+ then libraries.compiler-rt-libc
+ else libraries.compiler-rt-no-libc;
+
+ stdenv = overrideCC stdenv buildLlvmTools.clang;
+
+ libcxxStdenv = overrideCC stdenv buildLlvmTools.libcxxClang;
+
+ libcxxabi = let
+ # CMake will "require" a compiler capable of compiling C++ programs
+ # cxx-header's build does not actually use one so it doesn't really matter
+ # what stdenv we use here, as long as CMake is happy.
+ cxx-headers = callPackage ./libcxx {
+ inherit llvm_meta;
+ # Note that if we use the regular stdenv here we'll get cycle errors
+ # when attempting to use this compiler in the stdenv.
+ #
+ # The final stdenv pulls `cxx-headers` from the package set where
+ # hostPlatform *is* the target platform which means that `stdenv` at
+ # that point attempts to use this toolchain.
+ #
+ # So, we use `stdenv_` (the stdenv containing `clang` from this package
+ # set, defined below) to sidestep this issue.
+ #
+ # Because we only use `cxx-headers` in `libcxxabi` (which depends on the
+ # clang stdenv _anyways_), this is okay.
+ stdenv = stdenv_;
+ headersOnly = true;
+ };
+
+ # `libcxxabi` *doesn't* need a compiler with a working C++ stdlib but it
+ # *does* need a relatively modern C++ compiler (see:
+ # https://releases.llvm.org/15.0.0/projects/libcxx/docs/index.html#platform-and-compiler-support).
+ #
+ # So, we use the clang from this LLVM package set, like libc++
+ # "boostrapping builds" do:
+ # https://releases.llvm.org/15.0.0/projects/libcxx/docs/BuildingLibcxx.html#bootstrapping-build
+ #
+ # We cannot use `clangNoLibcxx` because that contains `compiler-rt` which,
+ # on macOS, depends on `libcxxabi`, thus forming a cycle.
+ stdenv_ = overrideCC stdenv buildLlvmTools.clangNoCompilerRtWithLibc;
+ in callPackage ./libcxxabi {
+ stdenv = stdenv_;
+ inherit llvm_meta cxx-headers;
+ };
+
+ # Like `libcxxabi` above, `libcxx` requires a fairly modern C++ compiler,
+ # so: we use the clang from this LLVM package set instead of the regular
+ # stdenv's compiler.
+ libcxx = callPackage ./libcxx {
+ inherit llvm_meta;
+ stdenv = overrideCC stdenv buildLlvmTools.clangNoLibcxx;
+ };
+
+ libunwind = callPackage ./libunwind {
+ inherit llvm_meta;
+ stdenv = overrideCC stdenv buildLlvmTools.clangNoLibcxx;
+ };
+
+ openmp = callPackage ./openmp {
+ inherit llvm_meta targetLlvm;
+ };
+ });
+
+in { inherit tools libraries release_version; } // libraries // tools
diff --git a/pkgs/development/compilers/llvm/16/libcxx/default.nix b/pkgs/development/compilers/llvm/16/libcxx/default.nix
new file mode 100644
index 000000000000..94374c8a312d
--- /dev/null
+++ b/pkgs/development/compilers/llvm/16/libcxx/default.nix
@@ -0,0 +1,110 @@
+{ lib, stdenv, llvm_meta
+, monorepoSrc, runCommand
+, cmake, ninja, python3, fixDarwinDylibNames, version
+, cxxabi ? if stdenv.hostPlatform.isFreeBSD then libcxxrt else libcxxabi
+, libcxxabi, libcxxrt
+, enableShared ? !stdenv.hostPlatform.isStatic
+
+# If headersOnly is true, the resulting package would only include the headers.
+# Use this to break the circular dependency between libcxx and libcxxabi.
+#
+# Some context:
+# https://reviews.llvm.org/rG1687f2bbe2e2aaa092f942d4a97d41fad43eedfb
+, headersOnly ? false
+}:
+
+let
+ basename = "libcxx";
+in
+
+assert stdenv.isDarwin -> cxxabi.libName == "c++abi";
+
+stdenv.mkDerivation rec {
+ pname = basename + lib.optionalString headersOnly "-headers";
+ inherit version;
+
+ src = runCommand "${pname}-src-${version}" {} ''
+ mkdir -p "$out"
+ cp -r ${monorepoSrc}/cmake "$out"
+ cp -r ${monorepoSrc}/${basename} "$out"
+ mkdir -p "$out/libcxxabi"
+ cp -r ${monorepoSrc}/libcxxabi/include "$out/libcxxabi"
+ mkdir -p "$out/llvm"
+ cp -r ${monorepoSrc}/llvm/cmake "$out/llvm"
+ cp -r ${monorepoSrc}/llvm/utils "$out/llvm"
+ cp -r ${monorepoSrc}/third-party "$out"
+ cp -r ${monorepoSrc}/runtimes "$out"
+ '';
+
+ sourceRoot = "${src.name}/runtimes";
+
+ outputs = [ "out" ] ++ lib.optional (!headersOnly) "dev";
+
+ prePatch = ''
+ cd ../${basename}
+ chmod -R u+w .
+ '';
+
+ patches = [
+ ./gnu-install-dirs.patch
+ ] ++ lib.optionals stdenv.hostPlatform.isMusl [
+ ../../libcxx-0001-musl-hacks.patch
+ ];
+
+ postPatch = ''
+ cd ../runtimes
+ '';
+
+ preConfigure = lib.optionalString stdenv.hostPlatform.isMusl ''
+ patchShebangs utils/cat_files.py
+ '';
+
+ nativeBuildInputs = [ cmake ninja python3 ]
+ ++ lib.optional stdenv.isDarwin fixDarwinDylibNames;
+
+ buildInputs = lib.optionals (!headersOnly) [ cxxabi ];
+
+ cmakeFlags = let
+ # See: https://libcxx.llvm.org/BuildingLibcxx.html#cmdoption-arg-libcxx-cxx-abi-string
+ libcxx_cxx_abi_opt = {
+ "c++abi" = "system-libcxxabi";
+ "cxxrt" = "libcxxrt";
+ }.${cxxabi.libName} or (throw "unknown cxxabi: ${cxxabi.libName} (${cxxabi.pname})");
+ in [
+ "-DLLVM_ENABLE_RUNTIMES=libcxx"
+ "-DLIBCXX_CXX_ABI=${if headersOnly then "none" else libcxx_cxx_abi_opt}"
+ ] ++ lib.optional (!headersOnly && cxxabi.libName == "c++abi") "-DLIBCXX_CXX_ABI_INCLUDE_PATHS=${cxxabi.dev}/include/c++/v1"
+ ++ lib.optional (stdenv.hostPlatform.isMusl || stdenv.hostPlatform.isWasi) "-DLIBCXX_HAS_MUSL_LIBC=1"
+ ++ lib.optional (stdenv.hostPlatform.useLLVM or false) "-DLIBCXX_USE_COMPILER_RT=ON"
+ ++ lib.optionals stdenv.hostPlatform.isWasm [
+ "-DLIBCXX_ENABLE_THREADS=OFF"
+ "-DLIBCXX_ENABLE_FILESYSTEM=OFF"
+ "-DLIBCXX_ENABLE_EXCEPTIONS=OFF"
+ ] ++ lib.optional (!enableShared) "-DLIBCXX_ENABLE_SHARED=OFF"
+ # If we're only building the headers we don't actually *need* a functioning
+ # C/C++ compiler:
+ ++ lib.optionals (headersOnly) [
+ "-DCMAKE_C_COMPILER_WORKS=ON"
+ "-DCMAKE_CXX_COMPILER_WORKS=ON"
+ ];
+
+ ninjaFlags = lib.optional headersOnly "generate-cxx-headers";
+ installTargets = lib.optional headersOnly "install-cxx-headers";
+
+ passthru = {
+ isLLVM = true;
+ inherit cxxabi;
+ };
+
+ meta = llvm_meta // {
+ homepage = "https://libcxx.llvm.org/";
+ description = "C++ standard library";
+ longDescription = ''
+ libc++ is an implementation of the C++ standard library, targeting C++11,
+ C++14 and above.
+ '';
+ # "All of the code in libc++ is dual licensed under the MIT license and the
+ # UIUC License (a BSD-like license)":
+ license = with lib.licenses; [ mit ncsa ];
+ };
+}
diff --git a/pkgs/development/compilers/llvm/16/libcxx/gnu-install-dirs.patch b/pkgs/development/compilers/llvm/16/libcxx/gnu-install-dirs.patch
new file mode 100644
index 000000000000..daee5bdd0ed3
--- /dev/null
+++ b/pkgs/development/compilers/llvm/16/libcxx/gnu-install-dirs.patch
@@ -0,0 +1,22 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 74eff2002fc9..c935d10878bb 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -419,7 +419,7 @@ if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE)
+ set(LIBCXX_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}/${LLVM_DEFAULT_TARGET_TRIPLE})
+ set(LIBCXX_GENERATED_INCLUDE_DIR "${LLVM_BINARY_DIR}/include/c++/v1")
+ set(LIBCXX_GENERATED_INCLUDE_TARGET_DIR "${LLVM_BINARY_DIR}/include/${LLVM_DEFAULT_TARGET_TRIPLE}/c++/v1")
+- set(LIBCXX_INSTALL_LIBRARY_DIR lib${LLVM_LIBDIR_SUFFIX}/${LLVM_DEFAULT_TARGET_TRIPLE} CACHE PATH
++ set(LIBCXX_INSTALL_LIBRARY_DIR ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}/${LLVM_DEFAULT_TARGET_TRIPLE} CACHE PATH
+ "Path where built libc++ libraries should be installed.")
+ set(LIBCXX_INSTALL_INCLUDE_TARGET_DIR "${CMAKE_INSTALL_INCLUDEDIR}/${LLVM_DEFAULT_TARGET_TRIPLE}/c++/v1" CACHE PATH
+ "Path where target-specific libc++ headers should be installed.")
+@@ -436,7 +436,7 @@ else()
+ set(LIBCXX_GENERATED_INCLUDE_DIR "${CMAKE_BINARY_DIR}/include/c++/v1")
+ endif()
+ set(LIBCXX_GENERATED_INCLUDE_TARGET_DIR "${LIBCXX_GENERATED_INCLUDE_DIR}")
+- set(LIBCXX_INSTALL_LIBRARY_DIR lib${LIBCXX_LIBDIR_SUFFIX} CACHE PATH
++ set(LIBCXX_INSTALL_LIBRARY_DIR ${CMAKE_INSTALL_LIBDIR}${LIBCXX_LIBDIR_SUFFIX} CACHE PATH
+ "Path where built libc++ libraries should be installed.")
+ set(LIBCXX_INSTALL_INCLUDE_TARGET_DIR "${LIBCXX_INSTALL_INCLUDE_DIR}" CACHE PATH
+ "Path where target-specific libc++ headers should be installed.")
diff --git a/pkgs/development/compilers/llvm/16/libcxxabi/default.nix b/pkgs/development/compilers/llvm/16/libcxxabi/default.nix
new file mode 100644
index 000000000000..cb5fa44f0700
--- /dev/null
+++ b/pkgs/development/compilers/llvm/16/libcxxabi/default.nix
@@ -0,0 +1,108 @@
+{ lib, stdenv, llvm_meta, cmake, ninja, python3
+, monorepoSrc, runCommand, fetchpatch
+, cxx-headers, libunwind, version
+, enableShared ? !stdenv.hostPlatform.isStatic
+}:
+
+stdenv.mkDerivation rec {
+ pname = "libcxxabi";
+ inherit version;
+
+ src = runCommand "${pname}-src-${version}" {} ''
+ mkdir -p "$out"
+ cp -r ${monorepoSrc}/cmake "$out"
+ cp -r ${monorepoSrc}/${pname} "$out"
+ mkdir -p "$out/libcxx/src"
+ cp -r ${monorepoSrc}/libcxx/cmake "$out/libcxx"
+ cp -r ${monorepoSrc}/libcxx/include "$out/libcxx"
+ cp -r ${monorepoSrc}/libcxx/src/include "$out/libcxx/src"
+ mkdir -p "$out/llvm"
+ cp -r ${monorepoSrc}/llvm/cmake "$out/llvm"
+ cp -r ${monorepoSrc}/llvm/utils "$out/llvm"
+ cp -r ${monorepoSrc}/runtimes "$out"
+ '';
+
+ sourceRoot = "${src.name}/runtimes";
+
+ outputs = [ "out" "dev" ];
+
+ postUnpack = lib.optionalString stdenv.isDarwin ''
+ export TRIPLE=x86_64-apple-darwin
+ '' + lib.optionalString stdenv.hostPlatform.isWasm ''
+ patch -p1 -d llvm -i ${./wasm.patch}
+ '';
+
+ prePatch = ''
+ cd ../${pname}
+ chmod -R u+w .
+ '';
+
+ patches = [
+ ./gnu-install-dirs.patch
+
+ # https://reviews.llvm.org/D132298, Allow building libcxxabi alone
+ (fetchpatch {
+ url = "https://github.com/llvm/llvm-project/commit/e6a0800532bb409f6d1c62f3698bdd6994a877dc.patch";
+ sha256 = "1xyjd56m4pfwq8p3xh6i8lhkk9kq15jaml7qbhxdf87z4jjkk63a";
+ stripLen = 1;
+ })
+ ];
+
+ postPatch = ''
+ cd ../runtimes
+ '';
+
+ nativeBuildInputs = [ cmake ninja python3 ];
+ buildInputs = lib.optional (!stdenv.isDarwin && !stdenv.hostPlatform.isWasm) libunwind;
+
+ cmakeFlags = [
+ "-DLLVM_ENABLE_RUNTIMES=libcxxabi"
+ "-DLIBCXXABI_LIBCXX_INCLUDES=${cxx-headers}/include/c++/v1"
+
+ # `libcxxabi`'s build does not need a toolchain with a c++ stdlib attached
+ # (we specify the headers it should use explicitly above).
+ #
+ # CMake however checks for this anyways; this flag tells it not to. See:
+ # https://github.com/llvm/llvm-project/blob/4bd3f3759259548e159aeba5c76efb9a0864e6fa/llvm/runtimes/CMakeLists.txt#L243
+ "-DCMAKE_CXX_COMPILER_WORKS=ON"
+ ] ++ lib.optionals (stdenv.hostPlatform.useLLVM or false) [
+ "-DLLVM_ENABLE_LIBCXX=ON"
+ "-DLIBCXXABI_USE_LLVM_UNWINDER=ON"
+ ] ++ lib.optionals stdenv.hostPlatform.isWasm [
+ "-DLIBCXXABI_ENABLE_THREADS=OFF"
+ "-DLIBCXXABI_ENABLE_EXCEPTIONS=OFF"
+ ] ++ lib.optionals (!enableShared) [
+ "-DLIBCXXABI_ENABLE_SHARED=OFF"
+ ];
+
+ preInstall = lib.optionalString stdenv.isDarwin ''
+ for file in lib/*.dylib; do
+ # this should be done in CMake, but having trouble figuring out
+ # the magic combination of necessary CMake variables
+ # if you fancy a try, take a look at
+ # https://gitlab.kitware.com/cmake/community/-/wikis/doc/cmake/RPATH-handling
+ install_name_tool -id $out/$file $file
+ done
+ '';
+
+ postInstall = ''
+ mkdir -p "$dev/include"
+ install -m 644 ../../${pname}/include/${if stdenv.isDarwin then "*" else "cxxabi.h"} "$dev/include"
+ '';
+
+ passthru = {
+ libName = "c++abi";
+ };
+
+ meta = llvm_meta // {
+ homepage = "https://libcxxabi.llvm.org/";
+ description = "Provides C++ standard library support";
+ longDescription = ''
+ libc++abi is a new implementation of low level support for a standard C++ library.
+ '';
+ # "All of the code in libc++abi is dual licensed under the MIT license and
+ # the UIUC License (a BSD-like license)":
+ license = with lib.licenses; [ mit ncsa ];
+ maintainers = llvm_meta.maintainers ++ [ lib.maintainers.vlstill ];
+ };
+}
diff --git a/pkgs/development/compilers/llvm/16/libcxxabi/gnu-install-dirs.patch b/pkgs/development/compilers/llvm/16/libcxxabi/gnu-install-dirs.patch
new file mode 100644
index 000000000000..fa587612aaf6
--- /dev/null
+++ b/pkgs/development/compilers/llvm/16/libcxxabi/gnu-install-dirs.patch
@@ -0,0 +1,22 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index b8326d08d23a..a1e36f713161 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -187,7 +187,7 @@ set(LIBCXXABI_INSTALL_RUNTIME_DIR "${CMAKE_INSTALL_BINDIR}" CACHE PATH
+ if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE)
+ set(LIBCXXABI_HEADER_DIR ${LLVM_BINARY_DIR})
+ set(LIBCXXABI_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}/${LLVM_DEFAULT_TARGET_TRIPLE})
+- set(LIBCXXABI_INSTALL_LIBRARY_DIR lib${LLVM_LIBDIR_SUFFIX}/${LLVM_DEFAULT_TARGET_TRIPLE} CACHE PATH
++ set(LIBCXXABI_INSTALL_LIBRARY_DIR ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}/${LLVM_DEFAULT_TARGET_TRIPLE} CACHE PATH
+ "Path where built libc++abi libraries should be installed.")
+ if(LIBCXX_LIBDIR_SUBDIR)
+ string(APPEND LIBCXXABI_LIBRARY_DIR /${LIBCXXABI_LIBDIR_SUBDIR})
+@@ -201,7 +201,7 @@ else()
+ set(LIBCXXABI_HEADER_DIR ${CMAKE_BINARY_DIR})
+ set(LIBCXXABI_LIBRARY_DIR ${CMAKE_BINARY_DIR}/lib${LIBCXXABI_LIBDIR_SUFFIX})
+ endif()
+- set(LIBCXXABI_INSTALL_LIBRARY_DIR lib${LIBCXXABI_LIBDIR_SUFFIX} CACHE PATH
++ set(LIBCXXABI_INSTALL_LIBRARY_DIR ${CMAKE_INSTALL_LIBDIR}${LIBCXXABI_LIBDIR_SUFFIX} CACHE PATH
+ "Path where built libc++abi libraries should be installed.")
+ endif()
+
diff --git a/pkgs/development/compilers/llvm/16/libcxxabi/wasm.patch b/pkgs/development/compilers/llvm/16/libcxxabi/wasm.patch
new file mode 100644
index 000000000000..4ebfe46aa813
--- /dev/null
+++ b/pkgs/development/compilers/llvm/16/libcxxabi/wasm.patch
@@ -0,0 +1,16 @@
+diff --git a/cmake/modules/HandleLLVMOptions.cmake b/cmake/modules/HandleLLVMOptions.cmake
+index 15497d405e0..33f7f18193a 100644
+--- a/cmake/modules/HandleLLVMOptions.cmake
++++ b/cmake/modules/HandleLLVMOptions.cmake
+@@ -127,7 +127,10 @@ else(WIN32)
+ set(LLVM_HAVE_LINK_VERSION_SCRIPT 1)
+ endif()
+ else(FUCHSIA OR UNIX)
+- MESSAGE(SEND_ERROR "Unable to determine platform")
++ if(${CMAKE_SYSTEM_NAME} MATCHES "Wasi")
++ else()
++ MESSAGE(SEND_ERROR "Unable to determine platform")
++ endif()
+ endif(FUCHSIA OR UNIX)
+ endif(WIN32)
+
diff --git a/pkgs/development/compilers/llvm/16/libunwind/default.nix b/pkgs/development/compilers/llvm/16/libunwind/default.nix
new file mode 100644
index 000000000000..dd14e2acaf86
--- /dev/null
+++ b/pkgs/development/compilers/llvm/16/libunwind/default.nix
@@ -0,0 +1,62 @@
+{ lib, stdenv, llvm_meta, version
+, monorepoSrc, runCommand
+, cmake
+, ninja
+, python3
+, enableShared ? !stdenv.hostPlatform.isStatic
+}:
+
+stdenv.mkDerivation rec {
+ pname = "libunwind";
+ inherit version;
+
+ # I am not so comfortable giving libc++ and friends the whole monorepo as
+ # requested, so I filter it to what is needed.
+ src = runCommand "${pname}-src-${version}" {} ''
+ mkdir -p "$out"
+ cp -r ${monorepoSrc}/cmake "$out"
+ cp -r ${monorepoSrc}/${pname} "$out"
+ mkdir -p "$out/libcxx"
+ cp -r ${monorepoSrc}/libcxx/cmake "$out/libcxx"
+ cp -r ${monorepoSrc}/libcxx/utils "$out/libcxx"
+ mkdir -p "$out/llvm"
+ cp -r ${monorepoSrc}/llvm/cmake "$out/llvm"
+ cp -r ${monorepoSrc}/llvm/utils "$out/llvm"
+ cp -r ${monorepoSrc}/runtimes "$out"
+ '';
+
+ sourceRoot = "${src.name}/runtimes";
+
+ prePatch = ''
+ cd ../${pname}
+ chmod -R u+w .
+ '';
+
+ patches = [
+ ./gnu-install-dirs.patch
+ ];
+
+ postPatch = ''
+ cd ../runtimes
+ '';
+
+ outputs = [ "out" "dev" ];
+
+ nativeBuildInputs = [ cmake ninja python3 ];
+
+ cmakeFlags = [
+ "-DLLVM_ENABLE_RUNTIMES=libunwind"
+ ] ++ lib.optional (!enableShared) "-DLIBUNWIND_ENABLE_SHARED=OFF";
+
+ meta = llvm_meta // {
+ # Details: https://github.com/llvm/llvm-project/blob/main/libunwind/docs/index.rst
+ homepage = "https://clang.llvm.org/docs/Toolchain.html#unwind-library";
+ description = "LLVM's unwinder library";
+ longDescription = ''
+ The unwind library provides a family of _Unwind_* functions implementing
+ the language-neutral stack unwinding portion of the Itanium C++ ABI (Level
+ I). It is a dependency of the C++ ABI library, and sometimes is a
+ dependency of other runtimes.
+ '';
+ };
+}
diff --git a/pkgs/development/compilers/llvm/16/libunwind/gnu-install-dirs.patch b/pkgs/development/compilers/llvm/16/libunwind/gnu-install-dirs.patch
new file mode 100644
index 000000000000..edfb2a8760bd
--- /dev/null
+++ b/pkgs/development/compilers/llvm/16/libunwind/gnu-install-dirs.patch
@@ -0,0 +1,22 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 5a06805f05f1..86a50329e6a8 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -117,7 +117,7 @@ set(LIBUNWIND_INSTALL_RUNTIME_DIR "${CMAKE_INSTALL_BINDIR}" CACHE PATH
+
+ if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE)
+ set(LIBUNWIND_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}/${LLVM_DEFAULT_TARGET_TRIPLE})
+- set(LIBUNWIND_INSTALL_LIBRARY_DIR lib${LLVM_LIBDIR_SUFFIX}/${LLVM_DEFAULT_TARGET_TRIPLE} CACHE PATH
++ set(LIBUNWIND_INSTALL_LIBRARY_DIR ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}/${LLVM_DEFAULT_TARGET_TRIPLE} CACHE PATH
+ "Path where built libunwind libraries should be installed.")
+ if(LIBCXX_LIBDIR_SUBDIR)
+ string(APPEND LIBUNWIND_LIBRARY_DIR /${LIBUNWIND_LIBDIR_SUBDIR})
+@@ -129,7 +129,7 @@ else()
+ else()
+ set(LIBUNWIND_LIBRARY_DIR ${CMAKE_BINARY_DIR}/lib${LIBUNWIND_LIBDIR_SUFFIX})
+ endif()
+- set(LIBUNWIND_INSTALL_LIBRARY_DIR lib${LIBUNWIND_LIBDIR_SUFFIX} CACHE PATH
++ set(LIBUNWIND_INSTALL_LIBRARY_DIR ${CMAKE_INSTALL_LIBDIR}${LIBUNWIND_LIBDIR_SUFFIX} CACHE PATH
+ "Path where built libunwind libraries should be installed.")
+ endif()
+
diff --git a/pkgs/development/compilers/llvm/16/lld/default.nix b/pkgs/development/compilers/llvm/16/lld/default.nix
new file mode 100644
index 000000000000..e8bca769de5f
--- /dev/null
+++ b/pkgs/development/compilers/llvm/16/lld/default.nix
@@ -0,0 +1,55 @@
+{ lib, stdenv, llvm_meta
+, buildLlvmTools
+, monorepoSrc, runCommand
+, cmake
+, ninja
+, libxml2
+, libllvm
+, version
+}:
+
+stdenv.mkDerivation rec {
+ pname = "lld";
+ inherit version;
+
+ # Blank llvm dir just so relative path works
+ src = runCommand "${pname}-src-${version}" {} ''
+ mkdir -p "$out"
+ cp -r ${monorepoSrc}/cmake "$out"
+ cp -r ${monorepoSrc}/${pname} "$out"
+ mkdir -p "$out/libunwind"
+ cp -r ${monorepoSrc}/libunwind/include "$out/libunwind"
+ mkdir -p "$out/llvm"
+ '';
+
+ sourceRoot = "${src.name}/${pname}";
+
+ patches = [
+ ./gnu-install-dirs.patch
+ ];
+
+ nativeBuildInputs = [ cmake ninja ];
+ buildInputs = [ libllvm libxml2 ];
+
+ cmakeFlags = [
+ "-DLLD_INSTALL_PACKAGE_DIR=${placeholder "dev"}/lib/cmake/lld"
+ ] ++ lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [
+ "-DLLVM_TABLEGEN_EXE=${buildLlvmTools.llvm}/bin/llvm-tblgen"
+ ];
+ LDFLAGS = lib.optionalString stdenv.hostPlatform.isMusl "-Wl,-z,stack-size=2097152";
+
+ outputs = [ "out" "lib" "dev" ];
+
+ meta = llvm_meta // {
+ homepage = "https://lld.llvm.org/";
+ description = "The LLVM linker (unwrapped)";
+ longDescription = ''
+ LLD is a linker from the LLVM project that is a drop-in replacement for
+ system linkers and runs much faster than them. It also provides features
+ that are useful for toolchain developers.
+ The linker supports ELF (Unix), PE/COFF (Windows), Mach-O (macOS), and
+ WebAssembly in descending order of completeness. Internally, LLD consists
+ of several different linkers.
+ '';
+ };
+}
diff --git a/pkgs/development/compilers/llvm/16/lld/gnu-install-dirs.patch b/pkgs/development/compilers/llvm/16/lld/gnu-install-dirs.patch
new file mode 100644
index 000000000000..ea62b2ad50c7
--- /dev/null
+++ b/pkgs/development/compilers/llvm/16/lld/gnu-install-dirs.patch
@@ -0,0 +1,46 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index dcc649629a4b..58dca54642e4 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -70,13 +70,15 @@ if(LLD_BUILT_STANDALONE)
+ if (NOT LLVM_CONFIG_FOUND)
+ # Pull values from LLVMConfig.cmake. We can drop this once the llvm-config
+ # path is removed.
+- set(MAIN_INCLUDE_DIR "${LLVM_INCLUDE_DIR}")
++ set(INCLUDE_DIRS ${LLVM_INCLUDE_DIRS})
+ set(LLVM_OBJ_DIR "${LLVM_BINARY_DIR}")
+ # N.B. this is just a default value, the CACHE PATHs below can be overridden.
+ set(MAIN_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../llvm")
++ else()
++ set(INCLUDE_DIRS "${LLVM_BINARY_DIR}/include" "${MAIN_INCLUDE_DIR}")
+ endif()
+
+- set(LLVM_MAIN_INCLUDE_DIR "${MAIN_INCLUDE_DIR}" CACHE PATH "Path to llvm/include")
++ set(LLVM_INCLUDE_DIRS ${INCLUDE_DIRS} CACHE PATH "Path to llvm/include and any other header dirs needed")
+ set(LLVM_BINARY_DIR "${LLVM_OBJ_ROOT}" CACHE PATH "Path to LLVM build tree")
+ set(LLVM_MAIN_SRC_DIR "${MAIN_SRC_DIR}" CACHE PATH "Path to LLVM source tree")
+
+@@ -95,7 +97,7 @@ if(LLD_BUILT_STANDALONE)
+
+ set(PACKAGE_VERSION "${LLVM_PACKAGE_VERSION}")
+
+- include_directories("${LLVM_BINARY_DIR}/include" ${LLVM_INCLUDE_DIRS})
++ include_directories(${LLVM_INCLUDE_DIRS})
+ link_directories(${LLVM_LIBRARY_DIRS})
+
+ if(LLVM_INCLUDE_TESTS)
+diff --git a/cmake/modules/AddLLD.cmake b/cmake/modules/AddLLD.cmake
+index d3924f7243d4..42a7cd62281c 100644
+--- a/cmake/modules/AddLLD.cmake
++++ b/cmake/modules/AddLLD.cmake
+@@ -18,8 +18,8 @@ macro(add_lld_library name)
+ install(TARGETS ${name}
+ COMPONENT ${name}
+ ${export_to_lldtargets}
+- LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX}
+- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX}
++ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}"
++ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}"
+ RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
+
+ if (${ARG_SHARED} AND NOT CMAKE_CONFIGURATION_TYPES)
diff --git a/pkgs/development/compilers/llvm/16/lldb/cpu_subtype_arm64e_replacement.patch b/pkgs/development/compilers/llvm/16/lldb/cpu_subtype_arm64e_replacement.patch
new file mode 100644
index 000000000000..20d35c9f3ea9
--- /dev/null
+++ b/pkgs/development/compilers/llvm/16/lldb/cpu_subtype_arm64e_replacement.patch
@@ -0,0 +1,12 @@
+diff --git a/source/Host/macosx/objcxx/HostInfoMacOSX.mm b/source/Host/macosx/objcxx/HostInfoMacOSX.mm
+--- a/source/Host/macosx/objcxx/HostInfoMacOSX.mm
++++ b/source/Host/macosx/objcxx/HostInfoMacOSX.mm
+@@ -233,7 +233,7 @@ void HostInfoMacOSX::ComputeHostArchitectureSupport(ArchSpec &arch_32,
+ len = sizeof(is_64_bit_capable);
+ ::sysctlbyname("hw.cpu64bit_capable", &is_64_bit_capable, &len, NULL, 0);
+
+- if (cputype == CPU_TYPE_ARM64 && cpusubtype == CPU_SUBTYPE_ARM64E) {
++ if (cputype == CPU_TYPE_ARM64 && cpusubtype == ((cpu_subtype_t) 2)) { // CPU_SUBTYPE_ARM64E is not available in the macOS 10.12 headers
+ // The arm64e architecture is a preview. Pretend the host architecture
+ // is arm64.
+ cpusubtype = CPU_SUBTYPE_ARM64_ALL;
diff --git a/pkgs/development/compilers/llvm/16/lldb/default.nix b/pkgs/development/compilers/llvm/16/lldb/default.nix
new file mode 100644
index 000000000000..4b50b79cf613
--- /dev/null
+++ b/pkgs/development/compilers/llvm/16/lldb/default.nix
@@ -0,0 +1,186 @@
+{ lib, stdenv, llvm_meta
+, runCommand
+, monorepoSrc
+, cmake
+, ninja
+, zlib
+, ncurses
+, swig
+, which
+, libedit
+, libxml2
+, libllvm
+, libclang
+, python3
+, version
+, libobjc
+, xpc
+, Foundation
+, bootstrap_cmds
+, Carbon
+, Cocoa
+, lit
+, makeWrapper
+, darwin
+, enableManpages ? false
+, lua5_3
+}:
+
+# TODO: we build the python bindings but don't expose them as a python package
+# TODO: expose the vscode extension?
+
+stdenv.mkDerivation (rec {
+ pname = "lldb";
+ inherit version;
+
+ src = runCommand "${pname}-src-${version}" {} ''
+ mkdir -p "$out"
+ cp -r ${monorepoSrc}/cmake "$out"
+ cp -r ${monorepoSrc}/${pname} "$out"
+ '';
+
+ sourceRoot = "${src.name}/${pname}";
+
+ patches = [
+ ./procfs.patch
+ (runCommand "resource-dir.patch" {
+ clangLibDir = "${libclang.lib}/lib";
+ } ''
+ substitute '${./resource-dir.patch}' "$out" --subst-var clangLibDir
+ '')
+ ./gnu-install-dirs.patch
+ ]
+ # This is a stopgap solution if/until the macOS SDK used for x86_64 is
+ # updated.
+ #
+ # The older 10.12 SDK used on x86_64 as of this writing has a `mach/machine.h`
+ # header that does not define `CPU_SUBTYPE_ARM64E` so we replace the one use
+ # of this preprocessor symbol in `lldb` with its expansion.
+ #
+ # See here for some context:
+ # https://github.com/NixOS/nixpkgs/pull/194634#issuecomment-1272129132
+ ++ lib.optional (
+ stdenv.targetPlatform.isDarwin
+ && !stdenv.targetPlatform.isAarch64
+ && (lib.versionOlder darwin.apple_sdk.sdk.version "11.0")
+ ) ./cpu_subtype_arm64e_replacement.patch;
+
+ outputs = [ "out" "lib" "dev" ];
+
+ nativeBuildInputs = [
+ cmake ninja python3 which swig lit makeWrapper lua5_3
+ ] ++ lib.optionals enableManpages [
+ python3.pkgs.sphinx python3.pkgs.recommonmark
+ ];
+
+ buildInputs = [
+ ncurses
+ zlib
+ libedit
+ libxml2
+ libllvm
+ ] ++ lib.optionals stdenv.isDarwin [
+ libobjc
+ xpc
+ Foundation
+ bootstrap_cmds
+ Carbon
+ Cocoa
+ ]
+ # The older libSystem used on x86_64 macOS is missing the
+ # `<bsm/audit_session.h>` header which `lldb` uses.
+ #
+ # We copy this header over from macOS 10.12 SDK.
+ #
+ # See here for context:
+ # https://github.com/NixOS/nixpkgs/pull/194634#issuecomment-1272129132
+ ++ lib.optional (
+ stdenv.targetPlatform.isDarwin
+ && !stdenv.targetPlatform.isAarch64
+ ) (
+ runCommand "bsm-audit-session-header" { } ''
+ install -Dm444 \
+ "${lib.getDev darwin.apple_sdk.sdk}/include/bsm/audit_session.h" \
+ "$out/include/bsm/audit_session.h"
+ ''
+ );
+
+ hardeningDisable = [ "format" ];
+
+ cmakeFlags = [
+ "-DLLDB_INCLUDE_TESTS=${if doCheck then "YES" else "NO"}"
+ "-DLLVM_ENABLE_RTTI=OFF"
+ "-DClang_DIR=${libclang.dev}/lib/cmake"
+ "-DLLVM_EXTERNAL_LIT=${lit}/bin/lit"
+ ] ++ lib.optionals stdenv.isDarwin [
+ "-DLLDB_USE_SYSTEM_DEBUGSERVER=ON"
+ ] ++ lib.optionals (!stdenv.isDarwin) [
+ "-DLLDB_CODESIGN_IDENTITY=" # codesigning makes nondeterministic
+ ] ++ lib.optionals enableManpages [
+ "-DLLVM_ENABLE_SPHINX=ON"
+ "-DSPHINX_OUTPUT_MAN=ON"
+ "-DSPHINX_OUTPUT_HTML=OFF"
+
+ # docs reference `automodapi` but it's not added to the extensions list when
+ # only building the manpages:
+ # https://github.com/llvm/llvm-project/blob/af6ec9200b09039573d85e349496c4f5b17c3d7f/lldb/docs/conf.py#L54
+ #
+ # so, we just ignore the resulting errors
+ "-DSPHINX_WARNINGS_AS_ERRORS=OFF"
+ ] ++ lib.optionals doCheck [
+ "-DLLDB_TEST_C_COMPILER=${stdenv.cc}/bin/${stdenv.cc.targetPrefix}cc"
+ "-DLLDB_TEST_CXX_COMPILER=${stdenv.cc}/bin/${stdenv.cc.targetPrefix}c++"
+ ];
+
+ doCheck = false;
+
+ installCheckPhase = ''
+ if [ ! -e "$lib/${python3.sitePackages}/lldb/_lldb.so" ] ; then
+ return 1;
+ fi
+ '';
+
+ postInstall = ''
+ wrapProgram $out/bin/lldb --prefix PYTHONPATH : $lib/${python3.sitePackages}/
+
+ # Editor support
+ # vscode:
+ install -D ../tools/lldb-vscode/package.json $out/share/vscode/extensions/llvm-org.lldb-vscode-0.1.0/package.json
+ mkdir -p $out/share/vscode/extensions/llvm-org.lldb-vscode-0.1.0/bin
+ ln -s $out/bin/lldb-vscode $out/share/vscode/extensions/llvm-org.lldb-vscode-0.1.0/bin
+ '';
+
+ meta = llvm_meta // {
+ homepage = "https://lldb.llvm.org/";
+ description = "A next-generation high-performance debugger";
+ longDescription = ''
+ LLDB is a next generation, high-performance debugger. It is built as a set
+ of reusable components which highly leverage existing libraries in the
+ larger LLVM Project, such as the Clang expression parser and LLVM
+ disassembler.
+ '';
+ };
+} // lib.optionalAttrs enableManpages {
+ pname = "lldb-manpages";
+
+ ninjaFlags = [ "docs-lldb-man" ];
+
+ propagatedBuildInputs = [];
+
+ # manually install lldb man page
+ installPhase = ''
+ mkdir -p $out/share/man/man1
+ install docs/man/lldb.1 -t $out/share/man/man1/
+ '';
+
+ postPatch = null;
+ postInstall = null;
+
+ outputs = [ "out" ];
+
+ doCheck = false;
+
+ meta = llvm_meta // {
+ description = "man pages for LLDB ${version}";
+ };
+})
diff --git a/pkgs/development/compilers/llvm/16/lldb/gnu-install-dirs.patch b/pkgs/development/compilers/llvm/16/lldb/gnu-install-dirs.patch
new file mode 100644
index 000000000000..4388f5c7f593
--- /dev/null
+++ b/pkgs/development/compilers/llvm/16/lldb/gnu-install-dirs.patch
@@ -0,0 +1,23 @@
+diff --git a/cmake/modules/AddLLDB.cmake b/cmake/modules/AddLLDB.cmake
+index 3291a7c808e1..b27d27ce6a87 100644
+--- a/cmake/modules/AddLLDB.cmake
++++ b/cmake/modules/AddLLDB.cmake
+@@ -109,7 +109,7 @@ function(add_lldb_library name)
+ endif()
+
+ if(PARAM_SHARED)
+- set(install_dest lib${LLVM_LIBDIR_SUFFIX})
++ set(install_dest ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX})
+ if(PARAM_INSTALL_PREFIX)
+ set(install_dest ${PARAM_INSTALL_PREFIX})
+ endif()
+diff --git a/tools/intel-features/CMakeLists.txt b/tools/intel-features/CMakeLists.txt
+index 7d48491ec89a..c04543585588 100644
+--- a/tools/intel-features/CMakeLists.txt
++++ b/tools/intel-features/CMakeLists.txt
+@@ -30,4 +30,4 @@ add_lldb_library(lldbIntelFeatures SHARED
+ )
+
+ install(TARGETS lldbIntelFeatures
+- LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX})
++ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX})
diff --git a/pkgs/development/compilers/llvm/16/lldb/procfs.patch b/pkgs/development/compilers/llvm/16/lldb/procfs.patch
new file mode 100644
index 000000000000..7b200e86505c
--- /dev/null
+++ b/pkgs/development/compilers/llvm/16/lldb/procfs.patch
@@ -0,0 +1,46 @@
+--- a/source/Plugins/Process/Linux/Procfs.h
++++ b/source/Plugins/Process/Linux/Procfs.h
+@@ -10,6 +10,13 @@
+ // sys/procfs.h on Android/Linux for all supported architectures.
+
+ #include <sys/ptrace.h>
++#include <asm/ptrace.h>
++
++// on i686 preprocessor symbols with these register names are defined as
++// numeric constants; these symbols clash with identifier names used in
++// `llvm/Support/VirtualFileSystem.h` and `llvm/ADT/SmallVector.h`
++#undef FS
++#undef CS
+
+ #include "lldb/lldb-types.h"
+
+@@ -17,23 +24,13 @@
+
+ #include <vector>
+
+-#ifdef __ANDROID__
+-#if defined(__arm64__) || defined(__aarch64__)
+-typedef unsigned long elf_greg_t;
+-typedef elf_greg_t
+- elf_gregset_t[(sizeof(struct user_pt_regs) / sizeof(elf_greg_t))];
+-typedef struct user_fpsimd_state elf_fpregset_t;
+-#ifndef NT_FPREGSET
+-#define NT_FPREGSET NT_PRFPREG
+-#endif // NT_FPREGSET
+-#elif defined(__mips__)
+-#ifndef NT_FPREGSET
+-#define NT_FPREGSET NT_PRFPREG
+-#endif // NT_FPREGSET
+-#endif
+-#else // __ANDROID__
++#if !defined(__GLIBC__) && defined(__powerpc__)
++#define pt_regs musl_pt_regs
++#include <sys/procfs.h>
++#undef pt_regs
++#else
+ #include <sys/procfs.h>
+-#endif // __ANDROID__
++#endif
+
+ namespace lldb_private {
+ namespace process_linux {
diff --git a/pkgs/development/compilers/llvm/16/lldb/resource-dir.patch b/pkgs/development/compilers/llvm/16/lldb/resource-dir.patch
new file mode 100644
index 000000000000..e0db80afeb9f
--- /dev/null
+++ b/pkgs/development/compilers/llvm/16/lldb/resource-dir.patch
@@ -0,0 +1,13 @@
+diff --git a/lldb/cmake/modules/LLDBConfig.cmake b/lldb/cmake/modules/LLDBConfig.cmake
+index 37364341ff8b..7f74c1a3e257 100644
+--- a/cmake/modules/LLDBConfig.cmake
++++ b/cmake/modules/LLDBConfig.cmake
+@@ -257,7 +257,7 @@ if (NOT TARGET clang-resource-headers)
+ # Iterate over the possible places where the external resource directory
+ # could be and pick the first that exists.
+ foreach(CANDIDATE "${Clang_DIR}/../.." "${LLVM_DIR}" "${LLVM_LIBRARY_DIRS}"
+- "${LLVM_BUILD_LIBRARY_DIR}"
++ "${LLVM_BUILD_LIBRARY_DIR}" "@clangLibDir@"
+ "${LLVM_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX}")
+ # Build the resource directory path by appending 'clang/<version number>'.
+ set(CANDIDATE_RESOURCE_DIR "${CANDIDATE}/clang/${LLDB_CLANG_RESOURCE_DIR_NAME}")
diff --git a/pkgs/development/compilers/llvm/16/llvm/default.nix b/pkgs/development/compilers/llvm/16/llvm/default.nix
new file mode 100644
index 000000000000..23d8e9fec518
--- /dev/null
+++ b/pkgs/development/compilers/llvm/16/llvm/default.nix
@@ -0,0 +1,430 @@
+{ lib, stdenv, llvm_meta
+, pkgsBuildBuild
+, monorepoSrc
+, runCommand
+, fetchpatch
+, cmake
+, darwin
+, ninja
+, python3
+, python3Packages
+, libffi
+, enableGoldPlugin ? libbfd.hasPluginAPI
+, libbfd
+, libpfm
+, libxml2
+, ncurses
+, version
+, release_version
+, zlib
+, which
+, sysctl
+, buildLlvmTools
+, debugVersion ? false
+, doCheck ? (!stdenv.isx86_32 /* TODO: why */) && (!stdenv.hostPlatform.isMusl)
+ && (stdenv.hostPlatform == stdenv.buildPlatform)
+, enableManpages ? false
+, enableSharedLibraries ? !stdenv.hostPlatform.isStatic
+, enablePFM ? stdenv.isLinux /* PFM only supports Linux */
+ # broken for Ampere eMAG 8180 (c2.large.arm on Packet) #56245
+ # broken for the armv7l builder
+ && !stdenv.hostPlatform.isAarch
+, enablePolly ? true
+} @args:
+
+let
+ inherit (lib) optional optionals optionalString;
+
+ # Used when creating a version-suffixed symlink of libLLVM.dylib
+ shortVersion = with lib;
+ concatStringsSep "." (take 1 (splitString "." release_version));
+
+ # Ordinarily we would just the `doCheck` and `checkDeps` functionality
+ # `mkDerivation` gives us to manage our test dependencies (instead of breaking
+ # out `doCheck` as a package level attribute).
+ #
+ # Unfortunately `lit` does not forward `$PYTHONPATH` to children processes, in
+ # particular the children it uses to do feature detection.
+ #
+ # This means that python deps we add to `checkDeps` (which the python
+ # interpreter is made aware of via `$PYTHONPATH` – populated by the python
+ # setup hook) are not picked up by `lit` which causes it to skip tests.
+ #
+ # Adding `python3.withPackages (ps: [ ... ])` to `checkDeps` also doesn't work
+ # because this package is shadowed in `$PATH` by the regular `python3`
+ # package.
+ #
+ # So, we "manually" assemble one python derivation for the package to depend
+ # on, taking into account whether checks are enabled or not:
+ python = if doCheck then
+ # Note that we _explicitly_ ask for a python interpreter for our host
+ # platform here; the splicing that would ordinarily take care of this for
+ # us does not seem to work once we use `withPackages`.
+ let
+ checkDeps = ps: with ps; [ psutil ];
+ in pkgsBuildBuild.targetPackages.python3.withPackages checkDeps
+ else python3;
+
+in stdenv.mkDerivation (rec {
+ pname = "llvm";
+ inherit version;
+
+ src = runCommand "${pname}-src-${version}" {} (''
+ mkdir -p "$out"
+ cp -r ${monorepoSrc}/cmake "$out"
+ cp -r ${monorepoSrc}/${pname} "$out"
+ cp -r ${monorepoSrc}/third-party "$out"
+ '' + lib.optionalString enablePolly ''
+ chmod u+w "$out/${pname}/tools"
+ cp -r ${monorepoSrc}/polly "$out/${pname}/tools"
+ '');
+
+ sourceRoot = "${src.name}/${pname}";
+
+ outputs = [ "out" "lib" "dev" "python" ];
+
+ nativeBuildInputs = [ cmake ninja python ]
+ ++ optionals enableManpages [
+ # Note: we intentionally use `python3Packages` instead of `python3.pkgs`;
+ # splicing does *not* work with the latter. (TODO: fix)
+ python3Packages.sphinx python3Packages.recommonmark
+ ];
+
+ buildInputs = [ libxml2 libffi ]
+ ++ optional enablePFM libpfm; # exegesis
+
+ propagatedBuildInputs = [ ncurses zlib ];
+
+ nativeCheckInputs = [
+ which
+ ] ++ lib.optional stdenv.isDarwin sysctl;
+
+ patches = [
+ ./gnu-install-dirs.patch
+
+ # Running the tests involves invoking binaries (like `opt`) that depend on
+ # the LLVM dylibs and reference them by absolute install path (i.e. their
+ # nix store path).
+ #
+ # Because we have not yet run the install phase (we're running these tests
+ # as part of `checkPhase` instead of `installCheckPhase`) these absolute
+ # paths do not exist yet; to work around this we point the loader (`ld` on
+ # unix, `dyld` on macOS) at the `lib` directory which will later become this
+ # package's `lib` output.
+ #
+ # Previously we would just set `LD_LIBRARY_PATH` to include the build `lib`
+ # dir but:
+ # - this doesn't generalize well to other platforms; `lit` doesn't forward
+ # `DYLD_LIBRARY_PATH` (macOS):
+ # + https://github.com/llvm/llvm-project/blob/0d89963df354ee309c15f67dc47c8ab3cb5d0fb2/llvm/utils/lit/lit/TestingConfig.py#L26
+ # - even if `lit` forwarded this env var, we actually cannot set
+ # `DYLD_LIBRARY_PATH` in the child processes `lit` launches because
+ # `DYLD_LIBRARY_PATH` (and `DYLD_FALLBACK_LIBRARY_PATH`) is cleared for
+ # "protected processes" (i.e. the python interpreter that runs `lit`):
+ # https://stackoverflow.com/a/35570229
+ # - other LLVM subprojects deal with this issue by having their `lit`
+ # configuration set these env vars for us; it makes sense to do the same
+ # for LLVM:
+ # + https://github.com/llvm/llvm-project/blob/4c106cfdf7cf7eec861ad3983a3dd9a9e8f3a8ae/clang-tools-extra/test/Unit/lit.cfg.py#L22-L31
+ #
+ # !!! TODO: look into upstreaming this patch
+ ./llvm-lit-cfg-add-libs-to-dylib-path.patch
+
+ # `lit` has a mode where it executes run lines as a shell script which is
+ # constructs; this is problematic for macOS because it means that there's
+ # another process in between `lit` and the binaries being tested. As noted
+ # above, this means that `DYLD_LIBRARY_PATH` is cleared which means that our
+ # tests fail with dyld errors.
+ #
+ # To get around this we patch `lit` to reintroduce `DYLD_LIBRARY_PATH`, when
+ # present in the test configuration.
+ #
+ # It's not clear to me why this isn't an issue for LLVM developers running
+ # on macOS (nothing about this _seems_ nix specific)..
+ # ./lit-shell-script-runner-set-dyld-library-path.patch
+ ] ++ lib.optionals enablePolly [
+ ./gnu-install-dirs-polly.patch
+
+ # Just like the `llvm-lit-cfg` patch, but for `polly`.
+ ./polly-lit-cfg-add-libs-to-dylib-path.patch
+ ];
+
+ postPatch = optionalString stdenv.isDarwin ''
+ substituteInPlace cmake/modules/AddLLVM.cmake \
+ --replace 'set(_install_name_dir INSTALL_NAME_DIR "@rpath")' "set(_install_name_dir)" \
+ --replace 'set(_install_rpath "@loader_path/../''${CMAKE_INSTALL_LIBDIR}''${LLVM_LIBDIR_SUFFIX}" ''${extra_libdir})' ""
+
+ # As of LLVM 15, marked as XFAIL on arm64 macOS but lit doesn't seem to pick
+ # this up: https://github.com/llvm/llvm-project/blob/c344d97a125b18f8fed0a64aace73c49a870e079/llvm/test/MC/ELF/cfi-version.ll#L7
+ rm test/MC/ELF/cfi-version.ll
+
+ # This test tries to call `sw_vers` by absolute path (`/usr/bin/sw_vers`)
+ # and thus fails under the sandbox:
+ substituteInPlace unittests/Support/Host.cpp \
+ --replace '/usr/bin/sw_vers' "${(builtins.toString darwin.DarwinTools) + "/bin/sw_vers" }"
+ '' + optionalString (stdenv.isDarwin && stdenv.hostPlatform.isx86) ''
+ # This test tries to call the intrinsics `@llvm.roundeven.f32` and
+ # `@llvm.roundeven.f64` which seem to (incorrectly?) lower to `roundevenf`
+ # and `roundeven` on x86_64 macOS.
+ #
+ # However these functions are glibc specific so the test fails:
+ # - https://www.gnu.org/software/gnulib/manual/html_node/roundevenf.html
+ # - https://www.gnu.org/software/gnulib/manual/html_node/roundeven.html
+ #
+ # TODO(@rrbutani): this seems to run fine on `aarch64-darwin`, why does it
+ # pass there?
+ substituteInPlace test/ExecutionEngine/Interpreter/intrinsics.ll \
+ --replace "%roundeven32 = call float @llvm.roundeven.f32(float 0.000000e+00)" "" \
+ --replace "%roundeven64 = call double @llvm.roundeven.f64(double 0.000000e+00)" ""
+
+ # This test fails on darwin x86_64 because `sw_vers` reports a different
+ # macOS version than what LLVM finds by reading
+ # `/System/Library/CoreServices/SystemVersion.plist` (which is passed into
+ # the sandbox on macOS).
+ #
+ # The `sw_vers` provided by nixpkgs reports the macOS version associated
+ # with the `CoreFoundation` framework with which it was built. Because
+ # nixpkgs pins the SDK for `aarch64-darwin` and `x86_64-darwin` what
+ # `sw_vers` reports is not guaranteed to match the macOS version of the host
+ # that's building this derivation.
+ #
+ # Astute readers will note that we only _patch_ this test on aarch64-darwin
+ # (to use the nixpkgs provided `sw_vers`) instead of disabling it outright.
+ # So why does this test pass on aarch64?
+ #
+ # Well, it seems that `sw_vers` on aarch64 actually links against the _host_
+ # CoreFoundation framework instead of the nixpkgs provided one.
+ #
+ # Not entirely sure what the right fix is here. I'm assuming aarch64
+ # `sw_vers` doesn't intentionally link against the host `CoreFoundation`
+ # (still digging into how this ends up happening, will follow up) but that
+ # aside I think the more pertinent question is: should we be patching LLVM's
+ # macOS version detection logic to use `sw_vers` instead of reading host
+ # paths? This *is* a way in which details about builder machines can creep
+ # into the artifacts that are produced, affecting reproducibility, but it's
+ # not clear to me when/where/for what this even gets used in LLVM.
+ #
+ # TODO(@rrbutani): fix/follow-up
+ substituteInPlace unittests/Support/Host.cpp \
+ --replace "getMacOSHostVersion" "DISABLED_getMacOSHostVersion"
+
+ # This test fails with a `dysmutil` crash; have not yet dug into what's
+ # going on here (TODO(@rrbutani)).
+ rm test/tools/dsymutil/ARM/obfuscated.test
+ '' + ''
+ # FileSystem permissions tests fail with various special bits
+ substituteInPlace unittests/Support/CMakeLists.txt \
+ --replace "Path.cpp" ""
+ rm unittests/Support/Path.cpp
+ substituteInPlace unittests/IR/CMakeLists.txt \
+ --replace "PassBuilderCallbacksTest.cpp" ""
+ rm unittests/IR/PassBuilderCallbacksTest.cpp
+ rm test/tools/llvm-objcopy/ELF/mirror-permissions-unix.test
+ '' + 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
+ # valgrind unhappy with musl or glibc, but fails w/musl only
+ rm test/CodeGen/AArch64/wineh4.mir
+ '' + optionalString stdenv.hostPlatform.isAarch32 ''
+ # skip failing X86 test cases on 32-bit ARM
+ rm test/DebugInfo/X86/convert-debugloc.ll
+ rm test/DebugInfo/X86/convert-inlined.ll
+ rm test/DebugInfo/X86/convert-linked.ll
+ rm test/tools/dsymutil/X86/op-convert.test
+ rm test/tools/gold/X86/split-dwarf.ll
+ rm test/tools/llvm-dwarfdump/X86/prettyprint_types.s
+ rm test/tools/llvm-dwarfdump/X86/simplified-template-names.s
+
+ # !!! Note: these tests are removed in LLVM 16.
+ #
+ # See here for context: https://github.com/NixOS/nixpkgs/pull/194634#discussion_r999790443
+ rm test/CodeGen/RISCV/rv32zbp.ll
+ rm test/CodeGen/RISCV/rv64zbp.ll
+ '' + optionalString (stdenv.hostPlatform.system == "armv6l-linux") ''
+ # Seems to require certain floating point hardware (NEON?)
+ rm test/ExecutionEngine/frem.ll
+ '' + ''
+ patchShebangs test/BugPoint/compile-custom.ll.py
+ '';
+
+ preConfigure = ''
+ # Workaround for configure flags that need to have spaces
+ cmakeFlagsArray+=(
+ -DLLVM_LIT_ARGS="-svj''${NIX_BUILD_CORES} --no-progress-bar"
+ )
+ '';
+
+ # Defensive check: some paths (that we make symlinks to) depend on the release
+ # version, for example:
+ # - https://github.com/llvm/llvm-project/blob/406bde9a15136254f2b10d9ef3a42033b3cb1b16/clang/lib/Headers/CMakeLists.txt#L185
+ #
+ # So we want to sure that the version in the source matches the release
+ # version we were given.
+ #
+ # We do this check here, in the LLVM build, because it happens early.
+ postConfigure = let
+ v = lib.versions;
+ major = v.major release_version;
+ minor = v.minor release_version;
+ patch = v.patch release_version;
+ in ''
+ # $1: part, $2: expected
+ check_version() {
+ part="''${1^^}"
+ part="$(cat include/llvm/Config/llvm-config.h | grep "#define LLVM_VERSION_''${part} " | cut -d' ' -f3)"
+
+ if [[ "$part" != "$2" ]]; then
+ echo >&2 \
+ "mismatch in the $1 version! we have version ${release_version}" \
+ "and expected the $1 version to be '$2'; the source has '$part' instead"
+ exit 3
+ fi
+ }
+
+ check_version major ${major}
+ check_version minor ${minor}
+ check_version patch ${patch}
+ '';
+
+ # E.g. mesa.drivers use the build-id as a cache key (see #93946):
+ LDFLAGS = optionalString (enableSharedLibraries && !stdenv.isDarwin) "-Wl,--build-id=sha1";
+
+ cmakeFlags = with stdenv; let
+ # These flags influence llvm-config's BuildVariables.inc in addition to the
+ # general build. We need to make sure these are also passed via
+ # CROSS_TOOLCHAIN_FLAGS_NATIVE when cross-compiling or llvm-config-native
+ # will return different results from the cross llvm-config.
+ #
+ # Some flags don't need to be repassed because LLVM already does so (like
+ # CMAKE_BUILD_TYPE), others are irrelevant to the result.
+ flagsForLlvmConfig = [
+ "-DLLVM_INSTALL_PACKAGE_DIR=${placeholder "dev"}/lib/cmake/llvm"
+ "-DLLVM_ENABLE_RTTI=ON"
+ ] ++ optionals enableSharedLibraries [
+ "-DLLVM_LINK_LLVM_DYLIB=ON"
+ ];
+ in flagsForLlvmConfig ++ [
+ "-DCMAKE_BUILD_TYPE=${if debugVersion then "Debug" else "Release"}"
+ "-DLLVM_INSTALL_UTILS=ON" # Needed by rustc
+ "-DLLVM_BUILD_TESTS=${if doCheck then "ON" else "OFF"}"
+ "-DLLVM_ENABLE_FFI=ON"
+ "-DLLVM_HOST_TRIPLE=${stdenv.hostPlatform.config}"
+ "-DLLVM_DEFAULT_TARGET_TRIPLE=${stdenv.hostPlatform.config}"
+ "-DLLVM_ENABLE_DUMP=ON"
+ ] ++ optionals stdenv.hostPlatform.isStatic [
+ # Disables building of shared libs, -fPIC is still injected by cc-wrapper
+ "-DLLVM_ENABLE_PIC=OFF"
+ "-DLLVM_BUILD_STATIC=ON"
+ "-DLLVM_LINK_LLVM_DYLIB=off"
+ # libxml2 needs to be disabled because the LLVM build system ignores its .la
+ # file and doesn't link zlib as well.
+ # https://github.com/ClangBuiltLinux/tc-build/issues/150#issuecomment-845418812
+ "-DLLVM_ENABLE_LIBXML2=OFF"
+ ] ++ optionals enableManpages [
+ "-DLLVM_BUILD_DOCS=ON"
+ "-DLLVM_ENABLE_SPHINX=ON"
+ "-DSPHINX_OUTPUT_MAN=ON"
+ "-DSPHINX_OUTPUT_HTML=OFF"
+ "-DSPHINX_WARNINGS_AS_ERRORS=OFF"
+ ] ++ optionals (enableGoldPlugin) [
+ "-DLLVM_BINUTILS_INCDIR=${libbfd.dev}/include"
+ ] ++ optionals isDarwin [
+ "-DLLVM_ENABLE_LIBCXX=ON"
+ "-DCAN_TARGET_i386=false"
+ ] ++ optionals (stdenv.hostPlatform != stdenv.buildPlatform) [
+ "-DCMAKE_CROSSCOMPILING=True"
+ "-DLLVM_TABLEGEN=${buildLlvmTools.llvm}/bin/llvm-tblgen"
+ (
+ let
+ nativeCC = pkgsBuildBuild.targetPackages.stdenv.cc;
+ nativeBintools = nativeCC.bintools.bintools;
+ nativeToolchainFlags = [
+ "-DCMAKE_C_COMPILER=${nativeCC}/bin/${nativeCC.targetPrefix}cc"
+ "-DCMAKE_CXX_COMPILER=${nativeCC}/bin/${nativeCC.targetPrefix}c++"
+ "-DCMAKE_AR=${nativeBintools}/bin/${nativeBintools.targetPrefix}ar"
+ "-DCMAKE_STRIP=${nativeBintools}/bin/${nativeBintools.targetPrefix}strip"
+ "-DCMAKE_RANLIB=${nativeBintools}/bin/${nativeBintools.targetPrefix}ranlib"
+ ];
+ # We need to repass the custom GNUInstallDirs values, otherwise CMake
+ # will choose them for us, leading to wrong results in llvm-config-native
+ nativeInstallFlags = [
+ "-DCMAKE_INSTALL_PREFIX=${placeholder "out"}"
+ "-DCMAKE_INSTALL_BINDIR=${placeholder "out"}/bin"
+ "-DCMAKE_INSTALL_INCLUDEDIR=${placeholder "dev"}/include"
+ "-DCMAKE_INSTALL_LIBDIR=${placeholder "lib"}/lib"
+ "-DCMAKE_INSTALL_LIBEXECDIR=${placeholder "lib"}/libexec"
+ ];
+ in "-DCROSS_TOOLCHAIN_FLAGS_NATIVE:list="
+ + lib.concatStringsSep ";" (lib.concatLists [
+ flagsForLlvmConfig
+ nativeToolchainFlags
+ nativeInstallFlags
+ ])
+ )
+ ];
+
+ postInstall = ''
+ mkdir -p $python/share
+ mv $out/share/opt-viewer $python/share/opt-viewer
+ moveToOutput "bin/llvm-config*" "$dev"
+ substituteInPlace "$dev/lib/cmake/llvm/LLVMExports-${if debugVersion then "debug" else "release"}.cmake" \
+ --replace "\''${_IMPORT_PREFIX}/lib/lib" "$lib/lib/lib" \
+ --replace "$out/bin/llvm-config" "$dev/bin/llvm-config"
+ substituteInPlace "$dev/lib/cmake/llvm/LLVMConfig.cmake" \
+ --replace 'set(LLVM_BINARY_DIR "''${LLVM_INSTALL_PREFIX}")' 'set(LLVM_BINARY_DIR "'"$lib"'")'
+ ''
+ + optionalString (stdenv.isDarwin && enableSharedLibraries) ''
+ ln -s $lib/lib/libLLVM.dylib $lib/lib/libLLVM-${shortVersion}.dylib
+ ln -s $lib/lib/libLLVM.dylib $lib/lib/libLLVM-${release_version}.dylib
+ ''
+ + optionalString (stdenv.buildPlatform != stdenv.hostPlatform) ''
+ cp NATIVE/bin/llvm-config $dev/bin/llvm-config-native
+ '';
+
+ inherit doCheck;
+
+ checkTarget = "check-all";
+
+ # For the update script:
+ passthru.monorepoSrc = monorepoSrc;
+
+ requiredSystemFeatures = [ "big-parallel" ];
+ meta = llvm_meta // {
+ homepage = "https://llvm.org/";
+ description = "A collection of modular and reusable compiler and toolchain technologies";
+ longDescription = ''
+ The LLVM Project is a collection of modular and reusable compiler and
+ toolchain technologies. Despite its name, LLVM has little to do with
+ traditional virtual machines. The name "LLVM" itself is not an acronym; it
+ is the full name of the project.
+ LLVM began as a research project at the University of Illinois, with the
+ goal of providing a modern, SSA-based compilation strategy capable of
+ supporting both static and dynamic compilation of arbitrary programming
+ languages. Since then, LLVM has grown to be an umbrella project consisting
+ of a number of subprojects, many of which are being used in production by
+ a wide variety of commercial and open source projects as well as being
+ widely used in academic research. Code in the LLVM project is licensed
+ under the "Apache 2.0 License with LLVM exceptions".
+ '';
+ };
+} // lib.optionalAttrs enableManpages {
+ pname = "llvm-manpages";
+
+ propagatedBuildInputs = [];
+
+ ninjaFlags = [ "docs-llvm-man" ];
+ installTargets = [ "install-docs-llvm-man" ];
+
+ postPatch = null;
+ postInstall = null;
+
+ outputs = [ "out" ];
+
+ doCheck = false;
+
+ meta = llvm_meta // {
+ description = "man pages for LLVM ${version}";
+ };
+})
diff --git a/pkgs/development/compilers/llvm/16/llvm/gnu-install-dirs-polly.patch b/pkgs/development/compilers/llvm/16/llvm/gnu-install-dirs-polly.patch
new file mode 100644
index 000000000000..b01363e98aa0
--- /dev/null
+++ b/pkgs/development/compilers/llvm/16/llvm/gnu-install-dirs-polly.patch
@@ -0,0 +1,19 @@
+This is the one remaining Polly install dirs related change that hasn't made it
+into upstream yet; previously this patch file also included:
+https://reviews.llvm.org/D117541
+
+diff --git a/tools/polly/cmake/polly_macros.cmake b/tools/polly/cmake/polly_macros.cmake
+index 518a09b45a42..bd9d6f5542ad 100644
+--- a/tools/polly/cmake/polly_macros.cmake
++++ b/tools/polly/cmake/polly_macros.cmake
+@@ -44,8 +44,8 @@ macro(add_polly_library name)
+ if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY OR ${name} STREQUAL "LLVMPolly")
+ install(TARGETS ${name}
+ EXPORT LLVMExports
+- LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX}
+- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX})
++ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}
++ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX})
+ endif()
+ set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name})
+ endmacro(add_polly_library)
diff --git a/pkgs/development/compilers/llvm/16/llvm/gnu-install-dirs.patch b/pkgs/development/compilers/llvm/16/llvm/gnu-install-dirs.patch
new file mode 100644
index 000000000000..0ef317af8cc7
--- /dev/null
+++ b/pkgs/development/compilers/llvm/16/llvm/gnu-install-dirs.patch
@@ -0,0 +1,138 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 45399dc0537e..5d946e9e6583 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -942,7 +942,7 @@ if (NOT TENSORFLOW_AOT_PATH STREQUAL "")
+ add_subdirectory(${TENSORFLOW_AOT_PATH}/xla_aot_runtime_src
+ ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/tf_runtime)
+ install(TARGETS tf_xla_runtime EXPORT LLVMExports
+- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} COMPONENT tf_xla_runtime)
++ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX} COMPONENT tf_xla_runtime)
+ set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS tf_xla_runtime)
+ # Once we add more modules, we should handle this more automatically.
+ if (DEFINED LLVM_OVERRIDE_MODEL_HEADER_INLINERSIZEMODEL)
+diff --git a/cmake/modules/AddLLVM.cmake b/cmake/modules/AddLLVM.cmake
+index 057431208322..56f0dcb258da 100644
+--- a/cmake/modules/AddLLVM.cmake
++++ b/cmake/modules/AddLLVM.cmake
+@@ -844,8 +844,8 @@ macro(add_llvm_library name)
+ get_target_export_arg(${name} LLVM export_to_llvmexports ${umbrella})
+ install(TARGETS ${name}
+ ${export_to_llvmexports}
+- LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} COMPONENT ${name}
+- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} COMPONENT ${name}
++ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" COMPONENT ${name}
++ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" COMPONENT ${name}
+ RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT ${name})
+
+ if (NOT LLVM_ENABLE_IDE)
+@@ -2007,7 +2007,7 @@ function(llvm_install_library_symlink name dest type)
+ set(full_name ${CMAKE_${type}_LIBRARY_PREFIX}${name}${CMAKE_${type}_LIBRARY_SUFFIX})
+ set(full_dest ${CMAKE_${type}_LIBRARY_PREFIX}${dest}${CMAKE_${type}_LIBRARY_SUFFIX})
+
+- set(output_dir lib${LLVM_LIBDIR_SUFFIX})
++ set(output_dir ${CMAKE_INSTALL_FULL_LIBDIR}${LLVM_LIBDIR_SUFFIX})
+ if(WIN32 AND "${type}" STREQUAL "SHARED")
+ set(output_dir "${CMAKE_INSTALL_BINDIR}")
+ endif()
+@@ -2271,15 +2271,15 @@ function(llvm_setup_rpath name)
+
+ if (APPLE)
+ set(_install_name_dir INSTALL_NAME_DIR "@rpath")
+- set(_install_rpath "@loader_path/../lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir})
++ set(_install_rpath "@loader_path/../${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" ${extra_libdir})
+ elseif(${CMAKE_SYSTEM_NAME} MATCHES "AIX" AND BUILD_SHARED_LIBS)
+ # $ORIGIN is not interpreted at link time by aix ld.
+ # Since BUILD_SHARED_LIBS is only recommended for use by developers,
+ # hardcode the rpath to build/install lib dir first in this mode.
+ # FIXME: update this when there is better solution.
+- set(_install_rpath "${LLVM_LIBRARY_OUTPUT_INTDIR}" "${CMAKE_INSTALL_PREFIX}/lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir})
++ set(_install_rpath "${LLVM_LIBRARY_OUTPUT_INTDIR}" "${CMAKE_INSTALL_FULL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" ${extra_libdir})
+ elseif(UNIX)
+- set(_install_rpath "\$ORIGIN/../lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir})
++ set(_install_rpath "\$ORIGIN/../${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}" ${extra_libdir})
+ if(${CMAKE_SYSTEM_NAME} MATCHES "(FreeBSD|DragonFly)")
+ set_property(TARGET ${name} APPEND_STRING PROPERTY
+ LINK_FLAGS " -Wl,-z,origin ")
+diff --git a/cmake/modules/AddOCaml.cmake b/cmake/modules/AddOCaml.cmake
+index 891c9e6d618c..8d963f3b0069 100644
+--- a/cmake/modules/AddOCaml.cmake
++++ b/cmake/modules/AddOCaml.cmake
+@@ -147,9 +147,9 @@ function(add_ocaml_library name)
+ endforeach()
+
+ if( APPLE )
+- set(ocaml_rpath "@executable_path/../../../lib${LLVM_LIBDIR_SUFFIX}")
++ set(ocaml_rpath "@executable_path/../../../${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}")
+ elseif( UNIX )
+- set(ocaml_rpath "\\$ORIGIN/../../../lib${LLVM_LIBDIR_SUFFIX}")
++ set(ocaml_rpath "\\$ORIGIN/../../../${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}")
+ endif()
+ list(APPEND ocaml_flags "-ldopt" "-Wl,-rpath,${ocaml_rpath}")
+
+diff --git a/cmake/modules/CMakeLists.txt b/cmake/modules/CMakeLists.txt
+index d4b0ab959148..26ed981fd09f 100644
+--- a/cmake/modules/CMakeLists.txt
++++ b/cmake/modules/CMakeLists.txt
+@@ -128,7 +128,7 @@ set(LLVM_CONFIG_INCLUDE_DIRS
+ )
+ list(REMOVE_DUPLICATES LLVM_CONFIG_INCLUDE_DIRS)
+
+-extend_path(LLVM_CONFIG_LIBRARY_DIR "\${LLVM_INSTALL_PREFIX}" "lib\${LLVM_LIBDIR_SUFFIX}")
++extend_path(LLVM_CONFIG_LIBRARY_DIR "\${LLVM_INSTALL_PREFIX}" "${CMAKE_INSTALL_LIBDIR}\${LLVM_LIBDIR_SUFFIX}")
+ set(LLVM_CONFIG_LIBRARY_DIRS
+ "${LLVM_CONFIG_LIBRARY_DIR}"
+ # FIXME: Should there be other entries here?
+diff --git a/docs/CMake.rst b/docs/CMake.rst
+index 879b7b231d4c..9c31d14e8950 100644
+--- a/docs/CMake.rst
++++ b/docs/CMake.rst
+@@ -250,7 +250,7 @@ description is in `LLVM-related variables`_ below.
+ **LLVM_LIBDIR_SUFFIX**:STRING
+ Extra suffix to append to the directory where libraries are to be
+ installed. On a 64-bit architecture, one could use ``-DLLVM_LIBDIR_SUFFIX=64``
+- to install libraries to ``/usr/lib64``.
++ to install libraries to ``/usr/lib64``. See also ``CMAKE_INSTALL_LIBDIR``.
+
+ **LLVM_PARALLEL_{COMPILE,LINK}_JOBS**:STRING
+ Building the llvm toolchain can use a lot of resources, particularly
+@@ -284,6 +284,10 @@ manual, or execute ``cmake --help-variable VARIABLE_NAME``.
+ The path to install executables, relative to the *CMAKE_INSTALL_PREFIX*.
+ Defaults to "bin".
+
++**CMAKE_INSTALL_LIBDIR**:PATH
++ The path to install libraries, relative to the *CMAKE_INSTALL_PREFIX*.
++ Defaults to "lib".
++
+ **CMAKE_INSTALL_INCLUDEDIR**:PATH
+ The path to install header files, relative to the *CMAKE_INSTALL_PREFIX*.
+ Defaults to "include".
+diff --git a/tools/llvm-config/BuildVariables.inc.in b/tools/llvm-config/BuildVariables.inc.in
+index 370005cd8d7d..7e790bc52111 100644
+--- a/tools/llvm-config/BuildVariables.inc.in
++++ b/tools/llvm-config/BuildVariables.inc.in
+@@ -23,6 +23,7 @@
+ #define LLVM_CXXFLAGS "@LLVM_CXXFLAGS@"
+ #define LLVM_BUILDMODE "@LLVM_BUILDMODE@"
+ #define LLVM_LIBDIR_SUFFIX "@LLVM_LIBDIR_SUFFIX@"
++#define LLVM_INSTALL_LIBDIR "@CMAKE_INSTALL_LIBDIR@"
+ #define LLVM_INSTALL_INCLUDEDIR "@CMAKE_INSTALL_INCLUDEDIR@"
+ #define LLVM_INSTALL_PACKAGE_DIR "@LLVM_INSTALL_PACKAGE_DIR@"
+ #define LLVM_TARGETS_BUILT "@LLVM_TARGETS_BUILT@"
+diff --git a/tools/llvm-config/llvm-config.cpp b/tools/llvm-config/llvm-config.cpp
+index 2c6c55f89d38..f6d2068a0827 100644
+--- a/tools/llvm-config/llvm-config.cpp
++++ b/tools/llvm-config/llvm-config.cpp
+@@ -369,7 +369,11 @@ int main(int argc, char **argv) {
+ sys::fs::make_absolute(ActivePrefix, Path);
+ ActiveBinDir = std::string(Path.str());
+ }
+- ActiveLibDir = ActivePrefix + "/lib" + LLVM_LIBDIR_SUFFIX;
++ {
++ SmallString<256> Path(LLVM_INSTALL_LIBDIR LLVM_LIBDIR_SUFFIX);
++ sys::fs::make_absolute(ActivePrefix, Path);
++ ActiveLibDir = std::string(Path.str());
++ }
+ {
+ SmallString<256> Path(LLVM_INSTALL_PACKAGE_DIR);
+ sys::fs::make_absolute(ActivePrefix, Path);
diff --git a/pkgs/development/compilers/llvm/16/llvm/lit-shell-script-runner-set-dyld-library-path.patch b/pkgs/development/compilers/llvm/16/llvm/lit-shell-script-runner-set-dyld-library-path.patch
new file mode 100644
index 000000000000..32f1d13a9dc2
--- /dev/null
+++ b/pkgs/development/compilers/llvm/16/llvm/lit-shell-script-runner-set-dyld-library-path.patch
@@ -0,0 +1,26 @@
+diff --git a/utils/lit/lit/TestRunner.py b/utils/lit/lit/TestRunner.py
+index 0242e0b75af3..d732011306f7 100644
+--- a/utils/lit/lit/TestRunner.py
++++ b/utils/lit/lit/TestRunner.py
+@@ -1029,6 +1029,12 @@ def executeScript(test, litConfig, tmpBase, commands, cwd):
+ f.write('@echo off\n')
+ f.write('\n@if %ERRORLEVEL% NEQ 0 EXIT\n'.join(commands))
+ else:
++ # This env var is *purged* when invoking subprocesses so we have to
++ # manually set it from within the bash script in order for the commands
++ # in run lines to see this var:
++ if "DYLD_LIBRARY_PATH" in test.config.environment:
++ f.write(f'export DYLD_LIBRARY_PATH="{test.config.environment["DYLD_LIBRARY_PATH"]}"\n')
++
+ for i, ln in enumerate(commands):
+ match = re.match(kPdbgRegex, ln)
+ if match:
+@@ -1363,7 +1369,7 @@ def applySubstitutions(script, substitutions, conditions={},
+ return processed
+
+ process = processLine if recursion_limit is None else processLineToFixedPoint
+-
++
+ return [unescapePercents(process(ln)) for ln in script]
+
+
diff --git a/pkgs/development/compilers/llvm/16/llvm/llvm-lit-cfg-add-libs-to-dylib-path.patch b/pkgs/development/compilers/llvm/16/llvm/llvm-lit-cfg-add-libs-to-dylib-path.patch
new file mode 100644
index 000000000000..d824516c0a16
--- /dev/null
+++ b/pkgs/development/compilers/llvm/16/llvm/llvm-lit-cfg-add-libs-to-dylib-path.patch
@@ -0,0 +1,79 @@
+diff --git a/test/Unit/lit.cfg.py b/test/Unit/lit.cfg.py
+index 81e8dc04acea..479ff95681e2 100644
+--- a/test/Unit/lit.cfg.py
++++ b/test/Unit/lit.cfg.py
+@@ -3,6 +3,7 @@
+ # Configuration file for the 'lit' test runner.
+
+ import os
++import platform
+ import subprocess
+
+ import lit.formats
+@@ -55,3 +56,26 @@ if sys.platform in ['win32', 'cygwin'] and os.path.isdir(config.shlibdir):
+ # Win32 may use %SYSTEMDRIVE% during file system shell operations, so propogate.
+ if sys.platform == 'win32' and 'SYSTEMDRIVE' in os.environ:
+ config.environment['SYSTEMDRIVE'] = os.environ['SYSTEMDRIVE']
++
++# Add the LLVM dynamic libs to the platform-specific loader search path env var:
++#
++# TODO: this is copied from `clang`'s `lit.cfg.py`; should unify..
++def find_shlibpath_var():
++ if platform.system() in ['Linux', 'FreeBSD', 'NetBSD', 'OpenBSD', 'SunOS']:
++ yield 'LD_LIBRARY_PATH'
++ elif platform.system() == 'Darwin':
++ yield 'DYLD_LIBRARY_PATH'
++ elif platform.system() == 'Windows':
++ yield 'PATH'
++ elif platform.system() == 'AIX':
++ yield 'LIBPATH'
++
++for shlibpath_var in find_shlibpath_var():
++ shlibpath = os.path.pathsep.join(
++ (config.shlibdir,
++ config.environment.get(shlibpath_var, '')))
++ config.environment[shlibpath_var] = shlibpath
++ break
++else:
++ lit_config.warning("unable to inject shared library path on '{}'"
++ .format(platform.system()))
+diff --git a/test/lit.cfg.py b/test/lit.cfg.py
+index 75a38b4c5dad..856fc75c9d74 100644
+--- a/test/lit.cfg.py
++++ b/test/lit.cfg.py
+@@ -42,6 +42,26 @@ llvm_config.with_environment('PATH', config.llvm_tools_dir, append_path=True)
+ llvm_config.with_system_environment(
+ ['HOME', 'INCLUDE', 'LIB', 'TMP', 'TEMP'])
+
++# Add the LLVM dynamic libs to the platform-specific loader search path env var:
++#
++# TODO: this is copied from `clang`'s `lit.cfg.py`; should unify..
++def find_shlibpath_var():
++ if platform.system() in ['Linux', 'FreeBSD', 'NetBSD', 'OpenBSD', 'SunOS']:
++ yield 'LD_LIBRARY_PATH'
++ elif platform.system() == 'Darwin':
++ yield 'DYLD_LIBRARY_PATH'
++ elif platform.system() == 'Windows':
++ yield 'PATH'
++ elif platform.system() == 'AIX':
++ yield 'LIBPATH'
++
++for shlibpath_var in find_shlibpath_var():
++ shlibpath = config.llvm_shlib_dir
++ llvm_config.with_environment(shlibpath_var, shlibpath, append_path = True)
++ break
++else:
++ lit_config.warning("unable to inject shared library path on '{}'"
++ .format(platform.system()))
+
+ # Set up OCAMLPATH to include newly built OCaml libraries.
+ top_ocaml_lib = os.path.join(config.llvm_lib_dir, 'ocaml')
+@@ -318,7 +338,7 @@ def have_cxx_shared_library():
+
+ try:
+ readobj_cmd = subprocess.Popen(
+- [readobj_exe, '--needed-libs', readobj_exe], stdout=subprocess.PIPE)
++ [readobj_exe, '--needed-libs', readobj_exe], stdout=subprocess.PIPE, env=config.environment)
+ except OSError:
+ print('could not exec llvm-readobj')
+ return False
diff --git a/pkgs/development/compilers/llvm/16/llvm/polly-lit-cfg-add-libs-to-dylib-path.patch b/pkgs/development/compilers/llvm/16/llvm/polly-lit-cfg-add-libs-to-dylib-path.patch
new file mode 100644
index 000000000000..1354ad267314
--- /dev/null
+++ b/pkgs/development/compilers/llvm/16/llvm/polly-lit-cfg-add-libs-to-dylib-path.patch
@@ -0,0 +1,24 @@
+diff --git a/tools/polly/test/lit.cfg b/tools/polly/test/lit.cfg
+index 41e3a589c61e..09f3b17498b0 100644
+--- a/tools/polly/test/lit.cfg
++++ b/tools/polly/test/lit.cfg
+@@ -36,9 +36,17 @@ base_paths = [config.llvm_tools_dir, config.environment['PATH']]
+ path = os.path.pathsep.join(base_paths + config.extra_paths)
+ config.environment['PATH'] = path
+
++# (Copied from polly/test/Unit/lit.cfg)
++if platform.system() == 'Darwin':
++ shlibpath_var = 'DYLD_LIBRARY_PATH'
++elif platform.system() == 'Windows':
++ shlibpath_var = 'PATH'
++else:
++ shlibpath_var = 'LD_LIBRARY_PATH'
++
+ path = os.path.pathsep.join((config.llvm_libs_dir,
+- config.environment.get('LD_LIBRARY_PATH','')))
+-config.environment['LD_LIBRARY_PATH'] = path
++ config.environment.get(shlibpath_var,'')))
++config.environment[shlibpath_var] = path
+
+ llvm_config.use_default_substitutions()
+
diff --git a/pkgs/development/compilers/llvm/16/openmp/default.nix b/pkgs/development/compilers/llvm/16/openmp/default.nix
new file mode 100644
index 000000000000..d51335436ad2
--- /dev/null
+++ b/pkgs/development/compilers/llvm/16/openmp/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, stdenv
+, llvm_meta
+, monorepoSrc
+, runCommand
+, cmake
+, ninja
+, llvm
+, targetLlvm
+, lit
+, clang-unwrapped
+, perl
+, pkg-config
+, xcbuild
+, version
+}:
+
+stdenv.mkDerivation rec {
+ pname = "openmp";
+ inherit version;
+
+ src = runCommand "${pname}-src-${version}" {} ''
+ mkdir -p "$out"
+ cp -r ${monorepoSrc}/cmake "$out"
+ cp -r ${monorepoSrc}/${pname} "$out"
+ '';
+
+ sourceRoot = "${src.name}/${pname}";
+
+ patches = [
+ ./fix-find-tool.patch
+ ./gnu-install-dirs.patch
+ ./run-lit-directly.patch
+ ];
+
+ outputs = [ "out" "dev" ];
+
+ nativeBuildInputs = [ cmake ninja perl pkg-config lit ];
+ buildInputs = [
+ (if stdenv.buildPlatform == stdenv.hostPlatform then llvm else targetLlvm)
+ ];
+
+ nativeCheckInputs = lib.optional stdenv.hostPlatform.isDarwin xcbuild.xcrun;
+
+ # Unsup:Pass:XFail:Fail
+ # 26:267:16:8
+ doCheck = false;
+ checkTarget = "check-openmp";
+
+ preCheck = ''
+ patchShebangs ../tools/archer/tests/deflake.bash
+ '';
+
+ cmakeFlags = [
+ "-DCLANG_TOOL=${clang-unwrapped}/bin/clang"
+ "-DOPT_TOOL=${llvm}/bin/opt"
+ "-DLINK_TOOL=${llvm}/bin/llvm-link"
+ ];
+
+ meta = llvm_meta // {
+ homepage = "https://openmp.llvm.org/";
+ description = "Support for the OpenMP language";
+ longDescription = ''
+ The OpenMP subproject of LLVM contains the components required to build an
+ executable OpenMP program that are outside the compiler itself.
+ Contains the code for the runtime library against which code compiled by
+ "clang -fopenmp" must be linked before it can run and the library that
+ supports offload to target devices.
+ '';
+ # "All of the code is dual licensed under the MIT license and the UIUC
+ # License (a BSD-like license)":
+ license = with lib.licenses; [ mit ncsa ];
+ };
+}
diff --git a/pkgs/development/compilers/llvm/16/openmp/fix-find-tool.patch b/pkgs/development/compilers/llvm/16/openmp/fix-find-tool.patch
new file mode 100644
index 000000000000..103b054ed176
--- /dev/null
+++ b/pkgs/development/compilers/llvm/16/openmp/fix-find-tool.patch
@@ -0,0 +1,18 @@
+diff --git a/libomptarget/DeviceRTL/CMakeLists.txt b/libomptarget/DeviceRTL/CMakeLists.txt
+index ce66214822a2..6ab7b33c95da 100644
+--- a/libomptarget/DeviceRTL/CMakeLists.txt
++++ b/libomptarget/DeviceRTL/CMakeLists.txt
+@@ -27,10 +27,10 @@ endif()
+ if (LLVM_DIR)
+ # Builds that use pre-installed LLVM have LLVM_DIR set.
+ # A standalone or LLVM_ENABLE_RUNTIMES=openmp build takes this route
+- find_program(CLANG_TOOL clang PATHS ${LLVM_TOOLS_BINARY_DIR} NO_DEFAULT_PATH)
++ find_program(CLANG_TOOL clang PATHS ${LLVM_TOOLS_BINARY_DIR})
+ find_program(LINK_TOOL llvm-link PATHS ${LLVM_TOOLS_BINARY_DIR}
+- NO_DEFAULT_PATH)
+- find_program(OPT_TOOL opt PATHS ${LLVM_TOOLS_BINARY_DIR} NO_DEFAULT_PATH)
++ )
++ find_program(OPT_TOOL opt PATHS ${LLVM_TOOLS_BINARY_DIR})
+ if ((NOT CLANG_TOOL) OR (NOT LINK_TOOL) OR (NOT OPT_TOOL))
+ libomptarget_say("Not building DeviceRTL. Missing clang: ${CLANG_TOOL}, llvm-link: ${LINK_TOOL} or opt: ${OPT_TOOL}")
+ return()
diff --git a/pkgs/development/compilers/llvm/16/openmp/gnu-install-dirs.patch b/pkgs/development/compilers/llvm/16/openmp/gnu-install-dirs.patch
new file mode 100644
index 000000000000..77a93208832a
--- /dev/null
+++ b/pkgs/development/compilers/llvm/16/openmp/gnu-install-dirs.patch
@@ -0,0 +1,22 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index b6ddbe90516d..311ab1d50e7f 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -29,7 +29,7 @@ if (OPENMP_STANDALONE_BUILD)
+ set(OPENMP_LIBDIR_SUFFIX "" CACHE STRING
+ "Suffix of lib installation directory, e.g. 64 => lib64")
+ # Do not use OPENMP_LIBDIR_SUFFIX directly, use OPENMP_INSTALL_LIBDIR.
+- set(OPENMP_INSTALL_LIBDIR "lib${OPENMP_LIBDIR_SUFFIX}")
++ set(OPENMP_INSTALL_LIBDIR "${CMAKE_INSTALL_LIBDIR}${OPENMP_LIBDIR_SUFFIX}")
+
+ # Group test settings.
+ set(OPENMP_TEST_C_COMPILER ${CMAKE_C_COMPILER} CACHE STRING
+@@ -40,7 +40,7 @@ if (OPENMP_STANDALONE_BUILD)
+ else()
+ set(OPENMP_ENABLE_WERROR ${LLVM_ENABLE_WERROR})
+ # If building in tree, we honor the same install suffix LLVM uses.
+- set(OPENMP_INSTALL_LIBDIR "lib${LLVM_LIBDIR_SUFFIX}")
++ set(OPENMP_INSTALL_LIBDIR "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}")
+
+ if (NOT MSVC)
+ set(OPENMP_TEST_C_COMPILER ${LLVM_RUNTIME_OUTPUT_INTDIR}/clang)
diff --git a/pkgs/development/compilers/llvm/16/openmp/run-lit-directly.patch b/pkgs/development/compilers/llvm/16/openmp/run-lit-directly.patch
new file mode 100644
index 000000000000..1e952fdc36a8
--- /dev/null
+++ b/pkgs/development/compilers/llvm/16/openmp/run-lit-directly.patch
@@ -0,0 +1,12 @@
+diff --git a/cmake/OpenMPTesting.cmake b/cmake/OpenMPTesting.cmake
+--- a/cmake/OpenMPTesting.cmake
++++ b/cmake/OpenMPTesting.cmake
+@@ -185,7 +185,7 @@ function(add_openmp_testsuite target comment)
+ if (${OPENMP_STANDALONE_BUILD})
+ set(LIT_ARGS ${OPENMP_LIT_ARGS} ${ARG_ARGS})
+ add_custom_target(${target}
+- COMMAND ${PYTHON_EXECUTABLE} ${OPENMP_LLVM_LIT_EXECUTABLE} ${LIT_ARGS} ${ARG_UNPARSED_ARGUMENTS}
++ COMMAND ${OPENMP_LLVM_LIT_EXECUTABLE} ${LIT_ARGS} ${ARG_UNPARSED_ARGUMENTS}
+ COMMENT ${comment}
+ DEPENDS ${ARG_DEPENDS}
+ USES_TERMINAL
diff --git a/pkgs/development/compilers/p4c/bmv2.nix b/pkgs/development/compilers/p4c/bmv2.nix
new file mode 100644
index 000000000000..5e78eff9dbce
--- /dev/null
+++ b/pkgs/development/compilers/p4c/bmv2.nix
@@ -0,0 +1,56 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, cmake
+, gmp
+, libpcap
+, boost
+, libevent
+, libtool
+, flex
+, bison
+, openssl
+, thrift
+, nanomsg
+, autoreconfHook
+}:
+
+stdenv.mkDerivation rec {
+ pname = "p4-bmv2";
+ version = "1.15.0";
+
+ src = fetchFromGitHub {
+ owner = "p4lang";
+ repo = "behavioral-model";
+ rev = version;
+ sha256 = "sha256-XXOqRYMQjbfyDJWRg1fKf+Q7n7S8OZX2m/JpuwBi+LI=";
+ };
+
+ buildInputs = [
+ bison
+ flex
+ ];
+
+ installFlags = [
+ "DESTDIR=."
+ ];
+
+ nativeBuildInputs = [
+ autoreconfHook
+
+ boost
+ gmp
+ libpcap
+ libevent
+ thrift
+ nanomsg
+ ];
+
+ meta = with lib; {
+ homepage = "https://github.com/p4lang/behavioral-model";
+ description = "Reference P4 software switch (behavioral model version 2)";
+ platforms = platforms.linux;
+ maintainers = with maintainers; [ raitobezarius ];
+ license = licenses.asl20;
+ };
+}
diff --git a/pkgs/development/compilers/p4c/test.nix b/pkgs/development/compilers/p4c/test.nix
new file mode 100644
index 000000000000..5fba72288e16
--- /dev/null
+++ b/pkgs/development/compilers/p4c/test.nix
@@ -0,0 +1,2 @@
+{ pkgs ? import <nixpkgs> {} }:
+pkgs.callPackage ./bmv2.nix { }
diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix
index 12382fb2162c..c850b2208b00 100644
--- a/pkgs/top-level/all-packages.nix
+++ b/pkgs/top-level/all-packages.nix
@@ -15464,6 +15464,13 @@ with pkgs;
targetLlvm = targetPackages.llvmPackages_15.llvm or llvmPackages_15.llvm;
}));
+ llvmPackages_16 = recurseIntoAttrs (callPackage ../development/compilers/llvm/16 ({
+ inherit (stdenvAdapters) overrideCC;
+ buildLlvmTools = buildPackages.llvmPackages_16.tools;
+ targetLlvmLibraries = targetPackages.llvmPackages_16.libraries or llvmPackages_16.libraries;
+ targetLlvm = targetPackages.llvmPackages_16.llvm or llvmPackages_16.llvm;
+ }));
+
llvmPackages_latest = llvmPackages_14;
llvmPackages_rocm = recurseIntoAttrs (callPackage ../development/compilers/llvm/rocm { });