Rainer Orth 82af008d98
[safestack] Various 32-bit Linux fixes (#99455)
When enabling 32-bit testing on Linux/i386 and Linux/sparc, many tests
`FAIL`:

- All Linux/i386 tests `FAIL` with ``` safestack CHECK failed:
/vol/llvm/src/llvm-project/local/compiler-rt/lib/safestack/safestack.cpp:95
MAP_FAILED != addr ``` because the safestack `mmap` implementation
doesn't work there. This patch adjusts it to match the
`sanitizer_linux.cpp.c` one.
- On 32-bit Linux/sparc, the `pthread*.c` tests `FAIL` because a `tid_t`
(`uint64_t`) `tid` arg was passed to `syscall(SYS_tgkill)` while `tid`
is actually a `pid_t` (`int`). Fixed by adding a cast.

Tested on `x86_64-pc-linux-gnu` (32 and 64-bit) and
`sparc64-unknown-linux-gnu` (32 and 64-bit).
2024-07-19 07:15:10 +02:00

54 lines
1.7 KiB
C++

//===-- safestack_util.h --------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This file contains utility code for SafeStack implementation.
//
//===----------------------------------------------------------------------===//
#ifndef SAFESTACK_UTIL_H
#define SAFESTACK_UTIL_H
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
namespace safestack {
#define SFS_CHECK(a) \
do { \
if (!(a)) { \
fprintf(stderr, "safestack CHECK failed: %s:%d %s\n", __FILE__, \
__LINE__, #a); \
abort(); \
}; \
} while (false)
inline size_t RoundUpTo(size_t size, size_t boundary) {
SFS_CHECK((boundary & (boundary - 1)) == 0);
return (size + boundary - 1) & ~(boundary - 1);
}
inline constexpr bool IsAligned(size_t a, size_t alignment) {
return (a & (alignment - 1)) == 0;
}
class MutexLock {
public:
explicit MutexLock(pthread_mutex_t &mutex) : mutex_(&mutex) {
pthread_mutex_lock(mutex_);
}
~MutexLock() { pthread_mutex_unlock(mutex_); }
private:
pthread_mutex_t *mutex_ = nullptr;
};
} // namespace safestack
#endif // SAFESTACK_UTIL_H