[libc-commits] [libc] arm64 frame address (PR #77140)

Nick Desaulniers via libc-commits libc-commits at lists.llvm.org
Fri Jan 5 13:30:08 PST 2024


https://github.com/nickdesaulniers created https://github.com/llvm/llvm-project/pull/77140

- [libc][cmake] append per obj compile options instead of prepending
- [libc] set -Wno-frame-address for thread.cpp


>From cc24dbdc945f9ccae0fe6a613eeb5841a444f483 Mon Sep 17 00:00:00 2001
From: Nick Desaulniers <ndesaulniers at google.com>
Date: Fri, 5 Jan 2024 10:50:40 -0800
Subject: [PATCH 1/2] [libc][cmake] append per obj compile options instead of
 prepending

This allows individual object files to override the common compile commands in
their local CMakeLists' add_object_library call.

For example, the common compile commands contain -Wall and -Wextra.  Before
this patch, the per object COMPILE_OPTIONS were prepended to these, so that
builds of individual object files could not individually disable specific
diagnostics from those groups explicitly.

After this patch, the per-object file compile objects are appended to the list
of compiler flags, enabling this use case.

ARGN is a bit of cmake magic; let's be explicit in the APPEND that we're
appending the compile options.

Link: #77007
---
 libc/cmake/modules/LLVMLibCObjectRules.cmake | 16 +++++-----------
 1 file changed, 5 insertions(+), 11 deletions(-)

diff --git a/libc/cmake/modules/LLVMLibCObjectRules.cmake b/libc/cmake/modules/LLVMLibCObjectRules.cmake
index 5fbbfd58db2d07..c3e3fa2dccfe53 100644
--- a/libc/cmake/modules/LLVMLibCObjectRules.cmake
+++ b/libc/cmake/modules/LLVMLibCObjectRules.cmake
@@ -26,7 +26,7 @@ function(_get_common_compile_options output_var flags)
     set(ADD_PREFER_GENERIC_FLAG TRUE)
   endif()
 
-  set(compile_options ${LIBC_COMPILE_OPTIONS_DEFAULT} ${ARGN})
+  set(compile_options ${LIBC_COMPILE_OPTIONS_DEFAULT})
   if(LLVM_COMPILER_IS_GCC_COMPATIBLE)
     list(APPEND compile_options "-fpie")
 
@@ -357,11 +357,8 @@ function(create_object_library fq_target_name)
     set(internal_target_name ${fq_target_name})
   endif()
 
-  _get_common_compile_options(
-    compile_options
-    "${ADD_OBJECT_FLAGS}"
-    ${ADD_OBJECT_COMPILE_OPTIONS}
-  )
+  _get_common_compile_options(compile_options "${ADD_OBJECT_FLAGS}")
+  list(APPEND compile_options ${ADD_OBJECT_COMPILE_OPTIONS})
 
   # GPU builds require special handling for the objects because we want to
   # export several different targets at once, e.g. for both Nvidia and AMD.
@@ -640,11 +637,8 @@ function(create_entrypoint_object fq_target_name)
     set(ADD_ENTRYPOINT_OBJ_CXX_STANDARD ${CMAKE_CXX_STANDARD})
   endif()
 
-  _get_common_compile_options(
-    common_compile_options
-    "${ADD_ENTRYPOINT_OBJ_FLAGS}"
-    ${ADD_ENTRYPOINT_OBJ_COMPILE_OPTIONS}
-  )
+  _get_common_compile_options(common_compile_options "${ADD_ENTRYPOINT_OBJ_FLAGS}")
+  list(APPEND common_compile_options ${ADD_ENTRYPOINT_OBJ_COMPILE_OPTIONS})
   get_fq_deps_list(fq_deps_list ${ADD_ENTRYPOINT_OBJ_DEPENDS})
   set(full_deps_list ${fq_deps_list} libc.src.__support.common)
 

>From 49e4cee37522a32fb85d5048303cc60feaed8677 Mon Sep 17 00:00:00 2001
From: Nick Desaulniers <ndesaulniers at google.com>
Date: Fri, 5 Jan 2024 13:23:01 -0800
Subject: [PATCH 2/2] [libc] set -Wno-frame-address for thread.cpp

The aarch64 code is using __builtin_return_address with a non-zero parameter,
which generates the following warning:

    llvm-project/libc/src/__support/threads/linux/thread.cpp:171:38: error:
    calling '__builtin_frame_address' with a nonzero argument is unsafe
    [-Werror,-Wframe-address]
      171 |   return reinterpret_cast<uintptr_t>(__builtin_frame_address(1));
          |                                      ^~~~~~~~~~~~~~~~~~~~~~~~~~

Disable this diagnostic just for this file so that we can enable -Werror.

Fixes: #77007
---
 libc/src/__support/threads/linux/CMakeLists.txt | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/libc/src/__support/threads/linux/CMakeLists.txt b/libc/src/__support/threads/linux/CMakeLists.txt
index 642eead7277262..148a0ba061c577 100644
--- a/libc/src/__support/threads/linux/CMakeLists.txt
+++ b/libc/src/__support/threads/linux/CMakeLists.txt
@@ -39,6 +39,8 @@ add_object_library(
     -O3
     -fno-omit-frame-pointer # This allows us to sniff out the thread args from
                             # the new thread's stack reliably.
+    -Wno-frame-address      # Yes, calling __builtin_return_address with a
+                            # value other than 0 is dangerous. We know.
 )
 
 add_object_library(



More information about the libc-commits mailing list