hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/x86/X86Frame.java
author zmajo
Mon, 27 Apr 2015 10:49:43 +0200
changeset 30305 b92a97e1e9cb
parent 29571 6627b10e05f8
child 30590 14f7f48c1377
permissions -rw-r--r--
8068945: Use RBP register as proper frame pointer in JIT compiled code on x86 Summary: Introduce the PreserveFramePointer flag to control if RBP is used as the frame pointer or as a general purpose register. Reviewed-by: kvn, roland, dlong, enevill, shade
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: 13728
diff changeset
     2
 * Copyright (c) 2001, 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: 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
489c9b5090e2 Initial load
duke
parents:
diff changeset
    25
package sun.jvm.hotspot.runtime.x86;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    26
489c9b5090e2 Initial load
duke
parents:
diff changeset
    27
import java.util.*;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    28
import sun.jvm.hotspot.code.*;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    29
import sun.jvm.hotspot.compiler.*;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    30
import sun.jvm.hotspot.debugger.*;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    31
import sun.jvm.hotspot.oops.*;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    32
import sun.jvm.hotspot.runtime.*;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    33
import sun.jvm.hotspot.types.*;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    34
import sun.jvm.hotspot.utilities.*;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    35
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
/** Specialization of and implementation of abstract methods of the
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
    Frame class for the x86 family of CPUs. */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
