Changeset 63 for trunk/tools/mapsymw.pl


Ignore:
Timestamp:
Mar 21, 2019, 11:05:05 PM (6 years ago)
Author:
Gregg Young
Message:

Updated mapsymw from Steven Levine

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tools/mapsymw.pl

    r7 r63  
    22# mapsymw - mapsym wrapper Watcom map files
    33
    4 # Copyright (c) 2007, 2015 Steven Levine and Associates, Inc.
     4# Copyright (c) 2007-2019 Steven Levine and Associates, Inc.
    55# All rights reserved.
    66
     
    1010
    1111# 2007-07-02 SHL Baseline
    12 # 2007-07-02 SHL Adapt from mapsymb.pl
    13 # 2007-07-28 SHL Relax module name detect
    14 # 2007-07-30 SHL Auto-trim libstdc++ symbols from libc06x maps
    15 # 2007-08-09 SHL Generate dummy symbol for interior segments with no symbols
    16 # 2007-11-08 SHL Drop leading keywords from function definitions
    1712# 2008-12-14 SHL Ensure symbols sorted by value - some apps care
    1813# 2010-05-03 SHL Comments
     
    2217# 2014-11-01 SHL Generate ibm map files in watcom map file directory
    2318# 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
    2421
    2522# mapsym requires each segment to have at least 1 symbol
     
    3734use File::Basename;
    3835
    39 our $g_version = '0.3';
     36our $g_version = '0.4';
    4037
    4138our $g_cmdname;
     
    8279
    8380  my $g_wrkfile = $g_mapfile . '-ibm';
    84   $g_wrkfile =~ s/-watcom-ibm$/-ibm/;           # In case renamed from .map
     81  $g_wrkfile =~ s/-watcom-ibm$/-ibm/;   # In case renamed from .map
    8582  unlink $g_wrkfile || die "unlink $g_wrkfile $!" if -f $g_wrkfile;
    8683  open WRKFILE, ">$g_wrkfile" or die "open $g_wrkfile $!";
     
    10299  while (<MAPFILE>) {
    103100
    104     chomp;                      # EOL
     101    chomp;                              # EOL
    105102
    106103    if (/Executable Image: (\S+)\.\w+$/) {
     
    180177
    181178        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 {
    186182          $seginfo = {max_offset => 0,
    187183                      symcnt => 0};
     
    193189        $seginfo->{symcnt}++;
    194190
    195         $segsinfo{$1} = $seginfo;
     191        $segsinfo{$segnum} = $seginfo;
    196192
    197193        $segaddr = "$segnum:$offset";
    198194
    199195        # Convert C++ symbols to something mapsym will accept
    200         # warn "$sym\n";
     196        warn "\n$sym\n";
    201197
    202198        $_ = $sym;
    203199
    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 _
    216216
    217217        # Drop leading and trailing _ to match source code
    218218
    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";
    223225
    224226        # Prune some libc symbols to avoid mapsym overflows
     
    264266      if (defined($segsinfo{$segnum})) {
    265267        $seginfo = $segsinfo{$segnum};
    266       }
    267       else {
     268      } else {
    268269        $seginfo = {max_offset => 0,
    269270                    symcnt => 0};
     
    287288      }
    288289    }
    289   } # foreach
     290  } # foreach $segnum
    290291
    291292  # Generate symbols by value listing
    292 
    293   my $lastsym = '';
    294   my $seq = 0;
     293  # FIXME to warn if may overflow 64K limit
     294
    295295  @keys = sort keys %syms;
     296  my %used;
    296297  foreach $segaddr (@keys) {
    297298    my $sym = $syms{$segaddr};
    298299    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";
    302306    } else {
    303       $seq++;
    304       $sym = "${sym}_$seq";
     307      $used{$sym} = 0;
    305308    }
    306309    printf WRKFILE $symfmt, $segaddr, $imp, $sym;
    307   }
     310  } # foreach
    308311
    309312  close WRKFILE;
Note: See TracChangeset for help on using the changeset viewer.