return false;
}
}
- if (ctx.args_info.generating_stackusage
- && !serializer.add_file(core::result::FileType::stackusage,
- ctx.args_info.output_su)) {
- 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 LTO is used, then the .su and .ci files are produced during linking.
+ if (!ctx.args_info.using_lto) {
+ if (ctx.args_info.generating_stackusage
+ && !serializer.add_file(core::result::FileType::stackusage,
+ ctx.args_info.output_su)) {
+ 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_ipa_clones
&& !serializer.add_file(core::result::FileType::ipa_clones,
ctx.args_info.output_ipa)) {
if (ctx.args_info.generating_coverage) {
LOG("Coverage file is being generated");
}
- 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.using_lto) {
+ 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.output_dia.empty()) {
LOG("Diagnostics file: {}", ctx.args_info.output_dia);
expect_exists code.su
fi
+ # -------------------------------------------------------------------------
+ TEST "-fstack-usage with -flto"
+
+ cat <<EOF >main.c
+extern int test();
+int main() { return test(); }
+EOF
+
+ cat <<EOF >code.c
+int test() { return 0; }
+EOF
+
+ if $COMPILER -c -fstack-usage -flto main.c >/dev/null 2>&1; then
+ $CCACHE_COMPILE -c -fstack-usage -flto main.c
+ $CCACHE_COMPILE -c -fstack-usage -flto code.c
+ $CCACHE_COMPILE -o output -fstack-usage -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 -flto main.c
+ $CCACHE_COMPILE -c -fstack-usage -flto code.c
+ $CCACHE_COMPILE -o output -fstack-usage -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 "-fstack-usage with -flto=auto"
+
+ cat <<EOF >main.c
+extern int test();
+int main() { return test(); }
+EOF
+
+ cat <<EOF >code.c
+int test() { return 0; }
+EOF
+
+ if $COMPILER -c -fstack-usage -flto=auto main.c >/dev/null 2>&1; then
+ $CCACHE_COMPILE -c -fstack-usage -flto=auto main.c
+ $CCACHE_COMPILE -c -fstack-usage -flto=auto code.c
+ $CCACHE_COMPILE -o output -fstack-usage -flto=auto 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 -flto=auto main.c
+ $CCACHE_COMPILE -c -fstack-usage -flto=auto code.c
+ $CCACHE_COMPILE -o output -fstack-usage -flto=auto 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"
expect_exists code.ci
fi
+ # -------------------------------------------------------------------------
+ TEST "-fcallgraph-info with -flto"
+
+ cat <<EOF >main.c
+extern int test();
+int main() { return test(); }
+EOF
+
+ cat <<EOF >code.c
+int test() { return 0; }
+EOF
+
+ if $COMPILER -c -fcallgraph-info -flto main.c >/dev/null 2>&1; then
+ $CCACHE_COMPILE -c -fcallgraph-info -flto main.c
+ $CCACHE_COMPILE -c -fcallgraph-info -flto code.c
+ $CCACHE_COMPILE -o output -fcallgraph-info -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 -flto main.c
+ $CCACHE_COMPILE -c -fcallgraph-info -flto code.c
+ $CCACHE_COMPILE -o output -fcallgraph-info -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 "-fcallgraph-info with -flto=auto"
+
+ cat <<EOF >main.c
+extern int test();
+int main() { return test(); }
+EOF
+
+ cat <<EOF >code.c
+int test() { return 0; }
+EOF
+
+ if $COMPILER -c -fcallgraph-info -flto=auto main.c >/dev/null 2>&1; then
+ $CCACHE_COMPILE -c -fcallgraph-info -flto=auto main.c
+ $CCACHE_COMPILE -c -fcallgraph-info -flto=auto code.c
+ $CCACHE_COMPILE -o output -fcallgraph-info -flto=auto 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 -flto=auto main.c
+ $CCACHE_COMPILE -c -fcallgraph-info -flto=auto code.c
+ $CCACHE_COMPILE -o output -fcallgraph-info -flto=auto 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"