public class X86Frame extends Frame {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
  private static final boolean DEBUG;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
  static {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
    DEBUG = System.getProperty("sun.jvm.hotspot.runtime.x86.X86Frame.DEBUG") != null;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
  // All frames
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
  private static final int LINK_OFFSET                =  0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
  private static final int RETURN_ADDR_OFFSET         =  1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
  private static final int SENDER_SP_OFFSET           =  2;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
  // Interpreter frames
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
  private static final int INTERPRETER_FRAME_MIRROR_OFFSET    =  2; // for native calls only
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
  private static final int INTERPRETER_FRAME_SENDER_SP_OFFSET = -1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
  private static final int INTERPRETER_FRAME_LAST_SP_OFFSET   = INTERPRETER_FRAME_SENDER_SP_OFFSET - 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
  private static final int INTERPRETER_FRAME_METHOD_OFFSET    = INTERPRETER_FRAME_LAST_SP_OFFSET - 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
  private static       int INTERPRETER_FRAME_MDX_OFFSET;         // Non-core builds only
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
  private static       int INTERPRETER_FRAME_CACHE_OFFSET;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
  private static       int INTERPRETER_FRAME_LOCALS_OFFSET;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
  private static       int INTERPRETER_FRAME_BCX_OFFSET;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
  private static       int INTERPRETER_FRAME_INITIAL_SP_OFFSET;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
  private static       int INTERPRETER_FRAME_MONITOR_BLOCK_TOP_OFFSET;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
  private static       int INTERPRETER_FRAME_MONITOR_BLOCK_BOTTOM_OFFSET;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
  // Entry frames
10517
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
    64
  private static       int ENTRY_FRAME_CALL_WRAPPER_OFFSET;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
10517
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
    66
  private static VMReg rbp;
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
    67
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
  static {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
    VM.registerVMInitializedObserver(new Observer() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
        public void update(Observable o, Object data) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
          initialize(VM.getVM().getTypeDataBase());
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
      });
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
  private static synchronized void initialize(TypeDataBase db) {
10517
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
    77
    INTERPRETER_FRAME_MDX_OFFSET                  = INTERPRETER_FRAME_METHOD_OFFSET - 1;
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
    78
    INTERPRETER_FRAME_CACHE_OFFSET                = INTERPRETER_FRAME_MDX_OFFSET - 1;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
    INTERPRETER_FRAME_LOCALS_OFFSET               = INTERPRETER_FRAME_CACHE_OFFSET - 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
    INTERPRETER_FRAME_BCX_OFFSET                  = INTERPRETER_FRAME_LOCALS_OFFSET - 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
    INTERPRETER_FRAME_INITIAL_SP_OFFSET           = INTERPRETER_FRAME_BCX_OFFSET - 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
    INTERPRETER_FRAME_MONITOR_BLOCK_TOP_OFFSET    = INTERPRETER_FRAME_INITIAL_SP_OFFSET;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
    INTERPRETER_FRAME_MONITOR_BLOCK_BOTTOM_OFFSET = INTERPRETER_FRAME_INITIAL_SP_OFFSET;
10517
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
    84
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
    85
    ENTRY_FRAME_CALL_WRAPPER_OFFSET = db.lookupIntConstant("frame::entry_frame_call_wrapper_offset");
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
    86
    if (VM.getVM().getAddressSize() == 4) {
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
    87
      rbp = new VMReg(5);
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
    88
    } else {
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
    89
      rbp = new VMReg(5 << 1);
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
    90
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
10517
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
    93
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
  // an additional field beyond sp and pc:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
  Address raw_fp; // frame pointer
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
  private Address raw_unextendedSP;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
  private X86Frame() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
  private void adjustForDeopt() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
    if ( pc != null) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
      // Look for a deopt pc and if it is deopted convert to original pc
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
      CodeBlob cb = VM.getVM().getCodeCache().findBlob(pc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
      if (cb != null && cb.isJavaMethod()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
        NMethod nm = (NMethod) cb;
10517
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   107
        if (pc.equals(nm.deoptHandlerBegin())) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
          if (Assert.ASSERTS_ENABLED) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
            Assert.that(this.getUnextendedSP() != null, "null SP in Java frame");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
          // adjust pc if frame is deoptimized.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
          pc = this.getUnextendedSP().getAddressAt(nm.origPCOffset());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
          deoptimized = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
  public X86Frame(Address raw_sp, Address raw_fp, Address pc) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
    this.raw_sp = raw_sp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
    this.raw_unextendedSP = raw_sp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
    this.raw_fp = raw_fp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
    this.pc = pc;
10517
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   124
    adjustUnextendedSP();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
    // Frame must be fully constructed before this call
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
    adjustForDeopt();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
    if (DEBUG) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
      System.out.println("X86Frame(sp, fp, pc): " + this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
      dumpStack();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
  public X86Frame(Address raw_sp, Address raw_fp) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
    this.raw_sp = raw_sp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
    this.raw_unextendedSP = raw_sp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
    this.raw_fp = raw_fp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
    this.pc = raw_sp.getAddressAt(-1 * VM.getVM().getAddressSize());
10517
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   140
    adjustUnextendedSP();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
    // Frame must be fully constructed before this call
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
    adjustForDeopt();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
    if (DEBUG) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
      System.out.println("X86Frame(sp, fp): " + this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
      dumpStack();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
10517
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   151
  public X86Frame(Address raw_sp, Address raw_unextendedSp, Address raw_fp, Address pc) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
    this.raw_sp = raw_sp;
10517
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   153
    this.raw_unextendedSP = raw_unextendedSp;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
    this.raw_fp = raw_fp;
10517
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   155
    this.pc = pc;
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   156
    adjustUnextendedSP();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
    // Frame must be fully constructed before this call
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
    adjustForDeopt();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
    if (DEBUG) {
10517
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   162
      System.out.println("X86Frame(sp, unextendedSP, fp, pc): " + this);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
      dumpStack();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
  public Object clone() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
    X86Frame frame = new X86Frame();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
    frame.raw_sp = raw_sp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
    frame.raw_unextendedSP = raw_unextendedSP;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
    frame.raw_fp = raw_fp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
    frame.pc = pc;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
    frame.deoptimized = deoptimized;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
    return frame;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
  public boolean equals(Object arg) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
    if (arg == null) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
      return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
    if (!(arg instanceof X86Frame)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
      return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
    X86Frame other = (X86Frame) arg;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
    return (AddressOps.equal(getSP(), other.getSP()) &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
            AddressOps.equal(getUnextendedSP(), other.getUnextendedSP()) &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
            AddressOps.equal(getFP(), other.getFP()) &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
            AddressOps.equal(getPC(), other.getPC()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
  public int hashCode() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
    if (raw_sp == null) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
      return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
    return raw_sp.hashCode();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
  public String toString() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
    return "sp: " + (getSP() == null? "null" : getSP().toString()) +
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
         ", unextendedSP: " + (getUnextendedSP() == null? "null" : getUnextendedSP().toString()) +
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
         ", fp: " + (getFP() == null? "null" : getFP().toString()) +
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
         ", pc: " + (pc == null? "null" : pc.toString());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
  // accessors for the instance variables
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
  public Address getFP() { return raw_fp; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
  public Address getSP() { return raw_sp; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
  public Address getID() { return raw_sp; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
  // FIXME: not implemented yet (should be done for Solaris/X86)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
  public boolean isSignalHandlerFrameDbg() { return false; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
  public int     getSignalNumberDbg()      { return 0;     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
  public String  getSignalNameDbg()        { return null;  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
  public boolean isInterpretedFrameValid() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
    if (Assert.ASSERTS_ENABLED) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
      Assert.that(isInterpretedFrame(), "Not an interpreted frame");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
    // These are reasonable sanity checks
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
    if (getFP() == null || getFP().andWithMask(0x3) != null) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
      return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
    if (getSP() == null || getSP().andWithMask(0x3) != null) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
      return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
    if (getFP().addOffsetTo(INTERPRETER_FRAME_INITIAL_SP_OFFSET * VM.getVM().getAddressSize()).lessThan(getSP())) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
      return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
    // These are hacks to keep us out of trouble.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
    // The problem with these is that they mask other problems
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
    if (getFP().lessThanOrEqual(getSP())) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
      // this attempts to deal with unsigned comparison above
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
      return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
    if (getFP().minus(getSP()) > 4096 * VM.getVM().getAddressSize()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
      // stack frames shouldn't be large.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
      return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
    return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
  // FIXME: not applicable in current system
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
  //  void    patch_pc(Thread* thread, address pc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
  public Frame sender(RegisterMap regMap, CodeBlob cb) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
    X86RegisterMap map = (X86RegisterMap) regMap;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
    if (Assert.ASSERTS_ENABLED) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
      Assert.that(map != null, "map must be set");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
    // Default is we done have to follow them. The sender_for_xxx will
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
    // update it accordingly
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
    map.setIncludeArgumentOops(false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
    if (isEntryFrame())       return senderForEntryFrame(map);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
    if (isInterpretedFrame()) return senderForInterpreterFrame(map);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
10517
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   270
    if(cb == null) {
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   271
      cb = VM.getVM().getCodeCache().findBlob(getPC());
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   272
    } else {
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   273
      if (Assert.ASSERTS_ENABLED) {
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   274
        Assert.that(cb.equals(VM.getVM().getCodeCache().findBlob(getPC())), "Must be the same");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
      }
10517
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   276
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
10517
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   278
    if (cb != null) {
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   279
      return senderForCompiledFrame(map, cb);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
    // Must be native-compiled frame, i.e. the marshaling code for native
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
    // methods that exists in the core system.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
    return new X86Frame(getSenderSP(), getLink(), getSenderPC());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
  private Frame senderForEntryFrame(X86RegisterMap map) {
10517
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   288
    if (DEBUG) {
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   289
      System.out.println("senderForEntryFrame");
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   290
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
    if (Assert.ASSERTS_ENABLED) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
      Assert.that(map != null, "map must be set");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
    // Java frame called from C; skip all C frames and return top C
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
    // frame of that chunk as the sender
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
    X86JavaCallWrapper jcw = (X86JavaCallWrapper) getEntryFrameCallWrapper();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
    if (Assert.ASSERTS_ENABLED) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
      Assert.that(!entryFrameIsFirst(), "next Java fp must be non zero");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
      Assert.that(jcw.getLastJavaSP().greaterThan(getSP()), "must be above this frame on stack");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
    X86Frame fr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
    if (jcw.getLastJavaPC() != null) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
      fr = new X86Frame(jcw.getLastJavaSP(), jcw.getLastJavaFP(), jcw.getLastJavaPC());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
      fr = new X86Frame(jcw.getLastJavaSP(), jcw.getLastJavaFP());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
    map.clear();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
    if (Assert.ASSERTS_ENABLED) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
      Assert.that(map.getIncludeArgumentOops(), "should be set by clear");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
    return fr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
10517
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   314
  //------------------------------------------------------------------------------
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   315
  // frame::adjust_unextended_sp
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   316
  private void adjustUnextendedSP() {
30305
b92a97e1e9cb 8068945: Use RBP register as proper frame pointer in JIT compiled code on x86
zmajo
parents: 29571
diff changeset
   317
    // On x86, sites calling method handle intrinsics and lambda forms are treated
b92a97e1e9cb 8068945: Use RBP register as proper frame pointer in JIT compiled code on x86
zmajo
parents: 29571
diff changeset
   318
    // as any other call site. Therefore, no special action is needed when we are
b92a97e1e9cb 8068945: Use RBP register as proper frame pointer in JIT compiled code on x86
zmajo
parents: 29571
diff changeset
   319
    // returning to any of these call sites.
10517
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   320
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   321
    CodeBlob cb = cb();
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   322
    NMethod senderNm = (cb == null) ? null : cb.asNMethodOrNull();
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   323
    if (senderNm != null) {
30305
b92a97e1e9cb 8068945: Use RBP register as proper frame pointer in JIT compiled code on x86
zmajo
parents: 29571
diff changeset
   324
      // If the sender PC is a deoptimization point, get the original PC.
b92a97e1e9cb 8068945: Use RBP register as proper frame pointer in JIT compiled code on x86
zmajo
parents: 29571
diff changeset
   325
      if (senderNm.isDeoptEntry(getPC()) ||
b92a97e1e9cb 8068945: Use RBP register as proper frame pointer in JIT compiled code on x86
zmajo
parents: 29571
diff changeset
   326
          senderNm.isDeoptMhEntry(getPC())) {
b92a97e1e9cb 8068945: Use RBP register as proper frame pointer in JIT compiled code on x86
zmajo
parents: 29571
diff changeset
   327
        // DEBUG_ONLY(verifyDeoptriginalPc(senderNm, raw_unextendedSp));
10517
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   328
      }
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   329
    }
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   330
  }
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   331
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
  private Frame senderForInterpreterFrame(X86RegisterMap map) {
10517
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   333
    if (DEBUG) {
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   334
      System.out.println("senderForInterpreterFrame");
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   335
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
    Address unextendedSP = addressOfStackSlot(INTERPRETER_FRAME_SENDER_SP_OFFSET).getAddressAt(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
    Address sp = addressOfStackSlot(SENDER_SP_OFFSET);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
    // We do not need to update the callee-save register mapping because above
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
    // us is either another interpreter frame or a converter-frame, but never
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
    // directly a compiled frame.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
    // 11/24/04 SFG. With the removal of adapter frames this is no longer true.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
    // However c2 no longer uses callee save register for java calls so there
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
    // are no callee register to find.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
10517
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   345
    if (map.getUpdateMap())
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   346
      updateMapWithSavedLink(map, addressOfStackSlot(LINK_OFFSET));
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   347
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   348
    return new X86Frame(sp, unextendedSP, getLink(), getSenderPC());
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   349
  }
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   350
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   351
  private void updateMapWithSavedLink(RegisterMap map, Address savedFPAddr) {
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   352
    map.setLocation(rbp, savedFPAddr);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
  private Frame senderForCompiledFrame(X86RegisterMap map, CodeBlob cb) {
10517
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   356
    if (DEBUG) {
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   357
      System.out.println("senderForCompiledFrame");
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   358
    }
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   359
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
    //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
    // NOTE: some of this code is (unfortunately) duplicated in X86CurrentFrameGuess
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
    //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
    if (Assert.ASSERTS_ENABLED) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
      Assert.that(map != null, "map must be set");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
    // frame owned by optimizing compiler
10517
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   369
    if (Assert.ASSERTS_ENABLED) {
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   370
        Assert.that(cb.getFrameSize() >= 0, "must have non-zero frame size");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
    }
10517
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   372
    Address senderSP = getUnextendedSP().addOffsetTo(cb.getFrameSize());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
    // On Intel the return_address is always the word on the stack
10517
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   375
    Address senderPC = senderSP.getAddressAt(-1 * VM.getVM().getAddressSize());
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   376
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   377
    // This is the saved value of EBP which may or may not really be an FP.
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   378
    // It is only an FP if the sender is an interpreter frame (or C1?).
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   379
    Address savedFPAddr = senderSP.addOffsetTo(- SENDER_SP_OFFSET * VM.getVM().getAddressSize());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
10517
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   381
    if (map.getUpdateMap()) {
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   382
      // Tell GC to use argument oopmaps for some runtime stubs that need it.
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   383
      // For C1, the runtime stub might not have oop maps, so set this flag
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   384
      // outside of update_register_map.
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   385
      map.setIncludeArgumentOops(cb.callerMustGCArguments());
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   386
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   387
      if (cb.getOopMaps() != null) {
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   388
        OopMapSet.updateRegisterMap(this, cb, map, true);
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   389
      }
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   390
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   391
      // Since the prolog does the save and restore of EBP there is no oopmap
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   392
      // for it so we must fill in its location as if there was an oopmap entry
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   393
      // since if our caller was compiled code there could be live jvm state in it.
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   394
      updateMapWithSavedLink(map, savedFPAddr);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
10517
f92c9ff3a15f 7051798: SA-JDI: NPE in Frame.addressOfStackSlot(Frame.java:244)
never
parents: 5547
diff changeset
   397
    return new X86Frame(senderSP, savedFPAddr.getAddressAt(0), senderPC);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
  protected boolean hasSenderPD() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
    // FIXME
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
    // Check for null ebp? Need to do some tests.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
    return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
  public long frameSize() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
    return (getSenderSP().minus(getSP()) / VM.getVM().getAddressSize());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
  public Address getLink() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
    return addressOfStackSlot(LINK_OFFSET).getAddressAt(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
  public Address getUnextendedSP() { return raw_unextendedSP; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
  // Return address:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
  public Address getSenderPCAddr() { return addressOfStackSlot(RETURN_ADDR_OFFSET); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
  public Address getSenderPC()     { return getSenderPCAddr().getAddressAt(0);      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
  public Address getSenderSP()     { return addressOfStackSlot(SENDER_SP_OFFSET); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
  public Address addressOfInterpreterFrameLocals() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   423
    return addressOfStackSlot(INTERPRETER_FRAME_LOCALS_OFFSET);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
  private Address addressOfInterpreterFrameBCX() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
    return addressOfStackSlot(INTERPRETER_FRAME_BCX_OFFSET);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
  public int getInterpreterFrameBCI() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
    // FIXME: this is not atomic with respect to GC and is unsuitable
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
    // for use in a non-debugging, or reflective, system. Need to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
    // figure out how to express this.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
    Address bcp = addressOfInterpreterFrameBCX().getAddressAt(0);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   435
    Address methodHandle = addressOfInterpreterFrameMethod().getAddressAt(0);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   436
    Method method = (Method)Metadata.instantiateWrapperFor(methodHandle);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
    return bcpToBci(bcp, method);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
  public Address addressOfInterpreterFrameMDX() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
    return addressOfStackSlot(INTERPRETER_FRAME_MDX_OFFSET);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
  // FIXME
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
  //inline int frame::interpreter_frame_monitor_size() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
  //  return BasicObjectLock::size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
  //}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
  // expression stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
  // (the max_stack arguments are used by the GC; see class FrameClosure)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
  public Address addressOfInterpreterFrameExpressionStack() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
    Address monitorEnd = interpreterFrameMonitorEnd().address();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
    return monitorEnd.addOffsetTo(-1 * VM.getVM().getAddressSize());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
  public int getInterpreterFrameExpressionStackDirection() { return -1; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
  // top of expression stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
  public Address addressOfInterpreterFrameTOS() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
    return getSP();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
  /** Expression stack from top down */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
  public Address addressOfInterpreterFrameTOSAt(int slot) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
    return addressOfInterpreterFrameTOS().addOffsetTo(slot * VM.getVM().getAddressSize());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
  public Address getInterpreterFrameSenderSP() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
    if (Assert.ASSERTS_ENABLED) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
      Assert.that(isInterpretedFrame(), "interpreted frame expected");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
    return addressOfStackSlot(INTERPRETER_FRAME_SENDER_SP_OFFSET).getAddressAt(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   475
489c9b5090e2 Initial load
duke
parents:
diff changeset
   476
  // Monitors
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
  public BasicObjectLock interpreterFrameMonitorBegin() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
    return new BasicObjectLock(addressOfStackSlot(INTERPRETER_FRAME_MONITOR_BLOCK_BOTTOM_OFFSET));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   479
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   480
489c9b5090e2 Initial load
duke
parents:
diff changeset
   481
  public BasicObjectLock interpreterFrameMonitorEnd() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
    Address result = addressOfStackSlot(INTERPRETER_FRAME_MONITOR_BLOCK_TOP_OFFSET).getAddressAt(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   483
    if (Assert.ASSERTS_ENABLED) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
      // make sure the pointer points inside the frame
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
      Assert.that(AddressOps.gt(getFP(), result), "result must <  than frame pointer");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
      Assert.that(AddressOps.lte(getSP(), result), "result must >= than stack pointer");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
    return new BasicObjectLock(result);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
  public int interpreterFrameMonitorSize() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
    return BasicObjectLock.size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
  // Method
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
  public Address addressOfInterpreterFrameMethod() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
    return addressOfStackSlot(INTERPRETER_FRAME_METHOD_OFFSET);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
  // Constant pool cache
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
  public Address addressOfInterpreterFrameCPCache() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
    return addressOfStackSlot(INTERPRETER_FRAME_CACHE_OFFSET);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   503
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
  // Entry frames
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
  public JavaCallWrapper getEntryFrameCallWrapper() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
    return new X86JavaCallWrapper(addressOfStackSlot(ENTRY_FRAME_CALL_WRAPPER_OFFSET).getAddressAt(0));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   509
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
  protected Address addressOfSavedOopResult() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
    // offset is 2 for compiler2 and 3 for compiler1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
    return getSP().addOffsetTo((VM.getVM().isClientCompiler() ? 2 : 3) *
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
                               VM.getVM().getAddressSize());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
  protected Address addressOfSavedReceiver() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
    return getSP().addOffsetTo(-4 * VM.getVM().getAddressSize());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
  private void dumpStack() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
    if (getFP() != null) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
      for (Address addr = getSP().addOffsetTo(-5 * VM.getVM().getAddressSize());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
           AddressOps.lte(addr, getFP().addOffsetTo(5 * VM.getVM().getAddressSize()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
           addr = addr.addOffsetTo(VM.getVM().getAddressSize())) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
        System.out.println(addr + ": " + addr.getAddressAt(0));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
      for (Address addr = getSP().addOffsetTo(-5 * VM.getVM().getAddressSize());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
           AddressOps.lte(addr, getSP().addOffsetTo(20 * VM.getVM().getAddressSize()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
           addr = addr.addOffsetTo(VM.getVM().getAddressSize())) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
        System.out.println(addr + ": " + addr.getAddressAt(0));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
}