https://gcc.gnu.org/g:d2b89c77861c4a773efada3954e910b6623f8eb5
commit d2b89c77861c4a773efada3954e910b6623f8eb5 Author: Alexandre Oliva <ol...@adacore.com> Date: Thu Aug 15 02:00:18 2024 -0300 Dump aliases in -fcallgraph-info Dump ICF-unified decls, thunks, aliases and whatnot along with their ultimate targets, with edges from the alias to the target. Add support for dropping the source file's suffix when forming from dump-base, so that auxiliary files can be scanned, such as the .ci files generated by -fcallgraph-info, as in the testcase. for gcc/ChangeLog * toplev.cc (dump_final_alias_vcg): New. (dump_final_node_vcg): Dump aliases along with node. for gcc/testsuite/ChangeLog * lib/scandump.exp (dump-base): Support {} in dump base suffix to drop it. * gcc.dg/callgraph-info-1.c: New. Diff: --- gcc/testsuite/gcc.dg/callgraph-info-1.c | 7 +++++++ gcc/testsuite/lib/scandump.exp | 4 ++++ gcc/toplev.cc | 37 +++++++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+) diff --git a/gcc/testsuite/gcc.dg/callgraph-info-1.c b/gcc/testsuite/gcc.dg/callgraph-info-1.c new file mode 100644 index 00000000000..853ff9554ee --- /dev/null +++ b/gcc/testsuite/gcc.dg/callgraph-info-1.c @@ -0,0 +1,7 @@ +/* { dg-do compile } */ +/* { dg-options "-fcallgraph-info" } */ + +void f() {} +void g() __attribute__ ((__alias__ ("f"))); + +/* { dg-final { scan-dump-times "ci" "triangle" 1 "ci" {{}} } } */ diff --git a/gcc/testsuite/lib/scandump.exp b/gcc/testsuite/lib/scandump.exp index 14536ae7379..adf9886b61c 100644 --- a/gcc/testsuite/lib/scandump.exp +++ b/gcc/testsuite/lib/scandump.exp @@ -37,6 +37,10 @@ proc dump-base { args } { # gcc-defs to base compilation dumps only on the source basename. set dumpbase $src if { [string length $dumpbase_suf] != 0 } { + # Accept {} as dump base suffix to drop the source suffix entirely. + if { "$dumpbase_suf" == "{}" } { + set dumpbase_suf "" + } regsub {[.][^.]*$} $src $dumpbase_suf dumpbase } return $dumpbase diff --git a/gcc/toplev.cc b/gcc/toplev.cc index eee4805b504..f308fb15108 100644 --- a/gcc/toplev.cc +++ b/gcc/toplev.cc @@ -914,6 +914,37 @@ dump_final_callee_vcg (FILE *f, location_t location, tree callee) fputs ("\" }\n", f); } +/* Callback for cgraph_node::call_for_symbol_thunks_and_aliases to dump to F_ a + node and an edge from ALIAS->DECL to CURRENT_FUNCTION_DECL. */ + +static bool +dump_final_alias_vcg (cgraph_node *alias, void *f_) +{ + FILE *f = (FILE *)f_; + + if (alias->decl == current_function_decl) + return false; + + dump_final_node_vcg_start (f, alias->decl); + fputs ("\" shape : triangle }\n", f); + + fputs ("edge: { sourcename: \"", f); + print_decl_identifier (f, alias->decl, PRINT_DECL_UNIQUE_NAME); + fputs ("\" targetname: \"", f); + print_decl_identifier (f, current_function_decl, PRINT_DECL_UNIQUE_NAME); + location_t location = DECL_SOURCE_LOCATION (alias->decl); + if (LOCATION_LOCUS (location) != UNKNOWN_LOCATION) + { + expanded_location loc; + fputs ("\" label: \"", f); + loc = expand_location (location); + fprintf (f, "%s:%d:%d", loc.file, loc.line, loc.column); + } + fputs ("\" }\n", f); + + return false; +} + /* Dump final cgraph node in VCG format. */ static void @@ -950,6 +981,12 @@ dump_final_node_vcg (FILE *f) dump_final_callee_vcg (f, c->location, c->decl); vec_free (cfun->su->callees); cfun->su->callees = NULL; + + cgraph_node *node = cgraph_node::get (current_function_decl); + if (!node) + return; + node->call_for_symbol_thunks_and_aliases (dump_final_alias_vcg, f, + true, false); } /* Output stack usage and callgraph info, as requested. */