package Midas
::PostProcessing
;
# Cant' use Assembly ':internals' because of include circularity
use Midas
::Preprocess
':internals';
our @common_exports = qw(
our @asm_exports = qw(generate_image
our @external_exports = qw(postprocess_assembly);
common
=> [ @common_exports ],
asm
=> [ @asm_exports, @common_exports ],
external
=> [ @external_exports ],
all
=> [ @asm_exports, @common_exports ],
Exporter
::export_ok_tags
('common', 'asm', 'external', 'all');
##############################################################################
sub postprocess_assembly
{
banner
"POSTPROCESSING PHASE";
generate_events
($sfile, $events);
##############################################################################
my $pushd = Midas
::Paths
->pushd($STATE->get_build_dir);
$image = path_to_build_file
($CONFIG{local_image
}, $STATE)
my $symtab = path_to_build_file
($CONFIG{local_symtab
}, $STATE);
my $goldfinger = path_to_build_file
($CONFIG{local_goldfinger
}, $STATE);
chat
"Generating $goldfinger...\n";
my $fh = IO
::File
->new(">$goldfinger") or
fatal
"Can't open $goldfinger: $!\n", M_FILE
;
print $fh "PA_SIZE = $PASIZE;\n";
foreach my $app (keys %{$STATE->{apps
}}) {
my $appobj = $STATE->{apps
}{$app};
$appobj->write_to_goldfinger($fh);
foreach my $tsbname (keys %{$STATE->{tsbs
}}) {
my $tsb = $STATE->{tsbs
}{$tsbname};
$tsb->write_to_goldfinger_file($fh) if $tsb->is_touched();
foreach my $tsblinkname (keys %{$STATE->{tsblinks
}}) {
my $tsblink = $STATE->{tsblinks
}{$tsblinkname};
$tsblink->write_to_goldfinger_file($fh) if $tsblink->is_touched();
my $error_opt = $Midas::Error
::Print_Errors ?
'' : '-noprint_errors ';
my $verbose = ($CONFIG{verbose
} == 0) ?
'-silent ' :
($CONFIG{verbose
} == 2) ?
'-v ' : '';
my $compress_opt = $CONFIG{compress_image
} ?
'' : '-nocompress ';
my $allow_tsb_conflicts_opt = $CONFIG{allow_tsb_conflicts
} ?
'-allow_tsb_conflicts ' : '';
my $allow_duplicate_tags_opt = $CONFIG{allow_duplicate_tags
} ?
'-allow_duplicate_tags ' : '';
my $zero_env_opt = $CONFIG{env_zero
} ?
'' : '-noenvzero ';
my $opts = "${error_opt}${compress_opt}${allow_tsb_conflicts_opt}".
"${allow_duplicate_tags_opt}${zero_env_opt}";
"$CONFIG{goldfinger_cmd} ${verbose}-in $goldfinger ".
"-gentsbs -genimage -imagefile $image -gensymtab -symtabfile $symtab ".
"${opts}-prefix '${Midas::Error::Prg}: '";
run_command
($command, '-pass_errcode');
chat
"$symtab successfully created.\n";
fatal
"$symtab could not be generated.\n", M_GENFAIL
;
chat
"$image successfully created.\n";
fatal
"$image could not be generated.\n", M_GENFAIL
;
##############################################################################
my $pushd = Midas
::Paths
->pushd($STATE->get_build_dir);
$m4file = path_to_build_file
($CONFIG{local_m4
}, $STATE)
$symtab = path_to_build_file
($CONFIG{local_symtab
}, $STATE)
$events = path_to_build_file
($CONFIG{local_events
}, $STATE)
chat
"Generating $events...\n";
chat
"Loading symbol table from $symtab.\n", 3;
my (%vahash, %rahash, %pahash);
my $ifh = IO
::File
->new("<$symtab") or fatal
"Can't open $symtab: $!\n",
my ($sym, $va, $ra, $pa) = /([\w_\.]+)\s+(\w+)\s+(\w+)(?:\s+(\w+))/;
next unless defined $va && defined $ra;
$rahash{$sym} = $ra if defined $ra;
my $ofh = IO
::Pipe
->new();
my $m4_incs = join ' ', map { "--include=$_"} get_m4_includes
();
my $command = "$CONFIG{m4_cmd} $m4_incs > $events";
$ofh->writer("$command") or
fatal
"Cannot run m4 to create $events: $!\n", M_GENFAIL
;
$ofh->print("changequote({, })dnl\n");
$ifh = IO
::File
->new("<$m4file") or
fatal
"Can't open file $m4file for reading: $!\n", M_FILE
;
my ($evline) = /.*!\s*\$EV\s+(.*)$/;
my ($evlinep) = /.*!\s*\$EV\+\s+(.*)$/;
$evline = "" unless defined $evline;
$evlinep = "" unless defined $evlinep;
fatal
"Error in parsing event $_", M_EVENTERR
;
while (/.*\@VA\([\w_\.]*\).*$/) {
($va) = /VA\(([\w_\.]*)\)/;
if (not defined $vahash{$va})
{fatal
"Error in va address: $_\n", M_EVENTERR
;}
s/\@VA\([\w_\.]*\)/"0x$vahash{$va}"/e;
while (/.*\@RA\([\w_\.]*\).*$/) {
($va) = /RA\(([\w_\.]*)\)/;
if (not defined $rahash{$va})
{fatal
"Error in ra address: $_\n", M_EVENTERR
;}
s/\@RA\([\w_\.]*\)/"0x$rahash{$va}"/e;
while (/.*\@PA\([\w_\.]*\).*$/) {
($va) = /PA\(([\w_\.]*)\)/;
if (not defined $pahash{$va})
{fatal
"Error in pa address: $_\n", M_EVENTERR
;}
s/\@PA\([\w_\.]*\)/"0x$pahash{$va}"/e;
my $core = $status & 128;
my $core_msg = $core ?
"Dumped core." : "";
fatal
"Command \"$command\" died via signal $sig. $core_msg\n",
fatal
"Command \"$command\" failed with status $exit. $core_msg\n",
chat
"$events successfully created.\n";
fatal
"$events could not be generated.\n", M_GENFAIL
;
##############################################################################