[Compiler-rt][MSan] fix param_tls_limit test for platforms where big arguments are sliced in smaller ones

Reviewers: eugenis

Subscribers: dsanders, jaydeep, sagar, llvm-commits

Differential Revision: http://reviews.llvm.org/D17129

llvm-svn: 262302
This commit is contained in:
Mohit K. Bhakkad 2016-03-01 05:53:30 +00:00
parent d40a55064f
commit 94aa4d7e83
1 changed files with 15 additions and 4 deletions

View File

@ -20,6 +20,17 @@
// 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. Checking last byte of such arg:
#define PARTIAL_OVERFLOW(x) assert(__msan_test_shadow((char *)(&(x) + 1) - 1, 1) == -1)
#endif
template<int N>
struct S {
char x[N];
@ -34,17 +45,17 @@ void f800(S<800> s) {
}
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);
}
@ -54,7 +65,7 @@ void f_many(int a, double b, S<800> s, int c, double d) {
void f_many2(int a, S<800 - 8 - 2> s, int c, double d) {
NO_OVERFLOW(a);
NO_OVERFLOW(s);
OVERFLOW(c);
PARTIAL_OVERFLOW(c);
OVERFLOW(d);
}