From: Kristian Sloth Lauszus Date: Sat, 14 Mar 2026 09:50:26 +0000 (+0100) Subject: fix: LTO is disabled if `-fno-lto` is used (#1700) X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b7828d2d2be2ce437fe1d9fa2bd45d8a045be66a;p=thirdparty%2Fccache.git fix: LTO is disabled if `-fno-lto` is used (#1700) If `-flto` is followered by `-fno-lto`, then LTO will be disabled On the other hand if `-fno-lto` is followered by `-flto`, then LTO will be enabled --- diff --git a/src/ccache/argprocessing.cpp b/src/ccache/argprocessing.cpp index 6711e29c..8d5471c8 100644 --- a/src/ccache/argprocessing.cpp +++ b/src/ccache/argprocessing.cpp @@ -951,12 +951,20 @@ process_option_arg(const Context& ctx, return Statistic::none; } + // LTO can be enabled with -flto[=n] if (arg == "-flto" || arg.starts_with("-flto=")) { args_info.using_lto = true; state.add_common_arg(args[i]); return Statistic::none; } + // LTO can be disabled with -fno-lto + if (arg == "-fno-lto") { + args_info.using_lto = false; + state.add_common_arg(args[i]); + return Statistic::none; + } + // -Zs is MSVC's -fsyntax-only equivalent if (arg == "-fsyntax-only" || arg == "-Zs") { args_info.expect_output_obj = false; diff --git a/test/suites/direct.bash b/test/suites/direct.bash index c1d69d45..8964a7d0 100644 --- a/test/suites/direct.bash +++ b/test/suites/direct.bash @@ -714,6 +714,94 @@ EOF fi fi + # ------------------------------------------------------------------------- + TEST "-fstack-usage with -flto -fno-lto" + + cat <main.c +extern int test(); +int main() { return test(); } +EOF + + cat <code.c +int test() { return 0; } +EOF + + if $COMPILER -c -fstack-usage -flto -fno-lto main.c >/dev/null 2>&1; then + $CCACHE_COMPILE -c -fstack-usage -flto -fno-lto main.c + $CCACHE_COMPILE -c -fstack-usage -flto -fno-lto code.c + $CCACHE_COMPILE -o output -fstack-usage -flto -fno-lto main.o code.o + expect_stat called_for_link 1 + expect_stat direct_cache_hit 0 + expect_stat preprocessed_cache_hit 0 + expect_stat cache_miss 2 + expect_exists main.su + expect_exists code.su + expect_missing output.ltrans0.ltrans.su + + rm main.su + rm code.su + + $CCACHE_COMPILE -c -fstack-usage -flto -fno-lto main.c + $CCACHE_COMPILE -c -fstack-usage -flto -fno-lto code.c + $CCACHE_COMPILE -o output -fstack-usage -flto -fno-lto main.o code.o + expect_stat called_for_link 2 + expect_stat direct_cache_hit 2 + expect_stat preprocessed_cache_hit 0 + expect_stat cache_miss 2 + expect_exists main.su + expect_exists code.su + expect_missing output.ltrans0.ltrans.su + fi + + # ------------------------------------------------------------------------- + TEST "-fstack-usage with -fno-lto -flto" + + cat <main.c +extern int test(); +int main() { return test(); } +EOF + + cat <code.c +int test() { return 0; } +EOF + + if $COMPILER -c -fstack-usage -fno-lto -flto main.c >/dev/null 2>&1; then + $CCACHE_COMPILE -c -fstack-usage -fno-lto -flto main.c + $CCACHE_COMPILE -c -fstack-usage -fno-lto -flto code.c + $CCACHE_COMPILE -o output -fstack-usage -fno-lto -flto main.o code.o + expect_stat called_for_link 1 + expect_stat direct_cache_hit 0 + expect_stat preprocessed_cache_hit 0 + expect_stat cache_miss 2 + expect_missing main.su + expect_missing code.su + + # clang does not produce .su files + if [[ "$(basename "$COMPILER")" != clang* ]]; then + expect_exists output.ltrans0.ltrans.su + expect_contains output.ltrans0.ltrans.su main.c + expect_contains output.ltrans0.ltrans.su code.c + rm output.ltrans0.ltrans.su + fi + + $CCACHE_COMPILE -c -fstack-usage -fno-lto -flto main.c + $CCACHE_COMPILE -c -fstack-usage -fno-lto -flto code.c + $CCACHE_COMPILE -o output -fstack-usage -fno-lto -flto main.o code.o + expect_stat called_for_link 2 + expect_stat direct_cache_hit 2 + expect_stat preprocessed_cache_hit 0 + expect_stat cache_miss 2 + expect_missing main.su + expect_missing code.su + + # clang does not produce .su files + if [[ "$(basename "$COMPILER")" != clang* ]]; then + expect_exists output.ltrans0.ltrans.su + expect_contains output.ltrans0.ltrans.su main.c + expect_contains output.ltrans0.ltrans.su code.c + fi + fi + # ------------------------------------------------------------------------- TEST "-fcallgraph-info" @@ -844,6 +932,87 @@ EOF expect_contains output.ltrans0.ltrans.ci code.c fi + # ------------------------------------------------------------------------- + TEST "-fcallgraph-info with -flto -fno-lto" + + cat <main.c +extern int test(); +int main() { return test(); } +EOF + + cat <code.c +int test() { return 0; } +EOF + + if $COMPILER -c -fcallgraph-info -flto -fno-lto main.c >/dev/null 2>&1; then + $CCACHE_COMPILE -c -fcallgraph-info -flto -fno-lto main.c + $CCACHE_COMPILE -c -fcallgraph-info -flto -fno-lto code.c + $CCACHE_COMPILE -o output -fcallgraph-info -flto -fno-lto main.o code.o + expect_stat called_for_link 1 + expect_stat direct_cache_hit 0 + expect_stat preprocessed_cache_hit 0 + expect_stat cache_miss 2 + expect_exists main.ci + expect_exists code.ci + expect_missing output.ltrans0.ltrans.ci + + rm main.ci + rm code.ci + + $CCACHE_COMPILE -c -fcallgraph-info -flto -fno-lto main.c + $CCACHE_COMPILE -c -fcallgraph-info -flto -fno-lto code.c + $CCACHE_COMPILE -o output -fcallgraph-info -flto -fno-lto main.o code.o + expect_stat called_for_link 2 + expect_stat direct_cache_hit 2 + expect_stat preprocessed_cache_hit 0 + expect_stat cache_miss 2 + expect_exists main.ci + expect_exists code.ci + expect_missing output.ltrans0.ltrans.ci + fi + + # ------------------------------------------------------------------------- + TEST "-fcallgraph-info with -fno-lto -flto" + + cat <main.c +extern int test(); +int main() { return test(); } +EOF + + cat <code.c +int test() { return 0; } +EOF + + if $COMPILER -c -fcallgraph-info -fno-lto -flto main.c >/dev/null 2>&1; then + $CCACHE_COMPILE -c -fcallgraph-info -fno-lto -flto main.c + $CCACHE_COMPILE -c -fcallgraph-info -fno-lto -flto code.c + $CCACHE_COMPILE -o output -fcallgraph-info -fno-lto -flto main.o code.o + expect_stat called_for_link 1 + expect_stat direct_cache_hit 0 + expect_stat preprocessed_cache_hit 0 + expect_stat cache_miss 2 + expect_missing main.ci + expect_missing code.ci + expect_exists output.ltrans0.ltrans.ci + expect_contains output.ltrans0.ltrans.ci main.c + expect_contains output.ltrans0.ltrans.ci code.c + + rm output.ltrans0.ltrans.ci + + $CCACHE_COMPILE -c -fcallgraph-info -fno-lto -flto main.c + $CCACHE_COMPILE -c -fcallgraph-info -fno-lto -flto code.c + $CCACHE_COMPILE -o output -fcallgraph-info -fno-lto -flto main.o code.o + expect_stat called_for_link 2 + expect_stat direct_cache_hit 2 + expect_stat preprocessed_cache_hit 0 + expect_stat cache_miss 2 + expect_missing main.ci + expect_missing code.ci + expect_exists output.ltrans0.ltrans.ci + expect_contains output.ltrans0.ltrans.ci main.c + expect_contains output.ltrans0.ltrans.ci code.c + fi + # ------------------------------------------------------------------------- TEST "Direct mode on cache created by ccache without direct mode support"