Skip to content

Commit 9ea59e1

Browse files
committed
[sanitizer] Add hexagon support to sanitizer-common
Adds build support for hexagon linux to sanitizer common.
1 parent c64d185 commit 9ea59e1

10 files changed

+210
-63
lines changed

compiler-rt/cmake/Modules/AllSupportedArchDefs.cmake

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ if(APPLE)
2323
endif()
2424

2525
set(ALL_SANITIZER_COMMON_SUPPORTED_ARCH ${X86} ${X86_64} ${PPC64} ${RISCV64}
26-
${ARM32} ${ARM64} ${MIPS32} ${MIPS64} ${S390X} ${SPARC} ${SPARCV9})
26+
${ARM32} ${ARM64} ${MIPS32} ${MIPS64} ${S390X} ${SPARC} ${SPARCV9}
27+
${HEXAGON})
2728
set(ALL_ASAN_SUPPORTED_ARCH ${X86} ${X86_64} ${ARM32} ${ARM64} ${RISCV64}
2829
${MIPS32} ${MIPS64} ${PPC64} ${S390X} ${SPARC} ${SPARCV9})
2930
set(ALL_CRT_SUPPORTED_ARCH ${X86} ${X86_64} ${ARM32} ${ARM64} ${PPC32} ${PPC64} ${RISCV32} ${RISCV64} ${VE})

compiler-rt/lib/sanitizer_common/sanitizer_common.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -697,7 +697,8 @@ enum ModuleArch {
697697
kModuleArchARMV7S,
698698
kModuleArchARMV7K,
699699
kModuleArchARM64,
700-
kModuleArchRISCV64
700+
kModuleArchRISCV64,
701+
kModuleArchHexagon
701702
};
702703

703704
// Sorts and removes duplicates from the container.
@@ -764,6 +765,8 @@ inline const char *ModuleArchToString(ModuleArch arch) {
764765
return "arm64";
765766
case kModuleArchRISCV64:
766767
return "riscv64";
768+
case kModuleArchHexagon:
769+
return "hexagon";
767770
}
768771
CHECK(0 && "Invalid module arch");
769772
return "";

compiler-rt/lib/sanitizer_common/sanitizer_internal_defs.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -177,10 +177,9 @@ typedef long pid_t;
177177
typedef int pid_t;
178178
#endif
179179

180-
#if SANITIZER_FREEBSD || SANITIZER_NETBSD || \
181-
SANITIZER_MAC || \
180+
#if SANITIZER_FREEBSD || SANITIZER_NETBSD || SANITIZER_MAC || \
182181
(SANITIZER_SOLARIS && (defined(_LP64) || _FILE_OFFSET_BITS == 64)) || \
183-
(SANITIZER_LINUX && defined(__x86_64__))
182+
(SANITIZER_LINUX && (defined(__x86_64__) || defined(__hexagon__)))
184183
typedef u64 OFF_T;
185184
#else
186185
typedef uptr OFF_T;

compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -158,9 +158,11 @@ namespace __sanitizer {
158158
#include "sanitizer_syscall_linux_aarch64.inc"
159159
#elif SANITIZER_LINUX && defined(__arm__)
160160
#include "sanitizer_syscall_linux_arm.inc"
161-
#else
162-
#include "sanitizer_syscall_generic.inc"
163-
#endif
161+
# elif SANITIZER_LINUX && defined(__hexagon__)
162+
# include "sanitizer_syscall_linux_hexagon.inc"
163+
# else
164+
# include "sanitizer_syscall_generic.inc"
165+
# endif
164166

165167
// --------------- sanitizer_libc.h
166168
#if !SANITIZER_SOLARIS && !SANITIZER_NETBSD
@@ -2097,9 +2099,14 @@ static void GetPcSpBp(void *context, uptr *pc, uptr *sp, uptr *bp) {
20972099
*pc = ucontext->uc_mcontext.__gregs[REG_PC];
20982100
*bp = ucontext->uc_mcontext.__gregs[REG_S0];
20992101
*sp = ucontext->uc_mcontext.__gregs[REG_SP];
2100-
#else
2101-
# error "Unsupported arch"
2102-
#endif
2102+
# elif defined(__hexagon__)
2103+
ucontext_t *ucontext = (ucontext_t *)context;
2104+
*pc = ucontext->uc_mcontext.pc;
2105+
*bp = ucontext->uc_mcontext.r30;
2106+
*sp = ucontext->uc_mcontext.r29;
2107+
# else
2108+
# error "Unsupported arch"
2109+
# endif
21032110
}
21042111

21052112
void SignalContext::InitPcSpBp() { GetPcSpBp(context, &pc, &sp, &bp); }

compiler-rt/lib/sanitizer_common/sanitizer_platform.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -281,11 +281,12 @@
281281
// mandated by the upstream linux community for all new ports. Other ports
282282
// may still use legacy syscalls.
283283
#ifndef SANITIZER_USES_CANONICAL_LINUX_SYSCALLS
284-
# if (defined(__aarch64__) || defined(__riscv)) && SANITIZER_LINUX
285-
# define SANITIZER_USES_CANONICAL_LINUX_SYSCALLS 1
286-
# else
287-
# define SANITIZER_USES_CANONICAL_LINUX_SYSCALLS 0
288-
# endif
284+
# if (defined(__aarch64__) || defined(__riscv) || defined(__hexagon__)) && \
285+
SANITIZER_LINUX
286+
# define SANITIZER_USES_CANONICAL_LINUX_SYSCALLS 1
287+
# else
288+
# define SANITIZER_USES_CANONICAL_LINUX_SYSCALLS 0
289+
# endif
289290
#endif
290291

291292
// udi16 syscalls can only be used when the following conditions are

compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_linux.cpp

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -28,32 +28,32 @@
2828
// are not defined anywhere in userspace headers. Fake them. This seems to work
2929
// fine with newer headers, too.
3030
#include <linux/posix_types.h>
31-
#if defined(__x86_64__) || defined(__mips__)
32-
#include <sys/stat.h>
33-
#else
34-
#define ino_t __kernel_ino_t
35-
#define mode_t __kernel_mode_t
36-
#define nlink_t __kernel_nlink_t
37-
#define uid_t __kernel_uid_t
38-
#define gid_t __kernel_gid_t
39-
#define off_t __kernel_off_t
40-
#define time_t __kernel_time_t
31+
# if defined(__x86_64__) || defined(__mips__) || defined(__hexagon__)
32+
# include <sys/stat.h>
33+
# else
34+
# define ino_t __kernel_ino_t
35+
# define mode_t __kernel_mode_t
36+
# define nlink_t __kernel_nlink_t
37+
# define uid_t __kernel_uid_t
38+
# define gid_t __kernel_gid_t
39+
# define off_t __kernel_off_t
40+
# define time_t __kernel_time_t
4141
// This header seems to contain the definitions of _kernel_ stat* structs.
42-
#include <asm/stat.h>
43-
#undef ino_t
44-
#undef mode_t
45-
#undef nlink_t
46-
#undef uid_t
47-
#undef gid_t
48-
#undef off_t
49-
#endif
50-
51-
#include <linux/aio_abi.h>
52-
53-
#if !SANITIZER_ANDROID
54-
#include <sys/statfs.h>
55-
#include <linux/perf_event.h>
56-
#endif
42+
# include <asm/stat.h>
43+
# undef ino_t
44+
# undef mode_t
45+
# undef nlink_t
46+
# undef uid_t
47+
# undef gid_t
48+
# undef off_t
49+
# endif
50+
51+
# include <linux/aio_abi.h>
52+
53+
# if !SANITIZER_ANDROID
54+
# include <sys/statfs.h>
55+
# include <linux/perf_event.h>
56+
# endif
5757

5858
using namespace __sanitizer;
5959

@@ -63,9 +63,9 @@ namespace __sanitizer {
6363
#endif
6464
} // namespace __sanitizer
6565

66-
#if !defined(__powerpc64__) && !defined(__x86_64__) && !defined(__aarch64__)\
67-
&& !defined(__mips__) && !defined(__s390__)\
68-
&& !defined(__sparc__) && !defined(__riscv)
66+
# if !defined(__powerpc64__) && !defined(__x86_64__) && \
67+
!defined(__aarch64__) && !defined(__mips__) && !defined(__s390__) && \
68+
!defined(__sparc__) && !defined(__riscv) && !defined(__hexagon__)
6969
COMPILER_CHECK(struct___old_kernel_stat_sz == sizeof(struct __old_kernel_stat));
7070
#endif
7171

compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -91,10 +91,10 @@
9191
#if SANITIZER_LINUX
9292
# include <utime.h>
9393
# include <sys/ptrace.h>
94-
#if defined(__mips64) || defined(__aarch64__) || defined(__arm__) || \
95-
SANITIZER_RISCV64
96-
# include <asm/ptrace.h>
97-
# ifdef __arm__
94+
# if defined(__mips64) || defined(__aarch64__) || defined(__arm__) || \
95+
defined(__hexagon__) || SANITIZER_RISCV64
96+
# include <asm/ptrace.h>
97+
# ifdef __arm__
9898
typedef struct user_fpregs elf_fpregset_t;
9999
# define ARM_VFPREGS_SIZE_ASAN (32 * 8 /*fpregs*/ + 4 /*fpscr*/)
100100
# if !defined(ARM_VFPREGS_SIZE)
@@ -242,12 +242,13 @@ namespace __sanitizer {
242242
defined(__powerpc64__) || defined(__arch64__) || defined(__sparcv9) || \
243243
defined(__x86_64__) || SANITIZER_RISCV64
244244
#define SIZEOF_STRUCT_USTAT 32
245-
#elif defined(__arm__) || defined(__i386__) || defined(__mips__) \
246-
|| defined(__powerpc__) || defined(__s390__) || defined(__sparc__)
247-
#define SIZEOF_STRUCT_USTAT 20
248-
#else
249-
#error Unknown size of struct ustat
250-
#endif
245+
# elif defined(__arm__) || defined(__i386__) || defined(__mips__) || \
246+
defined(__powerpc__) || defined(__s390__) || defined(__sparc__) || \
247+
defined(__hexagon__)
248+
# define SIZEOF_STRUCT_USTAT 20
249+
# else
250+
# error Unknown size of struct ustat
251+
# endif
251252
unsigned struct_ustat_sz = SIZEOF_STRUCT_USTAT;
252253
unsigned struct_rlimit64_sz = sizeof(struct rlimit64);
253254
unsigned struct_statvfs64_sz = sizeof(struct statvfs64);

compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,10 @@ const unsigned struct_kernel_stat64_sz = 104;
102102
#elif SANITIZER_RISCV64
103103
const unsigned struct_kernel_stat_sz = 128;
104104
const unsigned struct_kernel_stat64_sz = 0; // RISCV64 does not use stat64
105-
#endif
105+
# elif defined(__hexagon__)
106+
const unsigned struct_kernel_stat_sz = 128;
107+
const unsigned struct_kernel_stat64_sz = 0;
108+
# endif
106109
struct __sanitizer_perf_event_attr {
107110
unsigned type;
108111
unsigned size;
@@ -367,7 +370,7 @@ struct __sanitizer_group {
367370
char **gr_mem;
368371
};
369372

370-
#if defined(__x86_64__) && !defined(_LP64)
373+
# if (defined(__x86_64__) && !defined(_LP64)) || defined(__hexagon__)
371374
typedef long long __sanitizer_time_t;
372375
#else
373376
typedef long __sanitizer_time_t;
@@ -475,23 +478,23 @@ struct __sanitizer_dirent {
475478
unsigned short d_reclen;
476479
// more fields that we don't care about
477480
};
478-
#elif SANITIZER_ANDROID || defined(__x86_64__)
481+
# elif SANITIZER_ANDROID || defined(__x86_64__) || defined(__hexagon__)
479482
struct __sanitizer_dirent {
480483
unsigned long long d_ino;
481484
unsigned long long d_off;
482485
unsigned short d_reclen;
483486
// more fields that we don't care about
484487
};
485-
#else
488+
# else
486489
struct __sanitizer_dirent {
487490
uptr d_ino;
488491
uptr d_off;
489492
unsigned short d_reclen;
490493
// more fields that we don't care about
491494
};
492-
#endif
495+
# endif
493496

494-
#if SANITIZER_LINUX && !SANITIZER_ANDROID
497+
# if SANITIZER_LINUX && !SANITIZER_ANDROID
495498
struct __sanitizer_dirent64 {
496499
unsigned long long d_ino;
497500
unsigned long long d_off;
@@ -511,8 +514,8 @@ typedef int __sanitizer_clockid_t;
511514
#endif
512515

513516
#if SANITIZER_LINUX
514-
#if defined(_LP64) || defined(__x86_64__) || defined(__powerpc__) || \
515-
defined(__mips__)
517+
# if defined(_LP64) || defined(__x86_64__) || defined(__powerpc__) || \
518+
defined(__mips__) || defined(__hexagon__)
516519
typedef unsigned __sanitizer___kernel_uid_t;
517520
typedef unsigned __sanitizer___kernel_gid_t;
518521
#else

compiler-rt/lib/sanitizer_common/sanitizer_stacktrace.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ namespace __sanitizer {
2222
uptr StackTrace::GetNextInstructionPc(uptr pc) {
2323
#if defined(__sparc__) || defined(__mips__)
2424
return pc + 8;
25-
#elif defined(__powerpc__) || defined(__arm__) || defined(__aarch64__)
25+
#elif defined(__powerpc__) || defined(__arm__) || defined(__aarch64__) || \
26+
defined(__hexagon__)
2627
return pc + 4;
2728
#elif SANITIZER_RISCV64
2829
// Current check order is 4 -> 2 -> 6 -> 8

0 commit comments

Comments
 (0)