diff --git a/packages/codon/0001-custom-openmp.patch b/packages/codon/0001-custom-openmp.patch new file mode 100644 index 00000000000000..054f616aa0b1de --- /dev/null +++ b/packages/codon/0001-custom-openmp.patch @@ -0,0 +1,16 @@ +--- a/cmake/deps.cmake ++++ b/cmake/deps.cmake +@@ -1,4 +1,4 @@ +-set(CPM_DOWNLOAD_VERSION 0.32.3) ++set(CPM_DOWNLOAD_VERSION 0.40.0) + set(CPM_DOWNLOAD_LOCATION "${CMAKE_BINARY_DIR}/cmake/CPM_${CPM_DOWNLOAD_VERSION}.cmake") + if(NOT (EXISTS ${CPM_DOWNLOAD_LOCATION})) + message(STATUS "Downloading CPM.cmake...") +@@ -96,6 +96,7 @@ + GITHUB_REPOSITORY "exaloop/openmp" + GIT_TAG 11daa2021c590dc74a0e734b4783570b619d88c9 + EXCLUDE_FROM_ALL YES ++ PATCHES "${CMAKE_SOURCE_DIR}/patches/openmp.diff" + OPTIONS "CMAKE_BUILD_TYPE Release" + "OPENMP_ENABLE_LIBOMPTARGET OFF" + "OPENMP_STANDALONE_BUILD ON") diff --git a/packages/codon/0002-do-not-pass-no-pie-to-c-compiler.patch b/packages/codon/0002-do-not-pass-no-pie-to-c-compiler.patch new file mode 100644 index 00000000000000..c3d96905a5da69 --- /dev/null +++ b/packages/codon/0002-do-not-pass-no-pie-to-c-compiler.patch @@ -0,0 +1,29 @@ +--- a/codon/cir/llvm/llvisitor.cpp ++++ b/codon/cir/llvm/llvisitor.cpp +@@ -563,10 +563,12 @@ + command.push_back(uflag.str()); + } + ++#ifndef __ANDROID__ + // Avoid "relocation R_X86_64_32 against `.bss' can not be used when making a PIE + // object" complaints by gcc when it is built with --enable-default-pie + if (!library) + command.push_back("-no-pie"); ++#endif + + executeCommand(command); + +--- a/codon/cir/llvm/optimize.cpp ++++ b/codon/cir/llvm/optimize.cpp +@@ -25,7 +25,11 @@ + + return std::unique_ptr(target->createTargetMachine( + triple.getTriple(), cpuStr, featuresStr, options, ++#ifndef __ANDROID__ + pic ? llvm::Reloc::Model::PIC_ : llvm::codegen::getExplicitRelocModel(), ++#else ++ llvm::Reloc::Model::PIC_, ++#endif + llvm::codegen::getExplicitCodeModel(), llvm::CodeGenOpt::Aggressive)); + } + diff --git a/packages/codon/0003-do-not-copy-libs-for-android.patch b/packages/codon/0003-do-not-copy-libs-for-android.patch new file mode 100644 index 00000000000000..e2c75b51a313f7 --- /dev/null +++ b/packages/codon/0003-do-not-copy-libs-for-android.patch @@ -0,0 +1,36 @@ +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -129,6 +129,8 @@ + add_library(libgfortran SHARED IMPORTED) + set_target_properties(libgfortran PROPERTIES IMPORTED_LOCATION ${copied_libgfortran}) + target_link_libraries(codonrt PRIVATE libgfortran) ++elseif(ANDROID) ++ # Do nothing + else() + message(FATAL_ERROR "Set 'CODON_SYSTEM_LIBRARIES' to the directory containing system libraries.") + endif() +@@ -471,13 +473,7 @@ + COMMAND + ${CMAKE_COMMAND} -E copy + "${CMAKE_BINARY_DIR}/libomp${CMAKE_SHARED_LIBRARY_SUFFIX}" +- "${CMAKE_BINARY_DIR}/lib/codon" +- COMMAND +- ${CMAKE_COMMAND} -E copy ${copied_libgfortran} "${CMAKE_BINARY_DIR}/lib/codon" +- COMMAND +- ${CMAKE_COMMAND} -E copy ${copied_libquadmath} "${CMAKE_BINARY_DIR}/lib/codon" +- COMMAND +- ${CMAKE_COMMAND} -E copy ${copied_libgcc} "${CMAKE_BINARY_DIR}/lib/codon") ++ "${CMAKE_BINARY_DIR}/lib/codon") + add_dependencies(libs codonrt codonc) + + # Codon command-line tool +@@ -520,9 +516,6 @@ + + install(TARGETS codonrt codonc codon_jupyter DESTINATION lib/codon) + install(FILES ${CMAKE_BINARY_DIR}/libomp${CMAKE_SHARED_LIBRARY_SUFFIX} DESTINATION lib/codon) +-install(FILES ${copied_libgfortran} DESTINATION lib/codon) +-install(FILES ${copied_libquadmath} DESTINATION lib/codon) +-install(FILES ${copied_libgcc} DESTINATION lib/codon) + install(TARGETS codon DESTINATION bin) + install(DIRECTORY ${CMAKE_BINARY_DIR}/include/codon DESTINATION include) + install(DIRECTORY ${CMAKE_SOURCE_DIR}/stdlib DESTINATION lib/codon) diff --git a/packages/codon/0004-openblas-disable-dynamic-arch.patch b/packages/codon/0004-openblas-disable-dynamic-arch.patch new file mode 100644 index 00000000000000..5c88784ac7c7cc --- /dev/null +++ b/packages/codon/0004-openblas-disable-dynamic-arch.patch @@ -0,0 +1,12 @@ +--- a/cmake/deps.cmake ++++ b/cmake/deps.cmake +@@ -172,7 +172,8 @@ + GITHUB_REPOSITORY "OpenMathLib/OpenBLAS" + GIT_TAG v0.3.28 + EXCLUDE_FROM_ALL YES +- OPTIONS "DYNAMIC_ARCH ON" ++ OPTIONS "C_LAPACK ON" ++ "$ENV{OPENBLAS_CROSS_TARGET}" + "BUILD_TESTING OFF" + "BUILD_BENCHMARKS OFF" + "NUM_THREADS 64" diff --git a/packages/codon/0005-hwy-use-cmp-function-rather-than-operator.patch b/packages/codon/0005-hwy-use-cmp-function-rather-than-operator.patch new file mode 100644 index 00000000000000..2c8d5f0a810b99 --- /dev/null +++ b/packages/codon/0005-hwy-use-cmp-function-rather-than-operator.patch @@ -0,0 +1,183 @@ +--- a/codon/runtime/numpy/loops.cpp ++++ b/codon/runtime/numpy/loops.cpp +@@ -10,6 +10,8 @@ + #include "hwy/contrib/math/math-inl.h" + // clang-format on + ++#pragma clang diagnostic ignored "-Wvla-cxx-extension" ++ + #include + #include + #include +@@ -20,6 +22,7 @@ + namespace HWY_NAMESPACE { + + namespace hn = hwy::HWY_NAMESPACE; ++using namespace hn; + + struct AcosFunctor { + template +@@ -38,7 +41,7 @@ + const auto nan = Set(d, std::numeric_limits::quiet_NaN()); + const auto pinf = Set(d, std::numeric_limits::infinity()); + const auto pone = Set(d, static_cast(1.0)); +- return IfThenElse(v == pinf, pinf, IfThenElse(v < pone, nan, Acosh(d, v))); ++ return IfThenElse(Eq(v, pinf), pinf, IfThenElse(Lt(v, pone), nan, Acosh(d, v))); + } + + static inline double scalar(const double x) { return acosh(x); } +@@ -78,7 +81,7 @@ + const auto npi2 = Set(d, static_cast(-3.14159265358979323846264 / 2)); + const auto pinf = Set(d, std::numeric_limits::infinity()); + const auto ninf = Set(d, -std::numeric_limits::infinity()); +- return IfThenElse(v == pinf, ppi2, IfThenElse(v == ninf, npi2, Atan(d, v))); ++ return IfThenElse(Eq(v, pinf), ppi2, IfThenElse(Eq(v, ninf), npi2, Atan(d, v))); + } + + static inline double scalar(const double x) { return atan(x); } +@@ -96,8 +99,8 @@ + const auto none = Set(d, static_cast(-1.0)); + const auto nzero = Set(d, static_cast(0.0)); + return IfThenElse( +- v == pone, pinf, +- IfThenElse(v == none, ninf, IfThenElse(Abs(v) > pone, nan, Atanh(d, v)))); ++ Eq(v, pone), pinf, ++ IfThenElse(Eq(v, none), ninf, IfThenElse(Gt(Abs(v), pone), nan, Atanh(d, v)))); + } + + static inline double scalar(const double x) { return atanh(x); } +@@ -117,8 +120,8 @@ + auto nzero = Set(di, kIsF32 ? static_cast(0x80000000L) + : static_cast(0x8000000000000000LL)); + +- auto negneg = And(BitCast(di, v1) == nzero, BitCast(di, v2) == nzero); +- auto posneg = And(BitCast(di, v1) == pzero, BitCast(di, v2) == nzero); ++ auto negneg = And(Eq(BitCast(di, v1), nzero), Eq(BitCast(di, v2), nzero)); ++ auto posneg = And(Eq(BitCast(di, v1), pzero), Eq(BitCast(di, v2), nzero)); + + const auto ppi = Set(d, static_cast(+3.14159265358979323846264)); + const auto npi = Set(d, static_cast(-3.14159265358979323846264)); +@@ -148,7 +151,7 @@ + static inline auto vector(const hn::ScalableTag d, const V &v) { + // Values outside of [-LIMIT, LIMIT] are not valid for SIMD version. + const T LIMIT = limit(); +- constexpr size_t L = hn::Lanes(d); ++ const size_t L = hn::Lanes(d); + T tmp[L]; + Store(v, d, tmp); + +@@ -185,7 +188,7 @@ + static inline auto vector(const hn::ScalableTag d, const V &v) { + const auto lim = Set(d, limit()); + const auto pinf = Set(d, std::numeric_limits::infinity()); +- return IfThenElse(IsNaN(v), v, IfThenElse(v >= lim, pinf, Exp(d, v))); ++ return IfThenElse(IsNaN(v), v, IfThenElse(Ge(v, lim), pinf, Exp(d, v))); + } + + static inline double scalar(const double x) { return exp(x); } +@@ -208,7 +211,7 @@ + static inline auto vector(const hn::ScalableTag d, const V &v) { + const auto lim = Set(d, limit()); + const auto pinf = Set(d, std::numeric_limits::infinity()); +- return IfThenElse(IsNaN(v), v, IfThenElse(v >= lim, pinf, Exp2(d, v))); ++ return IfThenElse(IsNaN(v), v, IfThenElse(Ge(v, lim), pinf, Exp2(d, v))); + } + + static inline double scalar(const double x) { return exp2(x); } +@@ -231,7 +234,7 @@ + static inline auto vector(const hn::ScalableTag d, const V &v) { + const auto lim = Set(d, limit()); + const auto pinf = Set(d, std::numeric_limits::infinity()); +- return IfThenElse(IsNaN(v), v, IfThenElse(v >= lim, pinf, Expm1(d, v))); ++ return IfThenElse(IsNaN(v), v, IfThenElse(Ge(v, lim), pinf, Expm1(d, v))); + } + + static inline double scalar(const double x) { return expm1(x); } +@@ -247,9 +250,9 @@ + const auto ninf = Set(d, -std::numeric_limits::infinity()); + const auto zero = Set(d, static_cast(0.0)); + return IfThenElse( +- v == zero, ninf, +- IfThenElse(v < zero, nan, +- IfThenElse(v == pinf, pinf, IfThenElse(IsNaN(v), v, Log(d, v))))); ++ Eq(v, zero), ninf, ++ IfThenElse(Lt(v, zero), nan, ++ IfThenElse(Eq(v, pinf), pinf, IfThenElse(IsNaN(v), v, Log(d, v))))); + } + + static inline double scalar(const double x) { return log(x); } +@@ -265,9 +268,9 @@ + const auto ninf = Set(d, -std::numeric_limits::infinity()); + const auto zero = Set(d, static_cast(0.0)); + return IfThenElse( +- v == zero, ninf, +- IfThenElse(v < zero, nan, +- IfThenElse(v == pinf, pinf, IfThenElse(IsNaN(v), v, Log10(d, v))))); ++ Eq(v, zero), ninf, ++ IfThenElse(Lt(v, zero), nan, ++ IfThenElse(Eq(v, pinf), pinf, IfThenElse(IsNaN(v), v, Log10(d, v))))); + } + + static inline double scalar(const double x) { return log10(x); } +@@ -283,9 +286,9 @@ + const auto ninf = Set(d, -std::numeric_limits::infinity()); + const auto none = Set(d, static_cast(-1.0)); + return IfThenElse( +- v == none, ninf, +- IfThenElse(v < none, nan, +- IfThenElse(v == pinf, pinf, IfThenElse(IsNaN(v), v, Log1p(d, v))))); ++ Eq(v, none), ninf, ++ IfThenElse(Lt(v, none), nan, ++ IfThenElse(Eq(v, pinf), pinf, IfThenElse(IsNaN(v), v, Log1p(d, v))))); + } + + static inline double scalar(const double x) { return log1p(x); } +@@ -301,9 +304,9 @@ + const auto ninf = Set(d, -std::numeric_limits::infinity()); + const auto zero = Set(d, static_cast(0.0)); + return IfThenElse( +- v == zero, ninf, +- IfThenElse(v < zero, nan, +- IfThenElse(v == pinf, pinf, IfThenElse(IsNaN(v), v, Log2(d, v))))); ++ Eq(v, zero), ninf, ++ IfThenElse(Lt(v, zero), nan, ++ IfThenElse(Eq(v, pinf), pinf, IfThenElse(IsNaN(v), v, Log2(d, v))))); + } + + static inline double scalar(const double x) { return log2(x); } +@@ -326,7 +329,7 @@ + static inline auto vector(const hn::ScalableTag d, const V &v) { + // Values outside of [-LIMIT, LIMIT] are not valid for SIMD version. + const T LIMIT = limit(); +- constexpr size_t L = hn::Lanes(d); ++ const size_t L = hn::Lanes(d); + T tmp[L]; + Store(v, d, tmp); + +@@ -363,7 +366,7 @@ + static inline auto vector(const hn::ScalableTag d, const V &v) { + // Values outside of [-LIMIT, LIMIT] are not valid for SIMD version. + const T LIMIT = limit(); +- constexpr size_t L = hn::Lanes(d); ++ const size_t L = hn::Lanes(d); + T tmp[L]; + Store(v, d, tmp); + +@@ -410,7 +413,7 @@ + template + void UnaryLoop(const T *in, size_t is, T *out, size_t os, size_t n) { + const hn::ScalableTag d; +- constexpr size_t L = Lanes(d); ++ const size_t L = Lanes(d); + T tmp[L]; + size_t i; + +@@ -445,7 +448,7 @@ + void BinaryLoop(const T *in1, size_t is1, const T *in2, size_t is2, T *out, size_t os, + size_t n) { + const hn::ScalableTag d; +- constexpr size_t L = Lanes(d); ++ const size_t L = Lanes(d); + T tmp1[L]; + T tmp2[L]; + size_t i; diff --git a/packages/codon/5001-llvm-include-llvm-ADT-SmallVector.h.patch b/packages/codon/5001-llvm-include-llvm-ADT-SmallVector.h.patch new file mode 100644 index 00000000000000..2cf73899a2d8e2 --- /dev/null +++ b/packages/codon/5001-llvm-include-llvm-ADT-SmallVector.h.patch @@ -0,0 +1,13 @@ +--- a/llvm-project/llvm/include/llvm/ADT/SmallVector.h ++++ b/llvm-project/llvm/include/llvm/ADT/SmallVector.h +@@ -735,6 +735,10 @@ + return(N); + } + ++#ifdef CS ++#undef CS ++#endif ++ + iterator erase(const_iterator CS, const_iterator CE) { + // Just cast away constness because this is a non-const member function. + iterator S = const_cast(CS); diff --git a/packages/codon/5002-llvm-tools-llvm-rtdyld-llvm-rtdyld.cpp.patch b/packages/codon/5002-llvm-tools-llvm-rtdyld-llvm-rtdyld.cpp.patch new file mode 100644 index 00000000000000..b48e4d05801fd1 --- /dev/null +++ b/packages/codon/5002-llvm-tools-llvm-rtdyld-llvm-rtdyld.cpp.patch @@ -0,0 +1,29 @@ +--- a/llvm-project/llvm/tools/llvm-rtdyld/llvm-rtdyld.cpp ++++ b/llvm-project/llvm/tools/llvm-rtdyld/llvm-rtdyld.cpp +@@ -286,7 +286,7 @@ + uintptr_t SlabSize = 0; + uintptr_t CurrentSlabOffset = 0; + SectionIDMap *SecIDMap = nullptr; +-#if defined(__x86_64__) && defined(__ELF__) && defined(__linux__) ++#if defined(__x86_64__) && defined(__ELF__) && defined(__linux__) && !defined(__ANDROID__) + unsigned UsedTLSStorage = 0; + #endif + }; +@@ -350,7 +350,7 @@ + + // In case the execution needs TLS storage, we define a very small TLS memory + // area here that will be used in allocateTLSSection(). +-#if defined(__x86_64__) && defined(__ELF__) && defined(__linux__) ++#if defined(__x86_64__) && defined(__ELF__) && defined(__linux__) && !defined(__ANDROID__) + extern "C" { + alignas(16) __attribute__((visibility("hidden"), tls_model("initial-exec"), + used)) thread_local char LLVMRTDyldTLSSpace[16]; +@@ -361,7 +361,7 @@ + TrivialMemoryManager::allocateTLSSection(uintptr_t Size, unsigned Alignment, + unsigned SectionID, + StringRef SectionName) { +-#if defined(__x86_64__) && defined(__ELF__) && defined(__linux__) ++#if defined(__x86_64__) && defined(__ELF__) && defined(__linux__) && !defined(__ANDROID__) + if (Size + UsedTLSStorage > sizeof(LLVMRTDyldTLSSpace)) { + return {}; + } diff --git a/packages/codon/5003-llvm-openmp.patch b/packages/codon/5003-llvm-openmp.patch new file mode 100644 index 00000000000000..a4e2318ed82b8e --- /dev/null +++ b/packages/codon/5003-llvm-openmp.patch @@ -0,0 +1,136 @@ +diff -uNr a/llvm-project/openmp/runtime/cmake/config-ix.cmake b/llvm-project/openmp/runtime/cmake/config-ix.cmake +--- a/llvm-project/openmp/runtime/cmake/config-ix.cmake ++++ b/llvm-project/openmp/runtime/cmake/config-ix.cmake +@@ -60,7 +60,6 @@ + check_cxx_compiler_flag(-msse2 LIBOMP_HAVE_MSSE2_FLAG) + check_cxx_compiler_flag(-ftls-model=initial-exec LIBOMP_HAVE_FTLS_MODEL_FLAG) + libomp_check_architecture_flag(-mmic LIBOMP_HAVE_MMIC_FLAG) +-libomp_check_architecture_flag(-m32 LIBOMP_HAVE_M32_FLAG) + if(WIN32) + if(MSVC) + # Check Windows MSVC style flags. +diff -uNr a/llvm-project/openmp/runtime/src/CMakeLists.txt b/llvm-project/openmp/runtime/src/CMakeLists.txt +--- a/llvm-project/openmp/runtime/src/CMakeLists.txt ++++ b/llvm-project/openmp/runtime/src/CMakeLists.txt +@@ -49,6 +49,9 @@ + if(${LIBOMP_USE_HWLOC}) + include_directories(${LIBOMP_HWLOC_INSTALL_DIR}/include) + endif() ++ ++include_directories(${LIBOMP_SRC_DIR}/android) ++ + + # Getting correct source files to build library + set(LIBOMP_CXXFILES) +@@ -92,6 +95,9 @@ + libomp_append(LIBOMP_CXXFILES kmp_gsupport.cpp) + libomp_append(LIBOMP_ASMFILES z_Linux_asm.S) # Unix assembly file + endif() ++ ++ libomp_append(LIBOMP_CXXFILES android/nltypes_stubs.cpp) ++ + libomp_append(LIBOMP_CXXFILES thirdparty/ittnotify/ittnotify_static.cpp LIBOMP_USE_ITT_NOTIFY) + libomp_append(LIBOMP_CXXFILES kmp_debugger.cpp LIBOMP_USE_DEBUGGER) + libomp_append(LIBOMP_CXXFILES kmp_stats.cpp LIBOMP_STATS) +diff -uNr a/llvm-project/openmp/runtime/src/android/nl_types.h b/llvm-project/openmp/runtime/src/android/nl_types.h +--- a/llvm-project/openmp/runtime/src/android/nl_types.h ++++ b/llvm-project/openmp/runtime/src/android/nl_types.h +@@ -0,0 +1,45 @@ ++/* ++ * Copyright (C) 2013 The Android Open Source Project ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * * Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * * Redistributions in binary form must reproduce the above copyright ++ * notice, this list of conditions and the following disclaimer in ++ * the documentation and/or other materials provided with the ++ * distribution. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ++ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ++ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, ++ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, ++ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS ++ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED ++ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, ++ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT ++ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ++ * SUCH DAMAGE. ++ */ ++#ifndef ANDROID_NLTYPES_H ++#define ANDROID_NLTYPES_H ++ ++#include_next ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++nl_catd catopen(const char*, int); ++char* catgets(nl_catd, int, int, const char*); ++int catclose(nl_catd); ++ ++#ifdef __cplusplus ++} // extern "C" ++#endif ++ ++#endif /* ANDROID_NLTYPES_H */ +diff -uNr a/llvm-project/openmp/runtime/src/android/nltypes_stubs.cpp b/llvm-project/openmp/runtime/src/android/nltypes_stubs.cpp +--- a/llvm-project/openmp/runtime/src/android/nltypes_stubs.cpp ++++ b/llvm-project/openmp/runtime/src/android/nltypes_stubs.cpp +@@ -0,0 +1,48 @@ ++/* ++ * Copyright (C) 2016 The Android Open Source Project ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * * Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * * Redistributions in binary form must reproduce the above copyright ++ * notice, this list of conditions and the following disclaimer in ++ * the documentation and/or other materials provided with the ++ * distribution. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ++ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ++ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, ++ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, ++ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS ++ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED ++ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, ++ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT ++ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ++ * SUCH DAMAGE. ++ */ ++ ++#include ++ ++#include ++ ++ ++nl_catd catopen(const char*, int) { ++ return reinterpret_cast(-1); ++} ++ ++ ++char* catgets(nl_catd, int, int, const char* message) { ++ return const_cast(message); ++} ++ ++ ++int catclose(nl_catd) { ++ // Since we didn't hand out a valid nl_catd, you can't be returning one to us. ++ errno = EBADF; ++ return -1; ++} + diff --git a/packages/codon/build.sh b/packages/codon/build.sh new file mode 100644 index 00000000000000..50472a85973fec --- /dev/null +++ b/packages/codon/build.sh @@ -0,0 +1,175 @@ +TERMUX_PKG_HOMEPAGE=https://github.com/exaloop/codon +TERMUX_PKG_DESCRIPTION="A high-performance, zero-overhead, extensible Python compiler using LLVM" +TERMUX_PKG_LICENSE="Apache-2.0" +TERMUX_PKG_LICENSE_FILE="LICENSE" +TERMUX_PKG_MAINTAINER="@termux" +_LLVM_COMMIT=c5a1d86495d28ab045258f120a8e2c9f3ef67a3b +TERMUX_PKG_VERSION=0.18.0 +TERMUX_PKG_SRCURL=(https://github.com/exaloop/codon/archive/refs/tags/v$TERMUX_PKG_VERSION.tar.gz + https://github.com/exaloop/codon/releases/download/v$TERMUX_PKG_VERSION/codon-linux-x86_64.tar.gz + https://github.com/exaloop/llvm-project/archive/${_LLVM_COMMIT}.zip) +TERMUX_PKG_SHA256=(98f676b8de9dd98a5666555265d6f344b68503628e4c07f296937b01d4c81835 + 6d65e8395f715adb9b3d528ab868cd0b0b823fff2f3bcf2b07b8b62629ccd224 + db37e218bb62b261f9debb4bb526a4abb37af8ac9a7973099c6d9a99a3e424c6) +TERMUX_PKG_DEPENDS="libc++, libxml2, zlib, zstd" +TERMUX_PKG_NO_STATICSPLIT=true +TERMUX_PKG_HOSTBUILD=true +TERMUX_PKG_AUTO_UPDATE=true +TERMUX_PKG_UPDATE_TAG_TYPE="latest-release-tag" +TERMUX_PKG_ON_DEVICE_BUILD_NOT_SUPPORTED=true + +# Args for the bundled LLVM +TERMUX_PKG_EXTRA_CONFIGURE_ARGS=" +-DANDROID_PLATFORM_LEVEL=$TERMUX_PKG_API_LEVEL +-DPYTHON_EXECUTABLE=$(command -v python3) +-DLLVM_ENABLE_PIC=ON +-DLLVM_ENABLE_LIBEDIT=OFF +-DDEFAULT_SYSROOT=$(dirname $TERMUX_PREFIX) +-DLLVM_LINK_LLVM_DYLIB=on +-DLLVM_NATIVE_TOOL_DIR=$TERMUX_PKG_HOSTBUILD_DIR/llvm-build/bin +-DCROSS_TOOLCHAIN_FLAGS_LLVM_NATIVE=-DLLVM_NATIVE_TOOL_DIR=$TERMUX_PKG_HOSTBUILD_DIR/llvm-build/bin +-DLIBOMP_ENABLE_SHARED=FALSE +-DLLVM_ENABLE_SPHINX=ON +-DSPHINX_OUTPUT_MAN=ON +-DSPHINX_WARNINGS_AS_ERRORS=OFF +-DPERL_EXECUTABLE=$(command -v perl) +-DLLVM_TARGETS_TO_BUILD=all +-DLLVM_INSTALL_UTILS=OFF +-DLLVM_INCLUDE_TESTS=OFF +-DLLVM_ENABLE_FFI=ON +-DLLVM_ENABLE_RTTI=ON +-DLLVM_ENABLE_ZLIB=OFF +-DLLVM_ENABLE_TERMINFO=OFF +" +TERMUX_PKG_FORCE_CMAKE=true + +# codon ships its own libomp.so +TERMUX_PKG_NO_OPENMP_CHECK=true + +# On ARM and i686, codon crashes: +# JIT session error: Unsupported target machine architecture in ELF object codon-jitted-objectbuffer +# Failure value returned from cantFail wrapped call +TERMUX_PKG_BLACKLISTED_ARCHES="arm, i686" + +termux_step_post_get_source() { + # Check llvm commit + local _llvm_commit="$(strings codon-deploy/bin/codon | grep 'llvm-project' | cut -d' ' -f5 | cut -d')' -f1)" + if [ "$_LLVM_COMMIT" != "$_llvm_commit" ]; then + termux_error_exit "LLVM commit mismatch: current $_LLVM_COMMIT, expected $_llvm_commit." + fi + mv llvm-project-"$_llvm_commit" llvm-project + + mkdir -p patches + cp -f "$TERMUX_PKG_BUILDER_DIR"/openmp.diff patches/openmp.diff +} + +termux_step_host_build() { + termux_setup_cmake + termux_setup_ninja + + # Compile llvm host tools + mkdir -p llvm-build + cd llvm-build + cmake -G Ninja "-DCMAKE_BUILD_TYPE=Release" \ + "$TERMUX_PKG_SRCDIR"/llvm-project/llvm + ninja -j $TERMUX_PKG_MAKE_PROCESSES llvm-tblgen llvm-min-tblgen + cd - + + # Compile peg2cpp + mkdir -p peg2cpp-build + cd peg2cpp-build + cp -f "$TERMUX_PKG_SRCDIR"/codon/util/peg2cpp.cpp ./peg2cpp.cpp + cp -f "$TERMUX_PKG_BUILDER_DIR"/host-peg2cpp-CMakeLists.txt ./CMakeLists.txt + cmake -G Ninja . + ninja -j $TERMUX_PKG_MAKE_PROCESSES peg2cpp +} + +__codon_build_llvm() { + export _CODON_LLVM_INSTALL_DIR="$TERMUX_PKG_BUILDDIR"/llvm-install + if [ -f "$_CODON_LLVM_INSTALL_DIR"/.codon-llvm-built ]; then + return + fi + + termux_setup_cmake + termux_setup_ninja + + # Add unknown vendor, otherwise it screws with the default LLVM triple + # detection. + export LLVM_DEFAULT_TARGET_TRIPLE=${CCTERMUX_HOST_PLATFORM/-/-unknown-} + export LLVM_TARGET_ARCH + if [ $TERMUX_ARCH = "arm" ]; then + LLVM_TARGET_ARCH=ARM + elif [ $TERMUX_ARCH = "aarch64" ]; then + LLVM_TARGET_ARCH=AArch64 + elif [ $TERMUX_ARCH = "i686" ] || [ $TERMUX_ARCH = "x86_64" ]; then + LLVM_TARGET_ARCH=X86 + else + termux_error_exit "Invalid arch: $TERMUX_ARCH" + fi + TERMUX_PKG_EXTRA_CONFIGURE_ARGS+=" -DLLVM_TARGET_ARCH=$LLVM_TARGET_ARCH" + TERMUX_PKG_EXTRA_CONFIGURE_ARGS+=" -DLLVM_HOST_TRIPLE=$LLVM_DEFAULT_TARGET_TRIPLE" + TERMUX_PKG_EXTRA_CONFIGURE_ARGS+=" -DCMAKE_INSTALL_PREFIX=$_CODON_LLVM_INSTALL_DIR" + + # Backup dirs + local __old_srcdir="$TERMUX_PKG_SRCDIR" + local __old_builddir="$TERMUX_PKG_BUILDDIR" + TERMUX_PKG_SRCDIR="$TERMUX_PKG_SRCDIR"/llvm-project/llvm + TERMUX_PKG_BUILDDIR="$TERMUX_PKG_BUILDDIR"/llvm-build + + # Configure + mkdir -p "$TERMUX_PKG_BUILDDIR" + cd "$TERMUX_PKG_BUILDDIR" + termux_step_configure_cmake + + # Cross-compile & install LLVM + cd "$TERMUX_PKG_BUILDDIR" + ninja -j $TERMUX_PKG_MAKE_PROCESSES install + + # Recover dirs + TERMUX_PKG_SRCDIR="$__old_srcdir" + TERMUX_PKG_BUILDDIR="$__old_builddir" + + # Mark as built + mkdir -p "$_CODON_LLVM_INSTALL_DIR" + touch -f "$_CODON_LLVM_INSTALL_DIR"/.codon-llvm-built +} + +termux_step_configure() { + __codon_build_llvm + + termux_setup_cmake + termux_setup_ninja + termux_setup_flang + + export PATH="$TERMUX_PKG_HOSTBUILD_DIR/peg2cpp-build:$PATH" + local _RPATH_FLAG="-Wl,-rpath=$TERMUX_PREFIX/lib" + local _RPATH_FLAG_ADD="-Wl,-rpath='\$ORIGIN' -Wl,-rpath='\$ORIGIN/../lib/codon' -Wl,-rpath=$TERMUX_PREFIX/lib" + LDFLAGS="${LDFLAGS/$_RPATH_FLAG/$_RPATH_FLAG_ADD}" + TERMUX_PKG_EXTRA_CONFIGURE_ARGS="-DLLVM_DIR=$_CODON_LLVM_INSTALL_DIR/lib/cmake/llvm" + TERMUX_PKG_EXTRA_CONFIGURE_ARGS+=" -DCMAKE_INSTALL_PREFIX=$TERMUX_PREFIX/opt/codon" + # TERMUX_PKG_EXTRA_CONFIGURE_ARGS+=" -DCMAKE_ASM_FLAGS=--target=$CCTERMUX_HOST_PLATFORM" + + if [ "$TERMUX_ARCH" = "x86_64" ] || [ "$TERMUX_ARCH" = "i686" ]; then + export OPENBLAS_CROSS_TARGET="TARGET CORE2" + fi + + cd "$TERMUX_PKG_BUILDDIR" + termux_step_configure_cmake +} + +termux_step_post_make_install() { + # Create start script + cat << EOF > $TERMUX_PREFIX/bin/codon +#!$TERMUX_PREFIX/bin/env sh + +export PATH="$TERMUX_PREFIX/opt/codon/bin:\$PATH" +exec $TERMUX_PREFIX/opt/codon/bin/codon "\$@" + +EOF + chmod +x $TERMUX_PREFIX/bin/codon +} + +termux_step_post_massage() { + # Remove libfmt.a + rm -rf lib +} diff --git a/packages/codon/host-peg2cpp-CMakeLists.txt b/packages/codon/host-peg2cpp-CMakeLists.txt new file mode 100644 index 00000000000000..5d13873ca7c105 --- /dev/null +++ b/packages/codon/host-peg2cpp-CMakeLists.txt @@ -0,0 +1,28 @@ +cmake_minimum_required(VERSION 3.14) + +set(CPM_DOWNLOAD_VERSION 0.32.3) +set(CPM_DOWNLOAD_LOCATION "${CMAKE_BINARY_DIR}/cmake/CPM_${CPM_DOWNLOAD_VERSION}.cmake") +if(NOT (EXISTS ${CPM_DOWNLOAD_LOCATION})) + message(STATUS "Downloading CPM.cmake...") + file(DOWNLOAD https://github.com/TheLartians/CPM.cmake/releases/download/v${CPM_DOWNLOAD_VERSION}/CPM.cmake ${CPM_DOWNLOAD_LOCATION}) +endif() +include(${CPM_DOWNLOAD_LOCATION}) + +CPMAddPackage( + NAME peglib + GITHUB_REPOSITORY "exaloop/cpp-peglib" + GIT_TAG codon + OPTIONS "BUILD_TESTS OFF") + +CPMAddPackage( + NAME fmt + GITHUB_REPOSITORY "fmtlib/fmt" + GIT_TAG 9.1.0 + OPTIONS "CMAKE_POSITION_INDEPENDENT_CODE ON" + "FMT_INSTALL ON") + +find_package(Threads REQUIRED) + +add_executable(peg2cpp peg2cpp.cpp) +target_include_directories(peg2cpp PRIVATE ${peglib_SOURCE_DIR}) +target_link_libraries(peg2cpp PRIVATE Threads::Threads fmt) diff --git a/packages/codon/openmp.diff b/packages/codon/openmp.diff new file mode 100644 index 00000000000000..959776cb212f1f --- /dev/null +++ b/packages/codon/openmp.diff @@ -0,0 +1,173 @@ +From ebad2fda32132b4f0eaf9f7dea0f4dc1edd55647 Mon Sep 17 00:00:00 2001 +From: Chongyun Lee <45286352+licy183@users.noreply.github.com> +Date: Thu, 7 Sep 2023 17:52:22 +0800 +Subject: [PATCH] android: Add stubs and headers for nl_types APIs + +--- + runtime/src/CMakeLists.txt | 6 ++++ + runtime/src/android/nl_types.h | 45 +++++++++++++++++++++++++ + runtime/src/android/nltypes_stubs.cpp | 48 +++++++++++++++++++++++++++ + 3 files changed, 99 insertions(+) + create mode 100644 runtime/src/android/nl_types.h + create mode 100644 runtime/src/android/nltypes_stubs.cpp + +diff --git a/runtime/src/CMakeLists.txt b/runtime/src/CMakeLists.txt +index 60f97bd..46a920c 100644 +--- a/runtime/src/CMakeLists.txt ++++ b/runtime/src/CMakeLists.txt +@@ -49,6 +49,9 @@ include_directories( + if(${LIBOMP_USE_HWLOC}) + include_directories(${LIBOMP_HWLOC_INSTALL_DIR}/include) + endif() ++if(ANDROID) ++ include_directories(${LIBOMP_SRC_DIR}/android) ++endif() + + # Building with time profiling support requires LLVM directory includes. + if(LIBOMP_PROFILING_SUPPORT) +@@ -102,6 +105,9 @@ else() + libomp_append(LIBOMP_CXXFILES kmp_gsupport.cpp) + libomp_append(LIBOMP_ASMFILES z_Linux_asm.S) # Unix assembly file + endif() ++ if(ANDROID) ++ libomp_append(LIBOMP_CXXFILES android/nltypes_stubs.cpp) ++ endif() + libomp_append(LIBOMP_CXXFILES thirdparty/ittnotify/ittnotify_static.cpp LIBOMP_USE_ITT_NOTIFY) + libomp_append(LIBOMP_CXXFILES kmp_debugger.cpp LIBOMP_USE_DEBUGGER) + libomp_append(LIBOMP_CXXFILES kmp_stats.cpp LIBOMP_STATS) +diff --git a/runtime/src/android/nl_types.h b/runtime/src/android/nl_types.h +new file mode 100644 +index 0000000..cc27e93 +--- /dev/null ++++ b/runtime/src/android/nl_types.h +@@ -0,0 +1,45 @@ ++/* ++ * Copyright (C) 2019 The Android Open Source Project ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * * Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * * Redistributions in binary form must reproduce the above copyright ++ * notice, this list of conditions and the following disclaimer in ++ * the documentation and/or other materials provided with the ++ * distribution. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ++ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ++ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, ++ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, ++ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS ++ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED ++ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, ++ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT ++ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ++ * SUCH DAMAGE. ++ */ ++#ifndef ANDROID_NLTYPES_H ++#define ANDROID_NLTYPES_H ++ ++#include_next ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++nl_catd catopen(const char*, int); ++char* catgets(nl_catd, int, int, const char*); ++int catclose(nl_catd); ++ ++#ifdef __cplusplus ++} // extern "C" ++#endif ++ ++#endif /* ANDROID_NLTYPES_H */ +diff --git a/runtime/src/android/nltypes_stubs.cpp b/runtime/src/android/nltypes_stubs.cpp +new file mode 100644 +index 0000000..2882910 +--- /dev/null ++++ b/runtime/src/android/nltypes_stubs.cpp +@@ -0,0 +1,48 @@ ++/* ++ * Copyright (C) 2019 The Android Open Source Project ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * * Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * * Redistributions in binary form must reproduce the above copyright ++ * notice, this list of conditions and the following disclaimer in ++ * the documentation and/or other materials provided with the ++ * distribution. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ++ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ++ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, ++ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, ++ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS ++ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED ++ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, ++ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT ++ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ++ * SUCH DAMAGE. ++ */ ++ ++#include ++ ++#include ++ ++__attribute__((weak,visibility("hidden"))) ++nl_catd catopen(const char*, int) { ++ return reinterpret_cast(-1); ++} ++ ++__attribute__((weak,visibility("hidden"))) ++char* catgets(nl_catd, int, int, const char* message) { ++ return const_cast(message); ++} ++ ++__attribute__((weak,visibility("hidden"))) ++int catclose(nl_catd) { ++ // Since we didn't hand out a valid nl_catd, you can't be returning one to us. ++ errno = EBADF; ++ return -1; ++} + +From 5c3a853f5a5ebffe92f222c77f27c6512c062d8e Mon Sep 17 00:00:00 2001 +From: Jonathan Peyton +Date: Thu, 2 Feb 2023 11:18:36 -0600 +Subject: [PATCH] Fix CMake version symbol testing + +Do not check for version symbol support if the necessary linker flag is +not supported. + +Differential Revision: https://reviews.llvm.org/D143200 +--- + runtime/cmake/config-ix.cmake | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/runtime/cmake/config-ix.cmake b/runtime/cmake/config-ix.cmake +index 0fe1266..2ff211f 100644 +--- a/runtime/cmake/config-ix.cmake ++++ b/runtime/cmake/config-ix.cmake +@@ -242,7 +242,11 @@ endif() + + # Checking features + # Check if version symbol assembler directives are supported +-libomp_check_version_symbols(LIBOMP_HAVE_VERSION_SYMBOLS) ++if (LIBOMP_HAVE_VERSION_SCRIPT_FLAG) ++ libomp_check_version_symbols(LIBOMP_HAVE_VERSION_SYMBOLS) ++else() ++ set(LIBOMP_HAVE_VERSION_SYMBOLS FALSE) ++endif() + + # Check if quad precision types are available + if(CMAKE_C_COMPILER_ID STREQUAL "GNU")