src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/ppc64/PPC64Frame.java
author mdoerr
Fri, 02 Aug 2019 11:28:58 +0200
changeset 57626 91bc70505019
parent 47216 71c04702a3d5
permissions -rw-r--r--
8228649: [PPC64] SA reads wrong slots from interpreter frames Summary: Make frame layout consistent between dbg and product build and implement offsets accordingly. Reviewed-by: goetz, gromero
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
28369
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
     1
/*
29571
6627b10e05f8 6313046: Remove unused frame::native_param_addr code
mikael
parents: 28369
diff changeset
     2
 * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
28369
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
     4
 *
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
     7
 * published by the Free Software Foundation.
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
     8
 *
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    13
 * accompanied this code).
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    14
 *
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    18
 *
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    21
 * questions.
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    22
 *
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    23
 */
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    24
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    25
package sun.jvm.hotspot.runtime.ppc64;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    26
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    27
import java.util.*;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    28
import sun.jvm.hotspot.code.*;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    29
import sun.jvm.hotspot.compiler.*;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    30
import sun.jvm.hotspot.debugger.*;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    31
import sun.jvm.hotspot.oops.*;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    32
import sun.jvm.hotspot.runtime.*;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    33
import sun.jvm.hotspot.types.*;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    34
import sun.jvm.hotspot.utilities.*;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    35
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    36
/** Specialization of and implementation of abstract methods of the
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    37
    Frame class for the ppc64 family of CPUs. */
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    38
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    39
public class PPC64Frame extends Frame {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    40
  private static final boolean DEBUG;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    41
  static {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    42
    DEBUG = System.getProperty("sun.jvm.hotspot.runtime.ppc64.PPC64Frame.DEBUG") != null;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    43
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    44
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    45
  // All frames
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    46
  private static final int SENDER_SP_OFFSET           =  0;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    47
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    48
  // Interpreter frames
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    49
  private static final int INTERPRETER_FRAME_SENDER_SP_OFFSET = -4;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    50
  private static final int INTERPRETER_FRAME_LAST_SP_OFFSET = INTERPRETER_FRAME_SENDER_SP_OFFSET - 1;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    51
  private static final int INTERPRETER_FRAME_MDX_OFFSET = INTERPRETER_FRAME_LAST_SP_OFFSET -1;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    52
  private static final int INTERPRETER_FRAME_ESP_OFFSET = INTERPRETER_FRAME_MDX_OFFSET - 1;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    53
  private static final int INTERPRETER_FRAME_BCX_OFFSET = INTERPRETER_FRAME_ESP_OFFSET - 1;
57626
91bc70505019 8228649: [PPC64] SA reads wrong slots from interpreter frames
mdoerr
parents: 47216
diff changeset
    54
  private static final int INTERPRETER_FRAME_CACHE_OFFSET = INTERPRETER_FRAME_BCX_OFFSET - 1;
28369
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    55
  private static final int INTERPRETER_FRAME_MONITORS_OFFSET = INTERPRETER_FRAME_CACHE_OFFSET - 1;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    56
  private static final int INTERPRETER_FRAME_LOCALS_OFFSET = INTERPRETER_FRAME_MONITORS_OFFSET - 1;
40357
d46cac7959c4 8163143: illegal bci error with interpreted frames in SA due to mirror being stored in interpreted frames
dsamersoff
parents: 35217
diff changeset
    57
  private static final int INTERPRETER_FRAME_MIRROR_OFFSET = INTERPRETER_FRAME_LOCALS_OFFSET - 1;
d46cac7959c4 8163143: illegal bci error with interpreted frames in SA due to mirror being stored in interpreted frames
dsamersoff
parents: 35217
diff changeset
    58
  private static final int INTERPRETER_FRAME_METHOD_OFFSET = INTERPRETER_FRAME_MIRROR_OFFSET - 1;
57626
91bc70505019 8228649: [PPC64] SA reads wrong slots from interpreter frames
mdoerr
parents: 47216
diff changeset
    59
  private static final int INTERPRETER_FRAME_MONITOR_BLOCK_BOTTOM_OFFSET = INTERPRETER_FRAME_METHOD_OFFSET - 1;
28369
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    60
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    61
  // Entry frames
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    62
  private static int ENTRY_FRAME_CALL_WRAPPER_OFFSET;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    63
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    64
  static {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    65
    VM.registerVMInitializedObserver(new Observer() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    66
      public void update(Observable o, Object data) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    67
        initialize(VM.getVM().getTypeDataBase());
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    68
      }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    69
    });
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    70
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    71
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    72
  private static synchronized void initialize(TypeDataBase db) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    73
    int entry_frame_locals_size = db.lookupIntConstant("frame::entry_frame_locals_size").intValue();
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    74
    int wordLength = (int) VM.getVM().getAddressSize();
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    75
    ENTRY_FRAME_CALL_WRAPPER_OFFSET = -entry_frame_locals_size/wordLength;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    76
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    77
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    78
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    79
  // an additional field beyond sp and pc:
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    80
  Address raw_fp; // frame pointer
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    81
  private Address raw_unextendedSP;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    82
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    83
  private PPC64Frame() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    84
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    85
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    86
  private void adjustForDeopt() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    87
    if ( pc != null) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    88
      // Look for a deopt pc and if it is deopted convert to original pc
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    89
      CodeBlob cb = VM.getVM().getCodeCache().findBlob(pc);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    90
      if (cb != null && cb.isJavaMethod()) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    91
        NMethod nm = (NMethod) cb;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    92
        if (pc.equals(nm.deoptHandlerBegin())) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    93
          if (Assert.ASSERTS_ENABLED) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    94
            Assert.that(this.getUnextendedSP() != null, "null SP in Java frame");
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    95
          }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    96
          // adjust pc if frame is deoptimized.
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    97
          pc = this.getUnextendedSP().getAddressAt(nm.origPCOffset());
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    98
          deoptimized = true;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    99
        }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   100
      }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   101
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   102
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   103
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   104
  public PPC64Frame(Address raw_sp, Address raw_fp, Address pc) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   105
    this.raw_sp = raw_sp;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   106
    this.raw_unextendedSP = raw_sp;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   107
    if (raw_fp == null) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   108
      this.raw_fp = raw_sp.getAddressAt(0);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   109
    } else {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   110
      this.raw_fp = raw_fp;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   111
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   112
    if (pc == null) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   113
      this.pc = raw_sp.getAddressAt(2 * VM.getVM().getAddressSize());
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   114
    } else {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   115
      this.pc = pc;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   116
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   117
    adjustUnextendedSP();
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   118
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   119
    // Frame must be fully constructed before this call
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   120
    adjustForDeopt();
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   121
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   122
    if (DEBUG) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   123
      System.out.println("PPC64Frame(sp, fp, pc): " + this);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   124
      dumpStack();
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   125
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   126
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   127
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   128
  public PPC64Frame(Address raw_sp, Address raw_fp) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   129
    this.raw_sp = raw_sp;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   130
    this.raw_unextendedSP = raw_sp;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   131
    if (raw_fp == null) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   132
      this.raw_fp = raw_sp.getAddressAt(0);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   133
    } else {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   134
      this.raw_fp = raw_fp;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   135
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   136
    this.pc = raw_sp.getAddressAt(2 * VM.getVM().getAddressSize());
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   137
    adjustUnextendedSP();
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   138
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   139
    // Frame must be fully constructed before this call
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   140
    adjustForDeopt();
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   141
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   142
    if (DEBUG) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   143
      System.out.println("PPC64Frame(sp, fp): " + this);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   144
      dumpStack();
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   145
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   146
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   147
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   148
  public PPC64Frame(Address raw_sp, Address raw_unextendedSp, Address raw_fp, Address pc) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   149
    this.raw_sp = raw_sp;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   150
    this.raw_unextendedSP = raw_unextendedSp;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   151
    if (raw_fp == null) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   152
      this.raw_fp = raw_sp.getAddressAt(0);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   153
    } else {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   154
      this.raw_fp = raw_fp;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   155
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   156
    if (pc == null) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   157
      this.pc = raw_sp.getAddressAt(2 * VM.getVM().getAddressSize());
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   158
    } else {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   159
      this.pc = pc;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   160
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   161
    adjustUnextendedSP();
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   162
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   163
    // Frame must be fully constructed before this call
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   164
    adjustForDeopt();
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   165
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   166
    if (DEBUG) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   167
      System.out.println("PPC64Frame(sp, unextendedSP, fp, pc): " + this);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   168
      dumpStack();
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   169
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   170
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   171
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   172
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   173
  public Object clone() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   174
    PPC64Frame frame = new PPC64Frame();
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   175
    frame.raw_sp = raw_sp;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   176
    frame.raw_unextendedSP = raw_unextendedSP;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   177
    frame.raw_fp = raw_fp;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   178
    frame.pc = pc;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   179
    frame.deoptimized = deoptimized;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   180
    return frame;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   181
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   182
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   183
  public boolean equals(Object arg) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   184
    if (arg == null) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   185
      return false;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   186
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   187
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   188
    if (!(arg instanceof PPC64Frame)) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   189
      return false;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   190
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   191
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   192
    PPC64Frame other = (PPC64Frame) arg;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   193
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   194
    return (AddressOps.equal(getSP(), other.getSP()) &&
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   195
        AddressOps.equal(getUnextendedSP(), other.getUnextendedSP()) &&
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   196
        AddressOps.equal(getFP(), other.getFP()) &&
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   197
        AddressOps.equal(getPC(), other.getPC()));
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   198
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   199
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   200
  public int hashCode() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   201
    if (raw_sp == null) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   202
      return 0;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   203
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   204
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   205
    return raw_sp.hashCode();
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   206
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   207
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   208
  public String toString() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   209
    return "sp: " + (getSP() == null ? "null" : getSP().toString()) +
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   210
        ", unextendedSP: " + (getUnextendedSP() == null ? "null" : getUnextendedSP().toString()) +
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   211
        ", fp: " + (getFP() == null ? "null" : getFP().toString()) +
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   212
        ", pc: " + (pc == null ? "null" : pc.toString());
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   213
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   214
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   215
  // accessors for the instance variables
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   216
  public Address getFP() { return raw_fp; }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   217
  public Address getSP() { return raw_sp; }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   218
  public Address getID() { return raw_sp; }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   219
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   220
  // FIXME: not implemented yet (should be done for Solaris/PPC64)
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   221
  public boolean isSignalHandlerFrameDbg() { return false; }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   222
  public int     getSignalNumberDbg()      { return 0;     }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   223
  public String  getSignalNameDbg()        { return null;  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   224
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   225
  public boolean isInterpretedFrameValid() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   226
    if (Assert.ASSERTS_ENABLED) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   227
      Assert.that(isInterpretedFrame(), "Not an interpreted frame");
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   228
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   229
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   230
    // These are reasonable sanity checks
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   231
    if (getFP() == null || getFP().andWithMask(0x3) != null) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   232
      return false;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   233
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   234
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   235
    if (getSP() == null || getSP().andWithMask(0x3) != null) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   236
      return false;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   237
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   238
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   239
    // These are hacks to keep us out of trouble.
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   240
    // The problem with these is that they mask other problems
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   241
    if (getFP().lessThanOrEqual(getSP())) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   242
      // this attempts to deal with unsigned comparison above
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   243
      return false;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   244
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   245
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   246
    if (getFP().minus(getSP()) > 4096 * VM.getVM().getAddressSize()) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   247
      // stack frames shouldn't be large.
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   248
      return false;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   249
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   250
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   251
    return true;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   252
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   253
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   254
  // FIXME: not applicable in current system
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   255
  //  void    patch_pc(Thread* thread, address pc);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   256
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   257
  public Frame sender(RegisterMap regMap, CodeBlob cb) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   258
    PPC64RegisterMap map = (PPC64RegisterMap) regMap;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   259
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   260
    if (Assert.ASSERTS_ENABLED) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   261
      Assert.that(map != null, "map must be set");
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   262
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   263
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   264
    // Default is we done have to follow them. The sender_for_xxx will
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   265
    // update it accordingly
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   266
    map.setIncludeArgumentOops(false);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   267
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   268
    if (isEntryFrame()) return senderForEntryFrame(map);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   269
    if (isInterpretedFrame()) return senderForInterpreterFrame(map);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   270
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   271
    if(cb == null) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   272
      cb = VM.getVM().getCodeCache().findBlob(getPC());
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   273
    } else {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   274
      if (Assert.ASSERTS_ENABLED) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   275
        Assert.that(cb.equals(VM.getVM().getCodeCache().findBlob(getPC())), "Must be the same");
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   276
      }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   277
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   278
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   279
    if (cb != null) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   280
      return senderForCompiledFrame(map, cb);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   281
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   282
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   283
    // Must be native-compiled frame, i.e. the marshaling code for native
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   284
    // methods that exists in the core system.
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   285
    return new PPC64Frame(getSenderSP(), getLink(), getSenderPC());
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   286
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   287
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   288
  private Frame senderForEntryFrame(PPC64RegisterMap map) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   289
    if (DEBUG) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   290
      System.out.println("senderForEntryFrame");
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   291
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   292
    if (Assert.ASSERTS_ENABLED) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   293
      Assert.that(map != null, "map must be set");
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   294
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   295
    // Java frame called from C; skip all C frames and return top C
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   296
    // frame of that chunk as the sender
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   297
    PPC64JavaCallWrapper jcw = (PPC64JavaCallWrapper) getEntryFrameCallWrapper();
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   298
    if (Assert.ASSERTS_ENABLED) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   299
      Assert.that(!entryFrameIsFirst(), "next Java fp must be non zero");
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   300
      Assert.that(jcw.getLastJavaSP().greaterThan(getSP()), "must be above this frame on stack");
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   301
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   302
    PPC64Frame fr;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   303
    if (jcw.getLastJavaPC() != null) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   304
      fr = new PPC64Frame(jcw.getLastJavaSP(), jcw.getLastJavaFP(), jcw.getLastJavaPC());
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   305
    } else {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   306
      fr = new PPC64Frame(jcw.getLastJavaSP(), jcw.getLastJavaFP());
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   307
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   308
    map.clear();
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   309
    if (Assert.ASSERTS_ENABLED) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   310
      Assert.that(map.getIncludeArgumentOops(), "should be set by clear");
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   311
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   312
    return fr;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   313
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   314
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   315
  //------------------------------------------------------------------------------
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   316
  // frame::adjust_unextended_sp
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   317
  private void adjustUnextendedSP() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   318
    raw_unextendedSP = getFP();
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   319
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   320
  private Frame senderForInterpreterFrame(PPC64RegisterMap map) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   321
    if (DEBUG) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   322
      System.out.println("senderForInterpreterFrame");
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   323
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   324
    Address unextendedSP = addressOfStackSlot(INTERPRETER_FRAME_SENDER_SP_OFFSET).getAddressAt(0);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   325
    Address sp = getSenderSP();
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   326
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   327
    return new PPC64Frame(sp, unextendedSP, getLink(), getSenderPC());
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   328
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   329
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   330
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   331
  private Frame senderForCompiledFrame(PPC64RegisterMap map, CodeBlob cb) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   332
    if (DEBUG) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   333
      System.out.println("senderForCompiledFrame");
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   334
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   335
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   336
    //
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   337
    // NOTE: some of this code is (unfortunately) duplicated in PPC64CurrentFrameGuess
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   338
    //
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   339
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   340
    if (Assert.ASSERTS_ENABLED) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   341
      Assert.that(map != null, "map must be set");
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   342
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   343
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   344
    // frame owned by optimizing compiler
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   345
    if (Assert.ASSERTS_ENABLED) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   346
      Assert.that(cb.getFrameSize() >= 0, "must have non-zero frame size");
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   347
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   348
    Address senderSP = getSenderSP();
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   349
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   350
    Address senderPC = getSenderPC();
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   351
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   352
    if (map.getUpdateMap()) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   353
      // Tell GC to use argument oopmaps for some runtime stubs that need it.
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   354
      // For C1, the runtime stub might not have oop maps, so set this flag
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   355
      // outside of update_register_map.
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   356
      map.setIncludeArgumentOops(cb.callerMustGCArguments());
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   357
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   358
      if (cb.getOopMaps() != null) {
30590
14f7f48c1377 8064458: OopMap class could be more compact
rbackman
parents: 29571
diff changeset
   359
        ImmutableOopMapSet.updateRegisterMap(this, cb, map, true);
28369
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   360
      }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   361
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   362
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   363
    return new PPC64Frame(senderSP, getLink(), senderPC);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   364
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   365
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   366
  protected boolean hasSenderPD() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   367
    // FIXME
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   368
    return true;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   369
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   370
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   371
  public long frameSize() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   372
    return (getSenderSP().minus(getSP()) / VM.getVM().getAddressSize());
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   373
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   374
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   375
  public Address getLink() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   376
    return getSenderSP().getAddressAt(0);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   377
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   378
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   379
  public Address getUnextendedSP() { return raw_unextendedSP; }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   380
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   381
  // Return address:
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   382
  public Address getSenderPC()     { return getSenderSP().getAddressAt(2 * VM.getVM().getAddressSize()); }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   383
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   384
  public Address getSenderSP()     { return getFP(); }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   385
  public Address addressOfInterpreterFrameLocals() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   386
    return addressOfStackSlot(INTERPRETER_FRAME_LOCALS_OFFSET);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   387
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   388
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   389
  private Address addressOfInterpreterFrameBCX() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   390
    return addressOfStackSlot(INTERPRETER_FRAME_BCX_OFFSET);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   391
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   392
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   393
  public int getInterpreterFrameBCI() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   394
    // FIXME: this is not atomic with respect to GC and is unsuitable
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   395
    // for use in a non-debugging, or reflective, system. Need to
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   396
    // figure out how to express this.
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   397
    Address bcp = addressOfInterpreterFrameBCX().getAddressAt(0);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   398
    Address methodHandle = addressOfInterpreterFrameMethod().getAddressAt(0);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   399
    Method method = (Method)Metadata.instantiateWrapperFor(methodHandle);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   400
    return bcpToBci(bcp, method);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   401
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   402
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   403
  public Address addressOfInterpreterFrameMDX() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   404
    return addressOfStackSlot(INTERPRETER_FRAME_MDX_OFFSET);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   405
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   406
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   407
  // FIXME
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   408
  //inline int frame::interpreter_frame_monitor_size() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   409
  //  return BasicObjectLock::size();
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   410
  //}
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   411
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   412
  // expression stack
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   413
  // (the max_stack arguments are used by the GC; see class FrameClosure)
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   414
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   415
  public Address addressOfInterpreterFrameExpressionStack() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   416
    Address monitorEnd = interpreterFrameMonitorEnd().address();
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   417
    return monitorEnd.addOffsetTo(-1 * VM.getVM().getAddressSize());
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   418
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   419
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   420
  public int getInterpreterFrameExpressionStackDirection() { return -1; }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   421
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   422
  // top of expression stack
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   423
  public Address addressOfInterpreterFrameTOS() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   424
    return getSP();
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   425
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   426
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   427
  /** Expression stack from top down */
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   428
  public Address addressOfInterpreterFrameTOSAt(int slot) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   429
    return addressOfInterpreterFrameTOS().addOffsetTo(slot * VM.getVM().getAddressSize());
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   430
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   431
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   432
  public Address getInterpreterFrameSenderSP() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   433
    if (Assert.ASSERTS_ENABLED) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   434
      Assert.that(isInterpretedFrame(), "interpreted frame expected");
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   435
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   436
    return addressOfStackSlot(INTERPRETER_FRAME_SENDER_SP_OFFSET).getAddressAt(0);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   437
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   438
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   439
  // Monitors
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   440
  public BasicObjectLock interpreterFrameMonitorBegin() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   441
    return new BasicObjectLock(addressOfStackSlot(INTERPRETER_FRAME_MONITOR_BLOCK_BOTTOM_OFFSET));
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   442
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   443
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   444
  public BasicObjectLock interpreterFrameMonitorEnd() {
57626
91bc70505019 8228649: [PPC64] SA reads wrong slots from interpreter frames
mdoerr
parents: 47216
diff changeset
   445
    Address result = addressOfStackSlot(INTERPRETER_FRAME_MONITORS_OFFSET).getAddressAt(0);
28369
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   446
    if (Assert.ASSERTS_ENABLED) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   447
      // make sure the pointer points inside the frame
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   448
      Assert.that(AddressOps.gt(getFP(), result), "result must <  than frame pointer");
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   449
      Assert.that(AddressOps.lte(getSP(), result), "result must >= than stack pointer");
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   450
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   451
    return new BasicObjectLock(result);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   452
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   453
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   454
  public int interpreterFrameMonitorSize() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   455
    return BasicObjectLock.size();
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   456
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   457
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   458
  // Method
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   459
  public Address addressOfInterpreterFrameMethod() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   460
    return addressOfStackSlot(INTERPRETER_FRAME_METHOD_OFFSET);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   461
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   462
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   463
  // Constant pool cache
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   464
  public Address addressOfInterpreterFrameCPCache() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   465
    return addressOfStackSlot(INTERPRETER_FRAME_CACHE_OFFSET);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   466
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   467
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   468
  // Entry frames
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   469
  public JavaCallWrapper getEntryFrameCallWrapper() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   470
    return new PPC64JavaCallWrapper(addressOfStackSlot(ENTRY_FRAME_CALL_WRAPPER_OFFSET).getAddressAt(0));
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   471
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   472
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   473
  protected Address addressOfSavedOopResult() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   474
    // offset is 2 for compiler2 and 3 for compiler1
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   475
    return getSP().addOffsetTo((VM.getVM().isClientCompiler() ? 2 : 3) *
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   476
        VM.getVM().getAddressSize());
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   477
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   478
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   479
  protected Address addressOfSavedReceiver() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   480
    return getSP().addOffsetTo(-4 * VM.getVM().getAddressSize());
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   481
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   482
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   483
  private void dumpStack() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   484
    if (getFP() != null) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   485
      for (Address addr = getSP().addOffsetTo(-5 * VM.getVM().getAddressSize());
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   486
          AddressOps.lte(addr, getFP().addOffsetTo(5 * VM.getVM().getAddressSize()));
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   487
          addr = addr.addOffsetTo(VM.getVM().getAddressSize())) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   488
        System.out.println(addr + ": " + addr.getAddressAt(0));
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   489
      }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   490
    } else {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   491
      for (Address addr = getSP().addOffsetTo(-5 * VM.getVM().getAddressSize());
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   492
          AddressOps.lte(addr, getSP().addOffsetTo(20 * VM.getVM().getAddressSize()));
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   493
          addr = addr.addOffsetTo(VM.getVM().getAddressSize())) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   494
        System.out.println(addr + ": " + addr.getAddressAt(0));
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   495
      }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   496
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   497
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   498
}