Skip to content

Commit f6375b7

Browse files
committed
Generate i386 and x86_64 version of libsyscall MIG code
The libsyscall MIG code varies depending on the arch it's generated for, so we have to generate them for each source. New side effect: MIG now has a MIG_MULTIARCH option to generate sources for multiple architectures at once. The variable specifices a list of architectures to generate for.
1 parent 7031a57 commit f6375b7

File tree

4 files changed

+80
-46
lines changed

4 files changed

+80
-46
lines changed

cmake/mig.cmake

Lines changed: 44 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -35,43 +35,50 @@ function(mig defFileName)
3535
get_filename_component(bareName "${relativeName}" NAME)
3636
get_filename_component(dirName "${relativeName}" DIRECTORY)
3737

38-
#if ((NOT BITS) OR (BITS EQUAL 64))
39-
#if(NOT arch)
40-
# set(MIG_ARCH "x86-64")
41-
#else (NOT arch)
42-
# set (MIG_ARCH "${arch}")
43-
#endif(NOT arch)
44-
if (NOT MIG_ARCH)
45-
set(MIG_ARCH "i386")
46-
endif (NOT MIG_ARCH)
38+
if (NOT MIG_MULTIARCH)
39+
set(MIG_MULTIARCH_NO_SUFFIX 1)
40+
if (NOT MIG_ARCH)
41+
set(MIG_MULTIARCH "i386")
42+
else()
43+
set(MIG_MULTIARCH "${MIG_ARCH}")
44+
endif()
45+
endif()
4746

48-
add_custom_command(OUTPUT
49-
${CMAKE_CURRENT_BINARY_DIR}/${relativeName}${MIG_USER_SOURCE_SUFFIX}
50-
${CMAKE_CURRENT_BINARY_DIR}/${relativeName}${MIG_USER_HEADER_SUFFIX}
51-
${CMAKE_CURRENT_BINARY_DIR}/${relativeName}${MIG_SERVER_SOURCE_SUFFIX}
52-
${CMAKE_CURRENT_BINARY_DIR}/${relativeName}${MIG_SERVER_HEADER_SUFFIX}
53-
${CMAKE_CURRENT_BINARY_DIR}/${relativeName}${MIG_XTRACE_SUFFIX}
54-
COMMAND
55-
/bin/mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/${dirName} \;
56-
${MIG_EXECUTABLE}
57-
-arch ${MIG_ARCH}
58-
-target ${MIG_ARCH}
59-
-user ${CMAKE_CURRENT_BINARY_DIR}/${relativeName}${MIG_USER_SOURCE_SUFFIX}
60-
-header ${CMAKE_CURRENT_BINARY_DIR}/${relativeName}${MIG_USER_HEADER_SUFFIX}
61-
-server ${CMAKE_CURRENT_BINARY_DIR}/${relativeName}${MIG_SERVER_SOURCE_SUFFIX}
62-
-sheader ${CMAKE_CURRENT_BINARY_DIR}/${relativeName}${MIG_SERVER_HEADER_SUFFIX}
63-
-xtracemig ${CMAKE_CURRENT_BINARY_DIR}/${relativeName}${MIG_XTRACE_SUFFIX}
64-
${MIG_FLAGS}
65-
${CMAKE_CURRENT_SOURCE_DIR}/${defFileName}
66-
DEPENDS
67-
migexe migcom
68-
)
47+
foreach(MIG_ARCH ${MIG_MULTIARCH})
48+
if (MIG_MULTIARCH_NO_SUFFIX)
49+
set(MIG_ARCH_SUFFIX "")
50+
else()
51+
set(MIG_ARCH_SUFFIX "-${MIG_ARCH}-")
52+
endif()
6953

70-
if (NOT TARGET ${bareName}_xtrace_mig AND NOT MIG_NO_XTRACE)
71-
add_darling_library(${bareName}_xtrace_mig ${CMAKE_CURRENT_BINARY_DIR}/${relativeName}${MIG_XTRACE_SUFFIX})
72-
target_compile_options(${bareName}_xtrace_mig PRIVATE
73-
"-I" "${CMAKE_SOURCE_DIR}/src/xtrace/include"
74-
"-Wno-extern-initializer")
75-
install(TARGETS ${bareName}_xtrace_mig DESTINATION "libexec/darling/usr/lib/darling/xtrace-mig/")
76-
endif (NOT TARGET ${bareName}_xtrace_mig AND NOT MIG_NO_XTRACE)
54+
add_custom_command(OUTPUT
55+
${CMAKE_CURRENT_BINARY_DIR}/${relativeName}${MIG_ARCH_SUFFIX}${MIG_USER_SOURCE_SUFFIX}
56+
${CMAKE_CURRENT_BINARY_DIR}/${relativeName}${MIG_ARCH_SUFFIX}${MIG_USER_HEADER_SUFFIX}
57+
${CMAKE_CURRENT_BINARY_DIR}/${relativeName}${MIG_ARCH_SUFFIX}${MIG_SERVER_SOURCE_SUFFIX}
58+
${CMAKE_CURRENT_BINARY_DIR}/${relativeName}${MIG_ARCH_SUFFIX}${MIG_SERVER_HEADER_SUFFIX}
59+
${CMAKE_CURRENT_BINARY_DIR}/${relativeName}${MIG_ARCH_SUFFIX}${MIG_XTRACE_SUFFIX}
60+
COMMAND
61+
/bin/mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/${dirName} \;
62+
${MIG_EXECUTABLE}
63+
-arch ${MIG_ARCH}
64+
-target ${MIG_ARCH}
65+
-user ${CMAKE_CURRENT_BINARY_DIR}/${relativeName}${MIG_ARCH_SUFFIX}${MIG_USER_SOURCE_SUFFIX}
66+
-header ${CMAKE_CURRENT_BINARY_DIR}/${relativeName}${MIG_ARCH_SUFFIX}${MIG_USER_HEADER_SUFFIX}
67+
-server ${CMAKE_CURRENT_BINARY_DIR}/${relativeName}${MIG_ARCH_SUFFIX}${MIG_SERVER_SOURCE_SUFFIX}
68+
-sheader ${CMAKE_CURRENT_BINARY_DIR}/${relativeName}${MIG_ARCH_SUFFIX}${MIG_SERVER_HEADER_SUFFIX}
69+
-xtracemig ${CMAKE_CURRENT_BINARY_DIR}/${relativeName}${MIG_ARCH_SUFFIX}${MIG_XTRACE_SUFFIX}
70+
${MIG_FLAGS}
71+
${CMAKE_CURRENT_SOURCE_DIR}/${defFileName}
72+
DEPENDS
73+
migexe migcom
74+
)
75+
76+
if (NOT TARGET ${bareName}_xtrace_mig AND NOT MIG_NO_XTRACE)
77+
add_darling_library(${bareName}_xtrace_mig ${CMAKE_CURRENT_BINARY_DIR}/${relativeName}${MIG_ARCH_SUFFIX}${MIG_XTRACE_SUFFIX})
78+
target_compile_options(${bareName}_xtrace_mig PRIVATE
79+
"-I" "${CMAKE_SOURCE_DIR}/src/xtrace/include"
80+
"-Wno-extern-initializer")
81+
install(TARGETS ${bareName}_xtrace_mig DESTINATION "libexec/darling/usr/lib/darling/xtrace-mig/")
82+
endif (NOT TARGET ${bareName}_xtrace_mig AND NOT MIG_NO_XTRACE)
83+
endforeach()
7784
endfunction(mig)

