This is the mail archive of the libc-hacker@sources.redhat.com mailing list for the glibc project.
Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
| Other format: | [Raw text] | |
>>>>> On Sat, 15 Nov 2003 18:41:34 +0100, Andreas Schwab <schwab@suse.de> said:
Andreas> Why is ALIGN taking a parameter if it's always ignored
Andreas> anyway?
Thanks for catching this typo. Updated patch is attached.
--david
ChangeLog
2003-11-14 David Mosberger <davidm@hpl.hp.com>
* sysdeps/ia64/memccpy.S: Work around GAS_ALIGN_BREAKS_UNWIND_INFO bug.
* sysdeps/ia64/memcpy.S: Ditto.
* sysdeps/ia64/memset.S: Ditto.
* sysdeps/ia64/memmove.S: Ditto. Also move the jump-table to
out of .tex into .rodata, where it belongs
* sysdeps/unix/sysv/linux/ia64/sysdep.h
(GAS_ALIGN_BREAKS_UNWIND_INFO): Define this macro to indicate
that all existing GAS versions have a problem with .align inside
a function.
* sysdeps/unix/sysv/linux/ia64/pipe.S: There is no need to
save/restore input-arguments, because they're necessarily
preserved by the kernel to support syscall-restart.
Index: sysdeps/ia64/memccpy.S
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/ia64/memccpy.S,v
retrieving revision 1.6
diff -u -r1.6 memccpy.S
--- sysdeps/ia64/memccpy.S 9 Sep 2003 20:15:59 -0000 1.6
+++ sysdeps/ia64/memccpy.S 14 Nov 2003 20:05:30 -0000
@@ -52,6 +52,15 @@
#define loopcnt r30
#define value r31
+#ifdef GAS_ALIGN_BREAKS_UNWIND_INFO
+/* Manually force proper loop-alignment. Note: be sure to
+ double-check the code-layout after making any changes to
+ this routine! */
+# define ALIGN(n) { nop 0 }
+#else
+# define ALIGN(n) .align n
+#endif
+
ENTRY(memccpy)
.prologue
alloc r2 = ar.pfs, 4, 40 - 4, 0, 40
@@ -110,7 +119,7 @@
mov ar.ec = MEMLAT + 6 + 1 // six more passes needed
ld8 r[1] = [asrc], 8 // r[1] = w0
cmp.ne p6, p0 = r0, r0 ;; // clear p6
- .align 32
+ ALIGN(32)
.l2:
(p[0]) ld8.s r[0] = [asrc], 8 // r[0] = w1
(p[MEMLAT]) shr.u tmp1[0] = r[1 + MEMLAT], sh1 // tmp1 = w0 >> sh1
Index: sysdeps/ia64/memcpy.S
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/ia64/memcpy.S,v
retrieving revision 1.10
diff -u -r1.10 memcpy.S
--- sysdeps/ia64/memcpy.S 29 Apr 2003 22:47:19 -0000 1.10
+++ sysdeps/ia64/memcpy.S 14 Nov 2003 20:05:30 -0000
@@ -103,14 +103,22 @@
#define the_z z
#endif
+#ifdef GAS_ALIGN_BREAKS_UNWIND_INFO
+/* Manually force proper loop-alignment. Note: be sure to
+ double-check the code-layout after making any changes to
+ this routine! */
+# define ALIGN(n) { nop 0 }
+#else
+# define ALIGN(n) .align n
+#endif
#if defined(USE_LFETCH)
#define LOOP(shift) \
- .align 32 ; \
+ ALIGN(32); \
.loop##shift##: \
{ .mmb \
(p[0]) ld8.nt1 r[0] = [asrc], 8 ; \
-(p[0]) lfetch.nt1 [ptr1], 16 ; \
+(p[0]) lfetch.nt1 [ptr1], 16 ; \
nop.b 0 ; \
} { .mib \
(p[MEMLAT+1]) st8 [dest] = tmp3, 8 ; \
@@ -118,7 +126,7 @@
nop.b 0 ;; \
} { .mmb \
(p[0]) ld8.nt1 s[0] = [asrc], 8 ; \
-(p[0]) lfetch.nt1 [ptr2], 16 ; \
+(p[0]) lfetch.nt1 [ptr2], 16 ; \
nop.b 0 ; \
} { .mib \
(p[MEMLAT+1]) st8 [dest] = tmp4, 8 ; \
@@ -130,7 +138,7 @@
}
#else
#define LOOP(shift) \
- .align 32 ; \
+ ALIGN(32); \
.loop##shift##: \
{ .mmb \
(p[0]) ld8.nt1 r[0] = [asrc], 8 ; \
@@ -254,7 +262,11 @@
movi0 ar.lc = loopcnt // set the loop counter
;; }
+#ifdef GAS_ALIGN_BREAKS_UNWIND_INFO
+ { nop 0 }
+#else
.align 32
+#endif
#if defined(USE_FLP)
.l1: // ------------------------------- // L1: Everything a multiple of 8
{ .mmi
Index: sysdeps/ia64/memmove.S
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/ia64/memmove.S,v
retrieving revision 1.6
diff -u -r1.6 memmove.S
--- sysdeps/ia64/memmove.S 29 Apr 2003 22:47:19 -0000 1.6
+++ sysdeps/ia64/memmove.S 14 Nov 2003 20:05:30 -0000
@@ -56,12 +56,18 @@
#define loopcnt r30
#define value r31
+#ifdef GAS_ALIGN_BREAKS_UNWIND_INFO
+# define ALIGN(n) { nop 0 }
+#else
+# define ALIGN(n) .align n
+#endif
+
#define LOOP(shift) \
- .align 32 ; \
+ ALIGN(32); \
.loop##shift##: \
(p[0]) ld8 r[0] = [asrc], 8 ; /* w1 */ \
(p[MEMLAT+1]) st8 [dest] = value, 8 ; \
-(p[MEMLAT]) shrp value = r[MEMLAT], r[MEMLAT+1], shift ; \
+(p[MEMLAT]) shrp value = r[MEMLAT], r[MEMLAT+1], shift ; \
nop.b 0 ; \
nop.b 0 ; \
br.ctop.sptk .loop##shift ; \
@@ -228,6 +234,10 @@
(p[MEMLAT]) st1 [dest] = r[MEMLAT], -1
br.ctop.dptk .l6
br.cond.sptk .restore_and_exit
+END(memmove)
+
+ .rodata
+ .align 8
.table:
data8 0 // dummy entry
data8 .loop56 - .loop8
@@ -238,5 +248,4 @@
data8 .loop56 - .loop48
data8 .loop56 - .loop56
-END(memmove)
libc_hidden_builtin_def (memmove)
Index: sysdeps/ia64/memset.S
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/ia64/memset.S,v
retrieving revision 1.6
diff -u -r1.6 memset.S
--- sysdeps/ia64/memset.S 29 Apr 2003 22:47:19 -0000 1.6
+++ sysdeps/ia64/memset.S 14 Nov 2003 20:05:30 -0000
@@ -153,7 +153,9 @@
(p_zr) br.cond.dptk.many .l1b // Jump to use stf.spill
;; }
+#ifndef GAS_ALIGN_BREAKS_UNWIND_INFO
.align 32 // -------- // L1A: store ahead into cache lines; fill later
+#endif
{ .mmi
and tmp = -(LINE_SIZE), cnt // compute end of range
mov ptr9 = ptr1 // used for prefetching
@@ -222,7 +224,11 @@
br.cond.dpnt.many .move_bytes_from_alignment // Branch no. 3
;; }
+#ifdef GAS_ALIGN_BREAKS_UNWIND_INFO
+ { nop 0 }
+#else
.align 32
+#endif
.l1b: // ------------------ // L1B: store ahead into cache lines; fill later
{ .mmi
and tmp = -(LINE_SIZE), cnt // compute end of range
@@ -283,13 +289,15 @@
{ .mib
cmp.eq p_scr, p0 = loopcnt, r0
add loopcnt = -1, loopcnt
-(p_scr) br.cond.dpnt.many .store_words
+(p_scr) br.cond.dpnt.many store_words
;; }
{ .mib
and cnt = 0x1f, cnt // compute the remaining cnt
movi0 ar.lc = loopcnt
;; }
+#ifndef GAS_ALIGN_BREAKS_UNWIND_INFO
.align 32
+#endif
.l2: // ---------------------------- // L2A: store 32B in 2 cycles
{ .mmb
store [ptr1] = myval, 8
@@ -299,7 +307,7 @@
store [ptr2] = myval, 24
br.cloop.dptk.many .l2
;; }
-.store_words:
+store_words:
{ .mib
cmp.gt p_scr, p0 = 8, cnt // just a few bytes left ?
(p_scr) br.cond.dpnt.many .move_bytes_from_alignment // Branch
Index: sysdeps/unix/sysv/linux/ia64/pipe.S
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/ia64/pipe.S,v
retrieving revision 1.4
diff -u -r1.4 pipe.S
--- sysdeps/unix/sysv/linux/ia64/pipe.S 3 Aug 2002 06:57:51 -0000 1.4
+++ sysdeps/unix/sysv/linux/ia64/pipe.S 14 Nov 2003 20:05:31 -0000
@@ -22,15 +22,14 @@
#include <sysdep.h>
ENTRY(__pipe)
- st8 [sp]=r32 // save ptr across system call
+ .regstk 1,0,0,0
DO_CALL (SYS_ify (pipe))
- ld8 r2=[sp]
cmp.ne p6,p0=-1,r10
;;
-(p6) st4 [r2]=r8,4
+(p6) st4 [in0]=r8,4
(p6) mov ret0=0
;;
-(p6) st4 [r2]=r9
+(p6) st4 [in0]=r9
(p6) ret
br.cond.spnt.few __syscall_error
PSEUDO_END(__pipe)
Index: sysdeps/unix/sysv/linux/ia64/sysdep.h
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/ia64/sysdep.h,v
retrieving revision 1.17
diff -u -r1.17 sysdep.h
--- sysdeps/unix/sysv/linux/ia64/sysdep.h 16 Aug 2003 08:00:24 -0000 1.17
+++ sysdeps/unix/sysv/linux/ia64/sysdep.h 14 Nov 2003 20:05:31 -0000
@@ -24,6 +24,13 @@
#include <sysdeps/unix/sysdep.h>
#include <sysdeps/ia64/sysdep.h>
+/* As of GAS v2.4.90.0.7, including a ".align" directive inside a
+ function will cause bad unwind info to be emitted (GAS doesn't know
+ how to account for the padding introduced by the .align directive).
+ Turning on this macro will work around this bug by introducing the
+ necessary padding explicitly. */
+#define GAS_ALIGN_BREAKS_UNWIND_INFO
+
/* For Linux we can use the system call table in the header file
/usr/include/asm/unistd.h
of the kernel. But these symbols do not follow the SYS_* syntax
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |