Index: test/msan/param_tls_limit.cc =================================================================== --- test/msan/param_tls_limit.cc +++ test/msan/param_tls_limit.cc @@ -20,6 +20,16 @@ // In case of no overflow, it is still poisoned. #define NO_OVERFLOW(x) assert(__msan_test_shadow(&x, sizeof(x)) == 0) +#if defined(__x86_64__) +// In x86_64, if argument is partially outside tls, it is considered completly unpoisoned +#define PARTIAL_OVERFLOW(x) OVERFLOW(x) +#else +// In other archs, bigger arguments are splitted in multiple IR arguments, so they are +// considered poisoned till tls limit +#define PARTIAL_OVERFLOW(x) assert(__msan_test_shadow(&x + 800/*kMsanParamTlsSize*/, 1) == -1) +#endif + + template struct S { char x[N]; @@ -34,17 +44,17 @@ } void f801(S<801> s) { - OVERFLOW(s); + PARTIAL_OVERFLOW(s); } void f1000(S<1000> s) { - OVERFLOW(s); + PARTIAL_OVERFLOW(s); } void f_many(int a, double b, S<800> s, int c, double d) { NO_OVERFLOW(a); NO_OVERFLOW(b); - OVERFLOW(s); + PARTIAL_OVERFLOW(s); OVERFLOW(c); OVERFLOW(d); }