Update copyright notices with scripts/update-copyrights
[glibc.git] / nptl / sysdeps / unix / sysv / linux / sh / pthread_cond_timedwait.S
blob94b99e724bc453f223cbcfcd9f5c06b62efbdd73
1 /* Copyright (C) 2003-2014 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library; if not, see
16    <http://www.gnu.org/licenses/>.  */
18 #include <sysdep.h>
19 #include <shlib-compat.h>
20 #include <lowlevellock.h>
21 #include <lowlevelcond.h>
22 #include <pthread-errnos.h>
23 #include <kernel-features.h>
24 #include <tcb-offsets.h>
25 #include "lowlevel-atomic.h"
27         .text
29 /* int pthread_cond_timedwait (pthread_cond_t *cond, pthread_mutex_t *mutex,
30                                const struct timespec *abstime)  */
31         .globl  __pthread_cond_timedwait
32         .type   __pthread_cond_timedwait, @function
33         .align  5
34         cfi_startproc
35 __pthread_cond_timedwait:
36 .LSTARTCODE:
37 #ifdef SHARED
38         cfi_personality(DW_EH_PE_pcrel | DW_EH_PE_sdata4 | DW_EH_PE_indirect,
39                         DW.ref.__gcc_personality_v0)
40         cfi_lsda(DW_EH_PE_pcrel | DW_EH_PE_sdata4, .LexceptSTART)
41 #else
42         cfi_personality(DW_EH_PE_absptr, __gcc_personality_v0)
43         cfi_lsda(DW_EH_PE_absptr, .LexceptSTART)
44 #endif
45         mov.l   r8, @-r15
46         cfi_adjust_cfa_offset (4)
47         cfi_rel_offset (r8, 0)
48         mov.l   r9, @-r15
49         cfi_adjust_cfa_offset (4)
50         cfi_rel_offset (r9, 0)
51         mov.l   r10, @-r15
52         cfi_adjust_cfa_offset (4)
53         cfi_rel_offset (r10, 0)
54         mov.l   r11, @-r15
55         cfi_adjust_cfa_offset (4)
56         cfi_rel_offset (r11, 0)
57         mov.l   r12, @-r15
58         cfi_adjust_cfa_offset (4)
59         cfi_rel_offset (r12, 0)
60         mov.l   r13, @-r15
61         cfi_adjust_cfa_offset (4)
62         cfi_rel_offset (r13, 0)
63         sts.l   pr, @-r15
64         cfi_adjust_cfa_offset (4)
65         cfi_rel_offset (pr, 0)
66         add     #-64, r15
67         cfi_adjust_cfa_offset (64)
69         mov     r4, r8
70         mov     r5, r9
71         mov     r6, r13
72 #ifdef PIC
73         mova    .Lgot0, r0
74         mov.l   .Lgot0, r12
75         add     r0, r12
76 #endif
78         mov.l   @(4,r13), r0
79         mov.l   .L1g, r1
80         cmp/hs  r1, r0
81         bf      0f
82         bra     18f
83          mov    #EINVAL, r0
85         /* Get internal lock.  */
86         mov     #0, r3
87         mov     #1, r4
88 #if cond_lock != 0
89         CMPXCHG (r3, @(cond_lock,r8), r4, r2)
90 #else
91         CMPXCHG (r3, @r8, r4, r2)
92 #endif
93         bt      2f
94         bra     1f
95          nop
96 #ifdef PIC
97         .align  2
98 .Lgot0:
99         .long   _GLOBAL_OFFSET_TABLE_
100 #endif
103         /* Store the reference to the mutex.  If there is already a
104            different value in there this is a bad user bug.  */
105         mov.l   @(dep_mutex,r8),r0
106         cmp/eq  #-1, r0
107         bt      17f
108         mov.l   r9, @(dep_mutex,r8)
111         /* Unlock the mutex.  */
112         mov.l   .Lmunlock1, r1
113         mov     #0, r5
114         bsrf    r1
115          mov    r9, r4
116 .Lmunlock1b:
118         tst     r0, r0
119         bt      0f
120         bra     16f
121          nop
123         mov     #1, r2
124         mov     #0, r3
126         clrt
127         mov.l   @(total_seq,r8),r0
128         mov.l   @(total_seq+4,r8),r1
129         addc    r2, r0
130         addc    r3, r1
131         mov.l   r0,@(total_seq,r8)
132         mov.l   r1,@(total_seq+4,r8)
133         mov.l   @(cond_futex,r8), r0
134         add     r2, r0
135         mov.l   r0, @(cond_futex,r8)
136         mov     #(1 << nwaiters_shift), r2
137         mov.l   @(cond_nwaiters,r8), r0
138         add     r2, r0
139         mov.l   r0, @(cond_nwaiters,r8)
141         /* Get and store current wakeup_seq value.  */
142         mov.l   @(wakeup_seq,r8), r10
143         mov.l   @(wakeup_seq+4,r8), r11
144         mov.l   @(broadcast_seq,r8), r0
145         mov.l   r0, @(4,r15)
148         /* Get current time.  */
149 #ifdef __NR_clock_gettime
150         /* Get the clock number.         */
151         mov.l   @(cond_nwaiters,r8), r4
152         mov     #((1 << nwaiters_shift) - 1), r0
153         and     r0, r4
154         /* Only clocks 0 and 1 are allowed.  Both are handled in the
155            kernel.  */
156         mov     r15, r5
157         add     #16, r5
158         mov.w   .L__NR_clock_gettime, r3
159         trapa   #0x12
160         SYSCALL_INST_PAD
162         /* Compute relative timeout.  */
163         mov.l   @r13, r2
164         mov.l   @(4,r13), r3
165         mov.l   @(16,r15), r0
166         bra     0f
167          mov.l  @(20,r15), r1
168 .L__NR_clock_gettime:
169         .word   __NR_clock_gettime
172 #else
173         mov     r15, r4
174         add     #16, r4
175         mov     #0, r5
176         mov     #__NR_gettimeofday, r3
177         trapa   #0x12
178         SYSCALL_INST_PAD
180         /* Compute relative timeout.  */
181         mov.l   @(20,r15), r0
182         mov.w   .L1k, r1
183         dmulu.l r0, r1          /* Micro seconds to nano seconds.  */
184         mov.l   @r13, r2
185         mov.l   @(4,r13), r3
186         mov.l   @(16,r15), r0
187         sts     macl, r1
188 #endif
189         sub     r0, r2
190         clrt
191         subc    r1, r3
192         bf      12f
193         mov.l   .L1g, r1
194         add     r1, r3
195         add     #-1, r2
197         mov     #-ETIMEDOUT, r1
198         mov.l   r1, @(12,r15)
199         cmp/pz  r2
200         bf      6f              /* Time is already up.  */
202         /* Store relative timeout.  */
203         mov.l   r2, @(16,r15)
204         mov.l   r3, @(20,r15)
205         mov.l   @(cond_futex,r8), r1
206         mov.l   r1, @(8,r15)
208         /* Unlock.  */
209 #if cond_lock != 0
210         DEC (@(cond_lock,r8), r2)
211 #else
212         DEC (@r8, r2)
213 #endif
214         tst     r2, r2
215         bt      4f
216         bra     3f
217          nop
219 .LcleanupSTART:
220         mov.l   .Lenable1, r1
221         bsrf    r1
222          nop
223 .Lenable1b:
224         mov.l   r0, @r15
226         mov     r15, r7
227         add     #16, r7
228         mov.l   @(dep_mutex,r8), r0
229         cmp/eq  #-1, r0
230         bt/s    99f
231          mov    #FUTEX_WAIT, r5
232 #ifdef __ASSUME_PRIVATE_FUTEX
233         mov     #(FUTEX_WAIT|FUTEX_PRIVATE_FLAG), r5
234         extu.b  r5, r5
235 #else
236         stc     gbr, r1
237         mov.w   .Lpfoff, r2
238         add     r2, r1
239         mov.l   @r1, r5
240         mov     #FUTEX_WAIT, r0
241         or      r0, r5
242 #endif
244         mov.l   @(8,r15), r6
245         mov     r8, r4
246         add     #cond_futex, r4
247         mov     #SYS_futex, r3
248         extu.b  r3, r3
249         trapa   #0x14
250         SYSCALL_INST_PAD
251         mov.l   r0, @(12,r15)
253         mov.l   .Ldisable1, r1
254         bsrf    r1
255          mov.l  @r15, r4
256 .Ldisable1b:
257 .LcleanupEND:
259         /* Lock.  */
260         mov     #0, r3
261         mov     #1, r4
262 #if cond_lock != 0
263         CMPXCHG (r3, @(cond_lock,r8), r4, r2)
264 #else
265         CMPXCHG (r3, @r8, r4, r2)
266 #endif
267         bf      5f
269         mov.l   @(broadcast_seq,r8), r0
270         mov.l   @(4,r15), r1
271         cmp/eq  r0, r1
272         bf      23f
274         mov.l   @(woken_seq,r8), r0
275         mov.l   @(woken_seq+4,r8), r1
277         mov.l   @(wakeup_seq,r8), r2
278         mov.l   @(wakeup_seq+4,r8), r3
280         cmp/eq  r3, r11
281         bf      7f
282         cmp/eq  r2, r10
283         bt      15f
285         cmp/eq  r1, r3
286         bf      9f
287         cmp/eq  r0, r2
288         bf      9f
290         mov.l   @(12,r15),r0
291         cmp/eq  #-ETIMEDOUT, r0
292         bf      8b
294         mov     #1, r2
295         mov     #0, r3
297         clrt
298         mov.l   @(wakeup_seq,r8),r0
299         mov.l   @(wakeup_seq+4,r8),r1
300         addc    r2, r0
301         addc    r3, r1
302         mov.l   r0,@(wakeup_seq,r8)
303         mov.l   r1,@(wakeup_seq+4,r8)
304         mov.l   @(cond_futex,r8),r0
305         add     r2, r0
306         mov.l   r0,@(cond_futex,r8)
307         mov     #ETIMEDOUT, r0
308         bra     14f
309          mov.l  r0, @(24,r15)
312         mov     #0, r0
313         bra     24f
314          mov.l  r0, @(24,r15)
317         mov     #0, r0
318         mov.l   r0, @(24,r15)
320         mov     #1, r2
321         mov     #0, r3
323         clrt
324         mov.l   @(woken_seq,r8),r0
325         mov.l   @(woken_seq+4,r8),r1
326         addc    r2, r0
327         addc    r3, r1
328         mov.l   r0,@(woken_seq,r8)
329         mov.l   r1,@(woken_seq+4,r8)
332         mov     #(1 << nwaiters_shift), r2
333         mov.l   @(cond_nwaiters,r8),r0
334         sub     r2, r0
335         mov.l   r0,@(cond_nwaiters,r8)
337         /* Wake up a thread which wants to destroy the condvar object.  */
338         mov.l   @(total_seq,r8),r0
339         mov.l   @(total_seq+4,r8),r1
340         and     r1, r0
341         not     r0, r0
342         cmp/eq  #0, r0
343         bf/s    25f
344          mov    #((1 << nwaiters_shift) - 1), r1
345         not     r1, r1
346         mov.l   @(cond_nwaiters,r8),r0
347         tst     r1, r0
348         bf      25f
350         mov     r8, r4
351         add     #cond_nwaiters, r4
352         mov.l   @(dep_mutex,r8), r0
353         cmp/eq  #-1, r0
354         bt/s    99f
355          mov    #FUTEX_WAKE, r5
356 #ifdef __ASSUME_PRIVATE_FUTEX
357         mov     #(FUTEX_WAKE|FUTEX_PRIVATE_FLAG), r5
358         extu.b  r5, r5
359 #else
360         stc     gbr, r1
361         mov.w   .Lpfoff, r2
362         add     r2, r1
363         mov.l   @r1, r5
364         mov     #FUTEX_WAKE, r0
365         or      r0, r5
366 #endif
368         mov     #1, r6
369         mov     #0, r7
370         mov     #SYS_futex, r3
371         extu.b  r3, r3
372         trapa   #0x14
373         SYSCALL_INST_PAD
376 #if cond_lock != 0
377         DEC (@(cond_lock,r8), r2)
378 #else
379         DEC (@r8, r2)
380 #endif
381         tst     r2, r2
382         bf      10f
385         mov     r9, r4
386         mov.l   .Lmlocki1, r1
387         bsrf    r1
388          nop
389 .Lmlocki1b:
391         /* We return the result of the mutex_lock operation if it failed.  */
392         tst     r0, r0
393         bf      18f
394         mov.l   @(24,r15), r0
397         cfi_remember_state
398         add     #64, r15
399         cfi_adjust_cfa_offset (-64)
400         lds.l   @r15+, pr
401         cfi_adjust_cfa_offset (-4)
402         cfi_restore (pr)
403         mov.l   @r15+, r13
404         cfi_adjust_cfa_offset (-4)
405         cfi_restore (r13)
406         mov.l   @r15+, r12
407         cfi_adjust_cfa_offset (-4)
408         cfi_restore (r12)
409         mov.l   @r15+, r11
410         cfi_adjust_cfa_offset (-4)
411         cfi_restore (r11)
412         mov.l   @r15+, r10
413         cfi_adjust_cfa_offset (-4)
414         cfi_restore (r10)
415         mov.l   @r15+, r9
416         cfi_adjust_cfa_offset (-4)
417         cfi_restore (r9)
418         rts
419          mov.l  @r15+, r8
420         /* Omit CFI for restore in delay slot.  */
421         cfi_restore_state
423 #ifndef __ASSUME_PRIVATE_FUTEX
424 .Lpfoff:
425         .word   PRIVATE_FUTEX - TLS_PRE_TCB_SIZE
426 #endif
427 .L1k:
428         .word   1000
429         .align  2
430 .Lmunlock1:
431         .long   __pthread_mutex_unlock_usercnt-.Lmunlock1b
432 .Lenable1:
433         .long   __pthread_enable_asynccancel-.Lenable1b
434 .Ldisable1:
435         .long   __pthread_disable_asynccancel-.Ldisable1b
436 .Lmlocki1:
437         .long   __pthread_mutex_cond_lock-.Lmlocki1b
438 .L1g:
439         .long   1000000000
442         /* Initial locking failed.  */
443         mov     r8, r5
444 #if cond_lock != 0
445         add     #cond_lock, r5
446 #endif
447         mov.l   @(dep_mutex,r8), r0
448         cmp/eq  #-1, r0
449         bf/s    99f
450          mov    #LLL_PRIVATE, r6
451         mov     #LLL_SHARED, r6
453         extu.b  r6, r6
454         mov.l   .Lwait2, r1
455         bsrf    r1
456          mov    r2, r4
457 .Lwait2b:
458         bra     2b
459          nop
462         /* Unlock in loop requires wakeup.  */
463         mov     r8, r4
464 #if cond_lock != 0
465         add     #cond_lock, r4
466 #endif
467         mov.l   @(dep_mutex,r8), r0
468         cmp/eq  #-1, r0
469         bf/s    99f
470          mov    #LLL_PRIVATE, r5
471         mov     #LLL_SHARED, r5
473         mov.l   .Lmwait2, r1
474         bsrf    r1
475          extu.b r5, r5
476 .Lmwait2b:
477         bra     4b
478          nop
481         /* Locking in loop failed.  */
482         mov     r8, r5
483 #if cond_lock != 0
484         add     #cond_lock, r5
485 #endif
486         mov.l   @(dep_mutex,r8), r0
487         cmp/eq  #-1, r0
488         bf/s    99f
489          mov    #LLL_PRIVATE, r6
490         mov     #LLL_SHARED, r6
492         extu.b  r6, r6
493         mov.l   .Lwait3, r1
494         bsrf    r1
495          mov    r2, r4
496 .Lwait3b:
497         bra     6b
498          nop
501         /* Unlock after loop requires wakeup.  */
502         mov     r8, r4
503 #if cond_lock != 0
504         add     #cond_lock, r4
505 #endif
506         mov.l   @(dep_mutex,r8), r0
507         cmp/eq  #-1, r0
508         bf/s    99f
509          mov    #LLL_PRIVATE, r5
510         mov     #LLL_SHARED, r5
512         mov.l   .Lmwait3, r1
513         bsrf    r1
514          extu.b r5, r5
515 .Lmwait3b:
516         bra     11b
517          nop
520         /* The initial unlocking of the mutex failed.  */
521         mov.l   r0, @(24,r15)
522 #if cond_lock != 0
523         DEC (@(cond_lock,r8), r2)
524 #else
525         DEC (@r8, r2)
526 #endif
527         tst     r2, r2
528         bf      17f
530         mov     r8, r4
531 #if cond_lock != 0
532         add     #cond_lock, r4
533 #endif
534         mov.l   @(dep_mutex,r8), r0
535         cmp/eq  #-1, r0
536         bf/s    99f
537          mov    #LLL_PRIVATE, r5
538         mov     #LLL_SHARED, r5
540         mov.l   .Lmwait4, r1
541         bsrf    r1
542          extu.b r5, r5
543 .Lmwait4b:
545         bra     18b
546          mov.l  @(24,r15), r0
548         .align  2
549 .Lwait2:
550         .long   __lll_lock_wait-.Lwait2b
551 .Lmwait2:
552         .long   __lll_unlock_wake-.Lmwait2b
553 .Lwait3:
554         .long   __lll_lock_wait-.Lwait3b
555 .Lmwait3:
556         .long   __lll_unlock_wake-.Lmwait3b
557 .Lmwait4:
558         .long   __lll_unlock_wake-.Lmwait4b
559         .size   __pthread_cond_timedwait, .-__pthread_cond_timedwait
560 versioned_symbol (libpthread, __pthread_cond_timedwait, pthread_cond_timedwait,
561                   GLIBC_2_3_2)
564         .type   __condvar_tw_cleanup, @function
565 __condvar_tw_cleanup:
566         mov     r4, r11
568         /* Get internal lock.  */
569         mov     #0, r3
570         mov     #1, r4
571 #if cond_lock != 0
572         CMPXCHG (r3, @(cond_lock,r8), r4, r2)
573 #else
574         CMPXCHG (r3, @r8, r4, r2)
575 #endif
576         bt      1f
577          nop
579         mov     r8, r5
580 #if cond_lock != 0
581         add     #cond_lock, r5
582 #endif
583         mov.l   @(dep_mutex,r8), r0
584         cmp/eq  #-1, r0
585         bf/s    99f
586          mov    #LLL_PRIVATE, r6
587         mov     #LLL_SHARED, r6
589         extu.b  r6, r6
590         mov.l   .Lwait5, r1
591         bsrf    r1
592          mov    r2, r4
593 .Lwait5b:
596         mov.l   @(broadcast_seq,r8), r0
597         mov.l   @(4,r15), r1
598         cmp/eq  r0, r1
599         bf      3f
601         mov     #1, r2
602         mov     #0, r3
604         /* We increment the wakeup_seq counter only if it is lower than
605            total_seq.  If this is not the case the thread was woken and
606            then canceled.  In this case we ignore the signal.  */
607         mov.l   @(total_seq+4,r8), r0
608         mov.l   @(wakeup_seq+4,r8), r1
609         cmp/hi  r1, r0
610         bt/s    6f
611          cmp/hi r0, r1
612         bt      7f
613         mov.l   @(total_seq,r8), r0
614         mov.l   @(wakeup_seq,r8), r1
615         cmp/hs  r0, r1
616         bt      7f
619         clrt
620         mov.l   @(wakeup_seq,r8),r0
621         mov.l   @(wakeup_seq+4,r8),r1
622         addc    r2, r0
623         addc    r3, r1
624         mov.l   r0,@(wakeup_seq,r8)
625         mov.l   r1,@(wakeup_seq+4,r8)
626         mov.l   @(cond_futex,r8),r0
627         add     r2, r0
628         mov.l   r0,@(cond_futex,r8)
631         clrt
632         mov.l   @(woken_seq,r8),r0
633         mov.l   @(woken_seq+4,r8),r1
634         addc    r2, r0
635         addc    r3, r1
636         mov.l   r0,@(woken_seq,r8)
637         mov.l   r1,@(woken_seq+4,r8)
640         mov     #(1 << nwaiters_shift), r2
641         mov.l   @(cond_nwaiters,r8),r0
642         sub     r2, r0
643         mov.l   r0,@(cond_nwaiters,r8)
645         /* Wake up a thread which wants to destroy the condvar object.  */
646         mov     #0, r10
647         mov.l   @(total_seq,r8),r0
648         mov.l   @(total_seq+4,r8),r1
649         and     r1, r0
650         not     r0, r0
651         cmp/eq  #0, r0
652         bf/s    4f
653          mov    #((1 << nwaiters_shift) - 1), r1
654         not     r1, r1
655         mov.l   @(cond_nwaiters,r8),r0
656         tst     r1, r0
657         bf      4f
659         mov     r8, r4
660         add     #cond_nwaiters, r4
661         mov     #FUTEX_WAKE, r5
662         mov     #1, r6
663         mov     #0, r7
664         mov     #SYS_futex, r3
665         extu.b  r3, r3
666         trapa   #0x14
667         SYSCALL_INST_PAD
668         mov     #1, r10
671 #if cond_lock != 0
672         DEC (@(cond_lock,r8), r2)
673 #else
674         DEC (@r8, r2)
675 #endif
676         tst     r2, r2
677         bt      2f
679         mov     r8, r4
680 #if cond_lock != 0
681         add     #cond_lock, r4
682 #endif
683         mov.l   @(dep_mutex,r8), r0
684         cmp/eq  #-1, r0
685         bf/s    99f
686          mov    #LLL_PRIVATE, r5
687         mov     #LLL_SHARED, r5
689         mov.l   .Lmwait5, r1
690         bsrf    r1
691          extu.b r5, r5
692 .Lmwait5b:
695         /* Wake up all waiters to make sure no signal gets lost.  */
696         tst     r10, r10
697         bf/s    5f
698          mov    r8, r4
699         add     #cond_futex, r4
700         mov     #FUTEX_WAKE, r5
701         mov     #-1, r6
702         shlr    r6              /* r6 = 0x7fffffff */
703         mov     #0, r7
704         mov     #SYS_futex, r3
705         extu.b  r3, r3
706         trapa   #0x14
707         SYSCALL_INST_PAD
710         mov.l   .Lmlocki5, r1
711         bsrf    r1
712          mov     r9, r4
713 .Lmlocki5b:
715 .LcallUR:
716         mov.l   .Lresume, r1
717 #ifdef PIC
718         add     r12, r1
719 #endif
720         jsr     @r1
721          mov    r11, r4
722         sleep
724         .align  2
725 .Lwait5:
726         .long   __lll_lock_wait-.Lwait5b
727 .Lmwait5:
728         .long   __lll_unlock_wake-.Lmwait5b
729 .Lmlocki5:
730         .long   __pthread_mutex_cond_lock-.Lmlocki5b
731 .Lresume:
732 #ifdef PIC
733         .long   _Unwind_Resume@GOTOFF
734 #else
735         .long   _Unwind_Resume
736 #endif
737 .LENDCODE:
738         cfi_endproc
739         .size   __condvar_tw_cleanup, .-__condvar_tw_cleanup
742         .section .gcc_except_table,"a",@progbits
743 .LexceptSTART:
744         .byte   DW_EH_PE_omit                   ! @LPStart format (omit)
745         .byte   DW_EH_PE_omit                   ! @TType format (omit)
746         .byte   DW_EH_PE_sdata4                 ! call-site format
747         .uleb128 .Lcstend-.Lcstbegin
748 .Lcstbegin:
749         .ualong .LcleanupSTART-.LSTARTCODE
750         .ualong .LcleanupEND-.LcleanupSTART
751         .ualong __condvar_tw_cleanup-.LSTARTCODE
752         .uleb128  0
753         .ualong .LcallUR-.LSTARTCODE
754         .ualong .LENDCODE-.LcallUR
755         .ualong 0
756         .uleb128  0
757 .Lcstend:
760 #ifdef SHARED
761         .hidden DW.ref.__gcc_personality_v0
762         .weak   DW.ref.__gcc_personality_v0
763         .section .gnu.linkonce.d.DW.ref.__gcc_personality_v0,"aw",@progbits
764         .align 4
765         .type   DW.ref.__gcc_personality_v0, @object
766         .size   DW.ref.__gcc_personality_v0, 4
767 DW.ref.__gcc_personality_v0:
768         .long   __gcc_personality_v0
769 #endif