summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--build/Android.gtest.mk2
-rw-r--r--dex2oat/dex2oat_test.cc1
-rw-r--r--dexlayout/dexlayout.cc25
-rw-r--r--runtime/dex_file_annotations.cc17
-rw-r--r--runtime/runtime.cc4
-rw-r--r--test/1929-exception-catch-exception/build20
-rw-r--r--test/992-source-data/expected.txt12
-rw-r--r--test/992-source-data/source_file.cc13
-rw-r--r--test/992-source-data/src/art/Test992.java21
9 files changed, 85 insertions, 30 deletions
diff --git a/build/Android.gtest.mk b/build/Android.gtest.mk
index a1d7ae91d5..1685a5f986 100644
--- a/build/Android.gtest.mk
+++ b/build/Android.gtest.mk
@@ -110,7 +110,7 @@ ART_GTEST_compiler_driver_test_DEX_DEPS := AbstractMethod StaticLeafMethods Prof
ART_GTEST_dex_cache_test_DEX_DEPS := Main Packages MethodTypes
ART_GTEST_dex_file_test_DEX_DEPS := GetMethodSignature Main Nested MultiDex
ART_GTEST_dexlayout_test_DEX_DEPS := ManyMethods
-ART_GTEST_dex2oat_test_DEX_DEPS := $(ART_GTEST_dex2oat_environment_tests_DEX_DEPS) Statics VerifierDeps
+ART_GTEST_dex2oat_test_DEX_DEPS := $(ART_GTEST_dex2oat_environment_tests_DEX_DEPS) ManyMethods Statics VerifierDeps
ART_GTEST_dex2oat_image_test_DEX_DEPS := $(ART_GTEST_dex2oat_environment_tests_DEX_DEPS) Statics VerifierDeps
ART_GTEST_exception_test_DEX_DEPS := ExceptionHandle
ART_GTEST_image_test_DEX_DEPS := ImageLayoutA ImageLayoutB DefaultMethods
diff --git a/dex2oat/dex2oat_test.cc b/dex2oat/dex2oat_test.cc
index 75859ca77f..21768d3126 100644
--- a/dex2oat/dex2oat_test.cc
+++ b/dex2oat/dex2oat_test.cc
@@ -968,6 +968,7 @@ class Dex2oatWatchdogTest : public Dex2oatTest {
std::string swap_location = GetOdexDir() + "/Dex2OatSwapTest.odex.swap";
copy.push_back("--swap-file=" + swap_location);
+ copy.push_back("-j512"); // Excessive idle threads just slow down dex2oat.
GenerateOdexForTest(dex_location,
odex_location,
CompilerFilter::kSpeed,
diff --git a/dexlayout/dexlayout.cc b/dexlayout/dexlayout.cc
index 957fb4944d..731040bc50 100644
--- a/dexlayout/dexlayout.cc
+++ b/dexlayout/dexlayout.cc
@@ -1794,6 +1794,10 @@ int32_t DexLayout::LayoutCodeItems(const DexFile* dex_file,
}
}
+ // Removing duplicate CodeItems may expose other issues with downstream
+ // optimizations such as quickening. But we need to ensure at least the weak
+ // forms of it currently in use do not break layout optimizations.
+ std::map<dex_ir::CodeItem*, uint32_t> original_code_item_offset;
// Total_diff includes diffs generated by clinits, executed, and non-executed methods.
int32_t total_diff = 0;
// The relative placement has no effect on correctness; it is used to ensure
@@ -1812,11 +1816,22 @@ int32_t DexLayout::LayoutCodeItems(const DexFile* dex_file,
dex_ir::CodeItem* code_item = method->GetCodeItem();
if (code_item != nullptr &&
code_items_set.find(code_item) != code_items_set.end()) {
- diff += UnsignedLeb128Size(code_item_offset)
- - UnsignedLeb128Size(code_item->GetOffset());
- code_item->SetOffset(code_item_offset);
- code_item_offset +=
- RoundUp(code_item->GetSize(), kDexCodeItemAlignment);
+ // Compute where the CodeItem was originally laid out.
+ uint32_t original_offset = code_item->GetOffset();
+ auto it = original_code_item_offset.find(code_item);
+ if (it != original_code_item_offset.end()) {
+ original_offset = it->second;
+ } else {
+ original_code_item_offset[code_item] = code_item->GetOffset();
+ // Assign the new offset and move the pointer to allocate space.
+ code_item->SetOffset(code_item_offset);
+ code_item_offset +=
+ RoundUp(code_item->GetSize(), kDexCodeItemAlignment);
+ }
+ // Update the size of the encoded methods to reflect that the offset difference
+ // may have changed the ULEB128 length.
+ diff +=
+ UnsignedLeb128Size(code_item->GetOffset()) - UnsignedLeb128Size(original_offset);
}
}
}
diff --git a/runtime/dex_file_annotations.cc b/runtime/dex_file_annotations.cc
index fe33bded2b..845202ff72 100644
--- a/runtime/dex_file_annotations.cc
+++ b/runtime/dex_file_annotations.cc
@@ -134,8 +134,13 @@ const DexFile::AnnotationSetItem* FindAnnotationSetForField(ArtField* field)
REQUIRES_SHARED(Locks::mutator_lock_) {
const DexFile* dex_file = field->GetDexFile();
ObjPtr<mirror::Class> klass = field->GetDeclaringClass();
+ const DexFile::ClassDef* class_def = klass->GetClassDef();
+ if (class_def == nullptr) {
+ DCHECK(klass->IsProxyClass());
+ return nullptr;
+ }
const DexFile::AnnotationsDirectoryItem* annotations_dir =
- dex_file->GetAnnotationsDirectory(*klass->GetClassDef());
+ dex_file->GetAnnotationsDirectory(*class_def);
if (annotations_dir == nullptr) {
return nullptr;
}
@@ -258,6 +263,9 @@ const uint8_t* SearchEncodedAnnotation(const DexFile& dex_file,
const DexFile::AnnotationSetItem* FindAnnotationSetForMethod(ArtMethod* method)
REQUIRES_SHARED(Locks::mutator_lock_) {
+ if (method->IsProxyMethod()) {
+ return nullptr;
+ }
const DexFile* dex_file = method->GetDexFile();
const DexFile::AnnotationsDirectoryItem* annotations_dir =
dex_file->GetAnnotationsDirectory(method->GetClassDef());
@@ -305,8 +313,13 @@ const DexFile::ParameterAnnotationsItem* FindAnnotationsItemForMethod(ArtMethod*
const DexFile::AnnotationSetItem* FindAnnotationSetForClass(const ClassData& klass)
REQUIRES_SHARED(Locks::mutator_lock_) {
const DexFile& dex_file = klass.GetDexFile();
+ const DexFile::ClassDef* class_def = klass.GetClassDef();
+ if (class_def == nullptr) {
+ DCHECK(klass.GetRealClass()->IsProxyClass());
+ return nullptr;
+ }
const DexFile::AnnotationsDirectoryItem* annotations_dir =
- dex_file.GetAnnotationsDirectory(*klass.GetClassDef());
+ dex_file.GetAnnotationsDirectory(*class_def);
if (annotations_dir == nullptr) {
return nullptr;
}
diff --git a/runtime/runtime.cc b/runtime/runtime.cc
index a9db48716f..ca6547897e 100644
--- a/runtime/runtime.cc
+++ b/runtime/runtime.cc
@@ -513,6 +513,10 @@ void Runtime::Abort(const char* msg) {
UNUSED(old_value);
#endif
+#ifdef ART_TARGET_ANDROID
+ android_set_abort_message(msg);
+#endif
+
// Ensure that we don't have multiple threads trying to abort at once,
// which would result in significantly worse diagnostics.
MutexLock mu(Thread::Current(), *Locks::abort_lock_);
diff --git a/test/1929-exception-catch-exception/build b/test/1929-exception-catch-exception/build
deleted file mode 100644
index 10ffcc537d..0000000000
--- a/test/1929-exception-catch-exception/build
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/bin/bash
-#
-# Copyright 2017 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# See b/65168732
-export USE_D8=false
-
-./default-build "$@"
diff --git a/test/992-source-data/expected.txt b/test/992-source-data/expected.txt
index 4db8df0ada..7f59682b1d 100644
--- a/test/992-source-data/expected.txt
+++ b/test/992-source-data/expected.txt
@@ -1,10 +1,22 @@
class art.Test992 is defined in file "Test992.java"
+class art.Test992 does not have a known source file extension because java.lang.RuntimeException: JVMTI_ERROR_ABSENT_INFORMATION
class art.Test992$Target1 is defined in file "Test992.java"
+class art.Test992$Target1 does not have a known source file extension because java.lang.RuntimeException: JVMTI_ERROR_ABSENT_INFORMATION
class art.Target2 is defined in file "Target2.java"
+class art.Target2 does not have a known source file extension because java.lang.RuntimeException: JVMTI_ERROR_ABSENT_INFORMATION
int does not have a known source file because java.lang.RuntimeException: JVMTI_ERROR_ABSENT_INFORMATION
+int does not have a known source file extension because java.lang.RuntimeException: JVMTI_ERROR_ABSENT_INFORMATION
class java.lang.Integer is defined in file "Integer.java"
+class java.lang.Integer does not have a known source file extension because java.lang.RuntimeException: JVMTI_ERROR_ABSENT_INFORMATION
class java.lang.Object is defined in file "Object.java"
+class java.lang.Object does not have a known source file extension because java.lang.RuntimeException: JVMTI_ERROR_ABSENT_INFORMATION
interface java.lang.Runnable is defined in file "Runnable.java"
+interface java.lang.Runnable does not have a known source file extension because java.lang.RuntimeException: JVMTI_ERROR_ABSENT_INFORMATION
class [Ljava.lang.Object; does not have a known source file because java.lang.RuntimeException: JVMTI_ERROR_ABSENT_INFORMATION
+class [Ljava.lang.Object; does not have a known source file extension because java.lang.RuntimeException: JVMTI_ERROR_ABSENT_INFORMATION
class [I does not have a known source file because java.lang.RuntimeException: JVMTI_ERROR_ABSENT_INFORMATION
+class [I does not have a known source file extension because java.lang.RuntimeException: JVMTI_ERROR_ABSENT_INFORMATION
null does not have a known source file because java.lang.RuntimeException: JVMTI_ERROR_INVALID_CLASS
+null does not have a known source file extension because java.lang.RuntimeException: JVMTI_ERROR_INVALID_CLASS
+Proxy of [interface java.lang.Runnable] does not have a known source file because java.lang.RuntimeException: JVMTI_ERROR_ABSENT_INFORMATION
+Proxy of [interface java.lang.Runnable] does not have a known source file extension because java.lang.RuntimeException: JVMTI_ERROR_ABSENT_INFORMATION
diff --git a/test/992-source-data/source_file.cc b/test/992-source-data/source_file.cc
index 46d197d048..78687ff005 100644
--- a/test/992-source-data/source_file.cc
+++ b/test/992-source-data/source_file.cc
@@ -49,6 +49,19 @@ jstring JNICALL Java_art_Test992_getSourceFileName(JNIEnv* env,
return ret;
}
+extern "C" JNIEXPORT
+jstring JNICALL Java_art_Test992_getSourceDebugExtension(JNIEnv* env,
+ jclass klass ATTRIBUTE_UNUSED,
+ jclass target) {
+ char* ext = nullptr;
+ if (JvmtiErrorToException(env, jvmti_env, jvmti_env->GetSourceDebugExtension(target, &ext))) {
+ return nullptr;
+ }
+ jstring ret = env->NewStringUTF(ext);
+ jvmti_env->Deallocate(reinterpret_cast<unsigned char*>(ext));
+ return ret;
+}
+
} // namespace Test992SourceFile
} // namespace art
diff --git a/test/992-source-data/src/art/Test992.java b/test/992-source-data/src/art/Test992.java
index d9ab112726..cc4f0c724c 100644
--- a/test/992-source-data/src/art/Test992.java
+++ b/test/992-source-data/src/art/Test992.java
@@ -16,6 +16,8 @@
package art;
+import java.lang.reflect.Proxy;
+import java.util.Arrays;
import java.util.Base64;
public class Test992 {
@@ -33,15 +35,30 @@ public class Test992 {
doTest(new Object[0].getClass());
doTest(new int[0].getClass());
doTest(null);
+ doTest(Proxy.getProxyClass(Test992.class.getClassLoader(), Runnable.class));
}
+ public static String printClass(Class<?> k) {
+ if (k != null && Proxy.class.isAssignableFrom(k)) {
+ return String.format("Proxy of %s", Arrays.toString(k.getInterfaces()));
+ } else {
+ return String.format("%s", k);
+ }
+ }
public static void doTest(Class<?> k) {
+ String pk = printClass(k);
+ try {
+ System.out.println(pk + " is defined in file \"" + getSourceFileName(k) + "\"");
+ } catch (Exception e) {
+ System.out.println(pk + " does not have a known source file because " + e);
+ }
try {
- System.out.println(k + " is defined in file \"" + getSourceFileName(k) + "\"");
+ System.out.println(pk + " has extension \"" + getSourceDebugExtension(k) + "\"");
} catch (Exception e) {
- System.out.println(k + " does not have a known source file because " + e);
+ System.out.println(pk + " does not have a known source file extension because " + e);
}
}
public static native String getSourceFileName(Class<?> k) throws Exception;
+ public static native String getSourceDebugExtension(Class<?> k) throws Exception;
}