annotate src/share/vm/utilities/globalDefinitions_gcc.hpp @ 1941:79d04223b8a5

Added caching for resolved types and resolved fields. This is crucial, because the local load elimination will lead to wrong results, if field equality (of two RiField objects with the same object and the same RiType) is not given. The caching makes sure that the default equals implementation is sufficient.
author Thomas Wuerthinger <wuerthinger@ssw.jku.at>
date Tue, 28 Dec 2010 18:33:26 +0100
parents 126ea7725993
children f95d63e2154a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 579
diff changeset
2 * Copyright (c) 1998, 2009, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 579
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 579
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 579
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 // This file holds compiler-dependent includes,
a61af66fc99e Initial load
duke
parents:
diff changeset
26 // globally used constants & types, class (forward)
a61af66fc99e Initial load
duke
parents:
diff changeset
27 // declarations and a few frequently used utility functions.
a61af66fc99e Initial load
duke
parents:
diff changeset
28
a61af66fc99e Initial load
duke
parents:
diff changeset
29 #include <ctype.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
30 #include <string.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
31 #include <stdarg.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
32 #include <stddef.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
33 #include <stdio.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
34 #include <stdlib.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
35 #include <wchar.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
36
a61af66fc99e Initial load
duke
parents:
diff changeset
37 #ifdef SOLARIS
a61af66fc99e Initial load
duke
parents:
diff changeset
38 #include <ieeefp.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
39 #endif // SOLARIS
a61af66fc99e Initial load
duke
parents:
diff changeset
40
a61af66fc99e Initial load
duke
parents:
diff changeset
41 #include <math.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
42 #ifndef FP_PZERO
a61af66fc99e Initial load
duke
parents:
diff changeset
43 // Linux doesn't have positive/negative zero
a61af66fc99e Initial load
duke
parents:
diff changeset
44 #define FP_PZERO FP_ZERO
a61af66fc99e Initial load
duke
parents:
diff changeset
45 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
46 #if (!defined fpclass) && ((!defined SPARC) || (!defined SOLARIS))
a61af66fc99e Initial load
duke
parents:
diff changeset
47 #define fpclass fpclassify
a61af66fc99e Initial load
duke
parents:
diff changeset
48 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
49
a61af66fc99e Initial load
duke
parents:
diff changeset
50 #include <time.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
51 #include <fcntl.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
52 #include <dlfcn.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
53 #include <pthread.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
54
a61af66fc99e Initial load
duke
parents:
diff changeset
55 #ifdef SOLARIS
a61af66fc99e Initial load
duke
parents:
diff changeset
56 #include <thread.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
57 #endif // SOLARIS
a61af66fc99e Initial load
duke
parents:
diff changeset
58
a61af66fc99e Initial load
duke
parents:
diff changeset
59 #include <limits.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
60 #include <errno.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
61
a61af66fc99e Initial load
duke
parents:
diff changeset
62 #ifdef SOLARIS
a61af66fc99e Initial load
duke
parents:
diff changeset
63 #include <sys/trap.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
64 #include <sys/regset.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
65 #include <sys/procset.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
66 #include <ucontext.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
67 #include <setjmp.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
68 #endif // SOLARIS
a61af66fc99e Initial load
duke
parents:
diff changeset
69
a61af66fc99e Initial load
duke
parents:
diff changeset
70 # ifdef SOLARIS_MUTATOR_LIBTHREAD
a61af66fc99e Initial load
duke
parents:
diff changeset
71 # include <sys/procfs.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
72 # endif
a61af66fc99e Initial load
duke
parents:
diff changeset
73
a61af66fc99e Initial load
duke
parents:
diff changeset
74 #ifdef LINUX
a61af66fc99e Initial load
duke
parents:
diff changeset
75 #include <inttypes.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
76 #include <signal.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
77 #include <ucontext.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
78 #include <sys/time.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
79 #endif // LINUX
a61af66fc99e Initial load
duke
parents:
diff changeset
80
a61af66fc99e Initial load
duke
parents:
diff changeset
81 // 4810578: varargs unsafe on 32-bit integer/64-bit pointer architectures
a61af66fc99e Initial load
duke
parents:
diff changeset
82 // When __cplusplus is defined, NULL is defined as 0 (32-bit constant) in
a61af66fc99e Initial load
duke
parents:
diff changeset
83 // system header files. On 32-bit architectures, there is no problem.
a61af66fc99e Initial load
duke
parents:
diff changeset
84 // On 64-bit architectures, defining NULL as a 32-bit constant can cause
a61af66fc99e Initial load
duke
parents:
diff changeset
85 // problems with varargs functions: C++ integral promotion rules say for
a61af66fc99e Initial load
duke
parents:
diff changeset
86 // varargs, we pass the argument 0 as an int. So, if NULL was passed to a
a61af66fc99e Initial load
duke
parents:
diff changeset
87 // varargs function it will remain 32-bits. Depending on the calling
a61af66fc99e Initial load
duke
parents:
diff changeset
88 // convention of the machine, if the argument is passed on the stack then
a61af66fc99e Initial load
duke
parents:
diff changeset
89 // only 32-bits of the "NULL" pointer may be initialized to zero. The
a61af66fc99e Initial load
duke
parents:
diff changeset
90 // other 32-bits will be garbage. If the varargs function is expecting a
a61af66fc99e Initial load
duke
parents:
diff changeset
91 // pointer when it extracts the argument, then we have a problem.
a61af66fc99e Initial load
duke
parents:
diff changeset
92 //
a61af66fc99e Initial load
duke
parents:
diff changeset
93 // Solution: For 64-bit architectures, redefine NULL as 64-bit constant 0.
a61af66fc99e Initial load
duke
parents:
diff changeset
94 //
a61af66fc99e Initial load
duke
parents:
diff changeset
95 // Note: this fix doesn't work well on Linux because NULL will be overwritten
a61af66fc99e Initial load
duke
parents:
diff changeset
96 // whenever a system header file is included. Linux handles NULL correctly
a61af66fc99e Initial load
duke
parents:
diff changeset
97 // through a special type '__null'.
a61af66fc99e Initial load
duke
parents:
diff changeset
98 #ifdef SOLARIS
a61af66fc99e Initial load
duke
parents:
diff changeset
99 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
100 #undef NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
101 #define NULL 0L
a61af66fc99e Initial load
duke
parents:
diff changeset
102 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
103 #ifndef NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
104 #define NULL 0
a61af66fc99e Initial load
duke
parents:
diff changeset
105 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
106 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
107 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
108
a61af66fc99e Initial load
duke
parents:
diff changeset
109 // NULL vs NULL_WORD:
a61af66fc99e Initial load
duke
parents:
diff changeset
110 // On Linux NULL is defined as a special type '__null'. Assigning __null to
a61af66fc99e Initial load
duke
parents:
diff changeset
111 // integer variable will cause gcc warning. Use NULL_WORD in places where a
a61af66fc99e Initial load
duke
parents:
diff changeset
112 // pointer is stored as integer value. On some platforms, sizeof(intptr_t) >
a61af66fc99e Initial load
duke
parents:
diff changeset
113 // sizeof(void*), so here we want something which is integer type, but has the
a61af66fc99e Initial load
duke
parents:
diff changeset
114 // same size as a pointer.
a61af66fc99e Initial load
duke
parents:
diff changeset
115 #ifdef LINUX
a61af66fc99e Initial load
duke
parents:
diff changeset
116 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
117 #define NULL_WORD 0L
a61af66fc99e Initial load
duke
parents:
diff changeset
118 #else
512
db4caa99ef11 6787106: Hotspot 32 bit build fails on platforms having different definitions for intptr_t & int32_t
xlu
parents: 0
diff changeset
119 // Cast 0 to intptr_t rather than int32_t since they are not the same type
db4caa99ef11 6787106: Hotspot 32 bit build fails on platforms having different definitions for intptr_t & int32_t
xlu
parents: 0
diff changeset
120 // on platforms such as Mac OS X.
db4caa99ef11 6787106: Hotspot 32 bit build fails on platforms having different definitions for intptr_t & int32_t
xlu
parents: 0
diff changeset
121 #define NULL_WORD ((intptr_t)0)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
122 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
123 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
124 #define NULL_WORD NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
125 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
126
a61af66fc99e Initial load
duke
parents:
diff changeset
127 #ifndef LINUX
a61af66fc99e Initial load
duke
parents:
diff changeset
128 // Compiler-specific primitive types
a61af66fc99e Initial load
duke
parents:
diff changeset
129 typedef unsigned short uint16_t;
a61af66fc99e Initial load
duke
parents:
diff changeset
130 #ifndef _UINT32_T
a61af66fc99e Initial load
duke
parents:
diff changeset
131 #define _UINT32_T
a61af66fc99e Initial load
duke
parents:
diff changeset
132 typedef unsigned int uint32_t;
a61af66fc99e Initial load
duke
parents:
diff changeset
133 #endif // _UINT32_T
a61af66fc99e Initial load
duke
parents:
diff changeset
134
a61af66fc99e Initial load
duke
parents:
diff changeset
135 #if !defined(_SYS_INT_TYPES_H)
a61af66fc99e Initial load
duke
parents:
diff changeset
136 #ifndef _UINT64_T
a61af66fc99e Initial load
duke
parents:
diff changeset
137 #define _UINT64_T
a61af66fc99e Initial load
duke
parents:
diff changeset
138 typedef unsigned long long uint64_t;
a61af66fc99e Initial load
duke
parents:
diff changeset
139 #endif // _UINT64_T
a61af66fc99e Initial load
duke
parents:
diff changeset
140 // %%%% how to access definition of intptr_t portably in 5.5 onward?
a61af66fc99e Initial load
duke
parents:
diff changeset
141 typedef int intptr_t;
a61af66fc99e Initial load
duke
parents:
diff changeset
142 typedef unsigned int uintptr_t;
a61af66fc99e Initial load
duke
parents:
diff changeset
143 // If this gets an error, figure out a symbol XXX that implies the
a61af66fc99e Initial load
duke
parents:
diff changeset
144 // prior definition of intptr_t, and add "&& !defined(XXX)" above.
a61af66fc99e Initial load
duke
parents:
diff changeset
145 #endif // _SYS_INT_TYPES_H
a61af66fc99e Initial load
duke
parents:
diff changeset
146
a61af66fc99e Initial load
duke
parents:
diff changeset
147 #endif // !LINUX
a61af66fc99e Initial load
duke
parents:
diff changeset
148
a61af66fc99e Initial load
duke
parents:
diff changeset
149 // Additional Java basic types
a61af66fc99e Initial load
duke
parents:
diff changeset
150
a61af66fc99e Initial load
duke
parents:
diff changeset
151 typedef uint8_t jubyte;
a61af66fc99e Initial load
duke
parents:
diff changeset
152 typedef uint16_t jushort;
a61af66fc99e Initial load
duke
parents:
diff changeset
153 typedef uint32_t juint;
a61af66fc99e Initial load
duke
parents:
diff changeset
154 typedef uint64_t julong;
a61af66fc99e Initial load
duke
parents:
diff changeset
155
a61af66fc99e Initial load
duke
parents:
diff changeset
156 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
157 // Special (possibly not-portable) casts
a61af66fc99e Initial load
duke
parents:
diff changeset
158 // Cast floats into same-size integers and vice-versa w/o changing bit-pattern
a61af66fc99e Initial load
duke
parents:
diff changeset
159 // %%%%%% These seem like standard C++ to me--how about factoring them out? - Ungar
a61af66fc99e Initial load
duke
parents:
diff changeset
160
a61af66fc99e Initial load
duke
parents:
diff changeset
161 inline jint jint_cast (jfloat x) { return *(jint* )&x; }
a61af66fc99e Initial load
duke
parents:
diff changeset
162 inline jlong jlong_cast (jdouble x) { return *(jlong* )&x; }
a61af66fc99e Initial load
duke
parents:
diff changeset
163
a61af66fc99e Initial load
duke
parents:
diff changeset
164 inline jfloat jfloat_cast (jint x) { return *(jfloat* )&x; }
a61af66fc99e Initial load
duke
parents:
diff changeset
165 inline jdouble jdouble_cast(jlong x) { return *(jdouble*)&x; }
a61af66fc99e Initial load
duke
parents:
diff changeset
166
a61af66fc99e Initial load
duke
parents:
diff changeset
167 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
168 // Constant for jlong (specifying an long long canstant is C++ compiler specific)
a61af66fc99e Initial load
duke
parents:
diff changeset
169
a61af66fc99e Initial load
duke
parents:
diff changeset
170 // Build a 64bit integer constant
a61af66fc99e Initial load
duke
parents:
diff changeset
171 #define CONST64(x) (x ## LL)
a61af66fc99e Initial load
duke
parents:
diff changeset
172 #define UCONST64(x) (x ## ULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
173
a61af66fc99e Initial load
duke
parents:
diff changeset
174 const jlong min_jlong = CONST64(0x8000000000000000);
a61af66fc99e Initial load
duke
parents:
diff changeset
175 const jlong max_jlong = CONST64(0x7fffffffffffffff);
a61af66fc99e Initial load
duke
parents:
diff changeset
176
a61af66fc99e Initial load
duke
parents:
diff changeset
177
a61af66fc99e Initial load
duke
parents:
diff changeset
178 #ifdef SOLARIS
a61af66fc99e Initial load
duke
parents:
diff changeset
179 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
180 // ANSI C++ fixes
a61af66fc99e Initial load
duke
parents:
diff changeset
181 // NOTE:In the ANSI committee's continuing attempt to make each version
a61af66fc99e Initial load
duke
parents:
diff changeset
182 // of C++ incompatible with the previous version, you can no longer cast
a61af66fc99e Initial load
duke
parents:
diff changeset
183 // pointers to functions without specifying linkage unless you want to get
a61af66fc99e Initial load
duke
parents:
diff changeset
184 // warnings.
a61af66fc99e Initial load
duke
parents:
diff changeset
185 //
a61af66fc99e Initial load
duke
parents:
diff changeset
186 // This also means that pointers to functions can no longer be "hidden"
a61af66fc99e Initial load
duke
parents:
diff changeset
187 // in opaque types like void * because at the invokation point warnings
a61af66fc99e Initial load
duke
parents:
diff changeset
188 // will be generated. While this makes perfect sense from a type safety
a61af66fc99e Initial load
duke
parents:
diff changeset
189 // point of view it causes a lot of warnings on old code using C header
a61af66fc99e Initial load
duke
parents:
diff changeset
190 // files. Here are some typedefs to make the job of silencing warnings
a61af66fc99e Initial load
duke
parents:
diff changeset
191 // a bit easier.
a61af66fc99e Initial load
duke
parents:
diff changeset
192 //
a61af66fc99e Initial load
duke
parents:
diff changeset
193 // The final kick in the teeth is that you can only have extern "C" linkage
a61af66fc99e Initial load
duke
parents:
diff changeset
194 // specified at file scope. So these typedefs are here rather than in the
a61af66fc99e Initial load
duke
parents:
diff changeset
195 // .hpp for the class (os:Solaris usually) that needs them.
a61af66fc99e Initial load
duke
parents:
diff changeset
196
a61af66fc99e Initial load
duke
parents:
diff changeset
197 extern "C" {
a61af66fc99e Initial load
duke
parents:
diff changeset
198 typedef int (*int_fnP_thread_t_iP_uP_stack_tP_gregset_t)(thread_t, int*, unsigned *, stack_t*, gregset_t);
a61af66fc99e Initial load
duke
parents:
diff changeset
199 typedef int (*int_fnP_thread_t_i_gregset_t)(thread_t, int, gregset_t);
a61af66fc99e Initial load
duke
parents:
diff changeset
200 typedef int (*int_fnP_thread_t_i)(thread_t, int);
a61af66fc99e Initial load
duke
parents:
diff changeset
201 typedef int (*int_fnP_thread_t)(thread_t);
a61af66fc99e Initial load
duke
parents:
diff changeset
202
a61af66fc99e Initial load
duke
parents:
diff changeset
203 typedef int (*int_fnP_cond_tP_mutex_tP_timestruc_tP)(cond_t *cv, mutex_t *mx, timestruc_t *abst);
a61af66fc99e Initial load
duke
parents:
diff changeset
204 typedef int (*int_fnP_cond_tP_mutex_tP)(cond_t *cv, mutex_t *mx);
a61af66fc99e Initial load
duke
parents:
diff changeset
205
a61af66fc99e Initial load
duke
parents:
diff changeset
206 // typedef for missing API in libc
a61af66fc99e Initial load
duke
parents:
diff changeset
207 typedef int (*int_fnP_mutex_tP_i_vP)(mutex_t *, int, void *);
a61af66fc99e Initial load
duke
parents:
diff changeset
208 typedef int (*int_fnP_mutex_tP)(mutex_t *);
a61af66fc99e Initial load
duke
parents:
diff changeset
209 typedef int (*int_fnP_cond_tP_i_vP)(cond_t *cv, int scope, void *arg);
a61af66fc99e Initial load
duke
parents:
diff changeset
210 typedef int (*int_fnP_cond_tP)(cond_t *cv);
a61af66fc99e Initial load
duke
parents:
diff changeset
211 };
a61af66fc99e Initial load
duke
parents:
diff changeset
212 #endif // SOLARIS
a61af66fc99e Initial load
duke
parents:
diff changeset
213
a61af66fc99e Initial load
duke
parents:
diff changeset
214 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
215 // Debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
216
a61af66fc99e Initial load
duke
parents:
diff changeset
217 #define DEBUG_EXCEPTION ::abort();
a61af66fc99e Initial load
duke
parents:
diff changeset
218
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
219 #ifdef ARM
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
220 #ifdef SOLARIS
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
221 #define BREAKPOINT __asm__ volatile (".long 0xe1200070")
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
222 #else
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
223 #define BREAKPOINT __asm__ volatile (".long 0xe7f001f0")
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
224 #endif
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
225 #else
0
a61af66fc99e Initial load
duke
parents:
diff changeset
226 extern "C" void breakpoint();
a61af66fc99e Initial load
duke
parents:
diff changeset
227 #define BREAKPOINT ::breakpoint()
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
228 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
229
a61af66fc99e Initial load
duke
parents:
diff changeset
230 // checking for nanness
a61af66fc99e Initial load
duke
parents:
diff changeset
231 #ifdef SOLARIS
a61af66fc99e Initial load
duke
parents:
diff changeset
232 #ifdef SPARC
a61af66fc99e Initial load
duke
parents:
diff changeset
233 inline int g_isnan(float f) { return isnanf(f); }
a61af66fc99e Initial load
duke
parents:
diff changeset
234 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
235 // isnanf() broken on Intel Solaris use isnand()
a61af66fc99e Initial load
duke
parents:
diff changeset
236 inline int g_isnan(float f) { return isnand(f); }
a61af66fc99e Initial load
duke
parents:
diff changeset
237 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
238 inline int g_isnan(double f) { return isnand(f); }
a61af66fc99e Initial load
duke
parents:
diff changeset
239 #elif LINUX
a61af66fc99e Initial load
duke
parents:
diff changeset
240 inline int g_isnan(float f) { return isnanf(f); }
a61af66fc99e Initial load
duke
parents:
diff changeset
241 inline int g_isnan(double f) { return isnan(f); }
a61af66fc99e Initial load
duke
parents:
diff changeset
242 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
243 #error "missing platform-specific definition here"
a61af66fc99e Initial load
duke
parents:
diff changeset
244 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
245
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
246 // GCC 4.3 does not allow 0.0/0.0 to produce a NAN value
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
247 #if (__GNUC__ == 4) && (__GNUC_MINOR__ > 2)
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
248 #define CAN_USE_NAN_DEFINE 1
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
249 #endif
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
250
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
251
0
a61af66fc99e Initial load
duke
parents:
diff changeset
252 // Checking for finiteness
a61af66fc99e Initial load
duke
parents:
diff changeset
253
a61af66fc99e Initial load
duke
parents:
diff changeset
254 inline int g_isfinite(jfloat f) { return finite(f); }
a61af66fc99e Initial load
duke
parents:
diff changeset
255 inline int g_isfinite(jdouble f) { return finite(f); }
a61af66fc99e Initial load
duke
parents:
diff changeset
256
a61af66fc99e Initial load
duke
parents:
diff changeset
257
a61af66fc99e Initial load
duke
parents:
diff changeset
258 // Wide characters
a61af66fc99e Initial load
duke
parents:
diff changeset
259
a61af66fc99e Initial load
duke
parents:
diff changeset
260 inline int wcslen(const jchar* x) { return wcslen((const wchar_t*)x); }
a61af66fc99e Initial load
duke
parents:
diff changeset
261
a61af66fc99e Initial load
duke
parents:
diff changeset
262
a61af66fc99e Initial load
duke
parents:
diff changeset
263 // Portability macros
a61af66fc99e Initial load
duke
parents:
diff changeset
264 #define PRAGMA_INTERFACE #pragma interface
a61af66fc99e Initial load
duke
parents:
diff changeset
265 #define PRAGMA_IMPLEMENTATION #pragma implementation
a61af66fc99e Initial load
duke
parents:
diff changeset
266 #define VALUE_OBJ_CLASS_SPEC
a61af66fc99e Initial load
duke
parents:
diff changeset
267
a61af66fc99e Initial load
duke
parents:
diff changeset
268 #if (__GNUC__ == 2) && (__GNUC_MINOR__ < 95)
a61af66fc99e Initial load
duke
parents:
diff changeset
269 #define TEMPLATE_TABLE_BUG
a61af66fc99e Initial load
duke
parents:
diff changeset
270 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
271 #if (__GNUC__ == 2) && (__GNUC_MINOR__ >= 96)
a61af66fc99e Initial load
duke
parents:
diff changeset
272 #define CONST_SDM_BUG
a61af66fc99e Initial load
duke
parents:
diff changeset
273 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
274
a61af66fc99e Initial load
duke
parents:
diff changeset
275 // Formatting.
a61af66fc99e Initial load
duke
parents:
diff changeset
276 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
277 #define FORMAT64_MODIFIER "l"
a61af66fc99e Initial load
duke
parents:
diff changeset
278 #else // !_LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
279 #define FORMAT64_MODIFIER "ll"
a61af66fc99e Initial load
duke
parents:
diff changeset
280 #endif // _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
281
a61af66fc99e Initial load
duke
parents:
diff changeset
282 // HACK: gcc warns about applying offsetof() to non-POD object or calculating
a61af66fc99e Initial load
duke
parents:
diff changeset
283 // offset directly when base address is NULL. Use 16 to get around the
a61af66fc99e Initial load
duke
parents:
diff changeset
284 // warning. gcc-3.4 has an option -Wno-invalid-offsetof to suppress
a61af66fc99e Initial load
duke
parents:
diff changeset
285 // this warning.
a61af66fc99e Initial load
duke
parents:
diff changeset
286 #define offset_of(klass,field) (size_t)((intx)&(((klass*)16)->field) - 16)
a61af66fc99e Initial load
duke
parents:
diff changeset
287
a61af66fc99e Initial load
duke
parents:
diff changeset
288 #ifdef offsetof
a61af66fc99e Initial load
duke
parents:
diff changeset
289 # undef offsetof
a61af66fc99e Initial load
duke
parents:
diff changeset
290 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
291 #define offsetof(klass,field) offset_of(klass,field)