NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: toolchain/56153: gdb is broken for alpha



On 2021/05/07 23:51, Christos Zoulas wrote:
Which means (in theory :-) that the malloca.c allocates with alloca(3) and frees with regular
free which gives jemalloc a heartache. The next step is to instrument them malloca.h and malloca.c
calls with printfs to see what's happening...

printf debug shows that malloca() macro is miscompiled:

external/gpl3/gdb/dist/gnulib/import/malloca.h

|   57  #if HAVE_ALLOCA
|   58  # define malloca(N) \
|   59    ((N) < 4032 - (2 * sa_alignment_max - 1)                                   \
|   60     ? (void *) (((uintptr_t) (char *) alloca ((N) + 2 * sa_alignment_max - 1) \
|   61                  + (2 * sa_alignment_max - 1))                                \
|   62                 & ~(uintptr_t)(2 * sa_alignment_max - 1))                     \
|   63     : mmalloca (N))
|   64  #else
|   65  # define malloca(N) \
|   66    mmalloca (N)
|   67  #endif

freea() determines by sa_alignment_max (= 8) bit whether the buffer is
allocated by alloca() or mmalloca(). But, both GCC 10 and 9 miscompile
malloca() macro, which results in sa_alignment_max is not masked out.

Compiling canonicalize-lgpl.c:__realpath() (only user of malloca() macro)
with -O0 works around the problem:

----
Index: external/gpl3/gdb/dist/gnulib/import/canonicalize-lgpl.c
===================================================================
RCS file: /home/netbsd/src/external/gpl3/gdb/dist/gnulib/import/canonicalize-lgpl.c,v
retrieving revision 1.1.1.1
diff -p -u -r1.1.1.1 canonicalize-lgpl.c
--- external/gpl3/gdb/dist/gnulib/import/canonicalize-lgpl.c	15 Sep 2020 01:43:50 -0000	1.1.1.1
+++ external/gpl3/gdb/dist/gnulib/import/canonicalize-lgpl.c	8 May 2021 08:07:54 -0000
@@ -114,6 +114,13 @@ alloc_failed (void)
    holds the same value as the value returned.  */
char *
+#ifdef __alpha__
+/*
+ * toolchain/56153
+ * GCC 10 and 9 miscompile malloca() macro for alpha.
+ */
+__attribute__((optimize("O0")))
+#endif
 __realpath (const char *name, char *resolved)
 {
   char *rpath, *dest, *extra_buf = NULL;
----

However, still, it is a sad surprise for me that GCC cannot compile
such a simple mask operation...

Thanks,
rin


Home | Main Index | Thread Index | Old Index