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:
parent
f2e39d5230
commit
cea26c7570
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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";
|
||||
|
Loading…
x
Reference in New Issue
Block a user