[project @ 1996-01-11 14:06:51 by partain]
[ghc-hetmet.git] / ghc / driver / ghc-asm-sparc.lprl
index 8560c1a..ffe91ae 100644 (file)
@@ -39,7 +39,6 @@ sub mangle_asm {
     %slowchk = ();     # ditto, its regular "slow" entry code
     %fastchk = ();     # ditto, fast entry code
     %closurechk = ();  # ditto, the (static) closure
-    %num_infos = ();   # this symbol base has this many info tables (1-3)
     %infochk = ();     # given a symbol base, say what chunk its info tbl is in
     %vectorchk = ();    # ditto, return vector table
     %directchk = ();    # ditto, direct return code
@@ -56,30 +55,6 @@ sub mangle_asm {
 
            $chk[$i] .= $_;
 
-       } elsif ( /^_(ret_|djn_)/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'misc';
-           $chksymb[$i] = '';
-
-       } elsif ( /^_vtbl_([A-Za-z0-9_]+):$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'vector';
-           $chksymb[$i] = $1;
-
-           $vectorchk{$1} = $i;
-
-       } elsif ( /^_([A-Za-z0-9_]+)DirectReturn:$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'direct';
-           $chksymb[$i] = $1;
-
-           $directchk{$1} = $i;
-
-       } elsif ( /^_[A-Za-z0-9_]+_upd:$/ ) {
-           $chk[++$i] .= $_;
-           $chkcat[$i] = 'misc';
-           $chksymb[$i] = '';
-
        } elsif ( /^LC(\d+):$/ ) {
            $chk[++$i] .= $_;
            $chkcat[$i] = 'string';
@@ -96,6 +71,8 @@ sub mangle_asm {
            $chkcat[$i] = 'infotbl';
            $chksymb[$i] = $symb;
 
+           die "Info table already? $symb; $i\n" if defined($infochk{$symb});
+
            $infochk{$symb} = $i;
 
        } elsif ( /^_([A-Za-z0-9_]+)_entry:$/ ) {
@@ -137,6 +114,30 @@ sub mangle_asm {
            $chkcat[$i] = 'data';
            $chksymb[$i] = '';
 
+       } elsif ( /^_(ret_|djn_)/ ) {
+           $chk[++$i] .= $_;
+           $chkcat[$i] = 'misc';
+           $chksymb[$i] = '';
+
+       } elsif ( /^_vtbl_([A-Za-z0-9_]+):$/ ) {
+           $chk[++$i] .= $_;
+           $chkcat[$i] = 'vector';
+           $chksymb[$i] = $1;
+
+           $vectorchk{$1} = $i;
+
+       } elsif ( /^_([A-Za-z0-9_]+)DirectReturn:$/ ) {
+           $chk[++$i] .= $_;
+           $chkcat[$i] = 'direct';
+           $chksymb[$i] = $1;
+
+           $directchk{$1} = $i;
+
+       } elsif ( /^_[A-Za-z0-9_]+_upd:$/ ) {
+           $chk[++$i] .= $_;
+           $chkcat[$i] = 'misc';
+           $chksymb[$i] = '';
+
        } elsif ( /^_[A-Za-z0-9_]/ ) {
            local($thing);
            chop($thing = $_);
@@ -259,6 +260,12 @@ sub mangle_asm {
                print OUTASM &rev_tbl($symb, $chk[$infochk{$symb}], 1);
                # entry code will follow, here!
 
+               # paranoia
+               if ( $chk[$infochk{$symb}] =~ /\.word\s+([A-Za-z0-9_]+_entry)$/
+                 && $1 ne "_${symb}_entry" ) {
+                   print STDERR "!!! entry point???\n",$chk[$infochk{$symb}];
+               }
+
                $chkcat[$infochk{$symb}] = 'DONE ALREADY';
            }
 
@@ -267,11 +274,14 @@ sub mangle_asm {
 
                # teach it to drop through to the fast entry point:
                $c = $chk[$slowchk{$symb}];
-               $c =~ s/^\tcall _${symb}_fast\d+,.*\n\tnop\n//;
-               $c =~ s/^\tcall _${symb}_fast\d+,.*\n(\t[a-z].*\n)/\1/;
+
+               if ( defined($fastchk{$symb}) ) {
+                   $c =~ s/^\tcall _${symb}_fast\d+,.*\n\tnop\n//;
+                   $c =~ s/^\tcall _${symb}_fast\d+,.*\n(\t[a-z].*\n)/\1/;
+               }
 
                print STDERR "still has jump to fast entry point:\n$c"
-                   if $c =~ /_${symb}_fast/;
+                   if $c =~ /_${symb}_fast/; # NB: paranoia
 
                print OUTASM "\.text\n\t\.align 4\n";
                print OUTASM $c;