hotspot/src/share/vm/runtime/stackValueCollection.cpp
author coleenp
Wed, 20 Mar 2013 08:04:54 -0400
changeset 16430 882cddc35bec
parent 8921 14bfe81f2a9d
child 24424 2658d7834c6e
permissions -rw-r--r--
8008217: CDS: Class data sharing limits the malloc heap on Solaris Summary: In 64bit VM move CDS archive address to 32G on all platforms using new flag SharedBaseAddress. In 32bit VM set CDS archive address to 3Gb on Linux and let other OSs pick the address. Reviewed-by: kvn, dcubed, zgu, hseigel
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
8921
14bfe81f2a9d 7010070: Update all 2010 Oracle-changed OpenJDK files to have the proper copyright dates - second pass
trims
parents: 8107
diff changeset
     2
 * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1
diff changeset
    21
 * questions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    25
#include "precompiled.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    26
#include "runtime/stackValueCollection.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    27
#ifdef TARGET_ARCH_x86
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    28
# include "jniTypes_x86.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    29
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    30
#ifdef TARGET_ARCH_sparc
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    31
# include "jniTypes_sparc.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    32
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    33
#ifdef TARGET_ARCH_zero
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    34
# include "jniTypes_zero.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    35
#endif
8107
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7397
diff changeset
    36
#ifdef TARGET_ARCH_arm
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7397
diff changeset
    37
# include "jniTypes_arm.hpp"
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7397
diff changeset
    38
#endif
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7397
diff changeset
    39
#ifdef TARGET_ARCH_ppc
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7397
diff changeset
    40
# include "jniTypes_ppc.hpp"
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7397
diff changeset
    41
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
jint StackValueCollection::int_at(int slot) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
  intptr_t val =  at(slot)->get_int();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
  jint ival = *((jint*) (&val));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
  return ival;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
jlong StackValueCollection::long_at(int slot) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
#ifdef _LP64
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
  return at(slot+1)->get_int();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
  union {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
    jlong jl;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
    jint  array[2];
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
  } value;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
  // Interpreter stack is reversed in memory:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
  // low memory location is in higher java local slot.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
  value.array[0] = at(slot+1)->get_int();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
  value.array[1] = at(slot  )->get_int();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
  return value.jl;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
Handle StackValueCollection::obj_at(int slot) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
  return at(slot)->get_obj();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
jfloat StackValueCollection::float_at(int slot) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
  intptr_t res = at(slot)->get_int();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
  return *((jfloat*) (&res));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
jdouble StackValueCollection::double_at(int slot) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
#ifdef _LP64
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
  intptr_t res = at(slot+1)->get_int();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
  return *((jdouble*) (&res));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
  union {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
    jdouble jd;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
    jint    array[2];
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
  } value;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
  // Interpreter stack is reversed in memory:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
  // low memory location is in higher java local slot.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
  value.array[0] = at(slot+1)->get_int();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
  value.array[1] = at(slot  )->get_int();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
  return value.jd;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
void StackValueCollection::set_int_at(int slot, jint value) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
  intptr_t val;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
  *((jint*) (&val)) = value;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
  at(slot)->set_int(val);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
void StackValueCollection::set_long_at(int slot, jlong value) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
#ifdef _LP64
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
  at(slot+1)->set_int(value);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
  union {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
    jlong jl;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
    jint  array[2];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
  } x;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
  // Interpreter stack is reversed in memory:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
  // low memory location is in higher java local slot.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
  x.jl = value;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
  at(slot+1)->set_int(x.array[0]);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
  at(slot+0)->set_int(x.array[1]);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
void StackValueCollection::set_obj_at(int slot, Handle value) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
  at(slot)->set_obj(value);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
void StackValueCollection::set_float_at(int slot, jfloat value) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
#ifdef _LP64
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
  union {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
    intptr_t jd;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
    jint    array[2];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
  } val;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
  // Interpreter stores 32 bit floats in first half of 64 bit word.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
  val.array[0] = *(jint*)(&value);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
  val.array[1] = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
  at(slot)->set_int(val.jd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
  at(slot)->set_int(*(jint*)(&value));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
void StackValueCollection::set_double_at(int slot, jdouble value) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
#ifdef _LP64
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
  at(slot+1)->set_int(*(intptr_t*)(&value));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
  union {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
    jdouble jd;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
    jint    array[2];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
  } x;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
  // Interpreter stack is reversed in memory:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
  // low memory location is in higher java local slot.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
  x.jd = value;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
  at(slot+1)->set_int(x.array[0]);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
  at(slot+0)->set_int(x.array[1]);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
void StackValueCollection::print() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
  for(int index = 0; index < size(); index++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
    tty->print("\t  %2d ", index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
    at(index)->print_on(tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
    if( at(index  )->type() == T_INT &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
        index+1 < size() &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
        at(index+1)->type() == T_INT ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
      tty->print("  " INT64_FORMAT " (long)", long_at(index));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
      tty->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
      tty->print("\t     %.15e (double)", double_at(index));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
      tty->print("  " PTR64_FORMAT " (longhex)", long_at(index));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
    tty->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
#endif