OSDN Git Service

* localtime.cc (localtime_r): Call tzset.
[pf3gnuchains/pf3gnuchains3x.git] / winsup / cygwin / gendef
1 #!/usr/bin/perl
2 use strict;
3 my $in = shift;
4 my $tls_offsets = shift;
5 my $out = shift;
6 my $sigfe = shift;
7
8 $main::first = 0;
9 if (!defined($in) || !defined($out) || !defined($sigfe)) {
10     die "usage: $0 deffile.in cygtls.h deffile.def sigfe.s\n";
11 }
12
13 require $tls_offsets;
14
15 open(IN, $in) or die "$0: couldn't open \"$in\" - $!\n";
16 my @top = ();
17 while (<IN>) {
18     push(@top, $_);
19     last if /^\s*exports\s*$/i;
20 }
21 my $libline = <IN>;
22 my @in = <IN>;
23 close(IN);
24
25 my %sigfe = ();
26 my @data = ();
27 my @nosigfuncs = ();
28 my @out = ();
29 for (@in) {
30     /\sDATA$/o and do {
31         push(@data, $_);
32         next;
33     };
34     chomp;
35     if (/=/o) {
36         if (s/\s+NOSIGFE\s*$//) {
37         } elsif (s/ SIGFE$//) {
38           my $func = (split(' '))[2];
39           $sigfe{$func} = '_sigfe_' . $func;
40         }
41     } else {
42         my ($func, $sigfe) = m%^\s*(\S+)(?:\s+((?:NO)?SIGR?FE))?$%o;
43         if (defined($sigfe) && $sigfe =~ /^NO/o) {
44             $_ = $func;
45         } else {
46             $sigfe ||= 'sigfe';
47             $_ = '_' . lc($sigfe) . '_' . $func;
48             $sigfe{$func} = $_;
49             $_ = $func . ' = ' . $_;
50         }
51     }
52     s/(\S)\s+(\S)/$1 $2/go;
53     s/(\S)\s+$/$1/o;
54     s/^\s+(\S)/$1/o;
55     push(@out, $_ . "\n");
56 }
57
58 for (@out) {
59     my ($alias, $func) = /^(\S+) = (\S+)\s*$/o;
60     $_ = $alias . ' = ' . $sigfe{$func} . "\n"
61       if defined($func) && $sigfe{$func};
62 }
63 open(OUT, '>', $out) or die "$0: couldn't open \"$out\" - $!\n";
64 print OUT @top, @data, @out;
65 close OUT;
66
67 open(SIGFE, '>', $sigfe) or die "$0: couldn't open sigfe file \"$sigfe\" - $!\n";
68
69 for my $k (sort keys %sigfe) {
70     print SIGFE fefunc($k, $sigfe{$k});
71 }
72 close SIGFE;
73
74 sub fefunc {
75     my $func = '_' . shift;
76     my $fe = '_' . shift;
77     my $extra;
78     my $res = <<EOF;
79         .extern _siglist_index
80         .extern _siglist
81         .extern $func
82         .global $fe
83 $fe:
84         pushl   \$$func
85         jmp     __sigfe
86
87 EOF
88     if (!$main::first++) {
89         $res = <<EOF . longjmp () . $res;
90         .text
91
92         .stabs  "_sigfe:F(0,1)",36,0,0,__sigbe
93 __sigfe:
94         pushl   %edx
95         movl    %fs:4,%edx
96 1:      movl    \$1,%eax
97         lock    cmpxchg %eax,$tls::stacklock(%edx)
98         jne     2f
99         xorl    %eax,%eax
100         call    _low_priority_sleep
101         jmp     1b
102 2:      movl    \$4,%eax
103         xadd    %eax,$tls::stackptr(%edx)
104         decl    $tls::stacklock(%edx)
105         leal    __sigbe,%edx
106         xchg    %edx,8(%esp)
107         movl    %edx,(%eax)
108         popl    %edx
109         ret
110
111         .global __sigbe
112         .stabs  "_sigbe:F(0,1)",36,0,0,__sigbe
113 __sigbe:
114         pushl   %edx
115         pushl   %eax
116         movl    %fs:4,%edx
117 1:      movl    \$1,%eax
118         lock    cmpxchg %eax,$tls::stacklock(%edx)
119         jne     2f
120         xorl    %eax,%eax
121         call    _low_priority_sleep
122         jmp     1b
123 2:      movl    \$-4,%eax
124         xadd    %eax,$tls::stackptr(%edx)
125         xchg    %edx,-4(%eax)
126         xchg    %edx,4(%esp)
127         popl    %eax
128         ret
129
130         .global __ZN11_threadinfo3popEv
131 __ZN11_threadinfo3popEv:
132 1:      pushl   %ebx
133         movl    %eax,%edx
134         movl    \$-4,%ebx
135         xadd    %ebx,$tls::pstackptr(%edx)
136         xorl    %eax,%eax
137         xchg    %eax,-4(%ebx)
138         decl    $tls::pstacklock(%edx)
139         popl    %ebx
140         ret
141
142         .global __ZN11_threadinfo4lockEi
143 __ZN11_threadinfo4lockEi:
144         pushl   %ebx
145         movl    %eax,%ebx
146 1:      movl    \$1,%eax
147         lock    cmpxchg %eax,$tls::pstacklock(%ebx)
148         jne     2f
149         cmpl    %edx,%edx
150         jz      2f
151         xorl    %eax,%eax
152         call    _low_priority_sleep
153         jmp     1b
154 2:      xorl    \$1,%eax
155         popl    %ebx
156         ret
157
158         .global __ZN11_threadinfo6unlockEv
159 __ZN11_threadinfo6unlockEv:
160         decl    $tls::pstacklock(%eax)
161         ret
162
163         .global _sigreturn
164         .stabs  "sigreturn:F(0,1)",36,0,0,_sigreturn
165 _sigreturn:
166         addl    \$4,%esp                        # Remove argument
167         call    _set_process_mask\@4
168
169         movl    %fs:4,%ebx
170
171         cmpl    \$0,$tls::sig(%ebx)     # Did a signal come in?
172         jnz     3f                      # Yes, if non-zero
173
174 1:      popl    %edx                    # saved errno
175         testl   %edx,%edx               # Is it < 0
176         jl      2f                      # yup.  ignore it
177         movl    $tls::errno_addr(%ebx),%eax
178         movl    %edx,(%eax)
179 2:      popl    %eax
180         popl    %ebx
181         popl    %ecx
182         popl    %edx
183         popl    %edi
184         popl    %esi
185         popf
186         popl    %ebp
187         jmp     __sigbe
188
189         .global _sigdelayed
190         .stabs  "sigdelayed:F(0,1)",36,0,0,_sigdelayed
191 _sigdelayed:
192         pushl   %ebp
193         movl    %esp,%ebp
194         pushf
195         pushl   %esi
196         pushl   %edi
197         pushl   %edx
198         pushl   %ecx
199         pushl   %ebx
200         pushl   %eax
201         movl    %fs:4,%ebx
202         pushl   $tls::saved_errno(%ebx) # saved errno
203 3:      pushl   $tls::oldmask(%ebx)     # oldmask
204         pushl   $tls::sig(%ebx)         # signal argument
205         pushl   \$_sigreturn
206
207         call    _reset_signal_arrived\@0
208         pushl   $tls::func(%ebx)        # signal func
209         pushl   $tls::newmask(%ebx)     # newmask - eaten by set_process_mask
210
211         call    _set_process_mask\@4
212         cmpl    \$0,$tls::threadkill(%ebx)#pthread_kill signal?
213         jnz     4f                      #yes.  Callee clears signal number
214         movl    \$0,$tls::sig(%ebx)     # zero the signal number as a
215                                         # flag to the signal handler thread
216                                         # that it is ok to set up sigsave
217 4:      popl    %ebx
218         jmp     *%ebx
219
220 EOF
221     }
222     return $res;
223 }
224
225 sub longjmp {
226     return <<EOF;
227
228         .globl  _longjmp
229
230 _longjmp:
231         pushl   %ebp
232         movl    %esp,%ebp
233         movl    8(%ebp),%edi
234         movl    12(%ebp),%eax
235         testl   %eax,%eax
236         jne     0f
237         incl    %eax
238 0:
239         movl    %eax,0(%edi)
240         movl    24(%edi),%ebp
241         pushfl
242         popl    %ebx
243         movw    42(%edi),%ax
244         movw    %ax,%ss
245         movl    28(%edi),%esp
246         pushl   32(%edi)
247         pushl   %ebx
248         movw    36(%edi),%ax
249         movw    %ax,%es
250         movw    40(%edi),%ax
251         movw    %ax,%gs
252         movl    %fs:4,%eax
253         leal    ($tls::stack)(%eax),%edx
254         movl    %edx,($tls::stackptr)(%eax)
255         movl    0(%edi),%eax
256         movl    4(%edi),%ebx
257         movl    8(%edi),%ecx
258         movl    12(%edi),%edx
259         movl    16(%edi),%esi
260         movl    20(%edi),%edi
261         popfl
262         ret
263
264 EOF
265 }