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