$ofile = $ARGV[1];
if ( $TargetPlatform =~ /^i386-/ ) {
- $StolenX86Regs = $ARGV[2];
+ if ($ARGV[2] eq '') {
+ $StolenX86Regs = 4;
+ } else {
+ $StolenX86Regs = $ARGV[2];
+ }
}
&mangle_asm($ifile,$ofile);
$T_HDR_direct = "\t.SPACE \$TEXT\$\n\t.SUBSPA \$CODE\$\n\t\.align 4\n";
#--------------------------------------------------------#
- } elsif ( $TargetPlatform =~ /^i386-.*-(linuxaout|freebsd2|netbsd|openbsd|nextstep3|cygwin32|mingw32)$/ ) {
+ } elsif ( $TargetPlatform =~ /^i386-.*-(linuxaout|freebsd2|openbsd|nextstep3|cygwin32|mingw32)$/ ) {
# NeXT added but not tested. CaS
$T_STABBY = 1; # 1 iff .stab things (usually if a.out format)
$T_HDR_direct = "\.text\n\t\.align 2,0x90\n";
#--------------------------------------------------------#
- } elsif ( $TargetPlatform =~ /^i386-.*-(solaris2|linux|freebsd|netbsd_elf)$/ ) {
+ } elsif ( $TargetPlatform =~ /^i386-.*-(solaris2|linux|freebsd|netbsd)$/ ) {
$T_STABBY = 0; # 1 iff .stab things (usually if a.out format)
$T_US = ''; # _ if symbols have an underscore on the front
$T_PRE_APP = # regexp that says what comes before APP/NO_APP
- ($TargetPlatform =~ /-(linux|freebsd|netbsd_elf)$/) ? '#' : '/' ;
+ ($TargetPlatform =~ /-(linux|freebsd|netbsd)$/) ? '#' : '/' ;
$T_CONST_LBL = '^\.LC(\d+):$'; # regexp for what such a lbl looks like
$T_POST_LBL = ':';
$T_X86_PRE_LLBL_PAT = '\.L';
$T_MOVE_DIRVS = '^(\s*(\.(p2)?align\s+\d+(,\s*0x90)?|\.globl\s+\S+|\.text|\.data|\.section\s+.*|\.type\s+.*|\.Lfe.*\n\s*\.size\s+.*|\.size\s+.*|\.ident.*)\n)';
$T_COPY_DIRVS = '\.(globl)';
- if ( $TargetPlatform =~ /freebsd|netbsd_elf/ ) {
+ if ( $TargetPlatform =~ /freebsd|netbsd/ ) {
$T_hsc_cc_PAT = '\.ascii.*\)(hsc|cc) (.*)\\\\11"\n\t\.ascii\s+"(.*)\\\\0"';
} else {
$T_hsc_cc_PAT = '\.string.*\)(hsc|cc) (.*)\\\\t(.*)"';
$i = 0; $chkcat[0] = 'misc'; $chk[0] = '';
while (<INASM>) {
+ tr/\r//d if $TargetPlatform =~ /-mingw32$/;
next if $T_STABBY && /^\.stab.*${T_US}__stg_split_marker/o;
next if $T_STABBY && /^\.stab.*ghc.*c_ID/;
next if /^\t\.def.*endef$/;
$chksymb[$i] = '';
} elsif ( $TargetPlatform =~ /^i386-.*-solaris2/
- && /^(_uname|uname|stat|fstat):/ ) {
- # for some utterly bizarre reason, this platform
- # likes to drop little local C routines with these names
- # into each and every .o file that #includes the
- # relevant system .h file. Yuck. We just don't
- # tolerate them in .hc files (which we are processing
- # here). If you need to call one of these things from
- # Haskell, make a call to your own C wrapper, then
- # put that C wrapper (which calls one of these) in a
- # plain .c file. WDP 95/12
+ && /^[A-Za-z0-9][A-Za-z0-9_]*:/ ) {
+ # Some Solaris system headers contain function definitions (as
+ # opposed to mere prototypes), which end up in the .hc file when
+ # a Haskell module foreign imports the corresponding system
+ # functions (most notably stat()). We put them into the text
+ # segment. Note that this currently does not extend to function
+ # names starting with an underscore.
+ # - chak 7/2001
$chk[++$i] = $_;
- $chkcat[$i] = 'toss';
+ $chkcat[$i] = 'misc';
$chksymb[$i] = $1;
} elsif ( /^${T_US}[A-Za-z0-9_]/o
|| /^${T_US}__fexp_.*${T_POST_LBL}$/o # foreign export
|| /^${T_US}__init.*${T_POST_LBL}$/o # __init<module>
|| /^${T_US}.*_btm${T_POST_LBL}$/o # large bitmaps
- || /^${T_US}.*_closure_tbl${T_POST_LBL}$/o; # closure tables
+ || /^${T_US}.*_closure_tbl${T_POST_LBL}$/o # closure tables
+ || /^_uname:/o; # x86/Solaris2
$chk[++$i] = $_;
$chkcat[$i] = 'misc';
if ($TargetPlatform =~ /^powerpc-|^rs6000-/)
print STDERR "$Pgm: unknown epilogue mangling? $TargetPlatform\n";
}
- # --- Can't test for residual epilogue junk reliably because
- # --- there might be some directives left over that we're going
- # --- to move to the next chunk (see below).
- # die "Epilogue junk?: $e\n" if $e =~ /^\t[^\.\n]/
- # && $TargetPlatform !~ /^powerpc-/; #ToDo: remove test
+ print "WARNING: Epilogue junk?: $e\n" if $e =~ /^\t\s*[^\.\s\n]/
+ && $TargetPlatform !~ /^powerpc-/; #ToDo: remove test
# glue together what's left
$c = $r . $e;
# references to fast-entry point.
# (questionable re hppa and mips...)
print STDERR "still has jump to fast entry point:\n$c"
- if $c =~ /${T_US}${symb}_fast/;
+ if $c =~ /\b${T_US}${symb}_fast/;
}
print OUTASM $T_HDR_entry;