Merge tag 'nolibc.2022.07.27a' of git://git.kernel.org/pub/scm/linux/kernel/git/paulm...
authorLinus Torvalds <torvalds@linux-foundation.org>
Wed, 3 Aug 2022 02:22:24 +0000 (19:22 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 3 Aug 2022 02:22:24 +0000 (19:22 -0700)
Pull nolibc updates from Paul McKenney:
 "This provides nolibc updates, perhaps most notably improved testing
  via the 'cd tools/include/nolibc; make headers' command. This should
  be considered a smoke test. More thorough testing is in the works"

* tag 'nolibc.2022.07.27a' of git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu:
  tools/nolibc: add a help target to list supported targets
  tools/nolibc: make the default target build the headers
  tools/nolibc: fix the makefile to also work as "make -C tools ..."
  tools/nolibc/stdio: Add format attribute to enable printf warnings
  tools/nolibc/stdlib: Support overflow checking for older compiler versions

tools/Makefile
tools/include/nolibc/Makefile
tools/include/nolibc/stdio.h
tools/include/nolibc/stdlib.h

index c074e42fd92f589b730fa2f169f27616987a242b..e497875fc7e3fecfbb419c7cd632383833bce07a 100644 (file)
@@ -78,6 +78,9 @@ bpf/%: FORCE
 libapi: FORCE
        $(call descend,lib/api)
 
+nolibc: FORCE
+       $(call descend,include/nolibc)
+
 nolibc_%: FORCE
        $(call descend,include/nolibc,$(patsubst nolibc_%,%,$@))
 
index 7a16d917c185990a8753f884f28ba9b8bdbb8bc6..cfd06764b5aeeae9c1843c50f6b7fd7fdfa91797 100644 (file)
@@ -7,13 +7,46 @@ ifeq ($(srctree),)
 srctree := $(patsubst %/tools/include/,%,$(dir $(CURDIR)))
 endif
 
+# when run as make -C tools/ nolibc_<foo> the arch is not set
+ifeq ($(ARCH),)
+include $(srctree)/scripts/subarch.include
+ARCH = $(SUBARCH)
+endif
+
+# OUTPUT is only set when run from the main makefile, otherwise
+# it defaults to this nolibc directory.
+OUTPUT ?= $(CURDIR)/
+
+ifeq ($(V),1)
+Q=
+else
+Q=@
+endif
+
 nolibc_arch := $(patsubst arm64,aarch64,$(ARCH))
 arch_file := arch-$(nolibc_arch).h
 all_files := ctype.h errno.h nolibc.h signal.h std.h stdio.h stdlib.h string.h \
              sys.h time.h types.h unistd.h
 
 # install all headers needed to support a bare-metal compiler
-all:
+all: headers
+
+install: help
+
+help:
+       @echo "Supported targets under nolibc:"
+       @echo "  all                 call \"headers\""
+       @echo "  clean               clean the sysroot"
+       @echo "  headers             prepare a sysroot in tools/include/nolibc/sysroot"
+       @echo "  headers_standalone  like \"headers\", and also install kernel headers"
+       @echo "  help                this help"
+       @echo ""
+       @echo "These targets may also be called from tools as \"make nolibc_<target>\"."
+       @echo ""
+       @echo "Currently using the following variables:"
+       @echo "  ARCH    = $(ARCH)"
+       @echo "  OUTPUT  = $(OUTPUT)"
+       @echo ""
 
 # Note: when ARCH is "x86" we concatenate both x86_64 and i386
 headers:
@@ -36,7 +69,7 @@ headers:
 
 headers_standalone: headers
        $(Q)$(MAKE) -C $(srctree) headers
-       $(Q)$(MAKE) -C $(srctree) headers_install INSTALL_HDR_PATH=$(OUTPUT)/sysroot
+       $(Q)$(MAKE) -C $(srctree) headers_install INSTALL_HDR_PATH=$(OUTPUT)sysroot
 
 clean:
        $(call QUIET_CLEAN, nolibc) rm -rf "$(OUTPUT)sysroot"
index 15dedf8d0902dfdb2a054da7b533ae1b0fa0e45f..a3cebc4bc3ac4d997431db4fd2ce72fb5fd64387 100644 (file)
@@ -273,7 +273,7 @@ int vfprintf(FILE *stream, const char *fmt, va_list args)
        return written;
 }
 
-static __attribute__((unused))
+static __attribute__((unused, format(printf, 2, 3)))
 int fprintf(FILE *stream, const char *fmt, ...)
 {
        va_list args;
@@ -285,7 +285,7 @@ int fprintf(FILE *stream, const char *fmt, ...)
        return ret;
 }
 
-static __attribute__((unused))
+static __attribute__((unused, format(printf, 1, 2)))
 int printf(const char *fmt, ...)
 {
        va_list args;
index 8fd32eaf8037070a7480b40aeb1b74c4c09e658f..92378c4b9660516255377d2819f72d5eff77afda 100644 (file)
@@ -128,10 +128,9 @@ void *malloc(size_t len)
 static __attribute__((unused))
 void *calloc(size_t size, size_t nmemb)
 {
-       void *orig;
-       size_t res = 0;
+       size_t x = size * nmemb;
 
-       if (__builtin_expect(__builtin_mul_overflow(nmemb, size, &res), 0)) {
+       if (__builtin_expect(size && ((x / size) != nmemb), 0)) {
                SET_ERRNO(ENOMEM);
                return NULL;
        }
@@ -140,7 +139,7 @@ void *calloc(size_t size, size_t nmemb)
         * No need to zero the heap, the MAP_ANONYMOUS in malloc()
         * already does it.
         */
-       return malloc(res);
+       return malloc(x);
 }
 
 static __attribute__((unused))