hotspot/src/os_cpu/linux_x86/vm/thread_linux_x86.cpp
author ccheung
Thu, 07 Apr 2016 22:03:04 -0700
changeset 37439 e8970711113b
parent 33160 c59f1676d27e
child 40644 39e631ed7145
permissions -rw-r--r--
8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive Summary: This optimization reduces the size of the RW region of the CDS archive. It also reduces the amount of pages in the RW region that are actually written into during runtime. Reviewed-by: dlong, iklam, jiangli Contributed-by: ioi.lam@oracle.com, calvin.cheung@oracle.com, goetz.lindenmaier@sap.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
     2
 * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1
diff changeset
    21
 * questions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    25
#include "precompiled.hpp"
37439
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 33160
diff changeset
    26
#include "memory/metaspaceShared.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    27
#include "runtime/frame.inline.hpp"
14583
d70ee55535f4 8003935: Simplify the needed includes for using Thread::current()
stefank
parents: 7397
diff changeset
    28
#include "runtime/thread.inline.hpp"
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    29
489c9b5090e2 Initial load
duke
parents:
diff changeset
    30
// For Forte Analyzer AsyncGetCallTrace profiling support - thread is
489c9b5090e2 Initial load
duke
parents:
diff changeset
    31
// currently interrupted by SIGPROF
489c9b5090e2 Initial load
duke
parents:
diff changeset
    32
bool JavaThread::pd_get_top_frame_for_signal_handler(frame* fr_addr,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    33
  void* ucontext, bool isInJava) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    34
489c9b5090e2 Initial load
duke
parents:
diff changeset
    35
  assert(Thread::current() == this, "caller must be current thread");
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
    36
  return pd_get_top_frame(fr_addr, ucontext, isInJava);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
    37
}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
    38
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
    39
bool JavaThread::pd_get_top_frame_for_profiling(frame* fr_addr, void* ucontext, bool isInJava) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
    40
  return pd_get_top_frame(fr_addr, ucontext, isInJava);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
    41
}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
    42
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 14583
diff changeset
    43
bool JavaThread::pd_get_top_frame(frame* fr_addr, void* ucontext, bool isInJava) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
  assert(this->is_Java_thread(), "must be JavaThread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
  JavaThread* jt = (JavaThread *)this;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
  // If we have a last_Java_frame, then we should use it even if
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
  // isInJava == true.  It should be more reliable than ucontext info.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
  if (jt->has_last_Java_frame()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
    *fr_addr = jt->pd_last_frame();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
    return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
  // At this point, we don't have a last_Java_frame, so
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
  // we try to glean some information out of the ucontext
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
  // if we were running Java code when SIGPROF came in.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
  if (isInJava) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
    ucontext_t* uc = (ucontext_t*) ucontext;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
    intptr_t* ret_fp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
    intptr_t* ret_sp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
    ExtendedPC addr = os::Linux::fetch_frame_from_ucontext(this, uc,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
      &ret_sp, &ret_fp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
    if (addr.pc() == NULL || ret_sp == NULL ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
      // ucontext wasn't useful
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
      return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
37439
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 33160
diff changeset
    69
#if INCLUDE_CDS
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 33160
diff changeset
    70
    if (UseSharedSpaces && MetaspaceShared::is_in_shared_region(addr.pc(), MetaspaceShared::md)) {
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 33160
diff changeset
    71
      // In the middle of a trampoline call. Bail out for safety.
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 33160
diff changeset
    72
      // This happens rarely so shouldn't affect profiling.
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 33160
diff changeset
    73
      return false;
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 33160
diff changeset
    74
    }
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 33160
diff changeset
    75
#endif
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 33160
diff changeset
    76
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
    frame ret_frame(ret_sp, ret_fp, addr.pc());
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
    if (!ret_frame.safe_for_sender(jt)) {
33160
c59f1676d27e 8136421: JEP 243: Java-Level JVM Compiler Interface
twisti
parents: 18025
diff changeset
    79
#if defined(COMPILER2) || INCLUDE_JVMCI
c59f1676d27e 8136421: JEP 243: Java-Level JVM Compiler Interface
twisti
parents: 18025
diff changeset
    80
      // C2 and JVMCI use ebp as a general register see if NULL fp helps
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
      frame ret_frame2(ret_sp, NULL, addr.pc());
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
      if (!ret_frame2.safe_for_sender(jt)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
        // nothing else to try if the frame isn't good
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
        return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
      ret_frame = ret_frame2;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
      // nothing else to try if the frame isn't good
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
      return false;
33160
c59f1676d27e 8136421: JEP 243: Java-Level JVM Compiler Interface
twisti
parents: 18025
diff changeset
    90
#endif /* COMPILER2 || INCLUDE_JVMCI */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
    *fr_addr = ret_frame;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
    return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
  // nothing else to try
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
  return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
}
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
    99
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   100
void JavaThread::cache_global_variables() { }
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   101