diff --git a/libc/cmake/modules/LLVMLibCLibraryRules.cmake b/libc/cmake/modules/LLVMLibCLibraryRules.cmake --- a/libc/cmake/modules/LLVMLibCLibraryRules.cmake +++ b/libc/cmake/modules/LLVMLibCLibraryRules.cmake @@ -36,16 +36,23 @@ set(${result} ${all_deps} PARENT_SCOPE) return() endif() + + if(${target_type} STREQUAL ${ENTRYPOINT_EXT_TARGET_TYPE}) + # It is not possible to recursively extract deps of external dependencies. + # So, we just accumulate the direct dep and return. + get_target_property(deps ${target} "DEPS") + set(${result} ${deps} PARENT_SCOPE) + return() + endif() endfunction(collect_object_file_deps) # A rule to build a library from a collection of entrypoint objects. # Usage: # add_entrypoint_library( # DEPENDS -# EXT_DEPS # ) # -# NOTE: If one wants an entrypoint to be availabe in a library, then they will +# NOTE: If one wants an entrypoint to be available in a library, then they will # have to list the entrypoint target explicitly in the DEPENDS list. Implicit # entrypoint dependencies will not be added to the library. function(add_entrypoint_library target_name) @@ -53,7 +60,7 @@ "ENTRYPOINT_LIBRARY" "" # No optional arguments "" # No single value arguments - "DEPENDS;EXT_DEPS" # Multi-value arguments + "DEPENDS" # Multi-value arguments ${ARGN} ) if(NOT ENTRYPOINT_LIBRARY_DEPENDS) @@ -65,9 +72,9 @@ set(all_deps "") foreach(dep IN LISTS fq_deps_list) get_target_property(dep_type ${dep} "TARGET_TYPE") - if(NOT (${dep_type} STREQUAL ${ENTRYPOINT_OBJ_TARGET_TYPE})) + if(NOT ((${dep_type} STREQUAL ${ENTRYPOINT_OBJ_TARGET_TYPE}) OR (${dep_type} STREQUAL ${ENTRYPOINT_EXT_TARGET_TYPE}))) message(FATAL_ERROR "Dependency '${dep}' of 'add_entrypoint_collection' is " - "not an 'add_entrypoint_object' target.") + "not an 'add_entrypoint_object' or 'add_entrypoint_external' target.") endif() collect_object_file_deps(${dep} recursive_deps) list(APPEND all_deps ${recursive_deps}) @@ -78,10 +85,6 @@ list(APPEND objects $) endforeach(dep) - foreach(dep IN LISTS ENTRYPOINT_LIBRARY_EXT_DEPS) - list(APPEND objects $) - endforeach(dep) - add_library( ${target_name} STATIC diff --git a/libc/cmake/modules/LLVMLibCObjectRules.cmake b/libc/cmake/modules/LLVMLibCObjectRules.cmake --- a/libc/cmake/modules/LLVMLibCObjectRules.cmake +++ b/libc/cmake/modules/LLVMLibCObjectRules.cmake @@ -258,6 +258,36 @@ endfunction(add_entrypoint_object) +set(ENTRYPOINT_EXT_TARGET_TYPE "ENTRYPOINT_EXT") + +# A rule for external entrypoint targets. +# Usage: +# add_entrypoint_external( +# +# DEPENDS +# ) +function(add_entrypoint_external target_name) + cmake_parse_arguments( + "ADD_ENTRYPOINT_EXT" + "" # No optional arguments + "" # No single value arguments + "DEPENDS" # Multi value arguments + ${ARGN} + ) + get_fq_target_name(${target_name} fq_target_name) + set(entrypoint_name ${target_name}) + + add_custom_target(${fq_target_name}) + set_target_properties( + ${fq_target_name} + PROPERTIES + "ENTRYPOINT_NAME" ${entrypoint_name} + "TARGET_TYPE" ${ENTRYPOINT_EXT_TARGET_TYPE} + "DEPS" "${ADD_ENTRYPOINT_EXT_DEPENDS}" + ) + +endfunction(add_entrypoint_external) + # Rule build a redirector object file. function(add_redirector_object target_name) cmake_parse_arguments( diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt --- a/libc/config/linux/x86_64/entrypoints.txt +++ b/libc/config/linux/x86_64/entrypoints.txt @@ -228,6 +228,19 @@ ) endif() +if(LLVM_LIBC_INCLUDE_SCUDO) + list(APPEND TARGET_LIBC_ENTRYPOINTS + + # stdlib.h external entrypoints + libc.src.stdlib.malloc + libc.src.stdlib.calloc + libc.src.stdlib.realloc + libc.src.stdlib.free + + + ) +endif() + set(TARGET_LLVMLIBC_ENTRYPOINTS ${TARGET_LIBC_ENTRYPOINTS} ${TARGET_LIBM_ENTRYPOINTS} diff --git a/libc/lib/CMakeLists.txt b/libc/lib/CMakeLists.txt --- a/libc/lib/CMakeLists.txt +++ b/libc/lib/CMakeLists.txt @@ -1,27 +1,7 @@ -set(SCUDO_DEPS "") - -if(LLVM_LIBC_INCLUDE_SCUDO) - include(../../compiler-rt/cmake/Modules/AllSupportedArchDefs.cmake) - if(NOT (LIBC_TARGET_ARCHITECTURE IN_LIST ALL_SCUDO_STANDALONE_SUPPORTED_ARCH)) - message(FATAL_ERROR "Architecture ${LIBC_TARGET_ARCHITECTURE} is not supported by SCUDO. -Either disable LLVM_LIBC_INCLUDE_SCUDO or change your target architecture.") - endif() - list(APPEND SCUDO_DEPS RTScudoStandalone.${LIBC_TARGET_ARCHITECTURE} RTScudoStandaloneCWrappers.${LIBC_TARGET_ARCHITECTURE}) - if((LIBC_TARGET_ARCHITECTURE IN_LIST ALL_GWP_ASAN_SUPPORTED_ARCH) AND COMPILER_RT_BUILD_GWP_ASAN) - list(APPEND SCUDO_DEPS RTGwpAsan.${LIBC_TARGET_ARCHITECTURE} - RTGwpAsanBacktraceLibc.${LIBC_TARGET_ARCHITECTURE} - RTGwpAsanSegvHandler.${LIBC_TARGET_ARCHITECTURE}) - elseif(COMPILER_RT_BUILD_GWP_ASAN) - message(WARNING "Architecture ${LIBC_TARGET_ARCHITECTURE} is not supported by GWP-ASan. Skipping.") - endif() -endif() - add_entrypoint_library( llvmlibc DEPENDS ${TARGET_LLVMLIBC_ENTRYPOINTS} - EXT_DEPS - ${SCUDO_DEPS} ) if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR) diff --git a/libc/spec/stdc.td b/libc/spec/stdc.td --- a/libc/spec/stdc.td +++ b/libc/spec/stdc.td @@ -513,6 +513,11 @@ FunctionSpec<"strtoul", RetValSpec, [ArgSpec, ArgSpec, ArgSpec]>, FunctionSpec<"strtoull", RetValSpec, [ArgSpec, ArgSpec, ArgSpec]>, + FunctionSpec<"malloc", RetValSpec, [ArgSpec]>, + FunctionSpec<"calloc", RetValSpec, [ArgSpec, ArgSpec]>, + FunctionSpec<"realloc", RetValSpec, [ArgSpec, ArgSpec]>, + FunctionSpec<"free", RetValSpec, [ArgSpec]>, + FunctionSpec<"_Exit", RetValSpec, [ArgSpec]>, ] >; diff --git a/libc/src/stdlib/CMakeLists.txt b/libc/src/stdlib/CMakeLists.txt --- a/libc/src/stdlib/CMakeLists.txt +++ b/libc/src/stdlib/CMakeLists.txt @@ -181,6 +181,48 @@ libc.include.stdlib ) +if(LLVM_LIBC_INCLUDE_SCUDO) + set(SCUDO_DEPS "") + + include(${LIBC_SOURCE_DIR}/../compiler-rt/cmake/Modules/AllSupportedArchDefs.cmake) + if(NOT (LIBC_TARGET_ARCHITECTURE IN_LIST ALL_SCUDO_STANDALONE_SUPPORTED_ARCH)) + message(FATAL_ERROR "Architecture ${LIBC_TARGET_ARCHITECTURE} is not supported by SCUDO. + Either disable LLVM_LIBC_INCLUDE_SCUDO or change your target architecture.") + endif() + list(APPEND SCUDO_DEPS RTScudoStandalone.${LIBC_TARGET_ARCHITECTURE} + RTScudoStandaloneCWrappers.${LIBC_TARGET_ARCHITECTURE}) + if((LIBC_TARGET_ARCHITECTURE IN_LIST ALL_GWP_ASAN_SUPPORTED_ARCH) + AND COMPILER_RT_BUILD_GWP_ASAN) + list(APPEND SCUDO_DEPS RTGwpAsan.${LIBC_TARGET_ARCHITECTURE} + RTGwpAsanBacktraceLibc.${LIBC_TARGET_ARCHITECTURE} + RTGwpAsanSegvHandler.${LIBC_TARGET_ARCHITECTURE}) + elseif(COMPILER_RT_BUILD_GWP_ASAN) + message(WARNING "Architecture ${LIBC_TARGET_ARCHITECTURE} is not supported by GWP-ASan. Skipping.") + endif() + + add_entrypoint_external( + malloc + DEPENDS + ${SCUDO_DEPS} + ) + add_entrypoint_external( + calloc + DEPENDS + ${SCUDO_DEPS} + ) + add_entrypoint_external( + realloc + DEPENDS + ${SCUDO_DEPS} + ) + add_entrypoint_external( + free + DEPENDS + ${SCUDO_DEPS} + ) + +endif() + if(NOT LLVM_LIBC_FULL_BUILD) return() endif()