blob: 88da8a202380791303fd15507996c9d4b6e5a7a1 [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 Carlstromb0460ea2011-07-29 10:08:05 -070017#include <dirent.h>
Elliott Hughes0af55432011-08-17 18:37:28 -070018#include <dlfcn.h>
Brian Carlstrom27ec9612011-09-19 20:20:38 -070019#include <sys/mman.h>
Brian Carlstromb0460ea2011-07-29 10:08:05 -070020#include <sys/stat.h>
21#include <sys/types.h>
22
Elliott Hughesf66330a2012-12-12 17:27:00 -080023#include "../../external/icu4c/common/unicode/uvernum.h"
Elliott Hughes76160052012-12-12 16:31:20 -080024#include "base/macros.h"
Elliott Hughes1aa246d2012-12-13 09:29:36 -080025#include "base/stl_util.h"
Elliott Hughese222ee02012-12-13 14:41:43 -080026#include "base/stringprintf.h"
Elliott Hughes76160052012-12-12 16:31:20 -080027#include "base/unix_file/fd_file.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070028#include "class_linker.h"
Ian Rogers1212a022013-03-04 10:48:41 -080029#include "compiler/driver/compiler_driver.h"
Ian Rogers4f6ad8a2013-03-18 15:27:28 -070030#include "dex_file-inl.h"
Ian Rogers1d54e732013-05-02 21:10:01 -070031#include "gc/heap.h"
Elliott Hughes90a33692011-08-30 13:27:07 -070032#include "gtest/gtest.h"
Elliott Hughes0f3c5532012-03-30 14:51:51 -070033#include "instruction_set.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080034#include "mirror/class_loader.h"
Brian Carlstrom3320cf42011-10-04 14:58:28 -070035#include "oat_file.h"
Ian Rogers6d4d9fc2011-11-30 16:24:48 -080036#include "object_utils.h"
Brian Carlstrom33f741e2011-10-03 11:24:05 -070037#include "os.h"
Brian Carlstrom1f870082011-08-23 16:02:11 -070038#include "runtime.h"
Jeff Hao58df3272013-04-22 15:28:53 -070039#include "runtime_support.h"
Ian Rogers00f7d0e2012-07-19 15:28:27 -070040#include "scoped_thread_state_change.h"
Elliott Hughese222ee02012-12-13 14:41:43 -080041#include "ScopedLocalRef.h"
Elliott Hughes90a33692011-08-30 13:27:07 -070042#include "thread.h"
Elliott Hughes0f3c5532012-03-30 14:51:51 -070043#include "UniquePtr.h"
Ian Rogers00f7d0e2012-07-19 15:28:27 -070044#include "well_known_classes.h"
Elliott Hughes0af55432011-08-17 18:37:28 -070045
Brian Carlstrom934486c2011-07-12 23:42:50 -070046namespace art {
47
Brian Carlstromb9cc1ca2012-01-27 00:57:42 -080048static const byte kBase64Map[256] = {
49 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
50 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
51 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
52 255, 255, 255, 255, 255, 255, 255, 62, 255, 255, 255, 63,
53 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 255, 255,
54 255, 254, 255, 255, 255, 0, 1, 2, 3, 4, 5, 6,
Elliott Hughesa21039c2012-06-21 12:09:25 -070055 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, // NOLINT
56 19, 20, 21, 22, 23, 24, 25, 255, 255, 255, 255, 255, // NOLINT
Brian Carlstromb9cc1ca2012-01-27 00:57:42 -080057 255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36,
Elliott Hughesa21039c2012-06-21 12:09:25 -070058 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, // NOLINT
59 49, 50, 51, 255, 255, 255, 255, 255, 255, 255, 255, 255, // NOLINT
Brian Carlstromb9cc1ca2012-01-27 00:57:42 -080060 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
61 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
62 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
63 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
71};
72
73byte* DecodeBase64(const char* src, size_t* dst_size) {
74 std::vector<byte> tmp;
Elliott Hughesa21039c2012-06-21 12:09:25 -070075 uint32_t t = 0, y = 0;
Brian Carlstromb9cc1ca2012-01-27 00:57:42 -080076 int g = 3;
77 for (size_t i = 0; src[i] != '\0'; ++i) {
78 byte c = kBase64Map[src[i] & 0xFF];
79 if (c == 255) continue;
80 // the final = symbols are read and used to trim the remaining bytes
81 if (c == 254) {
82 c = 0;
83 // prevent g < 0 which would potentially allow an overflow later
84 if (--g < 0) {
Brian Carlstrom51477332012-03-25 20:20:26 -070085 *dst_size = 0;
Brian Carlstromb9cc1ca2012-01-27 00:57:42 -080086 return NULL;
87 }
88 } else if (g != 3) {
89 // we only allow = to be at the end
Brian Carlstrom51477332012-03-25 20:20:26 -070090 *dst_size = 0;
Brian Carlstromb9cc1ca2012-01-27 00:57:42 -080091 return NULL;
92 }
93 t = (t << 6) | c;
94 if (++y == 4) {
95 tmp.push_back((t >> 16) & 255);
96 if (g > 1) {
97 tmp.push_back((t >> 8) & 255);
98 }
99 if (g > 2) {
100 tmp.push_back(t & 255);
101 }
102 y = t = 0;
103 }
104 }
105 if (y != 0) {
Brian Carlstrom51477332012-03-25 20:20:26 -0700106 *dst_size = 0;
Brian Carlstromb9cc1ca2012-01-27 00:57:42 -0800107 return NULL;
108 }
109 UniquePtr<byte[]> dst(new byte[tmp.size()]);
110 if (dst_size != NULL) {
111 *dst_size = tmp.size();
Brian Carlstrom51477332012-03-25 20:20:26 -0700112 } else {
113 *dst_size = 0;
Brian Carlstromb9cc1ca2012-01-27 00:57:42 -0800114 }
115 std::copy(tmp.begin(), tmp.end(), dst.get());
116 return dst.release();
117}
118
Brian Carlstromdb4d5402011-08-09 12:18:28 -0700119class ScratchFile {
120 public:
121 ScratchFile() {
Elliott Hughes34023802011-08-30 12:06:17 -0700122 filename_ = getenv("ANDROID_DATA");
123 filename_ += "/TmpFile-XXXXXX";
Elliott Hughes76160052012-12-12 16:31:20 -0800124 int fd = mkstemp(&filename_[0]);
125 CHECK_NE(-1, fd);
126 file_.reset(new File(fd, GetFilename()));
Brian Carlstromdb4d5402011-08-09 12:18:28 -0700127 }
128
129 ~ScratchFile() {
Elliott Hughes34023802011-08-30 12:06:17 -0700130 int unlink_result = unlink(filename_.c_str());
Brian Carlstromdb4d5402011-08-09 12:18:28 -0700131 CHECK_EQ(0, unlink_result);
Brian Carlstromdb4d5402011-08-09 12:18:28 -0700132 }
133
Brian Carlstroma004aa92012-02-08 18:05:09 -0800134 const std::string& GetFilename() const {
135 return filename_;
Brian Carlstromdb4d5402011-08-09 12:18:28 -0700136 }
137
Elliott Hughes234da572011-11-03 22:13:06 -0700138 File* GetFile() const {
139 return file_.get();
140 }
141
Brian Carlstromdb4d5402011-08-09 12:18:28 -0700142 int GetFd() const {
Elliott Hughes76160052012-12-12 16:31:20 -0800143 return file_->Fd();
Brian Carlstromdb4d5402011-08-09 12:18:28 -0700144 }
145
146 private:
Elliott Hughes34023802011-08-30 12:06:17 -0700147 std::string filename_;
Elliott Hughes234da572011-11-03 22:13:06 -0700148 UniquePtr<File> file_;
Brian Carlstromdb4d5402011-08-09 12:18:28 -0700149};
150
Brian Carlstromf734cf52011-08-17 16:28:14 -0700151class CommonTest : public testing::Test {
Brian Carlstrom9baa4ae2011-09-01 21:14:14 -0700152 public:
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800153 static void MakeExecutable(const mirror::ByteArray* code_array) {
Brian Carlstrom3320cf42011-10-04 14:58:28 -0700154 CHECK(code_array != NULL);
155 MakeExecutable(code_array->GetData(), code_array->GetLength());
156 }
157
Shih-wei Liao1cb0ae72012-03-16 15:30:19 -0700158 static void MakeExecutable(const std::vector<uint8_t>& code) {
Brian Carlstrom3320cf42011-10-04 14:58:28 -0700159 CHECK_NE(code.size(), 0U);
160 MakeExecutable(&code[0], code.size());
161 }
162
Brian Carlstromae826982011-11-09 01:33:42 -0800163 // Create an OatMethod based on pointers (for unit tests)
164 OatFile::OatMethod CreateOatMethod(const void* code,
165 const size_t frame_size_in_bytes,
166 const uint32_t core_spill_mask,
167 const uint32_t fp_spill_mask,
168 const uint32_t* mapping_table,
169 const uint16_t* vmap_table,
Jeff Hao74180ca2013-03-27 15:29:11 -0700170 const uint8_t* gc_map) {
Brian Carlstromae826982011-11-09 01:33:42 -0800171 return OatFile::OatMethod(NULL,
172 reinterpret_cast<uint32_t>(code),
173 frame_size_in_bytes,
174 core_spill_mask,
175 fp_spill_mask,
176 reinterpret_cast<uint32_t>(mapping_table),
177 reinterpret_cast<uint32_t>(vmap_table),
Jeff Hao74180ca2013-03-27 15:29:11 -0700178 reinterpret_cast<uint32_t>(gc_map)
Logan Chien0c717dd2012-03-28 18:31:07 +0800179 );
Brian Carlstromae826982011-11-09 01:33:42 -0800180 }
181
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800182 void MakeExecutable(mirror::AbstractMethod* method) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Brian Carlstrom3320cf42011-10-04 14:58:28 -0700183 CHECK(method != NULL);
Jeff Hao74180ca2013-03-27 15:29:11 -0700184 LOG(INFO) << "MakeExecutable " << PrettyMethod(method);
Brian Carlstrom3320cf42011-10-04 14:58:28 -0700185
Ian Rogersf3e98552013-03-20 15:49:49 -0700186 const CompiledMethod* compiled_method = NULL;
Brian Carlstrom3320cf42011-10-04 14:58:28 -0700187 if (!method->IsAbstract()) {
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800188 const mirror::DexCache* dex_cache = method->GetDeclaringClass()->GetDexCache();
Ian Rogers4445a7e2012-10-05 17:19:13 -0700189 const DexFile& dex_file = *dex_cache->GetDexFile();
Ian Rogersf3e98552013-03-20 15:49:49 -0700190 compiled_method =
Ian Rogers1212a022013-03-04 10:48:41 -0800191 compiler_driver_->GetCompiledMethod(CompilerDriver::MethodReference(&dex_file,
192 method->GetDexMethodIndex()));
Logan Chienf7015fd2012-03-18 01:19:37 +0800193
Anwar Ghuloumc4f105d2013-04-10 16:12:11 -0700194#ifndef ART_LIGHT_MODE
Ian Rogersf3e98552013-03-20 15:49:49 -0700195 CHECK(compiled_method != NULL) << PrettyMethod(method);
196#endif
197 }
198 if (compiled_method != NULL) {
Logan Chien971bf3f2012-05-01 15:47:55 +0800199 const std::vector<uint8_t>& code = compiled_method->GetCode();
200 MakeExecutable(code);
201 const void* method_code = CompiledMethod::CodePointer(&code[0],
202 compiled_method->GetInstructionSet());
Brian Carlstrom3320cf42011-10-04 14:58:28 -0700203 LOG(INFO) << "MakeExecutable " << PrettyMethod(method) << " code=" << method_code;
Brian Carlstromae826982011-11-09 01:33:42 -0800204 OatFile::OatMethod oat_method = CreateOatMethod(method_code,
205 compiled_method->GetFrameSizeInBytes(),
206 compiled_method->GetCoreSpillMask(),
207 compiled_method->GetFpSpillMask(),
208 &compiled_method->GetMappingTable()[0],
209 &compiled_method->GetVmapTable()[0],
Jeff Hao74180ca2013-03-27 15:29:11 -0700210 NULL);
Brian Carlstrom265091e2013-01-30 14:08:26 -0800211 oat_method.LinkMethod(method);
Brian Carlstrom3320cf42011-10-04 14:58:28 -0700212 } else {
Ian Rogersf3e98552013-03-20 15:49:49 -0700213 const void* method_code;
214 if (method->IsAbstract()) {
Jeff Hao79fe5392013-04-24 18:41:58 -0700215 method_code = GetAbstractMethodErrorStub();
Ian Rogersf3e98552013-03-20 15:49:49 -0700216 } else {
217 // No code? You must mean to go into the interpreter.
218 method_code = GetInterpreterEntryPoint();
219 }
Brian Carlstrom3320cf42011-10-04 14:58:28 -0700220 LOG(INFO) << "MakeExecutable " << PrettyMethod(method) << " code=" << method_code;
Brian Carlstromae826982011-11-09 01:33:42 -0800221 OatFile::OatMethod oat_method = CreateOatMethod(method_code,
222 kStackAlignment,
223 0,
224 0,
225 NULL,
226 NULL,
Jeff Hao74180ca2013-03-27 15:29:11 -0700227 NULL);
Brian Carlstrom265091e2013-01-30 14:08:26 -0800228 oat_method.LinkMethod(method);
Brian Carlstrom3320cf42011-10-04 14:58:28 -0700229 }
230 }
231
232 static void MakeExecutable(const void* code_start, size_t code_length) {
233 CHECK(code_start != NULL);
234 CHECK_NE(code_length, 0U);
235 uintptr_t data = reinterpret_cast<uintptr_t>(code_start);
Brian Carlstrom9baa4ae2011-09-01 21:14:14 -0700236 uintptr_t base = RoundDown(data, kPageSize);
Brian Carlstrom3320cf42011-10-04 14:58:28 -0700237 uintptr_t limit = RoundUp(data + code_length, kPageSize);
Brian Carlstrom9baa4ae2011-09-01 21:14:14 -0700238 uintptr_t len = limit - base;
239 int result = mprotect(reinterpret_cast<void*>(base), len, PROT_READ | PROT_WRITE | PROT_EXEC);
Brian Carlstrom7a00a3c2012-01-25 18:38:03 -0800240 CHECK_EQ(result, 0);
Shih-wei Liao24782c62012-01-08 12:46:11 -0800241
Ian Rogers16341552011-10-10 11:33:06 -0700242 // Flush instruction cache
Shih-wei Liao24782c62012-01-08 12:46:11 -0800243 // Only uses __builtin___clear_cache if GCC >= 4.3.3
244#if GCC_VERSION >= 40303
Ian Rogers16341552011-10-10 11:33:06 -0700245 __builtin___clear_cache(reinterpret_cast<void*>(base), reinterpret_cast<void*>(base + len));
Brian Carlstrom7a00a3c2012-01-25 18:38:03 -0800246#else
Ian Rogers33e95662013-05-20 20:29:14 -0700247 LOG(FATAL) << "UNIMPLEMENTED: cache flush";
Shih-wei Liao24782c62012-01-08 12:46:11 -0800248#endif
Brian Carlstrom9baa4ae2011-09-01 21:14:14 -0700249 }
250
Elliott Hughes76160052012-12-12 16:31:20 -0800251 static void SetEnvironmentVariables(std::string& android_data) {
252 if (IsHost()) {
Elliott Hughes0af55432011-08-17 18:37:28 -0700253 // $ANDROID_ROOT is set on the device, but not on the host.
254 // We need to set this so that icu4c can find its locale data.
255 std::string root;
256 root += getenv("ANDROID_BUILD_TOP");
Elliott Hughesa0cb1202012-01-23 17:34:32 -0800257#if defined(__linux__)
Elliott Hughes0af55432011-08-17 18:37:28 -0700258 root += "/out/host/linux-x86";
Elliott Hughesa0cb1202012-01-23 17:34:32 -0800259#elif defined(__APPLE__)
260 root += "/out/host/darwin-x86";
261#else
262#error unsupported OS
263#endif
Elliott Hughes0af55432011-08-17 18:37:28 -0700264 setenv("ANDROID_ROOT", root.c_str(), 1);
Ian Rogers2fa6b2e2012-10-17 00:10:17 -0700265 setenv("LD_LIBRARY_PATH", ":", 0); // Required by java.lang.System.<clinit>.
Elliott Hughes0af55432011-08-17 18:37:28 -0700266 }
267
Brian Carlstrom7675e162013-06-10 16:18:04 -0700268 // On target, Cannot use /mnt/sdcard because it is mounted noexec, so use subdir of dalvik-cache
269 android_data = (IsHost() ? "/tmp/art-data-XXXXXX" : "/data/dalvik-cache/art-data-XXXXXX");
Elliott Hughes76160052012-12-12 16:31:20 -0800270 if (mkdtemp(&android_data[0]) == NULL) {
271 PLOG(FATAL) << "mkdtemp(\"" << &android_data[0] << "\") failed";
Elliott Hughes0f4c41d2011-09-04 14:58:03 -0700272 }
Elliott Hughes76160052012-12-12 16:31:20 -0800273 setenv("ANDROID_DATA", android_data.c_str(), 1);
274 }
275
276 protected:
277 static bool IsHost() {
278 return (getenv("ANDROID_BUILD_TOP") != NULL);
279 }
280
281 virtual void SetUp() {
282 SetEnvironmentVariables(android_data_);
Brian Carlstrom7675e162013-06-10 16:18:04 -0700283 dalvik_cache_.append(android_data_.c_str());
284 dalvik_cache_.append("/dalvik-cache");
285 int mkdir_result = mkdir(dalvik_cache_.c_str(), 0700);
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700286 ASSERT_EQ(mkdir_result, 0);
287
Brian Carlstroma004aa92012-02-08 18:05:09 -0800288 java_lang_dex_file_ = DexFile::Open(GetLibCoreDexFileName(), GetLibCoreDexFileName());
Ian Rogers33e95662013-05-20 20:29:14 -0700289 if (java_lang_dex_file_ == NULL) {
290 LOG(FATAL) << "Could not open .dex file '" << GetLibCoreDexFileName() << "'\n";
291 }
Brian Carlstrom654d9192013-04-30 18:35:32 -0700292 conscrypt_file_ = DexFile::Open(GetConscryptFileName(), GetConscryptFileName());
Ian Rogers33e95662013-05-20 20:29:14 -0700293 if (conscrypt_file_ == NULL) {
294 LOG(FATAL) << "Could not open .dex file '" << GetConscryptFileName() << "'\n";
295 }
Brian Carlstroma004aa92012-02-08 18:05:09 -0800296 boot_class_path_.push_back(java_lang_dex_file_);
Brian Carlstrom654d9192013-04-30 18:35:32 -0700297 boot_class_path_.push_back(conscrypt_file_);
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700298
Ian Rogers1d54e732013-05-02 21:10:01 -0700299 std::string min_heap_string(StringPrintf("-Xms%zdm", gc::Heap::kDefaultInitialSize / MB));
300 std::string max_heap_string(StringPrintf("-Xmx%zdm", gc::Heap::kDefaultMaximumSize / MB));
Ian Rogers30fab402012-01-23 15:43:46 -0800301
Brian Carlstrom69b15fb2011-09-03 12:25:21 -0700302 Runtime::Options options;
Brian Carlstroma4a7b482011-10-16 15:29:16 -0700303 options.push_back(std::make_pair("compiler", reinterpret_cast<void*>(NULL)));
Brian Carlstroma004aa92012-02-08 18:05:09 -0800304 options.push_back(std::make_pair("bootclasspath", &boot_class_path_));
Brian Carlstrom69b15fb2011-09-03 12:25:21 -0700305 options.push_back(std::make_pair("-Xcheck:jni", reinterpret_cast<void*>(NULL)));
Ian Rogers30fab402012-01-23 15:43:46 -0800306 options.push_back(std::make_pair(min_heap_string.c_str(), reinterpret_cast<void*>(NULL)));
307 options.push_back(std::make_pair(max_heap_string.c_str(), reinterpret_cast<void*>(NULL)));
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700308 if(!Runtime::Create(options, false)) {
309 LOG(FATAL) << "Failed to create runtime";
310 return;
311 }
312 runtime_.reset(Runtime::Current());
313 // Runtime::Create acquired the mutator_lock_ that is normally given away when we Runtime::Start,
314 // give it away now and then switch to a more managable ScopedObjectAccess.
315 Thread::Current()->TransitionFromRunnableToSuspended(kNative);
Ian Rogers1d54e732013-05-02 21:10:01 -0700316 {
317 ScopedObjectAccess soa(Thread::Current());
318 ASSERT_TRUE(runtime_.get() != NULL);
319 class_linker_ = runtime_->GetClassLinker();
Ian Rogers0cfe1fb2011-08-26 03:29:44 -0700320
Ian Rogers1d54e732013-05-02 21:10:01 -0700321 InstructionSet instruction_set = kNone;
jeffhaoc0228b82012-08-29 18:15:05 -0700322#if defined(__arm__)
Ian Rogers1d54e732013-05-02 21:10:01 -0700323 instruction_set = kThumb2;
jeffhaoc0228b82012-08-29 18:15:05 -0700324#elif defined(__mips__)
Ian Rogers1d54e732013-05-02 21:10:01 -0700325 instruction_set = kMips;
jeffhaoc0228b82012-08-29 18:15:05 -0700326#elif defined(__i386__)
Ian Rogers1d54e732013-05-02 21:10:01 -0700327 instruction_set = kX86;
Ian Rogers2c8f6532011-09-02 17:16:34 -0700328#endif
buzbeec531cef2012-10-18 07:09:20 -0700329
Ian Rogers1d54e732013-05-02 21:10:01 -0700330 // TODO: make selectable
buzbeec531cef2012-10-18 07:09:20 -0700331#if defined(ART_USE_PORTABLE_COMPILER)
Ian Rogers1d54e732013-05-02 21:10:01 -0700332 CompilerBackend compiler_backend = kPortable;
buzbeec531cef2012-10-18 07:09:20 -0700333#else
Ian Rogers1d54e732013-05-02 21:10:01 -0700334 CompilerBackend compiler_backend = kQuick;
buzbeec531cef2012-10-18 07:09:20 -0700335#endif
336
Ian Rogers1d54e732013-05-02 21:10:01 -0700337 if (!runtime_->HasResolutionMethod()) {
338 runtime_->SetResolutionMethod(runtime_->CreateResolutionMethod());
Ian Rogers4f0d07c2011-10-06 23:38:47 -0700339 }
Ian Rogers1d54e732013-05-02 21:10:01 -0700340 for (int i = 0; i < Runtime::kLastCalleeSaveType; i++) {
341 Runtime::CalleeSaveType type = Runtime::CalleeSaveType(i);
342 if (!runtime_->HasCalleeSaveMethod(type)) {
343 runtime_->SetCalleeSaveMethod(
344 runtime_->CreateCalleeSaveMethod(instruction_set, type), type);
345 }
346 }
347 class_linker_->FixupDexCaches(runtime_->GetResolutionMethod());
348 compiler_driver_.reset(new CompilerDriver(compiler_backend, instruction_set,
349 true, new CompilerDriver::DescriptorSet,
350 2, false, true, true));
Ian Rogers4f0d07c2011-10-06 23:38:47 -0700351 }
Brian Carlstrom96391602013-06-13 19:49:50 -0700352 // We typically don't generate an image in unit tests, disable this optimization by default.
353 compiler_driver_->SetSupportBootImageFixup(false);
Ian Rogers2c8f6532011-09-02 17:16:34 -0700354
Ian Rogers1d54e732013-05-02 21:10:01 -0700355 // We're back in native, take the opportunity to initialize well known classes.
356 WellKnownClasses::InitClasses(Thread::Current()->GetJniEnv());
Mathieu Chartier02b6a782012-10-26 13:51:26 -0700357 // Create the heap thread pool so that the GC runs in parallel for tests. Normally, the thread
358 // pool is created by the runtime.
359 runtime_->GetHeap()->CreateThreadPool();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700360 runtime_->GetHeap()->VerifyHeap(); // Check for heap corruption before the test
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700361 }
362
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700363 virtual void TearDown() {
364 const char* android_data = getenv("ANDROID_DATA");
365 ASSERT_TRUE(android_data != NULL);
Brian Carlstrom7675e162013-06-10 16:18:04 -0700366 DIR* dir = opendir(dalvik_cache_.c_str());
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700367 ASSERT_TRUE(dir != NULL);
Elliott Hughes4696b5b2012-10-30 10:35:10 -0700368 dirent* e;
369 while ((e = readdir(dir)) != NULL) {
370 if ((strcmp(e->d_name, ".") == 0) || (strcmp(e->d_name, "..") == 0)) {
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700371 continue;
372 }
Brian Carlstrom7675e162013-06-10 16:18:04 -0700373 std::string filename(dalvik_cache_);
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700374 filename.push_back('/');
Elliott Hughes4696b5b2012-10-30 10:35:10 -0700375 filename.append(e->d_name);
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700376 int unlink_result = unlink(filename.c_str());
377 ASSERT_EQ(0, unlink_result);
Jesse Wilsonac5b9e22011-07-27 15:11:13 -0400378 }
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700379 closedir(dir);
Brian Carlstrom7675e162013-06-10 16:18:04 -0700380 int rmdir_cache_result = rmdir(dalvik_cache_.c_str());
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700381 ASSERT_EQ(0, rmdir_cache_result);
Elliott Hughes34023802011-08-30 12:06:17 -0700382 int rmdir_data_result = rmdir(android_data_.c_str());
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700383 ASSERT_EQ(0, rmdir_data_result);
Elliott Hughes0af55432011-08-17 18:37:28 -0700384
385 // icu4c has a fixed 10-element array "gCommonICUDataArray".
386 // If we run > 10 tests, we fill that array and u_setCommonData fails.
387 // There's a function to clear the array, but it's not public...
388 typedef void (*IcuCleanupFn)();
389 void* sym = dlsym(RTLD_DEFAULT, "u_cleanup_" U_ICU_VERSION_SHORT);
390 CHECK(sym != NULL);
391 IcuCleanupFn icu_cleanup_fn = reinterpret_cast<IcuCleanupFn>(sym);
392 (*icu_cleanup_fn)();
Ian Rogers0cfe1fb2011-08-26 03:29:44 -0700393
Ian Rogers1212a022013-03-04 10:48:41 -0800394 compiler_driver_.reset();
Elliott Hughes4d6850c2012-01-18 15:55:06 -0800395 STLDeleteElements(&opened_dex_files_);
Ian Rogers2c8f6532011-09-02 17:16:34 -0700396
Elliott Hughesb3bd5f02012-03-08 21:05:27 -0800397 Runtime::Current()->GetHeap()->VerifyHeap(); // Check for heap corruption after the test
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700398 }
Jesse Wilsonac5b9e22011-07-27 15:11:13 -0400399
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700400 std::string GetLibCoreDexFileName() {
Brian Carlstrom265091e2013-01-30 14:08:26 -0800401 return GetDexFileName("core");
402 }
403
Brian Carlstrom654d9192013-04-30 18:35:32 -0700404 std::string GetConscryptFileName() {
405 return GetDexFileName("conscrypt");
406 }
407
Brian Carlstrom265091e2013-01-30 14:08:26 -0800408 std::string GetDexFileName(const std::string& jar_prefix) {
Elliott Hughes76160052012-12-12 16:31:20 -0800409 if (IsHost()) {
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700410 const char* host_dir = getenv("ANDROID_HOST_OUT");
411 CHECK(host_dir != NULL);
Brian Carlstrom265091e2013-01-30 14:08:26 -0800412 return StringPrintf("%s/framework/%s-hostdex.jar", host_dir, jar_prefix.c_str());
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700413 }
Brian Carlstrom265091e2013-01-30 14:08:26 -0800414 return StringPrintf("%s/framework/%s.jar", GetAndroidRoot(), jar_prefix.c_str());
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700415 }
416
Brian Carlstrom3f47c122013-03-07 00:02:40 -0800417 std::string GetTestAndroidRoot() {
418 if (IsHost()) {
419 const char* host_dir = getenv("ANDROID_HOST_OUT");
420 CHECK(host_dir != NULL);
421 return host_dir;
422 }
423 return GetAndroidRoot();
424 }
425
Ian Rogers33e95662013-05-20 20:29:14 -0700426 const DexFile* OpenTestDexFile(const char* name) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700427 CHECK(name != NULL);
428 std::string filename;
Elliott Hughes76160052012-12-12 16:31:20 -0800429 if (IsHost()) {
Brian Carlstromb2793372012-03-17 18:27:16 -0700430 filename += getenv("ANDROID_HOST_OUT");
431 filename += "/framework/";
432 } else {
433 filename += "/data/nativetest/art/";
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700434 }
Brian Carlstromb2793372012-03-17 18:27:16 -0700435 filename += "art-test-dex-";
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700436 filename += name;
437 filename += ".jar";
Brian Carlstroma004aa92012-02-08 18:05:09 -0800438 const DexFile* dex_file = DexFile::Open(filename, filename);
Brian Carlstrom69b15fb2011-09-03 12:25:21 -0700439 CHECK(dex_file != NULL) << "Failed to open " << filename;
Elliott Hughes4d6850c2012-01-18 15:55:06 -0800440 opened_dex_files_.push_back(dex_file);
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700441 return dex_file;
442 }
443
Ian Rogers33e95662013-05-20 20:29:14 -0700444 jobject LoadDex(const char* dex_name) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Brian Carlstrom9baa4ae2011-09-01 21:14:14 -0700445 const DexFile* dex_file = OpenTestDexFile(dex_name);
446 CHECK(dex_file != NULL);
Brian Carlstrom9baa4ae2011-09-01 21:14:14 -0700447 class_linker_->RegisterDexFile(*dex_file);
448 std::vector<const DexFile*> class_path;
449 class_path.push_back(dex_file);
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700450 ScopedObjectAccessUnchecked soa(Thread::Current());
451 ScopedLocalRef<jobject> class_loader_local(soa.Env(),
452 soa.Env()->AllocObject(WellKnownClasses::dalvik_system_PathClassLoader));
453 jobject class_loader = soa.Env()->NewGlobalRef(class_loader_local.get());
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800454 soa.Self()->SetClassLoaderOverride(soa.Decode<mirror::ClassLoader*>(class_loader_local.get()));
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700455 Runtime::Current()->SetCompileTimeClassPath(class_loader, class_path);
456 return class_loader;
Brian Carlstrom9baa4ae2011-09-01 21:14:14 -0700457 }
458
Ian Rogers33e95662013-05-20 20:29:14 -0700459 void CompileClass(mirror::ClassLoader* class_loader, const char* class_name)
460 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Elliott Hughes95572412011-12-13 18:14:20 -0800461 std::string class_descriptor(DotToDescriptor(class_name));
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800462 mirror::Class* klass = class_linker_->FindClass(class_descriptor.c_str(), class_loader);
Brian Carlstromaded5f72011-10-07 17:15:04 -0700463 CHECK(klass != NULL) << "Class not found " << class_name;
464 for (size_t i = 0; i < klass->NumDirectMethods(); i++) {
465 CompileMethod(klass->GetDirectMethod(i));
466 }
467 for (size_t i = 0; i < klass->NumVirtualMethods(); i++) {
468 CompileMethod(klass->GetVirtualMethod(i));
469 }
470 }
471
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800472 void CompileMethod(mirror::AbstractMethod* method) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Brian Carlstrom9baa4ae2011-09-01 21:14:14 -0700473 CHECK(method != NULL);
Ian Rogers1212a022013-03-04 10:48:41 -0800474 compiler_driver_->CompileOne(method);
Brian Carlstrom3320cf42011-10-04 14:58:28 -0700475 MakeExecutable(method);
Brian Carlstrom9baa4ae2011-09-01 21:14:14 -0700476 }
477
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800478 void CompileDirectMethod(mirror::ClassLoader* class_loader,
Brian Carlstrom9baa4ae2011-09-01 21:14:14 -0700479 const char* class_name,
480 const char* method_name,
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700481 const char* signature)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700482 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Elliott Hughes95572412011-12-13 18:14:20 -0800483 std::string class_descriptor(DotToDescriptor(class_name));
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800484 mirror::Class* klass = class_linker_->FindClass(class_descriptor.c_str(), class_loader);
Brian Carlstrom9baa4ae2011-09-01 21:14:14 -0700485 CHECK(klass != NULL) << "Class not found " << class_name;
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800486 mirror::AbstractMethod* method = klass->FindDirectMethod(method_name, signature);
Elliott Hughes0f4c41d2011-09-04 14:58:03 -0700487 CHECK(method != NULL) << "Direct method not found: "
488 << class_name << "." << method_name << signature;
Brian Carlstrom9baa4ae2011-09-01 21:14:14 -0700489 CompileMethod(method);
490 }
491
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800492 void CompileVirtualMethod(mirror::ClassLoader* class_loader,
Brian Carlstrom9baa4ae2011-09-01 21:14:14 -0700493 const char* class_name,
494 const char* method_name,
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700495 const char* signature)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700496 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Elliott Hughes95572412011-12-13 18:14:20 -0800497 std::string class_descriptor(DotToDescriptor(class_name));
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800498 mirror::Class* klass = class_linker_->FindClass(class_descriptor.c_str(), class_loader);
Brian Carlstrom9baa4ae2011-09-01 21:14:14 -0700499 CHECK(klass != NULL) << "Class not found " << class_name;
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800500 mirror::AbstractMethod* method = klass->FindVirtualMethod(method_name, signature);
Elliott Hughes0f4c41d2011-09-04 14:58:03 -0700501 CHECK(method != NULL) << "Virtual method not found: "
502 << class_name << "." << method_name << signature;
Brian Carlstrom9baa4ae2011-09-01 21:14:14 -0700503 CompileMethod(method);
504 }
505
Brian Carlstrom700c8d32012-11-05 10:42:02 -0800506 void ReserveImageSpace() {
507 // Reserve where the image will be loaded up front so that other parts of test set up don't
508 // accidentally end up colliding with the fixed memory address when we need to load the image.
Ian Rogersa40307e2013-02-22 11:32:44 -0800509 image_reservation_.reset(MemMap::MapAnonymous("image reservation", (byte*)ART_BASE_ADDRESS,
Brian Carlstrom700c8d32012-11-05 10:42:02 -0800510 (size_t)100 * 1024 * 1024, // 100MB
511 PROT_NONE));
512 }
513
514 void UnreserveImageSpace() {
515 image_reservation_.reset();
516 }
517
Elliott Hughes34023802011-08-30 12:06:17 -0700518 std::string android_data_;
Brian Carlstrom7675e162013-06-10 16:18:04 -0700519 std::string dalvik_cache_;
Brian Carlstroma004aa92012-02-08 18:05:09 -0800520 const DexFile* java_lang_dex_file_; // owned by runtime_
Brian Carlstrom654d9192013-04-30 18:35:32 -0700521 const DexFile* conscrypt_file_; // owned by runtime_
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700522 std::vector<const DexFile*> boot_class_path_;
Elliott Hughes90a33692011-08-30 13:27:07 -0700523 UniquePtr<Runtime> runtime_;
Ian Rogers0e073f72011-09-09 10:45:46 -0700524 // Owned by the runtime
Carl Shapiro7a909592011-07-24 19:21:59 -0700525 ClassLinker* class_linker_;
Ian Rogers1212a022013-03-04 10:48:41 -0800526 UniquePtr<CompilerDriver> compiler_driver_;
Brian Carlstrom9baa4ae2011-09-01 21:14:14 -0700527
528 private:
Elliott Hughes4d6850c2012-01-18 15:55:06 -0800529 std::vector<const DexFile*> opened_dex_files_;
Brian Carlstrom700c8d32012-11-05 10:42:02 -0800530 UniquePtr<MemMap> image_reservation_;
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700531};
532
Elliott Hughesb264f082012-04-06 17:10:10 -0700533// Sets a CheckJni abort hook to catch failures. Note that this will cause CheckJNI to carry on
534// rather than aborting, so be careful!
535class CheckJniAbortCatcher {
536 public:
537 CheckJniAbortCatcher() : vm_(Runtime::Current()->GetJavaVM()) {
538 vm_->check_jni_abort_hook = Hook;
539 vm_->check_jni_abort_hook_data = &actual_;
540 }
541
542 ~CheckJniAbortCatcher() {
543 vm_->check_jni_abort_hook = NULL;
544 vm_->check_jni_abort_hook_data = NULL;
Elliott Hughes56ef0422012-06-19 14:35:04 -0700545 EXPECT_TRUE(actual_.empty()) << actual_;
Elliott Hughesb264f082012-04-06 17:10:10 -0700546 }
547
548 void Check(const char* expected_text) {
549 EXPECT_TRUE(actual_.find(expected_text) != std::string::npos) << "\n"
550 << "Expected to find: " << expected_text << "\n"
551 << "In the output : " << actual_;
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700552 actual_.clear();
Elliott Hughesb264f082012-04-06 17:10:10 -0700553 }
554
555 private:
556 static void Hook(void* data, const std::string& reason) {
Elliott Hughes3f6635a2012-06-19 13:37:49 -0700557 // We use += because when we're hooking the aborts like this, multiple problems can be found.
558 *reinterpret_cast<std::string*>(data) += reason;
Elliott Hughesb264f082012-04-06 17:10:10 -0700559 }
560
561 JavaVMExt* vm_;
562 std::string actual_;
563
564 DISALLOW_COPY_AND_ASSIGN(CheckJniAbortCatcher);
565};
566
Brian Carlstrom265091e2013-01-30 14:08:26 -0800567// TODO: These tests were disabled for portable when we went to having
568// MCLinker link LLVM ELF output because we no longer just have code
569// blobs in memory. We'll need to dlopen to load and relocate
570// temporary output to resurrect these tests.
571#if defined(ART_USE_PORTABLE_COMPILER)
572#define TEST_DISABLED_FOR_PORTABLE() printf("WARNING: TEST DISABLED FOR PORTABLE\n"); return
573#else
574#define TEST_DISABLED_FOR_PORTABLE()
575#endif
576
Brian Carlstrom934486c2011-07-12 23:42:50 -0700577} // namespace art
Elliott Hughes34023802011-08-30 12:06:17 -0700578
579namespace std {
580
581// TODO: isn't gtest supposed to be able to print STL types for itself?
582template <typename T>
583std::ostream& operator<<(std::ostream& os, const std::vector<T>& rhs) {
Elliott Hughes14134a12011-09-30 16:55:51 -0700584 os << ::art::ToString(rhs);
Elliott Hughes34023802011-08-30 12:06:17 -0700585 return os;
586}
587
588} // namespace std