Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
<NativeLibrary Include="@(NetCoreAppNativeLibrary->'$(IlcFrameworkNativePath)lib%(Identity).a')" />
<NativeLibrary Include="$(IlcSdkPath)libbootstrapper.o" Condition="'$(NativeLib)' == '' and '$(CustomNativeMain)' != 'true'" />
<NativeLibrary Include="$(IlcSdkPath)libbootstrapperdll.o" Condition="'$(NativeLib)' != '' or '$(CustomNativeMain)' == 'true'" />
<NativeLibrary Include="$(IlcSdkPath)libPortableRuntime.a" />
<NativeLibrary Include="$(IlcSdkPath)libRuntime.WorkstationGC.a" />
<NativeLibrary Include="$(IlcSdkPath)$(EventPipeName).a" />
<NativeLibrary Include="$(IlcSdkPath)libstandalonegc-disabled.a" />
<NativeLibrary Include="$(IlcSdkPath)libaotminipal.a" />
Expand Down
310 changes: 254 additions & 56 deletions src/coreclr/nativeaot/Runtime/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
project(Runtime)

set(FEATURE_PORTABLE_HELPERS 0)
Comment thread
MichalStrehovsky marked this conversation as resolved.
Resolved
if(CLR_CMAKE_TARGET_ARCH_WASM)
set(FEATURE_PORTABLE_HELPERS 1)
endif()

set(GC_DIR ../../gc)

set(GC_WKS_SVR_SOURCES
Expand Down Expand Up @@ -88,9 +95,11 @@ set(STANDALONEGC_ENABLED_SOURCES
clrgc.enabled.cpp
)

set(FULL_RUNTIME_SOURCES
ThunksMapping.cpp
)
if(FEATURE_PORTABLE_HELPERS)
list(APPEND COMMON_RUNTIME_SOURCES ${RUNTIME_DIR}/portable/AllocFast.cpp)
else()
list(APPEND COMMON_RUNTIME_SOURCES ThunksMapping.cpp)
endif()

include_directories(inc)

Expand Down Expand Up @@ -146,15 +155,17 @@ if (WIN32)
${GC_DIR}/windows/gcenv.windows.cpp
)

list(APPEND FULL_RUNTIME_SOURCES windows/CoffNativeCodeManager.cpp)

if(CLR_CMAKE_TARGET_ARCH_ARM64)
list(APPEND FULL_RUNTIME_SOURCES
../../unwinder/arm64/unwinder.cpp
)
include_directories(../../inc)
include_directories(../../unwinder)
include_directories(../../unwinder/arm64)
if(NOT FEATURE_PORTABLE_HELPERS)
list(APPEND COMMON_RUNTIME_SOURCES windows/CoffNativeCodeManager.cpp)

if(CLR_CMAKE_TARGET_ARCH_ARM64)
list(APPEND COMMON_RUNTIME_SOURCES
../../unwinder/arm64/unwinder.cpp
)
include_directories(../../inc)
include_directories(../../unwinder)
include_directories(../../unwinder/arm64)
endif()
endif()

set(ASM_SUFFIX asm)
Expand Down Expand Up @@ -221,35 +232,37 @@ else()
)
endif()

list(APPEND FULL_RUNTIME_SOURCES
unix/HardwareExceptions.cpp
unix/NativeContext.cpp
unix/UnixSignals.cpp
unix/UnwindHelpers.cpp
unix/UnixNativeCodeManager.cpp
)

include(${CLR_SRC_NATIVE_DIR}/external/llvm-libunwind.cmake)

set(NATIVEAOT_LOCALIZE_LIBUNWIND_SYMBOLS OFF)
if(CLR_CMAKE_TARGET_UNIX AND NOT CLR_CMAKE_TARGET_APPLE AND NOT CLR_CMAKE_TARGET_ARCH_WASM)
set(NATIVEAOT_LOCALIZE_LIBUNWIND_SYMBOLS ON)
endif()

if(NATIVEAOT_LOCALIZE_LIBUNWIND_SYMBOLS)
# Build the bundled libunwind implementation and the runtime unwinder code
# that references it into one relocatable object. The runtime sources are
# part of the partial link so their references to libunwind's implementation
# symbols are resolved before those symbols are localized.
set(NATIVEAOT_PRIVATE_LIBUNWIND_SOURCES
if(NOT FEATURE_PORTABLE_HELPERS)
list(APPEND COMMON_RUNTIME_SOURCES
unix/HardwareExceptions.cpp
unix/NativeContext.cpp
unix/UnixSignals.cpp
unix/UnwindHelpers.cpp
unix/UnixNativeCodeManager.cpp
${LLVM_LIBUNWIND_SOURCES}
${LLVM_LIBUNWIND_ASM_SOURCES})
list(REMOVE_ITEM FULL_RUNTIME_SOURCES unix/UnwindHelpers.cpp unix/UnixNativeCodeManager.cpp)
else()
list(APPEND FULL_RUNTIME_SOURCES ${LLVM_LIBUNWIND_SOURCES})
set(RUNTIME_SOURCES_ARCH_ASM ${LLVM_LIBUNWIND_ASM_SOURCES})
)

