This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: GCC 4.4 cross compiler and issue with __floatdidf


On Wed, 18 Mar 2009 10:00:27 +0100, "Vincent R." <forumer@smartmobili.com>
wrote:
> On Wed, 11 Mar 2009 00:57:53 +0100, "Vincent R."
<forumer@smartmobili.com>
> wrote:
>> On Tue, 10 Mar 2009 23:29:46 +0100, "Vincent R."
> <forumer@smartmobili.com>
>> wrote:
>>> On Tue, 10 Mar 2009 23:55:02 +0200, Kai Ruottu <kai.ruottu@wippies.com>
>>> wrote:
>>>> Kai Ruottu wrote:
>>>> 
>>>>> Vincent R. wrote:
>>>>>> Hi,
>>>>>>
>>>>>> When compiling the following code with a gcc 4.4 cross-compiler 
>>>>>> targetting
>>>>>> arm wince platform I get a problem with undefined reference
>> __floatdidf
>>>>>> :
>>>>> 
>>>>> This should mean a conversion routine from long int to double float
>>>>> and this routine is normally in libgcc...  So a search with 'nm'
>>>>> would tell if it is there or not.
>>>> 
>>>> A quick look in 'gcc/config/arm' told that the 'lib1funcs.asm' should
>>>> #include the 'ieee754-*.S' which has this routine. But there are two
>>>> conditions for the inclusion :
>>>> 
>>>> #ifndef __symbian__
>>>> #ifndef __ARM_ARCH_6M__
>>>> #include "ieee754-df.S"
>>>> #include "ieee754-sf.S"
>>>> #include "bpabi.S"
>>>> #else /* __ARM_ARCH_6M__ */
>>>> #include "bpabi-v6m.S"
>>>> #endif /* __ARM_ARCH_6M__ */
>>>> #endif /* !__symbian__ */
>>>> 
>>>> Whether the WinCE target defines something like these will be left you
>>>> as a homework...
>>> 
>>> When using nm with gcc-4.4:
>>> 
>>> $ arm-mingw32ce-nm libgcc.a | grep float
>>> _floatdidf.o:
>>> _floatdisf.o:
>>>          U __floatunsidf
>>>          U __floatunsidf
>>> _floatdixf.o:
>>> _floatditf.o:
>>> _floatundisf.o:
>>> 00000000 T __floatundisf
>>>          U __floatunsidf
>>> _floatundidf.o:
>>> 00000000 T __floatundidf
>>>          U __floatunsidf
>>> _floatundixf.o:
>>> _floatunditf.o:
>>> 0000000c T __floatsisf
>>> 0000000c T __floatunsisf
>>> 0000000c T __floatsidf
>>> 0000000c T __floatunsidf
>>> 
>>> with an old working version (4.1.2):
>>> 
>>> 0000038c T __floatdidf
>>> 00000310 T __floatsidf
>>> 00000378 T __floatundidf
>>> 000002ec T __floatunsidf
>>> 00000200 T __floatdisf
>>> 000001d0 T __floatsisf
>>> 000001f0 T __floatundisf
>>> 000001c8 T __floatunsisf
>>> _floatdidf.o:
>>> _floatdisf.o:
>>>          U __floatsidf
>>>          U __floatsidf
>>> _floatdixf.o:
>>> _floatditf.o:
>>> 00000000 T __floatsisf
>>> 00000000 T __floatunsisf
>>> 00000000 T __floatsidf
>>> 00000000 T __floatunsidf
>>> 
>>> 
>>> and since __symbian__ nor __ARM_ARCH_6M__ are defined I suppose
>> ieee754-*.S
>>> are included.
>>> 
>>> From what I see with old version __floatxxx were defined bur not with
> new
>>> compiler.
>>> 
>> I found why it's because of the following test :
>> 
>> #ifdef L_arm_addsubdf3
>> ...
>> #endif
>> 
>> Now I need to find why L_arm_addsubdf3 is defined.
>
 
So I am still stuck with this missing symbol.
What I don't understand is the fact that __floatundidf is available but not
 __floatdidf.

 If I look in gcc/config/arm/t-wince-pe here is what is declared for my
 target:
 LIB1ASMSRC = arm/lib1funcs.asm
 
 LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_tls _call_via_rX
 _interwork_call_via_rX _clzsi2 _clzdi2 \
 	_bb_init_func _lshrdi3 _ashrdi3 _ashldi3 \
 	_negdf2 _addsubdf3 _muldivdf3 _cmpdf2 _unorddf2 _fixdfsi _fixunsdfsi \
 	_truncdfsf2 _negsf2 _addsubsf3 _muldivsf3 _cmpsf2 _unordsf2 \
 	_fixsfsi _fixunssfsi _floatdidf _floatdisf \
 	_arm_fixunsdfsi
 
 and I can see that _floatdidf is declared but is not available in libgcc
while
_floatundidf is not and is available.

Does it mean I need to remove _floatdidf _floatdisf from the list ?

Maybe the problem comes from the patch I am applying against vanilla gcc :

Index: gcc/config/arm/lib1funcs.asm
===================================================================
--- gcc/config/arm/lib1funcs.asm	(rÃvision 144104)
+++ gcc/config/arm/lib1funcs.asm	(copie de travail)
@@ -52,22 +52,22 @@
 #define SYM(x) CONCAT1 (__USER_LABEL_PREFIX__, x)
 
 #ifdef __ELF__
-#ifdef __thumb__
-#define __PLT__  /* Not supported in Thumb assembler (for now).  */
+# ifdef __thumb__
+#  define __PLT__  /* Not supported in Thumb assembler (for now).  */
+# else
+#  define __PLT__ (PLT)
+# endif
+# define TYPE(x) .type SYM(x),function
+# define SIZE(x) .size SYM(x), . - SYM(x)
+# define LSYM(x) .x
 #elif defined __vxworks && !defined __PIC__
 #define __PLT__ /* Not supported by the kernel loader.  */
 #else
-#define __PLT__ (PLT)
+# define __PLT__
+# define TYPE(x) .def SYM(x); .scl 2; .type 32; .endef
+# define SIZE(x)
+# define LSYM(x) CONCAT1 (__LOCAL_LABEL_PREFIX__, x)
 #endif
-#define TYPE(x) .type SYM(x),function
-#define SIZE(x) .size SYM(x), . - SYM(x)
-#define LSYM(x) .x
-#else
-#define __PLT__
-#define TYPE(x)
-#define SIZE(x)
-#define LSYM(x) x
-#endif
 
 /* Function end macros.  Variants for interworking.  */
 
@@ -1253,7 +1253,7 @@
 2:	adr	r2, 1f
 	ldrb	r0, [r2, r0]
 	add	r0, r0, r1
-	bx lr
+	RET
 .align 2
 1:
 .byte 4, 3, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0

Index: gcc/config/arm/t-wince-pe
===================================================================
--- gcc/config/arm/t-wince-pe	(rÃvision 144104)
+++ gcc/config/arm/t-wince-pe	(copie de travail)
@@ -1,6 +1,26 @@
 LIB1ASMSRC = arm/lib1funcs.asm
-LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_tls _call_via_rX
_interwork_call_via_rX _clzsi2 _clzdi2
 
+LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_tls _call_via_rX
_interwork_call_via_rX _clzsi2 _clzdi2 \
+	_bb_init_func _lshrdi3 _ashrdi3 _ashldi3 \
+	_negdf2 _addsubdf3 _muldivdf3 _cmpdf2 _unorddf2 _fixdfsi _fixunsdfsi \
+	_truncdfsf2 _negsf2 _addsubsf3 _muldivsf3 _cmpsf2 _unordsf2 \
+	_fixsfsi _fixunssfsi _floatdidf _floatdisf \
+	_arm_fixunsdfsi
+
+# For most CPUs we have an assembly soft-float implementations.
+# However this is not true for ARMv6M.  Here we want to use the soft-fp C
+# implementation.  The soft-fp code is only build for ARMv6M.  This pulls
+# in the asm implementation for other CPUs.
+#LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_tls _bb_init_func
\
+#	_call_via_rX _interwork_call_via_rX \
+#	_lshrdi3 _ashrdi3 _ashldi3 \
+#	_arm_negdf2 _arm_addsubdf3 _arm_muldivdf3 _arm_cmpdf2 _arm_unorddf2 \
+#	_arm_fixdfsi _arm_fixunsdfsi \
+#	_arm_truncdfsf2 _arm_negsf2 _arm_addsubsf3 _arm_muldivsf3 \
+#	_arm_cmpsf2 _arm_unordsf2 _arm_fixsfsi _arm_fixunssfsi \
+#	_arm_floatdidf _arm_floatdisf _arm_floatundidf _arm_floatundisf \
+#	_clzsi2 _clzdi2
+
 # We want fine grained libraries, so use the new code to build the
 # floating point emulation libraries.
 FPBIT = fp-bit.c
@@ -20,12 +40,34 @@
 	echo '#endif' >> dp-bit.c
 	cat $(srcdir)/config/fp-bit.c >> dp-bit.c
 
-pe.o: $(srcdir)/config/arm/pe.c $(CONFIG_H) $(SYSTEM_H) coretypes.h
$(TM_H) \
-  $(RTL_H) output.h flags.h $(TREE_H) expr.h toplev.h $(TM_P_H)
-	$(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES)
$(srcdir)/config/arm/pe.c
+pe.o: $(srcdir)/config/arm/pe.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
+  $(TM_H) $(RTL_H) $(REGS_H) hard-reg-set.h output.h $(TREE_H) flags.h \
+  $(TM_P_H) toplev.h $(HASHTAB_H) $(GGC_H)
+	$(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
+	$(srcdir)/config/arm/pe.c
 
-MULTILIB_OPTIONS = mhard-float
-MULTILIB_DIRNAMES = fpu
+pe-cxx.o: $(srcdir)/config/arm/pe-cxx.c $(CONFIG_H) $(SYSTEM_H)
coretypes.h \
+  $(TM_H) $(RTL_H) $(REGS_H) hard-reg-set.h output.h $(TREE_H) flags.h \
+  $(TM_P_H) toplev.h $(HASHTAB_H) $(GGC_H)
+	$(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
+	$(srcdir)/config/arm/pe-cxx.c
+
+pe-stubs.o: $(srcdir)/config/arm/pe-stubs.c $(CONFIG_H) $(SYSTEM_H)
coretypes.h \
+  $(TM_H) $(RTL_H) $(REGS_H) hard-reg-set.h output.h $(TREE_H) flags.h \
+  $(TM_P_H) toplev.h $(HASHTAB_H) $(GGC_H)
+	$(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
+	$(srcdir)/config/arm/pe-stubs.c
+
+#hack! using i386 file directly...
+msformat-c.o: $(srcdir)/config/i386/msformat-c.c $(CONFIG_H) $(SYSTEM_H)
coretypes.h \
+  $(TM_H) $(RTL_H) $(REGS_H) hard-reg-set.h output.h $(TREE_H) flags.h \
+  $(TM_P_H) toplev.h $(HASHTAB_H) $(GGC_H)
+	$(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
+	$(srcdir)/config/i386/msformat-c.c
+
+MULTILIB_OPTIONS =
+MULTILIB_DIRNAMES =
+
 # Note - Thumb multilib omitted because Thumb support for
 # arm-wince-pe target does not appear to be working in binutils
 # yet... 
@@ -34,4 +76,59 @@
 
 LIBGCC = stmp-multilib
 INSTALL_LIBGCC = install-multilib
-TARGET_LIBGCC2_CFLAGS = 
+# Currently there is a bug somewhere in GCC's alias analysis
+# or scheduling code that is breaking _fpmul_parts in fp-bit.c.
+# Disabling function inlining is a workaround for this problem.
+TARGET_LIBGCC2_CFLAGS = -fno-inline
+
+STMP_FIXINC=stmp-fixinc
+









Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]