[libc-commits] [libc] [libc] Refactor _build_gpu_objects cmake function. (PR #80631)

via libc-commits libc-commits at lists.llvm.org
Mon Feb 5 07:15:57 PST 2024


https://github.com/lntue updated https://github.com/llvm/llvm-project/pull/80631

>From 078f4c242e9eebe79df37f2b507118cc75520118 Mon Sep 17 00:00:00 2001
From: Tue Ly <lntue at google.com>
Date: Mon, 5 Feb 2024 00:18:48 -0500
Subject: [PATCH 1/2] [libc] Refactor _build_gpu_objects cmake function.

---
 libc/CMakeLists.txt                           |   4 +-
 libc/cmake/modules/LLVMLibCObjectRules.cmake  | 182 ++++++++++--------
 .../modules/prepare_libc_gpu_build.cmake      |  19 +-
 libc/test/src/CMakeLists.txt                  |   2 +-
 4 files changed, 122 insertions(+), 85 deletions(-)

diff --git a/libc/CMakeLists.txt b/libc/CMakeLists.txt
index 6d385849b6a64..3d77573661674 100644
--- a/libc/CMakeLists.txt
+++ b/libc/CMakeLists.txt
@@ -340,8 +340,8 @@ set(TARGET_ENTRYPOINT_NAME_LIST "")
 foreach(entrypoint IN LISTS TARGET_LLVMLIBC_ENTRYPOINTS)
   string(FIND ${entrypoint} "." last_dot_loc REVERSE)
   if(${last_dot_loc} EQUAL -1)
-    message(FATAL "Invalid entrypoint target name ${entrypoint}; Expected a '.' "
-                  "(dot) in the name.")
+    message(FATAL_ERROR "Invalid entrypoint target name ${entrypoint}; Expected"
+                        " a '.' (dot) in the name.")
   endif()
   math(EXPR name_loc "${last_dot_loc} + 1")
   string(SUBSTRING ${entrypoint} ${name_loc} -1 entrypoint_name)
diff --git a/libc/cmake/modules/LLVMLibCObjectRules.cmake b/libc/cmake/modules/LLVMLibCObjectRules.cmake
index 4213fe15731f1..9826127410dbd 100644
--- a/libc/cmake/modules/LLVMLibCObjectRules.cmake
+++ b/libc/cmake/modules/LLVMLibCObjectRules.cmake
@@ -145,21 +145,78 @@ function(get_nvptx_compile_options output_var gpu_arch)
   set(${output_var} ${nvptx_options} PARENT_SCOPE)
 endfunction()
 
-# Builds the object target for the GPU.
+# Build the object target for a single GPU arch.
+# Usage:
+#     _build_gpu_object_for_single_arch(
+#       <target_name>
+#       <gpu_arch>
+#       SRCS <list of .cpp files>
+#       HDRS <list of .h files>
+#       DEPENDS <list of dependencies>
+#       COMPILE_OPTIONS <optional list of special compile options for this target>
+#       FLAGS <optional list of flags>
+#     )
+function(_build_gpu_object_for_single_arch fq_target_name gpu_arch)
+  cmake_parse_arguments(
+    "ADD_GPU_OBJ"
+    "" # No optional arguments
+    "NAME;CXX_STANDARD" # Single value arguments
+    "SRCS;HDRS;DEPENDS;COMPILE_OPTIONS;FLAGS"  # Multi value arguments
+    ${ARGN}
+  )
+
+  if(NOT ADD_GPU_OBJ_CXX_STANDARD)
+    set(ADD_GPU_OBJ_CXX_STANDARD ${CMAKE_CXX_STANDARD})
+  endif()
+
+  set(compile_options ${ADD_GPU_OBJ_COMPILE_OPTIONS})
+  # Derive the triple from the specified architecture.
+  if("${gpu_arch}" IN_LIST all_amdgpu_architectures)
+    set(gpu_target_triple ${AMDGPU_TARGET_TRIPLE})
+    list(APPEND compile_options "-mcpu=${gpu_arch}")
+    list(APPEND compile_options "SHELL:-Xclang -mcode-object-version=none")
+  elseif("${gpu_arch}" IN_LIST all_nvptx_architectures)
+    set(gpu_target_triple ${NVPTX_TARGET_TRIPLE})
+    get_nvptx_compile_options(nvptx_options ${gpu_arch})
+    list(APPEND compile_options "${nvptx_options}")
+  else()
+    message(FATAL_ERROR "Unknown GPU architecture '${gpu_arch}'")
+  endif()
+  list(APPEND compile_options "--target=${gpu_target_triple}")
+  list(APPEND compile_options "-emit-llvm")
+
+  # Build the library for this target architecture. We always emit LLVM-IR for
+  # packaged GPU binaries.
+  add_library(${fq_target_name}
+    EXCLUDE_FROM_ALL
+    OBJECT
+    ${ADD_GPU_OBJ_SRCS}
+    ${ADD_GPU_OBJ_HDRS}
+  )
+
+  target_compile_options(${fq_target_name} PRIVATE ${compile_options})
+  target_include_directories(${fq_target_name} SYSTEM PRIVATE ${LIBC_INCLUDE_DIR})
+  target_include_directories(${fq_target_name} PRIVATE ${LIBC_SOURCE_DIR})
+  set_target_properties(${fq_target_name} PROPERTIES CXX_STANDARD ${ADD_GPU_OBJ_CXX_STANDARD})
+  if(ADD_GPU_OBJ_DEPENDS)
+    add_dependencies(${fq_target_name} ${ADD_GPU_OBJ_DEPENDS})
+    set_target_properties(${fq_target_name} PROPERTIES DEPS "${ADD_GPU_OBJ_DEPENDS}")
+  endif()
+endfunction(_build_gpu_object_for_single_arch)
+
+# Build the object target for the GPU.
 # This compiles the target for all supported architectures and embeds it into
-# host binary for installing. The internal target contains the GPU code directly
-# compiled for a single architecture used internally.
+# host binary for installing.
 # Usage:
-#     _build_gpu_objects(
+#     _build_gpu_object_bundle(
 #       <target_name>
-#       <internal_target_name>
 #       SRCS <list of .cpp files>
 #       HDRS <list of .h files>
 #       DEPENDS <list of dependencies>
 #       COMPILE_OPTIONS <optional list of special compile options for this target>
 #       FLAGS <optional list of flags>
 #     )
-function(_build_gpu_objects fq_target_name internal_target_name)
+function(_build_gpu_object_bundle fq_target_name)
   cmake_parse_arguments(
     "ADD_GPU_OBJ"
     "" # No optional arguments
@@ -168,7 +225,6 @@ function(_build_gpu_objects fq_target_name internal_target_name)
     ${ARGN}
   )
 
-  set(common_compile_options ${ADD_GPU_OBJ_COMPILE_OPTIONS})
   if(NOT ADD_GPU_OBJ_CXX_STANDARD)
     set(ADD_GPU_OBJ_CXX_STANDARD ${CMAKE_CXX_STANDARD})
   endif()
@@ -179,49 +235,25 @@ function(_build_gpu_objects fq_target_name internal_target_name)
     foreach(gpu_arch ${LIBC_GPU_ARCHITECTURES})
       get_filename_component(src_name ${add_gpu_obj_src} NAME)
       set(gpu_target_name ${fq_target_name}.${src_name}.${gpu_arch})
-      set(compile_options ${ADD_GPU_OBJ_COMPILE_OPTIONS})
-      # Derive the triple from the specified architecture.
-      if("${gpu_arch}" IN_LIST all_amdgpu_architectures)
-        set(gpu_target_triple "amdgcn-amd-amdhsa")
-        list(APPEND compile_options "-mcpu=${gpu_arch}")
-        list(APPEND compile_options "SHELL:-Xclang -mcode-object-version=none")
-      elseif("${gpu_arch}" IN_LIST all_nvptx_architectures)
-        set(gpu_target_triple "nvptx64-nvidia-cuda")
-        get_nvptx_compile_options(nvptx_options ${gpu_arch})
-        list(APPEND compile_options "${nvptx_options}")
-      else()
-        message(FATAL_ERROR "Unknown GPU architecture '${gpu_arch}'")
-      endif()
-      list(APPEND compile_options "--target=${gpu_target_triple}")
-      list(APPEND compile_options "-emit-llvm")
-
-      # Build the library for this target architecture. We always emit LLVM-IR for
-      # packaged GPU binaries.
-      add_library(${gpu_target_name}
-        EXCLUDE_FROM_ALL
-        OBJECT
-        ${add_gpu_obj_src}
-        ${ADD_GPU_OBJ_HDRS}
-      )
-
-      target_compile_options(${gpu_target_name} PRIVATE ${compile_options})
-      target_include_directories(${gpu_target_name} SYSTEM PRIVATE ${LIBC_INCLUDE_DIR})
-      target_include_directories(${gpu_target_name} PRIVATE ${LIBC_SOURCE_DIR})
-      target_compile_definitions(${gpu_target_name} PRIVATE LIBC_COPT_PUBLIC_PACKAGING)
-      set_target_properties(${gpu_target_name} PROPERTIES CXX_STANDARD ${ADD_GPU_OBJ_CXX_STANDARD})
-      if(ADD_GPU_OBJ_DEPENDS)
-        add_dependencies(${gpu_target_name} ${ADD_GPU_OBJ_DEPENDS})
-      endif()
 
+      _build_gpu_object_for_single_arch(
+        ${gpu_target_name}
+        ${gpu_arch}
+        CXX_STANDARD ${ADD_GPU_OBJ_CXX_STANDARD}
+        HDRS ${ADD_GPU_OBJ_HDRS}
+        SRCS ${add_gpu_obj_src}
+        COMPILE_OPTIONS ${ADD_GPU_OBJ_COMPILE_OPTIONS}
+        DEPENDS ${ADD_GPU_OBJ_DEPENDS}
+      )
       # Append this target to a list of images to package into a single binary.
       set(input_file $<TARGET_OBJECTS:${gpu_target_name}>)
       if("${gpu_arch}" IN_LIST all_nvptx_architectures)
         string(REGEX MATCH "\\+ptx[0-9]+" nvptx_ptx_feature ${nvptx_options})
         list(APPEND packager_images
-             --image=file=${input_file},arch=${gpu_arch},triple=${gpu_target_triple},feature=${nvptx_ptx_feature})
+             --image=file=${input_file},arch=${gpu_arch},triple=${NVPTX_TARGET_TRIPLE},feature=${nvptx_ptx_feature})
       else()
         list(APPEND packager_images
-             --image=file=${input_file},arch=${gpu_arch},triple=${gpu_target_triple})
+             --image=file=${input_file},arch=${gpu_arch},triple=${AMDGPU_TARGET_TRIPLE})
        endif()
       list(APPEND gpu_target_objects ${input_file})
     endforeach()
