@rem = '-*- Mode: Perl -*- @goto endofperl '; require "..\\perl\\lib\\getopts.pl" ; %modules = () ; %objs = () ; %pagesizes = () ; $line = 0 ; $H = "[0-9A-Fa-f]"; do Getopts ('smor') ; die "Invalid arguments\n\nUsage: mapsum [-s] [-m] [-o] [-r] " if ($#ARGV == -1) ; die "Need to specify -m (modules), -s (summary), -o (objects), -r (raw)\n\nUsage: mapsum [-s] [-m] [-o] [-r]" if (!($opt_s || $opt_o || $opt_m || $opt_r)) ; print "Processing summary info..." ; while () { chop; $line++ ; last if (/publics\s+by\s+value/i) ; if (/preferred\s+load\s+address\s+is\s+($H+)/i) { $loadaddr = hex($1) ; } if (/[^:]:$H+\s+($H+)H\s+\S+\s+(\S+)/) { $size = hex($1) ; $page = $2 ; if (/rsrc/) { $rsrcsize += $size ; } else { $pagesizes{$page} += $size ; } } } print "(complete)\n" ; print "Processing modules..." ; $lastaddr = "" ; $lastobj = "" ; $lastmod = "" ; $neednewline = 1 ; while () { chop ; $line++ ; if (($line % 800) == 0) { print "." ; $neednewline = 1 ; } last if (/static symbols/i) ; if (/($H+) ([ f]) ([^: ]+:)?(\S+)$/) { # Get the address $addr = hex($1) ; # print "1: $1 - 2: $2 - 3: $3 - 4: $4 \n"; $fun = ($2 eq "f") ; # Get the module - remove extra : - it may be null $mod = $3 ; chop $mod ; $mod = "(unassigned)" if (!$mod) ; # Get the object file $obj = $4 ; $obj = "(unassigned)" if (!$obj) ; if ($lastaddr) { $size = $addr - $lastaddr ; # print "$line:$lastaddr - $addr - $lastmod - $lastobj - $size\n" ; if ($size >= 0) { ($f,$d) = split(",",$modules{$lastmod}) ; if ($fun) { $f += $size ; } else { $d += $size ; } $modules{$lastmod} = join (",",$f,$d) ; $objkey = join(",",$lastmod,$lastobj) ; ($f,$d) = split(",",$objs{$objkey}) ; if ($fun) { $f += $size ; } else { $d += $size ; } $objs{$objkey} = join (",",$f,$d) ; } else { if ($neednewline) { print "\n" ; $neednewline = 0 ; } print "$line:Negative size - ignoring.\n" ; print "$line:$lastaddr - $addr - $lastmod - $lastobj - $size\n" ; } } $lastaddr = $addr ; $lastmod = $mod ; $lastobj = $obj ; } } print "(complete)\n" ; # -------------------------------- # Summary # -------------------------------- if ($opt_s) { print "\n\n" ; print "Summary Info\n" ; print "============\n" ; $total = 0 ; for (sort (keys %pagesizes)) { $size = $pagesizes{$_} ; $total += $size ; $f = "$_:" ; printf ("%-20s%9d\n",$f,$size) ; } printf ("%-20s%9d\n","Resources",$rsrcsize) ; $total += $rsrcsize ; printf ("%-20s=========\n","") ; printf ("%-20s%9d\n","Total:",$total) ; } # -------------------------------- # Modules # -------------------------------- if ($opt_m) { print "\n\n" ; print "Module Info\n" ; print "============\n" ; printf ("%-20s%-9s %-9s %-9s\n","Module"," Code "," Data "," Total ") ; print "================== ========= ========= =========\n" ; $ftotal = 0 ; $dtotal = 0 ; for (sort (keys %modules)) { ($fsize,$dsize) = split(",",$modules{$_}) ; $ftotal += $fsize ; $dtotal += $dsize ; $f = "$_:" ; printf ("%-20s%9d %9d %9d\n",$f,$fsize,$dsize,$fsize+$dsize) ; } printf ("%-20s========= ========= =========\n","") ; printf ("%-20s%9d %9d %9d\n","Total:",$ftotal,$dtotal,$ftotal+$dtotal) ; } # -------------------------------- # Object files # -------------------------------- if ($opt_o) { print "\n\n" ; print "Object File Info\n" ; print "============\n" ; $ftotal = 0 ; $dtotal = 0 ; $lastmodname = "" ; if ($opt_r) { printf (" %-30s\t%9s\t%9s\t%9s\n","Object File"," Code"," Data"," Total"); printf (" %-30s\t%9s\t%9s\t%9s\n","==========="," ===="," ===="," ====="); } for (sort (keys %objs)) { ($mod,$obj) = split(",",$_) ; ($fsize,$dsize) = split(",",$objs{$_}) ; if ($lastmodname ne $mod) { if (!($opt_r)) { if ($lastmodname ne "") { printf (" %-20s========= ========= =========\n","") ; printf (" %-20s%9d %9d %9d\n","Total:",$ftotal,$dtotal,$ftotal+$dtotal) ; } print "\n" ; print "$mod:\n" ; print "==========\n" ; printf (" %-30s%-9s %-9s %-9s\n","Object File"," Code "," Data "," Total ") ; print " ================== ========= ========= =========\n" ; } $lastmodname = $mod ; $ftotal = 0 ; $dtotal = 0 ; } $ftotal += $fsize ; $dtotal += $dsize ; $f = "$obj:" ; $fname = $f ; if ($opt_r) { $fname = "$mod/$f" ; } printf (" %-30s\t%9d\t%9d\t%9d\n",$fname,$fsize,$dsize,$fsize+$dsize) ; } if ($lastmodname ne "") { printf (" %-20s========= ========= =========\n","") ; printf (" %-20s%9d %9d %9d\n","Total:",$ftotal,$dtotal,$ftotal+$dtotal) ; } } __END__ :endofperl @..\perl\bin\perl %0 %1 %2 %3 %4 %5 %6 %7 %8 %9