include(${CLR_SRC_NATIVE_DIR}/external/llvm-libunwind.cmake)

set(NATIVEAOT_LOCALIZE_LIBUNWIND_SYMBOLS OFF)
if(CLR_CMAKE_TARGET_UNIX AND NOT CLR_CMAKE_TARGET_APPLE AND NOT CLR_CMAKE_TARGET_ARCH_WASM)
set(NATIVEAOT_LOCALIZE_LIBUNWIND_SYMBOLS ON)
endif()

if(NATIVEAOT_LOCALIZE_LIBUNWIND_SYMBOLS)
# Build the bundled libunwind implementation and the runtime unwinder code
# that references it into one relocatable object. The runtime sources are
# part of the partial link so their references to libunwind's implementation
# symbols are resolved before those symbols are localized.
set(NATIVEAOT_PRIVATE_LIBUNWIND_SOURCES
unix/UnwindHelpers.cpp
unix/UnixNativeCodeManager.cpp
${LLVM_LIBUNWIND_SOURCES}
${LLVM_LIBUNWIND_ASM_SOURCES})
list(REMOVE_ITEM COMMON_RUNTIME_SOURCES unix/UnwindHelpers.cpp unix/UnixNativeCodeManager.cpp)
else()
list(APPEND COMMON_RUNTIME_SOURCES ${LLVM_LIBUNWIND_SOURCES})
set(RUNTIME_SOURCES_ARCH_ASM ${LLVM_LIBUNWIND_ASM_SOURCES})
endif()
endif()

set(ASM_SUFFIX S)
Expand Down Expand Up @@ -291,16 +304,24 @@ if (CLR_CMAKE_TARGET_ARCH_ARM64 OR CLR_CMAKE_TARGET_ARCH_AMD64)
)
endif (CLR_CMAKE_TARGET_ARCH_ARM64 OR CLR_CMAKE_TARGET_ARCH_AMD64)

list(APPEND RUNTIME_SOURCES_ARCH_ASM
${RUNTIME_DIR}/${ARCH_SOURCES_DIR}/AllocFast.${ASM_SUFFIX}
${ARCH_SOURCES_DIR}/DispatchResolve.${ASM_SUFFIX}
${ARCH_SOURCES_DIR}/ExceptionHandling.${ASM_SUFFIX}
${ARCH_SOURCES_DIR}/GcProbe.${ASM_SUFFIX}
${RUNTIME_DIR}/${ARCH_SOURCES_DIR}/MiscStubs.${ASM_SUFFIX}
${ARCH_SOURCES_DIR}/PInvoke.${ASM_SUFFIX}
${ARCH_SOURCES_DIR}/UniversalTransition.${ASM_SUFFIX}
${RUNTIME_DIR}/${ARCH_SOURCES_DIR}/WriteBarriers.${ASM_SUFFIX}
)
if(NOT FEATURE_PORTABLE_HELPERS)
list(APPEND RUNTIME_SOURCES_ARCH_ASM
${RUNTIME_DIR}/${ARCH_SOURCES_DIR}/AllocFast.${ASM_SUFFIX}
${ARCH_SOURCES_DIR}/DispatchResolve.${ASM_SUFFIX}
${ARCH_SOURCES_DIR}/ExceptionHandling.${ASM_SUFFIX}
${ARCH_SOURCES_DIR}/GcProbe.${ASM_SUFFIX}
${RUNTIME_DIR}/${ARCH_SOURCES_DIR}/MiscStubs.${ASM_SUFFIX}
${ARCH_SOURCES_DIR}/PInvoke.${ASM_SUFFIX}
${ARCH_SOURCES_DIR}/UniversalTransition.${ASM_SUFFIX}
${RUNTIME_DIR}/${ARCH_SOURCES_DIR}/WriteBarriers.${ASM_SUFFIX}
)

if(CLR_CMAKE_TARGET_APPLE)
list(APPEND RUNTIME_SOURCES_ARCH_ASM
${ARCH_SOURCES_DIR}/ThunkPoolThunks.${ASM_SUFFIX}
)
endif()
endif()

