提交 68e230d4 编写于 作者: T twisti

6926782: CodeBuffer size too small after 6921352

Summary: After 6921352 the CodeBuffer size was too small.
Reviewed-by: kvn, never
上级 d98b10e5
/* /*
* Copyright 2000-2009 Sun Microsystems, Inc. All Rights Reserved. * Copyright 2000-2010 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -136,8 +136,10 @@ JVMState* DirectCallGenerator::generate(JVMState* jvms) { ...@@ -136,8 +136,10 @@ JVMState* DirectCallGenerator::generate(JVMState* jvms) {
} }
// Mark the call node as virtual, sort of: // Mark the call node as virtual, sort of:
call->set_optimized_virtual(true); call->set_optimized_virtual(true);
if (method()->is_method_handle_invoke()) if (method()->is_method_handle_invoke()) {
call->set_method_handle_invoke(true); call->set_method_handle_invoke(true);
kit.C->set_has_method_handle_invokes(true);
}
} }
kit.set_arguments_for_java_call(call); kit.set_arguments_for_java_call(call);
kit.set_edges_for_java_call(call, false, _separate_io_proj); kit.set_edges_for_java_call(call, false, _separate_io_proj);
...@@ -194,6 +196,7 @@ JVMState* DynamicCallGenerator::generate(JVMState* jvms) { ...@@ -194,6 +196,7 @@ JVMState* DynamicCallGenerator::generate(JVMState* jvms) {
call->set_optimized_virtual(true); call->set_optimized_virtual(true);
// Take extra care (in the presence of argument motion) not to trash the SP: // Take extra care (in the presence of argument motion) not to trash the SP:
call->set_method_handle_invoke(true); call->set_method_handle_invoke(true);
kit.C->set_has_method_handle_invokes(true);
// Pass the target MethodHandle as first argument and shift the // Pass the target MethodHandle as first argument and shift the
// other arguments. // other arguments.
......
/* /*
* Copyright 1997-2009 Sun Microsystems, Inc. All Rights Reserved. * Copyright 1997-2010 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -465,6 +465,7 @@ Compile::Compile( ciEnv* ci_env, C2Compiler* compiler, ciMethod* target, int osr ...@@ -465,6 +465,7 @@ Compile::Compile( ciEnv* ci_env, C2Compiler* compiler, ciMethod* target, int osr
_code_buffer("Compile::Fill_buffer"), _code_buffer("Compile::Fill_buffer"),
_orig_pc_slot(0), _orig_pc_slot(0),
_orig_pc_slot_offset_in_bytes(0), _orig_pc_slot_offset_in_bytes(0),
_has_method_handle_invokes(false),
_node_bundling_limit(0), _node_bundling_limit(0),
_node_bundling_base(NULL), _node_bundling_base(NULL),
_java_calls(0), _java_calls(0),
...@@ -759,6 +760,7 @@ Compile::Compile( ciEnv* ci_env, ...@@ -759,6 +760,7 @@ Compile::Compile( ciEnv* ci_env,
_do_escape_analysis(false), _do_escape_analysis(false),
_failure_reason(NULL), _failure_reason(NULL),
_code_buffer("Compile::Fill_buffer"), _code_buffer("Compile::Fill_buffer"),
_has_method_handle_invokes(false),
_node_bundling_limit(0), _node_bundling_limit(0),
_node_bundling_base(NULL), _node_bundling_base(NULL),
_java_calls(0), _java_calls(0),
......
/* /*
* Copyright 1997-2009 Sun Microsystems, Inc. All Rights Reserved. * Copyright 1997-2010 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -166,6 +166,9 @@ class Compile : public Phase { ...@@ -166,6 +166,9 @@ class Compile : public Phase {
bool _parsed_irreducible_loop; // True if ciTypeFlow detected irreducible loops during parsing bool _parsed_irreducible_loop; // True if ciTypeFlow detected irreducible loops during parsing
#endif #endif
// JSR 292
bool _has_method_handle_invokes; // True if this method has MethodHandle invokes.
// Compilation environment. // Compilation environment.
Arena _comp_arena; // Arena with lifetime equivalent to Compile Arena _comp_arena; // Arena with lifetime equivalent to Compile
ciEnv* _env; // CI interface ciEnv* _env; // CI interface
...@@ -336,6 +339,10 @@ class Compile : public Phase { ...@@ -336,6 +339,10 @@ class Compile : public Phase {
void set_parsed_irreducible_loop(bool z) { _parsed_irreducible_loop = z; } void set_parsed_irreducible_loop(bool z) { _parsed_irreducible_loop = z; }
#endif #endif
// JSR 292
bool has_method_handle_invokes() const { return _has_method_handle_invokes; }
void set_has_method_handle_invokes(bool z) { _has_method_handle_invokes = z; }
void begin_method() { void begin_method() {
#ifndef PRODUCT #ifndef PRODUCT
if (_printer) _printer->begin_method(this); if (_printer) _printer->begin_method(this);
......
...@@ -805,8 +805,12 @@ void Compile::Process_OopMap_Node(MachNode *mach, int current_offset) { ...@@ -805,8 +805,12 @@ void Compile::Process_OopMap_Node(MachNode *mach, int current_offset) {
mcall = mach->as_MachCall(); mcall = mach->as_MachCall();
// Is the call a MethodHandle call? // Is the call a MethodHandle call?
if (mcall->is_MachCallJava()) if (mcall->is_MachCallJava()) {
is_method_handle_invoke = mcall->as_MachCallJava()->_method_handle_invoke; if (mcall->as_MachCallJava()->_method_handle_invoke) {
assert(has_method_handle_invokes(), "must have been set during call generation");
is_method_handle_invoke = true;
}
}
// Check if a call returns an object. // Check if a call returns an object.
if (mcall->return_value_is_used() && if (mcall->return_value_is_used() &&
...@@ -1092,9 +1096,21 @@ void Compile::Fill_buffer() { ...@@ -1092,9 +1096,21 @@ void Compile::Fill_buffer() {
deopt_handler_req += MAX_stubs_size; // add marginal slop for handler deopt_handler_req += MAX_stubs_size; // add marginal slop for handler
stub_req += MAX_stubs_size; // ensure per-stub margin stub_req += MAX_stubs_size; // ensure per-stub margin
code_req += MAX_inst_size; // ensure per-instruction margin code_req += MAX_inst_size; // ensure per-instruction margin
if (StressCodeBuffers) if (StressCodeBuffers)
code_req = const_req = stub_req = exception_handler_req = deopt_handler_req = 0x10; // force expansion code_req = const_req = stub_req = exception_handler_req = deopt_handler_req = 0x10; // force expansion
int total_req = code_req + pad_req + stub_req + exception_handler_req + deopt_handler_req + const_req;
int total_req =
code_req +
pad_req +
stub_req +
exception_handler_req +
deopt_handler_req + // deopt handler
const_req;
if (has_method_handle_invokes())
total_req += deopt_handler_req; // deopt MH handler
CodeBuffer* cb = code_buffer(); CodeBuffer* cb = code_buffer();
cb->initialize(total_req, locs_req); cb->initialize(total_req, locs_req);
...@@ -1436,10 +1452,13 @@ void Compile::Fill_buffer() { ...@@ -1436,10 +1452,13 @@ void Compile::Fill_buffer() {
_code_offsets.set_value(CodeOffsets::Exceptions, emit_exception_handler(*cb)); _code_offsets.set_value(CodeOffsets::Exceptions, emit_exception_handler(*cb));
// Emit the deopt handler code. // Emit the deopt handler code.
_code_offsets.set_value(CodeOffsets::Deopt, emit_deopt_handler(*cb)); _code_offsets.set_value(CodeOffsets::Deopt, emit_deopt_handler(*cb));
// Emit the MethodHandle deopt handler code. We can use the same
// code as for the normal deopt handler, we just need a different // Emit the MethodHandle deopt handler code (if required).
// entry point address. if (has_method_handle_invokes()) {
_code_offsets.set_value(CodeOffsets::DeoptMH, emit_deopt_handler(*cb)); // We can use the same code as for the normal deopt handler, we
// just need a different entry point address.
_code_offsets.set_value(CodeOffsets::DeoptMH, emit_deopt_handler(*cb));
}
} }
// One last check for failed CodeBuffer::expand: // One last check for failed CodeBuffer::expand:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册