Skip to content

Commit b8ce152

Browse files
author
Tor Didriksen
committed
Bug#34099162 Add support for mold linker
Add a cmake option -DWITH_LD=mold|lld. The default is empty, i.e. use the standard linker. The new option is only visible on Linux. Remove the cmake option -DUSE_LD_LLD, use -DWITH_LD=lld instead. Note that for el7/el8/el9 we use compilers from /opt/rh/devtoolset... and must use the 'ld' linker that comes with that bundle. Hence alternative linkers like 'lld' and 'mold' cannot be used, and -DWITH_LD is not available as an option. Fix a linker warning for 'mysql_ssl_rsa_setup' with lto: mold: warning: symbol type mismatch: error >>> defined in /tmp/ccbfnLqs.ltrans0.ltrans.o as STT_OBJECT >>> defined in /lib64/libc.so.6 as STT_FUNC Silence -Wno-alloc-size-larger-than warnings for mysqld and server_unittest_library. sql/rpl_info_values.cc:45:44: error: argument 1 value 18446744073709551615 exceeds maximum object size 9223372036854775807 [-Werror=alloc-size-larger-than=] Change-Id: I49bc677194624f944f345ef50b9004575776f736
1 parent 09714cf commit b8ce152

File tree

11 files changed

+64
-38
lines changed

11 files changed

+64
-38
lines changed

CMakeLists.txt

Lines changed: 42 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1259,29 +1259,33 @@ IF (ENABLE_GPROF AND NOT WIN32 AND NOT APPLE)
12591259
STRING_APPEND(CMAKE_EXE_LINKER_FLAGS " -pg")
12601260
ENDIF()
12611261

1262-
# Use lld on Linux if available and not explicitly disabled.
1263-
# You need to install the 'lld' RPM/DEB package.
1264-
# LTO build fails with lld, so turn it off by default.
1265-
IF(LINUX AND NOT ALTERNATIVE_LD AND
1266-
NOT WITH_LTO AND NOT CMAKE_COMPILER_FLAG_WITH_LTO)
1267-
OPTION(USE_LD_LLD "Use llvm lld linker" ON)
1268-
ELSE()
1269-
OPTION(USE_LD_LLD "Use llvm lld linker" OFF)
1270-
ENDIF()
1271-
1272-
# If ALTERNATIVE_LD is set, we must use it.
1273-
IF(ALTERNATIVE_LD AND USE_LD_LLD)
1274-
MESSAGE(WARNING
1275-
"The compiler ${ALTERNATIVE_GPP} is not compatible with lld")
1276-
SET(USE_LD_LLD 0)
1277-
SET(USE_LD_LLD 0 CACHE INTERNAL "" FORCE)
1278-
ENDIF()
1279-
1280-
SET(USING_LD_LLD 0)
1281-
IF(USE_LD_LLD)
1282-
CHECK_ALTERNATIVE_LINKER("lld" USING_LD_LLD)
1262+
# If LINUX, and not any special build (profiling, devtoolset) then provide
1263+
# -DWITH_LD=mold|lld
1264+
# We restrict the list of known linkers to the ones we have actually tested.
1265+
# LTO builds have failed earlier with "lld", so use this feature with care.
1266+
IF(LINUX AND NOT ALTERNATIVE_LD AND NOT FPROFILE_GENERATE AND NOT FPROFILE_USE)
1267+
UNSET(USING_LD_LLD)
1268+
UNSET(USING_LD_LLD CACHE)
1269+
UNSET(USING_LD_MOLD)
1270+
UNSET(USING_LD_MOLD CACHE)
1271+
SET(KNOWN_LINKERS "mold" "lld")
1272+
IF(WITH_LD)
1273+
LIST(FIND KNOWN_LINKERS ${WITH_LD} FOUND_LINKER_INDEX)
1274+
IF(FOUND_LINKER_INDEX EQUAL -1)
1275+
MESSAGE(FATAL_ERROR "Unknown linker -fuse-ld=${WITH_LD}")
1276+
ENDIF()
1277+
UNSET(ALTERNATIVE_LINKER_RESULT)
1278+
CHECK_ALTERNATIVE_LINKER(${WITH_LD} ALTERNATIVE_LINKER_RESULT)
1279+
IF(ALTERNATIVE_LINKER_RESULT)
1280+
STRING(TOUPPER "${WITH_LD}" WITH_LD_UPPER)
1281+
# See ADD_GDB_INDEX below:
1282+
SET(USING_LD_${WITH_LD_UPPER} ON)
1283+
SET(USING_LD_${WITH_LD_UPPER} ON CACHE INTERNAL "")
1284+
ELSE()
1285+
MESSAGE(FATAL_ERROR "failed to link using: -fuse-ld=${WITH_LD}")
1286+
ENDIF()
1287+
ENDIF()
12831288
ENDIF()
1284-
SET(USING_LD_LLD ${USING_LD_LLD} CACHE INTERNAL "")
12851289

