annotate src/share/vm/utilities/globalDefinitions.hpp @ 6862:8a5ea0a9ccc4

7127708: G1: change task num types from int to uint in concurrent mark Summary: Change the type of various task num fields, parameters etc to unsigned and rename them to be more consistent with the other collectors. Code changes were also reviewed by Vitaly Davidovich. Reviewed-by: johnc Contributed-by: Kaushik Srenevasan <kaushik@twitter.com>
author johnc
date Sat, 06 Oct 2012 01:17:44 -0700
parents da91efe96a93
children 8e47bac5643a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
6059
3a22b77e755a 7161545: G1: Minor cleanups to the G1 logging
brutisso
parents: 4800
diff changeset
2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1311
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1311
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1311
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
25 #ifndef SHARE_VM_UTILITIES_GLOBALDEFINITIONS_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
26 #define SHARE_VM_UTILITIES_GLOBALDEFINITIONS_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
27
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
28 #ifndef __STDC_FORMAT_MACROS
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 2447
diff changeset
29 #define __STDC_FORMAT_MACROS
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
30 #endif
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 2447
diff changeset
31
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
32 #ifdef TARGET_COMPILER_gcc
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
33 # include "utilities/globalDefinitions_gcc.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
34 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
35 #ifdef TARGET_COMPILER_visCPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
36 # include "utilities/globalDefinitions_visCPP.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
37 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
38 #ifdef TARGET_COMPILER_sparcWorks
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
39 # include "utilities/globalDefinitions_sparcWorks.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
40 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
41
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
42 #include "utilities/macros.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
43
0
a61af66fc99e Initial load
duke
parents:
diff changeset
44 // This file holds all globally used constants & types, class (forward)
a61af66fc99e Initial load
duke
parents:
diff changeset
45 // declarations and a few frequently used utility functions.
a61af66fc99e Initial load
duke
parents:
diff changeset
46
a61af66fc99e Initial load
duke
parents:
diff changeset
47 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
48 // Constants
a61af66fc99e Initial load
duke
parents:
diff changeset
49
a61af66fc99e Initial load
duke
parents:
diff changeset
50 const int LogBytesPerShort = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
51 const int LogBytesPerInt = 2;
a61af66fc99e Initial load
duke
parents:
diff changeset
52 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
53 const int LogBytesPerWord = 3;
a61af66fc99e Initial load
duke
parents:
diff changeset
54 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
55 const int LogBytesPerWord = 2;
a61af66fc99e Initial load
duke
parents:
diff changeset
56 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
57 const int LogBytesPerLong = 3;
a61af66fc99e Initial load
duke
parents:
diff changeset
58
a61af66fc99e Initial load
duke
parents:
diff changeset
59 const int BytesPerShort = 1 << LogBytesPerShort;
a61af66fc99e Initial load
duke
parents:
diff changeset
60 const int BytesPerInt = 1 << LogBytesPerInt;
a61af66fc99e Initial load
duke
parents:
diff changeset
61 const int BytesPerWord = 1 << LogBytesPerWord;
a61af66fc99e Initial load
duke
parents:
diff changeset
62 const int BytesPerLong = 1 << LogBytesPerLong;
a61af66fc99e Initial load
duke
parents:
diff changeset
63
a61af66fc99e Initial load
duke
parents:
diff changeset
64 const int LogBitsPerByte = 3;
a61af66fc99e Initial load
duke
parents:
diff changeset
65 const int LogBitsPerShort = LogBitsPerByte + LogBytesPerShort;
a61af66fc99e Initial load
duke
parents:
diff changeset
66 const int LogBitsPerInt = LogBitsPerByte + LogBytesPerInt;
a61af66fc99e Initial load
duke
parents:
diff changeset
67 const int LogBitsPerWord = LogBitsPerByte + LogBytesPerWord;
a61af66fc99e Initial load
duke
parents:
diff changeset
68 const int LogBitsPerLong = LogBitsPerByte + LogBytesPerLong;
a61af66fc99e Initial load
duke
parents:
diff changeset
69
a61af66fc99e Initial load
duke
parents:
diff changeset
70 const int BitsPerByte = 1 << LogBitsPerByte;
a61af66fc99e Initial load
duke
parents:
diff changeset
71 const int BitsPerShort = 1 << LogBitsPerShort;
a61af66fc99e Initial load
duke
parents:
diff changeset
72 const int BitsPerInt = 1 << LogBitsPerInt;
a61af66fc99e Initial load
duke
parents:
diff changeset
73 const int BitsPerWord = 1 << LogBitsPerWord;
a61af66fc99e Initial load
duke
parents:
diff changeset
74 const int BitsPerLong = 1 << LogBitsPerLong;
a61af66fc99e Initial load
duke
parents:
diff changeset
75
a61af66fc99e Initial load
duke
parents:
diff changeset
76 const int WordAlignmentMask = (1 << LogBytesPerWord) - 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
77 const int LongAlignmentMask = (1 << LogBytesPerLong) - 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
78
a61af66fc99e Initial load
duke
parents:
diff changeset
79 const int WordsPerLong = 2; // Number of stack entries for longs
a61af66fc99e Initial load
duke
parents:
diff changeset
80
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
81 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
82 extern int heapOopSize; // Oop within a java object
0
a61af66fc99e Initial load
duke
parents:
diff changeset
83 const int wordSize = sizeof(char*);
a61af66fc99e Initial load
duke
parents:
diff changeset
84 const int longSize = sizeof(jlong);
a61af66fc99e Initial load
duke
parents:
diff changeset
85 const int jintSize = sizeof(jint);
a61af66fc99e Initial load
duke
parents:
diff changeset
86 const int size_tSize = sizeof(size_t);
a61af66fc99e Initial load
duke
parents:
diff changeset
87
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
88 const int BytesPerOop = BytesPerWord; // Full-width oop
0
a61af66fc99e Initial load
duke
parents:
diff changeset
89
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
90 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
91 extern int LogBitsPerHeapOop;
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
92 extern int BytesPerHeapOop;
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
93 extern int BitsPerHeapOop;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
94
1571
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1311
diff changeset
95 // Oop encoding heap max
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1311
diff changeset
96 extern uint64_t OopEncodingHeapMax;
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1311
diff changeset
97
0
a61af66fc99e Initial load
duke
parents:
diff changeset
98 const int BitsPerJavaInteger = 32;
559
7628781568e1 6795362: 32bit server compiler leads to wrong results on solaris-x86
twisti
parents: 361
diff changeset
99 const int BitsPerJavaLong = 64;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
100 const int BitsPerSize_t = size_tSize * BitsPerByte;
a61af66fc99e Initial load
duke
parents:
diff changeset
101
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
102 // 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
103 const int jintAsStringSize = 12;
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
104
0
a61af66fc99e Initial load
duke
parents:
diff changeset
105 // In fact this should be
a61af66fc99e Initial load
duke
parents:
diff changeset
106 // log2_intptr(sizeof(class JavaThread)) - log2_intptr(64);
a61af66fc99e Initial load
duke
parents:
diff changeset
107 // see os::set_memory_serialize_page()
a61af66fc99e Initial load
duke
parents:
diff changeset
108 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
109 const int SerializePageShiftCount = 4;
a61af66fc99e Initial load
duke
parents:
diff changeset
110 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
111 const int SerializePageShiftCount = 3;
a61af66fc99e Initial load
duke
parents:
diff changeset
112 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
113
a61af66fc99e Initial load
duke
parents:
diff changeset
114 // An opaque struct of heap-word width, so that HeapWord* can be a generic
a61af66fc99e Initial load
duke
parents:
diff changeset
115 // pointer into the heap. We require that object sizes be measured in
a61af66fc99e Initial load
duke
parents:
diff changeset
116 // units of heap words, so that that
a61af66fc99e Initial load
duke
parents:
diff changeset
117 // HeapWord* hw;
a61af66fc99e Initial load
duke
parents:
diff changeset
118 // hw += oop(hw)->foo();
a61af66fc99e Initial load
duke
parents:
diff changeset
119 // works, where foo is a method (like size or scavenge) that returns the
a61af66fc99e Initial load
duke
parents:
diff changeset
120 // object size.
a61af66fc99e Initial load
duke
parents:
diff changeset
121 class HeapWord {
a61af66fc99e Initial load
duke
parents:
diff changeset
122 friend class VMStructs;
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 145
diff changeset
123 private:
0
a61af66fc99e Initial load
duke
parents:
diff changeset
124 char* i;
361
a4f9ef0c0375 6743059: Error in spaceDecorator.cpp "optimized" build.
jmasa
parents: 269
diff changeset
125 #ifndef PRODUCT
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 145
diff changeset
126 public:
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 145
diff changeset
127 char* value() { return i; }
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 145
diff changeset
128 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
129 };
a61af66fc99e Initial load
duke
parents:
diff changeset
130
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6107
diff changeset
131 // Analogous opaque struct for metadata allocated from
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6107
diff changeset
132 // metaspaces.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6107
diff changeset
133 class MetaWord {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6107
diff changeset
134 friend class VMStructs;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6107
diff changeset
135 private:
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6107
diff changeset
136 char* i;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6107
diff changeset
137 };
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6107
diff changeset
138
0
a61af66fc99e Initial load
duke
parents:
diff changeset
139 // 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
140 const int HeapWordSize = sizeof(HeapWord);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
141 #ifdef _LP64
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
142 const int LogHeapWordSize = 3;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
143 #else
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
144 const int LogHeapWordSize = 2;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
145 #endif
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
146 const int HeapWordsPerLong = BytesPerLong / HeapWordSize;
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
147 const int LogHeapWordsPerLong = LogBytesPerLong - LogHeapWordSize;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
148
a61af66fc99e Initial load
duke
parents:
diff changeset
149 // The larger HeapWordSize for 64bit requires larger heaps
a61af66fc99e Initial load
duke
parents:
diff changeset
150 // for the same application running in 64bit. See bug 4967770.
a61af66fc99e Initial load
duke
parents:
diff changeset
151 // The minimum alignment to a heap word size is done. Other
a61af66fc99e Initial load
duke
parents:
diff changeset
152 // parts of the memory system may required additional alignment
a61af66fc99e Initial load
duke
parents:
diff changeset
153 // and are responsible for those alignments.
a61af66fc99e Initial load
duke
parents:
diff changeset
154 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
155 #define ScaleForWordSize(x) align_size_down_((x) * 13 / 10, HeapWordSize)
a61af66fc99e Initial load
duke
parents:
diff changeset
156 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
157 #define ScaleForWordSize(x) (x)
a61af66fc99e Initial load
duke
parents:
diff changeset
158 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
159
a61af66fc99e Initial load
duke
parents:
diff changeset
160 // The minimum number of native machine words necessary to contain "byte_size"
a61af66fc99e Initial load
duke
parents:
diff changeset
161 // bytes.
a61af66fc99e Initial load
duke
parents:
diff changeset
162 inline size_t heap_word_size(size_t byte_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
163 return (byte_size + (HeapWordSize-1)) >> LogHeapWordSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
164 }
a61af66fc99e Initial load
duke
parents:
diff changeset
165
a61af66fc99e Initial load
duke
parents:
diff changeset
166
a61af66fc99e Initial load
duke
parents:
diff changeset
167 const size_t K = 1024;
a61af66fc99e Initial load
duke
parents:
diff changeset
168 const size_t M = K*K;
a61af66fc99e Initial load
duke
parents:
diff changeset
169 const size_t G = M*K;
a61af66fc99e Initial load
duke
parents:
diff changeset
170 const size_t HWperKB = K / sizeof(HeapWord);
a61af66fc99e Initial load
duke
parents:
diff changeset
171
a61af66fc99e Initial load
duke
parents:
diff changeset
172 const jint min_jint = (jint)1 << (sizeof(jint)*BitsPerByte-1); // 0x80000000 == smallest jint
a61af66fc99e Initial load
duke
parents:
diff changeset
173 const jint max_jint = (juint)min_jint - 1; // 0x7FFFFFFF == largest jint
a61af66fc99e Initial load
duke
parents:
diff changeset
174
a61af66fc99e Initial load
duke
parents:
diff changeset
175 // Constants for converting from a base unit to milli-base units. For
a61af66fc99e Initial load
duke
parents:
diff changeset
176 // example from seconds to milliseconds and microseconds
a61af66fc99e Initial load
duke
parents:
diff changeset
177
a61af66fc99e Initial load
duke
parents:
diff changeset
178 const int MILLIUNITS = 1000; // milli units per base unit
a61af66fc99e Initial load
duke
parents:
diff changeset
179 const int MICROUNITS = 1000000; // micro units per base unit
a61af66fc99e Initial load
duke
parents:
diff changeset
180 const int NANOUNITS = 1000000000; // nano units per base unit
a61af66fc99e Initial load
duke
parents:
diff changeset
181
4712
e7dead7e90af 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 4006
diff changeset
182 const jlong NANOSECS_PER_SEC = CONST64(1000000000);
e7dead7e90af 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 4006
diff changeset
183 const jint NANOSECS_PER_MILLISEC = 1000000;
e7dead7e90af 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 4006
diff changeset
184
0
a61af66fc99e Initial load
duke
parents:
diff changeset
185 inline const char* proper_unit_for_byte_size(size_t s) {
6063
cdfa5139bd58 7169056: Add gigabyte unit to proper_unit_for_byte_size() and byte_size_in_proper_unit()
brutisso
parents: 6059
diff changeset
186 #ifdef _LP64
cdfa5139bd58 7169056: Add gigabyte unit to proper_unit_for_byte_size() and byte_size_in_proper_unit()
brutisso
parents: 6059
diff changeset
187 if (s >= 10*G) {
cdfa5139bd58 7169056: Add gigabyte unit to proper_unit_for_byte_size() and byte_size_in_proper_unit()
brutisso
parents: 6059
diff changeset
188 return "G";
cdfa5139bd58 7169056: Add gigabyte unit to proper_unit_for_byte_size() and byte_size_in_proper_unit()
brutisso
parents: 6059
diff changeset
189 }
cdfa5139bd58 7169056: Add gigabyte unit to proper_unit_for_byte_size() and byte_size_in_proper_unit()
brutisso
parents: 6059
diff changeset
190 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
191 if (s >= 10*M) {
a61af66fc99e Initial load
duke
parents:
diff changeset
192 return "M";
a61af66fc99e Initial load
duke
parents:
diff changeset
193 } else if (s >= 10*K) {
a61af66fc99e Initial load
duke
parents:
diff changeset
194 return "K";
a61af66fc99e Initial load
duke
parents:
diff changeset
195 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
196 return "B";
a61af66fc99e Initial load
duke
parents:
diff changeset
197 }
a61af66fc99e Initial load
duke
parents:
diff changeset
198 }
a61af66fc99e Initial load
duke
parents:
diff changeset
199
6059
3a22b77e755a 7161545: G1: Minor cleanups to the G1 logging
brutisso
parents: 4800
diff changeset
200 template <class T>
3a22b77e755a 7161545: G1: Minor cleanups to the G1 logging
brutisso
parents: 4800
diff changeset
201 inline T byte_size_in_proper_unit(T s) {
6063
cdfa5139bd58 7169056: Add gigabyte unit to proper_unit_for_byte_size() and byte_size_in_proper_unit()
brutisso
parents: 6059
diff changeset
202 #ifdef _LP64
cdfa5139bd58 7169056: Add gigabyte unit to proper_unit_for_byte_size() and byte_size_in_proper_unit()
brutisso
parents: 6059
diff changeset
203 if (s >= 10*G) {
cdfa5139bd58 7169056: Add gigabyte unit to proper_unit_for_byte_size() and byte_size_in_proper_unit()
brutisso
parents: 6059
diff changeset
204 return (T)(s/G);
cdfa5139bd58 7169056: Add gigabyte unit to proper_unit_for_byte_size() and byte_size_in_proper_unit()
brutisso
parents: 6059
diff changeset
205 }
cdfa5139bd58 7169056: Add gigabyte unit to proper_unit_for_byte_size() and byte_size_in_proper_unit()
brutisso
parents: 6059
diff changeset
206 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
207 if (s >= 10*M) {
6059
3a22b77e755a 7161545: G1: Minor cleanups to the G1 logging
brutisso
parents: 4800
diff changeset
208 return (T)(s/M);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
209 } else if (s >= 10*K) {
6059
3a22b77e755a 7161545: G1: Minor cleanups to the G1 logging
brutisso
parents: 4800
diff changeset
210 return (T)(s/K);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
211 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
212 return s;
a61af66fc99e Initial load
duke
parents:
diff changeset
213 }
a61af66fc99e Initial load
duke
parents:
diff changeset
214 }
a61af66fc99e Initial load
duke
parents:
diff changeset
215
a61af66fc99e Initial load
duke
parents:
diff changeset
216 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
217 // VM type definitions
a61af66fc99e Initial load
duke
parents:
diff changeset
218
a61af66fc99e Initial load
duke
parents:
diff changeset
219 // intx and uintx are the 'extended' int and 'extended' unsigned int types;
a61af66fc99e Initial load
duke
parents:
diff changeset
220 // they are 32bit wide on a 32-bit platform, and 64bit wide on a 64bit platform.
a61af66fc99e Initial load
duke
parents:
diff changeset
221
a61af66fc99e Initial load
duke
parents:
diff changeset
222 typedef intptr_t intx;
a61af66fc99e Initial load
duke
parents:
diff changeset
223 typedef uintptr_t uintx;
a61af66fc99e Initial load
duke
parents:
diff changeset
224
a61af66fc99e Initial load
duke
parents:
diff changeset
225 const intx min_intx = (intx)1 << (sizeof(intx)*BitsPerByte-1);
a61af66fc99e Initial load
duke
parents:
diff changeset
226 const intx max_intx = (uintx)min_intx - 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
227 const uintx max_uintx = (uintx)-1;
a61af66fc99e Initial load
duke
parents:
diff changeset
228
a61af66fc99e Initial load
duke
parents:
diff changeset
229 // Table of values:
a61af66fc99e Initial load
duke
parents:
diff changeset
230 // sizeof intx 4 8
a61af66fc99e Initial load
duke
parents:
diff changeset
231 // min_intx 0x80000000 0x8000000000000000
a61af66fc99e Initial load
duke
parents:
diff changeset
232 // max_intx 0x7FFFFFFF 0x7FFFFFFFFFFFFFFF
a61af66fc99e Initial load
duke
parents:
diff changeset
233 // max_uintx 0xFFFFFFFF 0xFFFFFFFFFFFFFFFF
a61af66fc99e Initial load
duke
parents:
diff changeset
234
a61af66fc99e Initial load
duke
parents:
diff changeset
235 typedef unsigned int uint; NEEDS_CLEANUP
a61af66fc99e Initial load
duke
parents:
diff changeset
236
a61af66fc99e Initial load
duke
parents:
diff changeset
237
a61af66fc99e Initial load
duke
parents:
diff changeset
238 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
239 // Java type definitions
a61af66fc99e Initial load
duke
parents:
diff changeset
240
a61af66fc99e Initial load
duke
parents:
diff changeset
241 // All kinds of 'plain' byte addresses
a61af66fc99e Initial load
duke
parents:
diff changeset
242 typedef signed char s_char;
a61af66fc99e Initial load
duke
parents:
diff changeset
243 typedef unsigned char u_char;
a61af66fc99e Initial load
duke
parents:
diff changeset
244 typedef u_char* address;
a61af66fc99e Initial load
duke
parents:
diff changeset
245 typedef uintptr_t address_word; // unsigned integer which will hold a pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
246 // except for some implementations of a C++
a61af66fc99e Initial load
duke
parents:
diff changeset
247 // linkage pointer to function. Should never
a61af66fc99e Initial load
duke
parents:
diff changeset
248 // need one of those to be placed in this
a61af66fc99e Initial load
duke
parents:
diff changeset
249 // type anyway.
a61af66fc99e Initial load
duke
parents:
diff changeset
250
a61af66fc99e Initial load
duke
parents:
diff changeset
251 // Utility functions to "portably" (?) bit twiddle pointers
a61af66fc99e Initial load
duke
parents:
diff changeset
252 // Where portable means keep ANSI C++ compilers quiet
a61af66fc99e Initial load
duke
parents:
diff changeset
253
a61af66fc99e Initial load
duke
parents:
diff changeset
254 inline address set_address_bits(address x, int m) { return address(intptr_t(x) | m); }
a61af66fc99e Initial load
duke
parents:
diff changeset
255 inline address clear_address_bits(address x, int m) { return address(intptr_t(x) & ~m); }
a61af66fc99e Initial load
duke
parents:
diff changeset
256
a61af66fc99e Initial load
duke
parents:
diff changeset
257 // Utility functions to "portably" make cast to/from function pointers.
a61af66fc99e Initial load
duke
parents:
diff changeset
258
a61af66fc99e Initial load
duke
parents:
diff changeset
259 inline address_word mask_address_bits(address x, int m) { return address_word(x) & m; }
a61af66fc99e Initial load
duke
parents:
diff changeset
260 inline address_word castable_address(address x) { return address_word(x) ; }
a61af66fc99e Initial load
duke
parents:
diff changeset
261 inline address_word castable_address(void* x) { return address_word(x) ; }
a61af66fc99e Initial load
duke
parents:
diff changeset
262
a61af66fc99e Initial load
duke
parents:
diff changeset
263 // Pointer subtraction.
a61af66fc99e Initial load
duke
parents:
diff changeset
264 // The idea here is to avoid ptrdiff_t, which is signed and so doesn't have
a61af66fc99e Initial load
duke
parents:
diff changeset
265 // the range we might need to find differences from one end of the heap
a61af66fc99e Initial load
duke
parents:
diff changeset
266 // to the other.
a61af66fc99e Initial load
duke
parents:
diff changeset
267 // A typical use might be:
a61af66fc99e Initial load
duke
parents:
diff changeset
268 // if (pointer_delta(end(), top()) >= size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
269 // // enough room for an object of size
a61af66fc99e Initial load
duke
parents:
diff changeset
270 // ...
a61af66fc99e Initial load
duke
parents:
diff changeset
271 // and then additions like
a61af66fc99e Initial load
duke
parents:
diff changeset
272 // ... top() + size ...
a61af66fc99e Initial load
duke
parents:
diff changeset
273 // are safe because we know that top() is at least size below end().
a61af66fc99e Initial load
duke
parents:
diff changeset
274 inline size_t pointer_delta(const void* left,
a61af66fc99e Initial load
duke
parents:
diff changeset
275 const void* right,
a61af66fc99e Initial load
duke
parents:
diff changeset
276 size_t element_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
277 return (((uintptr_t) left) - ((uintptr_t) right)) / element_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
278 }
a61af66fc99e Initial load
duke
parents:
diff changeset
279 // A version specialized for HeapWord*'s.
a61af66fc99e Initial load
duke
parents:
diff changeset
280 inline size_t pointer_delta(const HeapWord* left, const HeapWord* right) {
a61af66fc99e Initial load
duke
parents:
diff changeset
281 return pointer_delta(left, right, sizeof(HeapWord));
a61af66fc99e Initial load
duke
parents:
diff changeset
282 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6107
diff changeset
283 // A version specialized for MetaWord*'s.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6107
diff changeset
284 inline size_t pointer_delta(const MetaWord* left, const MetaWord* right) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6107
diff changeset
285 return pointer_delta(left, right, sizeof(MetaWord));
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6107
diff changeset
286 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
287
a61af66fc99e Initial load
duke
parents:
diff changeset
288 //
a61af66fc99e Initial load
duke
parents:
diff changeset
289 // ANSI C++ does not allow casting from one pointer type to a function pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
290 // directly without at best a warning. This macro accomplishes it silently
a61af66fc99e Initial load
duke
parents:
diff changeset
291 // In every case that is present at this point the value be cast is a pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
292 // to a C linkage function. In somecase the type used for the cast reflects
a61af66fc99e Initial load
duke
parents:
diff changeset
293 // that linkage and a picky compiler would not complain. In other cases because
a61af66fc99e Initial load
duke
parents:
diff changeset
294 // there is no convenient place to place a typedef with extern C linkage (i.e
a61af66fc99e Initial load
duke
parents:
diff changeset
295 // a platform dependent header file) it doesn't. At this point no compiler seems
a61af66fc99e Initial load
duke
parents:
diff changeset
296 // picky enough to catch these instances (which are few). It is possible that
a61af66fc99e Initial load
duke
parents:
diff changeset
297 // using templates could fix these for all cases. This use of templates is likely
a61af66fc99e Initial load
duke
parents:
diff changeset
298 // so far from the middle of the road that it is likely to be problematic in
a61af66fc99e Initial load
duke
parents:
diff changeset
299 // many C++ compilers.
a61af66fc99e Initial load
duke
parents:
diff changeset
300 //
a61af66fc99e Initial load
duke
parents:
diff changeset
301 #define CAST_TO_FN_PTR(func_type, value) ((func_type)(castable_address(value)))
a61af66fc99e Initial load
duke
parents:
diff changeset
302 #define CAST_FROM_FN_PTR(new_type, func_ptr) ((new_type)((address_word)(func_ptr)))
a61af66fc99e Initial load
duke
parents:
diff changeset
303
a61af66fc99e Initial load
duke
parents:
diff changeset
304 // Unsigned byte types for os and stream.hpp
a61af66fc99e Initial load
duke
parents:
diff changeset
305
a61af66fc99e Initial load
duke
parents:
diff changeset
306 // Unsigned one, two, four and eigth byte quantities used for describing
a61af66fc99e Initial load
duke
parents:
diff changeset
307 // the .class file format. See JVM book chapter 4.
a61af66fc99e Initial load
duke
parents:
diff changeset
308
a61af66fc99e Initial load
duke
parents:
diff changeset
309 typedef jubyte u1;
a61af66fc99e Initial load
duke
parents:
diff changeset
310 typedef jushort u2;
a61af66fc99e Initial load
duke
parents:
diff changeset
311 typedef juint u4;
a61af66fc99e Initial load
duke
parents:
diff changeset
312 typedef julong u8;
a61af66fc99e Initial load
duke
parents:
diff changeset
313
a61af66fc99e Initial load
duke
parents:
diff changeset
314 const jubyte max_jubyte = (jubyte)-1; // 0xFF largest jubyte
a61af66fc99e Initial load
duke
parents:
diff changeset
315 const jushort max_jushort = (jushort)-1; // 0xFFFF largest jushort
a61af66fc99e Initial load
duke
parents:
diff changeset
316 const juint max_juint = (juint)-1; // 0xFFFFFFFF largest juint
a61af66fc99e Initial load
duke
parents:
diff changeset
317 const julong max_julong = (julong)-1; // 0xFF....FF largest julong
a61af66fc99e Initial load
duke
parents:
diff changeset
318
4800
94ec88ca68e2 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 4712
diff changeset
319 typedef jbyte s1;
94ec88ca68e2 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 4712
diff changeset
320 typedef jshort s2;
94ec88ca68e2 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 4712
diff changeset
321 typedef jint s4;
94ec88ca68e2 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 4712
diff changeset
322 typedef jlong s8;
94ec88ca68e2 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 4712
diff changeset
323
0
a61af66fc99e Initial load
duke
parents:
diff changeset
324 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
325 // JVM spec restrictions
a61af66fc99e Initial load
duke
parents:
diff changeset
326
a61af66fc99e Initial load
duke
parents:
diff changeset
327 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
328
a61af66fc99e Initial load
duke
parents:
diff changeset
329
a61af66fc99e Initial load
duke
parents:
diff changeset
330 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
331 // HotSwap - for JVMTI aka Class File Replacement and PopFrame
a61af66fc99e Initial load
duke
parents:
diff changeset
332 //
a61af66fc99e Initial load
duke
parents:
diff changeset
333 // Determines whether on-the-fly class replacement and frame popping are enabled.
a61af66fc99e Initial load
duke
parents:
diff changeset
334
a61af66fc99e Initial load
duke
parents:
diff changeset
335 #define HOTSWAP
a61af66fc99e Initial load
duke
parents:
diff changeset
336
a61af66fc99e Initial load
duke
parents:
diff changeset
337 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
338 // Object alignment, in units of HeapWords.
a61af66fc99e Initial load
duke
parents:
diff changeset
339 //
a61af66fc99e Initial load
duke
parents:
diff changeset
340 // Minimum is max(BytesPerLong, BytesPerDouble, BytesPerOop) / HeapWordSize, so jlong, jdouble and
a61af66fc99e Initial load
duke
parents:
diff changeset
341 // reference fields can be naturally aligned.
a61af66fc99e Initial load
duke
parents:
diff changeset
342
1571
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1311
diff changeset
343 extern int MinObjAlignment;
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1311
diff changeset
344 extern int MinObjAlignmentInBytes;
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1311
diff changeset
345 extern int MinObjAlignmentInBytesMask;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
346
1571
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1311
diff changeset
347 extern int LogMinObjAlignment;
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1311
diff changeset
348 extern int LogMinObjAlignmentInBytes;
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
349
0
a61af66fc99e Initial load
duke
parents:
diff changeset
350 // Machine dependent stuff
a61af66fc99e Initial load
duke
parents:
diff changeset
351
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
352 #ifdef TARGET_ARCH_x86
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
353 # include "globalDefinitions_x86.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
354 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
355 #ifdef TARGET_ARCH_sparc
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
356 # include "globalDefinitions_sparc.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
357 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
358 #ifdef TARGET_ARCH_zero
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
359 # include "globalDefinitions_zero.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
360 #endif
2192
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2152
diff changeset
361 #ifdef TARGET_ARCH_arm
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2152
diff changeset
362 # include "globalDefinitions_arm.hpp"
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2152
diff changeset
363 #endif
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2152
diff changeset
364 #ifdef TARGET_ARCH_ppc
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2152
diff changeset
365 # include "globalDefinitions_ppc.hpp"
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2152
diff changeset
366 #endif
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
367
0
a61af66fc99e Initial load
duke
parents:
diff changeset
368
a61af66fc99e Initial load
duke
parents:
diff changeset
369 // The byte alignment to be used by Arena::Amalloc. See bugid 4169348.
a61af66fc99e Initial load
duke
parents:
diff changeset
370 // Note: this value must be a power of 2
a61af66fc99e Initial load
duke
parents:
diff changeset
371
a61af66fc99e Initial load
duke
parents:
diff changeset
372 #define ARENA_AMALLOC_ALIGNMENT (2*BytesPerWord)
a61af66fc99e Initial load
duke
parents:
diff changeset
373
a61af66fc99e Initial load
duke
parents:
diff changeset
374 // Signed variants of alignment helpers. There are two versions of each, a macro
a61af66fc99e Initial load
duke
parents:
diff changeset
375 // for use in places like enum definitions that require compile-time constant
a61af66fc99e Initial load
duke
parents:
diff changeset
376 // expressions and a function for all other places so as to get type checking.
a61af66fc99e Initial load
duke
parents:
diff changeset
377
a61af66fc99e Initial load
duke
parents:
diff changeset
378 #define align_size_up_(size, alignment) (((size) + ((alignment) - 1)) & ~((alignment) - 1))
a61af66fc99e Initial load
duke
parents:
diff changeset
379
a61af66fc99e Initial load
duke
parents:
diff changeset
380 inline intptr_t align_size_up(intptr_t size, intptr_t alignment) {
a61af66fc99e Initial load
duke
parents:
diff changeset
381 return align_size_up_(size, alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
382 }
a61af66fc99e Initial load
duke
parents:
diff changeset
383
a61af66fc99e Initial load
duke
parents:
diff changeset
384 #define align_size_down_(size, alignment) ((size) & ~((alignment) - 1))
a61af66fc99e Initial load
duke
parents:
diff changeset
385
a61af66fc99e Initial load
duke
parents:
diff changeset
386 inline intptr_t align_size_down(intptr_t size, intptr_t alignment) {
a61af66fc99e Initial load
duke
parents:
diff changeset
387 return align_size_down_(size, alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
388 }
a61af66fc99e Initial load
duke
parents:
diff changeset
389
a61af66fc99e Initial load
duke
parents:
diff changeset
390 // Align objects by rounding up their size, in HeapWord units.
a61af66fc99e Initial load
duke
parents:
diff changeset
391
a61af66fc99e Initial load
duke
parents:
diff changeset
392 #define align_object_size_(size) align_size_up_(size, MinObjAlignment)
a61af66fc99e Initial load
duke
parents:
diff changeset
393
a61af66fc99e Initial load
duke
parents:
diff changeset
394 inline intptr_t align_object_size(intptr_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
395 return align_size_up(size, MinObjAlignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
396 }
a61af66fc99e Initial load
duke
parents:
diff changeset
397
1571
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1311
diff changeset
398 inline bool is_object_aligned(intptr_t addr) {
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1311
diff changeset
399 return addr == align_object_size(addr);
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1311
diff changeset
400 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
401
1571
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1311
diff changeset
402 // Pad out certain offsets to jlong alignment, in HeapWord units.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
403
a61af66fc99e Initial load
duke
parents:
diff changeset
404 inline intptr_t align_object_offset(intptr_t offset) {
a61af66fc99e Initial load
duke
parents:
diff changeset
405 return align_size_up(offset, HeapWordsPerLong);
a61af66fc99e Initial load
duke
parents:
diff changeset
406 }
a61af66fc99e Initial load
duke
parents:
diff changeset
407
1665
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
408 // The expected size in bytes of a cache line, used to pad data structures.
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
409 #define DEFAULT_CACHE_LINE_SIZE 64
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
410
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
411 // Bytes needed to pad type to avoid cache-line sharing; alignment should be the
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
412 // expected cache line size (a power of two). The first addend avoids sharing
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
413 // when the start address is not a multiple of alignment; the second maintains
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
414 // alignment of starting addresses that happen to be a multiple.
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
415 #define PADDING_SIZE(type, alignment) \
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
416 ((alignment) + align_size_up_(sizeof(type), alignment))
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
417
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
418 // Templates to create a subclass padded to avoid cache line sharing. These are
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
419 // effective only when applied to derived-most (leaf) classes.
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
420
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
421 // When no args are passed to the base ctor.
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
422 template <class T, size_t alignment = DEFAULT_CACHE_LINE_SIZE>
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
423 class Padded: public T {
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
424 private:
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
425 char _pad_buf_[PADDING_SIZE(T, alignment)];
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
426 };
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
427
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
428 // When either 0 or 1 args may be passed to the base ctor.
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
429 template <class T, typename Arg1T, size_t alignment = DEFAULT_CACHE_LINE_SIZE>
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
430 class Padded01: public T {
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
431 public:
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
432 Padded01(): T() { }
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
433 Padded01(Arg1T arg1): T(arg1) { }
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
434 private:
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
435 char _pad_buf_[PADDING_SIZE(T, alignment)];
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
436 };
0
a61af66fc99e Initial load
duke
parents:
diff changeset
437
a61af66fc99e Initial load
duke
parents:
diff changeset
438 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
439 // Utility macros for compilers
a61af66fc99e Initial load
duke
parents:
diff changeset
440 // used to silence compiler warnings
a61af66fc99e Initial load
duke
parents:
diff changeset
441
a61af66fc99e Initial load
duke
parents:
diff changeset
442 #define Unused_Variable(var) var
a61af66fc99e Initial load
duke
parents:
diff changeset
443
a61af66fc99e Initial load
duke
parents:
diff changeset
444
a61af66fc99e Initial load
duke
parents:
diff changeset
445 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
446 // Miscellaneous
a61af66fc99e Initial load
duke
parents:
diff changeset
447
a61af66fc99e Initial load
duke
parents:
diff changeset
448 // 6302670 Eliminate Hotspot __fabsf dependency
a61af66fc99e Initial load
duke
parents:
diff changeset
449 // All fabs() callers should call this function instead, which will implicitly
a61af66fc99e Initial load
duke
parents:
diff changeset
450 // convert the operand to double, avoiding a dependency on __fabsf which
a61af66fc99e Initial load
duke
parents:
diff changeset
451 // doesn't exist in early versions of Solaris 8.
a61af66fc99e Initial load
duke
parents:
diff changeset
452 inline double fabsd(double value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
453 return fabs(value);
a61af66fc99e Initial load
duke
parents:
diff changeset
454 }
a61af66fc99e Initial load
duke
parents:
diff changeset
455
a61af66fc99e Initial load
duke
parents:
diff changeset
456 inline jint low (jlong value) { return jint(value); }
a61af66fc99e Initial load
duke
parents:
diff changeset
457 inline jint high(jlong value) { return jint(value >> 32); }
a61af66fc99e Initial load
duke
parents:
diff changeset
458
a61af66fc99e Initial load
duke
parents:
diff changeset
459 // the fancy casts are a hopefully portable way
a61af66fc99e Initial load
duke
parents:
diff changeset
460 // to do unsigned 32 to 64 bit type conversion
a61af66fc99e Initial load
duke
parents:
diff changeset
461 inline void set_low (jlong* value, jint low ) { *value &= (jlong)0xffffffff << 32;
a61af66fc99e Initial load
duke
parents:
diff changeset
462 *value |= (jlong)(julong)(juint)low; }
a61af66fc99e Initial load
duke
parents:
diff changeset
463
a61af66fc99e Initial load
duke
parents:
diff changeset
464 inline void set_high(jlong* value, jint high) { *value &= (jlong)(julong)(juint)0xffffffff;
a61af66fc99e Initial load
duke
parents:
diff changeset
465 *value |= (jlong)high << 32; }
a61af66fc99e Initial load
duke
parents:
diff changeset
466
a61af66fc99e Initial load
duke
parents:
diff changeset
467 inline jlong jlong_from(jint h, jint l) {
a61af66fc99e Initial load
duke
parents:
diff changeset
468 jlong result = 0; // initialization to avoid warning
a61af66fc99e Initial load
duke
parents:
diff changeset
469 set_high(&result, h);
a61af66fc99e Initial load
duke
parents:
diff changeset
470 set_low(&result, l);
a61af66fc99e Initial load
duke
parents:
diff changeset
471 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
472 }
a61af66fc99e Initial load
duke
parents:
diff changeset
473
a61af66fc99e Initial load
duke
parents:
diff changeset
474 union jlong_accessor {
a61af66fc99e Initial load
duke
parents:
diff changeset
475 jint words[2];
a61af66fc99e Initial load
duke
parents:
diff changeset
476 jlong long_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
477 };
a61af66fc99e Initial load
duke
parents:
diff changeset
478
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
479 void basic_types_init(); // cannot define here; uses assert
0
a61af66fc99e Initial load
duke
parents:
diff changeset
480
a61af66fc99e Initial load
duke
parents:
diff changeset
481
a61af66fc99e Initial load
duke
parents:
diff changeset
482 // NOTE: replicated in SA in vm/agent/sun/jvm/hotspot/runtime/BasicType.java
a61af66fc99e Initial load
duke
parents:
diff changeset
483 enum BasicType {
a61af66fc99e Initial load
duke
parents:
diff changeset
484 T_BOOLEAN = 4,
a61af66fc99e Initial load
duke
parents:
diff changeset
485 T_CHAR = 5,
a61af66fc99e Initial load
duke
parents:
diff changeset
486 T_FLOAT = 6,
a61af66fc99e Initial load
duke
parents:
diff changeset
487 T_DOUBLE = 7,
a61af66fc99e Initial load
duke
parents:
diff changeset
488 T_BYTE = 8,
a61af66fc99e Initial load
duke
parents:
diff changeset
489 T_SHORT = 9,
a61af66fc99e Initial load
duke
parents:
diff changeset
490 T_INT = 10,
a61af66fc99e Initial load
duke
parents:
diff changeset
491 T_LONG = 11,
a61af66fc99e Initial load
duke
parents:
diff changeset
492 T_OBJECT = 12,
a61af66fc99e Initial load
duke
parents:
diff changeset
493 T_ARRAY = 13,
a61af66fc99e Initial load
duke
parents:
diff changeset
494 T_VOID = 14,
a61af66fc99e Initial load
duke
parents:
diff changeset
495 T_ADDRESS = 15,
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
496 T_NARROWOOP= 16,
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6107
diff changeset
497 T_METADATA = 17,
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6107
diff changeset
498 T_CONFLICT = 18, // for stack value type with conflicting contents
0
a61af66fc99e Initial load
duke
parents:
diff changeset
499 T_ILLEGAL = 99
a61af66fc99e Initial load
duke
parents:
diff changeset
500 };
a61af66fc99e Initial load
duke
parents:
diff changeset
501
29
d5fc211aea19 6633953: type2aelembytes{T_ADDRESS} should be 8 bytes in 64 bit VM
kvn
parents: 0
diff changeset
502 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
503 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
504 }
d5fc211aea19 6633953: type2aelembytes{T_ADDRESS} should be 8 bytes in 64 bit VM
kvn
parents: 0
diff changeset
505
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 605
diff changeset
506 inline bool is_subword_type(BasicType t) {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 605
diff changeset
507 // these guys are processed exactly like T_INT in calling sequences:
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 605
diff changeset
508 return (t == T_BOOLEAN || t == T_CHAR || t == T_BYTE || t == T_SHORT);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 605
diff changeset
509 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 605
diff changeset
510
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 605
diff changeset
511 inline bool is_signed_subword_type(BasicType t) {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 605
diff changeset
512 return (t == T_BYTE || t == T_SHORT);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 605
diff changeset
513 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 605
diff changeset
514
0
a61af66fc99e Initial load
duke
parents:
diff changeset
515 // Convert a char from a classfile signature to a BasicType
a61af66fc99e Initial load
duke
parents:
diff changeset
516 inline BasicType char2type(char c) {
a61af66fc99e Initial load
duke
parents:
diff changeset
517 switch( c ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
518 case 'B': return T_BYTE;
a61af66fc99e Initial load
duke
parents:
diff changeset
519 case 'C': return T_CHAR;
a61af66fc99e Initial load
duke
parents:
diff changeset
520 case 'D': return T_DOUBLE;
a61af66fc99e Initial load
duke
parents:
diff changeset
521 case 'F': return T_FLOAT;
a61af66fc99e Initial load
duke
parents:
diff changeset
522 case 'I': return T_INT;
a61af66fc99e Initial load
duke
parents:
diff changeset
523 case 'J': return T_LONG;
a61af66fc99e Initial load
duke
parents:
diff changeset
524 case 'S': return T_SHORT;
a61af66fc99e Initial load
duke
parents:
diff changeset
525 case 'Z': return T_BOOLEAN;
a61af66fc99e Initial load
duke
parents:
diff changeset
526 case 'V': return T_VOID;
a61af66fc99e Initial load
duke
parents:
diff changeset
527 case 'L': return T_OBJECT;
a61af66fc99e Initial load
duke
parents:
diff changeset
528 case '[': return T_ARRAY;
a61af66fc99e Initial load
duke
parents:
diff changeset
529 }
a61af66fc99e Initial load
duke
parents:
diff changeset
530 return T_ILLEGAL;
a61af66fc99e Initial load
duke
parents:
diff changeset
531 }
a61af66fc99e Initial load
duke
parents:
diff changeset
532
a61af66fc99e Initial load
duke
parents:
diff changeset
533 extern char type2char_tab[T_CONFLICT+1]; // Map a BasicType to a jchar
a61af66fc99e Initial load
duke
parents:
diff changeset
534 inline char type2char(BasicType t) { return (uint)t < T_CONFLICT+1 ? type2char_tab[t] : 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
535 extern int type2size[T_CONFLICT+1]; // Map BasicType to result stack elements
a61af66fc99e Initial load
duke
parents:
diff changeset
536 extern const char* type2name_tab[T_CONFLICT+1]; // Map a BasicType to a jchar
a61af66fc99e Initial load
duke
parents:
diff changeset
537 inline const char* type2name(BasicType t) { return (uint)t < T_CONFLICT+1 ? type2name_tab[t] : NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
538 extern BasicType name2type(const char* name);
a61af66fc99e Initial load
duke
parents:
diff changeset
539
a61af66fc99e Initial load
duke
parents:
diff changeset
540 // Auxilary math routines
a61af66fc99e Initial load
duke
parents:
diff changeset
541 // least common multiple
a61af66fc99e Initial load
duke
parents:
diff changeset
542 extern size_t lcm(size_t a, size_t b);
a61af66fc99e Initial load
duke
parents:
diff changeset
543
a61af66fc99e Initial load
duke
parents:
diff changeset
544
a61af66fc99e Initial load
duke
parents:
diff changeset
545 // NOTE: replicated in SA in vm/agent/sun/jvm/hotspot/runtime/BasicType.java
a61af66fc99e Initial load
duke
parents:
diff changeset
546 enum BasicTypeSize {
a61af66fc99e Initial load
duke
parents:
diff changeset
547 T_BOOLEAN_size = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
548 T_CHAR_size = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
549 T_FLOAT_size = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
550 T_DOUBLE_size = 2,
a61af66fc99e Initial load
duke
parents:
diff changeset
551 T_BYTE_size = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
552 T_SHORT_size = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
553 T_INT_size = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
554 T_LONG_size = 2,
a61af66fc99e Initial load
duke
parents:
diff changeset
555 T_OBJECT_size = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
556 T_ARRAY_size = 1,
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
557 T_NARROWOOP_size = 1,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
558 T_VOID_size = 0
a61af66fc99e Initial load
duke
parents:
diff changeset
559 };
a61af66fc99e Initial load
duke
parents:
diff changeset
560
a61af66fc99e Initial load
duke
parents:
diff changeset
561
a61af66fc99e Initial load
duke
parents:
diff changeset
562 // maps a BasicType to its instance field storage type:
a61af66fc99e Initial load
duke
parents:
diff changeset
563 // all sub-word integral types are widened to T_INT
a61af66fc99e Initial load
duke
parents:
diff changeset
564 extern BasicType type2field[T_CONFLICT+1];
a61af66fc99e Initial load
duke
parents:
diff changeset
565 extern BasicType type2wfield[T_CONFLICT+1];
a61af66fc99e Initial load
duke
parents:
diff changeset
566
a61af66fc99e Initial load
duke
parents:
diff changeset
567
a61af66fc99e Initial load
duke
parents:
diff changeset
568 // size in bytes
a61af66fc99e Initial load
duke
parents:
diff changeset
569 enum ArrayElementSize {
a61af66fc99e Initial load
duke
parents:
diff changeset
570 T_BOOLEAN_aelem_bytes = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
571 T_CHAR_aelem_bytes = 2,
a61af66fc99e Initial load
duke
parents:
diff changeset
572 T_FLOAT_aelem_bytes = 4,
a61af66fc99e Initial load
duke
parents:
diff changeset
573 T_DOUBLE_aelem_bytes = 8,
a61af66fc99e Initial load
duke
parents:
diff changeset
574 T_BYTE_aelem_bytes = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
575 T_SHORT_aelem_bytes = 2,
a61af66fc99e Initial load
duke
parents:
diff changeset
576 T_INT_aelem_bytes = 4,
a61af66fc99e Initial load
duke
parents:
diff changeset
577 T_LONG_aelem_bytes = 8,
a61af66fc99e Initial load
duke
parents:
diff changeset
578 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
579 T_OBJECT_aelem_bytes = 8,
a61af66fc99e Initial load
duke
parents:
diff changeset
580 T_ARRAY_aelem_bytes = 8,
a61af66fc99e Initial load
duke
parents:
diff changeset
581 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
582 T_OBJECT_aelem_bytes = 4,
a61af66fc99e Initial load
duke
parents:
diff changeset
583 T_ARRAY_aelem_bytes = 4,
a61af66fc99e Initial load
duke
parents:
diff changeset
584 #endif
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
585 T_NARROWOOP_aelem_bytes = 4,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
586 T_VOID_aelem_bytes = 0
a61af66fc99e Initial load
duke
parents:
diff changeset
587 };
a61af66fc99e Initial load
duke
parents:
diff changeset
588
29
d5fc211aea19 6633953: type2aelembytes{T_ADDRESS} should be 8 bytes in 64 bit VM
kvn
parents: 0
diff changeset
589 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
590 #ifdef ASSERT
d5fc211aea19 6633953: type2aelembytes{T_ADDRESS} should be 8 bytes in 64 bit VM
kvn
parents: 0
diff changeset
591 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
592 #else
1763
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1665
diff changeset
593 inline int type2aelembytes(BasicType t, bool allow_address = false) { return _type2aelembytes[t]; }
29
d5fc211aea19 6633953: type2aelembytes{T_ADDRESS} should be 8 bytes in 64 bit VM
kvn
parents: 0
diff changeset
594 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
595
a61af66fc99e Initial load
duke
parents:
diff changeset
596
a61af66fc99e Initial load
duke
parents:
diff changeset
597 // JavaValue serves as a container for arbitrary Java values.
a61af66fc99e Initial load
duke
parents:
diff changeset
598
a61af66fc99e Initial load
duke
parents:
diff changeset
599 class JavaValue {
a61af66fc99e Initial load
duke
parents:
diff changeset
600
a61af66fc99e Initial load
duke
parents:
diff changeset
601 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
602 typedef union JavaCallValue {
a61af66fc99e Initial load
duke
parents:
diff changeset
603 jfloat f;
a61af66fc99e Initial load
duke
parents:
diff changeset
604 jdouble d;
a61af66fc99e Initial load
duke
parents:
diff changeset
605 jint i;
a61af66fc99e Initial load
duke
parents:
diff changeset
606 jlong l;
a61af66fc99e Initial load
duke
parents:
diff changeset
607 jobject h;
a61af66fc99e Initial load
duke
parents:
diff changeset
608 } JavaCallValue;
a61af66fc99e Initial load
duke
parents:
diff changeset
609
a61af66fc99e Initial load
duke
parents:
diff changeset
610 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
611 BasicType _type;
a61af66fc99e Initial load
duke
parents:
diff changeset
612 JavaCallValue _value;
a61af66fc99e Initial load
duke
parents:
diff changeset
613
a61af66fc99e Initial load
duke
parents:
diff changeset
614 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
615 JavaValue(BasicType t = T_ILLEGAL) { _type = t; }
a61af66fc99e Initial load
duke
parents:
diff changeset
616
a61af66fc99e Initial load
duke
parents:
diff changeset
617 JavaValue(jfloat value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
618 _type = T_FLOAT;
a61af66fc99e Initial load
duke
parents:
diff changeset
619 _value.f = value;
a61af66fc99e Initial load
duke
parents:
diff changeset
620 }
a61af66fc99e Initial load
duke
parents:
diff changeset
621
a61af66fc99e Initial load
duke
parents:
diff changeset
622 JavaValue(jdouble value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
623 _type = T_DOUBLE;
a61af66fc99e Initial load
duke
parents:
diff changeset
624 _value.d = value;
a61af66fc99e Initial load
duke
parents:
diff changeset
625 }
a61af66fc99e Initial load
duke
parents:
diff changeset
626
a61af66fc99e Initial load
duke
parents:
diff changeset
627 jfloat get_jfloat() const { return _value.f; }
a61af66fc99e Initial load
duke
parents:
diff changeset
628 jdouble get_jdouble() const { return _value.d; }
a61af66fc99e Initial load
duke
parents:
diff changeset
629 jint get_jint() const { return _value.i; }
a61af66fc99e Initial load
duke
parents:
diff changeset
630 jlong get_jlong() const { return _value.l; }
a61af66fc99e Initial load
duke
parents:
diff changeset
631 jobject get_jobject() const { return _value.h; }
a61af66fc99e Initial load
duke
parents:
diff changeset
632 JavaCallValue* get_value_addr() { return &_value; }
a61af66fc99e Initial load
duke
parents:
diff changeset
633 BasicType get_type() const { return _type; }
a61af66fc99e Initial load
duke
parents:
diff changeset
634
a61af66fc99e Initial load
duke
parents:
diff changeset
635 void set_jfloat(jfloat f) { _value.f = f;}
a61af66fc99e Initial load
duke
parents:
diff changeset
636 void set_jdouble(jdouble d) { _value.d = d;}
a61af66fc99e Initial load
duke
parents:
diff changeset
637 void set_jint(jint i) { _value.i = i;}
a61af66fc99e Initial load
duke
parents:
diff changeset
638 void set_jlong(jlong l) { _value.l = l;}
a61af66fc99e Initial load
duke
parents:
diff changeset
639 void set_jobject(jobject h) { _value.h = h;}
a61af66fc99e Initial load
duke
parents:
diff changeset
640 void set_type(BasicType t) { _type = t; }
a61af66fc99e Initial load
duke
parents:
diff changeset
641
a61af66fc99e Initial load
duke
parents:
diff changeset
642 jboolean get_jboolean() const { return (jboolean) (_value.i);}
a61af66fc99e Initial load
duke
parents:
diff changeset
643 jbyte get_jbyte() const { return (jbyte) (_value.i);}
a61af66fc99e Initial load
duke
parents:
diff changeset
644 jchar get_jchar() const { return (jchar) (_value.i);}
a61af66fc99e Initial load
duke
parents:
diff changeset
645 jshort get_jshort() const { return (jshort) (_value.i);}
a61af66fc99e Initial load
duke
parents:
diff changeset
646
a61af66fc99e Initial load
duke
parents:
diff changeset
647 };
a61af66fc99e Initial load
duke
parents:
diff changeset
648
a61af66fc99e Initial load
duke
parents:
diff changeset
649
a61af66fc99e Initial load
duke
parents:
diff changeset
650 #define STACK_BIAS 0
a61af66fc99e Initial load
duke
parents:
diff changeset
651 // V9 Sparc CPU's running in 64 Bit mode use a stack bias of 7ff
a61af66fc99e Initial load
duke
parents:
diff changeset
652 // in order to extend the reach of the stack pointer.
a61af66fc99e Initial load
duke
parents:
diff changeset
653 #if defined(SPARC) && defined(_LP64)
a61af66fc99e Initial load
duke
parents:
diff changeset
654 #undef STACK_BIAS
a61af66fc99e Initial load
duke
parents:
diff changeset
655 #define STACK_BIAS 0x7ff
a61af66fc99e Initial load
duke
parents:
diff changeset
656 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
657
a61af66fc99e Initial load
duke
parents:
diff changeset
658
a61af66fc99e Initial load
duke
parents:
diff changeset
659 // TosState describes the top-of-stack state before and after the execution of
a61af66fc99e Initial load
duke
parents:
diff changeset
660 // a bytecode or method. The top-of-stack value may be cached in one or more CPU
a61af66fc99e Initial load
duke
parents:
diff changeset
661 // registers. The TosState corresponds to the 'machine represention' of this cached
a61af66fc99e Initial load
duke
parents:
diff changeset
662 // value. There's 4 states corresponding to the JAVA types int, long, float & double
a61af66fc99e Initial load
duke
parents:
diff changeset
663 // 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
664 // of stack (in memory) and thus not cached. The atos state corresponds to the itos
a61af66fc99e Initial load
duke
parents:
diff changeset
665 // state when it comes to machine representation but is used separately for (oop)
a61af66fc99e Initial load
duke
parents:
diff changeset
666 // type specific operations (e.g. verification code).
a61af66fc99e Initial load
duke
parents:
diff changeset
667
a61af66fc99e Initial load
duke
parents:
diff changeset
668 enum TosState { // describes the tos cache contents
a61af66fc99e Initial load
duke
parents:
diff changeset
669 btos = 0, // byte, bool tos cached
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
670 ctos = 1, // char tos cached
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
671 stos = 2, // short tos cached
0
a61af66fc99e Initial load
duke
parents:
diff changeset
672 itos = 3, // int tos cached
a61af66fc99e Initial load
duke
parents:
diff changeset
673 ltos = 4, // long tos cached
a61af66fc99e Initial load
duke
parents:
diff changeset
674 ftos = 5, // float tos cached
a61af66fc99e Initial load
duke
parents:
diff changeset
675 dtos = 6, // double tos cached
a61af66fc99e Initial load
duke
parents:
diff changeset
676 atos = 7, // object cached
a61af66fc99e Initial load
duke
parents:
diff changeset
677 vtos = 8, // tos not cached
a61af66fc99e Initial load
duke
parents:
diff changeset
678 number_of_states,
a61af66fc99e Initial load
duke
parents:
diff changeset
679 ilgl // illegal state: should not occur
a61af66fc99e Initial load
duke
parents:
diff changeset
680 };
a61af66fc99e Initial load
duke
parents:
diff changeset
681
a61af66fc99e Initial load
duke
parents:
diff changeset
682
a61af66fc99e Initial load
duke
parents:
diff changeset
683 inline TosState as_TosState(BasicType type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
684 switch (type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
685 case T_BYTE : return btos;
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
686 case T_BOOLEAN: return btos; // FIXME: Add ztos
0
a61af66fc99e Initial load
duke
parents:
diff changeset
687 case T_CHAR : return ctos;
a61af66fc99e Initial load
duke
parents:
diff changeset
688 case T_SHORT : return stos;
a61af66fc99e Initial load
duke
parents:
diff changeset
689 case T_INT : return itos;
a61af66fc99e Initial load
duke
parents:
diff changeset
690 case T_LONG : return ltos;
a61af66fc99e Initial load
duke
parents:
diff changeset
691 case T_FLOAT : return ftos;
a61af66fc99e Initial load
duke
parents:
diff changeset
692 case T_DOUBLE : return dtos;
a61af66fc99e Initial load
duke
parents:
diff changeset
693 case T_VOID : return vtos;
a61af66fc99e Initial load
duke
parents:
diff changeset
694 case T_ARRAY : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
695 case T_OBJECT : return atos;
a61af66fc99e Initial load
duke
parents:
diff changeset
696 }
a61af66fc99e Initial load
duke
parents:
diff changeset
697 return ilgl;
a61af66fc99e Initial load
duke
parents:
diff changeset
698 }
a61af66fc99e Initial load
duke
parents:
diff changeset
699
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
700 inline BasicType as_BasicType(TosState state) {
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
701 switch (state) {
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
702 //case ztos: return T_BOOLEAN;//FIXME
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
703 case btos : return T_BYTE;
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
704 case ctos : return T_CHAR;
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
705 case stos : return T_SHORT;
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
706 case itos : return T_INT;
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
707 case ltos : return T_LONG;
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
708 case ftos : return T_FLOAT;
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
709 case dtos : return T_DOUBLE;
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
710 case atos : return T_OBJECT;
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
711 case vtos : return T_VOID;
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
712 }
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
713 return T_ILLEGAL;
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
714 }
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
715
0
a61af66fc99e Initial load
duke
parents:
diff changeset
716
a61af66fc99e Initial load
duke
parents:
diff changeset
717 // Helper function to convert BasicType info into TosState
a61af66fc99e Initial load
duke
parents:
diff changeset
718 // Note: Cannot define here as it uses global constant at the time being.
a61af66fc99e Initial load
duke
parents:
diff changeset
719 TosState as_TosState(BasicType type);
a61af66fc99e Initial load
duke
parents:
diff changeset
720
a61af66fc99e Initial load
duke
parents:
diff changeset
721
a61af66fc99e Initial load
duke
parents:
diff changeset
722 // ReferenceType is used to distinguish between java/lang/ref/Reference subclasses
a61af66fc99e Initial load
duke
parents:
diff changeset
723
a61af66fc99e Initial load
duke
parents:
diff changeset
724 enum ReferenceType {
a61af66fc99e Initial load
duke
parents:
diff changeset
725 REF_NONE, // Regular class
a61af66fc99e Initial load
duke
parents:
diff changeset
726 REF_OTHER, // Subclass of java/lang/ref/Reference, but not subclass of one of the classes below
a61af66fc99e Initial load
duke
parents:
diff changeset
727 REF_SOFT, // Subclass of java/lang/ref/SoftReference
a61af66fc99e Initial load
duke
parents:
diff changeset
728 REF_WEAK, // Subclass of java/lang/ref/WeakReference
a61af66fc99e Initial load
duke
parents:
diff changeset
729 REF_FINAL, // Subclass of java/lang/ref/FinalReference
a61af66fc99e Initial load
duke
parents:
diff changeset
730 REF_PHANTOM // Subclass of java/lang/ref/PhantomReference
a61af66fc99e Initial load
duke
parents:
diff changeset
731 };
a61af66fc99e Initial load
duke
parents:
diff changeset
732
a61af66fc99e Initial load
duke
parents:
diff changeset
733
a61af66fc99e Initial load
duke
parents:
diff changeset
734 // JavaThreadState keeps track of which part of the code a thread is executing in. This
a61af66fc99e Initial load
duke
parents:
diff changeset
735 // information is needed by the safepoint code.
a61af66fc99e Initial load
duke
parents:
diff changeset
736 //
a61af66fc99e Initial load
duke
parents:
diff changeset
737 // There are 4 essential states:
a61af66fc99e Initial load
duke
parents:
diff changeset
738 //
a61af66fc99e Initial load
duke
parents:
diff changeset
739 // _thread_new : Just started, but not executed init. code yet (most likely still in OS init code)
a61af66fc99e Initial load
duke
parents:
diff changeset
740 // _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
741 // _thread_in_vm : Executing in the vm
a61af66fc99e Initial load
duke
parents:
diff changeset
742 // _thread_in_Java : Executing either interpreted or compiled Java code (or could be in a stub)
a61af66fc99e Initial load
duke
parents:
diff changeset
743 //
a61af66fc99e Initial load
duke
parents:
diff changeset
744 // 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
745 // 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
746 // handle certain thread_states without having to suspend the thread - making the safepoint code faster.
a61af66fc99e Initial load
duke
parents:
diff changeset
747 //
a61af66fc99e Initial load
duke
parents:
diff changeset
748 // Given a state, the xxx_trans state can always be found by adding 1.
a61af66fc99e Initial load
duke
parents:
diff changeset
749 //
a61af66fc99e Initial load
duke
parents:
diff changeset
750 enum JavaThreadState {
a61af66fc99e Initial load
duke
parents:
diff changeset
751 _thread_uninitialized = 0, // should never happen (missing initialization)
a61af66fc99e Initial load
duke
parents:
diff changeset
752 _thread_new = 2, // just starting up, i.e., in process of being initialized
a61af66fc99e Initial load
duke
parents:
diff changeset
753 _thread_new_trans = 3, // corresponding transition state (not used, included for completness)
a61af66fc99e Initial load
duke
parents:
diff changeset
754 _thread_in_native = 4, // running in native code
a61af66fc99e Initial load
duke
parents:
diff changeset
755 _thread_in_native_trans = 5, // corresponding transition state
a61af66fc99e Initial load
duke
parents:
diff changeset
756 _thread_in_vm = 6, // running in VM
a61af66fc99e Initial load
duke
parents:
diff changeset
757 _thread_in_vm_trans = 7, // corresponding transition state
a61af66fc99e Initial load
duke
parents:
diff changeset
758 _thread_in_Java = 8, // running in Java or in stub code
a61af66fc99e Initial load
duke
parents:
diff changeset
759 _thread_in_Java_trans = 9, // corresponding transition state (not used, included for completness)
a61af66fc99e Initial load
duke
parents:
diff changeset
760 _thread_blocked = 10, // blocked in vm
a61af66fc99e Initial load
duke
parents:
diff changeset
761 _thread_blocked_trans = 11, // corresponding transition state
a61af66fc99e Initial load
duke
parents:
diff changeset
762 _thread_max_state = 12 // maximum thread state+1 - used for statistics allocation
a61af66fc99e Initial load
duke
parents:
diff changeset
763 };
a61af66fc99e Initial load
duke
parents:
diff changeset
764
a61af66fc99e Initial load
duke
parents:
diff changeset
765
a61af66fc99e Initial load
duke
parents:
diff changeset
766 // Handy constants for deciding which compiler mode to use.
a61af66fc99e Initial load
duke
parents:
diff changeset
767 enum MethodCompilation {
a61af66fc99e Initial load
duke
parents:
diff changeset
768 InvocationEntryBci = -1, // i.e., not a on-stack replacement compilation
a61af66fc99e Initial load
duke
parents:
diff changeset
769 InvalidOSREntryBci = -2
a61af66fc99e Initial load
duke
parents:
diff changeset
770 };
a61af66fc99e Initial load
duke
parents:
diff changeset
771
a61af66fc99e Initial load
duke
parents:
diff changeset
772 // Enumeration to distinguish tiers of compilation
a61af66fc99e Initial load
duke
parents:
diff changeset
773 enum CompLevel {
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
774 CompLevel_any = -1,
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
775 CompLevel_all = -1,
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
776 CompLevel_none = 0, // Interpreter
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
777 CompLevel_simple = 1, // C1
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
778 CompLevel_limited_profile = 2, // C1, invocation & backedge counters
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
779 CompLevel_full_profile = 3, // C1, invocation & backedge counters + mdo
2447
e863062e521d 7032458: Zero and Shark fixes
twisti
parents: 2361
diff changeset
780 CompLevel_full_optimization = 4, // C2 or Shark
0
a61af66fc99e Initial load
duke
parents:
diff changeset
781
2447
e863062e521d 7032458: Zero and Shark fixes
twisti
parents: 2361
diff changeset
782 #if defined(COMPILER2) || defined(SHARK)
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
783 CompLevel_highest_tier = CompLevel_full_optimization, // pure C2 and tiered
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
784 #elif defined(COMPILER1)
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
785 CompLevel_highest_tier = CompLevel_simple, // pure C1
0
a61af66fc99e Initial load
duke
parents:
diff changeset
786 #else
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
787 CompLevel_highest_tier = CompLevel_none,
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
788 #endif
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
789
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
790 #if defined(TIERED)
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
791 CompLevel_initial_compile = CompLevel_full_profile // tiered
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
792 #elif defined(COMPILER1)
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
793 CompLevel_initial_compile = CompLevel_simple // pure C1
2447
e863062e521d 7032458: Zero and Shark fixes
twisti
parents: 2361
diff changeset
794 #elif defined(COMPILER2) || defined(SHARK)
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
795 CompLevel_initial_compile = CompLevel_full_optimization // pure C2
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
796 #else
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
797 CompLevel_initial_compile = CompLevel_none
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
798 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
799 };
a61af66fc99e Initial load
duke
parents:
diff changeset
800
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
801 inline bool is_c1_compile(int comp_level) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
802 return comp_level > CompLevel_none && comp_level < CompLevel_full_optimization;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
803 }
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
804
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
805 inline bool is_c2_compile(int comp_level) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
806 return comp_level == CompLevel_full_optimization;
a61af66fc99e Initial load
duke
parents:
diff changeset
807 }
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
808
0
a61af66fc99e Initial load
duke
parents:
diff changeset
809 inline bool is_highest_tier_compile(int comp_level) {
a61af66fc99e Initial load
duke
parents:
diff changeset
810 return comp_level == CompLevel_highest_tier;
a61af66fc99e Initial load
duke
parents:
diff changeset
811 }
a61af66fc99e Initial load
duke
parents:
diff changeset
812
a61af66fc99e Initial load
duke
parents:
diff changeset
813 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
814 // 'Forward' declarations of frequently used classes
a61af66fc99e Initial load
duke
parents:
diff changeset
815 // (in order to reduce interface dependencies & reduce
a61af66fc99e Initial load
duke
parents:
diff changeset
816 // number of unnecessary compilations after changes)
a61af66fc99e Initial load
duke
parents:
diff changeset
817
a61af66fc99e Initial load
duke
parents:
diff changeset
818 class symbolTable;
a61af66fc99e Initial load
duke
parents:
diff changeset
819 class ClassFileStream;
a61af66fc99e Initial load
duke
parents:
diff changeset
820
a61af66fc99e Initial load
duke
parents:
diff changeset
821 class Event;
a61af66fc99e Initial load
duke
parents:
diff changeset
822
a61af66fc99e Initial load
duke
parents:
diff changeset
823 class Thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
824 class VMThread;
a61af66fc99e Initial load
duke
parents:
diff changeset
825 class JavaThread;
a61af66fc99e Initial load
duke
parents:
diff changeset
826 class Threads;
a61af66fc99e Initial load
duke
parents:
diff changeset
827
a61af66fc99e Initial load
duke
parents:
diff changeset
828 class VM_Operation;
a61af66fc99e Initial load
duke
parents:
diff changeset
829 class VMOperationQueue;
a61af66fc99e Initial load
duke
parents:
diff changeset
830
a61af66fc99e Initial load
duke
parents:
diff changeset
831 class CodeBlob;
a61af66fc99e Initial load
duke
parents:
diff changeset
832 class nmethod;
a61af66fc99e Initial load
duke
parents:
diff changeset
833 class OSRAdapter;
a61af66fc99e Initial load
duke
parents:
diff changeset
834 class I2CAdapter;
a61af66fc99e Initial load
duke
parents:
diff changeset
835 class C2IAdapter;
a61af66fc99e Initial load
duke
parents:
diff changeset
836 class CompiledIC;
a61af66fc99e Initial load
duke
parents:
diff changeset
837 class relocInfo;
a61af66fc99e Initial load
duke
parents:
diff changeset
838 class ScopeDesc;
a61af66fc99e Initial load
duke
parents:
diff changeset
839 class PcDesc;
a61af66fc99e Initial load
duke
parents:
diff changeset
840
a61af66fc99e Initial load
duke
parents:
diff changeset
841 class Recompiler;
a61af66fc99e Initial load
duke
parents:
diff changeset
842 class Recompilee;
a61af66fc99e Initial load
duke
parents:
diff changeset
843 class RecompilationPolicy;
a61af66fc99e Initial load
duke
parents:
diff changeset
844 class RFrame;
a61af66fc99e Initial load
duke
parents:
diff changeset
845 class CompiledRFrame;
a61af66fc99e Initial load
duke
parents:
diff changeset
846 class InterpretedRFrame;
a61af66fc99e Initial load
duke
parents:
diff changeset
847
a61af66fc99e Initial load
duke
parents:
diff changeset
848 class frame;
a61af66fc99e Initial load
duke
parents:
diff changeset
849
a61af66fc99e Initial load
duke
parents:
diff changeset
850 class vframe;
a61af66fc99e Initial load
duke
parents:
diff changeset
851 class javaVFrame;
a61af66fc99e Initial load
duke
parents:
diff changeset
852 class interpretedVFrame;
a61af66fc99e Initial load
duke
parents:
diff changeset
853 class compiledVFrame;
a61af66fc99e Initial load
duke
parents:
diff changeset
854 class deoptimizedVFrame;
a61af66fc99e Initial load
duke
parents:
diff changeset
855 class externalVFrame;
a61af66fc99e Initial load
duke
parents:
diff changeset
856 class entryVFrame;
a61af66fc99e Initial load
duke
parents:
diff changeset
857
a61af66fc99e Initial load
duke
parents:
diff changeset
858 class RegisterMap;
a61af66fc99e Initial load
duke
parents:
diff changeset
859
a61af66fc99e Initial load
duke
parents:
diff changeset
860 class Mutex;
a61af66fc99e Initial load
duke
parents:
diff changeset
861 class Monitor;
a61af66fc99e Initial load
duke
parents:
diff changeset
862 class BasicLock;
a61af66fc99e Initial load
duke
parents:
diff changeset
863 class BasicObjectLock;
a61af66fc99e Initial load
duke
parents:
diff changeset
864
a61af66fc99e Initial load
duke
parents:
diff changeset
865 class PeriodicTask;
a61af66fc99e Initial load
duke
parents:
diff changeset
866
a61af66fc99e Initial load
duke
parents:
diff changeset
867 class JavaCallWrapper;
a61af66fc99e Initial load
duke
parents:
diff changeset
868
a61af66fc99e Initial load
duke
parents:
diff changeset
869 class oopDesc;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6107
diff changeset
870 class metaDataOopDesc;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
871
a61af66fc99e Initial load
duke
parents:
diff changeset
872 class NativeCall;
a61af66fc99e Initial load
duke
parents:
diff changeset
873
a61af66fc99e Initial load
duke
parents:
diff changeset
874 class zone;
a61af66fc99e Initial load
duke
parents:
diff changeset
875
a61af66fc99e Initial load
duke
parents:
diff changeset
876 class StubQueue;
a61af66fc99e Initial load
duke
parents:
diff changeset
877
a61af66fc99e Initial load
duke
parents:
diff changeset
878 class outputStream;
a61af66fc99e Initial load
duke
parents:
diff changeset
879
a61af66fc99e Initial load
duke
parents:
diff changeset
880 class ResourceArea;
a61af66fc99e Initial load
duke
parents:
diff changeset
881
a61af66fc99e Initial load
duke
parents:
diff changeset
882 class DebugInformationRecorder;
a61af66fc99e Initial load
duke
parents:
diff changeset
883 class ScopeValue;
a61af66fc99e Initial load
duke
parents:
diff changeset
884 class CompressedStream;
a61af66fc99e Initial load
duke
parents:
diff changeset
885 class DebugInfoReadStream;
a61af66fc99e Initial load
duke
parents:
diff changeset
886 class DebugInfoWriteStream;
a61af66fc99e Initial load
duke
parents:
diff changeset
887 class LocationValue;
a61af66fc99e Initial load
duke
parents:
diff changeset
888 class ConstantValue;
a61af66fc99e Initial load
duke
parents:
diff changeset
889 class IllegalValue;
a61af66fc99e Initial load
duke
parents:
diff changeset
890
a61af66fc99e Initial load
duke
parents:
diff changeset
891 class PrivilegedElement;
a61af66fc99e Initial load
duke
parents:
diff changeset
892 class MonitorArray;
a61af66fc99e Initial load
duke
parents:
diff changeset
893
a61af66fc99e Initial load
duke
parents:
diff changeset
894 class MonitorInfo;
a61af66fc99e Initial load
duke
parents:
diff changeset
895
a61af66fc99e Initial load
duke
parents:
diff changeset
896 class OffsetClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
897 class OopMapCache;
a61af66fc99e Initial load
duke
parents:
diff changeset
898 class InterpreterOopMap;
a61af66fc99e Initial load
duke
parents:
diff changeset
899 class OopMapCacheEntry;
a61af66fc99e Initial load
duke
parents:
diff changeset
900 class OSThread;
a61af66fc99e Initial load
duke
parents:
diff changeset
901
a61af66fc99e Initial load
duke
parents:
diff changeset
902 typedef int (*OSThreadStartFunc)(void*);
a61af66fc99e Initial load
duke
parents:
diff changeset
903
a61af66fc99e Initial load
duke
parents:
diff changeset
904 class Space;
a61af66fc99e Initial load
duke
parents:
diff changeset
905
a61af66fc99e Initial load
duke
parents:
diff changeset
906 class JavaValue;
a61af66fc99e Initial load
duke
parents:
diff changeset
907 class methodHandle;
a61af66fc99e Initial load
duke
parents:
diff changeset
908 class JavaCallArguments;
a61af66fc99e Initial load
duke
parents:
diff changeset
909
a61af66fc99e Initial load
duke
parents:
diff changeset
910 // Basic support for errors (general debug facilities not defined at this point fo the include phase)
a61af66fc99e Initial load
duke
parents:
diff changeset
911
a61af66fc99e Initial load
duke
parents:
diff changeset
912 extern void basic_fatal(const char* msg);
a61af66fc99e Initial load
duke
parents:
diff changeset
913
a61af66fc99e Initial load
duke
parents:
diff changeset
914
a61af66fc99e Initial load
duke
parents:
diff changeset
915 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
916 // Special constants for debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
917
a61af66fc99e Initial load
duke
parents:
diff changeset
918 const jint badInt = -3; // generic "bad int" value
a61af66fc99e Initial load
duke
parents:
diff changeset
919 const long badAddressVal = -2; // generic "bad address" value
a61af66fc99e Initial load
duke
parents:
diff changeset
920 const long badOopVal = -1; // generic "bad oop" value
a61af66fc99e Initial load
duke
parents:
diff changeset
921 const intptr_t badHeapOopVal = (intptr_t) CONST64(0x2BAD4B0BBAADBABE); // value used to zap heap after GC
a61af66fc99e Initial load
duke
parents:
diff changeset
922 const int badHandleValue = 0xBC; // value used to zap vm handle area
a61af66fc99e Initial load
duke
parents:
diff changeset
923 const int badResourceValue = 0xAB; // value used to zap resource area
a61af66fc99e Initial load
duke
parents:
diff changeset
924 const int freeBlockPad = 0xBA; // value used to pad freed blocks.
a61af66fc99e Initial load
duke
parents:
diff changeset
925 const int uninitBlockPad = 0xF1; // value used to zap newly malloc'd blocks.
a61af66fc99e Initial load
duke
parents:
diff changeset
926 const intptr_t badJNIHandleVal = (intptr_t) CONST64(0xFEFEFEFEFEFEFEFE); // value used to zap jni handle area
a61af66fc99e Initial load
duke
parents:
diff changeset
927 const juint badHeapWordVal = 0xBAADBABE; // value used to zap heap after GC
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6107
diff changeset
928 const juint badMetaWordVal = 0xBAADFADE; // value used to zap metadata heap after GC
0
a61af66fc99e Initial load
duke
parents:
diff changeset
929 const int badCodeHeapNewVal= 0xCC; // value used to zap Code heap at allocation
a61af66fc99e Initial load
duke
parents:
diff changeset
930 const int badCodeHeapFreeVal = 0xDD; // value used to zap Code heap at deallocation
a61af66fc99e Initial load
duke
parents:
diff changeset
931
a61af66fc99e Initial load
duke
parents:
diff changeset
932
a61af66fc99e Initial load
duke
parents:
diff changeset
933 // (These must be implemented as #defines because C++ compilers are
a61af66fc99e Initial load
duke
parents:
diff changeset
934 // not obligated to inline non-integral constants!)
a61af66fc99e Initial load
duke
parents:
diff changeset
935 #define badAddress ((address)::badAddressVal)
a61af66fc99e Initial load
duke
parents:
diff changeset
936 #define badOop ((oop)::badOopVal)
a61af66fc99e Initial load
duke
parents:
diff changeset
937 #define badHeapWord (::badHeapWordVal)
a61af66fc99e Initial load
duke
parents:
diff changeset
938 #define badJNIHandle ((oop)::badJNIHandleVal)
a61af66fc99e Initial load
duke
parents:
diff changeset
939
1311
2a1472c30599 4396719: Mark Sweep stack overflow on deeply nested Object arrays
jcoomes
parents: 1261
diff changeset
940 // Default TaskQueue size is 16K (32-bit) or 128K (64-bit)
2a1472c30599 4396719: Mark Sweep stack overflow on deeply nested Object arrays
jcoomes
parents: 1261
diff changeset
941 #define TASKQUEUE_SIZE (NOT_LP64(1<<14) LP64_ONLY(1<<17))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
942
a61af66fc99e Initial load
duke
parents:
diff changeset
943 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
944 // Utility functions for bitfield manipulations
a61af66fc99e Initial load
duke
parents:
diff changeset
945
a61af66fc99e Initial load
duke
parents:
diff changeset
946 const intptr_t AllBits = ~0; // all bits set in a word
a61af66fc99e Initial load
duke
parents:
diff changeset
947 const intptr_t NoBits = 0; // no bits set in a word
a61af66fc99e Initial load
duke
parents:
diff changeset
948 const jlong NoLongBits = 0; // no bits set in a long
a61af66fc99e Initial load
duke
parents:
diff changeset
949 const intptr_t OneBit = 1; // only right_most bit set in a word
a61af66fc99e Initial load
duke
parents:
diff changeset
950
a61af66fc99e Initial load
duke
parents:
diff changeset
951 // get a word with the n.th or the right-most or left-most n bits set
a61af66fc99e Initial load
duke
parents:
diff changeset
952 // (note: #define used only so that they can be used in enum constant definitions)
a61af66fc99e Initial load
duke
parents:
diff changeset
953 #define nth_bit(n) (n >= BitsPerWord ? 0 : OneBit << (n))
a61af66fc99e Initial load
duke
parents:
diff changeset
954 #define right_n_bits(n) (nth_bit(n) - 1)
a61af66fc99e Initial load
duke
parents:
diff changeset
955 #define left_n_bits(n) (right_n_bits(n) << (n >= BitsPerWord ? 0 : (BitsPerWord - n)))
a61af66fc99e Initial load
duke
parents:
diff changeset
956
a61af66fc99e Initial load
duke
parents:
diff changeset
957 // bit-operations using a mask m
a61af66fc99e Initial load
duke
parents:
diff changeset
958 inline void set_bits (intptr_t& x, intptr_t m) { x |= m; }
a61af66fc99e Initial load
duke
parents:
diff changeset
959 inline void clear_bits (intptr_t& x, intptr_t m) { x &= ~m; }
a61af66fc99e Initial load
duke
parents:
diff changeset
960 inline intptr_t mask_bits (intptr_t x, intptr_t m) { return x & m; }
a61af66fc99e Initial load
duke
parents:
diff changeset
961 inline jlong mask_long_bits (jlong x, jlong m) { return x & m; }
a61af66fc99e Initial load
duke
parents:
diff changeset
962 inline bool mask_bits_are_true (intptr_t flags, intptr_t mask) { return (flags & mask) == mask; }
a61af66fc99e Initial load
duke
parents:
diff changeset
963
a61af66fc99e Initial load
duke
parents:
diff changeset
964 // bit-operations using the n.th bit
a61af66fc99e Initial load
duke
parents:
diff changeset
965 inline void set_nth_bit(intptr_t& x, int n) { set_bits (x, nth_bit(n)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
966 inline void clear_nth_bit(intptr_t& x, int n) { clear_bits(x, nth_bit(n)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
967 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
968
a61af66fc99e Initial load
duke
parents:
diff changeset
969 // returns the bitfield of x starting at start_bit_no with length field_length (no sign-extension!)
a61af66fc99e Initial load
duke
parents:
diff changeset
970 inline intptr_t bitfield(intptr_t x, int start_bit_no, int field_length) {
a61af66fc99e Initial load
duke
parents:
diff changeset
971 return mask_bits(x >> start_bit_no, right_n_bits(field_length));
a61af66fc99e Initial load
duke
parents:
diff changeset
972 }
a61af66fc99e Initial load
duke
parents:
diff changeset
973
a61af66fc99e Initial load
duke
parents:
diff changeset
974
a61af66fc99e Initial load
duke
parents:
diff changeset
975 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
976 // Utility functions for integers
a61af66fc99e Initial load
duke
parents:
diff changeset
977
a61af66fc99e Initial load
duke
parents:
diff changeset
978 // Avoid use of global min/max macros which may cause unwanted double
a61af66fc99e Initial load
duke
parents:
diff changeset
979 // evaluation of arguments.
a61af66fc99e Initial load
duke
parents:
diff changeset
980 #ifdef max
a61af66fc99e Initial load
duke
parents:
diff changeset
981 #undef max
a61af66fc99e Initial load
duke
parents:
diff changeset
982 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
983
a61af66fc99e Initial load
duke
parents:
diff changeset
984 #ifdef min
a61af66fc99e Initial load
duke
parents:
diff changeset
985 #undef min
a61af66fc99e Initial load
duke
parents:
diff changeset
986 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
987
a61af66fc99e Initial load
duke
parents:
diff changeset
988 #define max(a,b) Do_not_use_max_use_MAX2_instead
a61af66fc99e Initial load
duke
parents:
diff changeset
989 #define min(a,b) Do_not_use_min_use_MIN2_instead
a61af66fc99e Initial load
duke
parents:
diff changeset
990
a61af66fc99e Initial load
duke
parents:
diff changeset
991 // It is necessary to use templates here. Having normal overloaded
a61af66fc99e Initial load
duke
parents:
diff changeset
992 // functions does not work because it is necessary to provide both 32-
a61af66fc99e Initial load
duke
parents:
diff changeset
993 // and 64-bit overloaded functions, which does not work, and having
a61af66fc99e Initial load
duke
parents:
diff changeset
994 // explicitly-typed versions of these routines (i.e., MAX2I, MAX2L)
a61af66fc99e Initial load
duke
parents:
diff changeset
995 // will be even more error-prone than macros.
a61af66fc99e Initial load
duke
parents:
diff changeset
996 template<class T> inline T MAX2(T a, T b) { return (a > b) ? a : b; }
a61af66fc99e Initial load
duke
parents:
diff changeset
997 template<class T> inline T MIN2(T a, T b) { return (a < b) ? a : b; }
a61af66fc99e Initial load
duke
parents:
diff changeset
998 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
999 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
1000 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
1001 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
1002
a61af66fc99e Initial load
duke
parents:
diff changeset
1003 template<class T> inline T ABS(T x) { return (x > 0) ? x : -x; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1004
a61af66fc99e Initial load
duke
parents:
diff changeset
1005 // true if x is a power of 2, false otherwise
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 inline bool is_power_of_2(intptr_t x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1007 return ((x != NoBits) && (mask_bits(x, x - 1) == NoBits));
a61af66fc99e Initial load
duke
parents:
diff changeset
1008 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1009
a61af66fc99e Initial load
duke
parents:
diff changeset
1010 // long version of is_power_of_2
a61af66fc99e Initial load
duke
parents:
diff changeset
1011 inline bool is_power_of_2_long(jlong x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1012 return ((x != NoLongBits) && (mask_long_bits(x, x - 1) == NoLongBits));
a61af66fc99e Initial load
duke
parents:
diff changeset
1013 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1014
a61af66fc99e Initial load
duke
parents:
diff changeset
1015 //* largest i such that 2^i <= x
a61af66fc99e Initial load
duke
parents:
diff changeset
1016 // A negative value of 'x' will return '31'
a61af66fc99e Initial load
duke
parents:
diff changeset
1017 inline int log2_intptr(intptr_t x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1018 int i = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1019 uintptr_t p = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 while (p != 0 && p <= (uintptr_t)x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1021 // p = 2^(i+1) && p <= x (i.e., 2^(i+1) <= x)
a61af66fc99e Initial load
duke
parents:
diff changeset
1022 i++; p *= 2;
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1024 // p = 2^(i+1) && x < p (i.e., 2^i <= x < 2^(i+1))
605
98cb887364d3 6810672: Comment typos
twisti
parents: 570
diff changeset
1025 // (if p = 0 then overflow occurred and i = 31)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1026 return i;
a61af66fc99e Initial load
duke
parents:
diff changeset
1027 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1028
a61af66fc99e Initial load
duke
parents:
diff changeset
1029 //* largest i such that 2^i <= x
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 // A negative value of 'x' will return '63'
a61af66fc99e Initial load
duke
parents:
diff changeset
1031 inline int log2_long(jlong x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1032 int i = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1033 julong p = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1034 while (p != 0 && p <= (julong)x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1035 // p = 2^(i+1) && p <= x (i.e., 2^(i+1) <= x)
a61af66fc99e Initial load
duke
parents:
diff changeset
1036 i++; p *= 2;
a61af66fc99e Initial load
duke
parents:
diff changeset
1037 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1038 // p = 2^(i+1) && x < p (i.e., 2^i <= x < 2^(i+1))
605
98cb887364d3 6810672: Comment typos
twisti
parents: 570
diff changeset
1039 // (if p = 0 then overflow occurred and i = 63)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1040 return i;
a61af66fc99e Initial load
duke
parents:
diff changeset
1041 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1042
a61af66fc99e Initial load
duke
parents:
diff changeset
1043 //* the argument must be exactly a power of 2
a61af66fc99e Initial load
duke
parents:
diff changeset
1044 inline int exact_log2(intptr_t x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1045 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1046 if (!is_power_of_2(x)) basic_fatal("x must be a power of 2");
a61af66fc99e Initial load
duke
parents:
diff changeset
1047 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1048 return log2_intptr(x);
a61af66fc99e Initial load
duke
parents:
diff changeset
1049 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1050
568
30663ca5e8f4 6805724: ModLNode::Ideal() generates functionally incorrect graph when divisor is any (2^k-1) constant.
twisti
parents: 559
diff changeset
1051 //* the argument must be exactly a power of 2
30663ca5e8f4 6805724: ModLNode::Ideal() generates functionally incorrect graph when divisor is any (2^k-1) constant.
twisti
parents: 559
diff changeset
1052 inline int exact_log2_long(jlong x) {
30663ca5e8f4 6805724: ModLNode::Ideal() generates functionally incorrect graph when divisor is any (2^k-1) constant.
twisti
parents: 559
diff changeset
1053 #ifdef ASSERT
30663ca5e8f4 6805724: ModLNode::Ideal() generates functionally incorrect graph when divisor is any (2^k-1) constant.
twisti
parents: 559
diff changeset
1054 if (!is_power_of_2_long(x)) basic_fatal("x must be a power of 2");
30663ca5e8f4 6805724: ModLNode::Ideal() generates functionally incorrect graph when divisor is any (2^k-1) constant.
twisti
parents: 559
diff changeset
1055 #endif
30663ca5e8f4 6805724: ModLNode::Ideal() generates functionally incorrect graph when divisor is any (2^k-1) constant.
twisti
parents: 559
diff changeset
1056 return log2_long(x);
30663ca5e8f4 6805724: ModLNode::Ideal() generates functionally incorrect graph when divisor is any (2^k-1) constant.
twisti
parents: 559
diff changeset
1057 }
30663ca5e8f4 6805724: ModLNode::Ideal() generates functionally incorrect graph when divisor is any (2^k-1) constant.
twisti
parents: 559
diff changeset
1058
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1059
a61af66fc99e Initial load
duke
parents:
diff changeset
1060 // returns integer round-up to the nearest multiple of s (s must be a power of two)
a61af66fc99e Initial load
duke
parents:
diff changeset
1061 inline intptr_t round_to(intptr_t x, uintx s) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1062 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1063 if (!is_power_of_2(s)) basic_fatal("s must be a power of 2");
a61af66fc99e Initial load
duke
parents:
diff changeset
1064 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1065 const uintx m = s - 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1066 return mask_bits(x + m, ~m);
a61af66fc99e Initial load
duke
parents:
diff changeset
1067 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1068
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 // returns integer round-down to the nearest multiple of s (s must be a power of two)
a61af66fc99e Initial load
duke
parents:
diff changeset
1070 inline intptr_t round_down(intptr_t x, uintx s) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1071 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1072 if (!is_power_of_2(s)) basic_fatal("s must be a power of 2");
a61af66fc99e Initial load
duke
parents:
diff changeset
1073 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1074 const uintx m = s - 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1075 return mask_bits(x, ~m);
a61af66fc99e Initial load
duke
parents:
diff changeset
1076 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1077
a61af66fc99e Initial load
duke
parents:
diff changeset
1078
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 inline bool is_odd (intx x) { return x & 1; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 inline bool is_even(intx x) { return !is_odd(x); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1081
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 // "to" should be greater than "from."
a61af66fc99e Initial load
duke
parents:
diff changeset
1083 inline intx byte_size(void* from, void* to) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 return (address)to - (address)from;
a61af66fc99e Initial load
duke
parents:
diff changeset
1085 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1086
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 // Avoid non-portable casts with these routines (DEPRECATED)
a61af66fc99e Initial load
duke
parents:
diff changeset
1089
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 // NOTE: USE Bytes class INSTEAD WHERE POSSIBLE
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 // Bytes is optimized machine-specifically and may be much faster then the portable routines below.
a61af66fc99e Initial load
duke
parents:
diff changeset
1092
a61af66fc99e Initial load
duke
parents:
diff changeset
1093 // Given sequence of four bytes, build into a 32-bit word
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 // following the conventions used in class files.
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 // On the 386, this could be realized with a simple address cast.
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1097
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 // This routine takes eight bytes:
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 inline u8 build_u8_from( u1 c1, u1 c2, u1 c3, u1 c4, u1 c5, u1 c6, u1 c7, u1 c8 ) {
1789
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1783
diff changeset
1100 return (( u8(c1) << 56 ) & ( u8(0xff) << 56 ))
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1783
diff changeset
1101 | (( u8(c2) << 48 ) & ( u8(0xff) << 48 ))
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1783
diff changeset
1102 | (( u8(c3) << 40 ) & ( u8(0xff) << 40 ))
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1783
diff changeset
1103 | (( u8(c4) << 32 ) & ( u8(0xff) << 32 ))
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1783
diff changeset
1104 | (( u8(c5) << 24 ) & ( u8(0xff) << 24 ))
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1783
diff changeset
1105 | (( u8(c6) << 16 ) & ( u8(0xff) << 16 ))
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1783
diff changeset
1106 | (( u8(c7) << 8 ) & ( u8(0xff) << 8 ))
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1783
diff changeset
1107 | (( u8(c8) << 0 ) & ( u8(0xff) << 0 ));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1109
a61af66fc99e Initial load
duke
parents:
diff changeset
1110 // This routine takes four bytes:
a61af66fc99e Initial load
duke
parents:
diff changeset
1111 inline u4 build_u4_from( u1 c1, u1 c2, u1 c3, u1 c4 ) {
1789
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1783
diff changeset
1112 return (( u4(c1) << 24 ) & 0xff000000)
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1783
diff changeset
1113 | (( u4(c2) << 16 ) & 0x00ff0000)
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1783
diff changeset
1114 | (( u4(c3) << 8 ) & 0x0000ff00)
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1783
diff changeset
1115 | (( u4(c4) << 0 ) & 0x000000ff);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1117
a61af66fc99e Initial load
duke
parents:
diff changeset
1118 // And this one works if the four bytes are contiguous in memory:
a61af66fc99e Initial load
duke
parents:
diff changeset
1119 inline u4 build_u4_from( u1* p ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 return build_u4_from( p[0], p[1], p[2], p[3] );
a61af66fc99e Initial load
duke
parents:
diff changeset
1121 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1122
a61af66fc99e Initial load
duke
parents:
diff changeset
1123 // Ditto for two-byte ints:
a61af66fc99e Initial load
duke
parents:
diff changeset
1124 inline u2 build_u2_from( u1 c1, u1 c2 ) {
1789
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1783
diff changeset
1125 return u2((( u2(c1) << 8 ) & 0xff00)
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1783
diff changeset
1126 | (( u2(c2) << 0 ) & 0x00ff));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1127 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1128
a61af66fc99e Initial load
duke
parents:
diff changeset
1129 // And this one works if the two bytes are contiguous in memory:
a61af66fc99e Initial load
duke
parents:
diff changeset
1130 inline u2 build_u2_from( u1* p ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1131 return build_u2_from( p[0], p[1] );
a61af66fc99e Initial load
duke
parents:
diff changeset
1132 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1133
a61af66fc99e Initial load
duke
parents:
diff changeset
1134 // Ditto for floats:
a61af66fc99e Initial load
duke
parents:
diff changeset
1135 inline jfloat build_float_from( u1 c1, u1 c2, u1 c3, u1 c4 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1136 u4 u = build_u4_from( c1, c2, c3, c4 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1137 return *(jfloat*)&u;
a61af66fc99e Initial load
duke
parents:
diff changeset
1138 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1139
a61af66fc99e Initial load
duke
parents:
diff changeset
1140 inline jfloat build_float_from( u1* p ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1141 u4 u = build_u4_from( p );
a61af66fc99e Initial load
duke
parents:
diff changeset
1142 return *(jfloat*)&u;
a61af66fc99e Initial load
duke
parents:
diff changeset
1143 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1144
a61af66fc99e Initial load
duke
parents:
diff changeset
1145
a61af66fc99e Initial load
duke
parents:
diff changeset
1146 // now (64-bit) longs
a61af66fc99e Initial load
duke
parents:
diff changeset
1147
a61af66fc99e Initial load
duke
parents:
diff changeset
1148 inline jlong build_long_from( u1 c1, u1 c2, u1 c3, u1 c4, u1 c5, u1 c6, u1 c7, u1 c8 ) {
1789
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1783
diff changeset
1149 return (( jlong(c1) << 56 ) & ( jlong(0xff) << 56 ))
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1783
diff changeset
1150 | (( jlong(c2) << 48 ) & ( jlong(0xff) << 48 ))
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1783
diff changeset
1151 | (( jlong(c3) << 40 ) & ( jlong(0xff) << 40 ))
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1783
diff changeset
1152 | (( jlong(c4) << 32 ) & ( jlong(0xff) << 32 ))
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1783
diff changeset
1153 | (( jlong(c5) << 24 ) & ( jlong(0xff) << 24 ))
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1783
diff changeset
1154 | (( jlong(c6) << 16 ) & ( jlong(0xff) << 16 ))
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1783
diff changeset
1155 | (( jlong(c7) << 8 ) & ( jlong(0xff) << 8 ))
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1783
diff changeset
1156 | (( jlong(c8) << 0 ) & ( jlong(0xff) << 0 ));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1157 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1158
a61af66fc99e Initial load
duke
parents:
diff changeset
1159 inline jlong build_long_from( u1* p ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1160 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
1161 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1162
a61af66fc99e Initial load
duke
parents:
diff changeset
1163
a61af66fc99e Initial load
duke
parents:
diff changeset
1164 // Doubles, too!
a61af66fc99e Initial load
duke
parents:
diff changeset
1165 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
1166 jlong u = build_long_from( c1, c2, c3, c4, c5, c6, c7, c8 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1167 return *(jdouble*)&u;
a61af66fc99e Initial load
duke
parents:
diff changeset
1168 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1169
a61af66fc99e Initial load
duke
parents:
diff changeset
1170 inline jdouble build_double_from( u1* p ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1171 jlong u = build_long_from( p );
a61af66fc99e Initial load
duke
parents:
diff changeset
1172 return *(jdouble*)&u;
a61af66fc99e Initial load
duke
parents:
diff changeset
1173 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1174
a61af66fc99e Initial load
duke
parents:
diff changeset
1175
a61af66fc99e Initial load
duke
parents:
diff changeset
1176 // Portable routines to go the other way:
a61af66fc99e Initial load
duke
parents:
diff changeset
1177
a61af66fc99e Initial load
duke
parents:
diff changeset
1178 inline void explode_short_to( u2 x, u1& c1, u1& c2 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1179 c1 = u1(x >> 8);
a61af66fc99e Initial load
duke
parents:
diff changeset
1180 c2 = u1(x);
a61af66fc99e Initial load
duke
parents:
diff changeset
1181 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1182
a61af66fc99e Initial load
duke
parents:
diff changeset
1183 inline void explode_short_to( u2 x, u1* p ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1184 explode_short_to( x, p[0], p[1]);
a61af66fc99e Initial load
duke
parents:
diff changeset
1185 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1186
a61af66fc99e Initial load
duke
parents:
diff changeset
1187 inline void explode_int_to( u4 x, u1& c1, u1& c2, u1& c3, u1& c4 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1188 c1 = u1(x >> 24);
a61af66fc99e Initial load
duke
parents:
diff changeset
1189 c2 = u1(x >> 16);
a61af66fc99e Initial load
duke
parents:
diff changeset
1190 c3 = u1(x >> 8);
a61af66fc99e Initial load
duke
parents:
diff changeset
1191 c4 = u1(x);
a61af66fc99e Initial load
duke
parents:
diff changeset
1192 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1193
a61af66fc99e Initial load
duke
parents:
diff changeset
1194 inline void explode_int_to( u4 x, u1* p ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1195 explode_int_to( x, p[0], p[1], p[2], p[3]);
a61af66fc99e Initial load
duke
parents:
diff changeset
1196 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1197
a61af66fc99e Initial load
duke
parents:
diff changeset
1198
a61af66fc99e Initial load
duke
parents:
diff changeset
1199 // Pack and extract shorts to/from ints:
a61af66fc99e Initial load
duke
parents:
diff changeset
1200
a61af66fc99e Initial load
duke
parents:
diff changeset
1201 inline int extract_low_short_from_int(jint x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1202 return x & 0xffff;
a61af66fc99e Initial load
duke
parents:
diff changeset
1203 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1204
a61af66fc99e Initial load
duke
parents:
diff changeset
1205 inline int extract_high_short_from_int(jint x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1206 return (x >> 16) & 0xffff;
a61af66fc99e Initial load
duke
parents:
diff changeset
1207 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1208
a61af66fc99e Initial load
duke
parents:
diff changeset
1209 inline int build_int_from_shorts( jushort low, jushort high ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1210 return ((int)((unsigned int)high << 16) | (unsigned int)low);
a61af66fc99e Initial load
duke
parents:
diff changeset
1211 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1212
a61af66fc99e Initial load
duke
parents:
diff changeset
1213 // Printf-style formatters for fixed- and variable-width types as pointers and
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 2447
diff changeset
1214 // integers. These are derived from the definitions in inttypes.h. If the platform
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 2447
diff changeset
1215 // doesn't provide appropriate definitions, they should be provided in
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 2447
diff changeset
1216 // the compiler-specific definitions file (e.g., globalDefinitions_gcc.hpp)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1217
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2192
diff changeset
1218 #define BOOL_TO_STR(_b_) ((_b_) ? "true" : "false")
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 1972
diff changeset
1219
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1220 // Format 32-bit quantities.
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 2447
diff changeset
1221 #define INT32_FORMAT "%" PRId32
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 2447
diff changeset
1222 #define UINT32_FORMAT "%" PRIu32
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 2447
diff changeset
1223 #define INT32_FORMAT_W(width) "%" #width PRId32
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 2447
diff changeset
1224 #define UINT32_FORMAT_W(width) "%" #width PRIu32
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1225
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 2447
diff changeset
1226 #define PTR32_FORMAT "0x%08" PRIx32
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1227
a61af66fc99e Initial load
duke
parents:
diff changeset
1228 // Format 64-bit quantities.
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 2447
diff changeset
1229 #define INT64_FORMAT "%" PRId64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 2447
diff changeset
1230 #define UINT64_FORMAT "%" PRIu64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 2447
diff changeset
1231 #define INT64_FORMAT_W(width) "%" #width PRId64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 2447
diff changeset
1232 #define UINT64_FORMAT_W(width) "%" #width PRIu64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1233
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 2447
diff changeset
1234 #define PTR64_FORMAT "0x%016" PRIx64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1235
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 2447
diff changeset
1236 // Format pointers which change size between 32- and 64-bit.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1237 #ifdef _LP64
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 2447
diff changeset
1238 #define INTPTR_FORMAT "0x%016" PRIxPTR
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 2447
diff changeset
1239 #define PTR_FORMAT "0x%016" PRIxPTR
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1240 #else // !_LP64
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 2447
diff changeset
1241 #define INTPTR_FORMAT "0x%08" PRIxPTR
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 2447
diff changeset
1242 #define PTR_FORMAT "0x%08" PRIxPTR
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1243 #endif // _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
1244
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 2447
diff changeset
1245 #define SSIZE_FORMAT "%" PRIdPTR
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 2447
diff changeset
1246 #define SIZE_FORMAT "%" PRIuPTR
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 2447
diff changeset
1247 #define SSIZE_FORMAT_W(width) "%" #width PRIdPTR
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 2447
diff changeset
1248 #define SIZE_FORMAT_W(width) "%" #width PRIuPTR
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 2447
diff changeset
1249
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 2447
diff changeset
1250 #define INTX_FORMAT "%" PRIdPTR
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 2447
diff changeset
1251 #define UINTX_FORMAT "%" PRIuPTR
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 2447
diff changeset
1252 #define INTX_FORMAT_W(width) "%" #width PRIdPTR
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 2447
diff changeset
1253 #define UINTX_FORMAT_W(width) "%" #width PRIuPTR
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 2447
diff changeset
1254
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1255
a61af66fc99e Initial load
duke
parents:
diff changeset
1256 // Enable zap-a-lot if in debug version.
a61af66fc99e Initial load
duke
parents:
diff changeset
1257
a61af66fc99e Initial load
duke
parents:
diff changeset
1258 # ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1259 # ifdef COMPILER2
a61af66fc99e Initial load
duke
parents:
diff changeset
1260 # define ENABLE_ZAP_DEAD_LOCALS
a61af66fc99e Initial load
duke
parents:
diff changeset
1261 #endif /* COMPILER2 */
a61af66fc99e Initial load
duke
parents:
diff changeset
1262 # endif /* ASSERT */
a61af66fc99e Initial load
duke
parents:
diff changeset
1263
a61af66fc99e Initial load
duke
parents:
diff changeset
1264 #define ARRAY_SIZE(array) (sizeof(array)/sizeof((array)[0]))
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
1265
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
1266 #endif // SHARE_VM_UTILITIES_GLOBALDEFINITIONS_HPP