# Add architecture specific folder for looking up headers.
convert_to_absolute_path(ARCH_SOURCES_DIR ${ARCH_SOURCES_DIR})
Expand Down Expand Up @@ -379,7 +400,6 @@ set(NATIVEAOT_RUNTIME_DIR ${CMAKE_CURRENT_SOURCE_DIR})
list(APPEND COMMON_RUNTIME_SOURCES ${GC_HEADERS})

convert_to_absolute_path(COMMON_RUNTIME_SOURCES ${COMMON_RUNTIME_SOURCES})
convert_to_absolute_path(FULL_RUNTIME_SOURCES ${FULL_RUNTIME_SOURCES})
convert_to_absolute_path(GC_WKS_SVR_SOURCES ${GC_WKS_SVR_SOURCES})
convert_to_absolute_path(STANDALONEGC_DISABLED_SOURCES ${STANDALONEGC_DISABLED_SOURCES})
convert_to_absolute_path(STANDALONEGC_ENABLED_SOURCES ${STANDALONEGC_ENABLED_SOURCES})
Expand All @@ -388,12 +408,6 @@ convert_to_absolute_path(RUNTIME_SOURCES_ARCH_ASM ${RUNTIME_SOURCES_ARCH_ASM})
convert_to_absolute_path(VXSORT_SOURCES ${VXSORT_SOURCES})
convert_to_absolute_path(DUMMY_VXSORT_SOURCES ${DUMMY_VXSORT_SOURCES})

if(NOT CLR_CMAKE_TARGET_ARCH_WASM)
add_subdirectory(Full)
else()
add_subdirectory(Portable)
endif()

if(FEATURE_PERFTRACING)
add_subdirectory(eventpipe)
endif()
Expand All @@ -407,3 +421,187 @@ if(NOT CLR_CMAKE_TARGET_ARCH_WASM)

add_subdirectory(datadescriptor)
endif()

if(FEATURE_PORTABLE_HELPERS)
add_definitions(-DFEATURE_PORTABLE_HELPERS)
else()
set(CMAKE_INCLUDE_CURRENT_DIR ON)

if(NOT CLR_CMAKE_TARGET_APPLE)
add_definitions(-DFEATURE_RX_THUNKS)
endif()

if(CLR_CMAKE_TARGET_WIN32 AND CLR_CMAKE_HOST_ARCH_ARM64)
# Needed to include AsmOffsets.inc
include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR})
preprocess_files(RUNTIME_SOURCES_ARCH_ASM ${RUNTIME_SOURCES_ARCH_ASM})
endif()
endif()

if(NATIVEAOT_PRIVATE_LIBUNWIND_SOURCES)
add_library(Runtime.PrivateLibunwind OBJECT ${NATIVEAOT_PRIVATE_LIBUNWIND_SOURCES})

set(NATIVEAOT_PRIVATE_LIBUNWIND_OBJECT "${CMAKE_CURRENT_BINARY_DIR}/Runtime.PrivateLibunwind.o")
set(NATIVEAOT_PRIVATE_LIBUNWIND_SYMBOLS "${CMAKE_CURRENT_BINARY_DIR}/Runtime.PrivateLibunwind.localize")
set(NATIVEAOT_PRIVATE_LIBUNWIND_SYMBOLS_UNSORTED "${CMAKE_CURRENT_BINARY_DIR}/Runtime.PrivateLibunwind.localize.unsorted")
# The relocatable object includes runtime-owned objects so their references to
# libunwind implementation symbols are resolved before localization. The
# localize list is generated only from the bundled libunwind source objects.
set(NATIVEAOT_PRIVATE_LIBUNWIND_SYMBOL_OBJECTS "$<FILTER:$<TARGET_OBJECTS:Runtime.PrivateLibunwind>,EXCLUDE,.*(UnwindHelpers|UnixNativeCodeManager)\\.cpp\\.o$>")

