[project @ 2001-07-22 03:19:51 by chak]
[ghc-hetmet.git] / ghc / driver / mangler / ghc-asm.lprl
index 6e5da21..ce4f018 100644 (file)
@@ -66,7 +66,11 @@ $ifile = $ARGV[0];
 $ofile = $ARGV[1];
 
 if ( $TargetPlatform =~ /^i386-/ ) {
-    $StolenX86Regs = $ARGV[2];
+    if ($ARGV[2] eq '') {
+       $StolenX86Regs = 4;
+    } else {
+        $StolenX86Regs = $ARGV[2];
+    }
 }
 
 &mangle_asm($ifile,$ofile);
@@ -138,7 +142,7 @@ sub init_TARGET_STUFF {
     $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)
@@ -169,12 +173,12 @@ sub init_TARGET_STUFF {
     $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';
@@ -184,7 +188,7 @@ sub init_TARGET_STUFF {
     $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(.*)"';
@@ -417,6 +421,7 @@ sub mangle_asm {
     $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$/;
@@ -564,18 +569,16 @@ sub mangle_asm {
            $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
@@ -591,7 +594,8 @@ sub mangle_asm {
                    || /^${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-/)