forked from OSchip/llvm-project
[builtins] Prevent duplicate definitions for overridden functions
Summary: Some architecture-specific function overrides (for example, i386/ashrdi3.S) duplicate generic functions (in that case, ashrdi3.c). Prevent duplicate definitions by filtering out the generic files before compiling. Reviewers: compnerd, beanz Subscribers: llvm-commits, mgorny Differential Revision: https://reviews.llvm.org/D37166 llvm-svn: 312140
This commit is contained in:
parent
8550e88eb7
commit
e3b018f6e5
|
@ -243,35 +243,6 @@ function(darwin_lipo_libs name)
|
|||
endif()
|
||||
endfunction()
|
||||
|
||||
# Filter out generic versions of routines that are re-implemented in
|
||||
# architecture specific manner. This prevents multiple definitions of the
|
||||
# same symbols, making the symbol selection non-deterministic.
|
||||
function(darwin_filter_builtin_sources output_var exclude_or_include excluded_list)
|
||||
if(exclude_or_include STREQUAL "EXCLUDE")
|
||||
set(filter_action GREATER)
|
||||
set(filter_value -1)
|
||||
elseif(exclude_or_include STREQUAL "INCLUDE")
|
||||
set(filter_action LESS)
|
||||
set(filter_value 0)
|
||||
else()
|
||||
message(FATAL_ERROR "darwin_filter_builtin_sources called without EXCLUDE|INCLUDE")
|
||||
endif()
|
||||
|
||||
set(intermediate ${ARGN})
|
||||
foreach (_file ${intermediate})
|
||||
get_filename_component(_name_we ${_file} NAME_WE)
|
||||
list(FIND ${excluded_list} ${_name_we} _found)
|
||||
if(_found ${filter_action} ${filter_value})
|
||||
list(REMOVE_ITEM intermediate ${_file})
|
||||
elseif(${_file} MATCHES ".*/.*\\.S" OR ${_file} MATCHES ".*/.*\\.c")
|
||||
get_filename_component(_name ${_file} NAME)
|
||||
string(REPLACE ".S" ".c" _cname "${_name}")
|
||||
list(REMOVE_ITEM intermediate ${_cname})
|
||||
endif ()
|
||||
endforeach ()
|
||||
set(${output_var} ${intermediate} PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
# Generates builtin libraries for all operating systems specified in ARGN. Each
|
||||
# OS library is constructed by lipo-ing together single-architecture libraries.
|
||||
macro(darwin_add_builtin_libraries)
|
||||
|
@ -294,7 +265,7 @@ macro(darwin_add_builtin_libraries)
|
|||
ARCH ${arch}
|
||||
MIN_VERSION ${DARWIN_${os}_BUILTIN_MIN_VER})
|
||||
|
||||
darwin_filter_builtin_sources(filtered_sources
|
||||
filter_builtin_sources(filtered_sources
|
||||
EXCLUDE ${arch}_${os}_EXCLUDED_BUILTINS
|
||||
${${arch}_SOURCES})
|
||||
|
||||
|
@ -316,7 +287,7 @@ macro(darwin_add_builtin_libraries)
|
|||
OS ${os}
|
||||
ARCH ${arch})
|
||||
|
||||
darwin_filter_builtin_sources(filtered_sources
|
||||
filter_builtin_sources(filtered_sources
|
||||
EXCLUDE ${arch}_${os}_EXCLUDED_BUILTINS
|
||||
${${arch}_SOURCES})
|
||||
|
||||
|
@ -411,7 +382,7 @@ macro(darwin_add_embedded_builtin_libraries)
|
|||
set(x86_64_FUNCTIONS ${common_FUNCTIONS})
|
||||
|
||||
foreach(arch ${DARWIN_macho_embedded_ARCHS})
|
||||
darwin_filter_builtin_sources(${arch}_filtered_sources
|
||||
filter_builtin_sources(${arch}_filtered_sources
|
||||
INCLUDE ${arch}_FUNCTIONS
|
||||
${${arch}_SOURCES})
|
||||
if(NOT ${arch}_filtered_sources)
|
||||
|
|
|
@ -270,3 +270,32 @@ macro(construct_compiler_rt_default_triple)
|
|||
set(COMPILER_RT_HAS_EXPLICIT_DEFAULT_TARGET_TRIPLE FALSE)
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
# Filter out generic versions of routines that are re-implemented in
|
||||
# architecture specific manner. This prevents multiple definitions of the
|
||||
# same symbols, making the symbol selection non-deterministic.
|
||||
function(filter_builtin_sources output_var exclude_or_include excluded_list)
|
||||
if(exclude_or_include STREQUAL "EXCLUDE")
|
||||
set(filter_action GREATER)
|
||||
set(filter_value -1)
|
||||
elseif(exclude_or_include STREQUAL "INCLUDE")
|
||||
set(filter_action LESS)
|
||||
set(filter_value 0)
|
||||
else()
|
||||
message(FATAL_ERROR "filter_builtin_sources called without EXCLUDE|INCLUDE")
|
||||
endif()
|
||||
|
||||
set(intermediate ${ARGN})
|
||||
foreach (_file ${intermediate})
|
||||
get_filename_component(_name_we ${_file} NAME_WE)
|
||||
list(FIND ${excluded_list} ${_name_we} _found)
|
||||
if(_found ${filter_action} ${filter_value})
|
||||
list(REMOVE_ITEM intermediate ${_file})
|
||||
elseif(${_file} MATCHES ".*/.*\\.S" OR ${_file} MATCHES ".*/.*\\.c")
|
||||
get_filename_component(_name ${_file} NAME)
|
||||
string(REPLACE ".S" ".c" _cname "${_name}")
|
||||
list(REMOVE_ITEM intermediate ${_cname})
|
||||
endif ()
|
||||
endforeach ()
|
||||
set(${output_var} ${intermediate} PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
|
|
@ -235,8 +235,8 @@ if (NOT MSVC)
|
|||
x86_64/floatdixf.c
|
||||
x86_64/floatundidf.S
|
||||
x86_64/floatundisf.S
|
||||
x86_64/floatundixf.S
|
||||
${GENERIC_SOURCES})
|
||||
x86_64/floatundixf.S)
|
||||
filter_builtin_sources(x86_64_SOURCES EXCLUDE x86_64_SOURCES "${x86_64_SOURCES};${GENERIC_SOURCES}")
|
||||
set(x86_64h_SOURCES ${x86_64_SOURCES})
|
||||
|
||||
if (WIN32)
|
||||
|
@ -262,8 +262,8 @@ if (NOT MSVC)
|
|||
i386/moddi3.S
|
||||
i386/muldi3.S
|
||||
i386/udivdi3.S
|
||||
i386/umoddi3.S
|
||||
${GENERIC_SOURCES})
|
||||
i386/umoddi3.S)
|
||||
filter_builtin_sources(i386_SOURCES EXCLUDE i386_SOURCES "${i386_SOURCES};${GENERIC_SOURCES}")
|
||||
|
||||
if (WIN32)
|
||||
set(i386_SOURCES
|
||||
|
@ -315,8 +315,8 @@ set(arm_SOURCES
|
|||
arm/sync_fetch_and_xor_8.S
|
||||
arm/udivmodsi4.S
|
||||
arm/udivsi3.S
|
||||
arm/umodsi3.S
|
||||
${GENERIC_SOURCES})
|
||||
arm/umodsi3.S)
|
||||
filter_builtin_sources(arm_SOURCES EXCLUDE arm_SOURCES "${arm_SOURCES};${GENERIC_SOURCES}")
|
||||
|
||||
set(thumb1_SOURCES
|
||||
arm/divsi3.S
|
||||
|
|
Loading…
Reference in New Issue