xref: /freebsd-src/contrib/llvm-project/compiler-rt/lib/scudo/standalone/platform.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
10b57cec5SDimitry Andric //===-- platform.h ----------------------------------------------*- C++ -*-===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
90b57cec5SDimitry Andric #ifndef SCUDO_PLATFORM_H_
100b57cec5SDimitry Andric #define SCUDO_PLATFORM_H_
110b57cec5SDimitry Andric 
12480093f4SDimitry Andric // Transitive includes of stdint.h specify some of the defines checked below.
13480093f4SDimitry Andric #include <stdint.h>
14480093f4SDimitry Andric 
15fe6060f1SDimitry Andric #if defined(__linux__) && !defined(__TRUSTY__)
160b57cec5SDimitry Andric #define SCUDO_LINUX 1
170b57cec5SDimitry Andric #else
180b57cec5SDimitry Andric #define SCUDO_LINUX 0
190b57cec5SDimitry Andric #endif
200b57cec5SDimitry Andric 
21480093f4SDimitry Andric // See https://android.googlesource.com/platform/bionic/+/master/docs/defines.md
22480093f4SDimitry Andric #if defined(__BIONIC__)
230b57cec5SDimitry Andric #define SCUDO_ANDROID 1
240b57cec5SDimitry Andric #else
250b57cec5SDimitry Andric #define SCUDO_ANDROID 0
260b57cec5SDimitry Andric #endif
270b57cec5SDimitry Andric 
280b57cec5SDimitry Andric #if defined(__Fuchsia__)
290b57cec5SDimitry Andric #define SCUDO_FUCHSIA 1
300b57cec5SDimitry Andric #else
310b57cec5SDimitry Andric #define SCUDO_FUCHSIA 0
320b57cec5SDimitry Andric #endif
330b57cec5SDimitry Andric 
34fe6060f1SDimitry Andric #if defined(__TRUSTY__)
35fe6060f1SDimitry Andric #define SCUDO_TRUSTY 1
36fe6060f1SDimitry Andric #else
37fe6060f1SDimitry Andric #define SCUDO_TRUSTY 0
38fe6060f1SDimitry Andric #endif
39fe6060f1SDimitry Andric 
4006c3fb27SDimitry Andric #if defined(__riscv) && (__riscv_xlen == 64)
4106c3fb27SDimitry Andric #define SCUDO_RISCV64 1
4206c3fb27SDimitry Andric #else
4306c3fb27SDimitry Andric #define SCUDO_RISCV64 0
4406c3fb27SDimitry Andric #endif
4506c3fb27SDimitry Andric 
4681ad6265SDimitry Andric #if defined(__LP64__)
470b57cec5SDimitry Andric #define SCUDO_WORDSIZE 64U
480b57cec5SDimitry Andric #else
490b57cec5SDimitry Andric #define SCUDO_WORDSIZE 32U
500b57cec5SDimitry Andric #endif
510b57cec5SDimitry Andric 
520b57cec5SDimitry Andric #if SCUDO_WORDSIZE == 64U
530b57cec5SDimitry Andric #define FIRST_32_SECOND_64(a, b) (b)
540b57cec5SDimitry Andric #else
550b57cec5SDimitry Andric #define FIRST_32_SECOND_64(a, b) (a)
560b57cec5SDimitry Andric #endif
570b57cec5SDimitry Andric 
580b57cec5SDimitry Andric #ifndef SCUDO_CAN_USE_PRIMARY64
590b57cec5SDimitry Andric #define SCUDO_CAN_USE_PRIMARY64 (SCUDO_WORDSIZE == 64U)
600b57cec5SDimitry Andric #endif
610b57cec5SDimitry Andric 
6206c3fb27SDimitry Andric #ifndef SCUDO_CAN_USE_MTE
6306c3fb27SDimitry Andric #define SCUDO_CAN_USE_MTE (SCUDO_LINUX || SCUDO_TRUSTY)
6406c3fb27SDimitry Andric #endif
6506c3fb27SDimitry Andric 
66*5f757f3fSDimitry Andric #ifndef SCUDO_ENABLE_HOOKS
67*5f757f3fSDimitry Andric #define SCUDO_ENABLE_HOOKS 0
68*5f757f3fSDimitry Andric #endif
69*5f757f3fSDimitry Andric 
700b57cec5SDimitry Andric #ifndef SCUDO_MIN_ALIGNMENT_LOG
710b57cec5SDimitry Andric // We force malloc-type functions to be aligned to std::max_align_t, but there
720b57cec5SDimitry Andric // is no reason why the minimum alignment for all other functions can't be 8
730b57cec5SDimitry Andric // bytes. Except obviously for applications making incorrect assumptions.
740b57cec5SDimitry Andric // TODO(kostyak): define SCUDO_MIN_ALIGNMENT_LOG 3
750b57cec5SDimitry Andric #define SCUDO_MIN_ALIGNMENT_LOG FIRST_32_SECOND_64(3, 4)
760b57cec5SDimitry Andric #endif
770b57cec5SDimitry Andric 
780b57cec5SDimitry Andric #if defined(__aarch64__)
790b57cec5SDimitry Andric #define SCUDO_MMAP_RANGE_SIZE FIRST_32_SECOND_64(1ULL << 32, 1ULL << 48)
800b57cec5SDimitry Andric #else
810b57cec5SDimitry Andric #define SCUDO_MMAP_RANGE_SIZE FIRST_32_SECOND_64(1ULL << 32, 1ULL << 47)
820b57cec5SDimitry Andric #endif
830b57cec5SDimitry Andric 
840b57cec5SDimitry Andric // Older gcc have issues aligning to a constexpr, and require an integer.
850b57cec5SDimitry Andric // See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56859 among others.
860b57cec5SDimitry Andric #if defined(__powerpc__) || defined(__powerpc64__)
870b57cec5SDimitry Andric #define SCUDO_CACHE_LINE_SIZE 128
880b57cec5SDimitry Andric #else
890b57cec5SDimitry Andric #define SCUDO_CACHE_LINE_SIZE 64
900b57cec5SDimitry Andric #endif
910b57cec5SDimitry Andric 
920b57cec5SDimitry Andric #define SCUDO_POINTER_FORMAT_LENGTH FIRST_32_SECOND_64(8, 12)
930b57cec5SDimitry Andric 
940b57cec5SDimitry Andric #endif // SCUDO_PLATFORM_H_
95