hotspot/src/share/vm/code/stubs.hpp
author coleenp
Mon, 14 Jan 2013 11:01:39 -0500
changeset 15194 a35093d73168
parent 13963 e5b53c306fb5
child 16368 713209c45a82
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
/*
13963
e5b53c306fb5 7197424: update copyright year to match last edit in jdk8 hotspot repository
mikael
parents: 13887
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: 5547
diff changeset
    25
#ifndef SHARE_VM_CODE_STUBS_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    26
#define SHARE_VM_CODE_STUBS_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    27
13887
89b873bcc55b 7200163: add CodeComments functionality to assember stubs
kvn
parents: 13195
diff changeset
    28
#include "asm/codeBuffer.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    29
#include "memory/allocation.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    30
#ifdef TARGET_OS_FAMILY_linux
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    31
# include "os_linux.inline.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_OS_FAMILY_solaris
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    34
# include "os_solaris.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    35
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    36
#ifdef TARGET_OS_FAMILY_windows
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    37
# include "os_windows.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    38
#endif
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 7397
diff changeset
    39
#ifdef TARGET_OS_FAMILY_bsd
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 7397
diff changeset
    40
# include "os_bsd.inline.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 7397
diff changeset
    41
#endif
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    42
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
// The classes in this file provide a simple framework for the
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
// management of little pieces of machine code - or stubs -
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
// created on the fly and frequently discarded. In this frame-
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
// work stubs are stored in a queue.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
// Stub serves as abstract base class. A concrete stub
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
// implementation is a subclass of Stub, implementing
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
// all (non-virtual!) functions required sketched out
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
// in the Stub class.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
// A concrete stub layout may look like this (both data
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
// and code sections could be empty as well):
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
//                ________
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
// stub       -->|        | <--+
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
//               |  data  |    |
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
//               |________|    |
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
// code_begin -->|        |    |
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
//               |        |    |
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
//               |  code  |    | size
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
//               |        |    |
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
//               |________|    |
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
// code_end   -->|        |    |
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
//               |  data  |    |
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
//               |________|    |
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
//                          <--+
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
class Stub VALUE_OBJ_CLASS_SPEC {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
  // Initialization/finalization
13887
89b873bcc55b 7200163: add CodeComments functionality to assember stubs
kvn
parents: 13195
diff changeset
    75
  void    initialize(int size,
89b873bcc55b 7200163: add CodeComments functionality to assember stubs
kvn
parents: 13195
diff changeset
    76
                     CodeComments& comments)     { ShouldNotCallThis(); }                // called to initialize/specify the stub's size
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
  void    finalize()                             { ShouldNotCallThis(); }                // called before the stub is deallocated
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
  // General info/converters
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
  int     size() const                           { ShouldNotCallThis(); return 0; }      // must return the size provided by initialize
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
  static  int code_size_to_size(int code_size)   { ShouldNotCallThis(); return 0; }      // computes the size given the code size
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
  // Code info
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
  address code_begin() const                     { ShouldNotCallThis(); return NULL; }   // points to the first byte of    the code
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
  address code_end() const                       { ShouldNotCallThis(); return NULL; }   // points to the first byte after the code
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
  // Debugging
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
  void    verify()                               { ShouldNotCallThis(); }                // verifies the Stub
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
  void    print()                                { ShouldNotCallThis(); }                // prints some information about the stub
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
// A stub interface defines the interface between a stub queue
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
// and the stubs it queues. In order to avoid a vtable and
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
// (and thus the extra word) in each stub, a concrete stub
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
// interface object is created and associated with a stub
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
// buffer which in turn uses the stub interface to interact
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
// with its stubs.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
// StubInterface serves as an abstract base class. A concrete
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
// stub interface implementation is a subclass of StubInterface,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
// forwarding its virtual function calls to non-virtual calls
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
// of the concrete stub (see also macro below). There's exactly
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
// one stub interface instance required per stub queue.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 10565
diff changeset
   106
class StubInterface: public CHeapObj<mtCode> {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
  // Initialization/finalization
13887
89b873bcc55b 7200163: add CodeComments functionality to assember stubs
kvn
parents: 13195
diff changeset
   109
  virtual void    initialize(Stub* self, int size,
89b873bcc55b 7200163: add CodeComments functionality to assember stubs
kvn
parents: 13195
diff changeset
   110
                             CodeComments& comments)       = 0; // called after creation (called twice if allocated via (request, commit))
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
  virtual void    finalize(Stub* self)                     = 0; // called before deallocation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
  // General info/converters
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
  virtual int     size(Stub* self) const                   = 0; // the total size of the stub in bytes (must be a multiple of CodeEntryAlignment)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
  virtual int     code_size_to_size(int code_size) const   = 0; // computes the total stub size in bytes given the code size in bytes
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
  // Code info
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
  virtual address code_begin(Stub* self) const             = 0; // points to the first code byte
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
  virtual address code_end(Stub* self) const               = 0; // points to the first byte after the code
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
  // Debugging
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
  virtual void    verify(Stub* self)                       = 0; // verifies the stub
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
  virtual void    print(Stub* self)                        = 0; // prints information about the stub
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
// DEF_STUB_INTERFACE is used to create a concrete stub interface
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
// class, forwarding stub interface calls to the corresponding
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
// stub calls.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
#define DEF_STUB_INTERFACE(stub)                           \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
  class stub##Interface: public StubInterface {            \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
   private:                                                \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
    static stub*    cast(Stub* self)                       { return (stub*)self; }                 \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
                                                           \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
   public:                                                 \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
    /* Initialization/finalization */                      \