src/dyld/CMakeLists.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,19 +127,19 @@ set_property(TARGET system_loader APPEND_STRING PROPERTY
127127
set_property(TARGET system_loader APPEND_STRING PROPERTY LINK_FLAGS " -Wl,-dylinker -Wl,-dead_strip -Wl,-data_const -nostdlib -Wl,-e,__dyld_start -Wl,-fixup_chains -Wl,-image_base,0x1fe00000 -Wl,-exported_symbols_list,${CMAKE_CURRENT_SOURCE_DIR}/src/dyld.exp")
128128
target_link_libraries(system_loader libc_static system_blocks_static
129129
cxx_static
130-
unwind_static system_kernel_static system_m_static cxxabi_static
130+
unwind_static system_m_static cxxabi_static
131131
keymgr_static system_duct_static
132132
pthread_static macho_static
133133
system_trace_static
134134
corecrypto_static
135135
)
136136

137137
if (BUILD_TARGET_32BIT)
138-
target_link_libraries(system_loader libc_static32 compiler_rt_static32 platform_static32)
138+
target_link_libraries(system_loader libc_static32 compiler_rt_static32 platform_static32 system_kernel_static32)
139139
endif (BUILD_TARGET_32BIT)
140140

141141
if (BUILD_TARGET_64BIT)
142-
target_link_libraries(system_loader libc_static64 compiler_rt_static64 platform_static64)
142+
target_link_libraries(system_loader libc_static64 compiler_rt_static64 platform_static64 system_kernel_static64)
143143
endif (BUILD_TARGET_64BIT)
144144

145145
make_fat(system_loader)

src/kernel/CMakeLists.txt

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ add_subdirectory(libsyscall)
3636
set(DYLIB_INSTALL_NAME "/usr/lib/system/libsystem_kernel.dylib")
3737
add_circular(system_kernel FAT
3838
OBJECTS
39+
$<TARGET_OBJECTS:libsyscall_32>
40+
$<TARGET_OBJECTS:libsyscall_64>
3941
$<TARGET_OBJECTS:libsyscall>
4042
$<TARGET_OBJECTS:libsyscall_dynamic>
4143
#$<TARGET_OBJECTS:kqueue>
@@ -49,12 +51,19 @@ add_circular(system_kernel FAT
4951
#target_link_libraries(system_kernel system_duct platform_static32 platform_static64)
5052
make_fat(system_kernel)
5153

52-
add_library(system_kernel_static STATIC
54+
add_library(system_kernel_static32 STATIC
55+
$<TARGET_OBJECTS:libsyscall_32>
5356
$<TARGET_OBJECTS:libsyscall>
54-
#$<TARGET_OBJECTS:libsyscall_static>
55-
#$<TARGET_OBJECTS:kqueue>
5657
$<TARGET_OBJECTS:emulation_dyld>
57-
$<TARGET_OBJECTS:mach_server_client_dyld>)
58+
$<TARGET_OBJECTS:mach_server_client_dyld>
59+
)
60+
61+
add_library(system_kernel_static64 STATIC
62+
$<TARGET_OBJECTS:libsyscall_64>
63+
$<TARGET_OBJECTS:libsyscall>
64+
$<TARGET_OBJECTS:emulation_dyld>
65+
$<TARGET_OBJECTS:mach_server_client_dyld>
66+
)
5867

5968
install(TARGETS system_kernel DESTINATION libexec/darling/usr/lib/system)
6069

src/kernel/libsyscall/CMakeLists.txt

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ set(LIBSYSCALL_MIGS_INTERNAL
4848
)
4949

5050
set(syscall_mig_sources "")
51+
set(syscall_mig_sources_32 "")
52+
set(syscall_mig_sources_64 "")
5153
set(syscall_mig_headers "")
5254
set(syscall_mig_internal_headers "")
5355

@@ -71,6 +73,7 @@ create_symlink(
7173
)
7274

7375
remove_definitions(-DLIBSYSCALL_INTERFACE=1)
76+
set(MIG_MULTIARCH i386 x86_64)
7477
set(MIG_USER_HEADER_SUFFIX "_unused_user.h")
7578
set(MIG_USER_SOURCE_SUFFIX)
7679
set(MIG_SERVER_HEADER_SUFFIX)
@@ -80,7 +83,8 @@ set(MIG_NO_XTRACE)
8083
foreach(MIG_FILENAME IN LISTS LIBSYSCALL_MIGS)
8184
mig("${MIG_FILENAME}.defs")
8285

83-
list(APPEND syscall_mig_sources "${CMAKE_CURRENT_BINARY_DIR}/${MIG_FILENAME}User.c")
86+
list(APPEND syscall_mig_sources_32 "${CMAKE_CURRENT_BINARY_DIR}/${MIG_FILENAME}-i386-User.c")
87+
list(APPEND syscall_mig_sources_64 "${CMAKE_CURRENT_BINARY_DIR}/${MIG_FILENAME}-x86_64-User.c")
8488

8589
get_filename_component(MIG_HEADER_DIR ${MIG_FILENAME} DIRECTORY)
8690

@@ -92,8 +96,10 @@ foreach(MIG_FILENAME IN LISTS LIBSYSCALL_MIGS)
9296
endforeach()
9397

9498
# mach/exc also needs the server component
95-
list(APPEND syscall_mig_sources "${CMAKE_CURRENT_BINARY_DIR}/mach/excServer.c")
99+
list(APPEND syscall_mig_sources_32 "${CMAKE_CURRENT_BINARY_DIR}/mach/exc-i386-Server.c")
100+
list(APPEND syscall_mig_sources_64 "${CMAKE_CURRENT_BINARY_DIR}/mach/exc-x86_64-Server.c")
96101

102+
unset(MIG_MULTIARCH)
97103
set(MIG_USER_HEADER_SUFFIX "_internal.h")
98104
set(MIG_USER_SOURCE_SUFFIX "_unused_internal_user.c")
99105
set(MIG_SERVER_HEADER_SUFFIX "_unused_internal_server.h")
@@ -706,6 +712,18 @@ add_compile_options(
706712
-momit-leaf-frame-pointer
707713
)
708714

715+
add_darling_object_library(libsyscall_32 32BIT_ONLY ${syscall_mig_sources_32})
716+
add_dependencies(libsyscall_32
717+
libsyscall_generate_mig_headers
718+
libsyscall_generate_mig_internal_headers
719+
)
720+
721+
add_darling_object_library(libsyscall_64 64BIT_ONLY ${syscall_mig_sources_64})
722+
add_dependencies(libsyscall_64
723+
libsyscall_generate_mig_headers
724+
libsyscall_generate_mig_internal_headers
725+
)
726+
709727
add_darling_object_library(libsyscall ${syscall_sources})
710728
add_dependencies(libsyscall
711729
libsyscall_generate_mig_headers

0 commit comments

Comments
 (0)