X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fdriver%2Fmangler%2Fghc-asm.lprl;h=f801846ca6c406fe79496b098cdbe1654d2d37a8;hb=b9dce85fb48b8c5e82a41e79eeb4843122ad46cf;hp=e616a6cf725bf2f4178c4d0dd4e04a854c9c8f22;hpb=3c7db0d06bee69140a6898ab78c84952ea73a4f7;p=ghc-hetmet.git diff --git a/ghc/driver/mangler/ghc-asm.lprl b/ghc/driver/mangler/ghc-asm.lprl index e616a6c..f801846 100644 --- a/ghc/driver/mangler/ghc-asm.lprl +++ b/ghc/driver/mangler/ghc-asm.lprl @@ -227,6 +227,14 @@ sub init_TARGET_STUFF { $T_HDR_misc = "\.text\n\t\.align 8\n"; $T_HDR_data = "\.data\n\t\.align 8\n"; $T_HDR_rodata = "\.section\t\.rodata\n\t\.align 8\n"; + + # the assembler on x86_64/Linux refuses to generate code for + # .quad x - y + # where x is in the text section and y in the rodata section. + # It works if y is in the text section, though. This is probably + # going to cause difficulties for PIC, I imagine. + $T_HDR_relrodata= "\.text\n\t\.align 8\n"; + $T_HDR_closure = "\.data\n\t\.align 8\n"; $T_HDR_info = "\.text\n\t\.align 8\n"; $T_HDR_entry = "\.text\n\t\.align 8\n"; @@ -360,7 +368,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|\.stab.*|\.section.*|\s+\.type.*|\s+\.size.*)\n)'; + $T_MOVE_DIRVS = '^((\s+\.align\s+\d+|\s+\.proc\s+\d+|\s+\.global\s+\S+|\.text|\.data|\.stab.*|\s*\.section.*|\s+\.type.*|\s+\.size.*)\n)'; $T_COPY_DIRVS = '\.(global|proc|stab)'; $T_DOT_WORD = '\.(long|word|byte|half|skip|uahalf|uaword)'; @@ -531,7 +539,14 @@ sub mangle_asm { $chk[++$i] = $_; $chkcat[$i] = 'rodata'; $chksymb[$i] = ''; - + } elsif ( $TargetPlatform =~ /-darwin/ + && (/^\s*\.subsections_via_symbols/ + ||/^\s*\.no_dead_strip.*/)) { + # 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. + # The .no_dead_strip directives are actually put there by + # the gcc3 "used" attribute on entry points. } elsif ( /^\s+/ ) { # most common case first -- a simple line! # duplicated from the bottom @@ -540,12 +555,6 @@ 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-/ @@ -1216,8 +1225,23 @@ sub mangle_asm { # If this is an entry point with an info table, # eliminate the entry symbol and all directives involving it. if (defined($infochk{$symb}) && $TargetPlatform !~ /^ia64-/) { - $c =~ s/^.*$symb_(entry|ret)${T_POST_LBL}\n//; - $c =~ s/^\s*\..*$symb.*\n//g; + @o = (); + foreach $l (split(/\n/,$c)) { + next if $l =~ /^.*$symb_(entry|ret)${T_POST_LBL}/; + + # If we have .type/.size direrctives involving foo_entry, + # then make them refer to foo_info instead. The information + # in these directives is used by the cachegrind annotator, + # so it is worthwhile keeping. + if ($l =~ /^\s*\.(type|size).*$symb_(entry|ret)/) { + $l =~ s/$symb(_entry|_ret)/${symb}_info/g; + push(@o,$l); + next; + } + next if $l =~ /^\s*\..*$symb.*\n?/; + push(@o,$l); + } + $c = join("\n",@o) . "\n"; } print OUTASM $T_HDR_entry;