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

Added caching for resolved types and resolved fields. This is crucial, because the local load elimination will lead to wrong results, if field equality (of two RiField objects with the same object and the same RiType) is not given. The caching makes sure that the default equals implementation is sufficient.
author Thomas Wuerthinger <wuerthinger@ssw.jku.at>
date Tue, 28 Dec 2010 18:33:26 +0100
parents d2ede61b7a12
children f95d63e2154a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1 /*
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
2 * Copyright (c) 1999, 2007, Oracle and/or its affiliates. All rights reserved.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
3 * Copyright 2008, 2009, 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
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
26 #include "incls/_precompiled.incl"
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
27 #include "incls/_sharkStack.cpp.incl"
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
28
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
29 using namespace llvm;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
30
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
31 void SharkStack::initialize(Value* method) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
32 bool setup_sp_and_method = (method != NULL);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
33
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
34 int locals_words = max_locals();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
35 int extra_locals = locals_words - arg_size();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
36 int header_words = SharkFrame::header_words;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
37 int monitor_words = max_monitors()*frame::interpreter_frame_monitor_size();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
38 int stack_words = max_stack();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
39 int frame_words = header_words + monitor_words + stack_words;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
40
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
41 _extended_frame_size = frame_words + locals_words;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
42
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
43 // Update the stack pointer
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
44 Value *stack_pointer = builder()->CreateSub(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
45 CreateLoadStackPointer(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
46 LLVMValue::intptr_constant((frame_words + extra_locals) * wordSize));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
47 CreateStackOverflowCheck(stack_pointer);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
48 if (setup_sp_and_method)
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
49 CreateStoreStackPointer(stack_pointer);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
50
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
51 // Create the frame
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
52 _frame = builder()->CreateIntToPtr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
53 stack_pointer,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
54 PointerType::getUnqual(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
55 ArrayType::get(SharkType::intptr_type(), extended_frame_size())),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
56 "frame");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
57 int offset = 0;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
58
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
59 // Expression stack
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
60 _stack_slots_offset = offset;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
61 offset += stack_words;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
62
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
63 // Monitors
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
64 _monitors_slots_offset = offset;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
65 offset += monitor_words;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
66
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
67 // Temporary oop slot
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
68 _oop_tmp_slot_offset = offset++;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
69
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
70 // Method pointer
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
71 _method_slot_offset = offset++;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
72 if (setup_sp_and_method) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
73 builder()->CreateStore(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
74 method, slot_addr(method_slot_offset(), SharkType::methodOop_type()));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
75 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
76
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
77 // Unextended SP
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
78 builder()->CreateStore(stack_pointer, slot_addr(offset++));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
79
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
80 // PC
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
81 _pc_slot_offset = offset++;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
82
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
83 // Frame header
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
84 builder()->CreateStore(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
85 LLVMValue::intptr_constant(ZeroFrame::SHARK_FRAME), slot_addr(offset++));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
86 Value *fp = slot_addr(offset++);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
87
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
88 // Local variables
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
89 _locals_slots_offset = offset;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
90 offset += locals_words;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
91
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
92 // Push the frame
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
93 assert(offset == extended_frame_size(), "should do");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
94 builder()->CreateStore(CreateLoadFramePointer(), fp);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
95 CreateStoreFramePointer(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
96 builder()->CreatePtrToInt(fp, SharkType::intptr_type()));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
97 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
98
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
99 // This function should match ZeroStack::overflow_check
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
100 void SharkStack::CreateStackOverflowCheck(Value* sp) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
101 BasicBlock *zero_ok = CreateBlock("zero_stack_ok");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
102 BasicBlock *overflow = CreateBlock("stack_overflow");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
103 BasicBlock *abi_ok = CreateBlock("abi_stack_ok");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
104
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
105 // Check the Zero stack
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
106 builder()->CreateCondBr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
107 builder()->CreateICmpULT(sp, stack_base()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
108 overflow, zero_ok);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
109
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
110 // Check the ABI stack
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
111 builder()->SetInsertPoint(zero_ok);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
112 Value *stack_top = builder()->CreateSub(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
113 builder()->CreateValueOfStructEntry(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
114 thread(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
115 Thread::stack_base_offset(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
116 SharkType::intptr_type(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
117 "abi_base"),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
118 builder()->CreateValueOfStructEntry(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
119 thread(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
120 Thread::stack_size_offset(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
121 SharkType::intptr_type(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
122 "abi_size"));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
123 Value *free_stack = builder()->CreateSub(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
124 builder()->CreatePtrToInt(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
125 builder()->CreateGetFrameAddress(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
126 SharkType::intptr_type(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
127 "abi_sp"),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
128 stack_top);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
129 builder()->CreateCondBr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
130 builder()->CreateICmpULT(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
131 free_stack,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
132 LLVMValue::intptr_constant(StackShadowPages * os::vm_page_size())),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
133 overflow, abi_ok);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
134
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
135 // Handle overflows
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
136 builder()->SetInsertPoint(overflow);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
137 builder()->CreateCall(builder()->throw_StackOverflowError(), thread());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
138 builder()->CreateRet(LLVMValue::jint_constant(0));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
139
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
140 builder()->SetInsertPoint(abi_ok);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
141 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
142
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
143 Value* SharkStack::CreatePopFrame(int result_slots) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
144 assert(result_slots >= 0 && result_slots <= 2, "should be");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
145 int locals_to_pop = max_locals() - result_slots;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
146
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
147 Value *fp = CreateLoadFramePointer();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
148 Value *sp = builder()->CreateAdd(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
149 fp,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
150 LLVMValue::intptr_constant((1 + locals_to_pop) * wordSize));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
151
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
152 CreateStoreStackPointer(sp);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
153 CreateStoreFramePointer(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
154 builder()->CreateLoad(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
155 builder()->CreateIntToPtr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
156 fp, PointerType::getUnqual(SharkType::intptr_type()))));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
157
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
158 return sp;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
159 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
160
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
161 Value* SharkStack::slot_addr(int offset,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
162 const Type* type,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
163 const char* name) const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
164 bool needs_cast = type && type != SharkType::intptr_type();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
165
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
166 Value* result = builder()->CreateStructGEP(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
167 _frame, offset, needs_cast ? "" : name);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
168
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
169 if (needs_cast) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
170 result = builder()->CreateBitCast(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
171 result, PointerType::getUnqual(type), name);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
172 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
173 return result;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
174 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
175
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
176 // The bits that differentiate stacks with normal and native frames on top
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
177
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
178 SharkStack* SharkStack::CreateBuildAndPushFrame(SharkFunction* function,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
179 Value* method) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
180 return new SharkStackWithNormalFrame(function, method);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
181 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
182 SharkStack* SharkStack::CreateBuildAndPushFrame(SharkNativeWrapper* wrapper,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
183 Value* method) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
184 return new SharkStackWithNativeFrame(wrapper, method);
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 SharkStackWithNormalFrame::SharkStackWithNormalFrame(SharkFunction* function,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
188 Value* method)
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
189 : SharkStack(function), _function(function) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
190 // For normal frames, the stack pointer and the method slot will
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
191 // be set during each decache, so it is not necessary to do them
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
192 // at the time the frame is created. However, we set them for
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
193 // non-PRODUCT builds to make crash dumps easier to understand.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
194 initialize(PRODUCT_ONLY(NULL) NOT_PRODUCT(method));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
195 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
196 SharkStackWithNativeFrame::SharkStackWithNativeFrame(SharkNativeWrapper* wrp,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
197 Value* method)
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
198 : SharkStack(wrp), _wrapper(wrp) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
199 initialize(method);
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 int SharkStackWithNormalFrame::arg_size() const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
203 return function()->arg_size();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
204 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
205 int SharkStackWithNativeFrame::arg_size() const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
206 return wrapper()->arg_size();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
207 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
208
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
209 int SharkStackWithNormalFrame::max_locals() const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
210 return function()->max_locals();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
211 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
212 int SharkStackWithNativeFrame::max_locals() const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
213 return wrapper()->arg_size();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
214 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
215
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
216 int SharkStackWithNormalFrame::max_stack() const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
217 return function()->max_stack();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
218 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
219 int SharkStackWithNativeFrame::max_stack() const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
220 return 0;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
221 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
222
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
223 int SharkStackWithNormalFrame::max_monitors() const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
224 return function()->max_monitors();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
225 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
226 int SharkStackWithNativeFrame::max_monitors() const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
227 return wrapper()->is_synchronized() ? 1 : 0;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
228 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
229
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
230 BasicBlock* SharkStackWithNormalFrame::CreateBlock(const char* name) const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
231 return function()->CreateBlock(name);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
232 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
233 BasicBlock* SharkStackWithNativeFrame::CreateBlock(const char* name) const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
234 return wrapper()->CreateBlock(name);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
235 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
236
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
237 address SharkStackWithNormalFrame::interpreter_entry_point() const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
238 return (address) CppInterpreter::normal_entry;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
239 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
240 address SharkStackWithNativeFrame::interpreter_entry_point() const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
241 return (address) CppInterpreter::native_entry;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
242 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
243
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
244 #ifndef PRODUCT
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
245 void SharkStack::CreateAssertLastJavaSPIsNull() const {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
246 #ifdef ASSERT
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
247 BasicBlock *fail = CreateBlock("assert_failed");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
248 BasicBlock *pass = CreateBlock("assert_ok");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
249
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
250 builder()->CreateCondBr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
251 builder()->CreateICmpEQ(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
252 builder()->CreateLoad(last_Java_sp_addr()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
253 LLVMValue::intptr_constant(0)),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
254 pass, fail);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
255
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
256 builder()->SetInsertPoint(fail);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
257 builder()->CreateShouldNotReachHere(__FILE__, __LINE__);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
258 builder()->CreateUnreachable();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
259
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
260 builder()->SetInsertPoint(pass);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
261 #endif // ASSERT
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
262 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
263 #endif // !PRODUCT