bytecode.hpp revision 6760:22b98ab2a69f
1169689Skan/* 2169689Skan * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. 3169689Skan * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4169689Skan * 5169689Skan * This code is free software; you can redistribute it and/or modify it 6169689Skan * under the terms of the GNU General Public License version 2 only, as 7169689Skan * published by the Free Software Foundation. 8169689Skan * 9169689Skan * This code is distributed in the hope that it will be useful, but WITHOUT 10169689Skan * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11169689Skan * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12169689Skan * version 2 for more details (a copy is included in the LICENSE file that 13169689Skan * accompanied this code). 14169689Skan * 15169689Skan * You should have received a copy of the GNU General Public License version 16169689Skan * 2 along with this work; if not, write to the Free Software Foundation, 17169689Skan * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18169689Skan * 19169689Skan * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20169689Skan * or visit www.oracle.com if you need additional information or have any 21169689Skan * questions. 22169689Skan * 23169689Skan */ 24169689Skan 25169689Skan#ifndef SHARE_VM_INTERPRETER_BYTECODE_HPP 26169689Skan#define SHARE_VM_INTERPRETER_BYTECODE_HPP 27169689Skan 28169689Skan#include "interpreter/bytecodes.hpp" 29169689Skan#include "memory/allocation.hpp" 30169689Skan#include "oops/method.hpp" 31169689Skan#include "utilities/bytes.hpp" 32169689Skan 33169689Skanclass ciBytecodeStream; 34169689Skan 35169689Skan// The base class for different kinds of bytecode abstractions. 36169689Skan// Provides the primitive operations to manipulate code relative 37169689Skan// to the bcp. 38169689Skan 39169689Skanclass Bytecode: public StackObj { 40169689Skan protected: 41169689Skan const address _bcp; 42169689Skan const Bytecodes::Code _code; 43169689Skan 44169689Skan // Address computation 45169689Skan address addr_at (int offset) const { return (address)_bcp + offset; } 46169689Skan u_char byte_at(int offset) const { return *addr_at(offset); } 47169689Skan address aligned_addr_at (int offset) const { return (address)round_to((intptr_t)addr_at(offset), jintSize); } 48169689Skan int aligned_offset (int offset) const { return aligned_addr_at(offset) - addr_at(0); } 49169689Skan 50169689Skan // Word access: 51169689Skan int get_Java_u2_at (int offset) const { return Bytes::get_Java_u2(addr_at(offset)); } 52169689Skan int get_Java_u4_at (int offset) const { return Bytes::get_Java_u4(addr_at(offset)); } 53169689Skan int get_native_u2_at (int offset) const { return Bytes::get_native_u2(addr_at(offset)); } 54169689Skan int get_native_u4_at (int offset) const { return Bytes::get_native_u4(addr_at(offset)); } 55169689Skan 56169689Skan public: 57169689Skan Bytecode(Method* method, address bcp): _bcp(bcp), _code(Bytecodes::code_at(method, addr_at(0))) { 58169689Skan assert(method != NULL, "this form requires a valid Method*"); 59169689Skan } 60169689Skan // Defined in ciStreams.hpp 61169689Skan inline Bytecode(const ciBytecodeStream* stream, address bcp = NULL); 62169689Skan 63169689Skan // Attributes 64169689Skan address bcp() const { return _bcp; } 65169689Skan int instruction_size() const { return Bytecodes::length_for_code_at(_code, bcp()); } 66169689Skan 67169689Skan Bytecodes::Code code() const { return _code; } 68169689Skan Bytecodes::Code java_code() const { return Bytecodes::java_code(code()); } 69169689Skan Bytecodes::Code invoke_code() const { return (code() == Bytecodes::_invokehandle) ? code() : java_code(); } 70169689Skan 71169689Skan // Static functions for parsing bytecodes in place. 72169689Skan int get_index_u1(Bytecodes::Code bc) const { 73169689Skan assert_same_format_as(bc); assert_index_size(1, bc); 74169689Skan return *(jubyte*)addr_at(1); 75169689Skan } 76169689Skan int get_index_u2(Bytecodes::Code bc, bool is_wide = false) const { 77169689Skan assert_same_format_as(bc, is_wide); assert_index_size(2, bc, is_wide); 78169689Skan address p = addr_at(is_wide ? 2 : 1); 79169689Skan if (can_use_native_byte_order(bc, is_wide)) 80169689Skan return Bytes::get_native_u2(p); 81169689Skan else return Bytes::get_Java_u2(p); 82169689Skan } 83169689Skan int get_index_u1_cpcache(Bytecodes::Code bc) const { 84169689Skan assert_same_format_as(bc); assert_index_size(1, bc); 85169689Skan return *(jubyte*)addr_at(1) + ConstantPool::CPCACHE_INDEX_TAG; 86169689Skan } 87169689Skan int get_index_u2_cpcache(Bytecodes::Code bc) const { 88169689Skan assert_same_format_as(bc); assert_index_size(2, bc); assert_native_index(bc); 89169689Skan return Bytes::get_native_u2(addr_at(1)) + ConstantPool::CPCACHE_INDEX_TAG; 90169689Skan } 91169689Skan int get_index_u4(Bytecodes::Code bc) const { 92169689Skan assert_same_format_as(bc); assert_index_size(4, bc); 93169689Skan assert(can_use_native_byte_order(bc), ""); 94169689Skan return Bytes::get_native_u4(addr_at(1)); 95169689Skan } 96169689Skan bool has_index_u4(Bytecodes::Code bc) const { 97169689Skan return bc == Bytecodes::_invokedynamic; 98169689Skan } 99169689Skan 100169689Skan int get_offset_s2(Bytecodes::Code bc) const { 101169689Skan assert_same_format_as(bc); assert_offset_size(2, bc); 102169689Skan return (jshort) Bytes::get_Java_u2(addr_at(1)); 103169689Skan } 104169689Skan int get_offset_s4(Bytecodes::Code bc) const { 105169689Skan assert_same_format_as(bc); assert_offset_size(4, bc); 106169689Skan return (jint) Bytes::get_Java_u4(addr_at(1)); 107169689Skan } 108169689Skan 109169689Skan int get_constant_u1(int offset, Bytecodes::Code bc) const { 110169689Skan assert_same_format_as(bc); assert_constant_size(1, offset, bc); 111169689Skan return *(jbyte*)addr_at(offset); 112169689Skan } 113169689Skan int get_constant_u2(int offset, Bytecodes::Code bc, bool is_wide = false) const { 114169689Skan assert_same_format_as(bc, is_wide); assert_constant_size(2, offset, bc, is_wide); 115169689Skan return (jshort) Bytes::get_Java_u2(addr_at(offset)); 116169689Skan } 117169689Skan 118169689Skan // These are used locally and also from bytecode streams. 119169689Skan void assert_same_format_as(Bytecodes::Code testbc, bool is_wide = false) const NOT_DEBUG_RETURN; 120169689Skan static void assert_index_size(int required_size, Bytecodes::Code bc, bool is_wide = false) NOT_DEBUG_RETURN; 121169689Skan static void assert_offset_size(int required_size, Bytecodes::Code bc, bool is_wide = false) NOT_DEBUG_RETURN; 122169689Skan static void assert_constant_size(int required_size, int where, Bytecodes::Code bc, bool is_wide = false) NOT_DEBUG_RETURN; 123169689Skan static void assert_native_index(Bytecodes::Code bc, bool is_wide = false) NOT_DEBUG_RETURN; 124169689Skan static bool can_use_native_byte_order(Bytecodes::Code bc, bool is_wide = false) { 125169689Skan return (!Bytes::is_Java_byte_ordering_different() || Bytecodes::native_byte_order(bc /*, is_wide*/)); 126169689Skan } 127169689Skan}; 128169689Skan 129169689Skan 130169689Skan// Abstractions for lookupswitch bytecode 131169689Skanclass LookupswitchPair VALUE_OBJ_CLASS_SPEC { 132169689Skan private: 133169689Skan const address _bcp; 134169689Skan 135169689Skan address addr_at (int offset) const { return _bcp + offset; } 136169689Skan int get_Java_u4_at (int offset) const { return Bytes::get_Java_u4(addr_at(offset)); } 137169689Skan 138169689Skan public: 139169689Skan LookupswitchPair(address bcp): _bcp(bcp) {} 140169689Skan int match() const { return get_Java_u4_at(0 * jintSize); } 141169689Skan int offset() const { return get_Java_u4_at(1 * jintSize); } 142169689Skan}; 143169689Skan 144169689Skan 145169689Skanclass Bytecode_lookupswitch: public Bytecode { 146169689Skan public: 147169689Skan Bytecode_lookupswitch(Method* method, address bcp): Bytecode(method, bcp) { verify(); } 148169689Skan // Defined in ciStreams.hpp 149169689Skan inline Bytecode_lookupswitch(const ciBytecodeStream* stream); 150169689Skan void verify() const PRODUCT_RETURN; 151169689Skan 152169689Skan // Attributes 153169689Skan int default_offset() const { return get_Java_u4_at(aligned_offset(1 + 0*jintSize)); } 154169689Skan int number_of_pairs() const { return get_Java_u4_at(aligned_offset(1 + 1*jintSize)); } 155169689Skan LookupswitchPair pair_at(int i) const { 156169689Skan assert(0 <= i && i < number_of_pairs(), "pair index out of bounds"); 157169689Skan return LookupswitchPair(aligned_addr_at(1 + (1 + i)*2*jintSize)); 158169689Skan } 159169689Skan}; 160169689Skan 161169689Skanclass Bytecode_tableswitch: public Bytecode { 162169689Skan public: 163169689Skan Bytecode_tableswitch(Method* method, address bcp): Bytecode(method, bcp) { verify(); } 164169689Skan // Defined in ciStreams.hpp 165169689Skan inline Bytecode_tableswitch(const ciBytecodeStream* stream); 166169689Skan void verify() const PRODUCT_RETURN; 167169689Skan 168169689Skan // Attributes 169169689Skan int default_offset() const { return get_Java_u4_at(aligned_offset(1 + 0*jintSize)); } 170169689Skan int low_key() const { return get_Java_u4_at(aligned_offset(1 + 1*jintSize)); } 171169689Skan int high_key() const { return get_Java_u4_at(aligned_offset(1 + 2*jintSize)); } 172169689Skan int dest_offset_at(int i) const; 173169689Skan int length() { return high_key()-low_key()+1; } 174169689Skan}; 175169689Skan 176169689Skan// Common code for decoding invokes and field references. 177169689Skan 178169689Skanclass Bytecode_member_ref: public Bytecode { 179169689Skan protected: 180169689Skan const methodHandle _method; // method containing the bytecode 181169689Skan 182169689Skan Bytecode_member_ref(methodHandle method, int bci) : Bytecode(method(), method()->bcp_from(bci)), _method(method) {} 183169689Skan 184169689Skan methodHandle method() const { return _method; } 185169689Skan ConstantPool* constants() const { return _method->constants(); } 186169689Skan ConstantPoolCache* cpcache() const { return _method->constants()->cache(); } 187169689Skan ConstantPoolCacheEntry* cpcache_entry() const; 188169689Skan 189169689Skan public: 190169689Skan int index() const; // cache index (loaded from instruction) 191169689Skan int pool_index() const; // constant pool index 192169689Skan Symbol* klass() const; // returns the klass of the method or field 193169689Skan Symbol* name() const; // returns the name of the method or field 194169689Skan Symbol* signature() const; // returns the signature of the method or field 195169689Skan 196169689Skan BasicType result_type() const; // returns the result type of the getfield or invoke 197169689Skan}; 198169689Skan 199169689Skan// Abstraction for invoke_{virtual, static, interface, special} 200169689Skan 201169689Skanclass Bytecode_invoke: public Bytecode_member_ref { 202169689Skan protected: 203169689Skan // Constructor that skips verification 204169689Skan Bytecode_invoke(methodHandle method, int bci, bool unused) : Bytecode_member_ref(method, bci) {} 205169689Skan 206169689Skan public: 207169689Skan Bytecode_invoke(methodHandle method, int bci) : Bytecode_member_ref(method, bci) { verify(); } 208169689Skan void verify() const; 209169689Skan 210169689Skan // Attributes 211169689Skan methodHandle static_target(TRAPS); // "specified" method (from constant pool) 212169689Skan Handle appendix(TRAPS); // if CPCE::has_appendix (from constant pool) 213169689Skan 214169689Skan // Testers 215169689Skan bool is_invokeinterface() const { return invoke_code() == Bytecodes::_invokeinterface; } 216169689Skan bool is_invokevirtual() const { return invoke_code() == Bytecodes::_invokevirtual; } 217169689Skan bool is_invokestatic() const { return invoke_code() == Bytecodes::_invokestatic; } 218169689Skan bool is_invokespecial() const { return invoke_code() == Bytecodes::_invokespecial; } 219169689Skan bool is_invokedynamic() const { return invoke_code() == Bytecodes::_invokedynamic; } 220169689Skan bool is_invokehandle() const { return invoke_code() == Bytecodes::_invokehandle; } 221169689Skan 222169689Skan bool has_receiver() const { return !is_invokestatic() && !is_invokedynamic(); } 223169689Skan 224169689Skan bool is_valid() const { return is_invokeinterface() || 225169689Skan is_invokevirtual() || 226169689Skan is_invokestatic() || 227169689Skan is_invokespecial() || 228169689Skan is_invokedynamic() || 229169689Skan is_invokehandle(); } 230169689Skan 231169689Skan bool has_appendix() { return cpcache_entry()->has_appendix(); } 232169689Skan 233169689Skan private: 234169689Skan // Helper to skip verification. Used is_valid() to check if the result is really an invoke 235169689Skan inline friend Bytecode_invoke Bytecode_invoke_check(methodHandle method, int bci); 236169689Skan}; 237169689Skan 238169689Skaninline Bytecode_invoke Bytecode_invoke_check(methodHandle method, int bci) { 239169689Skan return Bytecode_invoke(method, bci, false); 240169689Skan} 241169689Skan 242169689Skan 243169689Skan// Abstraction for all field accesses (put/get field/static) 244169689Skanclass Bytecode_field: public Bytecode_member_ref { 245169689Skan public: 246169689Skan Bytecode_field(methodHandle method, int bci) : Bytecode_member_ref(method, bci) { verify(); } 247169689Skan 248169689Skan // Testers 249169689Skan bool is_getfield() const { return java_code() == Bytecodes::_getfield; } 250169689Skan bool is_putfield() const { return java_code() == Bytecodes::_putfield; } 251169689Skan bool is_getstatic() const { return java_code() == Bytecodes::_getstatic; } 252169689Skan bool is_putstatic() const { return java_code() == Bytecodes::_putstatic; } 253169689Skan 254169689Skan bool is_getter() const { return is_getfield() || is_getstatic(); } 255169689Skan bool is_static() const { return is_getstatic() || is_putstatic(); } 256169689Skan 257169689Skan bool is_valid() const { return is_getfield() || 258169689Skan is_putfield() || 259169689Skan is_getstatic() || 260169689Skan is_putstatic(); } 261169689Skan void verify() const; 262169689Skan}; 263169689Skan 264169689Skan// Abstraction for checkcast 265169689Skanclass Bytecode_checkcast: public Bytecode { 266169689Skan public: 267169689Skan Bytecode_checkcast(Method* method, address bcp): Bytecode(method, bcp) { verify(); } 268169689Skan void verify() const { assert(Bytecodes::java_code(code()) == Bytecodes::_checkcast, "check checkcast"); } 269169689Skan 270169689Skan // Returns index 271169689Skan long index() const { return get_index_u2(Bytecodes::_checkcast); }; 272169689Skan}; 273169689Skan 274169689Skan// Abstraction for instanceof 275169689Skanclass Bytecode_instanceof: public Bytecode { 276169689Skan public: 277169689Skan Bytecode_instanceof(Method* method, address bcp): Bytecode(method, bcp) { verify(); } 278169689Skan void verify() const { assert(code() == Bytecodes::_instanceof, "check instanceof"); } 279169689Skan 280169689Skan // Returns index 281169689Skan long index() const { return get_index_u2(Bytecodes::_instanceof); }; 282169689Skan}; 283169689Skan 284169689Skanclass Bytecode_new: public Bytecode { 285169689Skan public: 286169689Skan Bytecode_new(Method* method, address bcp): Bytecode(method, bcp) { verify(); } 287169689Skan void verify() const { assert(java_code() == Bytecodes::_new, "check new"); } 288169689Skan 289169689Skan // Returns index 290169689Skan long index() const { return get_index_u2(Bytecodes::_new); }; 291169689Skan}; 292169689Skan 293169689Skanclass Bytecode_multianewarray: public Bytecode { 294169689Skan public: 295169689Skan Bytecode_multianewarray(Method* method, address bcp): Bytecode(method, bcp) { verify(); } 296169689Skan void verify() const { assert(java_code() == Bytecodes::_multianewarray, "check new"); } 297169689Skan 298169689Skan // Returns index 299169689Skan long index() const { return get_index_u2(Bytecodes::_multianewarray); }; 300169689Skan}; 301169689Skan 302169689Skanclass Bytecode_anewarray: public Bytecode { 303169689Skan public: 304169689Skan Bytecode_anewarray(Method* method, address bcp): Bytecode(method, bcp) { verify(); } 305169689Skan void verify() const { assert(java_code() == Bytecodes::_anewarray, "check anewarray"); } 306169689Skan 307169689Skan // Returns index 308169689Skan long index() const { return get_index_u2(Bytecodes::_anewarray); }; 309169689Skan}; 310169689Skan 311169689Skan// Abstraction for ldc, ldc_w and ldc2_w 312169689Skanclass Bytecode_loadconstant: public Bytecode { 313169689Skan private: 314169689Skan const methodHandle _method; 315169689Skan 316169689Skan int raw_index() const; 317169689Skan 318169689Skan public: 319169689Skan Bytecode_loadconstant(methodHandle method, int bci): Bytecode(method(), method->bcp_from(bci)), _method(method) { verify(); } 320169689Skan 321169689Skan void verify() const { 322169689Skan assert(_method.not_null(), "must supply method"); 323169689Skan Bytecodes::Code stdc = Bytecodes::java_code(code()); 324169689Skan assert(stdc == Bytecodes::_ldc || 325169689Skan stdc == Bytecodes::_ldc_w || 326169689Skan stdc == Bytecodes::_ldc2_w, "load constant"); 327169689Skan } 328169689Skan 329169689Skan // Only non-standard bytecodes (fast_aldc) have reference cache indexes. 330169689Skan bool has_cache_index() const { return code() >= Bytecodes::number_of_java_codes; } 331169689Skan 332169689Skan int pool_index() const; // index into constant pool 333169689Skan int cache_index() const { // index into reference cache (or -1 if none) 334169689Skan return has_cache_index() ? raw_index() : -1; 335169689Skan } 336169689Skan 337169689Skan BasicType result_type() const; // returns the result type of the ldc 338169689Skan 339169689Skan oop resolve_constant(TRAPS) const; 340169689Skan}; 341169689Skan 342169689Skan#endif // SHARE_VM_INTERPRETER_BYTECODE_HPP 343169689Skan