From f4052bc234b181da3462fed6479674ace0711795 Mon Sep 17 00:00:00 2001 From: Rudolf Polzer Date: Thu, 26 Apr 2012 11:16:19 +0200 Subject: [PATCH] fix parameter handling --- misc/tools/progs-analyzer.pl | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/misc/tools/progs-analyzer.pl b/misc/tools/progs-analyzer.pl index bc4623d5..2adab78b 100644 --- a/misc/tools/progs-analyzer.pl +++ b/misc/tools/progs-analyzer.pl @@ -552,10 +552,43 @@ sub find_uninitialized_locals($$) { $watchme{$_} = { flags => $watchme{$_}, - valid => ($_ >= $func->{parm_start} && $_ < $p) # preinitialize parameters + valid => 0 }; } + # mark parameters as initialized + for($func->{parm_start} .. ($p-1)) + { + $watchme{$_}{valid} = 1 + if defined $watchme{$_}; + } + # an initial run of STORE instruction is for receiving extra parameters + # (beyond 8). Only possible if the function is declared as having 8 params. + # Extra parameters behave otherwise like temps, but are initialized at + # startup. + for($func->{first_statement} .. (@{$progs->{statements}}-1)) + { + my $s = $progs->{statements}[$_]; + if($s->{op} eq 'STORE_V') + { + $watchme{$s->{a}}{valid} = 1 + if defined $watchme{$s->{a}}; + $watchme{$s->{a}+1}{valid} = 1 + if defined $watchme{$s->{a}+1}; + $watchme{$s->{a}+2}{valid} = 1 + if defined $watchme{$s->{a}+2}; + } + elsif($s->{op} =~ /^STORE_/) + { + $watchme{$s->{a}}{valid} = 1 + if defined $watchme{$s->{a}}; + } + else + { + last; + } + } + my %warned = (); run_nfa $progs, $func->{first_statement}, \%watchme, sub { @@ -760,7 +793,6 @@ sub parse_progs($) } $p{temps} = \%istemp; $p{consts} = \%isconst; - # TODO rather detect consts by only reading instructions print STDERR "Naming...\n"; -- 2.39.2