X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fdriver%2Fmangler%2Fghc-asm.lprl;h=ab226ff372ae7fdc4ac0975c2237ce447f836972;hb=616069b36d8b335d7ceed03fb051aba2cb488bce;hp=393441662358f1a58a6fd2abb52f4c5ee786e222;hpb=fc9bacdece12574a9ba9d2de2a74783da19f2ac4;p=ghc-hetmet.git diff --git a/ghc/driver/mangler/ghc-asm.lprl b/ghc/driver/mangler/ghc-asm.lprl index 3934416..ab226ff 100644 --- a/ghc/driver/mangler/ghc-asm.lprl +++ b/ghc/driver/mangler/ghc-asm.lprl @@ -223,10 +223,21 @@ sub init_TARGET_STUFF { $T_DOT_WORD = '\.(quad|long|value|byte|zero)'; $T_DOT_GLOBAL = '\.global'; + + $T_HDR_literal16 = "\.section\t\.rodata.cst16\n\t.align 16\n"; $T_HDR_literal = "\.section\t\.rodata\n"; + $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"; @@ -539,6 +550,21 @@ sub mangle_asm { # code. # The .no_dead_strip directives are actually put there by # the gcc3 "used" attribute on entry points. + + } elsif ( $TargetPlatform =~ /^powerpc-apple-.*/ && ( + /^\s*\.picsymbol_stub/ + || /^\s*\.section __TEXT,__picsymbol_stub1,.*/ + || /^\s*\.section __TEXT,__picsymbolstub1,.*/ + || /^\s*\.symbol_stub/ + || /^\s*\.section __TEXT,__symbol_stub1,.*/ + || /^\s*\.section __TEXT,__symbolstub1,.*/ + || /^\s*\.lazy_symbol_pointer/ + || /^\s*\.non_lazy_symbol_pointer/ )) + { + $chk[++$i] = $_; + $chkcat[$i] = 'dyld'; + $chksymb[$i] = ''; + } elsif ( /^\s+/ ) { # most common case first -- a simple line! # duplicated from the bottom @@ -685,19 +711,6 @@ sub mangle_asm { $chkcat[$i] = 'unknown'; } - } elsif ( $TargetPlatform =~ /^powerpc-apple-.*/ && ( - /^\.picsymbol_stub/ - || /^\.section __TEXT,__picsymbol_stub1,.*/ - || /^\.section __TEXT,__picsymbolstub1,.*/ - || /^\.symbol_stub/ - || /^\.section __TEXT,__symbol_stub1,.*/ - || /^\.section __TEXT,__symbolstub1,.*/ - || /^\.lazy_symbol_pointer/ - || /^\.non_lazy_symbol_pointer/ )) - { - $chk[++$i] = $_; - $chkcat[$i] = 'dyld'; - $chksymb[$i] = ''; } elsif ( $TargetPlatform =~ /^powerpc-apple-.*/ && /^\.data/ && $chkcat[$i] eq 'dyld') { # non_lazy_symbol_ptrs that point to local symbols $chk[++$i] = $_; @@ -1133,7 +1146,22 @@ sub mangle_asm { # print out all the literal strings next for ($i = 0; $i < $numchks; $i++) { if ( $chkcat[$i] eq 'literal' ) { - print OUTASM $T_HDR_literal, $chk[$i]; + + # HACK: try to detect 16-byte constants and align them + # on a 16-byte boundary. x86_64 sometimes needs 128-bit + # aligned constants. + if ( $TargetPlatform =~ /^x86_64/ ) { + $z = $chk[$i]; + if ($z =~ /(\.long.*\n.*\.long.*\n.*\.long.*\n.*\.long|\.quad.*\n.*\.quad)/) { + print OUTASM $T_HDR_literal16; + } else { + print OUTASM $T_HDR_literal; + } + } else { + print OUTASM $T_HDR_literal; + } + + print OUTASM $chk[$i]; print OUTASM "; end literal\n" if $TargetPlatform =~ /^hppa/; # for the splitter $chkcat[$i] = 'DONE ALREADY';