I've submitted 207175 for a clang 3.8.0 va_list handling problem for powerpc
Mark Millard
markmi at dsl-only.net
Sun Feb 14 03:03:33 UTC 2016
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
More information about the freebsd-toolchain
mailing list