From d0ed29adb7c829835db791029508e15036d73c6c Mon Sep 17 00:00:00 2001 From: Siarhei Fedartsou Date: Sun, 30 Jun 2024 21:07:49 +0200 Subject: [PATCH] Use Link Time Optimisation whenever possible (#6967) --- .github/workflows/osrm-backend.yml | 8 ++++++++ CHANGELOG.md | 1 + CMakeLists.txt | 27 +++++++++++++++------------ cmake/warnings.cmake | 4 +++- docker/Dockerfile-alpine | 2 +- docker/Dockerfile-debian | 2 +- scripts/ci/windows-build.bat | 2 +- src/extractor/extractor_callbacks.cpp | 4 ---- 8 files changed, 30 insertions(+), 20 deletions(-) diff --git a/.github/workflows/osrm-backend.yml b/.github/workflows/osrm-backend.yml index 10df684c4..1cd3bbd26 100644 --- a/.github/workflows/osrm-backend.yml +++ b/.github/workflows/osrm-backend.yml @@ -200,6 +200,7 @@ jobs: CCOMPILER: clang-15 CXXCOMPILER: clang++-15 CUCUMBER_TIMEOUT: 60000 + ENABLE_LTO: OFF - name: clang-15-debug continue-on-error: false @@ -210,6 +211,7 @@ jobs: CCOMPILER: clang-15 CXXCOMPILER: clang++-15 CUCUMBER_TIMEOUT: 60000 + ENABLE_LTO: OFF - name: clang-18-debug-clang-tidy continue-on-error: false @@ -232,6 +234,7 @@ jobs: CCOMPILER: clang-14 CXXCOMPILER: clang++-14 CUCUMBER_TIMEOUT: 60000 + ENABLE_LTO: OFF - name: clang-13-release continue-on-error: false @@ -242,6 +245,7 @@ jobs: CCOMPILER: clang-13 CXXCOMPILER: clang++-13 CUCUMBER_TIMEOUT: 60000 + ENABLE_LTO: OFF - name: conan-linux-debug-asan-ubsan continue-on-error: false @@ -253,6 +257,7 @@ jobs: CXXCOMPILER: clang++-15 ENABLE_CONAN: ON ENABLE_SANITIZER: ON + ENABLE_LTO: OFF - name: conan-linux-release continue-on-error: false @@ -263,6 +268,7 @@ jobs: CCOMPILER: clang-15 CXXCOMPILER: clang++-15 ENABLE_CONAN: ON + ENABLE_LTO: OFF - name: gcc-14-release continue-on-error: false @@ -361,6 +367,7 @@ jobs: TARGET_ARCH: ${{ matrix.TARGET_ARCH }} OSRM_CONNECTION_RETRIES: ${{ matrix.OSRM_CONNECTION_RETRIES }} OSRM_CONNECTION_EXP_BACKOFF_COEF: ${{ matrix.OSRM_CONNECTION_EXP_BACKOFF_COEF }} + ENABLE_LTO: ${{ matrix.ENABLE_LTO }} steps: - uses: actions/checkout@v4 - name: Build machine architecture @@ -521,6 +528,7 @@ jobs: -DENABLE_SANITIZER=${ENABLE_SANITIZER:-OFF} \ -DBUILD_TOOLS=${BUILD_TOOLS:-OFF} \ -DENABLE_CCACHE=ON \ + -DENABLE_LTO=${ENABLE_LTO:-ON} \ -DCMAKE_INSTALL_PREFIX=${OSRM_INSTALL_DIR} make --jobs=${JOBS} diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b0eb65a8..23170c79d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ - NodeJS: - CHANGED: Use node-api instead of NAN. [#6452](https://github.com/Project-OSRM/osrm-backend/pull/6452) - Misc: + - CHANGED: Use Link Time Optimisation whenever possible. [#6967](https://github.com/Project-OSRM/osrm-backend/pull/6967) - CHANGED: Use struct instead of tuple to define UnpackedPath. [#6974](https://github.com/Project-OSRM/osrm-backend/pull/6974) - CHANGED: Micro performance optimisation in map matching. [#6976](https://github.com/Project-OSRM/osrm-backend/pull/6976) - CHANGED: Re-use priority queue in StaticRTree. [#6952](https://github.com/Project-OSRM/osrm-backend/pull/6952) diff --git a/CMakeLists.txt b/CMakeLists.txt index 532782067..046d8877f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,11 +31,12 @@ option(ENABLE_ASSERTIONS "Use assertions in release mode" OFF) option(ENABLE_DEBUG_LOGGING "Use debug logging in release mode" OFF) option(ENABLE_COVERAGE "Build with coverage instrumentalisation" OFF) option(ENABLE_SANITIZER "Use memory sanitizer for Debug build" OFF) -option(ENABLE_LTO "Use LTO if available" OFF) +option(ENABLE_LTO "Use Link Time Optimisation" ON) option(ENABLE_FUZZING "Fuzz testing using LLVM's libFuzzer" OFF) option(ENABLE_NODE_BINDINGS "Build NodeJs bindings" OFF) option(ENABLE_CLANG_TIDY "Enables clang-tidy checks" OFF) + if (ENABLE_CLANG_TIDY) find_program(CLANG_TIDY_COMMAND NAMES clang-tidy) if(NOT CLANG_TIDY_COMMAND) @@ -57,6 +58,18 @@ if (POLICY CMP0074) endif() project(OSRM C CXX) + +if(ENABLE_LTO AND (CMAKE_BUILD_TYPE MATCHES Release OR CMAKE_BUILD_TYPE MATCHES MinRelSize OR CMAKE_BUILD_TYPE MATCHES RelWithDebInfo)) + include(CheckIPOSupported) + check_ipo_supported(RESULT LTO_SUPPORTED OUTPUT error) + if(LTO_SUPPORTED) + message(STATUS "IPO / LTO enabled") + set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE) + else() + message(FATAL_ERROR "IPO / LTO not supported: <${error}>") + endif() +endif() + # add @loader_path/$ORIGIN to rpath to make binaries relocatable if (APPLE) set(CMAKE_BUILD_RPATH "@loader_path") @@ -208,17 +221,6 @@ if(CMAKE_CXX_COMPILER_ID MATCHES "GNU") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Og -ggdb") endif() -if(ENABLE_LTO AND (CMAKE_BUILD_TYPE MATCHES Release OR CMAKE_BUILD_TYPE MATCHES MinRelSize OR CMAKE_BUILD_TYPE MATCHES RelWithDebInfo)) - include(CheckIPOSupported) - check_ipo_supported(RESULT LTO_SUPPORTED OUTPUT error) - if(LTO_SUPPORTED) - message(STATUS "IPO / LTO enabled") - set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE) - else() - message(WARNING "IPO / LTO not supported: <${error}>") - endif() -endif() - set(MAYBE_COVERAGE_LIBRARIES "") if (ENABLE_COVERAGE) if (NOT CMAKE_BUILD_TYPE MATCHES "Debug") @@ -290,6 +292,7 @@ include_directories(SYSTEM ${MICROTAR_INCLUDE_DIR}) add_library(MICROTAR OBJECT "${CMAKE_CURRENT_SOURCE_DIR}/third_party/microtar/src/microtar.c") set_property(TARGET MICROTAR PROPERTY POSITION_INDEPENDENT_CODE ON) + target_no_warning(MICROTAR unused-variable) target_no_warning(MICROTAR format) diff --git a/cmake/warnings.cmake b/cmake/warnings.cmake index 4006b0f2e..fa52d6279 100644 --- a/cmake/warnings.cmake +++ b/cmake/warnings.cmake @@ -64,7 +64,6 @@ add_warning(init-self) add_warning(bool-compare) add_warning(logical-not-parentheses) add_warning(logical-op) -add_warning(maybe-uninitialized) add_warning(misleading-indentation) # `no-` prefix is part of warning name(i.e. doesn't mean we are disabling it) add_warning(no-return-local-addr) @@ -84,3 +83,6 @@ no_warning(comma-subscript) no_warning(ambiguous-reversed-operator) no_warning(restrict) no_warning(free-nonheap-object) +if(CMAKE_CXX_COMPILER_ID MATCHES "GNU") + no_warning(stringop-overflow) +endif() \ No newline at end of file diff --git a/docker/Dockerfile-alpine b/docker/Dockerfile-alpine index 42c20ae38..fe22173f9 100644 --- a/docker/Dockerfile-alpine +++ b/docker/Dockerfile-alpine @@ -31,7 +31,7 @@ RUN NPROC=${BUILD_CONCURRENCY:-$(nproc)} && \ case ${DOCKER_TAG} in *"-debug"*) BUILD_TYPE="Debug";; esac && \ case ${DOCKER_TAG} in *"-assertions"*) BUILD_TYPE="RelWithDebInfo" && ENABLE_ASSERTIONS="On" && BUILD_TOOLS="On";; esac && \ echo "Building ${BUILD_TYPE} with ENABLE_ASSERTIONS=${ENABLE_ASSERTIONS} BUILD_TOOLS=${BUILD_TOOLS}" && \ - cmake .. -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DENABLE_ASSERTIONS=${ENABLE_ASSERTIONS} -DBUILD_TOOLS=${BUILD_TOOLS} -DENABLE_LTO=On && \ + cmake .. -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DENABLE_ASSERTIONS=${ENABLE_ASSERTIONS} -DBUILD_TOOLS=${BUILD_TOOLS} -DENABLE_LTO=OFF && \ make -j${NPROC} install && \ cd ../profiles && \ cp -r * /opt && \ diff --git a/docker/Dockerfile-debian b/docker/Dockerfile-debian index cfec9cbed..8b51c5168 100644 --- a/docker/Dockerfile-debian +++ b/docker/Dockerfile-debian @@ -21,7 +21,7 @@ COPY . /src WORKDIR /src RUN NPROC=${BUILD_CONCURRENCY:-$(nproc)} && \ - export CXXFLAGS="-Wno-array-bounds -Wno-uninitialized" && \ + export CXXFLAGS="-Wno-array-bounds -Wno-uninitialized -Wno-stringop-overflow" && \ echo "Building OSRM ${DOCKER_TAG}" && \ git show --format="%H" | head -n1 > /opt/OSRM_GITSHA && \ echo "Building OSRM gitsha $(cat /opt/OSRM_GITSHA)" && \ diff --git a/scripts/ci/windows-build.bat b/scripts/ci/windows-build.bat index a74bdd2c2..2102c9340 100644 --- a/scripts/ci/windows-build.bat +++ b/scripts/ci/windows-build.bat @@ -62,7 +62,7 @@ SET test_region_ch=ch\monaco SET test_region_corech=corech\monaco SET test_region_mld=mld\monaco SET test_osm=%test_region%.osm.pbf -COPY %PROJECT_DIR%\test\data\%test_region%.osm.pbf %test_osm% +COPY %PROJECT_DIR%\test\data\%test_region%.osm.pbf %test_osm% %CONFIGURATION%\osrm-extract.exe -p %PROJECT_DIR%\profiles\car.lua %test_osm% IF %ERRORLEVEL% NEQ 0 GOTO ERROR diff --git a/src/extractor/extractor_callbacks.cpp b/src/extractor/extractor_callbacks.cpp index aec61ee9f..ea4744f0e 100644 --- a/src/extractor/extractor_callbacks.cpp +++ b/src/extractor/extractor_callbacks.cpp @@ -23,8 +23,6 @@ #include #ifdef _MSC_VER -#if (_MSC_VER >= 1928) -#ifdef _DEBUG namespace osrm { namespace extractor @@ -37,8 +35,6 @@ const ByEdgeOrByMeterValue::ValueByMeter ByEdgeOrByMeterValue::by_meter; } // namespace extractor } // namespace osrm #endif -#endif -#endif namespace osrm::extractor {