summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Android.mk42
-rw-r--r--build/Android.common.mk4
-rw-r--r--build/Android.executable.mk7
-rw-r--r--build/Android.libart.mk8
-rw-r--r--build/Android.libarttest.mk4
-rw-r--r--build/Android.test.mk4
-rw-r--r--src/class_linker.cc2
-rw-r--r--src/class_linker_test.cc23
-rw-r--r--src/object.h8
9 files changed, 83 insertions, 19 deletions
diff --git a/Android.mk b/Android.mk
index ae17953..ef8eb75 100644
--- a/Android.mk
+++ b/Android.mk
@@ -76,19 +76,39 @@ tsan-art-host: $(ART_HOST_TEST_DEPENDENCIES)
# "mm test-art-device" to build and run all target tests
.PHONY: test-art-target
-test-art-target: $(ART_TARGET_TEST_DEPENDENCIES)
+test-art-target: test-art-target-gtest test-art-target-oat
+
+.PHONY: test-art-target-sync
+test-art-target-sync: $(ART_TARGET_TEST_DEPENDENCIES)
adb remount
adb sync
- adb shell touch /sdcard/test-art-target
- adb shell rm /sdcard/test-art-target
- # gtest unit tests
- adb shell sh -c "$(foreach file,$(sort $(ART_TARGET_TEST_EXECUTABLES)), /system/bin/$(notdir $(file)) &&) touch /sdcard/test-art-target"
- adb pull /sdcard/test-art-target /tmp/
- rm /tmp/test-art-target # this will cause the make on test failure (since the file will not exist)
- # oatexec test
- adb shell sh -c "oatexecd -Xbootclasspath:/system/framework/core.jar -Xbootimage:/system/framework/boot.oat -classpath /system/framework/art-test-dex-HelloWorld.jar -Ximage:/system/framework/art-test-dex-HelloWorld.oat HelloWorld && touch /sdcard/test-art-target"
- adb pull /sdcard/test-art-target /tmp/
- rm /tmp/test-art-target # this will cause the make on test failure (since the file will not exist)
+
+.PHONY: test-art-target-gtest
+test-art-target-gtest: test-art-target-sync
+ adb shell touch /sdcard/test-art-target-gtest
+ adb shell rm /sdcard/test-art-target-gtest
+ adb shell sh -c "$(foreach file,$(sort $(ART_TARGET_TEST_EXECUTABLES)), /system/bin/$(notdir $(file)) &&) touch /sdcard/test-art-target-gtest"
+ (adb pull /sdcard/test-art-target-gtest /tmp/ && echo test-art-target-gtest PASSED) || echo test-art-target-gtest FAILED
+ $(hide) rm /tmp/test-art-target-gtest
+
+.PHONY: test-art-target-oat
+test-art-target-oat: test-art-target-oat-HelloWorld # test-art-target-oat-Fibonacci
+
+.PHONY: test-art-target-oat-HelloWorld
+test-art-target-oat-HelloWorld: test-art-target-sync
+ adb shell touch /sdcard/test-art-target-oat-HelloWorld
+ adb shell rm /sdcard/test-art-target-oat-HelloWorld
+ adb shell sh -c "oatexecd -Xbootclasspath:/system/framework/core.jar -Xbootimage:/system/framework/boot.oat -classpath /system/framework/art-test-dex-HelloWorld.jar -Ximage:/system/framework/art-test-dex-HelloWorld.oat HelloWorld && touch /sdcard/test-art-target-oat-HelloWorld"
+ (adb pull /sdcard/test-art-target-oat-HelloWorld /tmp/ && echo test-art-target-oat-HelloWorld PASSED) || (echo test-art-target-oat-HelloWorld FAILED && exit 1)
+ $(hide) rm /tmp/test-art-target-oat-HelloWorld
+
+.PHONY: test-art-target-oat-Fibonacci
+test-art-target-oat-Fibonacci: test-art-target-sync
+ adb shell touch /sdcard/test-art-target-oat-Fibonacci
+ adb shell rm /sdcard/test-art-target-oat-Fibonacci
+ adb shell sh -c "oatexecd -Xbootclasspath:/system/framework/core.jar -Xbootimage:/system/framework/boot.oat -classpath /system/framework/art-test-dex-Fibonacci.jar -Ximage:/system/framework/art-test-dex-Fibonacci.oat Fibonacci 10 && touch /sdcard/test-art-target-oat-Fibonacci"
+ (adb pull /sdcard/test-art-target-oat-Fibonacci /tmp/ && echo test-art-target-oat-Fibonacci PASSED) || (echo test-art-target-oat-Fibonacci FAILED && exit 1)
+ $(hide) rm /tmp/test-art-target-oat-Fibonacci
# "mm cpplint-art" to style check art source files
.PHONY: cpplint-art
diff --git a/build/Android.common.mk b/build/Android.common.mk
index 9481df2..c62b038 100644
--- a/build/Android.common.mk
+++ b/build/Android.common.mk
@@ -45,6 +45,10 @@ else
ART_TARGET_CFLAGS += -DANDROID_SMP=0
endif
+art_debug_cflags := -UNDEBUG
+# TODO: move -fkeep-inline-functions to art_debug_cflags when target gcc > 4.4
+ART_HOST_DEBUG_CFLAGS := $(art_debug_cflags) -fkeep-inline-functions
+ART_TARGET_DEBUG_CFLAGS := $(art_debug_cflags)
DEX2OAT_SRC_FILES := \
src/dex2oat.cc
diff --git a/build/Android.executable.mk b/build/Android.executable.mk
index 1b2f41d..60d37ee 100644
--- a/build/Android.executable.mk
+++ b/build/Android.executable.mk
@@ -40,7 +40,12 @@ define build-art-executable
LOCAL_CFLAGS := $(ART_HOST_CFLAGS)
endif
ifeq ($(4),debug)
- LOCAL_CFLAGS += -UNDEBUG
+ ifeq ($(3),target)
+ LOCAL_CFLAGS += $(ART_TARGET_DEBUG_CFLAGS)
+ else
+ LOCAL_CFLAGS += $(ART_HOST_DEBUG_CFLAGS)
+ LOCAL_STATIC_LIBRARIES := libgtest_host
+ endif
endif
LOCAL_C_INCLUDES += $(ART_C_INCLUDES)
LOCAL_SHARED_LIBRARIES := libnativehelper
diff --git a/build/Android.libart.mk b/build/Android.libart.mk
index 96202eb..48ac809 100644
--- a/build/Android.libart.mk
+++ b/build/Android.libart.mk
@@ -38,8 +38,12 @@ define build-libart
else
LOCAL_CFLAGS := $(ART_HOST_CFLAGS)
endif
- ifeq ($(2),debug)
- LOCAL_CFLAGS += -UNDEBUG
+ ifeq ($(4),debug)
+ ifeq ($(3),target)
+ LOCAL_CFLAGS += $(ART_TARGET_DEBUG_CFLAGS)
+ else
+ LOCAL_CFLAGS += $(ART_HOST_DEBUG_CFLAGS)
+ endif
endif
LOCAL_C_INCLUDES += $(ART_C_INCLUDES)
LOCAL_SHARED_LIBRARIES := liblog libnativehelper
diff --git a/build/Android.libarttest.mk b/build/Android.libarttest.mk
index baf37d9..6e1619d 100644
--- a/build/Android.libarttest.mk
+++ b/build/Android.libarttest.mk
@@ -25,10 +25,10 @@ define build-libarttest
LOCAL_MODULE_TAGS := tests
LOCAL_SRC_FILES := $(LIBARTTEST_COMMON_SRC_FILES)
ifeq ($(1),target)
- LOCAL_CFLAGS := $(ART_TARGET_CFLAGS) -UNDEBUG
+ LOCAL_CFLAGS := $(ART_TARGET_CFLAGS) $(ART_TARGET_DEBUG_CFLAGS)
LOCAL_SHARED_LIBRARIES := libdl libstlport
else
- LOCAL_CFLAGS := $(ART_HOST_CFLAGS) -UNDEBUG
+ LOCAL_CFLAGS := $(ART_HOST_CFLAGS) $(ART_HOST_DEBUG_CFLAGS)
LOCAL_LDLIBS := -ldl -lrt
endif
ifeq ($(1),target)
diff --git a/build/Android.test.mk b/build/Android.test.mk
index 798a69f..6e82b26 100644
--- a/build/Android.test.mk
+++ b/build/Android.test.mk
@@ -31,11 +31,11 @@ define build-art-test
LOCAL_C_INCLUDES += $(ART_C_INCLUDES)
LOCAL_SHARED_LIBRARIES := libarttest libartd
ifeq ($(1),target)
- LOCAL_CFLAGS := $(ART_TARGET_CFLAGS) -UNDEBUG
+ LOCAL_CFLAGS := $(ART_TARGET_CFLAGS) $(ART_TARGET_DEBUG_CFLAGS)
LOCAL_SHARED_LIBRARIES += libdl libicuuc libicui18n libnativehelper libstlport libz
LOCAL_STATIC_LIBRARIES := libgtest libgtest_main
else
- LOCAL_CFLAGS := $(ART_HOST_CFLAGS) -UNDEBUG
+ LOCAL_CFLAGS := $(ART_HOST_CFLAGS) $(ART_HOST_DEBUG_CFLAGS)
LOCAL_SHARED_LIBRARIES += libicuuc-host libicui18n-host libnativehelper libz-host
LOCAL_WHOLE_STATIC_LIBRARIES := libgtest_host libgtest_main_host
endif
diff --git a/src/class_linker.cc b/src/class_linker.cc
index f25bac0..dde29cf 100644
--- a/src/class_linker.cc
+++ b/src/class_linker.cc
@@ -1718,7 +1718,7 @@ bool ClassLinker::LinkInterfaceMethods(Class* klass) {
}
klass->SetIfTable(iftable);
CHECK_EQ(idx, ifcount);
- if (klass->IsInterface() || super_ifcount == ifcount) {
+ if (klass->IsInterface()) {
return true;
}
std::vector<Method*> miranda_list;
diff --git a/src/class_linker_test.cc b/src/class_linker_test.cc
index eab184e..4b48892 100644
--- a/src/class_linker_test.cc
+++ b/src/class_linker_test.cc
@@ -54,6 +54,9 @@ class ClassLinkerTest : public CommonTest {
EXPECT_EQ(0U, primitive->NumInstanceFields());
EXPECT_EQ(0U, primitive->NumStaticFields());
EXPECT_EQ(0U, primitive->NumInterfaces());
+ EXPECT_TRUE(primitive->GetVTable() == NULL);
+ EXPECT_EQ(0, primitive->GetIfTableCount());
+ EXPECT_TRUE(primitive->GetIfTable() == NULL);
}
void AssertArrayClass(const StringPiece& array_descriptor,
@@ -95,6 +98,12 @@ class ClassLinkerTest : public CommonTest {
EXPECT_EQ(0U, array->NumInstanceFields());
EXPECT_EQ(0U, array->NumStaticFields());
EXPECT_EQ(2U, array->NumInterfaces());
+ EXPECT_TRUE(array->GetVTable() != NULL);
+ EXPECT_EQ(2, array->GetIfTableCount());
+ ObjectArray<InterfaceEntry>* iftable = array->GetIfTable();
+ ASSERT_TRUE(iftable != NULL);
+ EXPECT_TRUE(iftable->Get(0)->GetInterface()->GetDescriptor()->Equals("Ljava/lang/Cloneable;"));
+ EXPECT_TRUE(iftable->Get(1)->GetInterface()->GetDescriptor()->Equals("Ljava/io/Serializable;"));
}
void AssertMethod(Class* klass, Method* method) {
@@ -159,6 +168,20 @@ class ClassLinkerTest : public CommonTest {
EXPECT_NE(0U, klass->NumDirectMethods());
}
}
+ EXPECT_EQ(klass->IsInterface(), klass->GetVTable() == NULL);
+ for (int i = 0; i < klass->GetIfTableCount(); i++) {
+ const InterfaceEntry* interface_entry = klass->GetIfTable()->Get(i);
+ ASSERT_TRUE(interface_entry != NULL);
+ Class* interface = interface_entry->GetInterface();
+ ASSERT_TRUE(interface != NULL);
+ EXPECT_TRUE(interface_entry->GetInterface() != NULL);
+ if (klass->IsInterface()) {
+ EXPECT_EQ(0U, interface_entry->GetMethodArrayCount());
+ } else {
+ CHECK_EQ(interface->NumVirtualMethods(), interface_entry->GetMethodArrayCount());
+ EXPECT_EQ(interface->NumVirtualMethods(), interface_entry->GetMethodArrayCount());
+ }
+ }
if (klass->IsAbstract()) {
EXPECT_FALSE(klass->IsFinal());
} else {
diff --git a/src/object.h b/src/object.h
index 2f9ea33..5e09f2e 100644
--- a/src/object.h
+++ b/src/object.h
@@ -2683,6 +2683,14 @@ class MANAGED InterfaceEntry : public ObjectArray<Object> {
Set(kInterface, interface);
}
+ size_t GetMethodArrayCount() const {
+ ObjectArray<Method>* method_array = down_cast<ObjectArray<Method>*>(Get(kMethodArray));
+ if (method_array == 0) {
+ return 0;
+ }
+ return method_array->GetLength();
+ }
+
ObjectArray<Method>* GetMethodArray() const {
ObjectArray<Method>* method_array = down_cast<ObjectArray<Method>*>(Get(kMethodArray));
DCHECK(method_array != NULL);