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