Cygwin: fix new sigfe.o generation in optimized case
Commit0597c84b9b
("Cygwin: revamp TLS offsets computation") introduced a really weird problem when building Cygwin with optimization. First of all, the tlsoffsets file is broken with -O2. This can easily be fixed by running the compiler with -O0 when called from the gentls_offsets script. But it gets worse: When creating sigfe.o with optimization, the generated machine code uses incorrect offsets: For some reason the assembler codes using _cygtls.stackptr as offset value are assembled into machine code using _cygtls.pstackptr as offsets. And as if that isn't already absurd enough, renaming _cygtls.pstackptr to, say, _cygtls.blurb, fixes the assembled machine code expressions; they use the value of _cygtls.stackptr again. So I changed gentls_offsets and gendef to use _cygtls.foo_p rather than _cygtls.pfoo and that fixes the assembled code in the optimized case. No, I can't explain that. There's no system in that behaviour. It looks absolutely crazy. Fixes:0597c84b9b
("Cygwin: revamp TLS offsets computation") Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
parent
4f034daba7
commit
8f66bc28ae
|
@ -318,7 +318,7 @@ _sigdelayed_end:
|
|||
_ZN7_cygtls3popEv:
|
||||
.seh_endprologue
|
||||
movq \$-8,%r11
|
||||
xaddq %r11,_cygtls.pstackptr(%rcx)
|
||||
xaddq %r11,_cygtls.stackptr_p(%rcx)
|
||||
movq -8(%r11),%rax
|
||||
ret
|
||||
.seh_endproc
|
||||
|
@ -332,7 +332,7 @@ _ZN7_cygtls4lockEv:
|
|||
.seh_endprologue
|
||||
movq %rcx,%r12
|
||||
1: movl \$1,%r11d
|
||||
xchgl %r11d,_cygtls.pstacklock(%r12)
|
||||
xchgl %r11d,_cygtls.stacklock_p(%r12)
|
||||
testl %r11d,%r11d
|
||||
jz 2f
|
||||
pause
|
||||
|
@ -346,7 +346,7 @@ _ZN7_cygtls4lockEv:
|
|||
.seh_proc _ZN7_cygtls6unlockEv
|
||||
_ZN7_cygtls6unlockEv:
|
||||
.seh_endprologue
|
||||
decl _cygtls.pstacklock(%rcx)
|
||||
decl _cygtls.stacklock_p(%rcx)
|
||||
ret
|
||||
.seh_endproc
|
||||
|
||||
|
@ -355,7 +355,7 @@ _ZN7_cygtls6unlockEv:
|
|||
.seh_proc _ZN7_cygtls6lockedEv
|
||||
_ZN7_cygtls6lockedEv:
|
||||
.seh_endprologue
|
||||
movl _cygtls.pstacklock(%rcx),%eax
|
||||
movl _cygtls.stacklock_p(%rcx),%eax
|
||||
ret
|
||||
.seh_endproc
|
||||
|
||||
|
@ -528,7 +528,7 @@ __ZN7_cygtls3popEv\@4:
|
|||
1: pushl %ebx
|
||||
movl %eax,%ebx # this
|
||||
movl \$-4,%eax
|
||||
xadd %eax,_cygtls.pstackptr(%ebx)
|
||||
xadd %eax,_cygtls.stackptr_p(%ebx)
|
||||
movl -4(%eax),%eax
|
||||
popl %ebx
|
||||
ret
|
||||
|
@ -539,7 +539,7 @@ __ZN7_cygtls4lockEv\@4:
|
|||
pushl %ebx
|
||||
movl %eax,%ebx
|
||||
1: movl \$1,%eax
|
||||
xchgl %eax,_cygtls.pstacklock(%ebx)
|
||||
xchgl %eax,_cygtls.stacklock_p(%ebx)
|
||||
testl %eax,%eax
|
||||
jz 2f
|
||||
call _yield
|
||||
|
@ -550,12 +550,12 @@ __ZN7_cygtls4lockEv\@4:
|
|||
# _cygtls::unlock
|
||||
.global __ZN7_cygtls6unlockEv\@4
|
||||
__ZN7_cygtls6unlockEv\@4:
|
||||
decl _cygtls.pstacklock(%eax)
|
||||
decl _cygtls.stacklock_p(%eax)
|
||||
ret
|
||||
|
||||
.global __ZN7_cygtls6lockedEv
|
||||
__ZN7_cygtls6lockedEv:
|
||||
movl _cygtls.pstacklock(%eax),%eax
|
||||
movl _cygtls.stacklock_p(%eax),%eax
|
||||
ret
|
||||
|
||||
.extern __ZN7_cygtls19call_signal_handlerEv\@4
|
||||
|
|
|
@ -43,7 +43,7 @@ gawk '
|
|||
}
|
||||
' | \
|
||||
# Now run the compiler to generate an assembler file.
|
||||
${CXXCOMPILE} -x c++ -g0 -S - -o - | \
|
||||
${CXXCOMPILE} -x c++ -g0 -O0 -S - -o - | \
|
||||
# The assembler file consists of lines like these:
|
||||
#
|
||||
# __CYGTLS__foo
|
||||
|
@ -63,7 +63,7 @@ gawk '\
|
|||
/\s*\.space\s*4/ {
|
||||
if (length (varname) > 0) {
|
||||
printf (".equ _cygtls.%s, %d\n", varname, -start_offset);
|
||||
printf (".equ _cygtls.p%s, 0\n", varname);
|
||||
printf (".equ _cygtls.%s_p, 0\n", varname);
|
||||
varname = "";
|
||||
}
|
||||
}
|
||||
|
@ -75,7 +75,7 @@ gawk '\
|
|||
} else {
|
||||
value = $2;
|
||||
printf (".equ _cygtls.%s, %d\n", varname, value - start_offset);
|
||||
printf (".equ _cygtls.p%s, %d\n", varname, value);
|
||||
printf (".equ _cygtls.%s_p, %d\n", varname, value);
|
||||
}
|
||||
varname = "";
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue