[libc-commits] [libc] [libc] Disable `-ffreestanding` and `-fno-builtin` on the GPU build (PR #97636)

Joseph Huber via libc-commits libc-commits at lists.llvm.org
Wed Jul 3 14:21:10 PDT 2024


https://github.com/jhuber6 updated https://github.com/llvm/llvm-project/pull/97636

>From 8a05883b52c58467d01ed26ae3d2fcf61e78b721 Mon Sep 17 00:00:00 2001
From: Joseph Huber <huberjn at outlook.com>
Date: Wed, 3 Jul 2024 16:00:17 -0500
Subject: [PATCH 1/2] [libc] Disable `-ffreestanding` and `-fno-builtin` on the
 GPU build

Summary:
This patch removed the `-ffreestanding` and `-fno-builtin` flags from
the publically installed version of the GPU library. The presense of
`-fno-builtin` caused issues that prevented all inlining in the GPU C
library, see https://discourse.llvm.org/t/rfc-libc-ffreestanding-fno-builtin/75883.
Previously, I attempted to fix this by loosening the restriction that
`"no-builtins"` functions cannot be inlined into functions without that
attribute. However, that opened up a lot of extra issues that stalled
that approach.

This patch instead removes that and instead passes `-fno-builtin-<xyz>`
for the few calls that are known to be problematic. I believe this works
in general as the GPU backends do not emit any libcalls and the
implementations of most of these simply reduce to builtins right now.
This is a very useful patch as we can now actually inline calls.
---
 .../modules/LLVMLibCCompileOptionRules.cmake  | 26 ++++++++++++++++---
 1 file changed, 23 insertions(+), 3 deletions(-)

diff --git a/libc/cmake/modules/LLVMLibCCompileOptionRules.cmake b/libc/cmake/modules/LLVMLibCCompileOptionRules.cmake
index 28379213029a3..026f54f337ac1 100644
--- a/libc/cmake/modules/LLVMLibCCompileOptionRules.cmake
+++ b/libc/cmake/modules/LLVMLibCCompileOptionRules.cmake
@@ -43,9 +43,11 @@ function(_get_common_compile_options output_var flags)
     list(APPEND compile_options "-fpie")
 
     if(LLVM_LIBC_FULL_BUILD)
+      # Only add -ffreestanding flag in non-GPU full build mode.
+      if(LIBC_TARGET_OS_IS_GPU)
+        list(APPEND compile_options "-ffreestanding")
+      endif()
       list(APPEND compile_options "-DLIBC_FULL_BUILD")
-      # Only add -ffreestanding flag in full build mode.
-      list(APPEND compile_options "-ffreestanding")
       # Manually disable standard include paths to prevent system headers from
       # being included.
       if(LIBC_CC_SUPPORTS_NOSTDLIBINC)
@@ -60,7 +62,25 @@ function(_get_common_compile_options output_var flags)
       list(APPEND compile_options "-ffixed-point")
     endif()
 
-    list(APPEND compile_options "-fno-builtin")
+    # Builtin recognition causes issues when trying to implement the builtin
+    # functions themselves. The GPU backends do not use libcalls so we disable
+    # the known problematic ones. This allows inlining during LTO linking.
+    if(LIBC_TARGET_OS_IS_GPU)
+      list(APPEND compile_options "-fno-builtin-bcmp")
+      list(APPEND compile_options "-fno-builtin-strlen")
+      list(APPEND compile_options "-fno-builtin-memmem")
+      list(APPEND compile_options "-fno-builtin-bzero.h")
+      list(APPEND compile_options "-fno-builtin-memcmp.h")
+      list(APPEND compile_options "-fno-builtin-memcpy.h")
+      list(APPEND compile_options "-fno-builtin-memmem.h")
+      list(APPEND compile_options "-fno-builtin-memmove.h")
+      list(APPEND compile_options "-fno-builtin-memset.h")
+      list(APPEND compile_options "-fno-builtin-strcmp.h")
+      list(APPEND compile_options "-fno-builtin-strstr.h")
+    else()
+      list(APPEND compile_options "-fno-builtin")
+    endif()
+
     list(APPEND compile_options "-fno-exceptions")
     list(APPEND compile_options "-fno-lax-vector-conversions")
     list(APPEND compile_options "-fno-unwind-tables")

>From 334174514259ac6d3e96f3a5bd9e7f9de0597031 Mon Sep 17 00:00:00 2001
From: Joseph Huber <huberjn at outlook.com>
Date: Wed, 3 Jul 2024 16:21:03 -0500
Subject: [PATCH 2/2] Update
 libc/cmake/modules/LLVMLibCCompileOptionRules.cmake

---
 libc/cmake/modules/LLVMLibCCompileOptionRules.cmake | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libc/cmake/modules/LLVMLibCCompileOptionRules.cmake b/libc/cmake/modules/LLVMLibCCompileOptionRules.cmake
index 026f54f337ac1..fbe72f190765b 100644
--- a/libc/cmake/modules/LLVMLibCCompileOptionRules.cmake
+++ b/libc/cmake/modules/LLVMLibCCompileOptionRules.cmake
@@ -44,7 +44,7 @@ function(_get_common_compile_options output_var flags)
 
     if(LLVM_LIBC_FULL_BUILD)
       # Only add -ffreestanding flag in non-GPU full build mode.
-      if(LIBC_TARGET_OS_IS_GPU)
+      if(NOT LIBC_TARGET_OS_IS_GPU)
         list(APPEND compile_options "-ffreestanding")
       endif()
       list(APPEND compile_options "-DLIBC_FULL_BUILD")



More information about the libc-commits mailing list