https://gcc.gnu.org/g:23496098bba769044ed352c0d7bdb317477c16ac

commit r15-3081-g23496098bba769044ed352c0d7bdb317477c16ac
Author: Alexandre Oliva <ol...@adacore.com>
Date:   Thu Aug 22 01:27:55 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 000000000000..853ff9554eeb
--- /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 14536ae7379b..adf9886b61c9 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 eee4805b504a..f308fb151083 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.  */

Reply via email to