Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
GHC
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Requirements
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Releases
Package Registry
Model registry
Operate
Terraform modules
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Gesh
GHC
Commits
64d3966d
Commit
64d3966d
authored
24 years ago
by
sof
Browse files
Options
Downloads
Patches
Plain Diff
[project @ 2000-06-13 15:35:29 by sof]
When doing -monly-x-regs, fix up entry and exit from PerformGC_wrapper
parent
8ef57b89
No related branches found
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
ghc/driver/mangler/ghc-asm.lprl
+24
-78
24 additions, 78 deletions
ghc/driver/mangler/ghc-asm.lprl
with
24 additions
and
78 deletions
ghc/driver/mangler/ghc-asm.lprl
+
24
−
78
View file @
64d3966d
...
...
@@ -89,7 +89,7 @@ sub init_TARGET_STUFF {
$T_MOVE_DIRVS = '^((\s+\.(IMPORT|EXPORT|PARAM).*|\s+\.align\s+\d+|\s+\.(SPACE|SUBSPA)\s+\S+|\s*)\n)';
$T_COPY_DIRVS = '^\s+\.(IMPORT|EXPORT)';
$T_hsc_cc_PAT = '\.STRING.*\)(hsc|cc) (.*)\\\\x09(.*)\\\\x00
"
';
$T_hsc_cc_PAT = '\.STRING.*\)(hsc|cc) (.*)\\\\x09(.*)\\\\x00';
$T_DOT_WORD = '\.word';
$T_DOT_GLOBAL = '^\s+\.EXPORT';
$T_HDR_literal = "\t.SPACE \$TEXT\$\n\t.SUBSPA \$LIT\$\n";
...
...
@@ -117,7 +117,7 @@ sub init_TARGET_STUFF {
$T_X86_PRE_LLBL = 'L';
$T_X86_BADJMP = '^\tjmp [^L\*]';
$T_MOVE_DIRVS = '^(\s*(\.
(p2)?
align\s+\d+(,0x90)?|\.globl\s+\S+|\.text|\.data|\.stab[^n].*|\.type\s+.*|\.size\s+.*)\n)';
$T_MOVE_DIRVS = '^(\s*(\.align\s+\d+(,0x90)?|\.globl\s+\S+|\.text|\.data|\.stab[^n].*|\.type\s+.*|\.size\s+.*)\n)';
$T_COPY_DIRVS = '\.(globl|stab)';
$T_hsc_cc_PAT = '\.ascii.*\)(hsc|cc) (.*)\\\\11"\n\t\.ascii\s+"(.*)\\\\0"';
$T_DOT_WORD = '\.long';
...
...
@@ -400,15 +400,6 @@ sub mangle_asm {
&& /^\t\.(globl \S+ \.text|comm\t)/ ) {
$EXTERN_DECLS .= $_ unless /(__DISCARD__|\b(PK_|ASSIGN_)(FLT|DBL)\b)/;
# As a temporary solution for compiling "foreign export" declarations,
# we use global variables to pass arguments from C to STG land.
# These declarations live in the .hc file and not in the generated C
# stub file, so we let them pass through here.
} elsif ( /^[\t]?\.comm[\t ]+${TUS}__fexp_.*$/ ) {
$chk[++$i] = $_;
$chkcat[$i] = 'data';
$chksymb[$i] = '';
} elsif ( /^\s+/ ) { # most common case first -- a simple line!
# duplicated from the bottom
...
...
@@ -528,15 +519,6 @@ sub mangle_asm {
# either vtbl_'s or ret_'s, caught above. - andre
$chksymb[$i] = '';
# As a temporary solution for compiling "foreign export" declarations,
# we use global variables to pass arguments from C to STG land.
# These declarations live in the .hc file and not in the generated C
# stub file, so we let them pass through here.
} elsif ( /^[\t ]*\.comm[\t ]+${TUS}__fexp_.*$/ ) {
$chk[++$i] = $_;
$chkcat[$i] = 'data';
$chksymb[$i] = '';
} elsif ( $TargetPlatform =~ /^i386-.*-solaris2/
&& /^(_uname|uname|stat|fstat):/ ) {
# for some utterly bizarre reason, this platform
...
...
@@ -563,7 +545,6 @@ sub mangle_asm {
unless $KNOWN_FUNNY_THING{$thing}
|| /^$TUS[@]?_(PRIn|PRStart).*$TPOSTLBL[@]?$/o # pointer reversal GC routines
|| /^$TUS[@]?CC_.*$TPOSTLBL$/o # PROF: _CC_ccident ([@]? is a silly hack (see above))
|| /^$TUS__fexp_.*$TPOSTLBL$/o # foreign export droppings (temporary)
|| /^$TUS[@]?_reg.*$TPOSTLBL$/o; # PROF: __reg<module>
$chk[++$i] = $_;
$chkcat[$i] = 'misc';
...
...
@@ -911,25 +892,6 @@ sub mangle_asm {
$consist =~ s/\//./g;
$consist =~ s/-/_/g;
$consist =~ s/[^A-Za-z0-9_.]/ZZ/g; # ToDo: properly?
#
# Using a cygnus-2.7-96q4 gcc build on hppas, the
# consistency chunk for ghc_cc_ID often (but not always!)
# gets lumped with a bunch of .IMPORT directives containing info on
# the code or data space nature of external symbols. We can't
# toss these, so once the consistency ID has been turned into
# a representable symbol, we substitute it for the symbol
# that the string was attached to in the first place (ghc_cc_ID.)
# (The original string is also substituted away.)
#
# This change may affect the code output on other platforms in
# adverse ways, hence we restrict this hack hppa targets only.
#
# -- 2/98 SOF
if ( $TargetPlatform =~ /^hppa/ ) {
$chk[$i] =~ s/^$TUS[@]?ghc.*c_ID$TPOSTLBL/$consist/o;
$chk[$i] =~ s/\t$T_hsc_cc_PAT/$T_HDR_misc/o;
$consist = $chk[$i]; #clumsily
}
print OUTASM $T_HDR_consist, "${consist}${T_POST_LBL}\n";
} elsif ( $TargetPlatform !~ /^(mips)-/ ) { # we just don't try in those case (ToDo)
...
...
@@ -1013,14 +975,8 @@ sub mangle_asm {
} elsif ( $TargetPlatform =~ /^hppa/ ) {
$c =~ s/^\s+ldil.*\n\s+ldo.*\n\s+bv.*\n(.*\n)?\s+\.EXIT/$1\t.EXIT/;
} elsif ( $TargetPlatform =~ /^i386-/ ) {
# Reg alloc depending, gcc generated code may jump to the fast entry point via
# a number of registers.
$c =~ s/^\tmovl \$${T_US}${symb}_fast\d+,\%edx\n\tjmp \*\%edx\n//;
$c =~ s/^\tmovl \$${T_US}${symb}_fast\d+,\%ecx\n\tjmp \*\%ecx\n//;
$c =~ s/^\tmovl \$${T_US}${symb}_fast\d+,\%eax\n\tjmp \*\%eax\n//;
# The next two only apply if we're not stealing %esi or %edi.
$c =~ s/^\tmovl \$${T_US}${symb}_fast\d+,\%esi\n\tjmp \*\%esi\n// if ($StolenX86Regs < 3);
$c =~ s/^\tmovl \$${T_US}${symb}_fast\d+,\%edi\n\tjmp \*\%edi\n// if ($StolenX86Regs < 4);
} elsif ( $TargetPlatform =~ /^mips-/ ) {
$c =~ s/^\tjmp \$31,\(\$27\),0\n\t\.align 4\n\t\.end/\t.align 4\n\t.end/;
} elsif ( $TargetPlatform =~ /^m68k-/ ) {
...
...
@@ -1285,42 +1241,34 @@ sub print_doctored {
# OK, now we can decide what our patch-up code is going to
# be:
# Offsets into register table - you'd better update these magic
# numbers should you change its contents!
local($OFFSET_R1)=48;
local($OFFSET_SpA)=80;
# Note funky ".=" stuff; we're *adding* to these _patch guys
if ( $StolenX86Regs <= 2
&& ( /
${OFFSET_R1}
\(\%ebx\)/ || /\%esi/ || /^\tcmps/ ) ) { # R1 (esi)
$entry_patch .= "\tmovl \%esi,
${OFFSET_R1}
(\%ebx)\n";
$exit_patch .= "\tmovl
${OFFSET_R1}
(\%ebx),\%esi\n";
&& ( /
32
\(\%ebx\)/ || /\%esi/ || /^\tcmps/ ) ) { # R1 (esi)
$entry_patch .= "\tmovl \%esi,
32
(\%ebx)\n";
$exit_patch .= "\tmovl
32
(\%ebx),\%esi\n";
$gc_call_entry_patch .= "\tmovl \%esi,
${OFFSET_R1}
(\%ebx)\n";
$gc_call_exit_patch .= "\tmovl
${OFFSET_R1}
(\%ebx),\%esi\n";
$gc_call_entry_patch .= "\tmovl \%esi,
32
(\%ebx)\n";
$gc_call_exit_patch .= "\tmovl
32
(\%ebx),\%esi\n";
# nothing for call_{entry,exit} because %esi is callee-save
}
if ( $StolenX86Regs <= 3
&& ( /
${OFFSET_SpA}
\(\%ebx\)/ || /\%edi/ || /^\t(scas|cmps)/ ) ) { # SpA (edi)
$entry_patch .= "\tmovl \%edi,
${OFFSET_SpA}
(\%ebx)\n";
$exit_patch .= "\tmovl
${OFFSET_SpA}
(\%ebx),\%edi\n";
&& ( /
64
\(\%ebx\)/ || /\%edi/ || /^\t(scas|cmps)/ ) ) { # SpA (edi)
$entry_patch .= "\tmovl \%edi,
64
(\%ebx)\n";
$exit_patch .= "\tmovl
64
(\%ebx),\%edi\n";
$gc_call_entry_patch .= "\tmovl \%edi,
${OFFSET_SpA}
(\%ebx)\n";
$gc_call_exit_patch .= "\tmovl
${OFFSET_SpA}
(\%ebx),\%edi\n";
$gc_call_entry_patch .= "\tmovl \%edi,
64
(\%ebx)\n";
$gc_call_exit_patch .= "\tmovl
64
(\%ebx),\%edi\n";
# nothing for call_{entry,exit} because %edi is callee-save
}
local ($OFFSET_Hp) = 96;
#= local ($OFFSET_rSaveECX) = 124;
#= if ( $StolenX86Regs <= 4
#= && ( /
${OFFSET_Hp}
\(\%ebx\)/ || /\%ecx/ || /^\t(rep|loop)/ ) ) { # Hp (ecx)
#= $entry_patch .= "\tmovl \%ecx,
${OFFSET_Hp}
(\%ebx)\n";
#= $exit_patch .= "\tmovl
${OFFSET_Hp}
(\%ebx),\%ecx\n";
#= && ( /
80
\(\%ebx\)/ || /\%ecx/ || /^\t(rep|loop)/ ) ) { # Hp (ecx)
#= $entry_patch .= "\tmovl \%ecx,
80
(\%ebx)\n";
#= $exit_patch .= "\tmovl
80
(\%ebx),\%ecx\n";
#=
#= $call_exit_patch .= "\tmovl \%ecx,
${OFFSET_rSaveECX}
(\%ebx)\n";
#= $call_entry_patch .= "\tmovl
${OFFSET_rSaveECX}
(\%ebx),\%ecx\n";
#= $call_exit_patch .= "\tmovl \%ecx,
108
(\%ebx)\n";
#= $call_entry_patch .= "\tmovl
108
(\%ebx),\%ecx\n";
#= # I have a really bad feeling about this if we ever
#= # have a nested call...
#= # NB: should just hide it somewhere in the C stack.
...
...
@@ -1367,9 +1315,7 @@ sub print_doctored {
# final peephole fixes
local($OFFSET_R2)=52;
s/^\tmovl \%eax,${OFFSET_R2}\(\%ebx\)\n\tjmp \*${OFFSET_R2}\(\%ebx\)\n/\tmovl \%eax,${OFFSET_R2}\(\%ebx\)\n\tjmp \*\%eax\n/;
s/^\tmovl \%eax,36\(\%ebx\)\n\tjmp \*36\(\%ebx\)\n/\tmovl \%eax,36\(\%ebx\)\n\tjmp \*\%eax\n/;
# the short form may tickle perl bug:
# s/^\tmovl \$${T_US}(.*),(\%e[abcd]x)\n\tjmp \*$2/\tjmp $T_US$1/g;
s/^\tmovl \$${T_US}(.*),\%eax\n\tjmp \*\%eax/\tjmp $T_US$1/g;
...
...
@@ -1384,12 +1330,12 @@ sub print_doctored {
# (i) the offset of Hp from BaseReg changes from 80, or
# (ii) the register assignment of BaseReg changes from %ebx
s/^\tmovl
${OFFSET_Hp}
\(\%ebx\),\%e.x\n\tmovl \$(.*),(-?[0-9]*)\(\%e.x\)\n\tmovl
${OFFSET_Hp}
\(\%ebx\),\%e(.)x/\tmovl
${OFFSET_Hp}
\(\%ebx\),\%e$3x\n\tmovl \$$1,$2\(\%e$3x\)/g;
s/^\tmovl
80
\(\%ebx\),\%e.x\n\tmovl \$(.*),(-?[0-9]*)\(\%e.x\)\n\tmovl
80
\(\%ebx\),\%e(.)x/\tmovl
80
\(\%ebx\),\%e$3x\n\tmovl \$$1,$2\(\%e$3x\)/g;
s/^\tmovl
${OFFSET_Hp}
\(\%ebx\),\%e(.)x\n\tmovl (.*),\%e(.)x\n\tmovl \%e$3x,(-?[0-9]*\(\%e$1x\))\n\tmovl
${OFFSET_Hp}
\(\%ebx\),\%e$1x/\tmovl
${OFFSET_Hp}
\(\%ebx\),\%e$1x\n\tmovl $2,\%e$3x\n\tmovl \%e$3x,$4/g;
s/^\tmovl
80
\(\%ebx\),\%e(.)x\n\tmovl (.*),\%e(.)x\n\tmovl \%e$3x,(-?[0-9]*\(\%e$1x\))\n\tmovl
80
\(\%ebx\),\%e$1x/\tmovl
80
\(\%ebx\),\%e$1x\n\tmovl $2,\%e$3x\n\tmovl \%e$3x,$4/g;
s/^\tmovl
${OFFSET_Hp}
\(\%ebx\),\%edx((\n\t(movl|addl) .*,((-?[0-9]*\(.*)|(\%e[abc]x)))+)\n\tmovl
${OFFSET_Hp}
\(\%ebx\),\%edx/\tmovl
${OFFSET_Hp}
\(\%ebx\),\%edx$1/g;
s/^\tmovl
${OFFSET_Hp}
\(\%ebx\),\%eax((\n\t(movl|addl) .*,((-?[0-9]*\(.*)|(\%e[bcd]x)))+)\n\tmovl
${OFFSET_Hp}
\(\%ebx\),\%eax/\tmovl
${OFFSET_Hp}
\(\%ebx\),\%eax$1/g;
s/^\tmovl
80
\(\%ebx\),\%edx((\n\t(movl|addl) .*,((-?[0-9]*\(.*)|(\%e[abc]x)))+)\n\tmovl
80
\(\%ebx\),\%edx/\tmovl
80
\(\%ebx\),\%edx$1/g;
s/^\tmovl
80
\(\%ebx\),\%eax((\n\t(movl|addl) .*,((-?[0-9]*\(.*)|(\%e[bcd]x)))+)\n\tmovl
80
\(\%ebx\),\%eax/\tmovl
80
\(\%ebx\),\%eax$1/g;
# --------------------------------------------------------
# that's it -- print it
...
...
@@ -1436,6 +1382,7 @@ sub init_FUNNY_THINGS {
"${T_US}UnderflowVect7${T_POST_LBL}", 1,
"${T_US}UpdErr${T_POST_LBL}", 1,
"${T_US}UpdatePAP${T_POST_LBL}", 1,
"${T_US}WorldStateToken${T_POST_LBL}", 1,
"${T_US}_Enter_Internal${T_POST_LBL}", 1,
"${T_US}_PRMarking_MarkNextAStack${T_POST_LBL}", 1,
"${T_US}_PRMarking_MarkNextBStack${T_POST_LBL}", 1,
...
...
@@ -1454,8 +1401,7 @@ sub init_FUNNY_THINGS {
"${T_US}startEnterInt${T_POST_LBL}", 1,
"${T_US}startPerformIO${T_POST_LBL}", 1,
"${T_US}startStgWorld${T_POST_LBL}", 1,
"${T_US}stopPerformIO${T_POST_LBL}", 1,
"${T_US}ShouldCompile_Z36d1z5${T_POST_LBL}", 1
"${T_US}stopPerformIO${T_POST_LBL}", 1
);
}
\end{code}
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment