1/**************************************************************************
2 *
3 * Copyright 2007-2008 VMware, Inc.
4 * All Rights Reserved.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sub license, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
13 *
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
16 * of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 *
26 **************************************************************************/
27
28#ifndef P_COMPILER_H
29#define P_COMPILER_H
30
31
32#include "c99_compat.h" /* inline, __func__, etc. */
33
34#include "p_config.h"
35
36#include "util/macros.h"
37
38#include <stdlib.h>
39#include <string.h>
40#include <stddef.h>
41#include <stdarg.h>
42#include <limits.h>
43
44
45#if defined(_WIN32) && !defined(__WIN32__)
46#define __WIN32__
47#endif
48
49#if defined(_MSC_VER)
50
51#include <intrin.h>
52
53/* Avoid 'expression is always true' warning */
54#pragma warning(disable: 4296)
55
56#endif /* _MSC_VER */
57
58
59/*
60 * Alternative stdint.h and stdbool.h headers are supplied in include/c99 for
61 * systems that lack it.
62 */
63#include <stdint.h>
64#include <stdbool.h>
65
66
67#ifdef __cplusplus
68extern "C" {
69#endif
70
71
72#if !defined(__HAIKU__) && !defined(__USE_MISC) && !defined(_NETBSD_SOURCE)
73#if !defined(PIPE_OS_ANDROID)
74typedef unsigned int       uint;
75#endif
76typedef unsigned short     ushort;
77#endif
78typedef unsigned char      ubyte;
79
80typedef unsigned char boolean;
81#ifndef TRUE
82#define TRUE  true
83#endif
84#ifndef FALSE
85#define FALSE false
86#endif
87
88#ifndef va_copy
89#ifdef __va_copy
90#define va_copy(dest, src) __va_copy((dest), (src))
91#else
92#define va_copy(dest, src) (dest) = (src)
93#endif
94#endif
95
96
97/* XXX: Use standard `__func__` instead */
98#ifndef __FUNCTION__
99#  define __FUNCTION__ __func__
100#endif
101
102
103/* This should match linux gcc cdecl semantics everywhere, so that we
104 * just codegen one calling convention on all platforms.
105 */
106#ifdef _MSC_VER
107#define PIPE_CDECL __cdecl
108#else
109#define PIPE_CDECL
110#endif
111
112
113
114#if defined(__GNUC__)
115#define PIPE_DEPRECATED  __attribute__((__deprecated__))
116#else
117#define PIPE_DEPRECATED
118#endif
119
120
121
122/* Macros for data alignment. */
123#if defined(__GNUC__)
124
125/* See http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Type-Attributes.html */
126#define PIPE_ALIGN_TYPE(_alignment, _type) _type __attribute__((aligned(_alignment)))
127
128/* See http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Variable-Attributes.html */
129#define PIPE_ALIGN_VAR(_alignment) __attribute__((aligned(_alignment)))
130
131#if defined(__GNUC__) && !defined(PIPE_ARCH_X86_64)
132#define PIPE_ALIGN_STACK __attribute__((force_align_arg_pointer))
133#else
134#define PIPE_ALIGN_STACK
135#endif
136
137#elif defined(_MSC_VER)
138
139/* See http://msdn.microsoft.com/en-us/library/83ythb65.aspx */
140#define PIPE_ALIGN_TYPE(_alignment, _type) __declspec(align(_alignment)) _type
141#define PIPE_ALIGN_VAR(_alignment) __declspec(align(_alignment))
142
143#define PIPE_ALIGN_STACK
144
145#elif defined(SWIG) || defined(__lint__)
146
147#define PIPE_ALIGN_TYPE(_alignment, _type) _type
148#define PIPE_ALIGN_VAR(_alignment)
149
150#define PIPE_ALIGN_STACK
151
152#else
153
154#error "Unsupported compiler"
155
156#endif
157
158
159#if defined(__GNUC__)
160
161#define PIPE_READ_WRITE_BARRIER() __asm__("":::"memory")
162
163#elif defined(_MSC_VER)
164
165#define PIPE_READ_WRITE_BARRIER() _ReadWriteBarrier()
166
167#elif defined(__lint__)
168
169#define PIPE_READ_WRITE_BARRIER() /* */
170
171#else
172
173#warning "Unsupported compiler"
174#define PIPE_READ_WRITE_BARRIER() /* */
175
176#endif
177
178#if defined(__cplusplus)
179}
180#endif
181
182
183#endif /* P_COMPILER_H */
184