Mercurial > hg > truffle
annotate src/share/vm/utilities/globalDefinitions_sparcWorks.hpp @ 1721:413ad0331a0c
6977924: Changes for 6975078 produce build error with certain gcc versions
Summary: The changes introduced for 6975078 assign badHeapOopVal to the _allocation field in the ResourceObj class. In 32 bit linux builds with certain versions of gcc this assignment will be flagged as an error while compiling allocation.cpp. In 32 bit builds the constant value badHeapOopVal (which is cast to an intptr_t) is negative. The _allocation field is typed as an unsigned intptr_t and gcc catches this as an error.
Reviewed-by: jcoomes, ysr, phh
author | johnc |
---|---|
date | Wed, 18 Aug 2010 10:59:06 -0700 |
parents | c18cbe5936b8 |
children | f95d63e2154a |
rev | line source |
---|---|
0 | 1 /* |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
579
diff
changeset
|
2 * Copyright (c) 1997, 2009, Oracle and/or its affiliates. All rights reserved. |
0 | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
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 | 22 * |
23 */ | |
24 | |
25 // This file holds compiler-dependent includes, | |
26 // globally used constants & types, class (forward) | |
27 // declarations and a few frequently used utility functions. | |
28 | |
29 | |
30 # include <ctype.h> | |
31 # include <dirent.h> | |
32 # include <string.h> | |
33 # include <strings.h> // for bsd'isms | |
34 # include <stdarg.h> | |
35 # include <stddef.h> // for offsetof | |
36 # include <stdio.h> | |
37 # include <stdlib.h> | |
38 # include <wchar.h> | |
39 # include <stdarg.h> | |
50
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
40 #ifdef SOLARIS |
0 | 41 # include <ieeefp.h> |
50
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
42 #endif |
0 | 43 # include <math.h> |
50
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
44 #ifdef LINUX |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
45 #ifndef FP_PZERO |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
46 // Linux doesn't have positive/negative zero |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
47 #define FP_PZERO FP_ZERO |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
48 #endif |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
49 #ifndef fpclass |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
50 #define fpclass fpclassify |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
51 #endif |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
52 #endif |
0 | 53 # include <time.h> |
54 # include <fcntl.h> | |
55 # include <dlfcn.h> | |
56 # include <pthread.h> | |
50
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
57 #ifdef SOLARIS |
0 | 58 # include <thread.h> |
50
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
59 #endif |
0 | 60 # include <limits.h> |
61 # include <errno.h> | |
50
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
62 #ifdef SOLARIS |
0 | 63 # include <sys/trap.h> |
64 # include <sys/regset.h> | |
65 # include <sys/procset.h> | |
66 # include <ucontext.h> | |
67 # include <setjmp.h> | |
50
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
68 #endif |
0 | 69 # ifdef SOLARIS_MUTATOR_LIBTHREAD |
70 # include <sys/procfs.h> | |
71 # endif | |
50
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
72 #ifdef LINUX |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
73 # include <inttypes.h> |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
74 # include <signal.h> |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
75 # include <ucontext.h> |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
76 # include <sys/time.h> |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
77 #endif |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
78 |
0 | 79 |
80 // 4810578: varargs unsafe on 32-bit integer/64-bit pointer architectures | |
81 // When __cplusplus is defined, NULL is defined as 0 (32-bit constant) in | |
82 // system header files. On 32-bit architectures, there is no problem. | |
83 // On 64-bit architectures, defining NULL as a 32-bit constant can cause | |
84 // problems with varargs functions: C++ integral promotion rules say for | |
85 // varargs, we pass the argument 0 as an int. So, if NULL was passed to a | |
86 // varargs function it will remain 32-bits. Depending on the calling | |
87 // convention of the machine, if the argument is passed on the stack then | |
88 // only 32-bits of the "NULL" pointer may be initialized to zero. The | |
89 // other 32-bits will be garbage. If the varargs function is expecting a | |
90 // pointer when it extracts the argument, then we have a problem. | |
91 // | |
92 // Solution: For 64-bit architectures, redefine NULL as 64-bit constant 0. | |
50
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
93 // |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
94 // Note: this fix doesn't work well on Linux because NULL will be overwritten |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
95 // whenever a system header file is included. Linux handles NULL correctly |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
96 // through a special type '__null'. |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
97 #ifdef SOLARIS |
0 | 98 #ifdef _LP64 |
99 #undef NULL | |
100 #define NULL 0L | |
101 #else | |
102 #ifndef NULL | |
103 #define NULL 0 | |
104 #endif | |
105 #endif | |
50
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
106 #endif |
0 | 107 |
108 // NULL vs NULL_WORD: | |
109 // On Linux NULL is defined as a special type '__null'. Assigning __null to | |
110 // integer variable will cause gcc warning. Use NULL_WORD in places where a | |
50
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
111 // pointer is stored as integer value. On some platforms, sizeof(intptr_t) > |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
112 // sizeof(void*), so here we want something which is integer type, but has the |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
113 // same size as a pointer. |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
114 #ifdef LINUX |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
115 #ifdef _LP64 |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
116 #define NULL_WORD 0L |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
117 #else |
512
db4caa99ef11
6787106: Hotspot 32 bit build fails on platforms having different definitions for intptr_t & int32_t
xlu
parents:
196
diff
changeset
|
118 // 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:
196
diff
changeset
|
119 // on some platforms. |
db4caa99ef11
6787106: Hotspot 32 bit build fails on platforms having different definitions for intptr_t & int32_t
xlu
parents:
196
diff
changeset
|
120 #define NULL_WORD ((intptr_t)0) |
50
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
121 #endif |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
122 #else |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
123 #define NULL_WORD NULL |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
124 #endif |
0 | 125 |
50
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
126 #ifndef LINUX |
0 | 127 // Compiler-specific primitive types |
128 typedef unsigned short uint16_t; | |
129 #ifndef _UINT32_T | |
130 #define _UINT32_T | |
131 typedef unsigned int uint32_t; | |
132 #endif | |
133 #if !defined(_SYS_INT_TYPES_H) | |
134 #ifndef _UINT64_T | |
135 #define _UINT64_T | |
136 typedef unsigned long long uint64_t; | |
137 #endif | |
138 // %%%% how to access definition of intptr_t portably in 5.5 onward? | |
139 typedef int intptr_t; | |
140 typedef unsigned int uintptr_t; | |
141 // If this gets an error, figure out a symbol XXX that implies the | |
142 // prior definition of intptr_t, and add "&& !defined(XXX)" above. | |
143 #endif | |
50
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
144 #endif |
0 | 145 |
146 // Additional Java basic types | |
147 | |
148 typedef unsigned char jubyte; | |
149 typedef unsigned short jushort; | |
150 typedef unsigned int juint; | |
151 typedef unsigned long long julong; | |
152 | |
153 //---------------------------------------------------------------------------------------------------- | |
154 // Special (possibly not-portable) casts | |
155 // Cast floats into same-size integers and vice-versa w/o changing bit-pattern | |
156 | |
157 inline jint jint_cast (jfloat x) { return *(jint* )&x; } | |
158 inline jlong jlong_cast (jdouble x) { return *(jlong* )&x; } | |
159 | |
160 inline jfloat jfloat_cast (jint x) { return *(jfloat* )&x; } | |
161 inline jdouble jdouble_cast(jlong x) { return *(jdouble*)&x; } | |
162 | |
163 //---------------------------------------------------------------------------------------------------- | |
164 // Constant for jlong (specifying an long long constant is C++ compiler specific) | |
165 | |
166 // Build a 64bit integer constant | |
167 #define CONST64(x) (x ## LL) | |
168 #define UCONST64(x) (x ## ULL) | |
169 | |
170 const jlong min_jlong = CONST64(0x8000000000000000); | |
171 const jlong max_jlong = CONST64(0x7fffffffffffffff); | |
172 | |
50
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
173 #ifdef SOLARIS |
0 | 174 //---------------------------------------------------------------------------------------------------- |
175 // ANSI C++ fixes | |
176 // NOTE:In the ANSI committee's continuing attempt to make each version | |
177 // of C++ incompatible with the previous version, you can no longer cast | |
178 // pointers to functions without specifying linkage unless you want to get | |
179 // warnings. | |
180 // | |
181 // This also means that pointers to functions can no longer be "hidden" | |
182 // in opaque types like void * because at the invokation point warnings | |
183 // will be generated. While this makes perfect sense from a type safety | |
184 // point of view it causes a lot of warnings on old code using C header | |
185 // files. Here are some typedefs to make the job of silencing warnings | |
186 // a bit easier. | |
187 // | |
188 // The final kick in the teeth is that you can only have extern "C" linkage | |
189 // specified at file scope. So these typedefs are here rather than in the | |
190 // .hpp for the class (os:Solaris usually) that needs them. | |
191 | |
192 extern "C" { | |
193 typedef int (*int_fnP_thread_t_iP_uP_stack_tP_gregset_t)(thread_t, int*, unsigned *, stack_t*, gregset_t); | |
194 typedef int (*int_fnP_thread_t_i_gregset_t)(thread_t, int, gregset_t); | |
195 typedef int (*int_fnP_thread_t_i)(thread_t, int); | |
196 typedef int (*int_fnP_thread_t)(thread_t); | |
197 | |
198 typedef int (*int_fnP_cond_tP_mutex_tP_timestruc_tP)(cond_t *cv, mutex_t *mx, timestruc_t *abst); | |
199 typedef int (*int_fnP_cond_tP_mutex_tP)(cond_t *cv, mutex_t *mx); | |
200 | |
201 // typedef for missing API in libc | |
202 typedef int (*int_fnP_mutex_tP_i_vP)(mutex_t *, int, void *); | |
203 typedef int (*int_fnP_mutex_tP)(mutex_t *); | |
204 typedef int (*int_fnP_cond_tP_i_vP)(cond_t *cv, int scope, void *arg); | |
205 typedef int (*int_fnP_cond_tP)(cond_t *cv); | |
206 }; | |
50
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
207 #endif |
0 | 208 |
209 //---------------------------------------------------------------------------------------------------- | |
210 // Debugging | |
211 | |
212 #define DEBUG_EXCEPTION ::abort(); | |
213 | |
214 extern "C" void breakpoint(); | |
215 #define BREAKPOINT ::breakpoint() | |
216 | |
217 // checking for nanness | |
50
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
218 #ifdef SOLARIS |
0 | 219 #ifdef SPARC |
220 inline int g_isnan(float f) { return isnanf(f); } | |
221 #else | |
222 // isnanf() broken on Intel Solaris use isnand() | |
223 inline int g_isnan(float f) { return isnand(f); } | |
224 #endif | |
225 | |
226 inline int g_isnan(double f) { return isnand(f); } | |
50
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
227 #elif LINUX |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
228 inline int g_isnan(float f) { return isnanf(f); } |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
229 inline int g_isnan(double f) { return isnan(f); } |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
230 #else |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
231 #error "missing platform-specific definition here" |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
232 #endif |
0 | 233 |
234 // Checking for finiteness | |
235 | |
236 inline int g_isfinite(jfloat f) { return finite(f); } | |
237 inline int g_isfinite(jdouble f) { return finite(f); } | |
238 | |
239 | |
240 // Wide characters | |
241 | |
242 inline int wcslen(const jchar* x) { return wcslen((const wchar_t*)x); } | |
243 | |
244 | |
245 // Misc | |
50
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
246 // NOTE: This one leads to an infinite recursion on Linux |
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
247 #ifndef LINUX |
0 | 248 int local_vsnprintf(char* buf, size_t count, const char* fmt, va_list argptr); |
249 #define vsnprintf local_vsnprintf | |
50
485d403e94e1
6452081: 3/4 Allow for Linux builds with Sun Studio Linux compilers
dcubed
parents:
0
diff
changeset
|
250 #endif |
0 | 251 |
252 // Portability macros | |
253 #define PRAGMA_INTERFACE | |
254 #define PRAGMA_IMPLEMENTATION | |
255 #define PRAGMA_IMPLEMENTATION_(arg) | |
256 #define VALUE_OBJ_CLASS_SPEC : public _ValueObj | |
257 | |
258 // Formatting. | |
259 #ifdef _LP64 | |
260 #define FORMAT64_MODIFIER "l" | |
261 #else // !_LP64 | |
262 #define FORMAT64_MODIFIER "ll" | |
263 #endif // _LP64 | |
264 | |
265 #define offset_of(klass,field) offsetof(klass,field) |