]> git.ipfire.org Git - thirdparty/ccache.git/commitdiff
feat: Add support for -fcallgraph-info (#1401)
authorRaihaan Shouhell <raihaanhimself@gmail.com>
Sun, 11 Feb 2024 17:20:38 +0000 (01:20 +0800)
committerGitHub <noreply@github.com>
Sun, 11 Feb 2024 17:20:38 +0000 (18:20 +0100)
src/ArgsInfo.hpp
src/argprocessing.cpp
src/ccache.cpp
src/compopt.cpp
src/core/Result.cpp
src/core/Result.hpp
src/core/ResultRetriever.cpp
test/suites/direct.bash
unittest/test_compopt.cpp

index 6fd3f698ebd1e8e62c818a750f3fa1771f247a29..a6076e342b264a0a8b59a9b385e058317bcd09f2 100644 (file)
@@ -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;
index 97f6493422faddbcc466fae85c8989ea46b23bf2..f09885b79a62b0d135dce8b12284442f18519d17 100644 (file)
@@ -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);
index 3741a8dfeb3719c31fc68eacedbd2dfe432c081f..0d1b1555cdb15a974bb5d493bb260f7cf5a81f04 100644 (file)
@@ -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);
   }
index fca9245249f03376696752266b79ea3f9aaa4ed2..9f1d603a04f5f832d8c85f9a4272aebfaea50fbe 100644 (file)
@@ -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},
index 24b7f379c294a820f5524caeb5027271961323a4..4b4d51fd847bca5df4cd239d556df6111dbc9372 100644 (file)
@@ -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;
index db796a11a7b9e184fbbfb6bfcbc5dda78f84d2a7..3c732f94e1394169d410ef653b00567233c1e1ab 100644 (file)
@@ -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);
index 999d08bf9daf5a075b39668a1ac7ea5dc64fdba4..2b83fd7a47bccba3cb9b1e8e31ecafe2bd1aafd2 100644 (file)
@@ -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 {};
index 77c5ac60186a87137e52ddb18e6c7e48c383ba4d..aa3670d055fd83ad5e96c30f27ddbe8fc38ea937 100644 (file)
@@ -616,6 +616,52 @@ EOF
         expect_exists code.su
     fi
 
+    # -------------------------------------------------------------------------
+    TEST "-fcallgraph-info"
+
+    cat <<EOF >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 <<EOF >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"
 
index 0f0bb986f6c88bca9ce509848c6445c2727c5575..492095f114e9ac4b885cfae71fb3c9aba3512216 100644 (file)
@@ -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"));
 }