blob: dc1f5922d914211c73ebfd6fb01532d1029322fd [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 Rogers7655f292013-07-29 11:07:13 -070034#include "entrypoints/entrypoint_utils.h"
Ian Rogers1d54e732013-05-02 21:10:01 -070035#include "gc/heap.h"
Elliott Hughes90a33692011-08-30 13:27:07 -070036#include "gtest/gtest.h"
Elliott Hughes0f3c5532012-03-30 14:51:51 -070037#include "instruction_set.h"
Ian Rogers0f40ac32013-08-13 22:10:30 -070038#include "interpreter/interpreter.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080039#include "mirror/class_loader.h"
Brian Carlstrom3320cf42011-10-04 14:58:28 -070040#include "oat_file.h"
Ian Rogers6d4d9fc2011-11-30 16:24:48 -080041#include "object_utils.h"
Brian Carlstrom33f741e2011-10-03 11:24:05 -070042#include "os.h"
Brian Carlstrom1f870082011-08-23 16:02:11 -070043#include "runtime.h"
Ian Rogers00f7d0e2012-07-19 15:28:27 -070044#include "scoped_thread_state_change.h"
Elliott Hughese222ee02012-12-13 14:41:43 -080045#include "ScopedLocalRef.h"
Elliott Hughes90a33692011-08-30 13:27:07 -070046#include "thread.h"
Elliott Hughes0f3c5532012-03-30 14:51:51 -070047#include "UniquePtr.h"
Ian Rogers00f7d0e2012-07-19 15:28:27 -070048#include "well_known_classes.h"
Elliott Hughes0af55432011-08-17 18:37:28 -070049
Brian Carlstrom934486c2011-07-12 23:42:50 -070050namespace art {
51
Brian Carlstromb9cc1ca2012-01-27 00:57:42 -080052static const byte kBase64Map[256] = {
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, 255, 255, 255, 255, 255,
56 255, 255, 255, 255, 255, 255, 255, 62, 255, 255, 255, 63,
57 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 255, 255,
58 255, 254, 255, 255, 255, 0, 1, 2, 3, 4, 5, 6,
Brian Carlstrom7934ac22013-07-26 10:54:15 -070059 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, // NOLINT
60 19, 20, 21, 22, 23, 24, 25, 255, 255, 255, 255, 255, // NOLINT
Brian Carlstromb9cc1ca2012-01-27 00:57:42 -080061 255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36,
Brian Carlstrom7934ac22013-07-26 10:54:15 -070062 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, // NOLINT
63 49, 50, 51, 255, 255, 255, 255, 255, 255, 255, 255, 255, // NOLINT
Brian Carlstromb9cc1ca2012-01-27 00:57:42 -080064 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, 255, 255, 255, 255, 255, 255, 255, 255,
74 255, 255, 255, 255
75};
76
77byte* DecodeBase64(const char* src, size_t* dst_size) {
78 std::vector<byte> tmp;
Elliott Hughesa21039c2012-06-21 12:09:25 -070079 uint32_t t = 0, y = 0;
Brian Carlstromb9cc1ca2012-01-27 00:57:42 -080080 int g = 3;
81 for (size_t i = 0; src[i] != '\0'; ++i) {
82 byte c = kBase64Map[src[i] & 0xFF];
83 if (c == 255) continue;
84 // the final = symbols are read and used to trim the remaining bytes
85 if (c == 254) {
86 c = 0;
87 // prevent g < 0 which would potentially allow an overflow later
88 if (--g < 0) {
Brian Carlstrom51477332012-03-25 20:20:26 -070089 *dst_size = 0;
Brian Carlstromb9cc1ca2012-01-27 00:57:42 -080090 return NULL;
91 }
92 } else if (g != 3) {
93 // we only allow = to be at the end
Brian Carlstrom51477332012-03-25 20:20:26 -070094 *dst_size = 0;
Brian Carlstromb9cc1ca2012-01-27 00:57:42 -080095 return NULL;
96 }
97 t = (t << 6) | c;
98 if (++y == 4) {
99 tmp.push_back((t >> 16) & 255);
100 if (g > 1) {
101 tmp.push_back((t >> 8) & 255);
102 }
103 if (g > 2) {
104 tmp.push_back(t & 255);
105 }
106 y = t = 0;
107 }
108 }
109 if (y != 0) {
Brian Carlstrom51477332012-03-25 20:20:26 -0700110 *dst_size = 0;
Brian Carlstromb9cc1ca2012-01-27 00:57:42 -0800111 return NULL;
112 }
113 UniquePtr<byte[]> dst(new byte[tmp.size()]);
114 if (dst_size != NULL) {
115 *dst_size = tmp.size();
Brian Carlstrom51477332012-03-25 20:20:26 -0700116 } else {
117 *dst_size = 0;
Brian Carlstromb9cc1ca2012-01-27 00:57:42 -0800118 }
119 std::copy(tmp.begin(), tmp.end(), dst.get());
120 return dst.release();
121}
122
Brian Carlstromdb4d5402011-08-09 12:18:28 -0700123class ScratchFile {
124 public:
125 ScratchFile() {
Elliott Hughes34023802011-08-30 12:06:17 -0700126 filename_ = getenv("ANDROID_DATA");
127 filename_ += "/TmpFile-XXXXXX";
Elliott Hughes76160052012-12-12 16:31:20 -0800128 int fd = mkstemp(&filename_[0]);
129 CHECK_NE(-1, fd);
130 file_.reset(new File(fd, GetFilename()));
Brian Carlstromdb4d5402011-08-09 12:18:28 -0700131 }
132
133 ~ScratchFile() {
Elliott Hughes34023802011-08-30 12:06:17 -0700134 int unlink_result = unlink(filename_.c_str());
Brian Carlstromdb4d5402011-08-09 12:18:28 -0700135 CHECK_EQ(0, unlink_result);
Brian Carlstromdb4d5402011-08-09 12:18:28 -0700136 }
137
Brian Carlstroma004aa92012-02-08 18:05:09 -0800138 const std::string& GetFilename() const {
139 return filename_;
Brian Carlstromdb4d5402011-08-09 12:18:28 -0700140 }
141
Elliott Hughes234da572011-11-03 22:13:06 -0700142 File* GetFile() const {
143 return file_.get();
144 }
145
Brian Carlstromdb4d5402011-08-09 12:18:28 -0700146 int GetFd() const {
Elliott Hughes76160052012-12-12 16:31:20 -0800147 return file_->Fd();
Brian Carlstromdb4d5402011-08-09 12:18:28 -0700148 }
149
150 private:
Elliott Hughes34023802011-08-30 12:06:17 -0700151 std::string filename_;
Elliott Hughes234da572011-11-03 22:13:06 -0700152 UniquePtr<File> file_;
Brian Carlstromdb4d5402011-08-09 12:18:28 -0700153};
154
Brian Carlstromf734cf52011-08-17 16:28:14 -0700155class CommonTest : public testing::Test {
Brian Carlstrom9baa4ae2011-09-01 21:14:14 -0700156 public:
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800157 static void MakeExecutable(const mirror::ByteArray* code_array) {
Brian Carlstrom3320cf42011-10-04 14:58:28 -0700158 CHECK(code_array != NULL);
159 MakeExecutable(code_array->GetData(), code_array->GetLength());
160 }
161
Shih-wei Liao1cb0ae72012-03-16 15:30:19 -0700162 static void MakeExecutable(const std::vector<uint8_t>& code) {
Brian Carlstrom3320cf42011-10-04 14:58:28 -0700163 CHECK_NE(code.size(), 0U);
164 MakeExecutable(&code[0], code.size());
165 }
166
Brian Carlstromae826982011-11-09 01:33:42 -0800167 // Create an OatMethod based on pointers (for unit tests)
168 OatFile::OatMethod CreateOatMethod(const void* code,
169 const size_t frame_size_in_bytes,
170 const uint32_t core_spill_mask,
171 const uint32_t fp_spill_mask,
Ian Rogers1809a722013-08-09 22:05:32 -0700172 const uint8_t* mapping_table,
173 const uint8_t* vmap_table,
Jeff Hao74180ca2013-03-27 15:29:11 -0700174 const uint8_t* gc_map) {
Brian Carlstromae826982011-11-09 01:33:42 -0800175 return OatFile::OatMethod(NULL,
176 reinterpret_cast<uint32_t>(code),
177 frame_size_in_bytes,
178 core_spill_mask,
179 fp_spill_mask,
180 reinterpret_cast<uint32_t>(mapping_table),
181 reinterpret_cast<uint32_t>(vmap_table),
Brian Carlstromdf629502013-07-17 22:39:56 -0700182 reinterpret_cast<uint32_t>(gc_map));
Brian Carlstromae826982011-11-09 01:33:42 -0800183 }
184
Brian Carlstromea46f952013-07-30 01:26:50 -0700185 void MakeExecutable(mirror::ArtMethod* method) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Brian Carlstrom3320cf42011-10-04 14:58:28 -0700186 CHECK(method != NULL);
Jeff Hao74180ca2013-03-27 15:29:11 -0700187 LOG(INFO) << "MakeExecutable " << PrettyMethod(method);
Brian Carlstrom3320cf42011-10-04 14:58:28 -0700188
Ian Rogersf3e98552013-03-20 15:49:49 -0700189 const CompiledMethod* compiled_method = NULL;
Brian Carlstrom3320cf42011-10-04 14:58:28 -0700190 if (!method->IsAbstract()) {
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800191 const mirror::DexCache* dex_cache = method->GetDeclaringClass()->GetDexCache();
Ian Rogers4445a7e2012-10-05 17:19:13 -0700192 const DexFile& dex_file = *dex_cache->GetDexFile();
Ian Rogersf3e98552013-03-20 15:49:49 -0700193 compiled_method =
Brian Carlstrom51c24672013-07-11 16:00:56 -0700194 compiler_driver_->GetCompiledMethod(MethodReference(&dex_file,
195 method->GetDexMethodIndex()));
Ian Rogersf3e98552013-03-20 15:49:49 -0700196 }
197 if (compiled_method != NULL) {
Logan Chien971bf3f2012-05-01 15:47:55 +0800198 const std::vector<uint8_t>& code = compiled_method->GetCode();
199 MakeExecutable(code);
200 const void* method_code = CompiledMethod::CodePointer(&code[0],
201 compiled_method->GetInstructionSet());
Brian Carlstrom3320cf42011-10-04 14:58:28 -0700202 LOG(INFO) << "MakeExecutable " << PrettyMethod(method) << " code=" << method_code;
Brian Carlstromae826982011-11-09 01:33:42 -0800203 OatFile::OatMethod oat_method = CreateOatMethod(method_code,
204 compiled_method->GetFrameSizeInBytes(),
205 compiled_method->GetCoreSpillMask(),
206 compiled_method->GetFpSpillMask(),
207 &compiled_method->GetMappingTable()[0],
208 &compiled_method->GetVmapTable()[0],
Jeff Hao74180ca2013-03-27 15:29:11 -0700209 NULL);
Brian Carlstrom265091e2013-01-30 14:08:26 -0800210 oat_method.LinkMethod(method);
Ian Rogers0f40ac32013-08-13 22:10:30 -0700211 method->SetEntryPointFromInterpreter(artInterpreterToCompiledCodeBridge);
Brian Carlstrom3320cf42011-10-04 14:58:28 -0700212 } else {
Ian Rogersf3e98552013-03-20 15:49:49 -0700213 const void* method_code;
Ian Rogers848871b2013-08-05 10:56:33 -0700214 // No code? You must mean to go into the interpreter.
215 method_code = GetCompiledCodeToInterpreterBridge();
Brian Carlstrom3320cf42011-10-04 14:58:28 -0700216 LOG(INFO) << "MakeExecutable " << PrettyMethod(method) << " code=" << method_code;
Brian Carlstromae826982011-11-09 01:33:42 -0800217 OatFile::OatMethod oat_method = CreateOatMethod(method_code,
218 kStackAlignment,
219 0,
220 0,
221 NULL,
222 NULL,
Jeff Hao74180ca2013-03-27 15:29:11 -0700223 NULL);
Brian Carlstrom265091e2013-01-30 14:08:26 -0800224 oat_method.LinkMethod(method);
Ian Rogers0f40ac32013-08-13 22:10:30 -0700225 method->SetEntryPointFromInterpreter(interpreter::artInterpreterToInterpreterBridge);
Brian Carlstrom3320cf42011-10-04 14:58:28 -0700226 }
227 }
228
229 static void MakeExecutable(const void* code_start, size_t code_length) {
230 CHECK(code_start != NULL);
231 CHECK_NE(code_length, 0U);
232 uintptr_t data = reinterpret_cast<uintptr_t>(code_start);
Brian Carlstrom9baa4ae2011-09-01 21:14:14 -0700233 uintptr_t base = RoundDown(data, kPageSize);
Brian Carlstrom3320cf42011-10-04 14:58:28 -0700234 uintptr_t limit = RoundUp(data + code_length, kPageSize);
Brian Carlstrom9baa4ae2011-09-01 21:14:14 -0700235 uintptr_t len = limit - base;
236 int result = mprotect(reinterpret_cast<void*>(base), len, PROT_READ | PROT_WRITE | PROT_EXEC);
Brian Carlstrom7a00a3c2012-01-25 18:38:03 -0800237 CHECK_EQ(result, 0);
Shih-wei Liao24782c62012-01-08 12:46:11 -0800238
Ian Rogers16341552011-10-10 11:33:06 -0700239 // Flush instruction cache
Shih-wei Liao24782c62012-01-08 12:46:11 -0800240 // Only uses __builtin___clear_cache if GCC >= 4.3.3
241#if GCC_VERSION >= 40303
Ian Rogers16341552011-10-10 11:33:06 -0700242 __builtin___clear_cache(reinterpret_cast<void*>(base), reinterpret_cast<void*>(base + len));
Brian Carlstrom7a00a3c2012-01-25 18:38:03 -0800243#else
Brian Carlstrom6f485c62013-07-18 15:35:35 -0700244 LOG(FATAL) << "UNIMPLEMENTED: cache flush";
Shih-wei Liao24782c62012-01-08 12:46:11 -0800245#endif
Brian Carlstrom9baa4ae2011-09-01 21:14:14 -0700246 }
247
Elliott Hughes76160052012-12-12 16:31:20 -0800248 static void SetEnvironmentVariables(std::string& android_data) {
249 if (IsHost()) {
Elliott Hughes0af55432011-08-17 18:37:28 -0700250 // $ANDROID_ROOT is set on the device, but not on the host.
251 // We need to set this so that icu4c can find its locale data.
252 std::string root;
253 root += getenv("ANDROID_BUILD_TOP");
Elliott Hughesa0cb1202012-01-23 17:34:32 -0800254#if defined(__linux__)
Elliott Hughes0af55432011-08-17 18:37:28 -0700255 root += "/out/host/linux-x86";
Elliott Hughesa0cb1202012-01-23 17:34:32 -0800256#elif defined(__APPLE__)
257 root += "/out/host/darwin-x86";
258#else
259#error unsupported OS
260#endif
Elliott Hughes0af55432011-08-17 18:37:28 -0700261 setenv("ANDROID_ROOT", root.c_str(), 1);
Ian Rogers2fa6b2e2012-10-17 00:10:17 -0700262 setenv("LD_LIBRARY_PATH", ":", 0); // Required by java.lang.System.<clinit>.
Elliott Hughes0af55432011-08-17 18:37:28 -0700263 }
264
Brian Carlstrom7675e162013-06-10 16:18:04 -0700265 // On target, Cannot use /mnt/sdcard because it is mounted noexec, so use subdir of dalvik-cache
266 android_data = (IsHost() ? "/tmp/art-data-XXXXXX" : "/data/dalvik-cache/art-data-XXXXXX");
Elliott Hughes76160052012-12-12 16:31:20 -0800267 if (mkdtemp(&android_data[0]) == NULL) {
268 PLOG(FATAL) << "mkdtemp(\"" << &android_data[0] << "\") failed";
Elliott Hughes0f4c41d2011-09-04 14:58:03 -0700269 }
Elliott Hughes76160052012-12-12 16:31:20 -0800270 setenv("ANDROID_DATA", android_data.c_str(), 1);
271 }
272
273 protected:
274 static bool IsHost() {
275 return (getenv("ANDROID_BUILD_TOP") != NULL);
276 }
277
278 virtual void SetUp() {
279 SetEnvironmentVariables(android_data_);
Brian Carlstrom7675e162013-06-10 16:18:04 -0700280 dalvik_cache_.append(android_data_.c_str());
281 dalvik_cache_.append("/dalvik-cache");
282 int mkdir_result = mkdir(dalvik_cache_.c_str(), 0700);
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700283 ASSERT_EQ(mkdir_result, 0);
284
Brian Carlstroma004aa92012-02-08 18:05:09 -0800285 java_lang_dex_file_ = DexFile::Open(GetLibCoreDexFileName(), GetLibCoreDexFileName());
Ian Rogers33e95662013-05-20 20:29:14 -0700286 if (java_lang_dex_file_ == NULL) {
287 LOG(FATAL) << "Could not open .dex file '" << GetLibCoreDexFileName() << "'\n";
288 }
Brian Carlstrom654d9192013-04-30 18:35:32 -0700289 conscrypt_file_ = DexFile::Open(GetConscryptFileName(), GetConscryptFileName());
Ian Rogers33e95662013-05-20 20:29:14 -0700290 if (conscrypt_file_ == NULL) {
291 LOG(FATAL) << "Could not open .dex file '" << GetConscryptFileName() << "'\n";
292 }
Brian Carlstroma004aa92012-02-08 18:05:09 -0800293 boot_class_path_.push_back(java_lang_dex_file_);
Brian Carlstrom654d9192013-04-30 18:35:32 -0700294 boot_class_path_.push_back(conscrypt_file_);
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700295
Ian Rogers1d54e732013-05-02 21:10:01 -0700296 std::string min_heap_string(StringPrintf("-Xms%zdm", gc::Heap::kDefaultInitialSize / MB));
297 std::string max_heap_string(StringPrintf("-Xmx%zdm", gc::Heap::kDefaultMaximumSize / MB));
Ian Rogers30fab402012-01-23 15:43:46 -0800298
Brian Carlstrom69b15fb2011-09-03 12:25:21 -0700299 Runtime::Options options;
Brian Carlstroma4a7b482011-10-16 15:29:16 -0700300 options.push_back(std::make_pair("compiler", reinterpret_cast<void*>(NULL)));
Brian Carlstroma004aa92012-02-08 18:05:09 -0800301 options.push_back(std::make_pair("bootclasspath", &boot_class_path_));
Brian Carlstrom69b15fb2011-09-03 12:25:21 -0700302 options.push_back(std::make_pair("-Xcheck:jni", reinterpret_cast<void*>(NULL)));
Ian Rogers30fab402012-01-23 15:43:46 -0800303 options.push_back(std::make_pair(min_heap_string.c_str(), reinterpret_cast<void*>(NULL)));
304 options.push_back(std::make_pair(max_heap_string.c_str(), reinterpret_cast<void*>(NULL)));
Brian Carlstromdf629502013-07-17 22:39:56 -0700305 if (!Runtime::Create(options, false)) {
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700306 LOG(FATAL) << "Failed to create runtime";
307 return;
308 }
309 runtime_.reset(Runtime::Current());
310 // Runtime::Create acquired the mutator_lock_ that is normally given away when we Runtime::Start,
311 // give it away now and then switch to a more managable ScopedObjectAccess.
312 Thread::Current()->TransitionFromRunnableToSuspended(kNative);
Ian Rogers1d54e732013-05-02 21:10:01 -0700313 {
314 ScopedObjectAccess soa(Thread::Current());
315 ASSERT_TRUE(runtime_.get() != NULL);
316 class_linker_ = runtime_->GetClassLinker();
Ian Rogers0cfe1fb2011-08-26 03:29:44 -0700317
Ian Rogers1d54e732013-05-02 21:10:01 -0700318 InstructionSet instruction_set = kNone;
jeffhaoc0228b82012-08-29 18:15:05 -0700319#if defined(__arm__)
Ian Rogers1d54e732013-05-02 21:10:01 -0700320 instruction_set = kThumb2;
jeffhaoc0228b82012-08-29 18:15:05 -0700321#elif defined(__mips__)
Ian Rogers1d54e732013-05-02 21:10:01 -0700322 instruction_set = kMips;
jeffhaoc0228b82012-08-29 18:15:05 -0700323#elif defined(__i386__)
Ian Rogers1d54e732013-05-02 21:10:01 -0700324 instruction_set = kX86;
Ian Rogers2c8f6532011-09-02 17:16:34 -0700325#endif
buzbeec531cef2012-10-18 07:09:20 -0700326
Ian Rogers1d54e732013-05-02 21:10:01 -0700327 // TODO: make selectable
buzbeec531cef2012-10-18 07:09:20 -0700328#if defined(ART_USE_PORTABLE_COMPILER)
Ian Rogers1d54e732013-05-02 21:10:01 -0700329 CompilerBackend compiler_backend = kPortable;
buzbeec531cef2012-10-18 07:09:20 -0700330#else
Ian Rogers1d54e732013-05-02 21:10:01 -0700331 CompilerBackend compiler_backend = kQuick;
buzbeec531cef2012-10-18 07:09:20 -0700332#endif
333
Ian Rogers1d54e732013-05-02 21:10:01 -0700334 if (!runtime_->HasResolutionMethod()) {
335 runtime_->SetResolutionMethod(runtime_->CreateResolutionMethod());
Ian Rogers4f0d07c2011-10-06 23:38:47 -0700336 }
Ian Rogers1d54e732013-05-02 21:10:01 -0700337 for (int i = 0; i < Runtime::kLastCalleeSaveType; i++) {
338 Runtime::CalleeSaveType type = Runtime::CalleeSaveType(i);
339 if (!runtime_->HasCalleeSaveMethod(type)) {
340 runtime_->SetCalleeSaveMethod(
341 runtime_->CreateCalleeSaveMethod(instruction_set, type), type);
342 }
343 }
344 class_linker_->FixupDexCaches(runtime_->GetResolutionMethod());
345 compiler_driver_.reset(new CompilerDriver(compiler_backend, instruction_set,
346 true, new CompilerDriver::DescriptorSet,
Brian Carlstrom45602482013-07-21 22:07:55 -0700347 2, true));
Ian Rogers4f0d07c2011-10-06 23:38:47 -0700348 }
Brian Carlstrom96391602013-06-13 19:49:50 -0700349 // We typically don't generate an image in unit tests, disable this optimization by default.
350 compiler_driver_->SetSupportBootImageFixup(false);
Ian Rogers2c8f6532011-09-02 17:16:34 -0700351
Ian Rogers1d54e732013-05-02 21:10:01 -0700352 // We're back in native, take the opportunity to initialize well known classes.
Brian Carlstromea46f952013-07-30 01:26:50 -0700353 WellKnownClasses::Init(Thread::Current()->GetJniEnv());
Mathieu Chartier02b6a782012-10-26 13:51:26 -0700354 // Create the heap thread pool so that the GC runs in parallel for tests. Normally, the thread
355 // pool is created by the runtime.
356 runtime_->GetHeap()->CreateThreadPool();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700357 runtime_->GetHeap()->VerifyHeap(); // Check for heap corruption before the test
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700358 }
359
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700360 virtual void TearDown() {
361 const char* android_data = getenv("ANDROID_DATA");
362 ASSERT_TRUE(android_data != NULL);
Brian Carlstrom7675e162013-06-10 16:18:04 -0700363 DIR* dir = opendir(dalvik_cache_.c_str());
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700364 ASSERT_TRUE(dir != NULL);
Elliott Hughes4696b5b2012-10-30 10:35:10 -0700365 dirent* e;
366 while ((e = readdir(dir)) != NULL) {
367 if ((strcmp(e->d_name, ".") == 0) || (strcmp(e->d_name, "..") == 0)) {
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700368 continue;
369 }
Brian Carlstrom7675e162013-06-10 16:18:04 -0700370 std::string filename(dalvik_cache_);
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700371 filename.push_back('/');
Elliott Hughes4696b5b2012-10-30 10:35:10 -0700372 filename.append(e->d_name);
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700373 int unlink_result = unlink(filename.c_str());
374 ASSERT_EQ(0, unlink_result);
Jesse Wilsonac5b9e22011-07-27 15:11:13 -0400375 }
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700376 closedir(dir);
Brian Carlstrom7675e162013-06-10 16:18:04 -0700377 int rmdir_cache_result = rmdir(dalvik_cache_.c_str());
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700378 ASSERT_EQ(0, rmdir_cache_result);
Elliott Hughes34023802011-08-30 12:06:17 -0700379 int rmdir_data_result = rmdir(android_data_.c_str());
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700380 ASSERT_EQ(0, rmdir_data_result);
Elliott Hughes0af55432011-08-17 18:37:28 -0700381
382 // icu4c has a fixed 10-element array "gCommonICUDataArray".
383 // If we run > 10 tests, we fill that array and u_setCommonData fails.
384 // There's a function to clear the array, but it's not public...
385 typedef void (*IcuCleanupFn)();
386 void* sym = dlsym(RTLD_DEFAULT, "u_cleanup_" U_ICU_VERSION_SHORT);
387 CHECK(sym != NULL);
388 IcuCleanupFn icu_cleanup_fn = reinterpret_cast<IcuCleanupFn>(sym);
389 (*icu_cleanup_fn)();
Ian Rogers0cfe1fb2011-08-26 03:29:44 -0700390
Ian Rogers1212a022013-03-04 10:48:41 -0800391 compiler_driver_.reset();
Elliott Hughes4d6850c2012-01-18 15:55:06 -0800392 STLDeleteElements(&opened_dex_files_);
Ian Rogers2c8f6532011-09-02 17:16:34 -0700393
Elliott Hughesb3bd5f02012-03-08 21:05:27 -0800394 Runtime::Current()->GetHeap()->VerifyHeap(); // Check for heap corruption after the test
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700395 }
Jesse Wilsonac5b9e22011-07-27 15:11:13 -0400396
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700397 std::string GetLibCoreDexFileName() {
Brian Carlstrom3b010aa2013-06-25 23:06:36 -0700398 return GetDexFileName("core-libart");
Brian Carlstrom265091e2013-01-30 14:08:26 -0800399 }
400
Brian Carlstrom654d9192013-04-30 18:35:32 -0700401 std::string GetConscryptFileName() {
402 return GetDexFileName("conscrypt");
403 }
404
Brian Carlstrom265091e2013-01-30 14:08:26 -0800405 std::string GetDexFileName(const std::string& jar_prefix) {
Elliott Hughes76160052012-12-12 16:31:20 -0800406 if (IsHost()) {
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700407 const char* host_dir = getenv("ANDROID_HOST_OUT");
408 CHECK(host_dir != NULL);
Brian Carlstrom265091e2013-01-30 14:08:26 -0800409 return StringPrintf("%s/framework/%s-hostdex.jar", host_dir, jar_prefix.c_str());
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700410 }
Brian Carlstrom265091e2013-01-30 14:08:26 -0800411 return StringPrintf("%s/framework/%s.jar", GetAndroidRoot(), jar_prefix.c_str());
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700412 }
413
Brian Carlstrom3f47c122013-03-07 00:02:40 -0800414 std::string GetTestAndroidRoot() {
415 if (IsHost()) {
416 const char* host_dir = getenv("ANDROID_HOST_OUT");
417 CHECK(host_dir != NULL);
418 return host_dir;
419 }
420 return GetAndroidRoot();
421 }
422
Ian Rogers33e95662013-05-20 20:29:14 -0700423 const DexFile* OpenTestDexFile(const char* name) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700424 CHECK(name != NULL);
425 std::string filename;
Elliott Hughes76160052012-12-12 16:31:20 -0800426 if (IsHost()) {
Brian Carlstromb2793372012-03-17 18:27:16 -0700427 filename += getenv("ANDROID_HOST_OUT");
428 filename += "/framework/";
429 } else {
430 filename += "/data/nativetest/art/";
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700431 }
Brian Carlstromb2793372012-03-17 18:27:16 -0700432 filename += "art-test-dex-";
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700433 filename += name;
434 filename += ".jar";
Brian Carlstroma004aa92012-02-08 18:05:09 -0800435 const DexFile* dex_file = DexFile::Open(filename, filename);
Brian Carlstrom69b15fb2011-09-03 12:25:21 -0700436 CHECK(dex_file != NULL) << "Failed to open " << filename;
Brian Carlstrome0948e12013-08-29 09:36:15 -0700437 CHECK_EQ(PROT_READ, dex_file->GetPermissions());
438 CHECK(dex_file->IsReadOnly());
Elliott Hughes4d6850c2012-01-18 15:55:06 -0800439 opened_dex_files_.push_back(dex_file);
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700440 return dex_file;
441 }
442
Ian Rogers33e95662013-05-20 20:29:14 -0700443 jobject LoadDex(const char* dex_name) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Brian Carlstrom9baa4ae2011-09-01 21:14:14 -0700444 const DexFile* dex_file = OpenTestDexFile(dex_name);
445 CHECK(dex_file != NULL);
Brian Carlstrom9baa4ae2011-09-01 21:14:14 -0700446 class_linker_->RegisterDexFile(*dex_file);
447 std::vector<const DexFile*> class_path;
448 class_path.push_back(dex_file);
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700449 ScopedObjectAccessUnchecked soa(Thread::Current());
450 ScopedLocalRef<jobject> class_loader_local(soa.Env(),
451 soa.Env()->AllocObject(WellKnownClasses::dalvik_system_PathClassLoader));
452 jobject class_loader = soa.Env()->NewGlobalRef(class_loader_local.get());
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800453 soa.Self()->SetClassLoaderOverride(soa.Decode<mirror::ClassLoader*>(class_loader_local.get()));
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700454 Runtime::Current()->SetCompileTimeClassPath(class_loader, class_path);
455 return class_loader;
Brian Carlstrom9baa4ae2011-09-01 21:14:14 -0700456 }
457
Ian Rogers33e95662013-05-20 20:29:14 -0700458 void CompileClass(mirror::ClassLoader* class_loader, const char* class_name)
459 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Elliott Hughes95572412011-12-13 18:14:20 -0800460 std::string class_descriptor(DotToDescriptor(class_name));
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800461 mirror::Class* klass = class_linker_->FindClass(class_descriptor.c_str(), class_loader);
Brian Carlstromaded5f72011-10-07 17:15:04 -0700462 CHECK(klass != NULL) << "Class not found " << class_name;
463 for (size_t i = 0; i < klass->NumDirectMethods(); i++) {
464 CompileMethod(klass->GetDirectMethod(i));
465 }
466 for (size_t i = 0; i < klass->NumVirtualMethods(); i++) {
467 CompileMethod(klass->GetVirtualMethod(i));
468 }
469 }
470
Brian Carlstromea46f952013-07-30 01:26:50 -0700471 void CompileMethod(mirror::ArtMethod* method) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Brian Carlstrom9baa4ae2011-09-01 21:14:14 -0700472 CHECK(method != NULL);
Anwar Ghuloum6f28d912013-07-24 15:02:53 -0700473 base::TimingLogger timings("CommonTest::CompileMethod", false, false);
Anwar Ghuloumbe576f42013-07-25 17:32:40 -0700474 timings.StartSplit("CompileOne");
Brian Carlstrom45602482013-07-21 22:07:55 -0700475 compiler_driver_->CompileOne(method, timings);
Brian Carlstrom3320cf42011-10-04 14:58:28 -0700476 MakeExecutable(method);
Brian Carlstrom9baa4ae2011-09-01 21:14:14 -0700477 }
478
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800479 void CompileDirectMethod(mirror::ClassLoader* class_loader,
Brian Carlstrom9baa4ae2011-09-01 21:14:14 -0700480 const char* class_name,
481 const char* method_name,
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700482 const char* signature)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700483 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Elliott Hughes95572412011-12-13 18:14:20 -0800484 std::string class_descriptor(DotToDescriptor(class_name));
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800485 mirror::Class* klass = class_linker_->FindClass(class_descriptor.c_str(), class_loader);
Brian Carlstrom9baa4ae2011-09-01 21:14:14 -0700486 CHECK(klass != NULL) << "Class not found " << class_name;
Brian Carlstromea46f952013-07-30 01:26:50 -0700487 mirror::ArtMethod* method = klass->FindDirectMethod(method_name, signature);
Elliott Hughes0f4c41d2011-09-04 14:58:03 -0700488 CHECK(method != NULL) << "Direct method not found: "
489 << class_name << "." << method_name << signature;
Brian Carlstrom9baa4ae2011-09-01 21:14:14 -0700490 CompileMethod(method);
491 }
492
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800493 void CompileVirtualMethod(mirror::ClassLoader* class_loader,
Brian Carlstrom9baa4ae2011-09-01 21:14:14 -0700494 const char* class_name,
495 const char* method_name,
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700496 const char* signature)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700497 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Elliott Hughes95572412011-12-13 18:14:20 -0800498 std::string class_descriptor(DotToDescriptor(class_name));
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800499 mirror::Class* klass = class_linker_->FindClass(class_descriptor.c_str(), class_loader);
Brian Carlstrom9baa4ae2011-09-01 21:14:14 -0700500 CHECK(klass != NULL) << "Class not found " << class_name;
Brian Carlstromea46f952013-07-30 01:26:50 -0700501 mirror::ArtMethod* method = klass->FindVirtualMethod(method_name, signature);
Elliott Hughes0f4c41d2011-09-04 14:58:03 -0700502 CHECK(method != NULL) << "Virtual method not found: "
503 << class_name << "." << method_name << signature;
Brian Carlstrom9baa4ae2011-09-01 21:14:14 -0700504 CompileMethod(method);
505 }
506
Brian Carlstrom700c8d32012-11-05 10:42:02 -0800507 void ReserveImageSpace() {
508 // Reserve where the image will be loaded up front so that other parts of test set up don't
509 // accidentally end up colliding with the fixed memory address when we need to load the image.
Brian Carlstrom2d888622013-07-18 17:02:00 -0700510 image_reservation_.reset(MemMap::MapAnonymous("image reservation",
511 reinterpret_cast<byte*>(ART_BASE_ADDRESS),
Brian Carlstrom700c8d32012-11-05 10:42:02 -0800512 (size_t)100 * 1024 * 1024, // 100MB
513 PROT_NONE));
514 }
515
516 void UnreserveImageSpace() {
517 image_reservation_.reset();
518 }
519
Elliott Hughes34023802011-08-30 12:06:17 -0700520 std::string android_data_;
Brian Carlstrom7675e162013-06-10 16:18:04 -0700521 std::string dalvik_cache_;
Brian Carlstroma004aa92012-02-08 18:05:09 -0800522 const DexFile* java_lang_dex_file_; // owned by runtime_
Brian Carlstrom654d9192013-04-30 18:35:32 -0700523 const DexFile* conscrypt_file_; // owned by runtime_
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700524 std::vector<const DexFile*> boot_class_path_;
Elliott Hughes90a33692011-08-30 13:27:07 -0700525 UniquePtr<Runtime> runtime_;
Ian Rogers0e073f72011-09-09 10:45:46 -0700526 // Owned by the runtime
Carl Shapiro7a909592011-07-24 19:21:59 -0700527 ClassLinker* class_linker_;
Ian Rogers1212a022013-03-04 10:48:41 -0800528 UniquePtr<CompilerDriver> compiler_driver_;
Brian Carlstrom9baa4ae2011-09-01 21:14:14 -0700529
530 private:
Elliott Hughes4d6850c2012-01-18 15:55:06 -0800531 std::vector<const DexFile*> opened_dex_files_;
Brian Carlstrom700c8d32012-11-05 10:42:02 -0800532 UniquePtr<MemMap> image_reservation_;
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700533};
534
Elliott Hughesb264f082012-04-06 17:10:10 -0700535// Sets a CheckJni abort hook to catch failures. Note that this will cause CheckJNI to carry on
536// rather than aborting, so be careful!
537class CheckJniAbortCatcher {
538 public:
539 CheckJniAbortCatcher() : vm_(Runtime::Current()->GetJavaVM()) {
540 vm_->check_jni_abort_hook = Hook;
541 vm_->check_jni_abort_hook_data = &actual_;
542 }
543
544 ~CheckJniAbortCatcher() {
545 vm_->check_jni_abort_hook = NULL;
546 vm_->check_jni_abort_hook_data = NULL;
Elliott Hughes56ef0422012-06-19 14:35:04 -0700547 EXPECT_TRUE(actual_.empty()) << actual_;
Elliott Hughesb264f082012-04-06 17:10:10 -0700548 }
549
550 void Check(const char* expected_text) {
551 EXPECT_TRUE(actual_.find(expected_text) != std::string::npos) << "\n"
552 << "Expected to find: " << expected_text << "\n"
553 << "In the output : " << actual_;
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700554 actual_.clear();
Elliott Hughesb264f082012-04-06 17:10:10 -0700555 }
556
557 private:
558 static void Hook(void* data, const std::string& reason) {
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700559 // We use += because when we're hooking the aborts like this, multiple problems can be found.
560 *reinterpret_cast<std::string*>(data) += reason;
Elliott Hughesb264f082012-04-06 17:10:10 -0700561 }
562
563 JavaVMExt* vm_;
564 std::string actual_;
565
566 DISALLOW_COPY_AND_ASSIGN(CheckJniAbortCatcher);
567};
568
Brian Carlstrom265091e2013-01-30 14:08:26 -0800569// TODO: These tests were disabled for portable when we went to having
570// MCLinker link LLVM ELF output because we no longer just have code
571// blobs in memory. We'll need to dlopen to load and relocate
572// temporary output to resurrect these tests.
573#if defined(ART_USE_PORTABLE_COMPILER)
574#define TEST_DISABLED_FOR_PORTABLE() printf("WARNING: TEST DISABLED FOR PORTABLE\n"); return
575#else
576#define TEST_DISABLED_FOR_PORTABLE()
577#endif
578
Brian Carlstrom934486c2011-07-12 23:42:50 -0700579} // namespace art
Elliott Hughes34023802011-08-30 12:06:17 -0700580
581namespace std {
582
583// TODO: isn't gtest supposed to be able to print STL types for itself?
584template <typename T>
585std::ostream& operator<<(std::ostream& os, const std::vector<T>& rhs) {
Elliott Hughes14134a12011-09-30 16:55:51 -0700586 os << ::art::ToString(rhs);
Elliott Hughes34023802011-08-30 12:06:17 -0700587 return os;
588}
589
590} // namespace std
Brian Carlstromfc0e3212013-07-17 14:40:12 -0700591
592#endif // ART_RUNTIME_COMMON_TEST_H_