@@ -269,7 +301,7 @@ function(_build_gpu_objects fq_target_name internal_target_name)
     ${CMAKE_CURRENT_BINARY_DIR}/stubs/${stub_filename}
   )
   target_compile_options(${fq_target_name} BEFORE PRIVATE
-                         ${common_compile_options} -nostdlib)
+                         ${ADD_GPU_OBJ_COMPILE_OPTIONS} -nostdlib)
   foreach(packaged_gpu_binary ${packaged_gpu_binaries})
     target_compile_options(${fq_target_name} PRIVATE
                            "SHELL:-Xclang -fembed-offload-object=${packaged_gpu_binary}")
@@ -278,33 +310,6 @@ function(_build_gpu_objects fq_target_name internal_target_name)
   target_include_directories(${fq_target_name} PRIVATE ${LIBC_SOURCE_DIR})
   add_dependencies(${fq_target_name}
                    ${full_deps_list} ${packaged_gpu_names} ${stub_target_name})
-
-  # We only build the internal target for a single supported architecture.
-  if(LIBC_GPU_TARGET_ARCHITECTURE_IS_AMDGPU OR
-     LIBC_GPU_TARGET_ARCHITECTURE_IS_NVPTX)
-    add_library(
-      ${internal_target_name}
-      EXCLUDE_FROM_ALL
-      OBJECT
-      ${ADD_GPU_OBJ_SRCS}
-      ${ADD_GPU_OBJ_HDRS}
-    )
-    target_compile_options(${internal_target_name} BEFORE PRIVATE
-                           ${common_compile_options} --target=${LIBC_GPU_TARGET_TRIPLE})
-    if(LIBC_GPU_TARGET_ARCHITECTURE_IS_AMDGPU)
-      target_compile_options(${internal_target_name} PRIVATE
-                             "SHELL:-Xclang -mcode-object-version=none"
-                             -mcpu=${LIBC_GPU_TARGET_ARCHITECTURE} -flto)
-    elseif(LIBC_GPU_TARGET_ARCHITECTURE_IS_NVPTX)
-      get_nvptx_compile_options(nvptx_options ${LIBC_GPU_TARGET_ARCHITECTURE})
-      target_compile_options(${internal_target_name} PRIVATE ${nvptx_options})
-    endif()
-    target_include_directories(${internal_target_name} SYSTEM PRIVATE ${LIBC_INCLUDE_DIR})
-    target_include_directories(${internal_target_name} PRIVATE ${LIBC_SOURCE_DIR})
-    if(full_deps_list)
-      add_dependencies(${internal_target_name} ${full_deps_list})
-    endif()
-  endif()
 endfunction()
 
 # Rule which is essentially a wrapper over add_library to compile a set of
