2009-04-28 Gavin Barraclough <barraclough@apple.com>
[WebKit-https.git] / JavaScriptCore / wtf / Platform.h
1 /*
2  * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #ifndef WTF_Platform_h
27 #define WTF_Platform_h
28
29 /* PLATFORM handles OS, operating environment, graphics API, and CPU */
30 #define PLATFORM(WTF_FEATURE) (defined( WTF_PLATFORM_##WTF_FEATURE ) && WTF_PLATFORM_##WTF_FEATURE)
31 #define COMPILER(WTF_FEATURE) (defined( WTF_COMPILER_##WTF_FEATURE ) && WTF_COMPILER_##WTF_FEATURE)
32 #define HAVE(WTF_FEATURE) (defined( HAVE_##WTF_FEATURE ) && HAVE_##WTF_FEATURE)
33 #define USE(WTF_FEATURE) (defined( WTF_USE_##WTF_FEATURE ) && WTF_USE_##WTF_FEATURE)
34 #define ENABLE(WTF_FEATURE) (defined( ENABLE_##WTF_FEATURE ) && ENABLE_##WTF_FEATURE)
35
36 /* Operating systems - low-level dependencies */
37
38 /* PLATFORM(DARWIN) */
39 /* Operating system level dependencies for Mac OS X / Darwin that should */
40 /* be used regardless of operating environment */
41 #ifdef __APPLE__
42 #define WTF_PLATFORM_DARWIN 1
43 #include <AvailabilityMacros.h>
44 #if !defined(MAC_OS_X_VERSION_10_5) || MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5
45 #define BUILDING_ON_TIGER 1
46 #elif !defined(MAC_OS_X_VERSION_10_6) || MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_6
47 #define BUILDING_ON_LEOPARD 1
48 #endif
49 #endif
50
51 /* PLATFORM(WIN_OS) */
52 /* Operating system level dependencies for Windows that should be used */
53 /* regardless of operating environment */
54 #if defined(WIN32) || defined(_WIN32)
55 #define WTF_PLATFORM_WIN_OS 1
56 #endif
57
58 /* PLATFORM(WIN_CE) */
59 /* Operating system level dependencies for Windows CE that should be used */
60 /* regardless of operating environment */
61 /* Note that for this platform PLATFORM(WIN_OS) is also defined. */
62 #if defined(_WIN32_WCE)
63 #define WTF_PLATFORM_WIN_CE 1
64 #endif
65
66 /* PLATFORM(FREEBSD) */
67 /* Operating system level dependencies for FreeBSD-like systems that */
68 /* should be used regardless of operating environment */
69 #ifdef __FreeBSD__
70 #define WTF_PLATFORM_FREEBSD 1
71 #endif
72
73 /* PLATFORM(OPENBSD) */
74 /* Operating system level dependencies for OpenBSD systems that */
75 /* should be used regardless of operating environment */
76 #ifdef __OpenBSD__
77 #define WTF_PLATFORM_OPENBSD 1
78 #endif
79
80 /* PLATFORM(SOLARIS) */
81 /* Operating system level dependencies for Solaris that should be used */
82 /* regardless of operating environment */
83 #if defined(sun) || defined(__sun)
84 #define WTF_PLATFORM_SOLARIS 1
85 #endif
86
87 #if defined (__S60__) || defined (__SYMBIAN32__)
88 /* we are cross-compiling, it is not really windows */
89 #undef WTF_PLATFORM_WIN_OS
90 #undef WTF_PLATFORM_WIN
91 #undef WTF_PLATFORM_CAIRO
92 #define WTF_PLATFORM_S60 1
93 #define WTF_PLATFORM_SYMBIAN 1
94 #endif
95
96
97 /* PLATFORM(NETBSD) */
98 /* Operating system level dependencies for NetBSD that should be used */
99 /* regardless of operating environment */
100 #if defined(__NetBSD__)
101 #define WTF_PLATFORM_NETBSD 1
102 #endif
103
104 /* PLATFORM(UNIX) */
105 /* Operating system level dependencies for Unix-like systems that */
106 /* should be used regardless of operating environment */
107 #if   PLATFORM(DARWIN)     \
108    || PLATFORM(FREEBSD)    \
109    || PLATFORM(S60)        \
110    || PLATFORM(NETBSD)     \
111    || defined(unix)        \
112    || defined(__unix)      \
113    || defined(__unix__)    \
114    || defined(_AIX)
115 #define WTF_PLATFORM_UNIX 1
116 #endif
117
118 /* Operating environments */
119
120 /* PLATFORM(CHROMIUM) */
121 /* PLATFORM(QT) */
122 /* PLATFORM(GTK) */
123 /* PLATFORM(MAC) */
124 /* PLATFORM(WIN) */
125 #if defined(BUILDING_CHROMIUM__)
126 #define WTF_PLATFORM_CHROMIUM 1
127 #elif defined(BUILDING_QT__)
128 #define WTF_PLATFORM_QT 1
129
130 /* PLATFORM(KDE) */
131 #if defined(BUILDING_KDE__)
132 #define WTF_PLATFORM_KDE 1
133 #endif
134
135 #elif defined(BUILDING_WX__)
136 #define WTF_PLATFORM_WX 1
137 #elif defined(BUILDING_GTK__)
138 #define WTF_PLATFORM_GTK 1
139 #elif PLATFORM(DARWIN)
140 #define WTF_PLATFORM_MAC 1
141 #elif PLATFORM(WIN_OS)
142 #define WTF_PLATFORM_WIN 1
143 #endif
144
145 /* Graphics engines */
146
147 /* PLATFORM(CG) and PLATFORM(CI) */
148 #if PLATFORM(MAC)
149 #define WTF_PLATFORM_CG 1
150 #define WTF_PLATFORM_CI 1
151 #endif
152
153 /* PLATFORM(SKIA) for Win/Linux, CG/CI for Mac */
154 #if PLATFORM(CHROMIUM)
155 #if PLATFORM(DARWIN)
156 #define WTF_PLATFORM_CG 1
157 #define WTF_PLATFORM_CI 1
158 #define WTF_USE_ATSUI 1
159 #else
160 #define WTF_PLATFORM_SKIA 1
161 #endif
162 #endif
163
164 /* Makes PLATFORM(WIN) default to PLATFORM(CAIRO) */
165 /* FIXME: This should be changed from a blacklist to a whitelist */
166 #if !PLATFORM(MAC) && !PLATFORM(QT) && !PLATFORM(WX) && !PLATFORM(CHROMIUM)
167 #define WTF_PLATFORM_CAIRO 1
168 #endif
169
170 /* CPU */
171
172 /* PLATFORM(PPC) */
173 #if   defined(__ppc__)     \
174    || defined(__PPC__)     \
175    || defined(__powerpc__) \
176    || defined(__powerpc)   \
177    || defined(__POWERPC__) \
178    || defined(_M_PPC)      \
179    || defined(__PPC)
180 #define WTF_PLATFORM_PPC 1
181 #define WTF_PLATFORM_BIG_ENDIAN 1
182 #endif
183
184 /* PLATFORM(PPC64) */
185 #if   defined(__ppc64__) \
186    || defined(__PPC64__)
187 #define WTF_PLATFORM_PPC64 1
188 #define WTF_PLATFORM_BIG_ENDIAN 1
189 #endif
190
191 /* PLATFORM(ARM) */
192 #if   defined(arm) \
193    || defined(__arm__)
194 #define WTF_PLATFORM_ARM 1
195 #if defined(__ARMEB__)
196 #define WTF_PLATFORM_BIG_ENDIAN 1
197 #elif !defined(__ARM_EABI__) && !defined(__ARMEB__) && !defined(__VFP_FP__)
198 #define WTF_PLATFORM_MIDDLE_ENDIAN 1
199 #endif
200 #if !defined(__ARM_EABI__)
201 #define WTF_PLATFORM_FORCE_PACK 1
202 #endif
203 #endif
204
205 /* PLATFORM(X86) */
206 #if   defined(__i386__) \
207    || defined(i386)     \
208    || defined(_M_IX86)  \
209    || defined(_X86_)    \
210    || defined(__THW_INTEL)
211 #define WTF_PLATFORM_X86 1
212 #endif
213
214 /* PLATFORM(X86_64) */
215 #if   defined(__x86_64__) \
216    || defined(__ia64__) \
217    || defined(_M_X64)
218 #define WTF_PLATFORM_X86_64 1
219 #endif
220
221 /* PLATFORM(SH4) */
222 #if defined(__SH4__)
223 #define WTF_PLATFORM_SH4 1
224 #endif
225
226 /* PLATFORM(SPARC64) */
227 #if defined(__sparc64__)
228 #define WTF_PLATFORM_SPARC64 1
229 #define WTF_PLATFORM_BIG_ENDIAN 1
230 #endif
231
232 /* PLATFORM(WIN_CE) && PLATFORM(QT)
233    We can not determine the endianess at compile time. For
234    Qt for Windows CE the endianess is specified in the
235    device specific makespec
236 */
237 #if PLATFORM(WIN_CE) && PLATFORM(QT)
238 #   include <QtGlobal>
239 #   undef WTF_PLATFORM_BIG_ENDIAN
240 #   undef WTF_PLATFORM_MIDDLE_ENDIAN
241 #   if Q_BYTE_ORDER == Q_BIG_EDIAN
242 #       define WTF_PLATFORM_BIG_ENDIAN 1
243 #   endif
244 #endif
245
246 /* Compiler */
247
248 /* COMPILER(MSVC) */
249 #if defined(_MSC_VER)
250 #define WTF_COMPILER_MSVC 1
251 #if _MSC_VER < 1400
252 #define WTF_COMPILER_MSVC7 1
253 #endif
254 #endif
255
256 /* COMPILER(RVCT) */
257 #if defined(__CC_ARM) || defined(__ARMCC__)
258 #define WTF_COMPILER_RVCT 1
259 #endif
260
261 /* COMPILER(GCC) */
262 /* --gnu option of the RVCT compiler also defines __GNUC__ */
263 #if defined(__GNUC__) && !COMPILER(RVCT)
264 #define WTF_COMPILER_GCC 1
265 #endif
266
267 /* COMPILER(MINGW) */
268 #if defined(MINGW) || defined(__MINGW32__)
269 #define WTF_COMPILER_MINGW 1
270 #endif
271
272 /* COMPILER(BORLAND) */
273 /* not really fully supported - is this relevant any more? */
274 #if defined(__BORLANDC__)
275 #define WTF_COMPILER_BORLAND 1
276 #endif
277
278 /* COMPILER(CYGWIN) */
279 /* not really fully supported - is this relevant any more? */
280 #if defined(__CYGWIN__)
281 #define WTF_COMPILER_CYGWIN 1
282 #endif
283
284 /* COMPILER(WINSCW) */
285 #if defined(__WINSCW__)
286 #define WTF_COMPILER_WINSCW 1
287 #endif
288
289 #if (PLATFORM(MAC) || PLATFORM(WIN)) && !defined(ENABLE_JSC_MULTIPLE_THREADS)
290 #define ENABLE_JSC_MULTIPLE_THREADS 1
291 #endif
292
293 /* for Unicode, KDE uses Qt */
294 #if PLATFORM(KDE) || PLATFORM(QT)
295 #define WTF_USE_QT4_UNICODE 1
296 #elif PLATFORM(SYMBIAN)
297 #define WTF_USE_SYMBIAN_UNICODE 1
298 #elif PLATFORM(GTK)
299 /* The GTK+ Unicode backend is configurable */
300 #else
301 #define WTF_USE_ICU_UNICODE 1
302 #endif
303
304 #if PLATFORM(MAC)
305 #define WTF_PLATFORM_CF 1
306 #define WTF_USE_PTHREADS 1
307 #if !defined(ENABLE_MAC_JAVA_BRIDGE)
308 #define ENABLE_MAC_JAVA_BRIDGE 1
309 #endif
310 #if !defined(ENABLE_DASHBOARD_SUPPORT)
311 #define ENABLE_DASHBOARD_SUPPORT 1
312 #endif
313 #define HAVE_READLINE 1
314 #define HAVE_RUNLOOP_TIMER 1
315 #endif
316
317 #if PLATFORM(CHROMIUM) && PLATFORM(DARWIN)
318 #define WTF_PLATFORM_CF 1
319 #define WTF_USE_PTHREADS 1
320 #endif
321
322 #if PLATFORM(WIN)
323 #define WTF_USE_WININET 1
324 #endif
325
326 #if PLATFORM(WX)
327 #define ENABLE_ASSEMBLER 1
328 #define WTF_USE_CURL 1
329 #define WTF_USE_PTHREADS 1
330 #endif
331
332 #if PLATFORM(GTK)
333 #if HAVE(PTHREAD_H)
334 #define WTF_USE_PTHREADS 1
335 #endif
336 #endif
337
338 #if !defined(HAVE_ACCESSIBILITY)
339 #if PLATFORM(MAC) || PLATFORM(WIN) || PLATFORM(GTK) || PLATFORM(CHROMIUM)
340 #define HAVE_ACCESSIBILITY 1
341 #endif
342 #endif /* !defined(HAVE_ACCESSIBILITY) */
343
344 #if COMPILER(GCC)
345 #define HAVE_COMPUTED_GOTO 1
346 #endif
347
348 #if PLATFORM(DARWIN)
349
350 #define HAVE_ERRNO_H 1
351 #define HAVE_LANGINFO_H 1
352 #define HAVE_MMAP 1
353 #define HAVE_MERGESORT 1
354 #define HAVE_SBRK 1
355 #define HAVE_STRINGS_H 1
356 #define HAVE_SYS_PARAM_H 1
357 #define HAVE_SYS_TIME_H 1
358 #define HAVE_SYS_TIMEB_H 1
359
360 #if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
361 #define HAVE_MADV_FREE_REUSE 1
362 #endif
363
364 #define HAVE_MADV_FREE 1
365
366 #elif PLATFORM(WIN_OS)
367
368 #define HAVE_FLOAT_H 1
369 #if PLATFORM(WIN_CE)
370 #define HAVE_ERRNO_H 0
371 #else
372 #define HAVE_SYS_TIMEB_H 1
373 #endif
374 #define HAVE_VIRTUALALLOC 1
375
376 #elif PLATFORM(SYMBIAN)
377
378 #define HAVE_ERRNO_H 1
379 #define HAVE_MMAP 0
380 #define HAVE_SBRK 1
381
382 #define HAVE_SYS_TIME_H 1
383 #define HAVE_STRINGS_H 1
384
385 #if !COMPILER(RVCT)
386 #define HAVE_SYS_PARAM_H 1
387 #endif
388
389 #else
390
391 /* FIXME: is this actually used or do other platforms generate their own config.h? */
392
393 #define HAVE_ERRNO_H 1
394 #define HAVE_LANGINFO_H 1
395 #define HAVE_MMAP 1
396 #define HAVE_SBRK 1
397 #define HAVE_STRINGS_H 1
398 #define HAVE_SYS_PARAM_H 1
399 #define HAVE_SYS_TIME_H 1
400
401 #endif
402
403 /* ENABLE macro defaults */
404
405 /* fastMalloc match validation allows for runtime verification that
406    new is matched by delete, fastMalloc is matched by fastFree, etc. */
407 #if !defined(ENABLE_FAST_MALLOC_MATCH_VALIDATION)
408 #define ENABLE_FAST_MALLOC_MATCH_VALIDATION 0
409 #endif
410
411 #if !defined(ENABLE_ICONDATABASE)
412 #define ENABLE_ICONDATABASE 1
413 #endif
414
415 #if !defined(ENABLE_DATABASE)
416 #define ENABLE_DATABASE 1
417 #endif
418
419 #if !defined(ENABLE_JAVASCRIPT_DEBUGGER)
420 #define ENABLE_JAVASCRIPT_DEBUGGER 1
421 #endif
422
423 #if !defined(ENABLE_FTPDIR)
424 #define ENABLE_FTPDIR 1
425 #endif
426
427 #if !defined(ENABLE_DASHBOARD_SUPPORT)
428 #define ENABLE_DASHBOARD_SUPPORT 0
429 #endif
430
431 #if !defined(ENABLE_MAC_JAVA_BRIDGE)
432 #define ENABLE_MAC_JAVA_BRIDGE 0
433 #endif
434
435 #if !defined(ENABLE_NETSCAPE_PLUGIN_API)
436 #define ENABLE_NETSCAPE_PLUGIN_API 1
437 #endif
438
439 #if !defined(ENABLE_OPCODE_STATS)
440 #define ENABLE_OPCODE_STATS 0
441 #endif
442
443 #if !defined(ENABLE_CODEBLOCK_SAMPLING)
444 #define ENABLE_CODEBLOCK_SAMPLING 0
445 #endif
446
447 #if ENABLE(CODEBLOCK_SAMPLING) && !defined(ENABLE_OPCODE_SAMPLING)
448 #define ENABLE_OPCODE_SAMPLING 1
449 #endif
450
451 #if !defined(ENABLE_OPCODE_SAMPLING)
452 #define ENABLE_OPCODE_SAMPLING 0
453 #endif
454
455 #if !defined(ENABLE_GEOLOCATION)
456 #define ENABLE_GEOLOCATION 0
457 #endif
458
459 #if !defined(ENABLE_TEXT_CARET)
460 #define ENABLE_TEXT_CARET 1
461 #endif
462
463 #if !defined(ENABLE_ON_FIRST_TEXTAREA_FOCUS_SELECT_ALL)
464 #define ENABLE_ON_FIRST_TEXTAREA_FOCUS_SELECT_ALL 0
465 #endif
466
467 #if !defined(WTF_USE_ALTERNATE_JSIMMEDIATE) && PLATFORM(X86_64) && PLATFORM(MAC)
468 #define WTF_USE_ALTERNATE_JSIMMEDIATE 1
469 #endif
470
471 #if !defined(ENABLE_REPAINT_THROTTLING)
472 #define ENABLE_REPAINT_THROTTLING 0
473 #endif
474
475 #if !defined(ENABLE_JIT)
476 /* The JIT is tested & working on x86_64 Mac */
477 #if PLATFORM(X86_64) && PLATFORM(MAC)
478     #define ENABLE_JIT 1
479     #define WTF_USE_JIT_STUB_ARGUMENT_REGISTER 1
480 /* The JIT is tested & working on x86 Mac */
481 #elif PLATFORM(X86) && PLATFORM(MAC)
482     #define ENABLE_JIT 1
483     #define WTF_USE_JIT_STUB_ARGUMENT_VA_LIST 1
484 /* The JIT is tested & working on x86 Windows */
485 #elif PLATFORM(X86) && PLATFORM(WIN)
486     #define ENABLE_JIT 1
487     #define WTF_USE_JIT_STUB_ARGUMENT_REGISTER 1
488 #endif
489     #define ENABLE_JIT_OPTIMIZE_CALL 1
490     #define ENABLE_JIT_OPTIMIZE_PROPERTY_ACCESS 1
491     #define ENABLE_JIT_OPTIMIZE_ARITHMETIC 1
492 #endif
493
494 #if ENABLE(JIT)
495 #if !(USE(JIT_STUB_ARGUMENT_VA_LIST) || USE(JIT_STUB_ARGUMENT_REGISTER) || USE(JIT_STUB_ARGUMENT_STACK))
496 #error Please define one of the JIT_STUB_ARGUMENT settings.
497 #elif (USE(JIT_STUB_ARGUMENT_VA_LIST) && USE(JIT_STUB_ARGUMENT_REGISTER)) \
498    || (USE(JIT_STUB_ARGUMENT_VA_LIST) && USE(JIT_STUB_ARGUMENT_STACK)) \
499    || (USE(JIT_STUB_ARGUMENT_REGISTER) && USE(JIT_STUB_ARGUMENT_STACK))
500 #error Please do not define more than one of the JIT_STUB_ARGUMENT settings.
501 #endif
502 #endif
503
504 /* Yet Another Regex Runtime. */
505 /* YARR supports x86 & x86-64, and has been tested on Mac and Windows. */
506 #if (!defined(ENABLE_YARR_JIT) && PLATFORM(X86) && PLATFORM(MAC)) \
507  || (!defined(ENABLE_YARR_JIT) && PLATFORM(X86_64) && PLATFORM(MAC)) \
508  || (!defined(ENABLE_YARR_JIT) && PLATFORM(X86) && PLATFORM(WIN))
509 #define ENABLE_YARR 1
510 #define ENABLE_YARR_JIT 1
511 #endif
512 /* Sanity Check */
513 #if ENABLE(YARR_JIT) && !ENABLE(YARR)
514 #error "YARR_JIT requires YARR"
515 #endif
516
517 #if ENABLE(JIT) || ENABLE(YARR_JIT)
518 #define ENABLE_ASSEMBLER 1
519 #endif
520
521 #if !defined(ENABLE_PAN_SCROLLING) && PLATFORM(WIN_OS)
522 #define ENABLE_PAN_SCROLLING 1
523 #endif
524
525 #if !defined(ENABLE_ACTIVEX_TYPE_CONVERSION_WMPLAYER)
526 #define ENABLE_ACTIVEX_TYPE_CONVERSION_WMPLAYER 1
527 #endif
528
529 /* Use the QtXmlStreamReader implementation for XMLTokenizer */
530 #if PLATFORM(QT)
531 #if !ENABLE(XSLT)
532 #define WTF_USE_QXMLSTREAM 1
533 #endif
534 #endif
535
536 #if !PLATFORM(QT)
537 #define WTF_USE_FONT_FAST_PATH 1
538 #endif
539
540 #endif /* WTF_Platform_h */