aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2004-03-20 06:16:26 +0000
committerUlrich Drepper <drepper@redhat.com>2004-03-20 06:16:26 +0000
commit07bd2a3fda47e7cfa83e808eb99a0da9d1184a30 (patch)
treea0e41495d990b736c8981a58677bc28175621728
parent3abb1ff7d1c7a2941df3c6234ec71b40a3879baa (diff)
downloadglibc-07bd2a3fda47e7cfa83e808eb99a0da9d1184a30.tar.xz
glibc-07bd2a3fda47e7cfa83e808eb99a0da9d1184a30.zip
Update.
2004-03-17 Kaz Kojima <kkojima@rr.iij4u.or.jp> * sysdeps/unix/sysv/linux/kernel-features.h (__ASSUME_CLONE_THREAD_FLAGS ): Define for newer SH kernel. (__ASSUME_TGKILL, __ASSUME_UTIMES): Likewise. * sysdeps/unix/sysv/linux/sh/socket.S: Add unwind information.
-rw-r--r--ChangeLog7
-rw-r--r--nptl/ChangeLog21
-rw-r--r--nptl/sysdeps/unix/sysv/linux/sh/lowlevel-atomic.h13
-rw-r--r--nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S17
-rw-r--r--nptl/sysdeps/unix/sysv/linux/sh/pthread_barrier_wait.S42
-rw-r--r--nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S35
-rw-r--r--nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_signal.S4
-rw-r--r--nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S417
-rw-r--r--nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S464
-rw-r--r--nptl/sysdeps/unix/sysv/linux/sh/pthread_once.S103
-rw-r--r--nptl/sysdeps/unix/sysv/linux/sh/sem_wait.S35
-rw-r--r--nptl/sysdeps/unix/sysv/linux/sh/sysdep-cancel.h102
-rw-r--r--sysdeps/unix/sysv/linux/kernel-features.h8
-rw-r--r--sysdeps/unix/sysv/linux/sh/socket.S73
14 files changed, 1023 insertions, 318 deletions
diff --git a/ChangeLog b/ChangeLog
index fdbb56e3ea..7d3376471f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2004-03-17 Kaz Kojima <kkojima@rr.iij4u.or.jp>
+
+ * sysdeps/unix/sysv/linux/kernel-features.h
+ (__ASSUME_CLONE_THREAD_FLAGS ): Define for newer SH kernel.
+ (__ASSUME_TGKILL, __ASSUME_UTIMES): Likewise.
+ * sysdeps/unix/sysv/linux/sh/socket.S: Add unwind information.
+
2004-03-19 Ulrich Drepper <drepper@redhat.com>
* time/tzfile.c (__tzfile_default): Correct setting of rule_stdoff
diff --git a/nptl/ChangeLog b/nptl/ChangeLog
index 164a9b38ae..e0d09d5a1e 100644
--- a/nptl/ChangeLog
+++ b/nptl/ChangeLog
@@ -4,6 +4,27 @@
the return value to a safe register.
(CDISABLE): Set the function argument correctly.
+2004-03-17 Kaz Kojima <kkojima@rr.iij4u.or.jp>
+
+ * sysdeps/unix/sysv/linux/sh/lowlevel-atomic.h (XCHG): Define.
+ * sysdeps/unix/sysv/linux/sh/lowlevellock.S (__lll_mutex_lock_wait):
+ Rewrite so that only one locked memory operation per round is needed.
+ * sysdeps/unix/sysv/linux/sh/pthread_barrier_wait.S
+ (pthread_barrier_wait): After wakeup, release lock only when the
+ last thread stopped using the barrier object.
+ * sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S
+ (__pthread_cond_wait): Don't store mutex address if the current
+ value is ~0l. Add correct cleanup support and unwind info.
+ * sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S: Likewise.
+ * sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S
+ (__pthread_cond_broadcast): Don't use requeue for pshared condvars.
+ * sysdeps/unix/sysv/linux/sh/pthread_cond_signal.S: Update comment.
+ * sysdeps/unix/sysv/linux/sh/pthread_once.S (__pthread_once):
+ Add correct cleanup support and unwind info.
+ * sysdeps/unix/sysv/linux/sh/sem_wait.S (__new_sem_wait): Likewise.
+ * sysdeps/unix/sysv/linux/sh/sysdep-cancel.h: Add unwind
+ information for syscall wrappers.
+
2004-03-18 Ulrich Drepper <drepper@redhat.com>
* sysdeps/unix/sysv/linux/internaltypes.h (struct pthread_attr): Add
diff --git a/nptl/sysdeps/unix/sysv/linux/sh/lowlevel-atomic.h b/nptl/sysdeps/unix/sysv/linux/sh/lowlevel-atomic.h
index 3a80ec8e14..76d22c88f9 100644
--- a/nptl/sysdeps/unix/sysv/linux/sh/lowlevel-atomic.h
+++ b/nptl/sysdeps/unix/sysv/linux/sh/lowlevel-atomic.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2003 Free Software Foundation, Inc.
+/* Copyright (C) 2003, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -20,6 +20,7 @@
#define _IMP1 #1
#define _IMM1 #-1
+#define _IMM4 #-4
#define _IMM6 #-6
#define _IMM8 #-8
@@ -53,6 +54,16 @@
mov.l reg, mem; \
99: mov r1, r15
+#define XCHG(reg, mem, old) \
+ .align 2; \
+ mova 99f, r0; \
+ nop; \
+ mov r15, r1; \
+ mov _IMM4, r15; \
+98: mov.l mem, old; \
+ mov.l reg, mem; \
+99: mov r1, r15
+
#define CMPXCHG(reg, mem, new, old) \
.align 2; \
mova 99f, r0; \
diff --git a/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S b/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S
index 936a4e3868..320fe18fe8 100644
--- a/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S
+++ b/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 2003 Free Software Foundation, Inc.
+/* Copyright (C) 2003, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -38,17 +38,12 @@ __lll_mutex_lock_wait:
mov r5, r8
mov #0, r7 /* No timeout. */
mov #FUTEX_WAIT, r5
-1:
+
mov #2, r4
cmp/eq r4, r6
- bt 3f
-
- mov #1, r3
- CMPXCHG (r3, @r8, r4, r2)
- tst r2, r2
- bt 2f
+ bf 2f
-3:
+1:
mov r8, r4
mov #SYS_futex, r3
extu.b r3, r3
@@ -56,9 +51,9 @@ __lll_mutex_lock_wait:
SYSCALL_INST_PAD
2:
- mov #0, r3
mov #2, r4
- CMPXCHG (r3, @r8, r4, r2)
+ XCHG (r4, @r8, r2)
+ tst r2, r2
bf 1b
mov.l @r15+, r8
diff --git a/nptl/sysdeps/unix/sysv/linux/sh/pthread_barrier_wait.S b/nptl/sysdeps/unix/sysv/linux/sh/pthread_barrier_wait.S
index 6696898c18..1fbb23a5a6 100644
--- a/nptl/sysdeps/unix/sysv/linux/sh/pthread_barrier_wait.S
+++ b/nptl/sysdeps/unix/sysv/linux/sh/pthread_barrier_wait.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 2003 Free Software Foundation, Inc.
+/* Copyright (C) 2003, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -80,6 +80,23 @@ pthread_barrier_wait:
cmp/eq r0, r6
bt 8b
+ /* Increment LEFT. If this brings the count back to the
+ initial count unlock the object. */
+ mov #1, r3
+ mov.l @(INIT_COUNT,r8), r4
+ XADD (r3, @(LEFT,r8), r2)
+ add #-1, r4
+ cmp/eq r2, r4
+ bf 10f
+
+ /* Release the mutex. We cannot release the lock before
+ waking the waiting threads since otherwise a new thread might
+ arrive and gets waken up, too. */
+ DEC (@(MUTEX,r8), r2)
+ tst r2, r2
+ bf 9f
+
+10:
mov #0, r0 /* != PTHREAD_BARRIER_SERIAL_THREAD */
lds.l @r15+, pr
mov.l @r15+, r8
@@ -88,8 +105,6 @@ pthread_barrier_wait:
3:
/* The necessary number of threads arrived. */
- mov.l @(INIT_COUNT,r8), r0
- mov.l r0, @(LEFT,r8)
mov.l @(CURR_EVENT,r8), r1
add #1, r1
mov.l r1, @(CURR_EVENT,r8)
@@ -108,6 +123,15 @@ pthread_barrier_wait:
trapa #0x14
SYSCALL_INST_PAD
+ /* Increment LEFT. If this brings the count back to the
+ initial count unlock the object. */
+ mov #1, r3
+ mov.l @(INIT_COUNT,r8), r4
+ XADD (r3, @(LEFT,r8), r2)
+ add #-1, r4
+ cmp/eq r2, r4
+ bf 5f
+
/* Release the mutex. */
DEC (@(MUTEX,r8), r2)
tst r2, r2
@@ -148,6 +172,16 @@ pthread_barrier_wait:
bra 7b
mov r9, r6
+9:
+ mov r6, r9
+ mov r8, r4
+ mov.l .Lwake2, r1
+ bsrf r1
+ add #MUTEX, r4
+.Lwake2b:
+ bra 10b
+ mov r9, r6
+
.align 2
.Lall:
.long 0x7fffffff
@@ -157,4 +191,6 @@ pthread_barrier_wait:
.long __lll_mutex_unlock_wake-.Lwake0b
.Lwake1:
.long __lll_mutex_unlock_wake-.Lwake1b
+.Lwake2:
+ .long __lll_mutex_unlock_wake-.Lwake2b
.size pthread_barrier_wait,.-pthread_barrier_wait
diff --git a/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S b/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S
index 5bcaec09c0..a433ba3c37 100644
--- a/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S
+++ b/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 2003 Free Software Foundation, Inc.
+/* Copyright (C) 2003, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -79,11 +79,16 @@ __pthread_cond_broadcast:
#endif
tst r2, r2
bf 7f
+
8:
- /* Wake up all threads. */
+ /* Don't use requeue for pshared condvars. */
+ mov #-1, r0
+ cmp/eq r0, r9
mov r8, r4
- add #wakeup_seq, r4
-#ifdef __ASSUME_FUTEX_REQUEUE
+ bt/s 9f
+ add #wakeup_seq, r4
+
+ /* Wake up all threads. */
mov #FUTEX_REQUEUE, r5
mov #1, r6
mov #-1, r7
@@ -95,17 +100,9 @@ __pthread_cond_broadcast:
mov #SYS_futex, r3
extu.b r3, r3
trapa #0x15
-#else
- mov #FUTEX_WAKE, r5
- mov #-1, r6
- shlr r6 /* r6 = 0x7fffffff */
- mov #0, r7
- mov #SYS_futex, r3
- extu.b r3, r3
- trapa #0x14
-#endif
SYSCALL_INST_PAD
+10:
mov #0, r0
lds.l @r15+, pr
mov.l @r15+, r8
@@ -167,6 +164,18 @@ __pthread_cond_broadcast:
bra 8b
nop
+9:
+ mov #FUTEX_WAKE, r5
+ mov #-1, r6
+ shlr r6 /* r6 = 0x7fffffff */
+ mov #0, r7
+ mov #SYS_futex, r3
+ extu.b r3, r3
+ trapa #0x14
+ SYSCALL_INST_PAD
+ bra 10b
+ nop
+
.align 2
.Lmwait5:
.long __lll_mutex_lock_wait-.Lmwait5b
diff --git a/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_signal.S b/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_signal.S
index 1a3a3485da..a0d188abb2 100644
--- a/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_signal.S
+++ b/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_signal.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 2003 Free Software Foundation, Inc.
+/* Copyright (C) 2003, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -73,7 +73,7 @@ __pthread_cond_signal:
mov.l r0,@(wakeup_seq,r8)
mov.l r1,@(wakeup_seq+4,r8)
- /* Wake up one thread by moving it to the internal lock futex. */
+ /* Wake up one thread. */
mov r8, r4
add #wakeup_seq, r4
mov #FUTEX_WAKE, r5
diff --git a/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S b/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S
index 278f695b6e..661caa3fb5 100644
--- a/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S
+++ b/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 2003 Free Software Foundation, Inc.
+/* Copyright (C) 2003, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -36,17 +36,31 @@
.type __pthread_cond_timedwait, @function
.align 5
__pthread_cond_timedwait:
+.LSTARTCODE:
mov.l r8, @-r15
+.Lpush_r8:
mov.l r9, @-r15
+.Lpush_r9:
mov.l r10, @-r15
+.Lpush_r10:
mov.l r11, @-r15
+.Lpush_r11:
mov.l r12, @-r15
+.Lpush_r12:
mov.l r13, @-r15
+.Lpush_r13:
sts.l pr, @-r15
+.Lpush_pr:
add #-64, r15
+.Lalloc:
mov r4, r8
mov r5, r9
mov r6, r13
+#ifdef PIC
+ mova .Lgot0, r0
+ mov.l .Lgot0, r12
+ add r0, r12
+#endif
/* Get internal lock. */
mov #0, r3
@@ -59,11 +73,21 @@ __pthread_cond_timedwait:
bt 2f
bra 1f
nop
+#ifdef PIC
+ .align 2
+.Lgot0:
+ .long _GLOBAL_OFFSET_TABLE_
+#endif
+
2:
/* Store the reference to the mutex. If there is already a
different value in there this is a bad user bug. */
+ mov.l @(dep_mutex,r8),r0
+ cmp/eq #-1, r0
+ bt 17f
mov.l r9, @(dep_mutex,r8)
-
+
+17:
/* Unlock the mutex. */
mov.l .Lmunlock1, r1
mov #0, r5
@@ -87,50 +111,11 @@ __pthread_cond_timedwait:
mov.l r0,@(total_seq,r8)
mov.l r1,@(total_seq+4,r8)
- /* Install cancellation handler. */
-#ifdef PIC
- mova .Lgot1, r0
- mov.l .Lgot1, r12
- add r0, r12
- mov.l .Lccleanup1, r5
- add r12, r5
-#else
- mov.l .Lccleanup1, r5
-#endif
- mov r15, r4
- add #32, r4
-
- /* Prepare structure passed to cancellation handler. */
- mov.l r8, @(4,r15)
- mov.l r9, @(8,r15)
-
- mov.l .Lccpush1, r1
- bsrf r1
- mov r15, r6
-.Lccpush1b:
-
/* Get and store current wakeup_seq value. */
mov.l @(wakeup_seq,r8), r10
mov.l @(wakeup_seq+4,r8), r11
- /* Unlock. */
-8:
-#if cond_lock != 0
- DEC (@(cond_lock,r8), r2)
-#else
- DEC (@r8, r2)
-#endif
- tst r2, r2
- bt 4f
- bra 3f
- nop
-4:
- mov.l .Lenable1, r1
- bsrf r1
- nop
-.Lenable1b:
- mov.l r0, @r15
-
+8:
/* Get current time. */
mov r15, r4
add #16, r4
@@ -162,6 +147,24 @@ __pthread_cond_timedwait:
mov.l r2, @(16,r15)
mov.l r3, @(20,r15)
+ /* Unlock. */
+#if cond_lock != 0
+ DEC (@(cond_lock,r8), r2)
+#else
+ DEC (@r8, r2)
+#endif
+ tst r2, r2
+ bt 4f
+ bra 3f
+ nop
+4:
+.LcleanupSTART:
+ mov.l .Lenable1, r1
+ bsrf r1
+ nop
+.Lenable1b:
+ mov.l r0, @r15
+
mov r15, r7
add #16, r7
mov #FUTEX_WAIT, r5
@@ -178,6 +181,7 @@ __pthread_cond_timedwait:
bsrf r1
mov.l @r15, r4
.Ldisable1b:
+.LcleanupEND:
/* Lock. */
mov #0, r3
@@ -195,20 +199,15 @@ __pthread_cond_timedwait:
mov.l @(wakeup_seq,r8), r2
mov.l @(wakeup_seq+4,r8), r3
- cmp/hi r11, r3
- bt 7f
- cmp/hi r3, r11
- bt 15f
-
- cmp/hs r2, r10
+ cmp/eq r3, r11
+ bf 7f
+ cmp/eq r2, r10
bt 15f
7:
- cmp/hi r1, r3
- bt 9f
- cmp/hi r3, r1
- bt 15f
- cmp/hi r0, r2
- bt 9f
+ cmp/eq r1, r3
+ bf 9f
+ cmp/eq r0, r2
+ bf 9f
15:
mov.l @(12,r15),r0
cmp/eq #-ETIMEDOUT, r0
@@ -252,14 +251,6 @@ __pthread_cond_timedwait:
bf 10f
11:
- /* Remove cancellation handler. */
- mov r15, r4
- add #32, r4
- mov.l .Lcpop1, r1
- bsrf r1
- mov #0, r5
-.Lcpop1b:
-
mov r9, r4
mov.l .Lmlocki1, r1
bsrf r1
@@ -273,44 +264,39 @@ __pthread_cond_timedwait:
18:
add #64, r15
+.Lfree:
lds.l @r15+, pr
+.Lpop_pr:
mov.l @r15+, r13
+.Lpop_r13:
mov.l @r15+, r12
+.Lpop_r12:
mov.l @r15+, r11
+.Lpop_r11:
mov.l @r15+, r10
+.Lpop_r10:
mov.l @r15+, r9
+.Lpop_r9:
rts
mov.l @r15+, r8
- ret
+.Lpop_r8:
.L1k:
.word 1000
.align 2
.Lmunlock1:
.long __pthread_mutex_unlock_usercnt-.Lmunlock1b
-#ifdef PIC
-.Lgot1:
- .long _GLOBAL_OFFSET_TABLE_
-.Lccleanup1:
- .long __condvar_cleanup@GOTOFF
-#else
-.Lccleanup1:
- .long __condvar_cleanup
-#endif
-.Lccpush1:
- .long __pthread_cleanup_push-.Lccpush1b
.Lenable1:
.long __pthread_enable_asynccancel-.Lenable1b
.Ldisable1:
.long __pthread_disable_asynccancel-.Ldisable1b
-.Lcpop1:
- .long __pthread_cleanup_pop-.Lcpop1b
.Lmlocki1:
.long __pthread_mutex_cond_lock-.Lmlocki1b
.L1g:
.long 1000000000
1:
+.LSblSTART:
/* Initial locking failed. */
mov r8, r5
#if cond_lock != 0
@@ -384,6 +370,7 @@ __pthread_cond_timedwait:
17:
bra 18b
mov.l @(24,r15), r0
+.LSblEND:
.align 2
.Lmwait2:
@@ -399,3 +386,281 @@ __pthread_cond_timedwait:
.size __pthread_cond_timedwait, .-__pthread_cond_timedwait
versioned_symbol (libpthread, __pthread_cond_timedwait, pthread_cond_timedwait,
GLIBC_2_3_2)
+
+
+ .type __condvar_tw_cleanup, @function
+__condvar_tw_cleanup:
+ mov r4, r11
+
+ /* Get internal lock. */
+ mov #0, r3
+ mov #1, r4
+#if cond_lock != 0
+ CMPXCHG (r3, @(cond_lock,r8), r4, r2)
+#else
+ CMPXCHG (r3, @r8, r4, r2)
+#endif
+ bt 1f
+ nop
+
+ mov r8, r5
+#if cond_lock != 0
+ add #cond_lock, r5
+#endif
+ mov.l .Lmwait5, r1
+ bsrf r1
+ mov r2, r4
+.Lmwait5b:
+
+1:
+ mov #1, r2
+ mov #0, r3
+
+ clrt
+ mov.l @(wakeup_seq,r8),r0
+ mov.l @(wakeup_seq+4,r8),r1
+ addc r2, r0
+ addc r3, r1
+ mov.l r0,@(wakeup_seq,r8)
+ mov.l r1,@(wakeup_seq+4,r8)
+
+#if cond_lock != 0
+ DEC (@(cond_lock,r8), r2)
+#else
+ DEC (@r8, r2)
+#endif
+ tst r2, r2
+ bt 2f
+
+ mov r8, r4
+#if cond_lock != 0
+ add #cond_lock, r4
+#endif
+ mov.l .Lmwake5, r1
+ bsrf r1
+ nop
+.Lmwake5b:
+
+2:
+ /* Wake up all waiters to make sure no signal gets lost. */
+ mov r8, r4
+ add #wakeup_seq, r4
+ mov #FUTEX_WAKE, r5
+ mov #-1, r6
+ shlr r6 /* r6 = 0x7fffffff */
+ mov #0, r7
+ mov #SYS_futex, r3
+ extu.b r3, r3
+ trapa #0x14
+ SYSCALL_INST_PAD
+
+ mov.l .Lmlocki5, r1
+ bsrf r1
+ mov r9, r4
+.Lmlocki5b:
+
+.LcallUR:
+ mov.l .Lresume, r1
+#ifdef PIC
+ add r12, r1
+#endif
+ jsr @r1
+ mov r11, r4
+ sleep
+
+ .align 2
+.Lmwait5:
+ .long __lll_mutex_lock_wait-.Lmwait5b
+.Lmwake5:
+ .long __lll_mutex_unlock_wake-.Lmwake5b
+.Lmlocki5:
+ .long __pthread_mutex_cond_lock-.Lmlocki5b
+.Lresume:
+#ifdef PIC
+ .long _Unwind_Resume@GOTOFF
+#else
+ .long _Unwind_Resume
+#endif
+.LENDCODE:
+ .size __condvar_tw_cleanup, .-__condvar_tw_cleanup
+
+
+ .section .gcc_except_table,"a",@progbits
+.LexceptSTART:
+ .byte 0xff ! @LPStart format (omit)
+ .byte 0xff ! @TType format (omit)
+ .byte 0x0b ! call-site format
+ ! DW_EH_PE_sdata4
+ .uleb128 .Lcstend-.Lcstbegin
+.Lcstbegin:
+ .ualong .LcleanupSTART-.LSTARTCODE
+ .ualong .LcleanupEND-.LcleanupSTART
+ .ualong __condvar_tw_cleanup-.LSTARTCODE
+ .uleb128 0
+ .ualong .LcallUR-.LSTARTCODE
+ .ualong .LENDCODE-.LcallUR
+ .ualong 0
+ .uleb128 0
+.Lcstend:
+
+ .section .eh_frame,"a",@progbits
+.LSTARTFRAME:
+ .ualong .LENDCIE-.LSTARTCIE ! Length of the CIE.
+.LSTARTCIE:
+ .ualong 0 ! CIE ID.
+ .byte 1 ! Version number.
+#ifdef SHARED
+ .string "zPLR" ! NUL-terminated augmentation
+ ! string.
+#else
+ .string "zPL" ! NUL-terminated augmentation
+ ! string.
+#endif
+ .uleb128 1 ! Code alignment factor.
+ .sleb128 -4 ! Data alignment factor.
+ .byte 0x11 ! Return address register
+ ! column.
+#ifdef SHARED
+ .uleb128 7 ! Augmentation value length.
+ .byte 0x9b ! Personality: DW_EH_PE_pcrel
+ ! + DW_EH_PE_sdata4
+ ! + DW_EH_PE_indirect
+ .ualong DW.ref.__gcc_personality_v0-.
+ .byte 0x1b ! LSDA Encoding: DW_EH_PE_pcrel
+ ! + DW_EH_PE_sdata4.
+ .byte 0x1b ! FDE Encoding: DW_EH_PE_pcrel
+ ! + DW_EH_PE_sdata4.
+#else
+ .uleb128 6 ! Augmentation value length.
+ .byte 0x0 ! Personality: absolute
+ .ualong __gcc_personality_v0
+ .byte 0x0 ! LSDA Encoding: absolute
+#endif
+ .byte 0x0c ! DW_CFA_def_cfa
+ .uleb128 0xf
+ .uleb128 0
+ .align 2
+.LENDCIE:
+
+ .ualong .LENDFDE-.LSTARTFDE ! Length of the FDE.