[project @ 2005-01-23 20:34:17 by wolfgang]
[ghc-hetmet.git] / ghc / driver / mangler / ghc-asm.lprl
index 00af653..06446e4 100644 (file)
@@ -293,11 +293,12 @@ sub init_TARGET_STUFF {
     $T_DOT_WORD            = '\.(long|short|byte|fill|space)';
     $T_DOT_GLOBAL   = '\.globl';
     $T_HDR_toc      = "\.toc\n";
-    $T_HDR_literal  = "\t\.const_data\n\t\.align 2\n";
+    $T_HDR_literal  = "\t\.const\n\t\.align 2\n";
     $T_HDR_misc            = "\t\.text\n\t\.align 2\n";
     $T_HDR_data            = "\t\.data\n\t\.align 2\n";
-    $T_HDR_rodata   = "\t\.const_data\n\t\.align 2\n";
-    $T_HDR_closure  = "\t\.const_data\n\t\.align 2\n";
+    $T_HDR_rodata   = "\t\.const\n\t\.align 2\n";
+    $T_HDR_relrodata= "\t\.const_data\n\t\.align 2\n";
+    $T_HDR_closure  = "\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_vector   = "\t\.text\n\t\.align 2\n";
@@ -405,7 +406,7 @@ sub init_TARGET_STUFF {
     $T_CONST_LBL    = '^\.LLC(\d+):$'; # regexp for what such a lbl looks like
     $T_POST_LBL     = ':';
 
-    $T_MOVE_DIRVS   = '^((\s+\.align\s+\d+|\s+\.proc\s+\d+|\s+\.global\s+\S+|\.text|\.data|\.seg|\.stab.*|\t?\.section.*|\s+\.type.*|\s+\.size.*)\n)';
+    $T_MOVE_DIRVS   = '^((\s+\.align\s+\d+|\s+\.proc\s+\d+|\s+\.global\s+\S+|\.text|\.data|\.seg|\.stab.*|\s+?\.section.*|\s+\.type.*|\s+\.size.*)\n)';
     $T_COPY_DIRVS   = '\.(global|globl|proc|stab)';
 
     $T_DOT_WORD     = '\.(long|word|nword|xword|byte|half|short|skip|uahalf|uaword)';
@@ -425,6 +426,12 @@ sub init_TARGET_STUFF {
        exit 1;
     }
 
+    if($T_HDR_relrodata eq "") {
+            # default values:
+            # relrodata defaults to rodata.
+        $T_HDR_relrodata = $T_HDR_rodata;
+    }
+
 if ( 0 ) {
 print STDERR "T_STABBY: $T_STABBY\n";
 print STDERR "T_US: $T_US\n";
@@ -533,7 +540,12 @@ sub mangle_asm {
        } elsif ( /\.\.ng:$/ && $TargetPlatform =~ /^alpha-/ ) {
            # Alphas: Local labels not to be confused with new chunks
            $chk[$i] .= $_;
-  
+        } elsif ( $TargetPlatform =~ /-darwin/
+                && /^\t\.subsections_via_symbols/) {
+            # Don't allow Apple's linker to do any dead-stripping of symbols
+            # in this file, because it will mess up info-tables in mangled
+            # code.
+
        # NB: all the rest start with a non-space
 
        } elsif ( $TargetPlatform =~ /^mips-/
@@ -655,16 +667,22 @@ sub mangle_asm {
                    || /^${T_US}.*_slow${T_POST_LBL}$/o         # slow entry
                    || /^${T_US}__stginit.*${T_POST_LBL}$/o     # __stginit<module>
                    || /^${T_US}.*_btm${T_POST_LBL}$/o          # large bitmaps
-                   || /^${T_US}.*_srtd${T_POST_LBL}$/o          # large bitmaps
                    || /^${T_US}.*_fast${T_POST_LBL}$/o         # primops
-                   || /^${T_US}.*_closure_tbl${T_POST_LBL}$/o  # closure tables
                     || /^_uname:/o                             # x86/Solaris2
-               ) {
-                       $chkcat[$i]  = 'misc';
-                 } else {
-                       print STDERR "Warning: retaining unknown function \`$thing' in output from C compiler\n";
-                       $chkcat[$i]  = 'unknown';
-               }
+               )
+            {
+               $chkcat[$i]  = 'misc';
+            } elsif (
+                      /^${T_US}.*_srtd${T_POST_LBL}$/o          # large bitmaps
+                   || /^${T_US}.*_closure_tbl${T_POST_LBL}$/o  # closure tables
+                )
+            {
+                $chkcat[$i] = 'relrodata';
+            } else
+            {
+               print STDERR "Warning: retaining unknown function \`$thing' in output from C compiler\n";
+               $chkcat[$i]  = 'unknown';
+           }
 
        } elsif ( $TargetPlatform =~ /^powerpc-apple-.*/ && ( 
                   /^\.picsymbol_stub/
@@ -1174,7 +1192,7 @@ sub mangle_asm {
 
            # SRT
            if ( defined($srtchk{$symb}) ) {
-               print OUTASM $T_HDR_rodata;
+               print OUTASM $T_HDR_relrodata;
                print OUTASM $chk[$srtchk{$symb}];
                $chkcat[$srtchk{$symb}] = 'DONE ALREADY';
            }
@@ -1234,7 +1252,10 @@ sub mangle_asm {
                print OUTASM $T_HDR_rodata;
                print OUTASM $chk[$i];
                $chkcat[$i] = 'DONE ALREADY';
-
+       } elsif ( $chkcat[$i] eq 'relrodata' ) {
+               print OUTASM $T_HDR_relrodata;
+               print OUTASM $chk[$i];
+               $chkcat[$i] = 'DONE ALREADY';
        } elsif ( $chkcat[$i] eq 'toc' ) {
             # silly optimisation to print tocs, since they come in groups...
            print OUTASM $T_HDR_toc;