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