< prev index next >

src/hotspot/share/interpreter/templateInterpreter.cpp

Print this page




  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 "precompiled.hpp"
  26 #include "interpreter/interpreter.hpp"
  27 #include "interpreter/interpreterRuntime.hpp"
  28 #include "interpreter/interp_masm.hpp"
  29 #include "interpreter/templateInterpreter.hpp"
  30 #include "interpreter/templateInterpreterGenerator.hpp"
  31 #include "interpreter/templateTable.hpp"
  32 #include "logging/log.hpp"
  33 #include "memory/resourceArea.hpp"

  34 #include "runtime/timerTrace.hpp"

  35 
  36 #ifndef CC_INTERP
  37 
  38 # define __ _masm->
  39 
  40 void TemplateInterpreter::initialize() {
  41   if (_code != NULL) return;
  42   // assertions
  43   assert((int)Bytecodes::number_of_codes <= (int)DispatchTable::length,
  44          "dispatch table too small");
  45 
  46   AbstractInterpreter::initialize();
  47 
  48   TemplateTable::initialize();
  49 
  50   // generate interpreter
  51   { ResourceMark rm;
  52     TraceTime timer("Interpreter generation", TRACETIME_LOG(Info, startuptime));
  53     int code_size = InterpreterCodeSize;
  54     NOT_PRODUCT(code_size *= 4;)  // debug uses extra interpreter code space


 258 
 259 
 260 address TemplateInterpreter::deopt_entry(TosState state, int length) {
 261   guarantee(0 <= length && length < Interpreter::number_of_deopt_entries, "illegal length");
 262   address entry = _deopt_entry[length].entry(state);
 263   vmassert(entry != NULL, "unsupported deopt entry requested, length=%d state=%d", length, TosState_as_index(state));
 264   return entry;
 265 }
 266 
 267 //------------------------------------------------------------------------------------------------------------------------
 268 // Suport for invokes
 269 
 270 int TemplateInterpreter::TosState_as_index(TosState state) {
 271   assert( state < number_of_states , "Invalid state in TosState_as_index");
 272   assert(0 <= (int)state && (int)state < TemplateInterpreter::number_of_return_addrs, "index out of bounds");
 273   return (int)state;
 274 }
 275 
 276 
 277 //------------------------------------------------------------------------------------------------------------------------
 278 // Safepoint suppport
 279 
 280 static inline void copy_table(address* from, address* to, int size) {
 281   // Copy non-overlapping tables. The copy has to occur word wise for MT safety.
 282   while (size-- > 0) *to++ = *from++;






 283 }
 284 
 285 void TemplateInterpreter::notice_safepoints() {
 286   if (!_notice_safepoints) {
 287     log_debug(interpreter, safepoint)("switching active_table to safept_table.");
 288     // switch to safepoint dispatch table
 289     _notice_safepoints = true;
 290     copy_table((address*)&_safept_table, (address*)&_active_table, sizeof(_active_table) / sizeof(address));
 291   } else {
 292     log_debug(interpreter, safepoint)("active_table is already safept_table; "
 293                                       "notice_safepoints() call is no-op.");
 294   }
 295 }
 296 
 297 // switch from the dispatch table which notices safepoints back to the
 298 // normal dispatch table.  So that we can notice single stepping points,
 299 // keep the safepoint dispatch table if we are single stepping in JVMTI.
 300 // Note that the should_post_single_step test is exactly as fast as the
 301 // JvmtiExport::_enabled test and covers both cases.
 302 void TemplateInterpreter::ignore_safepoints() {




  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 "precompiled.hpp"
  26 #include "interpreter/interpreter.hpp"
  27 #include "interpreter/interpreterRuntime.hpp"
  28 #include "interpreter/interp_masm.hpp"
  29 #include "interpreter/templateInterpreter.hpp"
  30 #include "interpreter/templateInterpreterGenerator.hpp"
  31 #include "interpreter/templateTable.hpp"
  32 #include "logging/log.hpp"
  33 #include "memory/resourceArea.hpp"
  34 #include "runtime/safepoint.hpp"
  35 #include "runtime/timerTrace.hpp"
  36 #include "utilities/copy.hpp"
  37 
  38 #ifndef CC_INTERP
  39 
  40 # define __ _masm->
  41 
  42 void TemplateInterpreter::initialize() {
  43   if (_code != NULL) return;
  44   // assertions
  45   assert((int)Bytecodes::number_of_codes <= (int)DispatchTable::length,
  46          "dispatch table too small");
  47 
  48   AbstractInterpreter::initialize();
  49 
  50   TemplateTable::initialize();
  51 
  52   // generate interpreter
  53   { ResourceMark rm;
  54     TraceTime timer("Interpreter generation", TRACETIME_LOG(Info, startuptime));
  55     int code_size = InterpreterCodeSize;
  56     NOT_PRODUCT(code_size *= 4;)  // debug uses extra interpreter code space


 260 
 261 
 262 address TemplateInterpreter::deopt_entry(TosState state, int length) {
 263   guarantee(0 <= length && length < Interpreter::number_of_deopt_entries, "illegal length");
 264   address entry = _deopt_entry[length].entry(state);
 265   vmassert(entry != NULL, "unsupported deopt entry requested, length=%d state=%d", length, TosState_as_index(state));
 266   return entry;
 267 }
 268 
 269 //------------------------------------------------------------------------------------------------------------------------
 270 // Suport for invokes
 271 
 272 int TemplateInterpreter::TosState_as_index(TosState state) {
 273   assert( state < number_of_states , "Invalid state in TosState_as_index");
 274   assert(0 <= (int)state && (int)state < TemplateInterpreter::number_of_return_addrs, "index out of bounds");
 275   return (int)state;
 276 }
 277 
 278 
 279 //------------------------------------------------------------------------------------------------------------------------
 280 // Safepoint support
 281 
 282 static inline void copy_table(address* from, address* to, int size) {
 283   // Copy non-overlapping tables.
 284   if (SafepointSynchronize::is_at_safepoint()) {
 285     // Nothing is using the table at a safepoint so skip atomic word copy.
 286     Copy::disjoint_words((HeapWord*)from, (HeapWord*)to, (size_t)size);
 287   } else {
 288     // Use atomic word copy when not at a safepoint for safety.
 289     Copy::disjoint_words_atomic((HeapWord*)from, (HeapWord*)to, (size_t)size);
 290   }
 291 }
 292 
 293 void TemplateInterpreter::notice_safepoints() {
 294   if (!_notice_safepoints) {
 295     log_debug(interpreter, safepoint)("switching active_table to safept_table.");
 296     // switch to safepoint dispatch table
 297     _notice_safepoints = true;
 298     copy_table((address*)&_safept_table, (address*)&_active_table, sizeof(_active_table) / sizeof(address));
 299   } else {
 300     log_debug(interpreter, safepoint)("active_table is already safept_table; "
 301                                       "notice_safepoints() call is no-op.");
 302   }
 303 }
 304 
 305 // switch from the dispatch table which notices safepoints back to the
 306 // normal dispatch table.  So that we can notice single stepping points,
 307 // keep the safepoint dispatch table if we are single stepping in JVMTI.
 308 // Note that the should_post_single_step test is exactly as fast as the
 309 // JvmtiExport::_enabled test and covers both cases.
 310 void TemplateInterpreter::ignore_safepoints() {


< prev index next >