1e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle/* 2e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle * Copyright (C) 2016 The Android Open Source Project 3e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle * 4e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle * Licensed under the Apache License, Version 2.0 (the "License"); 5e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle * you may not use this file except in compliance with the License. 6e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle * You may obtain a copy of the License at 7e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle * 8e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle * http://www.apache.org/licenses/LICENSE-2.0 9e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle * 10e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle * Unless required by applicable law or agreed to in writing, software 11e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle * distributed under the License is distributed on an "AS IS" BASIS, 12e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle * See the License for the specific language governing permissions and 14e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle * limitations under the License. 15e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle */ 16e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle 17e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle#include "dex_file.h" 18e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle 19ba17f458e20d82b197536d62e1d61c5300da4932Mathieu Chartier#include "art_method-inl.h" 20e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle#include "jit/offline_profiling_info.h" 21e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle#include "jit/profile_saver.h" 22e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle#include "jni.h" 23e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle#include "method_reference.h" 24e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle#include "mirror/class-inl.h" 25e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle#include "oat_file_assistant.h" 26e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle#include "oat_file_manager.h" 27e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle#include "scoped_thread_state_change.h" 28e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle#include "ScopedUtfChars.h" 29e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle#include "thread.h" 30e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle 31e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravlenamespace art { 32e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravlenamespace { 33e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle 34e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravleclass CreateProfilingInfoVisitor : public StackVisitor { 35e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle public: 36e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle explicit CreateProfilingInfoVisitor(Thread* thread, const char* method_name) 37e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle SHARED_REQUIRES(Locks::mutator_lock_) 38e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle : StackVisitor(thread, nullptr, StackVisitor::StackWalkKind::kIncludeInlinedFrames), 39e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle method_name_(method_name) {} 40e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle 41e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle bool VisitFrame() SHARED_REQUIRES(Locks::mutator_lock_) { 42e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle ArtMethod* m = GetMethod(); 43e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle std::string m_name(m->GetName()); 44e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle 45e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle if (m_name.compare(method_name_) == 0) { 46e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle ProfilingInfo::Create(Thread::Current(), m, /* retry_allocation */ true); 47e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle method_index_ = m->GetDexMethodIndex(); 48e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle return false; 49e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle } 50e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle return true; 51e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle } 52e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle 53e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle int method_index_ = -1; 54e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle const char* const method_name_; 55e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle}; 56e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle 57e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravleextern "C" JNIEXPORT jint JNICALL Java_Main_ensureProfilingInfo(JNIEnv* env, 58e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle jclass, 59e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle jstring method_name) { 60e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle ScopedUtfChars chars(env, method_name); 61e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle CHECK(chars.c_str() != nullptr); 62e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle ScopedObjectAccess soa(Thread::Current()); 63e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle CreateProfilingInfoVisitor visitor(soa.Self(), chars.c_str()); 64e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle visitor.WalkStack(); 65e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle return visitor.method_index_; 66e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle} 67e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle 68e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravleextern "C" JNIEXPORT void JNICALL Java_Main_ensureProfileProcessing(JNIEnv*, jclass) { 69e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle ProfileSaver::ForceProcessProfiles(); 70e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle} 71e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle 72e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravleextern "C" JNIEXPORT jboolean JNICALL Java_Main_presentInProfile( 73e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle JNIEnv* env, jclass cls, jstring filename, jint method_index) { 74e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle ScopedUtfChars filename_chars(env, filename); 75e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle CHECK(filename_chars.c_str() != nullptr); 76e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle ScopedObjectAccess soa(Thread::Current()); 77e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle const DexFile* dex_file = soa.Decode<mirror::Class*>(cls)->GetDexCache()->GetDexFile(); 78e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle return ProfileSaver::HasSeenMethod(std::string(filename_chars.c_str()), 79e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle dex_file, 80e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle static_cast<uint16_t>(method_index)); 81e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle} 82e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle 83e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle} // namespace 84e5de54cfab5f14ba0b8ff25d8d60901c7021943fCalin Juravle} // namespace art 85