Changeset 63 for trunk/tools/mapsymw.pl
- Timestamp:
- Mar 21, 2019, 11:05:05 PM (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/tools/mapsymw.pl
r7 r63 2 2 # mapsymw - mapsym wrapper Watcom map files 3 3 4 # Copyright (c) 2007 , 2015Steven Levine and Associates, Inc.4 # Copyright (c) 2007-2019 Steven Levine and Associates, Inc. 5 5 # All rights reserved. 6 6 … … 10 10 11 11 # 2007-07-02 SHL Baseline 12 # 2007-07-02 SHL Adapt from mapsymb.pl13 # 2007-07-28 SHL Relax module name detect14 # 2007-07-30 SHL Auto-trim libstdc++ symbols from libc06x maps15 # 2007-08-09 SHL Generate dummy symbol for interior segments with no symbols16 # 2007-11-08 SHL Drop leading keywords from function definitions17 12 # 2008-12-14 SHL Ensure symbols sorted by value - some apps care 18 13 # 2010-05-03 SHL Comments … … 22 17 # 2014-11-01 SHL Generate ibm map files in watcom map file directory 23 18 # 2015-01-31 SHL Use unix slashes to keep kLIBC sh.exe happy 19 # 2019-03-02 SHL More C++ logic 20 # 2019-03-03 SHL Rework dup logic and sym length limiting 24 21 25 22 # mapsym requires each segment to have at least 1 symbol … … 37 34 use File::Basename; 38 35 39 our $g_version = '0. 3';36 our $g_version = '0.4'; 40 37 41 38 our $g_cmdname; … … 82 79 83 80 my $g_wrkfile = $g_mapfile . '-ibm'; 84 $g_wrkfile =~ s/-watcom-ibm$/-ibm/; 81 $g_wrkfile =~ s/-watcom-ibm$/-ibm/; # In case renamed from .map 85 82 unlink $g_wrkfile || die "unlink $g_wrkfile $!" if -f $g_wrkfile; 86 83 open WRKFILE, ">$g_wrkfile" or die "open $g_wrkfile $!"; … … 102 99 while (<MAPFILE>) { 103 100 104 chomp; # EOL101 chomp; # EOL 105 102 106 103 if (/Executable Image: (\S+)\.\w+$/) { … … 180 177 181 178 my $seginfo; 182 if (defined($segsinfo{$1})) { 183 $seginfo = $segsinfo{$1}; 184 } 185 else { 179 if (defined($segsinfo{$segnum})) { 180 $seginfo = $segsinfo{$segnum}; 181 } else { 186 182 $seginfo = {max_offset => 0, 187 183 symcnt => 0}; … … 193 189 $seginfo->{symcnt}++; 194 190 195 $segsinfo{$ 1} = $seginfo;191 $segsinfo{$segnum} = $seginfo; 196 192 197 193 $segaddr = "$segnum:$offset"; 198 194 199 195 # Convert C++ symbols to something mapsym will accept 200 # warn "$sym\n";196 warn "\n$sym\n"; 201 197 202 198 $_ = $sym; 203 199 204 # s/\bIdle\b/ /; # Drop Idle keyword - obsolete done later 205 s/\(.*\).*$//; # Drop (...) tails 206 207 s/::~/__x/; # Replace ::~ with __x 208 s/::/__/; # Replace :: with __ 209 210 s/[<,]/_/g; # Replace < and , with _ 211 s/[>]//g; # Replace > with nothing 212 s/[\[\]]//g; # Replace [] with nothing 213 # s/_*$//; # Drop trailing _ 214 # s/\W+\w//; # Drop leading keywords (including Idle) 215 s/\b.*\b\s+//g; # Drop leading keywords (including Idle) 200 s/\s+\(.*\)//; # Drop (...) comments preceeded by whitespace 201 202 # Make C++ compatible with mapsym 203 204 # Drop keywords and decorations 205 s/\b(near|int|short|unsigned|long|void|char|const|wchar_t)\b\s*[*&]?\s*//g; 206 207 # s/<[^<>]+>//g; # Replace < > templates with nothing 208 209 s/std::\s*/std/g; # Replace std:: with std 210 s/::~/__x/g; # Replace destructor ::~ with __x 211 s/::/__/g; # Replace :: with __ 212 213 s/[\[\]()<>,]/ /g; # Replace [ ] < > and , with spaces 214 s/\s+/_/g; # Replace whitespace with single _ 215 s/__+/_/g; # Replace multiple _ with single _ 216 216 217 217 # Drop leading and trailing _ to match source code 218 218 219 s/^_//; # Drop leading _ (cdecl) 220 s/_$//; # Drop trailing _ (watcall) 221 222 # warn "$_\n"; 219 s/^_//; # Drop leading _ (cdecl) 220 s/_$//; # Drop trailing _ (watcall) 221 222 $_ = substr($_, 0, 63) if length($_) > 63; # limit 223 224 warn "\n$_\n"; 223 225 224 226 # Prune some libc symbols to avoid mapsym overflows … … 264 266 if (defined($segsinfo{$segnum})) { 265 267 $seginfo = $segsinfo{$segnum}; 266 } 267 else { 268 } else { 268 269 $seginfo = {max_offset => 0, 269 270 symcnt => 0}; … … 287 288 } 288 289 } 289 } # foreach 290 } # foreach $segnum 290 291 291 292 # Generate symbols by value listing 292 293 my $lastsym = ''; 294 my $seq = 0; 293 # FIXME to warn if may overflow 64K limit 294 295 295 @keys = sort keys %syms; 296 my %used; 296 297 foreach $segaddr (@keys) { 297 298 my $sym = $syms{$segaddr}; 298 299 my $imp = substr($segaddr, 0, 4) eq '0000' ? 'Imp' : ''; 299 if ($sym ne $lastsym) { 300 $lastsym = $sym; 301 $seq = 0; 300 # Avoid dups 301 if (defined $used{$sym}) { 302 my $seq = $used{$sym}; 303 $seq++; 304 $used{$sym} = $seq; 305 $sym = "${sym}_$seq"; 302 306 } else { 303 $seq++; 304 $sym = "${sym}_$seq"; 307 $used{$sym} = 0; 305 308 } 306 309 printf WRKFILE $symfmt, $segaddr, $imp, $sym; 307 } 310 } # foreach 308 311 309 312 close WRKFILE;
Note:
See TracChangeset
for help on using the changeset viewer.