Index: third_party/sqlite/src/tool/cg_anno.tcl |
diff --git a/third_party/sqlite/src/tool/cg_anno.tcl b/third_party/sqlite/src/tool/cg_anno.tcl |
index f806c5a5af07011394721e7f0cb376ce9935b9b4..43d2b74fcd1224a3bfb058c47a33f940a529f770 100755 |
--- a/third_party/sqlite/src/tool/cg_anno.tcl |
+++ b/third_party/sqlite/src/tool/cg_anno.tcl |
@@ -2,23 +2,76 @@ |
# |
# A wrapper around cg_annotate that sets appropriate command-line options |
# and rearranges the output so that annotated files occur in a consistent |
-# sorted order. Used by the run-speed-test.tcl script. |
+# sorted order. Used by the speed-check.tcl script. |
# |
set in [open "|cg_annotate --show=Ir --auto=yes --context=40 $argv" r] |
set dest ! |
set out(!) {} |
+set linenum 0 |
+set cntlines 0 ;# true to remember cycle counts on each line |
+set seenSqlite3 0 ;# true if we have seen the sqlite3.c file |
while {![eof $in]} { |
set line [string map {\t { }} [gets $in]] |
if {[regexp {^-- Auto-annotated source: (.*)} $line all name]} { |
set dest $name |
- } elseif {[regexp {^-- line \d+ ------} $line]} { |
+ if {[string match */sqlite3.c $dest]} { |
+ set cntlines 1 |
+ set seenSqlite3 1 |
+ } else { |
+ set cntlines 0 |
+ } |
+ } elseif {[regexp {^-- line (\d+) ------} $line all ln]} { |
set line [lreplace $line 2 2 {#}] |
+ set linenum [expr {$ln-1}] |
} elseif {[regexp {^The following files chosen for } $line]} { |
set dest ! |
} |
append out($dest) $line\n |
+ if {$cntlines} { |
+ incr linenum |
+ if {[regexp {^ *([0-9,]+) } $line all x]} { |
+ set x [string map {, {}} $x] |
+ set cycles($linenum) $x |
+ } |
+ } |
} |
foreach x [lsort [array names out]] { |
puts $out($x) |
} |
+ |
+# If the sqlite3.c file has been seen, then output a summary of the |
+# cycle counts for each file that went into making up sqlite3.c |
+# |
+if {$seenSqlite3} { |
+ close $in |
+ set in [open sqlite3.c] |
+ set linenum 0 |
+ set fn sqlite3.c |
+ set pattern1 {^/\*+ Begin file ([^ ]+) \*} |
+ set pattern2 {^/\*+ Continuing where we left off in ([^ ]+) \*} |
+ while {![eof $in]} { |
+ set line [gets $in] |
+ incr linenum |
+ if {[regexp $pattern1 $line all newfn]} { |
+ set fn $newfn |
+ } elseif {[regexp $pattern2 $line all newfn]} { |
+ set fn $newfn |
+ } elseif {[info exists cycles($linenum)]} { |
+ incr fcycles($fn) $cycles($linenum) |
+ } |
+ } |
+ close $in |
+ puts {**********************************************************************} |
+ set lx {} |
+ set sum 0 |
+ foreach {fn cnt} [array get fcycles] { |
+ lappend lx [list $cnt $fn] |
+ incr sum $cnt |
+ } |
+ puts [format {%20s %14d %8.3f%%} TOTAL $sum 100] |
+ foreach entry [lsort -index 0 -integer -decreasing $lx] { |
+ foreach {cnt fn} $entry break |
+ puts [format {%20s %14d %8.3f%%} $fn $cnt [expr {$cnt*100.0/$sum}]] |
+ } |
+} |