annotate src/share/vm/utilities/globalDefinitions.hpp @ 453:c96030fff130

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
author ysr
date Thu, 20 Nov 2008 16:56:09 -0800
parents a4f9ef0c0375
children 2328d1d3f8cf 7628781568e1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
196
d1605aabd0a1 6719955: Update copyright year
xdono
parents: 145
diff changeset
2 * Copyright 1997-2008 Sun Microsystems, Inc. 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 *
a61af66fc99e Initial load
duke
parents:
diff changeset
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
a61af66fc99e Initial load
duke
parents:
diff changeset
20 * CA 95054 USA or visit www.sun.com if you need additional information or
a61af66fc99e Initial load
duke
parents:
diff changeset
21 * have any questions.
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 all globally used constants & types, class (forward)
a61af66fc99e Initial load
duke
parents:
diff changeset
26 // declarations and a few frequently used utility functions.
a61af66fc99e Initial load
duke
parents:
diff changeset
27
a61af66fc99e Initial load
duke
parents:
diff changeset
28 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
29 // Constants
a61af66fc99e Initial load
duke
parents:
diff changeset
30
a61af66fc99e Initial load
duke
parents:
diff changeset
31 const int LogBytesPerShort = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
32 const int LogBytesPerInt = 2;
a61af66fc99e Initial load
duke
parents:
diff changeset
33 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
34 const int LogBytesPerWord = 3;
a61af66fc99e Initial load
duke
parents:
diff changeset
35 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
36 const int LogBytesPerWord = 2;
a61af66fc99e Initial load
duke
parents:
diff changeset
37 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
38 const int LogBytesPerLong = 3;
a61af66fc99e Initial load
duke
parents:
diff changeset
39
a61af66fc99e Initial load
duke
parents:
diff changeset
40 const int BytesPerShort = 1 << LogBytesPerShort;
a61af66fc99e Initial load
duke
parents:
diff changeset
41 const int BytesPerInt = 1 << LogBytesPerInt;
a61af66fc99e Initial load
duke
parents:
diff changeset
42 const int BytesPerWord = 1 << LogBytesPerWord;
a61af66fc99e Initial load
duke
parents:
diff changeset
43 const int BytesPerLong = 1 << LogBytesPerLong;
a61af66fc99e Initial load
duke
parents:
diff changeset
44
a61af66fc99e Initial load
duke
parents:
diff changeset
45 const int LogBitsPerByte = 3;
a61af66fc99e Initial load
duke
parents:
diff changeset
46 const int LogBitsPerShort = LogBitsPerByte + LogBytesPerShort;
a61af66fc99e Initial load
duke
parents:
diff changeset
47 const int LogBitsPerInt = LogBitsPerByte + LogBytesPerInt;
a61af66fc99e Initial load
duke
parents:
diff changeset
48 const int LogBitsPerWord = LogBitsPerByte + LogBytesPerWord;
a61af66fc99e Initial load
duke
parents:
diff changeset
49 const int LogBitsPerLong = LogBitsPerByte + LogBytesPerLong;
a61af66fc99e Initial load
duke
parents:
diff changeset
50
a61af66fc99e Initial load
duke
parents:
diff changeset
51 const int BitsPerByte = 1 << LogBitsPerByte;
a61af66fc99e Initial load
duke
parents:
diff changeset
52 const int BitsPerShort = 1 << LogBitsPerShort;
a61af66fc99e Initial load
duke
parents:
diff changeset
53 const int BitsPerInt = 1 << LogBitsPerInt;
a61af66fc99e Initial load
duke
parents:
diff changeset
54 const int BitsPerWord = 1 << LogBitsPerWord;
a61af66fc99e Initial load
duke
parents:
diff changeset
55 const int BitsPerLong = 1 << LogBitsPerLong;
a61af66fc99e Initial load
duke
parents:
diff changeset
56
a61af66fc99e Initial load
duke
parents:
diff changeset
57 const int WordAlignmentMask = (1 << LogBytesPerWord) - 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
58 const int LongAlignmentMask = (1 << LogBytesPerLong) - 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
59
a61af66fc99e Initial load
duke
parents:
diff changeset
60 const int WordsPerLong = 2; // Number of stack entries for longs
a61af66fc99e Initial load
duke
parents:
diff changeset
61
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
62 const int oopSize = sizeof(char*); // Full-width oop
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
63 extern int heapOopSize; // Oop within a java object
0
a61af66fc99e Initial load
duke
parents:
diff changeset
64 const int wordSize = sizeof(char*);
a61af66fc99e Initial load
duke
parents:
diff changeset
65 const int longSize = sizeof(jlong);
a61af66fc99e Initial load
duke
parents:
diff changeset
66 const int jintSize = sizeof(jint);
a61af66fc99e Initial load
duke
parents:
diff changeset
67 const int size_tSize = sizeof(size_t);
a61af66fc99e Initial load
duke
parents:
diff changeset
68
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
69 const int BytesPerOop = BytesPerWord; // Full-width oop
0
a61af66fc99e Initial load
duke
parents:
diff changeset
70
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
71 extern int LogBytesPerHeapOop; // Oop within a java object
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
72 extern int LogBitsPerHeapOop;
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
73 extern int BytesPerHeapOop;
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
74 extern int BitsPerHeapOop;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
75
a61af66fc99e Initial load
duke
parents:
diff changeset
76 const int BitsPerJavaInteger = 32;
a61af66fc99e Initial load
duke
parents:
diff changeset
77 const int BitsPerSize_t = size_tSize * BitsPerByte;
a61af66fc99e Initial load
duke
parents:
diff changeset
78
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
79 // Size of a char[] needed to represent a jint as a string in decimal.
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
80 const int jintAsStringSize = 12;
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
81
0
a61af66fc99e Initial load
duke
parents:
diff changeset
82 // In fact this should be
a61af66fc99e Initial load
duke
parents:
diff changeset
83 // log2_intptr(sizeof(class JavaThread)) - log2_intptr(64);
a61af66fc99e Initial load
duke
parents:
diff changeset
84 // see os::set_memory_serialize_page()
a61af66fc99e Initial load
duke
parents:
diff changeset
85 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
86 const int SerializePageShiftCount = 4;
a61af66fc99e Initial load
duke
parents:
diff changeset
87 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
88 const int SerializePageShiftCount = 3;
a61af66fc99e Initial load
duke
parents:
diff changeset
89 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
90
a61af66fc99e Initial load
duke
parents:
diff changeset
91 // An opaque struct of heap-word width, so that HeapWord* can be a generic
a61af66fc99e Initial load
duke
parents:
diff changeset
92 // pointer into the heap. We require that object sizes be measured in
a61af66fc99e Initial load
duke
parents:
diff changeset
93 // units of heap words, so that that
a61af66fc99e Initial load
duke
parents:
diff changeset
94 // HeapWord* hw;
a61af66fc99e Initial load
duke
parents:
diff changeset
95 // hw += oop(hw)->foo();
a61af66fc99e Initial load
duke
parents:
diff changeset
96 // works, where foo is a method (like size or scavenge) that returns the
a61af66fc99e Initial load
duke
parents:
diff changeset
97 // object size.
a61af66fc99e Initial load
duke
parents:
diff changeset
98 class HeapWord {
a61af66fc99e Initial load
duke
parents:
diff changeset
99 friend class VMStructs;
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 145
diff changeset
100 private:
0
a61af66fc99e Initial load
duke
parents:
diff changeset
101 char* i;
361
a4f9ef0c0375 6743059: Error in spaceDecorator.cpp "optimized" build.
jmasa
parents: 269
diff changeset
102 #ifndef PRODUCT
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 145
diff changeset
103 public:
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 145
diff changeset
104 char* value() { return i; }
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 145
diff changeset
105 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
106 };
a61af66fc99e Initial load
duke
parents:
diff changeset
107
a61af66fc99e Initial load
duke
parents:
diff changeset
108 // HeapWordSize must be 2^LogHeapWordSize.
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
109 const int HeapWordSize = sizeof(HeapWord);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
110 #ifdef _LP64
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
111 const int LogHeapWordSize = 3;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
112 #else
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
113 const int LogHeapWordSize = 2;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
114 #endif
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
115 const int HeapWordsPerLong = BytesPerLong / HeapWordSize;
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
116 const int LogHeapWordsPerLong = LogBytesPerLong - LogHeapWordSize;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
117
a61af66fc99e Initial load
duke
parents:
diff changeset
118 // The larger HeapWordSize for 64bit requires larger heaps
a61af66fc99e Initial load
duke
parents:
diff changeset
119 // for the same application running in 64bit. See bug 4967770.
a61af66fc99e Initial load
duke
parents:
diff changeset
120 // The minimum alignment to a heap word size is done. Other
a61af66fc99e Initial load
duke
parents:
diff changeset
121 // parts of the memory system may required additional alignment
a61af66fc99e Initial load
duke
parents:
diff changeset
122 // and are responsible for those alignments.
a61af66fc99e Initial load
duke
parents:
diff changeset
123 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
124 #define ScaleForWordSize(x) align_size_down_((x) * 13 / 10, HeapWordSize)
a61af66fc99e Initial load
duke
parents:
diff changeset
125 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
126 #define ScaleForWordSize(x) (x)
a61af66fc99e Initial load
duke
parents:
diff changeset
127 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
128
a61af66fc99e Initial load
duke
parents:
diff changeset
129 // The minimum number of native machine words necessary to contain "byte_size"
a61af66fc99e Initial load
duke
parents:
diff changeset
130 // bytes.
a61af66fc99e Initial load
duke
parents:
diff changeset
131 inline size_t heap_word_size(size_t byte_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
132 return (byte_size + (HeapWordSize-1)) >> LogHeapWordSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
133 }
a61af66fc99e Initial load
duke
parents:
diff changeset
134
a61af66fc99e Initial load
duke
parents:
diff changeset
135
a61af66fc99e Initial load
duke
parents:
diff changeset
136 const size_t K = 1024;
a61af66fc99e Initial load
duke
parents:
diff changeset
137 const size_t M = K*K;
a61af66fc99e Initial load
duke
parents:
diff changeset
138 const size_t G = M*K;
a61af66fc99e Initial load
duke
parents:
diff changeset
139 const size_t HWperKB = K / sizeof(HeapWord);
a61af66fc99e Initial load
duke
parents:
diff changeset
140
a61af66fc99e Initial load
duke
parents:
diff changeset
141 const jint min_jint = (jint)1 << (sizeof(jint)*BitsPerByte-1); // 0x80000000 == smallest jint
a61af66fc99e Initial load
duke
parents:
diff changeset
142 const jint max_jint = (juint)min_jint - 1; // 0x7FFFFFFF == largest jint
a61af66fc99e Initial load
duke
parents:
diff changeset
143
a61af66fc99e Initial load
duke
parents:
diff changeset
144 // Constants for converting from a base unit to milli-base units. For
a61af66fc99e Initial load
duke
parents:
diff changeset
145 // example from seconds to milliseconds and microseconds
a61af66fc99e Initial load
duke
parents:
diff changeset
146
a61af66fc99e Initial load
duke
parents:
diff changeset
147 const int MILLIUNITS = 1000; // milli units per base unit
a61af66fc99e Initial load
duke
parents:
diff changeset
148 const int MICROUNITS = 1000000; // micro units per base unit
a61af66fc99e Initial load
duke
parents:
diff changeset
149 const int NANOUNITS = 1000000000; // nano units per base unit
a61af66fc99e Initial load
duke
parents:
diff changeset
150
a61af66fc99e Initial load
duke
parents:
diff changeset
151 inline const char* proper_unit_for_byte_size(size_t s) {
a61af66fc99e Initial load
duke
parents:
diff changeset
152 if (s >= 10*M) {
a61af66fc99e Initial load
duke
parents:
diff changeset
153 return "M";
a61af66fc99e Initial load
duke
parents:
diff changeset
154 } else if (s >= 10*K) {
a61af66fc99e Initial load
duke
parents:
diff changeset
155 return "K";
a61af66fc99e Initial load
duke
parents:
diff changeset
156 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
157 return "B";
a61af66fc99e Initial load
duke
parents:
diff changeset
158 }
a61af66fc99e Initial load
duke
parents:
diff changeset
159 }
a61af66fc99e Initial load
duke
parents:
diff changeset
160
a61af66fc99e Initial load
duke
parents:
diff changeset
161 inline size_t byte_size_in_proper_unit(size_t s) {
a61af66fc99e Initial load
duke
parents:
diff changeset
162 if (s >= 10*M) {
a61af66fc99e Initial load
duke
parents:
diff changeset
163 return s/M;
a61af66fc99e Initial load
duke
parents:
diff changeset
164 } else if (s >= 10*K) {
a61af66fc99e Initial load
duke
parents:
diff changeset
165 return s/K;
a61af66fc99e Initial load
duke
parents:
diff changeset
166 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
167 return s;
a61af66fc99e Initial load
duke
parents:
diff changeset
168 }
a61af66fc99e Initial load
duke
parents:
diff changeset
169 }
a61af66fc99e Initial load
duke
parents:
diff changeset
170
a61af66fc99e Initial load
duke
parents:
diff changeset
171
a61af66fc99e Initial load
duke
parents:
diff changeset
172 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
173 // VM type definitions
a61af66fc99e Initial load
duke
parents:
diff changeset
174
a61af66fc99e Initial load
duke
parents:
diff changeset
175 // intx and uintx are the 'extended' int and 'extended' unsigned int types;
a61af66fc99e Initial load
duke
parents:
diff changeset
176 // they are 32bit wide on a 32-bit platform, and 64bit wide on a 64bit platform.
a61af66fc99e Initial load
duke
parents:
diff changeset
177
a61af66fc99e Initial load
duke
parents:
diff changeset
178 typedef intptr_t intx;
a61af66fc99e Initial load
duke
parents:
diff changeset
179 typedef uintptr_t uintx;
a61af66fc99e Initial load
duke
parents:
diff changeset
180
a61af66fc99e Initial load
duke
parents:
diff changeset
181 const intx min_intx = (intx)1 << (sizeof(intx)*BitsPerByte-1);
a61af66fc99e Initial load
duke
parents:
diff changeset
182 const intx max_intx = (uintx)min_intx - 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
183 const uintx max_uintx = (uintx)-1;
a61af66fc99e Initial load
duke
parents:
diff changeset
184
a61af66fc99e Initial load
duke
parents:
diff changeset
185 // Table of values:
a61af66fc99e Initial load
duke
parents:
diff changeset
186 // sizeof intx 4 8
a61af66fc99e Initial load
duke
parents:
diff changeset
187 // min_intx 0x80000000 0x8000000000000000
a61af66fc99e Initial load
duke
parents:
diff changeset
188 // max_intx 0x7FFFFFFF 0x7FFFFFFFFFFFFFFF
a61af66fc99e Initial load
duke
parents:
diff changeset
189 // max_uintx 0xFFFFFFFF 0xFFFFFFFFFFFFFFFF
a61af66fc99e Initial load
duke
parents:
diff changeset
190
a61af66fc99e Initial load
duke
parents:
diff changeset
191 typedef unsigned int uint; NEEDS_CLEANUP
a61af66fc99e Initial load
duke
parents:
diff changeset
192
a61af66fc99e Initial load
duke
parents:
diff changeset
193
a61af66fc99e Initial load
duke
parents:
diff changeset
194 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
195 // Java type definitions
a61af66fc99e Initial load
duke
parents:
diff changeset
196
a61af66fc99e Initial load
duke
parents:
diff changeset
197 // All kinds of 'plain' byte addresses
a61af66fc99e Initial load
duke
parents:
diff changeset
198 typedef signed char s_char;
a61af66fc99e Initial load
duke
parents:
diff changeset
199 typedef unsigned char u_char;
a61af66fc99e Initial load
duke
parents:
diff changeset
200 typedef u_char* address;
a61af66fc99e Initial load
duke
parents:
diff changeset
201 typedef uintptr_t address_word; // unsigned integer which will hold a pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
202 // except for some implementations of a C++
a61af66fc99e Initial load
duke
parents:
diff changeset
203 // linkage pointer to function. Should never
a61af66fc99e Initial load
duke
parents:
diff changeset
204 // need one of those to be placed in this
a61af66fc99e Initial load
duke
parents:
diff changeset
205 // type anyway.
a61af66fc99e Initial load
duke
parents:
diff changeset
206
a61af66fc99e Initial load
duke
parents:
diff changeset
207 // Utility functions to "portably" (?) bit twiddle pointers
a61af66fc99e Initial load
duke
parents:
diff changeset
208 // Where portable means keep ANSI C++ compilers quiet
a61af66fc99e Initial load
duke
parents:
diff changeset
209
a61af66fc99e Initial load
duke
parents:
diff changeset
210 inline address set_address_bits(address x, int m) { return address(intptr_t(x) | m); }
a61af66fc99e Initial load
duke
parents:
diff changeset
211 inline address clear_address_bits(address x, int m) { return address(intptr_t(x) & ~m); }
a61af66fc99e Initial load
duke
parents:
diff changeset
212
a61af66fc99e Initial load
duke
parents:
diff changeset
213 // Utility functions to "portably" make cast to/from function pointers.
a61af66fc99e Initial load
duke
parents:
diff changeset
214
a61af66fc99e Initial load
duke
parents:
diff changeset
215 inline address_word mask_address_bits(address x, int m) { return address_word(x) & m; }
a61af66fc99e Initial load
duke
parents:
diff changeset
216 inline address_word castable_address(address x) { return address_word(x) ; }
a61af66fc99e Initial load
duke
parents:
diff changeset
217 inline address_word castable_address(void* x) { return address_word(x) ; }
a61af66fc99e Initial load
duke
parents:
diff changeset
218
a61af66fc99e Initial load
duke
parents:
diff changeset
219 // Pointer subtraction.
a61af66fc99e Initial load
duke
parents:
diff changeset
220 // The idea here is to avoid ptrdiff_t, which is signed and so doesn't have
a61af66fc99e Initial load
duke
parents:
diff changeset
221 // the range we might need to find differences from one end of the heap
a61af66fc99e Initial load
duke
parents:
diff changeset
222 // to the other.
a61af66fc99e Initial load
duke
parents:
diff changeset
223 // A typical use might be:
a61af66fc99e Initial load
duke
parents:
diff changeset
224 // if (pointer_delta(end(), top()) >= size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
225 // // enough room for an object of size
a61af66fc99e Initial load
duke
parents:
diff changeset
226 // ...
a61af66fc99e Initial load
duke
parents:
diff changeset
227 // and then additions like
a61af66fc99e Initial load
duke
parents:
diff changeset
228 // ... top() + size ...
a61af66fc99e Initial load
duke
parents:
diff changeset
229 // are safe because we know that top() is at least size below end().
a61af66fc99e Initial load
duke
parents:
diff changeset
230 inline size_t pointer_delta(const void* left,
a61af66fc99e Initial load
duke
parents:
diff changeset
231 const void* right,
a61af66fc99e Initial load
duke
parents:
diff changeset
232 size_t element_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
233 return (((uintptr_t) left) - ((uintptr_t) right)) / element_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
234 }
a61af66fc99e Initial load
duke
parents:
diff changeset
235 // A version specialized for HeapWord*'s.
a61af66fc99e Initial load
duke
parents:
diff changeset
236 inline size_t pointer_delta(const HeapWord* left, const HeapWord* right) {
a61af66fc99e Initial load
duke
parents:
diff changeset
237 return pointer_delta(left, right, sizeof(HeapWord));
a61af66fc99e Initial load
duke
parents:
diff changeset
238 }
a61af66fc99e Initial load
duke
parents:
diff changeset
239
a61af66fc99e Initial load
duke
parents:
diff changeset
240 //
a61af66fc99e Initial load
duke
parents:
diff changeset
241 // ANSI C++ does not allow casting from one pointer type to a function pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
242 // directly without at best a warning. This macro accomplishes it silently
a61af66fc99e Initial load
duke
parents:
diff changeset
243 // In every case that is present at this point the value be cast is a pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
244 // to a C linkage function. In somecase the type used for the cast reflects
a61af66fc99e Initial load
duke
parents:
diff changeset
245 // that linkage and a picky compiler would not complain. In other cases because
a61af66fc99e Initial load
duke
parents:
diff changeset
246 // there is no convenient place to place a typedef with extern C linkage (i.e
a61af66fc99e Initial load
duke
parents:
diff changeset
247 // a platform dependent header file) it doesn't. At this point no compiler seems
a61af66fc99e Initial load
duke
parents:
diff changeset
248 // picky enough to catch these instances (which are few). It is possible that
a61af66fc99e Initial load
duke
parents:
diff changeset
249 // using templates could fix these for all cases. This use of templates is likely
a61af66fc99e Initial load
duke
parents:
diff changeset
250 // so far from the middle of the road that it is likely to be problematic in
a61af66fc99e Initial load
duke
parents:
diff changeset
251 // many C++ compilers.
a61af66fc99e Initial load
duke
parents:
diff changeset
252 //
a61af66fc99e Initial load
duke
parents:
diff changeset
253 #define CAST_TO_FN_PTR(func_type, value) ((func_type)(castable_address(value)))
a61af66fc99e Initial load
duke
parents:
diff changeset
254 #define CAST_FROM_FN_PTR(new_type, func_ptr) ((new_type)((address_word)(func_ptr)))
a61af66fc99e Initial load
duke
parents:
diff changeset
255
a61af66fc99e Initial load
duke
parents:
diff changeset
256 // Unsigned byte types for os and stream.hpp
a61af66fc99e Initial load
duke
parents:
diff changeset
257
a61af66fc99e Initial load
duke
parents:
diff changeset
258 // Unsigned one, two, four and eigth byte quantities used for describing
a61af66fc99e Initial load
duke
parents:
diff changeset
259 // the .class file format. See JVM book chapter 4.
a61af66fc99e Initial load
duke
parents:
diff changeset
260
a61af66fc99e Initial load
duke
parents:
diff changeset
261 typedef jubyte u1;
a61af66fc99e Initial load
duke
parents:
diff changeset
262 typedef jushort u2;
a61af66fc99e Initial load
duke
parents:
diff changeset
263 typedef juint u4;
a61af66fc99e Initial load
duke
parents:
diff changeset
264 typedef julong u8;
a61af66fc99e Initial load
duke
parents:
diff changeset
265
a61af66fc99e Initial load
duke
parents:
diff changeset
266 const jubyte max_jubyte = (jubyte)-1; // 0xFF largest jubyte
a61af66fc99e Initial load
duke
parents:
diff changeset
267 const jushort max_jushort = (jushort)-1; // 0xFFFF largest jushort
a61af66fc99e Initial load
duke
parents:
diff changeset
268 const juint max_juint = (juint)-1; // 0xFFFFFFFF largest juint
a61af66fc99e Initial load
duke
parents:
diff changeset
269 const julong max_julong = (julong)-1; // 0xFF....FF largest julong
a61af66fc99e Initial load
duke
parents:
diff changeset
270
a61af66fc99e Initial load
duke
parents:
diff changeset
271 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
272 // JVM spec restrictions
a61af66fc99e Initial load
duke
parents:
diff changeset
273
a61af66fc99e Initial load
duke
parents:
diff changeset
274 const int max_method_code_size = 64*K - 1; // JVM spec, 2nd ed. section 4.8.1 (p.134)
a61af66fc99e Initial load
duke
parents:
diff changeset
275
a61af66fc99e Initial load
duke
parents:
diff changeset
276
a61af66fc99e Initial load
duke
parents:
diff changeset
277 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
278 // HotSwap - for JVMTI aka Class File Replacement and PopFrame
a61af66fc99e Initial load
duke
parents:
diff changeset
279 //
a61af66fc99e Initial load
duke
parents:
diff changeset
280 // Determines whether on-the-fly class replacement and frame popping are enabled.
a61af66fc99e Initial load
duke
parents:
diff changeset
281
a61af66fc99e Initial load
duke
parents:
diff changeset
282 #define HOTSWAP
a61af66fc99e Initial load
duke
parents:
diff changeset
283
a61af66fc99e Initial load
duke
parents:
diff changeset
284 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
285 // Object alignment, in units of HeapWords.
a61af66fc99e Initial load
duke
parents:
diff changeset
286 //
a61af66fc99e Initial load
duke
parents:
diff changeset
287 // Minimum is max(BytesPerLong, BytesPerDouble, BytesPerOop) / HeapWordSize, so jlong, jdouble and
a61af66fc99e Initial load
duke
parents:
diff changeset
288 // reference fields can be naturally aligned.
a61af66fc99e Initial load
duke
parents:
diff changeset
289
a61af66fc99e Initial load
duke
parents:
diff changeset
290 const int MinObjAlignment = HeapWordsPerLong;
a61af66fc99e Initial load
duke
parents:
diff changeset
291 const int MinObjAlignmentInBytes = MinObjAlignment * HeapWordSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
292 const int MinObjAlignmentInBytesMask = MinObjAlignmentInBytes - 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
293
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
294 const int LogMinObjAlignment = LogHeapWordsPerLong;
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
295 const int LogMinObjAlignmentInBytes = LogMinObjAlignment + LogHeapWordSize;
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
296
0
a61af66fc99e Initial load
duke
parents:
diff changeset
297 // Machine dependent stuff
a61af66fc99e Initial load
duke
parents:
diff changeset
298
a61af66fc99e Initial load
duke
parents:
diff changeset
299 #include "incls/_globalDefinitions_pd.hpp.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
300
a61af66fc99e Initial load
duke
parents:
diff changeset
301 // The byte alignment to be used by Arena::Amalloc. See bugid 4169348.
a61af66fc99e Initial load
duke
parents:
diff changeset
302 // Note: this value must be a power of 2
a61af66fc99e Initial load
duke
parents:
diff changeset
303
a61af66fc99e Initial load
duke
parents:
diff changeset
304 #define ARENA_AMALLOC_ALIGNMENT (2*BytesPerWord)
a61af66fc99e Initial load
duke
parents:
diff changeset
305
a61af66fc99e Initial load
duke
parents:
diff changeset
306 // Signed variants of alignment helpers. There are two versions of each, a macro
a61af66fc99e Initial load
duke
parents:
diff changeset
307 // for use in places like enum definitions that require compile-time constant
a61af66fc99e Initial load
duke
parents:
diff changeset
308 // expressions and a function for all other places so as to get type checking.
a61af66fc99e Initial load
duke
parents:
diff changeset
309
a61af66fc99e Initial load
duke
parents:
diff changeset
310 #define align_size_up_(size, alignment) (((size) + ((alignment) - 1)) & ~((alignment) - 1))
a61af66fc99e Initial load
duke
parents:
diff changeset
311
a61af66fc99e Initial load
duke
parents:
diff changeset
312 inline intptr_t align_size_up(intptr_t size, intptr_t alignment) {
a61af66fc99e Initial load
duke
parents:
diff changeset
313 return align_size_up_(size, alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
314 }
a61af66fc99e Initial load
duke
parents:
diff changeset
315
a61af66fc99e Initial load
duke
parents:
diff changeset
316 #define align_size_down_(size, alignment) ((size) & ~((alignment) - 1))
a61af66fc99e Initial load
duke
parents:
diff changeset
317
a61af66fc99e Initial load
duke
parents:
diff changeset
318 inline intptr_t align_size_down(intptr_t size, intptr_t alignment) {
a61af66fc99e Initial load
duke
parents:
diff changeset
319 return align_size_down_(size, alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
320 }
a61af66fc99e Initial load
duke
parents:
diff changeset
321
a61af66fc99e Initial load
duke
parents:
diff changeset
322 // Align objects by rounding up their size, in HeapWord units.
a61af66fc99e Initial load
duke
parents:
diff changeset
323
a61af66fc99e Initial load
duke
parents:
diff changeset
324 #define align_object_size_(size) align_size_up_(size, MinObjAlignment)
a61af66fc99e Initial load
duke
parents:
diff changeset
325
a61af66fc99e Initial load
duke
parents:
diff changeset
326 inline intptr_t align_object_size(intptr_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
327 return align_size_up(size, MinObjAlignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
328 }
a61af66fc99e Initial load
duke
parents:
diff changeset
329
a61af66fc99e Initial load
duke
parents:
diff changeset
330 // Pad out certain offsets to jlong alignment, in HeapWord units.
a61af66fc99e Initial load
duke
parents:
diff changeset
331
a61af66fc99e Initial load
duke
parents:
diff changeset
332 #define align_object_offset_(offset) align_size_up_(offset, HeapWordsPerLong)
a61af66fc99e Initial load
duke
parents:
diff changeset
333
a61af66fc99e Initial load
duke
parents:
diff changeset
334 inline intptr_t align_object_offset(intptr_t offset) {
a61af66fc99e Initial load
duke
parents:
diff changeset
335 return align_size_up(offset, HeapWordsPerLong);
a61af66fc99e Initial load
duke
parents:
diff changeset
336 }
a61af66fc99e Initial load
duke
parents:
diff changeset
337
a61af66fc99e Initial load
duke
parents:
diff changeset
338 inline bool is_object_aligned(intptr_t offset) {
a61af66fc99e Initial load
duke
parents:
diff changeset
339 return offset == align_object_offset(offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
340 }
a61af66fc99e Initial load
duke
parents:
diff changeset
341
a61af66fc99e Initial load
duke
parents:
diff changeset
342
a61af66fc99e Initial load
duke
parents:
diff changeset
343 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
344 // Utility macros for compilers
a61af66fc99e Initial load
duke
parents:
diff changeset
345 // used to silence compiler warnings
a61af66fc99e Initial load
duke
parents:
diff changeset
346
a61af66fc99e Initial load
duke
parents:
diff changeset
347 #define Unused_Variable(var) var
a61af66fc99e Initial load
duke
parents:
diff changeset
348
a61af66fc99e Initial load
duke
parents:
diff changeset
349
a61af66fc99e Initial load
duke
parents:
diff changeset
350 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
351 // Miscellaneous
a61af66fc99e Initial load
duke
parents:
diff changeset
352
a61af66fc99e Initial load
duke
parents:
diff changeset
353 // 6302670 Eliminate Hotspot __fabsf dependency
a61af66fc99e Initial load
duke
parents:
diff changeset
354 // All fabs() callers should call this function instead, which will implicitly
a61af66fc99e Initial load
duke
parents:
diff changeset
355 // convert the operand to double, avoiding a dependency on __fabsf which
a61af66fc99e Initial load
duke
parents:
diff changeset
356 // doesn't exist in early versions of Solaris 8.
a61af66fc99e Initial load
duke
parents:
diff changeset
357 inline double fabsd(double value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
358 return fabs(value);
a61af66fc99e Initial load
duke
parents:
diff changeset
359 }
a61af66fc99e Initial load
duke
parents:
diff changeset
360
a61af66fc99e Initial load
duke
parents:
diff changeset
361 inline jint low (jlong value) { return jint(value); }
a61af66fc99e Initial load
duke
parents:
diff changeset
362 inline jint high(jlong value) { return jint(value >> 32); }
a61af66fc99e Initial load
duke
parents:
diff changeset
363
a61af66fc99e Initial load
duke
parents:
diff changeset
364 // the fancy casts are a hopefully portable way
a61af66fc99e Initial load
duke
parents:
diff changeset
365 // to do unsigned 32 to 64 bit type conversion
a61af66fc99e Initial load
duke
parents:
diff changeset
366 inline void set_low (jlong* value, jint low ) { *value &= (jlong)0xffffffff << 32;
a61af66fc99e Initial load
duke
parents:
diff changeset
367 *value |= (jlong)(julong)(juint)low; }
a61af66fc99e Initial load
duke
parents:
diff changeset
368
a61af66fc99e Initial load
duke
parents:
diff changeset
369 inline void set_high(jlong* value, jint high) { *value &= (jlong)(julong)(juint)0xffffffff;
a61af66fc99e Initial load
duke
parents:
diff changeset
370 *value |= (jlong)high << 32; }
a61af66fc99e Initial load
duke
parents:
diff changeset
371
a61af66fc99e Initial load
duke
parents:
diff changeset
372 inline jlong jlong_from(jint h, jint l) {
a61af66fc99e Initial load
duke
parents:
diff changeset
373 jlong result = 0; // initialization to avoid warning
a61af66fc99e Initial load
duke
parents:
diff changeset
374 set_high(&result, h);
a61af66fc99e Initial load
duke
parents:
diff changeset
375 set_low(&result, l);
a61af66fc99e Initial load
duke
parents:
diff changeset
376 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
377 }
a61af66fc99e Initial load
duke
parents:
diff changeset
378
a61af66fc99e Initial load
duke
parents:
diff changeset
379 union jlong_accessor {
a61af66fc99e Initial load
duke
parents:
diff changeset
380 jint words[2];
a61af66fc99e Initial load
duke
parents:
diff changeset
381 jlong long_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
382 };
a61af66fc99e Initial load
duke
parents:
diff changeset
383
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
384 void basic_types_init(); // cannot define here; uses assert
0
a61af66fc99e Initial load
duke
parents:
diff changeset
385
a61af66fc99e Initial load
duke
parents:
diff changeset
386
a61af66fc99e Initial load
duke
parents:
diff changeset
387 // NOTE: replicated in SA in vm/agent/sun/jvm/hotspot/runtime/BasicType.java
a61af66fc99e Initial load
duke
parents:
diff changeset
388 enum BasicType {
a61af66fc99e Initial load
duke
parents:
diff changeset
389 T_BOOLEAN = 4,
a61af66fc99e Initial load
duke
parents:
diff changeset
390 T_CHAR = 5,
a61af66fc99e Initial load
duke
parents:
diff changeset
391 T_FLOAT = 6,
a61af66fc99e Initial load
duke
parents:
diff changeset
392 T_DOUBLE = 7,
a61af66fc99e Initial load
duke
parents:
diff changeset
393 T_BYTE = 8,
a61af66fc99e Initial load
duke
parents:
diff changeset
394 T_SHORT = 9,
a61af66fc99e Initial load
duke
parents:
diff changeset
395 T_INT = 10,
a61af66fc99e Initial load
duke
parents:
diff changeset
396 T_LONG = 11,
a61af66fc99e Initial load
duke
parents:
diff changeset
397 T_OBJECT = 12,
a61af66fc99e Initial load
duke
parents:
diff changeset
398 T_ARRAY = 13,
a61af66fc99e Initial load
duke
parents:
diff changeset
399 T_VOID = 14,
a61af66fc99e Initial load
duke
parents:
diff changeset
400 T_ADDRESS = 15,
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
401 T_NARROWOOP= 16,
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
402 T_CONFLICT = 17, // for stack value type with conflicting contents
0
a61af66fc99e Initial load
duke
parents:
diff changeset
403 T_ILLEGAL = 99
a61af66fc99e Initial load
duke
parents:
diff changeset
404 };
a61af66fc99e Initial load
duke
parents:
diff changeset
405
29
d5fc211aea19 6633953: type2aelembytes{T_ADDRESS} should be 8 bytes in 64 bit VM
kvn
parents: 0
diff changeset
406 inline bool is_java_primitive(BasicType t) {
d5fc211aea19 6633953: type2aelembytes{T_ADDRESS} should be 8 bytes in 64 bit VM
kvn
parents: 0
diff changeset
407 return T_BOOLEAN <= t && t <= T_LONG;
d5fc211aea19 6633953: type2aelembytes{T_ADDRESS} should be 8 bytes in 64 bit VM
kvn
parents: 0
diff changeset
408 }
d5fc211aea19 6633953: type2aelembytes{T_ADDRESS} should be 8 bytes in 64 bit VM
kvn
parents: 0
diff changeset
409
0
a61af66fc99e Initial load
duke
parents:
diff changeset
410 // Convert a char from a classfile signature to a BasicType
a61af66fc99e Initial load
duke
parents:
diff changeset
411 inline BasicType char2type(char c) {
a61af66fc99e Initial load
duke
parents:
diff changeset
412 switch( c ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
413 case 'B': return T_BYTE;
a61af66fc99e Initial load
duke
parents:
diff changeset
414 case 'C': return T_CHAR;
a61af66fc99e Initial load
duke
parents:
diff changeset
415 case 'D': return T_DOUBLE;
a61af66fc99e Initial load
duke
parents:
diff changeset
416 case 'F': return T_FLOAT;
a61af66fc99e Initial load
duke
parents:
diff changeset
417 case 'I': return T_INT;
a61af66fc99e Initial load
duke
parents:
diff changeset
418 case 'J': return T_LONG;
a61af66fc99e Initial load
duke
parents:
diff changeset
419 case 'S': return T_SHORT;
a61af66fc99e Initial load
duke
parents:
diff changeset
420 case 'Z': return T_BOOLEAN;
a61af66fc99e Initial load
duke
parents:
diff changeset
421 case 'V': return T_VOID;
a61af66fc99e Initial load
duke
parents:
diff changeset
422 case 'L': return T_OBJECT;
a61af66fc99e Initial load
duke
parents:
diff changeset
423 case '[': return T_ARRAY;
a61af66fc99e Initial load
duke
parents:
diff changeset
424 }
a61af66fc99e Initial load
duke
parents:
diff changeset
425 return T_ILLEGAL;
a61af66fc99e Initial load
duke
parents:
diff changeset
426 }
a61af66fc99e Initial load
duke
parents:
diff changeset
427
a61af66fc99e Initial load
duke
parents:
diff changeset
428 extern char type2char_tab[T_CONFLICT+1]; // Map a BasicType to a jchar
a61af66fc99e Initial load
duke
parents:
diff changeset
429 inline char type2char(BasicType t) { return (uint)t < T_CONFLICT+1 ? type2char_tab[t] : 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
430 extern int type2size[T_CONFLICT+1]; // Map BasicType to result stack elements
a61af66fc99e Initial load
duke
parents:
diff changeset
431 extern const char* type2name_tab[T_CONFLICT+1]; // Map a BasicType to a jchar
a61af66fc99e Initial load
duke
parents:
diff changeset
432 inline const char* type2name(BasicType t) { return (uint)t < T_CONFLICT+1 ? type2name_tab[t] : NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
433 extern BasicType name2type(const char* name);
a61af66fc99e Initial load
duke
parents:
diff changeset
434
a61af66fc99e Initial load
duke
parents:
diff changeset
435 // Auxilary math routines
a61af66fc99e Initial load
duke
parents:
diff changeset
436 // least common multiple
a61af66fc99e Initial load
duke
parents:
diff changeset
437 extern size_t lcm(size_t a, size_t b);
a61af66fc99e Initial load
duke
parents:
diff changeset
438
a61af66fc99e Initial load
duke
parents:
diff changeset
439
a61af66fc99e Initial load
duke
parents:
diff changeset
440 // NOTE: replicated in SA in vm/agent/sun/jvm/hotspot/runtime/BasicType.java
a61af66fc99e Initial load
duke
parents:
diff changeset
441 enum BasicTypeSize {
a61af66fc99e Initial load
duke
parents:
diff changeset
442 T_BOOLEAN_size = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
443 T_CHAR_size = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
444 T_FLOAT_size = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
445 T_DOUBLE_size = 2,
a61af66fc99e Initial load
duke
parents:
diff changeset
446 T_BYTE_size = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
447 T_SHORT_size = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
448 T_INT_size = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
449 T_LONG_size = 2,
a61af66fc99e Initial load
duke
parents:
diff changeset
450 T_OBJECT_size = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
451 T_ARRAY_size = 1,
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
452 T_NARROWOOP_size = 1,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
453 T_VOID_size = 0
a61af66fc99e Initial load
duke
parents:
diff changeset
454 };
a61af66fc99e Initial load
duke
parents:
diff changeset
455
a61af66fc99e Initial load
duke
parents:
diff changeset
456
a61af66fc99e Initial load
duke
parents:
diff changeset
457 // maps a BasicType to its instance field storage type:
a61af66fc99e Initial load
duke
parents:
diff changeset
458 // all sub-word integral types are widened to T_INT
a61af66fc99e Initial load
duke
parents:
diff changeset
459 extern BasicType type2field[T_CONFLICT+1];
a61af66fc99e Initial load
duke
parents:
diff changeset
460 extern BasicType type2wfield[T_CONFLICT+1];
a61af66fc99e Initial load
duke
parents:
diff changeset
461
a61af66fc99e Initial load
duke
parents:
diff changeset
462
a61af66fc99e Initial load
duke
parents:
diff changeset
463 // size in bytes
a61af66fc99e Initial load
duke
parents:
diff changeset
464 enum ArrayElementSize {
a61af66fc99e Initial load
duke
parents:
diff changeset
465 T_BOOLEAN_aelem_bytes = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
466 T_CHAR_aelem_bytes = 2,
a61af66fc99e Initial load
duke
parents:
diff changeset
467 T_FLOAT_aelem_bytes = 4,
a61af66fc99e Initial load
duke
parents:
diff changeset
468 T_DOUBLE_aelem_bytes = 8,
a61af66fc99e Initial load
duke
parents:
diff changeset
469 T_BYTE_aelem_bytes = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
470 T_SHORT_aelem_bytes = 2,
a61af66fc99e Initial load
duke
parents:
diff changeset
471 T_INT_aelem_bytes = 4,
a61af66fc99e Initial load
duke
parents:
diff changeset
472 T_LONG_aelem_bytes = 8,
a61af66fc99e Initial load
duke
parents:
diff changeset
473 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
474 T_OBJECT_aelem_bytes = 8,
a61af66fc99e Initial load
duke
parents:
diff changeset
475 T_ARRAY_aelem_bytes = 8,
a61af66fc99e Initial load
duke
parents:
diff changeset
476 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
477 T_OBJECT_aelem_bytes = 4,
a61af66fc99e Initial load
duke
parents:
diff changeset
478 T_ARRAY_aelem_bytes = 4,
a61af66fc99e Initial load
duke
parents:
diff changeset
479 #endif
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
480 T_NARROWOOP_aelem_bytes = 4,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
481 T_VOID_aelem_bytes = 0
a61af66fc99e Initial load
duke
parents:
diff changeset
482 };
a61af66fc99e Initial load
duke
parents:
diff changeset
483
29
d5fc211aea19 6633953: type2aelembytes{T_ADDRESS} should be 8 bytes in 64 bit VM
kvn
parents: 0
diff changeset
484 extern int _type2aelembytes[T_CONFLICT+1]; // maps a BasicType to nof bytes used by its array element
d5fc211aea19 6633953: type2aelembytes{T_ADDRESS} should be 8 bytes in 64 bit VM
kvn
parents: 0
diff changeset
485 #ifdef ASSERT
d5fc211aea19 6633953: type2aelembytes{T_ADDRESS} should be 8 bytes in 64 bit VM
kvn
parents: 0
diff changeset
486 extern int type2aelembytes(BasicType t, bool allow_address = false); // asserts
d5fc211aea19 6633953: type2aelembytes{T_ADDRESS} should be 8 bytes in 64 bit VM
kvn
parents: 0
diff changeset
487 #else
d5fc211aea19 6633953: type2aelembytes{T_ADDRESS} should be 8 bytes in 64 bit VM
kvn
parents: 0
diff changeset
488 inline int type2aelembytes(BasicType t) { return _type2aelembytes[t]; }
d5fc211aea19 6633953: type2aelembytes{T_ADDRESS} should be 8 bytes in 64 bit VM
kvn
parents: 0
diff changeset
489 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
490
a61af66fc99e Initial load
duke
parents:
diff changeset
491
a61af66fc99e Initial load
duke
parents:
diff changeset
492 // JavaValue serves as a container for arbitrary Java values.
a61af66fc99e Initial load
duke
parents:
diff changeset
493
a61af66fc99e Initial load
duke
parents:
diff changeset
494 class JavaValue {
a61af66fc99e Initial load
duke
parents:
diff changeset
495
a61af66fc99e Initial load
duke
parents:
diff changeset
496 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
497 typedef union JavaCallValue {
a61af66fc99e Initial load
duke
parents:
diff changeset
498 jfloat f;
a61af66fc99e Initial load
duke
parents:
diff changeset
499 jdouble d;
a61af66fc99e Initial load
duke
parents:
diff changeset
500 jint i;
a61af66fc99e Initial load
duke
parents:
diff changeset
501 jlong l;
a61af66fc99e Initial load
duke
parents:
diff changeset
502 jobject h;
a61af66fc99e Initial load
duke
parents:
diff changeset
503 } JavaCallValue;
a61af66fc99e Initial load
duke
parents:
diff changeset
504
a61af66fc99e Initial load
duke
parents:
diff changeset
505 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
506 BasicType _type;
a61af66fc99e Initial load
duke
parents:
diff changeset
507 JavaCallValue _value;
a61af66fc99e Initial load
duke
parents:
diff changeset
508
a61af66fc99e Initial load
duke
parents:
diff changeset
509 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
510 JavaValue(BasicType t = T_ILLEGAL) { _type = t; }
a61af66fc99e Initial load
duke
parents:
diff changeset
511
a61af66fc99e Initial load
duke
parents:
diff changeset
512 JavaValue(jfloat value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
513 _type = T_FLOAT;
a61af66fc99e Initial load
duke
parents:
diff changeset
514 _value.f = value;
a61af66fc99e Initial load
duke
parents:
diff changeset
515 }
a61af66fc99e Initial load
duke
parents:
diff changeset
516
a61af66fc99e Initial load
duke
parents:
diff changeset
517 JavaValue(jdouble value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
518 _type = T_DOUBLE;
a61af66fc99e Initial load
duke
parents:
diff changeset
519 _value.d = value;
a61af66fc99e Initial load
duke
parents:
diff changeset
520 }
a61af66fc99e Initial load
duke
parents:
diff changeset
521
a61af66fc99e Initial load
duke
parents:
diff changeset
522 jfloat get_jfloat() const { return _value.f; }
a61af66fc99e Initial load
duke
parents:
diff changeset
523 jdouble get_jdouble() const { return _value.d; }
a61af66fc99e Initial load
duke
parents:
diff changeset
524 jint get_jint() const { return _value.i; }
a61af66fc99e Initial load
duke
parents:
diff changeset
525 jlong get_jlong() const { return _value.l; }
a61af66fc99e Initial load
duke
parents:
diff changeset
526 jobject get_jobject() const { return _value.h; }
a61af66fc99e Initial load
duke
parents:
diff changeset
527 JavaCallValue* get_value_addr() { return &_value; }
a61af66fc99e Initial load
duke
parents:
diff changeset
528 BasicType get_type() const { return _type; }
a61af66fc99e Initial load
duke
parents:
diff changeset
529
a61af66fc99e Initial load
duke
parents:
diff changeset
530 void set_jfloat(jfloat f) { _value.f = f;}
a61af66fc99e Initial load
duke
parents:
diff changeset
531 void set_jdouble(jdouble d) { _value.d = d;}
a61af66fc99e Initial load
duke
parents:
diff changeset
532 void set_jint(jint i) { _value.i = i;}
a61af66fc99e Initial load
duke
parents:
diff changeset
533 void set_jlong(jlong l) { _value.l = l;}
a61af66fc99e Initial load
duke
parents:
diff changeset
534 void set_jobject(jobject h) { _value.h = h;}
a61af66fc99e Initial load
duke
parents:
diff changeset
535 void set_type(BasicType t) { _type = t; }
a61af66fc99e Initial load
duke
parents:
diff changeset
536
a61af66fc99e Initial load
duke
parents:
diff changeset
537 jboolean get_jboolean() const { return (jboolean) (_value.i);}
a61af66fc99e Initial load
duke
parents:
diff changeset
538 jbyte get_jbyte() const { return (jbyte) (_value.i);}
a61af66fc99e Initial load
duke
parents:
diff changeset
539 jchar get_jchar() const { return (jchar) (_value.i);}
a61af66fc99e Initial load
duke
parents:
diff changeset
540 jshort get_jshort() const { return (jshort) (_value.i);}
a61af66fc99e Initial load
duke
parents:
diff changeset
541
a61af66fc99e Initial load
duke
parents:
diff changeset
542 };
a61af66fc99e Initial load
duke
parents:
diff changeset
543
a61af66fc99e Initial load
duke
parents:
diff changeset
544
a61af66fc99e Initial load
duke
parents:
diff changeset
545 #define STACK_BIAS 0
a61af66fc99e Initial load
duke
parents:
diff changeset
546 // V9 Sparc CPU's running in 64 Bit mode use a stack bias of 7ff
a61af66fc99e Initial load
duke
parents:
diff changeset
547 // in order to extend the reach of the stack pointer.
a61af66fc99e Initial load
duke
parents:
diff changeset
548 #if defined(SPARC) && defined(_LP64)
a61af66fc99e Initial load
duke
parents:
diff changeset
549 #undef STACK_BIAS
a61af66fc99e Initial load
duke
parents:
diff changeset
550 #define STACK_BIAS 0x7ff
a61af66fc99e Initial load
duke
parents:
diff changeset
551 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
552
a61af66fc99e Initial load
duke
parents:
diff changeset
553
a61af66fc99e Initial load
duke
parents:
diff changeset
554 // TosState describes the top-of-stack state before and after the execution of
a61af66fc99e Initial load
duke
parents:
diff changeset
555 // a bytecode or method. The top-of-stack value may be cached in one or more CPU
a61af66fc99e Initial load
duke
parents:
diff changeset
556 // registers. The TosState corresponds to the 'machine represention' of this cached
a61af66fc99e Initial load
duke
parents:
diff changeset
557 // value. There's 4 states corresponding to the JAVA types int, long, float & double
a61af66fc99e Initial load
duke
parents:
diff changeset
558 // as well as a 5th state in case the top-of-stack value is actually on the top
a61af66fc99e Initial load
duke
parents:
diff changeset
559 // of stack (in memory) and thus not cached. The atos state corresponds to the itos
a61af66fc99e Initial load
duke
parents:
diff changeset
560 // state when it comes to machine representation but is used separately for (oop)
a61af66fc99e Initial load
duke
parents:
diff changeset
561 // type specific operations (e.g. verification code).
a61af66fc99e Initial load
duke
parents:
diff changeset
562
a61af66fc99e Initial load
duke
parents:
diff changeset
563 enum TosState { // describes the tos cache contents
a61af66fc99e Initial load
duke
parents:
diff changeset
564 btos = 0, // byte, bool tos cached
a61af66fc99e Initial load
duke
parents:
diff changeset
565 ctos = 1, // short, char tos cached
a61af66fc99e Initial load
duke
parents:
diff changeset
566 stos = 2, // short, char tos cached
a61af66fc99e Initial load
duke
parents:
diff changeset
567 itos = 3, // int tos cached
a61af66fc99e Initial load
duke
parents:
diff changeset
568 ltos = 4, // long tos cached
a61af66fc99e Initial load
duke
parents:
diff changeset
569 ftos = 5, // float tos cached
a61af66fc99e Initial load
duke
parents:
diff changeset
570 dtos = 6, // double tos cached
a61af66fc99e Initial load
duke
parents:
diff changeset
571 atos = 7, // object cached
a61af66fc99e Initial load
duke
parents:
diff changeset
572 vtos = 8, // tos not cached
a61af66fc99e Initial load
duke
parents:
diff changeset
573 number_of_states,
a61af66fc99e Initial load
duke
parents:
diff changeset
574 ilgl // illegal state: should not occur
a61af66fc99e Initial load
duke
parents:
diff changeset
575 };
a61af66fc99e Initial load
duke
parents:
diff changeset
576
a61af66fc99e Initial load
duke
parents:
diff changeset
577
a61af66fc99e Initial load
duke
parents:
diff changeset
578 inline TosState as_TosState(BasicType type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
579 switch (type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
580 case T_BYTE : return btos;
a61af66fc99e Initial load
duke
parents:
diff changeset
581 case T_BOOLEAN: return btos;
a61af66fc99e Initial load
duke
parents:
diff changeset
582 case T_CHAR : return ctos;
a61af66fc99e Initial load
duke
parents:
diff changeset
583 case T_SHORT : return stos;
a61af66fc99e Initial load
duke
parents:
diff changeset
584 case T_INT : return itos;
a61af66fc99e Initial load
duke
parents:
diff changeset
585 case T_LONG : return ltos;
a61af66fc99e Initial load
duke
parents:
diff changeset
586 case T_FLOAT : return ftos;
a61af66fc99e Initial load
duke
parents:
diff changeset
587 case T_DOUBLE : return dtos;
a61af66fc99e Initial load
duke
parents:
diff changeset
588 case T_VOID : return vtos;
a61af66fc99e Initial load
duke
parents:
diff changeset
589 case T_ARRAY : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
590 case T_OBJECT : return atos;
a61af66fc99e Initial load
duke
parents:
diff changeset
591 }
a61af66fc99e Initial load
duke
parents:
diff changeset
592 return ilgl;
a61af66fc99e Initial load
duke
parents:
diff changeset
593 }
a61af66fc99e Initial load
duke
parents:
diff changeset
594
a61af66fc99e Initial load
duke
parents:
diff changeset
595
a61af66fc99e Initial load
duke
parents:
diff changeset
596 // Helper function to convert BasicType info into TosState
a61af66fc99e Initial load
duke
parents:
diff changeset
597 // Note: Cannot define here as it uses global constant at the time being.
a61af66fc99e Initial load
duke
parents:
diff changeset
598 TosState as_TosState(BasicType type);
a61af66fc99e Initial load
duke
parents:
diff changeset
599
a61af66fc99e Initial load
duke
parents:
diff changeset
600
a61af66fc99e Initial load
duke
parents:
diff changeset
601 // ReferenceType is used to distinguish between java/lang/ref/Reference subclasses
a61af66fc99e Initial load
duke
parents:
diff changeset
602
a61af66fc99e Initial load
duke
parents:
diff changeset
603 enum ReferenceType {
a61af66fc99e Initial load
duke
parents:
diff changeset
604 REF_NONE, // Regular class
a61af66fc99e Initial load
duke
parents:
diff changeset
605 REF_OTHER, // Subclass of java/lang/ref/Reference, but not subclass of one of the classes below
a61af66fc99e Initial load
duke
parents:
diff changeset
606 REF_SOFT, // Subclass of java/lang/ref/SoftReference
a61af66fc99e Initial load
duke
parents:
diff changeset
607 REF_WEAK, // Subclass of java/lang/ref/WeakReference
a61af66fc99e Initial load
duke
parents:
diff changeset
608 REF_FINAL, // Subclass of java/lang/ref/FinalReference
a61af66fc99e Initial load
duke
parents:
diff changeset
609 REF_PHANTOM // Subclass of java/lang/ref/PhantomReference
a61af66fc99e Initial load
duke
parents:
diff changeset
610 };
a61af66fc99e Initial load
duke
parents:
diff changeset
611
a61af66fc99e Initial load
duke
parents:
diff changeset
612
a61af66fc99e Initial load
duke
parents:
diff changeset
613 // JavaThreadState keeps track of which part of the code a thread is executing in. This
a61af66fc99e Initial load
duke
parents:
diff changeset
614 // information is needed by the safepoint code.
a61af66fc99e Initial load
duke
parents:
diff changeset
615 //
a61af66fc99e Initial load
duke
parents:
diff changeset
616 // There are 4 essential states:
a61af66fc99e Initial load
duke
parents:
diff changeset
617 //
a61af66fc99e Initial load
duke
parents:
diff changeset
618 // _thread_new : Just started, but not executed init. code yet (most likely still in OS init code)
a61af66fc99e Initial load
duke
parents:
diff changeset
619 // _thread_in_native : In native code. This is a safepoint region, since all oops will be in jobject handles
a61af66fc99e Initial load
duke
parents:
diff changeset
620 // _thread_in_vm : Executing in the vm
a61af66fc99e Initial load
duke
parents:
diff changeset
621 // _thread_in_Java : Executing either interpreted or compiled Java code (or could be in a stub)
a61af66fc99e Initial load
duke
parents:
diff changeset
622 //
a61af66fc99e Initial load
duke
parents:
diff changeset
623 // Each state has an associated xxxx_trans state, which is an intermediate state used when a thread is in
a61af66fc99e Initial load
duke
parents:
diff changeset
624 // a transition from one state to another. These extra states makes it possible for the safepoint code to
a61af66fc99e Initial load
duke
parents:
diff changeset
625 // handle certain thread_states without having to suspend the thread - making the safepoint code faster.
a61af66fc99e Initial load
duke
parents:
diff changeset
626 //
a61af66fc99e Initial load
duke
parents:
diff changeset
627 // Given a state, the xxx_trans state can always be found by adding 1.
a61af66fc99e Initial load
duke
parents:
diff changeset
628 //
a61af66fc99e Initial load
duke
parents:
diff changeset
629 enum JavaThreadState {
a61af66fc99e Initial load
duke
parents:
diff changeset
630 _thread_uninitialized = 0, // should never happen (missing initialization)
a61af66fc99e Initial load
duke
parents:
diff changeset
631 _thread_new = 2, // just starting up, i.e., in process of being initialized
a61af66fc99e Initial load
duke
parents:
diff changeset
632 _thread_new_trans = 3, // corresponding transition state (not used, included for completness)
a61af66fc99e Initial load
duke
parents:
diff changeset
633 _thread_in_native = 4, // running in native code
a61af66fc99e Initial load
duke
parents:
diff changeset
634 _thread_in_native_trans = 5, // corresponding transition state
a61af66fc99e Initial load
duke
parents:
diff changeset
635 _thread_in_vm = 6, // running in VM
a61af66fc99e Initial load
duke
parents:
diff changeset
636 _thread_in_vm_trans = 7, // corresponding transition state
a61af66fc99e Initial load
duke
parents:
diff changeset
637 _thread_in_Java = 8, // running in Java or in stub code
a61af66fc99e Initial load
duke
parents:
diff changeset
638 _thread_in_Java_trans = 9, // corresponding transition state (not used, included for completness)
a61af66fc99e Initial load
duke
parents:
diff changeset
639 _thread_blocked = 10, // blocked in vm
a61af66fc99e Initial load
duke
parents:
diff changeset
640 _thread_blocked_trans = 11, // corresponding transition state
a61af66fc99e Initial load
duke
parents:
diff changeset
641 _thread_max_state = 12 // maximum thread state+1 - used for statistics allocation
a61af66fc99e Initial load
duke
parents:
diff changeset
642 };
a61af66fc99e Initial load
duke
parents:
diff changeset
643
a61af66fc99e Initial load
duke
parents:
diff changeset
644
a61af66fc99e Initial load
duke
parents:
diff changeset
645 // Handy constants for deciding which compiler mode to use.
a61af66fc99e Initial load
duke
parents:
diff changeset
646 enum MethodCompilation {
a61af66fc99e Initial load
duke
parents:
diff changeset
647 InvocationEntryBci = -1, // i.e., not a on-stack replacement compilation
a61af66fc99e Initial load
duke
parents:
diff changeset
648 InvalidOSREntryBci = -2
a61af66fc99e Initial load
duke
parents:
diff changeset
649 };
a61af66fc99e Initial load
duke
parents:
diff changeset
650
a61af66fc99e Initial load
duke
parents:
diff changeset
651 // Enumeration to distinguish tiers of compilation
a61af66fc99e Initial load
duke
parents:
diff changeset
652 enum CompLevel {
a61af66fc99e Initial load
duke
parents:
diff changeset
653 CompLevel_none = 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
654 CompLevel_fast_compile = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
655 CompLevel_full_optimization = 2,
a61af66fc99e Initial load
duke
parents:
diff changeset
656
a61af66fc99e Initial load
duke
parents:
diff changeset
657 CompLevel_highest_tier = CompLevel_full_optimization,
a61af66fc99e Initial load
duke
parents:
diff changeset
658 #ifdef TIERED
a61af66fc99e Initial load
duke
parents:
diff changeset
659 CompLevel_initial_compile = CompLevel_fast_compile
a61af66fc99e Initial load
duke
parents:
diff changeset
660 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
661 CompLevel_initial_compile = CompLevel_full_optimization
a61af66fc99e Initial load
duke
parents:
diff changeset
662 #endif // TIERED
a61af66fc99e Initial load
duke
parents:
diff changeset
663 };
a61af66fc99e Initial load
duke
parents:
diff changeset
664
a61af66fc99e Initial load
duke
parents:
diff changeset
665 inline bool is_tier1_compile(int comp_level) {
a61af66fc99e Initial load
duke
parents:
diff changeset
666 return comp_level == CompLevel_fast_compile;
a61af66fc99e Initial load
duke
parents:
diff changeset
667 }
a61af66fc99e Initial load
duke
parents:
diff changeset
668 inline bool is_tier2_compile(int comp_level) {
a61af66fc99e Initial load
duke
parents:
diff changeset
669 return comp_level == CompLevel_full_optimization;
a61af66fc99e Initial load
duke
parents:
diff changeset
670 }
a61af66fc99e Initial load
duke
parents:
diff changeset
671 inline bool is_highest_tier_compile(int comp_level) {
a61af66fc99e Initial load
duke
parents:
diff changeset
672 return comp_level == CompLevel_highest_tier;
a61af66fc99e Initial load
duke
parents:
diff changeset
673 }
a61af66fc99e Initial load
duke
parents:
diff changeset
674
a61af66fc99e Initial load
duke
parents:
diff changeset
675 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
676 // 'Forward' declarations of frequently used classes
a61af66fc99e Initial load
duke
parents:
diff changeset
677 // (in order to reduce interface dependencies & reduce
a61af66fc99e Initial load
duke
parents:
diff changeset
678 // number of unnecessary compilations after changes)
a61af66fc99e Initial load
duke
parents:
diff changeset
679
a61af66fc99e Initial load
duke
parents:
diff changeset
680 class symbolTable;
a61af66fc99e Initial load
duke
parents:
diff changeset
681 class ClassFileStream;
a61af66fc99e Initial load
duke
parents:
diff changeset
682
a61af66fc99e Initial load
duke
parents:
diff changeset
683 class Event;
a61af66fc99e Initial load
duke
parents:
diff changeset
684
a61af66fc99e Initial load
duke
parents:
diff changeset
685 class Thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
686 class VMThread;
a61af66fc99e Initial load
duke
parents:
diff changeset
687 class JavaThread;
a61af66fc99e Initial load
duke
parents:
diff changeset
688 class Threads;
a61af66fc99e Initial load
duke
parents:
diff changeset
689
a61af66fc99e Initial load
duke
parents:
diff changeset
690 class VM_Operation;
a61af66fc99e Initial load
duke
parents:
diff changeset
691 class VMOperationQueue;
a61af66fc99e Initial load
duke
parents:
diff changeset
692
a61af66fc99e Initial load
duke
parents:
diff changeset
693 class CodeBlob;
a61af66fc99e Initial load
duke
parents:
diff changeset
694 class nmethod;
a61af66fc99e Initial load
duke
parents:
diff changeset
695 class OSRAdapter;
a61af66fc99e Initial load
duke
parents:
diff changeset
696 class I2CAdapter;
a61af66fc99e Initial load
duke
parents:
diff changeset
697 class C2IAdapter;
a61af66fc99e Initial load
duke
parents:
diff changeset
698 class CompiledIC;
a61af66fc99e Initial load
duke
parents:
diff changeset
699 class relocInfo;
a61af66fc99e Initial load
duke
parents:
diff changeset
700 class ScopeDesc;
a61af66fc99e Initial load
duke
parents:
diff changeset
701 class PcDesc;
a61af66fc99e Initial load
duke
parents:
diff changeset
702
a61af66fc99e Initial load
duke
parents:
diff changeset
703 class Recompiler;
a61af66fc99e Initial load
duke
parents:
diff changeset
704 class Recompilee;
a61af66fc99e Initial load
duke
parents:
diff changeset
705 class RecompilationPolicy;
a61af66fc99e Initial load
duke
parents:
diff changeset
706 class RFrame;
a61af66fc99e Initial load
duke
parents:
diff changeset
707 class CompiledRFrame;
a61af66fc99e Initial load
duke
parents:
diff changeset
708 class InterpretedRFrame;
a61af66fc99e Initial load
duke
parents:
diff changeset
709
a61af66fc99e Initial load
duke
parents:
diff changeset
710 class frame;
a61af66fc99e Initial load
duke
parents:
diff changeset
711
a61af66fc99e Initial load
duke
parents:
diff changeset
712 class vframe;
a61af66fc99e Initial load
duke
parents:
diff changeset
713 class javaVFrame;
a61af66fc99e Initial load
duke
parents:
diff changeset
714 class interpretedVFrame;
a61af66fc99e Initial load
duke
parents:
diff changeset
715 class compiledVFrame;
a61af66fc99e Initial load
duke
parents:
diff changeset
716 class deoptimizedVFrame;
a61af66fc99e Initial load
duke
parents:
diff changeset
717 class externalVFrame;
a61af66fc99e Initial load
duke
parents:
diff changeset
718 class entryVFrame;
a61af66fc99e Initial load
duke
parents:
diff changeset
719
a61af66fc99e Initial load
duke
parents:
diff changeset
720 class RegisterMap;
a61af66fc99e Initial load
duke
parents:
diff changeset
721
a61af66fc99e Initial load
duke
parents:
diff changeset
722 class Mutex;
a61af66fc99e Initial load
duke
parents:
diff changeset
723 class Monitor;
a61af66fc99e Initial load
duke
parents:
diff changeset
724 class BasicLock;
a61af66fc99e Initial load
duke
parents:
diff changeset
725 class BasicObjectLock;
a61af66fc99e Initial load
duke
parents:
diff changeset
726
a61af66fc99e Initial load
duke
parents:
diff changeset
727 class PeriodicTask;
a61af66fc99e Initial load
duke
parents:
diff changeset
728
a61af66fc99e Initial load
duke
parents:
diff changeset
729 class JavaCallWrapper;
a61af66fc99e Initial load
duke
parents:
diff changeset
730
a61af66fc99e Initial load
duke
parents:
diff changeset
731 class oopDesc;
a61af66fc99e Initial load
duke
parents:
diff changeset
732
a61af66fc99e Initial load
duke
parents:
diff changeset
733 class NativeCall;
a61af66fc99e Initial load
duke
parents:
diff changeset
734
a61af66fc99e Initial load
duke
parents:
diff changeset
735 class zone;
a61af66fc99e Initial load
duke
parents:
diff changeset
736
a61af66fc99e Initial load
duke
parents:
diff changeset
737 class StubQueue;
a61af66fc99e Initial load
duke
parents:
diff changeset
738
a61af66fc99e Initial load
duke
parents:
diff changeset
739 class outputStream;
a61af66fc99e Initial load
duke
parents:
diff changeset
740
a61af66fc99e Initial load
duke
parents:
diff changeset
741 class ResourceArea;
a61af66fc99e Initial load
duke
parents:
diff changeset
742
a61af66fc99e Initial load
duke
parents:
diff changeset
743 class DebugInformationRecorder;
a61af66fc99e Initial load
duke
parents:
diff changeset
744 class ScopeValue;
a61af66fc99e Initial load
duke
parents:
diff changeset
745 class CompressedStream;
a61af66fc99e Initial load
duke
parents:
diff changeset
746 class DebugInfoReadStream;
a61af66fc99e Initial load
duke
parents:
diff changeset
747 class DebugInfoWriteStream;
a61af66fc99e Initial load
duke
parents:
diff changeset
748 class LocationValue;
a61af66fc99e Initial load
duke
parents:
diff changeset
749 class ConstantValue;
a61af66fc99e Initial load
duke
parents:
diff changeset
750 class IllegalValue;
a61af66fc99e Initial load
duke
parents:
diff changeset
751
a61af66fc99e Initial load
duke
parents:
diff changeset
752 class PrivilegedElement;
a61af66fc99e Initial load
duke
parents:
diff changeset
753 class MonitorArray;
a61af66fc99e Initial load
duke
parents:
diff changeset
754
a61af66fc99e Initial load
duke
parents:
diff changeset
755 class MonitorInfo;
a61af66fc99e Initial load
duke
parents:
diff changeset
756
a61af66fc99e Initial load
duke
parents:
diff changeset
757 class OffsetClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
758 class OopMapCache;
a61af66fc99e Initial load
duke
parents:
diff changeset
759 class InterpreterOopMap;
a61af66fc99e Initial load
duke
parents:
diff changeset
760 class OopMapCacheEntry;
a61af66fc99e Initial load
duke
parents:
diff changeset
761 class OSThread;
a61af66fc99e Initial load
duke
parents:
diff changeset
762
a61af66fc99e Initial load
duke
parents:
diff changeset
763 typedef int (*OSThreadStartFunc)(void*);
a61af66fc99e Initial load
duke
parents:
diff changeset
764
a61af66fc99e Initial load
duke
parents:
diff changeset
765 class Space;
a61af66fc99e Initial load
duke
parents:
diff changeset
766
a61af66fc99e Initial load
duke
parents:
diff changeset
767 class JavaValue;
a61af66fc99e Initial load
duke
parents:
diff changeset
768 class methodHandle;
a61af66fc99e Initial load
duke
parents:
diff changeset
769 class JavaCallArguments;
a61af66fc99e Initial load
duke
parents:
diff changeset
770
a61af66fc99e Initial load
duke
parents:
diff changeset
771 // Basic support for errors (general debug facilities not defined at this point fo the include phase)
a61af66fc99e Initial load
duke
parents:
diff changeset
772
a61af66fc99e Initial load
duke
parents:
diff changeset
773 extern void basic_fatal(const char* msg);
a61af66fc99e Initial load
duke
parents:
diff changeset
774
a61af66fc99e Initial load
duke
parents:
diff changeset
775
a61af66fc99e Initial load
duke
parents:
diff changeset
776 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
777 // Special constants for debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
778
a61af66fc99e Initial load
duke
parents:
diff changeset
779 const jint badInt = -3; // generic "bad int" value
a61af66fc99e Initial load
duke
parents:
diff changeset
780 const long badAddressVal = -2; // generic "bad address" value
a61af66fc99e Initial load
duke
parents:
diff changeset
781 const long badOopVal = -1; // generic "bad oop" value
a61af66fc99e Initial load
duke
parents:
diff changeset
782 const intptr_t badHeapOopVal = (intptr_t) CONST64(0x2BAD4B0BBAADBABE); // value used to zap heap after GC
a61af66fc99e Initial load
duke
parents:
diff changeset
783 const int badHandleValue = 0xBC; // value used to zap vm handle area
a61af66fc99e Initial load
duke
parents:
diff changeset
784 const int badResourceValue = 0xAB; // value used to zap resource area
a61af66fc99e Initial load
duke
parents:
diff changeset
785 const int freeBlockPad = 0xBA; // value used to pad freed blocks.
a61af66fc99e Initial load
duke
parents:
diff changeset
786 const int uninitBlockPad = 0xF1; // value used to zap newly malloc'd blocks.
a61af66fc99e Initial load
duke
parents:
diff changeset
787 const intptr_t badJNIHandleVal = (intptr_t) CONST64(0xFEFEFEFEFEFEFEFE); // value used to zap jni handle area
a61af66fc99e Initial load
duke
parents:
diff changeset
788 const juint badHeapWordVal = 0xBAADBABE; // value used to zap heap after GC
a61af66fc99e Initial load
duke
parents:
diff changeset
789 const int badCodeHeapNewVal= 0xCC; // value used to zap Code heap at allocation
a61af66fc99e Initial load
duke
parents:
diff changeset
790 const int badCodeHeapFreeVal = 0xDD; // value used to zap Code heap at deallocation
a61af66fc99e Initial load
duke
parents:
diff changeset
791
a61af66fc99e Initial load
duke
parents:
diff changeset
792
a61af66fc99e Initial load
duke
parents:
diff changeset
793 // (These must be implemented as #defines because C++ compilers are
a61af66fc99e Initial load
duke
parents:
diff changeset
794 // not obligated to inline non-integral constants!)
a61af66fc99e Initial load
duke
parents:
diff changeset
795 #define badAddress ((address)::badAddressVal)
a61af66fc99e Initial load
duke
parents:
diff changeset
796 #define badOop ((oop)::badOopVal)
a61af66fc99e Initial load
duke
parents:
diff changeset
797 #define badHeapWord (::badHeapWordVal)
a61af66fc99e Initial load
duke
parents:
diff changeset
798 #define badJNIHandle ((oop)::badJNIHandleVal)
a61af66fc99e Initial load
duke
parents:
diff changeset
799
a61af66fc99e Initial load
duke
parents:
diff changeset
800
a61af66fc99e Initial load
duke
parents:
diff changeset
801 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
802 // Utility functions for bitfield manipulations
a61af66fc99e Initial load
duke
parents:
diff changeset
803
a61af66fc99e Initial load
duke
parents:
diff changeset
804 const intptr_t AllBits = ~0; // all bits set in a word
a61af66fc99e Initial load
duke
parents:
diff changeset
805 const intptr_t NoBits = 0; // no bits set in a word
a61af66fc99e Initial load
duke
parents:
diff changeset
806 const jlong NoLongBits = 0; // no bits set in a long
a61af66fc99e Initial load
duke
parents:
diff changeset
807 const intptr_t OneBit = 1; // only right_most bit set in a word
a61af66fc99e Initial load
duke
parents:
diff changeset
808
a61af66fc99e Initial load
duke
parents:
diff changeset
809 // get a word with the n.th or the right-most or left-most n bits set
a61af66fc99e Initial load
duke
parents:
diff changeset
810 // (note: #define used only so that they can be used in enum constant definitions)
a61af66fc99e Initial load
duke
parents:
diff changeset
811 #define nth_bit(n) (n >= BitsPerWord ? 0 : OneBit << (n))
a61af66fc99e Initial load
duke
parents:
diff changeset
812 #define right_n_bits(n) (nth_bit(n) - 1)
a61af66fc99e Initial load
duke
parents:
diff changeset
813 #define left_n_bits(n) (right_n_bits(n) << (n >= BitsPerWord ? 0 : (BitsPerWord - n)))
a61af66fc99e Initial load
duke
parents:
diff changeset
814
a61af66fc99e Initial load
duke
parents:
diff changeset
815 // bit-operations using a mask m
a61af66fc99e Initial load
duke
parents:
diff changeset
816 inline void set_bits (intptr_t& x, intptr_t m) { x |= m; }
a61af66fc99e Initial load
duke
parents:
diff changeset
817 inline void clear_bits (intptr_t& x, intptr_t m) { x &= ~m; }
a61af66fc99e Initial load
duke
parents:
diff changeset
818 inline intptr_t mask_bits (intptr_t x, intptr_t m) { return x & m; }
a61af66fc99e Initial load
duke
parents:
diff changeset
819 inline jlong mask_long_bits (jlong x, jlong m) { return x & m; }
a61af66fc99e Initial load
duke
parents:
diff changeset
820 inline bool mask_bits_are_true (intptr_t flags, intptr_t mask) { return (flags & mask) == mask; }
a61af66fc99e Initial load
duke
parents:
diff changeset
821
a61af66fc99e Initial load
duke
parents:
diff changeset
822 // bit-operations using the n.th bit
a61af66fc99e Initial load
duke
parents:
diff changeset
823 inline void set_nth_bit(intptr_t& x, int n) { set_bits (x, nth_bit(n)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
824 inline void clear_nth_bit(intptr_t& x, int n) { clear_bits(x, nth_bit(n)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
825 inline bool is_set_nth_bit(intptr_t x, int n) { return mask_bits (x, nth_bit(n)) != NoBits; }
a61af66fc99e Initial load
duke
parents:
diff changeset
826
a61af66fc99e Initial load
duke
parents:
diff changeset
827 // returns the bitfield of x starting at start_bit_no with length field_length (no sign-extension!)
a61af66fc99e Initial load
duke
parents:
diff changeset
828 inline intptr_t bitfield(intptr_t x, int start_bit_no, int field_length) {
a61af66fc99e Initial load
duke
parents:
diff changeset
829 return mask_bits(x >> start_bit_no, right_n_bits(field_length));
a61af66fc99e Initial load
duke
parents:
diff changeset
830 }
a61af66fc99e Initial load
duke
parents:
diff changeset
831
a61af66fc99e Initial load
duke
parents:
diff changeset
832
a61af66fc99e Initial load
duke
parents:
diff changeset
833 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
834 // Utility functions for integers
a61af66fc99e Initial load
duke
parents:
diff changeset
835
a61af66fc99e Initial load
duke
parents:
diff changeset
836 // Avoid use of global min/max macros which may cause unwanted double
a61af66fc99e Initial load
duke
parents:
diff changeset
837 // evaluation of arguments.
a61af66fc99e Initial load
duke
parents:
diff changeset
838 #ifdef max
a61af66fc99e Initial load
duke
parents:
diff changeset
839 #undef max
a61af66fc99e Initial load
duke
parents:
diff changeset
840 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
841
a61af66fc99e Initial load
duke
parents:
diff changeset
842 #ifdef min
a61af66fc99e Initial load
duke
parents:
diff changeset
843 #undef min
a61af66fc99e Initial load
duke
parents:
diff changeset
844 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
845
a61af66fc99e Initial load
duke
parents:
diff changeset
846 #define max(a,b) Do_not_use_max_use_MAX2_instead
a61af66fc99e Initial load
duke
parents:
diff changeset
847 #define min(a,b) Do_not_use_min_use_MIN2_instead
a61af66fc99e Initial load
duke
parents:
diff changeset
848
a61af66fc99e Initial load
duke
parents:
diff changeset
849 // It is necessary to use templates here. Having normal overloaded
a61af66fc99e Initial load
duke
parents:
diff changeset
850 // functions does not work because it is necessary to provide both 32-
a61af66fc99e Initial load
duke
parents:
diff changeset
851 // and 64-bit overloaded functions, which does not work, and having
a61af66fc99e Initial load
duke
parents:
diff changeset
852 // explicitly-typed versions of these routines (i.e., MAX2I, MAX2L)
a61af66fc99e Initial load
duke
parents:
diff changeset
853 // will be even more error-prone than macros.
a61af66fc99e Initial load
duke
parents:
diff changeset
854 template<class T> inline T MAX2(T a, T b) { return (a > b) ? a : b; }
a61af66fc99e Initial load
duke
parents:
diff changeset
855 template<class T> inline T MIN2(T a, T b) { return (a < b) ? a : b; }
a61af66fc99e Initial load
duke
parents:
diff changeset
856 template<class T> inline T MAX3(T a, T b, T c) { return MAX2(MAX2(a, b), c); }
a61af66fc99e Initial load
duke
parents:
diff changeset
857 template<class T> inline T MIN3(T a, T b, T c) { return MIN2(MIN2(a, b), c); }
a61af66fc99e Initial load
duke
parents:
diff changeset
858 template<class T> inline T MAX4(T a, T b, T c, T d) { return MAX2(MAX3(a, b, c), d); }
a61af66fc99e Initial load
duke
parents:
diff changeset
859 template<class T> inline T MIN4(T a, T b, T c, T d) { return MIN2(MIN3(a, b, c), d); }
a61af66fc99e Initial load
duke
parents:
diff changeset
860
a61af66fc99e Initial load
duke
parents:
diff changeset
861 template<class T> inline T ABS(T x) { return (x > 0) ? x : -x; }
a61af66fc99e Initial load
duke
parents:
diff changeset
862
a61af66fc99e Initial load
duke
parents:
diff changeset
863 // true if x is a power of 2, false otherwise
a61af66fc99e Initial load
duke
parents:
diff changeset
864 inline bool is_power_of_2(intptr_t x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
865 return ((x != NoBits) && (mask_bits(x, x - 1) == NoBits));
a61af66fc99e Initial load
duke
parents:
diff changeset
866 }
a61af66fc99e Initial load
duke
parents:
diff changeset
867
a61af66fc99e Initial load
duke
parents:
diff changeset
868 // long version of is_power_of_2
a61af66fc99e Initial load
duke
parents:
diff changeset
869 inline bool is_power_of_2_long(jlong x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
870 return ((x != NoLongBits) && (mask_long_bits(x, x - 1) == NoLongBits));
a61af66fc99e Initial load
duke
parents:
diff changeset
871 }
a61af66fc99e Initial load
duke
parents:
diff changeset
872
a61af66fc99e Initial load
duke
parents:
diff changeset
873 //* largest i such that 2^i <= x
a61af66fc99e Initial load
duke
parents:
diff changeset
874 // A negative value of 'x' will return '31'
a61af66fc99e Initial load
duke
parents:
diff changeset
875 inline int log2_intptr(intptr_t x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
876 int i = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
877 uintptr_t p = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
878 while (p != 0 && p <= (uintptr_t)x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
879 // p = 2^(i+1) && p <= x (i.e., 2^(i+1) <= x)
a61af66fc99e Initial load
duke
parents:
diff changeset
880 i++; p *= 2;
a61af66fc99e Initial load
duke
parents:
diff changeset
881 }
a61af66fc99e Initial load
duke
parents:
diff changeset
882 // p = 2^(i+1) && x < p (i.e., 2^i <= x < 2^(i+1))
a61af66fc99e Initial load
duke
parents:
diff changeset
883 // (if p = 0 then overflow occured and i = 31)
a61af66fc99e Initial load
duke
parents:
diff changeset
884 return i;
a61af66fc99e Initial load
duke
parents:
diff changeset
885 }
a61af66fc99e Initial load
duke
parents:
diff changeset
886
a61af66fc99e Initial load
duke
parents:
diff changeset
887 //* largest i such that 2^i <= x
a61af66fc99e Initial load
duke
parents:
diff changeset
888 // A negative value of 'x' will return '63'
a61af66fc99e Initial load
duke
parents:
diff changeset
889 inline int log2_long(jlong x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
890 int i = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
891 julong p = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
892 while (p != 0 && p <= (julong)x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
893 // p = 2^(i+1) && p <= x (i.e., 2^(i+1) <= x)
a61af66fc99e Initial load
duke
parents:
diff changeset
894 i++; p *= 2;
a61af66fc99e Initial load
duke
parents:
diff changeset
895 }
a61af66fc99e Initial load
duke
parents:
diff changeset
896 // p = 2^(i+1) && x < p (i.e., 2^i <= x < 2^(i+1))
145
f3de1255b035 6603011: RFE: Optimize long division
rasbold
parents: 113
diff changeset
897 // (if p = 0 then overflow occured and i = 63)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
898 return i;
a61af66fc99e Initial load
duke
parents:
diff changeset
899 }
a61af66fc99e Initial load
duke
parents:
diff changeset
900
a61af66fc99e Initial load
duke
parents:
diff changeset
901 //* the argument must be exactly a power of 2
a61af66fc99e Initial load
duke
parents:
diff changeset
902 inline int exact_log2(intptr_t x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
903 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
904 if (!is_power_of_2(x)) basic_fatal("x must be a power of 2");
a61af66fc99e Initial load
duke
parents:
diff changeset
905 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
906 return log2_intptr(x);
a61af66fc99e Initial load
duke
parents:
diff changeset
907 }
a61af66fc99e Initial load
duke
parents:
diff changeset
908
a61af66fc99e Initial load
duke
parents:
diff changeset
909
a61af66fc99e Initial load
duke
parents:
diff changeset
910 // returns integer round-up to the nearest multiple of s (s must be a power of two)
a61af66fc99e Initial load
duke
parents:
diff changeset
911 inline intptr_t round_to(intptr_t x, uintx s) {
a61af66fc99e Initial load
duke
parents:
diff changeset
912 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
913 if (!is_power_of_2(s)) basic_fatal("s must be a power of 2");
a61af66fc99e Initial load
duke
parents:
diff changeset
914 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
915 const uintx m = s - 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
916 return mask_bits(x + m, ~m);
a61af66fc99e Initial load
duke
parents:
diff changeset
917 }
a61af66fc99e Initial load
duke
parents:
diff changeset
918
a61af66fc99e Initial load
duke
parents:
diff changeset
919 // returns integer round-down to the nearest multiple of s (s must be a power of two)
a61af66fc99e Initial load
duke
parents:
diff changeset
920 inline intptr_t round_down(intptr_t x, uintx s) {
a61af66fc99e Initial load
duke
parents:
diff changeset
921 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
922 if (!is_power_of_2(s)) basic_fatal("s must be a power of 2");
a61af66fc99e Initial load
duke
parents:
diff changeset
923 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
924 const uintx m = s - 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
925 return mask_bits(x, ~m);
a61af66fc99e Initial load
duke
parents:
diff changeset
926 }
a61af66fc99e Initial load
duke
parents:
diff changeset
927
a61af66fc99e Initial load
duke
parents:
diff changeset
928
a61af66fc99e Initial load
duke
parents:
diff changeset
929 inline bool is_odd (intx x) { return x & 1; }
a61af66fc99e Initial load
duke
parents:
diff changeset
930 inline bool is_even(intx x) { return !is_odd(x); }
a61af66fc99e Initial load
duke
parents:
diff changeset
931
a61af66fc99e Initial load
duke
parents:
diff changeset
932 // "to" should be greater than "from."
a61af66fc99e Initial load
duke
parents:
diff changeset
933 inline intx byte_size(void* from, void* to) {
a61af66fc99e Initial load
duke
parents:
diff changeset
934 return (address)to - (address)from;
a61af66fc99e Initial load
duke
parents:
diff changeset
935 }
a61af66fc99e Initial load
duke
parents:
diff changeset
936
a61af66fc99e Initial load
duke
parents:
diff changeset
937 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
938 // Avoid non-portable casts with these routines (DEPRECATED)
a61af66fc99e Initial load
duke
parents:
diff changeset
939
a61af66fc99e Initial load
duke
parents:
diff changeset
940 // NOTE: USE Bytes class INSTEAD WHERE POSSIBLE
a61af66fc99e Initial load
duke
parents:
diff changeset
941 // Bytes is optimized machine-specifically and may be much faster then the portable routines below.
a61af66fc99e Initial load
duke
parents:
diff changeset
942
a61af66fc99e Initial load
duke
parents:
diff changeset
943 // Given sequence of four bytes, build into a 32-bit word
a61af66fc99e Initial load
duke
parents:
diff changeset
944 // following the conventions used in class files.
a61af66fc99e Initial load
duke
parents:
diff changeset
945 // On the 386, this could be realized with a simple address cast.
a61af66fc99e Initial load
duke
parents:
diff changeset
946 //
a61af66fc99e Initial load
duke
parents:
diff changeset
947
a61af66fc99e Initial load
duke
parents:
diff changeset
948 // This routine takes eight bytes:
a61af66fc99e Initial load
duke
parents:
diff changeset
949 inline u8 build_u8_from( u1 c1, u1 c2, u1 c3, u1 c4, u1 c5, u1 c6, u1 c7, u1 c8 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
950 return ( u8(c1) << 56 ) & ( u8(0xff) << 56 )
a61af66fc99e Initial load
duke
parents:
diff changeset
951 | ( u8(c2) << 48 ) & ( u8(0xff) << 48 )
a61af66fc99e Initial load
duke
parents:
diff changeset
952 | ( u8(c3) << 40 ) & ( u8(0xff) << 40 )
a61af66fc99e Initial load
duke
parents:
diff changeset
953 | ( u8(c4) << 32 ) & ( u8(0xff) << 32 )
a61af66fc99e Initial load
duke
parents:
diff changeset
954 | ( u8(c5) << 24 ) & ( u8(0xff) << 24 )
a61af66fc99e Initial load
duke
parents:
diff changeset
955 | ( u8(c6) << 16 ) & ( u8(0xff) << 16 )
a61af66fc99e Initial load
duke
parents:
diff changeset
956 | ( u8(c7) << 8 ) & ( u8(0xff) << 8 )
a61af66fc99e Initial load
duke
parents:
diff changeset
957 | ( u8(c8) << 0 ) & ( u8(0xff) << 0 );
a61af66fc99e Initial load
duke
parents:
diff changeset
958 }
a61af66fc99e Initial load
duke
parents:
diff changeset
959
a61af66fc99e Initial load
duke
parents:
diff changeset
960 // This routine takes four bytes:
a61af66fc99e Initial load
duke
parents:
diff changeset
961 inline u4 build_u4_from( u1 c1, u1 c2, u1 c3, u1 c4 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
962 return ( u4(c1) << 24 ) & 0xff000000
a61af66fc99e Initial load
duke
parents:
diff changeset
963 | ( u4(c2) << 16 ) & 0x00ff0000
a61af66fc99e Initial load
duke
parents:
diff changeset
964 | ( u4(c3) << 8 ) & 0x0000ff00
a61af66fc99e Initial load
duke
parents:
diff changeset
965 | ( u4(c4) << 0 ) & 0x000000ff;
a61af66fc99e Initial load
duke
parents:
diff changeset
966 }
a61af66fc99e Initial load
duke
parents:
diff changeset
967
a61af66fc99e Initial load
duke
parents:
diff changeset
968 // And this one works if the four bytes are contiguous in memory:
a61af66fc99e Initial load
duke
parents:
diff changeset
969 inline u4 build_u4_from( u1* p ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
970 return build_u4_from( p[0], p[1], p[2], p[3] );
a61af66fc99e Initial load
duke
parents:
diff changeset
971 }
a61af66fc99e Initial load
duke
parents:
diff changeset
972
a61af66fc99e Initial load
duke
parents:
diff changeset
973 // Ditto for two-byte ints:
a61af66fc99e Initial load
duke
parents:
diff changeset
974 inline u2 build_u2_from( u1 c1, u1 c2 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
975 return u2(( u2(c1) << 8 ) & 0xff00
a61af66fc99e Initial load
duke
parents:
diff changeset
976 | ( u2(c2) << 0 ) & 0x00ff);
a61af66fc99e Initial load
duke
parents:
diff changeset
977 }
a61af66fc99e Initial load
duke
parents:
diff changeset
978
a61af66fc99e Initial load
duke
parents:
diff changeset
979 // And this one works if the two bytes are contiguous in memory:
a61af66fc99e Initial load
duke
parents:
diff changeset
980 inline u2 build_u2_from( u1* p ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
981 return build_u2_from( p[0], p[1] );
a61af66fc99e Initial load
duke
parents:
diff changeset
982 }
a61af66fc99e Initial load
duke
parents:
diff changeset
983
a61af66fc99e Initial load
duke
parents:
diff changeset
984 // Ditto for floats:
a61af66fc99e Initial load
duke
parents:
diff changeset
985 inline jfloat build_float_from( u1 c1, u1 c2, u1 c3, u1 c4 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
986 u4 u = build_u4_from( c1, c2, c3, c4 );
a61af66fc99e Initial load
duke
parents:
diff changeset
987 return *(jfloat*)&u;
a61af66fc99e Initial load
duke
parents:
diff changeset
988 }
a61af66fc99e Initial load
duke
parents:
diff changeset
989
a61af66fc99e Initial load
duke
parents:
diff changeset
990 inline jfloat build_float_from( u1* p ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
991 u4 u = build_u4_from( p );
a61af66fc99e Initial load
duke
parents:
diff changeset
992 return *(jfloat*)&u;
a61af66fc99e Initial load
duke
parents:
diff changeset
993 }
a61af66fc99e Initial load
duke
parents:
diff changeset
994
a61af66fc99e Initial load
duke
parents:
diff changeset
995
a61af66fc99e Initial load
duke
parents:
diff changeset
996 // now (64-bit) longs
a61af66fc99e Initial load
duke
parents:
diff changeset
997
a61af66fc99e Initial load
duke
parents:
diff changeset
998 inline jlong build_long_from( u1 c1, u1 c2, u1 c3, u1 c4, u1 c5, u1 c6, u1 c7, u1 c8 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
999 return ( jlong(c1) << 56 ) & ( jlong(0xff) << 56 )
a61af66fc99e Initial load
duke
parents:
diff changeset
1000 | ( jlong(c2) << 48 ) & ( jlong(0xff) << 48 )
a61af66fc99e Initial load
duke
parents:
diff changeset
1001 | ( jlong(c3) << 40 ) & ( jlong(0xff) << 40 )
a61af66fc99e Initial load
duke
parents:
diff changeset
1002 | ( jlong(c4) << 32 ) & ( jlong(0xff) << 32 )
a61af66fc99e Initial load
duke
parents:
diff changeset
1003 | ( jlong(c5) << 24 ) & ( jlong(0xff) << 24 )
a61af66fc99e Initial load
duke
parents:
diff changeset
1004 | ( jlong(c6) << 16 ) & ( jlong(0xff) << 16 )
a61af66fc99e Initial load
duke
parents:
diff changeset
1005 | ( jlong(c7) << 8 ) & ( jlong(0xff) << 8 )
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 | ( jlong(c8) << 0 ) & ( jlong(0xff) << 0 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1007 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1008
a61af66fc99e Initial load
duke
parents:
diff changeset
1009 inline jlong build_long_from( u1* p ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1010 return build_long_from( p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7] );
a61af66fc99e Initial load
duke
parents:
diff changeset
1011 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1012
a61af66fc99e Initial load
duke
parents:
diff changeset
1013
a61af66fc99e Initial load
duke
parents:
diff changeset
1014 // Doubles, too!
a61af66fc99e Initial load
duke
parents:
diff changeset
1015 inline jdouble build_double_from( u1 c1, u1 c2, u1 c3, u1 c4, u1 c5, u1 c6, u1 c7, u1 c8 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1016 jlong u = build_long_from( c1, c2, c3, c4, c5, c6, c7, c8 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1017 return *(jdouble*)&u;
a61af66fc99e Initial load
duke
parents:
diff changeset
1018 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1019
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 inline jdouble build_double_from( u1* p ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1021 jlong u = build_long_from( p );
a61af66fc99e Initial load
duke
parents:
diff changeset
1022 return *(jdouble*)&u;
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1024
a61af66fc99e Initial load
duke
parents:
diff changeset
1025
a61af66fc99e Initial load
duke
parents:
diff changeset
1026 // Portable routines to go the other way:
a61af66fc99e Initial load
duke
parents:
diff changeset
1027
a61af66fc99e Initial load
duke
parents:
diff changeset
1028 inline void explode_short_to( u2 x, u1& c1, u1& c2 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1029 c1 = u1(x >> 8);
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 c2 = u1(x);
a61af66fc99e Initial load
duke
parents:
diff changeset
1031 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1032
a61af66fc99e Initial load
duke
parents:
diff changeset
1033 inline void explode_short_to( u2 x, u1* p ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1034 explode_short_to( x, p[0], p[1]);
a61af66fc99e Initial load
duke
parents:
diff changeset
1035 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1036
a61af66fc99e Initial load
duke
parents:
diff changeset
1037 inline void explode_int_to( u4 x, u1& c1, u1& c2, u1& c3, u1& c4 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1038 c1 = u1(x >> 24);
a61af66fc99e Initial load
duke
parents:
diff changeset
1039 c2 = u1(x >> 16);
a61af66fc99e Initial load
duke
parents:
diff changeset
1040 c3 = u1(x >> 8);
a61af66fc99e Initial load
duke
parents:
diff changeset
1041 c4 = u1(x);
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1043
a61af66fc99e Initial load
duke
parents:
diff changeset
1044 inline void explode_int_to( u4 x, u1* p ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1045 explode_int_to( x, p[0], p[1], p[2], p[3]);
a61af66fc99e Initial load
duke
parents:
diff changeset
1046 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1047
a61af66fc99e Initial load
duke
parents:
diff changeset
1048
a61af66fc99e Initial load
duke
parents:
diff changeset
1049 // Pack and extract shorts to/from ints:
a61af66fc99e Initial load
duke
parents:
diff changeset
1050
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 inline int extract_low_short_from_int(jint x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1052 return x & 0xffff;
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1054
a61af66fc99e Initial load
duke
parents:
diff changeset
1055 inline int extract_high_short_from_int(jint x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 return (x >> 16) & 0xffff;
a61af66fc99e Initial load
duke
parents:
diff changeset
1057 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1058
a61af66fc99e Initial load
duke
parents:
diff changeset
1059 inline int build_int_from_shorts( jushort low, jushort high ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1060 return ((int)((unsigned int)high << 16) | (unsigned int)low);
a61af66fc99e Initial load
duke
parents:
diff changeset
1061 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1062
a61af66fc99e Initial load
duke
parents:
diff changeset
1063 // Printf-style formatters for fixed- and variable-width types as pointers and
a61af66fc99e Initial load
duke
parents:
diff changeset
1064 // integers.
a61af66fc99e Initial load
duke
parents:
diff changeset
1065 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1066 // Each compiler-specific definitions file (e.g., globalDefinitions_gcc.hpp)
a61af66fc99e Initial load
duke
parents:
diff changeset
1067 // must define the macro FORMAT64_MODIFIER, which is the modifier for '%x' or
a61af66fc99e Initial load
duke
parents:
diff changeset
1068 // '%d' formats to indicate a 64-bit quantity; commonly "l" (in LP64) or "ll"
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 // (in ILP32).
a61af66fc99e Initial load
duke
parents:
diff changeset
1070
a61af66fc99e Initial load
duke
parents:
diff changeset
1071 // Format 32-bit quantities.
a61af66fc99e Initial load
duke
parents:
diff changeset
1072 #define INT32_FORMAT "%d"
a61af66fc99e Initial load
duke
parents:
diff changeset
1073 #define UINT32_FORMAT "%u"
a61af66fc99e Initial load
duke
parents:
diff changeset
1074 #define INT32_FORMAT_W(width) "%" #width "d"
a61af66fc99e Initial load
duke
parents:
diff changeset
1075 #define UINT32_FORMAT_W(width) "%" #width "u"
a61af66fc99e Initial load
duke
parents:
diff changeset
1076
a61af66fc99e Initial load
duke
parents:
diff changeset
1077 #define PTR32_FORMAT "0x%08x"
a61af66fc99e Initial load
duke
parents:
diff changeset
1078
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 // Format 64-bit quantities.
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 #define INT64_FORMAT "%" FORMAT64_MODIFIER "d"
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 #define UINT64_FORMAT "%" FORMAT64_MODIFIER "u"
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 #define PTR64_FORMAT "0x%016" FORMAT64_MODIFIER "x"
a61af66fc99e Initial load
duke
parents:
diff changeset
1083
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 #define INT64_FORMAT_W(width) "%" #width FORMAT64_MODIFIER "d"
a61af66fc99e Initial load
duke
parents:
diff changeset
1085 #define UINT64_FORMAT_W(width) "%" #width FORMAT64_MODIFIER "u"
a61af66fc99e Initial load
duke
parents:
diff changeset
1086
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 // Format macros that allow the field width to be specified. The width must be
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 // a string literal (e.g., "8") or a macro that evaluates to one.
a61af66fc99e Initial load
duke
parents:
diff changeset
1089 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 #define SSIZE_FORMAT_W(width) INT64_FORMAT_W(width)
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 #define SIZE_FORMAT_W(width) UINT64_FORMAT_W(width)
a61af66fc99e Initial load
duke
parents:
diff changeset
1092 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
1093 #define SSIZE_FORMAT_W(width) INT32_FORMAT_W(width)
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 #define SIZE_FORMAT_W(width) UINT32_FORMAT_W(width)
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 #endif // _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
1096
a61af66fc99e Initial load
duke
parents:
diff changeset
1097 // Format pointers and size_t (or size_t-like integer types) which change size
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 // between 32- and 64-bit.
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
1100 #define PTR_FORMAT PTR64_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
1101 #define UINTX_FORMAT UINT64_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
1102 #define INTX_FORMAT INT64_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 #define SIZE_FORMAT UINT64_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
1104 #define SSIZE_FORMAT INT64_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
1105 #else // !_LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
1106 #define PTR_FORMAT PTR32_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
1107 #define UINTX_FORMAT UINT32_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 #define INTX_FORMAT INT32_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
1109 #define SIZE_FORMAT UINT32_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
1110 #define SSIZE_FORMAT INT32_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
1111 #endif // _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
1112
a61af66fc99e Initial load
duke
parents:
diff changeset
1113 #define INTPTR_FORMAT PTR_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
1114
a61af66fc99e Initial load
duke
parents:
diff changeset
1115 // Enable zap-a-lot if in debug version.
a61af66fc99e Initial load
duke
parents:
diff changeset
1116
a61af66fc99e Initial load
duke
parents:
diff changeset
1117 # ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1118 # ifdef COMPILER2
a61af66fc99e Initial load
duke
parents:
diff changeset
1119 # define ENABLE_ZAP_DEAD_LOCALS
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 #endif /* COMPILER2 */
a61af66fc99e Initial load
duke
parents:
diff changeset
1121 # endif /* ASSERT */
a61af66fc99e Initial load
duke
parents:
diff changeset
1122
a61af66fc99e Initial load
duke
parents:
diff changeset
1123 #define ARRAY_SIZE(array) (sizeof(array)/sizeof((array)[0]))