I tested using gcc-3.4.6 and gcc-4.1.1. The code generated by gcc-4.1.1 is
wrong, because a function attributed to weak is discarded by optimization. 

I wander if this problem is gcc4's specification because I can see same problem
with gcc-4.1.1 for PowerPC.

The source code is as follows. The command line is "sh4-linux-gcc -S testcase.c
-O".

void __attribute__ ((weak))
arch_init_clk_ops()
{
}

void clk_init(void)
{
  arch_init_clk_ops();
}

The result for gcc-4.1.1:

        .weak   arch_init_clk_ops
        .type   arch_init_clk_ops, @function
arch_init_clk_ops:
        mov.l   r14,@-r15
        mov     r15,r14
        mov     r14,r15
        mov.l   @r15+,r14
        rts
        nop
        .size   arch_init_clk_ops, .-arch_init_clk_ops
        .align 1
        .global clk_init
        .type   clk_init, @function
clk_init:
        mov.l   r14,@-r15
        mov     r15,r14        # arch_init_clk_op can not be called
        mov     r14,r15
        mov.l   @r15+,r14
        rts
        nop

The result for gcc-3.4.6:

arch_init_clk_ops:
        mov.l   r14,@-r15
        sts.l   pr,@-r15
        mov     r15,r14
        mov     r14,r15
        lds.l   @r15+,pr
        rts
        mov.l   @r15+,r14
        .size   arch_init_clk_ops, .-arch_init_clk_ops
        .align 1
        .global clk_init
        .type   clk_init, @function
clk_init:
        mov.l   r14,@-r15
        sts.l   pr,@-r15
        mov.l   .L3,r1
        jsr     @r1
        mov     r15,r14
        mov     r14,r15
        lds.l   @r15+,pr
        rts
        mov.l   @r15+,r14
.L4:
        .align 2
.L3:
        .long   arch_init_clk_ops


-- 
           Summary: [SH] a function attributed to weak is discarded, if '-O'
                    is specified
           Product: gcc
           Version: 4.1.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: saito at densan dot co dot jp
 GCC build triplet: sh4-linux
  GCC host triplet: sh4-linux
GCC target triplet: sh4-linux


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=28055

Reply via email to