$ cc a.c /tmp/a-667572.o: In function `main': a.c:(.text+0x50): undefined reference to `__muloti4' cc: error: linker command failed with exit code 1 (use -v to see invocation) $ cat a.c #include <stdint.h> int main(void) { uint64_t i; __builtin_mul_overflow(1, 10, &i); return 0; }
We do compile contrib/llvm-project/compiler-rt/lib/builtins/muloti4.c as part of libcompiler_rt, but the file starts with: #include "int_lib.h" #ifdef CRT_HAS_128BIT // Returns: a * b // Effects: sets *overflow to 1 if a * b overflows COMPILER_RT_ABI ti_int __muloti4(ti_int a, ti_int b, int *overflow) { Obviously, CRT_HAS_128BIT is false on 32-bit platforms; it is defined in int_lib.h as: #if defined(__LP64__) || defined(__wasm__) || defined(__mips64) || \ defined(__riscv) || defined(_WIN64) #define CRT_HAS_128BIT #endif So I'm not really sure what we can do about this...
FWIW, this at least does not affect 32-bit ARM: FreeBSD generic 14.0-CURRENT FreeBSD 14.0-CURRENT #0 main-n259626-b1ef176eb528: Fri Dec 9 10:56:44 UTC 2022 root@releng1.nyi.freebsd.org:/usr/obj/usr/src/arm.armv7/sys/GENERIC arm
it also doesn't replicate in FreeBSD 12.4 amd64 (using -m32 with the system cc), so maybe should be closed?
maybe related and therefore solved by: https://bugs.llvm.org//show_bug.cgi?id=28629