summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S137
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S115
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h44
-rw-r--r--nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S102
-rw-r--r--nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S72
-rw-r--r--string/strxfrm.c9
7 files changed, 271 insertions, 213 deletions
diff --git a/ChangeLog b/ChangeLog
index d45faaca8c..0c22f0f124 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2003-04-14  Ulrich Drepper  <drepper@redhat.com>
+
+	* string/strxfrm.c (STRXFRM): Terminate rulearr at correct
+	position.  Reported by jreiser@BitWagon.com.
+
 2003-04-13  Ulrich Drepper  <drepper@redhat.com>
 
 	* sysdeps/generic/unwind-dw2-fde.c: Update from recent gcc version.
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S
index cd80099406..9e7fff7e6a 100644
--- a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S
+++ b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S
@@ -345,103 +345,112 @@ versioned_symbol (libpthread, __pthread_cond_timedwait, pthread_cond_timedwait,
 
 	.section .eh_frame,"a",@progbits
 .LSTARTFRAME:
-	.long	L(ENDCIE)-L(STARTCIE)	# Length of the CIE.
+	.long	L(ENDCIE)-L(STARTCIE)		# Length of the CIE.
 .LSTARTCIE:
-	.long	0			# CIE ID.
-	.byte	1			# Version number.
+	.long	0				# CIE ID.
+	.byte	1				# Version number.
 #ifdef SHARED
-	.string	"zR"			# NUL-terminated augmentation string.
+	.string	"zR"				# NUL-terminated augmentation
+						# string.
 #else
-	.ascii	"\0"			# NUL-terminated augmentation string.
+	.ascii	"\0"				# NUL-terminated augmentation
+						# string.
 #endif
-	.uleb128 1			# Code alignment factor.
-	.sleb128 -4			# Data alignment factor.
-	.byte	8			# Return address register column.
+	.uleb128 1				# Code alignment factor.
+	.sleb128 -4				# Data alignment factor.
+	.byte	8				# Return address register
+						# column.
 #ifdef SHARED
-	.uleb128 1			# Augmentation value length.
-	.byte	0x1b			# Encoding: DW_EH_PE_pcrel
-					# + DW_EH_PE_sdata4.
+	.uleb128 1				# Augmentation value length.
+	.byte	0x1b				# Encoding: DW_EH_PE_pcrel
+						# + DW_EH_PE_sdata4.
 #endif
-	.byte 0x0c			# DW_CFA_def_cfa
+	.byte 0x0c				# DW_CFA_def_cfa
 	.uleb128 4
 	.uleb128 4
-	.byte	0x88			# DW_CFA_offset, column 0x8
+	.byte	0x88				# DW_CFA_offset, column 0x8
 	.uleb128 1
 	.align 4
 .LENDCIE:
 
-	.long	.LENDFDE-.LSTARTFDE	# Length of the FDE.
+	.long	.LENDFDE-.LSTARTFDE		# Length of the FDE.
 .LSTARTFDE:
-	.long	.LSTARTFDE-.LSTARTFRAME	# CIE pointer.
+	.long	.LSTARTFDE-.LSTARTFRAME		# CIE pointer.
 #ifdef SHARED
-	.long	.LSTARTCODE-.		# PC-relative start address of the code
+	.long	.LSTARTCODE-.			# PC-relative start address
+						# of the code
 #else
-	.long	.LSTARTCODE		# Start address of the code.
+	.long	.LSTARTCODE			# Start address of the code.
 #endif
-	.long	.LENDCODE-.LSTARTCODE	# Length of the code.
+	.long	.LENDCODE-.LSTARTCODE		# Length of the code.
 #ifdef SHARED
-	.uleb128 0			# No augmentation data.
+	.uleb128 0				# No augmentation data.
 #endif
-	.byte	4			# DW_CFA_advance_loc4
-	.long	.Lpush_ebp-.LSTARTCODE
-	.byte	14			# DW_CFA_def_cfa_offset
+	.byte	0x40+.Lpush_ebp-.LSTARTCODE	# DW_CFA_advance_loc+N
+	.byte	14				# DW_CFA_def_cfa_offset
 	.uleb128 8
-	.byte	4			# DW_CFA_advance_loc4
-	.long	.Lpush_edi-.Lpush_ebp
-	.byte	14			# DW_CFA_def_cfa_offset
+	.byte	0x85				# DW_CFA_offset %ebp
+	.uleb128 2
+	.byte	0x40+ .Lpush_edi-.Lpush_ebp	# DW_CFA_advance_loc+N
+	.byte	14				# DW_CFA_def_cfa_offset
 	.uleb128 12
-	.byte	4			# DW_CFA_advance_loc4
-	.long	.Lpush_esi-.Lpush_edi
-	.byte	14			# DW_CFA_def_cfa_offset
+	.byte	0x87				# DW_CFA_offset %edi
+	.uleb128 3
+	.byte	0x40+.Lpush_esi-.Lpush_edi	# DW_CFA_advance_loc+N
+	.byte	14				# DW_CFA_def_cfa_offset
 	.uleb128 16
-	.byte	4			# DW_CFA_advance_loc4
-	.long	.Lpush_ebx-.Lpush_esi
-	.byte	14			# DW_CFA_def_cfa_offset
+	.byte	0x86				# DW_CFA_offset %esi
+	.uleb128 4
+	.byte	0x40+.Lpush_ebx-.Lpush_esi	# DW_CFA_advance_loc+N
+	.byte	14				# DW_CFA_def_cfa_offset
 	.uleb128 20
-	.byte	4			# DW_CFA_advance_loc4
-	.long	.Lpush4-.Lpush_ebx
-	.byte	14			# DW_CFA_def_cfa_offset
+	.byte	0x83				# DW_CFA_offset %ebx
+	.uleb128 5
+	.byte	0x40+.Lpush4-.Lpush_ebx		# DW_CFA_advance_loc+N
+	.byte	14				# DW_CFA_def_cfa_offset
 	.uleb128 24
-	.byte	4			# DW_CFA_advance_loc4
-	.long	.Lsubl-.Lpush4
-	.byte	14			# DW_CFA_def_cfa_offset
+	.byte	0x40+.Lsubl-.Lpush4		# DW_CFA_advance_loc+N
+	.byte	14				# DW_CFA_def_cfa_offset
 	.uleb128 64
-	.byte	4			# DW_CFA_advance_loc4
-	.long	.Laddl-.Lsubl
-	.byte	14			# DW_CFA_def_cfa_offset
+	.byte	0x40+.Laddl-.Lsubl		# DW_CFA_advance_loc+N
+	.byte	14				# DW_CFA_def_cfa_offset
 	.uleb128 20
-	.byte	4			# DW_CFA_advance_loc4
-	.long	.Lpop_ebx-.Laddl
-	.byte	14			# DW_CFA_def_cfa_offset
+	.byte	0x40+.Lpop_ebx-.Laddl		# DW_CFA_advance_loc+N
+	.byte	14				# DW_CFA_def_cfa_offset
 	.uleb128 16
-	.byte	4			# DW_CFA_advance_loc4
-	.long	.Lpop_esi-.Lpop_ebx
-	.byte	14			# DW_CFA_def_cfa_offset
+	.byte	0xc3				# DW_CFA_restore %ebx
+	.byte	0x40+.Lpop_esi-.Lpop_ebx	# DW_CFA_advance_loc+N
+	.byte	14				# DW_CFA_def_cfa_offset
 	.uleb128 12
-	.byte	4			# DW_CFA_advance_loc4
-	.long	.Lpop_edi-.Lpop_esi
-	.byte	14			# DW_CFA_def_cfa_offset
+	.byte	0xc6				# DW_CFA_restore %esi
+	.byte	0x40+.Lpop_edi-.Lpop_esi	# DW_CFA_advance_loc+N
+	.byte	14				# DW_CFA_def_cfa_offset
 	.uleb128 8
-	.byte	4			# DW_CFA_advance_loc4
-	.long	.Lpop_ebp-.Lpop_edi
-	.byte	14			# DW_CFA_def_cfa_offset
+	.byte	0xc7				# DW_CFA_restore %edi
+	.byte	0x40+.Lpop_ebp-.Lpop_edi	# DW_CFA_advance_loc+N
+	.byte	14				# DW_CFA_def_cfa_offset
 	.uleb128 4
-	.byte	4			# DW_CFA_advance_loc4
-	.long	.LSbl1-.Lpop_edi
-	.byte	14			# DW_CFA_def_cfa_offset
+	.byte	0xc5				# DW_CFA_restore %ebp
+	.byte	0x40+.LSbl1-.Lpop_edi		# DW_CFA_advance_loc+N
+	.byte	14				# DW_CFA_def_cfa_offset
 	.uleb128 20
-	.byte	4			# DW_CFA_advance_loc4
-	.long	.LSbl2-.LSbl1
-	.byte	14			# DW_CFA_def_cfa_offset
+	.byte	0x40+.LSbl2-.LSbl1		# DW_CFA_advance_loc+N
+	.byte	14				# DW_CFA_def_cfa_offset
 	.uleb128 64
-	.byte	4			# DW_CFA_advance_loc4
-	.long	.LSbl3-.LSbl2
-	.byte	14			# DW_CFA_def_cfa_offset
+	.byte	0x85				# DW_CFA_offset %ebp
+	.uleb128 2
+	.byte	0x87				# DW_CFA_offset %edi
+	.uleb128 3
+	.byte	0x86				# DW_CFA_offset %esi
+	.uleb128 4
+	.byte	0x83				# DW_CFA_offset %ebx
+	.uleb128 5
+	.byte	0x40+.LSbl3-.LSbl2		# DW_CFA_advance_loc+N
+	.byte	14				# DW_CFA_def_cfa_offset
 	.uleb128 24
 #if defined __NR_clock_gettime && !defined __ASSUME_POSIX_TIMERS
-	.byte	4			# DW_CFA_advance_loc4
-	.long	.LSbl4-.LSbl3
-	.byte	14			# DW_CFA_def_cfa_offset
+	.byte	0x40+.LSbl4-.LSbl3		# DW_CFA_advance_loc+N
+	.byte	14				# DW_CFA_def_cfa_offset
 	.uleb128 64
 #endif
 	.align	4
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S
index 89bd4a66f0..d701d77fe4 100644
--- a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S
+++ b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S
@@ -316,88 +316,95 @@ versioned_symbol (libpthread, __pthread_cond_wait, pthread_cond_wait,
 .LSTARTFRAME:
 	.long	L(ENDCIE)-L(STARTCIE)	# Length of the CIE.
 .LSTARTCIE:
-	.long	0			# CIE ID.
-	.byte	1			# Version number.
+	.long	0				# CIE ID.
+	.byte	1				# Version number.
 #ifdef SHARED
-	.string	"zR"			# NUL-terminated augmentation string.
+	.string	"zR"				# NUL-terminated augmentation
+						# string.
 #else
-	.ascii	"\0"			# NUL-terminated augmentation string.
+	.ascii	"\0"				# NUL-terminated augmentation
+						# string.
 #endif
-	.uleb128 1			# Code alignment factor.
-	.sleb128 -4			# Data alignment factor.
-	.byte	8			# Return address register column.
+	.uleb128 1				# Code alignment factor.
+	.sleb128 -4				# Data alignment factor.
+	.byte	8				# Return address register
+						# column.
 #ifdef SHARED
-	.uleb128 1			# Augmentation value length.
-	.byte	0x1b			# Encoding: DW_EH_PE_pcrel
-					# + DW_EH_PE_sdata4.
+	.uleb128 1				# Augmentation value length.
+	.byte	0x1b				# Encoding: DW_EH_PE_pcrel
+						# + DW_EH_PE_sdata4.
 #endif
-	.byte 0x0c			# DW_CFA_def_cfa
+	.byte 0x0c				# DW_CFA_def_cfa
 	.uleb128 4
 	.uleb128 4
-	.byte	0x88			# DW_CFA_offset, column 0x8
+	.byte	0x88				# DW_CFA_offset, column 0x8
 	.uleb128 1
 	.align 4
 .LENDCIE:
 
-	.long	.LENDFDE-.LSTARTFDE	# Length of the FDE.
+	.long	.LENDFDE-.LSTARTFDE		# Length of the FDE.
 .LSTARTFDE:
-	.long	.LSTARTFDE-.LSTARTFRAME	# CIE pointer.
+	.long	.LSTARTFDE-.LSTARTFRAME		# CIE pointer.
 #ifdef SHARED
-	.long	.LSTARTCODE-.		# PC-relative start address of the code
+	.long	.LSTARTCODE-.			# PC-relative start address
+						# of the code.
 #else
-	.long	.LSTARTCODE		# Start address of the code.
+	.long	.LSTARTCODE			# Start address of the code.
 #endif
-	.long	.LENDCODE-.LSTARTCODE	# Length of the code.
+	.long	.LENDCODE-.LSTARTCODE		# Length of the code.
 #ifdef SHARED
-	.uleb128 0			# No augmentation data.
+	.uleb128 0				# No augmentation data.
 #endif
-	.byte	4			# DW_CFA_advance_loc4
-	.long	.Lpush_edi-.LSTARTCODE
-	.byte	14			# DW_CFA_def_cfa_offset
+	.byte	0x40+.Lpush_edi-.LSTARTCODE	# DW_CFA_advance_loc+N
+	.byte	14				# DW_CFA_def_cfa_offset
 	.uleb128 8
-	.byte	4			# DW_CFA_advance_loc4
-	.long	.Lpush_esi-.Lpush_edi
-	.byte	14			# DW_CFA_def_cfa_offset
+	.byte	0x87				# DW_CFA_offset %edi
+	.uleb128 2
+	.byte	0x40+.Lpush_esi-.Lpush_edi	# DW_CFA_advance_loc+N
+	.byte	14				# DW_CFA_def_cfa_offset
 	.uleb128 12
-	.byte	4			# DW_CFA_advance_loc4
-	.long	.Lpush_ebx-.Lpush_esi
-	.byte	14			# DW_CFA_def_cfa_offset
+	.byte	0x86				# DW_CFA_offset %esi
+	.uleb128 3
+	.byte	0x40+.Lpush_ebx-.Lpush_esi	# DW_CFA_advance_loc+N
+	.byte	14				# DW_CFA_def_cfa_offset
 	.uleb128 16
-	.byte	4			# DW_CFA_advance_loc4
-	.long	.Lpush4-.Lpush_ebx
-	.byte	14			# DW_CFA_def_cfa_offset
+	.byte	0x83				# DW_CFA_offset %ebx
+	.uleb128 4
+	.byte	0x40+.Lpush4-.Lpush_ebx		# DW_CFA_advance_loc+N
+	.byte	14				# DW_CFA_def_cfa_offset
 	.uleb128 20
-	.byte	4			# DW_CFA_advance_loc4
-	.long	.Lsubl-.Lpush4
-	.byte	14			# DW_CFA_def_cfa_offset
+	.byte	0x40+.Lsubl-.Lpush4		# DW_CFA_advance_loc+N
+	.byte	14				# DW_CFA_def_cfa_offset
 	.uleb128 52
-	.byte	4			# DW_CFA_advance_loc4
-	.long	.Laddl-.Lsubl
-	.byte	14			# DW_CFA_def_cfa_offset
+	.byte	0x40+.Laddl-.Lsubl		# DW_CFA_advance_loc+N
+	.byte	14				# DW_CFA_def_cfa_offset
 	.uleb128 16
-	.byte	4			# DW_CFA_advance_loc4
-	.long	.Lpop_ebx-.Laddl
-	.byte	14			# DW_CFA_def_cfa_offset
+	.byte	0x40+ .Lpop_ebx-.Laddl		# DW_CFA_advance_loc+N
+	.byte	14				# DW_CFA_def_cfa_offset
 	.uleb128 12
-	.byte	4			# DW_CFA_advance_loc4
-	.long	.Lpop_esi-.Lpop_ebx
-	.byte	14			# DW_CFA_def_cfa_offset
+	.byte	0xc3				# DW_CFA_restore %ebx
+	.byte	0x40+.Lpop_esi-.Lpop_ebx	# DW_CFA_advance_loc+N
+	.byte	14				# DW_CFA_def_cfa_offset
 	.uleb128 8
-	.byte	4			# DW_CFA_advance_loc4
-	.long	.Lpop_edi-.Lpop_esi
-	.byte	14			# DW_CFA_def_cfa_offset
+	.byte	0xc6				# DW_CFA_restore %esi
+	.byte	0x40+.Lpop_edi-.Lpop_esi	# DW_CFA_advance_loc+N
+	.byte	14				# DW_CFA_def_cfa_offset
 	.uleb128 4
-	.byte	4			# DW_CFA_advance_loc4
-	.long	.LSbl1-.Lpop_edi
-	.byte	14			# DW_CFA_def_cfa_offset
+	.byte	0xc7				# DW_CFA_restore %edi
+	.byte	0x40+.LSbl1-.Lpop_edi		# DW_CFA_advance_loc+N
+	.byte	14				# DW_CFA_def_cfa_offset
 	.uleb128 16
-	.byte	4			# DW_CFA_advance_loc4
-	.long	.LSbl2-.LSbl1
-	.byte	14			# DW_CFA_def_cfa_offset
+	.byte	0x87				# DW_CFA_offset %edi
+	.uleb128 2
+	.byte	0x86				# DW_CFA_offset %esi
+	.uleb128 3
+	.byte	0x83				# DW_CFA_offset %ebx
+	.uleb128 4
+	.byte	0x40+.LSbl2-.LSbl1		# DW_CFA_advance_loc+N
+	.byte	14				# DW_CFA_def_cfa_offset
 	.uleb128 52
-	.byte	4			# DW_CFA_advance_loc4
-	.long	.LSbl3-.LSbl2
-	.byte	14			# DW_CFA_def_cfa_offset
+	.byte	0x40+.LSbl3-.LSbl2		# DW_CFA_advance_loc+N
+	.byte	14				# DW_CFA_def_cfa_offset
 	.uleb128 20
 	.align	4
 .LENDFDE:
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h b/nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h
index 2f80654b5b..22fdc9421b 100644
--- a/nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h
+++ b/nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h
@@ -59,19 +59,16 @@
     .long 0;								      \
     /* Version number.  */						      \
     .byte 1;								      \
-    /* NUL-terminated augmentation string.  Note "z" means there is an	      \
-       augmentation value later on.  */					      \
-    .string "zR";							      \
+    /* NUL-terminated augmentation string.  */				      \
+    AUGMENTATION_STRING;						      \
     /* Code alignment factor.  */					      \
     .uleb128 1;								      \
     /* Data alignment factor.  */					      \
     .sleb128 -4;							      \
     /* Return address register column.  */				      \
     .byte 8;								      \
-    /* Augmentation value length.  */					      \
-    .uleb128 1;								      \
-    /* Encoding: DW_EH_PE_pcrel + DW_EH_PE_sdata4.  */			      \
-    .byte 0x1b;								      \
+    /* Optional augmentation parameter.  */				      \
+    AUGMENTATION_PARAM							      \
     /* Start of the table initialization.  */				      \
     .byte 0xc;			/* DW_CFA_def_cfa */			      \
     .uleb128 4;								      \
@@ -85,12 +82,12 @@
   L(STARTFDE):								      \
     /* CIE pointer.  */							      \
     .long L(STARTFDE)-L(STARTFRAME);					      \
-    /* PC-relative start address of the code.  */			      \
-    .long L(name##START)-.;						      \
+    /* Start address of the code.  */					      \
+    START_SYMBOL_REF (name);						      \
     /* Length of the code.  */						      \
     .long L(name##END)-L(name##START);					      \
-    /* No augmentation data.  */					      \
-    .uleb128 0;								      \
+    /* Augmentation data.  */						      \
+    AUGMENTATION_PARAM_FDE						      \
     /* The rest of the code depends on the number of parameters the syscall   \
        takes.  */							      \
     EH_FRAME_##args(name);						      \
@@ -98,6 +95,31 @@
   L(ENDFDE):								      \
   .previous
 
+#ifdef SHARED
+/* NUL-terminated augmentation string.  Note "z" means there is an
+   augmentation value later on.  */
+# define AUGMENTATION_STRING .string "zR"
+# define AUGMENTATION_PARAM \
+    /* Augmentation value length.  */					      \
+    .uleb128 1;								      \
+    /* Encoding: DW_EH_PE_pcrel + DW_EH_PE_sdata4.  */			      \
+    .byte 0x1b;
+# define AUGMENTATION_PARAM_FDE \
+    /* No augmentation data.  */					      \
+    .uleb128 0;
+# define START_SYMBOL_REF(name) \
+    /* PC-relative start address of the code.  */			      \
+    .long L(name##START)-.
+#else
+/* No augmentation.  */
+# define AUGMENTATION_STRING .ascii "\0"
+# define AUGMENTATION_PARAM /* nothing */
+# define AUGMENTATION_PARAM_FDE /* nothing */
+# define START_SYMBOL_REF(name) \
+    /* Absolute start address of the code.  */				      \
+    .long L(name##START)
+#endif
+
 /* Callframe description for syscalls without parameters.  This is very
    simple.  The only place the stack pointer is changed is when the old
    cancellation state value is saved.  */
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S
index 79d8a2aebe..a099b2b8f3 100644
--- a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S
+++ b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S
@@ -329,78 +329,88 @@ versioned_symbol (libpthread, __pthread_cond_timedwait, pthread_cond_timedwait,
 
 	.section .eh_frame,"a",@progbits
 .LSTARTFRAME:
-	.long	L(ENDCIE)-L(STARTCIE)	# Length of the CIE.
+	.long	L(ENDCIE)-L(STARTCIE)		# Length of the CIE.
 .LSTARTCIE:
-	.long	0			# CIE ID.
-	.byte	1			# Version number.
+	.long	0				# CIE ID.
+	.byte	1				# Version number.
 #ifdef SHARED
-	.string	"zR"			# NUL-terminated augmentation string.
+	.string	"zR"				# NUL-terminated augmentation
+						# string.
 #else
-	.ascii	"\0"			# NUL-terminated augmentation string.
+	.ascii	"\0"				# NUL-terminated augmentation
+						# string.
 #endif
-	.uleb128 1			# Code alignment factor.
-	.sleb128 -8			# Data alignment factor.
-	.byte	16			# Return address register column.
+	.uleb128 1				# Code alignment factor.
+	.sleb128 -8				# Data alignment factor.
+	.byte	16				# Return address register
+						# column.
 #ifdef SHARED
-	.uleb128 1			# Augmentation value length.
-	.byte	0x1b			# Encoding: DW_EH_PE_pcrel
-					# + DW_EH_PE_sdata4.
+	.uleb128 1				# Augmentation value length.
+	.byte	0x1b				# Encoding: DW_EH_PE_pcrel
+						# + DW_EH_PE_sdata4.
 #endif
-	.byte 0x0c			# DW_CFA_def_cfa
+	.byte 0x0c				# DW_CFA_def_cfa
 	.uleb128 7
 	.uleb128 8
-	.byte	0x90			# DW_CFA_offset, column 0x8
+	.byte	0x90				# DW_CFA_offset, column 0x8
 	.uleb128 1
 	.align 8
 .LENDCIE:
 
-	.long	.LENDFDE-.LSTARTFDE	# Length of the FDE.
+	.long	.LENDFDE-.LSTARTFDE		# Length of the FDE.
 .LSTARTFDE:
-	.long	.LSTARTFDE-.LSTARTFRAME	# CIE pointer.
+	.long	.LSTARTFDE-.LSTARTFRAME		# CIE pointer.
 #ifdef SHARED
-	.long	.LSTARTCODE-.		# PC-relative start address of the code
+	.long	.LSTARTCODE-.			# PC-relative start address
+						# of the code
 #else
-	.long	.LSTARTCODE		# Start address of the code.
+	.long	.LSTARTCODE			# Start address of the code.
 #endif
-	.long	.LENDCODE-.LSTARTCODE	# Length of the code.
+	.long	.LENDCODE-.LSTARTCODE		# Length of the code.
 #ifdef SHARED
-	.uleb128 0			# No augmentation data.
+	.uleb128 0				# No augmentation data.
 #endif
-	.byte	4			# DW_CFA_advance_loc4
-	.long	.Lpush_r12-.LSTARTCODE
-	.byte	14			# DW_CFA_def_cfa_offset
+	.byte	0x40+.Lpush_r12-.LSTARTCODE	# DW_CFA_advance_loc4
+	.byte	14				# DW_CFA_def_cfa_offset
 	.uleb128 16
-	.byte	4			# DW_CFA_advance_loc4
-	.long	.Lpush_r13-.Lpush_r12
-	.byte	14			# DW_CFA_def_cfa_offset
+	.byte	0x8c				# DW_CFA_offset %r12
+	.uleb128 2
+	.byte	0x40+.Lpush_r13-.Lpush_r12	# DW_CFA_advance_loc4
+	.byte	14				# DW_CFA_def_cfa_offset
 	.uleb128 24
-	.byte	4			# DW_CFA_advance_loc4
-	.long	.Lpush_r14-.Lpush_r13
-	.byte	14			# DW_CFA_def_cfa_offset
+	.byte	0x8d				# DW_CFA_offset %r13
+	.uleb128 3
+	.byte	0x40+.Lpush_r14-.Lpush_r13	# DW_CFA_advance_loc4
+	.byte	14				# DW_CFA_def_cfa_offset
 	.uleb128 32
-	.byte	4			# DW_CFA_advance_loc4
-	.long	.Lsubq-.Lpush_r14
-	.byte	14			# DW_CFA_def_cfa_offset
+	.byte	0x84				# DW_CFA_offset %r14
+	.uleb128 4
+	.byte	0x40+.Lsubq-.Lpush_r14		# DW_CFA_advance_loc4
+	.byte	14				# DW_CFA_def_cfa_offset
 	.uleb128 112
-	.byte	4			# DW_CFA_advance_loc4
-	.long	.Laddq-.Lsubq
-	.byte	14			# DW_CFA_def_cfa_offset
+	.byte	0x40+.Laddq-.Lsubq		# DW_CFA_advance_loc4
+	.byte	14				# DW_CFA_def_cfa_offset
 	.uleb128 32
-	.byte	4			# DW_CFA_advance_loc4
-	.long	.Lpop_r14-.Laddq
-	.byte	14			# DW_CFA_def_cfa_offset
+	.byte	0x40+.Lpop_r14-.Laddq		# DW_CFA_advance_loc4
+	.byte	14				# DW_CFA_def_cfa_offset
 	.uleb128 24
-	.byte	4			# DW_CFA_advance_loc4
-	.long	.Lpop_r13-.Lpop_r14
-	.byte	14			# DW_CFA_def_cfa_offset
+	.byte	0xce				# DW_CFA_restore %r14
+	.byte	0x40+.Lpop_r13-.Lpop_r14	# DW_CFA_advance_loc4
+	.byte	14				# DW_CFA_def_cfa_offset
 	.uleb128 16
-	.byte	4			# DW_CFA_advance_loc4
-	.long	.Lpop_r12-.Lpop_r13
-	.byte	14			# DW_CFA_def_cfa_offset
+	.byte	0xcd				# DW_CFA_restore %r13
+	.byte	0x40+.Lpop_r12-.Lpop_r13	# DW_CFA_advance_loc4
+	.byte	14				# DW_CFA_def_cfa_offset
 	.uleb128 8
-	.byte	4			# DW_CFA_advance_loc4
-	.long	.LSbl1-.Lpop_r12
-	.byte	14			# DW_CFA_def_cfa_offset
+	.byte	0xcc				# DW_CFA_restore %r12
+	.byte	0x40+.LSbl1-.Lpop_r12		# DW_CFA_advance_loc4
+	.byte	14				# DW_CFA_def_cfa_offset
 	.uleb128 112
+	.byte	0x8c				# DW_CFA_offset %r12
+	.uleb128 2
+	.byte	0x8d				# DW_CFA_offset %r13
+	.uleb128 3
+	.byte	0x84				# DW_CFA_offset %r14
+	.uleb128 4
 	.align	8
 .LENDFDE:
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S
index a7fcc8c8fc..916a388fbd 100644
--- a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S
+++ b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S
@@ -293,62 +293,66 @@ versioned_symbol (libpthread, __pthread_cond_wait, pthread_cond_wait,
 
 	.section .eh_frame,"a",@progbits
 .LSTARTFRAME:
-	.long	L(ENDCIE)-L(STARTCIE)	# Length of the CIE.
+	.long	L(ENDCIE)-L(STARTCIE)		# Length of the CIE.
 .LSTARTCIE:
-	.long	0			# CIE ID.
-	.byte	1			# Version number.
+	.long	0				# CIE ID.
+	.byte	1				# Version number.
 #ifdef SHARED
-	.string	"zR"			# NUL-terminated augmentation string.
+	.string	"zR"				# NUL-terminated augmentation
+						# string.
 #else
-	.ascii	"\0"			# NUL-terminated augmentation string.
+	.ascii	"\0"				# NUL-terminated augmentation
+						# string.
 #endif
-	.uleb128 1			# Code alignment factor.
-	.sleb128 -8			# Data alignment factor.
-	.byte	16			# Return address register column.
+	.uleb128 1				# Code alignment factor.
+	.sleb128 -8				# Data alignment factor.
+	.byte	16				# Return address register
+						# column.
 #ifdef SHARED
-	.uleb128 1			# Augmentation value length.
-	.byte	0x1b			# Encoding: DW_EH_PE_pcrel
-					# + DW_EH_PE_sdata4.
+	.uleb128 1				# Augmentation value length.
+	.byte	0x1b				# Encoding: DW_EH_PE_pcrel
+						# + DW_EH_PE_sdata4.
 #endif
-	.byte 0x0c			# DW_CFA_def_cfa
+	.byte 0x0c				# DW_CFA_def_cfa
 	.uleb128 7
 	.uleb128 8
-	.byte	0x90			# DW_CFA_offset, column 0x8
+	.byte	0x90				# DW_CFA_offset, column 0x8
 	.uleb128 1
 	.align 8
 .LENDCIE:
 
-	.long	.LENDFDE-.LSTARTFDE	# Length of the FDE.
+	.long	.LENDFDE-.LSTARTFDE		# Length of the FDE.
 .LSTARTFDE:
-	.long	.LSTARTFDE-.LSTARTFRAME	# CIE pointer.
+	.long	.LSTARTFDE-.LSTARTFRAME		# CIE pointer.
 #ifdef SHARED
-	.long	.LSTARTCODE-.		# PC-relative start address of the code
+	.long	.LSTARTCODE-.			# PC-relative start address
+						# of the code
 #else
-	.long	.LSTARTCODE		# Start address of the code.
+	.long	.LSTARTCODE			# Start address of the code.
 #endif
-	.long	.LENDCODE-.LSTARTCODE	# Length of the code.
+	.long	.LENDCODE-.LSTARTCODE		# Length of the code.
 #ifdef SHARED
-	.uleb128 0			# No augmentation data.
+	.uleb128 0				# No augmentation data.
 #endif
-	.byte	4			# DW_CFA_advance_loc4
-	.long	.Lpush_r12-.LSTARTCODE
-	.byte	14			# DW_CFA_def_cfa_offset
+	.byte	0x40+.Lpush_r12-.LSTARTCODE	# DW_CFA_advance_loc+N
+	.byte	14				# DW_CFA_def_cfa_offset
 	.uleb128 16
-	.byte	4			# DW_CFA_advance_loc4
-	.long	.Lsubq-.Lpush_r12
-	.byte	14			# DW_CFA_def_cfa_offset
+	.byte	0x8c				# DW_CFA_offset %r12
+	.uleb128 2
+	.byte	0x40+.Lsubq-.Lpush_r12		# DW_CFA_advance_loc+N
+	.byte	14				# DW_CFA_def_cfa_offset
 	.uleb128 80
-	.byte	4			# DW_CFA_advance_loc4
-	.long	.Laddq-.Lsubq
-	.byte	14			# DW_CFA_def_cfa_offset
+	.byte	0x40+.Laddq-.Lsubq		# DW_CFA_advance_loc+N
+	.byte	14				# DW_CFA_def_cfa_offset
 	.uleb128 16
-	.byte	4			# DW_CFA_advance_loc4
-	.long	.Lpop_r12-.Laddq
-	.byte	14			# DW_CFA_def_cfa_offset
+	.byte	0x40+.Lpop_r12-.Laddq		# DW_CFA_advance_loc+N
+	.byte	14				# DW_CFA_def_cfa_offset
 	.uleb128 8
-	.byte	4			# DW_CFA_advance_loc4
-	.long	.LSbl1-.Lpop_r12
-	.byte	14			# DW_CFA_def_cfa_offset
+	.byte	0xcc				# DW_CFA_restore %r12
+	.byte	0x40+.LSbl1-.Lpop_r12		# DW_CFA_advance_loc+N
+	.byte	14				# DW_CFA_def_cfa_offset
 	.uleb128 80
+	.byte	0x8c				# DW_CFA_offset %r12
+	.uleb128 2
 	.align	8
 .LENDFDE:
diff --git a/string/strxfrm.c b/string/strxfrm.c
index 6475fa9206..9db57829d9 100644
--- a/string/strxfrm.c
+++ b/string/strxfrm.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995-1999,2000,2001,2002 Free Software Foundation, Inc.
+/* Copyright (C) 1995-1999,2000,2001,2002,2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Written by Ulrich Drepper <drepper@cygnus.com>, 1995.
 
@@ -196,9 +196,6 @@ STRXFRM (STRING_TYPE *dest, const STRING_TYPE *src, size_t n, __locale_t l)
       idxarr = (int32_t *) alloca (srclen * sizeof (int32_t));
       rulearr = (unsigned char *) alloca (srclen + 1);
     }
-  /* This element is only read, the value never used but to determine
-     another value which then is ignored.  */
-  rulearr[srclen] = '\0';
 
   idxmax = 0;
   do
@@ -211,6 +208,10 @@ STRXFRM (STRING_TYPE *dest, const STRING_TYPE *src, size_t n, __locale_t l)
     }
   while (*usrc != L('\0'));
 
+  /* This element is only read, the value never used but to determine
+     another value which then is ignored.  */
+  rulearr[idxmax] = '\0';
+
   /* Now the passes over the weights.  We now use the indeces we found
      before.  */
   needed = 0;