1/*
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 */
16
17#ifndef ART_RUNTIME_ASM_SUPPORT_H_
18#define ART_RUNTIME_ASM_SUPPORT_H_
19
20#include "heap_poisoning.h"
21#include "read_barrier_config.h"
22
23// To generate tests related to the constants in this header, either define ADD_TEST_EQ before
24// including, or use asm_support_check.h.
25#ifndef ADD_TEST_EQ  // Allow #include-r to replace with their own.
26#define DEFINED_ADD_TEST_EQ 1
27#define ADD_TEST_EQ(x, y)
28#endif
29
30#if defined(__LP64__)
31#define POINTER_SIZE_SHIFT 3
32#define POINTER_SIZE art::PointerSize::k64
33#else
34#define POINTER_SIZE_SHIFT 2
35#define POINTER_SIZE art::PointerSize::k32
36#endif
37ADD_TEST_EQ(static_cast<size_t>(1U << POINTER_SIZE_SHIFT),
38            static_cast<size_t>(__SIZEOF_POINTER__))
39
40// Import platform-independent constant defines from our autogenerated list.
41// Export new defines (for assembly use) by editing cpp-define-generator def files.
42#define DEFINE_CHECK_EQ ADD_TEST_EQ
43#include "asm_support_gen.h"
44#undef DEFINE_CHECK_EQ
45
46// Offset of field Thread::tlsPtr_.exception.
47#define THREAD_EXCEPTION_OFFSET (THREAD_CARD_TABLE_OFFSET + __SIZEOF_POINTER__)
48ADD_TEST_EQ(THREAD_EXCEPTION_OFFSET,
49            art::Thread::ExceptionOffset<POINTER_SIZE>().Int32Value())
50
51// Offset of field Thread::tlsPtr_.managed_stack.top_quick_frame_.
52#define THREAD_TOP_QUICK_FRAME_OFFSET (THREAD_CARD_TABLE_OFFSET + (3 * __SIZEOF_POINTER__))
53ADD_TEST_EQ(THREAD_TOP_QUICK_FRAME_OFFSET,
54            art::Thread::TopOfManagedStackOffset<POINTER_SIZE>().Int32Value())
55
56// Offset of field Thread::tlsPtr_.self.
57#define THREAD_SELF_OFFSET (THREAD_CARD_TABLE_OFFSET + (9 * __SIZEOF_POINTER__))
58ADD_TEST_EQ(THREAD_SELF_OFFSET,
59            art::Thread::SelfOffset<POINTER_SIZE>().Int32Value())
60
61// Offset of field Thread::tlsPtr_.thread_local_pos.
62#define THREAD_LOCAL_POS_OFFSET (THREAD_CARD_TABLE_OFFSET + 34 * __SIZEOF_POINTER__)
63ADD_TEST_EQ(THREAD_LOCAL_POS_OFFSET,
64            art::Thread::ThreadLocalPosOffset<POINTER_SIZE>().Int32Value())
65// Offset of field Thread::tlsPtr_.thread_local_end.
66#define THREAD_LOCAL_END_OFFSET (THREAD_LOCAL_POS_OFFSET + __SIZEOF_POINTER__)
67ADD_TEST_EQ(THREAD_LOCAL_END_OFFSET,
68            art::Thread::ThreadLocalEndOffset<POINTER_SIZE>().Int32Value())
69// Offset of field Thread::tlsPtr_.thread_local_objects.
70#define THREAD_LOCAL_OBJECTS_OFFSET (THREAD_LOCAL_END_OFFSET + 2 * __SIZEOF_POINTER__)
71ADD_TEST_EQ(THREAD_LOCAL_OBJECTS_OFFSET,
72            art::Thread::ThreadLocalObjectsOffset<POINTER_SIZE>().Int32Value())
73
74// Offset of field Thread::tlsPtr_.mterp_current_ibase.
75#define THREAD_CURRENT_IBASE_OFFSET \
76    (THREAD_LOCAL_OBJECTS_OFFSET + __SIZEOF_SIZE_T__ + (1 + 162) * __SIZEOF_POINTER__)
77ADD_TEST_EQ(THREAD_CURRENT_IBASE_OFFSET,
78            art::Thread::MterpCurrentIBaseOffset<POINTER_SIZE>().Int32Value())
79// Offset of field Thread::tlsPtr_.mterp_default_ibase.
80#define THREAD_DEFAULT_IBASE_OFFSET (THREAD_CURRENT_IBASE_OFFSET + __SIZEOF_POINTER__)
81ADD_TEST_EQ(THREAD_DEFAULT_IBASE_OFFSET,
82            art::Thread::MterpDefaultIBaseOffset<POINTER_SIZE>().Int32Value())
83// Offset of field Thread::tlsPtr_.mterp_alt_ibase.
84#define THREAD_ALT_IBASE_OFFSET (THREAD_DEFAULT_IBASE_OFFSET + __SIZEOF_POINTER__)
85ADD_TEST_EQ(THREAD_ALT_IBASE_OFFSET,
86            art::Thread::MterpAltIBaseOffset<POINTER_SIZE>().Int32Value())
87// Offset of field Thread::tlsPtr_.rosalloc_runs.
88#define THREAD_ROSALLOC_RUNS_OFFSET (THREAD_ALT_IBASE_OFFSET + __SIZEOF_POINTER__)
89ADD_TEST_EQ(THREAD_ROSALLOC_RUNS_OFFSET,
90            art::Thread::RosAllocRunsOffset<POINTER_SIZE>().Int32Value())
91// Offset of field Thread::tlsPtr_.thread_local_alloc_stack_top.
92#define THREAD_LOCAL_ALLOC_STACK_TOP_OFFSET (THREAD_ROSALLOC_RUNS_OFFSET + 16 * __SIZEOF_POINTER__)
93ADD_TEST_EQ(THREAD_LOCAL_ALLOC_STACK_TOP_OFFSET,
94            art::Thread::ThreadLocalAllocStackTopOffset<POINTER_SIZE>().Int32Value())
95// Offset of field Thread::tlsPtr_.thread_local_alloc_stack_end.
96#define THREAD_LOCAL_ALLOC_STACK_END_OFFSET (THREAD_ROSALLOC_RUNS_OFFSET + 17 * __SIZEOF_POINTER__)
97ADD_TEST_EQ(THREAD_LOCAL_ALLOC_STACK_END_OFFSET,
98            art::Thread::ThreadLocalAllocStackEndOffset<POINTER_SIZE>().Int32Value())
99
100// Offsets within ShadowFrame.
101#define SHADOWFRAME_LINK_OFFSET 0
102ADD_TEST_EQ(SHADOWFRAME_LINK_OFFSET,
103            static_cast<int32_t>(art::ShadowFrame::LinkOffset()))
104#define SHADOWFRAME_METHOD_OFFSET (SHADOWFRAME_LINK_OFFSET + 1 * __SIZEOF_POINTER__)
105ADD_TEST_EQ(SHADOWFRAME_METHOD_OFFSET,
106            static_cast<int32_t>(art::ShadowFrame::MethodOffset()))
107#define SHADOWFRAME_RESULT_REGISTER_OFFSET (SHADOWFRAME_LINK_OFFSET + 2 * __SIZEOF_POINTER__)
108ADD_TEST_EQ(SHADOWFRAME_RESULT_REGISTER_OFFSET,
109            static_cast<int32_t>(art::ShadowFrame::ResultRegisterOffset()))
110#define SHADOWFRAME_DEX_PC_PTR_OFFSET (SHADOWFRAME_LINK_OFFSET + 3 * __SIZEOF_POINTER__)
111ADD_TEST_EQ(SHADOWFRAME_DEX_PC_PTR_OFFSET,
112            static_cast<int32_t>(art::ShadowFrame::DexPCPtrOffset()))
113#define SHADOWFRAME_DEX_INSTRUCTIONS_OFFSET (SHADOWFRAME_LINK_OFFSET + 4 * __SIZEOF_POINTER__)
114ADD_TEST_EQ(SHADOWFRAME_DEX_INSTRUCTIONS_OFFSET,
115            static_cast<int32_t>(art::ShadowFrame::DexInstructionsOffset()))
116#define SHADOWFRAME_LOCK_COUNT_DATA_OFFSET (SHADOWFRAME_LINK_OFFSET + 5 * __SIZEOF_POINTER__)
117ADD_TEST_EQ(SHADOWFRAME_LOCK_COUNT_DATA_OFFSET,
118            static_cast<int32_t>(art::ShadowFrame::LockCountDataOffset()))
119#define SHADOWFRAME_NUMBER_OF_VREGS_OFFSET (SHADOWFRAME_LINK_OFFSET + 6 * __SIZEOF_POINTER__)
120ADD_TEST_EQ(SHADOWFRAME_NUMBER_OF_VREGS_OFFSET,
121            static_cast<int32_t>(art::ShadowFrame::NumberOfVRegsOffset()))
122#define SHADOWFRAME_DEX_PC_OFFSET (SHADOWFRAME_NUMBER_OF_VREGS_OFFSET + 4)
123ADD_TEST_EQ(SHADOWFRAME_DEX_PC_OFFSET,
124            static_cast<int32_t>(art::ShadowFrame::DexPCOffset()))
125#define SHADOWFRAME_CACHED_HOTNESS_COUNTDOWN_OFFSET (SHADOWFRAME_NUMBER_OF_VREGS_OFFSET + 8)
126ADD_TEST_EQ(SHADOWFRAME_CACHED_HOTNESS_COUNTDOWN_OFFSET,
127            static_cast<int32_t>(art::ShadowFrame::CachedHotnessCountdownOffset()))
128#define SHADOWFRAME_HOTNESS_COUNTDOWN_OFFSET (SHADOWFRAME_NUMBER_OF_VREGS_OFFSET + 10)
129ADD_TEST_EQ(SHADOWFRAME_HOTNESS_COUNTDOWN_OFFSET,
130            static_cast<int32_t>(art::ShadowFrame::HotnessCountdownOffset()))
131#define SHADOWFRAME_VREGS_OFFSET (SHADOWFRAME_NUMBER_OF_VREGS_OFFSET + 16)
132ADD_TEST_EQ(SHADOWFRAME_VREGS_OFFSET,
133            static_cast<int32_t>(art::ShadowFrame::VRegsOffset()))
134
135#if defined(USE_BROOKS_READ_BARRIER)
136#define MIRROR_OBJECT_HEADER_SIZE 16
137#else
138#define MIRROR_OBJECT_HEADER_SIZE 8
139#endif
140ADD_TEST_EQ(size_t(MIRROR_OBJECT_HEADER_SIZE), sizeof(art::mirror::Object))
141
142// Offsets within java.lang.Class.
143#define MIRROR_CLASS_COMPONENT_TYPE_OFFSET (4 + MIRROR_OBJECT_HEADER_SIZE)
144ADD_TEST_EQ(MIRROR_CLASS_COMPONENT_TYPE_OFFSET,
145            art::mirror::Class::ComponentTypeOffset().Int32Value())
146#define MIRROR_CLASS_IF_TABLE_OFFSET (16 + MIRROR_OBJECT_HEADER_SIZE)
147ADD_TEST_EQ(MIRROR_CLASS_IF_TABLE_OFFSET,
148            art::mirror::Class::IfTableOffset().Int32Value())
149#define MIRROR_CLASS_ACCESS_FLAGS_OFFSET (56 + MIRROR_OBJECT_HEADER_SIZE)
150ADD_TEST_EQ(MIRROR_CLASS_ACCESS_FLAGS_OFFSET,
151            art::mirror::Class::AccessFlagsOffset().Int32Value())
152#define MIRROR_CLASS_OBJECT_SIZE_OFFSET (88 + MIRROR_OBJECT_HEADER_SIZE)
153ADD_TEST_EQ(MIRROR_CLASS_OBJECT_SIZE_OFFSET,
154            art::mirror::Class::ObjectSizeOffset().Int32Value())
155#define MIRROR_CLASS_OBJECT_SIZE_ALLOC_FAST_PATH_OFFSET (92 + MIRROR_OBJECT_HEADER_SIZE)
156ADD_TEST_EQ(MIRROR_CLASS_OBJECT_SIZE_ALLOC_FAST_PATH_OFFSET,
157            art::mirror::Class::ObjectSizeAllocFastPathOffset().Int32Value())
158#define MIRROR_CLASS_OBJECT_PRIMITIVE_TYPE_OFFSET (96 + MIRROR_OBJECT_HEADER_SIZE)
159ADD_TEST_EQ(MIRROR_CLASS_OBJECT_PRIMITIVE_TYPE_OFFSET,
160            art::mirror::Class::PrimitiveTypeOffset().Int32Value())
161#define MIRROR_CLASS_STATUS_OFFSET (104 + MIRROR_OBJECT_HEADER_SIZE)
162ADD_TEST_EQ(MIRROR_CLASS_STATUS_OFFSET,
163            art::mirror::Class::StatusOffset().Int32Value())
164
165#define PRIMITIVE_TYPE_SIZE_SHIFT_SHIFT 16
166ADD_TEST_EQ(PRIMITIVE_TYPE_SIZE_SHIFT_SHIFT,
167            static_cast<int>(art::mirror::Class::kPrimitiveTypeSizeShiftShift))
168
169// Array offsets.
170#define MIRROR_ARRAY_LENGTH_OFFSET      MIRROR_OBJECT_HEADER_SIZE
171ADD_TEST_EQ(MIRROR_ARRAY_LENGTH_OFFSET, art::mirror::Array::LengthOffset().Int32Value())
172
173#define MIRROR_CHAR_ARRAY_DATA_OFFSET   (4 + MIRROR_OBJECT_HEADER_SIZE)
174ADD_TEST_EQ(MIRROR_CHAR_ARRAY_DATA_OFFSET,
175            art::mirror::Array::DataOffset(sizeof(uint16_t)).Int32Value())
176
177#define MIRROR_BOOLEAN_ARRAY_DATA_OFFSET MIRROR_CHAR_ARRAY_DATA_OFFSET
178ADD_TEST_EQ(MIRROR_BOOLEAN_ARRAY_DATA_OFFSET,
179            art::mirror::Array::DataOffset(sizeof(uint8_t)).Int32Value())
180
181#define MIRROR_BYTE_ARRAY_DATA_OFFSET MIRROR_CHAR_ARRAY_DATA_OFFSET
182ADD_TEST_EQ(MIRROR_BYTE_ARRAY_DATA_OFFSET,
183            art::mirror::Array::DataOffset(sizeof(int8_t)).Int32Value())
184
185#define MIRROR_SHORT_ARRAY_DATA_OFFSET MIRROR_CHAR_ARRAY_DATA_OFFSET
186ADD_TEST_EQ(MIRROR_SHORT_ARRAY_DATA_OFFSET,
187            art::mirror::Array::DataOffset(sizeof(int16_t)).Int32Value())
188
189#define MIRROR_INT_ARRAY_DATA_OFFSET MIRROR_CHAR_ARRAY_DATA_OFFSET
190ADD_TEST_EQ(MIRROR_INT_ARRAY_DATA_OFFSET,
191            art::mirror::Array::DataOffset(sizeof(int32_t)).Int32Value())
192
193#define MIRROR_WIDE_ARRAY_DATA_OFFSET (8 + MIRROR_OBJECT_HEADER_SIZE)
194ADD_TEST_EQ(MIRROR_WIDE_ARRAY_DATA_OFFSET,
195            art::mirror::Array::DataOffset(sizeof(uint64_t)).Int32Value())
196
197#define MIRROR_OBJECT_ARRAY_DATA_OFFSET (4 + MIRROR_OBJECT_HEADER_SIZE)
198ADD_TEST_EQ(MIRROR_OBJECT_ARRAY_DATA_OFFSET,
199    art::mirror::Array::DataOffset(
200        sizeof(art::mirror::HeapReference<art::mirror::Object>)).Int32Value())
201
202#define MIRROR_OBJECT_ARRAY_COMPONENT_SIZE 4
203ADD_TEST_EQ(static_cast<size_t>(MIRROR_OBJECT_ARRAY_COMPONENT_SIZE),
204            sizeof(art::mirror::HeapReference<art::mirror::Object>))
205
206#define MIRROR_LONG_ARRAY_DATA_OFFSET (8 + MIRROR_OBJECT_HEADER_SIZE)
207ADD_TEST_EQ(MIRROR_LONG_ARRAY_DATA_OFFSET,
208            art::mirror::Array::DataOffset(sizeof(uint64_t)).Int32Value())
209
210// Offsets within java.lang.String.
211#define MIRROR_STRING_COUNT_OFFSET  MIRROR_OBJECT_HEADER_SIZE
212ADD_TEST_EQ(MIRROR_STRING_COUNT_OFFSET, art::mirror::String::CountOffset().Int32Value())
213
214#define MIRROR_STRING_VALUE_OFFSET (8 + MIRROR_OBJECT_HEADER_SIZE)
215ADD_TEST_EQ(MIRROR_STRING_VALUE_OFFSET, art::mirror::String::ValueOffset().Int32Value())
216
217// String compression feature.
218#define STRING_COMPRESSION_FEATURE 1
219ADD_TEST_EQ(STRING_COMPRESSION_FEATURE, art::mirror::kUseStringCompression);
220
221#ifdef DEFINED_ADD_TEST_EQ
222#undef ADD_TEST_EQ
223#undef DEFINED_ADD_TEST_EQ
224#endif
225
226#endif  // ART_RUNTIME_ASM_SUPPORT_H_
227