annotate src/share/vm/shark/sharkStack.hpp @ 10185:d50cc62e94ff

8012715: G1: GraphKit accesses PtrQueue::_index as int but is size_t Summary: In graphKit INT operations were generated to access PtrQueue::_index which has type size_t. This is 64 bit on 64-bit machines. No problems occur on little endian machines as long as the index fits into 32 bit, but on big endian machines the upper part is read, which is zero. This leads to unnecessary branches to the slow path in the runtime. Reviewed-by: twisti, johnc Contributed-by: Martin Doerr <martin.doerr@sap.com>
author johnc
date Wed, 24 Apr 2013 14:48:43 -0700
parents 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_SHARKSTACK_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
27 #define SHARE_VM_SHARK_SHARKSTACK_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 "shark/llvmHeaders.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
30 #include "shark/sharkInvariants.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
31 #include "shark/sharkType.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
32
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
33 class SharkFunction;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
34 class SharkNativeWrapper;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
35 class SharkStackWithNormalFrame;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
36 class SharkStackWithNativeFrame;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
37
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
38 class SharkStack : public SharkCompileInvariants {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
39 public:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
40 static SharkStack* CreateBuildAndPushFrame(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
41 SharkFunction* function, llvm::Value* method);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
42 static SharkStack* CreateBuildAndPushFrame(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
43 SharkNativeWrapper* wrapper, llvm::Value* method);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
44
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
45 protected:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
46 SharkStack(const SharkCompileInvariants* parent)
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
47 : SharkCompileInvariants(parent) {}
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
48
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
49 protected:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
50 void initialize(llvm::Value* method);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
51
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
52 protected:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
53 void CreateStackOverflowCheck(llvm::Value* sp);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
54
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
55 // Properties of the method being compiled
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
56 protected:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
57 virtual int arg_size() const = 0;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
58 virtual int max_locals() const = 0;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
59 virtual int max_stack() const = 0;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
60 virtual int max_monitors() const = 0;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
61
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
62 // BasicBlock creation
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
63 protected:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
64 virtual llvm::BasicBlock* CreateBlock(const char* name = "") const = 0;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
65
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
66 // Interpreter entry point for bailouts
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
67 protected:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
68 virtual address interpreter_entry_point() const = 0;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
69
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
70 // Interface with the Zero stack
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
71 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
72 llvm::Value* zero_stack() const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
73 return builder()->CreateAddressOfStructEntry(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
74 thread(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
75 JavaThread::zero_stack_offset(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
76 SharkType::zeroStack_type(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
77 "zero_stack");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
78 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
79 llvm::Value* stack_base() const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
80 return builder()->CreateValueOfStructEntry(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
81 zero_stack(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
82 ZeroStack::base_offset(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
83 SharkType::intptr_type(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
84 "stack_base");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
85 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
86 llvm::Value* stack_pointer_addr() const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
87 return builder()->CreateAddressOfStructEntry(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
88 zero_stack(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
89 ZeroStack::sp_offset(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
90 llvm::PointerType::getUnqual(SharkType::intptr_type()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
91 "stack_pointer_addr");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
92 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
93 llvm::Value* frame_pointer_addr() const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
94 return builder()->CreateAddressOfStructEntry(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
95 thread(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
96 JavaThread::top_zero_frame_offset(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
97 llvm::PointerType::getUnqual(SharkType::intptr_type()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
98 "frame_pointer_addr");
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 public:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
102 llvm::LoadInst* CreateLoadStackPointer(const char *name = "") {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
103 return builder()->CreateLoad(stack_pointer_addr(), name);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
104 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
105 llvm::StoreInst* CreateStoreStackPointer(llvm::Value* value) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
106 return builder()->CreateStore(value, stack_pointer_addr());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
107 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
108 llvm::LoadInst* CreateLoadFramePointer(const char *name = "") {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
109 return builder()->CreateLoad(frame_pointer_addr(), name);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
110 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
111 llvm::StoreInst* CreateStoreFramePointer(llvm::Value* value) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
112 return builder()->CreateStore(value, frame_pointer_addr());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
113 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
114 llvm::Value* CreatePopFrame(int result_slots);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
115
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
116 // Interface with the frame anchor
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
117 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
118 llvm::Value* last_Java_sp_addr() const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
119 return builder()->CreateAddressOfStructEntry(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
120 thread(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
121 JavaThread::last_Java_sp_offset(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
122 llvm::PointerType::getUnqual(SharkType::intptr_type()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
123 "last_Java_sp_addr");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
124 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
125 llvm::Value* last_Java_fp_addr() const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
126 return builder()->CreateAddressOfStructEntry(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
127 thread(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
128 JavaThread::last_Java_fp_offset(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
129 llvm::PointerType::getUnqual(SharkType::intptr_type()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
130 "last_Java_fp_addr");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
131 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
132
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
133 public:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
134 void CreateSetLastJavaFrame() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
135 // Note that whenever _last_Java_sp != NULL other anchor fields
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
136 // must be valid. The profiler apparently depends on this.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
137 NOT_PRODUCT(CreateAssertLastJavaSPIsNull());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
138 builder()->CreateStore(CreateLoadFramePointer(), last_Java_fp_addr());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
139 // XXX There's last_Java_pc as well, but I don't think anything uses it
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
140 // Also XXX: should we fence here? Zero doesn't...
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
141 builder()->CreateStore(CreateLoadStackPointer(), last_Java_sp_addr());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
142 // Also also XXX: we could probably cache the sp (and the fp we know??)
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
143 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
144 void CreateResetLastJavaFrame() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
145 builder()->CreateStore(LLVMValue::intptr_constant(0), last_Java_sp_addr());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
146 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
147
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
148 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
149 void CreateAssertLastJavaSPIsNull() const PRODUCT_RETURN;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
150
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
151 // Our method's frame
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
152 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
153 llvm::Value* _frame;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
154 int _extended_frame_size;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
155 int _stack_slots_offset;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
156
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
157 public:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
158 int extended_frame_size() const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
159 return _extended_frame_size;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
160 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
161 int oopmap_frame_size() const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
162 return extended_frame_size() - arg_size();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
163 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
164
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
165 // Offsets of things in the frame
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
166 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
167 int _monitors_slots_offset;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
168 int _oop_tmp_slot_offset;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
169 int _method_slot_offset;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
170 int _pc_slot_offset;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
171 int _locals_slots_offset;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
172
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
173 public:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
174 int stack_slots_offset() const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
175 return _stack_slots_offset;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
176 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
177 int oop_tmp_slot_offset() const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
178 return _oop_tmp_slot_offset;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
179 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
180 int method_slot_offset() const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
181 return _method_slot_offset;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
182 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
183 int pc_slot_offset() const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
184 return _pc_slot_offset;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
185 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
186 int locals_slots_offset() const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
187 return _locals_slots_offset;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
188 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
189 int monitor_offset(int index) const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
190 assert(index >= 0 && index < max_monitors(), "invalid monitor index");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
191 return _monitors_slots_offset +
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
192 (max_monitors() - 1 - index) * frame::interpreter_frame_monitor_size();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
193 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
194 int monitor_object_offset(int index) const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
195 return monitor_offset(index) +
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
196 (BasicObjectLock::obj_offset_in_bytes() >> LogBytesPerWord);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
197 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
198 int monitor_header_offset(int index) const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
199 return monitor_offset(index) +
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
200 ((BasicObjectLock::lock_offset_in_bytes() +
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
201 BasicLock::displaced_header_offset_in_bytes()) >> LogBytesPerWord);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
202 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
203
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
204 // Addresses of things in the frame
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
205 public:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
206 llvm::Value* slot_addr(int offset,
7195
2cd5e15048e6 8003868: fix shark for latest HotSpot and LLVM
twisti
parents: 1972
diff changeset
207 llvm::Type* type = NULL,
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
208 const char* name = "") const;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
209
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
210 llvm::Value* monitor_addr(int index) const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
211 return slot_addr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
212 monitor_offset(index),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
213 SharkType::monitor_type(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
214 "monitor");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
215 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
216 llvm::Value* monitor_object_addr(int index) const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
217 return slot_addr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
218 monitor_object_offset(index),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
219 SharkType::oop_type(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
220 "object_addr");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
221 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
222 llvm::Value* monitor_header_addr(int index) const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
223 return slot_addr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
224 monitor_header_offset(index),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
225 SharkType::intptr_type(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
226 "displaced_header_addr");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
227 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
228
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
229 // oopmap helpers
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
230 public:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
231 static int oopmap_slot_munge(int offset) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
232 return offset << (LogBytesPerWord - LogBytesPerInt);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
233 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
234 static VMReg slot2reg(int offset) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
235 return VMRegImpl::stack2reg(oopmap_slot_munge(offset));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
236 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
237 };
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
238
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
239 class SharkStackWithNormalFrame : public SharkStack {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
240 friend class SharkStack;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
241
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
242 protected:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
243 SharkStackWithNormalFrame(SharkFunction* function, llvm::Value* method);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
244
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
245 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
246 SharkFunction* _function;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
247
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
248 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
249 SharkFunction* function() const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
250 return _function;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
251 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
252
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
253 // Properties of the method being compiled
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
254 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
255 int arg_size() const;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
256 int max_locals() const;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
257 int max_stack() const;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
258 int max_monitors() const;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
259
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
260 // BasicBlock creation
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
261 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
262 llvm::BasicBlock* CreateBlock(const char* name = "") const;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
263
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
264 // Interpreter entry point for bailouts
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
265 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
266 address interpreter_entry_point() const;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
267 };
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
268
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
269 class SharkStackWithNativeFrame : public SharkStack {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
270 friend class SharkStack;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
271
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
272 protected:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
273 SharkStackWithNativeFrame(SharkNativeWrapper* wrapper, llvm::Value* method);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
274
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
275 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
276 SharkNativeWrapper* _wrapper;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
277
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
278 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
279 SharkNativeWrapper* wrapper() const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
280 return _wrapper;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
281 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
282
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
283 // Properties of the method being compiled
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
284 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
285 int arg_size() const;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
286 int max_locals() const;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
287 int max_stack() const;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
288 int max_monitors() const;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
289
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
290 // BasicBlock creation
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
291 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
292 llvm::BasicBlock* CreateBlock(const char* name = "") const;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
293
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
294 // Interpreter entry point for bailouts
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
295 private:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
296 address interpreter_entry_point() const;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
297 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
298
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
299 #endif // SHARE_VM_SHARK_SHARKSTACK_HPP