// 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;
// 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;
// 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=")) {
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;
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);
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)) {
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);
}
{"-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},
case FileType::included_pch_file:
return ".pch";
+
+ case FileType::callgraph_info:
+ return ".ci";
}
return k_unknown_file_type;
// 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);
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 {};
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"
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"));
}