Changeset 1894


Ignore:
Timestamp:
Aug 6, 2022, 9:35:08 PM (3 years ago)
Author:
Gregg Young
Message:

Update mapsymw.pl

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/debugtools/mapsymw.pl

    r1551 r1894  
    11#!perl -w
    2 # mapsymw - mapsym wrapper Watcom map files
    3 # $Id: $
    4 # Copyright (c) 2007, 2010 Steven Levine and Associates, Inc.
     2# mapsymw - mapsym wrapper form OpenWatcom map files
     3# Generate IBM format map file and run mapsym
     4# Writes IBM format map file to OpenWatcom map file directory
     5
     6# Copyright (c) 2007-2019 Steven Levine and Associates, Inc.
    57# All rights reserved.
    68
     
    911# gnugpl2.txt or at http://www.gnu.org/licenses/licenses.html#GPL
    1012
    11 # 02 Jul 07 SHL Baseline
    12 # 02 Jul 07 SHL Adapt from mapsymb.pl
    13 # 28 Jul 07 SHL Relax module name detect
    14 # 30 Jul 07 SHL Auto-trim libstdc++ symbols from libc06x maps
    15 # 09 Aug 07 SHL Generate dummy symbol for interior segments with no symbols
    16 # 08 Nov 07 SHL Drop leading keywords from function definitions
    17 # 14 Dec 08 SHL Ensure symbols sorted by value - some apps care
    18 # 03 May 10 SHL Comments
    19 # 14 Jun 10 SHL Avoid missing C++ symbols
     13# 2007-07-02 SHL Baseline
     14# 2008-12-14 SHL Ensure symbols sorted by value - some apps care
     15# 2012-03-19 SHL Segment names must be uppercase for pmdf
     16# 2014-06-13 SHL Correct typos
     17# 2014-11-01 SHL Generate ibm map files in watcom map file directory
     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
     21# 2019-03-22 SHL Disable debug code
     22# 2019-04-09 SHL Comments
    2023
    2124# mapsym requires each segment to have at least 1 symbol
     
    3134use POSIX qw(strftime);
    3235use Getopt::Std;
    33 use File::Spec;
    3436use File::Basename;
    3537
    36 our $g_version = '0.3';
     38our $g_version = '0.4';
    3739
    3840our $g_cmdname;
    39 our $g_tmpdir;
    4041our @g_mapfiles;                        # All map files
    4142our $g_mapfile;                         # Current .map file name
     
    5051
    5152foreach $g_mapfile (@g_mapfiles) {
     53  $g_mapfile =~ tr|\\|/|;       # 2015-01-31 SHL Unix slashes for sh.exe
    5254  &mapsym;
    5355}
     
    5759# end main
    5860
    59 #=== initialize() Intialize globals ===
     61#=== initialize() Initialize globals ===
    6062
    6163sub initialize {
    6264
    6365  &set_cmd_name;
    64   &get_tmp_dir;
    6566
    6667} # initialize
     
    7980  open MAPFILE, $g_mapfile or die "open $g_mapfile $!";
    8081
    81   my $g_wrkfile = File::Spec->catfile($g_tmpdir, "$mapid.map");
     82  my $g_wrkfile = $g_mapfile . '-ibm';
     83  $g_wrkfile =~ s/-watcom-ibm$/-ibm/;   # In case renamed from .map
    8284  unlink $g_wrkfile || die "unlink $g_wrkfile $!" if -f $g_wrkfile;
    8385  open WRKFILE, ">$g_wrkfile" or die "open $g_wrkfile $!";
     
    99101  while (<MAPFILE>) {
    100102
    101     chomp;                      # EOL
     103    chomp;                              # EOL
    102104
    103105    if (/Executable Image: (\S+)\.\w+$/) {
     
    177179
    178180        my $seginfo;
    179         if (defined($segsinfo{$1})) {
    180           $seginfo = $segsinfo{$1};
    181         }
    182         else {
     181        if (defined($segsinfo{$segnum})) {
     182          $seginfo = $segsinfo{$segnum};
     183        } else {
    183184          $seginfo = {max_offset => 0,
    184185                      symcnt => 0};
     
    190191        $seginfo->{symcnt}++;
    191192
    192         $segsinfo{$1} = $seginfo;
     193        $segsinfo{$segnum} = $seginfo;
    193194
    194195        $segaddr = "$segnum:$offset";
    195196
    196197        # Convert C++ symbols to something mapsym will accept
    197         # warn "$sym\n";
     198        # warn "\n$sym\n";
    198199
    199200        $_ = $sym;
    200201
    201         # s/\bIdle\b/    /;     # Drop Idle keyword - obsolete done later
    202         s/\(.*\).*$//;          # Drop (...) tails
    203 
    204         s/::~/__x/;             # Replace ::~ with __x
    205         s/::/__/;               # Replace :: with __
    206 
    207         s/[<,]/_/g;             # Replace < and , with _
    208         s/[>]//g;               # Replace > with nothing
    209         s/[\[\]]//g;            # Replace [] with nothing
    210         # s/_*$//;              # Drop trailing _
    211         # s/\W+\w//;            # Drop leading keywords (including Idle)
    212         s/\b.*\b\s+//g;         # Drop leading keywords (including Idle)
     202        s/\s+\(.*\)//;                  # Drop (...) comments preceeded by whitespace
     203
     204        # Make C++ compatible with mapsym
     205
     206        # Drop keywords and decorations
     207        s/\b(near|int|short|unsigned|long|void|char|const|wchar_t)\b\s*[*&]?\s*//g;
     208
     209        # s/<[^<>]+>//g;                # Replace < > templates with nothing
     210
     211        s/std::\s*/std/g;               # Replace std:: with std
     212        s/::~/__x/g;                    # Replace destructor ::~ with __x
     213        s/::/__/g;                      # Replace :: with __
     214
     215        s/[\[\]()<>,]/ /g;              # Replace [ ] < > and , with spaces
     216        s/\s+/_/g;                      # Replace whitespace with single _
     217        s/__+/_/g;                      # Replace multiple _ with single _
    213218
    214219        # Drop leading and trailing _ to match source code
    215220
    216         s/^_//;                 # Drop leading _ (cdecl)
    217         s/_$//;                 # Drop trailing _ (watcall)
    218 
    219         # warn "$_\n";
     221        s/^_//;                         # Drop leading _ (cdecl)
     222        s/_$//;                         # Drop trailing _ (watcall)
     223
     224        $_ = substr($_, 0, 63) if length($_) > 63;              # limit
     225
     226        # warn "\n$_\n";
    220227
    221228        # Prune some libc symbols to avoid mapsym overflows
     
    261268      if (defined($segsinfo{$segnum})) {
    262269        $seginfo = $segsinfo{$segnum};
    263       }
    264       else {
     270      } else {
    265271        $seginfo = {max_offset => 0,
    266272                    symcnt => 0};
     
    268274      if ($seginfo->{symcnt} == 0) {
    269275        warn "Segment $segnum has no symbols - generating dummy symbol\n";
    270         $_ = "Seg${segnum}_dummy";
     276        $_ = "SEG${segnum}_dummy";
    271277        if ($is32bit) {
    272278          $segaddr = "$segnum:00010000";
     
    278284      } elsif ($is32bit && $seginfo->{max_offset} < 0x10000) {
    279285        warn "32 bit segment $segnum is smaller than 64K - generating dummy symbol\n";
    280         $_ = "Seg${segnum}_dummy";
     286        $_ = "SEG${segnum}_dummy";
    281287        $segaddr = "$segnum:00010000";
    282288        $syms{$segaddr} = $_;
     
    284290      }
    285291    }
    286   } # foreach
     292  } # foreach $segnum
    287293
    288294  # Generate symbols by value listing
    289 
    290   my $lastsym = '';
    291   my $seq = 0;
     295  # FIXME to warn if may overflow 64K limit
     296
    292297  @keys = sort keys %syms;
     298  my %used;
    293299  foreach $segaddr (@keys) {
    294300    my $sym = $syms{$segaddr};
    295301    my $imp = substr($segaddr, 0, 4) eq '0000' ? 'Imp' : '';
    296     if ($sym ne $lastsym) {
    297       $lastsym = $sym;
    298       $seq = 0;
     302    # Avoid dups
     303    if (defined $used{$sym}) {
     304      my $seq = $used{$sym};
     305      $seq++;
     306      $used{$sym} = $seq;
     307      $sym = "${sym}_$seq";
    299308    } else {
    300       $seq++;
    301       $sym = "${sym}_$seq";
     309      $used{$sym} = 0;
    302310    }
    303311    printf WRKFILE $symfmt, $segaddr, $imp, $sym;
    304   }
     312  } # foreach
    305313
    306314  close WRKFILE;
     
    416424} # set_cmd_name
    417425
    418 #=== get_tmp_dir() Get TMP dir name with trailing backslash, set Gbl. ===
    419 
    420 sub get_tmp_dir {
    421 
    422   $g_tmpdir = File::Spec->tmpdir();
    423   die "Need to have TMP or TMPDIR or TEMP defined" unless $g_tmpdir;
    424 
    425 } # get_tmp_dir
    426 
    427426# The end
Note: See TracChangeset for help on using the changeset viewer.