annotate src/share/vm/shark/sharkCacheDecache.cpp @ 1941:79d04223b8a5

Added caching for resolved types and resolved fields. This is crucial, because the local load elimination will lead to wrong results, if field equality (of two RiField objects with the same object and the same RiType) is not given. The caching makes sure that the default equals implementation is sufficient.
author Thomas Wuerthinger <wuerthinger@ssw.jku.at>
date Tue, 28 Dec 2010 18:33:26 +0100
parents d2ede61b7a12
children f95d63e2154a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1 /*
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
2 * Copyright (c) 1999, 2007, Oracle and/or its affiliates. All rights reserved.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
3 * Copyright 2008, 2009 Red Hat, Inc.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
5 *
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
6 * This code is free software; you can redistribute it and/or modify it
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
7 * under the terms of the GNU General Public License version 2 only, as
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
8 * published by the Free Software Foundation.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
9 *
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
10 * This code is distributed in the hope that it will be useful, but WITHOUT
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
13 * version 2 for more details (a copy is included in the LICENSE file that
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
14 * accompanied this code).
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
15 *
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
16 * You should have received a copy of the GNU General Public License version
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
17 * 2 along with this work; if not, write to the Free Software Foundation,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
19 *
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
21 * or visit www.oracle.com if you need additional information or have any
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
22 * questions.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
23 *
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
24 */
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
25
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
26 #include "incls/_precompiled.incl"
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
27 #include "incls/_sharkCacheDecache.cpp.incl"
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
28
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
29 using namespace llvm;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
30
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
31 void SharkDecacher::start_frame() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
32 // Start recording the debug information
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
33 _pc_offset = code_buffer()->create_unique_offset();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
34 _oopmap = new OopMap(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
35 oopmap_slot_munge(stack()->oopmap_frame_size()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
36 oopmap_slot_munge(arg_size()));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
37 debug_info()->add_safepoint(pc_offset(), oopmap());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
38 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
39
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
40 void SharkDecacher::start_stack(int stack_depth) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
41 // Create the array we'll record our stack slots in
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
42 _exparray = new GrowableArray<ScopeValue*>(stack_depth);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
43
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
44 // Set the stack pointer
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
45 stack()->CreateStoreStackPointer(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
46 builder()->CreatePtrToInt(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
47 stack()->slot_addr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
48 stack()->stack_slots_offset() + max_stack() - stack_depth),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
49 SharkType::intptr_type()));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
50 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
51
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
52 void SharkDecacher::process_stack_slot(int index,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
53 SharkValue** addr,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
54 int offset) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
55 SharkValue *value = *addr;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
56
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
57 // Write the value to the frame if necessary
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
58 if (stack_slot_needs_write(index, value)) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
59 write_value_to_frame(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
60 SharkType::to_stackType(value->basic_type()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
61 value->generic_value(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
62 adjusted_offset(value, offset));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
63 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
64
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
65 // Record the value in the oopmap if necessary
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
66 if (stack_slot_needs_oopmap(index, value)) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
67 oopmap()->set_oop(slot2reg(offset));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
68 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
69
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
70 // Record the value in the debuginfo if necessary
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
71 if (stack_slot_needs_debuginfo(index, value)) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
72 exparray()->append(slot2lv(offset, stack_location_type(index, addr)));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
73 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
74 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
75
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
76 void SharkDecacher::start_monitors(int num_monitors) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
77 // Create the array we'll record our monitors in
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
78 _monarray = new GrowableArray<MonitorValue*>(num_monitors);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
79 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
80
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
81 void SharkDecacher::process_monitor(int index, int box_offset, int obj_offset) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
82 oopmap()->set_oop(slot2reg(obj_offset));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
83
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
84 monarray()->append(new MonitorValue(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
85 slot2lv (obj_offset, Location::oop),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
86 slot2loc(box_offset, Location::normal)));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
87 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
88
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
89 void SharkDecacher::process_oop_tmp_slot(Value** value, int offset) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
90 // Decache the temporary oop slot
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
91 if (*value) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
92 write_value_to_frame(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
93 SharkType::oop_type(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
94 *value,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
95 offset);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
96
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
97 oopmap()->set_oop(slot2reg(offset));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
98 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
99 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
100
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
101 void SharkDecacher::process_method_slot(Value** value, int offset) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
102 // Decache the method pointer
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
103 write_value_to_frame(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
104 SharkType::methodOop_type(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
105 *value,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
106 offset);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
107
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
108 oopmap()->set_oop(slot2reg(offset));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
109 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
110
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
111 void SharkDecacher::process_pc_slot(int offset) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
112 // Record the PC
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
113 builder()->CreateStore(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
114 builder()->code_buffer_address(pc_offset()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
115 stack()->slot_addr(offset));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
116 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
117
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
118 void SharkDecacher::start_locals() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
119 // Create the array we'll record our local variables in
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
120 _locarray = new GrowableArray<ScopeValue*>(max_locals());}
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
121
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
122 void SharkDecacher::process_local_slot(int index,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
123 SharkValue** addr,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
124 int offset) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
125 SharkValue *value = *addr;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
126
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
127 // Write the value to the frame if necessary
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
128 if (local_slot_needs_write(index, value)) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
129 write_value_to_frame(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
130 SharkType::to_stackType(value->basic_type()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
131 value->generic_value(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
132 adjusted_offset(value, offset));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
133 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
134
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
135 // Record the value in the oopmap if necessary
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
136 if (local_slot_needs_oopmap(index, value)) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
137 oopmap()->set_oop(slot2reg(offset));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
138 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
139
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
140 // Record the value in the debuginfo if necessary
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
141 if (local_slot_needs_debuginfo(index, value)) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
142 locarray()->append(slot2lv(offset, local_location_type(index, addr)));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
143 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
144 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
145
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
146 void SharkDecacher::end_frame() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
147 // Record the scope
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
148 debug_info()->describe_scope(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
149 pc_offset(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
150 target(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
151 bci(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
152 true,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
153 false,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
154 false,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
155 debug_info()->create_scope_values(locarray()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
156 debug_info()->create_scope_values(exparray()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
157 debug_info()->create_monitor_values(monarray()));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
158
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
159 // Finish recording the debug information
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
160 debug_info()->end_safepoint(pc_offset());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
161 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
162
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
163 void SharkCacher::process_stack_slot(int index,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
164 SharkValue** addr,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
165 int offset) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
166 SharkValue *value = *addr;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
167
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
168 // Read the value from the frame if necessary
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
169 if (stack_slot_needs_read(index, value)) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
170 *addr = SharkValue::create_generic(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
171 value->type(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
172 read_value_from_frame(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
173 SharkType::to_stackType(value->basic_type()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
174 adjusted_offset(value, offset)),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
175 value->zero_checked());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
176 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
177 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
178
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
179 void SharkOSREntryCacher::process_monitor(int index,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
180 int box_offset,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
181 int obj_offset) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
182 // Copy the monitor from the OSR buffer to the frame
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
183 int src_offset = max_locals() + index * 2;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
184 builder()->CreateStore(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
185 builder()->CreateLoad(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
186 CreateAddressOfOSRBufEntry(src_offset, SharkType::intptr_type())),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
187 stack()->slot_addr(box_offset, SharkType::intptr_type()));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
188 builder()->CreateStore(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
189 builder()->CreateLoad(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
190 CreateAddressOfOSRBufEntry(src_offset + 1, SharkType::oop_type())),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
191 stack()->slot_addr(obj_offset, SharkType::oop_type()));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
192 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
193
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
194 void SharkCacher::process_oop_tmp_slot(Value** value, int offset) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
195 // Cache the temporary oop
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
196 if (*value)
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
197 *value = read_value_from_frame(SharkType::oop_type(), offset);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
198 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
199
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
200 void SharkCacher::process_method_slot(Value** value, int offset) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
201 // Cache the method pointer
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
202 *value = read_value_from_frame(SharkType::methodOop_type(), offset);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
203 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
204
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
205 void SharkFunctionEntryCacher::process_method_slot(Value** value, int offset) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
206 // "Cache" the method pointer
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
207 *value = method();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
208 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
209
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
210 void SharkCacher::process_local_slot(int index,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
211 SharkValue** addr,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
212 int offset) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
213 SharkValue *value = *addr;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
214
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
215 // Read the value from the frame if necessary
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
216 if (local_slot_needs_read(index, value)) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
217 *addr = SharkValue::create_generic(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
218 value->type(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
219 read_value_from_frame(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
220 SharkType::to_stackType(value->basic_type()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
221 adjusted_offset(value, offset)),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
222 value->zero_checked());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
223 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
224 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
225
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
226 Value* SharkOSREntryCacher::CreateAddressOfOSRBufEntry(int offset,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
227 const Type* type) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
228 Value *result = builder()->CreateStructGEP(osr_buf(), offset);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
229 if (type != SharkType::intptr_type())
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
230 result = builder()->CreateBitCast(result, PointerType::getUnqual(type));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
231 return result;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
232 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
233
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
234 void SharkOSREntryCacher::process_local_slot(int index,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
235 SharkValue** addr,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
236 int offset) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
237 SharkValue *value = *addr;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
238
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
239 // Read the value from the OSR buffer if necessary
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
240 if (local_slot_needs_read(index, value)) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
241 *addr = SharkValue::create_generic(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
242 value->type(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
243 builder()->CreateLoad(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
244 CreateAddressOfOSRBufEntry(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
245 adjusted_offset(value, max_locals() - 1 - index),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
246 SharkType::to_stackType(value->basic_type()))),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
247 value->zero_checked());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
248 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
249 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
250
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
251 void SharkDecacher::write_value_to_frame(const Type* type,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
252 Value* value,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
253 int offset) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
254 builder()->CreateStore(value, stack()->slot_addr(offset, type));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
255 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
256
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
257 Value* SharkCacher::read_value_from_frame(const Type* type, int offset) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
258 return builder()->CreateLoad(stack()->slot_addr(offset, type));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
259 }