Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 13 Feb 2016 19:03:29 -0800
From:      Mark Millard <markmi@dsl-only.net>
To:        FreeBSD PowerPC ML <freebsd-ppc@freebsd.org>, FreeBSD Toolchain <freebsd-toolchain@freebsd.org>
Subject:   I've submitted 207175 for a clang 3.8.0 va_list handling problem for powerpc
Message-ID:  <F6846682-10F7-4D0D-A691-ED8D4366805C@dsl-only.net>

next in thread | raw e-mail | index | archive | help
I've isolated another clang 3.8.0 TARGET_ARCH=3Dpowerpc 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=3D207175 ( and  =
https://llvm.org/bugs/show_bug.cgi?id=3D26605 ) 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
>=20
> intmax_t
> va_test (char *s, ...)
> {
>     va_list vap;
>=20
>     va_start(vap, s);
>=20
>     char*        t0 =3D va_arg(vap, char*);
>     unsigned int o0 =3D va_arg(vap, unsigned int);
>     int          c0 =3D va_arg(vap, int);
>     unsigned int u0 =3D va_arg(vap, unsigned int);
>     int          c1 =3D va_arg(vap, int);
>     char *       t1 =3D va_arg(vap, char*);
> =20
>     intmax_t     j0 =3D va_arg(vap, intmax_t); // This spans into =
overflow_arg_area.
>=20
>     int          c2 =3D va_arg(vap, int);      // A copy was put in =
the=20
>                                              // 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.
>=20
>     char *       t2 =3D va_arg(vap, char*);    // The lack of =
increment before makes
>                                              // this extraction off by =
4 bytes.
>=20
>     char         t2fc =3D *t2;  // <<< This gets SEGV. t2 actually got =
what should be
>                               //     the c2 value.
>=20
>     intmax_t     j1 =3D va_arg(vap, intmax_t);
>=20
>     va_end(vap);
>=20
>     return (intmax_t) ((s-t2)+(t0-t1)+o0+u0+j0+j1+c0+c1+c2+t2fc);
>     // Avoid any optimize-away for lack of use.
> }
>=20
> int main(void)
> {
>     char         s[1025] =3D "test string for this";
>=20
>     char*        t0 =3D s + 5;
>     unsigned int o0 =3D 3;
>     int          c0 =3D 1;
>     unsigned int u0 =3D 1;
>     int          c1 =3D 3;
>     char *       t1 =3D s + 12;
>     intmax_t     j0 =3D 314159265358979323;
>     int          c2 =3D 4;
>     char *       t2 =3D s + 16;
>     intmax_t     j1 =3D ~314159265358979323;
>=20
>     intmax_t      result =3D va_test(s,t0,o0,c0,u0,c1,t1,j0,c1,t2,j1);
>=20
>     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.
> }



=3D=3D=3D
Mark Millard
markmi at dsl-only.net




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?F6846682-10F7-4D0D-A691-ED8D4366805C>