diff options
| -rw-r--r-- | Android.mk | 1 | ||||
| -rw-r--r-- | compiler/optimizing/loop_optimization.cc | 4 | ||||
| -rw-r--r-- | runtime/openjdkjvmti/ti_redefine.h | 8 | ||||
| -rw-r--r-- | test/645-checker-abs-simd/src/Main.java | 52 | ||||
| -rw-r--r-- | test/Android.run-test-jvmti-java-library.mk | 57 | ||||
| -rw-r--r-- | test/ti-agent/jni_binder.cc | 7 | ||||
| -rw-r--r-- | test/ti-agent/jni_binder.h | 4 |
7 files changed, 116 insertions, 17 deletions
diff --git a/Android.mk b/Android.mk index f8c537816f..7beb30f5d1 100644 --- a/Android.mk +++ b/Android.mk @@ -81,6 +81,7 @@ include $(art_path)/tools/Android.mk include $(art_path)/tools/ahat/Android.mk include $(art_path)/tools/dexfuzz/Android.mk include $(art_path)/libart_fake/Android.mk +include $(art_path)/test/Android.run-test-jvmti-java-library.mk ART_HOST_DEPENDENCIES := \ $(ART_HOST_EXECUTABLES) \ diff --git a/compiler/optimizing/loop_optimization.cc b/compiler/optimizing/loop_optimization.cc index bf18cc9bbc..8eeff1f2f0 100644 --- a/compiler/optimizing/loop_optimization.cc +++ b/compiler/optimizing/loop_optimization.cc @@ -1011,6 +1011,10 @@ void HLoopOptimization::GenerateVecOp(HInstruction* org, for (size_t index = 0; index < inputs.size(); ++index) { new_invoke->SetArgumentAt(index, vector_map_->Get(inputs[index])); } + new_invoke->SetIntrinsic(invoke->GetIntrinsic(), + kNeedsEnvironmentOrCache, + kNoSideEffects, + kNoThrow); vector = new_invoke; } break; diff --git a/runtime/openjdkjvmti/ti_redefine.h b/runtime/openjdkjvmti/ti_redefine.h index 586259a3f6..5e31627694 100644 --- a/runtime/openjdkjvmti/ti_redefine.h +++ b/runtime/openjdkjvmti/ti_redefine.h @@ -69,15 +69,12 @@ class RedefinitionDataHolder; class RedefinitionDataIter; // Class that can redefine a single class's methods. -// TODO We should really make this be driven by an outside class so we can do multiple classes at -// the same time and have less required cleanup. class Redefiner { public: // Redefine the given classes with the given dex data. Note this function does not take ownership // of the dex_data pointers. It is not used after this call however and may be freed if desired. // The caller is responsible for freeing it. The runtime makes its own copy of the data. This // function does not call the transformation events. - // TODO Check modified flag of the definitions. static jvmtiError RedefineClassesDirect(ArtJvmTiEnv* env, art::Runtime* runtime, art::Thread* self, @@ -87,7 +84,6 @@ class Redefiner { // Redefine the given classes with the given dex data. Note this function does not take ownership // of the dex_data pointers. It is not used after this call however and may be freed if desired. // The caller is responsible for freeing it. The runtime makes its own copy of the data. - // TODO This function should call the transformation events. static jvmtiError RedefineClasses(ArtJvmTiEnv* env, EventHandler* event_handler, art::Runtime* runtime, @@ -164,8 +160,6 @@ class Redefiner { REQUIRES_SHARED(art::Locks::mutator_lock_); // Preallocates all needed allocations in klass so that we can pause execution safely. - // TODO We should be able to free the arrays if they end up not being used. Investigate doing - // this in the future. For now we will just take the memory hit. bool EnsureClassAllocationsFinished(/*out*/RedefinitionDataIter* data) REQUIRES_SHARED(art::Locks::mutator_lock_); @@ -222,7 +216,6 @@ class Redefiner { // mirror::Class difficult and confusing. std::string* error_msg_; - // TODO Maybe change jclass to a mirror::Class Redefiner(art::Runtime* runtime, art::Thread* self, std::string* error_msg) @@ -239,7 +232,6 @@ class Redefiner { /*out*/std::string* error_msg) REQUIRES_SHARED(art::Locks::mutator_lock_); - // TODO Put on all the lock qualifiers. jvmtiError Run() REQUIRES_SHARED(art::Locks::mutator_lock_); bool CheckAllRedefinitionAreValid() REQUIRES_SHARED(art::Locks::mutator_lock_); diff --git a/test/645-checker-abs-simd/src/Main.java b/test/645-checker-abs-simd/src/Main.java index 31113503ed..76850abded 100644 --- a/test/645-checker-abs-simd/src/Main.java +++ b/test/645-checker-abs-simd/src/Main.java @@ -22,24 +22,76 @@ public class Main { private static final int SPQUIET = 1 << 22; private static final long DPQUIET = 1L << 51; + /// CHECK-START: void Main.doitInt(int[]) loop_optimization (before) + /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none + /// CHECK-DAG: ArrayGet loop:<<Loop>> outer_loop:none + /// CHECK-DAG: InvokeStaticOrDirect intrinsic:MathAbsInt loop:<<Loop>> outer_loop:none + /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none + // + /// CHECK-START-ARM64: void Main.doitInt(int[]) loop_optimization (after) + /// CHECK-DAG: Phi loop:<<Loop1:B\d+>> outer_loop:none + /// CHECK-DAG: VecLoad loop:<<Loop1>> outer_loop:none + /// CHECK-DAG: VecAbs loop:<<Loop1>> outer_loop:none + /// CHECK-DAG: VecStore loop:<<Loop1>> outer_loop:none + /// CHECK-DAG: Phi loop:<<Loop2:B\d+>> outer_loop:none + /// CHECK-DAG: ArrayGet loop:<<Loop2>> outer_loop:none + /// CHECK-DAG: InvokeStaticOrDirect intrinsic:MathAbsInt loop:<<Loop2>> outer_loop:none + /// CHECK-DAG: ArraySet loop:<<Loop2>> outer_loop:none + // + /// CHECK-EVAL: "<<Loop1>>" != "<<Loop2>>" private static void doitInt(int[] x) { for (int i = 0; i < x.length; i++) { x[i] = Math.abs(x[i]); } } + /// CHECK-START: void Main.doitLong(long[]) loop_optimization (before) + /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none + /// CHECK-DAG: ArrayGet loop:<<Loop>> outer_loop:none + /// CHECK-DAG: InvokeStaticOrDirect intrinsic:MathAbsLong loop:<<Loop>> outer_loop:none + /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none + // + /// CHECK-START-ARM64: void Main.doitLong(long[]) loop_optimization (after) + // + // TODO: Not supported yet. private static void doitLong(long[] x) { for (int i = 0; i < x.length; i++) { x[i] = Math.abs(x[i]); } } + /// CHECK-START: void Main.doitFloat(float[]) loop_optimization (before) + /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none + /// CHECK-DAG: ArrayGet loop:<<Loop>> outer_loop:none + /// CHECK-DAG: InvokeStaticOrDirect intrinsic:MathAbsFloat loop:<<Loop>> outer_loop:none + /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none + // + /// CHECK-START-ARM64: void Main.doitFloat(float[]) loop_optimization (after) + /// CHECK-DAG: Phi loop:<<Loop1:B\d+>> outer_loop:none + /// CHECK-DAG: VecLoad loop:<<Loop1>> outer_loop:none + /// CHECK-DAG: VecAbs loop:<<Loop1>> outer_loop:none + /// CHECK-DAG: VecStore loop:<<Loop1>> outer_loop:none + /// CHECK-DAG: Phi loop:<<Loop2:B\d+>> outer_loop:none + /// CHECK-DAG: ArrayGet loop:<<Loop2>> outer_loop:none + /// CHECK-DAG: InvokeStaticOrDirect intrinsic:MathAbsFloat loop:<<Loop2>> outer_loop:none + /// CHECK-DAG: ArraySet loop:<<Loop2>> outer_loop:none + // + /// CHECK-EVAL: "<<Loop1>>" != "<<Loop2>>" private static void doitFloat(float[] x) { for (int i = 0; i < x.length; i++) { x[i] = Math.abs(x[i]); } } + /// CHECK-START: void Main.doitDouble(double[]) loop_optimization (before) + /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none + /// CHECK-DAG: ArrayGet loop:<<Loop>> outer_loop:none + /// CHECK-DAG: InvokeStaticOrDirect intrinsic:MathAbsDouble loop:<<Loop>> outer_loop:none + /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none + // + /// CHECK-START-ARM64: void Main.doitDouble(double[]) loop_optimization (after) + // + // TODO: Not supported yet. private static void doitDouble(double[] x) { for (int i = 0; i < x.length; i++) { x[i] = Math.abs(x[i]); diff --git a/test/Android.run-test-jvmti-java-library.mk b/test/Android.run-test-jvmti-java-library.mk index 4a5b5c17c0..b6da92b942 100644 --- a/test/Android.run-test-jvmti-java-library.mk +++ b/test/Android.run-test-jvmti-java-library.mk @@ -19,8 +19,8 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # Main shim classes. We use one that exposes the tagging common functionality. -LOCAL_SRC_FILES := \ - 903-hello-tagging/src/art/Main.java \ +LOCAL_MAIN_SHIM := 903-hello-tagging/src/art/Main.java +LOCAL_SRC_FILES := $(LOCAL_MAIN_SHIM) # Actual test classes. LOCAL_SRC_FILES += \ @@ -53,7 +53,58 @@ LOCAL_SRC_FILES += \ 931-agent-thread/src/art/Test931.java \ 933-misc-events/src/art/Test933.java \ +JVMTI_RUN_TEST_GENERATED_NUMBERS := \ + 901 \ + 903 \ + 904 \ + 905 \ + 906 \ + 907 \ + 908 \ + 910 \ + 911 \ + 913 \ + 918 \ + 920 \ + 922 \ + 923 \ + 924 \ + 925 \ + 927 \ + 928 \ + 931 \ + 933 \ + +# Try to enforce that the directories correspond to the Java files we pull in. +JVMTI_RUN_TEST_DIR_CHECK := $(sort $(foreach DIR,$(JVMTI_RUN_TEST_GENERATED_NUMBERS), \ + $(filter $(DIR)%,$(LOCAL_SRC_FILES)))) +ifneq ($(sort $(LOCAL_SRC_FILES)),$(JVMTI_RUN_TEST_DIR_CHECK)) + $(error Missing file, compare $(sort $(LOCAL_SRC_FILES)) with $(JVMTI_RUN_TEST_DIR_CHECK)) +endif + +LOCAL_MODULE_CLASS := JAVA_LIBRARIES LOCAL_MODULE_TAGS := optional LOCAL_JAVA_LANGUAGE_VERSION := 1.8 LOCAL_MODULE := run-test-jvmti-java -include $(BUILD_HOST_JAVA_LIBRARY) + +GENERATED_SRC_DIR := $(call local-generated-sources-dir) +JVMTI_RUN_TEST_GENERATED_FILES := \ + $(foreach NR,$(JVMTI_RUN_TEST_GENERATED_NUMBERS),$(GENERATED_SRC_DIR)/results.$(NR).expected.txt) + +define GEN_JVMTI_RUN_TEST_GENERATED_FILE + +GEN_INPUT := $(wildcard $(LOCAL_PATH)/$(1)*/expected.txt) +GEN_OUTPUT := $(GENERATED_SRC_DIR)/results.$(1).expected.txt +$$(GEN_OUTPUT): $$(GEN_INPUT) + cp $$< $$@ + +GEN_INPUT := +GEN_OUTPUT := + +endef + +$(foreach NR,$(JVMTI_RUN_TEST_GENERATED_NUMBERS),\ + $(eval $(call GEN_JVMTI_RUN_TEST_GENERATED_FILE,$(NR)))) +LOCAL_JAVA_RESOURCE_FILES := $(JVMTI_RUN_TEST_GENERATED_FILES) + +include $(BUILD_JAVA_LIBRARY) diff --git a/test/ti-agent/jni_binder.cc b/test/ti-agent/jni_binder.cc index b66c2c76e9..32236deba4 100644 --- a/test/ti-agent/jni_binder.cc +++ b/test/ti-agent/jni_binder.cc @@ -174,12 +174,7 @@ static jclass FindClassWithClassLoader(JNIEnv* env, const char* class_name, jobj class_loader)); } -// Find the given classname. First try the implied classloader, then the system classloader, -// then use JVMTI to find all classloaders. -static jclass FindClass(jvmtiEnv* jvmti_env, - JNIEnv* env, - const char* class_name, - jobject class_loader) { +jclass FindClass(jvmtiEnv* jvmti_env, JNIEnv* env, const char* class_name, jobject class_loader) { if (class_loader != nullptr) { return FindClassWithClassLoader(env, class_name, class_loader); } diff --git a/test/ti-agent/jni_binder.h b/test/ti-agent/jni_binder.h index 6f96257c75..e998dc561c 100644 --- a/test/ti-agent/jni_binder.h +++ b/test/ti-agent/jni_binder.h @@ -22,6 +22,10 @@ namespace art { +// Find the given classname. First try the implied classloader, then the system classloader, +// then use JVMTI to find all classloaders. +jclass FindClass(jvmtiEnv* jvmti_env, JNIEnv* env, const char* class_name, jobject class_loader); + // Load the class through JNI. Inspect it, find all native methods. Construct the corresponding // mangled name, run dlsym and bind the method. // |