File: compiler.h

package info (click to toggle)
lttng-modules 2.14.3-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 4,808 kB
  • sloc: ansic: 74,851; sh: 548; makefile: 62
file content (84 lines) | stat: -rw-r--r-- 2,010 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
/* SPDX-License-Identifier: (GPL-2.0-only or LGPL-2.1-only)
 *
 * wrapper/compiler.h
 *
 * Copyright (C) 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
 */

#ifndef _LTTNG_WRAPPER_COMPILER_H
#define _LTTNG_WRAPPER_COMPILER_H

#include <linux/compiler.h>
#include <lttng/kernel-version.h>

/*
 * Don't allow compiling with buggy compiler.
 */

#ifdef GCC_VERSION

/*
 * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58854
 */
# ifdef __ARMEL__
#  if GCC_VERSION >= 40800 && GCC_VERSION <= 40802
#   error Your gcc version produces clobbered frame accesses
#  endif
# endif

/*
 * https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63293
 */
# ifdef __aarch64__
#  if GCC_VERSION < 50100
#   error Your gcc version performs unsafe access to deallocated stack
#  endif
# endif

#endif

/*
 * READ/WRITE_ONCE were introduced in kernel 3.19 and ACCESS_ONCE
 * was removed in 4.15. Prefer READ/WRITE but fallback to ACCESS
 * when they are not available.
 */
#ifndef READ_ONCE
# define READ_ONCE(x)		ACCESS_ONCE(x)
#endif

#ifndef WRITE_ONCE
# define WRITE_ONCE(x, val)	({ ACCESS_ONCE(x) = val; })
#endif

/*
 * In v4.15 a smp read barrier was added to READ_ONCE to replace
 * lockless_dereference(), replicate this behavior on prior kernels
 * and remove calls to smp_read_barrier_depends which was dropped
 * in v5.9.
 */
#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,15,0))
#define LTTNG_READ_ONCE(x)	READ_ONCE(x)
#else
#define LTTNG_READ_ONCE(x)			\
({						\
	typeof(x) __val = READ_ONCE(x);		\
	smp_read_barrier_depends();		\
	__val;					\
})
#endif

#define __LTTNG_COMPOUND_LITERAL(type, ...)	(type[]) { __VA_ARGS__ }

/*
 * The static_assert macro was defined by the kernel in v5.1.
 * If the macro is not defined, we define it.
 * (kernel source: include/linux/build_bug.h)
 */
#ifndef static_assert

# define static_assert(expr, ...)  __static_assert(expr, ##__VA_ARGS__, #expr)
# define __static_assert(expr, msg, ...) _Static_assert(expr, msg)

#endif

#endif /* _LTTNG_WRAPPER_COMPILER_H */