blob: a6b84b6041dba0c8beccee85be1b3ae6b888b196 [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 Chartiere401d142015-04-22 13:56:20 -070030extern "C" int8_t artGetByteStaticFromCode(uint32_t field_idx, ArtMethod* referrer,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070031 Thread* self)
Mathieu Chartier90443472015-07-16 20:32:27 -070032 SHARED_REQUIRES(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070033 ScopedQuickEntrypointChecks sqec(self);
Mathieu Chartierc7853442015-03-27 14:35:38 -070034 ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveRead, sizeof(int8_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070035 if (LIKELY(field != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -070036 return field->GetByte(field->GetDeclaringClass());
37 }
Fred Shih37f05ef2014-07-16 18:38:08 -070038 field = FindFieldFromCode<StaticPrimitiveRead, true>(field_idx, referrer, self, sizeof(int8_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070039 if (LIKELY(field != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -070040 return field->GetByte(field->GetDeclaringClass());
41 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070042 return 0; // Will throw exception by checking with Thread::Current.
Fred Shih37f05ef2014-07-16 18:38:08 -070043}
44
Mathieu Chartiere401d142015-04-22 13:56:20 -070045extern "C" uint8_t artGetBooleanStaticFromCode(uint32_t field_idx, ArtMethod* referrer,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070046 Thread* self)
Mathieu Chartier90443472015-07-16 20:32:27 -070047 SHARED_REQUIRES(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070048 ScopedQuickEntrypointChecks sqec(self);
Mathieu Chartierc7853442015-03-27 14:35:38 -070049 ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveRead, sizeof(int8_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070050 if (LIKELY(field != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -070051 return field->GetBoolean(field->GetDeclaringClass());
52 }
Fred Shih37f05ef2014-07-16 18:38:08 -070053 field = FindFieldFromCode<StaticPrimitiveRead, true>(field_idx, referrer, self, sizeof(int8_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070054 if (LIKELY(field != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -070055 return field->GetBoolean(field->GetDeclaringClass());
56 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070057 return 0; // Will throw exception by checking with Thread::Current.
Fred Shih37f05ef2014-07-16 18:38:08 -070058}
59
Mathieu Chartiere401d142015-04-22 13:56:20 -070060extern "C" int16_t artGetShortStaticFromCode(uint32_t field_idx, ArtMethod* referrer,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070061 Thread* self)
Mathieu Chartier90443472015-07-16 20:32:27 -070062 SHARED_REQUIRES(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070063 ScopedQuickEntrypointChecks sqec(self);
Mathieu Chartierc7853442015-03-27 14:35:38 -070064 ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveRead, sizeof(int16_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070065 if (LIKELY(field != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -070066 return field->GetShort(field->GetDeclaringClass());
67 }
Fred Shih37f05ef2014-07-16 18:38:08 -070068 field = FindFieldFromCode<StaticPrimitiveRead, true>(field_idx, referrer, self, sizeof(int16_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070069 if (LIKELY(field != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -070070 return field->GetShort(field->GetDeclaringClass());
71 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070072 return 0; // Will throw exception by checking with Thread::Current.
Fred Shih37f05ef2014-07-16 18:38:08 -070073}
74
75extern "C" uint16_t artGetCharStaticFromCode(uint32_t field_idx,
Mathieu Chartiere401d142015-04-22 13:56:20 -070076 ArtMethod* referrer,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070077 Thread* self)
Mathieu Chartier90443472015-07-16 20:32:27 -070078 SHARED_REQUIRES(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070079 ScopedQuickEntrypointChecks sqec(self);
Mathieu Chartierc7853442015-03-27 14:35:38 -070080 ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveRead, sizeof(int16_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070081 if (LIKELY(field != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -070082 return field->GetChar(field->GetDeclaringClass());
83 }
Fred Shih37f05ef2014-07-16 18:38:08 -070084 field = FindFieldFromCode<StaticPrimitiveRead, true>(field_idx, referrer, self, sizeof(int16_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070085 if (LIKELY(field != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -070086 return field->GetChar(field->GetDeclaringClass());
87 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070088 return 0; // Will throw exception by checking with Thread::Current.
Fred Shih37f05ef2014-07-16 18:38:08 -070089}
90
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080091extern "C" uint32_t artGet32StaticFromCode(uint32_t field_idx,
Mathieu Chartiere401d142015-04-22 13:56:20 -070092 ArtMethod* referrer,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070093 Thread* self)
Mathieu Chartier90443472015-07-16 20:32:27 -070094 SHARED_REQUIRES(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070095 ScopedQuickEntrypointChecks sqec(self);
Mathieu Chartierc7853442015-03-27 14:35:38 -070096 ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveRead, sizeof(int32_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070097 if (LIKELY(field != nullptr)) {
Ian Rogers2fa6b2e2012-10-17 00:10:17 -070098 return field->Get32(field->GetDeclaringClass());
Ian Rogers57b86d42012-03-27 16:05:41 -070099 }
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200100 field = FindFieldFromCode<StaticPrimitiveRead, true>(field_idx, referrer, self, sizeof(int32_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700101 if (LIKELY(field != nullptr)) {
Ian Rogers2fa6b2e2012-10-17 00:10:17 -0700102 return field->Get32(field->GetDeclaringClass());
Ian Rogers57b86d42012-03-27 16:05:41 -0700103 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700104 return 0; // Will throw exception by checking with Thread::Current.
Ian Rogers57b86d42012-03-27 16:05:41 -0700105}
106
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800107extern "C" uint64_t artGet64StaticFromCode(uint32_t field_idx,
Mathieu Chartiere401d142015-04-22 13:56:20 -0700108 ArtMethod* referrer,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700109 Thread* self)
Mathieu Chartier90443472015-07-16 20:32:27 -0700110 SHARED_REQUIRES(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700111 ScopedQuickEntrypointChecks sqec(self);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700112 ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveRead, sizeof(int64_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700113 if (LIKELY(field != nullptr)) {
Ian Rogers2fa6b2e2012-10-17 00:10:17 -0700114 return field->Get64(field->GetDeclaringClass());
Ian Rogers57b86d42012-03-27 16:05:41 -0700115 }
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200116 field = FindFieldFromCode<StaticPrimitiveRead, true>(field_idx, referrer, self, sizeof(int64_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700117 if (LIKELY(field != nullptr)) {
Ian Rogers2fa6b2e2012-10-17 00:10:17 -0700118 return field->Get64(field->GetDeclaringClass());
Ian Rogers57b86d42012-03-27 16:05:41 -0700119 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700120 return 0; // Will throw exception by checking with Thread::Current.
Ian Rogers57b86d42012-03-27 16:05:41 -0700121}
122
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800123extern "C" mirror::Object* artGetObjStaticFromCode(uint32_t field_idx,
Mathieu Chartiere401d142015-04-22 13:56:20 -0700124 ArtMethod* referrer,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700125 Thread* self)
Mathieu Chartier90443472015-07-16 20:32:27 -0700126 SHARED_REQUIRES(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700127 ScopedQuickEntrypointChecks sqec(self);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700128 ArtField* field = FindFieldFast(field_idx, referrer, StaticObjectRead,
129 sizeof(mirror::HeapReference<mirror::Object>));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700130 if (LIKELY(field != nullptr)) {
Ian Rogers2fa6b2e2012-10-17 00:10:17 -0700131 return field->GetObj(field->GetDeclaringClass());
Ian Rogers57b86d42012-03-27 16:05:41 -0700132 }
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200133 field = FindFieldFromCode<StaticObjectRead, true>(field_idx, referrer, self,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800134 sizeof(mirror::HeapReference<mirror::Object>));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700135 if (LIKELY(field != nullptr)) {
Ian Rogers2fa6b2e2012-10-17 00:10:17 -0700136 return field->GetObj(field->GetDeclaringClass());
Ian Rogers57b86d42012-03-27 16:05:41 -0700137 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700138 return nullptr; // Will throw exception by checking with Thread::Current.
Ian Rogers57b86d42012-03-27 16:05:41 -0700139}
140
Fred Shih37f05ef2014-07-16 18:38:08 -0700141extern "C" int8_t artGetByteInstanceFromCode(uint32_t field_idx, mirror::Object* obj,
Mathieu Chartiere401d142015-04-22 13:56:20 -0700142 ArtMethod* referrer, Thread* self)
Mathieu Chartier90443472015-07-16 20:32:27 -0700143 SHARED_REQUIRES(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700144 ScopedQuickEntrypointChecks sqec(self);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700145 ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveRead, sizeof(int8_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700146 if (LIKELY(field != nullptr && obj != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700147 return field->GetByte(obj);
148 }
Fred Shih37f05ef2014-07-16 18:38:08 -0700149 field = FindFieldFromCode<InstancePrimitiveRead, true>(field_idx, referrer, self,
150 sizeof(int8_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700151 if (LIKELY(field != nullptr)) {
152 if (UNLIKELY(obj == nullptr)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000153 ThrowNullPointerExceptionForFieldAccess(field, true);
Fred Shih37f05ef2014-07-16 18:38:08 -0700154 } else {
155 return field->GetByte(obj);
156 }
157 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700158 return 0; // Will throw exception by checking with Thread::Current.
Fred Shih37f05ef2014-07-16 18:38:08 -0700159}
160
161extern "C" uint8_t artGetBooleanInstanceFromCode(uint32_t field_idx, mirror::Object* obj,
Mathieu Chartiere401d142015-04-22 13:56:20 -0700162 ArtMethod* referrer, Thread* self)
Mathieu Chartier90443472015-07-16 20:32:27 -0700163 SHARED_REQUIRES(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700164 ScopedQuickEntrypointChecks sqec(self);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700165 ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveRead, sizeof(int8_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700166 if (LIKELY(field != nullptr && obj != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700167 return field->GetBoolean(obj);
168 }
Fred Shih37f05ef2014-07-16 18:38:08 -0700169 field = FindFieldFromCode<InstancePrimitiveRead, true>(field_idx, referrer, self,
170 sizeof(int8_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700171 if (LIKELY(field != nullptr)) {
172 if (UNLIKELY(obj == nullptr)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000173 ThrowNullPointerExceptionForFieldAccess(field, true);
Fred Shih37f05ef2014-07-16 18:38:08 -0700174 } else {
175 return field->GetBoolean(obj);
176 }
177 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700178 return 0; // Will throw exception by checking with Thread::Current.
Fred Shih37f05ef2014-07-16 18:38:08 -0700179}
180extern "C" int16_t artGetShortInstanceFromCode(uint32_t field_idx, mirror::Object* obj,
Mathieu Chartiere401d142015-04-22 13:56:20 -0700181 ArtMethod* referrer, Thread* self)
Mathieu Chartier90443472015-07-16 20:32:27 -0700182 SHARED_REQUIRES(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700183 ScopedQuickEntrypointChecks sqec(self);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700184 ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveRead, sizeof(int16_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700185 if (LIKELY(field != nullptr && obj != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700186 return field->GetShort(obj);
187 }
Fred Shih37f05ef2014-07-16 18:38:08 -0700188 field = FindFieldFromCode<InstancePrimitiveRead, true>(field_idx, referrer, self,
189 sizeof(int16_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700190 if (LIKELY(field != nullptr)) {
191 if (UNLIKELY(obj == nullptr)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000192 ThrowNullPointerExceptionForFieldAccess(field, true);
Fred Shih37f05ef2014-07-16 18:38:08 -0700193 } else {
194 return field->GetShort(obj);
195 }
196 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700197 return 0; // Will throw exception by checking with Thread::Current.
Fred Shih37f05ef2014-07-16 18:38:08 -0700198}
199
200extern "C" uint16_t artGetCharInstanceFromCode(uint32_t field_idx, mirror::Object* obj,
Mathieu Chartiere401d142015-04-22 13:56:20 -0700201 ArtMethod* referrer, Thread* self)
Mathieu Chartier90443472015-07-16 20:32:27 -0700202 SHARED_REQUIRES(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700203 ScopedQuickEntrypointChecks sqec(self);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700204 ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveRead, sizeof(int16_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700205 if (LIKELY(field != nullptr && obj != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700206 return field->GetChar(obj);
207 }
Fred Shih37f05ef2014-07-16 18:38:08 -0700208 field = FindFieldFromCode<InstancePrimitiveRead, true>(field_idx, referrer, self,
209 sizeof(int16_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700210 if (LIKELY(field != nullptr)) {
211 if (UNLIKELY(obj == nullptr)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000212 ThrowNullPointerExceptionForFieldAccess(field, true);
Fred Shih37f05ef2014-07-16 18:38:08 -0700213 } else {
214 return field->GetChar(obj);
215 }
216 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700217 return 0; // Will throw exception by checking with Thread::Current.
Fred Shih37f05ef2014-07-16 18:38:08 -0700218}
219
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800220extern "C" uint32_t artGet32InstanceFromCode(uint32_t field_idx, mirror::Object* obj,
Mathieu Chartiere401d142015-04-22 13:56:20 -0700221 ArtMethod* referrer, Thread* self)
Mathieu Chartier90443472015-07-16 20:32:27 -0700222 SHARED_REQUIRES(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700223 ScopedQuickEntrypointChecks sqec(self);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700224 ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveRead, sizeof(int32_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700225 if (LIKELY(field != nullptr && obj != nullptr)) {
Ian Rogers57b86d42012-03-27 16:05:41 -0700226 return field->Get32(obj);
227 }
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200228 field = FindFieldFromCode<InstancePrimitiveRead, true>(field_idx, referrer, self,
229 sizeof(int32_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700230 if (LIKELY(field != nullptr)) {
231 if (UNLIKELY(obj == nullptr)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000232 ThrowNullPointerExceptionForFieldAccess(field, true);
Ian Rogers57b86d42012-03-27 16:05:41 -0700233 } else {
234 return field->Get32(obj);
235 }
236 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700237 return 0; // Will throw exception by checking with Thread::Current.
Ian Rogers57b86d42012-03-27 16:05:41 -0700238}
239
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800240extern "C" uint64_t artGet64InstanceFromCode(uint32_t field_idx, mirror::Object* obj,
Mathieu Chartiere401d142015-04-22 13:56:20 -0700241 ArtMethod* referrer, 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(int64_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700245 if (LIKELY(field != nullptr && obj != nullptr)) {
Ian Rogers57b86d42012-03-27 16:05:41 -0700246 return field->Get64(obj);
247 }
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200248 field = FindFieldFromCode<InstancePrimitiveRead, true>(field_idx, referrer, self,
249 sizeof(int64_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700250 if (LIKELY(field != nullptr)) {
251 if (UNLIKELY(obj == nullptr)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000252 ThrowNullPointerExceptionForFieldAccess(field, true);
Ian Rogers57b86d42012-03-27 16:05:41 -0700253 } else {
254 return field->Get64(obj);
255 }
256 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700257 return 0; // Will throw exception by checking with Thread::Current.
Ian Rogers57b86d42012-03-27 16:05:41 -0700258}
259
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800260extern "C" mirror::Object* artGetObjInstanceFromCode(uint32_t field_idx, mirror::Object* obj,
Mathieu Chartiere401d142015-04-22 13:56:20 -0700261 ArtMethod* referrer,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700262 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, InstanceObjectRead,
266 sizeof(mirror::HeapReference<mirror::Object>));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700267 if (LIKELY(field != nullptr && obj != nullptr)) {
Ian Rogers57b86d42012-03-27 16:05:41 -0700268 return field->GetObj(obj);
269 }
Mathieu Chartierc7853442015-03-27 14:35:38 -0700270 field = FindFieldFromCode<InstanceObjectRead, true>(
271 field_idx, referrer, self, sizeof(mirror::HeapReference<mirror::Object>));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700272 if (LIKELY(field != nullptr)) {
273 if (UNLIKELY(obj == nullptr)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000274 ThrowNullPointerExceptionForFieldAccess(field, true);
Ian Rogers57b86d42012-03-27 16:05:41 -0700275 } else {
276 return field->GetObj(obj);
277 }
278 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700279 return nullptr; // Will throw exception by checking with Thread::Current.
Ian Rogers57b86d42012-03-27 16:05:41 -0700280}
281
Fred Shih37f05ef2014-07-16 18:38:08 -0700282extern "C" int artSet8StaticFromCode(uint32_t field_idx, uint32_t new_value,
Mathieu Chartiere401d142015-04-22 13:56:20 -0700283 ArtMethod* referrer, 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, StaticPrimitiveWrite, sizeof(int8_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700287 if (LIKELY(field != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700288 Primitive::Type type = field->GetTypeAsPrimitiveType();
289 // Compiled code can't use transactional mode.
290 if (type == Primitive::kPrimBoolean) {
291 field->SetBoolean<false>(field->GetDeclaringClass(), new_value);
292 } else {
293 DCHECK_EQ(Primitive::kPrimByte, type);
294 field->SetByte<false>(field->GetDeclaringClass(), new_value);
295 }
296 return 0; // success
297 }
Fred Shih37f05ef2014-07-16 18:38:08 -0700298 field = FindFieldFromCode<StaticPrimitiveWrite, true>(field_idx, referrer, self, sizeof(int8_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700299 if (LIKELY(field != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700300 Primitive::Type type = field->GetTypeAsPrimitiveType();
301 // Compiled code can't use transactional mode.
302 if (type == Primitive::kPrimBoolean) {
303 field->SetBoolean<false>(field->GetDeclaringClass(), new_value);
304 } else {
305 DCHECK_EQ(Primitive::kPrimByte, type);
306 field->SetByte<false>(field->GetDeclaringClass(), new_value);
307 }
308 return 0; // success
309 }
310 return -1; // failure
311}
312
313extern "C" int artSet16StaticFromCode(uint32_t field_idx, uint16_t new_value,
Mathieu Chartiere401d142015-04-22 13:56:20 -0700314 ArtMethod* referrer, Thread* self)
Mathieu Chartier90443472015-07-16 20:32:27 -0700315 SHARED_REQUIRES(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700316 ScopedQuickEntrypointChecks sqec(self);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700317 ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveWrite, sizeof(int16_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700318 if (LIKELY(field != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700319 Primitive::Type type = field->GetTypeAsPrimitiveType();
320 // Compiled code can't use transactional mode.
321 if (type == Primitive::kPrimChar) {
322 field->SetChar<false>(field->GetDeclaringClass(), new_value);
323 } else {
324 DCHECK_EQ(Primitive::kPrimShort, type);
325 field->SetShort<false>(field->GetDeclaringClass(), new_value);
326 }
327 return 0; // success
328 }
Fred Shih37f05ef2014-07-16 18:38:08 -0700329 field = FindFieldFromCode<StaticPrimitiveWrite, true>(field_idx, referrer, self, sizeof(int16_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700330 if (LIKELY(field != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700331 Primitive::Type type = field->GetTypeAsPrimitiveType();
332 // Compiled code can't use transactional mode.
333 if (type == Primitive::kPrimChar) {
334 field->SetChar<false>(field->GetDeclaringClass(), new_value);
335 } else {
336 DCHECK_EQ(Primitive::kPrimShort, type);
337 field->SetShort<false>(field->GetDeclaringClass(), new_value);
338 }
339 return 0; // success
340 }
341 return -1; // failure
342}
343
Ian Rogers57b86d42012-03-27 16:05:41 -0700344extern "C" int artSet32StaticFromCode(uint32_t field_idx, uint32_t new_value,
Mathieu Chartiere401d142015-04-22 13:56:20 -0700345 ArtMethod* referrer, Thread* self)
Mathieu Chartier90443472015-07-16 20:32:27 -0700346 SHARED_REQUIRES(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700347 ScopedQuickEntrypointChecks sqec(self);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700348 ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveWrite, sizeof(int32_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700349 if (LIKELY(field != nullptr)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100350 // Compiled code can't use transactional mode.
351 field->Set32<false>(field->GetDeclaringClass(), new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700352 return 0; // success
353 }
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200354 field = FindFieldFromCode<StaticPrimitiveWrite, true>(field_idx, referrer, self, sizeof(int32_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700355 if (LIKELY(field != nullptr)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100356 // Compiled code can't use transactional mode.
357 field->Set32<false>(field->GetDeclaringClass(), new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700358 return 0; // success
359 }
360 return -1; // failure
361}
362
Mathieu Chartiere401d142015-04-22 13:56:20 -0700363extern "C" int artSet64StaticFromCode(uint32_t field_idx, ArtMethod* referrer,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700364 uint64_t new_value, Thread* self)
Mathieu Chartier90443472015-07-16 20:32:27 -0700365 SHARED_REQUIRES(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700366 ScopedQuickEntrypointChecks sqec(self);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700367 ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveWrite, sizeof(int64_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700368 if (LIKELY(field != nullptr)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100369 // Compiled code can't use transactional mode.
370 field->Set64<false>(field->GetDeclaringClass(), new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700371 return 0; // success
372 }
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200373 field = FindFieldFromCode<StaticPrimitiveWrite, true>(field_idx, referrer, self, sizeof(int64_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700374 if (LIKELY(field != nullptr)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100375 // Compiled code can't use transactional mode.
376 field->Set64<false>(field->GetDeclaringClass(), new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700377 return 0; // success
378 }
379 return -1; // failure
380}
381
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800382extern "C" int artSetObjStaticFromCode(uint32_t field_idx, mirror::Object* new_value,
Mathieu Chartiere401d142015-04-22 13:56:20 -0700383 ArtMethod* referrer, Thread* self)
Mathieu Chartier90443472015-07-16 20:32:27 -0700384 SHARED_REQUIRES(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700385 ScopedQuickEntrypointChecks sqec(self);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700386 ArtField* field = FindFieldFast(field_idx, referrer, StaticObjectWrite,
387 sizeof(mirror::HeapReference<mirror::Object>));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700388 if (LIKELY(field != nullptr)) {
Mathieu Chartier61c5ebc2014-06-05 17:42:53 -0700389 if (LIKELY(!field->IsPrimitiveType())) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100390 // Compiled code can't use transactional mode.
391 field->SetObj<false>(field->GetDeclaringClass(), new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700392 return 0; // success
393 }
394 }
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200395 field = FindFieldFromCode<StaticObjectWrite, true>(field_idx, referrer, self,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800396 sizeof(mirror::HeapReference<mirror::Object>));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700397 if (LIKELY(field != nullptr)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100398 // Compiled code can't use transactional mode.
399 field->SetObj<false>(field->GetDeclaringClass(), new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700400 return 0; // success
401 }
402 return -1; // failure
403}
404
Fred Shih37f05ef2014-07-16 18:38:08 -0700405extern "C" int artSet8InstanceFromCode(uint32_t field_idx, mirror::Object* obj, uint8_t new_value,
Mathieu Chartiere401d142015-04-22 13:56:20 -0700406 ArtMethod* referrer, Thread* self)
Mathieu Chartier90443472015-07-16 20:32:27 -0700407 SHARED_REQUIRES(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700408 ScopedQuickEntrypointChecks sqec(self);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700409 ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveWrite, sizeof(int8_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700410 if (LIKELY(field != nullptr && obj != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700411 Primitive::Type type = field->GetTypeAsPrimitiveType();
412 // Compiled code can't use transactional mode.
413 if (type == Primitive::kPrimBoolean) {
414 field->SetBoolean<false>(obj, new_value);
415 } else {
416 DCHECK_EQ(Primitive::kPrimByte, type);
417 field->SetByte<false>(obj, new_value);
418 }
419 return 0; // success
420 }
Fred Shih37f05ef2014-07-16 18:38:08 -0700421 {
422 StackHandleScope<1> hs(self);
423 HandleWrapper<mirror::Object> h_obj(hs.NewHandleWrapper(&obj));
424 field = FindFieldFromCode<InstancePrimitiveWrite, true>(field_idx, referrer, self,
425 sizeof(int8_t));
426 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700427 if (LIKELY(field != nullptr)) {
428 if (UNLIKELY(obj == nullptr)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000429 ThrowNullPointerExceptionForFieldAccess(field, false);
Fred Shih37f05ef2014-07-16 18:38:08 -0700430 } else {
431 Primitive::Type type = field->GetTypeAsPrimitiveType();
432 // Compiled code can't use transactional mode.
433 if (type == Primitive::kPrimBoolean) {
434 field->SetBoolean<false>(obj, new_value);
435 } else {
436 field->SetByte<false>(obj, new_value);
437 }
438 return 0; // success
439 }
440 }
441 return -1; // failure
442}
443
444extern "C" int artSet16InstanceFromCode(uint32_t field_idx, mirror::Object* obj, uint16_t new_value,
Mathieu Chartiere401d142015-04-22 13:56:20 -0700445 ArtMethod* referrer, Thread* self)
Mathieu Chartier90443472015-07-16 20:32:27 -0700446 SHARED_REQUIRES(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700447 ScopedQuickEntrypointChecks sqec(self);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700448 ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveWrite, sizeof(int16_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700449 if (LIKELY(field != nullptr && obj != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700450 Primitive::Type type = field->GetTypeAsPrimitiveType();
451 // Compiled code can't use transactional mode.
452 if (type == Primitive::kPrimChar) {
453 field->SetChar<false>(obj, new_value);
454 } else {
455 DCHECK_EQ(Primitive::kPrimShort, type);
456 field->SetShort<false>(obj, new_value);
457 }
458 return 0; // success
459 }
Fred Shih37f05ef2014-07-16 18:38:08 -0700460 {
461 StackHandleScope<1> hs(self);
462 HandleWrapper<mirror::Object> h_obj(hs.NewHandleWrapper(&obj));
463 field = FindFieldFromCode<InstancePrimitiveWrite, true>(field_idx, referrer, self,
464 sizeof(int16_t));
465 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700466 if (LIKELY(field != nullptr)) {
467 if (UNLIKELY(obj == nullptr)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000468 ThrowNullPointerExceptionForFieldAccess(field, false);
Fred Shih37f05ef2014-07-16 18:38:08 -0700469 } else {
470 Primitive::Type type = field->GetTypeAsPrimitiveType();
471 // Compiled code can't use transactional mode.
472 if (type == Primitive::kPrimChar) {
473 field->SetChar<false>(obj, new_value);
474 } else {
475 DCHECK_EQ(Primitive::kPrimShort, type);
476 field->SetShort<false>(obj, new_value);
477 }
478 return 0; // success
479 }
480 }
481 return -1; // failure
482}
483
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800484extern "C" int artSet32InstanceFromCode(uint32_t field_idx, mirror::Object* obj, uint32_t new_value,
Mathieu Chartiere401d142015-04-22 13:56:20 -0700485 ArtMethod* referrer, Thread* self)
Mathieu Chartier90443472015-07-16 20:32:27 -0700486 SHARED_REQUIRES(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700487 ScopedQuickEntrypointChecks sqec(self);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700488 ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveWrite, sizeof(int32_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700489 if (LIKELY(field != nullptr && obj != nullptr)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100490 // Compiled code can't use transactional mode.
491 field->Set32<false>(obj, new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700492 return 0; // success
493 }
Mathieu Chartier61c5ebc2014-06-05 17:42:53 -0700494 {
495 StackHandleScope<1> hs(self);
496 HandleWrapper<mirror::Object> h_obj(hs.NewHandleWrapper(&obj));
497 field = FindFieldFromCode<InstancePrimitiveWrite, true>(field_idx, referrer, self,
498 sizeof(int32_t));
499 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700500 if (LIKELY(field != nullptr)) {
501 if (UNLIKELY(obj == nullptr)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000502 ThrowNullPointerExceptionForFieldAccess(field, false);
Ian Rogers57b86d42012-03-27 16:05:41 -0700503 } else {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100504 // Compiled code can't use transactional mode.
505 field->Set32<false>(obj, new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700506 return 0; // success
507 }
508 }
509 return -1; // failure
510}
511
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800512extern "C" int artSet64InstanceFromCode(uint32_t field_idx, mirror::Object* obj, uint64_t new_value,
Mathieu Chartiere401d142015-04-22 13:56:20 -0700513 ArtMethod* referrer, Thread* self)
Mathieu Chartier90443472015-07-16 20:32:27 -0700514 SHARED_REQUIRES(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700515 ScopedQuickEntrypointChecks sqec(self);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700516 ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveWrite, sizeof(int64_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700517 if (LIKELY(field != nullptr && obj != nullptr)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100518 // Compiled code can't use transactional mode.
519 field->Set64<false>(obj, new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700520 return 0; // success
521 }
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200522 field = FindFieldFromCode<InstancePrimitiveWrite, true>(field_idx, referrer, self,
523 sizeof(int64_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700524 if (LIKELY(field != nullptr)) {
525 if (UNLIKELY(obj == nullptr)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000526 ThrowNullPointerExceptionForFieldAccess(field, false);
Ian Rogers57b86d42012-03-27 16:05:41 -0700527 } else {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100528 // Compiled code can't use transactional mode.
529 field->Set64<false>(obj, new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700530 return 0; // success
531 }
532 }
533 return -1; // failure
534}
535
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800536extern "C" int artSetObjInstanceFromCode(uint32_t field_idx, mirror::Object* obj,
537 mirror::Object* new_value,
Mathieu Chartiere401d142015-04-22 13:56:20 -0700538 ArtMethod* referrer, Thread* self)
Mathieu Chartier90443472015-07-16 20:32:27 -0700539 SHARED_REQUIRES(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700540 ScopedQuickEntrypointChecks sqec(self);
Mathieu Chartierc7853442015-03-27 14:35:38 -0700541 ArtField* field = FindFieldFast(field_idx, referrer, InstanceObjectWrite,
542 sizeof(mirror::HeapReference<mirror::Object>));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700543 if (LIKELY(field != nullptr && obj != nullptr)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100544 // Compiled code can't use transactional mode.
545 field->SetObj<false>(obj, new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700546 return 0; // success
547 }
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200548 field = FindFieldFromCode<InstanceObjectWrite, true>(field_idx, referrer, self,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800549 sizeof(mirror::HeapReference<mirror::Object>));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700550 if (LIKELY(field != nullptr)) {
551 if (UNLIKELY(obj == nullptr)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000552 ThrowNullPointerExceptionForFieldAccess(field, false);
Ian Rogers57b86d42012-03-27 16:05:41 -0700553 } else {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100554 // Compiled code can't use transactional mode.
555 field->SetObj<false>(obj, new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700556 return 0; // success
557 }
558 }
559 return -1; // failure
560}
561
Man Cao1aee9002015-07-14 22:31:42 -0700562// TODO: Currently the read barrier does not have a fast path. Ideally the slow path should only
Man Cao63069212015-08-21 15:51:39 -0700563// take one parameter "ref", which is given by the fast path.
Man Cao1aee9002015-07-14 22:31:42 -0700564extern "C" mirror::Object* artReadBarrierSlow(mirror::Object* ref ATTRIBUTE_UNUSED,
Roland Levillain0d5a2812015-11-13 10:07:31 +0000565 mirror::Object* obj,
566 uint32_t offset) {
567 DCHECK(kEmitCompilerReadBarrier);
Man Cao1aee9002015-07-14 22:31:42 -0700568 uint8_t* raw_addr = reinterpret_cast<uint8_t*>(obj) + offset;
569 mirror::HeapReference<mirror::Object>* ref_addr =
Roland Levillain0d5a2812015-11-13 10:07:31 +0000570 reinterpret_cast<mirror::HeapReference<mirror::Object>*>(raw_addr);
571 constexpr ReadBarrierOption kReadBarrierOption =
572 kUseReadBarrier ? kWithReadBarrier : kWithoutReadBarrier;
573 mirror::Object* result =
Hiroshi Yamauchicc78f3f2015-12-11 15:51:04 -0800574 ReadBarrier::Barrier<mirror::Object, kReadBarrierOption>(obj,
575 MemberOffset(offset),
576 ref_addr);
Roland Levillain0d5a2812015-11-13 10:07:31 +0000577 return result;
578}
579
580extern "C" mirror::Object* artReadBarrierForRootSlow(GcRoot<mirror::Object>* root) {
581 DCHECK(kEmitCompilerReadBarrier);
582 // TODO: Pass a GcRootSource object as second argument to GcRoot::Read?
583 return root->Read();
Man Cao1aee9002015-07-14 22:31:42 -0700584}
585
Ian Rogers57b86d42012-03-27 16:05:41 -0700586} // namespace art