X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=ghc%2Fdriver%2Fghc-asm-mips.lprl;h=3c210cb97389329076d579c5c6405655c24ed86f;hp=635bc1044fcc5266f6e5c642f737f4de841f9100;hb=10521d8418fd3a1cf32882718b5bd28992db36fd;hpb=7fa716e248a1f11fa686965f57aebbb83b74fa7b diff --git a/ghc/driver/ghc-asm-mips.lprl b/ghc/driver/ghc-asm-mips.lprl index 635bc10..3c210cb 100644 --- a/ghc/driver/ghc-asm-mips.lprl +++ b/ghc/driver/ghc-asm-mips.lprl @@ -55,30 +55,6 @@ sub mangle_asm { } elsif ( /^\d+:/ ) { # a funny-looking very-local label $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'; @@ -95,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:$/ ) { @@ -136,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 = $_); @@ -265,7 +267,7 @@ sub mangle_asm { # print out the header stuff first $chk[0] = "\t\.file\t1 \"$ifile_root.hc\"\n" . $chk[0]; - # get rid of horrible "$Revision: 1.1 $" strings + # get rid of horrible "Revision: .*$" strings local(@lines0) = split(/\n/, $chk[0]); local($z) = 0; while ( $z <= $#lines0 ) { @@ -348,6 +350,12 @@ sub mangle_asm { print OUTASM &rev_tbl($symb, $chk[$infochk{$symb}], 1); # entry code will be put 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'; } @@ -356,10 +364,14 @@ sub mangle_asm { # teach it to drop through to the fast entry point: $c = $chk[$slowchk{$symb}]; + if ( defined($fastchk{$symb}) ) { $c =~ s/^\tjmp \$31,\(\$27\),0\n\t\.align 4\n\t\.end/\t.align 4\n\t.end/; } + # ToDo??? any good way to look for "dangling" references + # to fast-entry pt ??? + print OUTASM "\t\.text\n\t\.align 2\n"; print OUTASM $c; $chkcat[$slowchk{$symb}] = 'DONE ALREADY';