All of lore.kernel.org
 help / color / mirror / Atom feed
* Another gcc 3.4 fix
@ 2004-05-12  5:27 Mathieu Chouquet-Stringer
  2004-05-12 18:32 ` David S. Miller
                   ` (5 more replies)
  0 siblings, 6 replies; 7+ messages in thread
From: Mathieu Chouquet-Stringer @ 2004-05-12  5:27 UTC (permalink / raw)
  To: sparclinux

Ok, one more problem while using gcc 3.4.0. It has a "nice" feature called
"unit-at-a-time compilation", basically files are better "optimized" than
before (you can read more about it here:
http://gcc.gnu.org/gcc-3.4/changes.html).

In our case, the end result is some asm volatile statement gets whacked and
the linking then fails:

arch/sparc64/kernel/built-in.o(__ex_table+0x3c4): undefined reference to `kernel_unaligned_trap_fault'
arch/sparc64/kernel/built-in.o(__ex_table+0x3cc): undefined reference to `kernel_unaligned_trap_fault'
arch/sparc64/kernel/built-in.o(__ex_table+0x3d4): undefined reference to `kernel_unaligned_trap_fault'
arch/sparc64/kernel/built-in.o(__ex_table+0x3dc): undefined reference to `kernel_unaligned_trap_fault'
arch/sparc64/kernel/built-in.o(__ex_table+0x3e4): undefined reference to `kernel_unaligned_trap_fault'
arch/sparc64/kernel/built-in.o(__ex_table+0x3ec): more undefined references to `kernel_unaligned_trap_fault' follow

I checked the output of gcc 3.4.0 for unaligned.c and here's what I had:
                 U 
                 U 
                 U 
                 U __bzero
0000000000000140 t compute_effective_address
                 U current_thread_info_reg
                 U data_access_exception
                 U die_if_kernel
                 U do_fpother
                 U do_privact
0000000000000000 t fetch_reg
00000000000000c0 t fetch_reg_addr
                 U __flushw_user
0000000000000d80 T handle_lddfmna
00000000000008a0 T handle_ldf_stq
0000000000000c40 T handle_ld_nf
0000000000000700 T handle_popc
0000000000000f80 T handle_stdfmna
0000000000000260 T kernel_mna_trap_fault
0000000000000360 T kernel_unaligned_trap
                 U kernel_unaligned_trap_fault
                 U __memcpy
                 U panic
0000000000000000 d popc_helper
                 U printk
                 U search_extables_range
                 U VISenter

See how kernel_unaligned_trap_fault is undefined? Obviously it
shouldn't...

I was trying to fix this but couldn't get the whole file to compile at all.
At the same time, I checked the output of gcc 3.3.3 (which is known to
work) and realized another function was missing: unaligned_panic.  

This one was easy, I just added __attribute_used__ to the function
declaration. To my surprise, it also solved the kernel_unaligned_trap_fault
issue, which I don't get: does it mean the first part of 
"if (!ok_for_kernel(insn) || dir = both) {"
in function kernel_unaligned_trap was removed too???

So with the patch attached, here's the correct output:
                 U 
                 U 
                 U 
                 U __bzero
0000000000000140 t compute_effective_address
                 U current_thread_info_reg
                 U data_access_exception
                 U die_if_kernel
                 U do_fpother
                 U do_privact
0000000000000000 t fetch_reg
00000000000000c0 t fetch_reg_addr
                 U __flushw_user
0000000000000dc0 T handle_lddfmna
00000000000008e0 T handle_ldf_stq
0000000000000c80 T handle_ld_nf
0000000000000740 T handle_popc
0000000000000fc0 T handle_stdfmna
0000000000000280 T kernel_mna_trap_fault
0000000000000380 T kernel_unaligned_trap
0000000000000544 t kernel_unaligned_trap_fault
                 U __memcpy
                 U panic
0000000000000000 d popc_helper
                 U printk
                 U search_extables_range
0000000000000260 t unaligned_panic
                 U VISenter

Now the kernel links but I still have some problems with the modules. I'll
take a look tomorrow.

--- arch/sparc64/kernel/unaligned.c.orig	2004-05-11 22:38:33.000000000 -0400
+++ arch/sparc64/kernel/unaligned.c	2004-05-12 00:53:11.000000000 -0400
@@ -175,7 +175,7 @@
 }
 
 /* This is just to make gcc think die_if_kernel does return... */
