1/* 2 * Copyright (C) 2012 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#include "art_method-inl.h" 18#include "base/logging.h" 19#include "callee_save_frame.h" 20#include "dex_file-inl.h" 21#include "interpreter/interpreter.h" 22#include "mirror/class-inl.h" 23#include "mirror/object_array-inl.h" 24#include "mirror/object-inl.h" 25#include "quick_exception_handler.h" 26#include "stack.h" 27#include "thread.h" 28#include "verifier/method_verifier.h" 29 30namespace art { 31 32extern "C" NO_RETURN void artDeoptimize(Thread* self) SHARED_REQUIRES(Locks::mutator_lock_) { 33 ScopedQuickEntrypointChecks sqec(self); 34 35 if (VLOG_IS_ON(deopt)) { 36 LOG(INFO) << "Deopting:"; 37 self->Dump(LOG(INFO)); 38 } 39 40 self->AssertHasDeoptimizationContext(); 41 self->SetException(Thread::GetDeoptimizationException()); 42 self->QuickDeliverException(); 43} 44 45extern "C" NO_RETURN void artDeoptimizeFromCompiledCode(Thread* self) 46 SHARED_REQUIRES(Locks::mutator_lock_) { 47 ScopedQuickEntrypointChecks sqec(self); 48 49 // Deopt logging will be in DeoptimizeSingleFrame. It is there to take advantage of the 50 // specialized visitor that will show whether a method is Quick or Shadow. 51 52 // Before deoptimizing to interpreter, we must push the deoptimization context. 53 JValue return_value; 54 return_value.SetJ(0); // we never deoptimize from compiled code with an invoke result. 55 self->PushDeoptimizationContext(return_value, false, /* from_code */ true, self->GetException()); 56 57 QuickExceptionHandler exception_handler(self, true); 58 exception_handler.DeoptimizeSingleFrame(); 59 exception_handler.UpdateInstrumentationStack(); 60 exception_handler.DeoptimizeSingleFrameArchDependentFixup(); 61 // We cannot smash the caller-saves, as we need the ArtMethod in a parameter register that would 62 // be caller-saved. This has the downside that we cannot track incorrect register usage down the 63 // line. 64 exception_handler.DoLongJump(false); 65} 66 67} // namespace art 68