src/os_cpu/solaris_sparc/vm/thread_solaris_sparc.cpp

Tue, 01 Feb 2011 11:23:19 -0500

author
coleenp
date
Tue, 01 Feb 2011 11:23:19 -0500
changeset 2507
d70fe6ab4436
parent 2314
f95d63e2154a
child 4299
f34d701e952e
permissions
-rw-r--r--

6588413: Use -fvisibility=hidden for gcc compiles
Summary: Add option for gcc 4 and above, define JNIEXPORT and JNIIMPORT to visibility=default, add for jio_snprintf and others since -fvisibility=hidden overrides --version-script definitions.
Reviewed-by: kamg, never

     1 /*
     2  * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
     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  *
    19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    20  * or visit www.oracle.com if you need additional information or have any
    21  * questions.
    22  *
    23  */
    25 #include "precompiled.hpp"
    26 #include "runtime/frame.inline.hpp"
    27 #include "thread_solaris.inline.hpp"
    29 // For Forte Analyzer AsyncGetCallTrace profiling support - thread is
    30 // currently interrupted by SIGPROF
    31 //
    32 // NOTE: On Solaris, register windows are flushed in the signal handler
    33 // except for possibly the top frame.
    34 //
    35 bool JavaThread::pd_get_top_frame_for_signal_handler(frame* fr_addr,
    36   void* ucontext, bool isInJava) {
    38   assert(Thread::current() == this, "caller must be current thread");
    39   assert(this->is_Java_thread(), "must be JavaThread");
    41   JavaThread* jt = (JavaThread *)this;
    43   if (!isInJava) {
    44     // make_walkable flushes register windows and grabs last_Java_pc
    45     // which can not be done if the ucontext sp matches last_Java_sp
    46     // stack walking utilities assume last_Java_pc set if marked flushed
    47     jt->frame_anchor()->make_walkable(jt);
    48   }
    50   // If we have a walkable last_Java_frame, then we should use it
    51   // even if isInJava == true. It should be more reliable than
    52   // ucontext info.
    53   if (jt->has_last_Java_frame() && jt->frame_anchor()->walkable()) {
    54     *fr_addr = jt->pd_last_frame();
    55     return true;
    56   }
    58   ucontext_t* uc = (ucontext_t*) ucontext;
    60   // At this point, we don't have a walkable last_Java_frame, so
    61   // we try to glean some information out of the ucontext.
    62   intptr_t* ret_sp;
    63   ExtendedPC addr = os::Solaris::fetch_frame_from_ucontext(this, uc,
    64     &ret_sp, NULL /* ret_fp only used on Solaris X86 */);
    65   if (addr.pc() == NULL || ret_sp == NULL) {
    66     // ucontext wasn't useful
    67     return false;
    68   }
    70   frame ret_frame(ret_sp, frame::unpatchable, addr.pc());
    72   // we were running Java code when SIGPROF came in
    73   if (isInJava) {
    76     // If the frame we got is safe then it is most certainly valid
    77     if (ret_frame.safe_for_sender(jt)) {
    78       *fr_addr = ret_frame;
    79       return true;
    80     }
    82     // If it isn't safe then we can try several things to try and get
    83     // a good starting point.
    84     //
    85     // On sparc the frames are almost certainly walkable in the sense
    86     // of sp/fp linkages. However because of recycling of windows if
    87     // a piece of code does multiple save's where the initial save creates
    88     // a real frame with a return pc and the succeeding save's are used to
    89     // simply get free registers and have no real pc then the pc linkage on these
    90     // "inner" temporary frames will be bogus.
    91     // Since there is in general only a nesting level like
    92     // this one deep in general we'll try and unwind such an "inner" frame
    93     // here ourselves and see if it makes sense
    95     frame unwind_frame(ret_frame.fp(), frame::unpatchable, addr.pc());
    97     if (unwind_frame.safe_for_sender(jt)) {
    98       *fr_addr = unwind_frame;
    99       return true;
   100     }
   102     // Well that didn't work. Most likely we're toast on this tick
   103     // The previous code would try this. I think it is dubious in light
   104     // of changes to safe_for_sender and the unwind trick above but
   105     // if it gets us a safe frame who wants to argue.
   107     // If we have a last_Java_sp, then the SIGPROF signal caught us
   108     // right when we were transitioning from _thread_in_Java to a new
   109     // JavaThreadState. We use last_Java_sp instead of the sp from
   110     // the ucontext since it should be more reliable.
   112     if (jt->has_last_Java_frame()) {
   113       ret_sp = jt->last_Java_sp();
   114       frame ret_frame2(ret_sp, frame::unpatchable, addr.pc());
   115       if (ret_frame2.safe_for_sender(jt)) {
   116         *fr_addr = ret_frame2;
   117         return true;
   118       }
   119     }
   121     // This is the best we can do. We will only be able to decode the top frame
   123     *fr_addr = ret_frame;
   124     return true;
   125   }
   127   // At this point, we know we weren't running Java code. We might
   128   // have a last_Java_sp, but we don't have a walkable frame.
   129   // However, we might still be able to construct something useful
   130   // if the thread was running native code.
   131   if (jt->has_last_Java_frame()) {
   132     assert(!jt->frame_anchor()->walkable(), "case covered above");
   134     frame ret_frame(jt->last_Java_sp(), frame::unpatchable, addr.pc());
   135     *fr_addr = ret_frame;
   136     return true;
   137   }
   139   // nothing else to try but what we found initially
   141   *fr_addr = ret_frame;
   142   return true;
   143 }
   145 void JavaThread::cache_global_variables() { }

mercurial