Joseph S. Myers wrote:
On Fri, 8 Sep 2006, Edmar Wienskoski wrote:
Ok. I am starting to see the whole picture now.
So the whole thing appears to work with --disable-shared, just because the way
the linker
loads symbols in presence of libgcc_s.so versus libgcc.a.
Follow up question:
The e500 abi actualy defines long double to be 128bits floats.
On rs6000.c, rs6000_init_libfuncs links to __gcc_qadd becasue of
TARGET_HARD_FLOAT
shouldn't that be TARGET_HARD_FLOAT && TARGET_FPRS
and also have:
diff -u t-fprules-softfp~ t-fprules-softfp
--- t-fprules-softfp~ 2006-08-09 14:20:24.000000000 -0500
+++ t-fprules-softfp 2006-09-06 12:39:17.000000000 -0500
@@ -1,4 +1,4 @@
-softfp_float_modes := sf df
+softfp_float_modes := sf df tf
softfp_int_modes := si di
softfp_extensions := sfdf
softfp_truncations := dfsf
Would that be right ?
No.
(a) The existing GNU/Linux ABIs use or are intended to use IBM long
double, not IEEE long double, and the E500 GNU/Linux ABI should be
compatible with the other ABIs in this regard. The present formal ABI
documents are not very relevant to the de facto GNU/Linux ABIs.
Well, actually this is part of the problem. We have only one document:
the "e500 Sys V ABI",
which was intended to create only one ABI.
(b) To use IEEE long double with soft-fp you'll need to add sftf dftf to
softfp_extensions and tfdf tfsf to softfp_truncations.
Humm.
(c) If using IEEE long double on PowerPC, you should be using the standard
_q_* functions defined in the psABI, and not the __*tf* functions at all.
glibc does provide the _q_* functions (albeit with a typo meaning _q_utoq
is missing), though since they don't get built with -mabi=ieeelongdouble
they aren't actually usable.
There are 2 issues here:
First, It is libgcc that is generating undefined references to __*tf* functions. If gcc
can provide them with "softfp_float_modes := sf df tf", I think is reasonable
to do that. For completeness sake you can do as you suggested: change softfp_extensions
and softfp_truncations, but they are not absolutely necessary.
Second, is the long double ABI problem. In the past gcc always generated
function calls to _q_* functions. (Per ABI Chapter 5)
For this code:
long double foo (long double x, long double y){ return x + y; }
gcc-4.0, target powerpc-eabise and
gcc-4.0, target powerpc-*-linux-gnuspe with -mlong-double-128 option
both generates a call to _q_add.
The same code with gcc-4.2, both targets generates a call to __gcc_qadd.
If there is an intention to change the E500 ABI, then somebody has to step
forward and actually change the document (With all the administrative burden
that cames with it..).
Edmar