icBuffer.hpp revision 1472:c18cbe5936b8
1230557Sjimharris/*
2230557Sjimharris * Copyright (c) 1997, 2003, Oracle and/or its affiliates. All rights reserved.
3230557Sjimharris * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4230557Sjimharris *
5230557Sjimharris * This code is free software; you can redistribute it and/or modify it
6230557Sjimharris * under the terms of the GNU General Public License version 2 only, as
7230557Sjimharris * published by the Free Software Foundation.
8230557Sjimharris *
9230557Sjimharris * This code is distributed in the hope that it will be useful, but WITHOUT
10230557Sjimharris * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11230557Sjimharris * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12230557Sjimharris * version 2 for more details (a copy is included in the LICENSE file that
13230557Sjimharris * accompanied this code).
14230557Sjimharris *
15230557Sjimharris * You should have received a copy of the GNU General Public License version
16230557Sjimharris * 2 along with this work; if not, write to the Free Software Foundation,
17230557Sjimharris * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18230557Sjimharris *
19230557Sjimharris * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20230557Sjimharris * or visit www.oracle.com if you need additional information or have any
21230557Sjimharris * questions.
22230557Sjimharris *
23230557Sjimharris */
24230557Sjimharris
25230557Sjimharris//
26230557Sjimharris// For CompiledIC's:
27230557Sjimharris//
28230557Sjimharris// In cases where we do not have MT-safe state transformation,
29230557Sjimharris// we go to a transition state, using ICStubs. At a safepoint,
30230557Sjimharris// the inline caches are transferred from the transitional code:
31230557Sjimharris//
32230557Sjimharris//    instruction_address --> 01 set xxx_oop, Ginline_cache_klass
33230557Sjimharris//                            23 jump_to Gtemp, yyyy
34230557Sjimharris//                            4  nop
35230557Sjimharris
36230557Sjimharrisclass ICStub: public Stub {
37230557Sjimharris private:
38230557Sjimharris  int                 _size;       // total size of the stub incl. code
39230557Sjimharris  address             _ic_site;    // points at call instruction of owning ic-buffer
40230557Sjimharris  /* stub code follows here */
41230557Sjimharris protected:
42230557Sjimharris  friend class ICStubInterface;
43230557Sjimharris  // This will be called only by ICStubInterface
44230557Sjimharris  void    initialize(int size) { _size = size; _ic_site = NULL; }
45230557Sjimharris  void    finalize(); // called when a method is removed
46230557Sjimharris
47230557Sjimharris  // General info
48230557Sjimharris  int     size() const                           { return _size; }
49230557Sjimharris  static  int code_size_to_size(int code_size)   { return round_to(sizeof(ICStub), CodeEntryAlignment) + code_size; }
50230557Sjimharris
51230557Sjimharris public:
52230557Sjimharris  // Creation
53230557Sjimharris  void set_stub(CompiledIC *ic, oop cached_value, address dest_addr);
54230557Sjimharris
55230557Sjimharris  // Code info
56230557Sjimharris  address code_begin() const                     { return (address)this + round_to(sizeof(ICStub), CodeEntryAlignment); }
57230557Sjimharris  address code_end() const                       { return (address)this + size(); }
58230557Sjimharris
59230557Sjimharris  // Call site info
60230557Sjimharris  address ic_site() const                        { return _ic_site; }
61230557Sjimharris  void    clear();
62230557Sjimharris  bool    is_empty() const                       { return _ic_site == NULL; }
63230557Sjimharris
64230557Sjimharris  // stub info
65230557Sjimharris  address destination() const;  // destination of jump instruction
66230557Sjimharris  oop     cached_oop() const;   // cached_oop for stub
67230557Sjimharris
68230557Sjimharris  // Debugging
69230557Sjimharris  void    verify()            PRODUCT_RETURN;
70230557Sjimharris  void    print()             PRODUCT_RETURN;
71230557Sjimharris
72230557Sjimharris  // Creation
73230557Sjimharris  friend ICStub* ICStub_from_destination_address(address destination_address);
74230557Sjimharris};
75230557Sjimharris
76230557Sjimharris// ICStub Creation
77230557Sjimharrisinline ICStub* ICStub_from_destination_address(address destination_address) {
78230557Sjimharris  ICStub* stub = (ICStub*) (destination_address - round_to(sizeof(ICStub), CodeEntryAlignment));
79230557Sjimharris  #ifdef ASSERT
80230557Sjimharris  stub->verify();
81230557Sjimharris  #endif
82230557Sjimharris  return stub;
83230557Sjimharris}
84230557Sjimharris
85230557Sjimharrisclass InlineCacheBuffer: public AllStatic {
86230557Sjimharris private:
87230557Sjimharris  // friends
88230557Sjimharris  friend class ICStub;
89230557Sjimharris
90230557Sjimharris  static int ic_stub_code_size();
91230557Sjimharris
92230557Sjimharris  static StubQueue* _buffer;
93230557Sjimharris  static ICStub*    _next_stub;
94230557Sjimharris
95230557Sjimharris  static StubQueue* buffer()                         { return _buffer;         }
96230557Sjimharris  static void       set_next_stub(ICStub* next_stub) { _next_stub = next_stub; }
97230557Sjimharris  static ICStub*    get_next_stub()                  { return _next_stub;      }
98230557Sjimharris
99230557Sjimharris  static void       init_next_stub();
100230557Sjimharris
101230557Sjimharris  static ICStub* new_ic_stub();
102230557Sjimharris
103230557Sjimharris
104230557Sjimharris  // Machine-dependent implementation of ICBuffer
105230557Sjimharris  static void    assemble_ic_buffer_code(address code_begin, oop cached_oop, address entry_point);
106230557Sjimharris  static address ic_buffer_entry_point  (address code_begin);
107230557Sjimharris  static oop     ic_buffer_cached_oop   (address code_begin);
108230557Sjimharris
109230557Sjimharris public:
110230557Sjimharris
111230557Sjimharris    // Initialization; must be called before first usage
112230557Sjimharris  static void initialize();
113230557Sjimharris
114230557Sjimharris  // Access
115230557Sjimharris  static bool contains(address instruction_address);
116230557Sjimharris
117230557Sjimharris    // removes the ICStubs after backpatching
118230557Sjimharris  static void update_inline_caches();
119230557Sjimharris
120230557Sjimharris  // for debugging
121230557Sjimharris  static bool is_empty();
122230557Sjimharris
123230557Sjimharris
124230557Sjimharris  // New interface
125230557Sjimharris  static void    create_transition_stub(CompiledIC *ic, oop cached_oop, address entry);
126230557Sjimharris  static address ic_destination_for(CompiledIC *ic);
127230557Sjimharris  static oop     cached_oop_for(CompiledIC *ic);
128230557Sjimharris};
129230557Sjimharris