Bug 84762 - GCC for PowerPC32 violates the SysV ABI spec for small struct returns

Franz Sirl Franz.Sirl-kernel@lauterbach.com
Tue Nov 20 10:10:00 GMT 2018


Am 2018-11-19 um 15:36 schrieb Lokesh Janghel:
> Hi Segher,
> 
> I am building the GCC with the following configuration ( using gcc trunk ).
>   ../gcc/configure --target=powerpc-linux
> --prefix=/opt/buckeye/powerpc-linux --disable-shared --disable-threads
> --enable-languages=c --with-newlib
> 
> And my assembly code (without optimization) is:
> $ cc1   -msvr4-struct-return test.c
> .LFB0:
>          stwu 1,-32(1)
> .LCFI0:
>          stw 31,28(1)
> .LCFI1:
>          mr 31,1
> .LCFI2:
>          lis 9,.LC0@ha
>          la 9,.LC0@l(9)
>          lhz 10,0(9)
>          lbz 9,2(9)
>          sth 10,11(31)
>          stb 9,13(31)
>          lhz 10,11(31)
>          lbz 9,13(31)
>          sth 10,8(31)
>          stb 9,10(31)
>          li 9,0
>          lbz 10,8(31)
>          rlwinm 10,10,0,24,31
>          slwi 10,10,16
>          rlwinm 9,9,0,16,7
>          or 9,9,10
>          lbz 10,9(31)
>          rlwinm 10,10,0,24,31
>          slwi 10,10,8
>          rlwinm 9,9,0,24,15
>          or 9,9,10
>           lbz 10,10(31)
>          rlwinm 10,10,0,24,31
>          rlwinm 9,9,0,0,23
>          or 9,9,10
>          mr 3,9
>          addi 11,31,32
>          lwz 31,-4(11)
> .LCFI3:
>          mr 1,11
> .LCFI4:
>          blr
> 
> 
> Assembly code (with optimization -O2) is:
> $ cc1   -msvr4-struct-return -O2 test.c
> .LFB0:
>          stwu 1,-32(1)
> .LCFI0:
>          lis 3,0x11
>          ori 3,3,0x2233
>          addi 1,1,32
> .LCFI1:
>          blr
> 
> As you mentioned assembly code in the GCC Bugzilla, I am not able to
> reproduce the issue.
> Please let me know your options used to reproduce this issue.

Hi,

you already reproduced the issue, according to the ABI, the code should 
look like:

.LFB0:
         stwu 1,-32(1)
.LCFI0:
         lis 3,0x1122
         ori 3,3,0x3300
         addi 1,1,32
.LCFI1:
         blr

So the value being passed around should be left-aligned in the register.

> Sirl,
> If you got the patch for this issue or will look into the issue.

I have an unfinished patch, it misses commandline handling, testcases 
and some code comments. I've attached it.

It's unlikely I can continue to work on it anytime soon :-(.

Franz
-------------- next part --------------
Index: gcc-trunk/gcc/config/rs6000/rs6000-opts.h
===================================================================
--- gcc-trunk/gcc/config/rs6000/rs6000-opts.h	(revision 266271)
+++ gcc-trunk/gcc/config/rs6000/rs6000-opts.h	(working copy)
@@ -130,6 +130,12 @@
   CMODEL_LARGE
 };
 
+/*   */
+enum rs6000_svr4_struct_return {
+  SVR4_STRUCT_RETURN_GNU,
+  SVR4_STRUCT_RETURN_STD
+};
+
 /* Describe which vector unit to use for a given machine mode.  The
    VECTOR_MEM_* and VECTOR_UNIT_* macros assume that Altivec, VSX, and
    P8_VECTOR are contiguous.  */
Index: gcc-trunk/gcc/config/rs6000/rs6000.c
===================================================================
--- gcc-trunk/gcc/config/rs6000/rs6000.c	(revision 266271)
+++ gcc-trunk/gcc/config/rs6000/rs6000.c	(working copy)
@@ -10616,7 +10616,9 @@
 static bool
 rs6000_return_in_msb (const_tree valtype)
 {
-  return (DEFAULT_ABI == ABI_ELFv2
+  return ((DEFAULT_ABI == ABI_ELFv2
+	   || (DEFAULT_ABI == ABI_V4
+	       && rs6000_current_svr4_struct_return == SVR4_STRUCT_RETURN_STD))
 	  && BYTES_BIG_ENDIAN
 	  && AGGREGATE_TYPE_P (valtype)
 	  && (rs6000_function_arg_padding (TYPE_MODE (valtype), valtype)
Index: gcc-trunk/gcc/config/rs6000/rs6000.opt
===================================================================
--- gcc-trunk/gcc/config/rs6000/rs6000.opt	(revision 266271)
+++ gcc-trunk/gcc/config/rs6000/rs6000.opt	(working copy)
@@ -92,6 +92,10 @@
 TargetVariable
 enum rs6000_cmodel rs6000_current_cmodel = CMODEL_SMALL
 
+;; 
+TargetVariable
+enum rs6000_svr4_struct_return rs6000_current_svr4_struct_return = SVR4_STRUCT_RETURN_GNU
+
 ;; What type of reciprocal estimation instructions to generate
 TargetVariable
 unsigned int rs6000_recip_control


More information about the Gcc mailing list