hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/ppc64/PPC64Frame.java
author rbackman
Tue, 05 May 2015 16:50:25 +0200
changeset 30590 14f7f48c1377
parent 29571 6627b10e05f8
permissions -rw-r--r--
8064458: OopMap class could be more compact Reviewed-by: kvn, bdelsart
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_MIRROR_OFFSET = -3; // for native calls only
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    50
  private static final int INTERPRETER_FRAME_SENDER_SP_OFFSET = -4;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    51
  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
    52
  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
    53
  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
    54
  private static final int INTERPRETER_FRAME_BCX_OFFSET = INTERPRETER_FRAME_ESP_OFFSET - 1;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    55
  private static final int INTERPRETER_FRAME_CACHE_OFFSET =INTERPRETER_FRAME_BCX_OFFSET - 1;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    56
  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
    57
  private static final int INTERPRETER_FRAME_LOCALS_OFFSET = INTERPRETER_FRAME_MONITORS_OFFSET - 1;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    58
  private static final int INTERPRETER_FRAME_METHOD_OFFSET = INTERPRETER_FRAME_LOCALS_OFFSET - 1;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    59
  private static final int INTERPRETER_FRAME_INITIAL_SP_OFFSET = INTERPRETER_FRAME_BCX_OFFSET - 1; // FIXME: probably wrong, but unused anyway
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    60
  private static final int INTERPRETER_FRAME_MONITOR_BLOCK_TOP_OFFSET = INTERPRETER_FRAME_INITIAL_SP_OFFSET;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    61
  private static final int INTERPRETER_FRAME_MONITOR_BLOCK_BOTTOM_OFFSET = INTERPRETER_FRAME_INITIAL_SP_OFFSET;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    62
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    63
  // Entry frames
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    64
  private static int ENTRY_FRAME_CALL_WRAPPER_OFFSET;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    65
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    66
  static {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    67
    VM.registerVMInitializedObserver(new Observer() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    68
      public void update(Observable o, Object data) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    69
        initialize(VM.getVM().getTypeDataBase());
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
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    73
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    74
  private static synchronized void initialize(TypeDataBase db) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    75
    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
    76
    int wordLength = (int) VM.getVM().getAddressSize();
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    77
    ENTRY_FRAME_CALL_WRAPPER_OFFSET = -entry_frame_locals_size/wordLength;
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
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    80
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    81
  // an additional field beyond sp and pc:
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    82
  Address raw_fp; // frame pointer
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    83
  private Address raw_unextendedSP;
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
  private PPC64Frame() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    86
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    87
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    88
  private void adjustForDeopt() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    89
    if ( pc != null) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    90
      // 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
    91
      CodeBlob cb = VM.getVM().getCodeCache().findBlob(pc);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    92
      if (cb != null && cb.isJavaMethod()) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    93
        NMethod nm = (NMethod) cb;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    94
        if (pc.equals(nm.deoptHandlerBegin())) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    95
          if (Assert.ASSERTS_ENABLED) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    96
            Assert.that(this.getUnextendedSP() != null, "null SP in Java frame");
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    97
          }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    98
          // adjust pc if frame is deoptimized.
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
    99
          pc = this.getUnextendedSP().getAddressAt(nm.origPCOffset());
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   100
          deoptimized = true;
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
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   105
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   106
  public PPC64Frame(Address raw_sp, Address raw_fp, Address pc) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   107
    this.raw_sp = raw_sp;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   108
    this.raw_unextendedSP = raw_sp;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   109
    if (raw_fp == null) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   110
      this.raw_fp = raw_sp.getAddressAt(0);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   111
    } else {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   112
      this.raw_fp = raw_fp;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   113
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   114
    if (pc == null) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   115
      this.pc = raw_sp.getAddressAt(2 * VM.getVM().getAddressSize());
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   116
    } else {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   117
      this.pc = pc;
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
    adjustUnextendedSP();
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   120
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   121
    // Frame must be fully constructed before this call
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   122
    adjustForDeopt();
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   123
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   124
    if (DEBUG) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   125
      System.out.println("PPC64Frame(sp, fp, pc): " + this);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   126
      dumpStack();
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
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   129
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   130
  public PPC64Frame(Address raw_sp, Address raw_fp) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   131
    this.raw_sp = raw_sp;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   132
    this.raw_unextendedSP = raw_sp;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   133
    if (raw_fp == null) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   134
      this.raw_fp = raw_sp.getAddressAt(0);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   135
    } else {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   136
      this.raw_fp = raw_fp;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   137
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   138
    this.pc = raw_sp.getAddressAt(2 * VM.getVM().getAddressSize());
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   139
    adjustUnextendedSP();
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   140
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   141
    // Frame must be fully constructed before this call
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   142
    adjustForDeopt();
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   143
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   144
    if (DEBUG) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   145
      System.out.println("PPC64Frame(sp, fp): " + this);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   146
      dumpStack();
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
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   149
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   150
  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
   151
    this.raw_sp = raw_sp;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   152
    this.raw_unextendedSP = raw_unextendedSp;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   153
    if (raw_fp == null) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   154
      this.raw_fp = raw_sp.getAddressAt(0);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   155
    } else {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   156
      this.raw_fp = raw_fp;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   157
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   158
    if (pc == null) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   159
      this.pc = raw_sp.getAddressAt(2 * VM.getVM().getAddressSize());
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   160
    } else {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   161
      this.pc = pc;
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
    adjustUnextendedSP();
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   164
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   165
    // Frame must be fully constructed before this call
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   166
    adjustForDeopt();
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   167
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   168
    if (DEBUG) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   169
      System.out.println("PPC64Frame(sp, unextendedSP, fp, pc): " + this);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   170
      dumpStack();
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
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   174
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   175
  public Object clone() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   176
    PPC64Frame frame = new PPC64Frame();
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   177
    frame.raw_sp = raw_sp;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   178
    frame.raw_unextendedSP = raw_unextendedSP;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   179
    frame.raw_fp = raw_fp;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   180
    frame.pc = pc;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   181
    frame.deoptimized = deoptimized;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   182
    return frame;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   183
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   184
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   185
  public boolean equals(Object arg) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   186
    if (arg == null) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   187
      return false;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   188
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   189
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   190
    if (!(arg instanceof PPC64Frame)) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   191
      return false;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   192
    }
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
    PPC64Frame other = (PPC64Frame) arg;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   195
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   196
    return (AddressOps.equal(getSP(), other.getSP()) &&
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   197
        AddressOps.equal(getUnextendedSP(), other.getUnextendedSP()) &&
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   198
        AddressOps.equal(getFP(), other.getFP()) &&
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   199
        AddressOps.equal(getPC(), other.getPC()));
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   200
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   201
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   202
  public int hashCode() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   203
    if (raw_sp == null) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   204
      return 0;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   205
    }
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
    return raw_sp.hashCode();
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   208
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   209
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   210
  public String toString() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   211
    return "sp: " + (getSP() == null ? "null" : getSP().toString()) +
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   212
        ", unextendedSP: " + (getUnextendedSP() == null ? "null" : getUnextendedSP().toString()) +
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   213
        ", fp: " + (getFP() == null ? "null" : getFP().toString()) +
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   214
        ", pc: " + (pc == null ? "null" : pc.toString());
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   215
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   216
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   217
  // accessors for the instance variables
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   218
  public Address getFP() { return raw_fp; }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   219
  public Address getSP() { return raw_sp; }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   220
  public Address getID() { return raw_sp; }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   221
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   222
  // FIXME: not implemented yet (should be done for Solaris/PPC64)
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   223
  public boolean isSignalHandlerFrameDbg() { return false; }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   224
  public int     getSignalNumberDbg()      { return 0;     }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   225
  public String  getSignalNameDbg()        { return null;  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   226
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   227
  public boolean isInterpretedFrameValid() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   228
    if (Assert.ASSERTS_ENABLED) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   229
      Assert.that(isInterpretedFrame(), "Not an interpreted frame");
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   230
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   231
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   232
    // These are reasonable sanity checks
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   233
    if (getFP() == null || getFP().andWithMask(0x3) != null) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   234
      return false;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   235
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   236
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   237
    if (getSP() == null || getSP().andWithMask(0x3) != null) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   238
      return false;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   239
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   240
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   241
    // These are hacks to keep us out of trouble.
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   242
    // The problem with these is that they mask other problems
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   243
    if (getFP().lessThanOrEqual(getSP())) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   244
      // this attempts to deal with unsigned comparison above
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   245
      return false;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   246
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   247
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   248
    if (getFP().minus(getSP()) > 4096 * VM.getVM().getAddressSize()) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   249
      // stack frames shouldn't be large.
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   250
      return false;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   251
    }
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
    return true;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   254
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   255
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   256
  // FIXME: not applicable in current system
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   257
  //  void    patch_pc(Thread* thread, address pc);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   258
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   259
  public Frame sender(RegisterMap regMap, CodeBlob cb) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   260
    PPC64RegisterMap map = (PPC64RegisterMap) regMap;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   261
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   262
    if (Assert.ASSERTS_ENABLED) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   263
      Assert.that(map != null, "map must be set");
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   264
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   265
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   266
    // 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
   267
    // update it accordingly
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   268
    map.setIncludeArgumentOops(false);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   269
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   270
    if (isEntryFrame()) return senderForEntryFrame(map);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   271
    if (isInterpretedFrame()) return senderForInterpreterFrame(map);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   272
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   273
    if(cb == null) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   274
      cb = VM.getVM().getCodeCache().findBlob(getPC());
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   275
    } else {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   276
      if (Assert.ASSERTS_ENABLED) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   277
        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
   278
      }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   279
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   280
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   281
    if (cb != null) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   282
      return senderForCompiledFrame(map, cb);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   283
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   284
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   285
    // Must be native-compiled frame, i.e. the marshaling code for native
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   286
    // methods that exists in the core system.
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   287
    return new PPC64Frame(getSenderSP(), getLink(), getSenderPC());
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   288
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   289
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   290
  private Frame senderForEntryFrame(PPC64RegisterMap map) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   291
    if (DEBUG) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   292
      System.out.println("senderForEntryFrame");
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   293
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   294
    if (Assert.ASSERTS_ENABLED) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   295
      Assert.that(map != null, "map must be set");
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   296
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   297
    // 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
   298
    // frame of that chunk as the sender
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   299
    PPC64JavaCallWrapper jcw = (PPC64JavaCallWrapper) getEntryFrameCallWrapper();
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   300
    if (Assert.ASSERTS_ENABLED) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   301
      Assert.that(!entryFrameIsFirst(), "next Java fp must be non zero");
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   302
      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
   303
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   304
    PPC64Frame fr;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   305
    if (jcw.getLastJavaPC() != null) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   306
      fr = new PPC64Frame(jcw.getLastJavaSP(), jcw.getLastJavaFP(), jcw.getLastJavaPC());
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   307
    } else {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   308
      fr = new PPC64Frame(jcw.getLastJavaSP(), jcw.getLastJavaFP());
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   309
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   310
    map.clear();
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   311
    if (Assert.ASSERTS_ENABLED) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   312
      Assert.that(map.getIncludeArgumentOops(), "should be set by clear");
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
    return fr;
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
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   317
  //------------------------------------------------------------------------------
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   318
  // frame::adjust_unextended_sp
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   319
  private void adjustUnextendedSP() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   320
    raw_unextendedSP = getFP();
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   321
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   322
  private Frame senderForInterpreterFrame(PPC64RegisterMap map) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   323
    if (DEBUG) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   324
      System.out.println("senderForInterpreterFrame");
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   325
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   326
    Address unextendedSP = addressOfStackSlot(INTERPRETER_FRAME_SENDER_SP_OFFSET).getAddressAt(0);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   327
    Address sp = getSenderSP();
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
    return new PPC64Frame(sp, unextendedSP, getLink(), getSenderPC());
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
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   332
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   333
  private Frame senderForCompiledFrame(PPC64RegisterMap map, CodeBlob cb) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   334
    if (DEBUG) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   335
      System.out.println("senderForCompiledFrame");
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
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
    // NOTE: some of this code is (unfortunately) duplicated in PPC64CurrentFrameGuess
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   340
    //
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   341
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   342
    if (Assert.ASSERTS_ENABLED) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   343
      Assert.that(map != null, "map must be set");
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   344
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   345
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   346
    // frame owned by optimizing compiler
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   347
    if (Assert.ASSERTS_ENABLED) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   348
      Assert.that(cb.getFrameSize() >= 0, "must have non-zero frame size");
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 senderSP = getSenderSP();
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
    Address senderPC = getSenderPC();
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   353
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   354
    if (map.getUpdateMap()) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   355
      // 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
   356
      // 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
   357
      // outside of update_register_map.
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   358
      map.setIncludeArgumentOops(cb.callerMustGCArguments());
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   359
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   360
      if (cb.getOopMaps() != null) {
30590
14f7f48c1377 8064458: OopMap class could be more compact
rbackman
parents: 29571
diff changeset
   361
        ImmutableOopMapSet.updateRegisterMap(this, cb, map, true);
28369
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
    }
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
    return new PPC64Frame(senderSP, getLink(), senderPC);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   366
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   367
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   368
  protected boolean hasSenderPD() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   369
    // FIXME
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   370
    return true;
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   371
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   372
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   373
  public long frameSize() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   374
    return (getSenderSP().minus(getSP()) / VM.getVM().getAddressSize());
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   375
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   376
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   377
  public Address getLink() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   378
    return getSenderSP().getAddressAt(0);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   379
  }
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
  public Address getUnextendedSP() { return raw_unextendedSP; }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   382
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   383
  // Return address:
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   384
  public Address getSenderPC()     { return getSenderSP().getAddressAt(2 * VM.getVM().getAddressSize()); }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   385
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   386
  public Address getSenderSP()     { return getFP(); }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   387
  public Address addressOfInterpreterFrameLocals() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   388
    return addressOfStackSlot(INTERPRETER_FRAME_LOCALS_OFFSET);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   389
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   390
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   391
  private Address addressOfInterpreterFrameBCX() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   392
    return addressOfStackSlot(INTERPRETER_FRAME_BCX_OFFSET);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   393
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   394
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   395
  public int getInterpreterFrameBCI() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   396
    // FIXME: this is not atomic with respect to GC and is unsuitable
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   397
    // for use in a non-debugging, or reflective, system. Need to
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   398
    // figure out how to express this.
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   399
    Address bcp = addressOfInterpreterFrameBCX().getAddressAt(0);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   400
    Address methodHandle = addressOfInterpreterFrameMethod().getAddressAt(0);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   401
    Method method = (Method)Metadata.instantiateWrapperFor(methodHandle);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   402
    return bcpToBci(bcp, method);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   403
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   404
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   405
  public Address addressOfInterpreterFrameMDX() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   406
    return addressOfStackSlot(INTERPRETER_FRAME_MDX_OFFSET);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   407
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   408
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   409
  // FIXME
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   410
  //inline int frame::interpreter_frame_monitor_size() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   411
  //  return BasicObjectLock::size();
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   412
  //}
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   413
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   414
  // expression stack
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   415
  // (the max_stack arguments are used by the GC; see class FrameClosure)
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   416
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   417
  public Address addressOfInterpreterFrameExpressionStack() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   418
    Address monitorEnd = interpreterFrameMonitorEnd().address();
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   419
    return monitorEnd.addOffsetTo(-1 * VM.getVM().getAddressSize());
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   420
  }
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
  public int getInterpreterFrameExpressionStackDirection() { return -1; }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   423
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   424
  // top of expression stack
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   425
  public Address addressOfInterpreterFrameTOS() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   426
    return getSP();
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   427
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   428
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   429
  /** Expression stack from top down */
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   430
  public Address addressOfInterpreterFrameTOSAt(int slot) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   431
    return addressOfInterpreterFrameTOS().addOffsetTo(slot * VM.getVM().getAddressSize());
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   432
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   433
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   434
  public Address getInterpreterFrameSenderSP() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   435
    if (Assert.ASSERTS_ENABLED) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   436
      Assert.that(isInterpretedFrame(), "interpreted frame expected");
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
    return addressOfStackSlot(INTERPRETER_FRAME_SENDER_SP_OFFSET).getAddressAt(0);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   439
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   440
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   441
  // Monitors
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   442
  public BasicObjectLock interpreterFrameMonitorBegin() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   443
    return new BasicObjectLock(addressOfStackSlot(INTERPRETER_FRAME_MONITOR_BLOCK_BOTTOM_OFFSET));
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   444
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   445
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   446
  public BasicObjectLock interpreterFrameMonitorEnd() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   447
    Address result = addressOfStackSlot(INTERPRETER_FRAME_MONITOR_BLOCK_TOP_OFFSET).getAddressAt(0);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   448
    if (Assert.ASSERTS_ENABLED) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   449
      // make sure the pointer points inside the frame
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   450
      Assert.that(AddressOps.gt(getFP(), result), "result must <  than frame pointer");
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   451
      Assert.that(AddressOps.lte(getSP(), result), "result must >= than stack pointer");
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
    return new BasicObjectLock(result);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   454
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   455
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   456
  public int interpreterFrameMonitorSize() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   457
    return BasicObjectLock.size();
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   458
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   459
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   460
  // Method
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   461
  public Address addressOfInterpreterFrameMethod() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   462
    return addressOfStackSlot(INTERPRETER_FRAME_METHOD_OFFSET);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   463
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   464
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   465
  // Constant pool cache
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   466
  public Address addressOfInterpreterFrameCPCache() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   467
    return addressOfStackSlot(INTERPRETER_FRAME_CACHE_OFFSET);
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   468
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   469
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   470
  // Entry frames
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   471
  public JavaCallWrapper getEntryFrameCallWrapper() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   472
    return new PPC64JavaCallWrapper(addressOfStackSlot(ENTRY_FRAME_CALL_WRAPPER_OFFSET).getAddressAt(0));
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   473
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   474
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   475
  protected Address addressOfSavedOopResult() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   476
    // offset is 2 for compiler2 and 3 for compiler1
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   477
    return getSP().addOffsetTo((VM.getVM().isClientCompiler() ? 2 : 3) *
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   478
        VM.getVM().getAddressSize());
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   479
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   480
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   481
  protected Address addressOfSavedReceiver() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   482
    return getSP().addOffsetTo(-4 * VM.getVM().getAddressSize());
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   483
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   484
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   485
  private void dumpStack() {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   486
    if (getFP() != null) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   487
      for (Address addr = getSP().addOffsetTo(-5 * VM.getVM().getAddressSize());
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   488
          AddressOps.lte(addr, getFP().addOffsetTo(5 * VM.getVM().getAddressSize()));
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   489
          addr = addr.addOffsetTo(VM.getVM().getAddressSize())) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   490
        System.out.println(addr + ": " + addr.getAddressAt(0));
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   491
      }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   492
    } else {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   493
      for (Address addr = getSP().addOffsetTo(-5 * VM.getVM().getAddressSize());
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   494
          AddressOps.lte(addr, getSP().addOffsetTo(20 * VM.getVM().getAddressSize()));
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   495
          addr = addr.addOffsetTo(VM.getVM().getAddressSize())) {
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   496
        System.out.println(addr + ": " + addr.getAddressAt(0));
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
    }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   499
  }
a62a208f18de 8049716: PPC64: Implement SA on Linux/PPC64
simonis
parents:
diff changeset
   500
}