#!/usr/bin/perl -w # The purpose of this script is to verify that sdcc has correctly # placed static variables in the same module all within the same bank. # Present versions sometimes get this wrong without giving any warnings # (particularly if there is too much data for a bank). This # script will return an error code if that situation occurs. use strict; my $mapfile = shift @ARGV; die "Provide map file as argument" if (! $mapfile); open(IN, " < $mapfile") || die "$!"; my %banks; my $errors = 0; while() { my @fields = split(/\s+/); if ($#fields > 4 && $fields[3] eq "data" && $fields[4] eq "static") { #print "$fields[1],$fields[2],$fields[3],$fields[4],$fields[5]\n"; my $addr = hex($fields[2]); my $bank = int($addr / 128); if (defined($banks{$fields[5]})) { if ($banks{$fields[5]} != $bank) { print STDERR "Expected bank $banks{$fields[5]} for $fields[1] in $fields[5]\n"; $errors++; } } else { $banks{$fields[5]} = $bank; } } if ($#fields > 4 && $fields[3] eq "data" && $fields[4] eq "extern") { #print "$fields[1] is extern in $fields[5] and needs checking\n"; } } close(IN); exit ($errors > 0);