Skip to content

Commit 41f5a9e

Browse files
committed
[CMake][LibWebRTC] Add support for optimized ASM BoringSSL modules
https://bugs.webkit.org/show_bug.cgi?id=273543 Reviewed by Adrian Perez de Castro. Build the fipsmodule and crypto assembly code. The nasm files are not built though, those might be needed on platforms where nasm is required. * Source/ThirdParty/libwebrtc/CMakeLists.txt: Canonical link: https://commits.webkit.org/278497@main
1 parent c329306 commit 41f5a9e

1 file changed

Lines changed: 129 additions & 1 deletion

File tree

Source/ThirdParty/libwebrtc/CMakeLists.txt

Lines changed: 129 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ set (CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
33
set(libwebrtc_DERIVED_SOURCES_DIR "${CMAKE_BINARY_DIR}/libwebrtc/DerivedSources")
44
file(MAKE_DIRECTORY ${libwebrtc_DERIVED_SOURCES_DIR})
55

6+
enable_language(ASM)
7+
68
if (NOT APPLE)
79
find_package(LibVpx 1.10.0)
810
if (NOT LIBVPX_FOUND)
@@ -221,6 +223,7 @@ set(webrtc_SOURCES
221223
Source/third_party/boringssl/src/crypto/cpu_aarch64_fuchsia.c
222224
Source/third_party/boringssl/src/crypto/cpu_aarch64_linux.c
223225
Source/third_party/boringssl/src/crypto/cpu_aarch64_win.c
226+
Source/third_party/boringssl/src/crypto/cpu_arm.c
224227
Source/third_party/boringssl/src/crypto/cpu_arm_linux.c
225228
Source/third_party/boringssl/src/crypto/cpu_intel.c
226229
Source/third_party/boringssl/src/crypto/crypto.c
@@ -1878,6 +1881,130 @@ if (WTF_CPU_ARM64)
18781881
add_definitions(-DWEBRTC_ARCH_ARM64)
18791882
endif ()
18801883

1884+
# Source/third_party/boringssl/src/cmake/perlasm.cmake cannot be re-used as-is, so vendor the
1885+
# adapted version here.
1886+
1887+
macro(append_to_parent_scope var)
1888+
foreach(arg IN ITEMS ${ARGN})
1889+
list(APPEND ${var} "${CMAKE_BINARY_DIR}/Source/ThirdParty/libwebrtc/${arg}")
1890+
endforeach()
1891+
set(${var} "${${var}}" PARENT_SCOPE)
1892+
endmacro()
1893+
1894+
function(add_perlasm_target dest src)
1895+
add_custom_command(
1896+
OUTPUT ${dest}
1897+
COMMAND ${PERL_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/${src} ${ARGN}
1898+
${dest}
1899+
DEPENDS
1900+
${src}
1901+
Source/third_party/boringssl/src/crypto/perlasm/arm-xlate.pl
1902+
Source/third_party/boringssl/src/crypto/perlasm/x86_64-xlate.pl
1903+
Source/third_party/boringssl/src/crypto/perlasm/x86asm.pl
1904+
Source/third_party/boringssl/src/crypto/perlasm/x86gas.pl
1905+
Source/third_party/boringssl/src/crypto/perlasm/x86masm.pl
1906+
Source/third_party/boringssl/src/crypto/perlasm/x86nasm.pl
1907+
WORKING_DIRECTORY .
1908+
)
1909+
endfunction()
1910+
1911+
# perlasm generates perlasm output from a given file. arch specifies the
1912+
# architecture. dest specifies the basename of the output file. The list of
1913+
# generated files will be appended to ${var}_ASM and ${var}_NASM depending on
1914+
# the assembler used.
1915+
function(perlasm var arch dest src)
1916+
if(arch STREQUAL "aarch64")
1917+
add_perlasm_target("${dest}-apple.S" ${src} ios64)
1918+
add_perlasm_target("${dest}-linux.S" ${src} linux64)
1919+
add_perlasm_target("${dest}-win.S" ${src} win64)
1920+
append_to_parent_scope("${var}_ASM" "${dest}-apple.S" "${dest}-linux.S" "${dest}-win.S")
1921+
elseif(arch STREQUAL "arm")
1922+
add_perlasm_target("${dest}-apple.S" ${src} ios32)
1923+
add_perlasm_target("${dest}-linux.S" ${src} linux32)
1924+
append_to_parent_scope("${var}_ASM" "${dest}-apple.S" "${dest}-linux.S")
1925+
elseif(arch STREQUAL "x86")
1926+
add_perlasm_target("${dest}-apple.S" ${src} macosx -fPIC -DOPENSSL_IA32_SSE2)
1927+
add_perlasm_target("${dest}-linux.S" ${src} elf -fPIC -DOPENSSL_IA32_SSE2)
1928+
add_perlasm_target("${dest}-win.asm" ${src} win32n -DOPENSSL_IA32_SSE2)
1929+
append_to_parent_scope("${var}_ASM" "${dest}-apple.S" "${dest}-linux.S")
1930+
append_to_parent_scope("${var}_NASM" "${dest}-win.asm")
1931+
elseif(arch STREQUAL "x86_64")
1932+
add_perlasm_target("${dest}-apple.S" ${src} macosx)
1933+
add_perlasm_target("${dest}-linux.S" ${src} elf)
1934+
add_perlasm_target("${dest}-win.asm" ${src} nasm)
1935+
append_to_parent_scope("${var}_ASM" "${dest}-apple.S" "${dest}-linux.S")
1936+
append_to_parent_scope("${var}_NASM" "${dest}-win.asm")
1937+
else()
1938+
message(FATAL_ERROR "Unknown perlasm architecture: $arch")
1939+
endif()
1940+
endfunction()
1941+
1942+
set(FIPS_PATH Source/third_party/boringssl/src/crypto/fipsmodule)
1943+
perlasm(BCM_SOURCES aarch64 aesv8-armv8 ${FIPS_PATH}/aes/asm/aesv8-armx.pl)
1944+
perlasm(BCM_SOURCES aarch64 aesv8-gcm-armv8 ${FIPS_PATH}/modes/asm/aesv8-gcm-armv8.pl)
1945+
perlasm(BCM_SOURCES aarch64 armv8-mont ${FIPS_PATH}/bn/asm/armv8-mont.pl)
1946+
perlasm(BCM_SOURCES aarch64 bn-armv8 ${FIPS_PATH}/bn/asm/bn-armv8.pl)
1947+
perlasm(BCM_SOURCES aarch64 ghash-neon-armv8 ${FIPS_PATH}/modes/asm/ghash-neon-armv8.pl)
1948+
perlasm(BCM_SOURCES aarch64 ghashv8-armv8 ${FIPS_PATH}/modes/asm/ghashv8-armx.pl)
1949+
perlasm(BCM_SOURCES aarch64 p256_beeu-armv8-asm ${FIPS_PATH}/ec/asm/p256_beeu-armv8-asm.pl)
1950+
perlasm(BCM_SOURCES aarch64 p256-armv8-asm ${FIPS_PATH}/ec/asm/p256-armv8-asm.pl)
1951+
perlasm(BCM_SOURCES aarch64 sha1-armv8 ${FIPS_PATH}/sha/asm/sha1-armv8.pl)
1952+
perlasm(BCM_SOURCES aarch64 sha256-armv8 ${FIPS_PATH}/sha/asm/sha512-armv8.pl)
1953+
perlasm(BCM_SOURCES aarch64 sha512-armv8 ${FIPS_PATH}/sha/asm/sha512-armv8.pl)
1954+
perlasm(BCM_SOURCES aarch64 vpaes-armv8 ${FIPS_PATH}/aes/asm/vpaes-armv8.pl)
1955+
perlasm(BCM_SOURCES arm aesv8-armv7 ${FIPS_PATH}/aes/asm/aesv8-armx.pl)
1956+
perlasm(BCM_SOURCES arm armv4-mont ${FIPS_PATH}/bn/asm/armv4-mont.pl)
1957+
perlasm(BCM_SOURCES arm bsaes-armv7 ${FIPS_PATH}/aes/asm/bsaes-armv7.pl)
1958+
perlasm(BCM_SOURCES arm ghash-armv4 ${FIPS_PATH}/modes/asm/ghash-armv4.pl)
1959+
perlasm(BCM_SOURCES arm ghashv8-armv7 ${FIPS_PATH}/modes/asm/ghashv8-armx.pl)
1960+
perlasm(BCM_SOURCES arm sha1-armv4-large ${FIPS_PATH}/sha/asm/sha1-armv4-large.pl)
1961+
perlasm(BCM_SOURCES arm sha256-armv4 ${FIPS_PATH}/sha/asm/sha256-armv4.pl)
1962+
perlasm(BCM_SOURCES arm sha512-armv4 ${FIPS_PATH}/sha/asm/sha512-armv4.pl)
1963+
perlasm(BCM_SOURCES arm vpaes-armv7 ${FIPS_PATH}/aes/asm/vpaes-armv7.pl)
1964+
perlasm(BCM_SOURCES x86 aesni-x86 ${FIPS_PATH}/aes/asm/aesni-x86.pl)
1965+
perlasm(BCM_SOURCES x86 bn-586 ${FIPS_PATH}/bn/asm/bn-586.pl)
1966+
perlasm(BCM_SOURCES x86 co-586 ${FIPS_PATH}/bn/asm/co-586.pl)
1967+
perlasm(BCM_SOURCES x86 ghash-ssse3-x86 ${FIPS_PATH}/modes/asm/ghash-ssse3-x86.pl)
1968+
perlasm(BCM_SOURCES x86 ghash-x86 ${FIPS_PATH}/modes/asm/ghash-x86.pl)
1969+
perlasm(BCM_SOURCES x86 md5-586 ${FIPS_PATH}/md5/asm/md5-586.pl)
1970+
perlasm(BCM_SOURCES x86 sha1-586 ${FIPS_PATH}/sha/asm/sha1-586.pl)
1971+
perlasm(BCM_SOURCES x86 sha256-586 ${FIPS_PATH}/sha/asm/sha256-586.pl)
1972+
perlasm(BCM_SOURCES x86 sha512-586 ${FIPS_PATH}/sha/asm/sha512-586.pl)
1973+
perlasm(BCM_SOURCES x86 vpaes-x86 ${FIPS_PATH}/aes/asm/vpaes-x86.pl)
1974+
perlasm(BCM_SOURCES x86 x86-mont ${FIPS_PATH}/bn/asm/x86-mont.pl)
1975+
perlasm(BCM_SOURCES x86_64 aesni-gcm-x86_64 ${FIPS_PATH}/modes/asm/aesni-gcm-x86_64.pl)
1976+
perlasm(BCM_SOURCES x86_64 aesni-x86_64 ${FIPS_PATH}/aes/asm/aesni-x86_64.pl)
1977+
perlasm(BCM_SOURCES x86_64 ghash-ssse3-x86_64 ${FIPS_PATH}/modes/asm/ghash-ssse3-x86_64.pl)
1978+
perlasm(BCM_SOURCES x86_64 ghash-x86_64 ${FIPS_PATH}/modes/asm/ghash-x86_64.pl)
1979+
perlasm(BCM_SOURCES x86_64 md5-x86_64 ${FIPS_PATH}/md5/asm/md5-x86_64.pl)
1980+
perlasm(BCM_SOURCES x86_64 p256_beeu-x86_64-asm ${FIPS_PATH}/ec/asm/p256_beeu-x86_64-asm.pl)
1981+
perlasm(BCM_SOURCES x86_64 p256-x86_64-asm ${FIPS_PATH}/ec/asm/p256-x86_64-asm.pl)
1982+
perlasm(BCM_SOURCES x86_64 rdrand-x86_64 ${FIPS_PATH}/rand/asm/rdrand-x86_64.pl)
1983+
perlasm(BCM_SOURCES x86_64 rsaz-avx2 ${FIPS_PATH}/bn/asm/rsaz-avx2.pl)
1984+
perlasm(BCM_SOURCES x86_64 sha1-x86_64 ${FIPS_PATH}/sha/asm/sha1-x86_64.pl)
1985+
perlasm(BCM_SOURCES x86_64 sha256-x86_64 ${FIPS_PATH}/sha/asm/sha512-x86_64.pl)
1986+
perlasm(BCM_SOURCES x86_64 sha512-x86_64 ${FIPS_PATH}/sha/asm/sha512-x86_64.pl)
1987+
perlasm(BCM_SOURCES x86_64 vpaes-x86_64 ${FIPS_PATH}/aes/asm/vpaes-x86_64.pl)
1988+
perlasm(BCM_SOURCES x86_64 x86_64-mont ${FIPS_PATH}/bn/asm/x86_64-mont.pl)
1989+
perlasm(BCM_SOURCES x86_64 x86_64-mont5 ${FIPS_PATH}/bn/asm/x86_64-mont5.pl)
1990+
1991+
set(CRYPTO_PATH Source/third_party/boringssl/src/crypto)
1992+
perlasm(CRYPTO_SOURCES aarch64 chacha/chacha-armv8 ${CRYPTO_PATH}/chacha/asm/chacha-armv8.pl)
1993+
perlasm(CRYPTO_SOURCES aarch64 cipher_extra/chacha20_poly1305_armv8 ${CRYPTO_PATH}/cipher_extra/asm/chacha20_poly1305_armv8.pl)
1994+
perlasm(CRYPTO_SOURCES aarch64 test/trampoline-armv8 ${CRYPTO_PATH}/test/asm/trampoline-armv8.pl)
1995+
perlasm(CRYPTO_SOURCES arm chacha/chacha-armv4 ${CRYPTO_PATH}/chacha/asm/chacha-armv4.pl)
1996+
perlasm(CRYPTO_SOURCES arm test/trampoline-armv4 ${CRYPTO_PATH}/test/asm/trampoline-armv4.pl)
1997+
perlasm(CRYPTO_SOURCES x86 chacha/chacha-x86 ${CRYPTO_PATH}/chacha/asm/chacha-x86.pl)
1998+
perlasm(CRYPTO_SOURCES x86 test/trampoline-x86 ${CRYPTO_PATH}/test/asm/trampoline-x86.pl)
1999+
perlasm(CRYPTO_SOURCES x86_64 chacha/chacha-x86_64 ${CRYPTO_PATH}/chacha/asm/chacha-x86_64.pl)
2000+
perlasm(CRYPTO_SOURCES x86_64 cipher_extra/aes128gcmsiv-x86_64 ${CRYPTO_PATH}/cipher_extra/asm/aes128gcmsiv-x86_64.pl)
2001+
perlasm(CRYPTO_SOURCES x86_64 cipher_extra/chacha20_poly1305_x86_64 ${CRYPTO_PATH}/cipher_extra/asm/chacha20_poly1305_x86_64.pl)
2002+
perlasm(CRYPTO_SOURCES x86_64 test/trampoline-x86_64 ${CRYPTO_PATH}/test/asm/trampoline-x86_64.pl)
2003+
2004+
# TODO: _NASM support for platforms that require it.
2005+
list(APPEND webrtc_SOURCES ${BCM_SOURCES_ASM})
2006+
list(APPEND webrtc_SOURCES ${CRYPTO_SOURCES_ASM})
2007+
18812008
if (WTF_CPU_ARM OR WTF_CPU_ARM64)
18822009
list(APPEND webrtc_neon_SOURCES
18832010
Source/webrtc/common_audio/fir_filter_neon.cc
@@ -2200,7 +2327,7 @@ target_compile_definitions(webrtc PRIVATE
22002327
JSON_USE_EXCEPTION=0
22012328
NON_WINDOWS_DEFINE
22022329
NO_MAIN_THREAD_WRAPPING
2203-
OPENSSL_NO_ASM
2330+
OPENSSL_ASM
22042331
OPUS_BUILD
22052332
OPUS_EXPORT=
22062333
RTC_ENABLE_VP9
@@ -2226,6 +2353,7 @@ target_compile_definitions(webrtc PRIVATE
22262353
WEBRTC_USE_H265=1
22272354
WTF_USE_DYNAMIC_ANNOTATIONS=1
22282355
_GNU_SOURCE
2356+
HWAES
22292357
)
22302358

22312359
if (APPLE)

0 commit comments

Comments
 (0)