icBuffer.hpp revision 1472:c18cbe5936b8
1/*
2 * Copyright (c) 1997, 2003, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25//
26// For CompiledIC's:
27//
28// In cases where we do not have MT-safe state transformation,
29// we go to a transition state, using ICStubs. At a safepoint,
30// the inline caches are transferred from the transitional code:
31//
32//    instruction_address --> 01 set xxx_oop, Ginline_cache_klass
33//                            23 jump_to Gtemp, yyyy
34//                            4  nop
35
36class ICStub: public Stub {
37 private:
38  int                 _size;       // total size of the stub incl. code
39  address             _ic_site;    // points at call instruction of owning ic-buffer
40  /* stub code follows here */
41 protected:
42  friend class ICStubInterface;
43  // This will be called only by ICStubInterface
44  void    initialize(int size) { _size = size; _ic_site = NULL; }
45  void    finalize(); // called when a method is removed
46
47  // General info
48  int     size() const                           { return _size; }
49  static  int code_size_to_size(int code_size)   { return round_to(sizeof(ICStub), CodeEntryAlignment) + code_size; }
50
51 public:
52  // Creation
53  void set_stub(CompiledIC *ic, oop cached_value, address dest_addr);
54
55  // Code info
56  address code_begin() const                     { return (address)this + round_to(sizeof(ICStub), CodeEntryAlignment); }
57  address code_end() const                       { return (address)this + size(); }
58
59  // Call site info
60  address ic_site() const                        { return _ic_site; }
61  void    clear();
62  bool    is_empty() const                       { return _ic_site == NULL; }
63
64  // stub info
65  address destination() const;  // destination of jump instruction
66  oop     cached_oop() const;   // cached_oop for stub
67
68  // Debugging
69  void    verify()            PRODUCT_RETURN;
70  void    print()             PRODUCT_RETURN;
71
72  // Creation
73  friend ICStub* ICStub_from_destination_address(address destination_address);
74};
75
76// ICStub Creation
77inline ICStub* ICStub_from_destination_address(address destination_address) {
78  ICStub* stub = (ICStub*) (destination_address - round_to(sizeof(ICStub), CodeEntryAlignment));
79  #ifdef ASSERT
80  stub->verify();
81  #endif
82  return stub;
83}
84
85class InlineCacheBuffer: public AllStatic {
86 private:
87  // friends
88  friend class ICStub;
89
90  static int ic_stub_code_size();
91
92  static StubQueue* _buffer;
93  static ICStub*    _next_stub;
94
95  static StubQueue* buffer()                         { return _buffer;         }
96  static void       set_next_stub(ICStub* next_stub) { _next_stub = next_stub; }
97  static ICStub*    get_next_stub()                  { return _next_stub;      }
98
99  static void       init_next_stub();
100
101  static ICStub* new_ic_stub();
102
103
104  // Machine-dependent implementation of ICBuffer
105  static void    assemble_ic_buffer_code(address code_begin, oop cached_oop, address entry_point);
106  static address ic_buffer_entry_point  (address code_begin);
107  static oop     ic_buffer_cached_oop   (address code_begin);
108
109 public:
110
111    // Initialization; must be called before first usage
112  static void initialize();
113
114  // Access
115  static bool contains(address instruction_address);
116
117    // removes the ICStubs after backpatching
118  static void update_inline_caches();
119
120  // for debugging
121  static bool is_empty();
122
123
124  // New interface
125  static void    create_transition_stub(CompiledIC *ic, oop cached_oop, address entry);
126  static address ic_destination_for(CompiledIC *ic);
127  static oop     cached_oop_for(CompiledIC *ic);
128};
129