Linker: enhance pushpop-state detection

Fixes: #27822
This commit is contained in:
Marc Chevrier committed 2026-06-01 16:50:34 +02:00
1 parent dac8665889
commit 1ca1095736
20 files changed
+64 -18

No files matched your search

+1
View File
@@ -8,6 +8,7 @@ set(CMAKE_LINKER "@CMAKE_LINKER@")
set(CMAKE_LINKER_LINK "@CMAKE_LINKER_LINK@")
set(CMAKE_LINKER_LLD "@CMAKE_LINKER_LLD@")
set(CMAKE_ASM@ASM_DIALECT@_COMPILER_LINKER "@_CMAKE_ASM_COMPILER_LINKER@")
set(CMAKE_ASM@ASM_DIALECT@_COMPILER_LINKER_ARCHITECTURE_FLAGS "@_CMAKE_ASM_COMPILER_LINKER_ARCHITECTURE_FLAGS@")
set(CMAKE_ASM@ASM_DIALECT@_COMPILER_LINKER_ID "@_CMAKE_ASM_COMPILER_LINKER_ID@")
set(CMAKE_ASM@ASM_DIALECT@_COMPILER_LINKER_VERSION "@_CMAKE_ASM_COMPILER_LINKER_VERSION@")
set(CMAKE_ASM@ASM_DIALECT@_COMPILER_LINKER_FRONTEND_VARIANT "@_CMAKE_ASM_COMPILER_LINKER_FRONTEND_VARIANT@")
+1
View File
@@ -32,6 +32,7 @@ set(CMAKE_LINKER "@CMAKE_LINKER@")
set(CMAKE_LINKER_LINK "@CMAKE_LINKER_LINK@")
set(CMAKE_LINKER_LLD "@CMAKE_LINKER_LLD@")
set(CMAKE_C_COMPILER_LINKER "@CMAKE_C_COMPILER_LINKER@")
set(CMAKE_C_COMPILER_LINKER_ARCHITECTURE_FLAGS "@CMAKE_C_COMPILER_LINKER_ARCHITECTURE_FLAGS@")
set(CMAKE_C_COMPILER_LINKER_ID "@CMAKE_C_COMPILER_LINKER_ID@")
set(CMAKE_C_COMPILER_LINKER_VERSION "@CMAKE_C_COMPILER_LINKER_VERSION@")
set(CMAKE_C_COMPILER_LINKER_FRONTEND_VARIANT "@CMAKE_C_COMPILER_LINKER_FRONTEND_VARIANT@")
+1
View File
@@ -82,6 +82,7 @@ set(CMAKE_LINKER "@CMAKE_LINKER@")
set(CMAKE_LINKER_LINK "@CMAKE_LINKER_LINK@")
set(CMAKE_LINKER_LLD "@CMAKE_LINKER_LLD@")
set(CMAKE_CUDA_COMPILER_LINKER "@CMAKE_CUDA_COMPILER_LINKER@")
set(CMAKE_CUDA_COMPILER_LINKER_ARCHITECTURE_FLAGS "@CMAKE_CUDA_COMPILER_LINKER_ARCHITECTURE_FLAGS@")
set(CMAKE_CUDA_COMPILER_LINKER_ID "@CMAKE_CUDA_COMPILER_LINKER_ID@")
set(CMAKE_CUDA_COMPILER_LINKER_VERSION "@CMAKE_CUDA_COMPILER_LINKER_VERSION@")
set(CMAKE_CUDA_COMPILER_LINKER_FRONTEND_VARIANT "@CMAKE_CUDA_COMPILER_LINKER_FRONTEND_VARIANT@")
+1
View File
@@ -34,6 +34,7 @@ set(CMAKE_LINKER "@CMAKE_LINKER@")
set(CMAKE_LINKER_LINK "@CMAKE_LINKER_LINK@")
set(CMAKE_LINKER_LLD "@CMAKE_LINKER_LLD@")
set(CMAKE_CXX_COMPILER_LINKER "@CMAKE_CXX_COMPILER_LINKER@")
set(CMAKE_CXX_COMPILER_LINKER_ARCHITECTURE_FLAGS "@CMAKE_CXX_COMPILER_LINKER_ARCHITECTURE_FLAGS@")
set(CMAKE_CXX_COMPILER_LINKER_ID "@CMAKE_CXX_COMPILER_LINKER_ID@")
set(CMAKE_CXX_COMPILER_LINKER_VERSION "@CMAKE_CXX_COMPILER_LINKER_VERSION@")
set(CMAKE_CXX_COMPILER_LINKER_FRONTEND_VARIANT "@CMAKE_CXX_COMPILER_LINKER_FRONTEND_VARIANT@")
+6
View File
@@ -24,6 +24,7 @@ function(CMAKE_DETERMINE_COMPILER_ABI lang src)
CMAKE_${lang}_LIBRARY_ARCHITECTURE)
if (CMAKE_${lang}_COMPILER_LINKER)
list(APPEND abi_variables
CMAKE_${lang}_COMPILER_LINKER_ARCHITECTURE_FLAGS
CMAKE_${lang}_COMPILER_LINKER_ID
CMAKE_${lang}_COMPILER_LINKER_VERSION
CMAKE_${lang}_COMPILER_LINKER_FRONTEND_VARIANT)
@@ -331,6 +332,11 @@ function(CMAKE_DETERMINE_COMPILER_ABI lang src)
set(CMAKE_${lang}_COMPILER_LINKER "${linker_tool}" PARENT_SCOPE)
cmake_determine_linker_id(${lang} "${linker_tool}")
if(CMAKE_${lang}_COMPILER_LINKER_ID MATCHES "GNU|LLD|MOLD|WILD")
set(CMAKE_${lang}_COMPILER_LINKER_ARCHITECTURE_FLAGS "${linker_tool_ARCH_FLAGS}" PARENT_SCOPE)
else()
set(CMAKE_${lang}_COMPILER_LINKER_ARCHITECTURE_FLAGS "" PARENT_SCOPE)
endif()
set(CMAKE_${lang}_COMPILER_LINKER_ID "${CMAKE_${lang}_COMPILER_LINKER_ID}" PARENT_SCOPE)
set(CMAKE_${lang}_COMPILER_LINKER_VERSION ${CMAKE_${lang}_COMPILER_LINKER_VERSION} PARENT_SCOPE)
set(CMAKE_${lang}_COMPILER_LINKER_FRONTEND_VARIANT ${CMAKE_${lang}_COMPILER_LINKER_FRONTEND_VARIANT} PARENT_SCOPE)
+1
View File
@@ -16,6 +16,7 @@ set(CMAKE_Fortran_COMPILER_AR "@CMAKE_Fortran_COMPILER_AR@")
set(CMAKE_RANLIB "@CMAKE_RANLIB@")
set(CMAKE_LINKER "@CMAKE_LINKER@")
set(CMAKE_Fortran_COMPILER_LINKER "@CMAKE_Fortran_COMPILER_LINKER@")
set(CMAKE_Fortran_COMPILER_LINKER_ARCHITECTURE_FLAGS "@CMAKE_Fortran_COMPILER_LINKER_ARCHITECTURE_FLAGS@")
set(CMAKE_Fortran_COMPILER_LINKER_ID "@CMAKE_Fortran_COMPILER_LINKER_ID@")
set(CMAKE_Fortran_COMPILER_LINKER_VERSION "@CMAKE_Fortran_COMPILER_LINKER_VERSION@")
set(CMAKE_Fortran_COMPILER_LINKER_FRONTEND_VARIANT "@CMAKE_Fortran_COMPILER_LINKER_FRONTEND_VARIANT@")
+1
View File
@@ -84,6 +84,7 @@ set(CMAKE_LINKER "@CMAKE_LINKER@")
set(CMAKE_LINKER_LINK "@CMAKE_LINKER_LINK@")
set(CMAKE_LINKER_LLD "@CMAKE_LINKER_LLD@")
set(CMAKE_HIP_COMPILER_LINKER "@CMAKE_HIP_COMPILER_LINKER@")
set(CMAKE_HIP_COMPILER_LINKER_ARCHITECTURE_FLAGS "@CMAKE_HIP_COMPILER_LINKER_ARCHITECTURE_FLAGS@")
set(CMAKE_HIP_COMPILER_LINKER_ID "@CMAKE_HIP_COMPILER_LINKER_ID@")
set(CMAKE_HIP_COMPILER_LINKER_VERSION "@CMAKE_HIP_COMPILER_LINKER_VERSION@")
set(CMAKE_HIP_COMPILER_LINKER_FRONTEND_VARIANT "@CMAKE_HIP_COMPILER_LINKER_FRONTEND_VARIANT@")
+1
View File
@@ -29,6 +29,7 @@ set(CMAKE_LINKER "@CMAKE_LINKER@")
set(CMAKE_LINKER_LINK "@CMAKE_LINKER_LINK@")
set(CMAKE_LINKER_LLD "@CMAKE_LINKER_LLD@")
set(CMAKE_OBJC_COMPILER_LINKER "@CMAKE_OBJC_COMPILER_LINKER@")
set(CMAKE_OBJC_COMPILER_LINKER_ARCHITECTURE_FLAGS "@CMAKE_OBJC_COMPILER_LINKER_ARCHITECTURE_FLAGS@")
set(CMAKE_OBJC_COMPILER_LINKER_ID "@CMAKE_OBJC_COMPILER_LINKER_ID@")
set(CMAKE_OBJC_COMPILER_LINKER_VERSION "@CMAKE_OBJC_COMPILER_LINKER_VERSION@")
set(CMAKE_OBJC_COMPILER_LINKER_FRONTEND_VARIANT "@CMAKE_OBJC_COMPILER_LINKER_FRONTEND_VARIANT@")
+1
View File
@@ -30,6 +30,7 @@ set(CMAKE_LINKER "@CMAKE_LINKER@")
set(CMAKE_LINKER_LINK "@CMAKE_LINKER_LINK@")
set(CMAKE_LINKER_LLD "@CMAKE_LINKER_LLD@")
set(CMAKE_OBJCXX_COMPILER_LINKER "@CMAKE_OBJCXX_COMPILER_LINKER@")
set(CMAKE_OBJCXX_COMPILER_LINKER_ARCHITECTURE_FLAGS "@CMAKE_OBJCXX_COMPILER_LINKER_ARCHITECTURE_FLAGS@")
set(CMAKE_OBJCXX_COMPILER_LINKER_ID "@CMAKE_OBJCXX_COMPILER_LINKER_ID@")
set(CMAKE_OBJCXX_COMPILER_LINKER_VERSION "@CMAKE_OBJCXX_COMPILER_LINKER_VERSION@")
set(CMAKE_OBJCXX_COMPILER_LINKER_FRONTEND_VARIANT "@CMAKE_OBJCXX_COMPILER_LINKER_FRONTEND_VARIANT@")
+16 -1
View File
@@ -108,6 +108,7 @@ function(cmake_parse_implicit_link_info2 text log_var obj_regex)
string(APPEND linker_tool_exclude_regex "|^clang |^gcc ")
endif()
set(linker_tool "NOTFOUND")
set(linker_tool_arch)
set(linker_tool_fallback "")
set(link_line_parsed 0)
string(APPEND log " link line regex: [${linker_regex}]\n")
@@ -120,18 +121,31 @@ function(cmake_parse_implicit_link_info2 text log_var obj_regex)
NOT linker_tool AND NOT "${line}" MATCHES "${linker_tool_exclude_regex}")
if("${line}" MATCHES "exec: ([^()]*/(${linker}))") # IBM XL as nvcc host compiler
set(linker_tool "${CMAKE_MATCH_1}")
string(APPEND log " link line: [${line}] ==> linker [${linker_tool}]\n")
elseif("${line}" MATCHES "^export XL_LINKER=(.*/${linker})[ \t]*$") # IBM XL
set(linker_tool "${CMAKE_MATCH_1}")
string(APPEND log " link line: [${line}] ==> linker [${linker_tool}]\n")
elseif("${line}" MATCHES "--with-ld=") # GNU
# The GNU compiler reports how it was configured.
# This does not account for -fuse-ld= so use it only as a fallback.
if("${line}" MATCHES " --with-ld=([^ ]+/${linker})( |$)")
set(linker_tool_fallback "${CMAKE_MATCH_1}")
string(APPEND log " link line: [${line}] ==> linker (fallback) [${linker_tool_fallback}]\n")
endif()
elseif("${line}" MATCHES "vs_link.*-- +\"?([^\"]*[/\\](${linker}))\"? ") # cmake -E vs_link_exe
set(linker_tool "${CMAKE_MATCH_1}")
string(APPEND log " link line: [${line}] ==> linker [${linker_tool}]\n")
elseif("${line}" MATCHES "${linker_tool_regex}")
set(linker_tool "${CMAKE_MATCH_2}")
string(APPEND log " link line: [${line}] ==> linker [${linker_tool}]\n")
endif()
endif()
if(linker_tool)
# pick-up useful flags influencing linker behavior
# these flags are meaningful only for LLVM and GNU linkers. Check will be done later
if("${line}" MATCHES "-m ([a-zA-Z0-9]+)")
list(APPEND linker_tool_arch -m "${CMAKE_MATCH_1}")
string(APPEND log " link line: [${line}] ==> linker architecture flags [${linker_tool_arch}]\n")
endif()
endif()
if(NOT (EXTRA_PARSE_COMPUTE_IMPLICIT_LIBS OR EXTRA_PARSE_COMPUTE_IMPLICIT_DIRS
@@ -305,7 +319,7 @@ function(cmake_parse_implicit_link_info2 text log_var obj_regex)
if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
cmake_path(NORMAL_PATH linker_tool)
endif()
string(APPEND log " linker tool for '${EXTRA_PARSE_LANGUAGE}': ${linker_tool}\n")
string(APPEND log " linker tool for '${EXTRA_PARSE_LANGUAGE}': ${linker_tool} ${linker_tool_arch}\n")
endif()
# Look for library search paths reported by linker.
@@ -401,6 +415,7 @@ function(cmake_parse_implicit_link_info2 text log_var obj_regex)
# Return results.
if(EXTRA_PARSE_COMPUTE_LINKER)
set(${EXTRA_PARSE_COMPUTE_LINKER} "${linker_tool}" PARENT_SCOPE)
set(${EXTRA_PARSE_COMPUTE_LINKER}_ARCH_FLAGS "${linker_tool_arch}" PARENT_SCOPE)
endif()
set(${log_var} "${log}" PARENT_SCOPE)
+3 -1
View File
@@ -10,6 +10,8 @@ include(Platform/Linker/GNU)
macro(__cygwin_linker_gnu lang)
set(CMAKE_${lang}_PLATFORM_LINKER_ID GNU)
if(CMAKE_${lang}_COMPILER_LINKER)
__cmake_set_whole_archive_feature("${CMAKE_${lang}_COMPILER_LINKER}" "${lang}")
__cmake_set_whole_archive_feature("${CMAKE_${lang}_COMPILER_LINKER}"
"${CMAKE_${lang}_COMPILER_LINKER_ARCHITECTURE_FLAGS}"
"${lang}")
endif()
endmacro()
+3 -1
View File
@@ -10,6 +10,8 @@ include(Platform/Linker/GNU)
macro(__freebsd_linker_gnu lang)
set(CMAKE_${lang}_PLATFORM_LINKER_ID GNU)
if(CMAKE_${lang}_COMPILER_LINKER)
__cmake_set_whole_archive_feature("${CMAKE_${lang}_COMPILER_LINKER}" "${lang}")
__cmake_set_whole_archive_feature("${CMAKE_${lang}_COMPILER_LINKER}"
"${CMAKE_${lang}_COMPILER_LINKER_ARCHITECTURE_FLAGS}"
"${lang}")
endif()
endmacro()
+3 -1
View File
@@ -10,6 +10,8 @@ include(Platform/Linker/GNU)
macro(__gnu_linker_gnu lang)
set(CMAKE_${lang}_PLATFORM_LINKER_ID GNU)
if(CMAKE_${lang}_COMPILER_LINKER)
__cmake_set_whole_archive_feature("${CMAKE_${lang}_COMPILER_LINKER}" "${lang}")
__cmake_set_whole_archive_feature("${CMAKE_${lang}_COMPILER_LINKER}"
"${CMAKE_${lang}_COMPILER_LINKER_ARCHITECTURE_FLAGS}"
"${lang}")
endif()
endmacro()
+7 -8
View File
@@ -7,10 +7,10 @@ include_guard()
# WHOLE_ARCHIVE Feature for LINK_LIBRARY generator expression
## check linker capabilities
function(__cmake_set_whole_archive_feature __linker)
function(__cmake_set_whole_archive_feature __linker __linker_options)
unset(__lang)
if(ARGC EQUAL "2")
set(__lang "${ARGV1}_")
if(ARGC EQUAL "3")
set(__lang "${ARGV2}_")
endif()
if(NOT __linker)
@@ -19,12 +19,11 @@ function(__cmake_set_whole_archive_feature __linker)
if(NOT DEFINED CMAKE_${__lang}LINKER_PUSHPOP_STATE_SUPPORTED)
# launch linker to check if push_state/pop_state options are supported
execute_process(COMMAND "${__linker}" --push-state --pop-state
execute_process(COMMAND "${__linker}" ${__linker_options} --push-state --pop-state
OUTPUT_VARIABLE __linker_log
ERROR_VARIABLE __linker_log
COMMAND_ERROR_IS_FATAL NONE
RESULT_VARIABLE __linker_result)
if(__linker_result EQUAL 0 AND (__linker_log MATCHES "--push-state" OR __linker_log MATCHES "--pop-state"))
COMMAND_ERROR_IS_FATAL NONE)
if(__linker_log MATCHES "--push-state" OR __linker_log MATCHES "--pop-state")
set(CMAKE_${__lang}LINKER_PUSHPOP_STATE_SUPPORTED FALSE)
else()
set(CMAKE_${__lang}LINKER_PUSHPOP_STATE_SUPPORTED TRUE)
@@ -47,4 +46,4 @@ endfunction()
## Configure system linker
__cmake_set_whole_archive_feature("${CMAKE_LINKER}")
__cmake_set_whole_archive_feature("${CMAKE_LINKER}" "")
+3 -1
View File
@@ -10,6 +10,8 @@ include(Platform/Linker/GNU)
macro(__linux_linker_gnu lang)
set(CMAKE_${lang}_PLATFORM_LINKER_ID GNU)
if(CMAKE_${lang}_COMPILER_LINKER)
__cmake_set_whole_archive_feature("${CMAKE_${lang}_COMPILER_LINKER}" "${lang}")
__cmake_set_whole_archive_feature("${CMAKE_${lang}_COMPILER_LINKER}"
"${CMAKE_${lang}_COMPILER_LINKER_ARCHITECTURE_FLAGS}"
"${lang}")
endif()
endmacro()
+3 -1
View File
@@ -10,6 +10,8 @@ include(Platform/Linker/GNU)
macro(__netbsd_linker_gnu lang)
set(CMAKE_${lang}_PLATFORM_LINKER_ID GNU)
if(CMAKE_${lang}_COMPILER_LINKER)
__cmake_set_whole_archive_feature("${CMAKE_${lang}_COMPILER_LINKER}" "${lang}")
__cmake_set_whole_archive_feature("${CMAKE_${lang}_COMPILER_LINKER}"
"${CMAKE_${lang}_COMPILER_LINKER_ARCHITECTURE_FLAGS}"
"${lang}")
endif()
endmacro()
+3 -1
View File
@@ -10,6 +10,8 @@ include(Platform/Linker/GNU)
macro(__openbsd_linker_gnu lang)
set(CMAKE_${lang}_PLATFORM_LINKER_ID GNU)
if(CMAKE_${lang}_COMPILER_LINKER)
__cmake_set_whole_archive_feature("${CMAKE_${lang}_COMPILER_LINKER}" "${lang}")
__cmake_set_whole_archive_feature("${CMAKE_${lang}_COMPILER_LINKER}"
"${CMAKE_${lang}_COMPILER_LINKER_ARCHITECTURE_FLAGS}"
"${lang}")
endif()
endmacro()
+3 -1
View File
@@ -10,6 +10,8 @@ include(Platform/Linker/GNU)
macro(__serenityos_linker_gnu lang)
set(CMAKE_${lang}_PLATFORM_LINKER_ID GNU)
if(CMAKE_${lang}_COMPILER_LINKER)
__cmake_set_whole_archive_feature("${CMAKE_${lang}_COMPILER_LINKER}" "${lang}")
__cmake_set_whole_archive_feature("${CMAKE_${lang}_COMPILER_LINKER}"
"${CMAKE_${lang}_COMPILER_LINKER_ARCHITECTURE_FLAGS}"
"${lang}")
endif()
endmacro()
+3 -1
View File
@@ -10,6 +10,8 @@ include(Platform/Linker/GNU)
macro(__sunos_linker_gnu lang)
set(CMAKE_${lang}_PLATFORM_LINKER_ID GNU)
if(CMAKE_${lang}_COMPILER_LINKER)
__cmake_set_whole_archive_feature("${CMAKE_${lang}_COMPILER_LINKER}" "${lang}")
__cmake_set_whole_archive_feature("${CMAKE_${lang}_COMPILER_LINKER}"
"${CMAKE_${lang}_COMPILER_LINKER_ARCHITECTURE_FLAGS}"
"${lang}")
endif()
endmacro()
+3 -1
View File
@@ -10,6 +10,8 @@ include(Platform/Linker/GNU)
macro(__windows_linker_gnu lang)
set(CMAKE_${lang}_PLATFORM_LINKER_ID GNU)
if(CMAKE_${lang}_COMPILER_LINKER)
__cmake_set_whole_archive_feature("${CMAKE_${lang}_COMPILER_LINKER}" "${lang}")
__cmake_set_whole_archive_feature("${CMAKE_${lang}_COMPILER_LINKER}"
"${CMAKE_${lang}_COMPILER_LINKER_ARCHITECTURE_FLAGS}"
"${lang}")
endif()
endmacro()