-
Notifications
You must be signed in to change notification settings - Fork 573
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* [libunwind] Add v1.8.0 * [libunwind 1.8.0] Amend patch * [libunwind 1.8.0] Set preferred GCC version to 6 * [libunwind 1.8.0] idk, how about gcc 12 * [libunwind] 1.8.0 -> 1.8.1 * [libunwind@1.8.1] Try `-fomit-frame-pointer` on Linux AArch64 Seems people building TensorFlow on Linux AArch64 hit the same inline assembly issue we're seeing here and this (plus `-flax-vector-conversion`) seems to fix it for them. This flag seems sus for libunwind but worth a try. * Thank you, Mosè Co-authored-by: Mosè Giordano <giordano@users.noreply.github.com> * [libunwind@1.8.1] rm `-fomit-frame-pointer`, prefer GCC 12 Also add line breaks for long line * [libunwind@1.8.1] Include patch for PR 748 Should hopefully fix the inline assembly issue on AArch64? * [libunwind@1.8.1] Try re-lowering the preferred GCC version 12 seems excessive; 1.7.2 uses 5, let's try that * Update L/LibUnwind/LibUnwind@1.8.1/build_tarballs.jl * Revert "Update L/LibUnwind/LibUnwind@1.8.1/build_tarballs.jl" This reverts commit c37f8f9. --------- Co-authored-by: Mosè Giordano <giordano@users.noreply.github.com> Co-authored-by: Mosè Giordano <mose@gnu.org>
- Loading branch information
1 parent
5cdb0de
commit 1517796
Showing
5 changed files
with
742 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,88 @@ | ||
using BinaryBuilder, Pkg | ||
using BinaryBuilderBase: sanitize | ||
|
||
name = "LibUnwind" | ||
version = v"1.8.1" | ||
|
||
# Collection of sources required to build libunwind | ||
sources = [ | ||
ArchiveSource("https://github.com/libunwind/libunwind/releases/download/v$(version)/libunwind-$(version).tar.gz", | ||
"ddf0e32dd5fafe5283198d37e4bf9decf7ba1770b6e7e006c33e6df79e6a6157"), | ||
DirectorySource("./bundled"), | ||
] | ||
|
||
# Bash recipe for building across all platforms | ||
script = raw""" | ||
cd $WORKSPACE/srcdir/libunwind*/ | ||
atomic_patch -p0 ${WORKSPACE}/srcdir/patches/libunwind-configure-static-lzma.patch | ||
if [[ ${target} == aarch64-linux-musl ]]; then | ||
# https://github.com/checkpoint-restore/criu/issues/934, fixed by | ||
# https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit?id=9966a05c7b80f075f2bc7e48dbb108d3f2927234 | ||
pushd /opt/aarch64-linux-musl/aarch64-linux-musl/sys-root/usr/include | ||
atomic_patch -p5 ${WORKSPACE}/srcdir/patches/linux-disentangle_sigcontext.patch | ||
popd | ||
fi | ||
# https://github.com/JuliaLang/julia/issues/51467, and | ||
# https://github.com/JuliaLang/julia/issues/51465, caused by | ||
# https://github.com/libunwind/libunwind/pull/203 | ||
atomic_patch -p1 ${WORKSPACE}/srcdir/patches/libunwind-revert_prelink_unwind.patch | ||
# https://github.com/libunwind/libunwind/pull/748 | ||
atomic_patch -p1 ${WORKSPACE}/srcdir/patches/libunwind-aarch64-inline-asm.patch | ||
if [[ ${bb_full_target} == *-sanitize+memory* ]]; then | ||
# Install msan runtime (for clang) | ||
cp -rL ${libdir}/linux/* /opt/x86_64-linux-musl/lib/clang/*/lib/linux/ | ||
fi | ||
export CFLAGS="-DPI -fPIC" | ||
./configure \ | ||
--prefix=${prefix} \ | ||
--build=${MACHTYPE} \ | ||
--host=${target} \ | ||
--libdir=${libdir} \ | ||
--enable-minidebuginfo \ | ||
--enable-zlibdebuginfo \ | ||
--disable-tests \ | ||
--disable-conservative-checks | ||
make -j${nproc} | ||
make install | ||
# Shoe-horn liblzma.a into libunwind.a | ||
mkdir -p unpacked/{liblzma,libunwind} | ||
(cd unpacked/liblzma; ar -x ${prefix}/lib/liblzma.a) | ||
(cd unpacked/libunwind; ar -x ${prefix}/lib/libunwind.a) | ||
rm -f ${prefix}/lib/libunwind.a | ||
ar -qc ${prefix}/lib/libunwind.a unpacked/**/* | ||
""" | ||
|
||
# These are the platforms we will build for by default, unless further | ||
# platforms are passed in on the command line. libunwind is only used | ||
# on Linux or FreeBSD (e.g. ELF systems) | ||
platforms = filter(p -> Sys.islinux(p) || Sys.isfreebsd(p), supported_platforms()) | ||
push!(platforms, Platform("x86_64", "linux"; sanitize="memory")) | ||
|
||
# The products that we will ensure are always built | ||
products = [ | ||
LibraryProduct("libunwind", :libunwind), | ||
] | ||
|
||
llvm_version = v"13.0.1" | ||
|
||
# Dependencies that must be installed before this package can be built | ||
dependencies = [ | ||
BuildDependency("XZ_jll"), | ||
Dependency("Zlib_jll"), | ||
BuildDependency(PackageSpec(name="LLVMCompilerRT_jll", | ||
uuid="4e17d02c-6bf5-513e-be62-445f41c75a11", | ||
version=llvm_version); | ||
platforms=filter(p -> sanitize(p) == "memory", platforms)), | ||
] | ||
|
||
# Build the tarballs. Note that libunwind started using `stdatomic.h`, which is only | ||
# available with GCC version 4.9 or later, so we need to set a higher preferred version | ||
# than the default. | ||
build_tarballs(ARGS, name, version, sources, script, platforms, products, dependencies; | ||
julia_compat="1.10", preferred_gcc_version=v"5", | ||
preferred_llvm_version=llvm_version) |
157 changes: 157 additions & 0 deletions
157
L/LibUnwind/LibUnwind@1.8.1/bundled/patches/libunwind-aarch64-inline-asm.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,157 @@ | ||
From 6ae71b3ea71bff0f38c7a6a05beda30b7dce1ef6 Mon Sep 17 00:00:00 2001 | ||
From: Stephen Webb <swebb@blackberry.com> | ||
Date: Mon, 22 Apr 2024 15:56:54 -0400 | ||
Subject: [PATCH] Rework inline aarch64 as for setcontext | ||
|
||
Modern GC and clang were barfing on the inline asm constraints for the | ||
aarch64-linux setcontext() replacement. Reformulated the asm code to | ||
reduce the required constraints. | ||
--- | ||
src/aarch64/Gos-linux.c | 115 +++++++++++++++++++++------------------- | ||
1 file changed, 61 insertions(+), 54 deletions(-) | ||
|
||
diff --git a/src/aarch64/Gos-linux.c b/src/aarch64/Gos-linux.c | ||
index 7cd8c879f..1e4949623 100644 | ||
--- a/src/aarch64/Gos-linux.c | ||
+++ b/src/aarch64/Gos-linux.c | ||
@@ -2,6 +2,7 @@ | ||
Copyright (C) 2008 CodeSourcery | ||
Copyright (C) 2011-2013 Linaro Limited | ||
Copyright (C) 2012 Tommi Rantala <tt.rantala@gmail.com> | ||
+ Copyright 2024 Stephen M. Webb <swebb@blackberry.com> | ||
|
||
This file is part of libunwind. | ||
|
||
@@ -28,6 +29,28 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ | ||
|
||
#ifndef UNW_REMOTE_ONLY | ||
|
||
+/* Magic constants generated from gen-offsets.c */ | ||
+#define SC_R0_OFF "8" | ||
+#define SC_R2_OFF "24" | ||
+#define SC_R18_OFF "152" | ||
+#define SC_R20_OFF "168" | ||
+#define SC_R22_OFF "184" | ||
+#define SC_R24_OFF "200" | ||
+#define SC_R26_OFF "216" | ||
+#define SC_R28_OFF "232" | ||
+#define SC_R30_OFF "248" | ||
+ | ||
+#define FP_R08_OFF "80" | ||
+#define FP_R09_OFF "88" | ||
+#define FP_R10_OFF "96" | ||
+#define FP_R11_OFF "104" | ||
+#define FP_R12_OFF "112" | ||
+#define FP_R13_OFF "120" | ||
+#define FP_R14_OFF "128" | ||
+#define FP_R15_OFF "136" | ||
+ | ||
+#define SC_SP_OFF "0x100" | ||
+ | ||
HIDDEN int | ||
aarch64_local_resume (unw_addr_space_t as, unw_cursor_t *cursor, void *arg) | ||
{ | ||
@@ -36,65 +59,49 @@ aarch64_local_resume (unw_addr_space_t as, unw_cursor_t *cursor, void *arg) | ||
|
||
if (c->sigcontext_format == AARCH64_SCF_NONE) | ||
{ | ||
+ | ||
+ /* | ||
+ * This is effectively the old POSIX setcontext(). | ||
+ * | ||
+ * This inline asm is broken up to use local scratch registers for the | ||
+ * uc_mcontext.regs and FPCTX base addresses because newer versions of GCC | ||
+ * and clang barf on too many constraints (gh-702) when the C array | ||
+ * elements are used directly. | ||
+ * | ||
+ * Clobbers aren't required for the inline asm because they just convince | ||
+ * the compiler to save those registers and they never get restored | ||
+ * becauise the asm ends with a plain ol' ret. | ||
+ */ | ||
+ register void* uc_mcontext __asm__ ("x5") = (void*) &uc->uc_mcontext; | ||
+ register void* fpctx __asm__ ("x4") = (void*) GET_FPCTX(uc); | ||
+ | ||
/* Since there are no signals involved here we restore EH and non scratch | ||
registers only. */ | ||
__asm__ __volatile__ ( | ||
- "ldr x0, %[x0]\n\t" | ||
- "ldr x1, %[x1]\n\t" | ||
- "ldr x2, %[x2]\n\t" | ||
- "ldr x3, %[x3]\n\t" | ||
- "ldr x19, %[x19]\n\t" | ||
- "ldr x20, %[x20]\n\t" | ||
- "ldr x21, %[x21]\n\t" | ||
- "ldr x22, %[x22]\n\t" | ||
- "ldr x23, %[x23]\n\t" | ||
- "ldr x24, %[x24]\n\t" | ||
- "ldr x25, %[x25]\n\t" | ||
- "ldr x26, %[x26]\n\t" | ||
- "ldr x27, %[x27]\n\t" | ||
- "ldr x28, %[x28]\n\t" | ||
- "ldr x29, %[x29]\n\t" | ||
- "ldr x30, %[x30]\n\t" | ||
- "ldr d8, %[d8]\n\t" | ||
- "ldr d9, %[d9]\n\t" | ||
- "ldr d10, %[d10]\n\t" | ||
- "ldr d11, %[d11]\n\t" | ||
- "ldr d12, %[d12]\n\t" | ||
- "ldr d13, %[d13]\n\t" | ||
- "ldr d14, %[d14]\n\t" | ||
- "ldr d15, %[d15]\n\t" | ||
- "ldr x5, %[sp]\n\t" | ||
+ "ldp x0, x1, [x5, " SC_R0_OFF "]\n\t" | ||
+ "ldp x2, x3, [x5, " SC_R2_OFF "]\n\t" | ||
+ "ldp x18, x19, [x5, " SC_R18_OFF "]\n\t" | ||
+ "ldp x20, x21, [x5, " SC_R20_OFF "]\n\t" | ||
+ "ldp x22, x23, [x5, " SC_R22_OFF "]\n\t" | ||
+ "ldp x24, x25, [x5, " SC_R24_OFF "]\n\t" | ||
+ "ldp x26, x27, [x5, " SC_R26_OFF "]\n\t" | ||
+ "ldp x28, x29, [x5, " SC_R28_OFF "]\n\t" | ||
+ "ldr x30, [x5, " SC_R30_OFF "]\n\t" | ||
+ "ldr d8, [x4, " FP_R08_OFF "]\n\t" | ||
+ "ldr d9, [x4, " FP_R09_OFF "]\n\t" | ||
+ "ldr d10, [x4, " FP_R10_OFF "]\n\t" | ||
+ "ldr d11, [x4, " FP_R11_OFF "]\n\t" | ||
+ "ldr d12, [x4, " FP_R12_OFF "]\n\t" | ||
+ "ldr d13, [x4, " FP_R13_OFF "]\n\t" | ||
+ "ldr d14, [x4, " FP_R14_OFF "]\n\t" | ||
+ "ldr d15, [x4, " FP_R15_OFF "]\n\t" | ||
+ "ldr x5, [x5, " SC_SP_OFF "]\n\t" | ||
"mov sp, x5\n\t" | ||
"ret\n" | ||
- : | ||
- : [x0] "m"(uc->uc_mcontext.regs[0]), | ||
- [x1] "m"(uc->uc_mcontext.regs[1]), | ||
- [x2] "m"(uc->uc_mcontext.regs[2]), | ||
- [x3] "m"(uc->uc_mcontext.regs[3]), | ||
- [x19] "m"(uc->uc_mcontext.regs[19]), | ||
- [x20] "m"(uc->uc_mcontext.regs[20]), | ||
- [x21] "m"(uc->uc_mcontext.regs[21]), | ||
- [x22] "m"(uc->uc_mcontext.regs[22]), | ||
- [x23] "m"(uc->uc_mcontext.regs[23]), | ||
- [x24] "m"(uc->uc_mcontext.regs[24]), | ||
- [x25] "m"(uc->uc_mcontext.regs[25]), | ||
- [x26] "m"(uc->uc_mcontext.regs[26]), | ||
- [x27] "m"(uc->uc_mcontext.regs[27]), | ||
- [x28] "m"(uc->uc_mcontext.regs[28]), | ||
- [x29] "m"(uc->uc_mcontext.regs[29]), /* FP */ | ||
- [x30] "m"(uc->uc_mcontext.regs[30]), /* LR */ | ||
- [d8] "m"(GET_FPCTX(uc)->vregs[8]), | ||
- [d9] "m"(GET_FPCTX(uc)->vregs[9]), | ||
- [d10] "m"(GET_FPCTX(uc)->vregs[10]), | ||
- [d11] "m"(GET_FPCTX(uc)->vregs[11]), | ||
- [d12] "m"(GET_FPCTX(uc)->vregs[12]), | ||
- [d13] "m"(GET_FPCTX(uc)->vregs[13]), | ||
- [d14] "m"(GET_FPCTX(uc)->vregs[14]), | ||
- [d15] "m"(GET_FPCTX(uc)->vregs[15]), | ||
- [sp] "m"(uc->uc_mcontext.sp) | ||
- : "x0", "x1", "x2", "x3", "x19", "x20", "x21", "x22", "x23", "x24", | ||
- "x25", "x26", "x27", "x28", "x29", "x30" | ||
- ); | ||
+ : | ||
+ : [uc_mcontext] "r"(uc_mcontext), | ||
+ [fpctx] "r"(fpctx) | ||
+ ); | ||
} | ||
else | ||
{ |
20 changes: 20 additions & 0 deletions
20
L/LibUnwind/LibUnwind@1.8.1/bundled/patches/libunwind-configure-static-lzma.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
--- configure.orig 2023-06-04 05:19:04 | ||
+++ configure 2023-06-07 08:35:11 | ||
@@ -18117,7 +18117,7 @@ | ||
$as_echo_n "(cached) " >&6 | ||
else | ||
ac_check_lib_save_LIBS=$LIBS | ||
-LIBS="-llzma $LIBS" | ||
+LIBS="-L${libdir} -l:liblzma.a $LIBS" | ||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext | ||
/* end confdefs.h. */ | ||
|
||
@@ -18148,7 +18148,7 @@ | ||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lzma_lzma_mf_is_supported" >&5 | ||
$as_echo "$ac_cv_lib_lzma_lzma_mf_is_supported" >&6; } | ||
if test "x$ac_cv_lib_lzma_lzma_mf_is_supported" = xyes; then : | ||
- LIBLZMA=-llzma | ||
+ LIBLZMA="-L${libdir} -l:liblzma.a" | ||
|
||
$as_echo "#define HAVE_LZMA 1" >>confdefs.h | ||
|
Oops, something went wrong.