annotate src/share/vm/shark/sharkCacheDecache.cpp @ 5763:a3d71693e0ce

removed bytecode disassembly from CodeCacheRuntime into separate BytecodeDisassembler class removed VM call for doing bytecode disassembly added support for explicitly excluding classes from JaCoCo (put '// JaCoCo Exclude' somewhere in the source file) added node intrinsics to MaterializeNode added snippets for the UnsignedMath classes each file opened by CFGPrinter now includes a unique id in its name to avoid a race of multiple threads writing to the same file the IdealGraphPrinter uses the new BytecodeDisassembler mechanism teh UnsignedMath class is exclude from JaCoCo processing as it is used in snippets
author Doug Simon <doug.simon@oracle.com>
date Wed, 04 Jul 2012 21:57:49 +0200
parents e1a03c81cef0
children e522a00b91aa
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 /*
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
2 * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
1692
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
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
26 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
27 #include "ci/ciMethod.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
28 #include "code/debugInfoRec.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
29 #include "shark/llvmValue.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
30 #include "shark/sharkBuilder.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
31 #include "shark/sharkCacheDecache.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
32 #include "shark/sharkFunction.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
33 #include "shark/sharkState.hpp"
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
34
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
35 using namespace llvm;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
36
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
37 void SharkDecacher::start_frame() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
38 // Start recording the debug information
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
39 _pc_offset = code_buffer()->create_unique_offset();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
40 _oopmap = new OopMap(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
41 oopmap_slot_munge(stack()->oopmap_frame_size()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
42 oopmap_slot_munge(arg_size()));
5132
e1a03c81cef0 another fix for non-graal builds
Lukas Stadler <lukas.stadler@jku.at>
parents: 4583
diff changeset
43 debug_info()->add_safepoint(pc_offset(), -1, oopmap());
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
44 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
45
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
46 void SharkDecacher::start_stack(int stack_depth) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
47 // Create the array we'll record our stack slots in
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
48 _exparray = new GrowableArray<ScopeValue*>(stack_depth);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
49
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
50 // Set the stack pointer
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
51 stack()->CreateStoreStackPointer(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
52 builder()->CreatePtrToInt(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
53 stack()->slot_addr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
54 stack()->stack_slots_offset() + max_stack() - stack_depth),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
55 SharkType::intptr_type()));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
56 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
57
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
58 void SharkDecacher::process_stack_slot(int index,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
59 SharkValue** addr,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
60 int offset) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
61 SharkValue *value = *addr;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
62
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
63 // Write the value to the frame if necessary
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
64 if (stack_slot_needs_write(index, value)) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
65 write_value_to_frame(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
66 SharkType::to_stackType(value->basic_type()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
67 value->generic_value(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
68 adjusted_offset(value, offset));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
69 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
70
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
71 // Record the value in the oopmap if necessary
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
72 if (stack_slot_needs_oopmap(index, value)) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
73 oopmap()->set_oop(slot2reg(offset));
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 // Record the value in the debuginfo if necessary
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
77 if (stack_slot_needs_debuginfo(index, value)) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
78 exparray()->append(slot2lv(offset, stack_location_type(index, addr)));
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
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
82 void SharkDecacher::start_monitors(int num_monitors) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
83 // Create the array we'll record our monitors in
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
84 _monarray = new GrowableArray<MonitorValue*>(num_monitors);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
85 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
86
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
87 void SharkDecacher::process_monitor(int index, int box_offset, int obj_offset) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
88 oopmap()->set_oop(slot2reg(obj_offset));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
89
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
90 monarray()->append(new MonitorValue(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
91 slot2lv (obj_offset, Location::oop),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
92 slot2loc(box_offset, Location::normal)));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
93 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
94
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
95 void SharkDecacher::process_oop_tmp_slot(Value** value, int offset) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
96 // Decache the temporary oop slot
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
97 if (*value) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
98 write_value_to_frame(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
99 SharkType::oop_type(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
100 *value,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
101 offset);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
102
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
103 oopmap()->set_oop(slot2reg(offset));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
104 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
105 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
106
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
107 void SharkDecacher::process_method_slot(Value** value, int offset) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
108 // Decache the method pointer
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
109 write_value_to_frame(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
110 SharkType::methodOop_type(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
111 *value,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
112 offset);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
113
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
114 oopmap()->set_oop(slot2reg(offset));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
115 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
116
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
117 void SharkDecacher::process_pc_slot(int offset) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
118 // Record the PC
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
119 builder()->CreateStore(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
120 builder()->code_buffer_address(pc_offset()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
121 stack()->slot_addr(offset));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
122 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
123
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
124 void SharkDecacher::start_locals() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
125 // Create the array we'll record our local variables in
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
126 _locarray = new GrowableArray<ScopeValue*>(max_locals());}
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
127
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
128 void SharkDecacher::process_local_slot(int index,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
129 SharkValue** addr,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
130 int offset) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
131 SharkValue *value = *addr;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
132
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
133 // Write the value to the frame if necessary
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
134 if (local_slot_needs_write(index, value)) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
135 write_value_to_frame(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
136 SharkType::to_stackType(value->basic_type()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
137 value->generic_value(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
138 adjusted_offset(value, offset));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
139 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
140
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
141 // Record the value in the oopmap if necessary
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
142 if (local_slot_needs_oopmap(index, value)) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
143 oopmap()->set_oop(slot2reg(offset));
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 // Record the value in the debuginfo if necessary
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
147 if (local_slot_needs_debuginfo(index, value)) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
148 locarray()->append(slot2lv(offset, local_location_type(index, addr)));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
149 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
150 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
151
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
152 void SharkDecacher::end_frame() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
153 // Record the scope
4583
597bc897257d Made DebugInformationRecorder::describe_scope() take both a methodHandle _and_ a ciMethod* parameter to avoid creating handles in scopes where it is not allowed.
Doug Simon <doug.simon@oracle.com>
parents: 1972
diff changeset
154 methodHandle null_mh;
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
155 debug_info()->describe_scope(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
156 pc_offset(),
4583
597bc897257d Made DebugInformationRecorder::describe_scope() take both a methodHandle _and_ a ciMethod* parameter to avoid creating handles in scopes where it is not allowed.
Doug Simon <doug.simon@oracle.com>
parents: 1972
diff changeset
157 null_mh,
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
158 target(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
159 bci(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
160 true,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
161 false,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
162 false,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
163 debug_info()->create_scope_values(locarray()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
164 debug_info()->create_scope_values(exparray()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
165 debug_info()->create_monitor_values(monarray()));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
166
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
167 // Finish recording the debug information
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
168 debug_info()->end_safepoint(pc_offset());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
169 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
170
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
171 void SharkCacher::process_stack_slot(int index,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
172 SharkValue** addr,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
173 int offset) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
174 SharkValue *value = *addr;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
175
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
176 // Read the value from the frame if necessary
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
177 if (stack_slot_needs_read(index, value)) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
178 *addr = SharkValue::create_generic(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
179 value->type(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
180 read_value_from_frame(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
181 SharkType::to_stackType(value->basic_type()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
182 adjusted_offset(value, offset)),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
183 value->zero_checked());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
184 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
185 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
186
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
187 void SharkOSREntryCacher::process_monitor(int index,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
188 int box_offset,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
189 int obj_offset) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
190 // Copy the monitor from the OSR buffer to the frame
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
191 int src_offset = max_locals() + index * 2;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
192 builder()->CreateStore(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
193 builder()->CreateLoad(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
194 CreateAddressOfOSRBufEntry(src_offset, SharkType::intptr_type())),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
195 stack()->slot_addr(box_offset, SharkType::intptr_type()));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
196 builder()->CreateStore(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
197 builder()->CreateLoad(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
198 CreateAddressOfOSRBufEntry(src_offset + 1, SharkType::oop_type())),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
199 stack()->slot_addr(obj_offset, SharkType::oop_type()));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
200 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
201
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
202 void SharkCacher::process_oop_tmp_slot(Value** value, int offset) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
203 // Cache the temporary oop
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
204 if (*value)
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
205 *value = read_value_from_frame(SharkType::oop_type(), offset);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
206 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
207
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
208 void SharkCacher::process_method_slot(Value** value, int offset) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
209 // Cache the method pointer
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
210 *value = read_value_from_frame(SharkType::methodOop_type(), offset);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
211 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
212
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
213 void SharkFunctionEntryCacher::process_method_slot(Value** value, int offset) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
214 // "Cache" the method pointer
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
215 *value = method();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
216 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
217
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
218 void SharkCacher::process_local_slot(int index,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
219 SharkValue** addr,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
220 int offset) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
221 SharkValue *value = *addr;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
222
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
223 // Read the value from the frame if necessary
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
224 if (local_slot_needs_read(index, value)) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
225 *addr = SharkValue::create_generic(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
226 value->type(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
227 read_value_from_frame(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
228 SharkType::to_stackType(value->basic_type()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
229 adjusted_offset(value, offset)),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
230 value->zero_checked());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
231 }
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 Value* SharkOSREntryCacher::CreateAddressOfOSRBufEntry(int offset,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
235 const Type* type) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
236 Value *result = builder()->CreateStructGEP(osr_buf(), offset);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
237 if (type != SharkType::intptr_type())
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
238 result = builder()->CreateBitCast(result, PointerType::getUnqual(type));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
239 return result;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
240 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
241
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
242 void SharkOSREntryCacher::process_local_slot(int index,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
243 SharkValue** addr,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
244 int offset) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
245 SharkValue *value = *addr;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
246
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
247 // Read the value from the OSR buffer if necessary
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
248 if (local_slot_needs_read(index, value)) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
249 *addr = SharkValue::create_generic(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
250 value->type(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
251 builder()->CreateLoad(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
252 CreateAddressOfOSRBufEntry(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
253 adjusted_offset(value, max_locals() - 1 - index),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
254 SharkType::to_stackType(value->basic_type()))),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
255 value->zero_checked());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
256 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
257 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
258
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
259 void SharkDecacher::write_value_to_frame(const Type* type,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
260 Value* value,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
261 int offset) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
262 builder()->CreateStore(value, stack()->slot_addr(offset, type));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
263 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
264
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
265 Value* SharkCacher::read_value_from_frame(const Type* type, int offset) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
266 return builder()->CreateLoad(stack()->slot_addr(offset, type));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
267 }