1 /*
   2  * Copyright (c) 1997, 2016, 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 #ifndef SHARE_VM_INTERPRETER_BYTECODES_HPP
  26 #define SHARE_VM_INTERPRETER_BYTECODES_HPP
  27 
  28 #include "memory/allocation.hpp"
  29 
  30 // Bytecodes specifies all bytecodes used in the VM and
  31 // provides utility functions to get bytecode attributes.
  32 
  33 class Method;
  34 
  35 // NOTE: replicated in SA in vm/agent/sun/jvm/hotspot/interpreter/Bytecodes.java
  36 class Bytecodes: AllStatic {
  37  public:
  38   enum Code {
  39     _illegal              =  -1,
  40 
  41     // Java bytecodes
  42     _nop                  =   0, // 0x00
  43     _aconst_null          =   1, // 0x01
  44     _iconst_m1            =   2, // 0x02
  45     _iconst_0             =   3, // 0x03
  46     _iconst_1             =   4, // 0x04
  47     _iconst_2             =   5, // 0x05
  48     _iconst_3             =   6, // 0x06
  49     _iconst_4             =   7, // 0x07
  50     _iconst_5             =   8, // 0x08
  51     _lconst_0             =   9, // 0x09
  52     _lconst_1             =  10, // 0x0a
  53     _fconst_0             =  11, // 0x0b
  54     _fconst_1             =  12, // 0x0c
  55     _fconst_2             =  13, // 0x0d
  56     _dconst_0             =  14, // 0x0e
  57     _dconst_1             =  15, // 0x0f
  58     _bipush               =  16, // 0x10
  59     _sipush               =  17, // 0x11
  60     _ldc                  =  18, // 0x12
  61     _ldc_w                =  19, // 0x13
  62     _ldc2_w               =  20, // 0x14
  63     _iload                =  21, // 0x15
  64     _lload                =  22, // 0x16
  65     _fload                =  23, // 0x17
  66     _dload                =  24, // 0x18
  67     _aload                =  25, // 0x19
  68     _iload_0              =  26, // 0x1a
  69     _iload_1              =  27, // 0x1b
  70     _iload_2              =  28, // 0x1c
  71     _iload_3              =  29, // 0x1d
  72     _lload_0              =  30, // 0x1e
  73     _lload_1              =  31, // 0x1f
  74     _lload_2              =  32, // 0x20
  75     _lload_3              =  33, // 0x21
  76     _fload_0              =  34, // 0x22
  77     _fload_1              =  35, // 0x23
  78     _fload_2              =  36, // 0x24
  79     _fload_3              =  37, // 0x25
  80     _dload_0              =  38, // 0x26
  81     _dload_1              =  39, // 0x27
  82     _dload_2              =  40, // 0x28
  83     _dload_3              =  41, // 0x29
  84     _aload_0              =  42, // 0x2a
  85     _aload_1              =  43, // 0x2b
  86     _aload_2              =  44, // 0x2c
  87     _aload_3              =  45, // 0x2d
  88     _iaload               =  46, // 0x2e
  89     _laload               =  47, // 0x2f
  90     _faload               =  48, // 0x30
  91     _daload               =  49, // 0x31
  92     _aaload               =  50, // 0x32
  93     _baload               =  51, // 0x33
  94     _caload               =  52, // 0x34
  95     _saload               =  53, // 0x35
  96     _istore               =  54, // 0x36
  97     _lstore               =  55, // 0x37
  98     _fstore               =  56, // 0x38
  99     _dstore               =  57, // 0x39
 100     _astore               =  58, // 0x3a
 101     _istore_0             =  59, // 0x3b
 102     _istore_1             =  60, // 0x3c
 103     _istore_2             =  61, // 0x3d
 104     _istore_3             =  62, // 0x3e
 105     _lstore_0             =  63, // 0x3f
 106     _lstore_1             =  64, // 0x40
 107     _lstore_2             =  65, // 0x41
 108     _lstore_3             =  66, // 0x42
 109     _fstore_0             =  67, // 0x43
 110     _fstore_1             =  68, // 0x44
 111     _fstore_2             =  69, // 0x45
 112     _fstore_3             =  70, // 0x46
 113     _dstore_0             =  71, // 0x47
 114     _dstore_1             =  72, // 0x48
 115     _dstore_2             =  73, // 0x49
 116     _dstore_3             =  74, // 0x4a
 117     _astore_0             =  75, // 0x4b
 118     _astore_1             =  76, // 0x4c
 119     _astore_2             =  77, // 0x4d
 120     _astore_3             =  78, // 0x4e
 121     _iastore              =  79, // 0x4f
 122     _lastore              =  80, // 0x50
 123     _fastore              =  81, // 0x51
 124     _dastore              =  82, // 0x52
 125     _aastore              =  83, // 0x53
 126     _bastore              =  84, // 0x54
 127     _castore              =  85, // 0x55
 128     _sastore              =  86, // 0x56
 129     _pop                  =  87, // 0x57
 130     _pop2                 =  88, // 0x58
 131     _dup                  =  89, // 0x59
 132     _dup_x1               =  90, // 0x5a
 133     _dup_x2               =  91, // 0x5b
 134     _dup2                 =  92, // 0x5c
 135     _dup2_x1              =  93, // 0x5d
 136     _dup2_x2              =  94, // 0x5e
 137     _swap                 =  95, // 0x5f
 138     _iadd                 =  96, // 0x60
 139     _ladd                 =  97, // 0x61
 140     _fadd                 =  98, // 0x62
 141     _dadd                 =  99, // 0x63
 142     _isub                 = 100, // 0x64
 143     _lsub                 = 101, // 0x65
 144     _fsub                 = 102, // 0x66
 145     _dsub                 = 103, // 0x67
 146     _imul                 = 104, // 0x68
 147     _lmul                 = 105, // 0x69
 148     _fmul                 = 106, // 0x6a
 149     _dmul                 = 107, // 0x6b
 150     _idiv                 = 108, // 0x6c
 151     _ldiv                 = 109, // 0x6d
 152     _fdiv                 = 110, // 0x6e
 153     _ddiv                 = 111, // 0x6f
 154     _irem                 = 112, // 0x70
 155     _lrem                 = 113, // 0x71
 156     _frem                 = 114, // 0x72
 157     _drem                 = 115, // 0x73
 158     _ineg                 = 116, // 0x74
 159     _lneg                 = 117, // 0x75
 160     _fneg                 = 118, // 0x76
 161     _dneg                 = 119, // 0x77
 162     _ishl                 = 120, // 0x78
 163     _lshl                 = 121, // 0x79
 164     _ishr                 = 122, // 0x7a
 165     _lshr                 = 123, // 0x7b
 166     _iushr                = 124, // 0x7c
 167     _lushr                = 125, // 0x7d
 168     _iand                 = 126, // 0x7e
 169     _land                 = 127, // 0x7f
 170     _ior                  = 128, // 0x80
 171     _lor                  = 129, // 0x81
 172     _ixor                 = 130, // 0x82
 173     _lxor                 = 131, // 0x83
 174     _iinc                 = 132, // 0x84
 175     _i2l                  = 133, // 0x85
 176     _i2f                  = 134, // 0x86
 177     _i2d                  = 135, // 0x87
 178     _l2i                  = 136, // 0x88
 179     _l2f                  = 137, // 0x89
 180     _l2d                  = 138, // 0x8a
 181     _f2i                  = 139, // 0x8b
 182     _f2l                  = 140, // 0x8c
 183     _f2d                  = 141, // 0x8d
 184     _d2i                  = 142, // 0x8e
 185     _d2l                  = 143, // 0x8f
 186     _d2f                  = 144, // 0x90
 187     _i2b                  = 145, // 0x91
 188     _i2c                  = 146, // 0x92
 189     _i2s                  = 147, // 0x93
 190     _lcmp                 = 148, // 0x94
 191     _fcmpl                = 149, // 0x95
 192     _fcmpg                = 150, // 0x96
 193     _dcmpl                = 151, // 0x97
 194     _dcmpg                = 152, // 0x98
 195     _ifeq                 = 153, // 0x99
 196     _ifne                 = 154, // 0x9a
 197     _iflt                 = 155, // 0x9b
 198     _ifge                 = 156, // 0x9c
 199     _ifgt                 = 157, // 0x9d
 200     _ifle                 = 158, // 0x9e
 201     _if_icmpeq            = 159, // 0x9f
 202     _if_icmpne            = 160, // 0xa0
 203     _if_icmplt            = 161, // 0xa1
 204     _if_icmpge            = 162, // 0xa2
 205     _if_icmpgt            = 163, // 0xa3
 206     _if_icmple            = 164, // 0xa4
 207     _if_acmpeq            = 165, // 0xa5
 208     _if_acmpne            = 166, // 0xa6
 209     _goto                 = 167, // 0xa7
 210     _jsr                  = 168, // 0xa8
 211     _ret                  = 169, // 0xa9
 212     _tableswitch          = 170, // 0xaa
 213     _lookupswitch         = 171, // 0xab
 214     _ireturn              = 172, // 0xac
 215     _lreturn              = 173, // 0xad
 216     _freturn              = 174, // 0xae
 217     _dreturn              = 175, // 0xaf
 218     _areturn              = 176, // 0xb0
 219     _return               = 177, // 0xb1
 220     _getstatic            = 178, // 0xb2
 221     _putstatic            = 179, // 0xb3
 222     _getfield             = 180, // 0xb4
 223     _putfield             = 181, // 0xb5
 224     _invokevirtual        = 182, // 0xb6
 225     _invokespecial        = 183, // 0xb7
 226     _invokestatic         = 184, // 0xb8
 227     _invokeinterface      = 185, // 0xb9
 228     _invokedynamic        = 186, // 0xba
 229     _new                  = 187, // 0xbb
 230     _newarray             = 188, // 0xbc
 231     _anewarray            = 189, // 0xbd
 232     _arraylength          = 190, // 0xbe
 233     _athrow               = 191, // 0xbf
 234     _checkcast            = 192, // 0xc0
 235     _instanceof           = 193, // 0xc1
 236     _monitorenter         = 194, // 0xc2
 237     _monitorexit          = 195, // 0xc3
 238     _wide                 = 196, // 0xc4
 239     _multianewarray       = 197, // 0xc5
 240     _ifnull               = 198, // 0xc6
 241     _ifnonnull            = 199, // 0xc7
 242     _goto_w               = 200, // 0xc8
 243     _jsr_w                = 201, // 0xc9
 244     _breakpoint           = 202, // 0xca
 245 
 246     // value-type bytecodes
 247     _vload                = 203, // 0xcb
 248     _vstore               = 204, // 0xcc
 249     _vaload               = 205, // 0xcd
 250     _vastore              = 206, // 0xce
 251     _vreturn              = 207, // 0xcf
 252     _vdefault             = 208, // 0xd0
 253     _vwithfield           = 209, // 0xd1
 254     _vbox                 = 210, // 0xd2
 255     _vunbox               = 211, // 0xd3
 256 
 257     number_of_java_codes,
 258 
 259     // JVM bytecodes
 260     _fast_agetfield       = number_of_java_codes,
 261     _fast_qgetfield       ,
 262     _fast_bgetfield       ,
 263     _fast_cgetfield       ,
 264     _fast_dgetfield       ,
 265     _fast_fgetfield       ,
 266     _fast_igetfield       ,
 267     _fast_lgetfield       ,
 268     _fast_sgetfield       ,
 269 
 270     _fast_aputfield       ,
 271     _fast_qputfield       ,
 272     _fast_bputfield       ,
 273     _fast_zputfield       ,
 274     _fast_cputfield       ,
 275     _fast_dputfield       ,
 276     _fast_fputfield       ,
 277     _fast_iputfield       ,
 278     _fast_lputfield       ,
 279     _fast_sputfield       ,
 280 
 281     _fast_aload_0         ,
 282     _fast_iaccess_0       ,
 283     _fast_aaccess_0       ,
 284     _fast_faccess_0       ,
 285 
 286     _fast_iload           ,
 287     _fast_iload2          ,
 288     _fast_icaload         ,
 289 
 290     _fast_invokevfinal    ,
 291     _fast_linearswitch    ,
 292     _fast_binaryswitch    ,
 293 
 294     // special handling of oop constants:
 295     _fast_aldc            ,
 296     _fast_aldc_w          ,
 297 
 298     _return_register_finalizer    ,
 299 
 300     // special handling of signature-polymorphic methods:
 301     _invokehandle         ,
 302 
 303     // These bytecodes are rewritten at CDS dump time, so that we can prevent them from being
 304     // rewritten at run time. This way, the ConstMethods can be placed in the CDS ReadOnly
 305     // section, and RewriteByteCodes/RewriteFrequentPairs can rewrite non-CDS bytecodes
 306     // at run time.
 307     //
 308     // Rewritten at CDS dump time to | Original bytecode
 309     // _invoke_virtual rewritten on sparc, will be disabled if UseSharedSpaces turned on.
 310     // ------------------------------+------------------
 311     _nofast_getfield      ,          //  <- _getfield
 312     _nofast_putfield      ,          //  <- _putfield
 313     _nofast_aload_0       ,          //  <- _aload_0
 314     _nofast_iload         ,          //  <- _iload
 315 
 316     // Value type support
 317 
 318     _vgetfield            ,          //  <- _getfield
 319 
 320     _shouldnotreachhere   ,          // For debugging
 321 
 322 
 323     number_of_codes
 324   };
 325 
 326   // Flag bits derived from format strings, can_trap, can_rewrite, etc.:
 327   enum Flags {
 328     // semantic flags:
 329     _bc_can_trap      = 1<<0,     // bytecode execution can trap or block
 330     _bc_can_rewrite   = 1<<1,     // bytecode execution has an alternate form
 331 
 332     // format bits (determined only by the format string):
 333     _fmt_has_c        = 1<<2,     // constant, such as sipush "bcc"
 334     _fmt_has_j        = 1<<3,     // constant pool cache index, such as getfield "bjj"
 335     _fmt_has_k        = 1<<4,     // constant pool index, such as ldc "bk"
 336     _fmt_has_i        = 1<<5,     // local index, such as iload
 337     _fmt_has_o        = 1<<6,     // offset, such as ifeq
 338     _fmt_has_nbo      = 1<<7,     // contains native-order field(s)
 339     _fmt_has_u2       = 1<<8,     // contains double-byte field(s)
 340     _fmt_has_u4       = 1<<9,     // contains quad-byte field
 341     _fmt_not_variable = 1<<10,    // not of variable length (simple or wide)
 342     _fmt_not_simple   = 1<<11,    // either wide or variable length
 343     _all_fmt_bits     = (_fmt_not_simple*2 - _fmt_has_c),
 344 
 345     // Example derived format syndromes:
 346     _fmt_b      = _fmt_not_variable,
 347     _fmt_bc     = _fmt_b | _fmt_has_c,
 348     _fmt_bi     = _fmt_b | _fmt_has_i,
 349     _fmt_bkk    = _fmt_b | _fmt_has_k | _fmt_has_u2,
 350     _fmt_bJJ    = _fmt_b | _fmt_has_j | _fmt_has_u2 | _fmt_has_nbo,
 351     _fmt_bo2    = _fmt_b | _fmt_has_o | _fmt_has_u2,
 352     _fmt_bo4    = _fmt_b | _fmt_has_o | _fmt_has_u4
 353   };
 354 
 355  private:
 356   static bool        _is_initialized;
 357   static const char* _name          [number_of_codes];
 358   static BasicType   _result_type   [number_of_codes];
 359   static s_char      _depth         [number_of_codes];
 360   static u_char      _lengths       [number_of_codes];
 361   static Code        _java_code     [number_of_codes];
 362   static jchar       _flags         [(1<<BitsPerByte)*2]; // all second page for wide formats
 363 
 364   static void        def(Code code, const char* name, const char* format, const char* wide_format, BasicType result_type, int depth, bool can_trap);
 365   static void        def(Code code, const char* name, const char* format, const char* wide_format, BasicType result_type, int depth, bool can_trap, Code java_code);
 366 
 367   // Verify that bcp points into method
 368 #ifdef ASSERT
 369   static bool        check_method(const Method* method, address bcp);
 370 #endif
 371   static bool check_must_rewrite(Bytecodes::Code bc);
 372 
 373  public:
 374   // Conversion
 375   static void        check          (Code code)    { assert(is_defined(code),      "illegal code: %d", (int)code); }
 376   static void        wide_check     (Code code)    { assert(wide_is_defined(code), "illegal code: %d", (int)code); }
 377   static Code        cast           (int  code)    { return (Code)code; }
 378 
 379 
 380   // Fetch a bytecode, hiding breakpoints as necessary.  The method
 381   // argument is used for conversion of breakpoints into the original
 382   // bytecode.  The CI uses these methods but guarantees that
 383   // breakpoints are hidden so the method argument should be passed as
 384   // NULL since in that case the bcp and Method* are unrelated
 385   // memory.
 386   static Code       code_at(const Method* method, address bcp) {
 387     assert(method == NULL || check_method(method, bcp), "bcp must point into method");
 388     Code code = cast(*bcp);
 389     assert(code != _breakpoint || method != NULL, "need Method* to decode breakpoint");
 390     return (code != _breakpoint) ? code : non_breakpoint_code_at(method, bcp);
 391   }
 392   static Code       java_code_at(const Method* method, address bcp) {
 393     return java_code(code_at(method, bcp));
 394   }
 395 
 396   // Fetch a bytecode or a breakpoint:
 397   static Code       code_or_bp_at(address bcp)    { return (Code)cast(*bcp); }
 398 
 399   static Code       code_at(Method* method, int bci);
 400   static bool       is_active_breakpoint_at(address bcp) { return (Code)*bcp == _breakpoint; }
 401 
 402   // find a bytecode, behind a breakpoint if necessary:
 403   static Code       non_breakpoint_code_at(const Method* method, address bcp);
 404 
 405   // Bytecode attributes
 406   static bool        is_valid       (int  code)    { return 0 <= code && code < number_of_codes; }
 407   static bool        is_defined     (int  code)    { return is_valid(code) && flags(code, false) != 0; }
 408   static bool        wide_is_defined(int  code)    { return is_defined(code) && flags(code, true) != 0; }
 409   static const char* name           (Code code)    { check(code);      return _name          [code]; }
 410   static BasicType   result_type    (Code code)    { check(code);      return _result_type   [code]; }
 411   static int         depth          (Code code)    { check(code);      return _depth         [code]; }
 412   // Note: Length functions must return <=0 for invalid bytecodes.
 413   // Calling check(code) in length functions would throw an unwanted assert.
 414   static int         length_for     (Code code)    { return is_valid(code) ? _lengths[code] & 0xF : -1; }
 415   static int         wide_length_for(Code code)    { return is_valid(code) ? _lengths[code]  >> 4 : -1; }
 416   static bool        can_trap       (Code code)    { check(code);      return has_all_flags(code, _bc_can_trap, false); }
 417   static Code        java_code      (Code code)    { check(code);      return _java_code     [code]; }
 418   static bool        can_rewrite    (Code code)    { check(code);      return has_all_flags(code, _bc_can_rewrite, false); }
 419   static bool        must_rewrite(Bytecodes::Code code) { return can_rewrite(code) && check_must_rewrite(code); }
 420   static bool        native_byte_order(Code code)  { check(code);      return has_all_flags(code, _fmt_has_nbo, false); }
 421   static bool        uses_cp_cache  (Code code)    { check(code);      return has_all_flags(code, _fmt_has_j, false); }
 422   // if 'end' is provided, it indicates the end of the code buffer which
 423   // should not be read past when parsing.
 424   static int         special_length_at(Bytecodes::Code code, address bcp, address end = NULL);
 425   static int         special_length_at(Method* method, address bcp, address end = NULL) { return special_length_at(code_at(method, bcp), bcp, end); }
 426   static int         raw_special_length_at(address bcp, address end = NULL);
 427   static int         length_for_code_at(Bytecodes::Code code, address bcp)  { int l = length_for(code); return l > 0 ? l : special_length_at(code, bcp); }
 428   static int         length_at      (Method* method, address bcp)  { return length_for_code_at(code_at(method, bcp), bcp); }
 429   static int         java_length_at (Method* method, address bcp)  { return length_for_code_at(java_code_at(method, bcp), bcp); }
 430   static bool        is_java_code   (Code code)    { return 0 <= code && code < number_of_java_codes; }
 431 
 432   static bool        is_aload       (Code code)    { return (code == _aload  || code == _aload_0  || code == _aload_1
 433                                                                              || code == _aload_2  || code == _aload_3); }
 434   static bool        is_astore      (Code code)    { return (code == _astore || code == _astore_0 || code == _astore_1
 435                                                                              || code == _astore_2 || code == _astore_3); }
 436 
 437   static bool        is_store_into_local(Code code){ return (_istore <= code && code <= _astore_3); }
 438   static bool        is_const       (Code code)    { return (_aconst_null <= code && code <= _ldc2_w); }
 439   static bool        is_zero_const  (Code code)    { return (code == _aconst_null || code == _iconst_0
 440                                                            || code == _fconst_0 || code == _dconst_0); }
 441   static bool        is_return      (Code code)    { return (_ireturn <= code && code <= _return); }
 442   static bool        is_invoke      (Code code)    { return (_invokevirtual <= code && code <= _invokedynamic); }
 443   static bool        has_receiver   (Code code)    { assert(is_invoke(code), "");  return code == _invokevirtual ||
 444                                                                                           code == _invokespecial ||
 445                                                                                           code == _invokeinterface; }
 446   static bool        has_optional_appendix(Code code) { return code == _invokedynamic || code == _invokehandle; }
 447 
 448   static int         compute_flags  (const char* format, int more_flags = 0);  // compute the flags
 449   static int         flags          (int code, bool is_wide) {
 450     assert(code == (u_char)code, "must be a byte");
 451     return _flags[code + (is_wide ? (1<<BitsPerByte) : 0)];
 452   }
 453   static int         format_bits    (Code code, bool is_wide) { return flags(code, is_wide) & _all_fmt_bits; }
 454   static bool        has_all_flags  (Code code, int test_flags, bool is_wide) {
 455     return (flags(code, is_wide) & test_flags) == test_flags;
 456   }
 457 
 458   // Initialization
 459   static void        initialize     ();
 460 };
 461 
 462 #endif // SHARE_VM_INTERPRETER_BYTECODES_HPP