Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(750)

Unified Diff: runtime/vm/code_generator.cc

Issue 2781483005: Improve internal compiler API so that OSR code is never installed on function. (Closed)
Patch Set: cosmetics Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/lib/mirrors.cc ('k') | runtime/vm/compiler.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/code_generator.cc
diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc
index 22005f0796f98f707b0e57f508a8c723680c9222..10b18c3bbbedaef1d9af1d50b8fbc5a690b7642a 100644
--- a/runtime/vm/code_generator.cc
+++ b/runtime/vm/code_generator.cc
@@ -657,14 +657,7 @@ DEFINE_RUNTIME_ENTRY(PatchStaticCall, 0) {
ASSERT(caller_code.is_optimized());
const Function& target_function = Function::Handle(
zone, caller_code.GetStaticCallTargetFunctionAt(caller_frame->pc()));
- if (!target_function.HasCode()) {
- const Error& error =
- Error::Handle(zone, Compiler::CompileFunction(thread, target_function));
- if (!error.IsNull()) {
- Exceptions::PropagateError(error);
- }
- }
- const Code& target_code = Code::Handle(zone, target_function.CurrentCode());
+ const Code& target_code = Code::Handle(zone, target_function.EnsureHasCode());
// Before patching verify that we are not repeatedly patching to the same
// target.
ASSERT(target_code.raw() !=
@@ -940,13 +933,7 @@ DEFINE_RUNTIME_ENTRY(StaticCallMissHandlerOneArg, 2) {
// IC data for static call is prepopulated with the statically known target.
ASSERT(ic_data.NumberOfChecksIs(1));
const Function& target = Function::Handle(ic_data.GetTargetAt(0));
- if (!target.HasCode()) {
- const Error& error =
- Error::Handle(Compiler::CompileFunction(thread, target));
- if (!error.IsNull()) {
- Exceptions::PropagateError(error);
- }
- }
+ target.EnsureHasCode();
ASSERT(!target.IsNull() && target.HasCode());
ic_data.AddReceiverCheck(arg.GetClassId(), target, 1);
if (FLAG_trace_ic) {
@@ -972,14 +959,7 @@ DEFINE_RUNTIME_ENTRY(StaticCallMissHandlerTwoArgs, 3) {
// IC data for static call is prepopulated with the statically known target.
ASSERT(!ic_data.NumberOfChecksIs(0));
const Function& target = Function::Handle(ic_data.GetTargetAt(0));
- if (!target.HasCode()) {
- const Error& error =
- Error::Handle(Compiler::CompileFunction(thread, target));
- if (!error.IsNull()) {
- Exceptions::PropagateError(error);
- }
- }
- ASSERT(!target.IsNull() && target.HasCode());
+ target.EnsureHasCode();
GrowableArray<intptr_t> cids(2);
cids.Add(arg0.GetClassId());
cids.Add(arg1.GetClassId());
@@ -1321,13 +1301,8 @@ DEFINE_RUNTIME_ENTRY(MegamorphicCacheMissHandler, 3) {
// the monomorphic case hides an live instance selector from the
// treeshaker.
- if (!target_function.HasCode()) {
- const Error& error =
- Error::Handle(Compiler::CompileFunction(thread, target_function));
- if (!error.IsNull()) {
- Exceptions::PropagateError(error);
- }
- }
+ const Code& target_code =
+ Code::Handle(zone, target_function.EnsureHasCode());
DartFrameIterator iterator;
StackFrame* miss_function_frame = iterator.NextFrame();
@@ -1336,8 +1311,6 @@ DEFINE_RUNTIME_ENTRY(MegamorphicCacheMissHandler, 3) {
ASSERT(caller_frame->IsDartFrame());
const Code& caller_code =
Code::Handle(zone, caller_frame->LookupDartCode());
- const Code& target_code =
- Code::Handle(zone, target_function.CurrentCode());
const Smi& expected_cid =
Smi::Handle(zone, Smi::New(receiver.GetClassId()));
@@ -1706,28 +1679,20 @@ DEFINE_RUNTIME_ENTRY(StackOverflow, 0) {
function.usage_counter());
}
- const Code& original_code = Code::Handle(function.CurrentCode());
// Since the code is referenced from the frame and the ZoneHandle,
// it cannot have been removed from the function.
- ASSERT(!original_code.IsNull());
- const Error& error = Error::Handle(
+ const Object& result = Object::Handle(
Compiler::CompileOptimizedFunction(thread, function, osr_id));
- if (!error.IsNull()) {
- Exceptions::PropagateError(error);
+ if (result.IsError()) {
+ Exceptions::PropagateError(Error::Cast(result));
}
- const Code& optimized_code = Code::Handle(function.CurrentCode());
- // The current code will not be changed in the case that the compiler
- // bailed out during OSR compilation.
- if (optimized_code.raw() != original_code.raw()) {
- // The OSR code does not work for calling the function, so restore the
- // unoptimized code. Patch the stack frame to return into the OSR
- // code.
+ if (!result.IsNull()) {
+ const Code& code = Code::Cast(result);
uword optimized_entry =
- Instructions::UncheckedEntryPoint(optimized_code.instructions());
- function.AttachCode(original_code);
+ Instructions::UncheckedEntryPoint(code.instructions());
frame->set_pc(optimized_entry);
- frame->set_pc_marker(optimized_code.raw());
+ frame->set_pc_marker(code.raw());
}
}
}
@@ -1800,13 +1765,11 @@ DEFINE_RUNTIME_ENTRY(OptimizeInvokedFunction, 1) {
function.ToFullyQualifiedCString());
}
}
- const Error& error = Error::Handle(
+ const Object& result = Object::Handle(
zone, Compiler::CompileOptimizedFunction(thread, function));
- if (!error.IsNull()) {
- Exceptions::PropagateError(error);
+ if (result.IsError()) {
+ Exceptions::PropagateError(Error::Cast(result));
}
- const Code& optimized_code = Code::Handle(zone, function.CurrentCode());
- ASSERT(!optimized_code.IsNull());
}
arguments.SetReturn(function);
#else
@@ -1835,17 +1798,9 @@ DEFINE_RUNTIME_ENTRY(FixCallersTarget, 0) {
ASSERT(caller_code.is_optimized());
const Function& target_function = Function::Handle(
zone, caller_code.GetStaticCallTargetFunctionAt(frame->pc()));
- if (!target_function.HasCode()) {
- const Error& error =
- Error::Handle(zone, Compiler::CompileFunction(thread, target_function));
- if (!error.IsNull()) {
- Exceptions::PropagateError(error);
- }
- }
- ASSERT(target_function.HasCode());
const Code& current_target_code =
- Code::Handle(zone, target_function.CurrentCode());
+ Code::Handle(zone, target_function.EnsureHasCode());
CodePatcher::PatchStaticCallAt(frame->pc(), caller_code, current_target_code);
caller_code.SetStaticCallTargetCodeAt(frame->pc(), current_target_code);
if (FLAG_trace_patching) {
« no previous file with comments | « runtime/lib/mirrors.cc ('k') | runtime/vm/compiler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698