From aba78537a17917a29e3b5112e777db0b164e3812 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Sun, 3 Nov 2024 14:37:42 +0100 Subject: [PATCH] llvm: Use no-builtins attribute instead of nobuiltin. The former prevents recognizing code patterns and turning them into libcalls, which is what we want for compiler-rt. The latter is meant to be used on call sites to prevent them from being turned into intrinsics. Context: https://github.com/ziglang/zig/issues/21842 --- src/codegen/llvm.zig | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index b70940325648..c87dda2d6d64 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -3242,13 +3242,16 @@ pub const Object = struct { if (owner_mod.unwind_tables) { try attributes.addFnAttr(.{ .uwtable = Builder.Attribute.UwTable.default }, &o.builder); } - if (comp.skip_linker_dependencies or comp.no_builtin) { + if (comp.skip_linker_dependencies or comp.no_builtin or target.cpu.arch.isBpf()) { // The intent here is for compiler-rt and libc functions to not generate // infinite recursion. For example, if we are compiling the memcpy function, // and llvm detects that the body is equivalent to memcpy, it may replace the // body of memcpy with a call to memcpy, which would then cause a stack // overflow instead of performing memcpy. - try attributes.addFnAttr(.nobuiltin, &o.builder); + try attributes.addFnAttr(.{ .string = .{ + .kind = try o.builder.string("no-builtins"), + .value = .empty, + } }, &o.builder); } if (owner_mod.optimize_mode == .ReleaseSmall) { try attributes.addFnAttr(.minsize, &o.builder); @@ -3267,12 +3270,6 @@ pub const Object = struct { .value = try o.builder.string(std.mem.span(s)), } }, &o.builder); } - if (target.cpu.arch.isBpf()) { - try attributes.addFnAttr(.{ .string = .{ - .kind = try o.builder.string("no-builtins"), - .value = .empty, - } }, &o.builder); - } if (target.floatAbi() == .soft) { // `use-soft-float` means "use software routines for floating point computations". In // other words, it configures how LLVM lowers basic float instructions like `fcmp`,