13887
89b873bcc55b 7200163: add CodeComments functionality to assember stubs
kvn
parents: 13195
diff changeset
   138
    virtual void    initialize(Stub* self, int size,       \
89b873bcc55b 7200163: add CodeComments functionality to assember stubs
kvn
parents: 13195
diff changeset
   139
                               CodeComments& comments)     { cast(self)->initialize(size, comments); } \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
    virtual void    finalize(Stub* self)                   { cast(self)->finalize(); }             \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
                                                           \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
    /* General info */                                     \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
    virtual int     size(Stub* self) const                 { return cast(self)->size(); }          \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
    virtual int     code_size_to_size(int code_size) const { return stub::code_size_to_size(code_size); } \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
                                                           \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
    /* Code info */                                        \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
    virtual address code_begin(Stub* self) const           { return cast(self)->code_begin(); }    \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
    virtual address code_end(Stub* self) const             { return cast(self)->code_end(); }      \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
                                                           \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
    /* Debugging */                                        \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
    virtual void    verify(Stub* self)                     { cast(self)->verify(); }               \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
    virtual void    print(Stub* self)                      { cast(self)->print(); }                \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
// A StubQueue maintains a queue of stubs.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
// Note: All sizes (spaces) are given in bytes.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 10565
diff changeset
   159
