Mercurial > hg > truffle
annotate src/cpu/x86/vm/frame_x86.cpp @ 20304:a22acf6d7598
8048112: G1 Full GC needs to support the case when the very first region is not available
Summary: Refactor preparation for compaction during Full GC so that it lazily initializes the first compaction point. This also avoids problems later when the first region may not be committed. Also reviewed by K. Barrett.
Reviewed-by: brutisso
author | tschatzl |
---|---|
date | Mon, 21 Jul 2014 10:00:31 +0200 |
parents | 78bbf4d43a14 |
children | 52b4284cb496 |
rev | line source |
---|---|
0 | 1 /* |
17937
78bbf4d43a14
8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents:
13432
diff
changeset
|
2 * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. |
0 | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1513
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1513
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1513
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
1972 | 25 #include "precompiled.hpp" |
26 #include "interpreter/interpreter.hpp" | |
27 #include "memory/resourceArea.hpp" | |
28 #include "oops/markOop.hpp" | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
29 #include "oops/method.hpp" |
1972 | 30 #include "oops/oop.inline.hpp" |
4868 | 31 #include "prims/methodHandles.hpp" |
1972 | 32 #include "runtime/frame.inline.hpp" |
33 #include "runtime/handles.inline.hpp" | |
34 #include "runtime/javaCalls.hpp" | |
35 #include "runtime/monitorChunk.hpp" | |
10405 | 36 #include "runtime/os.hpp" |
1972 | 37 #include "runtime/signature.hpp" |
38 #include "runtime/stubCodeGenerator.hpp" | |
39 #include "runtime/stubRoutines.hpp" | |
40 #include "vmreg_x86.inline.hpp" | |
41 #ifdef COMPILER1 | |
42 #include "c1/c1_Runtime1.hpp" | |
43 #include "runtime/vframeArray.hpp" | |
44 #endif | |
0 | 45 |
46 #ifdef ASSERT | |
47 void RegisterMap::check_location_valid() { | |
48 } | |
49 #endif | |
50 | |
17937
78bbf4d43a14
8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents:
13432
diff
changeset
|
51 PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC |
0 | 52 |
53 // Profiling/safepoint support | |
54 | |
55 bool frame::safe_for_sender(JavaThread *thread) { | |
56 address sp = (address)_sp; | |
57 address fp = (address)_fp; | |
58 address unextended_sp = (address)_unextended_sp; | |
10405 | 59 |
60 // consider stack guards when trying to determine "safe" stack pointers | |
61 static size_t stack_guard_size = os::uses_stack_guard_pages() ? (StackYellowPages + StackRedPages) * os::vm_page_size() : 0; | |
62 size_t usable_stack_size = thread->stack_size() - stack_guard_size; | |
63 | |
64 // sp must be within the usable part of the stack (not in guards) | |
65 bool sp_safe = (sp < thread->stack_base()) && | |
66 (sp >= thread->stack_base() - usable_stack_size); | |
67 | |
107
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
68 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
69 if (!sp_safe) { |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
70 return false; |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
71 } |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
72 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
73 // unextended sp must be within the stack and above or equal sp |
10405 | 74 bool unextended_sp_safe = (unextended_sp < thread->stack_base()) && |
107
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
75 (unextended_sp >= sp); |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
76 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
77 if (!unextended_sp_safe) { |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
78 return false; |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
79 } |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
80 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
81 // an fp must be within the stack and above (but not equal) sp |
10405 | 82 // second evaluation on fp+ is added to handle situation where fp is -1 |
83 bool fp_safe = (fp < thread->stack_base() && (fp > sp) && (((fp + (return_addr_offset * sizeof(void*))) < thread->stack_base()))); | |
107
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
84 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
85 // We know sp/unextended_sp are safe only fp is questionable here |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
86 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
87 // If the current frame is known to the code cache then we can attempt to |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
88 // to construct the sender and do some validation of it. This goes a long way |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
89 // toward eliminating issues when we get in frame construction code |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
90 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
91 if (_cb != NULL ) { |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
92 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
93 // First check if frame is complete and tester is reliable |
0 | 94 // Unfortunately we can only check frame complete for runtime stubs and nmethod |
95 // other generic buffer blobs are more problematic so we just assume they are | |
96 // ok. adapter blobs never have a frame complete and are never ok. | |
107
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
97 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
98 if (!_cb->is_frame_complete_at(_pc)) { |
0 | 99 if (_cb->is_nmethod() || _cb->is_adapter_blob() || _cb->is_runtime_stub()) { |
100 return false; | |
101 } | |
102 } | |
8106
ec2eddfed950
8008340: [sampling] assert(upper->pc_offset() >= pc_offset) failed: sanity
rbackman
parents:
7176
diff
changeset
|
103 |
ec2eddfed950
8008340: [sampling] assert(upper->pc_offset() >= pc_offset) failed: sanity
rbackman
parents:
7176
diff
changeset
|
104 // Could just be some random pointer within the codeBlob |
ec2eddfed950
8008340: [sampling] assert(upper->pc_offset() >= pc_offset) failed: sanity
rbackman
parents:
7176
diff
changeset
|
105 if (!_cb->code_contains(_pc)) { |
ec2eddfed950
8008340: [sampling] assert(upper->pc_offset() >= pc_offset) failed: sanity
rbackman
parents:
7176
diff
changeset
|
106 return false; |
ec2eddfed950
8008340: [sampling] assert(upper->pc_offset() >= pc_offset) failed: sanity
rbackman
parents:
7176
diff
changeset
|
107 } |
ec2eddfed950
8008340: [sampling] assert(upper->pc_offset() >= pc_offset) failed: sanity
rbackman
parents:
7176
diff
changeset
|
108 |
107
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
109 // Entry frame checks |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
110 if (is_entry_frame()) { |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
111 // an entry frame must have a valid fp. |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
112 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
113 if (!fp_safe) return false; |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
114 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
115 // Validate the JavaCallWrapper an entry frame must have |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
116 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
117 address jcw = (address)entry_frame_call_wrapper(); |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
118 |
10405 | 119 bool jcw_safe = (jcw < thread->stack_base()) && ( jcw > fp); |
107
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
120 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
121 return jcw_safe; |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
122 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
123 } |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
124 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
125 intptr_t* sender_sp = NULL; |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
126 address sender_pc = NULL; |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
127 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
128 if (is_interpreted_frame()) { |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
129 // fp must be safe |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
130 if (!fp_safe) { |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
131 return false; |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
132 } |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
133 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
134 sender_pc = (address) this->fp()[return_addr_offset]; |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
135 sender_sp = (intptr_t*) addr_at(sender_sp_offset); |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
136 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
137 } else { |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
138 // must be some sort of compiled/runtime frame |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
139 // fp does not have to be safe (although it could be check for c1?) |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
140 |
13432
c586f8a7322f
8028412: AsyncGetCallTrace() is broken on x86 in JDK 7u40
mgronlun
parents:
12316
diff
changeset
|
141 // check for a valid frame_size, otherwise we are unlikely to get a valid sender_pc |
c586f8a7322f
8028412: AsyncGetCallTrace() is broken on x86 in JDK 7u40
mgronlun
parents:
12316
diff
changeset
|
142 if (_cb->frame_size() <= 0) { |
c586f8a7322f
8028412: AsyncGetCallTrace() is broken on x86 in JDK 7u40
mgronlun
parents:
12316
diff
changeset
|
143 return false; |
c586f8a7322f
8028412: AsyncGetCallTrace() is broken on x86 in JDK 7u40
mgronlun
parents:
12316
diff
changeset
|
144 } |
c586f8a7322f
8028412: AsyncGetCallTrace() is broken on x86 in JDK 7u40
mgronlun
parents:
12316
diff
changeset
|
145 |
107
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
146 sender_sp = _unextended_sp + _cb->frame_size(); |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
147 // On Intel the return_address is always the word on the stack |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
148 sender_pc = (address) *(sender_sp-1); |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
149 } |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
150 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
151 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
152 // If the potential sender is the interpreter then we can do some more checking |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
153 if (Interpreter::contains(sender_pc)) { |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
154 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
155 // ebp is always saved in a recognizable place in any code we generate. However |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
156 // only if the sender is interpreted/call_stub (c1 too?) are we certain that the saved ebp |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
157 // is really a frame pointer. |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
158 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
159 intptr_t *saved_fp = (intptr_t*)*(sender_sp - frame::sender_sp_offset); |
10405 | 160 bool saved_fp_safe = ((address)saved_fp < thread->stack_base()) && (saved_fp > sender_sp); |
107
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
161 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
162 if (!saved_fp_safe) { |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
163 return false; |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
164 } |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
165 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
166 // construct the potential sender |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
167 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
168 frame sender(sender_sp, saved_fp, sender_pc); |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
169 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
170 return sender.is_interpreted_frame_valid(thread); |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
171 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
172 } |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
173 |
10405 | 174 // We must always be able to find a recognizable pc |
175 CodeBlob* sender_blob = CodeCache::find_blob_unsafe(sender_pc); | |
176 if (sender_pc == NULL || sender_blob == NULL) { | |
177 return false; | |
178 } | |
179 | |
180 // Could be a zombie method | |
181 if (sender_blob->is_zombie() || sender_blob->is_unloaded()) { | |
182 return false; | |
183 } | |
184 | |
107
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
185 // Could just be some random pointer within the codeBlob |
1748 | 186 if (!sender_blob->code_contains(sender_pc)) { |
187 return false; | |
188 } | |
107
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
189 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
190 // We should never be able to see an adapter if the current frame is something from code cache |
1748 | 191 if (sender_blob->is_adapter_blob()) { |
107
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
192 return false; |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
193 } |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
194 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
195 // Could be the call_stub |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
196 if (StubRoutines::returns_to_call_stub(sender_pc)) { |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
197 intptr_t *saved_fp = (intptr_t*)*(sender_sp - frame::sender_sp_offset); |
10405 | 198 bool saved_fp_safe = ((address)saved_fp < thread->stack_base()) && (saved_fp > sender_sp); |
107
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
199 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
200 if (!saved_fp_safe) { |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
201 return false; |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
202 } |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
203 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
204 // construct the potential sender |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
205 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
206 frame sender(sender_sp, saved_fp, sender_pc); |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
207 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
208 // Validate the JavaCallWrapper an entry frame must have |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
209 address jcw = (address)sender.entry_frame_call_wrapper(); |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
210 |
10405 | 211 bool jcw_safe = (jcw < thread->stack_base()) && ( jcw > (address)sender.fp()); |
107
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
212 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
213 return jcw_safe; |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
214 } |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
215 |
10405 | 216 if (sender_blob->is_nmethod()) { |
217 nmethod* nm = sender_blob->as_nmethod_or_null(); | |
218 if (nm != NULL) { | |
219 if (nm->is_deopt_mh_entry(sender_pc) || nm->is_deopt_entry(sender_pc)) { | |
220 return false; | |
221 } | |
222 } | |
223 } | |
224 | |
225 // If the frame size is 0 something (or less) is bad because every nmethod has a non-zero frame size | |
107
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
226 // because the return address counts against the callee's frame. |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
227 |
10405 | 228 if (sender_blob->frame_size() <= 0) { |
107
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
229 assert(!sender_blob->is_nmethod(), "should count return address at least"); |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
230 return false; |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
231 } |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
232 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
233 // We should never be able to see anything here except an nmethod. If something in the |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
234 // code cache (current frame) is called by an entity within the code cache that entity |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
235 // should not be anything but the call stub (already covered), the interpreter (already covered) |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
236 // or an nmethod. |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
237 |
10405 | 238 if (!sender_blob->is_nmethod()) { |
239 return false; | |
240 } | |
107
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
241 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
242 // Could put some more validation for the potential non-interpreted sender |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
243 // frame we'd create by calling sender if I could think of any. Wait for next crash in forte... |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
244 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
245 // One idea is seeing if the sender_pc we have is one that we'd expect to call to current cb |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
246 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
247 // We've validated the potential sender that would be created |
0 | 248 return true; |
249 } | |
107
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
250 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
251 // Must be native-compiled frame. Since sender will try and use fp to find |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
252 // linkages it must be safe |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
253 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
254 if (!fp_safe) { |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
255 return false; |
0 | 256 } |
107
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
257 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
258 // Will the pc we fetch be non-zero (which we'll find at the oldest frame) |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
259 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
260 if ( (address) this->fp()[return_addr_offset] == NULL) return false; |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
261 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
262 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
263 // could try and do some more potential verification of native frame if we could think of some... |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
264 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
265 return true; |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
266 |
0 | 267 } |
268 | |
269 | |
270 void frame::patch_pc(Thread* thread, address pc) { | |
4000
0abefdb54d21
7081938: JSR292: assert(magic_number_2() == MAGIC_NUMBER_2) failed
twisti
parents:
3931
diff
changeset
|
271 address* pc_addr = &(((address*) sp())[-1]); |
0 | 272 if (TracePcPatching) { |
4056
448691f285a5
7106944: assert(_pc == *pc_addr) failed may be too strong
twisti
parents:
4000
diff
changeset
|
273 tty->print_cr("patch_pc at address " INTPTR_FORMAT " [" INTPTR_FORMAT " -> " INTPTR_FORMAT "]", |
4000
0abefdb54d21
7081938: JSR292: assert(magic_number_2() == MAGIC_NUMBER_2) failed
twisti
parents:
3931
diff
changeset
|
274 pc_addr, *pc_addr, pc); |
0 | 275 } |
4056
448691f285a5
7106944: assert(_pc == *pc_addr) failed may be too strong
twisti
parents:
4000
diff
changeset
|
276 // Either the return address is the original one or we are going to |
448691f285a5
7106944: assert(_pc == *pc_addr) failed may be too strong
twisti
parents:
4000
diff
changeset
|
277 // patch in the same address that's already there. |
448691f285a5
7106944: assert(_pc == *pc_addr) failed may be too strong
twisti
parents:
4000
diff
changeset
|
278 assert(_pc == *pc_addr || pc == *pc_addr, "must be"); |
4000
0abefdb54d21
7081938: JSR292: assert(magic_number_2() == MAGIC_NUMBER_2) failed
twisti
parents:
3931
diff
changeset
|
279 *pc_addr = pc; |
0 | 280 _cb = CodeCache::find_blob(pc); |
1204 | 281 address original_pc = nmethod::get_deopt_original_pc(this); |
282 if (original_pc != NULL) { | |
283 assert(original_pc == _pc, "expected original PC to be stored before patching"); | |
0 | 284 _deopt_state = is_deoptimized; |
285 // leave _pc as is | |
286 } else { | |
287 _deopt_state = not_deoptimized; | |
288 _pc = pc; | |
289 } | |
290 } | |
291 | |
292 bool frame::is_interpreted_frame() const { | |
293 return Interpreter::contains(pc()); | |
294 } | |
295 | |
793
eacd97c88873
6848466: frame::frame_size() assertion failure with -XX:+DebugDeoptimization
cfang
parents:
304
diff
changeset
|
296 int frame::frame_size(RegisterMap* map) const { |
eacd97c88873
6848466: frame::frame_size() assertion failure with -XX:+DebugDeoptimization
cfang
parents:
304
diff
changeset
|
297 frame sender = this->sender(map); |
0 | 298 return sender.sp() - sp(); |
299 } | |
300 | |
301 intptr_t* frame::entry_frame_argument_at(int offset) const { | |
302 // convert offset to index to deal with tsi | |
303 int index = (Interpreter::expr_offset_in_bytes(offset)/wordSize); | |
304 // Entry frame's arguments are always in relation to unextended_sp() | |
305 return &unextended_sp()[index]; | |
306 } | |
307 | |
308 // sender_sp | |
309 #ifdef CC_INTERP | |
310 intptr_t* frame::interpreter_frame_sender_sp() const { | |
311 assert(is_interpreted_frame(), "interpreted frame expected"); | |
312 // QQQ why does this specialize method exist if frame::sender_sp() does same thing? | |
313 // seems odd and if we always know interpreted vs. non then sender_sp() is really | |
314 // doing too much work. | |
315 return get_interpreterState()->sender_sp(); | |
316 } | |
317 | |
318 // monitor elements | |
319 | |
320 BasicObjectLock* frame::interpreter_frame_monitor_begin() const { | |
321 return get_interpreterState()->monitor_base(); | |
322 } | |
323 | |
324 BasicObjectLock* frame::interpreter_frame_monitor_end() const { | |
325 return (BasicObjectLock*) get_interpreterState()->stack_base(); | |
326 } | |
327 | |
328 #else // CC_INTERP | |
329 | |
330 intptr_t* frame::interpreter_frame_sender_sp() const { | |
331 assert(is_interpreted_frame(), "interpreted frame expected"); | |
332 return (intptr_t*) at(interpreter_frame_sender_sp_offset); | |
333 } | |
334 | |
335 void frame::set_interpreter_frame_sender_sp(intptr_t* sender_sp) { | |
336 assert(is_interpreted_frame(), "interpreted frame expected"); | |
337 ptr_at_put(interpreter_frame_sender_sp_offset, (intptr_t) sender_sp); | |
338 } | |
339 | |
340 | |
341 // monitor elements | |
342 | |
343 BasicObjectLock* frame::interpreter_frame_monitor_begin() const { | |
344 return (BasicObjectLock*) addr_at(interpreter_frame_monitor_block_bottom_offset); | |
345 } | |
346 | |
347 BasicObjectLock* frame::interpreter_frame_monitor_end() const { | |
348 BasicObjectLock* result = (BasicObjectLock*) *addr_at(interpreter_frame_monitor_block_top_offset); | |
349 // make sure the pointer points inside the frame | |
1488
615a9d95d265
6946056: assert((intptr_t) sp()<=(intptr_t) result,"result must>=than stack pointer"), frame_x86.cpp:295
johnc
parents:
1204
diff
changeset
|
350 assert(sp() <= (intptr_t*) result, "monitor end should be above the stack pointer"); |
615a9d95d265
6946056: assert((intptr_t) sp()<=(intptr_t) result,"result must>=than stack pointer"), frame_x86.cpp:295
johnc
parents:
1204
diff
changeset
|
351 assert((intptr_t*) result < fp(), "monitor end should be strictly below the frame pointer"); |
0 | 352 return result; |
353 } | |
354 | |
355 void frame::interpreter_frame_set_monitor_end(BasicObjectLock* value) { | |
356 *((BasicObjectLock**)addr_at(interpreter_frame_monitor_block_top_offset)) = value; | |
357 } | |
358 | |
359 // Used by template based interpreter deoptimization | |
360 void frame::interpreter_frame_set_last_sp(intptr_t* sp) { | |
361 *((intptr_t**)addr_at(interpreter_frame_last_sp_offset)) = sp; | |
362 } | |
363 #endif // CC_INTERP | |
364 | |
365 frame frame::sender_for_entry_frame(RegisterMap* map) const { | |
366 assert(map != NULL, "map must be set"); | |
367 // Java frame called from C; skip all C frames and return top C | |
368 // frame of that chunk as the sender | |
369 JavaFrameAnchor* jfa = entry_frame_call_wrapper()->anchor(); | |
370 assert(!entry_frame_is_first(), "next Java fp must be non zero"); | |
371 assert(jfa->last_Java_sp() > sp(), "must be above this frame on stack"); | |
372 map->clear(); | |
373 assert(map->include_argument_oops(), "should be set by clear"); | |
374 if (jfa->last_Java_pc() != NULL ) { | |
375 frame fr(jfa->last_Java_sp(), jfa->last_Java_fp(), jfa->last_Java_pc()); | |
376 return fr; | |
377 } | |
378 frame fr(jfa->last_Java_sp(), jfa->last_Java_fp()); | |
379 return fr; | |
380 } | |
381 | |
1204 | 382 //------------------------------------------------------------------------------ |
383 // frame::verify_deopt_original_pc | |
384 // | |
385 // Verifies the calculated original PC of a deoptimization PC for the | |
386 // given unextended SP. The unextended SP might also be the saved SP | |
387 // for MethodHandle call sites. | |
8721 | 388 #ifdef ASSERT |
1204 | 389 void frame::verify_deopt_original_pc(nmethod* nm, intptr_t* unextended_sp, bool is_method_handle_return) { |
390 frame fr; | |
391 | |
392 // This is ugly but it's better than to change {get,set}_original_pc | |
393 // to take an SP value as argument. And it's only a debugging | |
394 // method anyway. | |
395 fr._unextended_sp = unextended_sp; | |
396 | |
397 address original_pc = nm->get_original_pc(&fr); | |
1748 | 398 assert(nm->insts_contains(original_pc), "original PC must be in nmethod"); |
1204 | 399 assert(nm->is_method_handle_return(original_pc) == is_method_handle_return, "must be"); |
400 } | |
401 #endif | |
402 | |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
403 //------------------------------------------------------------------------------ |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
404 // frame::adjust_unextended_sp |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
405 void frame::adjust_unextended_sp() { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
406 // If we are returning to a compiled MethodHandle call site, the |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
407 // saved_fp will in fact be a saved value of the unextended SP. The |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
408 // simplest way to tell whether we are returning to such a call site |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
409 // is as follows: |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
410 |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
411 nmethod* sender_nm = (_cb == NULL) ? NULL : _cb->as_nmethod_or_null(); |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
412 if (sender_nm != NULL) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
413 // If the sender PC is a deoptimization point, get the original |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
414 // PC. For MethodHandle call site the unextended_sp is stored in |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
415 // saved_fp. |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
416 if (sender_nm->is_deopt_mh_entry(_pc)) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
417 DEBUG_ONLY(verify_deopt_mh_original_pc(sender_nm, _fp)); |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
418 _unextended_sp = _fp; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
419 } |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
420 else if (sender_nm->is_deopt_entry(_pc)) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
421 DEBUG_ONLY(verify_deopt_original_pc(sender_nm, _unextended_sp)); |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
422 } |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
423 else if (sender_nm->is_method_handle_return(_pc)) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
424 _unextended_sp = _fp; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
425 } |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
426 } |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
427 } |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
428 |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
429 //------------------------------------------------------------------------------ |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
430 // frame::update_map_with_saved_link |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
431 void frame::update_map_with_saved_link(RegisterMap* map, intptr_t** link_addr) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
432 // The interpreter and compiler(s) always save EBP/RBP in a known |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
433 // location on entry. We must record where that location is |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
434 // so this if EBP/RBP was live on callout from c2 we can find |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
435 // the saved copy no matter what it called. |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
436 |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
437 // Since the interpreter always saves EBP/RBP if we record where it is then |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
438 // we don't have to always save EBP/RBP on entry and exit to c2 compiled |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
439 // code, on entry will be enough. |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
440 map->set_location(rbp->as_VMReg(), (address) link_addr); |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
441 #ifdef AMD64 |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
442 // this is weird "H" ought to be at a higher address however the |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
443 // oopMaps seems to have the "H" regs at the same address and the |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
444 // vanilla register. |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
445 // XXXX make this go away |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
446 if (true) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
447 map->set_location(rbp->as_VMReg()->next(), (address) link_addr); |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
448 } |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
449 #endif // AMD64 |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
450 } |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
451 |
1204 | 452 |
453 //------------------------------------------------------------------------------ | |
454 // frame::sender_for_interpreter_frame | |
0 | 455 frame frame::sender_for_interpreter_frame(RegisterMap* map) const { |
1204 | 456 // SP is the raw SP from the sender after adapter or interpreter |
457 // extension. | |
458 intptr_t* sender_sp = this->sender_sp(); | |
0 | 459 |
460 // This is the sp before any possible extension (adapter/locals). | |
461 intptr_t* unextended_sp = interpreter_frame_sender_sp(); | |
462 | |
463 #ifdef COMPILER2 | |
464 if (map->update_map()) { | |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
465 update_map_with_saved_link(map, (intptr_t**) addr_at(link_offset)); |
0 | 466 } |
1204 | 467 #endif // COMPILER2 |
468 | |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
469 return frame(sender_sp, unextended_sp, link(), sender_pc()); |
0 | 470 } |
471 | |
472 | |
1204 | 473 //------------------------------------------------------------------------------ |
474 // frame::sender_for_compiled_frame | |
0 | 475 frame frame::sender_for_compiled_frame(RegisterMap* map) const { |
476 assert(map != NULL, "map must be set"); | |
477 | |
478 // frame owned by optimizing compiler | |
479 assert(_cb->frame_size() >= 0, "must have non-zero frame size"); | |
1204 | 480 intptr_t* sender_sp = unextended_sp() + _cb->frame_size(); |
481 intptr_t* unextended_sp = sender_sp; | |
0 | 482 |
483 // On Intel the return_address is always the word on the stack | |
484 address sender_pc = (address) *(sender_sp-1); | |
485 | |
1204 | 486 // This is the saved value of EBP which may or may not really be an FP. |
487 // It is only an FP if the sender is an interpreter frame (or C1?). | |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
488 intptr_t** saved_fp_addr = (intptr_t**) (sender_sp - frame::sender_sp_offset); |
1135
e66fd840cb6b
6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents:
844
diff
changeset
|
489 |
0 | 490 if (map->update_map()) { |
491 // Tell GC to use argument oopmaps for some runtime stubs that need it. | |
492 // For C1, the runtime stub might not have oop maps, so set this flag | |
493 // outside of update_register_map. | |
494 map->set_include_argument_oops(_cb->caller_must_gc_arguments(map->thread())); | |
495 if (_cb->oop_maps() != NULL) { | |
496 OopMapSet::update_register_map(this, map); | |
497 } | |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
498 |
1204 | 499 // Since the prolog does the save and restore of EBP there is no oopmap |
0 | 500 // for it so we must fill in its location as if there was an oopmap entry |
501 // since if our caller was compiled code there could be live jvm state in it. | |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
502 update_map_with_saved_link(map, saved_fp_addr); |
0 | 503 } |
504 | |
505 assert(sender_sp != sp(), "must have changed"); | |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
506 return frame(sender_sp, unextended_sp, *saved_fp_addr, sender_pc); |
0 | 507 } |
508 | |
1204 | 509 |
510 //------------------------------------------------------------------------------ | |
511 // frame::sender | |
0 | 512 frame frame::sender(RegisterMap* map) const { |
513 // Default is we done have to follow them. The sender_for_xxx will | |
514 // update it accordingly | |
515 map->set_include_argument_oops(false); | |
516 | |
517 if (is_entry_frame()) return sender_for_entry_frame(map); | |
518 if (is_interpreted_frame()) return sender_for_interpreter_frame(map); | |
519 assert(_cb == CodeCache::find_blob(pc()),"Must be the same"); | |
520 | |
521 if (_cb != NULL) { | |
522 return sender_for_compiled_frame(map); | |
523 } | |
524 // Must be native-compiled frame, i.e. the marshaling code for native | |
525 // methods that exists in the core system. | |
526 return frame(sender_sp(), link(), sender_pc()); | |
527 } | |
528 | |
529 | |
530 bool frame::interpreter_frame_equals_unpacked_fp(intptr_t* fp) { | |
531 assert(is_interpreted_frame(), "must be interpreter frame"); | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
532 Method* method = interpreter_frame_method(); |
0 | 533 // When unpacking an optimized frame the frame pointer is |
534 // adjusted with: | |
535 int diff = (method->max_locals() - method->size_of_parameters()) * | |
1506 | 536 Interpreter::stackElementWords; |
0 | 537 return _fp == (fp - diff); |
538 } | |
539 | |
540 void frame::pd_gc_epilog() { | |
541 // nothing done here now | |
542 } | |
543 | |
107
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
544 bool frame::is_interpreted_frame_valid(JavaThread* thread) const { |
0 | 545 // QQQ |
546 #ifdef CC_INTERP | |
547 #else | |
548 assert(is_interpreted_frame(), "Not an interpreted frame"); | |
549 // These are reasonable sanity checks | |
550 if (fp() == 0 || (intptr_t(fp()) & (wordSize-1)) != 0) { | |
551 return false; | |
552 } | |
553 if (sp() == 0 || (intptr_t(sp()) & (wordSize-1)) != 0) { | |
554 return false; | |
555 } | |
556 if (fp() + interpreter_frame_initial_sp_offset < sp()) { | |
557 return false; | |
558 } | |
559 // These are hacks to keep us out of trouble. | |
560 // The problem with these is that they mask other problems | |
561 if (fp() <= sp()) { // this attempts to deal with unsigned comparison above | |
562 return false; | |
563 } | |
107
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
564 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
565 // do some validation of frame elements |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
566 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
567 // first the method |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
568 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
569 Method* m = *interpreter_frame_method_addr(); |
107
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
570 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
571 // validate the method we'd find in this potential sender |
7176
59c790074993
8003635: NPG: AsynchGetCallTrace broken by Method* virtual call
coleenp
parents:
6725
diff
changeset
|
572 if (!m->is_valid_method()) return false; |
107
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
573 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
574 // stack frames shouldn't be much larger than max_stack elements |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
575 |
1506 | 576 if (fp() - sp() > 1024 + m->max_stack()*Interpreter::stackElementSize) { |
0 | 577 return false; |
578 } | |
107
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
579 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
580 // validate bci/bcx |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
581 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
582 intptr_t bcx = interpreter_frame_bcx(); |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
583 if (m->validate_bci_from_bcx(bcx) < 0) { |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
584 return false; |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
585 } |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
586 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
587 // validate ConstantPoolCache* |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
588 ConstantPoolCache* cp = *interpreter_frame_cache_addr(); |
11034 | 589 if (cp == NULL || !cp->is_metaspace_object()) return false; |
107
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
590 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
591 // validate locals |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
592 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
593 address locals = (address) *interpreter_frame_locals_addr(); |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
594 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
595 if (locals > thread->stack_base() || locals < (address) fp()) return false; |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
596 |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
597 // We'd have to be pretty unlucky to be mislead at this point |
93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents:
0
diff
changeset
|
598 |
0 | 599 #endif // CC_INTERP |
600 return true; | |
601 } | |
602 | |
603 BasicType frame::interpreter_frame_result(oop* oop_result, jvalue* value_result) { | |
604 #ifdef CC_INTERP | |
1681
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1552
diff
changeset
|
605 // Needed for JVMTI. The result should always be in the |
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1552
diff
changeset
|
606 // interpreterState object |
0 | 607 interpreterState istate = get_interpreterState(); |
608 #endif // CC_INTERP | |
609 assert(is_interpreted_frame(), "interpreted frame expected"); | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
610 Method* method = interpreter_frame_method(); |
0 | 611 BasicType type = method->result_type(); |
612 | |
613 intptr_t* tos_addr; | |
614 if (method->is_native()) { | |
615 // Prior to calling into the runtime to report the method_exit the possible | |
616 // return value is pushed to the native stack. If the result is a jfloat/jdouble | |
617 // then ST0 is saved before EAX/EDX. See the note in generate_native_result | |
618 tos_addr = (intptr_t*)sp(); | |
619 if (type == T_FLOAT || type == T_DOUBLE) { | |
620 // QQQ seems like this code is equivalent on the two platforms | |
621 #ifdef AMD64 | |
622 // This is times two because we do a push(ltos) after pushing XMM0 | |
623 // and that takes two interpreter stack slots. | |
1506 | 624 tos_addr += 2 * Interpreter::stackElementWords; |
0 | 625 #else |
626 tos_addr += 2; | |
627 #endif // AMD64 | |
628 } | |
629 } else { | |
630 tos_addr = (intptr_t*)interpreter_frame_tos_address(); | |
631 } | |
632 | |
633 switch (type) { | |
634 case T_OBJECT : | |
635 case T_ARRAY : { | |
636 oop obj; | |
637 if (method->is_native()) { | |
638 #ifdef CC_INTERP | |
639 obj = istate->_oop_temp; | |
640 #else | |
12316
190899198332
7195622: CheckUnhandledOops has limited usefulness now
hseigel
parents:
11034
diff
changeset
|
641 obj = cast_to_oop(at(interpreter_frame_oop_temp_offset)); |
0 | 642 #endif // CC_INTERP |
643 } else { | |
644 oop* obj_p = (oop*)tos_addr; | |
645 obj = (obj_p == NULL) ? (oop)NULL : *obj_p; | |
646 } | |
647 assert(obj == NULL || Universe::heap()->is_in(obj), "sanity check"); | |
648 *oop_result = obj; | |
649 break; | |
650 } | |
651 case T_BOOLEAN : value_result->z = *(jboolean*)tos_addr; break; | |
652 case T_BYTE : value_result->b = *(jbyte*)tos_addr; break; | |
653 case T_CHAR : value_result->c = *(jchar*)tos_addr; break; | |
654 case T_SHORT : value_result->s = *(jshort*)tos_addr; break; | |
655 case T_INT : value_result->i = *(jint*)tos_addr; break; | |
656 case T_LONG : value_result->j = *(jlong*)tos_addr; break; | |
657 case T_FLOAT : { | |
658 #ifdef AMD64 | |
659 value_result->f = *(jfloat*)tos_addr; | |
660 #else | |
661 if (method->is_native()) { | |
662 jdouble d = *(jdouble*)tos_addr; // Result was in ST0 so need to convert to jfloat | |
663 value_result->f = (jfloat)d; | |
664 } else { | |
665 value_result->f = *(jfloat*)tos_addr; | |
666 } | |
667 #endif // AMD64 | |
668 break; | |
669 } | |
670 case T_DOUBLE : value_result->d = *(jdouble*)tos_addr; break; | |
671 case T_VOID : /* Nothing to do */ break; | |
672 default : ShouldNotReachHere(); | |
673 } | |
674 | |
675 return type; | |
676 } | |
677 | |
678 | |
679 intptr_t* frame::interpreter_frame_tos_at(jint offset) const { | |
680 int index = (Interpreter::expr_offset_in_bytes(offset)/wordSize); | |
681 return &interpreter_frame_tos_address()[index]; | |
682 } | |
3336
2e038ad0c1d0
7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents:
1972
diff
changeset
|
683 |
4824
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
684 #ifndef PRODUCT |
3336
2e038ad0c1d0
7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents:
1972
diff
changeset
|
685 |
2e038ad0c1d0
7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents:
1972
diff
changeset
|
686 #define DESCRIBE_FP_OFFSET(name) \ |
3365
3cfb240033d1
7043301: assert(locals < caller->fp() || locals > (caller->fp() + 16)) failed: locals in save area
never
parents:
3363
diff
changeset
|
687 values.describe(frame_no, fp() + frame::name##_offset, #name) |
3336
2e038ad0c1d0
7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents:
1972
diff
changeset
|
688 |
2e038ad0c1d0
7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents:
1972
diff
changeset
|
689 void frame::describe_pd(FrameValues& values, int frame_no) { |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4868
diff
changeset
|
690 if (is_interpreted_frame()) { |
3336
2e038ad0c1d0
7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents:
1972
diff
changeset
|
691 DESCRIBE_FP_OFFSET(interpreter_frame_sender_sp); |
2e038ad0c1d0
7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents:
1972
diff
changeset
|
692 DESCRIBE_FP_OFFSET(interpreter_frame_last_sp); |
2e038ad0c1d0
7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents:
1972
diff
changeset
|
693 DESCRIBE_FP_OFFSET(interpreter_frame_method); |
2e038ad0c1d0
7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents:
1972
diff
changeset
|
694 DESCRIBE_FP_OFFSET(interpreter_frame_mdx); |
2e038ad0c1d0
7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents:
1972
diff
changeset
|
695 DESCRIBE_FP_OFFSET(interpreter_frame_cache); |
2e038ad0c1d0
7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents:
1972
diff
changeset
|
696 DESCRIBE_FP_OFFSET(interpreter_frame_locals); |
2e038ad0c1d0
7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents:
1972
diff
changeset
|
697 DESCRIBE_FP_OFFSET(interpreter_frame_bcx); |
2e038ad0c1d0
7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents:
1972
diff
changeset
|
698 DESCRIBE_FP_OFFSET(interpreter_frame_initial_sp); |
2e038ad0c1d0
7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents:
1972
diff
changeset
|
699 } |
2e038ad0c1d0
7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents:
1972
diff
changeset
|
700 } |
2e038ad0c1d0
7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents:
1972
diff
changeset
|
701 #endif |
3931
5432047c7db7
7087445: Improve platform independence of JSR292 shared code
bdelsart
parents:
3365
diff
changeset
|
702 |
5432047c7db7
7087445: Improve platform independence of JSR292 shared code
bdelsart
parents:
3365
diff
changeset
|
703 intptr_t *frame::initial_deoptimization_info() { |
5432047c7db7
7087445: Improve platform independence of JSR292 shared code
bdelsart
parents:
3365
diff
changeset
|
704 // used to reset the saved FP |
5432047c7db7
7087445: Improve platform independence of JSR292 shared code
bdelsart
parents:
3365
diff
changeset
|
705 return fp(); |
5432047c7db7
7087445: Improve platform independence of JSR292 shared code
bdelsart
parents:
3365
diff
changeset
|
706 } |
4806
eaa9557116a2
7120448: Fix FP values for compiled frames in frame::describe
bdelsart
parents:
4056
diff
changeset
|
707 |
eaa9557116a2
7120448: Fix FP values for compiled frames in frame::describe
bdelsart
parents:
4056
diff
changeset
|
708 intptr_t* frame::real_fp() const { |
eaa9557116a2
7120448: Fix FP values for compiled frames in frame::describe
bdelsart
parents:
4056
diff
changeset
|
709 if (_cb != NULL) { |
eaa9557116a2
7120448: Fix FP values for compiled frames in frame::describe
bdelsart
parents:
4056
diff
changeset
|
710 // use the frame size if valid |
eaa9557116a2
7120448: Fix FP values for compiled frames in frame::describe
bdelsart
parents:
4056
diff
changeset
|
711 int size = _cb->frame_size(); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4868
diff
changeset
|
712 if (size > 0) { |
4806
eaa9557116a2
7120448: Fix FP values for compiled frames in frame::describe
bdelsart
parents:
4056
diff
changeset
|
713 return unextended_sp() + size; |
eaa9557116a2
7120448: Fix FP values for compiled frames in frame::describe
bdelsart
parents:
4056
diff
changeset
|
714 } |
eaa9557116a2
7120448: Fix FP values for compiled frames in frame::describe
bdelsart
parents:
4056
diff
changeset
|
715 } |
eaa9557116a2
7120448: Fix FP values for compiled frames in frame::describe
bdelsart
parents:
4056
diff
changeset
|
716 // else rely on fp() |
eaa9557116a2
7120448: Fix FP values for compiled frames in frame::describe
bdelsart
parents:
4056
diff
changeset
|
717 assert(! is_compiled_frame(), "unknown compiled frame size"); |
eaa9557116a2
7120448: Fix FP values for compiled frames in frame::describe
bdelsart
parents:
4056
diff
changeset
|
718 return fp(); |
eaa9557116a2
7120448: Fix FP values for compiled frames in frame::describe
bdelsart
parents:
4056
diff
changeset
|
719 } |