annotate src/share/vm/oops/methodCounters.hpp @ 10185:d50cc62e94ff

8012715: G1: GraphKit accesses PtrQueue::_index as int but is size_t Summary: In graphKit INT operations were generated to access PtrQueue::_index which has type size_t. This is 64 bit on 64-bit machines. No problems occur on little endian machines as long as the index fits into 32 bit, but on big endian machines the upper part is read, which is zero. This leads to unnecessary branches to the slow path in the runtime. Reviewed-by: twisti, johnc Contributed-by: Martin Doerr <martin.doerr@sap.com>
author johnc
date Wed, 24 Apr 2013 14:48:43 -0700
parents aeaca88565e6
children 836a62f43af9 631667807de7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10105
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
1 /*
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
2 * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
4 *
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
7 * published by the Free Software Foundation.
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
8 *
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
13 * accompanied this code).
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
14 *
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
18 *
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
21 * questions.
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
22 *
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
23 */
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
24
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
25 #ifndef SHARE_VM_OOPS_METHODCOUNTERS_HPP
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
26 #define SHARE_VM_OOPS_METHODCOUNTERS_HPP
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
27
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
28 #include "oops/metadata.hpp"
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
29 #include "interpreter/invocationCounter.hpp"
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
30
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
31 class MethodCounters: public MetaspaceObj {
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
32 friend class VMStructs;
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
33 private:
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
34 int _interpreter_invocation_count; // Count of times invoked (reused as prev_event_count in tiered)
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
35 u2 _interpreter_throwout_count; // Count of times method was exited via exception while interpreting
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
36 u2 _number_of_breakpoints; // fullspeed debugging support
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
37 InvocationCounter _invocation_counter; // Incremented before each activation of the method - used to trigger frequency-based optimizations
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
38 InvocationCounter _backedge_counter; // Incremented before each backedge taken - used to trigger frequencey-based optimizations
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
39
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
40 #ifdef TIERED
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
41 float _rate; // Events (invocation and backedge counter increments) per millisecond
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
42 jlong _prev_time; // Previous time the rate was acquired
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
43 #endif
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
44
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
45 MethodCounters() : _interpreter_invocation_count(0),
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
46 _interpreter_throwout_count(0),
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
47 _number_of_breakpoints(0)
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
48 #ifdef TIERED
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
49 , _rate(0),
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
50 _prev_time(0)
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
51 #endif
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
52 {
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
53 invocation_counter()->init();
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
54 backedge_counter()->init();
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
55 }
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
56
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
57 public:
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
58 static MethodCounters* allocate(ClassLoaderData* loader_data, TRAPS);
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
59
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
60 void deallocate_contents(ClassLoaderData* loader_data) {}
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
61 DEBUG_ONLY(bool on_stack() { return false; }) // for template
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
62
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
63 static int size() { return sizeof(MethodCounters) / wordSize; }
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
64
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
65 bool is_klass() const { return false; }
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
66
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
67 void clear_counters();
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
68
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
69 int interpreter_invocation_count() {
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
70 return _interpreter_invocation_count;
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
71 }
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
72 void set_interpreter_invocation_count(int count) {
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
73 _interpreter_invocation_count = count;
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
74 }
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
75 int increment_interpreter_invocation_count() {
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
76 return ++_interpreter_invocation_count;
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
77 }
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
78
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
79 void interpreter_throwout_increment() {
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
80 if (_interpreter_throwout_count < 65534) {
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
81 _interpreter_throwout_count++;
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
82 }
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
83 }
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
84 int interpreter_throwout_count() const {
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
85 return _interpreter_throwout_count;
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
86 }
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
87 void set_interpreter_throwout_count(int count) {
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
88 _interpreter_throwout_count = count;
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
89 }
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
90
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
91 u2 number_of_breakpoints() const { return _number_of_breakpoints; }
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
92 void incr_number_of_breakpoints() { ++_number_of_breakpoints; }
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
93 void decr_number_of_breakpoints() { --_number_of_breakpoints; }
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
94 void clear_number_of_breakpoints() { _number_of_breakpoints = 0; }
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
95
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
96 #ifdef TIERED
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
97 jlong prev_time() const { return _prev_time; }
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
98 void set_prev_time(jlong time) { _prev_time = time; }
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
99 float rate() const { return _rate; }
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
100 void set_rate(float rate) { _rate = rate; }
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
101 #endif
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
102
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
103 // invocation counter
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
104 InvocationCounter* invocation_counter() { return &_invocation_counter; }
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
105 InvocationCounter* backedge_counter() { return &_backedge_counter; }
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
106
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
107 static ByteSize interpreter_invocation_counter_offset() {
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
108 return byte_offset_of(MethodCounters, _interpreter_invocation_count);
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
109 }
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
110
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
111 static ByteSize invocation_counter_offset() {
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
112 return byte_offset_of(MethodCounters, _invocation_counter);
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
113 }
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
114
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
115 static ByteSize backedge_counter_offset() {
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
116 return byte_offset_of(MethodCounters, _backedge_counter);
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
117 }
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
118
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
119 static int interpreter_invocation_counter_offset_in_bytes() {
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
120 return offset_of(MethodCounters, _interpreter_invocation_count);
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
121 }
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
122
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
123 };
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents:
diff changeset
124 #endif //SHARE_VM_OOPS_METHODCOUNTERS_HPP