blob: 2c233401d21534fd4577067e0ac00e15ed959eba [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 */
Brian Carlstrom934486c2011-07-12 23:42:50 -070016
Brian Carlstromfc0e3212013-07-17 14:40:12 -070017#ifndef ART_RUNTIME_COMMON_TEST_H_
18#define ART_RUNTIME_COMMON_TEST_H_
19
Brian Carlstromb0460ea2011-07-29 10:08:05 -070020#include <dirent.h>
Elliott Hughes0af55432011-08-17 18:37:28 -070021#include <dlfcn.h>
Brian Carlstrom27ec9612011-09-19 20:20:38 -070022#include <sys/mman.h>
Brian Carlstromb0460ea2011-07-29 10:08:05 -070023#include <sys/stat.h>
24#include <sys/types.h>
25
Elliott Hughesf66330a2012-12-12 17:27:00 -080026#include "../../external/icu4c/common/unicode/uvernum.h"
Elliott Hughes76160052012-12-12 16:31:20 -080027#include "base/macros.h"
Elliott Hughes1aa246d2012-12-13 09:29:36 -080028#include "base/stl_util.h"
Elliott Hughese222ee02012-12-13 14:41:43 -080029#include "base/stringprintf.h"
Elliott Hughes76160052012-12-12 16:31:20 -080030#include "base/unix_file/fd_file.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070031#include "class_linker.h"
Ian Rogers1212a022013-03-04 10:48:41 -080032#include "compiler/driver/compiler_driver.h"
Ian Rogers4f6ad8a2013-03-18 15:27:28 -070033#include "dex_file-inl.h"
Ian Rogers1d54e732013-05-02 21:10:01 -070034#include "gc/heap.h"
Elliott Hughes90a33692011-08-30 13:27:07 -070035#include "gtest/gtest.h"
Elliott Hughes0f3c5532012-03-30 14:51:51 -070036#include "instruction_set.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080037#include "mirror/class_loader.h"
Brian Carlstrom3320cf42011-10-04 14:58:28 -070038#include "oat_file.h"
Ian Rogers6d4d9fc2011-11-30 16:24:48 -080039#include "object_utils.h"
Brian Carlstrom33f741e2011-10-03 11:24:05 -070040#include "os.h"
Brian Carlstrom1f870082011-08-23 16:02:11 -070041#include "runtime.h"
Jeff Hao58df3272013-04-22 15:28:53 -070042#include "runtime_support.h"
Ian Rogers00f7d0e2012-07-19 15:28:27 -070043#include "scoped_thread_state_change.h"
Elliott Hughese222ee02012-12-13 14:41:43 -080044#include "ScopedLocalRef.h"
Elliott Hughes90a33692011-08-30 13:27:07 -070045#include "thread.h"
Elliott Hughes0f3c5532012-03-30 14:51:51 -070046#include "UniquePtr.h"
Ian Rogers00f7d0e2012-07-19 15:28:27 -070047#include "well_known_classes.h"
Elliott Hughes0af55432011-08-17 18:37:28 -070048
Brian Carlstrom934486c2011-07-12 23:42:50 -070049namespace art {
50
Brian Carlstromb9cc1ca2012-01-27 00:57:42 -080051static const byte kBase64Map[256] = {
52 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
53 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
54 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
55 255, 255, 255, 255, 255, 255, 255, 62, 255, 255, 255, 63,
56 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 255, 255,
57 255, 254, 255, 255, 255, 0, 1, 2, 3, 4, 5, 6,
Brian Carlstrom7934ac22013-07-26 10:54:15 -070058 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, // NOLINT
59 19, 20, 21, 22, 23, 24, 25, 255, 255, 255, 255, 255, // NOLINT
Brian Carlstromb9cc1ca2012-01-27 00:57:42 -080060 255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36,
Brian Carlstrom7934ac22013-07-26 10:54:15 -070061 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, // NOLINT
62 49, 50, 51, 255, 255, 255, 255, 255, 255, 255, 255, 255, // NOLINT
Brian Carlstromb9cc1ca2012-01-27 00:57:42 -080063 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
64 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
65 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
66 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
67 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
68 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
69 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
70 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
71 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
72 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
73 255, 255, 255, 255
74};
75
76byte* DecodeBase64(const char* src, size_t* dst_size) {
77 std::vector<byte> tmp;
Elliott Hughesa21039c2012-06-21 12:09:25 -070078 uint32_t t = 0, y = 0;
Brian Carlstromb9cc1ca2012-01-27 00:57:42 -080079 int g = 3;
80 for (size_t i = 0; src[i] != '\0'; ++i) {
81 byte c = kBase64Map[src[i] & 0xFF];
82 if (c == 255) continue;
83 // the final = symbols are read and used to trim the remaining bytes
84 if (c == 254) {
85 c = 0;
86 // prevent g < 0 which would potentially allow an overflow later
87 if (--g < 0) {
Brian Carlstrom51477332012-03-25 20:20:26 -070088 *dst_size = 0;
Brian Carlstromb9cc1ca2012-01-27 00:57:42 -080089 return NULL;
90 }
91 } else if (g != 3) {
92 // we only allow = to be at the end
Brian Carlstrom51477332012-03-25 20:20:26 -070093 *dst_size = 0;
Brian Carlstromb9cc1ca2012-01-27 00:57:42 -080094 return NULL;
95 }
96 t = (t << 6) | c;
97 if (++y == 4) {
98 tmp.push_back((t >> 16) & 255);
99 if (g > 1) {
100 tmp.push_back((t >> 8) & 255);
101 }
102 if (g > 2) {
103 tmp.push_back(t & 255);
104 }
105 y = t = 0;
106 }
107 }
108 if (y != 0) {
Brian Carlstrom51477332012-03-25 20:20:26 -0700109 *dst_size = 0;
Brian Carlstromb9cc1ca2012-01-27 00:57:42 -0800110 return NULL;
111 }
112 UniquePtr<byte[]> dst(new byte[tmp.size()]);
113 if (dst_size != NULL) {
114 *dst_size = tmp.size();
Brian Carlstrom51477332012-03-25 20:20:26 -0700115 } else {
116 *dst_size = 0;
Brian Carlstromb9cc1ca2012-01-27 00:57:42 -0800117 }
118 std::copy(tmp.begin(), tmp.end(), dst.get());
119 return dst.release();
120}
121
Brian Carlstromdb4d5402011-08-09 12:18:28 -0700122class ScratchFile {
123 public:
124 ScratchFile() {
Elliott Hughes34023802011-08-30 12:06:17 -0700125 filename_ = getenv("ANDROID_DATA");
126 filename_ += "/TmpFile-XXXXXX";
Elliott Hughes76160052012-12-12 16:31:20 -0800127 int fd = mkstemp(&filename_[0]);
128 CHECK_NE(-1, fd);
129 file_.reset(new File(fd, GetFilename()));
Brian Carlstromdb4d5402011-08-09 12:18:28 -0700130 }
131
132 ~ScratchFile() {
Elliott Hughes34023802011-08-30 12:06:17 -0700133 int unlink_result = unlink(filename_.c_str());
Brian Carlstromdb4d5402011-08-09 12:18:28 -0700134 CHECK_EQ(0, unlink_result);
Brian Carlstromdb4d5402011-08-09 12:18:28 -0700135 }
136
Brian Carlstroma004aa92012-02-08 18:05:09 -0800137 const std::string& GetFilename() const {
138 return filename_;
Brian Carlstromdb4d5402011-08-09 12:18:28 -0700139 }
140
Elliott Hughes234da572011-11-03 22:13:06 -0700141 File* GetFile() const {
142 return file_.get();
143 }
144
Brian Carlstromdb4d5402011-08-09 12:18:28 -0700145 int GetFd() const {
Elliott Hughes76160052012-12-12 16:31:20 -0800146 return file_->Fd();
Brian Carlstromdb4d5402011-08-09 12:18:28 -0700147 }
148
149 private:
Elliott Hughes34023802011-08-30 12:06:17 -0700150 std::string filename_;
Elliott Hughes234da572011-11-03 22:13:06 -0700151 UniquePtr<File> file_;
Brian Carlstromdb4d5402011-08-09 12:18:28 -0700152};
153
Brian Carlstromf734cf52011-08-17 16:28:14 -0700154class CommonTest : public testing::Test {
Brian Carlstrom9baa4ae2011-09-01 21:14:14 -0700155 public:
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800156 static void MakeExecutable(const mirror::ByteArray* code_array) {
Brian Carlstrom3320cf42011-10-04 14:58:28 -0700157 CHECK(code_array != NULL);
158 MakeExecutable(code_array->GetData(), code_array->GetLength());
159 }
160
Shih-wei Liao1cb0ae72012-03-16 15:30:19 -0700161 static void MakeExecutable(const std::vector<uint8_t>& code) {
Brian Carlstrom3320cf42011-10-04 14:58:28 -0700162 CHECK_NE(code.size(), 0U);
163 MakeExecutable(&code[0], code.size());
164 }
165
Brian Carlstromae826982011-11-09 01:33:42 -0800166 // Create an OatMethod based on pointers (for unit tests)
167 OatFile::OatMethod CreateOatMethod(const void* code,
168 const size_t frame_size_in_bytes,
169 const uint32_t core_spill_mask,
170 const uint32_t fp_spill_mask,
171 const uint32_t* mapping_table,
172 const uint16_t* vmap_table,
Jeff Hao74180ca2013-03-27 15:29:11 -0700173 const uint8_t* gc_map) {
Brian Carlstromae826982011-11-09 01:33:42 -0800174 return OatFile::OatMethod(NULL,
175 reinterpret_cast<uint32_t>(code),
176 frame_size_in_bytes,
177 core_spill_mask,
178 fp_spill_mask,
179 reinterpret_cast<uint32_t>(mapping_table),
180 reinterpret_cast<uint32_t>(vmap_table),
Brian Carlstromdf629502013-07-17 22:39:56 -0700181 reinterpret_cast<uint32_t>(gc_map));
Brian Carlstromae826982011-11-09 01:33:42 -0800182 }
183
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800184 void MakeExecutable(mirror::AbstractMethod* method) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Brian Carlstrom3320cf42011-10-04 14:58:28 -0700185 CHECK(method != NULL);
Jeff Hao74180ca2013-03-27 15:29:11 -0700186 LOG(INFO) << "MakeExecutable " << PrettyMethod(method);
Brian Carlstrom3320cf42011-10-04 14:58:28 -0700187
Ian Rogersf3e98552013-03-20 15:49:49 -0700188 const CompiledMethod* compiled_method = NULL;
Brian Carlstrom3320cf42011-10-04 14:58:28 -0700189 if (!method->IsAbstract()) {
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800190 const mirror::DexCache* dex_cache = method->GetDeclaringClass()->GetDexCache();
Ian Rogers4445a7e2012-10-05 17:19:13 -0700191 const DexFile& dex_file = *dex_cache->GetDexFile();
Ian Rogersf3e98552013-03-20 15:49:49 -0700192 compiled_method =
Brian Carlstrom51c24672013-07-11 16:00:56 -0700193 compiler_driver_->GetCompiledMethod(MethodReference(&dex_file,
194 method->GetDexMethodIndex()));
Logan Chienf7015fd2012-03-18 01:19:37 +0800195
Anwar Ghuloumc4f105d2013-04-10 16:12:11 -0700196#ifndef ART_LIGHT_MODE
Ian Rogersf3e98552013-03-20 15:49:49 -0700197 CHECK(compiled_method != NULL) << PrettyMethod(method);
198#endif
199 }
200 if (compiled_method != NULL) {
Logan Chien971bf3f2012-05-01 15:47:55 +0800201 const std::vector<uint8_t>& code = compiled_method->GetCode();
202 MakeExecutable(code);
203 const void* method_code = CompiledMethod::CodePointer(&code[0],
204 compiled_method->GetInstructionSet());
Brian Carlstrom3320cf42011-10-04 14:58:28 -0700205 LOG(INFO) << "MakeExecutable " << PrettyMethod(method) << " code=" << method_code;
Brian Carlstromae826982011-11-09 01:33:42 -0800206 OatFile::OatMethod oat_method = CreateOatMethod(method_code,
207 compiled_method->GetFrameSizeInBytes(),
208 compiled_method->GetCoreSpillMask(),
209 compiled_method->GetFpSpillMask(),
210 &compiled_method->GetMappingTable()[0],
211 &compiled_method->GetVmapTable()[0],
Jeff Hao74180ca2013-03-27 15:29:11 -0700212 NULL);
Brian Carlstrom265091e2013-01-30 14:08:26 -0800213 oat_method.LinkMethod(method);
Brian Carlstrom3320cf42011-10-04 14:58:28 -0700214 } else {
Ian Rogersf3e98552013-03-20 15:49:49 -0700215 const void* method_code;
216 if (method->IsAbstract()) {
Jeff Hao79fe5392013-04-24 18:41:58 -0700217 method_code = GetAbstractMethodErrorStub();
Ian Rogersf3e98552013-03-20 15:49:49 -0700218 } else {
219 // No code? You must mean to go into the interpreter.
220 method_code = GetInterpreterEntryPoint();
221 }
Brian Carlstrom3320cf42011-10-04 14:58:28 -0700222 LOG(INFO) << "MakeExecutable " << PrettyMethod(method) << " code=" << method_code;
Brian Carlstromae826982011-11-09 01:33:42 -0800223 OatFile::OatMethod oat_method = CreateOatMethod(method_code,
224 kStackAlignment,
225 0,
226 0,
227 NULL,
228 NULL,
Jeff Hao74180ca2013-03-27 15:29:11 -0700229 NULL);
Brian Carlstrom265091e2013-01-30 14:08:26 -0800230 oat_method.LinkMethod(method);
Brian Carlstrom3320cf42011-10-04 14:58:28 -0700231 }
232 }
233
234 static void MakeExecutable(const void* code_start, size_t code_length) {
235 CHECK(code_start != NULL);
236 CHECK_NE(code_length, 0U);
237 uintptr_t data = reinterpret_cast<uintptr_t>(code_start);
Brian Carlstrom9baa4ae2011-09-01 21:14:14 -0700238 uintptr_t base = RoundDown(data, kPageSize);
Brian Carlstrom3320cf42011-10-04 14:58:28 -0700239 uintptr_t limit = RoundUp(data + code_length, kPageSize);
Brian Carlstrom9baa4ae2011-09-01 21:14:14 -0700240 uintptr_t len = limit - base;
241 int result = mprotect(reinterpret_cast<void*>(base), len, PROT_READ | PROT_WRITE | PROT_EXEC);
Brian Carlstrom7a00a3c2012-01-25 18:38:03 -0800242 CHECK_EQ(result, 0);
Shih-wei Liao24782c62012-01-08 12:46:11 -0800243
Ian Rogers16341552011-10-10 11:33:06 -0700244 // Flush instruction cache
Shih-wei Liao24782c62012-01-08 12:46:11 -0800245 // Only uses __builtin___clear_cache if GCC >= 4.3.3
246#if GCC_VERSION >= 40303
Ian Rogers16341552011-10-10 11:33:06 -0700247 __builtin___clear_cache(reinterpret_cast<void*>(base), reinterpret_cast<void*>(base + len));
Brian Carlstrom7a00a3c2012-01-25 18:38:03 -0800248#else
Brian Carlstrom6f485c62013-07-18 15:35:35 -0700249 LOG(FATAL) << "UNIMPLEMENTED: cache flush";
Shih-wei Liao24782c62012-01-08 12:46:11 -0800250#endif
Brian Carlstrom9baa4ae2011-09-01 21:14:14 -0700251 }
252
Elliott Hughes76160052012-12-12 16:31:20 -0800253 static void SetEnvironmentVariables(std::string& android_data) {
254 if (IsHost()) {
Elliott Hughes0af55432011-08-17 18:37:28 -0700255 // $ANDROID_ROOT is set on the device, but not on the host.
256 // We need to set this so that icu4c can find its locale data.
257 std::string root;
258 root += getenv("ANDROID_BUILD_TOP");
Elliott Hughesa0cb1202012-01-23 17:34:32 -0800259#if defined(__linux__)
Elliott Hughes0af55432011-08-17 18:37:28 -0700260 root += "/out/host/linux-x86";
Elliott Hughesa0cb1202012-01-23 17:34:32 -0800261#elif defined(__APPLE__)
262 root += "/out/host/darwin-x86";
263#else
264#error unsupported OS
265#endif
Elliott Hughes0af55432011-08-17 18:37:28 -0700266 setenv("ANDROID_ROOT", root.c_str(), 1);
Ian Rogers2fa6b2e2012-10-17 00:10:17 -0700267 setenv("LD_LIBRARY_PATH", ":", 0); // Required by java.lang.System.<clinit>.
Elliott Hughes0af55432011-08-17 18:37:28 -0700268 }
269
Brian Carlstrom7675e162013-06-10 16:18:04 -0700270 // On target, Cannot use /mnt/sdcard because it is mounted noexec, so use subdir of dalvik-cache
271 android_data = (IsHost() ? "/tmp/art-data-XXXXXX" : "/data/dalvik-cache/art-data-XXXXXX");
Elliott Hughes76160052012-12-12 16:31:20 -0800272 if (mkdtemp(&android_data[0]) == NULL) {
273 PLOG(FATAL) << "mkdtemp(\"" << &android_data[0] << "\") failed";
Elliott Hughes0f4c41d2011-09-04 14:58:03 -0700274 }
Elliott Hughes76160052012-12-12 16:31:20 -0800275 setenv("ANDROID_DATA", android_data.c_str(), 1);
276 }
277
278 protected:
279 static bool IsHost() {
280 return (getenv("ANDROID_BUILD_TOP") != NULL);
281 }
282
283 virtual void SetUp() {
284 SetEnvironmentVariables(android_data_);
Brian Carlstrom7675e162013-06-10 16:18:04 -0700285 dalvik_cache_.append(android_data_.c_str());
286 dalvik_cache_.append("/dalvik-cache");
287 int mkdir_result = mkdir(dalvik_cache_.c_str(), 0700);
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700288 ASSERT_EQ(mkdir_result, 0);
289
Brian Carlstroma004aa92012-02-08 18:05:09 -0800290 java_lang_dex_file_ = DexFile::Open(GetLibCoreDexFileName(), GetLibCoreDexFileName());
Ian Rogers33e95662013-05-20 20:29:14 -0700291 if (java_lang_dex_file_ == NULL) {
292 LOG(FATAL) << "Could not open .dex file '" << GetLibCoreDexFileName() << "'\n";
293 }
Brian Carlstrom654d9192013-04-30 18:35:32 -0700294 conscrypt_file_ = DexFile::Open(GetConscryptFileName(), GetConscryptFileName());
Ian Rogers33e95662013-05-20 20:29:14 -0700295 if (conscrypt_file_ == NULL) {
296 LOG(FATAL) << "Could not open .dex file '" << GetConscryptFileName() << "'\n";
297 }
Brian Carlstroma004aa92012-02-08 18:05:09 -0800298 boot_class_path_.push_back(java_lang_dex_file_);
Brian Carlstrom654d9192013-04-30 18:35:32 -0700299 boot_class_path_.push_back(conscrypt_file_);
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700300
Ian Rogers1d54e732013-05-02 21:10:01 -0700301 std::string min_heap_string(StringPrintf("-Xms%zdm", gc::Heap::kDefaultInitialSize / MB));
302 std::string max_heap_string(StringPrintf("-Xmx%zdm", gc::Heap::kDefaultMaximumSize / MB));
Ian Rogers30fab402012-01-23 15:43:46 -0800303
Brian Carlstrom69b15fb2011-09-03 12:25:21 -0700304 Runtime::Options options;
Brian Carlstroma4a7b482011-10-16 15:29:16 -0700305 options.push_back(std::make_pair("compiler", reinterpret_cast<void*>(NULL)));
Brian Carlstroma004aa92012-02-08 18:05:09 -0800306 options.push_back(std::make_pair("bootclasspath", &boot_class_path_));
Brian Carlstrom69b15fb2011-09-03 12:25:21 -0700307 options.push_back(std::make_pair("-Xcheck:jni", reinterpret_cast<void*>(NULL)));
Ian Rogers30fab402012-01-23 15:43:46 -0800308 options.push_back(std::make_pair(min_heap_string.c_str(), reinterpret_cast<void*>(NULL)));
309 options.push_back(std::make_pair(max_heap_string.c_str(), reinterpret_cast<void*>(NULL)));
Brian Carlstromdf629502013-07-17 22:39:56 -0700310 if (!Runtime::Create(options, false)) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700311 LOG(FATAL) << "Failed to create runtime";
312 return;
313 }
314 runtime_.reset(Runtime::Current());
315 // Runtime::Create acquired the mutator_lock_ that is normally given away when we Runtime::Start,
316 // give it away now and then switch to a more managable ScopedObjectAccess.
317 Thread::Current()->TransitionFromRunnableToSuspended(kNative);
Ian Rogers1d54e732013-05-02 21:10:01 -0700318 {
319 ScopedObjectAccess soa(Thread::Current());
320 ASSERT_TRUE(runtime_.get() != NULL);
321 class_linker_ = runtime_->GetClassLinker();
Ian Rogers0cfe1fb2011-08-26 03:29:44 -0700322
Ian Rogers1d54e732013-05-02 21:10:01 -0700323 InstructionSet instruction_set = kNone;
jeffhaoc0228b82012-08-29 18:15:05 -0700324#if defined(__arm__)
Ian Rogers1d54e732013-05-02 21:10:01 -0700325 instruction_set = kThumb2;
jeffhaoc0228b82012-08-29 18:15:05 -0700326#elif defined(__mips__)
Ian Rogers1d54e732013-05-02 21:10:01 -0700327 instruction_set = kMips;
jeffhaoc0228b82012-08-29 18:15:05 -0700328#elif defined(__i386__)
Ian Rogers1d54e732013-05-02 21:10:01 -0700329 instruction_set = kX86;
Ian Rogers2c8f6532011-09-02 17:16:34 -0700330#endif
buzbeec531cef2012-10-18 07:09:20 -0700331
Ian Rogers1d54e732013-05-02 21:10:01 -0700332 // TODO: make selectable
buzbeec531cef2012-10-18 07:09:20 -0700333#if defined(ART_USE_PORTABLE_COMPILER)
Ian Rogers1d54e732013-05-02 21:10:01 -0700334 CompilerBackend compiler_backend = kPortable;
buzbeec531cef2012-10-18 07:09:20 -0700335#else
Ian Rogers1d54e732013-05-02 21:10:01 -0700336 CompilerBackend compiler_backend = kQuick;
buzbeec531cef2012-10-18 07:09:20 -0700337#endif
338
Ian Rogers1d54e732013-05-02 21:10:01 -0700339 if (!runtime_->HasResolutionMethod()) {
340 runtime_->SetResolutionMethod(runtime_->CreateResolutionMethod());
Ian Rogers4f0d07c2011-10-06 23:38:47 -0700341 }
Ian Rogers1d54e732013-05-02 21:10:01 -0700342 for (int i = 0; i < Runtime::kLastCalleeSaveType; i++) {
343 Runtime::CalleeSaveType type = Runtime::CalleeSaveType(i);
344 if (!runtime_->HasCalleeSaveMethod(type)) {
345 runtime_->SetCalleeSaveMethod(
346 runtime_->CreateCalleeSaveMethod(instruction_set, type), type);
347 }
348 }
349 class_linker_->FixupDexCaches(runtime_->GetResolutionMethod());
350 compiler_driver_.reset(new CompilerDriver(compiler_backend, instruction_set,
351 true, new CompilerDriver::DescriptorSet,
Brian Carlstrom45602482013-07-21 22:07:55 -0700352 2, true));
Ian Rogers4f0d07c2011-10-06 23:38:47 -0700353 }
Brian Carlstrom96391602013-06-13 19:49:50 -0700354 // We typically don't generate an image in unit tests, disable this optimization by default.
355 compiler_driver_->SetSupportBootImageFixup(false);
Ian Rogers2c8f6532011-09-02 17:16:34 -0700356
Ian Rogers1d54e732013-05-02 21:10:01 -0700357 // We're back in native, take the opportunity to initialize well known classes.
358 WellKnownClasses::InitClasses(Thread::Current()->GetJniEnv());
Mathieu Chartier02b6a782012-10-26 13:51:26 -0700359 // Create the heap thread pool so that the GC runs in parallel for tests. Normally, the thread
360 // pool is created by the runtime.
361 runtime_->GetHeap()->CreateThreadPool();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700362 runtime_->GetHeap()->VerifyHeap(); // Check for heap corruption before the test
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700363 }
364
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700365 virtual void TearDown() {
366 const char* android_data = getenv("ANDROID_DATA");
367 ASSERT_TRUE(android_data != NULL);
Brian Carlstrom7675e162013-06-10 16:18:04 -0700368 DIR* dir = opendir(dalvik_cache_.c_str());
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700369 ASSERT_TRUE(dir != NULL);
Elliott Hughes4696b5b2012-10-30 10:35:10 -0700370 dirent* e;
371 while ((e = readdir(dir)) != NULL) {
372 if ((strcmp(e->d_name, ".") == 0) || (strcmp(e->d_name, "..") == 0)) {
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700373 continue;
374 }
Brian Carlstrom7675e162013-06-10 16:18:04 -0700375 std::string filename(dalvik_cache_);
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700376 filename.push_back('/');
Elliott Hughes4696b5b2012-10-30 10:35:10 -0700377 filename.append(e->d_name);
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700378 int unlink_result = unlink(filename.c_str());
379 ASSERT_EQ(0, unlink_result);
Jesse Wilsonac5b9e22011-07-27 15:11:13 -0400380 }
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700381 closedir(dir);
Brian Carlstrom7675e162013-06-10 16:18:04 -0700382 int rmdir_cache_result = rmdir(dalvik_cache_.c_str());
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700383 ASSERT_EQ(0, rmdir_cache_result);
Elliott Hughes34023802011-08-30 12:06:17 -0700384 int rmdir_data_result = rmdir(android_data_.c_str());
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700385 ASSERT_EQ(0, rmdir_data_result);
Elliott Hughes0af55432011-08-17 18:37:28 -0700386
387 // icu4c has a fixed 10-element array "gCommonICUDataArray".
388 // If we run > 10 tests, we fill that array and u_setCommonData fails.
389 // There's a function to clear the array, but it's not public...
390 typedef void (*IcuCleanupFn)();
391 void* sym = dlsym(RTLD_DEFAULT, "u_cleanup_" U_ICU_VERSION_SHORT);
392 CHECK(sym != NULL);
393 IcuCleanupFn icu_cleanup_fn = reinterpret_cast<IcuCleanupFn>(sym);
394 (*icu_cleanup_fn)();
Ian Rogers0cfe1fb2011-08-26 03:29:44 -0700395
Ian Rogers1212a022013-03-04 10:48:41 -0800396 compiler_driver_.reset();
Elliott Hughes4d6850c2012-01-18 15:55:06 -0800397 STLDeleteElements(&opened_dex_files_);
Ian Rogers2c8f6532011-09-02 17:16:34 -0700398
Elliott Hughesb3bd5f02012-03-08 21:05:27 -0800399 Runtime::Current()->GetHeap()->VerifyHeap(); // Check for heap corruption after the test
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700400 }
Jesse Wilsonac5b9e22011-07-27 15:11:13 -0400401
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700402 std::string GetLibCoreDexFileName() {
Brian Carlstrom3b010aa2013-06-25 23:06:36 -0700403 return GetDexFileName("core-libart");
Brian Carlstrom265091e2013-01-30 14:08:26 -0800404 }
405
Brian Carlstrom654d9192013-04-30 18:35:32 -0700406 std::string GetConscryptFileName() {
407 return GetDexFileName("conscrypt");
408 }
409
Brian Carlstrom265091e2013-01-30 14:08:26 -0800410 std::string GetDexFileName(const std::string& jar_prefix) {
Elliott Hughes76160052012-12-12 16:31:20 -0800411 if (IsHost()) {
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700412 const char* host_dir = getenv("ANDROID_HOST_OUT");
413 CHECK(host_dir != NULL);
Brian Carlstrom265091e2013-01-30 14:08:26 -0800414 return StringPrintf("%s/framework/%s-hostdex.jar", host_dir, jar_prefix.c_str());
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700415 }
Brian Carlstrom265091e2013-01-30 14:08:26 -0800416 return StringPrintf("%s/framework/%s.jar", GetAndroidRoot(), jar_prefix.c_str());
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700417 }
418
Brian Carlstrom3f47c122013-03-07 00:02:40 -0800419 std::string GetTestAndroidRoot() {
420 if (IsHost()) {
421 const char* host_dir = getenv("ANDROID_HOST_OUT");
422 CHECK(host_dir != NULL);
423 return host_dir;
424 }
425 return GetAndroidRoot();
426 }
427
Ian Rogers33e95662013-05-20 20:29:14 -0700428 const DexFile* OpenTestDexFile(const char* name) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700429 CHECK(name != NULL);
430 std::string filename;
Elliott Hughes76160052012-12-12 16:31:20 -0800431 if (IsHost()) {
Brian Carlstromb2793372012-03-17 18:27:16 -0700432 filename += getenv("ANDROID_HOST_OUT");
433 filename += "/framework/";
434 } else {
435 filename += "/data/nativetest/art/";
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700436 }
Brian Carlstromb2793372012-03-17 18:27:16 -0700437 filename += "art-test-dex-";
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700438 filename += name;
439 filename += ".jar";
Brian Carlstroma004aa92012-02-08 18:05:09 -0800440 const DexFile* dex_file = DexFile::Open(filename, filename);
Brian Carlstrom69b15fb2011-09-03 12:25:21 -0700441 CHECK(dex_file != NULL) << "Failed to open " << filename;
Elliott Hughes4d6850c2012-01-18 15:55:06 -0800442 opened_dex_files_.push_back(dex_file);
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700443 return dex_file;
444 }
445
Ian Rogers33e95662013-05-20 20:29:14 -0700446 jobject LoadDex(const char* dex_name) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Brian Carlstrom9baa4ae2011-09-01 21:14:14 -0700447 const DexFile* dex_file = OpenTestDexFile(dex_name);
448 CHECK(dex_file != NULL);
Brian Carlstrom9baa4ae2011-09-01 21:14:14 -0700449 class_linker_->RegisterDexFile(*dex_file);
450 std::vector<const DexFile*> class_path;
451 class_path.push_back(dex_file);
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700452 ScopedObjectAccessUnchecked soa(Thread::Current());
453 ScopedLocalRef<jobject> class_loader_local(soa.Env(),
454 soa.Env()->AllocObject(WellKnownClasses::dalvik_system_PathClassLoader));
455 jobject class_loader = soa.Env()->NewGlobalRef(class_loader_local.get());
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800456 soa.Self()->SetClassLoaderOverride(soa.Decode<mirror::ClassLoader*>(class_loader_local.get()));
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700457 Runtime::Current()->SetCompileTimeClassPath(class_loader, class_path);
458 return class_loader;
Brian Carlstrom9baa4ae2011-09-01 21:14:14 -0700459 }
460
Ian Rogers33e95662013-05-20 20:29:14 -0700461 void CompileClass(mirror::ClassLoader* class_loader, const char* class_name)
462 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Elliott Hughes95572412011-12-13 18:14:20 -0800463 std::string class_descriptor(DotToDescriptor(class_name));
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800464 mirror::Class* klass = class_linker_->FindClass(class_descriptor.c_str(), class_loader);
Brian Carlstromaded5f72011-10-07 17:15:04 -0700465 CHECK(klass != NULL) << "Class not found " << class_name;
466 for (size_t i = 0; i < klass->NumDirectMethods(); i++) {
467 CompileMethod(klass->GetDirectMethod(i));
468 }
469 for (size_t i = 0; i < klass->NumVirtualMethods(); i++) {
470 CompileMethod(klass->GetVirtualMethod(i));
471 }
472 }
473
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800474 void CompileMethod(mirror::AbstractMethod* method) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Brian Carlstrom9baa4ae2011-09-01 21:14:14 -0700475 CHECK(method != NULL);
Anwar Ghuloum6f28d912013-07-24 15:02:53 -0700476 base::TimingLogger timings("CommonTest::CompileMethod", false, false);
Anwar Ghuloumbe576f42013-07-25 17:32:40 -0700477 timings.StartSplit("CompileOne");
Brian Carlstrom45602482013-07-21 22:07:55 -0700478 compiler_driver_->CompileOne(method, timings);
Brian Carlstrom3320cf42011-10-04 14:58:28 -0700479 MakeExecutable(method);
Brian Carlstrom9baa4ae2011-09-01 21:14:14 -0700480 }
481
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800482 void CompileDirectMethod(mirror::ClassLoader* class_loader,
Brian Carlstrom9baa4ae2011-09-01 21:14:14 -0700483 const char* class_name,
484 const char* method_name,
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700485 const char* signature)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700486 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Elliott Hughes95572412011-12-13 18:14:20 -0800487 std::string class_descriptor(DotToDescriptor(class_name));
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800488 mirror::Class* klass = class_linker_->FindClass(class_descriptor.c_str(), class_loader);
Brian Carlstrom9baa4ae2011-09-01 21:14:14 -0700489 CHECK(klass != NULL) << "Class not found " << class_name;
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800490 mirror::AbstractMethod* method = klass->FindDirectMethod(method_name, signature);
Elliott Hughes0f4c41d2011-09-04 14:58:03 -0700491 CHECK(method != NULL) << "Direct method not found: "
492 << class_name << "." << method_name << signature;
Brian Carlstrom9baa4ae2011-09-01 21:14:14 -0700493 CompileMethod(method);
494 }
495
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800496 void CompileVirtualMethod(mirror::ClassLoader* class_loader,
Brian Carlstrom9baa4ae2011-09-01 21:14:14 -0700497 const char* class_name,
498 const char* method_name,
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700499 const char* signature)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700500 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Elliott Hughes95572412011-12-13 18:14:20 -0800501 std::string class_descriptor(DotToDescriptor(class_name));
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800502 mirror::Class* klass = class_linker_->FindClass(class_descriptor.c_str(), class_loader);
Brian Carlstrom9baa4ae2011-09-01 21:14:14 -0700503 CHECK(klass != NULL) << "Class not found " << class_name;
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800504 mirror::AbstractMethod* method = klass->FindVirtualMethod(method_name, signature);
Elliott Hughes0f4c41d2011-09-04 14:58:03 -0700505 CHECK(method != NULL) << "Virtual method not found: "
506 << class_name << "." << method_name << signature;
Brian Carlstrom9baa4ae2011-09-01 21:14:14 -0700507 CompileMethod(method);
508 }
509
Brian Carlstrom700c8d32012-11-05 10:42:02 -0800510 void ReserveImageSpace() {
511 // Reserve where the image will be loaded up front so that other parts of test set up don't
512 // accidentally end up colliding with the fixed memory address when we need to load the image.
Brian Carlstrom2d888622013-07-18 17:02:00 -0700513 image_reservation_.reset(MemMap::MapAnonymous("image reservation",
514 reinterpret_cast<byte*>(ART_BASE_ADDRESS),
Brian Carlstrom700c8d32012-11-05 10:42:02 -0800515 (size_t)100 * 1024 * 1024, // 100MB
516 PROT_NONE));
517 }
518
519 void UnreserveImageSpace() {
520 image_reservation_.reset();
521 }
522
Elliott Hughes34023802011-08-30 12:06:17 -0700523 std::string android_data_;
Brian Carlstrom7675e162013-06-10 16:18:04 -0700524 std::string dalvik_cache_;
Brian Carlstroma004aa92012-02-08 18:05:09 -0800525 const DexFile* java_lang_dex_file_; // owned by runtime_
Brian Carlstrom654d9192013-04-30 18:35:32 -0700526 const DexFile* conscrypt_file_; // owned by runtime_
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700527 std::vector<const DexFile*> boot_class_path_;
Elliott Hughes90a33692011-08-30 13:27:07 -0700528 UniquePtr<Runtime> runtime_;
Ian Rogers0e073f72011-09-09 10:45:46 -0700529 // Owned by the runtime
Carl Shapiro7a909592011-07-24 19:21:59 -0700530 ClassLinker* class_linker_;
Ian Rogers1212a022013-03-04 10:48:41 -0800531 UniquePtr<CompilerDriver> compiler_driver_;
Brian Carlstrom9baa4ae2011-09-01 21:14:14 -0700532
533 private:
Elliott Hughes4d6850c2012-01-18 15:55:06 -0800534 std::vector<const DexFile*> opened_dex_files_;
Brian Carlstrom700c8d32012-11-05 10:42:02 -0800535 UniquePtr<MemMap> image_reservation_;
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700536};
537
Elliott Hughesb264f082012-04-06 17:10:10 -0700538// Sets a CheckJni abort hook to catch failures. Note that this will cause CheckJNI to carry on
539// rather than aborting, so be careful!
540class CheckJniAbortCatcher {
541 public:
542 CheckJniAbortCatcher() : vm_(Runtime::Current()->GetJavaVM()) {
543 vm_->check_jni_abort_hook = Hook;
544 vm_->check_jni_abort_hook_data = &actual_;
545 }
546
547 ~CheckJniAbortCatcher() {
548 vm_->check_jni_abort_hook = NULL;
549 vm_->check_jni_abort_hook_data = NULL;
Elliott Hughes56ef0422012-06-19 14:35:04 -0700550 EXPECT_TRUE(actual_.empty()) << actual_;
Elliott Hughesb264f082012-04-06 17:10:10 -0700551 }
552
553 void Check(const char* expected_text) {
554 EXPECT_TRUE(actual_.find(expected_text) != std::string::npos) << "\n"
555 << "Expected to find: " << expected_text << "\n"
556 << "In the output : " << actual_;
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700557 actual_.clear();
Elliott Hughesb264f082012-04-06 17:10:10 -0700558 }
559
560 private:
561 static void Hook(void* data, const std::string& reason) {
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700562 // We use += because when we're hooking the aborts like this, multiple problems can be found.
563 *reinterpret_cast<std::string*>(data) += reason;
Elliott Hughesb264f082012-04-06 17:10:10 -0700564 }
565
566 JavaVMExt* vm_;
567 std::string actual_;
568
569 DISALLOW_COPY_AND_ASSIGN(CheckJniAbortCatcher);
570};
571
Brian Carlstrom265091e2013-01-30 14:08:26 -0800572// TODO: These tests were disabled for portable when we went to having
573// MCLinker link LLVM ELF output because we no longer just have code
574// blobs in memory. We'll need to dlopen to load and relocate
575// temporary output to resurrect these tests.
576#if defined(ART_USE_PORTABLE_COMPILER)
577#define TEST_DISABLED_FOR_PORTABLE() printf("WARNING: TEST DISABLED FOR PORTABLE\n"); return
578#else
579#define TEST_DISABLED_FOR_PORTABLE()
580#endif
581
Brian Carlstrom934486c2011-07-12 23:42:50 -0700582} // namespace art
Elliott Hughes34023802011-08-30 12:06:17 -0700583
584namespace std {
585
586// TODO: isn't gtest supposed to be able to print STL types for itself?
587template <typename T>
588std::ostream& operator<<(std::ostream& os, const std::vector<T>& rhs) {
Elliott Hughes14134a12011-09-30 16:55:51 -0700589 os << ::art::ToString(rhs);
Elliott Hughes34023802011-08-30 12:06:17 -0700590 return os;
591}
592
593} // namespace std
Brian Carlstromfc0e3212013-07-17 14:40:12 -0700594
595#endif // ART_RUNTIME_COMMON_TEST_H_