3.0 PATCH: Fix va_arg for long double parameters on Tru64 UNIX V5
Rainer Orth
ro@TechFak.Uni-Bielefeld.DE
Wed Jun 6 03:54:00 GMT 2001
As reported when submitting my ABI testsuite
http://gcc.gnu.org/ml/gcc-patches/2001-06/msg00258.html
and as part of PR target/2128 (which contains other failures as well),
current gcc 3.0 doesn't correctly implement va_arg for long double
parameters on alpha-dec-osf5.1: they are passed by reference, unlike float
and double parameters, which function_arg accounts for, but alpha_va_arg
did not.
Here are the results of my ABI testsuite for unmodified gcc-3.0-20010531:
FAIL: sa-ld-n-g execution
Assertion failed: ld == sizeof (ld), file /vol/gnu/src/gcc/gcc-3.0-branch/gcc/testsuite/gcc.dg/abi/sa-ld-callee.c, line 17
FAIL: sa-ld-g-g execution
Assertion failed: ld == sizeof (ld), file /vol/gnu/src/gcc/gcc-3.0-branch/gcc/testsuite/gcc.dg/abi/va-ld-callee.c, line 20
FAIL: va-ld-n-g execution
Assertion failed: ld == sizeof (ld), file /vol/gnu/src/gcc/gcc-3.0-branch/gcc/testsuite/gcc.dg/abi/va-ld-callee.c, line 20
FAIL: va-ld-g-g execution
With the patch below, shamelessly stolen and adapted from sparc.c
(sparc_va_arg), all tests pass. Even better, a full bootstrap revealed
several other fixed bugs:
-/vol/gcc/obj/gcc-3.0-20010531/5.1-cc-local-dwarf2eh/gcc/xgcc version 3.0 20010531 (prerelease)
+/vol/gcc/obj/gcc-3.0-20010531/5.1-cc-dist/gcc/xgcc version 3.0 20010531 (prerelease)
-FAIL: gcc.c-torture/execute/va-arg-5.c execution, -O0
-FAIL: gcc.c-torture/execute/va-arg-5.c execution, -O1
-FAIL: gcc.c-torture/execute/va-arg-5.c execution, -O2
-FAIL: gcc.c-torture/execute/va-arg-5.c execution, -O3 -fomit-frame-pointer
-FAIL: gcc.c-torture/execute/va-arg-5.c execution, -O3 -g
-FAIL: gcc.c-torture/execute/va-arg-5.c execution, -Os
-FAIL: gcc.c-torture/execute/va-arg-6.c execution, -O0
-FAIL: gcc.c-torture/execute/va-arg-6.c execution, -O1
-FAIL: gcc.c-torture/execute/va-arg-6.c execution, -O2
-FAIL: gcc.c-torture/execute/va-arg-6.c execution, -O3 -fomit-frame-pointer
-FAIL: gcc.c-torture/execute/va-arg-6.c execution, -O3 -g
-FAIL: gcc.c-torture/execute/va-arg-6.c execution, -Os
-FAIL: objc/execute/_cmd.m execution, -O
-FAIL: objc/execute/accessing_ivars.m execution, -O
-FAIL: objc/execute/bf-1.m execution, -O
-FAIL: objc/execute/bf-10.m execution, -O
-FAIL: objc/execute/bf-11.m execution, -O
-FAIL: objc/execute/bf-12.m execution, -O
-FAIL: objc/execute/bf-13.m execution, -O
-FAIL: objc/execute/bf-14.m execution, -O
-FAIL: objc/execute/bf-15.m execution, -O
-FAIL: objc/execute/bf-16.m execution, -O
-FAIL: objc/execute/bf-17.m execution, -O
-FAIL: objc/execute/bf-18.m execution, -O
-FAIL: objc/execute/bf-19.m execution, -O
-FAIL: objc/execute/bf-2.m execution, -O
-FAIL: objc/execute/bf-20.m execution, -O
-FAIL: objc/execute/bf-3.m execution, -O
-FAIL: objc/execute/bf-4.m execution, -O
-FAIL: objc/execute/bf-5.m execution, -O
-FAIL: objc/execute/bf-6.m execution, -O
-FAIL: objc/execute/bf-7.m execution, -O
-FAIL: objc/execute/bf-8.m execution, -O
-FAIL: objc/execute/bf-9.m execution, -O
-FAIL: objc/execute/bycopy-2.m execution, -O
-FAIL: objc/execute/bycopy-3.m execution, -O
-FAIL: objc/execute/class-1.m execution, -O
-FAIL: objc/execute/class-10.m execution, -O
-FAIL: objc/execute/class-11.m execution, -O
-FAIL: objc/execute/class-12.m execution, -O
-FAIL: objc/execute/class-13.m execution, -O
-FAIL: objc/execute/class-14.m execution, -O
-FAIL: objc/execute/class-2.m execution, -O
-FAIL: objc/execute/class-3.m execution, -O
-FAIL: objc/execute/class-4.m execution, -O
-FAIL: objc/execute/class-5.m execution, -O
-FAIL: objc/execute/class-6.m execution, -O
-FAIL: objc/execute/class-7.m execution, -O
-FAIL: objc/execute/class-8.m execution, -O
-FAIL: objc/execute/class-9.m execution, -O
-FAIL: objc/execute/compatibility_alias.m execution, -O
-FAIL: objc/execute/formal_protocol-1.m execution, -O
-FAIL: objc/execute/formal_protocol-2.m execution, -O
-FAIL: objc/execute/formal_protocol-3.m execution, -O
-FAIL: objc/execute/formal_protocol-4.m execution, -O
-FAIL: objc/execute/formal_protocol-5.m execution, -O
-FAIL: objc/execute/formal_protocol-7.m execution, -O
-FAIL: objc/execute/initialize.m execution, -O
-FAIL: objc/execute/load.m execution, -O
-FAIL: objc/execute/many_args_method.m execution, -O
-FAIL: objc/execute/nested-3.m execution, -O
-FAIL: objc/execute/no_clash.m execution, -O
-FAIL: objc/execute/np-2.m execution, -O
-FAIL: objc/execute/redefining_self.m execution, -O
-FAIL: objc/execute/root_methods.m execution, -O
-FAIL: objc/execute/static-1.m execution, -O
-FAIL: objc/execute/static-2.m execution, -O
-FAIL: objc/execute/string1.m execution, -O
-FAIL: objc/execute/string2.m execution, -O
-FAIL: objc/execute/string3.m execution, -O
-FAIL: objc/execute/string4.m execution, -O
-FAIL: objc/execute/va_method.m execution, -O
The va-arg-[56].c stuff is expected, since that's the same problem, the
objc stuff is totally unexpected, and I haven't checked yet why this
happens.
Ok for branch and trunk?
Rainer
-----------------------------------------------------------------------------
Rainer Orth, Faculty of Technology, Bielefeld University
Email: ro@TechFak.Uni-Bielefeld.DE
Tue Jun 5 23:53:29 2001 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
* config/alpha/alpha.c (alpha_va_arg): Handle TFmode, TCmode args,
passed by reference.
Index: alpha.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/config/alpha/alpha.c,v
retrieving revision 1.155.4.2
diff -u -p -r1.155.4.2 alpha.c
--- alpha.c 2001/05/13 07:10:02 1.155.4.2
+++ alpha.c 2001/06/05 21:55:17
@@ -4315,6 +4315,7 @@ alpha_va_arg (valist, type)
tree t;
tree offset_field, base_field, addr_tree, addend;
tree wide_type, wide_ofs;
+ int indirect = 0;
if (TARGET_OPEN_VMS)
return std_expand_builtin_va_arg (valist, type);
@@ -4333,7 +4334,13 @@ alpha_va_arg (valist, type)
wide_ofs = save_expr (build1 (CONVERT_EXPR, wide_type, offset_field));
addend = wide_ofs;
- if (FLOAT_TYPE_P (type))
+
+ if (TYPE_MODE (type) == TFmode || TYPE_MODE (type) == TCmode)
+ {
+ indirect = 1;
+ tsize = UNITS_PER_WORD;
+ }
+ else if (FLOAT_TYPE_P (type))
{
tree fpaddend, cond;
@@ -4358,6 +4365,12 @@ alpha_va_arg (valist, type)
offset_field, build_int_2 (tsize, 0)));
TREE_SIDE_EFFECTS (t) = 1;
expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
+
+ if (indirect)
+ {
+ addr = force_reg (Pmode, addr);
+ addr = gen_rtx_MEM (Pmode, addr);
+ }
return addr;
}
More information about the Gcc-patches
mailing list