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>