1f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin/*
2f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin * Copyright (c) 2015 Dmitry V. Levin <ldv@altlinux.org>
339bac055674d23770b9a724221b728e443196ea7Elliott Hughes * Copyright (c) 2015-2017 The strace developers.
4f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin * All rights reserved.
5f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin *
6f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin * Redistribution and use in source and binary forms, with or without
7f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin * modification, are permitted provided that the following conditions
8f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin * are met:
9f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin * 1. Redistributions of source code must retain the above copyright
10f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin *    notice, this list of conditions and the following disclaimer.
11f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin * 2. Redistributions in binary form must reproduce the above copyright
12f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin *    notice, this list of conditions and the following disclaimer in the
13f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin *    documentation and/or other materials provided with the distribution.
14f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin * 3. The name of the author may not be used to endorse or promote products
15f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin *    derived from this software without specific prior written permission.
16f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin *
17f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin */
28f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin
2918907920bb11dc0325821021885b808ff1bbc363Eugene Syromyatnikov#ifndef STRACE_GCC_COMPAT_H
3018907920bb11dc0325821021885b808ff1bbc363Eugene Syromyatnikov#define STRACE_GCC_COMPAT_H
31f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin
32f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin#if defined __GNUC__ && defined __GNUC_MINOR__
33f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin# define GNUC_PREREQ(maj, min)	\
34f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin	((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
35f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin#else
36f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin# define __attribute__(x)	/* empty */
37f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin# define GNUC_PREREQ(maj, min)	0
38f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin#endif
39f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin
40f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin#if GNUC_PREREQ(2, 5)
41f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin# define ATTRIBUTE_NORETURN	__attribute__((__noreturn__))
42f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin#else
43f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin# define ATTRIBUTE_NORETURN	/* empty */
44f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin#endif
45f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin
46f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin#if GNUC_PREREQ(2, 7)
47f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin# define ATTRIBUTE_FORMAT(args)	__attribute__((__format__ args))
48f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin# define ATTRIBUTE_ALIGNED(arg)	__attribute__((__aligned__(arg)))
49f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin# define ATTRIBUTE_PACKED	__attribute__((__packed__))
50f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin#else
51f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin# define ATTRIBUTE_FORMAT(args)	/* empty */
52f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin# define ATTRIBUTE_ALIGNED(arg)	/* empty */
53f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin# define ATTRIBUTE_PACKED	/* empty */
54f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin#endif
55f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin
56f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin#if GNUC_PREREQ(3, 0)
57d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# define SAME_TYPE(x, y)	__builtin_types_compatible_p(typeof(x), typeof(y))
58d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# define FAIL_BUILD_ON_ZERO(expr) (sizeof(int[-1 + 2 * !!(expr)]) * 0)
59d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes/* &(a)[0] is a pointer and not an array, shouldn't be treated as the same */
60d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# define MUST_BE_ARRAY(a) FAIL_BUILD_ON_ZERO(!SAME_TYPE((a), &(a)[0]))
61d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#else
62d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# define SAME_TYPE(x, y)	0
63d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# define MUST_BE_ARRAY(a)	0
64d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#endif
65d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
66d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#if GNUC_PREREQ(3, 0)
67f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin# define ATTRIBUTE_MALLOC	__attribute__((__malloc__))
68f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin#else
69f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin# define ATTRIBUTE_MALLOC	/* empty */
70f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin#endif
71f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin
72f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin#if GNUC_PREREQ(3, 1)
73f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin# define ATTRIBUTE_NOINLINE	__attribute__((__noinline__))
74f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin#else
75f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin# define ATTRIBUTE_NOINLINE	/* empty */
76f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin#endif
77f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin
78b0d23cc2c0e2d9d4dea253ce04955ac6c78ce49eDmitry V. Levin#if GNUC_PREREQ(4, 0)
79b0d23cc2c0e2d9d4dea253ce04955ac6c78ce49eDmitry V. Levin# define ATTRIBUTE_SENTINEL	__attribute__((__sentinel__))
80b0d23cc2c0e2d9d4dea253ce04955ac6c78ce49eDmitry V. Levin#else
81b0d23cc2c0e2d9d4dea253ce04955ac6c78ce49eDmitry V. Levin# define ATTRIBUTE_SENTINEL	/* empty */
82b0d23cc2c0e2d9d4dea253ce04955ac6c78ce49eDmitry V. Levin#endif
83b0d23cc2c0e2d9d4dea253ce04955ac6c78ce49eDmitry V. Levin
84d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#if GNUC_PREREQ(4, 1)
85d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# define ALIGNOF(t_)	__alignof__(t_)
86d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#else
87dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes# define ALIGNOF(t_)	(sizeof(struct { char x_; t_ y_; }) - sizeof(t_))
88d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#endif
89d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
90f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin#if GNUC_PREREQ(4, 3)
91f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin# define ATTRIBUTE_ALLOC_SIZE(args)	__attribute__((__alloc_size__ args))
92f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin#else
93f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin# define ATTRIBUTE_ALLOC_SIZE(args)	/* empty */
94f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin#endif
95f32126ba790dd4e61d43a2140b24f02426297bb6Dmitry V. Levin
9642ceb0fd7f153daab55763b47d1cd23ed630fd47Dmitry V. Levin#endif /* !STRACE_GCC_COMPAT_H */
97