class StubQueue: public CHeapObj<mtCode> {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
  friend class VMStructs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
  StubInterface* _stub_interface;                // the interface prototype
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
  address        _stub_buffer;                   // where all stubs are stored
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
  int            _buffer_size;                   // the buffer size in bytes
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
  int            _buffer_limit;                  // the (byte) index of the actual buffer limit (_buffer_limit <= _buffer_size)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
  int            _queue_begin;                   // the (byte) index of the first queue entry (word-aligned)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
  int            _queue_end;                     // the (byte) index of the first entry after the queue (word-aligned)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
  int            _number_of_stubs;               // the number of buffered stubs
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
  Mutex* const   _mutex;                         // the lock used for a (request, commit) transaction
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
  void  check_index(int i) const                 { assert(0 <= i && i < _buffer_limit && i % CodeEntryAlignment == 0, "illegal index"); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
  bool  is_contiguous() const                    { return _queue_begin <= _queue_end; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
  int   index_of(Stub* s) const                  { int i = (address)s - _stub_buffer; check_index(i); return i; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
  Stub* stub_at(int i) const                     { check_index(i); return (Stub*)(_stub_buffer + i); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
  Stub* current_stub() const                     { return stub_at(_queue_end); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
  // Stub functionality accessed via interface
13887
89b873bcc55b 7200163: add CodeComments functionality to assember stubs
kvn
parents: 13195
diff changeset
   178
  void  stub_initialize(Stub* s, int size,
89b873bcc55b 7200163: add CodeComments functionality to assember stubs
kvn
parents: 13195
diff changeset
   179
                        CodeComments& comments)  { assert(size % CodeEntryAlignment == 0, "size not aligned"); _stub_interface->initialize(s, size, comments); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
  void  stub_finalize(Stub* s)                   { _stub_interface->finalize(s); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
  int   stub_size(Stub* s) const                 { return _stub_interface->size(s); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
  bool  stub_contains(Stub* s, address pc) const { return _stub_interface->code_begin(s) <= pc && pc < _stub_interface->code_end(s); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
  int   stub_code_size_to_size(int code_size) const { return _stub_interface->code_size_to_size(code_size); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
  void  stub_verify(Stub* s)                     { _stub_interface->verify(s); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
  void  stub_print(Stub* s)                      { _stub_interface->print(s); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
  static void register_queue(StubQueue*);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
  StubQueue(StubInterface* stub_interface, int buffer_size, Mutex* lock,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
            const char* name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
  ~StubQueue();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
  // General queue info
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
  bool  is_empty() const                         { return _queue_begin == _queue_end; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
  int   total_space() const                      { return _buffer_size - 1; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
  int   available_space() const                  { int d = _queue_begin - _queue_end - 1; return d < 0 ? d + _buffer_size : d; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
  int   used_space() const                       { return total_space() - available_space(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
  int   number_of_stubs() const                  { return _number_of_stubs; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
  bool  contains(address pc) const               { return _stub_buffer <= pc && pc < _stub_buffer + _buffer_limit; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
  Stub* stub_containing(address pc) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
  address code_start() const                     { return _stub_buffer; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
  address code_end() const                       { return _stub_buffer + _buffer_limit; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
  // Stub allocation (atomic transactions)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
  Stub* request_committed(int code_size);        // request a stub that provides exactly code_size space for code
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
  Stub* request(int requested_code_size);        // request a stub with a (maximum) code space - locks the queue
13887
89b873bcc55b 7200163: add CodeComments functionality to assember stubs
kvn
parents: 13195
diff changeset
   208
  void  commit (int committed_code_size,
89b873bcc55b 7200163: add CodeComments functionality to assember stubs
kvn
parents: 13195
diff changeset
   209
                CodeComments& comments);         // commit the previously requested stub - unlocks the queue
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
  // Stub deallocation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
  void  remove_first();                          // remove the first stub in the queue
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
  void  remove_first(int n);                     // remove the first n stubs in the queue
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
  void  remove_all();                            // remove all stubs in the queue
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
  // Iteration
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
  static void queues_do(void f(StubQueue* s));   // call f with each StubQueue
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
  void  stubs_do(void f(Stub* s));               // call f with all stubs
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
  Stub* first() const                            { return number_of_stubs() > 0 ? stub_at(_queue_begin) : NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
  Stub* next(Stub* s) const                      { int i = index_of(s) + stub_size(s);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
                                                   if (i == _buffer_limit) i = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
                                                   return (i == _queue_end) ? NULL : stub_at(i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
                                                 }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
  address stub_code_begin(Stub* s) const         { return _stub_interface->code_begin(s); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
  address stub_code_end(Stub* s) const           { return _stub_interface->code_end(s);   }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
  // Debugging/printing
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
  void  verify();                                // verifies the stub queue
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
  void  print();                                 // prints information about the stub queue
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
};
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   232
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   233
#endif // SHARE_VM_CODE_STUBS_HPP