From d9ae89922cd0aa81bddf1507c3fd58c105042f2c Mon Sep 17 00:00:00 2001 From: andre Date: Tue, 13 Jun 2000 15:35:29 +0000 Subject: [PATCH] [project @ 2000-06-13 15:35:29 by andre] RS6000/AIX patches --- ghc/driver/mangler/ghc-asm.lprl | 48 ++++++++++----------------------------- 1 file changed, 12 insertions(+), 36 deletions(-) diff --git a/ghc/driver/mangler/ghc-asm.lprl b/ghc/driver/mangler/ghc-asm.lprl index 0b6ec0c..31d0620 100644 --- a/ghc/driver/mangler/ghc-asm.lprl +++ b/ghc/driver/mangler/ghc-asm.lprl @@ -483,13 +483,7 @@ sub mangle_asm { $chk[++$i] = $_; $chkcat[$i] = 'toc'; $chksymb[$i] = $1; - - } elsif ( $TargetPlatform =~ /^powerpc-|^rs6000-/ && /^CC_.*$/ ) { - # all CC_ symbols go in the data section... - $chk[++$i] = $_; - $chkcat[$i] = 'data'; - $chksymb[$i] = ''; - + } elsif ( /^($TUS[@]?(ret_|djn_)[A-Za-z0-9_]+)/o ) { $chk[++$i] = $_; $chkcat[$i] = 'misc'; @@ -518,6 +512,10 @@ sub mangle_asm { # I guess this is never entered, since all _upds are # either vtbl_'s or ret_'s, caught above. - andre $chksymb[$i] = ''; +# if ($TargetPlatform =~ /^powerpc-/) +# { $chksymb[$i] = $symbtmp;} +# else { $chksymb[$i] = ''; }; + } elsif ( $TargetPlatform =~ /^i386-.*-solaris2/ && /^(_uname|uname|stat|fstat):/ ) { @@ -579,6 +577,7 @@ sub mangle_asm { # HPPAs, MIPSen: also start medding at chunk 1 +# AIX hack for the moment, to join up multiple identical tocs if ($TargetPlatform =~ /^powerpc|^rs6000/) { print OUTASM $T_HDR_toc; # yes, we have to put a .toc # in the beginning of every file! @@ -588,9 +587,7 @@ sub mangle_asm { $chk[$i] =~ s/\[RW\]//g; $chk[$i] =~ s/\[DS\]//g; $chk[$i] =~ s/^\.csect .*\[DS\]$//g; - if ( $chkcat[$i] eq 'toc' && $chk[$i] !~ /\.byte/ ) -#ToDo: instead of all these changes, just fix mangle_powerpc_tailjump and delete/ignore these tocs? { $chk[$i] =~ s/$T_MOVE_DIRVS//g; $chk[$i] =~ s/\t\.tc (\S+)\[TC\],(\S+_fast\d+)/\t\.tc \1\[TC\],\.\2/; $chk[$i] =~ s/\t\.tc (\S+)\[TC\],(\S+_entry)\n/\t\.tc \1\[TC\],\.\2\n/; @@ -600,11 +597,6 @@ sub mangle_asm { $chk[$i] =~ s/\t\.tc (\S+)\[TC\],ErrorIO_innards/\t\.tc \1\[TC\],\.ErrorIO_innards/; $chk[$i] =~ s/\t\.tc (\S+)\[TC\],startStgWorld/\t\.tc \1\[TC\],\.startStgWorld/; $chk[$i] =~ s/\.tc UpdatePAP\[TC\],UpdatePAP/\.tc UpdatePAP\[TC\],\.UpdatePAP/; - $chk[$i] =~ s/\.tc _regMain\[TC\],_regMain/\.tc _regMain\[TC\],\._regMain/; #PROF - $chk[$i] =~ s/\.tc resumeThread\[TC\],resumeThread/\.tc resumeThread\[TC\],\.resumeThread/; #CONC - $chk[$i] =~ s/\.tc EnterNodeCode\[TC\],EnterNodeCode/\.tc EnterNodeCode\[TC\],\.EnterNodeCode/; #CONC - $chk[$i] =~ s/\.tc StackUnderflowEnterNode\[TC\],StackUnderflowEnterNode/\.tc StackUnderflowEnterNode\[TC\],\.StackUnderflowEnterNode/; #CONC - $chk[$i] =~ s/\.tc stopThreadDirectReturn\[TC\],stopThreadDirectReturn/\.tc stopThreadDirectReturn\[TC\],\.stopThreadDirectReturn/; #CONC $chk[$i] =~ s/\.tc IndUpdRetDir\[TC\],IndUpdRetDir/\.tc IndUpdRetDir\[TC\],\.IndUpdRetDir/; $chk[$i] =~ s/\t\.tc (_PRStart_\S+)\[TC\],_PRStart_\S+/\t\.tc \1\[TC\],\.\1/; @@ -665,9 +657,7 @@ sub mangle_asm { } elsif ($TargetPlatform =~ /^powerpc-|^rs6000/) { $p =~ s/^\tmflr 0\n//; $p =~ s/^\tstm \d+,-\d+\(1\)\n//; - $p =~ s/^\tstw? 0,\d+\(1\)\n//g; - $p =~ s/^\tstw? 1,\d+\(1\)\n//g; #mc - $p =~ s/^\tlw?z 0,0\(1\)\n//g; #mc + $p =~ s/^\tstw? 0,\d+\(1\)\n//; $p =~ s/^\tstw?u 1,-\d+\(1\)\n//; $p =~ s/^\tstw? \d+,-\d+\(1\)\n//g; $p =~ s/^\tstfd \d+,-\d+\(1\)\n//g; @@ -858,8 +848,7 @@ sub mangle_asm { #new if ($chksymb[$i] =~ /ret.*upd/ || $KNOWN_FUNNY_THING{$chksymb[$i]} #new || $chksymb[$i] =~ /^$.{T_US}_(PRIn|PRStart).*${T_POST_LBL}$/o ) #new { print OUTASM "\t\.globl $chksymb[$i]\n"; } -# if ($chksymb[$i] ne '' && $chksymb[$i] !~ /ret_[a-z]/ && $chksymb[$i] !~ /djn_[a-z]/) - if ($chksymb[$i] ne '') + if ($chksymb[$i] ne '') { print OUTASM "\t\.globl \.$chksymb[$i]\n"; }; if ($chk[$i] =~ /TOC\[tc0\], 0\n/) { ($p, $r) = split(/TOC\[tc0\], 0\n/, $chk[$i]); $printDS = 1;} @@ -868,10 +857,8 @@ sub mangle_asm { }; &print_doctored($chk[$i], 0); if ($TargetPlatform =~ /^powerpc-|^rs6000-/ && $printDS) { -#ok if ($chksymb[$i] !~ /\_regMain/) { - print OUTASM "\.csect ${chksymb[$i]}[DS]\n"; - print OUTASM "${p}TOC[tc0], 0\n"; -#ok } + print OUTASM "\.csect ${chksymb[$i]}[DS]\n"; + print OUTASM "${p}TOC[tc0], 0\n"; } } @@ -925,11 +912,6 @@ sub mangle_asm { print OUTASM $T_HDR_info; if ($TargetPlatform =~ /^powerpc-|^rs6000-/) { - if ( !defined($slowchk{$symb}) && defined($fastchk{$symb}) ) { - $fastname = $chk[$fastchk{$symb}]; - $fastname =~ s/([_A-Za-z]*_fast\d+):.*(.*\n)*/\1/; - $chk[$infochk{$symb}] =~ s/\.long StdErrorCode/\.long $fastname/; - } $chk[$infochk{$symb}] =~ s/\.long ([_A-Za-z]\S+_entry)/\.long \.\1/; $chk[$infochk{$symb}] =~ s/\.long ([A-Za-z]\S+_upd)/\.long \.\1/; $chk[$infochk{$symb}] =~ s/\.long (IndUpdRet\S+)/\.long \.\1/; @@ -1023,7 +1005,7 @@ sub mangle_asm { if ( $fullname =~ /^[A-Z]/) { print OUTASM "\t\.globl \.${fullname}\n"; } else { -# print OUTASM "\t\.lglobl \.${fullname}\n"; #todo: rm - andre + print OUTASM "\t\.lglobl \.${fullname}\n"; #todo: rm - andre }; $c =~ s/((.*\n)*)\t.long \S+, TOC\[tc0\], 0\n\.csect \.text\[PR\]\n((.*\n)*)/\1\3/; $c = &mangle_powerpc_tailjump($c); @@ -1082,11 +1064,7 @@ sub mangle_asm { print OUTASM $T_HDR_toc; local($j) = $i; while ($chkcat[$j] eq 'toc') - { if ( $chk[$j] !~ /\.tc UpdatePAP\[TC\]/ # not needed: always turned into a jump. - ) - { - print OUTASM $chk[$j]; - } + { print OUTASM $chk[$j]; $chkcat[$j] = 'DONE ALREADY'; $j++; } @@ -1547,8 +1525,6 @@ sub mini_mangle_asm_powerpc { s/long _PRMarking_MarkNextCAF\[DS\]/long ._PRMarking_MarkNextCAF/; s/long _PRMarking_MarkNextAStack\[DS\]/long ._PRMarking_MarkNextAStack/; s/long _PRMarking_MarkNextBStack\[DS\]/long ._PRMarking_MarkNextBStack/; - s/\.tc EnterNodeCode\[TC]\,EnterNodeCode\[DS\]/\.tc EnterNodeCode\[TC]\,.EnterNodeCode/; # CONC - s/\.tc CheckHeapCode\[TC]\,CheckHeapCode\[DS\]/\.tc CheckHeapCode\[TC]\,.CheckHeapCode/; # CONC print OUTASM; } -- 1.7.10.4