OSDN Git Service

Fix proxy tracing and enable tests that now work with tracing.
authorJeff Hao <jeffhao@google.com>
Thu, 24 Jul 2014 23:26:09 +0000 (16:26 -0700)
committerJeff Hao <jeffhao@google.com>
Fri, 15 Aug 2014 16:43:37 +0000 (09:43 -0700)
Also updates proxy_test to generate an image for GetQuickOatCodeFor.

Bug: 16386215

(cherry picked from commit f0a3f09c3d54646166a55c05a6b39c7dd504129c)

Change-Id: I138edbad9e1646db8590f2b1b73f2788d9710e68

build/Android.gtest.mk
runtime/class_linker.cc
runtime/common_runtime_test.cc
runtime/common_runtime_test.h
runtime/entrypoints/quick/quick_trampoline_entrypoints.cc
runtime/mirror/art_method.cc
runtime/proxy_test.cc
test/Android.run-test.mk

index 9ee3b69..17c478c 100644 (file)
@@ -114,6 +114,7 @@ RUNTIME_GTEST_COMMON_SRC_FILES := \
   runtime/monitor_pool_test.cc \
   runtime/monitor_test.cc \
   runtime/parsed_options_test.cc \
+  runtime/proxy_test.cc \
   runtime/reference_table_test.cc \
   runtime/thread_pool_test.cc \
   runtime/transaction_test.cc \
@@ -124,7 +125,6 @@ RUNTIME_GTEST_COMMON_SRC_FILES := \
 
 COMPILER_GTEST_COMMON_SRC_FILES := \
   runtime/jni_internal_test.cc \
-  runtime/proxy_test.cc \
   runtime/reflection_test.cc \
   compiler/dex/global_value_numbering_test.cc \
   compiler/dex/local_value_numbering_test.cc \
index 4362b82..df41c96 100644 (file)
@@ -3519,14 +3519,19 @@ mirror::ArtMethod* ClassLinker::CreateProxyConstructor(Thread* self,
       proxy_class->GetDirectMethods();
   CHECK_EQ(proxy_direct_methods->GetLength(), 16);
   mirror::ArtMethod* proxy_constructor = proxy_direct_methods->Get(2);
-  // Clone the existing constructor of Proxy (our constructor would just invoke it so steal its
-  // code_ too)
-  mirror::ArtMethod* constructor =
-      down_cast<mirror::ArtMethod*>(proxy_constructor->Clone(self));
-  if (constructor == NULL) {
+  mirror::ArtMethod* constructor = down_cast<mirror::ArtMethod*>(proxy_constructor->Clone(self));
+  if (constructor == nullptr) {
     CHECK(self->IsExceptionPending());  // OOME.
-    return NULL;
+    return nullptr;
   }
+  // Make the proxy constructor's code always point to the uninstrumented code. This avoids
+  // getting a method enter event for the proxy constructor as the proxy constructor doesn't
+  // have an activation.
+  bool have_portable_code;
+  constructor->SetEntryPointFromQuickCompiledCode(GetQuickOatCodeFor(proxy_constructor));
+  constructor->SetEntryPointFromPortableCompiledCode(GetPortableOatCodeFor(proxy_constructor,
+                                                                           &have_portable_code));
+
   // Make this constructor public and fix the class to be our Proxy version
   constructor->SetAccessFlags((constructor->GetAccessFlags() & ~kAccProtected) | kAccPublic);
   constructor->SetDeclaringClass(klass.Get());
index b9b7efe..6f3b3a3 100644 (file)
@@ -233,7 +233,7 @@ void CommonRuntimeTest::ClearDirectory(const char* dirpath) {
     if ((strcmp(e->d_name, ".") == 0) || (strcmp(e->d_name, "..") == 0)) {
       continue;
     }
-    std::string filename(dalvik_cache_);
+    std::string filename(dirpath);
     filename.push_back('/');
     filename.append(e->d_name);
     int stat_result = lstat(filename.c_str(), &s);
@@ -285,6 +285,19 @@ std::string CommonRuntimeTest::GetDexFileName(const std::string& jar_prefix) {
   return StringPrintf("%s/framework/%s.jar", GetAndroidRoot(), jar_prefix.c_str());
 }
 
+std::string CommonRuntimeTest::GetLibCoreOatFileName() {
+  return GetOatFileName("core");
+}
+
+std::string CommonRuntimeTest::GetOatFileName(const std::string& oat_prefix) {
+  if (IsHost()) {
+    const char* host_dir = getenv("ANDROID_HOST_OUT");
+    CHECK(host_dir != nullptr);
+    return StringPrintf("%s/framework/%s.art", host_dir, oat_prefix.c_str());
+  }
+  return StringPrintf("%s/framework/%s.art", GetAndroidRoot(), oat_prefix.c_str());
+}
+
 std::string CommonRuntimeTest::GetTestAndroidRoot() {
   if (IsHost()) {
     const char* host_dir = getenv("ANDROID_HOST_OUT");
index 9ceb551..0fefc21 100644 (file)
@@ -91,10 +91,18 @@ class CommonRuntimeTest : public testing::Test {
 
   virtual void TearDown();
 
+  // Gets the path of the libcore dex file.
   std::string GetLibCoreDexFileName();
 
+  // Gets the path of the specified dex file for host or target.
   std::string GetDexFileName(const std::string& jar_prefix);
 
+  // Gets the path of the libcore oat file.
+  std::string GetLibCoreOatFileName();
+
+  // Gets the path of the specified oat file for host or target.
+  std::string GetOatFileName(const std::string& oat_prefix);
+
   std::string GetTestAndroidRoot();
 
   std::vector<const DexFile*> OpenTestDexFiles(const char* name)
index 2c8dad3..4730701 100644 (file)
@@ -592,8 +592,7 @@ extern "C" uint64_t artQuickProxyInvokeHandler(mirror::ArtMethod* proxy_method,
   const char* old_cause =
       self->StartAssertNoThreadSuspension("Adding to IRT proxy object arguments");
   // Register the top of the managed stack, making stack crawlable.
-  DCHECK_EQ(sp->AsMirrorPtr(), proxy_method)
-  << PrettyMethod(proxy_method);
+  DCHECK_EQ(sp->AsMirrorPtr(), proxy_method) << PrettyMethod(proxy_method);
   self->SetTopOfStack(sp, 0);
   DCHECK_EQ(proxy_method->GetFrameSizeInBytes(),
             Runtime::Current()->GetCalleeSaveMethod(Runtime::kRefsAndArgs)->GetFrameSizeInBytes())
index 8206cd4..370bfb9 100644 (file)
@@ -157,12 +157,12 @@ ArtMethod* ArtMethod::FindOverriddenMethod() {
       }
     }
   }
-#ifndef NDEBUG
-  StackHandleScope<2> hs(Thread::Current());
-  MethodHelper result_mh(hs.NewHandle(result));
-  MethodHelper this_mh(hs.NewHandle(this));
-  DCHECK(result == NULL || this_mh.HasSameNameAndSignature(&result_mh));
-#endif
+  if (kIsDebugBuild) {
+    StackHandleScope<2> hs(Thread::Current());
+    MethodHelper result_mh(hs.NewHandle(result));
+    MethodHelper this_mh(hs.NewHandle(this));
+    DCHECK(result == nullptr || this_mh.HasSameNameAndSignature(&result_mh));
+  }
   return result;
 }
 
index d977ce9..5af26b0 100644 (file)
 #include <jni.h>
 #include <vector>
 
-#include "common_compiler_test.h"
+#include "common_runtime_test.h"
 #include "field_helper.h"
 #include "mirror/art_field-inl.h"
 #include "scoped_thread_state_change.h"
 
 namespace art {
 
-class ProxyTest : public CommonCompilerTest {
+class ProxyTest : public CommonRuntimeTest {
  public:
   // Generate a proxy class with the given name and interfaces. This is a simplification from what
   // libcore does to fit to our test needs. We do not check for duplicated interfaces or methods and
@@ -103,6 +103,12 @@ class ProxyTest : public CommonCompilerTest {
     soa.Self()->AssertNoPendingException();
     return proxyClass;
   }
+
+ protected:
+  void SetUpRuntimeOptions(RuntimeOptions *options) OVERRIDE {
+    options->push_back(std::make_pair(StringPrintf("-Ximage:%s", GetLibCoreOatFileName().c_str()),
+                                      nullptr));
+  }
 };
 
 // Creates a proxy class and check ClassHelper works correctly.
index 5c1bc03..d7ee383 100644 (file)
@@ -81,38 +81,10 @@ endif
 
 # Tests that are broken in --trace mode.
 TEST_ART_BROKEN_TRACE_RUN_TESTS := \
-  003-omnibus-opcodes \
-  004-InterfaceTest \
   004-SignalTest \
-  004-ThreadStress \
-  005-annotations \
-  012-math \
   018-stack-overflow \
-  023-many-interfaces \
-  027-arithmetic \
-  031-class-attributes \
-  037-inherit \
-  044-proxy \
-  046-reflect \
-  051-thread \
-  055-enum-performance \
-  062-character-encodings \
-  064-field-access \
-  074-gc-thrash \
-  078-polymorphic-virtual \
-  080-oom-throw \
-  082-inline-execute \
-  083-compiler-regressions \
-  093-serialization \
   097-duplicate-method \
-  100-reflect2 \
-  102-concurrent-gc \
-  103-string-append \
-  107-int-math2 \
-  112-double-math \
-  114-ParallelGC \
-  700-LoadArgRegs \
-  701-easy-div-rem
+  107-int-math2
 
 ART_TEST_KNOWN_BROKEN += $(foreach test, $(TEST_ART_BROKEN_TRACE_RUN_TESTS), $(call all-run-test-names,$(test),-trace,-relocate))
 ART_TEST_KNOWN_BROKEN += $(foreach test, $(TEST_ART_BROKEN_TRACE_RUN_TESTS), $(call all-run-test-names,$(test),-trace,-no-prebuild))