p_compiler.h revision 26c78a4968a3c10ca006699d240150e6aa4b4250
176818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell/**************************************************************************
276818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell *
36f238275c7c19f7e287b47276e6b4060c270599fMichal Krol * Copyright 2007-2008 Tungsten Graphics, Inc., Cedar Park, Texas.
476818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell * All Rights Reserved.
576818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell *
676818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a
776818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell * copy of this software and associated documentation files (the
876818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell * "Software"), to deal in the Software without restriction, including
976818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell * without limitation the rights to use, copy, modify, merge, publish,
1076818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell * distribute, sub license, and/or sell copies of the Software, and to
1176818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell * permit persons to whom the Software is furnished to do so, subject to
1276818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell * the following conditions:
1376818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell *
1476818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell * The above copyright notice and this permission notice (including the
1576818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell * next paragraph) shall be included in all copies or substantial portions
1676818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell * of the Software.
1776818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell *
1876818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
1976818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
2076818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
2176818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
2276818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
2376818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
2476818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2576818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell *
2676818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell **************************************************************************/
2776818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell
2876818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell#ifndef P_COMPILER_H
2976818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell#define P_COMPILER_H
3076818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell
319791d7f64c5a58b9c1bf32d00c71e0e031f54f70José Fonseca
32dacfef158943665fc0d11035867d14ff1f5db332José Fonseca#include "p_config.h"
33dacfef158943665fc0d11035867d14ff1f5db332José Fonseca
343b5ee3d6de2c08faf69c701bf05d8f33ccd01502José Fonseca#ifndef XFree86Server
3576818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell#include <stdlib.h>
3676818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell#include <string.h>
373b5ee3d6de2c08faf69c701bf05d8f33ccd01502José Fonseca#else
383b5ee3d6de2c08faf69c701bf05d8f33ccd01502José Fonseca#include "xf86_ansic.h"
393b5ee3d6de2c08faf69c701bf05d8f33ccd01502José Fonseca#include "xf86_libc.h"
403b5ee3d6de2c08faf69c701bf05d8f33ccd01502José Fonseca#endif
4176818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell
42bef9b40c3904fdffea6cc426c5c82ed3ab70a902michal
43bef9b40c3904fdffea6cc426c5c82ed3ab70a902michal#if defined(_WIN32) && !defined(__WIN32__)
44bef9b40c3904fdffea6cc426c5c82ed3ab70a902michal#define __WIN32__
45bef9b40c3904fdffea6cc426c5c82ed3ab70a902michal#endif
46bef9b40c3904fdffea6cc426c5c82ed3ab70a902michal
47e8b52b3f5682c969e58077d42f5aebdad5d32e89José Fonseca#if defined(_MSC_VER)
48e8de5c70e3370e9112a5facc870075eea60c4c46José Fonseca
49e8de5c70e3370e9112a5facc870075eea60c4c46José Fonseca/* Avoid 'expression is always true' warning */
50e8de5c70e3370e9112a5facc870075eea60c4c46José Fonseca#pragma warning(disable: 4296)
51e8de5c70e3370e9112a5facc870075eea60c4c46José Fonseca
52e8b52b3f5682c969e58077d42f5aebdad5d32e89José Fonseca#endif /* _MSC_VER */
53e8de5c70e3370e9112a5facc870075eea60c4c46José Fonseca
54e8de5c70e3370e9112a5facc870075eea60c4c46José Fonseca
55dc6bcc92ee78e09bb1b5baec84e229817dfed7f4José Fonseca/*
56dc6bcc92ee78e09bb1b5baec84e229817dfed7f4José Fonseca * Alternative stdint.h and stdbool.h headers are supplied in include/c99 for
57dc6bcc92ee78e09bb1b5baec84e229817dfed7f4José Fonseca * systems that lack it.
58dc6bcc92ee78e09bb1b5baec84e229817dfed7f4José Fonseca */
59ae10775b731c8c58aa42f8046b6b557b4659cb7cJosé Fonseca#ifndef __STDC_LIMIT_MACROS
60ae10775b731c8c58aa42f8046b6b557b4659cb7cJosé Fonseca#define __STDC_LIMIT_MACROS 1
61ae10775b731c8c58aa42f8046b6b557b4659cb7cJosé Fonseca#endif
62271f9dac79a9247de9a57f4d248e404bf1652a13José Fonseca#include <stdint.h>
6355d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca#include <stdbool.h>
64271f9dac79a9247de9a57f4d248e404bf1652a13José Fonseca
65271f9dac79a9247de9a57f4d248e404bf1652a13José Fonseca
66c6c44bf48124dd5b4661014a8d58482c5a54557faljen#ifndef __HAIKU__
6755d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonsecatypedef unsigned int       uint;
6855d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonsecatypedef unsigned short     ushort;
69c6c44bf48124dd5b4661014a8d58482c5a54557faljen#endif
70c6c44bf48124dd5b4661014a8d58482c5a54557faljentypedef unsigned char      ubyte;
7155d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca
7255d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonsecatypedef unsigned char boolean;
7355d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca#ifndef TRUE
7455d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca#define TRUE  true
7555d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca#endif
7655d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca#ifndef FALSE
7755d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca#define FALSE false
7855d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca#endif
7976818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell
802fc54f5bb56a7714c843fc5a6a3bb6895af9babcBrian
8176818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell/* Function inlining */
82b3b7c757a9873007ee033693b06647b378301075José Fonseca#ifndef INLINE
83b3b7c757a9873007ee033693b06647b378301075José Fonseca#  ifdef __cplusplus
84b3b7c757a9873007ee033693b06647b378301075José Fonseca#    define INLINE inline
85b3b7c757a9873007ee033693b06647b378301075José Fonseca#  elif defined(__GNUC__)
86b3b7c757a9873007ee033693b06647b378301075José Fonseca#    define INLINE __inline__
87b3b7c757a9873007ee033693b06647b378301075José Fonseca#  elif defined(_MSC_VER)
88b3b7c757a9873007ee033693b06647b378301075José Fonseca#    define INLINE __inline
89b3b7c757a9873007ee033693b06647b378301075José Fonseca#  elif defined(__ICL)
90b3b7c757a9873007ee033693b06647b378301075José Fonseca#    define INLINE __inline
91b3b7c757a9873007ee033693b06647b378301075José Fonseca#  elif defined(__INTEL_COMPILER)
92b3b7c757a9873007ee033693b06647b378301075José Fonseca#    define INLINE inline
93b3b7c757a9873007ee033693b06647b378301075José Fonseca#  elif defined(__WATCOMC__) && (__WATCOMC__ >= 1100)
94b3b7c757a9873007ee033693b06647b378301075José Fonseca#    define INLINE __inline
95ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith#  elif defined(__SUNPRO_C) && defined(__C99FEATURES__)
96ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith#    define INLINE inline
97ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith#  elif (__STDC_VERSION__ >= 199901L) /* C99 */
98ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith#    define INLINE inline
99b3b7c757a9873007ee033693b06647b378301075José Fonseca#  else
100b3b7c757a9873007ee033693b06647b378301075José Fonseca#    define INLINE
101b3b7c757a9873007ee033693b06647b378301075José Fonseca#  endif
10276818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell#endif
10376818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell
104108c2bf5ab9228843d21c188d8819a54b1201d07Chia-I Wu
105108c2bf5ab9228843d21c188d8819a54b1201d07Chia-I Wu/* Function visibility */
106108c2bf5ab9228843d21c188d8819a54b1201d07Chia-I Wu#ifndef PUBLIC
107108c2bf5ab9228843d21c188d8819a54b1201d07Chia-I Wu#  if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 303
108108c2bf5ab9228843d21c188d8819a54b1201d07Chia-I Wu#    define PUBLIC __attribute__((visibility("default")))
109108c2bf5ab9228843d21c188d8819a54b1201d07Chia-I Wu#  else
110108c2bf5ab9228843d21c188d8819a54b1201d07Chia-I Wu#    define PUBLIC
111108c2bf5ab9228843d21c188d8819a54b1201d07Chia-I Wu#  endif
112108c2bf5ab9228843d21c188d8819a54b1201d07Chia-I Wu#endif
113108c2bf5ab9228843d21c188d8819a54b1201d07Chia-I Wu
114108c2bf5ab9228843d21c188d8819a54b1201d07Chia-I Wu
115ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith/* The __FUNCTION__ gcc variable is generally only used for debugging.
116ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith * If we're not using gcc, define __FUNCTION__ as a cpp symbol here.
117ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith */
118ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith#ifndef __FUNCTION__
119ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith# if (!defined(__GNUC__) || (__GNUC__ < 2))
120ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith#  if (__STDC_VERSION__ >= 199901L) /* C99 */ || \
121ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith    (defined(__SUNPRO_C) && defined(__C99FEATURES__))
122ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith#   define __FUNCTION__ __func__
123ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith#  else
124ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith#   define __FUNCTION__ "<unknown>"
125ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith#  endif
126ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith# endif
127ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith#endif
128ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith
129ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith
13076818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell
1319343779a8c800cf72e38b09b6f5087a0df258c08Keith Whitwell/* This should match linux gcc cdecl semantics everywhere, so that we
1329343779a8c800cf72e38b09b6f5087a0df258c08Keith Whitwell * just codegen one calling convention on all platforms.
1339343779a8c800cf72e38b09b6f5087a0df258c08Keith Whitwell */
134e0860518dfb5a5c6ba6584e3c1b5d7b203277dacJosé Fonseca#ifdef _MSC_VER
1359343779a8c800cf72e38b09b6f5087a0df258c08Keith Whitwell#define PIPE_CDECL __cdecl
1369343779a8c800cf72e38b09b6f5087a0df258c08Keith Whitwell#else
1379343779a8c800cf72e38b09b6f5087a0df258c08Keith Whitwell#define PIPE_CDECL
1389343779a8c800cf72e38b09b6f5087a0df258c08Keith Whitwell#endif
1399343779a8c800cf72e38b09b6f5087a0df258c08Keith Whitwell
1409343779a8c800cf72e38b09b6f5087a0df258c08Keith Whitwell
1419343779a8c800cf72e38b09b6f5087a0df258c08Keith Whitwell
14286bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca/* Macros for data alignment. */
143e8b52b3f5682c969e58077d42f5aebdad5d32e89José Fonseca#if defined(__GNUC__)
14486bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca
14586bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca/* See http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Type-Attributes.html */
14686bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca#define PIPE_ALIGN_TYPE(_alignment, _type) _type __attribute__((aligned(_alignment)))
14786bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca
14886bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca/* See http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Variable-Attributes.html */
1495dfd5ed5e7d23d4ee8572669af2673c3a1315763José Fonseca#define PIPE_ALIGN_VAR(_alignment) __attribute__((aligned(_alignment)))
15086bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca
151818fd6b10182931a0727819f275f7f1686df09f5José Fonseca#if (__GNUC__ > 4 || (__GNUC__ == 4 &&__GNUC_MINOR__>1)) && !defined(PIPE_ARCH_X86_64)
15226c78a4968a3c10ca006699d240150e6aa4b4250José Fonseca#define PIPE_ALIGN_STACK __attribute__((force_align_arg_pointer))
15368edb4eac55457796ed5c5e4f1c702af749fd543José Fonseca#else
15426c78a4968a3c10ca006699d240150e6aa4b4250José Fonseca#define PIPE_ALIGN_STACK
15568edb4eac55457796ed5c5e4f1c702af749fd543José Fonseca#endif
15686bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca
15786bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca#elif defined(_MSC_VER)
15886bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca
15986bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca/* See http://msdn.microsoft.com/en-us/library/83ythb65.aspx */
16086bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca#define PIPE_ALIGN_TYPE(_alignment, _type) __declspec(align(_alignment)) _type
1615dfd5ed5e7d23d4ee8572669af2673c3a1315763José Fonseca#define PIPE_ALIGN_VAR(_alignment) __declspec(align(_alignment))
16286bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca
16326c78a4968a3c10ca006699d240150e6aa4b4250José Fonseca#define PIPE_ALIGN_STACK
16486bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca
16586bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca#else
16686bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca
16786bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca#error "Unsupported compiler"
16886bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca
1693772441c498b997947f68e98830f72649bbc8442Brian#endif
1703772441c498b997947f68e98830f72649bbc8442Brian
1713772441c498b997947f68e98830f72649bbc8442Brian
1723772441c498b997947f68e98830f72649bbc8442Brian
17376818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell#endif /* P_COMPILER_H */
174