1/*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#ifndef ECMASCRIPT_COMMON_H
17#define ECMASCRIPT_COMMON_H
18
19#include <limits>
20
21#include "libpandabase/macros.h"
22#include "ecmascript/common_enum.h"
23namespace panda {
24namespace ecmascript {
25
26#define SCOPE_LIST(V)                    \
27    V(TotalGC)                           \
28    V(Initialize)                        \
29    V(ConcurrentMark)                    \
30    V(WaitConcurrentMarkFinished)        \
31    V(ReMark)                            \
32    V(Mark)                              \
33    V(MarkRoots)                         \
34    V(ProcessSharedGCRSetWorkList)       \
35    V(Sweep)                             \
36    V(ClearNativeObject)                 \
37    V(Evacuate)                          \
38    V(Finish)                            \
39    V(UpdateReference)                   \
40    V(EvacuateSpace)                     \
41    V(SuspendAll)                        \
42    V(ResumeAll)                         \
43    V(ProceeWorkload)                    \
44    V(UpdateRoot)                        \
45    V(UpdateWeekRef)                     \
46    V(EvacuateRegion)                    \
47    V(WaitFinish)
48
49#define RECORD_DATA(V)                   \
50    V(START_OBJ_SIZE)                    \
51    V(END_OBJ_SIZE)                      \
52    V(START_COMMIT_SIZE)                 \
53    V(END_COMMIT_SIZE)                   \
54    V(START_EDEN_OBJ_SIZE)               \
55    V(START_YOUNG_OBJ_SIZE)              \
56    V(SEMI_ALIVE_SIZE)                   \
57    V(SEMI_COMMIT_SIZE)                  \
58    V(SEMI_PROMOTE_SIZE)                 \
59    V(EDEN_ALIVE_SIZE)                   \
60    V(EDEN_COMMIT_SIZE)                  \
61    V(EDEN_PROMOTE_SIZE)                 \
62    V(YOUNG_ALIVE_SIZE)                  \
63    V(YOUNG_COMMIT_SIZE)                 \
64    V(YOUNG_PROMOTE_SIZE)                \
65    V(OLD_ALIVE_SIZE)                    \
66    V(OLD_COMMIT_SIZE)                   \
67    V(COMPRESS_ALIVE_SIZE)               \
68    V(COMPRESS_COMMIT_SIZE)              \
69    V(START_NATIVE_POINTER_NUM)          \
70    V(COLLECT_REGION_SET_SIZE)           \
71    SEMI_RECORD_DATA(V)                  \
72    PARTIAL_RECORD_DATA(V)               \
73    FULL_RECORD_DATA(V)                  \
74    SHARED_RECORD_DATA(V)
75
76#define RECORD_DURATION(V)               \
77    V(SEMI_MIN_PAUSE)                    \
78    V(SEMI_MAX_PAUSE)                    \
79    V(SEMI_TOTAL_PAUSE)                  \
80    V(EDEN_MIN_PAUSE)                    \
81    V(EDEN_MAX_PAUSE)                    \
82    V(EDEN_TOTAL_PAUSE)                  \
83    V(YOUNG_MIN_PAUSE)                   \
84    V(YOUNG_MAX_PAUSE)                   \
85    V(YOUNG_TOTAL_PAUSE)                 \
86    V(OLD_MIN_PAUSE)                     \
87    V(OLD_MAX_PAUSE)                     \
88    V(OLD_TOTAL_PAUSE)                   \
89    V(COMPRESS_MIN_PAUSE)                \
90    V(COMPRESS_MAX_PAUSE)                \
91    V(COMPRESS_TOTAL_PAUSE)              \
92    V(SHARED_MIN_PAUSE)                  \
93    V(SHARED_MAX_PAUSE)                  \
94    V(SHARED_TOTAL_PAUSE)
95
96#define SEMI_RECORD_DATA(V)              \
97    V(SEMI_COUNT)                        \
98    V(SEMI_TOTAL_ALIVE)                  \
99    V(SEMI_TOTAL_COMMIT)                 \
100    V(SEMI_TOTAL_PROMOTE)
101
102#define PARTIAL_RECORD_DATA(V)           \
103    V(EDEN_COUNT)                        \
104    V(EDEN_TOTAL_ALIVE)                  \
105    V(EDEN_TOTAL_COMMIT)                 \
106    V(EDEN_TOTAL_PROMOTE)                \
107    V(YOUNG_COUNT)                       \
108    V(YOUNG_TOTAL_ALIVE)                 \
109    V(YOUNG_TOTAL_COMMIT)                \
110    V(YOUNG_TOTAL_PROMOTE)               \
111    V(OLD_COUNT)                         \
112    V(OLD_TOTAL_ALIVE)                   \
113    V(OLD_TOTAL_COMMIT)
114
115#define FULL_RECORD_DATA(V)              \
116    V(COMPRESS_COUNT)                    \
117    V(COMPRESS_TOTAL_ALIVE)              \
118    V(COMPRESS_TOTAL_COMMIT)
119
120#define SHARED_RECORD_DATA(V)            \
121    V(SHARED_COUNT)                      \
122    V(SHARED_ALIVE_SIZE)                 \
123    V(SHARED_TOTAL_ALIVE)                \
124    V(SHARED_COMMIT_SIZE)                \
125    V(SHARED_TOTAL_COMMIT)
126
127#define TRACE_GC_SPEED(V)                \
128    V(UPDATE_REFERENCE_SPEED)            \
129    V(OLD_CLEAR_NATIVE_OBJ_SPEED)        \
130    V(OLD_EVACUATE_SPACE_SPEED)          \
131    V(EDEN_CLEAR_NATIVE_OBJ_SPEED)       \
132    V(EDEN_UPDATE_REFERENCE_SPEED)       \
133    V(EDEN_EVACUATE_SPACE_SPEED)         \
134    V(YOUNG_CLEAR_NATIVE_OBJ_SPEED)      \
135    V(YOUNG_UPDATE_REFERENCE_SPEED)      \
136    V(YOUNG_EVACUATE_SPACE_SPEED)        \
137    V(MARK_SPEED)                        \
138    V(SWEEP_SPEED)
139
140constexpr uint32_t NUM_MANDATORY_JSFUNC_ARGS = 3;
141constexpr uint32_t INVALID_INDEX = std::numeric_limits<uint32_t>::max();
142
143using Address = uintptr_t;
144
145#define PUBLIC_API PANDA_PUBLIC_API
146
147#ifdef NDEBUG
148#define DUMP_API_ATTR __attribute__((unused))
149#else
150#ifndef PANDA_TARGET_WINDOWS
151#define DUMP_API_ATTR __attribute__((visibility ("default"), used))
152#else
153#define DUMP_API_ATTR __attribute__((unused))
154#endif
155#endif
156
157#ifdef PANDA_TARGET_32
158#define STATIC_ASSERT_EQ_ARCH32(a, b) static_assert(a == b)
159#else
160#define STATIC_ASSERT_EQ_ARCH32(a, b) static_assert(true)
161#endif
162
163#ifdef PANDA_TARGET_64
164#define STATIC_ASSERT_EQ_ARCH64(a, b) static_assert(a == b)
165#else
166#define STATIC_ASSERT_EQ_ARCH64(a, b) static_assert(true)
167#endif
168
169#if defined(PANDA_TARGET_WINDOWS) || defined(PANDA_TARGET_MACOS) || defined(PANDA_TARGET_IOS)
170#define WIN_OR_MAC_OR_IOS_PLATFORM true
171#else
172#define WIN_OR_MAC_OR_IOS_PLATFORM false
173#endif
174
175#define STATIC_ASSERT_EQ_ARCH(expect, valueArch32, valueArch64) \
176    STATIC_ASSERT_EQ_ARCH32(expect, valueArch32);               \
177    STATIC_ASSERT_EQ_ARCH64(expect, valueArch64)
178}  // namespace ecmascript
179}  // namespace panda
180
181#endif  // ECMASCRIPT_COMMON_H
182