From 1acfc2496eb41a841cbfd4a8154686b6221f84d1 Mon Sep 17 00:00:00 2001 From: Jeremy Drake Date: Sun, 3 Oct 2021 19:40:20 -0700 Subject: [PATCH 1/2] flang: new package split from clang flang takes too much memory to build with default jobs, so split it off into its own package, with logic to reduce parallel jobs based on memory. --- .../0001-cast-cxx11-narrowing.patch | 42 ++++++ mingw-w64-flang/0002-cmake-22162.patch | 13 ++ mingw-w64-flang/PKGBUILD | 124 ++++++++++++++++++ 3 files changed, 179 insertions(+) create mode 100644 mingw-w64-flang/0001-cast-cxx11-narrowing.patch create mode 100644 mingw-w64-flang/0002-cmake-22162.patch create mode 100644 mingw-w64-flang/PKGBUILD diff --git a/mingw-w64-flang/0001-cast-cxx11-narrowing.patch b/mingw-w64-flang/0001-cast-cxx11-narrowing.patch new file mode 100644 index 0000000000..145c5ec3b1 --- /dev/null +++ b/mingw-w64-flang/0001-cast-cxx11-narrowing.patch @@ -0,0 +1,42 @@ +--- a/runtime/misc-intrinsic.cpp 2021-10-02 17:25:54.576794400 -0700 ++++ b/runtime/misc-intrinsic.cpp 2021-10-02 17:27:11.031517900 -0700 +@@ -47,7 +47,7 @@ + "TRANSFER: could not allocate memory for result; STAT=%d", stat); + } + char *to{result.OffsetElement()}; +- std::size_t resultBytes{size * elementBytes}; ++ std::size_t resultBytes{static_cast(size * elementBytes)}; + const std::size_t sourceElementBytes{source.ElementBytes()}; + std::size_t sourceElements{source.Elements()}; + SubscriptValue sourceAt[maxRank]; +--- a/lib/Evaluate/constant.cpp 2021-10-02 17:33:29.706776300 -0700 ++++ b/lib/Evaluate/constant.cpp 2021-10-02 17:34:52.363465800 -0700 +@@ -251,7 +251,7 @@ + return count; + } else { + std::size_t copied{0}; +- std::size_t elementBytes{length_ * sizeof(decltype(values_[0]))}; ++ std::size_t elementBytes{static_cast(length_ * sizeof(decltype(values_[0])))}; + ConstantSubscripts sourceSubscripts{source.lbounds()}; + while (copied < count) { + auto *dest{&values_.at(SubscriptsToOffset(resultSubscripts) * length_)}; +--- a/runtime/transformational.cpp 2021-10-02 18:11:08.727836900 -0700 ++++ b/runtime/transformational.cpp 2021-10-02 18:11:56.743494500 -0700 +@@ -183,7 +183,7 @@ + SubscriptValue lb{sourceDim.LowerBound()}; + for (SubscriptValue j{0}; j < extent; ++j) { + SubscriptValue resultAt{1 + j}; +- SubscriptValue sourceAt{lb + (j + shift) % extent}; ++ SubscriptValue sourceAt{static_cast(lb + (j + shift) % extent)}; + if (sourceAt < 0) { + sourceAt += extent; + } +@@ -281,7 +281,7 @@ + } + SubscriptValue lb{source.GetDimension(0).LowerBound()}; + for (SubscriptValue j{1}; j <= extent; ++j) { +- SubscriptValue sourceAt{lb + j - 1 + shift}; ++ SubscriptValue sourceAt{static_cast(lb + j - 1 + shift)}; + if (sourceAt >= lb && sourceAt < lb + extent) { + CopyElement(result, &j, source, &sourceAt, terminator); + } diff --git a/mingw-w64-flang/0002-cmake-22162.patch b/mingw-w64-flang/0002-cmake-22162.patch new file mode 100644 index 0000000000..520db6f7d2 --- /dev/null +++ b/mingw-w64-flang/0002-cmake-22162.patch @@ -0,0 +1,13 @@ +--- a/CMakeLists.txt 2021-10-04 13:49:12.582319800 -0700 ++++ b/CMakeLists.txt 2021-10-04 13:54:57.833484200 -0700 +@@ -110,7 +110,9 @@ + # LLVM_INCLUDE_DIRS when merging in the monorepo (Warning from flang headers + # should not be suppressed). + include_directories(SYSTEM ${LLVM_INCLUDE_DIRS}) +- add_definitions(${LLVM_DEFINITIONS}) ++ # https://gitlab.kitware.com/cmake/cmake/-/issues/22162 ++ separate_arguments(LLVM_DEFINITIONS_LIST NATIVE_COMMAND ${LLVM_DEFINITIONS}) ++ add_definitions(${LLVM_DEFINITIONS_LIST}) + + # LLVM's cmake configuration files currently sneak in a c++11 flag. + # We look for it here and remove it from Flang's compile flags to diff --git a/mingw-w64-flang/PKGBUILD b/mingw-w64-flang/PKGBUILD new file mode 100644 index 0000000000..fc5dd919bc --- /dev/null +++ b/mingw-w64-flang/PKGBUILD @@ -0,0 +1,124 @@ +_compiler=gcc +if [[ $MINGW_PACKAGE_PREFIX == *-clang-* ]]; then + _clangprefix=1 + _compiler=clang +fi +_realname=flang +pkgbase=mingw-w64-${_realname} +pkgname=("${MINGW_PACKAGE_PREFIX}-${_realname}") +pkgver=13.0.0 +pkgrel=1 +pkgdesc="Fortran frontend for LLVM (mingw-w64)" +arch=('any') +mingw_arch=('mingw32' 'mingw64' 'ucrt64' 'clang64' 'clang32' 'clangarm64') +url="https://flang.llvm.org/" +license=("custom:Apache 2.0 with LLVM Exception") +groups=($( (( _clangprefix )) && echo "${MINGW_PACKAGE_PREFIX}-toolchain")) +depends=("${MINGW_PACKAGE_PREFIX}-clang=${pkgver}" + "${MINGW_PACKAGE_PREFIX}-llvm=${pkgver}" + "${MINGW_PACKAGE_PREFIX}-mlir=${pkgver}") +makedepends=("${MINGW_PACKAGE_PREFIX}-clang-analyzer=${pkgver}" + "${MINGW_PACKAGE_PREFIX}-clang-tools-extra=${pkgver}" + "${MINGW_PACKAGE_PREFIX}-cmake>=3.4.3" + "${MINGW_PACKAGE_PREFIX}-ninja" + "${MINGW_PACKAGE_PREFIX}-pkg-config" + "${MINGW_PACKAGE_PREFIX}-polly=${pkgver}" + "gawk" + $([[ "$_compiler" == "clang" ]] && echo \ + "${MINGW_PACKAGE_PREFIX}-compiler-rt" \ + "${MINGW_PACKAGE_PREFIX}-libc++") + $([[ "$_compiler" == "gcc" ]] && echo \ + "${MINGW_PACKAGE_PREFIX}-gcc") + ) +options=('!debug' 'strip') +source=("https://github.com/llvm/llvm-project/releases/download/llvmorg-${pkgver}/flang-${pkgver}.src.tar.xz"{,.sig} + "0001-cast-cxx11-narrowing.patch" + "0002-cmake-22162.patch") +sha256sums=('13bc580342bec32b6158c8cddeb276bd428d9fc8fd23d13179c8aa97bbba37d5' + 'SKIP' + 'f8babd240968599597cf2b906fad44b62e2d92ac7ea144530a3f9542e96e06b1' + '77fb0612217b6af7a122f586a9d0d334cd48bb201509bf72e8f8e6244616e895') +validpgpkeys=('B6C8F98282B944E3B0D5C2530FC3042E345AD05D' # Hans Wennborg, Google. + '474E22316ABF4785A88C6E8EA2C794A986419D8A') # Tom Stellard + +apply_patch_with_msg() { + for _patch in "$@" + do + msg2 "Applying ${_patch}" + patch -Nbp1 -i "${srcdir}/${_patch}" + done +} + +prepare() { + cd "${srcdir}/flang-${pkgver}.src" + + apply_patch_with_msg \ + "0001-cast-cxx11-narrowing.patch" \ + "0002-cmake-22162.patch" +} + +build() { + cd "${srcdir}" + + case "${CARCH}" in + i?86|armv7) + # lld needs all the address space it can get. + LDFLAGS+=" -Wl,--large-address-aware" + ;; + esac + + local -a extra_args + + if check_option "debug" "y"; then + extra_args+=(-DCMAKE_BUILD_TYPE=Debug) + else + extra_args+=(-DCMAKE_BUILD_TYPE=Release) + fi + + if [ "${_compiler}" == "clang" ]; then + export CC='clang' + export CXX='clang++' + extra_args+=(-DLLVM_ENABLE_LIBCXX=ON) + fi + + # try to figure out a reasonable CMAKE_BUILD_PARALLEL_LEVEL + if [ -z "${CMAKE_BUILD_PARALLEL_LEVEL+x}" ]; then + # figure about 1 job per 2GB RAM + local _jobs=$(awk '{ if ($1 == "MemTotal:") { printf "%.0f", $2/(2*1024*1024) } }' /proc/meminfo) + # EXCEPT on GHA, which is being really difficult. + if (( _jobs < 1 )) || [ -n "${GITHUB_ACTIONS+x}" ]; then + _jobs=1 + elif (( _jobs > $(nproc) + 2 )); then + _jobs=$(( $(nproc) + 2 )) + fi + export CMAKE_BUILD_PARALLEL_LEVEL=${_jobs} + fi + + [[ -d build-${MSYSTEM} ]] && rm -rf build-${MSYSTEM} + mkdir build-${MSYSTEM} && cd build-${MSYSTEM} + + MSYS2_ARG_CONV_EXCL="-DCMAKE_INSTALL_PREFIX=" \ + ${MINGW_PREFIX}/bin/cmake.exe \ + -GNinja \ + -Wno-dev \ + -DCLANG_DIR=${MINGW_PREFIX}/lib/cmake/clang \ + -DCMAKE_INSTALL_PREFIX=${MINGW_PREFIX} \ + -DCMAKE_SYSTEM_IGNORE_PATH=/usr/lib \ + -DLLVM_ENABLE_ASSERTIONS=OFF \ + -DLLVM_ENABLE_THREADS=ON \ + -DLLVM_HOST_TRIPLE="${CARCH}-w64-windows-gnu" \ + -DLLVM_LINK_LLVM_DYLIB=ON \ + "${extra_args[@]}" \ + ../flang-${pkgver}.src + + ${MINGW_PREFIX}/bin/cmake.exe --build . +} + +check() { + cd "${srcdir}"/build-${MSYSTEM} + ${MINGW_PREFIX}/bin/cmake.exe --build . -- check-flang || true +} + +package() { + DESTDIR="${pkgdir}" cmake --install "${srcdir}/build-${MSYSTEM}" +} From 3d033bf31e3cb07be31476054a4679c05285c4a8 Mon Sep 17 00:00:00 2001 From: Jeremy Drake Date: Sun, 17 Oct 2021 09:59:40 -0700 Subject: [PATCH 2/2] flang: always build with clang and link with lld. It depends on clang anyway, and 64-bit GCC is giving errors about object files being too big. Clang has a workaround for the 10M COFF string table limit, but binutils doesn't seem to be aware of it, so link with LLD. --- mingw-w64-flang/PKGBUILD | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/mingw-w64-flang/PKGBUILD b/mingw-w64-flang/PKGBUILD index fc5dd919bc..4f6f7f7836 100644 --- a/mingw-w64-flang/PKGBUILD +++ b/mingw-w64-flang/PKGBUILD @@ -1,8 +1,4 @@ -_compiler=gcc -if [[ $MINGW_PACKAGE_PREFIX == *-clang-* ]]; then - _clangprefix=1 - _compiler=clang -fi +_compiler=clang _realname=flang pkgbase=mingw-w64-${_realname} pkgname=("${MINGW_PACKAGE_PREFIX}-${_realname}") @@ -13,13 +9,13 @@ arch=('any') mingw_arch=('mingw32' 'mingw64' 'ucrt64' 'clang64' 'clang32' 'clangarm64') url="https://flang.llvm.org/" license=("custom:Apache 2.0 with LLVM Exception") -groups=($( (( _clangprefix )) && echo "${MINGW_PACKAGE_PREFIX}-toolchain")) depends=("${MINGW_PACKAGE_PREFIX}-clang=${pkgver}" "${MINGW_PACKAGE_PREFIX}-llvm=${pkgver}" "${MINGW_PACKAGE_PREFIX}-mlir=${pkgver}") makedepends=("${MINGW_PACKAGE_PREFIX}-clang-analyzer=${pkgver}" "${MINGW_PACKAGE_PREFIX}-clang-tools-extra=${pkgver}" "${MINGW_PACKAGE_PREFIX}-cmake>=3.4.3" + "${MINGW_PACKAGE_PREFIX}-lld" "${MINGW_PACKAGE_PREFIX}-ninja" "${MINGW_PACKAGE_PREFIX}-pkg-config" "${MINGW_PACKAGE_PREFIX}-polly=${pkgver}" @@ -78,7 +74,7 @@ build() { if [ "${_compiler}" == "clang" ]; then export CC='clang' export CXX='clang++' - extra_args+=(-DLLVM_ENABLE_LIBCXX=ON) + extra_args+=(-DLLVM_ENABLE_LLD=ON) fi # try to figure out a reasonable CMAKE_BUILD_PARALLEL_LEVEL