calloc - Work around gcc-8 bug (2).
authorzrj <rimvydas.jasinskas@gmail.com>
Sat, 28 Apr 2018 05:30:03 +0000 (08:30 +0300)
committerzrj <zrj@dragonflybsd.org>
Sat, 5 May 2018 10:42:44 +0000 (13:42 +0300)
GCC-8 at -O2 improperly tries to optimize calloc() replacement even for
malloc+bzero sequence back to calloc from calloc itself. This affects
both main root's shell (tcsh as default) and ld-elf.so dynamic linker.

Explicitly use -fno-builtin-malloc to prevent that at any -Ox level.

bin/csh/csh/Makefile
libexec/rtld-elf/Makefile

index 3e12c79..06df853 100644 (file)
@@ -40,6 +40,12 @@ DPADD=       ${LIBNCURSES} ${LIBCRYPT} ${LIBCRYPTO}
 LDADD= -lprivate_ncurses -lcrypt -lprivate_crypto
 LDFLAGS+=      ${PRIVATELIB_LDFLAGS}
 
+# The gcc80 -O2 tends to wrap malloc() + bzero() back to local calloc() by
+# emitting calloc: imul %rsi,%rdi; mov $0x1,%esi; jmpq 0xfoo <calloc>
+FLAGS_GROUPS=  calloc
+calloc_FLAGS=  -fno-builtin-malloc
+calloc_FLAGS_FILES= tc.alloc.c
+
 # XXX hmmm
 .if defined(BOOTSTRAPPING)
 . if ${CFLAGS:M-flto}
index 19f1111..da4fd6a 100644 (file)
@@ -59,6 +59,12 @@ LDADD=               -L${.OBJDIR}/../../lib/libc_rtld -lc_rtld_pic
 CFLAGS+=       -DDEBUG
 .endif
 
+# The gcc80 -O2 tends to wrap malloc() + bzero() back to local calloc() by
+# emitting calloc: imul %rsi,%rdi; mov $0x1,%esi; jmpq 0xfoo <calloc>
+FLAGS_GROUPS=  calloc
+calloc_FLAGS=  -fno-builtin-malloc
+calloc_FLAGS_FILES= malloc.c
+
 # Since moving rtld-elf to /libexec, we need to create a symlink.
 # Fixup the existing binary that's there so we can symlink over it.
 beforeinstall: