public inbox for linux-ia64@vger.kernel.org
 help / color / mirror / Atom feed
* [Linux-ia64] Re: gas generates incorrect ia64 unwind rlen values
@ 2002-12-16  9:00 Keith Owens
  2002-12-16 22:12 ` Keith Owens
                   ` (14 more replies)
  0 siblings, 15 replies; 16+ messages in thread
From: Keith Owens @ 2002-12-16  9:00 UTC (permalink / raw)
  To: linux-ia64

Another gas bug with ia64 unwind data in binutils-2.11.90.0.8-12.

arch/ia64/lib/memset.S generates unwind data of

<memset>: [0xe0020000005e07c0-0xe0020000005e0be0), info at +0x6aa5e8
  v1, flags=0x0 ( ), len=8 bytes
    R1:prologue(rlen=1)
    R3:body(rlen\x194)
        B3:epilogue(t=1,ecount890)

An epilogue count of 3890?  I think not.  But wait, it gets worse!  The
raw info data is

e0020000006aa5e8 01000000 00000100 0161c201 ea01b29e

0100      version 1
0000      no flags
01000000  ulen=1 (8 bytes), followed by 8 bytes 0161c201 ea01b29e

01        Prologue R1, rlen=1
61c201    Body R3, rlen\x194
ea        According to IA-64 Software Conventions and Runtime
          Architecture Guide August 2000 (24535802.pdf), Appendix B, ea
          is not a valid code, B3 records should be e0!  Why is gas
          generating ea?
01        t=1
b29e      uleb128 number with x80 set in both bytes!  We have reached
          the end of the data area (ulen=1) but uleb128 says there is
          more data to come.

Sorry for the surfeit of exclamation marks but the ia64 unwind code is
driving me up the wall.  I want kdb to backtrace correctly, all this
garbage data just gets in the way.



^ permalink raw reply	[flat|nested] 16+ messages in thread

* [Linux-ia64] Re: gas generates incorrect ia64 unwind rlen values
  2002-12-16  9:00 [Linux-ia64] Re: gas generates incorrect ia64 unwind rlen values Keith Owens
@ 2002-12-16 22:12 ` Keith Owens
  2002-12-16 22:12 ` David Mosberger
                   ` (13 subsequent siblings)
  14 siblings, 0 replies; 16+ messages in thread
From: Keith Owens @ 2002-12-16 22:12 UTC (permalink / raw)
  To: linux-ia64

On 16 Dec 2002 16:25:15 -0500, 
Jim Wilson <wilson@redhat.com> wrote:
>>RH 7.2-ia64, Dec 15 2001.
>
>The tools for this release were based on Summer 2000 FSF sources with patches.
>So they are about 2.5 years old now.

I know, but AFAICT it is the latest that is available on the RH site
for ia64.  If there is a more recent binutils ia64.rpm, point me at it
and I will try it.

>Are you sure this is an assembler problem?  If the compiler is emitting bad
>unwind directives, then it could be a compiler problem.  You didn't mention
>anything about looking at assembly code.

See my follow up mail about memset.S, that is pure assembler.  But just
to be sure, here is traps.c::ia64_fault assembler output.  No spurious
unwind directives from gcc but unwind is still wrong.

.text
	.align 16
	.align 32
	.global ia64_fault#
	.proc ia64_fault#
ia64_fault:
	.prologue 12, 37
	.save ar.pfs, r38
	alloc r38 = ar.pfs, 4, 3, 5, 0
	.fframe 256
	adds r12 = -256, r12
	movl r14 = 34359738383
	.save rp, r37
	mov r37 = b0
	;;
	.body
	and r14 = r14, r33
	movl r15 = 34359738372
[454 lines omitted for brevity]
.L2933:
	mov r39 = r36
	mov r40 = r33
	br.call.sptk.many b0 = ia32_intercept#
	;;
	cmp4.ne p6, p7 = 0, r8
	(p7) br.cond.dpnt .L2880
	addl r39 = @ltoff(.LC39), gp
	;;
	ld8 r39 = [r39]
	br.call.sptk.many b0 = printk#
	;;
	adds r14 = 8, r36
	addl r39 = @ltoff(.LC40), gp
	mov r41 = r34
	;;
	ld8 r40 = [r14]
	ld8 r39 = [r39]
	mov r42 = r33
	mov r43 = r35
	br.call.sptk.many b0 = printk#
[unwind tables in the object say that the body ends here]
	;;
	addl r39 = 11, r0
	mov r40 = r13
	br.call.sptk.many b0 = force_sig#
	;;
	br .L2880
.L2935:
	adds r34 = 144, r12
	addl r40 = @ltoff(.LC41), gp
	shr.u r41 = r33, 16
	;;
	mov r39 = r34
	ld8 r40 = [r40]
	br.call.sptk.many b0 = sprintf#
	;;
	br .L2882
.L2936:
	adds r34 = 144, r12
	addl r40 = @ltoff(.LC42), gp
	mov r41 = r32
	;;
	mov r39 = r34
	ld8 r40 = [r40]
	br.call.sptk.many b0 = sprintf#
	;;
.L2882:
	mov r39 = r34
	mov r40 = r36
	mov r41 = r33
	br.call.sptk.many b0 = die_if_kernel#
	;;
	addl r39 = 4, r0
	mov r40 = r13
	br.call.sptk.many b0 = force_sig#
	;;
.L2880:
	mov ar.pfs = r38
	mov b0 = r37
	.restore sp
	adds r12 = 256, r12
	br.ret.sptk.many b0
	.endp ia64_fault#




^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [Linux-ia64] Re: gas generates incorrect ia64 unwind rlen values
  2002-12-16  9:00 [Linux-ia64] Re: gas generates incorrect ia64 unwind rlen values Keith Owens
  2002-12-16 22:12 ` Keith Owens
@ 2002-12-16 22:12 ` David Mosberger
  2002-12-16 22:16 ` David Mosberger
                   ` (12 subsequent siblings)
  14 siblings, 0 replies; 16+ messages in thread
From: David Mosberger @ 2002-12-16 22:12 UTC (permalink / raw)
  To: linux-ia64

>>>>> On Mon, 16 Dec 2002 20:00:23 +1100, Keith Owens <kaos@sgi.com> said:

  Keith> Sorry for the surfeit of exclamation marks but the ia64 unwind code is
  Keith> driving me up the wall.  I want kdb to backtrace correctly, all this
  Keith> garbage data just gets in the way.

Then use gcc-3.2 (or backport the fixes).

	--david


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [Linux-ia64] Re: gas generates incorrect ia64 unwind rlen values
  2002-12-16  9:00 [Linux-ia64] Re: gas generates incorrect ia64 unwind rlen values Keith Owens
  2002-12-16 22:12 ` Keith Owens
  2002-12-16 22:12 ` David Mosberger
@ 2002-12-16 22:16 ` David Mosberger
  2002-12-16 23:10 ` Jim Wilson
                   ` (11 subsequent siblings)
  14 siblings, 0 replies; 16+ messages in thread
From: David Mosberger @ 2002-12-16 22:16 UTC (permalink / raw)
  To: linux-ia64

>>>>> On Tue, 17 Dec 2002 09:12:25 +1100, Keith Owens <kaos@sgi.com> said:

  Keith> On 16 Dec 2002 16:25:15 -0500,
  Keith> Jim Wilson <wilson@redhat.com> wrote:
  >>> RH 7.2-ia64, Dec 15 2001.

  >> The tools for this release were based on Summer 2000 FSF sources
  >> with patches.  So they are about 2.5 years old now.

  Keith> I know, but AFAICT it is the latest that is available on the RH site
  Keith> for ia64.  If there is a more recent binutils ia64.rpm, point me at it
  Keith> and I will try it.

Not Red Hat, but while Debian (unfortunately) still defaults to
gcc-2.9x at the moment, you can do "apt-get install gcc-3.2" to get
something reasonably modern.

	--david


^ permalink raw reply	[flat|nested] 16+ messages in thread

* [Linux-ia64] Re: gas generates incorrect ia64 unwind rlen values
  2002-12-16  9:00 [Linux-ia64] Re: gas generates incorrect ia64 unwind rlen values Keith Owens
                   ` (2 preceding siblings ...)
  2002-12-16 22:16 ` David Mosberger
@ 2002-12-16 23:10 ` Jim Wilson
  2002-12-17  2:34 ` Keith Owens
                   ` (10 subsequent siblings)
  14 siblings, 0 replies; 16+ messages in thread
From: Jim Wilson @ 2002-12-16 23:10 UTC (permalink / raw)
  To: linux-ia64

>I know, but AFAICT it is the latest that is available on the RH site
>for ia64.  If there is a more recent binutils ia64.rpm, point me at it
>and I will try it.

Yes, this is the latest one that we give away free of charge to non-customers.
I think we stopped maintaining these tools a while ago when we started
recommending RH AS 2.[01] instead of RHL 7.[012] for IA-64 customers.

If you want to try something newer, the FSF binutils sources are easily
accessible at
        http://sources.redhat.com/binutils

>See my follow up mail about memset.S, that is pure assembler.

Right, I didn't look closely enough at the file name.  There is unfortunately
no testcase though.  I'll have to grab a copy of the kernel sources in order
to get a testcase.

>[454 lines omitted for brevity]

And this isn't usable as a testcase either.

Jim


^ permalink raw reply	[flat|nested] 16+ messages in thread

* [Linux-ia64] Re: gas generates incorrect ia64 unwind rlen values
  2002-12-16  9:00 [Linux-ia64] Re: gas generates incorrect ia64 unwind rlen values Keith Owens
                   ` (3 preceding siblings ...)
  2002-12-16 23:10 ` Jim Wilson
@ 2002-12-17  2:34 ` Keith Owens
  2002-12-17  2:51 ` David Mosberger
                   ` (9 subsequent siblings)
  14 siblings, 0 replies; 16+ messages in thread
From: Keith Owens @ 2002-12-17  2:34 UTC (permalink / raw)
  To: linux-ia64

On 16 Dec 2002 18:10:21 -0500, 
Jim Wilson <wilson@redhat.com> wrote:
>Yes, this is the latest one that we give away free of charge to non-customers.
>I think we stopped maintaining these tools a while ago when we started
>recommending RH AS 2.[01] instead of RHL 7.[012] for IA-64 customers.

I built binutils-2.13.90.0.2-2 (from rh 8.0) on ia64.  I extracted the
generated assembler for ia64_fault as traps.S.  The bug still exists in
2.13.90.0.2.  traps.S has been sent to Jim Wilson as a test case.

/usr/src/redhat/BUILD/binutils-2.13.90.0.2/binutils/tmpdir/gas/as -x -mconstant-gp traps.S -o traps.o
/usr/src/redhat/BUILD/binutils-2.13.90.0.2/binutils/readelf -u traps.o

Unwind section '.IA_64.unwind' at offset 0xb40 contains 1 entries:

<ia64_fault>: [0x0-0xad0), info at +0x0
  v1, flags=0x0 ( ), len\x16 bytes
    R2:prologue_gr(mask=[rp,ar.pfs],grsave=r37,rlen=8)
        P7:pfs_when(t=0)
        P7:mem_stack_f(t=2,size%6)
        P7:rp_when(t=7)
    R3:body(rlenG5)			<= should be 511
        B2:epilogue(t=2,ecount=0)
    R1:prologue(rlen=0)

0000000000000000 <ia64_fault>:
   0:   0c 30 31 0e 80 05       [MFI]       alloc r38=ar.pfs,12,7,0
   6:   00 00 00 02 00 80                   nop.f 0x0
   c:   01 60 f8 8c                         adds r12=-256,r12
  10:   04 00 00 00 01 00       [MLX]       nop.m 0x0
  16:   00 08 00 00 00 c0                   movl r14=0x80000000f
  1c:   f1 00 00 60 
  20:   02 00 00 00 01 00       [MII]       nop.m 0x0
  26:   50 02 00 62 00 c0                   mov r37°;;
  2c:   e1 08 31 80                         and r14=r14,r33
.....
 ab0:   00 00 00 00 01 00       [MII]       nop.m 0x0
 ab6:   00 30 01 55 00 00                   mov.i ar.pfs=r38
 abc:   50 0a 00 07                         mov b0=r37
 ac0:   1d 60 00 18 02 21       [MFB]       adds r12%6,r12
 ac6:   00 00 00 02 00 80                   nop.f 0x0
 acc:   08 00 84 00                         br.ret.sptk.many b0;;
 ad0:   0c 00 00 00 01 00       [MFI]       nop.m 0x0			<== end of code at slot 519
 ad6:   00 00 00 02 00 00                   nop.f 0x0
 adc:   00 00 04 00                         nop.i 0x0



^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [Linux-ia64] Re: gas generates incorrect ia64 unwind rlen values
  2002-12-16  9:00 [Linux-ia64] Re: gas generates incorrect ia64 unwind rlen values Keith Owens
                   ` (4 preceding siblings ...)
  2002-12-17  2:34 ` Keith Owens
@ 2002-12-17  2:51 ` David Mosberger
  2002-12-17  3:19 ` David Mosberger
                   ` (8 subsequent siblings)
  14 siblings, 0 replies; 16+ messages in thread
From: David Mosberger @ 2002-12-17  2:51 UTC (permalink / raw)
  To: linux-ia64

>>>>> On Tue, 17 Dec 2002 13:34:03 +1100, Keith Owens <kaos@sgi.com> said:

  Keith> I built binutils-2.13.90.0.2-2 (from rh 8.0) on ia64.  I
  Keith> extracted the generated assembler for ia64_fault as traps.S.
  Keith> The bug still exists in 2.13.90.0.2.  traps.S has been sent
  Keith> to Jim Wilson as a test case.

Which compiler did you use?  With gcc-3.0, I get the info attached
below.  It looks correct to me (I only checked the total length, not
the individual regions).

	--david

<ia64_fault>: [0xe00000000442cd00-0xe00000000442d840], info at +0x545c80
  v1, flags=0x0 (), len$ bytes
    R2:prologue_gr(mask=[rp,ar.pfs],grsave=r37,rlen\x14)
        P7:pfs_when(t=0)
        P7:mem_stack_f(t=1,size%6)
        P7:rp_when(t\x13)
    R3:body(rlenU)
        B1:label_state(label=1)
        B2:epilogue(t=2,ecount=0)
    R3:body(rlenG1)
        B1:copy_state(label=1)

e00000000442cd00 <ia64_fault>:
e00000000442cd00:       00 30 31 0e 80 05       [MII]       alloc r38=ar.pfs,12,
7,0
e00000000442cd06:       c0 00 30 7c 46 00                   adds r12=-256,r12
e00000000442cd0c:       00 00 04 00                         nop.i 0x0
      :
e00000000442d820:       00 70 c0 03 96 26       [MII]       addl r14=-2077840,r1
e00000000442d826:       90 02 85 5e 29 60                   shr.u r41=r33,16
e00000000442d82c:       04 61 04 84                         adds r35\x144,r12
e00000000442d830:       1d 00 00 00 01 00       [MFB]       nop.m 0x0
e00000000442d836:       00 00 00 02 00 00                   nop.f 0x0
e00000000442d83c:       c0 fe ff 48                         br.few e000000004426f0 <ia64_fault+0x9f0>;;


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [Linux-ia64] Re: gas generates incorrect ia64 unwind rlen values
  2002-12-16  9:00 [Linux-ia64] Re: gas generates incorrect ia64 unwind rlen values Keith Owens
                   ` (5 preceding siblings ...)
  2002-12-17  2:51 ` David Mosberger
@ 2002-12-17  3:19 ` David Mosberger
  2002-12-17  3:20 ` Keith Owens
                   ` (7 subsequent siblings)
  14 siblings, 0 replies; 16+ messages in thread
From: David Mosberger @ 2002-12-17  3:19 UTC (permalink / raw)
  To: linux-ia64

  David> Which compiler did you use?  With gcc-3.0, I get the info
  David> attached below.  It looks correct to me (I only checked the
  David> total length, not the individual regions).

Typo-alert: make that gcc-3.1 (not gcc-3.0).

	--david


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [Linux-ia64] Re: gas generates incorrect ia64 unwind rlen values
  2002-12-16  9:00 [Linux-ia64] Re: gas generates incorrect ia64 unwind rlen values Keith Owens
                   ` (6 preceding siblings ...)
  2002-12-17  3:19 ` David Mosberger
@ 2002-12-17  3:20 ` Keith Owens
  2002-12-17  3:25 ` David Mosberger
                   ` (6 subsequent siblings)
  14 siblings, 0 replies; 16+ messages in thread
From: Keith Owens @ 2002-12-17  3:20 UTC (permalink / raw)
  To: linux-ia64

On Mon, 16 Dec 2002 18:51:53 -0800, 
David Mosberger <davidm@napali.hpl.hp.com> wrote:
>>>>>> On Tue, 17 Dec 2002 13:34:03 +1100, Keith Owens <kaos@sgi.com> said:
>
>  Keith> I built binutils-2.13.90.0.2-2 (from rh 8.0) on ia64.  I
>  Keith> extracted the generated assembler for ia64_fault as traps.S.
>  Keith> The bug still exists in 2.13.90.0.2.  traps.S has been sent
>  Keith> to Jim Wilson as a test case.
>
>Which compiler did you use?

I used gcc 2.96 20000731 (Red Hat Linux 7.1 2.96-101) to convert
traps.c to traps.S, then extracted the headers and ia64_fault for
testing against gas.  traps.S only has one body.  I wanted to avoid
dumping 530+ lines to the list but ...

Interesting that a different gcc which generates two bodies gets valid
unwind data, but this code with only one body generates invalid unwind
data.  David, what does your unwind data look like after assembling
this code?

	.file	"traps.c"
	.pred.safe_across_calls p1-p5,p16-p63
.text
	.align 16
	.align 32
	.global ia64_fault#
	.proc ia64_fault#
ia64_fault:
	.prologue 12, 37
	.save ar.pfs, r38
	alloc r38 = ar.pfs, 4, 3, 5, 0
	.fframe 256
	adds r12 = -256, r12
	movl r14 = 34359738383
	.save rp, r37
	mov r37 = b0
	;;
	.body
	and r14 = r14, r33
	movl r15 = 34359738372
	;;
	cmp.ne p6, p7 = r15, r14
	adds r14 = 272, r12
	;;
	(p7) movl r15 = 8796093022208
	mov r36 = r14
	(p7) ld8 r14 = [r14]
	;;
	(p7) or r14 = r15, r14
	(p7) mov r15 = r36
	;;
	(p7) st8 [r15] = r14
	(p7) br.cond.dpnt .L2880
	adds r15 = -24, r32
	;;
	cmp.ltu p6, p7 = 23, r15
	(p6) br.cond.dptk .L2936
	addl r14 = @ltoff(.L2937), gp
	;;
	ld8 r14 = [r14]
	;;
	shladd r16 = r15, 3, r14
	;;
	ld8 r15 = [r16]
	;;
	add r15 = r15, r14
	;;
	mov b6 = r15
	br b6
	.align 8
.L2937:
	data8 .L2883-.L2937
	data8 .L2889-.L2937
	data8 .L2903-.L2937
	data8 .L2936-.L2937
	data8 .L2936-.L2937
	data8 .L2915-.L2937
	data8 .L2936-.L2937
	data8 .L2911-.L2937
	data8 .L2926-.L2937
	data8 .L2926-.L2937
	data8 .L2929-.L2937
	data8 .L2915-.L2937
	data8 .L2915-.L2937
	data8 .L2936-.L2937
	data8 .L2936-.L2937
	data8 .L2936-.L2937
	data8 .L2936-.L2937
	data8 .L2936-.L2937
	data8 .L2936-.L2937
	data8 .L2936-.L2937
	data8 .L2936-.L2937
	data8 .L2931-.L2937
	data8 .L2933-.L2937
	data8 .L2935-.L2937
	.align 16
.L2883:
	extr.u r35 = r33, 4, 4
	addl r14 = @ltoff(reason.3#), gp
	adds r34 = 144, r12
	;;
	cmp.ne p6, p7 = 3, r35
	ld8 r14 = [r14]
	mov r39 = r34
	;;
	shladd r14 = r35, 3, r14
	(p6) addl r42 = @ltoff(.LC31), gp
	;;
	ld8 r41 = [r14]
	(p6) ld8 r42 = [r42]
	(p6) br.cond.dptk .L2885
	tbit.z p6, p7 = r33, 37
	;;
	(p7) addl r42 = @ltoff(.LC29), gp
	;;
	(p7) ld8 r42 = [r42]
	(p6) addl r42 = @ltoff(.LC30), gp
	;;
	(p6) ld8 r42 = [r42]
.L2885:
	addl r40 = @ltoff(.LC28), gp
	;;
	ld8 r40 = [r40]
	br.call.sptk.many b0 = sprintf#
	;;
	cmp.ne p6, p7 = 8, r35
	(p6) br.cond.dptk .L2882
	adds r15 = 64, r36
	adds r14 = 8, r36
	addl r39 = @ltoff(.LC32), gp
	;;
	ld8 r40 = [r14]
	ld8 r41 = [r15]
	ld8 r39 = [r39]
	br.call.sptk.many b0 = printk#
	;;
	br .L2880
.L2889:
	tbit.z p6, p7 = r33, 1
	(p6) br.cond.dpnt .L2890
	ld8 r14 = [r36]
	addl r15 = -524289, r0
	;;
	and r14 = r15, r14
	;;
	st8 [r36] = r14
#APP
	mov ar.k5=r13
#NO_APP
	adds r14 = 1496, r13
	;;
	ld4 r15 = [r14]
	;;
	tbit.z p6, p7 = r15, 0
	(p6) br.cond.dpnt .L2901
	adds r39 = 2272, r13
	br.call.sptk.many b0 = __ia64_load_fpu#
	;;
	ld8 r14 = [r36]
	;;
	and r14 = -33, r14
	;;
	st8 [r36] = r14
	br .L2880
.L2901:
	br.call.sptk.many b0 = __ia64_init_fpu#
	;;
	ld8 r14 = [r36]
	;;
	or r14 = 32, r14
	;;
	st8 [r36] = r14
	br .L2880
.L2890:
	adds r34 = 144, r12
	addl r40 = @ltoff(.LC33), gp
	br .L2938
.L2903:
	ld8 r17 = [r36]
	;;
	mov r15 = r17
	;;
	extr.u r14 = r15, 32, 2
	;;
	cmp4.eq p6, p7 = 0, r14
	(p6) br.cond.dpnt .L2904
	extr.u r14 = r33, 4, 4
	adds r17 = 8, r36
	extr.u r15 = r15, 41, 2
	;;
	cmp.ne p6, p7 = 2, r14
	adds r16 = 20, r12
	adds r18 = 44, r12
	;;
	(p7) addl r39 = 11, r0
	adds r14 = 16, r12
	(p7) addl r35 = 196610, r0
	(p6) addl r39 = 4, r0
	(p6) addl r35 = 196610, r0
	mov r41 = r13
	;;
	st4 [r14] = r39
	adds r14 = 24, r12
	;;
	st4 [r14] = r35
	ld8 r14 = [r17]
	st4 [r16] = r0
	;;
	add r14 = r14, r15
	adds r17 = 32, r12
	;;
	st8 [r17] = r14
	adds r15 = 40, r12
	addl r16 = 1, r0
	;;
	st4 [r15] = r32
	adds r14 = 48, r12
	adds r15 = 16, r12
	st4 [r18] = r16
	;;
	mov r40 = r15
	st8 [r14] = r33
	br.call.sptk.many b0 = force_sig_info#
	;;
	br .L2880
.L2904:
	adds r14 = 8, r36
	;;
	ld8 r39 = [r14]
	br.call.sptk.many b0 = search_exception_table#
	;;
	cmp.eq p6, p7 = 0, r8
	;;
	(p6) mov r14 = r0
	(p6) br.cond.dpnt .L2910
	mov r40 = r8
	mov r39 = r36
	br.call.sptk.many b0 = handle_exception#
	;;
	addl r14 = 1, r0
	;;
.L2910:
	cmp4.eq p6, p7 = 0, r14
	(p7) br.cond.dptk .L2880
	adds r34 = 144, r12
	addl r40 = @ltoff(.LC34), gp
	br .L2938
.L2911:
	ld8 r17 = [r36]
	;;
	extr.u r14 = r17, 32, 2
	;;
	cmp4.eq p6, p7 = 0, r14
	(p6) br.cond.dpnt .L2912
	adds r14 = 16, r12
	addl r39 = 4, r0
	adds r16 = 24, r12
	;;
	st4 [r14] = r39
	adds r18 = 8, r36
	extr.u r17 = r17, 41, 2
	addl r14 = 196610, r0
	mov r41 = r13
	;;
	st4 [r16] = r14
	ld8 r15 = [r18]
	adds r14 = 20, r12
	adds r16 = 40, r12
	;;
	st4 [r14] = r0
	add r15 = r15, r17
	adds r14 = 32, r12
	;;
	st8 [r14] = r15
	st4 [r16] = r32
	adds r15 = 44, r12
	addl r14 = 1, r0
	;;
	st4 [r15] = r14
	adds r16 = 48, r12
	adds r15 = 16, r12
	;;
	st8 [r16] = r33
	br .L2939
.L2912:
	adds r34 = 144, r12
	addl r40 = @ltoff(.LC35), gp
	br .L2938
.L2915:
	cmp.eq p6, p7 = 35, r32
	;;
	(p6) adds r15 = 24, r12
	(p6) addl r14 = 196611, r0
	(p6) mov r34 = r0
	;;
	(p6) st4 [r15] = r14
	(p6) ld8 r17 = [r36]
	(p6) br.cond.dpnt .L2916
	cmp.ltu p6, p7 = 35, r32
	(p6) br.cond.dptk .L2923
	;;
	cmp.eq p6, p7 = 29, r32
	(p6) br.cond.dpnt .L2917
	ld8 r17 = [r36]
	br .L2916
	;;
.L2923:
	cmp.eq p6, p7 = 36, r32
	;;
	(p6) adds r15 = 24, r12
	(p6) addl r14 = 196610, r0
	(p6) mov r34 = r0
	;;
	(p6) st4 [r15] = r14
	(p6) ld8 r17 = [r36]
	(p6) br.cond.dpnt .L2916
	;;
	ld8 r17 = [r36]
	br .L2916
.L2917:
	addl r14 = 196612, r0
	;;
	ld8 r17 = [r36]
	adds r15 = 24, r12
	;;
	st4 [r15] = r14
	tbit.nz p6, p7 = r17, 34
	;;
	(p7) adds r14 = 8, r36
	;;
	(p7) ld8 r34 = [r14]
.L2916:
	extr.u r14 = r17, 32, 2
	;;
	cmp4.ne p6, p7 = 0, r14
	(p6) br.cond.dptk .L2924
	mov r40 = r32
	mov r41 = r36
	addl r39 = 4, r0
	br.call.sptk.many b0 = kdb#
	;;
	cmp4.eq p6, p7 = 0, r8
	(p7) br.cond.dptk .L2880
.L2924:
	adds r16 = 16, r12
	addl r39 = 5, r0
	adds r15 = 44, r12
	;;
	mov r14 = r16
	adds r17 = 48, r12
	adds r18 = 32, r12
	;;
	st4 [r14] = r39, 4
	adds r16 = 40, r12
	mov r41 = r13
	;;
	st4 [r14] = r0
	st4 [r15] = r0
	adds r14 = 16, r12
	st8 [r17] = r0
	;;
	mov r40 = r14
	st8 [r18] = r34
	br .L2940
.L2926:
	cmp.eq p6, p7 = 32, r32
	;;
	mov r40 = r36
	mov r41 = r33
	(p6) addl r39 = 1, r0
	(p7) mov r39 = r0
	br.call.sptk.many b0 = handle_fpu_swa#
	;;
	cmp4.gt p6, p7 = r0, r8
	(p6) br.cond.dpnt .L2928
	adds r14 = 1496, r13
	;;
	ld8 r15 = [r14]
	;;
	tbit.nz p6, p7 = r15, 7
	(p7) br.cond.dpnt .L2880
.L2928:
	adds r15 = 16, r12
	addl r39 = 8, r0
	adds r17 = 8, r36
	;;
	mov r14 = r15
	adds r18 = 24, r12
	mov r41 = r13
	ld8 r15 = [r36]
	;;
	st4 [r14] = r39, 4
	extr.u r15 = r15, 41, 2
	;;
	st4 [r14] = r0
	ld8 r16 = [r17]
	addl r14 = 196615, r0
	;;
	st4 [r18] = r14
	add r16 = r16, r15
	adds r17 = 32, r12
	;;
	st8 [r17] = r16
	addl r14 = 1, r0
	adds r15 = 44, r12
	;;
	st4 [r15] = r14
	adds r18 = 48, r12
	adds r16 = 40, r12
	adds r14 = 16, r12
	;;
	st8 [r18] = r33
	mov r40 = r14
.L2940:
	st4 [r16] = r0
	br.call.sptk.many b0 = force_sig_info#
	;;
	br .L2880
.L2929:
	ld8 r20 = [r36]
	;;
	extr.u r14 = r20, 32, 2
	;;
	cmp4.eq p6, p7 = 0, r14
	(p6) br.cond.dpnt .L2930
	adds r15 = 16, r12
	addl r39 = 4, r0
	adds r16 = 24, r12
	;;
	st4 [r15] = r39
	addl r14 = 196617, r0
	adds r17 = 20, r12
	;;
	st4 [r16] = r14
	adds r15 = 8, r36
	adds r18 = 44, r12
	st4 [r17] = r0
	adds r19 = 48, r12
	extr.u r16 = r20, 41, 2
	;;
	ld8 r14 = [r15]
	mov r41 = r13
	st4 [r18] = r0
	adds r15 = 40, r12
	;;
	add r14 = r14, r16
	st8 [r19] = r0
	adds r16 = 32, r12
	st4 [r15] = r0
	adds r15 = 16, r12
	;;
	st8 [r16] = r14
.L2939:
	mov r40 = r15
	br.call.sptk.many b0 = force_sig_info#
	;;
	br .L2880
.L2930:
	adds r34 = 144, r12
	addl r40 = @ltoff(.LC36), gp
	;;
.L2938:
	mov r39 = r34
	ld8 r40 = [r40]
	br.call.sptk.many b0 = sprintf#
	;;
	br .L2882
.L2931:
	mov r39 = r36
	mov r40 = r33
	br.call.sptk.many b0 = ia32_exception#
	;;
	cmp4.ne p6, p7 = 0, r8
	(p7) br.cond.dpnt .L2880
	addl r39 = @ltoff(.LC37), gp
	;;
	ld8 r39 = [r39]
	br.call.sptk.many b0 = printk#
	;;
	addl r39 = @ltoff(.LC38), gp
	adds r14 = 8, r36
	mov r41 = r34
	;;
	ld8 r40 = [r14]
	ld8 r39 = [r39]
	mov r42 = r33
	br.call.sptk.many b0 = printk#
	;;
	addl r39 = 11, r0
	mov r40 = r13
	br.call.sptk.many b0 = force_sig#
	;;
	adds r34 = 144, r12
	br .L2882
.L2933:
	mov r39 = r36
	mov r40 = r33
	br.call.sptk.many b0 = ia32_intercept#
	;;
	cmp4.ne p6, p7 = 0, r8
	(p7) br.cond.dpnt .L2880
	addl r39 = @ltoff(.LC39), gp
	;;
	ld8 r39 = [r39]
	br.call.sptk.many b0 = printk#
	;;
	adds r14 = 8, r36
	addl r39 = @ltoff(.LC40), gp
	mov r41 = r34
	;;
	ld8 r40 = [r14]
	ld8 r39 = [r39]
	mov r42 = r33
	mov r43 = r35
	br.call.sptk.many b0 = printk#
	;;
	addl r39 = 11, r0
	mov r40 = r13
	br.call.sptk.many b0 = force_sig#
	;;
	br .L2880
.L2935:
	adds r34 = 144, r12
	addl r40 = @ltoff(.LC41), gp
	shr.u r41 = r33, 16
	;;
	mov r39 = r34
	ld8 r40 = [r40]
	br.call.sptk.many b0 = sprintf#
	;;
	br .L2882
.L2936:
	adds r34 = 144, r12
	addl r40 = @ltoff(.LC42), gp
	mov r41 = r32
	;;
	mov r39 = r34
	ld8 r40 = [r40]
	br.call.sptk.many b0 = sprintf#
	;;
.L2882:
	mov r39 = r34
	mov r40 = r36
	mov r41 = r33
	br.call.sptk.many b0 = die_if_kernel#
	;;
	addl r39 = 4, r0
	mov r40 = r13
	br.call.sptk.many b0 = force_sig#
	;;
.L2880:
	mov ar.pfs = r38
	mov b0 = r37
	.restore sp
	adds r12 = 256, r12
	br.ret.sptk.many b0
	.endp ia64_fault#



^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [Linux-ia64] Re: gas generates incorrect ia64 unwind rlen values
  2002-12-16  9:00 [Linux-ia64] Re: gas generates incorrect ia64 unwind rlen values Keith Owens
                   ` (7 preceding siblings ...)
  2002-12-17  3:20 ` Keith Owens
@ 2002-12-17  3:25 ` David Mosberger
  2002-12-17  3:43 ` Keith Owens
                   ` (5 subsequent siblings)
  14 siblings, 0 replies; 16+ messages in thread
From: David Mosberger @ 2002-12-17  3:25 UTC (permalink / raw)
  To: linux-ia64

  Keith> I used gcc 2.96 20000731 (Red Hat Linux 7.1 2.96-101) to
  Keith> convert traps.c to traps.S, then extracted the headers and
  Keith> ia64_fault for testing against gas.  traps.S only has one
  Keith> body.  I wanted to avoid dumping 530+ lines to the list but
  Keith> ...

  Keith> Interesting that a different gcc which generates two bodies
  Keith> gets valid unwind data, but this code with only one body
  Keith> generates invalid unwind data.  David, what does your unwind
  Keith> data look like after assembling this code?

Why do you insist on re-discovering old bugs?  For the code in
question, the problem is caused by the jump-table generated for the
switch-statement.  gcc 2.9x placed jump-tables in the text section,
which violates the ia64 ABI and also confuses the assembler.

	--david


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [Linux-ia64] Re: gas generates incorrect ia64 unwind rlen values
  2002-12-16  9:00 [Linux-ia64] Re: gas generates incorrect ia64 unwind rlen values Keith Owens
                   ` (8 preceding siblings ...)
  2002-12-17  3:25 ` David Mosberger
@ 2002-12-17  3:43 ` Keith Owens
  2002-12-17 16:33 ` Patil, Harish
                   ` (4 subsequent siblings)
  14 siblings, 0 replies; 16+ messages in thread
From: Keith Owens @ 2002-12-17  3:43 UTC (permalink / raw)
  To: linux-ia64

On Mon, 16 Dec 2002 19:25:39 -0800, 
David Mosberger <davidm@napali.hpl.hp.com> wrote:
>Why do you insist on re-discovering old bugs?  For the code in
>question, the problem is caused by the jump-table generated for the
>switch-statement.  gcc 2.9x placed jump-tables in the text section,
>which violates the ia64 ABI and also confuses the assembler.

Which version of gcc to use is not my decision, I have to use 2.96 :(.
Thanks anyway.



^ permalink raw reply	[flat|nested] 16+ messages in thread

* [Linux-ia64] Re: gas generates incorrect ia64 unwind rlen values
  2002-12-16  9:00 [Linux-ia64] Re: gas generates incorrect ia64 unwind rlen values Keith Owens
                   ` (9 preceding siblings ...)
  2002-12-17  3:43 ` Keith Owens
@ 2002-12-17 16:33 ` Patil, Harish
  2002-12-19 20:19 ` David Mosberger
                   ` (3 subsequent siblings)
  14 siblings, 0 replies; 16+ messages in thread
From: Patil, Harish @ 2002-12-17 16:33 UTC (permalink / raw)
  To: linux-ia64

>>>>> Mon, 16 Dec 2002 14:08:43 -0800, David Mosberger
<davidm@napali.hpl.hp.com> said:
> There have been many unwind-related bug fixes to the toolchain.  It's
> one reason why 2.9x is hopelessly obsolete.  Distros should really
> switch to gcc-3.2.
>	--david

David:

I have a RHAS kernel compiled with *gcc3.2*. Using a script based on
readelf/objdmp I found out that there are 7 instances in this kernel where
'rlen' may be wrong. The invariant the script is looking for is this:
	Sum(rlen for various regions) = Number of slots in the code range.

The script found following violations of the invariant:

<ia64_trace_syscall>: [0xe00000000440e1a0-0xe00000000440e240), info at
+0x54cdd8
        lo =  440E1A0  hi = 440E240
        sum_rlen =  28 no_slots = 30
            *******ERROR ***********
            sum_rlen: 28  != no_slots:30
<ia64_ret_from_clone>: [0xe00000000440e240-0xe00000000440e270), info at
+0x54ce08
        lo =  440E240  hi = 440E270
        sum_rlen =  7 no_slots = 9
            *******ERROR ***********
            sum_rlen: 7  != no_slots:9
<ia64_prepare_handle_unaligned>: [0xe00000000440e7a0-0xe00000000440e800),
info at +0x54cf70
        lo =  440E7A0  hi = 440E800
        sum_rlen =  17 no_slots = 18
            *******ERROR ***********
            sum_rlen: 17  != no_slots:18
<ia32_ret_from_clone>: [0xe0000000044506a0-0xe0000000044506d0), info at
+0x54fd00
        lo =  44506A0  hi = 44506D0
        sum_rlen =  7 no_slots = 9
            *******ERROR ***********
            sum_rlen: 7  != no_slots:9
<memset>: [0xe0000000049338a0-0xe000000004933cc0), info at +0x5803d0
        lo =  49338A0  hi = 4933CC0
        sum_rlen =  195 no_slots = 198
            *******ERROR ***********
            sum_rlen: 195  != no_slots:198
<memcpy>: [0xe0000000049365a0-0xe000000004936a40), info at +0x580618
        lo =  49365A0  hi = 4936A40
        sum_rlen =  219 no_slots = 222
            *******ERROR ***********
            sum_rlen: 219  != no_slots:222
code_range= 0xe000000004b18000-0xe000000004b182b0
        lo =  4B18000  hi = 4B182B0
        sum_rlen =  130 no_slots = 129
            *******ERROR ***********
            sum_rlen: 130  != no_slots:129

-Harish



^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [Linux-ia64] Re: gas generates incorrect ia64 unwind rlen values
  2002-12-16  9:00 [Linux-ia64] Re: gas generates incorrect ia64 unwind rlen values Keith Owens
                   ` (10 preceding siblings ...)
  2002-12-17 16:33 ` Patil, Harish
@ 2002-12-19 20:19 ` David Mosberger
  2002-12-20  1:46 ` [Linux-ia64] Re: gas generates incorrect ia64 unwind rlen val Patil, Harish
                   ` (2 subsequent siblings)
  14 siblings, 0 replies; 16+ messages in thread
From: David Mosberger @ 2002-12-19 20:19 UTC (permalink / raw)
  To: linux-ia64

>>>>> On Tue, 17 Dec 2002 08:33:38 -0800, "Patil, Harish" <harish.patil@intel.com> said:

  Harish> I have a RHAS kernel compiled with *gcc3.2*. Using a script
  Harish> based on readelf/objdmp I found out that there are 7
  Harish> instances in this kernel where 'rlen' may be wrong. The
  Harish> invariant the script is looking for is this: Sum(rlen for
  Harish> various regions) = Number of slots in the code range.

  Harish> The script found following violations of the invariant:

  Harish> <ia64_trace_syscall>:
  Harish> <ia64_ret_from_clone>:
  Harish> <ia64_prepare_handle_unaligned>:
  Harish> <ia32_ret_from_clone>:
  Harish> <memset>:
  Harish> <memcpy>:

These are all handwritten assembly routines.  I think I see what's wrong:

 (a) for the first 4 routines, note how they all start with an empty
     prologue (e.g., PT_REGS_UNWIND_INFO(0)); these empty prologues
     seem to cause gas to not count the "nop"s at the beginning of the
     code. Or perhaps gas never counts the starting "nop"s and this is
     just one of the places where the first instruction cannot go into
     the first slot of a bundle.

 (b) for memcpy and memset, I suspect the ".align 32" directives are
     confusing gas

(a) is probably a bug in gas.  For (b), gas can't guarantee much
because (in general) it can't know the alignment of the first
instruction of a procedure (not beyond the minimum of 16 bytes).  We
should fix the assembly source here (use label_state/copy_state around
the .align directives, or get rid of them alltogether).  One thing we
could do in gas, however, is add a warning so that a programmer will
know when s/he accidentally uses a .align directive inside a region.

  Harish> code_range= 0xe000000004b18000-0xe000000004b182b0
  Harish>         lo =  4B18000  hi = 4B182B0
  Harish>         sum_rlen =  130 no_slots = 129
  Harish>             *******ERROR ***********
  Harish>             sum_rlen: 130  != no_slots:129

Do you know what code this is?  The addresses are not terribly useful
because they'll vary from one kernel to another.

Is your script fully automatic?  If so, perhaps we could add it to the
kernel sources and run it as part of "make check".  I'd love to have
better unwind-info checking tools.  Actually, it's even more important
to use such tools to verify the correctness of the user-level unwind
info.

Someone wants to volunteer to fix this stuff?

	--david


^ permalink raw reply	[flat|nested] 16+ messages in thread

* RE: [Linux-ia64] Re: gas generates incorrect ia64 unwind rlen val
  2002-12-16  9:00 [Linux-ia64] Re: gas generates incorrect ia64 unwind rlen values Keith Owens
                   ` (11 preceding siblings ...)
  2002-12-19 20:19 ` David Mosberger
@ 2002-12-20  1:46 ` Patil, Harish
  2003-01-18  2:30 ` David Mosberger
  2003-03-07 22:28 ` [Linux-ia64] Re: gas generates incorrect ia64 unwind rlen val ues Bjorn Helgaas
  14 siblings, 0 replies; 16+ messages in thread
From: Patil, Harish @ 2002-12-20  1:46 UTC (permalink / raw)
  To: linux-ia64

> From: David Mosberger [mailto:davidm@napali.hpl.hp.com]
> Sent: Thursday, December 19, 2002 3:19 PM
> To: Patil, Harish
> Cc: 'davidm@hpl.hp.com'; 'linux-ia64@linuxia64.org'
> Subject: Re: [Linux-ia64] Re: gas generates incorrect ia64 unwind rlen
> values
> 
> 
> >>>>> On Tue, 17 Dec 2002 08:33:38 -0800, "Patil, Harish" 
> <harish.patil@intel.com> said:
> 
>   Harish> I have a RHAS kernel compiled with *gcc3.2*. Using a script
>   Harish> based on readelf/objdmp I found out that there are 7
>   Harish> instances in this kernel where 'rlen' may be wrong. The
>   Harish> invariant the script is looking for is this: Sum(rlen for
>   Harish> various regions) = Number of slots in the code range.
> 
>   Harish> The script found following violations of the invariant:

<stuff deleted>

> 
>   Harish> code_range= 0xe000000004b18000-0xe000000004b182b0
>   Harish>         lo =  4B18000  hi = 4B182B0
>   Harish>         sum_rlen =  130 no_slots = 129
>   Harish>             *******ERROR ***********
>   Harish>             sum_rlen: 130  != no_slots:129
> 
> Do you know what code this is?  The addresses are not terribly useful
> because they'll vary from one kernel to another.

Sorry, the procedure name somehow got lost.. I disassembled the image and
the relevant procedure is:  <ia64_sigtramp>

> Is your script fully automatic?  If so, perhaps we could add it to the
> kernel sources and run it as part of "make check".  I'd love to have
> better unwind-info checking tools.  Actually, it's even more important
> to use such tools to verify the correctness of the user-level unwind
> info.

Yes, the script is fully automatic and is included below (requires a
'readelf' that 
understands "-u" option).

