blob: cbfc2ae948a334bfbe9a683d3b3da34ff46a50ba [file] [log] [blame]
Elliott Hughes2faa5f12012-01-30 14:42:07 -08001/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
buzbeec143c552011-08-20 17:38:58 -070016
Ian Rogers1212a022013-03-04 10:48:41 -080017#include "compiler/driver/compiler_driver.h"
Elliott Hughes90a33692011-08-30 13:27:07 -070018
19#include <stdint.h>
20#include <stdio.h>
21
22#include "UniquePtr.h"
buzbeec143c552011-08-20 17:38:58 -070023#include "class_linker.h"
24#include "common_test.h"
25#include "dex_file.h"
26#include "heap.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080027#include "mirror/class.h"
28#include "mirror/class-inl.h"
29#include "mirror/dex_cache.h"
30#include "mirror/abstract_method-inl.h"
31#include "mirror/object_array-inl.h"
buzbeec143c552011-08-20 17:38:58 -070032
33namespace art {
34
Ian Rogers1212a022013-03-04 10:48:41 -080035class CompilerDriverTest : public CommonTest {
Brian Carlstrombffb1552011-08-25 12:23:53 -070036 protected:
Ian Rogersb726dcb2012-09-05 08:57:23 -070037 void CompileAll(jobject class_loader) LOCKS_EXCLUDED(Locks::mutator_lock_) {
Ian Rogers1212a022013-03-04 10:48:41 -080038 compiler_driver_->CompileAll(class_loader, Runtime::Current()->GetCompileTimeClassPath(class_loader));
Elliott Hughes1240dad2011-09-09 16:24:50 -070039 MakeAllExecutable(class_loader);
40 }
41
Ian Rogers00f7d0e2012-07-19 15:28:27 -070042 void EnsureCompiled(jobject class_loader, const char* class_name, const char* method,
43 const char* signature, bool is_virtual)
Ian Rogersb726dcb2012-09-05 08:57:23 -070044 LOCKS_EXCLUDED(Locks::mutator_lock_) {
Elliott Hughes1240dad2011-09-09 16:24:50 -070045 CompileAll(class_loader);
Ian Rogers00f7d0e2012-07-19 15:28:27 -070046 Thread::Current()->TransitionFromSuspendedToRunnable();
Brian Carlstrombd86bcc2013-03-10 20:26:16 -070047 bool started = runtime_->Start();
48 CHECK(started);
Elliott Hughes1240dad2011-09-09 16:24:50 -070049 env_ = Thread::Current()->GetJniEnv();
50 class_ = env_->FindClass(class_name);
51 CHECK(class_ != NULL) << "Class not found: " << class_name;
Shih-wei Liao303b01e2011-09-14 00:46:13 -070052 if (is_virtual) {
53 mid_ = env_->GetMethodID(class_, method, signature);
54 } else {
55 mid_ = env_->GetStaticMethodID(class_, method, signature);
56 }
Elliott Hughes1240dad2011-09-09 16:24:50 -070057 CHECK(mid_ != NULL) << "Method not found: " << class_name << "." << method << signature;
58 }
59
Ian Rogers00f7d0e2012-07-19 15:28:27 -070060 void MakeAllExecutable(jobject class_loader) {
Brian Carlstromaded5f72011-10-07 17:15:04 -070061 const std::vector<const DexFile*>& class_path
Elliott Hughesb3bd5f02012-03-08 21:05:27 -080062 = Runtime::Current()->GetCompileTimeClassPath(class_loader);
Elliott Hughes1240dad2011-09-09 16:24:50 -070063 for (size_t i = 0; i != class_path.size(); ++i) {
64 const DexFile* dex_file = class_path[i];
65 CHECK(dex_file != NULL);
66 MakeDexFileExecutable(class_loader, *dex_file);
67 }
68 }
69
Ian Rogers00f7d0e2012-07-19 15:28:27 -070070 void MakeDexFileExecutable(jobject class_loader, const DexFile& dex_file) {
Elliott Hughes1240dad2011-09-09 16:24:50 -070071 ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
72 for (size_t i = 0; i < dex_file.NumClassDefs(); i++) {
73 const DexFile::ClassDef& class_def = dex_file.GetClassDef(i);
74 const char* descriptor = dex_file.GetClassDescriptor(class_def);
Ian Rogers00f7d0e2012-07-19 15:28:27 -070075 ScopedObjectAccess soa(Thread::Current());
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080076 mirror::Class* c = class_linker->FindClass(descriptor, soa.Decode<mirror::ClassLoader*>(class_loader));
Elliott Hughes1240dad2011-09-09 16:24:50 -070077 CHECK(c != NULL);
78 for (size_t i = 0; i < c->NumDirectMethods(); i++) {
Brian Carlstrom3320cf42011-10-04 14:58:28 -070079 MakeExecutable(c->GetDirectMethod(i));
Elliott Hughes1240dad2011-09-09 16:24:50 -070080 }
81 for (size_t i = 0; i < c->NumVirtualMethods(); i++) {
Brian Carlstrom3320cf42011-10-04 14:58:28 -070082 MakeExecutable(c->GetVirtualMethod(i));
Elliott Hughes1240dad2011-09-09 16:24:50 -070083 }
84 }
85 }
86
Elliott Hughes1240dad2011-09-09 16:24:50 -070087 JNIEnv* env_;
88 jclass class_;
89 jmethodID mid_;
buzbeec143c552011-08-20 17:38:58 -070090};
91
Brian Carlstrom7540ff42011-09-04 16:38:46 -070092// Disabled due to 10 second runtime on host
Ian Rogers1212a022013-03-04 10:48:41 -080093TEST_F(CompilerDriverTest, DISABLED_LARGE_CompileDexLibCore) {
Elliott Hughes1240dad2011-09-09 16:24:50 -070094 CompileAll(NULL);
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -070095
96 // All libcore references should resolve
Ian Rogers00f7d0e2012-07-19 15:28:27 -070097 ScopedObjectAccess soa(Thread::Current());
Brian Carlstroma004aa92012-02-08 18:05:09 -080098 const DexFile* dex = java_lang_dex_file_;
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080099 mirror::DexCache* dex_cache = class_linker_->FindDexCache(*dex);
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700100 EXPECT_EQ(dex->NumStringIds(), dex_cache->NumStrings());
101 for (size_t i = 0; i < dex_cache->NumStrings(); i++) {
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800102 const mirror::String* string = dex_cache->GetResolvedString(i);
Brian Carlstrom7540ff42011-09-04 16:38:46 -0700103 EXPECT_TRUE(string != NULL) << "string_idx=" << i;
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700104 }
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700105 EXPECT_EQ(dex->NumTypeIds(), dex_cache->NumResolvedTypes());
106 for (size_t i = 0; i < dex_cache->NumResolvedTypes(); i++) {
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800107 mirror::Class* type = dex_cache->GetResolvedType(i);
Brian Carlstrom7540ff42011-09-04 16:38:46 -0700108 EXPECT_TRUE(type != NULL) << "type_idx=" << i
109 << " " << dex->GetTypeDescriptor(dex->GetTypeId(i));
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700110 }
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700111 EXPECT_EQ(dex->NumMethodIds(), dex_cache->NumResolvedMethods());
112 for (size_t i = 0; i < dex_cache->NumResolvedMethods(); i++) {
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800113 mirror::AbstractMethod* method = dex_cache->GetResolvedMethod(i);
Brian Carlstrom7540ff42011-09-04 16:38:46 -0700114 EXPECT_TRUE(method != NULL) << "method_idx=" << i
Brian Carlstrom6b4ef022011-10-23 14:59:04 -0700115 << " " << dex->GetMethodDeclaringClassDescriptor(dex->GetMethodId(i))
Brian Carlstrom7540ff42011-09-04 16:38:46 -0700116 << " " << dex->GetMethodName(dex->GetMethodId(i));
Shih-wei Liaoc486c112011-09-13 16:43:52 -0700117 EXPECT_TRUE(method->GetCode() != NULL) << "method_idx=" << i
118 << " "
Brian Carlstrom6b4ef022011-10-23 14:59:04 -0700119 << dex->GetMethodDeclaringClassDescriptor(dex->GetMethodId(i))
Shih-wei Liaoc486c112011-09-13 16:43:52 -0700120 << " " << dex->GetMethodName(dex->GetMethodId(i));
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700121 }
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700122 EXPECT_EQ(dex->NumFieldIds(), dex_cache->NumResolvedFields());
123 for (size_t i = 0; i < dex_cache->NumResolvedFields(); i++) {
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800124 mirror::Field* field = dex_cache->GetResolvedField(i);
Brian Carlstrom7540ff42011-09-04 16:38:46 -0700125 EXPECT_TRUE(field != NULL) << "field_idx=" << i
Brian Carlstrom6b4ef022011-10-23 14:59:04 -0700126 << " " << dex->GetFieldDeclaringClassDescriptor(dex->GetFieldId(i))
Brian Carlstrom7540ff42011-09-04 16:38:46 -0700127 << " " << dex->GetFieldName(dex->GetFieldId(i));
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700128 }
129
Brian Carlstrom83db7722011-08-26 17:32:56 -0700130 // TODO check Class::IsVerified for all classes
131
132 // TODO: check that all Method::GetCode() values are non-null
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700133}
134
Ian Rogers1212a022013-03-04 10:48:41 -0800135TEST_F(CompilerDriverTest, AbstractMethodErrorStub) {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800136 TEST_DISABLED_FOR_PORTABLE();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700137 jobject class_loader;
138 {
139 ScopedObjectAccess soa(Thread::Current());
140 CompileVirtualMethod(NULL, "java.lang.Class", "isFinalizable", "()Z");
141 CompileDirectMethod(NULL, "java.lang.Object", "<init>", "()V");
142 class_loader = LoadDex("AbstractMethod");
143 }
144 ASSERT_TRUE(class_loader != NULL);
145 EnsureCompiled(class_loader, "AbstractClass", "foo", "()V", true);
Shih-wei Liao303b01e2011-09-14 00:46:13 -0700146
Ian Rogersa0841a82011-09-22 14:16:31 -0700147 // Create a jobj_ of ConcreteClass, NOT AbstractClass.
148 jclass c_class = env_->FindClass("ConcreteClass");
149 jmethodID constructor = env_->GetMethodID(c_class, "<init>", "()V");
150 jobject jobj_ = env_->NewObject(c_class, constructor);
Shih-wei Liao303b01e2011-09-14 00:46:13 -0700151 ASSERT_TRUE(jobj_ != NULL);
152
Brian Carlstrom3320cf42011-10-04 14:58:28 -0700153 // Force non-virtual call to AbstractClass foo, will throw AbstractMethodError exception.
Shih-wei Liao303b01e2011-09-14 00:46:13 -0700154 env_->CallNonvirtualVoidMethod(jobj_, class_, mid_);
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700155 EXPECT_EQ(env_->ExceptionCheck(), JNI_TRUE);
156 jthrowable exception = env_->ExceptionOccurred();
157 env_->ExceptionClear();
158 jclass jlame = env_->FindClass("java/lang/AbstractMethodError");
159 EXPECT_TRUE(env_->IsInstanceOf(exception, jlame));
Ian Rogersa0841a82011-09-22 14:16:31 -0700160 Thread::Current()->ClearException();
Shih-wei Liao303b01e2011-09-14 00:46:13 -0700161}
162
buzbee2a475e72011-09-07 17:19:17 -0700163// TODO: need check-cast test (when stub complete & we can throw/catch
164
buzbeec143c552011-08-20 17:38:58 -0700165} // namespace art