| //===-- sanitizer_platform_limits_linux.cpp -------------------------------===// |
| // |
| // 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 is a part of Sanitizer common code. |
| // |
| // Sizes and layouts of linux kernel data structures. |
| //===----------------------------------------------------------------------===// |
| |
| // This is a separate compilation unit for linux headers that conflict with |
| // userspace headers. |
| // Most "normal" includes go in sanitizer_platform_limits_posix.cpp |
| |
| #include "sanitizer_platform.h" |
| #if SANITIZER_LINUX |
| |
| #include "sanitizer_internal_defs.h" |
| #include "sanitizer_platform_limits_posix.h" |
| |
| // For offsetof -> __builtin_offsetof definition. |
| #include <stddef.h> |
| |
| // With old kernels (and even new kernels on powerpc) asm/stat.h uses types that |
| // are not defined anywhere in userspace headers. Fake them. This seems to work |
| // fine with newer headers, too. Beware that with <sys/stat.h>, struct stat |
| // takes the form of struct stat64 on 32-bit platforms if _FILE_OFFSET_BITS=64. |
| // Also, for some platforms (e.g. mips) there are additional members in the |
| // <sys/stat.h> struct stat:s. |
| #include <linux/posix_types.h> |
| # if defined(__x86_64__) || defined(__mips__) || defined(__hexagon__) |
| # include <sys/stat.h> |
| # else |
| # define ino_t __kernel_ino_t |
| # define mode_t __kernel_mode_t |
| # define nlink_t __kernel_nlink_t |
| # define uid_t __kernel_uid_t |
| # define gid_t __kernel_gid_t |
| # define off_t __kernel_off_t |
| # define time_t __kernel_time_t |
| // This header seems to contain the definitions of _kernel_ stat* structs. |
| # include <asm/stat.h> |
| # undef ino_t |
| # undef mode_t |
| # undef nlink_t |
| # undef uid_t |
| # undef gid_t |
| # undef off_t |
| # endif |
| |
| # include <linux/aio_abi.h> |
| |
| # if !SANITIZER_ANDROID |
| # include <sys/statfs.h> |
| # include <linux/perf_event.h> |
| # endif |
| |
| using namespace __sanitizer; |
| |
| namespace __sanitizer { |
| #if !SANITIZER_ANDROID |
| unsigned struct_statfs64_sz = sizeof(struct statfs64); |
| #endif |
| } // namespace __sanitizer |
| |
| # if !defined(__powerpc64__) && !defined(__x86_64__) && \ |
| !defined(__aarch64__) && !defined(__mips__) && !defined(__s390__) && \ |
| !defined(__sparc__) && !defined(__riscv) && !defined(__hexagon__) |
| COMPILER_CHECK(struct___old_kernel_stat_sz == sizeof(struct __old_kernel_stat)); |
| #endif |
| |
| COMPILER_CHECK(struct_kernel_stat_sz == sizeof(struct stat)); |
| |
| #if defined(__i386__) |
| COMPILER_CHECK(struct_kernel_stat64_sz == sizeof(struct stat64)); |
| #endif |
| |
| CHECK_TYPE_SIZE(io_event); |
| CHECK_SIZE_AND_OFFSET(io_event, data); |
| CHECK_SIZE_AND_OFFSET(io_event, obj); |
| CHECK_SIZE_AND_OFFSET(io_event, res); |
| CHECK_SIZE_AND_OFFSET(io_event, res2); |
| |
| #if !SANITIZER_ANDROID |
| COMPILER_CHECK(sizeof(struct __sanitizer_perf_event_attr) <= |
| sizeof(struct perf_event_attr)); |
| CHECK_SIZE_AND_OFFSET(perf_event_attr, type); |
| CHECK_SIZE_AND_OFFSET(perf_event_attr, size); |
| #endif |
| |
| COMPILER_CHECK(iocb_cmd_pread == IOCB_CMD_PREAD); |
| COMPILER_CHECK(iocb_cmd_pwrite == IOCB_CMD_PWRITE); |
| #if !SANITIZER_ANDROID |
| COMPILER_CHECK(iocb_cmd_preadv == IOCB_CMD_PREADV); |
| COMPILER_CHECK(iocb_cmd_pwritev == IOCB_CMD_PWRITEV); |
| #endif |
| |
| CHECK_TYPE_SIZE(iocb); |
| CHECK_SIZE_AND_OFFSET(iocb, aio_data); |
| // Skip aio_key, it's weird. |
| CHECK_SIZE_AND_OFFSET(iocb, aio_lio_opcode); |
| CHECK_SIZE_AND_OFFSET(iocb, aio_reqprio); |
| CHECK_SIZE_AND_OFFSET(iocb, aio_fildes); |
| CHECK_SIZE_AND_OFFSET(iocb, aio_buf); |
| CHECK_SIZE_AND_OFFSET(iocb, aio_nbytes); |
| CHECK_SIZE_AND_OFFSET(iocb, aio_offset); |
| |
| #endif // SANITIZER_LINUX |