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
7934685d
Commit
7934685d
authored
24 years ago
by
Simon Marlow
Browse files
Options
Downloads
Patches
Plain Diff
[project @ 2000-06-13 15:35:29 by simonm]
mangler fix.
parent
3c241678
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
+288
-154
288 additions, 154 deletions
ghc/driver/mangler/ghc-asm.lprl
with
288 additions
and
154 deletions
ghc/driver/mangler/ghc-asm.lprl
+
288
−
154
View file @
7934685d
...
...
@@ -54,6 +54,7 @@ sub init_TARGET_STUFF {
$T_STABBY = 0; # 1 iff .stab things (usually if a.out format)
$T_US = ''; # _ if symbols have an underscore on the front
$T_DO_GC = 'PerformGC_wrapper';
$T_PRE_APP = 'DONT THINK THIS APPLIES'; # regexp that says what comes before APP/NO_APP
$T_CONST_LBL = '^\$C(\d+):$'; # regexp for what such a lbl looks like
$T_POST_LBL = ':';
...
...
@@ -69,7 +70,6 @@ sub init_TARGET_STUFF {
$T_HDR_data = "\.data\n\t\.align 3\n";
$T_HDR_consist = "\.text\n";
$T_HDR_closure = "\.data\n\t\.align 3\n";
$T_HDR_srt = "\.data\n\t\.align 3\n";
$T_HDR_info = "\.text\n\t\.align 3\n";
$T_HDR_entry = "\.text\n\t\.align 3\n";
$T_HDR_fast = "\.text\n\t\.align 3\n";
...
...
@@ -81,6 +81,7 @@ sub init_TARGET_STUFF {
$T_STABBY = 0; # 1 iff .stab things (usually if a.out format)
$T_US = ''; # _ if symbols have an underscore on the front
$T_DO_GC = 'PerformGC_wrapper';
$T_PRE_APP = 'DONT THINK THIS APPLIES'; # regexp that says what comes before APP/NO_APP
$T_CONST_LBL = '^L\$C(\d+)$'; # regexp for what such a lbl looks like
$T_POST_LBL = '';
...
...
@@ -88,15 +89,14 @@ 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_DOT_WORD = '\.
(blockz|word|half|byte)
';
$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";
$T_HDR_misc = "\t.SPACE \$TEXT\$\n\t.SUBSPA \$CODE\$\n\t\.align 4\n";
$T_HDR_data = "\t.SPACE \$PRIVATE\$\n\t.SUBSPA \$DATA\$\n\t\.align 4\n";
$T_HDR_consist = "\t.SPACE \$TEXT\$\n\t.SUBSPA \$LIT\$\n";
$T_HDR_closure = "\t.SPACE \$PRIVATE\$\n\t.SUBSPA \$DATA\$\n\t\.align 4\n";
$T_HDR_srt = "\t.SPACE \$PRIVATE\$\n\t.SUBSPA \$DATA\$\n\t\.align 4\n";
$T_HDR_info = "\t.SPACE \$TEXT\$\n\t.SUBSPA \$CODE\$\n\t\.align 4\n";
$T_HDR_entry = "\t.SPACE \$TEXT\$\n\t.SUBSPA \$CODE\$\n\t\.align 4\n";
$T_HDR_fast = "\t.SPACE \$TEXT\$\n\t.SUBSPA \$CODE\$\n\t\.align 4\n";
...
...
@@ -104,11 +104,12 @@ sub init_TARGET_STUFF {
$T_HDR_direct = "\t.SPACE \$TEXT\$\n\t.SUBSPA \$CODE\$\n\t\.align 4\n";
#--------------------------------------------------------#
} elsif ( $TargetPlatform =~ /^i386-.*-(linuxaout|freebsd
2
|nextstep3|cygwin32
|mingw32)$
/ ) {
} elsif ( $TargetPlatform =~ /^i386-.*-(linuxaout|freebsd|nextstep3|cygwin32
)
/ ) {
# NeXT added but not tested. CaS
$T_STABBY = 1; # 1 iff .stab things (usually if a.out format)
$T_US = '_'; # _ if symbols have an underscore on the front
$T_DO_GC = '_PerformGC_wrapper';
$T_PRE_APP = '^#'; # regexp that says what comes before APP/NO_APP
$T_CONST_LBL = '^LC(\d+):$';
$T_POST_LBL = ':';
...
...
@@ -116,18 +117,16 @@ 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
|word|value|byte|space)
';
$T_DOT_WORD = '\.long';
$T_DOT_GLOBAL = '\.globl';
$T_HDR_literal = "\.text\n\t\.align 2\n";
$T_HDR_misc = "\.text\n\t\.align 2,0x90\n";
$T_HDR_data = "\.data\n\t\.align 2\n";
$T_HDR_consist = "\.text\n";
$T_HDR_closure = "\.data\n\t\.align 2\n";
$T_HDR_closure = "\.data\n\t\.align 2\n\t.long 0\n" if ( $TargetPlatform =~ /.*-mingw32$/ );
$T_HDR_srt = "\.data\n\t\.align 2\n";
$T_HDR_info = "\.text\n\t\.align 2\n"; # NB: requires padding
$T_HDR_entry = "\.text\n"; # no .align so we're right next to _info (arguably wrong...?)
$T_HDR_fast = "\.text\n\t\.align 2,0x90\n";
...
...
@@ -135,46 +134,42 @@ sub init_TARGET_STUFF {
$T_HDR_direct = "\.text\n\t\.align 2,0x90\n";
#--------------------------------------------------------#
} elsif ( $TargetPlatform =~ /^i386-.*-(solaris2|linux
|freebsd3
)$/ ) {
} elsif ( $TargetPlatform =~ /^i386-.*-(solaris2|linux)$/ ) {
$T_STABBY = 0; # 1 iff .stab things (usually if a.out format)
$T_US = ''; # _ if symbols have an underscore on the front
$T_DO_GC = 'PerformGC_wrapper';
$T_PRE_APP = # regexp that says what comes before APP/NO_APP
($TargetPlatform =~ /-
(
linux
|freebsd3)
$/) ? '#' : '/' ;
($TargetPlatform =~ /-linux$/) ? '#' : '/' ;
$T_CONST_LBL = '^\.LC(\d+):$'; # regexp for what such a lbl looks like
$T_POST_LBL = ':';
$T_X86_PRE_LLBL_PAT = '\.L';
$T_X86_PRE_LLBL = '.L';
$T_X86_BADJMP = '^\tjmp [^\.\*]';
$T_MOVE_DIRVS = '^(\s*(\.
(p2)?
align\s+\d+(,0x90)?|\.globl\s+\S+|\.text|\.data|\.section\s+.*|\.type\s+.*|\.Lfe.*\n\t\.size\s+.*|\.size\s+.*|\.ident.*)\n)';
$T_MOVE_DIRVS = '^(\s*(\.align\s+\d+(,0x90)?|\.globl\s+\S+|\.text|\.data|\.section\s+.*|\.type\s+.*|\.Lfe.*\n\t\.size\s+.*|\.size\s+.*|\.ident.*)\n)';
$T_COPY_DIRVS = '\.(globl)';
if ( $TargetPlatform =~ /freebsd3/ ) {
$T_hsc_cc_PAT = '\.ascii.*\)(hsc|cc) (.*)\\\\11"\n\t\.ascii\s+"(.*)\\\\0"';
} else {
$T_hsc_cc_PAT = '\.string.*\)(hsc|cc) (.*)\\\\t(.*)"';
}
$T_DOT_WORD = '\.(long|value|byte|zero)';
$T_hsc_cc_PAT = '\.string.*\)(hsc|cc) (.*)\\\\t(.*)"';
$T_DOT_WORD = '\.long';
$T_DOT_GLOBAL = '\.globl';
$T_HDR_literal = "\.section\t\.rodata\n"; # or just use .text??? (WDP 95/11)
$T_HDR_misc = "\.text\n\t\.align
4
\n";
$T_HDR_misc = "\.text\n\t\.align
16
\n";
$T_HDR_data = "\.data\n\t\.align 4\n"; # ToDo: change align??
$T_HDR_consist = "\.text\n";
$T_HDR_closure = "\.data\n\t\.align 4\n"; # ToDo: change align?
$T_HDR_srt = "\.data\n\t\.align 4\n"; # ToDo: change align?
$T_HDR_info = "\.text\n\t\.align 4\n"; # NB: requires padding
$T_HDR_info = "\.text\n\t\.align 16\n"; # NB: requires padding
$T_HDR_entry = "\.text\n"; # no .align so we're right next to _info (arguably wrong...?)
$T_HDR_fast = "\.text\n\t\.align
4
\n";
$T_HDR_vector = "\.text\n\t\.align
4
\n"; # NB: requires padding
$T_HDR_direct = "\.text\n\t\.align
4
\n";
$T_HDR_fast = "\.text\n\t\.align
16
\n";
$T_HDR_vector = "\.text\n\t\.align
16
\n"; # NB: requires padding
$T_HDR_direct = "\.text\n\t\.align
16
\n";
#--------------------------------------------------------#
} elsif ( $TargetPlatform =~ /^m68k-.*-sunos4/ ) {
$T_STABBY = 1; # 1 iff .stab things (usually if a.out format)
$T_US = '_'; # _ if symbols have an underscore on the front
$T_DO_GC = '_PerformGC_wrapper';
$T_PRE_APP = '^# MAY NOT APPLY'; # regexp that says what comes before APP/NO_APP
$T_CONST_LBL = '^LC(\d+):$';
$T_POST_LBL = ':';
...
...
@@ -190,7 +185,6 @@ sub init_TARGET_STUFF {
$T_HDR_data = "\.data\n\t\.even\n";
$T_HDR_consist = "\.text\n";
$T_HDR_closure = "\.data\n\t\.even\n";
$T_HDR_srt = "\.data\n\t\.even\n";
$T_HDR_info = "\.text\n\t\.even\n";
$T_HDR_entry = "\.text\n\t\.even\n";
$T_HDR_fast = "\.text\n\t\.even\n";
...
...
@@ -202,6 +196,7 @@ sub init_TARGET_STUFF {
$T_STABBY = 0; # 1 iff .stab things (usually if a.out format)
$T_US = ''; # _ if symbols have an underscore on the front
$T_DO_GC = 'PerformGC_wrapper';
$T_PRE_APP = '^\s*#'; # regexp that says what comes before APP/NO_APP
$T_CONST_LBL = '^\$LC(\d+):$'; # regexp for what such a lbl looks like
$T_POST_LBL = ':';
...
...
@@ -217,7 +212,6 @@ sub init_TARGET_STUFF {
$T_HDR_data = "\t\.data\n\t\.align 2\n";
$T_HDR_consist = 'TOO LAZY TO DO THIS TOO';
$T_HDR_closure = "\t\.data\n\t\.align 2\n";
$T_HDR_srt = "\t\.data\n\t\.align 2\n";
$T_HDR_info = "\t\.text\n\t\.align 2\n";
$T_HDR_entry = "\t\.text\n\t\.align 2\n";
$T_HDR_fast = "\t\.text\n\t\.align 2\n";
...
...
@@ -229,6 +223,7 @@ sub init_TARGET_STUFF {
$T_STABBY = 0; # 1 iff .stab things (usually if a.out format)
$T_US = ''; # _ if symbols have an underscore on the front
$T_DO_GC = '\.PerformGC_wrapper';
$T_PRE_APP = 'NOT APPLICABLE'; # regexp that says what comes before APP/NO_APP
$T_CONST_LBL = 'NOT APPLICABLE'; # regexp for what such a lbl looks like
$T_POST_LBL = ':';
...
...
@@ -245,7 +240,6 @@ sub init_TARGET_STUFF {
$T_HDR_data = "# data\n\.csect \.data[RW]\n\t\.align 2\n";
$T_HDR_consist = "# consist\n\.csect \.data[RW]\n\t\.align 2\n";
$T_HDR_closure = "# closure\n\.csect \.data[RW]\n\t\.align 2\n";
$T_HDR_srt = "# closure\n\.csect \.data[RW]\n\t\.align 2\n";
$T_HDR_info = "# info\n\.csect \.data[RW]\n\t\.align 2\n"; #not RO!?
$T_HDR_entry = "# entry\n\.csect \.text[PR]\n\t\.align 2\n";
$T_HDR_fast = "# fast\n\.csect \.text[PR]\n\t\.align 2\n";
...
...
@@ -257,6 +251,7 @@ sub init_TARGET_STUFF {
$T_STABBY = 0; # 1 iff .stab things (usually if a.out format)
$T_US = ''; # _ if symbols have an underscore on the front
$T_DO_GC = 'PerformGC_wrapper';
$T_PRE_APP = 'DOES NOT SEEM TO APPLY'; # regexp that says what comes before APP/NO_APP
$T_CONST_LBL = '^\.LLC(\d+):$'; # regexp for what such a lbl looks like
$T_POST_LBL = ':';
...
...
@@ -265,14 +260,13 @@ sub init_TARGET_STUFF {
$T_COPY_DIRVS = '\.(global|proc|stab)';
$T_hsc_cc_PAT = '\.asciz.*\)(hsc|cc) (.*)\\\\t(.*)"';
$T_DOT_WORD = '\.
(
word
|byte|half|skip)
';
$T_DOT_WORD = '\.word';
$T_DOT_GLOBAL = '^\t\.global';
$T_HDR_literal = "\.text\n\t\.align 8\n";
$T_HDR_misc = "\.text\n\t\.align 4\n";
$T_HDR_data = "\.data\n\t\.align 8\n";
$T_HDR_consist = "\.text\n";
$T_HDR_closure = "\.data\n\t\.align 4\n";
$T_HDR_srt = "\.data\n\t\.align 4\n";
$T_HDR_info = "\.text\n\t\.align 4\n";
$T_HDR_entry = "\.text\n\t\.align 4\n";
$T_HDR_fast = "\.text\n\t\.align 4\n";
...
...
@@ -284,6 +278,7 @@ sub init_TARGET_STUFF {
$T_STABBY = 1; # 1 iff .stab things (usually if a.out format)
$T_US = '_'; # _ if symbols have an underscore on the front
$T_DO_GC = '_PerformGC_wrapper';
$T_PRE_APP = '^# DOES NOT SEEM TO APPLY'; # regexp that says what comes before APP/NO_APP
$T_CONST_LBL = '^LC(\d+):$';
$T_POST_LBL = ':';
...
...
@@ -299,7 +294,6 @@ sub init_TARGET_STUFF {
$T_HDR_data = "\.data\n\t\.align 8\n";
$T_HDR_consist = "\.text\n";
$T_HDR_closure = "\.data\n\t\.align 4\n";
$T_HDR_srt = "\.data\n\t\.align 4\n";
$T_HDR_info = "\.text\n\t\.align 4\n";
$T_HDR_entry = "\.text\n\t\.align 4\n";
$T_HDR_fast = "\.text\n\t\.align 4\n";
...
...
@@ -315,6 +309,7 @@ sub init_TARGET_STUFF {
if ( 0 ) {
print STDERR "T_STABBY: $T_STABBY\n";
print STDERR "T_US: $T_US\n";
print STDERR "T_DO_GC: $T_DO_GC\n";
print STDERR "T_PRE_APP: $T_PRE_APP\n";
print STDERR "T_CONST_LBL: $T_CONST_LBL\n";
print STDERR "T_POST_LBL: $T_POST_LBL\n";
...
...
@@ -384,9 +379,9 @@ sub mangle_asm {
%slowchk = (); # ditto, its regular "slow" entry code
%fastchk = (); # ditto, fast entry code
%closurechk = (); # ditto, the (static) closure
%srtchk = (); # ditto, its SRT (for top-level things)
%infochk = (); # given a symbol base, say what chunk its info tbl is in
%vectorchk = (); # ditto, return vector table
%directchk = (); # ditto, direct return code
$EXTERN_DECLS = ''; # .globl <foo> .text (MIPS only)
$i = 0; $chkcat[0] = 'misc'; $chk[0] = '';
...
...
@@ -394,7 +389,6 @@ sub mangle_asm {
while (<INASM>) {
next if $T_STABBY && /^\.stab.*$TUS[@]?__stg_split_marker/o;
next if $T_STABBY && /^\.stab.*ghc.*c_ID/;
next if /^\t\.def.*endef$/;
next if /$TPREAPP(NO_)?APP/o;
next if /^;/ && $TargetPlatform =~ /^hppa/;
...
...
@@ -406,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__fexp_.*$/ ) {
$chk[++$i] = $_;
$chkcat[$i] = 'data';
$chksymb[$i] = '';
} elsif ( /^\s+/ ) { # most common case first -- a simple line!
# duplicated from the bottom
...
...
@@ -450,14 +435,14 @@ sub mangle_asm {
$infochk{$symb} = $i;
} elsif ( /^$TUS[@]?([A-Za-z0-9_]+)_
(
entry
|ret)
$TPOSTLBL[@]?$/o ) {
} elsif ( /^$TUS[@]?([A-Za-z0-9_]+)_entry$TPOSTLBL[@]?$/o ) {
$chk[++$i] = $_;
$chkcat[$i] = 'slow';
$chksymb[$i] = $1;
$slowchk{$1} = $i;
} elsif ( /^$TUS[@]?([A-Za-z0-9_]+)_fast\d
*
$TPOSTLBL[@]?$/o ) {
} elsif ( /^$TUS[@]?([A-Za-z0-9_]+)_fast\d
+
$TPOSTLBL[@]?$/o ) {
$chk[++$i] = $_;
$chkcat[$i] = 'fast';
$chksymb[$i] = $1;
...
...
@@ -471,13 +456,6 @@ sub mangle_asm {
$closurechk{$1} = $i;
} elsif ( /^$TUS[@]?([A-Za-z0-9_]+)_srt$TPOSTLBL[@]?$/o ) {
$chk[++$i] = $_;
$chkcat[$i] = 'srt';
$chksymb[$i] = $1;
$srtchk{$1} = $i;
} elsif ( /^$TUS[@]?ghc.*c_ID$TPOSTLBL/o ) {
$chk[++$i] = $_;
$chkcat[$i] = 'consist';
...
...
@@ -485,7 +463,8 @@ sub mangle_asm {
} elsif ( /^($TUS[@]?__gnu_compiled_c|gcc2_compiled\.)$TPOSTLBL/o ) {
; # toss it
} elsif ( /^$TUS[A-Za-z0-9_]+\.\d+$TPOSTLBL[@]?$/o
} elsif ( /^$TUS[@]?ErrorIO_call_count$TPOSTLBL[@]?$/o # HACK!!!!
|| /^$TUS[A-Za-z0-9_]+\.\d+$TPOSTLBL[@]?$/o
|| /^$TUS[@]?.*_CAT$TPOSTLBL[@]?$/o # PROF: _entryname_CAT
|| /^$TUS[@]?CC_.*_struct$TPOSTLBL[@]?$/o # PROF: _CC_ccident_struct
|| /^$TUS[@]?.*_done$TPOSTLBL[@]?$/o # PROF: _module_done
...
...
@@ -505,34 +484,40 @@ sub mangle_asm {
$chkcat[$i] = 'toc';
$chksymb[$i] = $1;
} elsif (
/^$TUS[@]?CC(S)?
_.*$/ ) {
} elsif (
$TargetPlatform =~ /^powerpc-|^rs6000-/ && /^CC
_.*$/ ) {
# all CC_ symbols go in the data section...
$chk[++$i] = $_;
$chkcat[$i] = 'data';
$chksymb[$i] = '';
} elsif ( /^$TUS[@]?([A-Za-z0-9_]+)
_(alt|dflt)$TPOSTLBL[@]?$
/o ) {
} elsif ( /^
(
$TUS[@]?(
ret_|djn_)
[A-Za-z0-9_]+)/o ) {
$chk[++$i] = $_;
$chkcat[$i] = 'misc';
$chksymb[$i] = '';
#
$symbtmp = $1;
#
$chksymb[$i] = $symbtmp if ($TargetPlatform =~ /^powerpc-|^rs6000-/) ; #rm andre
$symbtmp = $1;
$chksymb[$i] = $symbtmp if ($TargetPlatform =~ /^powerpc-|^rs6000-/) ; #rm andre
} elsif ( /^$TUS[@]?([A-Za-z0-9_]+)
_vtbl
$TPOSTLBL[@]?$/o ) {
} elsif ( /^$TUS[@]?
vtbl_
([A-Za-z0-9_]+)$TPOSTLBL[@]?$/o ) {
$chk[++$i] = $_;
$chkcat[$i] = 'vector';
$chksymb[$i] = $1;
$vectorchk{$1} = $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 ]+__fexp_.*$/ ) {
} elsif ( /^$TUS[@]?([A-Za-z0-9_]+)DirectReturn$TPOSTLBL[@]?$/o ) {
$chk[++$i] = $_;
$chkcat[$i] = 'data';
$chksymb[$i] = '';
$chkcat[$i] = 'direct';
$chksymb[$i] = $1;
$directchk{$1} = $i;
} elsif ( /^$TUS[@]?([A-Za-z0-9_]+)_upd$TPOSTLBL[@]?$/o ) {
$chk[++$i] = $_;
$chkcat[$i] = 'misc';
print STDERR "_upd!!!!! I guess this code is dead!!!!\n";
# I guess this is never entered, since all _upds are
# either vtbl_'s or ret_'s, caught above. - andre
$chksymb[$i] = '';
} elsif ( $TargetPlatform =~ /^i386-.*-solaris2/
&& /^(_uname|uname|stat|fstat):/ ) {
...
...
@@ -556,13 +541,11 @@ sub mangle_asm {
|| ! /^(L\.\.\d+|LT\.\..*):$/ ) ) {
local($thing);
chop($thing = $_);
print "Funny global thing?: $_"
print
STDERR
"Funny global thing?: $_"
unless $KNOWN_FUNNY_THING{$thing}
|| /^$TUS[@]?stg_.*$TPOSTLBL[@]?$/o # RTS internals
|| /^$TUS[@]__fexp_.*$TPOSTLBL$/o # foreign export
|| /^$TUS[@]?_reg.*$TPOSTLBL$/o # PROF: __reg<module>
|| /^$TUS[@]?.*_btm$TPOSTLBL$/o # large bitmaps
|| /^$TUS[@]?.*_closure_tbl$TPOSTLBL$/o; # closure tables
|| /^$TUS[@]?_(PRIn|PRStart).*$TPOSTLBL[@]?$/o # pointer reversal GC routines
|| /^$TUS[@]?CC_.*$TPOSTLBL$/o # PROF: _CC_ccident ([@]? is a silly hack (see above))
|| /^$TUS[@]?_reg.*$TPOSTLBL$/o; # PROF: __reg<module>
$chk[++$i] = $_;
$chkcat[$i] = 'misc';
if ($TargetPlatform =~ /^powerpc-|^rs6000-/)
...
...
@@ -612,8 +595,19 @@ sub mangle_asm {
$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/;
$chk[$i] =~ s/\t\.tc (\S+)\[TC\],(ret_\S+)/\t\.tc \1\[TC\],\.\2/;
$chk[$i] =~ s/\t\.tc (\S+)\[TC\],(
alt
_\S+)/\t\.tc \1\[TC\],\.\2/;
$chk[$i] =~ s/\t\.tc (\S+)\[TC\],(
djn
_\S+)/\t\.tc \1\[TC\],\.\2/;
$chk[$i] =~ s/\t\.tc (\S+)\[TC\],(vtbl_\S+)/\t\.tc \1\[TC\],\.\2/;
$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 CommonUnderflow\[TC\],CommonUnderflow/\.tc CommonUnderflow\[TC\],\.CommonUnderflow/; #PAR
$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/;
$tocnumber = $chksymb[$i];
$tocsymb = $chk[$i];
...
...
@@ -703,7 +697,6 @@ sub mangle_asm {
$e =~ s/^\tret\n//;
$e =~ s/^\tpopl \%edi\n//;
$e =~ s/^\tpopl \%esi\n//;
$e =~ s/^\tpopl \%ecx\n//;
$e =~ s/^\taddl \$\d+,\%esp\n//;
} elsif ($TargetPlatform =~ /^m68k-/) {
$e =~ s/^\tunlk a6\n//;
...
...
@@ -899,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)
...
...
@@ -935,7 +909,6 @@ sub mangle_asm {
print OUTASM "___stg_split_marker",$chksymb[$i],"${T_POST_LBL}\n";
} elsif ( $chkcat[$i] eq 'closure'
|| $chkcat[$i] eq 'srt'
|| $chkcat[$i] eq 'infotbl'
|| $chkcat[$i] eq 'slow'
|| $chkcat[$i] eq 'fast' ) { # do them in that order
...
...
@@ -948,13 +921,6 @@ sub mangle_asm {
$chkcat[$closurechk{$symb}] = 'DONE ALREADY';
}
# SRT
if ( defined($srtchk{$symb}) ) {
print OUTASM $T_HDR_srt;
print OUTASM $chk[$srtchk{$symb}];
$chkcat[$srtchk{$symb}] = 'DONE ALREADY';
}
# INFO TABLE
if ( defined($infochk{$symb}) ) {
...
...
@@ -967,12 +933,21 @@ sub mangle_asm {
}
$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/;
$chk[$infochk{$symb}] =~ s/\.long StdErrorCode/\.long \.StdErrorCode/;
$chk[$infochk{$symb}] =~ s/\.long UpdErr/\.long \.UpdErr/;
print OUTASM $chk[$infochk{$symb}];
} else {
print OUTASM &rev_tbl($symb, $chk[$infochk{$symb}], 1);
}
# entry code will be put here!
# paranoia
if ( $chk[$infochk{$symb}] =~ /$TDOTWORD[@]?\s+([A-Za-z0-9_]+_entry)$/o
&& $1 ne "${T_US}${symb}_entry" ) {
print STDERR "!!! entry point???\n",$chk[$infochk{$symb}];
}
$chkcat[$infochk{$symb}] = 'DONE ALREADY';
}
...
...
@@ -983,12 +958,12 @@ sub mangle_asm {
$c = $chk[$slowchk{$symb}];
if ($TargetPlatform =~ /^powerpc-|^rs6000-/) {
($p, $r) = split(/TOC\[tc0\], 0\n/, $c);
if ($symb =~ /^[_A-Z]/)
{
print OUTASM "\t\.globl \.${chksymb[$i]}_entry\n";
print OUTASM "\.csect ${symb}_entry[DS]\n";
print OUTASM "${p}TOC[tc0], 0\n";
($p, $r) = split(/TOC\[tc0\], 0\n/, $c);
if ($symb =~ /^[_A-Z]/)
{
print OUTASM "\t\.globl \.${chksymb[$i]}_entry\n";
print OUTASM "\.csect ${symb}_entry[DS]\n";
print OUTASM "${p}TOC[tc0], 0\n";
};
$r =~ s/\.csect \.text\[PR\]\n//; # todo: properly - andre
$c = &mangle_powerpc_tailjump($r);
...
...
@@ -1000,14 +975,9 @@ 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);
$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//;
} 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-/ ) {
...
...
@@ -1073,17 +1043,31 @@ sub mangle_asm {
print OUTASM $T_HDR_vector;
if ($TargetPlatform =~ /^powerpc-|^rs6000-/) {
if ( $symb =~ /^[A-Z]/) {
print OUTASM "\t\.globl \.${symb}
_vtbl
\n";
print OUTASM "\t\.globl ${symb}
_vtbl
\n";
print OUTASM "\t\.globl \.
vtbl_
${symb}\n";
print OUTASM "\t\.globl
vtbl_
${symb}\n";
};
$chk[$vectorchk{$symb}] =~ s/\.long (\S+)/\.long \.\1/g;
print OUTASM ".${symb}
_vtbl
:\n";
print OUTASM ".
vtbl_
${symb}:\n";
print OUTASM $chk[$vectorchk{$symb}];
} else {
print OUTASM &rev_tbl($symb, $chk[$vectorchk{$symb}], 0);
}
# direct return code will be put here!
$chkcat[$vectorchk{$symb}] = 'DONE ALREADY';
}
# DIRECT RETURN
if ( defined($directchk{$symb}) ) {
print OUTASM $T_HDR_direct;
if ($TargetPlatform =~ /^powerpc-|^rs6000-/) {
($p, $r) = split(/TOC\[tc0\], 0\n/, $chk[$directchk{$symb}]);
&print_doctored($r, 0);
print OUTASM "\.csect ${symb}DirectReturn[DS]\n";
print OUTASM "${p}TOC[tc0], 0\n";
} else {
&print_doctored($chk[$directchk{$symb}], 0);
}
$chkcat[$directchk{$symb}] = 'DONE ALREADY';
} elsif ( $TargetPlatform =~ /^alpha-/ ) {
# Alphas: the commented nop is for the splitter, to ensure
...
...
@@ -1156,8 +1140,7 @@ sub print_doctored {
local($_, $need_fallthru_patch) = @_;
if ( $TargetPlatform !~ /^i386-/
|| ! /^\t[a-z]/ # no instructions in here, apparently
|| /^${T_US}_reg[A-Za-z0-9_]+${T_POST_LBL}/) {
|| ! /^\t[a-z]/ ) { # no instructions in here, apparently
print OUTASM $_;
return;
}
...
...
@@ -1165,6 +1148,36 @@ sub print_doctored {
local($entry_patch) = '';
local($exit_patch) = '';
local($call_entry_patch)= '';
local($call_exit_patch) = '';
local($gc_call_entry_patch)= ''; # Patches before and after calls to Perform_GC_wrapper
local($gc_call_exit_patch) = '';
#OLD: # first, convert calls to *very magic form*: (ToDo: document
# for real!) from
#
# pushl $768
# call _?PerformGC_wrapper
# addl $4,%esp
# to
# movl $768, %eax
# call _?PerformGC_wrapper
#
# The reason we do this now is to remove the apparent use of
# %esp, which would throw off the "what patch code do we need"
# decision.
#
# Special macros in ghc/includes/COptWraps.lh, used in
# ghc/runtime/CallWrap_C.lc, are required for this to work!
#
s/^\tpushl \$(\d+)\n\tcall ${T_DO_GC}\n\taddl \$4,\%esp\n/\tmovl \$$1,\%eax\n\tcall ${T_DO_GC}\n/go;
s/^\tpushl \%eax\n\tcall ${T_DO_GC}\n\taddl \$4,\%esp\n/\tcall ${T_DO_GC}\n/go;
s/^\tpushl \%edx\n\tcall ${T_DO_GC}\n\taddl \$4,\%esp\n/\tmovl \%edx,\%eax\n\tcall ${T_DO_GC}\n/go;
#= if ( $StolenX86Regs <= 4 ) { # %ecx is ordinary reg
#= s/^\tpushl \%ecx\n\tcall ${T_DO_GC}\n\taddl \$4,\%esp\n/\tmovl \%ecx,\%eax\n\tcall ${T_DO_GC}\n/go;
#= }
# gotta watch out for weird instructions that
# invisibly smash various regs:
...
...
@@ -1199,13 +1212,10 @@ sub print_doctored {
# movl $_blah,<bad-reg>
# jmp *<bad-reg>
#
# 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;
s/^\tmovl \$${T_US}(.*),\%ebx\n\tjmp \*\%ebx/\tjmp $T_US$1/g;
s/^\tmovl \$${T_US}(.*),\%ecx\n\tjmp \*\%ecx/\tjmp $T_US$1/g;
s/^\tmovl \$${T_US}(.*),\%edx\n\tjmp \*\%edx/\tjmp $T_US$1/g;
# which is easily fixed as:
#
# sigh! try to hack around it...
#
if ($StolenX86Regs <= 2 ) { # YURGH! spurious uses of esi?
s/^\tmovl (.*),\%esi\n\tjmp \*%esi\n/\tmovl $1,\%eax\n\tjmp \*\%eax\n/g;
...
...
@@ -1221,38 +1231,61 @@ sub print_doctored {
die "$Pgm: (mangler) still have jump involving \%edi!\n$_"
if /(jmp|call) .*\%edi/;
}
#= if ($StolenX86Regs <= 4 ) { # spurious uses of ecx?
#= s/^\tmovl (.*),\%ecx\n\tjmp \*%ecx\n/\tmovl $1,\%eax\n\tjmp \*\%eax\n/g;
#= s/^\tjmp \*(-?\d*)\((.*\%ecx.*)\)\n/\tmovl $2,\%eax\n\tjmp \*$1\(\%eax\)\n/g;
#= s/^\tjmp \*\%ecx\n/\tmovl \%ecx,\%eax\n\tjmp \*\%eax\n/g;
#= die "$Pgm: (mangler) still have jump involving \%ecx!\n$_"
#= if /(jmp|call) .*\%ecx/;
#= }
# 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)=0; No offset for R1 in new RTS.
local($OFFSET_Hp)=92;
# Note funky ".=" stuff; we're *adding* to these _patch guys
if ( $StolenX86Regs <= 2
&& ( /[^0-9]\(\%ebx\)/ || /\%esi/ || /^\tcmps/ ) ) { # R1 (esi)
$entry_patch .= "\tmovl \%esi,(\%ebx)\n";
$exit_patch .= "\tmovl (\%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,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_Hp}\(\%ebx\)/ || /\%edi/ || /^\t(scas|cmps)/ ) ) { # Hp (edi)
$entry_patch .= "\tmovl \%edi,${OFFSET_Hp}(\%ebx)\n";
$exit_patch .= "\tmovl ${OFFSET_Hp}(\%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,64(\%ebx)\n";
$gc_call_exit_patch .= "\tmovl 64(\%ebx),\%edi\n";
# nothing for call_{entry,exit} because %edi is callee-save
}
#= if ( $StolenX86Regs <= 4
#= && ( /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,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.
#= }
# --------------------------------------------------------
# next, here we go with non-%esp patching!
#
s/^(\t[a-z])/$entry_patch$1/; # before first instruction
# Actually, call_entry_patch and call_exit_patch never get set,
# so let's nuke this one
# s/^(\tcall .*\n(\taddl \$\d+,\%esp\n)?)/$call_exit_patch$1$call_entry_patch/g; # _all_ calls
# Before calling GC we must set up the exit condition before the call
# and entry condition when we come back
s/^(\tcall ${T_DO_GC}\n(\taddl \$\d+,\%esp\n)?)/$gc_call_exit_patch$1$gc_call_entry_patch/g; # _all_ calls
# fix _all_ non-local jumps:
...
...
@@ -1264,14 +1297,47 @@ sub print_doctored {
s/^\tJMP___SL/\tjmp \*${T_X86_PRE_LLBL}/go;
s/^\tJMP___L/\tjmp ${T_X86_PRE_LLBL}/go;
# fix post-PerformGC wrapper (re-)entries ???
if ($StolenX86Regs == 2 ) {
die "ARGH! Jump uses \%esi or \%edi with -monly-2-regs:\n$_"
if /^\t(jmp|call) .*\%e(si|di)/;
#= die "ARGH! Jump uses \%esi, \%edi, or \%ecx with -monly-2-regs:\n$_"
#= if /^\t(jmp|call) .*\%e(si|di|cx)/;
} elsif ($StolenX86Regs == 3 ) {
die "ARGH! Jump uses \%edi with -monly-3-regs:\n$_"
if /^\t(jmp|call) .*\%edi/;
#= die "ARGH! Jump uses \%edi or \%ecx with -monly-3-regs:\n$_"
#= if /^\t(jmp|call) .*\%e(di|cx)/;
#= } elsif ($StolenX86Regs == 4 ) {
#= die "ARGH! Jump uses \%ecx with -monly-4-regs:\n$_"
#= if /^\t(jmp|call) .*\%ecx/;
}
# final peephole fixes
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;
s/^\tmovl \$${T_US}(.*),\%ebx\n\tjmp \*\%ebx/\tjmp $T_US$1/g;
s/^\tmovl \$${T_US}(.*),\%ecx\n\tjmp \*\%ecx/\tjmp $T_US$1/g;
s/^\tmovl \$${T_US}(.*),\%edx\n\tjmp \*\%edx/\tjmp $T_US$1/g;
# Hacks to eliminate some reloads of Hp. Worth about 5% code size.
# We could do much better than this, but at least it catches about
# half of the unnecessary reloads.
# Note that these will stop working if either:
# (i) the offset of Hp from BaseReg changes from 80, or
# (ii) the register assignment of BaseReg changes from %ebx
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 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 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
#
...
...
@@ -1289,8 +1355,53 @@ sub print_doctored {
\begin{code}
sub init_FUNNY_THINGS {
%KNOWN_FUNNY_THING = (
# example
# "${T_US}stg_.*{T_POST_LBL}", 1,
"${T_US}CheckHeapCode${T_POST_LBL}", 1,
"${T_US}CommonUnderflow${T_POST_LBL}", 1,
"${T_US}Continue${T_POST_LBL}", 1,
"${T_US}EnterNodeCode${T_POST_LBL}", 1,
"${T_US}ErrorIO_call_count${T_POST_LBL}", 1,
"${T_US}ErrorIO_innards${T_POST_LBL}", 1,
"${T_US}IndUpdRetDir${T_POST_LBL}", 1,
"${T_US}IndUpdRetV0${T_POST_LBL}", 1,
"${T_US}IndUpdRetV1${T_POST_LBL}", 1,
"${T_US}IndUpdRetV2${T_POST_LBL}", 1,
"${T_US}IndUpdRetV3${T_POST_LBL}", 1,
"${T_US}IndUpdRetV4${T_POST_LBL}", 1,
"${T_US}IndUpdRetV5${T_POST_LBL}", 1,
"${T_US}IndUpdRetV6${T_POST_LBL}", 1,
"${T_US}IndUpdRetV7${T_POST_LBL}", 1,
"${T_US}PrimUnderflow${T_POST_LBL}", 1,
"${T_US}StackUnderflowEnterNode${T_POST_LBL}", 1,
"${T_US}StdErrorCode${T_POST_LBL}", 1,
"${T_US}UnderflowVect0${T_POST_LBL}", 1,
"${T_US}UnderflowVect1${T_POST_LBL}", 1,
"${T_US}UnderflowVect2${T_POST_LBL}", 1,
"${T_US}UnderflowVect3${T_POST_LBL}", 1,
"${T_US}UnderflowVect4${T_POST_LBL}", 1,
"${T_US}UnderflowVect5${T_POST_LBL}", 1,
"${T_US}UnderflowVect6${T_POST_LBL}", 1,
"${T_US}UnderflowVect7${T_POST_LBL}", 1,
"${T_US}UpdErr${T_POST_LBL}", 1,
"${T_US}UpdatePAP${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,
"${T_US}_PRMarking_MarkNextCAF${T_POST_LBL}", 1,
"${T_US}_PRMarking_MarkNextGA${T_POST_LBL}", 1,
"${T_US}_PRMarking_MarkNextRoot${T_POST_LBL}", 1,
"${T_US}_PRMarking_MarkNextSpark${T_POST_LBL}", 1,
"${T_US}_PRMarking_MarkNextEvent${T_POST_LBL}", 1,
"${T_US}_PRMarking_MarkNextClosureInFetchBuffer${T_POST_LBL}", 1,
"${T_US}_Scavenge_Forward_Ref${T_POST_LBL}", 1,
"${T_US}__std_entry_error__${T_POST_LBL}", 1,
"${T_US}_startMarkWorld${T_POST_LBL}", 1,
"${T_US}resumeThread${T_POST_LBL}", 1,
"${T_US}startCcRegisteringWorld${T_POST_LBL}", 1,
"${T_US}startEnterFloat${T_POST_LBL}", 1,
"${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
);
}
\end{code}
...
...
@@ -1312,30 +1423,28 @@ sub rev_tbl {
local($after) = '';
local(@lines) = split(/\n/, $tbl);
local($i, $j); #local ($i, $extra, $words_to_pad, $j);
# see comment in mangleAsm as to why this silliness is needed.
local($TDOTWORD) = ${T_DOT_WORD};
local($TDOTGLOBAL) = ${T_DOT_GLOBAL};
local($TUS) = ${T_US};
local($TPOSTLBL) = ${T_POST_LBL};
# Deal with the header...
for ($i = 0; $i <= $#lines && $lines[$i] !~ /^\t?$TDOTWORD\s+/o; $i++) {
for ($i = 0; $i <= $#lines && $lines[$i] !~ /^\t$TDOTWORD\s+/o; $i++) {
$label .= $lines[$i] . "\n",
next if $lines[$i] =~ /^[A-Za-z0-9_]+_info$TPOSTLBL[@]?$/o
|| $lines[$i] =~ /$TDOTGLOBAL/o
|| $lines[$i] =~ /^$TUS[@]?
\S+_
vtbl$TPOSTLBL[@]?$/o;
|| $lines[$i] =~ /^$TUS[@]?vtbl
_\S+
$TPOSTLBL[@]?$/o;
$before .= $lines[$i] . "\n"; # otherwise...
}
# Grab the table data...
if ( $TargetPlatform !~ /^hppa/ ) {
for ( ; $i <= $#lines && $lines[$i] =~ /^\t
?
$TDOTWORD\s+/o; $i++) {
for ( ; $i <= $#lines && $lines[$i] =~ /^\t$TDOTWORD\s+/o; $i++) {
push(@words, $lines[$i]);
}
} else { # hppa weirdness
for ( ; $i <= $#lines && $lines[$i] =~ /^\s+
($TDOTWORD|\.
IMPORT)/; $i++) {
for ( ; $i <= $#lines && $lines[$i] =~ /^\s+
\.(word|
IMPORT)/; $i++) {
if ($lines[$i] =~ /^\s+\.IMPORT/) {
push(@imports, $lines[$i]);
} else {
...
...
@@ -1347,13 +1456,8 @@ sub rev_tbl {
}
}
# now throw away the first word (SRT) iff it is empty.
# The .zero business is for Linux/ELF.
# The .skip business is for Sparc/Solaris/ELF.
# The .blockz business is for HPPA.
if ($discard1 && $words[0] =~ /^\t?($TDOTWORD\s+0|\.zero\s+4|\.skip\s+4|\.blockz\s+4)/) {
shift(@words)
}
# now throw away the first word (entry code):
shift(@words) if $discard1;
# Padding removed to reduce code size and improve performance on Pentiums.
# Simon M. 13/4/96
...
...
@@ -1376,7 +1480,7 @@ sub rev_tbl {
$tbl = $before
. (($TargetPlatform !~ /^hppa/) ? '' : join("\n", @imports) . "\n")
. join("\n", @words) . "\n"
. join("\n",
(reverse
@words)
)
. "\n"
. $label . $after;
# print STDERR "before=$before\n";
...
...
@@ -1388,6 +1492,36 @@ sub rev_tbl {
}
\end{code}
\begin{code}
sub mini_mangle_asm_i386 {
local($in_asmf, $out_asmf) = @_;
&init_TARGET_STUFF();
# see mangleAsm comment
local($TUS) = ${T_US};
local($TPOSTLBL)=${T_POST_LBL};
open(INASM, "< $in_asmf")
|| &tidy_up_and_die(1,"$Pgm: failed to open `$in_asmf' (to read)\n");
open(OUTASM,"> $out_asmf")
|| &tidy_up_and_die(1,"$Pgm: failed to open `$out_asmf' (to write)\n");
while (<INASM>) {
print OUTASM;
next unless
/^$TUS[@]?(PerformGC|StackOverflow|Yield|PerformReschedule)_wrapper$TPOSTLBL\n/o;
print OUTASM "\tmovl \%esp, ${T_US}__temp_esp\n";
print OUTASM "\tmovl \%eax, ${T_US}__temp_eax\n";
}
# finished:
close(OUTASM) || &tidy_up_and_die(1,"Failed writing to $out_asmf\n");
close(INASM) || &tidy_up_and_die(1,"Failed reading from $in_asmf\n");
}
\end{code}
The HP is a major nuisance. The threaded code mangler moved info
tables from data space to code space, but unthreaded code in the RTS
still has references to info tables in data space. Since the HP
...
...
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