12861290
IF(LINUX_STANDALONE)
12871291
# ON by default in pushbuild, but only for standalone builds.
@@ -1432,16 +1436,22 @@ IF(LINK_RANDOMIZE)
14321436
SET(CMAKE_C_ARCHIVE_CREATE_APPEND ${CMAKE_CXX_ARCHIVE_CREATE_APPEND})
14331437
ENDIF()
14341438

1435-
# Gold and LLD support the --gdb-index option, which adds a .gdb_index
1439+
# Mold and LLD support the --gdb-index option, which adds a .gdb_index
14361440
# section to the binaries. It makes loading the binaries in gdb much
1437-
# faster. The overhead of generating the index is small in LLD.
1441+
# faster. The overhead of generating the index is small in.
14381442
OPTION(ADD_GDB_INDEX "Generate a .gdb_index section in the binaries." OFF)
14391443

1440-
IF(ADD_GDB_INDEX AND CMAKE_EXE_LINKER_FLAGS MATCHES "-fuse-ld=lld")
1444+
IF(ADD_GDB_INDEX AND (USING_LD_MOLD OR USING_LD_LLD))
14411445
# -fuse-ld=lld is not enough to ensure that ld.lld will actually be used.
14421446
# On some platforms we need an extra check for -Wl,--gdb-index
1447+
IF(USING_LD_LLD)
1448+
SET(FUSE_LD "-fuse-ld=lld")
1449+
ELSE()
1450+
SET(FUSE_LD "-fuse-ld=mold")
1451+
ENDIF()
1452+
14431453
CMAKE_PUSH_CHECK_STATE()
1444-
SET(CMAKE_REQUIRED_LIBRARIES "-fuse-ld=lld -Wl,--gdb-index")
1454+
SET(CMAKE_REQUIRED_LIBRARIES "${FUSE_LD} -Wl,--gdb-index")
14451455
CHECK_CXX_SOURCE_COMPILES("int main() {}" CXX_LD_GDB_INDEX_RESULT)
14461456
CMAKE_POP_CHECK_STATE()
14471457

@@ -2327,6 +2337,12 @@ IF(NOT WITHOUT_SERVER AND WITH_UNIT_TESTS)
23272337
IF(HAS_WARN_FLAG)
23282338
MY_TARGET_LINK_OPTIONS(server_unittest_library "${HAS_WARN_FLAG}")
23292339
ENDIF()
2340+
# The mold linker and RelWithDebInfo build complains about
2341+
# the new expression in Rpl_info_values::init()
2342+
IF(MY_COMPILER_IS_GNU)
2343+
MY_TARGET_LINK_OPTIONS(server_unittest_library
2344+
"-Wno-alloc-size-larger-than")
2345+
ENDIF()
23302346
ENDIF()
23312347
ELSE()
23322348
SET(DUMMY_SOURCE_FILE ${CMAKE_BINARY_DIR}/server_unittest_library.c)

