From: Raihaan Shouhell Date: Sun, 11 Feb 2024 17:20:38 +0000 (+0800) Subject: feat: Add support for -fcallgraph-info (#1401) X-Git-Tag: v4.10~94 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d5710f688fbf5b7937dfa538d9da084c767bf2e1;p=thirdparty%2Fccache.git feat: Add support for -fcallgraph-info (#1401) --- diff --git a/src/ArgsInfo.hpp b/src/ArgsInfo.hpp index 6fd3f698e..a6076e342 100644 --- a/src/ArgsInfo.hpp +++ b/src/ArgsInfo.hpp @@ -58,6 +58,9 @@ struct ArgsInfo // The path to the stack usage (implicit when using -fstack-usage). std::string output_su; + // The path to the callgraph info (implicit when using -fcallgraph-info). + std::string output_ci; + // Diagnostic generation information (Clang). Contains pathname if not empty. std::string output_dia; @@ -92,6 +95,8 @@ struct ArgsInfo // Is the compiler being asked to output stack usage? bool generating_stackusage = false; + bool generating_callgraphinfo = false; + // Us the compiler being asked to generate diagnostics // (--serialize-diagnostics)? bool generating_diagnostics = false; diff --git a/src/argprocessing.cpp b/src/argprocessing.cpp index 97f649342..f09885b79 100644 --- a/src/argprocessing.cpp +++ b/src/argprocessing.cpp @@ -417,7 +417,6 @@ process_option_arg(const Context& ctx, // These are always too hard. if (compopt_too_hard(arg) || util::starts_with(arg, "-fdump-") - || util::starts_with(arg, "-fcallgraph-info=") || util::starts_with(arg, "-MJ") || util::starts_with(arg, "--config-system-dir=") || util::starts_with(arg, "--config-user-dir=")) { @@ -816,6 +815,13 @@ process_option_arg(const Context& ctx, return Statistic::none; } + // This covers all the different marker cases + if (util::starts_with(arg, "-fcallgraph-info")) { + args_info.generating_callgraphinfo = true; + state.common_args.push_back(args[i]); + return Statistic::none; + } + // -Zs is MSVC's -fsyntax-only equivalent if (arg == "-fsyntax-only" || arg == "-Zs") { args_info.expect_output_obj = false; @@ -1558,6 +1564,12 @@ process_args(Context& ctx) args_info.output_su = Util::make_relative_path(ctx, default_sufile_name); } + if (args_info.generating_callgraphinfo) { + std::string default_cifile_name = + fs::path(args_info.output_obj).replace_extension(".ci").string(); + args_info.output_ci = Util::make_relative_path(ctx, default_cifile_name); + } + Args compiler_args = state.common_args; compiler_args.push_back(state.compiler_only_args_no_hash); compiler_args.push_back(state.compiler_only_args); diff --git a/src/ccache.cpp b/src/ccache.cpp index 3741a8dfe..0d1b1555c 100644 --- a/src/ccache.cpp +++ b/src/ccache.cpp @@ -931,6 +931,12 @@ write_result(Context& ctx, LOG("Stack usage file {} missing", ctx.args_info.output_su); return false; } + if (ctx.args_info.generating_callgraphinfo + && !serializer.add_file(core::Result::FileType::callgraph_info, + ctx.args_info.output_ci)) { + LOG("Callgraph info file {} missing", ctx.args_info.output_ci); + return false; + } if (ctx.args_info.generating_diagnostics && !serializer.add_file(core::Result::FileType::diagnostic, ctx.args_info.output_dia)) { @@ -2530,6 +2536,9 @@ do_cache_compilation(Context& ctx) if (ctx.args_info.generating_stackusage) { LOG("Stack usage file: {}", ctx.args_info.output_su); } + if (ctx.args_info.generating_callgraphinfo) { + LOG("Callgraph info file: {}", ctx.args_info.output_ci); + } if (ctx.args_info.generating_diagnostics) { LOG("Diagnostics file: {}", ctx.args_info.output_dia); } diff --git a/src/compopt.cpp b/src/compopt.cpp index fca924524..9f1d603a0 100644 --- a/src/compopt.cpp +++ b/src/compopt.cpp @@ -122,7 +122,6 @@ const CompOpt compopts[] = { {"-emit-pth", AFFECTS_COMP}, // Clang {"-external:I", AFFECTS_CPP | TAKES_ARG | TAKES_CONCAT_ARG | TAKES_PATH}, // msvc - {"-fcallgraph-info", TOO_HARD}, {"-fmodule-header", TOO_HARD}, {"-fmodules-ts", TOO_HARD}, {"-fno-working-directory", AFFECTS_CPP}, diff --git a/src/core/Result.cpp b/src/core/Result.cpp index 24b7f379c..4b4d51fd8 100644 --- a/src/core/Result.cpp +++ b/src/core/Result.cpp @@ -151,6 +151,9 @@ file_type_to_string(FileType type) case FileType::included_pch_file: return ".pch"; + + case FileType::callgraph_info: + return ".ci"; } return k_unknown_file_type; diff --git a/src/core/Result.hpp b/src/core/Result.hpp index db796a11a..3c732f94e 100644 --- a/src/core/Result.hpp +++ b/src/core/Result.hpp @@ -84,6 +84,10 @@ enum class FileType : UnderlyingFileTypeInt { // PCH file created by msvc additionally to the obj file included_pch_file = 10, + + // callgraph info file generated by -fcallgraph-info, i.e. output file but + // with a .ci extension. + callgraph_info = 11, }; const char* file_type_to_string(FileType type); diff --git a/src/core/ResultRetriever.cpp b/src/core/ResultRetriever.cpp index 999d08bf9..2b83fd7a4 100644 --- a/src/core/ResultRetriever.cpp +++ b/src/core/ResultRetriever.cpp @@ -201,6 +201,12 @@ ResultRetriever::get_dest_path(FileType file_type) const case FileType::included_pch_file: return m_ctx.args_info.included_pch_file; + + case FileType::callgraph_info: + if (m_ctx.args_info.generating_callgraphinfo) { + return m_ctx.args_info.output_ci; + } + break; } return {}; diff --git a/test/suites/direct.bash b/test/suites/direct.bash index 77c5ac601..aa3670d05 100644 --- a/test/suites/direct.bash +++ b/test/suites/direct.bash @@ -616,6 +616,52 @@ EOF expect_exists code.su fi + # ------------------------------------------------------------------------- + TEST "-fcallgraph-info" + + cat <code.c +int test() { return 0; } +EOF + + if $COMPILER -c -fcallgraph-info code.c >/dev/null 2>&1; then + $CCACHE_COMPILE -c -fcallgraph-info code.c + expect_stat direct_cache_hit 0 + expect_stat preprocessed_cache_hit 0 + expect_stat cache_miss 1 + expect_exists code.ci + + rm code.ci + + $CCACHE_COMPILE -c -fcallgraph-info code.c + expect_stat direct_cache_hit 1 + expect_stat preprocessed_cache_hit 0 + expect_stat cache_miss 1 + expect_exists code.ci + fi + + # ------------------------------------------------------------------------- + TEST "-fcallgraph-info=su,da" + + cat <code.c +int test() { return 0; } +EOF + + if $COMPILER -c -fcallgraph-info=su,da code.c >/dev/null 2>&1; then + $CCACHE_COMPILE -c -fcallgraph-info=su,da code.c + expect_stat direct_cache_hit 0 + expect_stat preprocessed_cache_hit 0 + expect_stat cache_miss 1 + expect_exists code.ci + + rm code.ci + + $CCACHE_COMPILE -c -fcallgraph-info=su,da code.c + expect_stat direct_cache_hit 1 + expect_stat preprocessed_cache_hit 0 + expect_stat cache_miss 1 + expect_exists code.ci + fi + # ------------------------------------------------------------------------- TEST "Direct mode on cache created by ccache without direct mode support" diff --git a/unittest/test_compopt.cpp b/unittest/test_compopt.cpp index 0f0bb986f..492095f11 100644 --- a/unittest/test_compopt.cpp +++ b/unittest/test_compopt.cpp @@ -57,6 +57,7 @@ TEST_CASE("too_hard") CHECK(!compopt_too_hard("-fprofile-arcs")); CHECK(!compopt_too_hard("-ftest-coverage")); CHECK(!compopt_too_hard("-fstack-usage")); + CHECK(!compopt_too_hard("-fcallgraph-info")); CHECK(!compopt_too_hard("-doesntexist")); }