Hello,

I'd like to get more helpful information from the final .S file, such
as basic block info, so that I can draw a cfg graph through a script.
Perhaps the -fverbose-asm option is the right way to open this
functionality. Here's a simple patch based on the current trunk svn.

Index: gcc/final.c
===================================================================
--- gcc/final.c (revision 144878)
+++ gcc/final.c (working copy)
@@ -1830,10 +1830,38 @@ final_scan_insn (rtx insn, FILE *file, i
          targetm.asm_out.unwind_emit (asm_out_file, insn);
 #endif

-         if (flag_debug_asm)
+         if (flag_debug_asm && !flag_verbose_asm)
            fprintf (asm_out_file, "\t%s basic block %d\n",
                     ASM_COMMENT_START, NOTE_BASIC_BLOCK (insn)->index);

+          /* Print basic block info. */
+          if (flag_verbose_asm)
+            {
+              fprintf (asm_out_file, "\t%s BLOCK %d",
+                       ASM_COMMENT_START, NOTE_BASIC_BLOCK (insn)->index);
+              if (NOTE_BASIC_BLOCK (insn)->frequency)
+                fprintf (asm_out_file, " freq: %d",
+                         NOTE_BASIC_BLOCK (insn)->frequency);
+              if (NOTE_BASIC_BLOCK (insn)->count)
+                fprintf (asm_out_file, " count: %d",
+                         NOTE_BASIC_BLOCK (insn)->count);
+              fprintf (asm_out_file, "\n");
+
+              fprintf (asm_out_file, "\t%s PRED:", ASM_COMMENT_START);
+              FOR_EACH_EDGE (e, ei, NOTE_BASIC_BLOCK (insn)->preds)
+                {
+                  dump_edge_info (asm_out_file, e, 0);
+                }
+              fprintf (asm_out_file, "\n");
+
+              fprintf (asm_out_file, "\t%s SUCC:", ASM_COMMENT_START);
+              FOR_EACH_EDGE (e, ei, NOTE_BASIC_BLOCK (insn)->succs)
+                {
+                  dump_edge_info (asm_out_file, e, 1);
+                }
+              fprintf (asm_out_file, "\n");
+            }
+
          if ((*seen & (SEEN_EMITTED | SEEN_BB)) == SEEN_BB)
            {
              *seen |= SEEN_EMITTED;

Also, I think it will be better to generate one label for each basic
block, and the local label should have the function name as the
suffix. Because some profile tools, such as oprofile, will output
samples based on the labels. So this will help us to analyze the
samples for each basic block. But current generated code will have
many local labels with the same name. Perhaps it's again the
-fverbose-asm to enable this functionality. But where should I go if I
wanna implement this functionality?

Cheers,

Eric Fisher
Mar 16, 2009

Reply via email to