[libc-commits] [libc] 7dcdbab - [libc] add malloc funcs as external entrypoints
Michael Jones via libc-commits
libc-commits at lists.llvm.org
Wed Oct 27 10:21:08 PDT 2021
Author: Michael Jones
Date: 2021-10-27T10:21:01-07:00
New Revision: 7dcdbabb3b1501b90a51b36e8e4f4667b6902b8b
URL: https://github.com/llvm/llvm-project/commit/7dcdbabb3b1501b90a51b36e8e4f4667b6902b8b
DIFF: https://github.com/llvm/llvm-project/commit/7dcdbabb3b1501b90a51b36e8e4f4667b6902b8b.diff
LOG: [libc] add malloc funcs as external entrypoints
malloc, calloc, realloc, and free are all functions that other libc
functions depend on, but are pulled from external sources, instead of
having an internal implementation. This patch adds a way to include
functions like that as entrypoints in the list of external entrypoints,
and includes the malloc functions using this new path.
Reviewed By: sivachandra
Differential Revision: https://reviews.llvm.org/D112104
Added:
Modified:
libc/cmake/modules/LLVMLibCLibraryRules.cmake
libc/cmake/modules/LLVMLibCObjectRules.cmake
libc/config/linux/x86_64/entrypoints.txt
libc/lib/CMakeLists.txt
libc/spec/stdc.td
libc/src/stdlib/CMakeLists.txt
Removed:
################################################################################
diff --git a/libc/cmake/modules/LLVMLibCLibraryRules.cmake b/libc/cmake/modules/LLVMLibCLibraryRules.cmake
index a5dc8043651a8..14a2bc5f0406d 100644
--- a/libc/cmake/modules/LLVMLibCLibraryRules.cmake
+++ b/libc/cmake/modules/LLVMLibCLibraryRules.cmake
@@ -36,16 +36,23 @@ function(collect_object_file_deps target result)
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 <list of add_entrypoint_object targets>
-# EXT_DEPS <list of external object targets, no type checking is done>
# )
#
-# 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 @@ function(add_entrypoint_library target_name)
"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 @@ function(add_entrypoint_library target_name)
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 @@ function(add_entrypoint_library target_name)
list(APPEND objects $<TARGET_OBJECTS:${dep}>)
endforeach(dep)
- foreach(dep IN LISTS ENTRYPOINT_LIBRARY_EXT_DEPS)
- list(APPEND objects $<TARGET_OBJECTS:${dep}>)
- endforeach(dep)
-
add_library(
${target_name}
STATIC
diff --git a/libc/cmake/modules/LLVMLibCObjectRules.cmake b/libc/cmake/modules/LLVMLibCObjectRules.cmake
index 55761ee238fbb..69ec2160f1c0d 100644
--- a/libc/cmake/modules/LLVMLibCObjectRules.cmake
+++ b/libc/cmake/modules/LLVMLibCObjectRules.cmake
@@ -258,6 +258,36 @@ function(add_entrypoint_object target_name)
endfunction(add_entrypoint_object)
+set(ENTRYPOINT_EXT_TARGET_TYPE "ENTRYPOINT_EXT")
+
+# A rule for external entrypoint targets.
+# Usage:
+# add_entrypoint_external(
+# <target_name>
+# DEPENDS <list of dependencies>
+# )
+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
index 9ea7928faef2c..951e76fb83158 100644
--- a/libc/config/linux/x86_64/entrypoints.txt
+++ b/libc/config/linux/x86_64/entrypoints.txt
@@ -228,6 +228,19 @@ if(LLVM_LIBC_FULL_BUILD)
)
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
index 67fe75ea43472..c5d48e8480f77 100644
--- 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
index 4643154fdd8c0..f55f269ad3f96 100644
--- a/libc/spec/stdc.td
+++ b/libc/spec/stdc.td
@@ -513,6 +513,11 @@ def StdC : StandardSpec<"stdc"> {
FunctionSpec<"strtoul", RetValSpec<UnsignedLongType>, [ArgSpec<ConstCharRestrictedPtr>, ArgSpec<CharRestrictedPtrPtr>, ArgSpec<IntType>]>,
FunctionSpec<"strtoull", RetValSpec<UnsignedLongLongType>, [ArgSpec<ConstCharRestrictedPtr>, ArgSpec<CharRestrictedPtrPtr>, ArgSpec<IntType>]>,
+ FunctionSpec<"malloc", RetValSpec<VoidPtr>, [ArgSpec<SizeTType>]>,
+ FunctionSpec<"calloc", RetValSpec<VoidPtr>, [ArgSpec<SizeTType>, ArgSpec<SizeTType>]>,
+ FunctionSpec<"realloc", RetValSpec<VoidPtr>, [ArgSpec<VoidPtr>, ArgSpec<SizeTType>]>,
+ FunctionSpec<"free", RetValSpec<VoidType>, [ArgSpec<VoidPtr>]>,
+
FunctionSpec<"_Exit", RetValSpec<NoReturn>, [ArgSpec<IntType>]>,
]
>;
diff --git a/libc/src/stdlib/CMakeLists.txt b/libc/src/stdlib/CMakeLists.txt
index ab49c2ac6be45..3700d9a240952 100644
--- a/libc/src/stdlib/CMakeLists.txt
+++ b/libc/src/stdlib/CMakeLists.txt
@@ -181,6 +181,48 @@ add_entrypoint_object(
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()
More information about the libc-commits
mailing list