blob: a245f18d3f2ac7ac4f712f2cf4aea913bbf5e14d [file] [log] [blame]
Ian Rogers57b86d42012-03-27 16:05:41 -07001/*
2 * Copyright (C) 2012 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 */
16
Roland Levillain0d5a2812015-11-13 10:07:31 +000017#include <stdint.h>
18
Mathieu Chartierc7853442015-03-27 14:35:38 -070019#include "art_field-inl.h"
Mathieu Chartiere401d142015-04-22 13:56:20 -070020#include "art_method-inl.h"
Ian Rogers57b86d42012-03-27 16:05:41 -070021#include "callee_save_frame.h"
Ian Rogers4f6ad8a2013-03-18 15:27:28 -070022#include "dex_file-inl.h"
Mingyao Yang98d1cc82014-05-15 17:02:16 -070023#include "entrypoints/entrypoint_utils-inl.h"
Roland Levillain0d5a2812015-11-13 10:07:31 +000024#include "gc_root-inl.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080025#include "mirror/class-inl.h"
Roland Levillain0d5a2812015-11-13 10:07:31 +000026#include "mirror/object_reference.h"
Ian Rogers57b86d42012-03-27 16:05:41 -070027
28namespace art {
29
Mathieu Chartiera61347b2016-02-05 13:47:06 -080030inline constexpr bool FindFieldTypeIsRead(FindFieldType type) {
31 return type == InstanceObjectRead ||
32 type == InstancePrimitiveRead ||
33 type == StaticObjectRead ||
34 type == StaticPrimitiveRead;
35}
36
37// Helper function to do a null check after trying to resolve the field. Not for statics since obj
38// does not exist there. There is a suspend check, object is a double pointer to update the value
39// in the caller in case it moves.
Mathieu Chartierbf369182016-02-04 18:13:32 -080040template<FindFieldType type, bool kAccessCheck>
41ALWAYS_INLINE static inline ArtField* FindInstanceField(uint32_t field_idx,
42 ArtMethod* referrer,
43 Thread* self,
44 size_t size,
45 mirror::Object** obj)
46 REQUIRES(!Roles::uninterruptible_)
47 SHARED_REQUIRES(Locks::mutator_lock_) {
48 StackHandleScope<1> hs(self);
49 HandleWrapper<mirror::Object> h(hs.NewHandleWrapper(obj));
50 ArtField* field = FindFieldFromCode<type, kAccessCheck>(field_idx, referrer, self, size);
51 if (LIKELY(field != nullptr) && UNLIKELY(h.Get() == nullptr)) {
52 ThrowNullPointerExceptionForFieldAccess(field, /*is_read*/FindFieldTypeIsRead(type));
53 return nullptr;
54 }
55 return field;
56}
57
58extern "C" int8_t artGetByteStaticFromCode(uint32_t field_idx,
59 ArtMethod* referrer,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070060 Thread* self)
Mathieu Chartier90443472015-07-16 20:32:27 -070061 SHARED_REQUIRES(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070062 ScopedQuickEntrypointChecks sqec(self);
Mathieu Chartierc7853442015-03-27 14:35:38 -070063 ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveRead, sizeof(int8_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070064 if (LIKELY(field != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -070065 return field->GetByte(field->GetDeclaringClass());
66 }
Fred Shih37f05ef2014-07-16 18:38:08 -070067 field = FindFieldFromCode<StaticPrimitiveRead, true>(field_idx, referrer, self, sizeof(int8_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070068 if (LIKELY(field != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -070069 return field->GetByte(field->GetDeclaringClass());
70 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070071 return 0; // Will throw exception by checking with Thread::Current.
Fred Shih37f05ef2014-07-16 18:38:08 -070072}
73
Mathieu Chartierbf369182016-02-04 18:13:32 -080074extern "C" uint8_t artGetBooleanStaticFromCode(uint32_t field_idx,
75 ArtMethod* referrer,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070076 Thread* self)
Mathieu Chartier90443472015-07-16 20:32:27 -070077 SHARED_REQUIRES(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070078 ScopedQuickEntrypointChecks sqec(self);
Mathieu Chartierc7853442015-03-27 14:35:38 -070079 ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveRead, sizeof(int8_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070080 if (LIKELY(field != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -070081 return field->GetBoolean(field->GetDeclaringClass());
82 }
Fred Shih37f05ef2014-07-16 18:38:08 -070083 field = FindFieldFromCode<StaticPrimitiveRead, true>(field_idx, referrer, self, sizeof(int8_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070084 if (LIKELY(field != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -070085 return field->GetBoolean(field->GetDeclaringClass());
86 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070087 return 0; // Will throw exception by checking with Thread::Current.
Fred Shih37f05ef2014-07-16 18:38:08 -070088}
89
Mathieu Chartierbf369182016-02-04 18:13:32 -080090extern "C" int16_t artGetShortStaticFromCode(uint32_t field_idx,
91 ArtMethod* referrer,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070092 Thread* self)
Mathieu Chartier90443472015-07-16 20:32:27 -070093 SHARED_REQUIRES(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070094 ScopedQuickEntrypointChecks sqec(self);
Mathieu Chartierc7853442015-03-27 14:35:38 -070095 ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveRead, sizeof(int16_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070096 if (LIKELY(field != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -070097 return field->GetShort(field->GetDeclaringClass());
98 }
Fred Shih37f05ef2014-07-16 18:38:08 -070099 field = FindFieldFromCode<StaticPrimitiveRead, true>(field_idx, referrer, self, sizeof(int16_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700100 if (LIKELY(field != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700101 return field->GetShort(field->GetDeclaringClass());
102 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700103 return 0; // Will throw exception by checking with Thread::Current.
Fred Shih37f05ef2014-07-16 18:38:08 -0700104}
105
106extern "C" uint16_t artGetCharStaticFromCode(uint32_t field_idx,
Mathieu Chartiere401d142015-04-22 13:56:20 -0700107 ArtMethod* referrer,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700108 Thread* self)
Mathieu Chartier90443472015-07-16 20:32:27 -0700109 SHARED_REQUIRES(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700110 ScopedQuickEntrypointChecks sqec(self);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700111 ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveRead, sizeof(int16_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700112 if (LIKELY(field != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700113 return field->GetChar(field->GetDeclaringClass());
114 }
Fred Shih37f05ef2014-07-16 18:38:08 -0700115 field = FindFieldFromCode<StaticPrimitiveRead, true>(field_idx, referrer, self, sizeof(int16_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700116 if (LIKELY(field != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700117 return field->GetChar(field->GetDeclaringClass());
118 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700119 return 0; // Will throw exception by checking with Thread::Current.
Fred Shih37f05ef2014-07-16 18:38:08 -0700120}
121
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800122extern "C" uint32_t artGet32StaticFromCode(uint32_t field_idx,
Mathieu Chartiere401d142015-04-22 13:56:20 -0700123 ArtMethod* referrer,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700124 Thread* self)
Mathieu Chartier90443472015-07-16 20:32:27 -0700125 SHARED_REQUIRES(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700126 ScopedQuickEntrypointChecks sqec(self);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700127 ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveRead, sizeof(int32_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700128 if (LIKELY(field != nullptr)) {
Ian Rogers2fa6b2e2012-10-17 00:10:17 -0700129 return field->Get32(field->GetDeclaringClass());
Ian Rogers57b86d42012-03-27 16:05:41 -0700130 }
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200131 field = FindFieldFromCode<StaticPrimitiveRead, true>(field_idx, referrer, self, sizeof(int32_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700132 if (LIKELY(field != nullptr)) {
Ian Rogers2fa6b2e2012-10-17 00:10:17 -0700133 return field->Get32(field->GetDeclaringClass());
Ian Rogers57b86d42012-03-27 16:05:41 -0700134 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700135 return 0; // Will throw exception by checking with Thread::Current.
Ian Rogers57b86d42012-03-27 16:05:41 -0700136}
137
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800138extern "C" uint64_t artGet64StaticFromCode(uint32_t field_idx,
Mathieu Chartiere401d142015-04-22 13:56:20 -0700139 ArtMethod* referrer,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700140 Thread* self)
Mathieu Chartier90443472015-07-16 20:32:27 -0700141 SHARED_REQUIRES(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700142 ScopedQuickEntrypointChecks sqec(self);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700143 ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveRead, sizeof(int64_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700144 if (LIKELY(field != nullptr)) {
Ian Rogers2fa6b2e2012-10-17 00:10:17 -0700145 return field->Get64(field->GetDeclaringClass());
Ian Rogers57b86d42012-03-27 16:05:41 -0700146 }
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200147 field = FindFieldFromCode<StaticPrimitiveRead, true>(field_idx, referrer, self, sizeof(int64_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700148 if (LIKELY(field != nullptr)) {
Ian Rogers2fa6b2e2012-10-17 00:10:17 -0700149 return field->Get64(field->GetDeclaringClass());
Ian Rogers57b86d42012-03-27 16:05:41 -0700150 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700151 return 0; // Will throw exception by checking with Thread::Current.
Ian Rogers57b86d42012-03-27 16:05:41 -0700152}
153
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800154extern "C" mirror::Object* artGetObjStaticFromCode(uint32_t field_idx,
Mathieu Chartiere401d142015-04-22 13:56:20 -0700155 ArtMethod* referrer,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700156 Thread* self)
Mathieu Chartier90443472015-07-16 20:32:27 -0700157 SHARED_REQUIRES(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700158 ScopedQuickEntrypointChecks sqec(self);
Mathieu Chartierbf369182016-02-04 18:13:32 -0800159 ArtField* field = FindFieldFast(field_idx,
160 referrer,
161 StaticObjectRead,
Mathieu Chartierc7853442015-03-27 14:35:38 -0700162 sizeof(mirror::HeapReference<mirror::Object>));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700163 if (LIKELY(field != nullptr)) {
Ian Rogers2fa6b2e2012-10-17 00:10:17 -0700164 return field->GetObj(field->GetDeclaringClass());
Ian Rogers57b86d42012-03-27 16:05:41 -0700165 }
Mathieu Chartierbf369182016-02-04 18:13:32 -0800166 field = FindFieldFromCode<StaticObjectRead, true>(field_idx,
167 referrer,
168 self,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800169 sizeof(mirror::HeapReference<mirror::Object>));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700170 if (LIKELY(field != nullptr)) {
Ian Rogers2fa6b2e2012-10-17 00:10:17 -0700171 return field->GetObj(field->GetDeclaringClass());
Ian Rogers57b86d42012-03-27 16:05:41 -0700172 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700173 return nullptr; // Will throw exception by checking with Thread::Current.
Ian Rogers57b86d42012-03-27 16:05:41 -0700174}
175
Mathieu Chartierbf369182016-02-04 18:13:32 -0800176extern "C" int8_t artGetByteInstanceFromCode(uint32_t field_idx,
177 mirror::Object* obj,
178 ArtMethod* referrer,
179 Thread* self)
Mathieu Chartier90443472015-07-16 20:32:27 -0700180 SHARED_REQUIRES(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700181 ScopedQuickEntrypointChecks sqec(self);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700182 ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveRead, sizeof(int8_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700183 if (LIKELY(field != nullptr && obj != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700184 return field->GetByte(obj);
185 }
Mathieu Chartierbf369182016-02-04 18:13:32 -0800186 field = FindInstanceField<InstancePrimitiveRead, true>(field_idx,
187 referrer,
188 self,
189 sizeof(int8_t),
190 &obj);
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700191 if (LIKELY(field != nullptr)) {
Mathieu Chartierbf369182016-02-04 18:13:32 -0800192 return field->GetByte(obj);
Fred Shih37f05ef2014-07-16 18:38:08 -0700193 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700194 return 0; // Will throw exception by checking with Thread::Current.
Fred Shih37f05ef2014-07-16 18:38:08 -0700195}
196
Mathieu Chartierbf369182016-02-04 18:13:32 -0800197extern "C" uint8_t artGetBooleanInstanceFromCode(uint32_t field_idx,
198 mirror::Object* obj,
199 ArtMethod* referrer,
200 Thread* self)
Mathieu Chartier90443472015-07-16 20:32:27 -0700201 SHARED_REQUIRES(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700202 ScopedQuickEntrypointChecks sqec(self);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700203 ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveRead, sizeof(int8_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700204 if (LIKELY(field != nullptr && obj != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700205 return field->GetBoolean(obj);
206 }
Mathieu Chartierbf369182016-02-04 18:13:32 -0800207 field = FindInstanceField<InstancePrimitiveRead, true>(field_idx,
208 referrer,
209 self,
210 sizeof(int8_t),
211 &obj);
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700212 if (LIKELY(field != nullptr)) {
Mathieu Chartierbf369182016-02-04 18:13:32 -0800213 return field->GetBoolean(obj);
Fred Shih37f05ef2014-07-16 18:38:08 -0700214 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700215 return 0; // Will throw exception by checking with Thread::Current.
Fred Shih37f05ef2014-07-16 18:38:08 -0700216}
Mathieu Chartierbf369182016-02-04 18:13:32 -0800217extern "C" int16_t artGetShortInstanceFromCode(uint32_t field_idx,
218 mirror::Object* obj,
219 ArtMethod* referrer,
220 Thread* self)
Mathieu Chartier90443472015-07-16 20:32:27 -0700221 SHARED_REQUIRES(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700222 ScopedQuickEntrypointChecks sqec(self);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700223 ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveRead, sizeof(int16_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700224 if (LIKELY(field != nullptr && obj != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700225 return field->GetShort(obj);
226 }
Mathieu Chartierbf369182016-02-04 18:13:32 -0800227 field = FindInstanceField<InstancePrimitiveRead, true>(field_idx,
228 referrer,
229 self,
230 sizeof(int16_t),
231 &obj);
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700232 if (LIKELY(field != nullptr)) {
Mathieu Chartierbf369182016-02-04 18:13:32 -0800233 return field->GetShort(obj);
Fred Shih37f05ef2014-07-16 18:38:08 -0700234 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700235 return 0; // Will throw exception by checking with Thread::Current.
Fred Shih37f05ef2014-07-16 18:38:08 -0700236}
237
Mathieu Chartierbf369182016-02-04 18:13:32 -0800238extern "C" uint16_t artGetCharInstanceFromCode(uint32_t field_idx,
239 mirror::Object* obj,
240 ArtMethod* referrer,
241 Thread* self)
Mathieu Chartier90443472015-07-16 20:32:27 -0700242 SHARED_REQUIRES(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700243 ScopedQuickEntrypointChecks sqec(self);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700244 ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveRead, sizeof(int16_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700245 if (LIKELY(field != nullptr && obj != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700246 return field->GetChar(obj);
247 }
Mathieu Chartierbf369182016-02-04 18:13:32 -0800248 field = FindInstanceField<InstancePrimitiveRead, true>(field_idx,
249 referrer,
250 self,
251 sizeof(int16_t),
252 &obj);
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700253 if (LIKELY(field != nullptr)) {
Mathieu Chartierbf369182016-02-04 18:13:32 -0800254 return field->GetChar(obj);
Fred Shih37f05ef2014-07-16 18:38:08 -0700255 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700256 return 0; // Will throw exception by checking with Thread::Current.
Fred Shih37f05ef2014-07-16 18:38:08 -0700257}
258
Mathieu Chartierbf369182016-02-04 18:13:32 -0800259extern "C" uint32_t artGet32InstanceFromCode(uint32_t field_idx,
260 mirror::Object* obj,
261 ArtMethod* referrer,
262 Thread* self)
Mathieu Chartier90443472015-07-16 20:32:27 -0700263 SHARED_REQUIRES(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700264 ScopedQuickEntrypointChecks sqec(self);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700265 ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveRead, sizeof(int32_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700266 if (LIKELY(field != nullptr && obj != nullptr)) {
Ian Rogers57b86d42012-03-27 16:05:41 -0700267 return field->Get32(obj);
268 }
Mathieu Chartierbf369182016-02-04 18:13:32 -0800269 field = FindInstanceField<InstancePrimitiveRead, true>(field_idx,
270 referrer,
271 self,
272 sizeof(int32_t),
273 &obj);
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700274 if (LIKELY(field != nullptr)) {
Mathieu Chartierbf369182016-02-04 18:13:32 -0800275 return field->Get32(obj);
Ian Rogers57b86d42012-03-27 16:05:41 -0700276 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700277 return 0; // Will throw exception by checking with Thread::Current.
Ian Rogers57b86d42012-03-27 16:05:41 -0700278}
279
Mathieu Chartierbf369182016-02-04 18:13:32 -0800280extern "C" uint64_t artGet64InstanceFromCode(uint32_t field_idx,
281 mirror::Object* obj,
282 ArtMethod* referrer,
283 Thread* self)
Mathieu Chartier90443472015-07-16 20:32:27 -0700284 SHARED_REQUIRES(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700285 ScopedQuickEntrypointChecks sqec(self);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700286 ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveRead, sizeof(int64_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700287 if (LIKELY(field != nullptr && obj != nullptr)) {
Ian Rogers57b86d42012-03-27 16:05:41 -0700288 return field->Get64(obj);
289 }
Mathieu Chartierbf369182016-02-04 18:13:32 -0800290 field = FindInstanceField<InstancePrimitiveRead, true>(field_idx,
291 referrer,
292 self,
293 sizeof(int64_t),
294 &obj);
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700295 if (LIKELY(field != nullptr)) {
Mathieu Chartierbf369182016-02-04 18:13:32 -0800296 return field->Get64(obj);
Ian Rogers57b86d42012-03-27 16:05:41 -0700297 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700298 return 0; // Will throw exception by checking with Thread::Current.
Ian Rogers57b86d42012-03-27 16:05:41 -0700299}
300
Mathieu Chartierbf369182016-02-04 18:13:32 -0800301extern "C" mirror::Object* artGetObjInstanceFromCode(uint32_t field_idx,
302 mirror::Object* obj,
Mathieu Chartiere401d142015-04-22 13:56:20 -0700303 ArtMethod* referrer,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700304 Thread* self)
Mathieu Chartier90443472015-07-16 20:32:27 -0700305 SHARED_REQUIRES(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700306 ScopedQuickEntrypointChecks sqec(self);
Mathieu Chartierbf369182016-02-04 18:13:32 -0800307 ArtField* field = FindFieldFast(field_idx,
308 referrer,
309 InstanceObjectRead,
Mathieu Chartierc7853442015-03-27 14:35:38 -0700310 sizeof(mirror::HeapReference<mirror::Object>));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700311 if (LIKELY(field != nullptr && obj != nullptr)) {
Ian Rogers57b86d42012-03-27 16:05:41 -0700312 return field->GetObj(obj);
313 }
Mathieu Chartierbf369182016-02-04 18:13:32 -0800314 field = FindInstanceField<InstanceObjectRead, true>(field_idx,
315 referrer,
316 self,
317 sizeof(mirror::HeapReference<mirror::Object>),
318 &obj);
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700319 if (LIKELY(field != nullptr)) {
Mathieu Chartierbf369182016-02-04 18:13:32 -0800320 return field->GetObj(obj);
Ian Rogers57b86d42012-03-27 16:05:41 -0700321 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700322 return nullptr; // Will throw exception by checking with Thread::Current.
Ian Rogers57b86d42012-03-27 16:05:41 -0700323}
324
Mathieu Chartierbf369182016-02-04 18:13:32 -0800325extern "C" int artSet8StaticFromCode(uint32_t field_idx,
326 uint32_t new_value,
327 ArtMethod* referrer,
328 Thread* self)
Mathieu Chartier90443472015-07-16 20:32:27 -0700329 SHARED_REQUIRES(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700330 ScopedQuickEntrypointChecks sqec(self);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700331 ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveWrite, sizeof(int8_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700332 if (LIKELY(field != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700333 Primitive::Type type = field->GetTypeAsPrimitiveType();
334 // Compiled code can't use transactional mode.
335 if (type == Primitive::kPrimBoolean) {
336 field->SetBoolean<false>(field->GetDeclaringClass(), new_value);
337 } else {
338 DCHECK_EQ(Primitive::kPrimByte, type);
339 field->SetByte<false>(field->GetDeclaringClass(), new_value);
340 }
341 return 0; // success
342 }
Fred Shih37f05ef2014-07-16 18:38:08 -0700343 field = FindFieldFromCode<StaticPrimitiveWrite, true>(field_idx, referrer, self, sizeof(int8_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700344 if (LIKELY(field != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700345 Primitive::Type type = field->GetTypeAsPrimitiveType();
346 // Compiled code can't use transactional mode.
347 if (type == Primitive::kPrimBoolean) {
348 field->SetBoolean<false>(field->GetDeclaringClass(), new_value);
349 } else {
350 DCHECK_EQ(Primitive::kPrimByte, type);
351 field->SetByte<false>(field->GetDeclaringClass(), new_value);
352 }
353 return 0; // success
354 }
355 return -1; // failure
356}
357
Mathieu Chartierbf369182016-02-04 18:13:32 -0800358extern "C" int artSet16StaticFromCode(uint32_t field_idx,
359 uint16_t new_value,
360 ArtMethod* referrer,
361 Thread* self)
Mathieu Chartier90443472015-07-16 20:32:27 -0700362 SHARED_REQUIRES(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700363 ScopedQuickEntrypointChecks sqec(self);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700364 ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveWrite, sizeof(int16_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700365 if (LIKELY(field != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700366 Primitive::Type type = field->GetTypeAsPrimitiveType();
367 // Compiled code can't use transactional mode.
368 if (type == Primitive::kPrimChar) {
369 field->SetChar<false>(field->GetDeclaringClass(), new_value);
370 } else {
371 DCHECK_EQ(Primitive::kPrimShort, type);
372 field->SetShort<false>(field->GetDeclaringClass(), new_value);
373 }
374 return 0; // success
375 }
Fred Shih37f05ef2014-07-16 18:38:08 -0700376 field = FindFieldFromCode<StaticPrimitiveWrite, true>(field_idx, referrer, self, sizeof(int16_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700377 if (LIKELY(field != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700378 Primitive::Type type = field->GetTypeAsPrimitiveType();
379 // Compiled code can't use transactional mode.
380 if (type == Primitive::kPrimChar) {
381 field->SetChar<false>(field->GetDeclaringClass(), new_value);
382 } else {
383 DCHECK_EQ(Primitive::kPrimShort, type);
384 field->SetShort<false>(field->GetDeclaringClass(), new_value);
385 }
386 return 0; // success
387 }
388 return -1; // failure
389}
390
Mathieu Chartierbf369182016-02-04 18:13:32 -0800391extern "C" int artSet32StaticFromCode(uint32_t field_idx,
392 uint32_t new_value,
393 ArtMethod* referrer,
394 Thread* self)
Mathieu Chartier90443472015-07-16 20:32:27 -0700395 SHARED_REQUIRES(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700396 ScopedQuickEntrypointChecks sqec(self);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700397 ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveWrite, sizeof(int32_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700398 if (LIKELY(field != nullptr)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100399 // Compiled code can't use transactional mode.
400 field->Set32<false>(field->GetDeclaringClass(), new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700401 return 0; // success
402 }
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200403 field = FindFieldFromCode<StaticPrimitiveWrite, true>(field_idx, referrer, self, sizeof(int32_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700404 if (LIKELY(field != nullptr)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100405 // Compiled code can't use transactional mode.
406 field->Set32<false>(field->GetDeclaringClass(), new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700407 return 0; // success
408 }
409 return -1; // failure
410}
411
Mathieu Chartierbf369182016-02-04 18:13:32 -0800412extern "C" int artSet64StaticFromCode(uint32_t field_idx,
413 ArtMethod* referrer,
414 uint64_t new_value,
415 Thread* self)
Mathieu Chartier90443472015-07-16 20:32:27 -0700416 SHARED_REQUIRES(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700417 ScopedQuickEntrypointChecks sqec(self);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700418 ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveWrite, sizeof(int64_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700419 if (LIKELY(field != nullptr)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100420 // Compiled code can't use transactional mode.
421 field->Set64<false>(field->GetDeclaringClass(), new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700422 return 0; // success
423 }
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200424 field = FindFieldFromCode<StaticPrimitiveWrite, true>(field_idx, referrer, self, sizeof(int64_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700425 if (LIKELY(field != nullptr)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100426 // Compiled code can't use transactional mode.
427 field->Set64<false>(field->GetDeclaringClass(), new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700428 return 0; // success
429 }
430 return -1; // failure
431}
432
Mathieu Chartierbf369182016-02-04 18:13:32 -0800433extern "C" int artSetObjStaticFromCode(uint32_t field_idx,
434 mirror::Object* new_value,
435 ArtMethod* referrer,
436 Thread* self)
Mathieu Chartier90443472015-07-16 20:32:27 -0700437 SHARED_REQUIRES(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700438 ScopedQuickEntrypointChecks sqec(self);
Mathieu Chartierbf369182016-02-04 18:13:32 -0800439 ArtField* field = FindFieldFast(field_idx,
440 referrer,
441 StaticObjectWrite,
Mathieu Chartierc7853442015-03-27 14:35:38 -0700442 sizeof(mirror::HeapReference<mirror::Object>));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700443 if (LIKELY(field != nullptr)) {
Mathieu Chartier61c5ebc2014-06-05 17:42:53 -0700444 if (LIKELY(!field->IsPrimitiveType())) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100445 // Compiled code can't use transactional mode.
446 field->SetObj<false>(field->GetDeclaringClass(), new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700447 return 0; // success
448 }
449 }
Mathieu Chartierbf369182016-02-04 18:13:32 -0800450 {
451 StackHandleScope<1> hs(self);
452 HandleWrapper<mirror::Object> h_obj(hs.NewHandleWrapper(&new_value));
453 field = FindFieldFromCode<StaticObjectWrite, true>(
454 field_idx,
455 referrer,
456 self,
457 sizeof(mirror::HeapReference<mirror::Object>));
458 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700459 if (LIKELY(field != nullptr)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100460 // Compiled code can't use transactional mode.
461 field->SetObj<false>(field->GetDeclaringClass(), new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700462 return 0; // success
463 }
464 return -1; // failure
465}
466
Mathieu Chartierbf369182016-02-04 18:13:32 -0800467extern "C" int artSet8InstanceFromCode(uint32_t field_idx,
468 mirror::Object* obj,
469 uint8_t new_value,
470 ArtMethod* referrer,
471 Thread* self)
Mathieu Chartier90443472015-07-16 20:32:27 -0700472 SHARED_REQUIRES(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700473 ScopedQuickEntrypointChecks sqec(self);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700474 ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveWrite, sizeof(int8_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700475 if (LIKELY(field != nullptr && obj != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700476 Primitive::Type type = field->GetTypeAsPrimitiveType();
477 // Compiled code can't use transactional mode.
478 if (type == Primitive::kPrimBoolean) {
479 field->SetBoolean<false>(obj, new_value);
480 } else {
481 DCHECK_EQ(Primitive::kPrimByte, type);
482 field->SetByte<false>(obj, new_value);
483 }
484 return 0; // success
485 }
Mathieu Chartierbf369182016-02-04 18:13:32 -0800486 field = FindInstanceField<InstancePrimitiveWrite, true>(field_idx,
487 referrer,
488 self,
489 sizeof(int8_t),
490 &obj);
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700491 if (LIKELY(field != nullptr)) {
Mathieu Chartierbf369182016-02-04 18:13:32 -0800492 Primitive::Type type = field->GetTypeAsPrimitiveType();
493 // Compiled code can't use transactional mode.
494 if (type == Primitive::kPrimBoolean) {
495 field->SetBoolean<false>(obj, new_value);
Fred Shih37f05ef2014-07-16 18:38:08 -0700496 } else {
Mathieu Chartierbf369182016-02-04 18:13:32 -0800497 field->SetByte<false>(obj, new_value);
Fred Shih37f05ef2014-07-16 18:38:08 -0700498 }
Mathieu Chartierbf369182016-02-04 18:13:32 -0800499 return 0; // success
Fred Shih37f05ef2014-07-16 18:38:08 -0700500 }
501 return -1; // failure
502}
503
Mathieu Chartierbf369182016-02-04 18:13:32 -0800504extern "C" int artSet16InstanceFromCode(uint32_t field_idx,
505 mirror::Object* obj,
506 uint16_t new_value,
507 ArtMethod* referrer,
508 Thread* self)
Mathieu Chartier90443472015-07-16 20:32:27 -0700509 SHARED_REQUIRES(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700510 ScopedQuickEntrypointChecks sqec(self);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700511 ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveWrite, sizeof(int16_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700512 if (LIKELY(field != nullptr && obj != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700513 Primitive::Type type = field->GetTypeAsPrimitiveType();
514 // Compiled code can't use transactional mode.
515 if (type == Primitive::kPrimChar) {
516 field->SetChar<false>(obj, new_value);
517 } else {
518 DCHECK_EQ(Primitive::kPrimShort, type);
519 field->SetShort<false>(obj, new_value);
520 }
521 return 0; // success
522 }
Mathieu Chartierbf369182016-02-04 18:13:32 -0800523 field = FindInstanceField<InstancePrimitiveWrite, true>(field_idx,
524 referrer,
525 self,
526 sizeof(int16_t),
527 &obj);
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700528 if (LIKELY(field != nullptr)) {
Mathieu Chartierbf369182016-02-04 18:13:32 -0800529 Primitive::Type type = field->GetTypeAsPrimitiveType();
530 // Compiled code can't use transactional mode.
531 if (type == Primitive::kPrimChar) {
532 field->SetChar<false>(obj, new_value);
Fred Shih37f05ef2014-07-16 18:38:08 -0700533 } else {
Mathieu Chartierbf369182016-02-04 18:13:32 -0800534 DCHECK_EQ(Primitive::kPrimShort, type);
535 field->SetShort<false>(obj, new_value);
Fred Shih37f05ef2014-07-16 18:38:08 -0700536 }
Mathieu Chartierbf369182016-02-04 18:13:32 -0800537 return 0; // success
Fred Shih37f05ef2014-07-16 18:38:08 -0700538 }
539 return -1; // failure
540}
541
Mathieu Chartierbf369182016-02-04 18:13:32 -0800542extern "C" int artSet32InstanceFromCode(uint32_t field_idx,
543 mirror::Object* obj,
544 uint32_t new_value,
545 ArtMethod* referrer,
546 Thread* self)
Mathieu Chartier90443472015-07-16 20:32:27 -0700547 SHARED_REQUIRES(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700548 ScopedQuickEntrypointChecks sqec(self);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700549 ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveWrite, sizeof(int32_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700550 if (LIKELY(field != nullptr && obj != nullptr)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100551 // Compiled code can't use transactional mode.
552 field->Set32<false>(obj, new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700553 return 0; // success
554 }
Mathieu Chartierbf369182016-02-04 18:13:32 -0800555 field = FindInstanceField<InstancePrimitiveWrite, true>(field_idx,
556 referrer,
557 self,
558 sizeof(int32_t),
559 &obj);
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700560 if (LIKELY(field != nullptr)) {
Mathieu Chartierbf369182016-02-04 18:13:32 -0800561 // Compiled code can't use transactional mode.
562 field->Set32<false>(obj, new_value);
563 return 0; // success
Ian Rogers57b86d42012-03-27 16:05:41 -0700564 }
565 return -1; // failure
566}
567
Mathieu Chartierbf369182016-02-04 18:13:32 -0800568extern "C" int artSet64InstanceFromCode(uint32_t field_idx,
569 mirror::Object* obj,
570 uint64_t new_value,
571 ArtMethod* referrer,
572 Thread* self)
Mathieu Chartier90443472015-07-16 20:32:27 -0700573 SHARED_REQUIRES(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700574 ScopedQuickEntrypointChecks sqec(self);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700575 ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveWrite, sizeof(int64_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700576 if (LIKELY(field != nullptr && obj != nullptr)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100577 // Compiled code can't use transactional mode.
578 field->Set64<false>(obj, new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700579 return 0; // success
580 }
Mathieu Chartierbf369182016-02-04 18:13:32 -0800581 field = FindInstanceField<InstancePrimitiveWrite, true>(field_idx,
582 referrer,
583 self,
584 sizeof(int64_t),
585 &obj);
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700586 if (LIKELY(field != nullptr)) {
Mathieu Chartierbf369182016-02-04 18:13:32 -0800587 // Compiled code can't use transactional mode.
588 field->Set64<false>(obj, new_value);
589 return 0;
Ian Rogers57b86d42012-03-27 16:05:41 -0700590 }
591 return -1; // failure
592}
593
Mathieu Chartierbf369182016-02-04 18:13:32 -0800594extern "C" int artSetObjInstanceFromCode(uint32_t field_idx,
595 mirror::Object* obj,
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800596 mirror::Object* new_value,
Mathieu Chartierbf369182016-02-04 18:13:32 -0800597 ArtMethod* referrer,
598 Thread* self)
Mathieu Chartier90443472015-07-16 20:32:27 -0700599 SHARED_REQUIRES(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700600 ScopedQuickEntrypointChecks sqec(self);
Mathieu Chartierbf369182016-02-04 18:13:32 -0800601 ArtField* field = FindFieldFast(field_idx,
602 referrer,
603 InstanceObjectWrite,
Mathieu Chartierc7853442015-03-27 14:35:38 -0700604 sizeof(mirror::HeapReference<mirror::Object>));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700605 if (LIKELY(field != nullptr && obj != nullptr)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100606 // Compiled code can't use transactional mode.
607 field->SetObj<false>(obj, new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700608 return 0; // success
609 }
Mathieu Chartierbf369182016-02-04 18:13:32 -0800610 {
611 StackHandleScope<2> hs(self);
612 HandleWrapper<mirror::Object> h_obj(hs.NewHandleWrapper(&obj));
613 HandleWrapper<mirror::Object> h_new_value(hs.NewHandleWrapper(&new_value));
614 field = FindFieldFromCode<InstanceObjectWrite, true>(
615 field_idx,
616 referrer,
617 self,
618 sizeof(mirror::HeapReference<mirror::Object>));
619 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700620 if (LIKELY(field != nullptr)) {
621 if (UNLIKELY(obj == nullptr)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000622 ThrowNullPointerExceptionForFieldAccess(field, false);
Ian Rogers57b86d42012-03-27 16:05:41 -0700623 } else {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100624 // Compiled code can't use transactional mode.
625 field->SetObj<false>(obj, new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700626 return 0; // success
627 }
628 }
629 return -1; // failure
630}
631
Roland Levillain7c1559a2015-12-15 10:55:36 +0000632extern "C" mirror::Object* artReadBarrierMark(mirror::Object* obj) {
633 DCHECK(kEmitCompilerReadBarrier);
634 return ReadBarrier::Mark(obj);
635}
636
Man Cao1aee9002015-07-14 22:31:42 -0700637extern "C" mirror::Object* artReadBarrierSlow(mirror::Object* ref ATTRIBUTE_UNUSED,
Roland Levillain0d5a2812015-11-13 10:07:31 +0000638 mirror::Object* obj,
639 uint32_t offset) {
640 DCHECK(kEmitCompilerReadBarrier);
Man Cao1aee9002015-07-14 22:31:42 -0700641 uint8_t* raw_addr = reinterpret_cast<uint8_t*>(obj) + offset;
642 mirror::HeapReference<mirror::Object>* ref_addr =
Roland Levillain0d5a2812015-11-13 10:07:31 +0000643 reinterpret_cast<mirror::HeapReference<mirror::Object>*>(raw_addr);
644 constexpr ReadBarrierOption kReadBarrierOption =
645 kUseReadBarrier ? kWithReadBarrier : kWithoutReadBarrier;
646 mirror::Object* result =
Hiroshi Yamauchicc78f3f2015-12-11 15:51:04 -0800647 ReadBarrier::Barrier<mirror::Object, kReadBarrierOption>(obj,
648 MemberOffset(offset),
649 ref_addr);
Roland Levillain0d5a2812015-11-13 10:07:31 +0000650 return result;
651}
652
653extern "C" mirror::Object* artReadBarrierForRootSlow(GcRoot<mirror::Object>* root) {
654 DCHECK(kEmitCompilerReadBarrier);
Roland Levillain0d5a2812015-11-13 10:07:31 +0000655 return root->Read();
Man Cao1aee9002015-07-14 22:31:42 -0700656}
657
Ian Rogers57b86d42012-03-27 16:05:41 -0700658} // namespace art