1 /*
   2  * Copyright (c) 1997, 2010, 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 #include "incls/_precompiled.incl"
  26 #include "incls/_bytecode.cpp.incl"
  27 
  28 // Implementation of Bytecode
  29 
  30 bool Bytecode::check_must_rewrite(Bytecodes::Code code) const {
  31   assert(Bytecodes::can_rewrite(code), "post-check only");
  32 
  33   // Some codes are conditionally rewriting.  Look closely at them.
  34   switch (code) {
  35   case Bytecodes::_aload_0:
  36     // Even if RewriteFrequentPairs is turned on,
  37     // the _aload_0 code might delay its rewrite until
  38     // a following _getfield rewrites itself.
  39     return false;
  40 
  41   case Bytecodes::_lookupswitch:
  42     return false;  // the rewrite is not done by the interpreter
  43 
  44   case Bytecodes::_new:
  45     // (Could actually look at the class here, but the profit would be small.)
  46     return false;  // the rewrite is not always done
  47   }
  48 
  49   // No other special cases.
  50   return true;
  51 }
  52 
  53 
  54 #ifdef ASSERT
  55 
  56 void Bytecode::assert_same_format_as(Bytecodes::Code testbc, bool is_wide) const {
  57   Bytecodes::Code thisbc = Bytecodes::cast(byte_at(0));
  58   if (thisbc == Bytecodes::_breakpoint)  return;  // let the assertion fail silently
  59   if (is_wide) {
  60     assert(thisbc == Bytecodes::_wide, "expected a wide instruction");
  61     thisbc = Bytecodes::cast(byte_at(1));
  62     if (thisbc == Bytecodes::_breakpoint)  return;
  63   }
  64   int thisflags = Bytecodes::flags(testbc, is_wide) & Bytecodes::_all_fmt_bits;
  65   int testflags = Bytecodes::flags(thisbc, is_wide) & Bytecodes::_all_fmt_bits;
  66   if (thisflags != testflags)
  67     tty->print_cr("assert_same_format_as(%d) failed on bc=%d%s; %d != %d",
  68                   (int)testbc, (int)thisbc, (is_wide?"/wide":""), testflags, thisflags);
  69   assert(thisflags == testflags, "expected format");
  70 }
  71 
  72 void Bytecode::assert_index_size(int size, Bytecodes::Code bc, bool is_wide) {
  73   int have_fmt = (Bytecodes::flags(bc, is_wide)
  74                   & (Bytecodes::_fmt_has_u2 | Bytecodes::_fmt_has_u4 |
  75                      Bytecodes::_fmt_not_simple |
  76                      // Not an offset field:
  77                      Bytecodes::_fmt_has_o));
  78   int need_fmt = -1;
  79   switch (size) {
  80   case 1: need_fmt = 0;                      break;
  81   case 2: need_fmt = Bytecodes::_fmt_has_u2; break;
  82   case 4: need_fmt = Bytecodes::_fmt_has_u4; break;
  83   }
  84   if (is_wide)  need_fmt |= Bytecodes::_fmt_not_simple;
  85   if (have_fmt != need_fmt) {
  86     tty->print_cr("assert_index_size %d: bc=%d%s %d != %d", size, bc, (is_wide?"/wide":""), have_fmt, need_fmt);
  87     assert(have_fmt == need_fmt, "assert_index_size");
  88   }
  89 }
  90 
  91 void Bytecode::assert_offset_size(int size, Bytecodes::Code bc, bool is_wide) {
  92   int have_fmt = Bytecodes::flags(bc, is_wide) & Bytecodes::_all_fmt_bits;
  93   int need_fmt = -1;
  94   switch (size) {
  95   case 2: need_fmt = Bytecodes::_fmt_bo2; break;
  96   case 4: need_fmt = Bytecodes::_fmt_bo4; break;
  97   }
  98   if (is_wide)  need_fmt |= Bytecodes::_fmt_not_simple;
  99   if (have_fmt != need_fmt) {
 100     tty->print_cr("assert_offset_size %d: bc=%d%s %d != %d", size, bc, (is_wide?"/wide":""), have_fmt, need_fmt);
 101     assert(have_fmt == need_fmt, "assert_offset_size");
 102   }
 103 }
 104 
 105 void Bytecode::assert_constant_size(int size, int where, Bytecodes::Code bc, bool is_wide) {
 106   int have_fmt = Bytecodes::flags(bc, is_wide) & (Bytecodes::_all_fmt_bits
 107                                                   // Ignore any 'i' field (for iinc):
 108                                                   & ~Bytecodes::_fmt_has_i);
 109   int need_fmt = -1;
 110   switch (size) {
 111   case 1: need_fmt = Bytecodes::_fmt_bc;                          break;
 112   case 2: need_fmt = Bytecodes::_fmt_bc | Bytecodes::_fmt_has_u2; break;
 113   }
 114   if (is_wide)  need_fmt |= Bytecodes::_fmt_not_simple;
 115   int length = is_wide ? Bytecodes::wide_length_for(bc) : Bytecodes::length_for(bc);
 116   if (have_fmt != need_fmt || where + size != length) {
 117     tty->print_cr("assert_constant_size %d @%d: bc=%d%s %d != %d", size, where, bc, (is_wide?"/wide":""), have_fmt, need_fmt);
 118   }
 119   assert(have_fmt == need_fmt, "assert_constant_size");
 120   assert(where + size == length, "assert_constant_size oob");
 121 }
 122 
 123 void Bytecode::assert_native_index(Bytecodes::Code bc, bool is_wide) {
 124   assert((Bytecodes::flags(bc, is_wide) & Bytecodes::_fmt_has_nbo) != 0, "native index");
 125 }
 126 
 127 #endif //ASSERT
 128 
 129 // Implementation of Bytecode_tableupswitch
 130 
 131 int Bytecode_tableswitch::dest_offset_at(int i) const {
 132   return get_Java_u4_at(aligned_offset(1 + (3 + i)*jintSize));
 133 }
 134 
 135 
 136 // Implementation of Bytecode_invoke
 137 
 138 void Bytecode_invoke::verify() const {
 139   assert(is_valid(), "check invoke");
 140   assert(method()->constants()->cache() != NULL, "do not call this from verifier or rewriter");
 141 }
 142 
 143 
 144 symbolOop Bytecode_member_ref::signature() const {
 145   constantPoolOop constants = method()->constants();
 146   return constants->signature_ref_at(index());
 147 }
 148 
 149 
 150 symbolOop Bytecode_member_ref::name() const {
 151   constantPoolOop constants = method()->constants();
 152   return constants->name_ref_at(index());
 153 }
 154 
 155 
 156 BasicType Bytecode_member_ref::result_type(Thread *thread) const {
 157   symbolHandle sh(thread, signature());
 158   ResultTypeFinder rts(sh);
 159   rts.iterate();
 160   return rts.type();
 161 }
 162 
 163 
 164 methodHandle Bytecode_invoke::static_target(TRAPS) {
 165   methodHandle m;
 166   KlassHandle resolved_klass;
 167   constantPoolHandle constants(THREAD, _method->constants());
 168 
 169   if (java_code() == Bytecodes::_invokedynamic) {
 170     LinkResolver::resolve_dynamic_method(m, resolved_klass, constants, index(), CHECK_(methodHandle()));
 171   } else if (java_code() != Bytecodes::_invokeinterface) {
 172     LinkResolver::resolve_method(m, resolved_klass, constants, index(), CHECK_(methodHandle()));
 173   } else {
 174     LinkResolver::resolve_interface_method(m, resolved_klass, constants, index(), CHECK_(methodHandle()));
 175   }
 176   return m;
 177 }
 178 
 179 
 180 int Bytecode_member_ref::index() const {
 181   // Note:  Rewriter::rewrite changes the Java_u2 of an invokedynamic to a native_u4,
 182   // at the same time it allocates per-call-site CP cache entries.
 183   Bytecodes::Code rawc = code();
 184   Bytecode* invoke = bytecode();
 185   if (invoke->has_index_u4(rawc))
 186     return invoke->get_index_u4(rawc);
 187   else
 188     return invoke->get_index_u2_cpcache(rawc);
 189 }
 190 
 191 int Bytecode_member_ref::pool_index() const {
 192   int index = this->index();
 193   DEBUG_ONLY({
 194       if (!bytecode()->has_index_u4(code()))
 195         index -= constantPoolOopDesc::CPCACHE_INDEX_TAG;
 196     });
 197   return _method->constants()->cache()->entry_at(index)->constant_pool_index();
 198 }
 199 
 200 // Implementation of Bytecode_field
 201 
 202 void Bytecode_field::verify() const {
 203   assert(is_valid(), "check field");
 204 }
 205 
 206 
 207 // Implementation of Bytecode_loadconstant
 208 
 209 int Bytecode_loadconstant::raw_index() const {
 210   Bytecode* bcp = bytecode();
 211   Bytecodes::Code rawc = bcp->code();
 212   assert(rawc != Bytecodes::_wide, "verifier prevents this");
 213   if (Bytecodes::java_code(rawc) == Bytecodes::_ldc)
 214     return bcp->get_index_u1(rawc);
 215   else
 216     return bcp->get_index_u2(rawc, false);
 217 }
 218 
 219 int Bytecode_loadconstant::pool_index() const {
 220   int index = raw_index();
 221   if (has_cache_index()) {
 222     return _method->constants()->cache()->entry_at(index)->constant_pool_index();
 223   }
 224   return index;
 225 }
 226 
 227 BasicType Bytecode_loadconstant::result_type() const {
 228   int index = pool_index();
 229   constantTag tag = _method->constants()->tag_at(index);
 230   return tag.basic_type();
 231 }
 232 
 233 oop Bytecode_loadconstant::resolve_constant(TRAPS) const {
 234   assert(_method.not_null(), "must supply method to resolve constant");
 235   int index = raw_index();
 236   constantPoolOop constants = _method->constants();
 237   if (has_cache_index()) {
 238     return constants->resolve_cached_constant_at(index, THREAD);
 239   } else {
 240     return constants->resolve_constant_at(index, THREAD);
 241   }
 242 }
 243 
 244 //------------------------------------------------------------------------------
 245 // Non-product code
 246 
 247 #ifndef PRODUCT
 248 
 249 void Bytecode_lookupswitch::verify() const {
 250   switch (Bytecodes::java_code(code())) {
 251     case Bytecodes::_lookupswitch:
 252       { int i = number_of_pairs() - 1;
 253         while (i-- > 0) {
 254           assert(pair_at(i)->match() < pair_at(i+1)->match(), "unsorted table entries");
 255         }
 256       }
 257       break;
 258     default:
 259       fatal("not a lookupswitch bytecode");
 260   }
 261 }
 262 
 263 void Bytecode_tableswitch::verify() const {
 264   switch (Bytecodes::java_code(code())) {
 265     case Bytecodes::_tableswitch:
 266       { int lo = low_key();
 267         int hi = high_key();
 268         assert (hi >= lo, "incorrect hi/lo values in tableswitch");
 269         int i  = hi - lo - 1 ;
 270         while (i-- > 0) {
 271           // no special check needed
 272         }
 273       }
 274       break;
 275     default:
 276       fatal("not a tableswitch bytecode");
 277   }
 278 }
 279 
 280 #endif