I've submitted 207175 for a clang 3.8.0 va_list handling problem for powerpc

Roman Divacky rdivacky at vlakno.cz
Sun Feb 14 19:31:28 UTC 2016


Fwiw, the code to handle the vaarg is in 
tools/clang/lib/CodeGen/TargetInfo.cpp:PPC32_SVR4_ABIInfo::EmitVAArg()

You can take a look to see whats wrong.

On Sat, Feb 13, 2016 at 07:03:29PM -0800, Mark Millard wrote:
> I've isolated another clang 3.8.0 TARGET_ARCH=powerpc SEGV problem that shows up for using clang 3.8.0 to buildworld/installworld for powerpc.
> 
> > ls -l -n /
> 
> gets a SEGV. As listed in https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=207175 ( and  https://llvm.org/bugs/show_bug.cgi?id=26605 ) the following simplified program also gets the SEGV on powerpc:
> 
> > #include <stdarg.h> // for va_list, va_start, va_arg, va_end
> > #include <stdint.h> // for intmax_t
> > 
> > intmax_t
> > va_test (char *s, ...)
> > {
> >     va_list vap;
> > 
> >     va_start(vap, s);
> > 
> >     char*        t0 = va_arg(vap, char*);
> >     unsigned int o0 = va_arg(vap, unsigned int);
> >     int          c0 = va_arg(vap, int);
> >     unsigned int u0 = va_arg(vap, unsigned int);
> >     int          c1 = va_arg(vap, int);
> >     char *       t1 = va_arg(vap, char*);
> >  
> >     intmax_t     j0 = va_arg(vap, intmax_t); // This spans into overflow_arg_area.
> > 
> >     int          c2 = va_arg(vap, int);      // A copy was put in the 
> >                                              // overflow_arg_area because of the
> >                                              // above.
> >                                              // But this tries to extract from the
> >                                              // last 4 bytes of the reg_save_area.
> >                                              // It does not increment the
> >                                              // overflow_arg_area position pointer
> >                                              // past the copy that is there.
> > 
> >     char *       t2 = va_arg(vap, char*);    // The lack of increment before makes
> >                                              // this extraction off by 4 bytes.
> > 
> >     char         t2fc = *t2;  // <<< This gets SEGV. t2 actually got what should be
> >                               //     the c2 value.
> > 
> >     intmax_t     j1 = va_arg(vap, intmax_t);
> > 
> >     va_end(vap);
> > 
> >     return (intmax_t) ((s-t2)+(t0-t1)+o0+u0+j0+j1+c0+c1+c2+t2fc);
> >     // Avoid any optimize-away for lack of use.
> > }
> > 
> > int main(void)
> > {
> >     char         s[1025] = "test string for this";
> > 
> >     char*        t0 = s + 5;
> >     unsigned int o0 = 3;
> >     int          c0 = 1;
> >     unsigned int u0 = 1;
> >     int          c1 = 3;
> >     char *       t1 = s + 12;
> >     intmax_t     j0 = 314159265358979323;
> >     int          c2 = 4;
> >     char *       t2 = s + 16;
> >     intmax_t     j1 = ~314159265358979323;
> > 
> >     intmax_t      result = va_test(s,t0,o0,c0,u0,c1,t1,j0,c1,t2,j1);
> > 
> >     return (int) (result - (intmax_t) ((s-t2)+(t0-t1)+o0+u0+j0+j1+c0+c1+c2+*t2));
> >     // Avoid any optimize-away for lack of use.
> > }
> 
> 
> 
> ===
> Mark Millard
> markmi at dsl-only.net
> 
> _______________________________________________
> freebsd-toolchain at freebsd.org mailing list
> https://lists.freebsd.org/mailman/listinfo/freebsd-toolchain
> To unsubscribe, send any mail to "freebsd-toolchain-unsubscribe at freebsd.org"


More information about the freebsd-ppc mailing list