From: Jiri Slaby Date: Sun, 12 May 2024 07:48:28 +0000 (+0200) Subject: feat: Add support for -fdump-ipa-clones (#1449) X-Git-Tag: v4.10~22 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=23f40d2902acd394d85344d7db4869403e4859e7;p=thirdparty%2Fccache.git feat: Add support for -fdump-ipa-clones (#1449) Fixes #1447. Citing: `-fdump-ipa-clones` is used heavily for live patching. Especially, when one builds a distro kernel (like SLE 15 SP6), the build uses the option to generate additional `.000i.ipa-clones` files. --- diff --git a/src/ccache/ArgsInfo.hpp b/src/ccache/ArgsInfo.hpp index a9e2ae0f..664af3f8 100644 --- a/src/ccache/ArgsInfo.hpp +++ b/src/ccache/ArgsInfo.hpp @@ -64,6 +64,9 @@ struct ArgsInfo // Split dwarf information (GCC 4.8 and up). Contains pathname if not empty. std::string output_dwo; + // The path to the ipa clones (implicit when using -fdump-ipa-clones). + std::string output_ipa; + // Assembler listing file. std::string output_al; @@ -92,6 +95,8 @@ struct ArgsInfo // Is the compiler being asked to output stack usage? bool generating_stackusage = false; + bool generating_ipa_clones = false; + bool generating_callgraphinfo = false; // Us the compiler being asked to generate diagnostics diff --git a/src/ccache/argprocessing.cpp b/src/ccache/argprocessing.cpp index 346434b3..ef08d134 100644 --- a/src/ccache/argprocessing.cpp +++ b/src/ccache/argprocessing.cpp @@ -418,6 +418,12 @@ process_option_arg(const Context& ctx, return Statistic::none; } + if (arg == "-fdump-ipa-clones") { + args_info.generating_ipa_clones = true; + state.common_args.push_back(args[i]); + return Statistic::none; + } + // These are always too hard. if (compopt_too_hard(arg) || util::starts_with(arg, "-fdump-") || util::starts_with(arg, "-MJ") @@ -1602,6 +1608,13 @@ process_args(Context& ctx) pstr(core::make_relative_path(ctx, default_cifile_name)).str(); } + if (args_info.generating_ipa_clones) { + fs::path ipa_path(args_info.orig_input_file); + ipa_path += ".000i.ipa-clones"; + args_info.output_ipa = + pstr(core::make_relative_path(ctx, ipa_path.string())).str(); + } + 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/ccache.cpp b/src/ccache/ccache.cpp index 7a01db57..a53d55a0 100644 --- a/src/ccache/ccache.cpp +++ b/src/ccache/ccache.cpp @@ -955,6 +955,12 @@ write_result(Context& ctx, LOG("Callgraph info file {} missing", ctx.args_info.output_ci); return false; } + if (ctx.args_info.generating_ipa_clones + && !serializer.add_file(core::Result::FileType::ipa_clones, + ctx.args_info.output_ipa)) { + LOG("IPA clones file {} missing", ctx.args_info.output_ipa); + return false; + } if (ctx.args_info.generating_diagnostics && !serializer.add_file(core::Result::FileType::diagnostic, ctx.args_info.output_dia)) { diff --git a/src/ccache/core/Result.cpp b/src/ccache/core/Result.cpp index b22ae0e7..5d1819ed 100644 --- a/src/ccache/core/Result.cpp +++ b/src/ccache/core/Result.cpp @@ -153,6 +153,9 @@ file_type_to_string(FileType type) case FileType::callgraph_info: return ".ci"; + + case FileType::ipa_clones: + return ".000i.ipa-clones"; } return k_unknown_file_type; diff --git a/src/ccache/core/Result.hpp b/src/ccache/core/Result.hpp index 01ddfb6f..f0010a94 100644 --- a/src/ccache/core/Result.hpp +++ b/src/ccache/core/Result.hpp @@ -88,6 +88,10 @@ enum class FileType : UnderlyingFileTypeInt { // callgraph info file generated by -fcallgraph-info, i.e. output file but // with a .ci extension. callgraph_info = 11, + + // ipa clones generated by -fdump-ipa-clones, i.e. output file but with a + // .000i.ipa-clones extension. + ipa_clones = 12, }; const char* file_type_to_string(FileType type); diff --git a/src/ccache/core/ResultRetriever.cpp b/src/ccache/core/ResultRetriever.cpp index 9f0cbb86..921aff5c 100644 --- a/src/ccache/core/ResultRetriever.cpp +++ b/src/ccache/core/ResultRetriever.cpp @@ -206,6 +206,11 @@ ResultRetriever::get_dest_path(FileType file_type) const return m_ctx.args_info.output_ci; } break; + case FileType::ipa_clones: + if (m_ctx.args_info.generating_ipa_clones) { + return m_ctx.args_info.output_ipa; + } + break; } return {};