Re: How to build compatible packages that use Eigen?
- To: Anton Gladky <gladk@debian.org>
- Cc: debian-science@lists.debian.org
- Subject: Re: How to build compatible packages that use Eigen?
- From: Dima Kogan <dkogan@debian.org>
- Date: Tue, 06 Feb 2024 23:39:14 -0800
- Message-id: <[🔎] 87plx8bto3.fsf@secretsauce.net>
- In-reply-to: <878rbjqtux.fsf@secretsauce.net>
- References: <87zg6lp04o.fsf@secretsauce.net> <e19b75f6aaacaf8ee3c0b5a5e3dc5748f7040ab6.camel@debian.org> <87r0rwouty.fsf@secretsauce.net> <87mt02t4l1.fsf@secretsauce.net> <CALF6qJmf20hjNY50gWjFXFejEHN1jR9u9NH92YPh+bustmc+EA@mail.gmail.com> <878rbjqtux.fsf@secretsauce.net>
I hit this problem again at work yesterday, so let's fix it.
I'm attaching a patch that can be added to the quilt patch stack in our
libeigen3-dev package. This disables the conditional preprocessor logic
that selects the allocator/deallocator behavior. With this patch we
always make no assumptions about the alignment of malloc(), and we
ALWAYS use eigen's manual allocator to force alignment. This is maybe a
bit less efficient than the other path, but dynamic allocation shouldn't
be in any hot code path anyway.
We could also use aligned_alloc() or memalign() instead here, also
unconditionally. The "unconditional" is the important part: it must be
consistent with any build flags, otherwise stuff can crash.
Is this reasonable?
Thanks.
Description: https://www.mail-archive.com/debian-science@lists.debian.org/msg13666.html
This patch ensures that Eigen memory allocation/free are implemented the same
way REGARDLESS of build flags. This ensures that an application using Eigen
(possibly indirectly, through libraries) will not crash due to non-identical
build flags
Author: Dima Kogan <dkogan@debian.org>
diff --git a/Eigen/src/Core/util/Memory.h b/Eigen/src/Core/util/Memory.h
index 875318c..38d55d1 100644
--- a/Eigen/src/Core/util/Memory.h
+++ b/Eigen/src/Core/util/Memory.h
@@ -17,50 +17,13 @@
*** Platform checks for aligned malloc functions ***
*****************************************************************************/
#ifndef EIGEN_MEMORY_H
#define EIGEN_MEMORY_H
-#ifndef EIGEN_MALLOC_ALREADY_ALIGNED
-
-// Try to determine automatically if malloc is already aligned.
-
-// On 64-bit systems, glibc's malloc returns 16-byte-aligned pointers, see:
-// http://www.gnu.org/s/libc/manual/html_node/Aligned-Memory-Blocks.html
-// This is true at least since glibc 2.8.
-// This leaves the question how to detect 64-bit. According to this document,
-// http://gcc.fyxm.net/summit/2003/Porting%20to%2064%20bit.pdf
-// page 114, "[The] LP64 model [...] is used by all 64-bit UNIX ports" so it's indeed
-// quite safe, at least within the context of glibc, to equate 64-bit with LP64.
-#if defined(__GLIBC__) && ((__GLIBC__>=2 && __GLIBC_MINOR__ >= 8) || __GLIBC__>2) \
- && defined(__LP64__) && ! defined( __SANITIZE_ADDRESS__ ) && (EIGEN_DEFAULT_ALIGN_BYTES == 16)
- #define EIGEN_GLIBC_MALLOC_ALREADY_ALIGNED 1
-#else
- #define EIGEN_GLIBC_MALLOC_ALREADY_ALIGNED 0
-#endif
-
-// FreeBSD 6 seems to have 16-byte aligned malloc
-// See http://svn.freebsd.org/viewvc/base/stable/6/lib/libc/stdlib/malloc.c?view=markup
-// FreeBSD 7 seems to have 16-byte aligned malloc except on ARM and MIPS architectures
-// See http://svn.freebsd.org/viewvc/base/stable/7/lib/libc/stdlib/malloc.c?view=markup
-#if defined(__FreeBSD__) && !(EIGEN_ARCH_ARM || EIGEN_ARCH_MIPS) && (EIGEN_DEFAULT_ALIGN_BYTES == 16)
- #define EIGEN_FREEBSD_MALLOC_ALREADY_ALIGNED 1
-#else
- #define EIGEN_FREEBSD_MALLOC_ALREADY_ALIGNED 0
-#endif
-
-#if (EIGEN_OS_MAC && (EIGEN_DEFAULT_ALIGN_BYTES == 16)) \
- || (EIGEN_OS_WIN64 && (EIGEN_DEFAULT_ALIGN_BYTES == 16)) \
- || EIGEN_GLIBC_MALLOC_ALREADY_ALIGNED \
- || EIGEN_FREEBSD_MALLOC_ALREADY_ALIGNED
- #define EIGEN_MALLOC_ALREADY_ALIGNED 1
-#else
- #define EIGEN_MALLOC_ALREADY_ALIGNED 0
-#endif
-
-#endif
+#define EIGEN_MALLOC_ALREADY_ALIGNED 0
namespace Eigen {
namespace internal {
EIGEN_DEVICE_FUNC
Reply to: