3 exec tclsh
"$0" ${1+"$@"}
5 # A wrapper around cg_annotate that sets appropriate command-line options
6 # and rearranges the output so that annotated files occur in a consistent
7 # sorted order. Used by the speed-check.tcl script.
10 set in [open
"|cg_annotate --show=Ir --auto=yes --context=40 $argv" r
]
14 set cntlines
0 ;# true to remember cycle counts on each line
15 set seenSqlite3
0 ;# true if we have seen the sqlite3.c file
17 set line
[string map
{\t { }} [gets
$in]]
18 if {[regexp
{^
-- Auto-annotated
source: (.
*)} $line all name
]} {
20 if {[string match
*/sqlite3.c
$dest]} {
26 } elseif
{[regexp
{^
-- line
(\d
+) ------} $line all
ln]} {
27 set line
[lreplace
$line 2 2 {#}]
28 set linenum
[expr {$ln-1}]
29 } elseif
{[regexp
{^The following files chosen
for } $line]} {
32 append out
($dest) $line\n
35 if {[regexp
{^
*([0-9,]+) } $line all x
]} {
36 set x
[string map
{, {}} $x]
37 set cycles
($linenum) $x
41 foreach x
[lsort
[array names out
]] {
45 # If the sqlite3.c file has been seen, then output a summary of the
46 # cycle counts for each file that went into making up sqlite3.c
50 set in [open sqlite3.c
]
53 set pattern1
{^
/\
*+ Begin
file ([^
]+) \
*}
54 set pattern2
{^
/\
*+ Continuing where we left off
in ([^
]+) \
*}
58 if {[regexp
$pattern1 $line all newfn
]} {
60 } elseif
{[regexp
$pattern2 $line all newfn
]} {
62 } elseif
{[info exists cycles
($linenum)]} {
63 incr fcycles
($fn) $cycles($linenum)
67 puts
{**********************************************************************}
70 foreach
{fn cnt
} [array get fcycles
] {
71 lappend lx
[list
$cnt $fn]
74 puts
[format
{%20s
%14d
%8.3f
%%} TOTAL
$sum 100]
75 foreach entry
[lsort
-index 0 -integer -decreasing $lx] {
76 foreach
{cnt fn
} $entry break
77 puts
[format
{%20s
%14d
%8.3f
%%} $fn $cnt [expr {$cnt*100.0/$sum}]]