X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fdriver%2Fmangler%2Fghc-asm.lprl;fp=ghc%2Fdriver%2Fmangler%2Fghc-asm.lprl;h=1c75f00d2b331d04381056c86692575a3e066de2;hb=9342a543736bc7a015ec5857d20e98001c9e990f;hp=3406419b7b6aa844fa712aeeb9f5ccb8bbf0a3f0;hpb=ad562898150a6252df71ae4fa9230ec6851d9319;p=ghc-hetmet.git diff --git a/ghc/driver/mangler/ghc-asm.lprl b/ghc/driver/mangler/ghc-asm.lprl index 3406419..1c75f00 100644 --- a/ghc/driver/mangler/ghc-asm.lprl +++ b/ghc/driver/mangler/ghc-asm.lprl @@ -822,23 +822,27 @@ sub mangle_asm { } } - $p =~ s/^\tpushl\s+\%edi\n//; - $p =~ s/^\tpushl\s+\%esi\n//; - $p =~ s/^\tpushl\s+\%ebx\n//; - $p =~ s/^\tmovl\s+\%esi,\s*\d*\(\%esp\)\n//; - $p =~ s/^\tmovl\s+\%edi,\s*\d*\(\%esp\)\n//; + # gcc 3.4.3 puts this kind of stuff in the prologue, eg. + # when compiling PrimOps.cmm with -optc-O2: + # xorl %ecx, %ecx + # xorl %edx, %edx + # movl %ecx, 16(%esp) + # movl %edx, 20(%esp) + # but then the code of the function doesn't assume + # anything about the contnets of these stack locations. + # I think it's to do with the use of inline functions for + # PK_Word64() and friends, where gcc is initialising the + # contents of the struct to zero, and failing to optimise + # away the initialisation. Let's live dangerously and + # discard these initalisations. + + $p =~ s/^\tpushl\s+\%e(di|si|bx)\n//g; + $p =~ s/^\txorl\s+\%e(ax|cx|dx),\s*\%e(ax|cx|dx)\n//g; + $p =~ s/^\tmovl\s+\%e(ax|cx|dx|si|di),\s*\d*\(\%esp\)\n//g; + $p =~ s/^\tmovl\s+\$\d+,\s*\d*\(\%esp\)\n//g; $p =~ s/^\tsubl\s+\$\d+,\s*\%esp\n//; $p =~ s/^\tmovl\s+\$\d+,\s*\%eax\n\tcall\s+__alloca\n// if ($TargetPlatform =~ /^.*-(cygwin32|mingw32)/); - # GCC 3.1 is in the habit of adding spurious writes to the - # stack in the prologue. Just to be on the safe side, - # chuck these over the fence into the main code. - while ($p =~ /^\tmovl\s+\$\d+,\s*\d*\(\%esp\)\n/) { - # print "Spurious instruction: $&"; - $p = $` . $'; - $r = $& . $r; - } - if ($TargetPlatform =~ /^i386-apple-darwin/) { $pcrel_label = $p; $pcrel_label =~ s/(.|\n)*^(\"?L\d+\$pb\"?):\n(.|\n)*/$2/ or $pcrel_label = "";