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