-static void unaligned_panic(char *str, struct pt_regs *regs)
+static void __attribute_used__ unaligned_panic(char *str, struct pt_regs *regs)
 {
 	die_if_kernel(str, regs);
 }



-- 
Mathieu Chouquet-Stringer                 E-Mail: mchouque@online.fr
       Never attribute to malice that which can be adequately
                    explained by stupidity.
                     -- Hanlon's Razor --

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

* Re: Another gcc 3.4 fix
  2004-05-12  5:27 Another gcc 3.4 fix Mathieu Chouquet-Stringer
@ 2004-05-12 18:32 ` David S. Miller
  2004-05-12 18:51 ` Mathieu Chouquet-Stringer
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: David S. Miller @ 2004-05-12 18:32 UTC (permalink / raw)
  To: sparclinux

On Wed, 12 May 2004 01:27:44 -0400
Mathieu Chouquet-Stringer <mchouque@online.fr> wrote:

> Ok, one more problem while using gcc 3.4.0. It has a "nice" feature called
> "unit-at-a-time compilation", basically files are better "optimized" than
> before (you can read more about it here:
> http://gcc.gnu.org/gcc-3.4/changes.html).

Well, what seems to be happening is that GCC believes that
kernel_unaligned_trap() is not invoked so it does not emit
the code for that function.

As a consequence, unaligned_panic() can also not be emitted since
it is only invoked from kernel_unaligned_trap().

Is gcc-3.4 emitting kernel_unaligned_trap() into the unaligned.s file?

If not, that's a bug since it is invoked, at a minimum, from
arch/sparc64/kernel/traps.c and also arch/sparc64/kernel/entry.S

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

* Re: Another gcc 3.4 fix
  2004-05-12  5:27 Another gcc 3.4 fix Mathieu Chouquet-Stringer
  2004-05-12 18:32 ` David S. Miller
@ 2004-05-12 18:51 ` Mathieu Chouquet-Stringer
  2004-05-12 19:15 ` David S. Miller
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: Mathieu Chouquet-Stringer @ 2004-05-12 18:51 UTC (permalink / raw)
  To: sparclinux

On Wed, May 12, 2004 at 11:32:28AM -0700, David S. Miller wrote:
> Well, what seems to be happening is that GCC believes that
> kernel_unaligned_trap() is not invoked so it does not emit
> the code for that function.

You meant kernel_unaligned_trap_fault, right? If not, why would
kernel_unaligned_trap function be defined in the .o file then? Only
kernel_unaligned_trap_fault is undefined (and unaligned_panic is simply
missing): 

0000000000000360 T kernel_unaligned_trap
                 U kernel_unaligned_trap_fault

> As a consequence, unaligned_panic() can also not be emitted since
> it is only invoked from kernel_unaligned_trap().
>
> Is gcc-3.4 emitting kernel_unaligned_trap() into the unaligned.s file?

It is (at this stage the patch doesn't make any difference, the output
being the same with or without it):

        .global kernel_unaligned_trap
        .type   kernel_unaligned_trap, #function
        .proc   020
kernel_unaligned_trap:
        .register       %g7, #scratch
        !#PROLOGUE# 0
        save    %sp, -208, %sp
        !#PROLOGUE# 1

-- 
Mathieu Chouquet-Stringer                 E-Mail: mchouque@online.fr
       Never attribute to malice that which can be adequately
                    explained by stupidity.
                     -- Hanlon's Razor --

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

* Re: Another gcc 3.4 fix
  2004-05-12  5:27 Another gcc 3.4 fix Mathieu Chouquet-Stringer
  2004-05-12 18:32 ` David S. Miller
  2004-05-12 18:51 ` Mathieu Chouquet-Stringer
@ 2004-05-12 19:15 ` David S. Miller
  2004-05-12 19:45 ` Mathieu Chouquet-Stringer
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: David S. Miller @ 2004-05-12 19:15 UTC (permalink / raw)
  To: sparclinux

On Wed, 12 May 2004 14:51:14 -0400
Mathieu Chouquet-Stringer <mchouque@online.fr> wrote:

> It is (at this stage the patch doesn't make any difference, the output
> being the same with or without it):
> 
>         .global kernel_unaligned_trap
>         .type   kernel_unaligned_trap, #function
>         .proc   020
> kernel_unaligned_trap:
>         .register       %g7, #scratch
>         !#PROLOGUE# 0
>         save    %sp, -208, %sp
>         !#PROLOGUE# 1

It can't be the same in both cases, because something is
making kernel_unaligned_trap_fault underfined right?  One
way is for it not to get emitted at all, and that's what
I thought was occurring with gcc-3.4 builds.

Meanwhile, I've put your workaround in for the time being.


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

* Re: Another gcc 3.4 fix
  2004-05-12  5:27 Another gcc 3.4 fix Mathieu Chouquet-Stringer
                   ` (2 preceding siblings ...)
  2004-05-12 19:15 ` David S. Miller
@ 2004-05-12 19:45 ` Mathieu Chouquet-Stringer
  2004-05-12 19:50 ` David S. Miller
  2004-05-12 19:59 ` Mathieu Chouquet-Stringer
  5 siblings, 0 replies; 7+ messages in thread
From: Mathieu Chouquet-Stringer @ 2004-05-12 19:45 UTC (permalink / raw)
  To: sparclinux

On Wed, May 12, 2004 at 12:15:18PM -0700, David S. Miller wrote:
> It can't be the same in both cases, because something is
> making kernel_unaligned_trap_fault underfined right?  

My bad, I had the -fno-unit-at-a-time option on the command line.

So with the original version of unaligned.c, there's a
kernel_unaligned_trap in the .s file but no kernel_unaligned_trap_fault
(only references to it) and no unaligned_panic. (am I making myself clear
here?)

That's why I was saying I don't get it: why forcing gcc to generate code
for unaligned_panic make it build kernel_unaligned_trap_fault?

> One way is for it not to get emitted at all, and that's what
> I thought was occurring with gcc-3.4 builds.
>
> Meanwhile, I've put your workaround in for the time being.

Ok.
-- 
Mathieu Chouquet-Stringer                 E-Mail: mchouque@online.fr
       Never attribute to malice that which can be adequately
                    explained by stupidity.
                     -- Hanlon's Razor --

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

* Re: Another gcc 3.4 fix
  2004-05-12  5:27 Another gcc 3.4 fix Mathieu Chouquet-Stringer
                   ` (3 preceding siblings ...)
  2004-05-12 19:45 ` Mathieu Chouquet-Stringer
@ 2004-05-12 19:50 ` David S. Miller
  2004-05-12 19:59 ` Mathieu Chouquet-Stringer
  5 siblings, 0 replies; 7+ messages in thread
From: David S. Miller @ 2004-05-12 19:50 UTC (permalink / raw)
  To: sparclinux

On Wed, 12 May 2004 15:45:11 -0400
Mathieu Chouquet-Stringer <mchouque@online.fr> wrote:

> My bad, I had the -fno-unit-at-a-time option on the command line.

Please send the full output gcc-3.4 gives for kernel_unaligned_trap().
There is no way it can delete that whole asm statement that has
the kernel_unaligned_trap_fault definition, the asm is marked
volatile afterall.

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

* Re: Another gcc 3.4 fix
  2004-05-12  5:27 Another gcc 3.4 fix Mathieu Chouquet-Stringer
                   ` (4 preceding siblings ...)
  2004-05-12 19:50 ` David S. Miller
@ 2004-05-12 19:59 ` Mathieu Chouquet-Stringer
  5 siblings, 0 replies; 7+ messages in thread
From: Mathieu Chouquet-Stringer @ 2004-05-12 19:59 UTC (permalink / raw)
  To: sparclinux

On Wed, May 12, 2004 at 12:50:11PM -0700, David S. Miller wrote:
> Please send the full output gcc-3.4 gives for kernel_unaligned_trap().
> There is no way it can delete that whole asm statement that has
> the kernel_unaligned_trap_fault definition, the asm is marked
> volatile afterall.

I hope I cut at the right places:

	.section	".text"
	.align 4
	.align 32
	.global kernel_unaligned_trap
	.type	kernel_unaligned_trap, #function
	.proc	020
kernel_unaligned_trap:
	.register	%g7, #scratch
	!#PROLOGUE# 0
	save	%sp, -208, %sp
	!#PROLOGUE# 1
	srl	%i1, 21, %g1
	mov	0, %l2
	and	%g1, 1, %g1
	brz,pt	%g1, .LL69
	srl	%i1, 19, %g5
	and	%g5, 15, %g1
	mov	2, %l2
	cmp	%g1, 15
	movne	%icc, 1, %l2
.LL69:
	and	%g5, 15, %g2
	xor	%g2, 11, %g1
	xor	%g2, 14, %g2
	subcc	%g0, %g1, %g0
	subx	%g0, -1, %g3
	subcc	%g0, %g2, %g0
	subx	%g0, -1, %g1
	orcc	%g3, %g1, %g0
	bne,pt	%icc, .LL75
	mov	8, %l4
	andcc	%g5, 3, %g2
	bne,pt	%icc, .LL113
	mov	4, %l4
.LL75:
	srl	%i1, 24, %g1
	andcc	%g1, 1, %g0
	bne,pn	%xcc, .LL83
	mov	%l4, %l0
	cmp	%l2, 2
	bne,pn	%icc, .LL82
	srl	%i1, 25, %g1
.LL83:
	ldx	[%i0+136], %o1
	sethi	%hi(.LLC8), %o0
	call	printk, 0
	or	%o0, %lo(.LLC8), %o0
	sethi	%hi(.LLC9), %o0
	mov	%i0, %o1
	call	die_if_kernel, 0
	or	%o0, %lo(.LLC9), %o0
.LL113:
	cmp	%g2, 3
	be,pn	%icc, .LL75
	mov	16, %l4
	cmp	%g2, 2
	be,pt	%icc, .LL75
	mov	2, %l4
	srl	%i1, 0, %o1
	sethi	%hi(.LLC6), %o0
	call	printk, 0
	or	%o0, %lo(.LLC6), %o0
	sethi	%hi(.LLC7), %o0
	ldx	[%g6+40], %o1
	call	die_if_kernel, 0
	or	%o0, %lo(.LLC7), %o0
.LL82:
	mov	%i0, %o0
	srl	%i1, 0, %o1
	and	%g1, 31, %l1
	srl	%l1, 0, %l3
	call	compute_effective_address, 0
	mov	%l3, %o2
	cmp	%l2, 0
	be,pn	%icc, .LL89
	mov	%o0, %l5
	cmp	%l2, 1
	bne,pn	%icc, .LL114
	cmp	%l0, 16
	stx	%g0, [%fp+2023]
	be,pn	%icc, .LL115
	add	%fp, 2023, %l4
	cmp	%l1, 0
	bne,a,pn %icc, .LL116
	mov	%l3, %o0
.LL100:
	srl	%i1, 23, %g1
	andcc	%g1, 1, %g0
	be,pt	%xcc, .LL104
	mov	128, %g3
	srl	%i1, 5, %g1
	srl	%i1, 13, %g2
	andcc	%g2, 1, %g0
	be,pt	%xcc, .LL104
	and	%g1, 0xff, %g3
	ldub	[%i0+132], %g3
.LL104:
	wr	%g3, 0, %asi
	ldx	[%l4], %l1
cmp	%l0, 2
	be,pn	%icc, 2f
	 cmp	%l0, 4
	be,pt	%icc, 1f
	 srlx	%l1, 24, %l2
	srlx	%l1, 56, %g1
	srlx	%l1, 48, %g7
4:	stba	%g1, [%l5] %asi
	srlx	%l1, 40, %g1
5:	stba	%g7, [%l5 + 1] %asi
	srlx	%l1, 32, %g7
6:	stba	%g1, [%l5 + 2] %asi
7:	stba	%g7, [%l5 + 3] %asi
	srlx	%l1, 16, %g1
8:	stba	%l2, [%l5 + 4] %asi
	srlx	%l1, 8, %g7
9:	stba	%g1, [%l5 + 5] %asi
10:	stba	%g7, [%l5 + 6] %asi
	ba,pt	%xcc, 0f
11:	 stba	%l1, [%l5 + 7] %asi
1:	srl	%l1, 16, %g7
12:	stba	%l2, [%l5] %asi
	srl	%l1, 8, %l2
13:	stba	%g7, [%l5 + 1] %asi
14:	stba	%l2, [%l5 + 2] %asi
	ba,pt	%xcc, 0f
15:	 stba	%l1, [%l5 + 3] %asi
2:	srl	%l1, 8, %l2
16:	stba	%l2, [%l5] %asi
17:	stba	%l1, [%l5 + 1] %asi
0:
	wr	%g0, 17, %asi

	.section __ex_table
	.word	4b, kernel_unaligned_trap_fault
	.word	5b, kernel_unaligned_trap_fault
	.word	6b, kernel_unaligned_trap_fault
	.word	7b, kernel_unaligned_trap_fault
	.word	8b, kernel_unaligned_trap_fault
	.word	9b, kernel_unaligned_trap_fault
	.word	10b, kernel_unaligned_trap_fault
	.word	11b, kernel_unaligned_trap_fault
	.word	12b, kernel_unaligned_trap_fault
	.word	13b, kernel_unaligned_trap_fault
	.word	14b, kernel_unaligned_trap_fault
	.word	15b, kernel_unaligned_trap_fault
	.word	16b, kernel_unaligned_trap_fault
	.word	17b, kernel_unaligned_trap_fault

	.previous
	
	ldx	[%i0+144], %g3
.LL118:
	stx	%g3, [%i0+136]
	add	%g3, 4, %g2
	stx	%g2, [%i0+144]
	ldx	[%g6+8], %g1
	andcc	%g1, 128, %g0
	be,pt	%xcc, .LL67
	mov	-1, %g1
	srlx	%g1, 32, %g1
	and	%g2, %g1, %g2
	and	%g3, %g1, %g1
	stx	%g2, [%i0+144]
	ba,pt	%xcc, .LL67
	stx	%g1, [%i0+136]
.LL89:
	mov	%l3, %o0
	call	fetch_reg_addr, 0
	mov	%i0, %o1
	srl	%i1, 23, %g2
	sethi	%hi(4194304), %g1
	and	%i1, %g1, %g5
	andcc	%g2, 1, %g0
	be,pt	%xcc, .LL93
	mov	128, %g3
	srl	%i1, 5, %g1
	srl	%i1, 13, %g2
	andcc	%g2, 1, %g0
	be,pt	%xcc, .LL93
	and	%g1, 0xff, %g3
	ldub	[%i0+132], %g3
.LL93:
	wr	%g3, 0, %asi
	cmp	%l4, 8
	bge,pn	%icc, 9f
	 cmp	%l4, 4
	be,pt	%icc, 6f
4:	 lduba	[%l5] %asi, %l1
5:	lduba	[%l5 + 1] %asi, %l2
	sll	%l1, 8, %l1
	brz,pt	%g5, 3f
	 add	%l1, %l2, %l1
	sllx	%l1, 48, %l1
	srax	%l1, 48, %l1
3:	ba,pt	%xcc, 0f
	 stx	%l1, [%o0]
6:	lduba	[%l5 + 1] %asi, %l2
	sll	%l1, 24, %l1
7:	lduba	[%l5 + 2] %asi, %g7
	sll	%l2, 16, %l2
8:	lduba	[%l5 + 3] %asi, %g1
	sll	%g7, 8, %g7
	or	%l1, %l2, %l1
	or	%g7, %g1, %g7
	or	%l1, %g7, %l1
	brnz,a,pt %g5, 3f
	 sra	%l1, 0, %l1
3:	ba,pt	%xcc, 0f
	 stx	%l1, [%o0]
9:	lduba	[%l5] %asi, %l1
10:	lduba	[%l5 + 1] %asi, %l2
	sllx	%l1, 56, %l1
11:	lduba	[%l5 + 2] %asi, %g7
	sllx	%l2, 48, %l2
12:	lduba	[%l5 + 3] %asi, %g1
	sllx	%g7, 40, %g7
	sllx	%g1, 32, %g1
	or	%l1, %l2, %l1
	or	%g7, %g1, %g7
13:	lduba	[%l5 + 4] %asi, %l2
	or	%l1, %g7, %g7
14:	lduba	[%l5 + 5] %asi, %g1
	sllx	%l2, 24, %l2
15:	lduba	[%l5 + 6] %asi, %l1
	sllx	%g1, 16, %g1
	or	%g7, %l2, %g7
16:	lduba	[%l5 + 7] %asi, %l2
	sllx	%l1, 8, %l1
	or	%g7, %g1, %g7
	or	%l1, %l2, %l1
	or	%g7, %l1, %g7
	cmp	%l4, 8
	be,a,pt %icc, 0f
	 stx	%g7, [%o0]
	srlx	%g7, 32, %l1
	sra	%g7, 0, %g7
	stx	%l1, [%o0]
	stx	%g7, [%o0 + 8]
0:
	wr	%g0, 17, %asi

	.section __ex_table
	.word	4b, kernel_unaligned_trap_fault
	.word	5b, kernel_unaligned_trap_fault
	.word	6b, kernel_unaligned_trap_fault
	.word	7b, kernel_unaligned_trap_fault
	.word	8b, kernel_unaligned_trap_fault
	.word	9b, kernel_unaligned_trap_fault
	.word	10b, kernel_unaligned_trap_fault
	.word	11b, kernel_unaligned_trap_fault
	.word	12b, kernel_unaligned_trap_fault
	.word	13b, kernel_unaligned_trap_fault
	.word	14b, kernel_unaligned_trap_fault
	.word	15b, kernel_unaligned_trap_fault
	.word	16b, kernel_unaligned_trap_fault

	.previous
	
	ba,pt	%xcc, .LL118
	ldx	[%i0+144], %g3
.LL116:
	call	fetch_reg_addr, 0
	mov	%i0, %o1
	ba,pt	%xcc, .LL100
	mov	%o0, %l4
.LL115:
	add	%l1, 1, %o0
	mov	%i0, %o1
	and	%o0, 63, %o0
	call	fetch_reg, 0
	mov	8, %l0
	srl	%o0, 0, %l2
	cmp	%l1, 0
	bne,pn	%icc, .LL117
	mov	%l2, %o0
	ba,pt	%xcc, .LL100
	stx	%o0, [%fp+2023]
.LL117:
	mov	%l3, %o0
	call	fetch_reg, 0
	mov	%i0, %o1
	sllx	%o0, 32, %o0
	or	%o0, %l2, %o0
	ba,pt	%xcc, .LL100
	stx	%o0, [%fp+2023]
.LL114:
	sethi	%hi(.LLC10), %o0
	call	panic, 0
	or	%o0, %lo(.LLC10), %o0
.LL67:
	nop
	return	%i7+8
	nop
	.size	kernel_unaligned_trap, .-kernel_unaligned_trap

-- 
Mathieu Chouquet-Stringer                 E-Mail: mchouque@online.fr
       Never attribute to malice that which can be adequately
                    explained by stupidity.
                     -- Hanlon's Razor --

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

end of thread, other threads:[~2004-05-12 19:59 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-05-12  5:27 Another gcc 3.4 fix Mathieu Chouquet-Stringer
2004-05-12 18:32 ` David S. Miller
2004-05-12 18:51 ` Mathieu Chouquet-Stringer
2004-05-12 19:15 ` David S. Miller
2004-05-12 19:45 ` Mathieu Chouquet-Stringer
2004-05-12 19:50 ` David S. Miller
2004-05-12 19:59 ` Mathieu Chouquet-Stringer

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.