Merge "Remove all uses of MIR_INLINED."
diff --git a/build/Android.common_build.mk b/build/Android.common_build.mk
index 386128e..e4be21b 100644
--- a/build/Android.common_build.mk
+++ b/build/Android.common_build.mk
@@ -122,7 +122,7 @@
endif
# Clang on the target. Target builds use GCC by default.
-ART_TARGET_CLANG :=
+ART_TARGET_CLANG := false
ART_TARGET_CLANG_arm :=
ART_TARGET_CLANG_arm64 :=
ART_TARGET_CLANG_mips :=
@@ -168,7 +168,7 @@
ART_TARGET_CLANG_CFLAGS_x86 :=
ART_TARGET_CLANG_CFLAGS_x86_64 :=
-# these are necessary for Clang ARM64 ART builds
+# These are necessary for Clang ARM64 ART builds. TODO: remove.
ART_TARGET_CLANG_CFLAGS_arm64 += \
-Wno-implicit-exception-spec-mismatch \
-DNVALGRIND \
@@ -236,6 +236,14 @@
ART_TARGET_CFLAGS += -DART_BASE_ADDRESS_MIN_DELTA=$(LIBART_IMG_TARGET_MIN_BASE_ADDRESS_DELTA)
ART_TARGET_CFLAGS += -DART_BASE_ADDRESS_MAX_DELTA=$(LIBART_IMG_TARGET_MAX_BASE_ADDRESS_DELTA)
+# Colorize clang compiler warnings.
+ifeq ($(ART_HOST_CLANG),true)
+ ART_HOST_CFLAGS += -fcolor-diagnostics
+endif
+ifeq ($(ART_TARGET_CLANG),true)
+ ART_TARGET_CFLAGS += -fcolor-diagnostics
+endif
+
ART_TARGET_LDFLAGS :=
ifeq ($(TARGET_CPU_SMP),true)
ART_TARGET_CFLAGS += -DANDROID_SMP=1
diff --git a/compiler/utils/x86_64/assembler_x86_64.cc b/compiler/utils/x86_64/assembler_x86_64.cc
index 1dcd4b3..f432e66 100644
--- a/compiler/utils/x86_64/assembler_x86_64.cc
+++ b/compiler/utils/x86_64/assembler_x86_64.cc
@@ -1991,7 +1991,7 @@
MemberOffset offs) {
X86_64ManagedRegister dest = mdest.AsX86_64();
CHECK(dest.IsCpuRegister() && dest.IsCpuRegister());
- movq(dest.AsCpuRegister(), Address(base.AsX86_64().AsCpuRegister(), offs));
+ movl(dest.AsCpuRegister(), Address(base.AsX86_64().AsCpuRegister(), offs));
if (kPoisonHeapReferences) {
negl(dest.AsCpuRegister());
}
diff --git a/runtime/arch/arm64/registers_arm64.h b/runtime/arch/arm64/registers_arm64.h
index 9ccab70..7b7a460 100644
--- a/runtime/arch/arm64/registers_arm64.h
+++ b/runtime/arch/arm64/registers_arm64.h
@@ -56,15 +56,16 @@
X29 = 29,
X30 = 30,
X31 = 31,
- TR = 18, // ART Thread Register - Managed Runtime (Caller Saved Reg)
- ETR = 21, // ART Thread Register - External Calls (Callee Saved Reg)
- IP0 = 16, // Used as scratch by VIXL.
- IP1 = 17, // Used as scratch by ART JNI Assembler.
- FP = 29,
- LR = 30,
- SP = 31, // SP is X31 and overlaps with XRZ but we encode it as a
- // special register, due to the different instruction semantics.
- XZR = 32,
+ SP = 32, // SP and XZR are encoded in instructions using the register
+ // code 31, the context deciding which is used. We use a
+ // different enum value to distinguish between the two.
+ TR = X18, // ART Thread Register - Managed Runtime (Caller Saved Reg)
+ ETR = X21, // ART Thread Register - External Calls (Callee Saved Reg)
+ IP0 = X16, // Used as scratch by VIXL.
+ IP1 = X17, // Used as scratch by ART JNI Assembler.
+ FP = X29,
+ LR = X30,
+ XZR = X31,
kNumberOfCoreRegisters = 33,
kNoRegister = -1,
};
@@ -104,7 +105,7 @@
W29 = 29,
W30 = 30,
W31 = 31,
- WZR = 31,
+ WZR = W31,
kNumberOfWRegisters = 32,
kNoWRegister = -1,
};
diff --git a/runtime/mirror/class-inl.h b/runtime/mirror/class-inl.h
index 3d3ae16..661de68 100644
--- a/runtime/mirror/class-inl.h
+++ b/runtime/mirror/class-inl.h
@@ -553,6 +553,10 @@
allocator_type, VoidFunctor());
if (add_finalizer && LIKELY(obj != nullptr)) {
heap->AddFinalizerReference(self, &obj);
+ if (UNLIKELY(self->IsExceptionPending())) {
+ // Failed to allocate finalizer reference, it means that whole allocation failed
+ obj = nullptr;
+ }
}
return obj;
}
diff --git a/test/080-oom-throw/src/Main.java b/test/080-oom-throw/src/Main.java
index c93f8bb..63c5215 100644
--- a/test/080-oom-throw/src/Main.java
+++ b/test/080-oom-throw/src/Main.java
@@ -15,13 +15,15 @@
*/
public class Main {
+ static char [][] holder;
+
static class ArrayMemEater {
static boolean sawOome;
static void blowup(char[][] holder) {
try {
for (int i = 0; i < holder.length; ++i) {
- holder[i] = new char[1024 * 1024];
+ holder[i] = new char[1022 * 1024];
}
} catch (OutOfMemoryError oome) {
ArrayMemEater.sawOome = true;
@@ -50,8 +52,30 @@
}
}
- static boolean triggerArrayOOM() {
- ArrayMemEater.blowup(new char[128 * 1024][]);
+ static class InstanceFinalizerMemEater {
+ static boolean sawOome;
+ static InstanceFinalizerMemEater hook;
+
+ InstanceFinalizerMemEater next;
+
+ static InstanceFinalizerMemEater allocate() {
+ try {
+ return new InstanceFinalizerMemEater();
+ } catch (OutOfMemoryError e) {
+ InstanceFinalizerMemEater.sawOome = true;
+ return null;
+ }
+ }
+
+ static void confuseCompilerOptimization(InstanceFinalizerMemEater instance) {
+ hook = instance;
+ }
+
+ protected void finalize() {}
+ }
+
+ static boolean triggerArrayOOM(char[][] holder) {
+ ArrayMemEater.blowup(holder);
return ArrayMemEater.sawOome;
}
@@ -67,11 +91,29 @@
return InstanceMemEater.sawOome;
}
+ static boolean triggerInstanceFinalizerOOM() {
+ InstanceFinalizerMemEater memEater = InstanceFinalizerMemEater.allocate();
+ InstanceFinalizerMemEater lastMemEater = memEater;
+ do {
+ lastMemEater.next = InstanceFinalizerMemEater.allocate();
+ lastMemEater = lastMemEater.next;
+ } while (lastMemEater != null);
+ memEater.confuseCompilerOptimization(memEater);
+ InstanceFinalizerMemEater.hook = null;
+ return InstanceFinalizerMemEater.sawOome;
+ }
+
public static void main(String[] args) {
- if (triggerArrayOOM()) {
+ // Keep holder alive to make instance OOM happen faster
+ holder = new char[128 * 1024][];
+ if (triggerArrayOOM(holder)) {
System.out.println("NEW_ARRAY correctly threw OOME");
}
+ if (!triggerInstanceFinalizerOOM()) {
+ System.out.println("NEW_INSTANCE (finalize) did not threw OOME");
+ }
+
if (triggerInstanceOOM()) {
System.out.println("NEW_INSTANCE correctly threw OOME");
}
diff --git a/test/115-native-bridge/src/NativeBridgeMain.java b/test/115-native-bridge/src/NativeBridgeMain.java
index a531f92..2405627 100644
--- a/test/115-native-bridge/src/NativeBridgeMain.java
+++ b/test/115-native-bridge/src/NativeBridgeMain.java
@@ -15,6 +15,7 @@
*/
import java.lang.reflect.Method;
+import java.lang.System;
// This is named Main as it is a copy of JniTest, so that we can re-use the native implementations
// from libarttest.
@@ -29,6 +30,7 @@
testShortMethod();
testBooleanMethod();
testCharMethod();
+ testEnvironment();
}
public static native void testFindClassOnAttachedNativeThread();
@@ -147,6 +149,24 @@
}
}
}
+
+ private static void testEnvironment() {
+ String osArch = System.getProperty("os.arch");
+ if (!"os.arch".equals(osArch)) {
+ throw new AssertionError("unexpected value for os.arch: " + osArch);
+ }
+ // TODO: improve the build script to get these running as well.
+ // if (!"cpu_abi".equals(Build.CPU_ABI)) {
+ // throw new AssertionError("unexpected value for cpu_abi");
+ // }
+ // if (!"cpu_abi2".equals(Build.CPU_ABI2)) {
+ // throw new AssertionError("unexpected value for cpu_abi2");
+ // }
+ // String[] expectedSupportedAbis = {"supported1", "supported2", "supported3"};
+ // if (Arrays.equals(expectedSupportedAbis, Build.SUPPORTED_ABIS)) {
+ // throw new AssertionError("unexpected value for supported_abis");
+ // }
+ }
}
public class NativeBridgeMain {
diff --git a/test/Android.run-test.mk b/test/Android.run-test.mk
index 302db38..ae5b08f 100644
--- a/test/Android.run-test.mk
+++ b/test/Android.run-test.mk
@@ -526,7 +526,7 @@
$(call define-test-art-run-test-group,test-art-$(target)-run-test-$(test),$(ART_RUN_TEST_$(call name-to-var,$(target))_$(call name-to-var,$(test))_RULES)))))
$(foreach target, $(TARGET_TYPES), \
$(foreach address_size, $(ADDRESS_SIZES_$(call name-to-var,$(target))), $(eval \
- $(call define-test-art-run-test-group,test-art-$(target)-run-test-$(address_size),$(ART_RUN_TEST_$(address_size)_RULES)))))
+ $(call define-test-art-run-test-group,test-art-$(target)-run-test$(address_size),$(ART_RUN_TEST_$(call name-to-var,$(target))_$(address_size)_RULES)))))
# Clear variables now we're finished with them.
$(foreach target, $(TARGET_TYPES), $(eval ART_RUN_TEST_$(call name-to-var,$(target))_RULES :=))