Fixes the problem [ libdemo.so and main.o both use assignment on structures ] $ sh4-unknown-linux-gnu-gcc libdemo.so main.o sh4-unknown-linux-gnu/bin/ld: warning: type and size of dynamic symbol `__movstr_i4_even' are not defined [ resulting app links, but crashes at runtime ] See testcase at http://tsukuba.m17n.org/linux-sh/ml/linux-sh/2003-11/msg00016.html Patch was posted as http://gcc.gnu.org/ml/gcc-patches/2002-11/msg01641.html and is in cvs as http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/config/sh/lib1funcs.asm.diff?r1=1.29.4.1&r2=1.29.4.2 but see also sh-libgcc-hidden.patch (part of gcc-3.3.3 as of 20040119 or so) =================================================================== --- gcc/gcc/config/sh/lib1funcs.asm 2002/09/20 01:29:21 1.29.4.1 +++ gcc/gcc/config/sh/lib1funcs.asm 2003/11/18 12:27:31 @@ -38,9 +38,14 @@ amylaar@cygnus.com */ #ifdef __ELF__ -#define LOCAL(X) .L_##X -#else -#define LOCAL(X) L_##X +#define LOCAL(X) .L_##X +#define FUNC(X) .type X,@function +#define ENDFUNC0(X) .Lfe_##X: .size X,.Lfe_##X-X +#define ENDFUNC(X) ENDFUNC0(X) +#else +#define LOCAL(X) L_##X +#define FUNC(X) +#define ENDFUNC(X) #endif #define CONCAT(A,B) A##B @@ -87,6 +92,40 @@ .global GLOBAL(ashiftrt_r4_31) .global GLOBAL(ashiftrt_r4_32) + FUNC(GLOBAL(ashiftrt_r4_0)) + FUNC(GLOBAL(ashiftrt_r4_1)) + FUNC(GLOBAL(ashiftrt_r4_2)) + FUNC(GLOBAL(ashiftrt_r4_3)) + FUNC(GLOBAL(ashiftrt_r4_4)) + FUNC(GLOBAL(ashiftrt_r4_5)) + FUNC(GLOBAL(ashiftrt_r4_6)) + FUNC(GLOBAL(ashiftrt_r4_7)) + FUNC(GLOBAL(ashiftrt_r4_8)) + FUNC(GLOBAL(ashiftrt_r4_9)) + FUNC(GLOBAL(ashiftrt_r4_10)) + FUNC(GLOBAL(ashiftrt_r4_11)) + FUNC(GLOBAL(ashiftrt_r4_12)) + FUNC(GLOBAL(ashiftrt_r4_13)) + FUNC(GLOBAL(ashiftrt_r4_14)) + FUNC(GLOBAL(ashiftrt_r4_15)) + FUNC(GLOBAL(ashiftrt_r4_16)) + FUNC(GLOBAL(ashiftrt_r4_17)) + FUNC(GLOBAL(ashiftrt_r4_18)) + FUNC(GLOBAL(ashiftrt_r4_19)) + FUNC(GLOBAL(ashiftrt_r4_20)) + FUNC(GLOBAL(ashiftrt_r4_21)) + FUNC(GLOBAL(ashiftrt_r4_22)) + FUNC(GLOBAL(ashiftrt_r4_23)) + FUNC(GLOBAL(ashiftrt_r4_24)) + FUNC(GLOBAL(ashiftrt_r4_25)) + FUNC(GLOBAL(ashiftrt_r4_26)) + FUNC(GLOBAL(ashiftrt_r4_27)) + FUNC(GLOBAL(ashiftrt_r4_28)) + FUNC(GLOBAL(ashiftrt_r4_29)) + FUNC(GLOBAL(ashiftrt_r4_30)) + FUNC(GLOBAL(ashiftrt_r4_31)) + FUNC(GLOBAL(ashiftrt_r4_32)) + .align 1 GLOBAL(ashiftrt_r4_32): GLOBAL(ashiftrt_r4_31): @@ -166,6 +205,40 @@ GLOBAL(ashiftrt_r4_0): rts nop + + ENDFUNC(GLOBAL(ashiftrt_r4_0)) + ENDFUNC(GLOBAL(ashiftrt_r4_1)) + ENDFUNC(GLOBAL(ashiftrt_r4_2)) + ENDFUNC(GLOBAL(ashiftrt_r4_3)) + ENDFUNC(GLOBAL(ashiftrt_r4_4)) + ENDFUNC(GLOBAL(ashiftrt_r4_5)) + ENDFUNC(GLOBAL(ashiftrt_r4_6)) + ENDFUNC(GLOBAL(ashiftrt_r4_7)) + ENDFUNC(GLOBAL(ashiftrt_r4_8)) + ENDFUNC(GLOBAL(ashiftrt_r4_9)) + ENDFUNC(GLOBAL(ashiftrt_r4_10)) + ENDFUNC(GLOBAL(ashiftrt_r4_11)) + ENDFUNC(GLOBAL(ashiftrt_r4_12)) + ENDFUNC(GLOBAL(ashiftrt_r4_13)) + ENDFUNC(GLOBAL(ashiftrt_r4_14)) + ENDFUNC(GLOBAL(ashiftrt_r4_15)) + ENDFUNC(GLOBAL(ashiftrt_r4_16)) + ENDFUNC(GLOBAL(ashiftrt_r4_17)) + ENDFUNC(GLOBAL(ashiftrt_r4_18)) + ENDFUNC(GLOBAL(ashiftrt_r4_19)) + ENDFUNC(GLOBAL(ashiftrt_r4_20)) + ENDFUNC(GLOBAL(ashiftrt_r4_21)) + ENDFUNC(GLOBAL(ashiftrt_r4_22)) + ENDFUNC(GLOBAL(ashiftrt_r4_23)) + ENDFUNC(GLOBAL(ashiftrt_r4_24)) + ENDFUNC(GLOBAL(ashiftrt_r4_25)) + ENDFUNC(GLOBAL(ashiftrt_r4_26)) + ENDFUNC(GLOBAL(ashiftrt_r4_27)) + ENDFUNC(GLOBAL(ashiftrt_r4_28)) + ENDFUNC(GLOBAL(ashiftrt_r4_29)) + ENDFUNC(GLOBAL(ashiftrt_r4_30)) + ENDFUNC(GLOBAL(ashiftrt_r4_31)) + ENDFUNC(GLOBAL(ashiftrt_r4_32)) #endif #ifdef L_ashiftrt_n @@ -188,6 +261,7 @@ ! .global GLOBAL(ashrsi3) + FUNC(GLOBAL(ashrsi3)) .align 2 GLOBAL(ashrsi3): mov #31,r0 @@ -315,6 +389,7 @@ rts nop + ENDFUNC(GLOBAL(ashrsi3)) #endif #ifdef L_ashiftlt @@ -336,6 +411,7 @@ ! (none) ! .global GLOBAL(ashlsi3) + FUNC(GLOBAL(ashlsi3)) .align 2 GLOBAL(ashlsi3): mov #31,r0 @@ -472,6 +548,7 @@ rts nop + ENDFUNC(GLOBAL(ashlsi3)) #endif #ifdef L_lshiftrt @@ -493,6 +570,7 @@ ! (none) ! .global GLOBAL(lshrsi3) + FUNC(GLOBAL(lshrsi3)) .align 2 GLOBAL(lshrsi3): mov #31,r0 @@ -629,6 +707,7 @@ rts nop + ENDFUNC(GLOBAL(lshrsi3)) #endif #ifdef L_movstr @@ -645,76 +724,113 @@ add #64,r4 .align 4 .global GLOBAL(movstrSI64) + FUNC(GLOBAL(movstrSI64)) GLOBAL(movstrSI64): mov.l @(60,r5),r0 mov.l r0,@(60,r4) .global GLOBAL(movstrSI60) + FUNC(GLOBAL(movstrSI60)) GLOBAL(movstrSI60): mov.l @(56,r5),r0 mov.l r0,@(56,r4) .global GLOBAL(movstrSI56) + FUNC(GLOBAL(movstrSI56)) GLOBAL(movstrSI56): mov.l @(52,r5),r0 mov.l r0,@(52,r4) .global GLOBAL(movstrSI52) + FUNC(GLOBAL(movstrSI52)) GLOBAL(movstrSI52): mov.l @(48,r5),r0 mov.l r0,@(48,r4) .global GLOBAL(movstrSI48) + FUNC(GLOBAL(movstrSI48)) GLOBAL(movstrSI48): mov.l @(44,r5),r0 mov.l r0,@(44,r4) .global GLOBAL(movstrSI44) + FUNC(GLOBAL(movstrSI44)) GLOBAL(movstrSI44): mov.l @(40,r5),r0 mov.l r0,@(40,r4) .global GLOBAL(movstrSI40) + FUNC(GLOBAL(movstrSI40)) GLOBAL(movstrSI40): mov.l @(36,r5),r0 mov.l r0,@(36,r4) .global GLOBAL(movstrSI36) + FUNC(GLOBAL(movstrSI36)) GLOBAL(movstrSI36): mov.l @(32,r5),r0 mov.l r0,@(32,r4) .global GLOBAL(movstrSI32) + FUNC(GLOBAL(movstrSI32)) GLOBAL(movstrSI32): mov.l @(28,r5),r0 mov.l r0,@(28,r4) .global GLOBAL(movstrSI28) + FUNC(GLOBAL(movstrSI28)) GLOBAL(movstrSI28): mov.l @(24,r5),r0 mov.l r0,@(24,r4) .global GLOBAL(movstrSI24) + FUNC(GLOBAL(movstrSI24)) GLOBAL(movstrSI24): mov.l @(20,r5),r0 mov.l r0,@(20,r4) .global GLOBAL(movstrSI20) + FUNC(GLOBAL(movstrSI20)) GLOBAL(movstrSI20): mov.l @(16,r5),r0 mov.l r0,@(16,r4) .global GLOBAL(movstrSI16) + FUNC(GLOBAL(movstrSI16)) GLOBAL(movstrSI16): mov.l @(12,r5),r0 mov.l r0,@(12,r4) .global GLOBAL(movstrSI12) + FUNC(GLOBAL(movstrSI12)) GLOBAL(movstrSI12): mov.l @(8,r5),r0 mov.l r0,@(8,r4) .global GLOBAL(movstrSI8) + FUNC(GLOBAL(movstrSI8)) GLOBAL(movstrSI8): mov.l @(4,r5),r0 mov.l r0,@(4,r4) .global GLOBAL(movstrSI4) + FUNC(GLOBAL(movstrSI4)) GLOBAL(movstrSI4): mov.l @(0,r5),r0 mov.l r0,@(0,r4) + .global GLOBAL(movstrSI0) + FUNC(GLOBAL(movstrSI0)) GLOBAL(movstrSI0): rts nop + ENDFUNC(GLOBAL(movstrSI64)) + ENDFUNC(GLOBAL(movstrSI60)) + ENDFUNC(GLOBAL(movstrSI56)) + ENDFUNC(GLOBAL(movstrSI52)) + ENDFUNC(GLOBAL(movstrSI48)) + ENDFUNC(GLOBAL(movstrSI44)) + ENDFUNC(GLOBAL(movstrSI40)) + ENDFUNC(GLOBAL(movstrSI36)) + ENDFUNC(GLOBAL(movstrSI32)) + ENDFUNC(GLOBAL(movstrSI28)) + ENDFUNC(GLOBAL(movstrSI24)) + ENDFUNC(GLOBAL(movstrSI20)) + ENDFUNC(GLOBAL(movstrSI16)) + ENDFUNC(GLOBAL(movstrSI12)) + ENDFUNC(GLOBAL(movstrSI8)) + ENDFUNC(GLOBAL(movstrSI4)) + ENDFUNC(GLOBAL(movstrSI0)) + .align 4 .global GLOBAL(movstr) + FUNC(GLOBAL(movstr)) GLOBAL(movstr): mov.l @(60,r5),r0 mov.l r0,@(60,r4) @@ -771,6 +887,8 @@ add #64,r5 bra GLOBAL(movstr) add #64,r4 + + FUNC(GLOBAL(movstr)) #endif #ifdef L_movstr_i4 @@ -779,6 +897,10 @@ .global GLOBAL(movstr_i4_odd) .global GLOBAL(movstrSI12_i4) + FUNC(GLOBAL(movstr_i4_even)) + FUNC(GLOBAL(movstr_i4_odd)) + FUNC(GLOBAL(movstrSI12_i4)) + .p2align 5 L_movstr_2mod4_end: mov.l r0,@(16,r4) @@ -787,6 +909,11 @@ .p2align 2 +GLOBAL(movstr_i4_even): + mov.l @r5+,r0 + bra L_movstr_start_even + mov.l @r5+,r1 + GLOBAL(movstr_i4_odd): mov.l @r5+,r1 add #-4,r4 @@ -813,10 +940,8 @@ rts mov.l r3,@(12,r4) -GLOBAL(movstr_i4_even): - mov.l @r5+,r0 - bra L_movstr_start_even - mov.l @r5+,r1 + ENDFUNC(GLOBAL(movstr_i4_even)) + ENDFUNC(GLOBAL(movstr_i4_odd)) .p2align 4 GLOBAL(movstrSI12_i4): @@ -827,12 +952,15 @@ mov.l r1,@(4,r4) rts mov.l r2,@(8,r4) + + ENDFUNC(GLOBAL(movstrSI12_i4)) #endif #ifdef L_mulsi3 .global GLOBAL(mulsi3) + FUNC(GLOBAL(mulsi3)) ! r4 = aabb ! r5 = ccdd @@ -865,7 +993,7 @@ rts add r2,r0 - + FUNC(GLOBAL(mulsi3)) #endif #endif /* ! __SH5__ */ #ifdef L_sdivsi3_i4 @@ -875,6 +1003,7 @@ !! args in r4 and r5, result in fpul, clobber dr0, dr2 .global GLOBAL(sdivsi3_i4) + FUNC(GLOBAL(sdivsi3_i4)) GLOBAL(sdivsi3_i4): lds r4,fpul float fpul,dr0 @@ -884,6 +1013,7 @@ rts ftrc dr0,fpul + ENDFUNC(GLOBAL(sdivsi3_i4)) #elif defined(__SH4_SINGLE__) || defined(__SH4_SINGLE_ONLY__) || (defined (__SH5__) && ! defined __SH4_NOFPU__) !! args in r4 and r5, result in fpul, clobber r2, dr0, dr2 @@ -892,6 +1022,7 @@ .mode SHcompact #endif .global GLOBAL(sdivsi3_i4) + FUNC(GLOBAL(sdivsi3_i4)) GLOBAL(sdivsi3_i4): sts.l fpscr,@-r15 mov #8,r2 @@ -906,6 +1037,7 @@ rts lds.l @r15+,fpscr + ENDFUNC(GLOBAL(sdivsi3_i4)) #endif /* ! __SH5__ || __SH5__ == 32 */ #endif /* ! __SH4__ */ #endif @@ -920,9 +1052,10 @@ !! !! -!! args in r4 and r5, result in r0 clobber r1,r2,r3 +!! args in r4 and r5, result in r0 clobber r1, r2, r3, and t bit .global GLOBAL(sdivsi3) + FUNC(GLOBAL(sdivsi3)) #if __SHMEDIA__ #if __SH5__ == 32 .section .text..SHmedia32,"ax" @@ -1166,6 +1299,7 @@ div0: rts mov #0,r0 + ENDFUNC(GLOBAL(sdivsi3)) #endif /* ! __SHMEDIA__ */ #endif /* ! __SH4__ */ #endif @@ -1174,9 +1308,11 @@ .title "SH DIVIDE" !! 4 byte integer Divide code for the Hitachi SH #ifdef __SH4__ -!! args in r4 and r5, result in fpul, clobber r0, r1, r4, r5, dr0, dr2, dr4 +!! args in r4 and r5, result in fpul, clobber r0, r1, r4, r5, dr0, dr2, dr4, +!! and t bit .global GLOBAL(udivsi3_i4) + FUNC(GLOBAL(udivsi3_i4)) GLOBAL(udivsi3_i4): mov #1,r1 cmp/hi r1,r5 @@ -1217,11 +1353,13 @@ L1: .double 2147483648 + ENDFUNC(GLOBAL(udivsi3_i4)) #elif defined (__SH5__) && ! defined (__SH4_NOFPU__) #if ! __SH5__ || __SH5__ == 32 !! args in r4 and r5, result in fpul, clobber r20, r21, dr0, fr33 .mode SHmedia .global GLOBAL(udivsi3_i4) + FUNC(GLOBAL(udivsi3_i4)) GLOBAL(udivsi3_i4): addz.l r4,r63,r20 addz.l r5,r63,r21 @@ -1234,6 +1372,8 @@ ftrc.dq dr0,dr32 fmov.s fr33,fr32 blink tr0,r63 + + ENDFUNC(GLOBAL(udivsi3_i4)) #endif /* ! __SH5__ || __SH5__ == 32 */ #elif defined(__SH4_SINGLE__) || defined(__SH4_SINGLE_ONLY__) !! args in r4 and r5, result in fpul, clobber r0, r1, r4, r5, dr0, dr2, dr4 @@ -1287,6 +1427,7 @@ #endif .double 2147483648 + ENDFUNC(GLOBAL(udivsi3_i4)) #endif /* ! __SH4__ */ #endif @@ -1297,6 +1438,7 @@ !! args in r4 and r5, result in r0, clobbers r4, pr, and t bit .global GLOBAL(udivsi3) + FUNC(GLOBAL(udivsi3)) #if __SHMEDIA__ #if __SH5__ == 32 @@ -1485,6 +1627,7 @@ rts rotcl r0 + ENDFUNC(GLOBAL(udivsi3)) #endif /* ! __SHMEDIA__ */ #endif /* __SH4__ */ #endif /* L_udivsi3 */ @@ -1790,6 +1933,7 @@ .mode SHcompact #endif .global GLOBAL(set_fpscr) + FUNC(GLOBAL(set_fpscr)) GLOBAL(set_fpscr): lds r4,fpscr mov.l LOCAL(set_fpscr_L1),r1 @@ -1822,6 +1966,8 @@ .align 2 LOCAL(set_fpscr_L1): .long GLOBAL(fpscr_values) + + ENDFUNC(GLOBAL(set_fpscr)) #ifdef __ELF__ .comm GLOBAL(fpscr_values),8,4 #else @@ -1860,6 +2006,7 @@ blink tr0, r63 #elif defined(__SH4_SINGLE__) || defined(__SH4__) || defined(__SH4_SINGLE_ONLY__) .global GLOBAL(ic_invalidate) + FUNC(GLOBAL(ic_invalidate)) GLOBAL(ic_invalidate): ocbwb @r4 mova 0f,r0 @@ -1882,6 +2029,8 @@ nop .endr .endr + + ENDFUNC(GLOBAL(ic_invalidate)) #endif /* SH4 */ #endif /* L_ic_invalidate */ @@ -1940,6 +2089,7 @@ will be expanded into r2/r3 upon return. */ .global GLOBAL(GCC_shcompact_call_trampoline) + FUNC(GLOBAL(GCC_shcompact_call_trampoline)) GLOBAL(GCC_shcompact_call_trampoline): ptabs/l r0, tr0 /* Prepare to call the actual function. */ movi ((datalabel LOCAL(ct_main_table) - 31 * 2) >> 16) & 65535, r0 @@ -2290,6 +2440,8 @@ shari r2, 32, r2 #endif blink tr0, r63 + + ENDFUNC(GLOBAL(GCC_shcompact_call_trampoline)) #endif /* L_shcompact_call_trampoline */ #ifdef L_shcompact_return_trampoline @@ -2302,6 +2454,7 @@ .section .text..SHmedia32, "ax" .align 2 .global GLOBAL(GCC_shcompact_return_trampoline) + FUNC(GLOBAL(GCC_shcompact_return_trampoline)) GLOBAL(GCC_shcompact_return_trampoline): ptabs/l r18, tr0 #if __LITTLE_ENDIAN__ @@ -2313,6 +2466,8 @@ #endif or r3, r2, r2 blink tr0, r63 + + ENDFUNC(GLOBAL(GCC_shcompact_return_trampoline)) #endif /* L_shcompact_return_trampoline */ #ifdef L_shcompact_incoming_args @@ -2367,6 +2522,7 @@ actual bit pattern. */ .global GLOBAL(GCC_shcompact_incoming_args) + FUNC(GLOBAL(GCC_shcompact_incoming_args)) GLOBAL(GCC_shcompact_incoming_args): ptabs/l r18, tr0 /* Prepare to return. */ shlri r17, 32, r0 /* Load the cookie. */ @@ -2519,6 +2675,7 @@ LOCAL(ia_return): /* Return. */ blink tr0, r63 LOCAL(ia_end_of_push_seq): /* Label used to compute the first push instruction. */ + ENDFUNC(GLOBAL(GCC_shcompact_incoming_args)) #endif /* L_shcompact_incoming_args */ #endif #if __SH5__ @@ -2530,6 +2687,7 @@ #endif .align 3 /* It is copied in units of 8 bytes in SHmedia mode. */ .global GLOBAL(GCC_nested_trampoline) + FUNC(GLOBAL(GCC_nested_trampoline)) GLOBAL(GCC_nested_trampoline): .mode SHmedia ptrel/u r63, tr0 @@ -2546,6 +2704,8 @@ ld.l r0, 28, r1 #endif blink tr1, r63 + + ENDFUNC(GLOBAL(GCC_nested_trampoline)) #endif /* L_nested_trampoline */ #endif /* __SH5__ */ #if __SH5__ == 32 @@ -2555,6 +2715,7 @@ .align 2 #ifndef __SH4_NOFPU__ .global GLOBAL(GCC_push_shmedia_regs) + FUNC(GLOBAL(GCC_push_shmedia_regs)) GLOBAL(GCC_push_shmedia_regs): addi.l r15, -14*8, r15 fst.d r15, 13*8, dr62 @@ -2573,6 +2734,7 @@ fst.d r15, 0*8, dr36 #endif .global GLOBAL(GCC_push_shmedia_regs_nofpu) + FUNC(GLOBAL(GCC_push_shmedia_regs_nofpu)) GLOBAL(GCC_push_shmedia_regs_nofpu): ptabs/l r18, tr0 addi.l r15, -27*8, r15 @@ -2608,8 +2770,13 @@ st.q r15, 0*8, r28 blink tr0, r63 +#ifndef __SH4_NOFPU__ + ENDFUNC(GLOBAL(GCC_push_shmedia_regs)) +#endif + ENDFUNC(GLOBAL(GCC_push_shmedia_regs_nofpu)) #ifndef __SH4_NOFPU__ .global GLOBAL(GCC_pop_shmedia_regs) + FUNC(GLOBAL(GCC_pop_shmedia_regs)) GLOBAL(GCC_pop_shmedia_regs): pt .L0, tr1 movi 41*8, r0 @@ -2630,6 +2797,7 @@ blink tr1, r63 #endif .global GLOBAL(GCC_pop_shmedia_regs_nofpu) + FUNC(GLOBAL(GCC_pop_shmedia_regs_nofpu)) GLOBAL(GCC_pop_shmedia_regs_nofpu): movi 27*8, r0 .L0: @@ -2666,5 +2834,10 @@ ld.q r15, 0*8, r28 add.l r15, r0, r15 blink tr0, r63 + +#ifndef __SH4_NOFPU__ + ENDFUNC(GLOBAL(GCC_pop_shmedia_regs)) +#endif + ENDFUNC(GLOBAL(GCC_pop_shmedia_regs_nofpu)) #endif /* __SH5__ == 32 */ #endif /* L_push_pop_shmedia_regs */