client/mysql_ssl_rsa_setup.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,8 +111,10 @@ Sql_string_t ext_files[] = {create_string("cav3.ext"),
111111
*/
112112
#define MAX_SUFFIX_LEN 17
113113

114+
namespace {
114115
Log info(cout, "NOTE");
115116
Log error(cerr, "ERROR");
117+
} // namespace
116118

117119
char **defaults_argv = nullptr;
118120
static char *opt_datadir = nullptr;

cmake/compile_flags.cmake

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,12 +138,31 @@ ENDFUNCTION(ADD_LINUX_DEB_FLAGS)
138138
# If compilation/linking succeeds, we extend misc cmake LINKER_FLAGS,
139139
# and set OUTPUT_RESULT to 1.
140140
FUNCTION(CHECK_ALTERNATIVE_LINKER LINKER OUTPUT_RESULT)
141+
SET(ACCEPTED_VERSION 1)
141142
CMAKE_PUSH_CHECK_STATE(RESET)
142143

143144
SET(CMAKE_REQUIRED_LIBRARIES "-fuse-ld=${LINKER}")
144145
CHECK_C_SOURCE_COMPILES("int main() {}" C_LD_${LINKER}_RESULT)
145146
CHECK_CXX_SOURCE_COMPILES("int main() {}" CXX_LD_${LINKER}_RESULT)
146147
IF(C_LD_${LINKER}_RESULT AND CXX_LD_${LINKER}_RESULT)
148+
IF(${LINKER} STREQUAL "mold")
149+
FIND_PROGRAM(MOLD_EXECUTABLE "mold")
150+
IF(MOLD_EXECUTABLE)
151+
EXECUTE_PROCESS(COMMAND ${MOLD_EXECUTABLE} --version
152+
OUTPUT_VARIABLE MOLD_OUTPUT
153+
RESULT_VARIABLE MOLD_RESULT
154+
OUTPUT_STRIP_TRAILING_WHITESPACE
155+
)
156+
STRING(REGEX MATCH "^mold ([.0-9]+)" VERSION "${MOLD_OUTPUT}")
157+
IF(NOT CMAKE_MATCH_1 OR CMAKE_MATCH_1 VERSION_LESS "2.0.0")
158+
MESSAGE(STATUS
159+
"This version of mold has an incompatible version: ${MOLD_OUTPUT}")
160+
SET(ACCEPTED_VERSION 0)
161+
ENDIF()
162+
ENDIF()
163+
ENDIF()
164+
ENDIF()
165+
IF(ACCEPTED_VERSION AND C_LD_${LINKER}_RESULT AND CXX_LD_${LINKER}_RESULT)
147166
FOREACH(flag
148167
CMAKE_EXE_LINKER_FLAGS
149168
CMAKE_MODULE_LINKER_FLAGS

cmake/fprofile.cmake

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,6 @@ ENDIF()
113113

114114
IF(FPROFILE_GENERATE OR FPROFILE_USE)
115115
SET(REPRODUCIBLE_BUILD ON CACHE INTERNAL "")
116-
# Build fails with lld, so switch it off.
117-
SET(USE_LD_LLD OFF CACHE INTERNAL "")
118116
ENDIF()
119117

120118
IF(FPROFILE_USE)

packaging/deb-in/deb_debug.cmake

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ SET (DEB_RULES_DEBUG_CMAKE
3838
-DCOMPILATION_COMMENT_SERVER=\"MySQL ${DEB_PRODUCTNAMEC} Server - ${DEB_LICENSENAME} - Debug\" \\
3939
-DINSTALL_LAYOUT=DEB \\
4040
-DREPRODUCIBLE_BUILD=OFF \\
41-
-DUSE_LD_LLD=OFF \\
4241
-DDEB_PRODUCT=${DEB_PRODUCT} \\
4342
${DEB_CMAKE_EXTRAS}
4443
")

packaging/deb-in/rules.in

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ override_dh_auto_configure:
5353
-DCOMPILATION_COMMENT_SERVER="MySQL @DEB_PRODUCTNAMEC@ Server - @DEB_LICENSENAME@" \
5454
-DINSTALL_LAYOUT=DEB \
5555
-DREPRODUCIBLE_BUILD=OFF \
56-
-DUSE_LD_LLD=OFF \
5756
-DDEB_PRODUCT=@DEB_PRODUCT@ \
5857
@DEB_CMAKE_EXTRAS@
5958

packaging/rpm-docker/mysql.spec.in

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,6 @@ mkdir release
196196
-DWITH_BOOST=.. \
197197
-DCMAKE_C_FLAGS="%{optflags}" \
198198
-DCMAKE_CXX_FLAGS="%{optflags}" \
199-
-DUSE_LD_LLD=0 \
200199
-DWITH_INNODB_MEMCACHED=1 \
201200
-DINSTALL_MYSQLTESTDIR="" \
202201
-DMYSQL_UNIX_ADDR="%{mysqldatadir}/mysql.sock" \

packaging/rpm-fedora/mysql.spec.in

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -521,7 +521,6 @@ mkdir debug
521521
-DWITH_MECAB=system \
522522
-DCMAKE_C_FLAGS="$optflags" \
523523
-DCMAKE_CXX_FLAGS="$optflags" \
524-
-DUSE_LD_LLD=0 \
525524
-DWITH_SYSTEMD=1 \
526525
-DWITH_MEB=%{with_meb} \
527526
-DWITH_ROUTER=%{with_router} \
@@ -560,7 +559,6 @@ mkdir release
560559
-DWITH_MECAB=system \
561560
-DCMAKE_C_FLAGS="%{optflags}" \
562561
-DCMAKE_CXX_FLAGS="%{optflags}" \
563-
-DUSE_LD_LLD=0 \
564562
-DWITH_SYSTEMD=1 \
565563
-DWITH_MEB=%{with_meb} \
566564
-DWITH_ROUTER=%{with_router} \

packaging/rpm-oel/mysql.spec.in

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -871,7 +871,6 @@ mkdir debug
871871
-DWITH_BOOST=.. \
872872
-DCMAKE_C_FLAGS="$optflags" \
873873
-DCMAKE_CXX_FLAGS="$optflags" \
874-
-DUSE_LD_LLD=0 \
875874
%if 0%{?ssl_default}
876875
-DWITH_AUTHENTICATION_CLIENT_PLUGINS=1 \
877876
%else
@@ -928,7 +927,6 @@ mkdir release
928927
-DWITH_BOOST=.. \
929928
-DCMAKE_C_FLAGS="%{optflags}" \
930929
-DCMAKE_CXX_FLAGS="%{optflags}" \
931-
-DUSE_LD_LLD=0 \
932930
%if 0%{?ssl_default}
933931
-DWITH_AUTHENTICATION_CLIENT_PLUGINS=1 \
934932
%else

packaging/rpm-sles/mysql.spec.in

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -612,7 +612,6 @@ mkdir debug
612612
-DWITH_BOOST=.. \
613613
-DCMAKE_C_FLAGS="$optflags" \
614614
-DCMAKE_CXX_FLAGS="$optflags" \
615-
-DUSE_LD_LLD=0 \
616615
-DWITH_SYSTEMD=1 \
617616
-DSYSTEMD_SERVICE_NAME="mysql" \
618617
-DSYSTEMD_PID_DIR="/run/mysql" \
@@ -656,7 +655,6 @@ mkdir release
656655
-DWITH_BOOST=.. \
657656
-DCMAKE_C_FLAGS="%{optflags}" \
658657
-DCMAKE_CXX_FLAGS="%{optflags}" \
659-
-DUSE_LD_LLD=0 \
660658
-DWITH_SYSTEMD=1 \
661659
-DSYSTEMD_SERVICE_NAME="mysql" \
662660
-DSYSTEMD_PID_DIR="/run/mysql" \

sql/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ ADD_WSHADOW_WARNING()
2626

2727
# Lots of warnings about -Walloc-size-larger-than= from my_malloc.cc
2828
# but it is basically impossible to trace the actual origin.
29-
IF(FPROFILE_GENERATE OR FPROFILE_USE)
29+
IF(FPROFILE_GENERATE OR FPROFILE_USE OR CMAKE_COMPILER_FLAG_WITH_LTO)
3030
IF(MY_COMPILER_IS_GNU)
3131
# -Walloc-size-larger-than=PTRDIFF_MAX is enabled by default.
3232
STRING_APPEND(CMAKE_EXE_LINKER_FLAGS " -Wno-alloc-size-larger-than")

0 commit comments

Comments
 (0)