]> Sergey Matveev's repositories - nnn.git/commitdiff
Always use builtin alloca() (#666)
authorSijmen J. Mulder <ik@sjmulder.nl>
Tue, 23 Jun 2020 22:47:05 +0000 (00:47 +0200)
committerGitHub <noreply@github.com>
Tue, 23 Jun 2020 22:47:05 +0000 (04:17 +0530)
Fixes the build on NetBSD 9 on arm64.

GCC expands alloca() to __builtin_alloca() but only in nonstandard mode,
e.g. when -std=... is not supplied.  In standards mode (with -std=...)
alloca() is left undefined by GCC. The C library may define it but it
also may not, as on NetBSD on arm64:

    $ uname -srp
    NetBSD 9.0 aarch64

    $ cat alloca.c
    #include <stdlib.h>
    int main() { char *p = alloca(10); }

    $ gcc alloca.c

    $ gcc -std=c99 alloca.c
    alloca.c:(.text+0xc): warning: Warning: reference to the libc
     supplied alloca(3); this most likely will not work. Please use the
     compiler provided version of alloca(3), by supplying the
     appropriate compiler flags (e.g. not -std=c89).
    ld: alloca.c:(.text+0xc): undefined reference to `alloca'

The fix is to either not use standards mode (undesirable) or to
explicitly use the builtin, which is what this patch does.

This is also sufficient for Solarius/Illumos so that check and include
are removed.

src/nnn.c

index ca9fef60d496e73d1f14e919f497e92e29bfb0e8..a8f82edb3c20aafe94a35ebca1bd1c6dea66e383 100644 (file)
--- a/src/nnn.c
+++ b/src/nnn.c
@@ -90,9 +90,6 @@
 #include <signal.h>
 #include <stdarg.h>
 #include <stdlib.h>
-#ifdef __sun
-#include <alloca.h>
-#endif
 #include <string.h>
 #include <strings.h>
 #include <time.h>
 #include <ftw.h>
 #include <wchar.h>
 
+#if !defined(alloca) && defined(__GNUC__)
+/*
+ * GCC doesn't expand alloca() to __builtin_alloca() in standards mode
+ * (-std=...) and not all standard libraries do or supply it, e.g.
+ * NetBSD/arm64 so explicitly use the builtin.
+ */
+#define alloca(size) __builtin_alloca(size)
+#endif
+
 #include "nnn.h"
 #include "dbg.h"