@@ -354,8 +359,10 @@ function(create_object_library fq_target_name)
   # The GPU build uses a separate internal file.
   if(LIBC_TARGET_ARCHITECTURE_IS_GPU AND NOT ${ADD_OBJECT_NO_GPU_BUNDLE})
     set(internal_target_name ${fq_target_name}.__internal__)
+    set(public_packaging_for_internal "")
   else()
     set(internal_target_name ${fq_target_name})
+    set(public_packaging_for_internal "-DLIBC_COPT_PUBLIC_PACKAGING")
   endif()
 
   _get_common_compile_options(compile_options "${ADD_OBJECT_FLAGS}")
@@ -363,15 +370,27 @@ function(create_object_library fq_target_name)
 
   # 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.
-  if(LIBC_TARGET_ARCHITECTURE_IS_GPU AND NOT ${ADD_OBJECT_NO_GPU_BUNDLE})
-    _build_gpu_objects(
-      ${fq_target_name}
+  if(LIBC_TARGET_ARCHITECTURE_IS_GPU)
+    if(NOT ${ADD_OBJECT_NO_GPU_BUNDLE})
+      _build_gpu_object_bundle(
+        ${fq_target_name}
+        SRCS ${ADD_OBJECT_SRCS}
+        HDRS ${ADD_OBJECT_HDRS}
+        CXX_STANDARD ${ADD_OBJECT_CXX_STANDARD}
+        COMPILE_OPTIONS ${compile_options} "-DLIBC_COPT_PUBLIC_PACKAGING"
+        DEPENDS ${fq_deps_list}
+      )
+    endif()
+    # When the target for GPU is not bundled, internal_target_name is the same
+    # as fq_targetname
+    _build_gpu_object_for_single_arch(
       ${internal_target_name}
+      ${LIBC_GPU_TARGET_ARCHITECTURE}
       SRCS ${ADD_OBJECT_SRCS}
       HDRS ${ADD_OBJECT_HDRS}
-      DEPENDS ${fq_deps_list}
       CXX_STANDARD ${ADD_OBJECT_CXX_STANDARD}
-      COMPILE_OPTIONS ${compile_options}
+      COMPILE_OPTIONS ${compile_options} ${public_packaging_for_internal}
+      DEPENDS ${fq_deps_list}
     )
   else()
     add_library(
@@ -567,16 +586,25 @@ function(create_entrypoint_object fq_target_name)
   # 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.
   if(LIBC_TARGET_ARCHITECTURE_IS_GPU)
-    _build_gpu_objects(
+    _build_gpu_object_bundle(
       ${fq_target_name}
+      SRCS ${ADD_ENTRYPOINT_OBJ_SRCS}
+      HDRS ${ADD_ENTRYPOINT_OBJ_HDRS}
+      COMPILE_OPTIONS ${common_compile_options} "-DLIBC_COPT_PUBLIC_PACKAGING"
+      CXX_STANDARD ${ADD_ENTRYPOINT_OBJ_CXX_STANDARD}
+      DEPENDS ${full_deps_list}
+      FLAGS "${ADD_ENTRYPOINT_OBJ_FLAGS}"
+    )
+    _build_gpu_object_for_single_arch(
       ${internal_target_name}
+      ${LIBC_GPU_TARGET_ARCHITECTURE}
       SRCS ${ADD_ENTRYPOINT_OBJ_SRCS}
       HDRS ${ADD_ENTRYPOINT_OBJ_HDRS}
       COMPILE_OPTIONS ${common_compile_options}
       CXX_STANDARD ${ADD_ENTRYPOINT_OBJ_CXX_STANDARD}
       DEPENDS ${full_deps_list}
       FLAGS "${ADD_ENTRYPOINT_OBJ_FLAGS}"
-    )
+    )    
   else()
     add_library(
       ${internal_target_name}
diff --git a/libc/cmake/modules/prepare_libc_gpu_build.cmake b/libc/cmake/modules/prepare_libc_gpu_build.cmake
index 05c46a64297ad..2086175bae6c7 100644
--- a/libc/cmake/modules/prepare_libc_gpu_build.cmake
+++ b/libc/cmake/modules/prepare_libc_gpu_build.cmake
@@ -15,6 +15,8 @@ set(all_gpu_architectures
     "${all_amdgpu_architectures};${all_nvptx_architectures}")
 set(LIBC_GPU_ARCHITECTURES "all" CACHE STRING
     "List of GPU architectures to build the libc for.")
+set(AMDGPU_TARGET_TRIPLE "amdgcn-amd-amdhsa")
+set(NVPTX_TARGET_TRIPLE "nvptx64-nvidia-cuda")
 
 # Ensure the compiler is a valid clang when building the GPU target.
 set(req_ver "${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}")
@@ -96,18 +98,25 @@ elseif(detected_gpu_architectures)
   message(STATUS "Using GPU architecture detected on the system for testing: "
                  "'${gpu_test_architecture}'")
 else()
-  message(STATUS "No GPU architecture set for testing. GPU tests will not be "
-                 "availibe. Set 'LIBC_GPU_TEST_ARCHITECTURE' to override.")
-  return()
+  list(LENGTH LIBC_GPU_ARCHITECTURES n_gpu_archs)
+  if (${n_gpu_archs} EQUAL 1)
+    set(gpu_test_architecture ${LIBC_GPU_ARCHITECTURES})
+    message(STATUS "Using user-specified GPU architecture for testing: "
+                  "'${gpu_test_architecture}'")
+  else()
+    message(STATUS "No GPU architecture set for testing. GPU tests will not be "
+                  "availibe. Set 'LIBC_GPU_TEST_ARCHITECTURE' to override.")
+    return()
+  endif()
 endif()
 
 if("${gpu_test_architecture}" IN_LIST all_amdgpu_architectures)
   set(LIBC_GPU_TARGET_ARCHITECTURE_IS_AMDGPU TRUE)
-  set(LIBC_GPU_TARGET_TRIPLE "amdgcn-amd-amdhsa")
+  set(LIBC_GPU_TARGET_TRIPLE ${AMDGPU_TARGET_TRIPLE})
   set(LIBC_GPU_TARGET_ARCHITECTURE "${gpu_test_architecture}")
 elseif("${gpu_test_architecture}" IN_LIST all_nvptx_architectures)
   set(LIBC_GPU_TARGET_ARCHITECTURE_IS_NVPTX TRUE)
-  set(LIBC_GPU_TARGET_TRIPLE "nvptx64-nvidia-cuda")
+  set(LIBC_GPU_TARGET_TRIPLE ${NVPTX_TARGET_TRIPLE})
   set(LIBC_GPU_TARGET_ARCHITECTURE "${gpu_test_architecture}")
 else()
   message(FATAL_ERROR "Unknown GPU architecture '${gpu_test_architecture}'")
diff --git a/libc/test/src/CMakeLists.txt b/libc/test/src/CMakeLists.txt
index 1f899c729e0ab..6c99c6735beff 100644
--- a/libc/test/src/CMakeLists.txt
+++ b/libc/test/src/CMakeLists.txt
@@ -21,7 +21,7 @@ function(add_fp_unittest name)
   endif()
   if(MATH_UNITTEST_NEED_MPFR)
     if(MATH_UNITTEST_HERMETIC_TEST_ONLY)
-      message(FATAL "Hermetic math test cannot require MPFR.")
+      message(FATAL_ERROR "Hermetic math test cannot require MPFR.")
     endif()
     set(test_type UNIT_TEST_ONLY)
     list(APPEND MATH_UNITTEST_LINK_LIBRARIES libcMPFRWrapper libc_math_test_utils -lmpfr -lgmp)

>From 16205bbe82e275f1027919a8b420f8a200680c9c Mon Sep 17 00:00:00 2001
From: Tue Ly <lntue at google.com>
Date: Mon, 5 Feb 2024 10:15:11 -0500
Subject: [PATCH 2/2] Don't add `-emit-llvm` when building for nvidia single
 targets.

---
 libc/cmake/modules/LLVMLibCObjectRules.cmake | 6 ++++--
 libc/startup/gpu/CMakeLists.txt              | 3 ++-
 libc/startup/gpu/amdgpu/CMakeLists.txt       | 6 +-----
 libc/startup/gpu/nvptx/CMakeLists.txt        | 6 +-----
 libc/test/IntegrationTest/CMakeLists.txt     | 2 +-
 5 files changed, 9 insertions(+), 14 deletions(-)

diff --git a/libc/cmake/modules/LLVMLibCObjectRules.cmake b/libc/cmake/modules/LLVMLibCObjectRules.cmake
index 9826127410dbd..3734b97edae7a 100644
--- a/libc/cmake/modules/LLVMLibCObjectRules.cmake
+++ b/libc/cmake/modules/LLVMLibCObjectRules.cmake
@@ -175,6 +175,7 @@ function(_build_gpu_object_for_single_arch fq_target_name gpu_arch)
     set(gpu_target_triple ${AMDGPU_TARGET_TRIPLE})
     list(APPEND compile_options "-mcpu=${gpu_arch}")
     list(APPEND compile_options "SHELL:-Xclang -mcode-object-version=none")
+    list(APPEND compile_options "-emit-llvm")
   elseif("${gpu_arch}" IN_LIST all_nvptx_architectures)
     set(gpu_target_triple ${NVPTX_TARGET_TRIPLE})
     get_nvptx_compile_options(nvptx_options ${gpu_arch})
@@ -183,7 +184,6 @@ function(_build_gpu_object_for_single_arch fq_target_name gpu_arch)
     message(FATAL_ERROR "Unknown GPU architecture '${gpu_arch}'")
   endif()
   list(APPEND compile_options "--target=${gpu_target_triple}")
-  list(APPEND compile_options "-emit-llvm")
 
   # Build the library for this target architecture. We always emit LLVM-IR for
   # packaged GPU binaries.
@@ -242,7 +242,9 @@ function(_build_gpu_object_bundle fq_target_name)
         CXX_STANDARD ${ADD_GPU_OBJ_CXX_STANDARD}
         HDRS ${ADD_GPU_OBJ_HDRS}
         SRCS ${add_gpu_obj_src}
-        COMPILE_OPTIONS ${ADD_GPU_OBJ_COMPILE_OPTIONS}
+        COMPILE_OPTIONS
+          ${ADD_GPU_OBJ_COMPILE_OPTIONS}
+          "-emit-llvm"
         DEPENDS ${ADD_GPU_OBJ_DEPENDS}
       )
       # Append this target to a list of images to package into a single binary.
diff --git a/libc/startup/gpu/CMakeLists.txt b/libc/startup/gpu/CMakeLists.txt
index 7bd5f9e568a1e..fa7f69f19520c 100644
--- a/libc/startup/gpu/CMakeLists.txt
+++ b/libc/startup/gpu/CMakeLists.txt
@@ -17,8 +17,9 @@ function(add_startup_object name)
   add_object_library(
     ${name}
     SRCS ${ADD_STARTUP_OBJECT_SRC}
-    DEPENDS ${ADD_STARTUP_OBJECT_DEPENDS}
     COMPILE_OPTIONS ${ADD_STARTUP_OBJECT_COMPILE_OPTIONS}
+    ${ADD_STARTUP_OBJECT_UNPARSED_ARGUMENTS}
+    DEPENDS ${ADD_STARTUP_OBJECT_DEPENDS}
   )
   set_target_properties(
     ${fq_target_name}
diff --git a/libc/startup/gpu/amdgpu/CMakeLists.txt b/libc/startup/gpu/amdgpu/CMakeLists.txt
index 723ed9bdb290c..c9d0ee2fd0e9a 100644
--- a/libc/startup/gpu/amdgpu/CMakeLists.txt
+++ b/libc/startup/gpu/amdgpu/CMakeLists.txt
@@ -1,5 +1,6 @@
 add_startup_object(
   crt1
+  NO_GPU_BUNDLE # Compile this file directly without special GPU handling.
   SRC
     start.cpp
   DEPENDS
@@ -10,12 +11,7 @@ add_startup_object(
   COMPILE_OPTIONS
     -ffreestanding # To avoid compiler warnings about calling the main function.
     -fno-builtin
-    -nogpulib # Do not include any GPU vendor libraries.
-    -mcpu=${LIBC_GPU_TARGET_ARCHITECTURE}
-    -emit-llvm # AMDGPU's intermediate object file format is bitcode.
     -mcode-object-version=${LIBC_GPU_CODE_OBJECT_VERSION} # Manually set the ABI.
-    --target=${LIBC_GPU_TARGET_TRIPLE}
-  NO_GPU_BUNDLE # Compile this file directly without special GPU handling.
 )
 get_fq_target_name(crt1 fq_name)
 
diff --git a/libc/startup/gpu/nvptx/CMakeLists.txt b/libc/startup/gpu/nvptx/CMakeLists.txt
index 49fa489c6129b..23a54516cc982 100644
--- a/libc/startup/gpu/nvptx/CMakeLists.txt
+++ b/libc/startup/gpu/nvptx/CMakeLists.txt
@@ -1,6 +1,6 @@
-get_nvptx_compile_options(nvptx_options ${LIBC_GPU_TARGET_ARCHITECTURE})
 add_startup_object(
   crt1
+  NO_GPU_BUNDLE # Compile this file directly without special GPU handling.
   SRC
     start.cpp
   DEPENDS
@@ -11,10 +11,6 @@ add_startup_object(
   COMPILE_OPTIONS
     -ffreestanding # To avoid compiler warnings about calling the main function.
     -fno-builtin
-    -nogpulib # Do not include any GPU vendor libraries.
-    --target=${LIBC_GPU_TARGET_TRIPLE}
-    ${nvptx_options}
-  NO_GPU_BUNDLE # Compile this file directly without special GPU handling.
 )
 get_fq_target_name(crt1 fq_name)
 
diff --git a/libc/test/IntegrationTest/CMakeLists.txt b/libc/test/IntegrationTest/CMakeLists.txt
index 3d32b6cb53be9..dca4c5a6f1b14 100644
--- a/libc/test/IntegrationTest/CMakeLists.txt
+++ b/libc/test/IntegrationTest/CMakeLists.txt
@@ -15,6 +15,7 @@ endif()
 
 add_object_library(
   test
+  NO_GPU_BUNDLE # Compile this file directly without special GPU handling.
   SRCS
     test.cpp
   COMPILE_OPTIONS
@@ -23,5 +24,4 @@ add_object_library(
     test.h
   DEPENDS
     libc.src.__support.OSUtil.osutil
-  NO_GPU_BUNDLE # Compile this file directly without special GPU handling.
 )



More information about the libc-commits mailing list