add_custom_command(
OUTPUT "${NATIVEAOT_PRIVATE_LIBUNWIND_OBJECT}"
COMMAND "${CMAKE_COMMAND}" -E rm -f
"${NATIVEAOT_PRIVATE_LIBUNWIND_OBJECT}"
"${NATIVEAOT_PRIVATE_LIBUNWIND_SYMBOLS_UNSORTED}"
# Generate the objcopy symbol list from libunwind-owned object files only.
COMMAND sh -c "nm_tool=\"$1\" && shift && \"$nm_tool\" --extern-only --defined-only --format=just-symbols \"$@\" > \"$0\""
"${NATIVEAOT_PRIVATE_LIBUNWIND_SYMBOLS_UNSORTED}"
"${CMAKE_NM}"
${NATIVEAOT_PRIVATE_LIBUNWIND_SYMBOL_OBJECTS}
COMMAND sort -u -o
"${NATIVEAOT_PRIVATE_LIBUNWIND_SYMBOLS}"
"${NATIVEAOT_PRIVATE_LIBUNWIND_SYMBOLS_UNSORTED}"
COMMAND "${CMAKE_COMMAND}" -E rm -f
"${NATIVEAOT_PRIVATE_LIBUNWIND_SYMBOLS_UNSORTED}"
COMMAND "${CMAKE_LINKER}" -r $<TARGET_OBJECTS:Runtime.PrivateLibunwind> -o "${NATIVEAOT_PRIVATE_LIBUNWIND_OBJECT}"
COMMAND "${CMAKE_OBJCOPY}"
"--localize-symbols=${NATIVEAOT_PRIVATE_LIBUNWIND_SYMBOLS}"
"${NATIVEAOT_PRIVATE_LIBUNWIND_OBJECT}"
DEPENDS
Runtime.PrivateLibunwind
$<TARGET_OBJECTS:Runtime.PrivateLibunwind>
BYPRODUCTS "${NATIVEAOT_PRIVATE_LIBUNWIND_SYMBOLS}"
COMMENT "Privatizing NativeAOT libunwind symbols"
COMMAND_EXPAND_LISTS
VERBATIM
)
set_source_files_properties("${NATIVEAOT_PRIVATE_LIBUNWIND_OBJECT}" PROPERTIES
EXTERNAL_OBJECT TRUE
GENERATED TRUE)
endif()

get_compile_definitions(DEFINITIONS)
set(ASM_OFFSETS_CSPP ${NATIVEAOT_RUNTIME_DIR}/../Runtime.Base/src/AsmOffsets.cspp)

if(WIN32)
set(COMPILER_LANGUAGE "")
set(PREPROCESSOR_FLAGS -EP -nologo)
set(ASM_OFFSETS_CPP ${NATIVEAOT_RUNTIME_DIR}/windows/AsmOffsets.cpp)
else()
set(COMPILER_LANGUAGE -x c++)
set(PREPROCESSOR_FLAGS -E -P)
set(ASM_OFFSETS_CPP ${NATIVEAOT_RUNTIME_DIR}/unix/AsmOffsets.cpp)
endif()

if(NOT FEATURE_PORTABLE_HELPERS)
add_custom_command(
COMMAND ${CMAKE_CXX_COMPILER} ${DEFINITIONS} ${PREPROCESSOR_FLAGS} -I"${NATIVEAOT_RUNTIME_DIR}" -I"${ARCH_SOURCES_DIR}" "${ASM_OFFSETS_CPP}" >"${CMAKE_CURRENT_BINARY_DIR}/AsmOffsets.inc"
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/AsmOffsets.inc"
DEPENDS "${ASM_OFFSETS_CPP}" "${NATIVEAOT_RUNTIME_DIR}/AsmOffsets.h"
COMMENT "Generating AsmOffsets.inc"
)

set_source_files_properties("${CMAKE_CURRENT_BINARY_DIR}/AsmOffsets.inc" PROPERTIES GENERATED TRUE)

# Both runtime archives share AsmOffsets.inc and the assembler helpers.
add_custom_target(
RuntimeAsmHelpers
DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/AsmOffsets.inc"
)

add_library(Runtime.AsmHelpers OBJECT ${RUNTIME_SOURCES_ARCH_ASM})
add_dependencies(Runtime.AsmHelpers RuntimeAsmHelpers)
endif()

add_library(Runtime.GC.Workstation OBJECT ${GC_WKS_SVR_SOURCES})
if(FEATURE_PERFTRACING)
add_dependencies(Runtime.GC.Workstation aot_eventing_headers)
endif()
set_target_properties(Runtime.GC.Workstation PROPERTIES UNITY_BUILD ON UNITY_BUILD_BATCH_SIZE 0)
if(CLR_CMAKE_TARGET_WIN32)
# GC objects are archived into the runtime libraries and must not reference an external compiler PDB.
set_target_properties(Runtime.GC.Workstation PROPERTIES MSVC_DEBUG_INFORMATION_FORMAT Embedded)
endif()

add_library(Runtime.WorkstationGC STATIC
${COMMON_RUNTIME_SOURCES}
${NATIVEAOT_PRIVATE_LIBUNWIND_OBJECT}
$<TARGET_OBJECTS:Runtime.GC.Workstation>)
if(FEATURE_PERFTRACING)
add_dependencies(Runtime.WorkstationGC aot_eventing_headers)
endif()
target_link_libraries(Runtime.WorkstationGC PRIVATE aotminipal)
if(NOT CLR_CMAKE_TARGET_ARCH_WASM)
target_link_libraries(Runtime.WorkstationGC PRIVATE nativeaot_cdac_contract_descriptor nativeaot_gc_wks_descriptor)
endif()
if(NOT FEATURE_PORTABLE_HELPERS)
target_link_libraries(Runtime.WorkstationGC PRIVATE Runtime.AsmHelpers)
endif()
Comment thread
jkotas marked this conversation as resolved.
Resolved
install_static_library(Runtime.WorkstationGC aotsdk nativeaot)

if(FEATURE_MULTITHREADING AND NOT CLR_CMAKE_TARGET_ARCH_WASM)
add_library(Runtime.GC.Server OBJECT ${GC_WKS_SVR_SOURCES})
if(FEATURE_PERFTRACING)
add_dependencies(Runtime.GC.Server aot_eventing_headers)
endif()
target_compile_definitions(Runtime.GC.Server PRIVATE FEATURE_SVR_GC SERVER_GC)
set_target_properties(Runtime.GC.Server PROPERTIES UNITY_BUILD ON UNITY_BUILD_BATCH_SIZE 0)
if(CLR_CMAKE_TARGET_WIN32)
set_target_properties(Runtime.GC.Server PROPERTIES MSVC_DEBUG_INFORMATION_FORMAT Embedded)
endif()

add_library(Runtime.ServerGC STATIC
${COMMON_RUNTIME_SOURCES}
${NATIVEAOT_PRIVATE_LIBUNWIND_OBJECT}
$<TARGET_OBJECTS:Runtime.GC.Workstation>
$<TARGET_OBJECTS:Runtime.GC.Server>)
if(FEATURE_PERFTRACING)
add_dependencies(Runtime.ServerGC aot_eventing_headers)
endif()
target_link_libraries(Runtime.ServerGC PRIVATE aotminipal nativeaot_cdac_contract_descriptor nativeaot_gc_wks_descriptor nativeaot_gc_svr_descriptor Runtime.AsmHelpers)
target_compile_definitions(Runtime.ServerGC PRIVATE FEATURE_SVR_GC)
install_static_library(Runtime.ServerGC aotsdk nativeaot)
endif()

add_library(standalonegc-disabled STATIC ${STANDALONEGC_DISABLED_SOURCES})
if(FEATURE_PERFTRACING)
add_dependencies(standalonegc-disabled aot_eventing_headers)
endif()
if(FEATURE_EVENT_TRACE AND CLR_CMAKE_TARGET_WIN32)
add_dependencies(standalonegc-disabled aot_etw_headers)
endif()
Comment thread
jkotas marked this conversation as resolved.
Resolved
install_static_library(standalonegc-disabled aotsdk nativeaot)

if(NOT CLR_CMAKE_TARGET_ARCH_WASM)
add_library(standalonegc-enabled STATIC ${STANDALONEGC_ENABLED_SOURCES})
if(FEATURE_PERFTRACING)
add_dependencies(standalonegc-enabled aot_eventing_headers)
endif()
if(FEATURE_EVENT_TRACE AND CLR_CMAKE_TARGET_WIN32)
add_dependencies(standalonegc-enabled aot_etw_headers)
endif()
install_static_library(standalonegc-enabled aotsdk nativeaot)
endif()

if(CLR_CMAKE_TARGET_ARCH_ARM64 OR CLR_CMAKE_TARGET_ARCH_AMD64)
add_library(Runtime.VxsortEnabled STATIC ${VXSORT_SOURCES})
add_library(Runtime.VxsortDisabled STATIC ${DUMMY_VXSORT_SOURCES})
install_static_library(Runtime.VxsortEnabled aotsdk nativeaot)
install_static_library(Runtime.VxsortDisabled aotsdk nativeaot)
endif()

if(CLR_CMAKE_TARGET_WIN32)
set_target_properties(aotminipal PROPERTIES
COMPILE_PDB_NAME "aotminipal"
COMPILE_PDB_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>")
endif()
install_static_library(aotminipal aotsdk nativeaot)

add_custom_command(
# AsmOffsets.cs is consumed later by the managed build.
TARGET Runtime.WorkstationGC
POST_BUILD
COMMAND ${CMAKE_CXX_COMPILER} ${COMPILER_LANGUAGE} ${DEFINITIONS} ${PREPROCESSOR_FLAGS}
-I"${ARCH_SOURCES_DIR}" "${ASM_OFFSETS_CSPP}" >"${CMAKE_CURRENT_BINARY_DIR}/AsmOffsets.cs"
)
Loading
Loading