get_live_vreg_jni.cc revision 8e5bd18fc665d7ec5461ea068e98740a65da754c
1/* 2 * Copyright (C) 2015 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 "arch/context.h" 18#include "jni.h" 19#include "mirror/art_method-inl.h" 20#include "scoped_thread_state_change.h" 21#include "stack.h" 22#include "thread.h" 23 24namespace art { 25 26namespace { 27 28class TestVisitor : public StackVisitor { 29 public: 30 TestVisitor(Thread* thread, Context* context) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) 31 : StackVisitor(thread, context, StackVisitor::StackWalkKind::kIncludeInlinedFrames) {} 32 33 bool VisitFrame() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 34 mirror::ArtMethod* m = GetMethod(); 35 std::string m_name(m->GetName()); 36 37 if (m_name.compare("testLiveArgument") == 0) { 38 found_method_ = true; 39 uint32_t value = 0; 40 CHECK(GetVReg(m, 0, kIntVReg, &value)); 41 CHECK_EQ(value, 42u); 42 } else if (m_name.compare("testIntervalHole") == 0) { 43 found_method_ = true; 44 uint32_t value = 0; 45 if (m->IsOptimized(sizeof(void*))) { 46 CHECK_EQ(GetVReg(m, 0, kIntVReg, &value), false); 47 } else { 48 CHECK(GetVReg(m, 0, kIntVReg, &value)); 49 CHECK_EQ(value, 1u); 50 } 51 } 52 53 return true; 54 } 55 56 // Value returned to Java to ensure the methods testSimpleVReg and testPairVReg 57 // have been found and tested. 58 bool found_method_ = false; 59}; 60 61extern "C" JNIEXPORT void JNICALL Java_Main_doStaticNativeCallLiveVreg(JNIEnv*, jclass) { 62 ScopedObjectAccess soa(Thread::Current()); 63 std::unique_ptr<Context> context(Context::Create()); 64 TestVisitor visitor(soa.Self(), context.get()); 65 visitor.WalkStack(); 66 CHECK(visitor.found_method_); 67} 68 69} // namespace 70 71} // namespace art 72