annotate src/os_cpu/bsd_x86/vm/thread_bsd_x86.cpp @ 4558:3706975946e4

Make graph dumping a bit more robust when there is no method, enable debug in the startCompiler method, add context and scope for snippets installation Made IGV display graphs even if some edges are problematic When schedule failed don't use it
author Gilles Duboscq <duboscq@ssw.jku.at>
date Fri, 10 Feb 2012 02:22:23 +0100
parents f08d439fab8c
children f34d701e952e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1 /*
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2 * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
7 * published by the Free Software Foundation.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
8 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
13 * accompanied this code).
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
14 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
18 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
21 * questions.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
22 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
23 */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
24
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
25 #include "precompiled.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
26 #include "runtime/frame.inline.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
27 #include "thread_bsd.inline.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
28
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
29 // For Forte Analyzer AsyncGetCallTrace profiling support - thread is
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
30 // currently interrupted by SIGPROF
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
31 bool JavaThread::pd_get_top_frame_for_signal_handler(frame* fr_addr,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
32 void* ucontext, bool isInJava) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
33
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
34 assert(Thread::current() == this, "caller must be current thread");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
35 assert(this->is_Java_thread(), "must be JavaThread");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
36
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
37 JavaThread* jt = (JavaThread *)this;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
38
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
39 // If we have a last_Java_frame, then we should use it even if
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
40 // isInJava == true. It should be more reliable than ucontext info.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
41 if (jt->has_last_Java_frame()) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
42 *fr_addr = jt->pd_last_frame();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
43 return true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
44 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
45
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
46 // At this point, we don't have a last_Java_frame, so
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
47 // we try to glean some information out of the ucontext
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
48 // if we were running Java code when SIGPROF came in.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
49 if (isInJava) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
50 ucontext_t* uc = (ucontext_t*) ucontext;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
51
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
52 intptr_t* ret_fp;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
53 intptr_t* ret_sp;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
54 ExtendedPC addr = os::Bsd::fetch_frame_from_ucontext(this, uc,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
55 &ret_sp, &ret_fp);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
56 if (addr.pc() == NULL || ret_sp == NULL ) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
57 // ucontext wasn't useful
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
58 return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
59 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
60
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
61 frame ret_frame(ret_sp, ret_fp, addr.pc());
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
62 if (!ret_frame.safe_for_sender(jt)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
63 #ifdef COMPILER2
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
64 // C2 uses ebp as a general register see if NULL fp helps
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
65 frame ret_frame2(ret_sp, NULL, addr.pc());
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
66 if (!ret_frame2.safe_for_sender(jt)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
67 // nothing else to try if the frame isn't good
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
68 return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
69 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
70 ret_frame = ret_frame2;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
71 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
72 // nothing else to try if the frame isn't good
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
73 return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
74 #endif /* COMPILER2 */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
75 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
76 *fr_addr = ret_frame;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
77 return true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
78 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
79
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
80 // nothing else to try
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
81 return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
82 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
83
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
84 void JavaThread::cache_global_variables() { }