annotate src/share/vm/shark/sharkTopLevelBlock.hpp @ 7212:291ffc492eb6

Merge with http://hg.openjdk.java.net/hsx/hsx25/hotspot/
author Doug Simon <doug.simon@oracle.com>
date Fri, 14 Dec 2012 14:35:13 +0100
parents 2cd5e15048e6
children
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, 2010 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 #ifndef SHARE_VM_SHARK_SHARKTOPLEVELBLOCK_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
27 #define SHARE_VM_SHARK_SHARKTOPLEVELBLOCK_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
28
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
29 #include "ci/ciStreams.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
30 #include "ci/ciType.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
31 #include "ci/ciTypeFlow.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
32 #include "interpreter/bytecodes.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
33 #include "memory/allocation.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
34 #include "shark/llvmHeaders.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
35 #include "shark/sharkBlock.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
36 #include "shark/sharkBuilder.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
37 #include "shark/sharkFunction.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
38 #include "shark/sharkState.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
39 #include "shark/sharkValue.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
40
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
41 class SharkTopLevelBlock : public SharkBlock {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
42 public:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
43 SharkTopLevelBlock(SharkFunction* function, ciTypeFlow::Block* ciblock)
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
44 : SharkBlock(function),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
45 _function(function),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
46 _ciblock(ciblock),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
47 _entered(false),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
48 _has_trap(false),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
49 _needs_phis(false),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
50 _entry_state(NULL),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
51 _entry_block(NULL) {}
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
52
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
53 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
54 SharkFunction* _function;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
55 ciTypeFlow::Block* _ciblock;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
56
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
57 public:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
58 SharkFunction* function() const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
59 return _function;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
60 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
61 ciTypeFlow::Block* ciblock() const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
62 return _ciblock;
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 // Function properties
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
66 public:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
67 SharkStack* stack() const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
68 return function()->stack();
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 // Typeflow properties
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
72 public:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
73 int index() const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
74 return ciblock()->pre_order();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
75 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
76 bool is_backedge_copy() const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
77 return ciblock()->is_backedge_copy();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
78 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
79 int stack_depth_at_entry() const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
80 return ciblock()->stack_size();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
81 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
82 ciType* local_type_at_entry(int index) const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
83 return ciblock()->local_type_at(index);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
84 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
85 ciType* stack_type_at_entry(int slot) const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
86 return ciblock()->stack_type_at(slot);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
87 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
88 int start() const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
89 return ciblock()->start();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
90 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
91 int limit() const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
92 return ciblock()->limit();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
93 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
94 bool falls_through() const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
95 return ciblock()->control() == ciBlock::fall_through_bci;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
96 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
97 int num_successors() const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
98 return ciblock()->successors()->length();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
99 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
100 SharkTopLevelBlock* successor(int index) const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
101 return function()->block(ciblock()->successors()->at(index)->pre_order());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
102 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
103 SharkTopLevelBlock* bci_successor(int bci) const;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
104
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
105 // Exceptions
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
106 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
107 GrowableArray<ciExceptionHandler*>* _exc_handlers;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
108 GrowableArray<SharkTopLevelBlock*>* _exceptions;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
109
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
110 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
111 void compute_exceptions();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
112
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
113 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
114 int num_exceptions() const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
115 return _exc_handlers->length();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
116 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
117 ciExceptionHandler* exc_handler(int index) const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
118 return _exc_handlers->at(index);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
119 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
120 SharkTopLevelBlock* exception(int index) const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
121 return _exceptions->at(index);
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 // Traps
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
125 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
126 bool _has_trap;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
127 int _trap_request;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
128 int _trap_bci;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
129
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
130 void set_trap(int trap_request, int trap_bci) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
131 assert(!has_trap(), "shouldn't have");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
132 _has_trap = true;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
133 _trap_request = trap_request;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
134 _trap_bci = trap_bci;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
135 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
136
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
137 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
138 bool has_trap() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
139 return _has_trap;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
140 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
141 int trap_request() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
142 assert(has_trap(), "should have");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
143 return _trap_request;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
144 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
145 int trap_bci() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
146 assert(has_trap(), "should have");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
147 return _trap_bci;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
148 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
149
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
150 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
151 void scan_for_traps();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
152
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
153 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
154 bool static_field_ok_in_clinit(ciField* field);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
155
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
156 // Entry state
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
157 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
158 bool _entered;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
159 bool _needs_phis;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
160
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
161 public:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
162 bool entered() const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
163 return _entered;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
164 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
165 bool needs_phis() const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
166 return _needs_phis;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
167 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
168
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
169 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
170 void enter(SharkTopLevelBlock* predecessor, bool is_exception);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
171
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
172 public:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
173 void enter() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
174 enter(NULL, false);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
175 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
176
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
177 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
178 SharkState* _entry_state;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
179
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
180 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
181 SharkState* entry_state();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
182
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
183 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
184 llvm::BasicBlock* _entry_block;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
185
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
186 public:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
187 llvm::BasicBlock* entry_block() const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
188 return _entry_block;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
189 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
190
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
191 public:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
192 void initialize();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
193
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
194 public:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
195 void add_incoming(SharkState* incoming_state);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
196
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
197 // Method
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
198 public:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
199 llvm::Value* method() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
200 return current_state()->method();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
201 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
202
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
203 // Temporary oop storage
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
204 public:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
205 void set_oop_tmp(llvm::Value* value) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
206 assert(value, "value must be non-NULL (will be reset by get_oop_tmp)");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
207 assert(!current_state()->oop_tmp(), "oop_tmp gets and sets must match");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
208 current_state()->set_oop_tmp(value);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
209 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
210 llvm::Value* get_oop_tmp() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
211 llvm::Value* value = current_state()->oop_tmp();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
212 assert(value, "oop_tmp gets and sets must match");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
213 current_state()->set_oop_tmp(NULL);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
214 return value;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
215 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
216
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
217 // Cache and decache
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
218 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
219 void decache_for_Java_call(ciMethod* callee);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
220 void cache_after_Java_call(ciMethod* callee);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
221 void decache_for_VM_call();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
222 void cache_after_VM_call();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
223 void decache_for_trap();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
224
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
225 // Monitors
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
226 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
227 int num_monitors() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
228 return current_state()->num_monitors();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
229 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
230 int set_num_monitors(int num_monitors) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
231 current_state()->set_num_monitors(num_monitors);
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 // Code generation
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
235 public:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
236 void emit_IR();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
237
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
238 // Branch helpers
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
239 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
240 void do_branch(int successor_index);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
241
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
242 // Zero checks
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
243 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
244 void do_zero_check(SharkValue* value);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
245 void zero_check_value(SharkValue* value, llvm::BasicBlock* continue_block);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
246
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
247 public:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
248 void do_deferred_zero_check(SharkValue* value,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
249 int bci,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
250 SharkState* saved_state,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
251 llvm::BasicBlock* continue_block);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
252 // Exceptions
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
253 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
254 llvm::Value* pending_exception_address() const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
255 return builder()->CreateAddressOfStructEntry(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
256 thread(), Thread::pending_exception_offset(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
257 llvm::PointerType::getUnqual(SharkType::oop_type()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
258 "pending_exception_addr");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
259 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
260 llvm::LoadInst* get_pending_exception() const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
261 return builder()->CreateLoad(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
262 pending_exception_address(), "pending_exception");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
263 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
264 void clear_pending_exception() const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
265 builder()->CreateStore(LLVMValue::null(), pending_exception_address());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
266 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
267 public:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
268 enum ExceptionActionMask {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
269 // The actual bitmasks that things test against
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
270 EAM_CHECK = 1, // whether to check for pending exceptions
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
271 EAM_HANDLE = 2, // whether to attempt to handle pending exceptions
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
272 EAM_MONITOR_FUDGE = 4, // whether the monitor count needs adjusting
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
273
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
274 // More convenient values for passing
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
275 EX_CHECK_NONE = 0,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
276 EX_CHECK_NO_CATCH = EAM_CHECK,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
277 EX_CHECK_FULL = EAM_CHECK | EAM_HANDLE
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
278 };
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
279 void check_pending_exception(int action);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
280 void handle_exception(llvm::Value* exception, int action);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
281 void marshal_exception_fast(int num_options);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
282 void marshal_exception_slow(int num_options);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
283 llvm::BasicBlock* handler_for_exception(int index);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
284
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
285 // VM calls
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
286 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
287 llvm::CallInst* call_vm(llvm::Value* callee,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
288 llvm::Value** args_start,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
289 llvm::Value** args_end,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
290 int exception_action) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
291 decache_for_VM_call();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
292 stack()->CreateSetLastJavaFrame();
7195
2cd5e15048e6 8003868: fix shark for latest HotSpot and LLVM
twisti
parents: 1972
diff changeset
293 llvm::CallInst *res = builder()->CreateCall(callee, llvm::makeArrayRef(args_start, args_end));
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
294 stack()->CreateResetLastJavaFrame();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
295 cache_after_VM_call();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
296 if (exception_action & EAM_CHECK) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
297 check_pending_exception(exception_action);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
298 current_state()->set_has_safepointed(true);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
299 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
300 return res;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
301 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
302
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
303 public:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
304 llvm::CallInst* call_vm(llvm::Value* callee,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
305 int exception_action) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
306 llvm::Value *args[] = {thread()};
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
307 return call_vm(callee, args, args + 1, exception_action);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
308 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
309 llvm::CallInst* call_vm(llvm::Value* callee,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
310 llvm::Value* arg1,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
311 int exception_action) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
312 llvm::Value *args[] = {thread(), arg1};
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
313 return call_vm(callee, args, args + 2, exception_action);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
314 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
315 llvm::CallInst* call_vm(llvm::Value* callee,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
316 llvm::Value* arg1,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
317 llvm::Value* arg2,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
318 int exception_action) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
319 llvm::Value *args[] = {thread(), arg1, arg2};
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
320 return call_vm(callee, args, args + 3, exception_action);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
321 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
322 llvm::CallInst* call_vm(llvm::Value* callee,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
323 llvm::Value* arg1,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
324 llvm::Value* arg2,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
325 llvm::Value* arg3,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
326 int exception_action) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
327 llvm::Value *args[] = {thread(), arg1, arg2, arg3};
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
328 return call_vm(callee, args, args + 4, exception_action);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
329 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
330
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
331 // VM call oop return handling
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
332 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
333 llvm::LoadInst* get_vm_result() const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
334 llvm::Value *addr = builder()->CreateAddressOfStructEntry(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
335 thread(), JavaThread::vm_result_offset(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
336 llvm::PointerType::getUnqual(SharkType::oop_type()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
337 "vm_result_addr");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
338 llvm::LoadInst *result = builder()->CreateLoad(addr, "vm_result");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
339 builder()->CreateStore(LLVMValue::null(), addr);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
340 return result;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
341 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
342
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
343 // Synchronization
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
344 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
345 void acquire_lock(llvm::Value* lockee, int exception_action);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
346 void release_lock(int exception_action);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
347
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
348 public:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
349 void acquire_method_lock();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
350
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
351 // Bounds checks
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
352 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
353 void check_bounds(SharkValue* array, SharkValue* index);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
354
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
355 // Safepoints
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
356 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
357 void maybe_add_safepoint();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
358 void maybe_add_backedge_safepoint();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
359
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
360 // Loop safepoint removal
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
361 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
362 bool _can_reach_visited;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
363
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
364 bool can_reach(SharkTopLevelBlock* other);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
365 bool can_reach_helper(SharkTopLevelBlock* other);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
366
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
367 // Traps
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
368 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
369 llvm::BasicBlock* make_trap(int trap_bci, int trap_request);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
370 void do_trap(int trap_request);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
371
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
372 // Returns
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
373 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
374 void call_register_finalizer(llvm::Value* receiver);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
375 void handle_return(BasicType type, llvm::Value* exception);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
376
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
377 // arraylength
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
378 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
379 void do_arraylength();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
380
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
381 // *aload and *astore
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
382 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
383 void do_aload(BasicType basic_type);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
384 void do_astore(BasicType basic_type);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
385
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
386 // *return and athrow
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
387 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
388 void do_return(BasicType type);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
389 void do_athrow();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
390
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
391 // goto*
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
392 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
393 void do_goto();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
394
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
395 // jsr* and ret
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
396 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
397 void do_jsr();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
398 void do_ret();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
399
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
400 // if*
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
401 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
402 void do_if_helper(llvm::ICmpInst::Predicate p,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
403 llvm::Value* b,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
404 llvm::Value* a,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
405 SharkState* if_taken_state,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
406 SharkState* not_taken_state);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
407 void do_if(llvm::ICmpInst::Predicate p, SharkValue* b, SharkValue* a);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
408
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
409 // tableswitch and lookupswitch
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
410 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
411 void do_switch();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
412
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
413 // invoke*
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
414 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
415 ciMethod* improve_virtual_call(ciMethod* caller,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
416 ciInstanceKlass* klass,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
417 ciMethod* dest_method,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
418 ciType* receiver_type);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
419 llvm::Value* get_direct_callee(ciMethod* method);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
420 llvm::Value* get_virtual_callee(SharkValue* receiver, int vtable_index);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
421 llvm::Value* get_interface_callee(SharkValue* receiver, ciMethod* method);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
422
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
423 void do_call();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
424
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
425 // checkcast and instanceof
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
426 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
427 bool static_subtype_check(ciKlass* check_klass, ciKlass* object_klass);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
428 void do_full_instance_check(ciKlass* klass);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
429 void do_trapping_instance_check(ciKlass* klass);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
430
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
431 void do_instance_check();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
432 bool maybe_do_instanceof_if();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
433
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
434 // new and *newarray
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
435 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
436 void do_new();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
437 void do_newarray();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
438 void do_anewarray();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
439 void do_multianewarray();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
440
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
441 // monitorenter and monitorexit
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
442 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
443 void do_monitorenter();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
444 void do_monitorexit();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
445 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
446
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
447 #endif // SHARE_VM_SHARK_SHARKTOPLEVELBLOCK_HPP