src/share/vm/utilities/globalDefinitions_gcc.hpp

Thu, 20 Nov 2008 16:56:09 -0800

author
ysr
date
Thu, 20 Nov 2008 16:56:09 -0800
changeset 888
c96030fff130
parent 435
a61af66fc99e
child 947
db4caa99ef11
permissions
-rw-r--r--

6684579: SoftReference processing can be made more efficient
Summary: For current soft-ref clearing policies, we can decide at marking time if a soft-reference will definitely not be cleared, postponing the decision of whether it will definitely be cleared to the final reference processing phase. This can be especially beneficial in the case of concurrent collectors where the marking is usually concurrent but reference processing is usually not.
Reviewed-by: jmasa

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

mercurial