1 /* ----------------------------------------------------------------------- *
2  *
3  *   Copyright 2007-2009 The NASM Authors - All Rights Reserved
4  *   See the file AUTHORS included with the NASM distribution for
5  *   the specific copyright holders.
6  *
7  *   Redistribution and use in source and binary forms, with or without
8  *   modification, are permitted provided that the following
9  *   conditions are met:
10  *
11  *   * Redistributions of source code must retain the above copyright
12  *     notice, this list of conditions and the following disclaimer.
13  *   * Redistributions in binary form must reproduce the above
14  *     copyright notice, this list of conditions and the following
15  *     disclaimer in the documentation and/or other materials provided
16  *     with the distribution.
17  *
18  *     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
19  *     CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
20  *     INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
21  *     MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22  *     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
23  *     CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24  *     SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25  *     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26  *     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27  *     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28  *     CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29  *     OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30  *     EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  *
32  * ----------------------------------------------------------------------- */
33 
34 /*
35  * compiler.h
36  *
37  * Compiler-specific macros for NASM.  Feel free to add support for
38  * other compilers in here.
39  *
40  * This header file should be included before any other header.
41  */
42 
43 #ifndef NASM_COMPILER_H
44 #define NASM_COMPILER_H 1
45 
46 #ifdef __APPLE__
47 #define _FORTIFY_SOURCE 0  //aris002 - in the future evaluate how unsafe are the safe funtions and vice versa
48 #endif
49 
50 #ifdef HAVE_CONFIG_H
51 # include "config.h"
52 /* autoconf doesn't define these if they are redundant, but we want to
53    be able to #ifdef them... */
54 #else
55 /* Default these to unsupported unless we have config.h */
56 # ifndef restrict
57 #  define restrict
58 # endif
59 #endif /* HAVE_CONFIG_H */
60 
61 /* This is required to get the standard <inttypes.h> macros when compiling
62    with a C++ compiler.  This must be defined *before* <inttypes.h> is
63    included, directly or indirectly. */
64 #define __STDC_CONSTANT_MACROS	1
65 #define __STDC_LIMIT_MACROS	1
66 #define __STDC_FORMAT_MACROS	1
67 
68 #ifdef __GNUC__
69 # if __GNUC__ >= 4
70 #  define HAVE_GNUC_4
71 # endif
72 # if __GNUC__ >= 3
73 #  define HAVE_GNUC_3
74 # endif
75 
76 #define HAVE_SNPRINTF
77 #define HAVE_VSNPRINTF
78 
79 #endif
80 
81 #ifdef __GNUC__
82 # define _unused	__attribute__((unused))
83 #else
84 # define _unused
85 #endif
86 
87 /* Some versions of MSVC have these only with underscores in front */
88 #include <stddef.h>
89 #include <stdarg.h>
90 #include <stdio.h>
91 
92 #ifdef _MSC_VER
93 #define HAVE__SNPRINTF
94 #endif
95 
96 #ifndef HAVE_SNPRINTF
97 # ifdef HAVE__SNPRINTF
98 #  define snprintf _snprintf
99 # else
100 int snprintf(char *, size_t, const char *, ...);
101 # endif
102 #endif
103 
104 #ifndef HAVE_VSNPRINTF
105 # ifdef HAVE__VSNPRINT
106 #  define vsnprintf _vsnprintf
107 # else
108 int vsnprintf(char *, size_t, const char *, va_list);
109 # endif
110 #endif
111 
112 #if !defined(HAVE_STRLCPY) || !HAVE_DECL_STRLCPY
113 size_t strlcpy(char *, const char *, size_t);
114 #endif
115 
116 #ifndef __cplusplus		/* C++ has false, true, bool as keywords */
117 # if defined(HAVE_STDBOOL_H) && defined(HAVE_WORKING_BOOL)
118 #  include <stdbool.h>
119 # else
120 /* This is sort of dangerous, since casts will behave different than
121    casting to the standard boolean type.  Always use !!, not (bool). */
122 typedef enum bool { false, true } bool;
123 # endif
124 #endif
125 
126 /* Provide a substitute for offsetof() if we don't have one.  This
127    variant works on most (but not *all*) systems... */
128 #ifndef offsetof
129 # define offsetof(t,m) ((size_t)&(((t *)0)->m))
130 #endif
131 
132 /* The container_of construct: if p is a pointer to member m of
133    container class c, then return a pointer to the container of which
134    *p is a member. */
135 #ifndef container_of
136 # define container_of(p, c, m) ((c *)((char *)(p) - offsetof(c,m)))
137 #endif
138 
139 /* Some misguided platforms hide the defs for these */
140 #if defined(HAVE_STRCASECMP) && !HAVE_DECL_STRCASECMP
141 int strcasecmp(const char *, const char *);
142 #endif
143 
144 #if defined(HAVE_STRICMP) && !HAVE_DECL_STRICMP
145 int stricmp(const char *, const char *);
146 #endif
147 
148 #if defined(HAVE_STRNCASECMP) && !HAVE_DECL_STRNCASECMP
149 int strncasecmp(const char *, const char *, size_t);
150 #endif
151 
152 #if defined(HAVE_STRNICMP) && !HAVE_DECL_STRNICMP
153 int strnicmp(const char *, const char *, size_t);
154 #endif
155 
156 #if defined(HAVE_STRSEP) && !HAVE_DECL_STRSEP
157 char *strsep(char **, const char *);
158 #endif
159 
160 /*
161  * Define this to 1 for faster performance if this is a littleendian
162  * platform which can do unaligned memory references.  It is safe
163  * to leave it defined to 0 even if that is true.
164  */
165 #if defined(__386__) || defined(__i386__) || defined(__x86_64__)
166 # define X86_MEMORY 1
167 # ifndef WORDS_LITTLEENDIAN
168 #  define WORDS_LITTLEENDIAN 1
169 # endif
170 #else
171 # define X86_MEMORY 0
172 #endif
173 
174 /*
175  * Hints to the compiler that a particular branch of code is more or
176  * less likely to be taken.
177  */
178 #if defined(__GNUC__) && __GNUC__ >= 3
179 # define likely(x)	__builtin_expect(!!(x), 1)
180 # define unlikely(x)	__builtin_expect(!!(x), 0)
181 #else
182 # define likely(x)	(!!(x))
183 # define unlikely(x)	(!!(x))
184 #endif
185 
186 /*
187  * How to tell the compiler that a function doesn't return
188  */
189 #ifdef __GNUC__
190 # define no_return void __attribute__((noreturn))
191 #else
192 # define no_return void
193 #endif
194 
195 #endif	/* NASM_COMPILER_H */
196