4
0
mirror of git://sourceware.org/git/newlib-cygwin.git synced 2025-01-19 04:49:25 +08:00

Cygwin: perl scripts: drop support for i686

- rename "is64bit" to "is_x86_64"
- Always set sym_prefix to empty string and add a FIXME
- speclib: rename uscore to sym_prefix and fix bug in string handling

Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
Corinna Vinschen 2022-07-28 20:05:55 +02:00
parent f2e39d5230
commit cea26c7570
3 changed files with 14 additions and 410 deletions

View File

@ -21,8 +21,9 @@ if (!defined($cpu) || !defined($output_def)) {
die "$0: missing required option\n";
}
my $is64bit = $cpu eq 'x86_64';
my $sym_prefix = $is64bit ? '' : '_';
my $is_x86_64 = $cpu eq 'x86_64';
# FIXME? Do other (non-32 bit) arches on Windows still use symbol prefixes?
my $sym_prefix = '';
my @top = ();
while (<>) {
@ -88,14 +89,12 @@ sub fefunc {
my $func = $sym_prefix . shift;
my $fe = $sym_prefix . shift;
my $sigfe_func;
if ($is64bit) {
if ($is_x86_64) {
$sigfe_func = ($fe =~ /^(.*)_${func}$/)[0];
} else {
$sigfe_func = ($fe =~ /^(.*)${func}$/)[0];
}
my $extra;
my $res;
if ($is64bit) {
if ($is_x86_64) {
$res = <<EOF;
.extern $func
.global $fe
@ -108,19 +107,10 @@ $fe:
jmp $sigfe_func
.seh_endproc
EOF
} else {
$res = <<EOF;
.extern $func
.global $fe
$fe:
pushl \$$func
jmp $sigfe_func
EOF
}
if (!$main::first++) {
if ($is64bit) {
if ($is_x86_64) {
$res = <<EOF . longjmp () . $res;
.include "tlsoffsets"
.text
@ -388,196 +378,6 @@ stabilize_sig_stack:
popq %r12
ret
.seh_endproc
EOF
} else {
$res = <<EOF . longjmp () . $res;
.text
__sigfe_maybe:
pushl %ebx
pushl %edx
movl %fs:4,%ebx # location of bottom of stack
addl \$_cygtls.initialized,%ebx # where we will be looking
cmpl %ebx,%esp # stack loc > than tls
jge 0f # yep. we don't have a tls.
subl \$_cygtls.initialized,%ebx # where we will be looking
movl _cygtls.initialized(%ebx),%eax
cmpl \$0xc763173f,%eax # initialized?
je 1f
0: popl %edx
popl %ebx
ret
__sigfe:
pushl %ebx
pushl %edx
movl %fs:4,%ebx # location of bottom of stack
1: movl \$1,%eax # potential lock value
xchgl %eax,_cygtls.stacklock(%ebx) # see if we can grab it
movl %eax,_cygtls.spinning(%ebx) # flag if we are waiting for lock
testl %eax,%eax # it will be zero
jz 2f # if so
call _yield # should be a short-time thing, so
jmp 1b # sleep and loop
2: movl \$4,%eax # have the lock, now increment the
xadd %eax,_cygtls.stackptr(%ebx) # stack pointer and get pointer
leal __sigbe,%edx # new place to return to
xchgl %edx,12(%esp) # exchange with real return value
movl %edx,(%eax) # store real return value on alt stack
incl _cygtls.incyg(%ebx)
decl _cygtls.stacklock(%ebx) # remove lock
popl %edx # restore saved value
popl %ebx
ret
.global __sigbe
__sigbe: # return here after cygwin syscall
pushl %eax # don't clobber
pushl %ebx # tls pointer
1: movl %fs:4,%ebx # address of bottom of tls
movl \$1,%eax # potential lock value
xchgl %eax,_cygtls.stacklock(%ebx) # see if we can grab it
movl %eax,_cygtls.spinning(%ebx) # flag if we are waiting for lock
testl %eax,%eax # it will be zero
jz 2f # if so
call _yield # sleep
jmp 1b # and loop
2: movl \$-4,%eax # now decrement aux stack
xadd %eax,_cygtls.stackptr(%ebx) # and get pointer
movl -4(%eax),%eax # get return address from signal stack
xchgl %eax,4(%esp) # swap return address with saved eax
decl _cygtls.incyg(%ebx)
decl _cygtls.stacklock(%ebx) # release lock
popl %ebx
ret
.global _sigdelayed
_sigdelayed:
pushl %ebp
movl %esp,%ebp
# We could be called from an interrupted thread which doesn't know
# about his fate, so save and restore everything and the kitchen sink.
pushf
pushl %esi
pushl %edi
pushl %edx
pushl %ecx
pushl %ebx
pushl %eax
subl \$0x84,%esp
fnstcw 0x80(%esp)
movdqu %xmm7,0x70(%esp)
movdqu %xmm6,0x60(%esp)
movdqu %xmm5,0x50(%esp)
movdqu %xmm4,0x40(%esp)
movdqu %xmm3,0x30(%esp)
movdqu %xmm2,0x20(%esp)
movdqu %xmm1,0x10(%esp)
movdqu %xmm0,(%esp)
movl %fs:4,%ebx # get tls
pushl _cygtls.saved_errno(%ebx) # saved errno
movl \$_cygtls.start_offset,%eax # point to beginning
addl %ebx,%eax # of tls block
call __ZN7_cygtls19call_signal_handlerEv\@4 # call handler
movl %fs:4,%ebx # reget tls
1: movl \$1,%eax # potential lock value
xchgl %eax,_cygtls.stacklock(%ebx) # see if we can grab it
movl %eax,_cygtls.spinning(%ebx) # flag if we are waiting for lock
testl %eax,%eax # it will be zero
jz 2f # if so
call _yield # sleep
jmp 1b # and loop
2: popl %edx # saved errno
testl %edx,%edx # Is it < 0
jl 3f # yup. ignore it
movl _cygtls.errno_addr(%ebx),%eax
movl %edx,(%eax)
3: movl \$-4,%eax # now decrement aux stack
xadd %eax,_cygtls.stackptr(%ebx) # and get pointer
xorl %ebp,%ebp
xchgl %ebp,-4(%eax) # get return address from signal stack
xchgl %ebp,0xa0(%esp) # store real return address
leave: xorl %eax,%eax
movl %eax,_cygtls.incyg(%ebx)
movl %eax,_cygtls.stacklock(%ebx) # unlock
movdqu (%esp),%xmm0
movdqu 0x10(%esp),%xmm1
movdqu 0x20(%esp),%xmm2
movdqu 0x30(%esp),%xmm3
movdqu 0x40(%esp),%xmm4
movdqu 0x50(%esp),%xmm5
movdqu 0x60(%esp),%xmm6
movdqu 0x70(%esp),%xmm7
fninit
fldcw 0x80(%esp)
addl \$0x84,%esp
popl %eax
popl %ebx
popl %ecx
popl %edx
popl %edi
popl %esi
popf
ret
.global __ZN7_cygtls3popEv\@4
__ZN7_cygtls3popEv\@4:
1: pushl %ebx
movl %eax,%ebx # this
movl \$-4,%eax
xadd %eax,_cygtls.stackptr_p(%ebx)
movl -4(%eax),%eax
popl %ebx
ret
# _cygtls::lock
.global __ZN7_cygtls4lockEv\@4
__ZN7_cygtls4lockEv\@4:
pushl %ebx
movl %eax,%ebx
1: movl \$1,%eax
xchgl %eax,_cygtls.stacklock_p(%ebx)
testl %eax,%eax
jz 2f
call _yield
jmp 1b
2: popl %ebx
ret
# _cygtls::unlock
.global __ZN7_cygtls6unlockEv\@4
__ZN7_cygtls6unlockEv\@4:
decl _cygtls.stacklock_p(%eax)
ret
.global __ZN7_cygtls6lockedEv
__ZN7_cygtls6lockedEv:
movl _cygtls.stacklock_p(%eax),%eax
ret
.extern __ZN7_cygtls19call_signal_handlerEv\@4
stabilize_sig_stack:
movl %fs:4,%ebx
1: movl \$1,%eax
xchgl %eax,_cygtls.stacklock(%ebx)
movl %eax,_cygtls.spinning(%ebx) # flag if we are waiting for lock
testl %eax,%eax
jz 2f
call _yield
jmp 1b
2: incl _cygtls.incyg(%ebx)
cmpl \$0,_cygtls.sig(%ebx)
jz 3f
decl _cygtls.stacklock(%ebx) # unlock
movl \$_cygtls.start_offset,%eax # point to beginning
addl %ebx,%eax # of tls block
call __ZN7_cygtls19call_signal_handlerEv\@4
jmp 1b
3: decl _cygtls.incyg(%ebx)
ret
EOF
}
}
@ -585,7 +385,7 @@ EOF
}
sub longjmp {
if ($is64bit) {
if ($is_x86_64) {
return <<EOF;
.globl sigsetjmp
@ -714,204 +514,6 @@ longjmp:
incl %eax
0: ret
.seh_endproc
EOF
} else {
return <<EOF;
.globl _sigsetjmp
_sigsetjmp:
pushl %ebp
movl %esp,%ebp
pushl %edi
movl 8(%ebp),%edi # &sigjmp_buf
movl 12(%ebp),%eax # savemask
movl %eax,208(%edi) # store savemask
testl %eax,%eax # savemask != 0?
je 1f # no, skip fetching sigmask
subl \$12,%esp
leal 212(%edi),%eax # &sigjmp_buf.sigmask
movl %eax,8(%esp) # -> 3rd param "oldset"
xorl %eax,%eax
movl %eax,4(%esp) # NULL -> 2nd param "set"
movl %eax,(%esp) # SIG_SETMASK -> 1st param "how"
call _pthread_sigmask
addl \$12,%esp
jmp 1f
.globl _setjmp
_setjmp:
pushl %ebp
movl %esp,%ebp
pushl %edi
movl 8(%ebp),%edi
1:
movl %eax,0(%edi)
movl %ebx,4(%edi)
movl %ecx,8(%edi)
movl %edx,12(%edi)
movl %esi,16(%edi)
movl -4(%ebp),%eax
movl %eax,20(%edi)
movl 0(%ebp),%eax
movl %eax,24(%edi)
movl %esp,%eax
addl \$12,%eax
movl %eax,28(%edi)
movl 4(%ebp),%eax
movl %eax,32(%edi)
movw %es,%ax
movw %ax,36(%edi)
movw %fs,%ax
movw %ax,38(%edi)
movw %gs,%ax
movw %ax,40(%edi)
movw %ss,%ax
movw %ax,42(%edi)
movl %fs:0,%eax
movl %eax,44(%edi)
fnstcw 48(%edi)
pushl %ebx
call stabilize_sig_stack
movl _cygtls.stackptr(%ebx),%eax # save stack pointer contents
decl _cygtls.stacklock(%ebx)
popl %ebx
movl %eax,52(%edi)
popl %edi
movl \$0,%eax
leave
ret
.globl ___sjfault
___sjfault:
pushl %ebp
movl %esp,%ebp
pushl %edi
movl 8(%ebp),%edi
movl %eax,0(%edi)
movl %ebx,4(%edi)
movl %ecx,8(%edi)
movl %edx,12(%edi)
movl %esi,16(%edi)
movl -4(%ebp),%eax
movl %eax,20(%edi)
movl 0(%ebp),%eax
movl %eax,24(%edi)
movl %esp,%eax
addl \$12,%eax
movl %eax,28(%edi)
movl 4(%ebp),%eax
movl %eax,32(%edi)
movw %es,%ax
movw %ax,36(%edi)
movw %fs,%ax
movw %ax,38(%edi)
movw %gs,%ax
movw %ax,40(%edi)
movw %ss,%ax
movw %ax,42(%edi)
movl %fs:0,%eax
movl %eax,44(%edi)
popl %edi
movl \$0,%eax
leave
ret
.global ___ljfault
___ljfault:
pushl %ebp
movl %esp,%ebp
movl 8(%ebp),%edi
movl 12(%ebp),%eax
testl %eax,%eax
jne 0f
incl %eax
0: movl %eax,0(%edi)
movl 24(%edi),%ebp
pushfl
popl %ebx
movl 44(%edi),%eax
movl %eax,%fs:0
movw 42(%edi),%ax
movw %ax,%ss
movl 28(%edi),%esp
pushl 32(%edi)
pushl %ebx
movw 36(%edi),%ax
movw %ax,%es
movw 40(%edi),%ax
movw %ax,%gs
movl 0(%edi),%eax
movl 4(%edi),%ebx
movl 8(%edi),%ecx
movl 16(%edi),%esi
movl 12(%edi),%edx
movl 20(%edi),%edi
popfl
ret
.globl _siglongjmp
_siglongjmp:
pushl %ebp
movl %esp,%ebp
movl 8(%ebp),%edi # &sigjmp_buf
movl 208(%edi),%eax # load savemask
testl %eax,%eax # savemask != 0?
je 1f # no, skip restoring sigmask
subl \$12,%esp
leal 212(%edi),%eax # &sigjmp_buf.sigmask
movl %eax,4(%esp) # -> 2nd param "set"
xorl %eax,%eax
movl %eax,8(%esp) # NULL -> 3rd param "oldset"
movl %eax,(%esp) # SIG_SETMASK -> 1st param "how"
call _pthread_sigmask
addl \$12,%esp
jmp 1f
.globl _longjmp
_longjmp:
pushl %ebp
movl %esp,%ebp
movl 8(%ebp),%edi # &jmp_buf
1:
call stabilize_sig_stack
movl 52(%edi),%eax # get old signal stack
movl %eax,_cygtls.stackptr(%ebx) # restore
decl _cygtls.stacklock(%ebx) # relinquish lock
xorl %eax,%eax
movl %eax,_cygtls.incyg(%ebx) # we're not in cygwin anymore
movl 12(%ebp),%eax
testl %eax,%eax
jne 3f
incl %eax
3: movl %eax,0(%edi)
movl 24(%edi),%ebp
pushfl
popl %ebx
fninit
fldcw 48(%edi)
movl 44(%edi),%eax
movl %eax,%fs:0
movw 42(%edi),%ax
movw %ax,%ss
movl 28(%edi),%esp
pushl 32(%edi)
pushl %ebx
movw 36(%edi),%ax
movw %ax,%es
movw 40(%edi),%ax
movw %ax,%gs
movl 0(%edi),%eax
movl 4(%edi),%ebx
movl 8(%edi),%ecx
movl 16(%edi),%esi
movl 12(%edi),%edx
movl 20(%edi),%edi
popfl
ret
EOF
}
}

View File

@ -23,8 +23,9 @@ my %text = ();
my %import = ();
my %symfile = ();
my $is64bit = ($cpu eq 'x86_64' ? 1 : 0);
my $sym_prefix = ($is64bit ? '' : '_');
my $is_x86_64 = ($cpu eq 'x86_64' ? 1 : 0);
# FIXME? Do other (non-32 bit) arches on Windows still use symbol prefixes?
my $sym_prefix = '';
while (<$nm_fd>) {
chomp;
@ -57,7 +58,7 @@ for my $f (keys %text) {
} else {
$text{$f} = 1;
open my $as_fd, '|-', $as, '-o', "$dir/t-$f", "-";
if ($is64bit) {
if ($is_x86_64) {
print $as_fd <<EOF;
.text
.extern $imp_sym

View File

@ -19,9 +19,10 @@ $_ = File::Spec->rel2abs($_) for @ARGV;
my $libdll = shift;
my $lib = pop;
my $uscore = ($cpu eq 'x86_64' ? undef : '_');
# FIXME? Do other (non-32 bit) arches on Windows still use symbol prefixes?
my $sym_prefix = '';
(my $iname = basename $lib) =~ s/\.a$//o;
$iname = $uscore . $iname . '_dll_iname';
$iname = $sym_prefix . $iname . '_dll_iname';
open my $nm_fd, '-|', $nm, '-Apg', '--defined-only', @ARGV, $libdll or
die "$0: execution of $nm for object files failed - $!\n";