hotspot/src/share/vm/code/vtableStubs.hpp
author coleenp
Mon, 14 Jan 2013 11:01:39 -0500
changeset 15194 a35093d73168
parent 13728 882756847a04
child 19696 bd5a0131bde1
permissions -rw-r--r--
8006005: Fix constant pool index validation and alignment trap for method parameter reflection Summary: This patch addresses an alignment trap due to the storage format of method parameters data in constMethod. It also adds code to validate constant pool indexes for method parameters data. Reviewed-by: jrose, dholmes Contributed-by: eric.mccorkle@oracle.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
     2
 * Copyright (c) 1997, 2012, 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: 6176
diff changeset
    25
#ifndef SHARE_VM_CODE_VTABLESTUBS_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    26
#define SHARE_VM_CODE_VTABLESTUBS_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    27
7408
c04a5c989f26 7003125: precompiled.hpp is included when precompiled headers are not used
stefank
parents: 7397
diff changeset
    28
#include "code/vmreg.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    29
#include "memory/allocation.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    30
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    31
// A VtableStub holds an individual code stub for a pair (vtable index, #args) for either itables or vtables
489c9b5090e2 Initial load
duke
parents:
diff changeset
    32
// There's a one-to-one relationship between a VtableStub and such a pair.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    33
489c9b5090e2 Initial load
duke
parents:
diff changeset
    34
class VtableStub {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    35
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
  friend class VtableStubs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
  static address _chunk;             // For allocation
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
  static address _chunk_end;         // For allocation
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
  static VMReg   _receiver_location; // Where to find receiver
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
  VtableStub*    _next;              // Pointer to next entry in hash table
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
  const short    _index;             // vtable index
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
  short          _ame_offset;        // Where an AbstractMethodError might occur
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
  short          _npe_offset;        // Where a NullPointerException might occur
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
  bool           _is_vtable_stub;    // True if vtable stub, false, is itable stub
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
  /* code follows here */            // The vtableStub code
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
  void* operator new(size_t size, int code_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
  VtableStub(bool is_vtable_stub, int index)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
        : _next(NULL), _is_vtable_stub(is_vtable_stub),
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
          _index(index), _ame_offset(-1), _npe_offset(-1) {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
  VtableStub* next() const                       { return _next; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
  int index() const                              { return _index; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
  static VMReg receiver_location()               { return _receiver_location; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
  void set_next(VtableStub* n)                   { _next = n; }
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 7408
diff changeset
    58
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 7408
diff changeset
    59
 public:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
  address code_begin() const                     { return (address)(this + 1); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
  address code_end() const                       { return code_begin() + pd_code_size_limit(_is_vtable_stub); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
  address entry_point() const                    { return code_begin(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
  static int entry_offset()                      { return sizeof(class VtableStub); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
  bool matches(bool is_vtable_stub, int index) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
    return _index == index && _is_vtable_stub == is_vtable_stub;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
  bool contains(address pc) const                { return code_begin() <= pc && pc < code_end(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 7408
diff changeset
    70
 private:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
  void set_exception_points(address npe_addr, address ame_addr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
    _npe_offset = npe_addr - code_begin();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
    _ame_offset = ame_addr - code_begin();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
    assert(is_abstract_method_error(ame_addr),   "offset must be correct");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
    assert(is_null_pointer_exception(npe_addr),  "offset must be correct");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
    assert(!is_abstract_method_error(npe_addr),  "offset must be correct");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
    assert(!is_null_pointer_exception(ame_addr), "offset must be correct");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
  // platform-dependent routines
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
  static int  pd_code_size_limit(bool is_vtable_stub);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
  static int  pd_code_alignment();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
  // CNC: Removed because vtable stubs are now made with an ideal graph
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
  // static bool pd_disregard_arg_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
  static void align_chunk() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
    uintptr_t off = (uintptr_t)( _chunk + sizeof(VtableStub) ) % pd_code_alignment();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
    if (off != 0)  _chunk += pd_code_alignment() - off;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
  // Query
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
  bool is_itable_stub()                          { return !_is_vtable_stub; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
  bool is_vtable_stub()                          { return  _is_vtable_stub; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
  bool is_abstract_method_error(address epc)     { return epc == code_begin()+_ame_offset; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
  bool is_null_pointer_exception(address epc)    { return epc == code_begin()+_npe_offset; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
    98
  void print_on(outputStream* st) const;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
    99
  void print() const                             { print_on(tty); }
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   100
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
// VtableStubs creates the code stubs for compiled calls through vtables.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
// There is one stub per (vtable index, args_size) pair, and the stubs are
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
// never deallocated. They don't need to be GCed because they contain no oops.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
class VtableStubs : AllStatic {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
 public:                                         // N must be public (some compilers need this for _table)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
  enum {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
    N    = 256,                                  // size of stub table; must be power of two
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
    mask = N - 1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
  static VtableStub* _table[N];                  // table of existing stubs
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
  static int         _number_of_vtable_stubs;    // number of stubs created so far (for statistics)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
  static VtableStub* create_vtable_stub(int vtable_index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
  static VtableStub* create_itable_stub(int vtable_index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
  static VtableStub* lookup            (bool is_vtable_stub, int vtable_index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
  static void        enter             (bool is_vtable_stub, int vtable_index, VtableStub* s);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
  static inline uint hash              (bool is_vtable_stub, int vtable_index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
 public:
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   126
  static address     create_stub(bool is_vtable_stub, int vtable_index, Method* method); // return the entry point of a stub for this call
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
  static bool        is_entry_point(address pc);                     // is pc a vtable stub entry point?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
  static bool        contains(address pc);                           // is pc within any stub?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
  static VtableStub* stub_containing(address pc);                    // stub containing pc or NULL
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
  static int         number_of_vtable_stubs() { return _number_of_vtable_stubs; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
  static void        initialize();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
};
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
   133
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
   134
#endif // SHARE_VM_CODE_VTABLESTUBS_HPP