Skip to content

Commit 768ead0

Browse files
author
Siva Chandra Reddy
committed
[libc] Add a new rule add_object.
This rule can help add targets to generate special object files like the crt1.o on linux. Also, it can be used to add specially compiled object stubs which are to be linked into the entrypoint objects. Reviewers: abrachet Differential Revision: https://reviews.llvm.org/D76271
1 parent 661c950 commit 768ead0

File tree

1 file changed

+68
-4
lines changed

1 file changed

+68
-4
lines changed

libc/cmake/modules/LLVMLibCRules.cmake

Lines changed: 68 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,58 @@ function(add_gen_header target_name)
9494
)
9595
endfunction(add_gen_header)
9696

97+
set(SINGLE_OBJECT_TARGET_TYPE "LIBC_SINGLE_OBJECT")
98+
99+
# Function to generate single object file.
100+
# Usage:
101+
# add_object(
102+
# <target_name>
103+
# SRC <source file to compile>
104+
# DEPENDS <list of dependencies>
105+
# COMPILE_OPTIONS <optional list of special compile options for this target>
106+
function(add_object target_name)
107+
cmake_parse_arguments(
108+
"ADD_OBJECT"
109+
"" # No option arguments
110+
"SRC" # Single value arguments
111+
"COMPILE_OPTIONS;DEPENDS" # Multivalue arguments
112+
${ARGN}
113+
)
114+
115+
if(NOT ADD_OBJECT_SRC)
116+
message(FATAL_ERROR "'add_object' rules requires a SRC to be specified.")
117+
endif()
118+
119+
add_library(
120+
${target_name}
121+
OBJECT
122+
${ADD_OBJECT_SRC}
123+
)
124+
target_include_directories(
125+
${target_name}
126+
PRIVATE
127+
"${LIBC_BUILD_DIR}/include;${LIBC_SOURCE_DIR};${LIBC_BUILD_DIR}"
128+
)
129+
if(ADD_OBJECT_COMPILE_OPTIONS)
130+
target_compile_options(
131+
${target_name}
132+
PRIVATE ${ADD_OBJECT_COMPILE_OPTIONS}
133+
)
134+
endif()
135+
if(ADD_OBJECT_DEPENDS)
136+
add_dependencies(
137+
${target_name}
138+
${ADD_OBJECT_DEPENDS}
139+
)
140+
endif()
141+
set_target_properties(
142+
${target_name}
143+
PROPERTIES
144+
"TARGET_TYPE" ${SINGLE_OBJECT_TARGET_TYPE}
145+
"OBJECT_FILE" $<TARGET_OBJECTS:${target_name}>
146+
)
147+
endfunction(add_object)
148+
97149
set(ENTRYPOINT_OBJ_TARGET_TYPE "ENTRYPOINT_OBJ")
98150

99151
# A rule for entrypoint object targets.
@@ -105,14 +157,15 @@ set(ENTRYPOINT_OBJ_TARGET_TYPE "ENTRYPOINT_OBJ")
105157
# SRCS <list of .cpp files>
106158
# HDRS <list of .h files>
107159
# DEPENDS <list of dependencies>
108-
# COMPILE_OPTIONS <list of special compile options for this target>
160+
# COMPILE_OPTIONS <optional list of special compile options for this target>
161+
# SPECIAL_OBJECTS <optional list of special object targets added by the rule `add_object`>
109162
# )
110163
function(add_entrypoint_object target_name)
111164
cmake_parse_arguments(
112165
"ADD_ENTRYPOINT_OBJ"
113166
"REDIRECTED" # Optional argument
114167
"NAME" # Single value arguments
115-
"SRCS;HDRS;DEPENDS;COMPILE_OPTIONS" # Multi value arguments
168+
"SRCS;HDRS;SPECIAL_OBJECTS;DEPENDS;COMPILE_OPTIONS" # Multi value arguments
116169
${ARGN}
117170
)
118171
if(NOT ADD_ENTRYPOINT_OBJ_SRCS)
@@ -166,10 +219,21 @@ function(add_entrypoint_object target_name)
166219
set(object_file_raw "${CMAKE_CURRENT_BINARY_DIR}/${target_name}_raw.o")
167220
set(object_file "${CMAKE_CURRENT_BINARY_DIR}/${target_name}.o")
168221

222+
set(input_objects $<TARGET_OBJECTS:${target_name}_objects>)
223+
if(ADD_ENTRYPOINT_OBJ_SPECIAL_OBJECTS)
224+
foreach(obj_target IN LISTS ADD_ENTRYPOINT_OBJ_SPECIAL_OBJECTS)
225+
get_target_property(obj_type ${obj_target} "TARGET_TYPE")
226+
if((NOT obj_type) OR (NOT (${obj_type} STREQUAL ${SINGLE_OBJECT_TARGET_TYPE})))
227+
message(FATAL_ERROR "Unexpected target type for 'SPECIAL_OBJECT' - should be a target introduced by the `add_object` rule.")
228+
endif()
229+
list(APPEND input_objects $<TARGET_OBJECTS:${obj_target}>)
230+
endforeach(obj_target)
231+
endif()
232+
169233
add_custom_command(
170234
OUTPUT ${object_file_raw}
171-
DEPENDS $<TARGET_OBJECTS:${target_name}_objects>
172-
COMMAND ${CMAKE_LINKER} -r $<TARGET_OBJECTS:${target_name}_objects> -o ${object_file_raw}
235+
DEPENDS ${input_objects}
236+
COMMAND ${CMAKE_LINKER} -r ${input_objects} -o ${object_file_raw}
173237
)
174238

175239
set(alias_attributes "0,function,global")

0 commit comments

Comments
 (0)