-Harish
<----------- BEGIN unwcheck.sh
#!/bin/sh 
#   Usage: unwcheck.sh <executable_file_name>
#   Pre-requisite: readelf [from Gnu binutils package]
#   Purpose: Check the following invariant
#       For each code range in the input binary:
#          Sum[ lengths of unwind regions] = Number of slots in code range.
#   Author : Harish Patil
#   First version: January 2002
#   Modified : 2/13/2002
#   Modified : 3/15/2002: duplicate detection
readelf -u $1 | gawk '\
 function todec(hexstr){
    dec = 0;
    l = length(hexstr);
    for (i = 1; i <= l; i++)
    {
        c = substr(hexstr, i, 1);
        if (c = "A")
            dec = dec*16 + 10;
        else if (c = "B")
            dec = dec*16 + 11;
        else if (c = "C")
            dec = dec*16 + 12;
        else if (c = "D")
            dec = dec*16 + 13;
        else if (c = "E")
            dec = dec*16 + 14;
        else if (c = "F")
            dec = dec*16 + 15;
        else 
            dec = dec*16 + c;
    }
    return dec;
 }
 BEGIN { first = 1; sum_rlen = 0; no_slots = 0; errors=0; no_code_ranges=0;
}
 {
   if (NF=5 && $3="info")
   {
      no_code_ranges += 1;
      if (first = 0)
      {
         if (sum_rlen != no_slots) 
         {
            print full_code_range;
            print "       ", "lo = ", lo, " hi =", hi;
            print "       ", "sum_rlen = ", sum_rlen, "no_slots = "
no_slots;
            print "       ","   ", "*******ERROR ***********";
            print "       ","   ", "sum_rlen:", sum_rlen, " != no_slots:"
no_slots;
            errors += 1;
         }
         sum_rlen = 0;
      }
      full_code_range =  $0;
      code_range =  $2;
      gsub("),", "", code_range);
      gsub("^.", "", code_range);
      split(code_range, addr, "-");
      lo = toupper(addr[1]);

      code_range_lo[no_code_ranges] = addr[1];
      occurs[addr[1]] += 1;
      full_range[addr[1]] = $0;

      gsub("0X.[0]*", "", lo);
      hi = toupper(addr[2]);
      gsub("0X.[0]*", "", hi);
      no_slots = (todec(hi) - todec(lo))/ 16*3
      first = 0;
   }
   if (index($0,"rlen") > 0 )
   {
    rlen_str =  substr($0, index($0,"rlen"));
    rlen = rlen_str;
    gsub("rlen=", "", rlen);
    gsub(")", "", rlen);
    sum_rlen = sum_rlen +  rlen;
   }
  }
  END {
      if (first = 0)
      {
         if (sum_rlen != no_slots) 
         {
            print "code_range=", code_range;
            print "       ", "lo = ", lo, " hi =", hi;
            print "       ", "sum_rlen = ", sum_rlen, "no_slots = "
no_slots;
            print "       ","   ", "*******ERROR ***********";
            print "       ","   ", "sum_rlen:", sum_rlen, " != no_slots:"
no_slots;
            errors += 1;
         }
      }
    no_duplicates = 0;
    for (i=1; i<=no_code_ranges; i++)
    {
        cr = code_range_lo[i];
        if (reported_cr[cr]=1) continue;
        if ( occurs[cr] > 1)
        {
            reported_cr[cr] = 1;
            print "Code range low ", code_range_lo[i], ":", full_range[cr],
" occurs: ", occurs[cr], " times.";
            print " ";
            no_duplicates++;
        }
    }
    print "==================="
    print "Total errors:", errors, "/", no_code_ranges, " duplicates:",
no_duplicates;
    print "==================="
  }
  '
---> END unwcheck.sh [note the "'" (single quote) on the last line ]


^ permalink raw reply	[flat|nested] 16+ messages in thread

* RE: [Linux-ia64] Re: gas generates incorrect ia64 unwind rlen val
  2002-12-16  9:00 [Linux-ia64] Re: gas generates incorrect ia64 unwind rlen values Keith Owens
                   ` (12 preceding siblings ...)
  2002-12-20  1:46 ` [Linux-ia64] Re: gas generates incorrect ia64 unwind rlen val Patil, Harish
@ 2003-01-18  2:30 ` David Mosberger
  2003-03-07 22:28 ` [Linux-ia64] Re: gas generates incorrect ia64 unwind rlen val ues Bjorn Helgaas
  14 siblings, 0 replies; 16+ messages in thread
From: David Mosberger @ 2003-01-18  2:30 UTC (permalink / raw)
  To: linux-ia64

>>>>> On Thu, 19 Dec 2002 17:46:54 -0800, "Patil, Harish" <harish.patil@intel.com> said:

  >> From: David Mosberger [mailto:davidm@napali.hpl.hp.com]
  >> Sent: Thursday, December 19, 2002 3:19 PM
  >> To: Patil, Harish
  >> Cc: 'davidm@hpl.hp.com'; 'linux-ia64@linuxia64.org'
  >> Subject: Re: [Linux-ia64] Re: gas generates incorrect ia64 unwind rlen
  >> values

  >> Is your script fully automatic?  If so, perhaps we could add it to the
  >> kernel sources and run it as part of "make check".  I'd love to have
  >> better unwind-info checking tools.  Actually, it's even more important
  >> to use such tools to verify the correctness of the user-level unwind
  >> info.

  Harish> Yes, the script is fully automatic and is included below (requires a
  Harish> 'readelf' that understands "-u" option).

OK, I checked this script into arch/ia64/scripts/unwcheck.sh now.  I
had to hack it a bit because readelf v2.13.90.0.10 generates the
code-ranges in the format:

	[0xe000000004408000-0xe000000004408230],

Which isn't what the script expected.

I also fixed the handful of problems it pointed out.  I agree that
those are really gas bugs (except perhaps for the unwind info in
gate.S, which was a bit clunky).  But for now, I fixed things by
adding explicit nop's and commenting out .align directives.  The
removal of .align may cost us a cycle or two in some routines, but I
don't it's noticable in practice.

Thanks,

	--david


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [Linux-ia64] Re: gas generates incorrect ia64 unwind rlen val ues
  2002-12-16  9:00 [Linux-ia64] Re: gas generates incorrect ia64 unwind rlen values Keith Owens
                   ` (13 preceding siblings ...)
  2003-01-18  2:30 ` David Mosberger
@ 2003-03-07 22:28 ` Bjorn Helgaas
  14 siblings, 0 replies; 16+ messages in thread
From: Bjorn Helgaas @ 2003-03-07 22:28 UTC (permalink / raw)
  To: linux-ia64

On Friday 17 January 2003 7:30 pm, David Mosberger wrote:
> OK, I checked this script into arch/ia64/scripts/unwcheck.sh now. 
> ...
> I also fixed the handful of problems it pointed out.  I agree that
> those are really gas bugs (except perhaps for the unwind info in
> gate.S, which was a bit clunky).  But for now, I fixed things by
> adding explicit nop's and commenting out .align directives.  The
> removal of .align may cost us a cycle or two in some routines, but I
> don't it's noticable in practice.

I applied these changes to 2.4 as well.


^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2003-03-07 22:28 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2002-12-16  9:00 [Linux-ia64] Re: gas generates incorrect ia64 unwind rlen values Keith Owens
2002-12-16 22:12 ` Keith Owens
2002-12-16 22:12 ` David Mosberger
2002-12-16 22:16 ` David Mosberger
2002-12-16 23:10 ` Jim Wilson
2002-12-17  2:34 ` Keith Owens
2002-12-17  2:51 ` David Mosberger
2002-12-17  3:19 ` David Mosberger
2002-12-17  3:20 ` Keith Owens
2002-12-17  3:25 ` David Mosberger
2002-12-17  3:43 ` Keith Owens
2002-12-17 16:33 ` Patil, Harish
2002-12-19 20:19 ` David Mosberger
2002-12-20  1:46 ` [Linux-ia64] Re: gas generates incorrect ia64 unwind rlen val Patil, Harish
2003-01-18  2:30 ` David Mosberger
2003-03-07 22:28 ` [Linux-ia64] Re: gas generates incorrect ia64 unwind rlen val ues Bjorn Helgaas

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox