[compiler-rt] Remove SANITIZER_AARCH64_VMA usage

This patch complete removed SANITIZER_AARCH64_VMA definition and usage.
AArch64 ports now supports runtime VMA detection and instrumentation
for 39 and 42-bit VMA.

It also Rewrite print_address to take a variadic argument list
(the addresses to print) and adjust the tests which uses it to the new
signature.

llvm-svn: 254319
This commit is contained in:
Adhemerval Zanella 2015-11-30 19:43:03 +00:00
parent 9c26161b2e
commit 7a096596b2
14 changed files with 30 additions and 75 deletions

View File

@ -81,16 +81,6 @@
# define SANITIZER_X32 0
#endif
// VMA size definition for architecture that support multiple sizes.
// AArch64 has 3 VMA sizes: 39, 42 and 48.
#if !defined(SANITIZER_AARCH64_VMA)
# define SANITIZER_AARCH64_VMA 39
#else
# if SANITIZER_AARCH64_VMA != 39 && SANITIZER_AARCH64_VMA != 42
# error "invalid SANITIZER_AARCH64_VMA size"
# endif
#endif
// By default we allow to use SizeClassAllocator64 on 64-bit platform.
// But in some cases (e.g. AArch64's 39-bit address space) SizeClassAllocator64
// does not work well and we need to fallback to SizeClassAllocator32.
@ -137,10 +127,8 @@
#define SANITIZER_USES_UID16_SYSCALLS 0
#endif
#if defined(__mips__) || (defined(__aarch64__) && SANITIZER_AARCH64_VMA == 39)
#if defined(__mips__)
# define SANITIZER_POINTER_FORMAT_LENGTH FIRST_32_SECOND_64(8, 10)
#elif defined(__aarch64__) && SANITIZER_AARCH64_VMA == 42
# define SANITIZER_POINTER_FORMAT_LENGTH FIRST_32_SECOND_64(8, 11)
#else
# define SANITIZER_POINTER_FORMAT_LENGTH FIRST_32_SECOND_64(8, 12)
#endif

View File

@ -321,22 +321,6 @@ SignalContext SignalContext::Create(void *siginfo, void *context) {
return SignalContext(context, addr, pc, sp, bp);
}
// This function check is the built VMA matches the runtime one for
// architectures with multiple VMA size.
void CheckVMASize() {
#ifdef __aarch64__
static const unsigned kBuiltVMA = SANITIZER_AARCH64_VMA;
unsigned maxRuntimeVMA =
(MostSignificantSetBitIndex(GET_CURRENT_FRAME()) + 1);
if (kBuiltVMA != maxRuntimeVMA) {
Printf("WARNING: %s runtime VMA is not the one built for.\n",
SanitizerToolName);
Printf("\tBuilt VMA: %u bits\n", kBuiltVMA);
Printf("\tRuntime VMA: %u bits\n", maxRuntimeVMA);
}
#endif
}
} // namespace __sanitizer
#endif // SANITIZER_POSIX

View File

@ -12,9 +12,7 @@ void *Thread(void *a) {
int main() {
barrier_init(&barrier, 2);
fprintf(stderr, "addr=");
print_address(GlobalData);
fprintf(stderr, "\n");
print_address("addr=", 1, GlobalData);
pthread_t t;
pthread_create(&t, 0, Thread, 0);
GlobalData[2] = 43;

View File

@ -12,9 +12,7 @@ void *Thread(void *a) {
int main() {
barrier_init(&barrier, 2);
fprintf(stderr, "addr=");
print_address(GlobalData);
fprintf(stderr, "\n");
print_address("addr=", 1, GlobalData);
pthread_t t;
pthread_create(&t, 0, Thread, 0);
GlobalData[2] = 43;

View File

@ -152,7 +152,7 @@ class LockTest {
fprintf(stderr, "Starting Test1\n");
// CHECK: Starting Test1
Init(5);
fprintf(stderr, "Expecting lock inversion: %p %p\n", A(0), A(1));
print_address("Expecting lock inversion: ", 2, A(0), A(1));
// CHECK: Expecting lock inversion: [[A1:0x[a-f0-9]*]] [[A2:0x[a-f0-9]*]]
Lock_0_1();
Lock_1_0();
@ -178,7 +178,7 @@ class LockTest {
fprintf(stderr, "Starting Test2\n");
// CHECK: Starting Test2
Init(5);
fprintf(stderr, "Expecting lock inversion: %p %p %p\n", A(0), A(1), A(2));
print_address("Expecting lock inversion: ", 3, A(0), A(1), A(2));
// CHECK: Expecting lock inversion: [[A1:0x[a-f0-9]*]] [[A2:0x[a-f0-9]*]] [[A3:0x[a-f0-9]*]]
Lock2(0, 1);
Lock2(1, 2);

View File

@ -11,9 +11,7 @@ void *Thread(void *a) {
int main() {
barrier_init(&barrier, 2);
fprintf(stderr, "addr=");
print_address(GlobalData);
fprintf(stderr, "\n");
print_address("addr=", 1, GlobalData);
pthread_t t;
pthread_create(&t, 0, Thread, 0);
GlobalData[2] = 43;

View File

@ -11,9 +11,7 @@ void *Thread(void *a) {
int main() {
barrier_init(&barrier, 2);
fprintf(stderr, "addr2=");
print_address(&x);
fprintf(stderr, "\n");
print_address("addr2=", 1, &x);
pthread_t t;
pthread_create(&t, 0, Thread, 0);
x = 0;

View File

@ -16,9 +16,7 @@ void *Thread(void *a) {
int main() {
barrier_init(&barrier, 2);
fprintf(stderr, "addr3=");
print_address(XXX::YYY::ZZZ);
fprintf(stderr, "\n");
print_address("addr3=", 1, XXX::YYY::ZZZ);
pthread_t t;
pthread_create(&t, 0, Thread, 0);
XXX::YYY::ZZZ[0] = 0;

View File

@ -23,7 +23,7 @@ void *Thread2(void *x) {
int main() {
barrier_init(&barrier, 2);
fprintf(stderr, "addr=%p\n", &data0[5]);
print_address("addr=", 1, &data0[5]);
pthread_t t[2];
pthread_create(&t[0], NULL, Thread1, NULL);
pthread_create(&t[1], NULL, Thread2, NULL);

View File

@ -22,7 +22,7 @@ void *Thread2(void *x) {
int main() {
barrier_init(&barrier, 2);
fprintf(stderr, "addr=%p\n", &data[5]);
print_address("addr=", 1, &data[5]);
pthread_t t[2];
pthread_create(&t[0], NULL, Thread1, NULL);
pthread_create(&t[1], NULL, Thread2, NULL);

View File

@ -18,8 +18,8 @@ void *Thread2(void *x) {
int main() {
barrier_init(&barrier, 2);
int *data = new int(42);
fprintf(stderr, "ptr1=%p\n", data);
fprintf(stderr, "ptr2=%p\n", (char*)data + 2);
print_address("ptr1=", 1, data);
print_address("ptr2=", 1, (char*)data + 2);
pthread_t t[2];
pthread_create(&t[0], NULL, Thread1, data);
pthread_create(&t[1], NULL, Thread2, data);

View File

@ -18,8 +18,8 @@ void *Thread2(void *x) {
int main() {
barrier_init(&barrier, 2);
int *data = new int(42);
fprintf(stderr, "ptr1=%p\n", data);
fprintf(stderr, "ptr2=%p\n", (char*)data + 2);
print_address("ptr1=", 1, data);
print_address("ptr2=", 1, (char*)data + 2);
pthread_t t[2];
pthread_create(&t[0], NULL, Thread1, data);
pthread_create(&t[1], NULL, Thread2, data);

View File

@ -2,6 +2,7 @@
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
#include "test.h"
void *Thread1(void *p) {
*(int*)p = 42;
@ -26,7 +27,7 @@ int main() {
pthread_t t[2];
pthread_create(&t[0], 0, AllocThread, 0);
pthread_join(t[0], &p);
fprintf(stderr, "addr=%p\n", p);
print_address("addr=", 1, p);
pthread_create(&t[0], 0, Thread1, (char*)p + 16);
pthread_create(&t[1], 0, Thread2, (char*)p + 16);
pthread_join(t[0], 0);

View File

@ -5,6 +5,7 @@
#include <dlfcn.h>
#include <stddef.h>
#include <sched.h>
#include <stdarg.h>
#ifdef __APPLE__
#include <mach/mach_time.h>
@ -39,30 +40,21 @@ void barrier_wait(invisible_barrier_t *barrier) {
// Default instance of the barrier, but a test can declare more manually.
invisible_barrier_t barrier;
void print_address(void *address) {
// On FreeBSD, the %p conversion specifier works as 0x%x and thus does not match
// to the format used in the diagnotic message.
#ifdef __x86_64__
fprintf(stderr, "0x%012lx", (unsigned long) address);
void print_address(const char *str, int n, ...) {
fprintf(stderr, "%s", str);
va_list ap;
va_start(ap, n);
while (n--) {
void *p = va_arg(ap, void *);
#if defined(__x86_64__) || defined(__aarch64__)
// On FreeBSD, the %p conversion specifier works as 0x%x and thus does not
// match to the format used in the diagnotic message.
fprintf(stderr, "0x%012lx ", (unsigned long) p);
#elif defined(__mips64)
fprintf(stderr, "0x%010lx", (unsigned long) address);
#elif defined(__aarch64__)
// AArch64 currently has 3 different VMA (39, 42, and 48 bits) and it requires
// different pointer size to match the diagnostic message.
const char *format = 0;
unsigned long vma = (unsigned long)__builtin_frame_address(0);
vma = 64 - __builtin_clzll(vma);
if (vma == 39)
format = "0x%010lx";
else if (vma == 42)
format = "0x%011lx";
else {
fprintf(stderr, "unsupported vma: %lu\n", vma);
exit(1);
}
fprintf(stderr, format, (unsigned long) address);
fprintf(stderr, "0x%010lx ", (unsigned long) p);
#endif
}
fprintf(stderr, "\n");
}
#ifdef __APPLE__