hotspot/src/share/vm/runtime/frame.hpp
author ccheung
Thu, 07 Apr 2016 22:03:04 -0700
changeset 37439 e8970711113b
parent 33614 6ca1ebbf0dc1
child 37466 287c4ebd11b0
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
/*
29571
6627b10e05f8 6313046: Remove unused frame::native_param_addr code
mikael
parents: 29180
diff changeset
     2
 * Copyright (c) 1997, 2015, 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: 5419
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5419
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: 5419
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: 6269
diff changeset
    25
#ifndef SHARE_VM_RUNTIME_FRAME_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6269
diff changeset
    26
#define SHARE_VM_RUNTIME_FRAME_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6269
diff changeset
    27
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
    28
#include "oops/method.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6269
diff changeset
    29
#include "runtime/basicLock.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6269
diff changeset
    30
#include "runtime/monitorChunk.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6269
diff changeset
    31
#include "runtime/registerMap.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6269
diff changeset
    32
#include "utilities/top.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6269
diff changeset
    33
#ifdef TARGET_ARCH_zero
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6269
diff changeset
    34
# include "stack_zero.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6269
diff changeset
    35
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6269
diff changeset
    36
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
typedef class BytecodeInterpreter* interpreterState;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
class CodeBlob;
9437
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8921
diff changeset
    40
class FrameValues;
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
    41
class vframeArray;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
// A frame represents a physical stack frame (an activation).  Frames
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
// can be C or Java frames, and the Java frames can be interpreted or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
// compiled.  In contrast, vframes represent source-level activations,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
// so that one physical frame can correspond to multiple source level
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
// frames because of inlining.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
class frame VALUE_OBJ_CLASS_SPEC {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
  // Instance variables:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
  intptr_t* _sp; // stack pointer (from Thread::last_Java_sp)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
  address   _pc; // program counter (the next instruction after the call)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
  CodeBlob* _cb; // CodeBlob that "owns" pc
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
  enum deopt_state {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
    not_deoptimized,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
    is_deoptimized,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
    unknown
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
  deopt_state _deopt_state;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
  // Constructors
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
  frame();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
26821
ce9f82507dc2 8058345: Refactor native stack printing from vmError.cpp to debug.cpp to make it available in gdb as well
simonis
parents: 25717
diff changeset
    69
#ifndef PRODUCT
ce9f82507dc2 8058345: Refactor native stack printing from vmError.cpp to debug.cpp to make it available in gdb as well
simonis
parents: 25717
diff changeset
    70
  // This is a generic constructor which is only used by pns() in debug.cpp.
ce9f82507dc2 8058345: Refactor native stack printing from vmError.cpp to debug.cpp to make it available in gdb as well
simonis
parents: 25717
diff changeset
    71
  // pns (i.e. print native stack) uses this constructor to create a starting
ce9f82507dc2 8058345: Refactor native stack printing from vmError.cpp to debug.cpp to make it available in gdb as well
simonis
parents: 25717
diff changeset
    72
  // frame for stack walking. The implementation of this constructor is platform
ce9f82507dc2 8058345: Refactor native stack printing from vmError.cpp to debug.cpp to make it available in gdb as well
simonis
parents: 25717
diff changeset
    73
  // dependent (i.e. SPARC doesn't need an 'fp' argument an will ignore it) but
ce9f82507dc2 8058345: Refactor native stack printing from vmError.cpp to debug.cpp to make it available in gdb as well
simonis
parents: 25717
diff changeset
    74
  // we want to keep the signature generic because pns() is shared code.
ce9f82507dc2 8058345: Refactor native stack printing from vmError.cpp to debug.cpp to make it available in gdb as well
simonis
parents: 25717
diff changeset
    75
  frame(void* sp, void* fp, void* pc);
ce9f82507dc2 8058345: Refactor native stack printing from vmError.cpp to debug.cpp to make it available in gdb as well
simonis
parents: 25717
diff changeset
    76
#endif
ce9f82507dc2 8058345: Refactor native stack printing from vmError.cpp to debug.cpp to make it available in gdb as well
simonis
parents: 25717
diff changeset
    77
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
  // Accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
  // pc: Returns the pc at which this frame will continue normally.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
  // It must point at the beginning of the next instruction to execute.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
  address pc() const             { return _pc; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
  // This returns the pc that if you were in the debugger you'd see. Not
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
  // the idealized value in the frame object. This undoes the magic conversion
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
  // that happens for deoptimized frames. In addition it makes the value the
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
  // hardware would want to see in the native frame. The only user (at this point)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
  // is deoptimization. It likely no one else should ever use it.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
  address raw_pc() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
  void set_pc( address   newpc );
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
  intptr_t* sp() const           { return _sp; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
  void set_sp( intptr_t* newsp ) { _sp = newsp; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
  CodeBlob* cb() const           { return _cb; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
  // patching operations
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
  void   patch_pc(Thread* thread, address pc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
  // Every frame needs to return a unique id which distinguishes it from all other frames.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
  // For sparc and ia32 use sp. ia64 can have memory frames that are empty so multiple frames
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
  // will have identical sp values. For ia64 the bsp (fp) value will serve. No real frame
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
  // should have an id() of NULL so it is a distinguishing value for an unmatchable frame.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
  // We also have relationals which allow comparing a frame to anoth frame's id() allow
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
  // us to distinguish younger (more recent activation) from older (less recent activations)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
  // A NULL id is only valid when comparing for equality.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
  intptr_t* id(void) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
  bool is_younger(intptr_t* id) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
  bool is_older(intptr_t* id) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
  // testers
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
  // Compares for strict equality. Rarely used or needed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
  // It can return a different result than f1.id() == f2.id()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
  bool equal(frame other) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
  // type testers
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
  bool is_interpreted_frame()    const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
  bool is_java_frame()           const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
  bool is_entry_frame()          const;             // Java frame called from C?
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17872
diff changeset
   124
  bool is_stub_frame()           const;
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 11571
diff changeset
   125
  bool is_ignored_frame()        const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
  bool is_native_frame()         const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
  bool is_runtime_frame()        const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
  bool is_compiled_frame()       const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
  bool is_safepoint_blob_frame() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
  bool is_deoptimized_frame()    const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
  // testers
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
  bool is_first_frame() const; // oldest frame? (has no sender)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
  bool is_first_java_frame() const;              // same for Java frame
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
354
3b42d6fdcb82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 1
diff changeset
   136
  bool is_interpreted_frame_valid(JavaThread* thread) const;       // performs sanity checks on interpreted frames.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
  // tells whether this frame is marked for deoptimization
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
  bool should_be_deoptimized() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
  // tells whether this frame can be deoptimized
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
  bool can_be_deoptimized() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
  // returns the frame size in stack slots
2880
c2974244a496 6848466: frame::frame_size() assertion failure with -XX:+DebugDeoptimization
cfang
parents: 670
diff changeset
   145
  int frame_size(RegisterMap* map) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
  // returns the sending frame
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
  frame sender(RegisterMap* map) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
  // for Profiling - acting on another frame. walks sender frames
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
  // if valid.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
  frame profile_find_Java_sender_frame(JavaThread *thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
  bool safe_for_sender(JavaThread *thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
  // returns the sender, but skips conversion frames
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
  frame real_sender(RegisterMap* map) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
  // returns the the sending Java frame, skipping any intermediate C frames
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
  // NB: receiver must not be first frame
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
  frame java_sender() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
  // Helper methods for better factored code in frame::sender
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
  frame sender_for_compiled_frame(RegisterMap* map) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
  frame sender_for_entry_frame(RegisterMap* map) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
  frame sender_for_interpreter_frame(RegisterMap* map) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
  frame sender_for_native_frame(RegisterMap* map) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
  // All frames:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
  // A low-level interface for vframes:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
  intptr_t* addr_at(int index) const             { return &fp()[index];    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
  intptr_t  at(int index) const                  { return *addr_at(index); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
  // accessors for locals
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
  oop obj_at(int offset) const                   { return *obj_at_addr(offset);  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
  void obj_at_put(int offset, oop value)         { *obj_at_addr(offset) = value; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
  jint int_at(int offset) const                  { return *int_at_addr(offset);  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
  void int_at_put(int offset, jint value)        { *int_at_addr(offset) = value; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
  oop*      obj_at_addr(int offset) const        { return (oop*)     addr_at(offset); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   187
  oop*      adjusted_obj_at_addr(Method* method, int index) { return obj_at_addr(adjust_offset(method, index)); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
  jint*    int_at_addr(int offset) const         { return (jint*)    addr_at(offset); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
  // Link (i.e., the pointer to the previous frame)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
  intptr_t* link() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
  // Return address
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
  address  sender_pc() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
  // Support for deoptimization
6269
10e06287c0b0 6975006: assert(check.is_deoptimized_frame()) failed: missed deopt
never
parents: 6176
diff changeset
   200
  void deoptimize(JavaThread* thread);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
  // The frame's original SP, before any extension by an interpreted callee;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
  // used for packing debug info into vframeArray objects and vframeArray lookup.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
  intptr_t* unextended_sp() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
  // returns the stack pointer of the calling frame
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
  intptr_t* sender_sp() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
11486
cdc636532368 7120448: Fix FP values for compiled frames in frame::describe
bdelsart
parents: 10966
diff changeset
   209
  // Returns the real 'frame pointer' for the current frame.
cdc636532368 7120448: Fix FP values for compiled frames in frame::describe
bdelsart
parents: 10966
diff changeset
   210
  // This is the value expected by the platform ABI when it defines a
cdc636532368 7120448: Fix FP values for compiled frames in frame::describe
bdelsart
parents: 10966
diff changeset
   211
  // frame pointer register. It may differ from the effective value of
cdc636532368 7120448: Fix FP values for compiled frames in frame::describe
bdelsart
parents: 10966
diff changeset
   212
  // the FP register when that register is used in the JVM for other
cdc636532368 7120448: Fix FP values for compiled frames in frame::describe
bdelsart
parents: 10966
diff changeset
   213
  // purposes (like compiled frames on some platforms).
cdc636532368 7120448: Fix FP values for compiled frames in frame::describe
bdelsart
parents: 10966
diff changeset
   214
  // On other platforms, it is defined so that the stack area used by
cdc636532368 7120448: Fix FP values for compiled frames in frame::describe
bdelsart
parents: 10966
diff changeset
   215
  // this frame goes from real_fp() to sp().
cdc636532368 7120448: Fix FP values for compiled frames in frame::describe
bdelsart
parents: 10966
diff changeset
   216
  intptr_t* real_fp() const;
cdc636532368 7120448: Fix FP values for compiled frames in frame::describe
bdelsart
parents: 10966
diff changeset
   217
10539
f87cedf7983c 7087445: Improve platform independence of JSR292 shared code
bdelsart
parents: 9632
diff changeset
   218
  // Deoptimization info, if needed (platform dependent).
f87cedf7983c 7087445: Improve platform independence of JSR292 shared code
bdelsart
parents: 9632
diff changeset
   219
  // Stored in the initial_info field of the unroll info, to be used by
f87cedf7983c 7087445: Improve platform independence of JSR292 shared code
bdelsart
parents: 9632
diff changeset
   220
  // the platform dependent deoptimization blobs.
f87cedf7983c 7087445: Improve platform independence of JSR292 shared code
bdelsart
parents: 9632
diff changeset
   221
  intptr_t *initial_deoptimization_info();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
  // Interpreter frames:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
  intptr_t** interpreter_frame_locals_addr() const;
25714
87fa6860b5ae 8004128: NPG: remove stackwalking in Threads::gc_prologue and gc_epilogue code
coleenp
parents: 22929
diff changeset
   227
  intptr_t*  interpreter_frame_bcp_addr() const;
87fa6860b5ae 8004128: NPG: remove stackwalking in Threads::gc_prologue and gc_epilogue code
coleenp
parents: 22929
diff changeset
   228
  intptr_t*  interpreter_frame_mdp_addr() const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
  // Locals
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
  // The _at version returns a pointer because the address is used for GC.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
  intptr_t* interpreter_frame_local_at(int index) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
  void interpreter_frame_set_locals(intptr_t* locs);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
  // byte code index
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
  jint interpreter_frame_bci() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
  // byte code pointer
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
  address interpreter_frame_bcp() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
  void    interpreter_frame_set_bcp(address bcp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
  // method data pointer
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
  address interpreter_frame_mdp() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
  void    interpreter_frame_set_mdp(address dp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
  // Find receiver out of caller's (compiled) argument list
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
  oop retrieve_receiver(RegisterMap *reg_map);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
  // Return the monitor owner and BasicLock for compiled synchronized
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
  // native methods so that biased locking can revoke the receiver's
7444
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   254
  // bias if necessary.  This is also used by JVMTI's GetLocalInstance method
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   255
  // (via VM_GetReceiver) to retrieve the receiver from a native wrapper frame.
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   256
  BasicLock* get_native_monitor();
be338e543a57 7004582: Add GetThisObject() function to JVMTI 1.2
kamg
parents: 7397
diff changeset
   257
  oop        get_native_receiver();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
  // Find receiver for an invoke when arguments are just pushed on stack (i.e., callee stack-frame is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
  // not setup)
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7444
diff changeset
   261
  oop interpreter_callee_receiver(Symbol* signature)     { return *interpreter_callee_receiver_addr(signature); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7444
diff changeset
   264
  oop* interpreter_callee_receiver_addr(Symbol* signature);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
  // expression stack (may go up or down, direction == 1 or -1)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
  intptr_t* interpreter_frame_expression_stack() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
  static  jint  interpreter_frame_expression_stack_direction();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
  // The _at version returns a pointer because the address is used for GC.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
  intptr_t* interpreter_frame_expression_stack_at(jint offset) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
  // top of expression stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
  intptr_t* interpreter_frame_tos_at(jint offset) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
  intptr_t* interpreter_frame_tos_address() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
  jint  interpreter_frame_expression_stack_size() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
  intptr_t* interpreter_frame_sender_sp() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
#ifndef CC_INTERP
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
  // template based interpreter deoptimization support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
  void  set_interpreter_frame_sender_sp(intptr_t* sender_sp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
  void interpreter_frame_set_monitor_end(BasicObjectLock* value);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
#endif // CC_INTERP
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
22924
5da64eb25f2a 8035396: Introduce accessor for tmp_oop in frame.
goetz
parents: 22838
diff changeset
   290
  // Address of the temp oop in the frame. Needed as GC root.
5da64eb25f2a 8035396: Introduce accessor for tmp_oop in frame.
goetz
parents: 22838
diff changeset
   291
  oop* interpreter_frame_temp_oop_addr() const;
5da64eb25f2a 8035396: Introduce accessor for tmp_oop in frame.
goetz
parents: 22838
diff changeset
   292
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
  // BasicObjectLocks:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
  // interpreter_frame_monitor_begin is higher in memory than interpreter_frame_monitor_end
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
  // Interpreter_frame_monitor_begin points to one element beyond the oldest one,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
  // interpreter_frame_monitor_end   points to the youngest one, or if there are none,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
  //                                 it points to one beyond where the first element will be.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
  // interpreter_frame_monitor_size  reports the allocation size of a monitor in the interpreter stack.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
  //                                 this value is >= BasicObjectLock::size(), and may be rounded up
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
  BasicObjectLock* interpreter_frame_monitor_begin() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
  BasicObjectLock* interpreter_frame_monitor_end()   const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
  BasicObjectLock* next_monitor_in_interpreter_frame(BasicObjectLock* current) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
  BasicObjectLock* previous_monitor_in_interpreter_frame(BasicObjectLock* current) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
  static int interpreter_frame_monitor_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
  void interpreter_frame_verify_monitor(BasicObjectLock* value) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
  // Return/result value from this interpreter frame
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
  // If the method return type is T_OBJECT or T_ARRAY populates oop_result
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
  // For other (non-T_VOID) the appropriate field in the jvalue is populated
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
  // with the result value.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
  // Should only be called when at method exit when the method is not
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
  // exiting due to an exception.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
  BasicType interpreter_frame_result(oop* oop_result, jvalue* value_result);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
  // Method & constant pool cache
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   320
  Method* interpreter_frame_method() const;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   321
  void interpreter_frame_set_method(Method* method);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   322
  Method** interpreter_frame_method_addr() const;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   323
  ConstantPoolCache** interpreter_frame_cache_addr() const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
  // Entry frames
18938
ff8f8cec9434 8016131: nsk/sysdict/vm/stress/chain tests crash the VM in 'entry_frame_is_first()'
rbackman
parents: 18025
diff changeset
   327
  JavaCallWrapper* entry_frame_call_wrapper() const { return *entry_frame_call_wrapper_addr(); }
ff8f8cec9434 8016131: nsk/sysdict/vm/stress/chain tests crash the VM in 'entry_frame_is_first()'
rbackman
parents: 18025
diff changeset
   328
  JavaCallWrapper* entry_frame_call_wrapper_if_safe(JavaThread* thread) const;
ff8f8cec9434 8016131: nsk/sysdict/vm/stress/chain tests crash the VM in 'entry_frame_is_first()'
rbackman
parents: 18025
diff changeset
   329
  JavaCallWrapper** entry_frame_call_wrapper_addr() const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
  intptr_t* entry_frame_argument_at(int offset) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
  // tells whether there is another chunk of Delta stack above
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
  bool entry_frame_is_first() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
  // Compiled frames:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
  // Given the index of a local, and the number of argument words
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
  // in this stack frame, tell which word of the stack frame to find
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
  // the local in.  Arguments are stored above the ofp/rpc pair,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
  // while other locals are stored below it.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
  // Since monitors (BasicLock blocks) are also assigned indexes,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
  // but may have different storage requirements, their presence
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
  // can also affect the calculation of offsets.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
  static int local_offset_for_compiler(int local_index, int nof_args, int max_nof_locals, int max_nof_monitors);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
  // Given the index of a monitor, etc., tell which word of the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
  // stack frame contains the start of the BasicLock block.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
  // Note that the local index by convention is the __higher__
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
  // of the two indexes allocated to the block.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
  static int monitor_offset_for_compiler(int local_index, int nof_args, int max_nof_locals, int max_nof_monitors);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
  // Tell the smallest value that local_offset_for_compiler will attain.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
  // This is used to help determine how much stack frame to allocate.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
  static int min_local_offset_for_compiler(int nof_args, int max_nof_locals, int max_nof_monitors);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
  // Tells if this register must be spilled during a call.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
  // On Intel, all registers are smashed by calls.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
  static bool volatile_across_calls(Register reg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
  // Safepoints
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
  oop saved_oop_result(RegisterMap* map) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
  void set_saved_oop_result(RegisterMap* map, oop obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
  // For debugging
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
  const char* print_name() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
9437
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8921
diff changeset
   372
  void describe_pd(FrameValues& values, int frame_no);
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8921
diff changeset
   373
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
  void print_value() const { print_value_on(tty,NULL); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
  void print_value_on(outputStream* st, JavaThread *thread) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
  void print_on(outputStream* st) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
  void interpreter_frame_print_on(outputStream* st) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
  void print_on_error(outputStream* st, char* buf, int buflen, bool verbose = false) const;
19952
bc974e92f881 8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents: 18938
diff changeset
   380
  static void print_C_frame(outputStream* st, char* buf, int buflen, address pc);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
9437
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8921
diff changeset
   382
  // Add annotated descriptions of memory locations belonging to this frame to values
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8921
diff changeset
   383
  void describe(FrameValues& values, int frame_no);
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8921
diff changeset
   384
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
  // Conversion from an VMReg to physical stack location
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
  oop* oopmapreg_to_location(VMReg reg, const RegisterMap* regmap) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
  // Oops-do's
17872
2c49e72dcf08 8009981: nashorn tests fail with -XX:+VerifyStack
roland
parents: 14633
diff changeset
   389
  void oops_compiled_arguments_do(Symbol* signature, bool has_receiver, bool has_appendix, const RegisterMap* reg_map, OopClosure* f);
22899
e2a6bf7f343a 8035393: Use CLDClosure instead of CLDToOopClosure in frame::oops_interpreted_do
stefank
parents: 19952
diff changeset
   390
  void oops_interpreted_do(OopClosure* f, CLDClosure* cld_f, const RegisterMap* map, bool query_oop_map_cache = true);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
 private:
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7444
diff changeset
   393
  void oops_interpreted_arguments_do(Symbol* signature, bool has_receiver, OopClosure* f);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
  // Iteration of oops
22899
e2a6bf7f343a 8035393: Use CLDClosure instead of CLDToOopClosure in frame::oops_interpreted_do
stefank
parents: 19952
diff changeset
   396
  void oops_do_internal(OopClosure* f, CLDClosure* cld_f, CodeBlobClosure* cf, RegisterMap* map, bool use_interpreter_oop_map_cache);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
  void oops_entry_do(OopClosure* f, const RegisterMap* map);
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3261
diff changeset
   398
  void oops_code_blob_do(OopClosure* f, CodeBlobClosure* cf, const RegisterMap* map);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   399
  int adjust_offset(Method* method, int index); // helper for above fn
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
  // Memory management
22899
e2a6bf7f343a 8035393: Use CLDClosure instead of CLDToOopClosure in frame::oops_interpreted_do
stefank
parents: 19952
diff changeset
   402
  void oops_do(OopClosure* f, CLDClosure* cld_f, CodeBlobClosure* cf, RegisterMap* map) { oops_do_internal(f, cld_f, cf, map, true); }
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3261
diff changeset
   403
  void nmethods_do(CodeBlobClosure* cf);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   405
  // RedefineClasses support for finding live interpreted methods on the stack
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   406
  void metadata_do(void f(Metadata*));
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   407
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
  // Verification
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
  void verify(const RegisterMap* map);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
  static bool verify_return_pc(address x);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
  // Usage:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
  // assert(frame::verify_return_pc(return_address), "must be a return pc");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
  int pd_oop_map_offset_adjustment() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6269
diff changeset
   416
#ifdef TARGET_ARCH_x86
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6269
diff changeset
   417
# include "frame_x86.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6269
diff changeset
   418
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6269
diff changeset
   419
#ifdef TARGET_ARCH_sparc
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6269
diff changeset
   420
# include "frame_sparc.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6269
diff changeset
   421
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6269
diff changeset
   422
#ifdef TARGET_ARCH_zero
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6269
diff changeset
   423
# include "frame_zero.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6269
diff changeset
   424
#endif
8107
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 8076
diff changeset
   425
#ifdef TARGET_ARCH_arm
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 8076
diff changeset
   426
# include "frame_arm.hpp"
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 8076
diff changeset
   427
#endif
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 8076
diff changeset
   428
#ifdef TARGET_ARCH_ppc
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 8076
diff changeset
   429
# include "frame_ppc.hpp"
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 8076
diff changeset
   430
#endif
29180
50369728b00e 8064611: AARCH64: Changes to HotSpot shared code
aph
parents: 26821
diff changeset
   431
#ifdef TARGET_ARCH_aarch64
50369728b00e 8064611: AARCH64: Changes to HotSpot shared code
aph
parents: 26821
diff changeset
   432
# include "frame_aarch64.hpp"
50369728b00e 8064611: AARCH64: Changes to HotSpot shared code
aph
parents: 26821
diff changeset
   433
#endif
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6269
diff changeset
   434
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
11571
23f825a42a85 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 11486
diff changeset
   437
#ifndef PRODUCT
9437
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8921
diff changeset
   438
// A simple class to describe a location on the stack
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8921
diff changeset
   439
class FrameValue VALUE_OBJ_CLASS_SPEC {
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8921
diff changeset
   440
 public:
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8921
diff changeset
   441
  intptr_t* location;
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8921
diff changeset
   442
  char* description;
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8921
diff changeset
   443
  int owner;
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8921
diff changeset
   444
  int priority;
33614
6ca1ebbf0dc1 8140663: FrameValue might be used uninitialized
dsamersoff
parents: 33063
diff changeset
   445
6ca1ebbf0dc1 8140663: FrameValue might be used uninitialized
dsamersoff
parents: 33063
diff changeset
   446
  FrameValue() {
6ca1ebbf0dc1 8140663: FrameValue might be used uninitialized
dsamersoff
parents: 33063
diff changeset
   447
    location = NULL;
6ca1ebbf0dc1 8140663: FrameValue might be used uninitialized
dsamersoff
parents: 33063
diff changeset
   448
    description = NULL;
6ca1ebbf0dc1 8140663: FrameValue might be used uninitialized
dsamersoff
parents: 33063
diff changeset
   449
    owner = -1;
6ca1ebbf0dc1 8140663: FrameValue might be used uninitialized
dsamersoff
parents: 33063
diff changeset
   450
    priority = 0;
6ca1ebbf0dc1 8140663: FrameValue might be used uninitialized
dsamersoff
parents: 33063
diff changeset
   451
  }
6ca1ebbf0dc1 8140663: FrameValue might be used uninitialized
dsamersoff
parents: 33063
diff changeset
   452
9437
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8921
diff changeset
   453
};
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8921
diff changeset
   454
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8921
diff changeset
   455
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8921
diff changeset
   456
// A collection of described stack values that can print a symbolic
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8921
diff changeset
   457
// description of the stack memory.  Interpreter frame values can be
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8921
diff changeset
   458
// in the caller frames so all the values are collected first and then
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8921
diff changeset
   459
// sorted before being printed.
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8921
diff changeset
   460
class FrameValues {
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8921
diff changeset
   461
 private:
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8921
diff changeset
   462
  GrowableArray<FrameValue> _values;
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8921
diff changeset
   463
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8921
diff changeset
   464
  static int compare(FrameValue* a, FrameValue* b) {
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8921
diff changeset
   465
    if (a->location == b->location) {
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8921
diff changeset
   466
      return a->priority - b->priority;
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8921
diff changeset
   467
    }
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8921
diff changeset
   468
    return a->location - b->location;
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8921
diff changeset
   469
  }
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8921
diff changeset
   470
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8921
diff changeset
   471
 public:
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8921
diff changeset
   472
  // Used by frame functions to describe locations.
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8921
diff changeset
   473
  void describe(int owner, intptr_t* location, const char* description, int priority = 0);
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8921
diff changeset
   474
11571
23f825a42a85 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 11486
diff changeset
   475
#ifdef ASSERT
9632
cd86c748c12b 7043301: assert(locals < caller->fp() || locals > (caller->fp() + 16)) failed: locals in save area
never
parents: 9630
diff changeset
   476
  void validate();
11571
23f825a42a85 7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents: 11486
diff changeset
   477
#endif
10966
0c9ed2dfc6a2 7090904: JSR 292: JRuby junit test crashes in PSScavengeRootsClosure::do_oop
twisti
parents: 10539
diff changeset
   478
  void print(JavaThread* thread);
9437
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8921
diff changeset
   479
};
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8921
diff changeset
   480
9981851b4b8c 7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents: 8921
diff changeset
   481
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
489c9b5090e2 Initial load
duke
parents:
diff changeset
   483
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
// StackFrameStream iterates through the frames of a thread starting from
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
// top most frame. It automatically takes care of updating the location of
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
// all (callee-saved) registers. Notice: If a thread is stopped at
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
// a safepoint, all registers are saved, not only the callee-saved ones.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
// Use:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
//   for(StackFrameStream fst(thread); !fst.is_done(); fst.next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
//     ...
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
//   }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
class StackFrameStream : public StackObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
  frame       _fr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
  RegisterMap _reg_map;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
  bool        _is_done;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
   StackFrameStream(JavaThread *thread, bool update = true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
489c9b5090e2 Initial load
duke
parents:
diff changeset
   503
  // Iteration
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
  bool is_done()                  { return (_is_done) ? true : (_is_done = _fr.is_first_frame(), false); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
  void next()                     { if (!_is_done) _fr = _fr.sender(&_reg_map); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
  // Query
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
  frame *current()                { return &_fr; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   509
  RegisterMap* register_map()     { return &_reg_map; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
};
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6269
diff changeset
   511
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6269
diff changeset
   512
#endif // SHARE_VM_RUNTIME_FRAME_HPP