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 #include "ecmascript/compiler/call_signature.h"
17 #include "ecmascript/compiler/variable_type.h"
18 
19 #if defined(__clang__)
20 #pragma clang diagnostic push
21 #pragma clang diagnostic ignored "-Wshadow"
22 #pragma clang diagnostic ignored "-Wunused-parameter"
23 #elif defined(__GNUC__)
24 #pragma GCC diagnostic push
25 #pragma GCC diagnostic ignored "-Wshadow"
26 #pragma GCC diagnostic ignored "-Wunused-parameter"
27 #endif
28 
29 #include "llvm-c/Core.h"
30 #include "llvm/Support/Host.h"
31 
32 #if defined(__clang__)
33 #pragma clang diagnostic pop
34 #elif defined(__GNUC__)
35 #pragma GCC diagnostic pop
36 #endif
37 
38 namespace panda::ecmascript::kungfu {
39 #define BINARY_CALL_SIGNATURE(name)                             \
40     /* 3 : 3 input parameters */                                \
41     CallSignature signature(#name, 0, 3,                        \
42         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY()); \
43     *callSign = signature;                                      \
44     /* 3 : 3 input parameters */                                \
45     std::array<VariableType, 3> params = {                      \
46         VariableType::NATIVE_POINTER(),                         \
47         VariableType::JS_ANY(),                                 \
48         VariableType::JS_ANY(),                                 \
49     };                                                          \
50     callSign->SetParameters(params.data());                     \
51     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
52 
DEF_CALL_SIGNATURE(Add)53 DEF_CALL_SIGNATURE(Add)
54 {
55     BINARY_CALL_SIGNATURE(Add)
56 }
57 
DEF_CALL_SIGNATURE(Sub)58 DEF_CALL_SIGNATURE(Sub)
59 {
60     BINARY_CALL_SIGNATURE(Sub)
61 }
62 
DEF_CALL_SIGNATURE(Mul)63 DEF_CALL_SIGNATURE(Mul)
64 {
65     BINARY_CALL_SIGNATURE(Mul)
66 }
67 
DEF_CALL_SIGNATURE(Div)68 DEF_CALL_SIGNATURE(Div)
69 {
70     BINARY_CALL_SIGNATURE(Div)
71 }
72 
DEF_CALL_SIGNATURE(Mod)73 DEF_CALL_SIGNATURE(Mod)
74 {
75     BINARY_CALL_SIGNATURE(Mod)
76 }
77 
DEF_CALL_SIGNATURE(Equal)78 DEF_CALL_SIGNATURE(Equal)
79 {
80     BINARY_CALL_SIGNATURE(Equal)
81 }
82 
DEF_CALL_SIGNATURE(NotEqual)83 DEF_CALL_SIGNATURE(NotEqual)
84 {
85     BINARY_CALL_SIGNATURE(NotEqual)
86 }
87 
DEF_CALL_SIGNATURE(StrictEqual)88 DEF_CALL_SIGNATURE(StrictEqual)
89 {
90     BINARY_CALL_SIGNATURE(StrictEqual)
91 }
92 
DEF_CALL_SIGNATURE(StrictNotEqual)93 DEF_CALL_SIGNATURE(StrictNotEqual)
94 {
95     BINARY_CALL_SIGNATURE(StrictNotEqual)
96 }
97 
DEF_CALL_SIGNATURE(Less)98 DEF_CALL_SIGNATURE(Less)
99 {
100     BINARY_CALL_SIGNATURE(Less)
101 }
102 
DEF_CALL_SIGNATURE(LessEq)103 DEF_CALL_SIGNATURE(LessEq)
104 {
105     BINARY_CALL_SIGNATURE(LessEq)
106 }
107 
DEF_CALL_SIGNATURE(Greater)108 DEF_CALL_SIGNATURE(Greater)
109 {
110     BINARY_CALL_SIGNATURE(Greater)
111 }
112 
DEF_CALL_SIGNATURE(GreaterEq)113 DEF_CALL_SIGNATURE(GreaterEq)
114 {
115     BINARY_CALL_SIGNATURE(GreaterEq)
116 }
117 
DEF_CALL_SIGNATURE(Shl)118 DEF_CALL_SIGNATURE(Shl)
119 {
120     BINARY_CALL_SIGNATURE(Shl)
121 }
122 
DEF_CALL_SIGNATURE(Shr)123 DEF_CALL_SIGNATURE(Shr)
124 {
125     BINARY_CALL_SIGNATURE(Shr)
126 }
127 
DEF_CALL_SIGNATURE(Ashr)128 DEF_CALL_SIGNATURE(Ashr)
129 {
130     BINARY_CALL_SIGNATURE(Ashr)
131 }
132 
DEF_CALL_SIGNATURE(And)133 DEF_CALL_SIGNATURE(And)
134 {
135     BINARY_CALL_SIGNATURE(And)
136 }
137 
DEF_CALL_SIGNATURE(Or)138 DEF_CALL_SIGNATURE(Or)
139 {
140     BINARY_CALL_SIGNATURE(Or)
141 }
142 
DEF_CALL_SIGNATURE(Xor)143 DEF_CALL_SIGNATURE(Xor)
144 {
145     BINARY_CALL_SIGNATURE(Xor)
146 }
147 
148 #ifndef NDEBUG
DEF_CALL_SIGNATURE(MulGCTest)149 DEF_CALL_SIGNATURE(MulGCTest)
150 {
151     // 3 : 3 input parameters
152     CallSignature MulGC("MulGCTest", 0, 3, ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
153     *callSign = MulGC;
154     // 3 : 3 input parameters
155     std::array<VariableType, 3> params = {
156         VariableType::NATIVE_POINTER(),
157         VariableType::INT64(),
158         VariableType::INT64(),
159     };
160     callSign->SetParameters(params.data());
161     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
162 }
163 #else
DEF_CALL_SIGNATURE(MulGCTest)164 DEF_CALL_SIGNATURE(MulGCTest) {}
165 #endif
166 
167 #define UNARY_CALL_SIGNATURE(name)                              \
168     /* 2 : 2 input parameters */                                \
169     CallSignature signature(#name, 0, 2,                        \
170         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY()); \
171     *callSign = signature;                                      \
172     /* 2 : 2 input parameters */                                \
173     std::array<VariableType, 2> params = {                      \
174         VariableType::NATIVE_POINTER(),                         \
175         VariableType::JS_ANY(),                                 \
176     };                                                          \
177     callSign->SetParameters(params.data());                     \
178     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
179 
DEF_CALL_SIGNATURE(Inc)180 DEF_CALL_SIGNATURE(Inc)
181 {
182     UNARY_CALL_SIGNATURE(Inc)
183 }
184 
DEF_CALL_SIGNATURE(Dec)185 DEF_CALL_SIGNATURE(Dec)
186 {
187     UNARY_CALL_SIGNATURE(Dec)
188 }
189 
DEF_CALL_SIGNATURE(Neg)190 DEF_CALL_SIGNATURE(Neg)
191 {
192     UNARY_CALL_SIGNATURE(Neg)
193 }
194 
DEF_CALL_SIGNATURE(Not)195 DEF_CALL_SIGNATURE(Not)
196 {
197     UNARY_CALL_SIGNATURE(Not)
198 }
199 
DEF_CALL_SIGNATURE(ToBooleanTrue)200 DEF_CALL_SIGNATURE(ToBooleanTrue)
201 {
202     UNARY_CALL_SIGNATURE(ToBooleanTrue)
203 }
204 
DEF_CALL_SIGNATURE(ToBooleanFalse)205 DEF_CALL_SIGNATURE(ToBooleanFalse)
206 {
207     UNARY_CALL_SIGNATURE(ToBooleanFalse)
208 }
209 
DEF_CALL_SIGNATURE(TypeOf)210 DEF_CALL_SIGNATURE(TypeOf)
211 {
212     // 2 input parameters
213     CallSignature TypeOf("TypeOf", 0, 2, ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_POINTER());
214     *callSign = TypeOf;
215     // 2 input parameters
216     std::array<VariableType, 2> params = {
217         VariableType::NATIVE_POINTER(), // glue
218         VariableType::JS_ANY(), // ACC
219     };
220     callSign->SetParameters(params.data());
221     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
222 }
223 
DEF_CALL_SIGNATURE(SetPropertyByName)224 DEF_CALL_SIGNATURE(SetPropertyByName)
225 {
226     // 6 : 6 input parameters
227     CallSignature setPropertyByName("SetPropertyByName", 0, 6, ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
228     *callSign = setPropertyByName;
229     // 6 : 6 input parameters
230     std::array<VariableType, 6> params = {
231         VariableType::NATIVE_POINTER(),   // glue
232         VariableType::JS_ANY(),           // receiver
233         VariableType::INT64(),            // key
234         VariableType::JS_ANY(),           // value
235         VariableType::JS_ANY(),           // jsFunc
236         VariableType::INT32(),            // slot id
237     };
238     callSign->SetParameters(params.data());
239     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
240 }
241 
DEF_CALL_SIGNATURE(DeprecatedSetPropertyByName)242 DEF_CALL_SIGNATURE(DeprecatedSetPropertyByName)
243 {
244     // 4 : 4 input parameters
245     CallSignature setPropertyByName("DeprecatedSetPropertyByName", 0, 4, ArgumentsOrder::DEFAULT_ORDER,
246         VariableType::JS_ANY());
247     *callSign = setPropertyByName;
248     // 4 : 4 input parameters
249     std::array<VariableType, 4> params = {
250         VariableType::NATIVE_POINTER(),
251         VariableType::JS_POINTER(),
252         VariableType::JS_POINTER(),
253         VariableType::JS_ANY()
254     };
255     callSign->SetParameters(params.data());
256     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
257 }
258 
DEF_CALL_SIGNATURE(SetPropertyByNameWithOwn)259 DEF_CALL_SIGNATURE(SetPropertyByNameWithOwn)
260 {
261     // 4 : 4 input parameters
262     CallSignature setPropertyByNameWithOwn("SetPropertyByNameWithOwn", 0, 4, ArgumentsOrder::DEFAULT_ORDER,
263         VariableType::JS_ANY());
264     *callSign = setPropertyByNameWithOwn;
265     // 4 : 4 input parameters
266     std::array<VariableType, 4> params = {
267         VariableType::NATIVE_POINTER(),
268         VariableType::JS_POINTER(),
269         VariableType::JS_POINTER(),
270         VariableType::JS_ANY()
271     };
272     callSign->SetParameters(params.data());
273     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
274 }
275 
DEF_CALL_SIGNATURE(SetPropertyByValue)276 DEF_CALL_SIGNATURE(SetPropertyByValue)
277 {
278     // 6 : 6 input parameters
279     CallSignature setPropertyByName("SetPropertyByValue", 0, 6, ArgumentsOrder::DEFAULT_ORDER,
280         VariableType::JS_ANY());
281     *callSign = setPropertyByName;
282     // 6 : 6 input parameters
283     std::array<VariableType, 6> params = {
284         VariableType::NATIVE_POINTER(),    // glue
285         VariableType::JS_POINTER(),        // receiver
286         VariableType::JS_ANY(),            // key
287         VariableType::JS_ANY(),            // value
288         VariableType::JS_ANY(),            // jsFunc
289         VariableType::INT32(),             // slot id
290     };
291     callSign->SetParameters(params.data());
292     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
293 }
294 
DEF_CALL_SIGNATURE(Definefunc)295 DEF_CALL_SIGNATURE(Definefunc)
296 {
297     // 6 : 6 input parameters
298     CallSignature definefunc("Definefunc", 0, 6, ArgumentsOrder::DEFAULT_ORDER,
299         VariableType::JS_ANY());
300     *callSign = definefunc;
301     // 6 : 6 input parameters
302     std::array<VariableType, 6> params = {
303         VariableType::NATIVE_POINTER(),    // glue
304         VariableType::JS_ANY(),            // jsFunc
305         VariableType::INT32(),             // methodId
306         VariableType::INT32(),             // length
307         VariableType::JS_ANY(),            // lexEnv
308         VariableType::INT32(),             // slotId
309     };
310     callSign->SetParameters(params.data());
311     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
312 }
313 
DEF_CALL_SIGNATURE(DefineField)314 DEF_CALL_SIGNATURE(DefineField)
315 {
316     // 4 : 4 input parameters
317     CallSignature defineField("DefineField", 0, 4, ArgumentsOrder::DEFAULT_ORDER,
318         VariableType::JS_ANY());
319     *callSign = defineField;
320     // 4 : 4 input parameters
321     std::array<VariableType, 4> params = {
322         VariableType::NATIVE_POINTER(),    // glue
323         VariableType::JS_ANY(),            // receiver
324         VariableType::JS_ANY(),            // key
325         VariableType::JS_ANY(),            // acc
326     };
327     callSign->SetParameters(params.data());
328     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
329 }
330 
DEF_CALL_SIGNATURE(ConvertCharToInt32)331 DEF_CALL_SIGNATURE(ConvertCharToInt32)
332 {
333     // 2 : 2 input parameters
334     CallSignature convertCharToInt32("ConvertCharToInt32", 0, 2, ArgumentsOrder::DEFAULT_ORDER,
335         VariableType::INT32());
336     *callSign = convertCharToInt32;
337     // 2 : 2 input parameters
338     std::array<VariableType, 2> params = {
339         VariableType::NATIVE_POINTER(),     // glue
340         VariableType::INT32(),              // charcode
341     };
342     callSign->SetParameters(params.data());
343     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
344 }
345 
DEF_CALL_SIGNATURE(ConvertCharToDouble)346 DEF_CALL_SIGNATURE(ConvertCharToDouble)
347 {
348     // 2 : 2 input parameters
349     CallSignature convertCharToDouble("ConvertCharToDouble", 0, 2, ArgumentsOrder::DEFAULT_ORDER,
350         VariableType::FLOAT64());
351     *callSign = convertCharToDouble;
352     // 2 : 2 input parameters
353     std::array<VariableType, 2> params = {
354         VariableType::NATIVE_POINTER(),     // glue
355         VariableType::INT32(),              // charcode
356     };
357     callSign->SetParameters(params.data());
358     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
359 }
360 
DEF_CALL_SIGNATURE(DeprecatedSetPropertyByValue)361 DEF_CALL_SIGNATURE(DeprecatedSetPropertyByValue)
362 {
363     // 4 : 4 input parameters
364     CallSignature setPropertyByName("DeprecatedSetPropertyByValue", 0, 4, ArgumentsOrder::DEFAULT_ORDER,
365         VariableType::JS_ANY());
366     *callSign = setPropertyByName;
367     // 4 : 4 input parameters
368     std::array<VariableType, 4> params = {
369         VariableType::NATIVE_POINTER(),
370         VariableType::JS_POINTER(),
371         VariableType::JS_ANY(),
372         VariableType::JS_ANY()
373     };
374     callSign->SetParameters(params.data());
375     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
376 }
377 
DEF_CALL_SIGNATURE(SetPropertyByValueWithOwn)378 DEF_CALL_SIGNATURE(SetPropertyByValueWithOwn)
379 {
380     // 4 : 4 input parameters
381     CallSignature setPropertyByValueWithOwn("SetPropertyByValueWithOwn", 0, 4, ArgumentsOrder::DEFAULT_ORDER,
382         VariableType::JS_ANY());
383     *callSign = setPropertyByValueWithOwn;
384     // 4 : 4 input parameters
385     std::array<VariableType, 4> params = {
386         VariableType::NATIVE_POINTER(),
387         VariableType::JS_POINTER(),
388         VariableType::JS_ANY(),
389         VariableType::JS_ANY()
390     };
391     callSign->SetParameters(params.data());
392     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
393 }
394 
DEF_CALL_SIGNATURE(GetPropertyByName)395 DEF_CALL_SIGNATURE(GetPropertyByName)
396 {
397     // 5 : 5 input parameters
398     CallSignature getPropertyByName("GetPropertyByName", 0, 5, ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
399     *callSign = getPropertyByName;
400     // 5 : 5 input parameters
401     std::array<VariableType, 5> params = {
402         VariableType::NATIVE_POINTER(),   // glue
403         VariableType::JS_ANY(),           // receiver
404         VariableType::INT64(),            // key
405         VariableType::JS_ANY(),           // jsFunc
406         VariableType::INT32(),            // slot id
407     };
408     callSign->SetParameters(params.data());
409     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
410 }
411 
DEF_CALL_SIGNATURE(Instanceof)412 DEF_CALL_SIGNATURE(Instanceof)
413 {
414     // 5 : 5 input parameters
415     CallSignature instanceof("Instanceof", 0, 5, ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
416     *callSign = instanceof;
417     // 5 : 5 input parameters
418     std::array<VariableType, 5> params = {
419         VariableType::NATIVE_POINTER(),   // glue
420         VariableType::JS_ANY(),           // object
421         VariableType::JS_ANY(),           // target
422         VariableType::JS_ANY(),           // jsFunc
423         VariableType::INT32(),            // slot id
424     };
425     callSign->SetParameters(params.data());
426     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
427 }
428 
DEF_CALL_SIGNATURE(DeprecatedGetPropertyByName)429 DEF_CALL_SIGNATURE(DeprecatedGetPropertyByName)
430 {
431     // 3 : 3 input parameters
432     CallSignature getPropertyByName("DeprecatedGetPropertyByName", 0, 3, ArgumentsOrder::DEFAULT_ORDER,
433         VariableType::JS_ANY());
434     *callSign = getPropertyByName;
435     // 3 : 3 input parameters
436     std::array<VariableType, 3> params = {
437         VariableType::NATIVE_POINTER(), // glue
438         VariableType::JS_ANY(),         // receiver
439         VariableType::JS_POINTER(),     // key
440     };
441     callSign->SetParameters(params.data());
442     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
443 }
444 
DEF_CALL_SIGNATURE(TryLdGlobalByName)445 DEF_CALL_SIGNATURE(TryLdGlobalByName)
446 {
447     // 4 : 4 input parameters
448     CallSignature signature("TryLdGlobalByName", 0, 4, ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
449     *callSign = signature;
450     // 4 : 4 input parameters
451     std::array<VariableType, 4> params = {
452         VariableType::NATIVE_POINTER(),   // glue
453         VariableType::INT64(),            // key
454         VariableType::JS_ANY(),           // jsFunc
455         VariableType::INT32(),            // slot id
456     };
457     callSign->SetParameters(params.data());
458     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
459 }
460 
DEF_CALL_SIGNATURE(TryStGlobalByName)461 DEF_CALL_SIGNATURE(TryStGlobalByName)
462 {
463     // 5 : 5 input parameters
464     CallSignature signature("TryStGlobalByName", 0, 5, ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
465     *callSign = signature;
466     // 5 : 5 input parameters
467     std::array<VariableType, 5> params = {
468         VariableType::NATIVE_POINTER(),   // glue
469         VariableType::INT64(),            // key
470         VariableType::JS_ANY(),           // value
471         VariableType::JS_ANY(),           // jsFunc
472         VariableType::INT32(),            // slot id
473     };
474     callSign->SetParameters(params.data());
475     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
476 }
477 
DEF_CALL_SIGNATURE(LdGlobalVar)478 DEF_CALL_SIGNATURE(LdGlobalVar)
479 {
480     // 4 : 4 input parameters
481     CallSignature signature("LdGlobalVar", 0, 4, ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
482     *callSign = signature;
483     // 4 : 4 input parameters
484     std::array<VariableType, 4> params = {
485         VariableType::NATIVE_POINTER(),   // glue
486         VariableType::INT64(),            // key
487         VariableType::JS_ANY(),           // jsFunc
488         VariableType::INT32(),            // slot id
489     };
490     callSign->SetParameters(params.data());
491     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
492 }
493 
DEF_CALL_SIGNATURE(StGlobalVar)494 DEF_CALL_SIGNATURE(StGlobalVar)
495 {
496     // 5 : 5 input parameters
497     CallSignature signature("StGlobalVar", 0, 5, ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
498     *callSign = signature;
499     // 5 : 5 input parameters
500     std::array<VariableType, 5> params = {
501         VariableType::NATIVE_POINTER(),   // glue
502         VariableType::INT64(),            // string id
503         VariableType::JS_ANY(),           // value
504         VariableType::JS_ANY(),           // jsFunc
505         VariableType::INT32(),            // slot id
506     };
507     callSign->SetParameters(params.data());
508     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
509 }
DEF_CALL_SIGNATURE(StOwnByValue)510 DEF_CALL_SIGNATURE(StOwnByValue)
511 {
512     // 4 : 4 input parameters
513     CallSignature signature("StOwnByValue", 0, 4, ArgumentsOrder::DEFAULT_ORDER,
514         VariableType::JS_ANY());
515     *callSign = signature;
516     // 4 : 4 input parameters
517     std::array<VariableType, 4> params = {
518         VariableType::NATIVE_POINTER(),
519         VariableType::JS_POINTER(),
520         VariableType::JS_ANY(),
521         VariableType::JS_ANY()
522     };
523     callSign->SetParameters(params.data());
524     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
525 }
DEF_CALL_SIGNATURE(StOwnByIndex)526 DEF_CALL_SIGNATURE(StOwnByIndex)
527 {
528     // 4 : 4 input parameters
529     CallSignature signature("StOwnByIndex", 0, 4, ArgumentsOrder::DEFAULT_ORDER,
530         VariableType::JS_ANY()); // hole or undefined
531     *callSign = signature;
532     // 4 : 4 input parameters
533     std::array<VariableType, 4> params = {
534         VariableType::NATIVE_POINTER(),
535         VariableType::JS_POINTER(),
536         VariableType::INT32(),
537         VariableType::JS_ANY()
538     };
539     callSign->SetParameters(params.data());
540     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
541 }
DEF_CALL_SIGNATURE(StOwnByName)542 DEF_CALL_SIGNATURE(StOwnByName)
543 {
544     // 4 : 4 input parameters
545     CallSignature signature("StOwnByName", 0, 4, ArgumentsOrder::DEFAULT_ORDER,
546         VariableType::JS_ANY());
547     *callSign = signature;
548     // 4 : 4 input parameters
549     std::array<VariableType, 4> params = {
550         VariableType::NATIVE_POINTER(),
551         VariableType::JS_POINTER(),
552         VariableType::JS_POINTER(),
553         VariableType::JS_ANY()
554     };
555     callSign->SetParameters(params.data());
556     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
557 }
DEF_CALL_SIGNATURE(StOwnByValueWithNameSet)558 DEF_CALL_SIGNATURE(StOwnByValueWithNameSet)
559 {
560     // 4 : 4 input parameters
561     CallSignature signature("StOwnByValueWithNameSet", 0, 4, ArgumentsOrder::DEFAULT_ORDER,
562         VariableType::JS_ANY());
563     *callSign = signature;
564     // 4 : 4 input parameters
565     std::array<VariableType, 4> params = {
566         VariableType::NATIVE_POINTER(),
567         VariableType::JS_POINTER(),
568         VariableType::JS_ANY(),
569         VariableType::JS_ANY()
570     };
571     callSign->SetParameters(params.data());
572     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
573 }
DEF_CALL_SIGNATURE(StOwnByNameWithNameSet)574 DEF_CALL_SIGNATURE(StOwnByNameWithNameSet)
575 {
576     // 4 : 4 input parameters
577     CallSignature signature("StOwnByNameWithNameSet", 0, 4, ArgumentsOrder::DEFAULT_ORDER,
578         VariableType::JS_ANY());
579     *callSign = signature;
580     // 4 : 4 input parameters
581     std::array<VariableType, 4> params = {
582         VariableType::NATIVE_POINTER(),
583         VariableType::JS_POINTER(),
584         VariableType::JS_POINTER(),
585         VariableType::JS_ANY()
586     };
587     callSign->SetParameters(params.data());
588     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
589 }
DEF_CALL_SIGNATURE(StObjByIndex)590 DEF_CALL_SIGNATURE(StObjByIndex)
591 {
592     // 4 : 4 input parameters
593     CallSignature signature("StObjByIndex", 0, 4, ArgumentsOrder::DEFAULT_ORDER,
594         VariableType::JS_ANY()); // hole or undefined
595     *callSign = signature;
596     // 4 : 4 input parameters
597     std::array<VariableType, 4> params = {
598         VariableType::NATIVE_POINTER(),
599         VariableType::JS_POINTER(),
600         VariableType::INT32(),
601         VariableType::JS_ANY()
602     };
603     callSign->SetParameters(params.data());
604     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
605 }
DEF_CALL_SIGNATURE(LdObjByIndex)606 DEF_CALL_SIGNATURE(LdObjByIndex)
607 {
608     // 3 : 3 input parameters
609     CallSignature signature("LdObjByIndex", 0, 3, ArgumentsOrder::DEFAULT_ORDER,
610         VariableType::JS_ANY());
611     *callSign = signature;
612     // 3 : 3 input parameters
613     std::array<VariableType, 3> params = {
614         VariableType::NATIVE_POINTER(), // glue
615         VariableType::JS_ANY(), // receiver
616         VariableType::INT32(), // index
617     };
618     callSign->SetParameters(params.data());
619     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
620 }
621 
DEF_CALL_SIGNATURE(GetPropertyByIndex)622 DEF_CALL_SIGNATURE(GetPropertyByIndex)
623 {
624     // 3 : 3 input parameters
625     CallSignature getPropertyByIndex("GetPropertyByIndex", 0, 3, ArgumentsOrder::DEFAULT_ORDER,
626         VariableType::JS_ANY());
627     *callSign = getPropertyByIndex;
628     // 3 : 3 input parameters
629     std::array<VariableType, 3> params = {
630         VariableType::NATIVE_POINTER(), // glue
631         VariableType::JS_ANY(), // receiver
632         VariableType::INT32(), // index
633     };
634     callSign->SetParameters(params.data());
635     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
636 }
637 
DEF_CALL_SIGNATURE(SetPropertyByIndex)638 DEF_CALL_SIGNATURE(SetPropertyByIndex)
639 {
640     // 4 : 4 input parameters
641     CallSignature setPropertyByIndex("SetPropertyByIndex", 0, 4, ArgumentsOrder::DEFAULT_ORDER,
642         VariableType::JS_ANY()); // hole or undefined
643     *callSign = setPropertyByIndex;
644     // 4 : 4 input parameters
645     std::array<VariableType, 4> params = {
646         VariableType::NATIVE_POINTER(),
647         VariableType::JS_POINTER(),
648         VariableType::INT32(),
649         VariableType::JS_ANY()
650     };
651     callSign->SetParameters(params.data());
652     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
653 }
654 
DEF_CALL_SIGNATURE(SetPropertyByIndexWithOwn)655 DEF_CALL_SIGNATURE(SetPropertyByIndexWithOwn)
656 {
657     // 4 : 4 input parameters
658     CallSignature setPropertyByIndexWithOwn("SetPropertyByIndexWithOwn", 0, 4, ArgumentsOrder::DEFAULT_ORDER,
659         VariableType::JS_ANY()); // hole or undefined
660     *callSign = setPropertyByIndexWithOwn;
661     // 4 : 4 input parameters
662     std::array<VariableType, 4> params = {
663         VariableType::NATIVE_POINTER(),
664         VariableType::JS_POINTER(),
665         VariableType::INT32(),
666         VariableType::JS_ANY()
667     };
668     callSign->SetParameters(params.data());
669     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
670 }
671 
DEF_CALL_SIGNATURE(GetPropertyByValue)672 DEF_CALL_SIGNATURE(GetPropertyByValue)
673 {
674     // 5 : 5 input parameters
675     CallSignature getPropertyByValue("GetPropertyByValue", 0, 5, ArgumentsOrder::DEFAULT_ORDER,
676                                       VariableType::JS_ANY());
677     *callSign = getPropertyByValue;
678     // 5 : 5 input parameters
679     std::array<VariableType, 5> params = {
680         VariableType::NATIVE_POINTER(),   // glue
681         VariableType::JS_POINTER(),       // receiver
682         VariableType::JS_ANY(),           // key
683         VariableType::JS_ANY(),           // jsFunc
684         VariableType::INT32(),            // slot id
685     };
686     callSign->SetParameters(params.data());
687     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
688 }
689 
DEF_CALL_SIGNATURE(DeprecatedGetPropertyByValue)690 DEF_CALL_SIGNATURE(DeprecatedGetPropertyByValue)
691 {
692     // 3 : 3 input parameters
693     CallSignature getPropertyByValue("DeprecatedGetPropertyByValue", 0, 3, ArgumentsOrder::DEFAULT_ORDER,
694                                       VariableType::JS_ANY());
695     *callSign = getPropertyByValue;
696     // 3 : 3 input parameters
697     std::array<VariableType, 3> params = {
698         VariableType::NATIVE_POINTER(),
699         VariableType::JS_POINTER(),
700         VariableType::JS_ANY(),
701     };
702     callSign->SetParameters(params.data());
703     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
704 }
705 
DEF_CALL_SIGNATURE(TryLoadICByName)706 DEF_CALL_SIGNATURE(TryLoadICByName)
707 {
708     // 4 : 4 input parameters
709     CallSignature tryLoadICByName("TryLoadICByName", 0, 4,
710         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
711     *callSign = tryLoadICByName;
712     // 4 : 4 input parameters
713     std::array<VariableType, 4> params = {
714         VariableType::NATIVE_POINTER(),
715         VariableType::JS_ANY(),
716         VariableType::JS_ANY(),
717         VariableType::JS_ANY(),
718     };
719     callSign->SetParameters(params.data());
720     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
721 }
722 
DEF_CALL_SIGNATURE(TryLoadICByValue)723 DEF_CALL_SIGNATURE(TryLoadICByValue)
724 {
725     // 5 : 5 input parameters
726     CallSignature tryLoadICByValue("TryLoadICByValue", 0, 5,
727         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
728     *callSign = tryLoadICByValue;
729     // 5 : 5 input parameters
730     std::array<VariableType, 5> params = {
731         VariableType::NATIVE_POINTER(),
732         VariableType::JS_ANY(),
733         VariableType::JS_ANY(),
734         VariableType::JS_ANY(),
735         VariableType::JS_ANY(),
736     };
737     callSign->SetParameters(params.data());
738     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
739 }
740 
DEF_CALL_SIGNATURE(TryStoreICByName)741 DEF_CALL_SIGNATURE(TryStoreICByName)
742 {
743     // 5 : 5 input parameters
744     CallSignature tryStoreICByName("TryStoreICByName", 0, 5,
745         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY()); // undefined or hole
746     *callSign = tryStoreICByName;
747     // 5 : 5 input parameters
748     std::array<VariableType, 5> params = {
749         VariableType::NATIVE_POINTER(),
750         VariableType::JS_POINTER(),
751         VariableType::JS_ANY(),
752         VariableType::JS_ANY(),
753         VariableType::JS_POINTER(),
754     };
755     callSign->SetParameters(params.data());
756     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
757 }
758 
DEF_CALL_SIGNATURE(TryStoreICByValue)759 DEF_CALL_SIGNATURE(TryStoreICByValue)
760 {
761     // 6 : 6 input parameters
762     CallSignature tryStoreICByValue("TryStoreICByValue", 0, 6,
763         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY()); // undefined or hole
764     *callSign = tryStoreICByValue;
765     // 6 : 6 input parameters
766     std::array<VariableType, 6> params = {
767         VariableType::NATIVE_POINTER(),
768         VariableType::JS_POINTER(),
769         VariableType::JS_ANY(),
770         VariableType::JS_ANY(),
771         VariableType::JS_ANY(),
772         VariableType::JS_POINTER(),
773     };
774     callSign->SetParameters(params.data());
775     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
776 }
777 
778 #define SETVALUEBARRIER_CALL_ARGS_SIGNATURE_COMMON(name)                    \
779     /* 6 : 4 input parameters + 2 fake parameter */                         \
780     CallSignature signature("#name", 0, 6,                                  \
781         ArgumentsOrder::DEFAULT_ORDER, VariableType::VOID());               \
782     *callSign = signature;                                                  \
783     /* 6 : 4 input parameters + 2 fake parameter */                         \
784     std::array<VariableType, 6> params = {                                  \
785         VariableType::NATIVE_POINTER(),                                     \
786         VariableType::JS_POINTER(),                                         \
787         VariableType::NATIVE_POINTER(),                                     \
788         VariableType::JS_ANY(),                                             \
789         VariableType::INT64(),                                              \
790         VariableType::INT64(),                                              \
791     };                                                                      \
792     callSign->SetParameters(params.data());                                 \
793     callSign->SetGCLeafFunction(true);                                      \
794     callSign->SetCallConv(CallSignature::CallConv::CCallConv);              \
795                                                                             \
796     std::vector<CallSignature::ParamAttr> paramAttrs = {                    \
797         CallSignature::ParamAttr::NoAttr,                                   \
798         CallSignature::ParamAttr::NoAttr,                                   \
799         CallSignature::ParamAttr::NoAttr,                                   \
800         CallSignature::ParamAttr::NoAttr,                                   \
801         CallSignature::ParamAttr::Dead,                                     \
802         CallSignature::ParamAttr::Dead,                                     \
803     };                                                                      \
804     callSign->SetParamAttr(std::move(paramAttrs))
805 
DEF_CALL_SIGNATURE(SetValueWithBarrier)806 DEF_CALL_SIGNATURE(SetValueWithBarrier)
807 {
808     SETVALUEBARRIER_CALL_ARGS_SIGNATURE_COMMON(SetValueWithBarrier);
809 }
810 
DEF_CALL_SIGNATURE(SetNonSValueWithBarrier)811 DEF_CALL_SIGNATURE(SetNonSValueWithBarrier)
812 {
813     SETVALUEBARRIER_CALL_ARGS_SIGNATURE_COMMON(SetNonSValueWithBarrier);
814 }
815 
DEF_CALL_SIGNATURE(SetValueWithEdenBarrier)816 DEF_CALL_SIGNATURE(SetValueWithEdenBarrier)
817 {
818     SETVALUEBARRIER_CALL_ARGS_SIGNATURE_COMMON(SetValueWithEdenBarrier);
819 }
820 
DEF_CALL_SIGNATURE(SetNonSValueWithEdenBarrier)821 DEF_CALL_SIGNATURE(SetNonSValueWithEdenBarrier)
822 {
823     SETVALUEBARRIER_CALL_ARGS_SIGNATURE_COMMON(SetNonSValueWithEdenBarrier);
824 }
825 
DEF_CALL_SIGNATURE(SetSValueWithBarrier)826 DEF_CALL_SIGNATURE(SetSValueWithBarrier)
827 {
828     SETVALUEBARRIER_CALL_ARGS_SIGNATURE_COMMON(SetSValueWithBarrier);
829 }
830 
DEF_CALL_SIGNATURE(ASMFastWriteBarrier)831 DEF_CALL_SIGNATURE(ASMFastWriteBarrier)
832 {
833     SETVALUEBARRIER_CALL_ARGS_SIGNATURE_COMMON(ASMFastWriteBarrier);
834     callSign->SetTargetKind(CallSignature::TargetKind::ASM_CALL_BARRIER_STUB);
835 }
836 
DEF_CALL_SIGNATURE(ASMWriteBarrierWithEden)837 DEF_CALL_SIGNATURE(ASMWriteBarrierWithEden)
838 {
839     SETVALUEBARRIER_CALL_ARGS_SIGNATURE_COMMON(ASMWriteBarrierWithEden);
840     callSign->SetTargetKind(CallSignature::TargetKind::ASM_CALL_BARRIER_STUB);
841 }
842 
DEF_CALL_SIGNATURE(VerifyBarrier)843 DEF_CALL_SIGNATURE(VerifyBarrier)
844 {
845     SETVALUEBARRIER_CALL_ARGS_SIGNATURE_COMMON(VerifyBarrier);
846 }
847 
848 #undef SETVALUEBARRIER_CALL_ARGS_SIGNATURE_COMMON
849 
DEF_CALL_SIGNATURE(NewThisObjectChecked)850 DEF_CALL_SIGNATURE(NewThisObjectChecked)
851 {
852     // 2 : 2 input parameters
853     CallSignature signature("NewThisObjectChecked", 0, 2,
854         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
855     *callSign = signature;
856     // 2 : 2 input parameters
857     std::array<VariableType, 2> params = {
858         VariableType::NATIVE_POINTER(),  // glue
859         VariableType::JS_ANY(),          // ctor
860     };
861     callSign->SetParameters(params.data());
862     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
863 }
864 
DEF_CALL_SIGNATURE(ConstructorCheck)865 DEF_CALL_SIGNATURE(ConstructorCheck)
866 {
867     // 4 : 4 input parameters
868     CallSignature signature("ConstructorCheck", 0, 4,
869         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
870     *callSign = signature;
871     // 4 : 4 input parameters
872     std::array<VariableType, 4> params = {
873         VariableType::NATIVE_POINTER(),  // glue
874         VariableType::JS_ANY(),          // ctor
875         VariableType::JS_ANY(),          // result
876         VariableType::JS_ANY(),          // thisObj
877     };
878     callSign->SetParameters(params.data());
879     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
880 }
881 
DEF_CALL_SIGNATURE(CreateEmptyArray)882 DEF_CALL_SIGNATURE(CreateEmptyArray)
883 {
884     // 5 : 5 input parameters
885     CallSignature signature("CreateEmptyArray", 0, 5,
886         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
887     *callSign = signature;
888     // 5 : 5 input parameters
889     std::array<VariableType, 5> params = {
890         VariableType::NATIVE_POINTER(),  // glue
891         VariableType::JS_ANY(),          // jsFunc
892         VariableType::JS_ANY(),          // pc
893         VariableType::INT32(),           // profileTypeInfo
894         VariableType::INT32(),           // slotId
895     };
896     callSign->SetParameters(params.data());
897     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
898 }
899 
DEF_CALL_SIGNATURE(CreateArrayWithBuffer)900 DEF_CALL_SIGNATURE(CreateArrayWithBuffer)
901 {
902     // 6 : 6 input parameters
903     CallSignature signature("CreateArrayWithBuffer", 0, 6,
904         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
905     *callSign = signature;
906     // 6 : 6 input parameters
907     std::array<VariableType, 6> params = {
908         VariableType::NATIVE_POINTER(),  // glue
909         VariableType::INT32(),           // index
910         VariableType::JS_ANY(),          // jsFunc
911         VariableType::JS_ANY(),          // pc
912         VariableType::INT32(),           // profileTypeInfo
913         VariableType::INT32(),           // slotId
914     };
915     callSign->SetParameters(params.data());
916     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
917 }
918 
DEF_CALL_SIGNATURE(CopyRestArgs)919 DEF_CALL_SIGNATURE(CopyRestArgs)
920 {
921     // 5 : 5 input parameters
922     CallSignature signature("CopyRestArgs", 0, 5,
923         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
924     *callSign = signature;
925     // 5 : 5 input parameters
926     std::array<VariableType, 5> params = {
927         VariableType::NATIVE_POINTER(),  // glue
928         VariableType::NATIVE_POINTER(),  // actual argv
929         VariableType::INT32(),           // startIdx
930         VariableType::INT32(),           // numArgs
931         VariableType::JS_ANY(),          // actual argv Array
932     };
933     callSign->SetParameters(params.data());
934     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
935 }
936 
DEF_CALL_SIGNATURE(NewJSObject)937 DEF_CALL_SIGNATURE(NewJSObject)
938 {
939     // 2 : 2 input parameters
940     CallSignature signature("NewJSObject", 0, 2,
941         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
942     *callSign = signature;
943     // 2 : 2 input parameters
944     std::array<VariableType, 2> params = {
945         VariableType::NATIVE_POINTER(),  // glue
946         VariableType::JS_ANY(),          // hclass
947     };
948     callSign->SetParameters(params.data());
949     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
950 }
951 
DEF_CALL_SIGNATURE(NewLexicalEnv)952 DEF_CALL_SIGNATURE(NewLexicalEnv)
953 {
954     // 3 : 3 input parameters
955     CallSignature signature("NewLexicalEnv", 0, 3,
956         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
957     *callSign = signature;
958     // 3 : 3 input parameters
959     std::array<VariableType, 3> params = {
960         VariableType::NATIVE_POINTER(),  // glue
961         VariableType::JS_ANY(),          // parent
962         VariableType::INT32(),           // numArgs
963     };
964     callSign->SetParameters(params.data());
965     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
966 }
967 
DEF_CALL_SIGNATURE(GetUnmappedArgs)968 DEF_CALL_SIGNATURE(GetUnmappedArgs)
969 {
970     // 4 : 4 input parameters
971     CallSignature signature("GetUnmappedArgs", 0, 4,
972         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
973     *callSign = signature;
974     // 4 : 4 input parameters
975     std::array<VariableType, 4> params = {
976         VariableType::NATIVE_POINTER(),  // glue
977         VariableType::NATIVE_POINTER(),  // actual argv
978         VariableType::INT32(),           // numArgs
979         VariableType::JS_ANY(),          // actual argv Array
980     };
981     callSign->SetParameters(params.data());
982     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
983 }
984 
DEF_CALL_SIGNATURE(GetCallSpreadArgs)985 DEF_CALL_SIGNATURE(GetCallSpreadArgs)
986 {
987     // 2 : 2 input parameters
988     CallSignature signature("GetCallSpreadArgs", 0, 2,
989         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
990     *callSign = signature;
991     // 2 : 2 input parameters
992     std::array<VariableType, 2> params = {
993         VariableType::NATIVE_POINTER(),  // glue
994         VariableType::JS_ANY(),          // array
995     };
996     callSign->SetParameters(params.data());
997     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
998 }
999 
DEF_CALL_SIGNATURE(GetTaggedArrayPtrTest)1000 DEF_CALL_SIGNATURE(GetTaggedArrayPtrTest)
1001 {
1002     // 2 : 2 input parameters
1003     CallSignature getTaggedArrayPtr("GetTaggedArrayPtrTest", 0, 2, ArgumentsOrder::DEFAULT_ORDER,
1004                                      VariableType::JS_POINTER());
1005     *callSign = getTaggedArrayPtr;
1006     // 2 : 2 input parameters
1007     std::array<VariableType, 2> params = {
1008         VariableType::NATIVE_POINTER(),
1009         VariableType::JS_ANY(),
1010     };
1011     callSign->SetParameters(params.data());
1012     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB);
1013 }
1014 
DEF_CALL_SIGNATURE(Builtins)1015 DEF_CALL_SIGNATURE(Builtins)
1016 {
1017     // 9 : 9 input parameters
1018     CallSignature builtins("Builtins", 0, 9,
1019         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
1020     *callSign = builtins;
1021     std::array<VariableType, 9> params = { // 9 : 9 input parameters
1022         VariableType::NATIVE_POINTER(),    // glue
1023         VariableType::NATIVE_POINTER(),    // native code
1024         VariableType::JS_ANY(),            // func
1025         VariableType::JS_ANY(),            // new target
1026         VariableType::JS_ANY(),            // this
1027         VariableType::NATIVE_POINTER(),    // argc
1028         VariableType::JS_ANY(),            // arg0
1029         VariableType::JS_ANY(),            // arg1
1030         VariableType::JS_ANY(),            // arg2
1031     };
1032     callSign->SetVariadicArgs(true);
1033     callSign->SetParameters(params.data());
1034     callSign->SetTargetKind(CallSignature::TargetKind::BUILTINS_STUB);
1035     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
1036 }
1037 
DEF_CALL_SIGNATURE(BuiltinsWithArgv)1038 DEF_CALL_SIGNATURE(BuiltinsWithArgv)
1039 {
1040     // 7 : 7 input parameters
1041     CallSignature builtinsWtihArgv("Builtins", 0, 7,
1042         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
1043     *callSign = builtinsWtihArgv;
1044     std::array<VariableType, 7> params = { // 7 : 7 input parameters
1045         VariableType::NATIVE_POINTER(),    // glue
1046         VariableType::NATIVE_POINTER(),    // nativeCode
1047         VariableType::JS_ANY(),            // func
1048         VariableType::JS_ANY(),            // new target
1049         VariableType::JS_ANY(),            // this
1050         VariableType::NATIVE_POINTER(),    // argc
1051         VariableType::NATIVE_POINTER(),    // argv
1052     };
1053     callSign->SetParameters(params.data());
1054     callSign->SetTargetKind(CallSignature::TargetKind::BUILTINS_WITH_ARGV_STUB);
1055     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
1056 }
1057 
DEF_CALL_SIGNATURE(BytecodeHandler)1058 DEF_CALL_SIGNATURE(BytecodeHandler)
1059 {
1060     // 7 : 7 input parameters
1061     CallSignature bytecodeHandler("BytecodeHandler", 0, 7,
1062         ArgumentsOrder::DEFAULT_ORDER, VariableType::VOID());
1063     *callSign = bytecodeHandler;
1064     // 7 : 7 input parameters
1065     std::array<VariableType, 7> params = {
1066         VariableType::NATIVE_POINTER(),
1067         VariableType::NATIVE_POINTER(),
1068         VariableType::NATIVE_POINTER(),
1069         VariableType::JS_POINTER(),
1070         VariableType::JS_POINTER(),
1071         VariableType::JS_ANY(),
1072         VariableType::INT32(),
1073     };
1074     callSign->SetParameters(params.data());
1075     callSign->SetTargetKind(CallSignature::TargetKind::BYTECODE_HANDLER);
1076     callSign->SetCallConv(CallSignature::CallConv::GHCCallConv);
1077 }
1078 
DEF_CALL_SIGNATURE(BytecodeDebuggerHandler)1079 DEF_CALL_SIGNATURE(BytecodeDebuggerHandler)
1080 {
1081     // 7 : 7 input parameters
1082     CallSignature bytecodeHandler("BytecodeDebuggerHandler", 0, 7,
1083                                   ArgumentsOrder::DEFAULT_ORDER, VariableType::VOID());
1084     *callSign = bytecodeHandler;
1085     // 7 : 7 input parameters
1086     std::array<VariableType, 7> params = { VariableType::NATIVE_POINTER(),
1087                                            VariableType::NATIVE_POINTER(),
1088                                            VariableType::NATIVE_POINTER(),
1089                                            VariableType::JS_POINTER(),
1090                                            VariableType::JS_POINTER(),
1091                                            VariableType::JS_ANY(),
1092                                            VariableType::INT32() };
1093     callSign->SetParameters(params.data());
1094     callSign->SetTargetKind(CallSignature::TargetKind::BYTECODE_DEBUGGER_HANDLER);
1095 }
1096 
DEF_CALL_SIGNATURE(CallRuntime)1097 DEF_CALL_SIGNATURE(CallRuntime)
1098 {
1099     /* 3 : 3 input parameters */
1100     CallSignature runtimeCallTrampoline("CallRuntime", 0, 3,
1101         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
1102     *callSign = runtimeCallTrampoline;
1103     /* 3 : 3 input parameters */
1104     std::array<VariableType, 3> params = {
1105         VariableType::NATIVE_POINTER(),
1106         VariableType::INT64(),
1107         VariableType::INT64(),
1108     };
1109     callSign->SetVariadicArgs(true);
1110     callSign->SetParameters(params.data());
1111     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB);
1112     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
1113 }
1114 
DEF_CALL_SIGNATURE(AsmInterpreterEntry)1115 DEF_CALL_SIGNATURE(AsmInterpreterEntry)
1116 {
1117     /* 3 : 3 input parameters */
1118     CallSignature asmInterpreterEntry("AsmInterpreterEntry", 0, 3,
1119         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
1120     *callSign = asmInterpreterEntry;
1121     /* 3 : 3 input parameters */
1122     std::array<VariableType, 3> params = {
1123         VariableType::NATIVE_POINTER(),  // glue
1124         VariableType::INT32(),  // argc
1125         VariableType::NATIVE_POINTER(),  // argv
1126     };
1127     callSign->SetParameters(params.data());
1128     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
1129     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
1130 }
1131 
1132 #define BASELINE_CALL_ARGS_SIGNATURE_COMMON(name)                           \
1133     /* 1 : 1 input parameters */                                            \
1134     CallSignature signature(#name, 0, 1,                                    \
1135         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());             \
1136     *callSign = signature;                                                  \
1137     std::array<VariableType, 1> params = { /* 1: 1 input parameters */      \
1138         VariableType::NATIVE_POINTER(),                                     \
1139     };                                                                      \
1140     callSign->SetVariadicArgs(true);                                        \
1141     callSign->SetParameters(params.data());                                 \
1142     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC); \
1143     callSign->SetCallConv(CallSignature::CallConv::GHCCallConv);
1144 
DEF_CALL_SIGNATURE(CallArg0AndCheckToBaseline)1145 DEF_CALL_SIGNATURE(CallArg0AndCheckToBaseline)
1146 {
1147     BASELINE_CALL_ARGS_SIGNATURE_COMMON(CallArg0AndCheckToBaseline)
1148 }
1149 
DEF_CALL_SIGNATURE(CallArg1AndCheckToBaseline)1150 DEF_CALL_SIGNATURE(CallArg1AndCheckToBaseline)
1151 {
1152     BASELINE_CALL_ARGS_SIGNATURE_COMMON(CallArg1AndCheckToBaseline)
1153 }
1154 
DEF_CALL_SIGNATURE(CallArgs2AndCheckToBaseline)1155 DEF_CALL_SIGNATURE(CallArgs2AndCheckToBaseline)
1156 {
1157     BASELINE_CALL_ARGS_SIGNATURE_COMMON(CallArgs2AndCheckToBaseline)
1158 }
1159 
DEF_CALL_SIGNATURE(CallArgs3AndCheckToBaseline)1160 DEF_CALL_SIGNATURE(CallArgs3AndCheckToBaseline)
1161 {
1162     BASELINE_CALL_ARGS_SIGNATURE_COMMON(CallArgs3AndCheckToBaseline)
1163 }
1164 
DEF_CALL_SIGNATURE(CallThisArg0AndCheckToBaseline)1165 DEF_CALL_SIGNATURE(CallThisArg0AndCheckToBaseline)
1166 {
1167     BASELINE_CALL_ARGS_SIGNATURE_COMMON(CallThisArg0AndCheckToBaseline)
1168 }
1169 
DEF_CALL_SIGNATURE(CallThisArg1AndCheckToBaseline)1170 DEF_CALL_SIGNATURE(CallThisArg1AndCheckToBaseline)
1171 {
1172     BASELINE_CALL_ARGS_SIGNATURE_COMMON(CallThisArg1AndCheckToBaseline)
1173 }
1174 
DEF_CALL_SIGNATURE(CallThisArgs2AndCheckToBaseline)1175 DEF_CALL_SIGNATURE(CallThisArgs2AndCheckToBaseline)
1176 {
1177     BASELINE_CALL_ARGS_SIGNATURE_COMMON(CallThisArgs2AndCheckToBaseline)
1178 }
1179 
DEF_CALL_SIGNATURE(CallThisArgs3AndCheckToBaseline)1180 DEF_CALL_SIGNATURE(CallThisArgs3AndCheckToBaseline)
1181 {
1182     BASELINE_CALL_ARGS_SIGNATURE_COMMON(CallThisArgs3AndCheckToBaseline)
1183 }
1184 
DEF_CALL_SIGNATURE(CallRangeAndCheckToBaseline)1185 DEF_CALL_SIGNATURE(CallRangeAndCheckToBaseline)
1186 {
1187     BASELINE_CALL_ARGS_SIGNATURE_COMMON(CallRangeAndCheckToBaseline)
1188 }
1189 
DEF_CALL_SIGNATURE(CallNewAndCheckToBaseline)1190 DEF_CALL_SIGNATURE(CallNewAndCheckToBaseline)
1191 {
1192     BASELINE_CALL_ARGS_SIGNATURE_COMMON(CallNewAndCheckToBaseline)
1193 }
1194 
DEF_CALL_SIGNATURE(SuperCallAndCheckToBaseline)1195 DEF_CALL_SIGNATURE(SuperCallAndCheckToBaseline)
1196 {
1197     BASELINE_CALL_ARGS_SIGNATURE_COMMON(SuperCallAndCheckToBaseline)
1198 }
1199 
DEF_CALL_SIGNATURE(CallThisRangeAndCheckToBaseline)1200 DEF_CALL_SIGNATURE(CallThisRangeAndCheckToBaseline)
1201 {
1202     BASELINE_CALL_ARGS_SIGNATURE_COMMON(CallThisRangeAndCheckToBaseline)
1203 }
1204 
DEF_CALL_SIGNATURE(CallArg0AndDispatchFromBaseline)1205 DEF_CALL_SIGNATURE(CallArg0AndDispatchFromBaseline)
1206 {
1207     BASELINE_CALL_ARGS_SIGNATURE_COMMON(CallArg0AndDispatchFromBaseline)
1208 }
1209 
DEF_CALL_SIGNATURE(CallArg1AndDispatchFromBaseline)1210 DEF_CALL_SIGNATURE(CallArg1AndDispatchFromBaseline)
1211 {
1212     BASELINE_CALL_ARGS_SIGNATURE_COMMON(CallArg1AndDispatchFromBaseline)
1213 }
1214 
DEF_CALL_SIGNATURE(CallArgs2AndDispatchFromBaseline)1215 DEF_CALL_SIGNATURE(CallArgs2AndDispatchFromBaseline)
1216 {
1217     BASELINE_CALL_ARGS_SIGNATURE_COMMON(CallArgs2AndDispatchFromBaseline)
1218 }
1219 
DEF_CALL_SIGNATURE(CallArgs3AndDispatchFromBaseline)1220 DEF_CALL_SIGNATURE(CallArgs3AndDispatchFromBaseline)
1221 {
1222     BASELINE_CALL_ARGS_SIGNATURE_COMMON(CallArgs3AndDispatchFromBaseline)
1223 }
1224 
DEF_CALL_SIGNATURE(CallThisArg0AndDispatchFromBaseline)1225 DEF_CALL_SIGNATURE(CallThisArg0AndDispatchFromBaseline)
1226 {
1227     BASELINE_CALL_ARGS_SIGNATURE_COMMON(CallThisArg0AndDispatchFromBaseline)
1228 }
1229 
DEF_CALL_SIGNATURE(CallThisArg1AndDispatchFromBaseline)1230 DEF_CALL_SIGNATURE(CallThisArg1AndDispatchFromBaseline)
1231 {
1232     BASELINE_CALL_ARGS_SIGNATURE_COMMON(CallThisArg1AndDispatchFromBaseline)
1233 }
1234 
DEF_CALL_SIGNATURE(CallThisArgs2AndDispatchFromBaseline)1235 DEF_CALL_SIGNATURE(CallThisArgs2AndDispatchFromBaseline)
1236 {
1237     BASELINE_CALL_ARGS_SIGNATURE_COMMON(CallThisArgs2AndDispatchFromBaseline)
1238 }
1239 
DEF_CALL_SIGNATURE(CallThisArgs3AndDispatchFromBaseline)1240 DEF_CALL_SIGNATURE(CallThisArgs3AndDispatchFromBaseline)
1241 {
1242     BASELINE_CALL_ARGS_SIGNATURE_COMMON(CallThisArgs3AndDispatchFromBaseline)
1243 }
1244 
DEF_CALL_SIGNATURE(CallRangeAndDispatchFromBaseline)1245 DEF_CALL_SIGNATURE(CallRangeAndDispatchFromBaseline)
1246 {
1247     BASELINE_CALL_ARGS_SIGNATURE_COMMON(CallRangeAndDispatchFromBaseline)
1248 }
1249 
DEF_CALL_SIGNATURE(CallNewAndDispatchFromBaseline)1250 DEF_CALL_SIGNATURE(CallNewAndDispatchFromBaseline)
1251 {
1252     BASELINE_CALL_ARGS_SIGNATURE_COMMON(CallNewAndDispatchFromBaseline)
1253 }
1254 
DEF_CALL_SIGNATURE(SuperCallAndDispatchFromBaseline)1255 DEF_CALL_SIGNATURE(SuperCallAndDispatchFromBaseline)
1256 {
1257     BASELINE_CALL_ARGS_SIGNATURE_COMMON(SuperCallAndDispatchFromBaseline)
1258 }
1259 
DEF_CALL_SIGNATURE(CallThisRangeAndDispatchFromBaseline)1260 DEF_CALL_SIGNATURE(CallThisRangeAndDispatchFromBaseline)
1261 {
1262     BASELINE_CALL_ARGS_SIGNATURE_COMMON(CallThisRangeAndDispatchFromBaseline)
1263 }
1264 
DEF_CALL_SIGNATURE(CallArg0AndCheckToBaselineFromBaseline)1265 DEF_CALL_SIGNATURE(CallArg0AndCheckToBaselineFromBaseline)
1266 {
1267     BASELINE_CALL_ARGS_SIGNATURE_COMMON(CallArg0AndCheckToBaselineFromBaseline)
1268 }
1269 
DEF_CALL_SIGNATURE(CallArg1AndCheckToBaselineFromBaseline)1270 DEF_CALL_SIGNATURE(CallArg1AndCheckToBaselineFromBaseline)
1271 {
1272     BASELINE_CALL_ARGS_SIGNATURE_COMMON(CallArg1AndCheckToBaselineFromBaseline)
1273 }
1274 
DEF_CALL_SIGNATURE(CallArgs2AndCheckToBaselineFromBaseline)1275 DEF_CALL_SIGNATURE(CallArgs2AndCheckToBaselineFromBaseline)
1276 {
1277     BASELINE_CALL_ARGS_SIGNATURE_COMMON(CallArgs2AndCheckToBaselineFromBaseline)
1278 }
1279 
DEF_CALL_SIGNATURE(CallArgs3AndCheckToBaselineFromBaseline)1280 DEF_CALL_SIGNATURE(CallArgs3AndCheckToBaselineFromBaseline)
1281 {
1282     BASELINE_CALL_ARGS_SIGNATURE_COMMON(CallArgs3AndCheckToBaselineFromBaseline)
1283 }
1284 
DEF_CALL_SIGNATURE(CallThisArg0AndCheckToBaselineFromBaseline)1285 DEF_CALL_SIGNATURE(CallThisArg0AndCheckToBaselineFromBaseline)
1286 {
1287     BASELINE_CALL_ARGS_SIGNATURE_COMMON(CallThisArg0AndCheckToBaselineFromBaseline)
1288 }
1289 
DEF_CALL_SIGNATURE(CallThisArg1AndCheckToBaselineFromBaseline)1290 DEF_CALL_SIGNATURE(CallThisArg1AndCheckToBaselineFromBaseline)
1291 {
1292     BASELINE_CALL_ARGS_SIGNATURE_COMMON(CallThisArg1AndCheckToBaselineFromBaseline)
1293 }
1294 
DEF_CALL_SIGNATURE(CallThisArgs2AndCheckToBaselineFromBaseline)1295 DEF_CALL_SIGNATURE(CallThisArgs2AndCheckToBaselineFromBaseline)
1296 {
1297     BASELINE_CALL_ARGS_SIGNATURE_COMMON(CallThisArgs2AndCheckToBaselineFromBaseline)
1298 }
1299 
DEF_CALL_SIGNATURE(CallThisArgs3AndCheckToBaselineFromBaseline)1300 DEF_CALL_SIGNATURE(CallThisArgs3AndCheckToBaselineFromBaseline)
1301 {
1302     BASELINE_CALL_ARGS_SIGNATURE_COMMON(CallThisArgs3AndCheckToBaselineFromBaseline)
1303 }
1304 
DEF_CALL_SIGNATURE(CallRangeAndCheckToBaselineFromBaseline)1305 DEF_CALL_SIGNATURE(CallRangeAndCheckToBaselineFromBaseline)
1306 {
1307     BASELINE_CALL_ARGS_SIGNATURE_COMMON(CallRangeAndCheckToBaselineFromBaseline)
1308 }
1309 
DEF_CALL_SIGNATURE(CallNewAndCheckToBaselineFromBaseline)1310 DEF_CALL_SIGNATURE(CallNewAndCheckToBaselineFromBaseline)
1311 {
1312     BASELINE_CALL_ARGS_SIGNATURE_COMMON(CallNewAndCheckToBaselineFromBaseline)
1313 }
1314 
DEF_CALL_SIGNATURE(SuperCallAndCheckToBaselineFromBaseline)1315 DEF_CALL_SIGNATURE(SuperCallAndCheckToBaselineFromBaseline)
1316 {
1317     BASELINE_CALL_ARGS_SIGNATURE_COMMON(SuperCallAndCheckToBaselineFromBaseline)
1318 }
1319 
DEF_CALL_SIGNATURE(CallThisRangeAndCheckToBaselineFromBaseline)1320 DEF_CALL_SIGNATURE(CallThisRangeAndCheckToBaselineFromBaseline)
1321 {
1322     BASELINE_CALL_ARGS_SIGNATURE_COMMON(CallThisRangeAndCheckToBaselineFromBaseline)
1323 }
1324 
DEF_CALL_SIGNATURE(GetBaselineBuiltinFp)1325 DEF_CALL_SIGNATURE(GetBaselineBuiltinFp)
1326 {
1327     /* 1 : 1 input parameters */
1328     CallSignature getBaselineBuiltinFp("GetBaselineBuiltinFp", 0, 1,
1329         ArgumentsOrder::DEFAULT_ORDER, VariableType::NATIVE_POINTER());
1330     *callSign = getBaselineBuiltinFp;
1331     std::array<VariableType, 1> params = { /* 1 : 1 input parameters */
1332         VariableType::NATIVE_POINTER(),  // glue
1333     };
1334     callSign->SetVariadicArgs(true);
1335     callSign->SetParameters(params.data());
1336     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
1337     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
1338 }
1339 
DEF_CALL_SIGNATURE(GeneratorReEnterAsmInterp)1340 DEF_CALL_SIGNATURE(GeneratorReEnterAsmInterp)
1341 {
1342     /* 2 : 2 input parameters */
1343     CallSignature generatorReEnterAsmInterp("GeneratorReEnterAsmInterp", 0, 2,
1344         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
1345     *callSign = generatorReEnterAsmInterp;
1346     std::array<VariableType, 2> params = { /* 2 : 2 input parameters */
1347         VariableType::NATIVE_POINTER(),  // glue
1348         VariableType::JS_POINTER(),      // context
1349     };
1350     callSign->SetParameters(params.data());
1351     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
1352     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
1353 }
1354 
DEF_CALL_SIGNATURE(CallRuntimeWithArgv)1355 DEF_CALL_SIGNATURE(CallRuntimeWithArgv)
1356 {
1357     /* 4 : 4 input parameters */
1358     CallSignature runtimeCallTrampoline("CallRuntimeWithArgv", 0, 4,
1359         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
1360     *callSign = runtimeCallTrampoline;
1361     std::array<VariableType, 4> params = { /* 4 : 4 input parameters */
1362         VariableType::NATIVE_POINTER(), // glue
1363         VariableType::INT64(),   // runtimeId
1364         VariableType::INT64(),   // argc
1365         VariableType::NATIVE_POINTER(), // argv
1366     };
1367     callSign->SetVariadicArgs(false);
1368     callSign->SetParameters(params.data());
1369     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_VARARGS);
1370     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
1371 }
1372 
1373 #define AOT_CALL_SIGNATURE(name)                                        \
1374     /* 6 : 6 input parameters */                                        \
1375     CallSignature signature(#name, 0, 6,                                \
1376         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());         \
1377     *callSign = signature;                                              \
1378     std::array<VariableType, 6> params = { /* 6 : 6 input parameters */ \
1379         VariableType::NATIVE_POINTER(),    /* glue */                   \
1380         VariableType::INT64(),             /* actual argC */            \
1381         VariableType::NATIVE_POINTER(),    /* actual argV */            \
1382         VariableType::JS_ANY(),            /* call target */            \
1383         VariableType::JS_ANY(),            /* new target */             \
1384         VariableType::JS_ANY(),            /* thisobj */                \
1385     };                                                                  \
1386     callSign->SetVariadicArgs(true);                                    \
1387     callSign->SetParameters(params.data());                             \
1388     callSign->SetCallConv(CallSignature::CallConv::WebKitJSCallConv);
1389 
1390 #define FAST_AOT_CALL_SIGNATURE(name)                                   \
1391     /* 3 : 3 input parameters */                                        \
1392     CallSignature signature(#name, 0, 3,                                \
1393         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());         \
1394     *callSign = signature;                                              \
1395     std::array<VariableType, 3> params = { /* 3 : 3 input parameters */ \
1396         VariableType::NATIVE_POINTER(),     /* glue */                  \
1397         VariableType::JS_ANY(),      /* call target */                  \
1398         VariableType::JS_ANY(),      /* thisobj */                      \
1399     };                                                                  \
1400     callSign->SetVariadicArgs(true);                                    \
1401     callSign->SetParameters(params.data());                             \
1402     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
1403 
DEF_CALL_SIGNATURE(OptimizedCallAndPushArgv)1404 DEF_CALL_SIGNATURE(OptimizedCallAndPushArgv)
1405 {
1406     AOT_CALL_SIGNATURE(OptimizedCallAndPushArgv)
1407     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
1408 }
1409 
DEF_CALL_SIGNATURE(OptimizedFastCallAndPushArgv)1410 DEF_CALL_SIGNATURE(OptimizedFastCallAndPushArgv)
1411 {
1412     /* 6 : 6 input parameters */
1413     CallSignature optimizedFastCallAndPushArgv("OptimizedFastCallAndPushArgv", 0, 6,
1414         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
1415     *callSign = optimizedFastCallAndPushArgv;
1416     std::array<VariableType, 6> params = { /* 6 : 6 input parameters */
1417         VariableType::NATIVE_POINTER(),  // glue
1418         VariableType::INT64(),           // actual argC
1419         VariableType::NATIVE_POINTER(),  // actual argV
1420         VariableType::JS_ANY(),      // call target
1421         VariableType::JS_ANY(),      // new target
1422         VariableType::JS_ANY(),      // thisobj
1423     };
1424     callSign->SetVariadicArgs(true);
1425     callSign->SetParameters(params.data());
1426     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
1427     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
1428 }
1429 
DEF_CALL_SIGNATURE(JSCall)1430 DEF_CALL_SIGNATURE(JSCall)
1431 {
1432     AOT_CALL_SIGNATURE(JSCall)
1433     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
1434 }
1435 
DEF_CALL_SIGNATURE(JSOptimizedCall)1436 DEF_CALL_SIGNATURE(JSOptimizedCall)
1437 {
1438     AOT_CALL_SIGNATURE(JSOptimizedCall)
1439     callSign->SetTargetKind(CallSignature::TargetKind::OPTIMIZED_STUB);
1440 }
1441 
DEF_CALL_SIGNATURE(JSCallNew)1442 DEF_CALL_SIGNATURE(JSCallNew)
1443 {
1444     AOT_CALL_SIGNATURE(JSCallNew)
1445     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
1446 }
1447 
DEF_CALL_SIGNATURE(JSOptimizedFastCall)1448 DEF_CALL_SIGNATURE(JSOptimizedFastCall)
1449 {
1450     FAST_AOT_CALL_SIGNATURE(JSOptimizedFastCall)
1451     callSign->SetTargetKind(CallSignature::TargetKind::OPTIMIZED_FAST_CALL_STUB);
1452 }
1453 
DEF_CALL_SIGNATURE(AOTCallToAsmInterBridge)1454 DEF_CALL_SIGNATURE(AOTCallToAsmInterBridge)
1455 {
1456     AOT_CALL_SIGNATURE(AOTCallToAsmInterBridge)
1457     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
1458 }
1459 
DEF_CALL_SIGNATURE(FastCallToAsmInterBridge)1460 DEF_CALL_SIGNATURE(FastCallToAsmInterBridge)
1461 {
1462     FAST_AOT_CALL_SIGNATURE(FastCallToAsmInterBridge)
1463     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
1464 }
1465 
DEF_CALL_SIGNATURE(JSProxyCallInternalWithArgV)1466 DEF_CALL_SIGNATURE(JSProxyCallInternalWithArgV)
1467 {
1468     // 2 : 2 input parameters
1469     CallSignature jSProxyCallInternalWithArgV("JSProxyCallInternalWithArgV", 0, 2,
1470         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
1471     *callSign = jSProxyCallInternalWithArgV;
1472     std::array<VariableType, 2> params = { // 2 : 2 input parameters
1473         VariableType::NATIVE_POINTER(),     // glue
1474         VariableType::JS_ANY(),      // call target
1475     };
1476     callSign->SetParameters(params.data());
1477     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
1478     callSign->SetGCLeafFunction(true);
1479     callSign->SetTailCall(true);
1480 }
1481 
DEF_CALL_SIGNATURE(JSFunctionEntry)1482 DEF_CALL_SIGNATURE(JSFunctionEntry)
1483 {
1484     // 5 : 5 input parameters
1485     CallSignature jsCallFunctionEntry("JSFunctionEntry", 0, 5,
1486         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
1487     *callSign = jsCallFunctionEntry;
1488     std::array<VariableType, 5> params = {  // 5 : 5 input parameters
1489         VariableType::NATIVE_POINTER(),     // glue
1490         VariableType::INT64(),              // argc
1491         VariableType::NATIVE_POINTER(),     // argv
1492         VariableType::NATIVE_POINTER(),     // prevFp
1493         VariableType::BOOL(),               // isNew
1494     };
1495     callSign->SetParameters(params.data());
1496     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
1497     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
1498 }
1499 
DEF_CALL_SIGNATURE(OptimizedFastCallEntry)1500 DEF_CALL_SIGNATURE(OptimizedFastCallEntry)
1501 {
1502     // 4 : 4 input parameters
1503     CallSignature optimizedFastCallEntry("OptimizedFastCallEntry", 0, 4,
1504         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
1505     *callSign = optimizedFastCallEntry;
1506     std::array<VariableType, 4> params = {  // 4 : 4 input parameters
1507         VariableType::NATIVE_POINTER(),     // glue
1508         VariableType::INT64(),              // argc
1509         VariableType::NATIVE_POINTER(),     // argv
1510         VariableType::NATIVE_POINTER(),     // prevFp
1511     };
1512     callSign->SetParameters(params.data());
1513     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
1514     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
1515 }
1516 
DEF_CALL_SIGNATURE(ResumeRspAndDispatch)1517 DEF_CALL_SIGNATURE(ResumeRspAndDispatch)
1518 {
1519     // 8 : 8 input parameters
1520     CallSignature resumeRspAndDispatch("ResumeRspAndDispatch", 0, 8,
1521         ArgumentsOrder::DEFAULT_ORDER, VariableType::VOID());
1522     *callSign = resumeRspAndDispatch;
1523     std::array<VariableType, 8> params = { // 8 : 8 input parameters
1524         VariableType::NATIVE_POINTER(),
1525         VariableType::NATIVE_POINTER(),
1526         VariableType::NATIVE_POINTER(),
1527         VariableType::JS_POINTER(),
1528         VariableType::JS_POINTER(),
1529         VariableType::JS_ANY(),
1530         VariableType::INT32(),
1531         VariableType::NATIVE_POINTER(),
1532     };
1533     callSign->SetParameters(params.data());
1534     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
1535     callSign->SetCallConv(CallSignature::CallConv::GHCCallConv);
1536 }
1537 
DEF_CALL_SIGNATURE(ResumeRspAndReturn)1538 DEF_CALL_SIGNATURE(ResumeRspAndReturn)
1539 {
1540     // 3 : 3 input parameters
1541     CallSignature resumeRspAndReturn("ResumeRspAndReturn", 0, 3,
1542         ArgumentsOrder::DEFAULT_ORDER, VariableType::VOID());
1543     *callSign = resumeRspAndReturn;
1544     std::array<VariableType, 3> params = { // 3 : 3 input parameters
1545         VariableType::JS_ANY(),
1546         VariableType::NATIVE_POINTER(),
1547         VariableType::NATIVE_POINTER(),
1548     };
1549     callSign->SetParameters(params.data());
1550     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
1551     callSign->SetCallConv(CallSignature::CallConv::GHCCallConv);
1552 }
1553 
DEF_CALL_SIGNATURE(ResumeRspAndReturnBaseline)1554 DEF_CALL_SIGNATURE(ResumeRspAndReturnBaseline)
1555 {
1556     // 4 : 4 input parameters
1557     CallSignature resumeRspAndReturnBaseline("ResumeRspAndReturnBaseline", 0, 4,
1558         ArgumentsOrder::DEFAULT_ORDER, VariableType::VOID());
1559     *callSign = resumeRspAndReturnBaseline;
1560     std::array<VariableType, 4> params = { // 4 : 4 input parameters
1561         VariableType::JS_ANY(),            // %r13 - acc
1562         VariableType::NATIVE_POINTER(),    // %rbp - prevSp
1563         VariableType::NATIVE_POINTER(),    // %r12 - sp
1564         VariableType::NATIVE_POINTER(),    // %rbx - jumpSizeAfterCall
1565     };
1566     callSign->SetParameters(params.data());
1567     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
1568     callSign->SetCallConv(CallSignature::CallConv::GHCCallConv);
1569 }
1570 
DEF_CALL_SIGNATURE(ResumeCaughtFrameAndDispatch)1571 DEF_CALL_SIGNATURE(ResumeCaughtFrameAndDispatch)
1572 {
1573     // 7 : 7 input parameters
1574     CallSignature resumeCaughtFrameAndDispatch("ResumeCaughtFrameAndDispatch", 0, 7,
1575         ArgumentsOrder::DEFAULT_ORDER, VariableType::VOID());
1576     *callSign = resumeCaughtFrameAndDispatch;
1577     // 7 : 7 input parameters
1578     std::array<VariableType, 7> params = {
1579         VariableType::NATIVE_POINTER(),
1580         VariableType::NATIVE_POINTER(),
1581         VariableType::NATIVE_POINTER(),
1582         VariableType::JS_POINTER(),
1583         VariableType::JS_POINTER(),
1584         VariableType::JS_ANY(),
1585         VariableType::INT32(),
1586     };
1587     callSign->SetParameters(params.data());
1588     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
1589     callSign->SetCallConv(CallSignature::CallConv::GHCCallConv);
1590 }
1591 
DEF_CALL_SIGNATURE(ResumeUncaughtFrameAndReturn)1592 DEF_CALL_SIGNATURE(ResumeUncaughtFrameAndReturn)
1593 {
1594     // 3 : 3 input parameters
1595     CallSignature resumeUncaughtFrameAndReturn("ResumeUncaughtFrameAndReturn", 0, 3,
1596         ArgumentsOrder::DEFAULT_ORDER, VariableType::VOID());
1597     *callSign = resumeUncaughtFrameAndReturn;
1598     std::array<VariableType, 3> params = { // 3 : 3 input parameters
1599         VariableType::NATIVE_POINTER(),
1600         VariableType::NATIVE_POINTER(),
1601         VariableType::JS_ANY(),
1602     };
1603     callSign->SetParameters(params.data());
1604     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
1605     callSign->SetCallConv(CallSignature::CallConv::GHCCallConv);
1606 }
1607 
DEF_CALL_SIGNATURE(ResumeRspAndRollback)1608 DEF_CALL_SIGNATURE(ResumeRspAndRollback)
1609 {
1610     // 8 : 8 input parameters
1611     CallSignature resumeRspAndRollback("ResumeRspAndRollback", 0, 8,
1612         ArgumentsOrder::DEFAULT_ORDER, VariableType::VOID());
1613     *callSign = resumeRspAndRollback;
1614     std::array<VariableType, 8> params = { // 8 : 8 input parameters
1615         VariableType::NATIVE_POINTER(),
1616         VariableType::NATIVE_POINTER(),
1617         VariableType::NATIVE_POINTER(),
1618         VariableType::JS_POINTER(),
1619         VariableType::JS_POINTER(),
1620         VariableType::JS_ANY(),
1621         VariableType::INT32(),
1622         VariableType::NATIVE_POINTER(),
1623     };
1624     callSign->SetParameters(params.data());
1625     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
1626     callSign->SetCallConv(CallSignature::CallConv::GHCCallConv);
1627 }
1628 
DEF_CALL_SIGNATURE(StringsAreEquals)1629 DEF_CALL_SIGNATURE(StringsAreEquals)
1630 {
1631     // 2 : 2 input parameters
1632     CallSignature stringsAreEquals("StringsAreEquals", 0, 2,
1633         ArgumentsOrder::DEFAULT_ORDER, VariableType::BOOL());
1634     *callSign = stringsAreEquals;
1635     std::array<VariableType, 2> params = { // 2 : 2 input parameters
1636         VariableType::JS_POINTER(),
1637         VariableType::JS_POINTER(),
1638     };
1639     callSign->SetParameters(params.data());
1640     callSign->SetGCLeafFunction(true);
1641     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
1642 }
1643 
DEF_CALL_SIGNATURE(JSHClassFindProtoTransitions)1644 DEF_CALL_SIGNATURE(JSHClassFindProtoTransitions)
1645 {
1646     // 3 : 3 input parameters
1647     CallSignature bigIntSameValueZero("JSHClassFindProtoTransitions", 0, 3,
1648         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
1649     *callSign = bigIntSameValueZero;
1650     std::array<VariableType, 3> params = { // 3 : 3 input parameters
1651         VariableType::JS_POINTER(),
1652         VariableType::JS_POINTER(),
1653         VariableType::JS_POINTER(),
1654     };
1655     callSign->SetParameters(params.data());
1656     callSign->SetGCLeafFunction(true);
1657     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
1658 }
1659 
DEF_CALL_SIGNATURE(NumberHelperStringToDouble)1660 DEF_CALL_SIGNATURE(NumberHelperStringToDouble)
1661 {
1662     // 1 : 1 input parameters
1663     CallSignature bigIntSameValueZero("NumberHelperStringToDouble", 0, 1,
1664         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
1665     *callSign = bigIntSameValueZero;
1666     std::array<VariableType, 1> params = { // 1 : 1 input parameters
1667         VariableType::JS_POINTER(),
1668     };
1669     callSign->SetParameters(params.data());
1670     callSign->SetGCLeafFunction(true);
1671     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
1672 }
1673 
DEF_CALL_SIGNATURE(CallBigIntAsIntN)1674 DEF_CALL_SIGNATURE(CallBigIntAsIntN)
1675 {
1676     // 2 : 2 input parameters
1677     CallSignature signature("CallBigIntAsIntN", 0, 2, ArgumentsOrder::DEFAULT_ORDER,
1678                             VariableType::JS_POINTER());
1679     *callSign = signature;
1680     std::array<VariableType, 2> params = { // 2 : 2 input parameters
1681         VariableType::FLOAT64(),
1682         VariableType::JS_POINTER()
1683     };
1684     callSign->SetParameters(params.data());
1685     callSign->SetGCLeafFunction(true);
1686     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
1687 }
1688 
DEF_CALL_SIGNATURE(CallBigIntAsUintN)1689 DEF_CALL_SIGNATURE(CallBigIntAsUintN)
1690 {
1691     // 2 : 2 input parameters
1692     CallSignature signature("CallBigIntAsUintN", 0, 2, ArgumentsOrder::DEFAULT_ORDER,
1693                             VariableType::JS_POINTER());
1694     *callSign = signature;
1695     std::array<VariableType, 2> params = { // 2 : 2 input parameters
1696         VariableType::FLOAT64(),
1697         VariableType::JS_POINTER(),
1698     };
1699     callSign->SetParameters(params.data());
1700     callSign->SetGCLeafFunction(true);
1701     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
1702 }
1703 
DEF_CALL_SIGNATURE(GetStringToListCacheArray)1704 DEF_CALL_SIGNATURE(GetStringToListCacheArray)
1705 {
1706     // 1 : 1 input parameters
1707     CallSignature callSignature("GetStringToListCacheArray", 0, 1,
1708         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
1709     *callSign = callSignature;
1710     std::array<VariableType, 1> params = { // 1 : 1 input parameters
1711         VariableType::NATIVE_POINTER(),
1712     };
1713     callSign->SetParameters(params.data());
1714     callSign->SetGCLeafFunction(true);
1715     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
1716 }
1717 
DEF_CALL_SIGNATURE(BigIntEquals)1718 DEF_CALL_SIGNATURE(BigIntEquals)
1719 {
1720     // 2 : 2 input parameters
1721     CallSignature bigIntEquals("BigIntEquals", 0, 2,
1722         ArgumentsOrder::DEFAULT_ORDER, VariableType::BOOL());
1723     *callSign = bigIntEquals;
1724     std::array<VariableType, 2> params = { // 2 : 2 input parameters
1725         VariableType::JS_POINTER(),
1726         VariableType::JS_POINTER(),
1727     };
1728     callSign->SetParameters(params.data());
1729     callSign->SetGCLeafFunction(true);
1730     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
1731 }
1732 
DEF_CALL_SIGNATURE(FastArraySort)1733 DEF_CALL_SIGNATURE(FastArraySort)
1734 {
1735     // 2 : 2 input parameters
1736     CallSignature fastArraySort("FastArraySort", 0, 2, ArgumentsOrder::DEFAULT_ORDER, VariableType::INT32());
1737     *callSign = fastArraySort;
1738     std::array<VariableType, 2> params = { // 2 : 2 input parameters
1739         VariableType::JS_ANY(),
1740         VariableType::JS_ANY()
1741     };
1742     callSign->SetParameters(params.data());
1743     callSign->SetGCLeafFunction(true);
1744     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
1745 }
1746 
DEF_CALL_SIGNATURE(FastArraySortString)1747 DEF_CALL_SIGNATURE(FastArraySortString)
1748 {
1749     // 2 : 2 input parameters
1750     CallSignature fastArraySortString("FastArraySortString", 0, 2,
1751         ArgumentsOrder::DEFAULT_ORDER, VariableType::INT32());
1752     *callSign = fastArraySortString;
1753     std::array<VariableType, 3> params = { // 3 : 3 input parameters
1754         VariableType::NATIVE_POINTER(),
1755         VariableType::JS_ANY(),
1756         VariableType::JS_ANY()
1757     };
1758     callSign->SetParameters(params.data());
1759     callSign->SetGCLeafFunction(true);
1760     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
1761 }
DEF_CALL_SIGNATURE(StringToNumber)1762 DEF_CALL_SIGNATURE(StringToNumber)
1763 {
1764     // 4 : 4 input parameters
1765     CallSignature stringToNumber("StringToDoubleWithRadix", 0, 2,
1766         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
1767     *callSign = stringToNumber;
1768     std::array<VariableType, 2> params = { // 2 : 2 input parameters
1769         VariableType::JS_POINTER(),
1770         VariableType::INT32(),
1771     };
1772     callSign->SetParameters(params.data());
1773     callSign->SetGCLeafFunction(true);
1774     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
1775 }
1776 
DEF_CALL_SIGNATURE(ArrayTrim)1777 DEF_CALL_SIGNATURE(ArrayTrim)
1778 {
1779     // 3 : 3 input parameters
1780     CallSignature ArrayTrim("ArrayTrim", 0, 3, ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
1781     *callSign = ArrayTrim;
1782     std::array<VariableType, 3> params = { // 3 : 3 input parameters
1783         VariableType::NATIVE_POINTER(),
1784         VariableType::JS_POINTER(),
1785         VariableType::INT64()
1786     };
1787     callSign->SetParameters(params.data());
1788     callSign->SetGCLeafFunction(true);
1789     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
1790 }
1791 
DEF_CALL_SIGNATURE(BigIntSameValueZero)1792 DEF_CALL_SIGNATURE(BigIntSameValueZero)
1793 {
1794     // 1 : 1 input parameters
1795     CallSignature bigIntSameValueZero("BigIntSameValueZero", 0, 2,
1796         ArgumentsOrder::DEFAULT_ORDER, VariableType::BOOL());
1797     *callSign = bigIntSameValueZero;
1798     std::array<VariableType, 2> params = { // 2 : 2 input parameters
1799         VariableType::JS_POINTER(),
1800         VariableType::JS_POINTER(),
1801     };
1802     callSign->SetParameters(params.data());
1803     callSign->SetGCLeafFunction(true);
1804     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
1805 }
1806 
DEF_CALL_SIGNATURE(StringGetStart)1807 DEF_CALL_SIGNATURE(StringGetStart)
1808 {
1809     CallSignature stringGetStart("StringGetStart", 0, 4, ArgumentsOrder::DEFAULT_ORDER, VariableType::INT32());
1810     *callSign = stringGetStart;
1811     std::array<VariableType, 4> params = { // 4 : four input parameters
1812         VariableType::BOOL(),
1813         VariableType::JS_POINTER(),
1814         VariableType::INT32(),
1815         VariableType::INT32(),
1816     };
1817     callSign->SetParameters(params.data());
1818     callSign->SetGCLeafFunction(true);
1819     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
1820 }
1821 
DEF_CALL_SIGNATURE(StringGetEnd)1822 DEF_CALL_SIGNATURE(StringGetEnd)
1823 {
1824     CallSignature stringGetEnd("StringGetEnd", 0, 5, ArgumentsOrder::DEFAULT_ORDER, VariableType::INT32());
1825     *callSign = stringGetEnd;
1826     std::array<VariableType, 5> params = { // 5 : five input parameters
1827         VariableType::BOOL(),
1828         VariableType::JS_POINTER(),
1829         VariableType::INT32(),
1830         VariableType::INT32(),
1831         VariableType::INT32(),
1832     };
1833     callSign->SetParameters(params.data());
1834     callSign->SetGCLeafFunction(true);
1835     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
1836 }
1837 
DEF_CALL_SIGNATURE(IsFastRegExp)1838 DEF_CALL_SIGNATURE(IsFastRegExp)
1839 {
1840     // 3 : 3 input parameters
1841     CallSignature isFastRegExp("IsFastRegExp", 0, 2,
1842         ArgumentsOrder::DEFAULT_ORDER, VariableType::BOOL());
1843     *callSign = isFastRegExp;
1844     std::array<VariableType, 2> params = { // 2 : 2 input parameters
1845         VariableType::NATIVE_POINTER(),
1846         VariableType::JS_ANY()
1847     };
1848     callSign->SetParameters(params.data());
1849     callSign->SetGCLeafFunction(true);
1850     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
1851 }
1852 
1853 #define PUSH_CALL_ARGS_AND_DISPATCH_SIGNATURE_COMMON(name)                  \
1854     /* 1 : 1 input parameters */                                            \
1855     CallSignature signature(#name, 0, 1,                                    \
1856         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());             \
1857     *callSign = signature;                                                  \
1858     std::array<VariableType, 1> params = { /* 1: 1 input parameters */      \
1859         VariableType::NATIVE_POINTER(),                                     \
1860     };                                                                      \
1861     callSign->SetVariadicArgs(true);                                        \
1862     callSign->SetParameters(params.data());                                 \
1863     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
1864 
1865 #define PUSH_CALL_ARGS_AND_DISPATCH_SIGNATURE(name)                      \
1866     PUSH_CALL_ARGS_AND_DISPATCH_SIGNATURE_COMMON(name)                   \
1867     callSign->SetCallConv(CallSignature::CallConv::GHCCallConv);
1868 
1869 #define PUSH_CALL_ARGS_AND_DISPATCH_NATIVE_SIGNATURE(name)               \
1870     PUSH_CALL_ARGS_AND_DISPATCH_SIGNATURE_COMMON(name)                   \
1871     callSign->SetCallConv(CallSignature::CallConv::WebKitJSCallConv);
1872 
1873 #define PUSH_CALL_ARGS_AND_DISPATCH_NATIVE_RANGE_SIGNATURE(name)         \
1874     PUSH_CALL_ARGS_AND_DISPATCH_SIGNATURE_COMMON(name)                   \
1875     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
1876 
DEF_CALL_SIGNATURE(PushCallArgsAndDispatchNative)1877 DEF_CALL_SIGNATURE(PushCallArgsAndDispatchNative)
1878 {
1879     PUSH_CALL_ARGS_AND_DISPATCH_NATIVE_SIGNATURE(PushCallArgsAndDispatchNative)
1880 }
1881 
DEF_CALL_SIGNATURE(PushCallArg0AndDispatch)1882 DEF_CALL_SIGNATURE(PushCallArg0AndDispatch)
1883 {
1884     PUSH_CALL_ARGS_AND_DISPATCH_SIGNATURE(PushCallArg0AndDispatch)
1885 }
1886 
DEF_CALL_SIGNATURE(PushCallArg1AndDispatch)1887 DEF_CALL_SIGNATURE(PushCallArg1AndDispatch)
1888 {
1889     PUSH_CALL_ARGS_AND_DISPATCH_SIGNATURE(PushCallArg1AndDispatch)
1890 }
1891 
DEF_CALL_SIGNATURE(PushCallArgs2AndDispatch)1892 DEF_CALL_SIGNATURE(PushCallArgs2AndDispatch)
1893 {
1894     PUSH_CALL_ARGS_AND_DISPATCH_SIGNATURE(PushCallArgs2AndDispatch)
1895 }
1896 
DEF_CALL_SIGNATURE(PushCallArgs3AndDispatch)1897 DEF_CALL_SIGNATURE(PushCallArgs3AndDispatch)
1898 {
1899     PUSH_CALL_ARGS_AND_DISPATCH_SIGNATURE(PushCallArgs3AndDispatch)
1900 }
1901 
DEF_CALL_SIGNATURE(PushCallThisArg0AndDispatch)1902 DEF_CALL_SIGNATURE(PushCallThisArg0AndDispatch)
1903 {
1904     PUSH_CALL_ARGS_AND_DISPATCH_SIGNATURE(PushCallThisArg0AndDispatch)
1905 }
1906 
DEF_CALL_SIGNATURE(PushCallThisArg1AndDispatch)1907 DEF_CALL_SIGNATURE(PushCallThisArg1AndDispatch)
1908 {
1909     PUSH_CALL_ARGS_AND_DISPATCH_SIGNATURE(PushCallThisArg1AndDispatch)
1910 }
1911 
DEF_CALL_SIGNATURE(PushCallThisArgs2AndDispatch)1912 DEF_CALL_SIGNATURE(PushCallThisArgs2AndDispatch)
1913 {
1914     PUSH_CALL_ARGS_AND_DISPATCH_SIGNATURE(PushCallThisArgs2AndDispatch)
1915 }
1916 
DEF_CALL_SIGNATURE(PushCallThisArgs3AndDispatch)1917 DEF_CALL_SIGNATURE(PushCallThisArgs3AndDispatch)
1918 {
1919     PUSH_CALL_ARGS_AND_DISPATCH_SIGNATURE(PushCallThisArgs3AndDispatch)
1920 }
1921 
DEF_CALL_SIGNATURE(PushCallRangeAndDispatchNative)1922 DEF_CALL_SIGNATURE(PushCallRangeAndDispatchNative)
1923 {
1924     PUSH_CALL_ARGS_AND_DISPATCH_NATIVE_RANGE_SIGNATURE(PushCallRangeAndDispatchNative)
1925 }
1926 
DEF_CALL_SIGNATURE(PushCallNewAndDispatchNative)1927 DEF_CALL_SIGNATURE(PushCallNewAndDispatchNative)
1928 {
1929     PUSH_CALL_ARGS_AND_DISPATCH_NATIVE_RANGE_SIGNATURE(PushCallNewAndDispatchNative)
1930 }
1931 
DEF_CALL_SIGNATURE(PushNewTargetAndDispatchNative)1932 DEF_CALL_SIGNATURE(PushNewTargetAndDispatchNative)
1933 {
1934     PUSH_CALL_ARGS_AND_DISPATCH_NATIVE_RANGE_SIGNATURE(PushNewTargetAndDispatchNative)
1935 }
1936 
DEF_CALL_SIGNATURE(PushCallNewAndDispatch)1937 DEF_CALL_SIGNATURE(PushCallNewAndDispatch)
1938 {
1939     PUSH_CALL_ARGS_AND_DISPATCH_SIGNATURE(PushCallNewAndDispatch)
1940 }
1941 
DEF_CALL_SIGNATURE(PushSuperCallAndDispatch)1942 DEF_CALL_SIGNATURE(PushSuperCallAndDispatch)
1943 {
1944     PUSH_CALL_ARGS_AND_DISPATCH_SIGNATURE(PushSuperCallAndDispatch)
1945 }
1946 
DEF_CALL_SIGNATURE(PushCallRangeAndDispatch)1947 DEF_CALL_SIGNATURE(PushCallRangeAndDispatch)
1948 {
1949     PUSH_CALL_ARGS_AND_DISPATCH_SIGNATURE(PushCallRangeAndDispatch)
1950 }
1951 
DEF_CALL_SIGNATURE(PushCallThisRangeAndDispatch)1952 DEF_CALL_SIGNATURE(PushCallThisRangeAndDispatch)
1953 {
1954     PUSH_CALL_ARGS_AND_DISPATCH_SIGNATURE(PushCallThisRangeAndDispatch)
1955 }
1956 
DEF_CALL_SIGNATURE(CallGetter)1957 DEF_CALL_SIGNATURE(CallGetter)
1958 {
1959     PUSH_CALL_ARGS_AND_DISPATCH_NATIVE_RANGE_SIGNATURE(CallGetter)
1960 }
1961 
DEF_CALL_SIGNATURE(CallSetter)1962 DEF_CALL_SIGNATURE(CallSetter)
1963 {
1964     PUSH_CALL_ARGS_AND_DISPATCH_NATIVE_RANGE_SIGNATURE(CallSetter)
1965 }
1966 
DEF_CALL_SIGNATURE(CallContainersArgs2)1967 DEF_CALL_SIGNATURE(CallContainersArgs2)
1968 {
1969     PUSH_CALL_ARGS_AND_DISPATCH_NATIVE_RANGE_SIGNATURE(CallContainersArgs2)
1970 }
1971 
DEF_CALL_SIGNATURE(CallContainersArgs3)1972 DEF_CALL_SIGNATURE(CallContainersArgs3)
1973 {
1974     PUSH_CALL_ARGS_AND_DISPATCH_NATIVE_RANGE_SIGNATURE(CallContainersArgs3)
1975 }
1976 
DEF_CALL_SIGNATURE(CallReturnWithArgv)1977 DEF_CALL_SIGNATURE(CallReturnWithArgv)
1978 {
1979     PUSH_CALL_ARGS_AND_DISPATCH_NATIVE_RANGE_SIGNATURE(CallReturnWithArgv)
1980 }
1981 
DEF_CALL_SIGNATURE(JSCallWithArgV)1982 DEF_CALL_SIGNATURE(JSCallWithArgV)
1983 {
1984     // 5 : 5 input parameters
1985     CallSignature jSCallWithArgV("JSCallWithArgV", 0, 5,
1986         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
1987     *callSign = jSCallWithArgV;
1988     // 5 : 5 input parameters
1989     std::array<VariableType, 5> params = {
1990         VariableType::NATIVE_POINTER(),   // glue
1991         VariableType::INT64(),            // actualNumArgs
1992         VariableType::JS_ANY(),           // jsfunc
1993         VariableType::JS_ANY(),           // newTarget
1994         VariableType::JS_ANY(),           // this
1995     };
1996     callSign->SetVariadicArgs(true);
1997     callSign->SetParameters(params.data());
1998     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
1999     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
2000 }
2001 
DEF_CALL_SIGNATURE(JSFastCallWithArgV)2002 DEF_CALL_SIGNATURE(JSFastCallWithArgV)
2003 {
2004     // 4 : 4 input parameters
2005     CallSignature jSFastCallWithArgV("JSFastCallWithArgV", 0, 4,
2006         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
2007     *callSign = jSFastCallWithArgV;
2008     // 4 : 4 input parameters
2009     std::array<VariableType, 4> params = {
2010         VariableType::NATIVE_POINTER(),   // glue
2011         VariableType::JS_ANY(),           // jsfunc
2012         VariableType::JS_ANY(),           // this
2013         VariableType::INT64(),            // actualNumArgs
2014     };
2015     callSign->SetVariadicArgs(true);
2016     callSign->SetParameters(params.data());
2017     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
2018     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
2019 }
2020 
DEF_CALL_SIGNATURE(JSFastCallWithArgVAndPushArgv)2021 DEF_CALL_SIGNATURE(JSFastCallWithArgVAndPushArgv)
2022 {
2023     // 4 : 4 input parameters
2024     CallSignature jSCallWithArgV("JSFastCallWithArgVAndPushArgv", 0, 4,
2025         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
2026     *callSign = jSCallWithArgV;
2027     // 4 : 4 input parameters
2028     std::array<VariableType, 4> params = {
2029         VariableType::NATIVE_POINTER(),   // glue
2030         VariableType::JS_ANY(),           // jsfunc
2031         VariableType::JS_ANY(),           // this
2032         VariableType::INT64(),            // actualNumArgs
2033     };
2034     callSign->SetVariadicArgs(true);
2035     callSign->SetParameters(params.data());
2036     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
2037     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
2038 }
2039 
DEF_CALL_SIGNATURE(JSCallWithArgVAndPushArgv)2040 DEF_CALL_SIGNATURE(JSCallWithArgVAndPushArgv)
2041 {
2042     // 5 : 5 input parameters
2043     CallSignature jSCallWithArgVAndPushArgv("JSCallWithArgVAndPushArgv", 0, 5,
2044         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
2045     *callSign = jSCallWithArgVAndPushArgv;
2046     // 5 : 5 input parameters
2047     std::array<VariableType, 5> params = {
2048         VariableType::NATIVE_POINTER(),   // glue
2049         VariableType::INT64(),            // actualNumArgs
2050         VariableType::JS_ANY(),           // jsfunc
2051         VariableType::JS_ANY(),           // newTarget
2052         VariableType::JS_ANY(),           // this
2053     };
2054     callSign->SetVariadicArgs(true);
2055     callSign->SetParameters(params.data());
2056     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
2057     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
2058 }
2059 
DEF_CALL_SIGNATURE(CallOptimized)2060 DEF_CALL_SIGNATURE(CallOptimized)
2061 {
2062     // 6 : 6 input parameters
2063     CallSignature callOptimized("CallOptimized", 0, 6,
2064         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
2065     *callSign = callOptimized;
2066     std::array<VariableType, 6> params = { // 6 : 6 input parameters
2067         VariableType::NATIVE_POINTER(),  // glue
2068         VariableType::INT64(),           // actual argC
2069         VariableType::NATIVE_POINTER(),  // actual argV
2070         VariableType::JS_ANY(),      // call target
2071         VariableType::JS_ANY(),      // new target
2072         VariableType::JS_ANY(),      // thisobj
2073     };
2074     callSign->SetVariadicArgs(true);
2075     callSign->SetParameters(params.data());
2076     callSign->SetCallConv(CallSignature::CallConv::WebKitJSCallConv);
2077     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
2078 }
2079 
DEF_CALL_SIGNATURE(SuperCallWithArgV)2080 DEF_CALL_SIGNATURE(SuperCallWithArgV)
2081 {
2082     // 5 : 5 input parameters
2083     CallSignature superCallWithArgV("SuperCallWithArgV", 0, 5,
2084         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
2085     *callSign = superCallWithArgV;
2086     // 5 : 5 input parameters
2087     std::array<VariableType, 5> params = {
2088         VariableType::NATIVE_POINTER(),   // glue
2089         VariableType::INT64(),            // actualNumArgs
2090         VariableType::JS_ANY(),           // jsfunc
2091         VariableType::JS_ANY(),           // newTarget
2092         VariableType::JS_ANY(),           // this
2093     };
2094     callSign->SetVariadicArgs(true);
2095     callSign->SetParameters(params.data());
2096     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
2097     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
2098 }
2099 
DEF_CALL_SIGNATURE(Dump)2100 DEF_CALL_SIGNATURE(Dump)
2101 {
2102     constexpr size_t N_INPUT_PARAMETERS = 1;
2103     CallSignature dump("Dump", 0, N_INPUT_PARAMETERS,
2104         ArgumentsOrder::DEFAULT_ORDER, VariableType::VOID());
2105     *callSign = dump;
2106     std::array<VariableType, N_INPUT_PARAMETERS> params = {
2107         VariableType::JS_POINTER() // Tagged value of the object to be dumped
2108     };
2109     callSign->SetParameters(params.data());
2110     callSign->SetGCLeafFunction(true);
2111     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
2112 }
2113 
DEF_CALL_SIGNATURE(DebugDump)2114 DEF_CALL_SIGNATURE(DebugDump)
2115 {
2116     constexpr size_t N_INPUT_PARAMETERS = 1;
2117     CallSignature debugDump("DebugDump", 0, N_INPUT_PARAMETERS,
2118         ArgumentsOrder::DEFAULT_ORDER, VariableType::VOID());
2119     *callSign = debugDump;
2120     std::array<VariableType, N_INPUT_PARAMETERS> params = {
2121         VariableType::JS_POINTER() // Tagged value of the object to be dumped
2122     };
2123     callSign->SetParameters(params.data());
2124     callSign->SetGCLeafFunction(true);
2125     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
2126 }
2127 
DEF_CALL_SIGNATURE(DumpWithHint)2128 DEF_CALL_SIGNATURE(DumpWithHint)
2129 {
2130     constexpr size_t N_INPUT_PARAMETERS = 2;
2131     CallSignature dumpWithHint("DumpWithHint", 0, N_INPUT_PARAMETERS,
2132         ArgumentsOrder::DEFAULT_ORDER, VariableType::VOID());
2133     *callSign = dumpWithHint;
2134     std::array<VariableType, N_INPUT_PARAMETERS> params = {
2135         VariableType::NATIVE_POINTER(), // String created via CircuitBuilder::StringPtr()
2136         VariableType::JS_POINTER()      // Tagged value of the object to be dumped
2137     };
2138     callSign->SetParameters(params.data());
2139     callSign->SetGCLeafFunction(true);
2140     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
2141 }
2142 
DEF_CALL_SIGNATURE(DebugDumpWithHint)2143 DEF_CALL_SIGNATURE(DebugDumpWithHint)
2144 {
2145     constexpr size_t N_INPUT_PARAMETERS = 2;
2146     CallSignature debugDumpWithHint("DebugDumpWithHint", 0, N_INPUT_PARAMETERS,
2147         ArgumentsOrder::DEFAULT_ORDER, VariableType::VOID());
2148     *callSign = debugDumpWithHint;
2149     std::array<VariableType, N_INPUT_PARAMETERS> params = {
2150         VariableType::NATIVE_POINTER(), // String created via CircuitBuilder::StringPtr()
2151         VariableType::JS_POINTER()      // Tagged value of the object to be dumped
2152     };
2153     callSign->SetParameters(params.data());
2154     callSign->SetGCLeafFunction(true);
2155     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
2156 }
2157 
DEF_CALL_SIGNATURE(DebugPrint)2158 DEF_CALL_SIGNATURE(DebugPrint)
2159 {
2160     // 1 : 1 input parameters
2161     CallSignature debugPrint("DebugPrint", 0, 1,
2162         ArgumentsOrder::DEFAULT_ORDER, VariableType::VOID());
2163     *callSign = debugPrint;
2164     // 1 : 1 input parameters
2165     std::array<VariableType, 1> params = {
2166         VariableType::INT32(),
2167     };
2168     callSign->SetVariadicArgs(true);
2169     callSign->SetParameters(params.data());
2170     callSign->SetGCLeafFunction(true);
2171     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
2172 }
2173 
DEF_CALL_SIGNATURE(DebugPrintCustom)2174 DEF_CALL_SIGNATURE(DebugPrintCustom)
2175 {
2176     // 1 : 1 input parameters
2177     CallSignature debugPrintCustom("DebugPrintCustom", 0,  1,
2178         ArgumentsOrder::DEFAULT_ORDER, VariableType::VOID());
2179     *callSign = debugPrintCustom;
2180     // 1 : 1 input parameters
2181     std::array<VariableType, 1> params = {
2182         VariableType::NATIVE_POINTER() // Format string created via CircuitBuilder::StringPtr()
2183     };
2184     callSign->SetVariadicArgs(true);
2185     callSign->SetParameters(params.data());
2186     callSign->SetGCLeafFunction(true);
2187     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
2188 }
2189 
DEF_CALL_SIGNATURE(DebugPrintInstruction)2190 DEF_CALL_SIGNATURE(DebugPrintInstruction)
2191 {
2192     // 2 : 2 input parameters
2193     CallSignature debugPrintInstruction("DebugPrintInstruction", 0, 2,
2194         ArgumentsOrder::DEFAULT_ORDER, VariableType::VOID());
2195     *callSign = debugPrintInstruction;
2196     // 2 : 2 input parameters
2197     std::array<VariableType, 2> params = {
2198         VariableType::NATIVE_POINTER(),
2199         VariableType::NATIVE_POINTER(),
2200     };
2201     callSign->SetVariadicArgs(true);
2202     callSign->SetParameters(params.data());
2203     callSign->SetGCLeafFunction(true);
2204     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
2205 }
2206 
DEF_CALL_SIGNATURE(DebugOsrEntry)2207 DEF_CALL_SIGNATURE(DebugOsrEntry)
2208 {
2209     // 2 : 2 input parameters
2210     CallSignature debugOsrEntry("DebugOsrEntry", 0, 2,
2211         ArgumentsOrder::DEFAULT_ORDER, VariableType::VOID());
2212     *callSign = debugOsrEntry;
2213     // 2 : 2 input parameters
2214     std::array<VariableType, 2> params = {
2215         VariableType::NATIVE_POINTER(),
2216         VariableType::NATIVE_POINTER(),
2217     };
2218     callSign->SetVariadicArgs(true);
2219     callSign->SetParameters(params.data());
2220     callSign->SetGCLeafFunction(true);
2221     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
2222 }
2223 
DEF_CALL_SIGNATURE(Comment)2224 DEF_CALL_SIGNATURE(Comment)
2225 {
2226     // 1 : 1 input parameters
2227     CallSignature comment("Comment", 0, 1,
2228         ArgumentsOrder::DEFAULT_ORDER, VariableType::VOID());
2229     *callSign = comment;
2230     // 1 : 1 input parameters
2231     std::array<VariableType, 1> params = {
2232         VariableType::NATIVE_POINTER(),
2233     };
2234     callSign->SetParameters(params.data());
2235     callSign->SetGCLeafFunction(true);
2236     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
2237 }
2238 
DEF_CALL_SIGNATURE(FatalPrint)2239 DEF_CALL_SIGNATURE(FatalPrint)
2240 {
2241     // 1 : 1 input parameters
2242     CallSignature fatalPrint("FatalPrint", 0, 1,
2243         ArgumentsOrder::DEFAULT_ORDER, VariableType::VOID());
2244     *callSign = fatalPrint;
2245     // 1 : 1 input parameters
2246     std::array<VariableType, 1> params = {
2247         VariableType::INT32(),
2248     };
2249     callSign->SetVariadicArgs(true);
2250     callSign->SetParameters(params.data());
2251     callSign->SetGCLeafFunction(true);
2252     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
2253 }
2254 
DEF_CALL_SIGNATURE(FatalPrintCustom)2255 DEF_CALL_SIGNATURE(FatalPrintCustom)
2256 {
2257     // 1 : 1 input parameters
2258     CallSignature fatalPrintCustom("FatalPrintCustom", 0, 1,
2259         ArgumentsOrder::DEFAULT_ORDER, VariableType::VOID());
2260     *callSign = fatalPrintCustom;
2261     // 1 : 1 input parameters
2262     std::array<VariableType, 1> params = {
2263         VariableType::NATIVE_POINTER() // Format string created via CircuitBuilder::StringPtr()
2264     };
2265     callSign->SetVariadicArgs(true);
2266     callSign->SetParameters(params.data());
2267     callSign->SetGCLeafFunction(true);
2268     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
2269 }
2270 
DEF_CALL_SIGNATURE(GetActualArgvNoGC)2271 DEF_CALL_SIGNATURE(GetActualArgvNoGC)
2272 {
2273     CallSignature index("GetActualArgvNoGC", 0, 1, ArgumentsOrder::DEFAULT_ORDER, VariableType::NATIVE_POINTER());
2274     *callSign = index;
2275     std::array<VariableType, 1> params = {
2276         VariableType::NATIVE_POINTER(),
2277     };
2278     callSign->SetParameters(params.data());
2279     callSign->SetGCLeafFunction(true);
2280     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
2281 }
2282 
DEF_CALL_SIGNATURE(InsertNewToEdenRSet)2283 DEF_CALL_SIGNATURE(InsertNewToEdenRSet)
2284 {
2285     // 3 : 3 input parameters
2286     CallSignature index("InsertNewToEdenRSet", 0, 3, ArgumentsOrder::DEFAULT_ORDER, VariableType::VOID());
2287     *callSign = index;
2288     // 3 : 3 input parameters
2289     std::array<VariableType, 3> params = {
2290         VariableType::NATIVE_POINTER(),
2291         VariableType::JS_POINTER(),
2292         VariableType::NATIVE_POINTER(),
2293     };
2294     callSign->SetParameters(params.data());
2295     callSign->SetGCLeafFunction(true);
2296     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
2297 }
2298 
DEF_CALL_SIGNATURE(InsertOldToNewRSet)2299 DEF_CALL_SIGNATURE(InsertOldToNewRSet)
2300 {
2301     // 3 : 3 input parameters
2302     CallSignature index("InsertOldToNewRSet", 0, 3, ArgumentsOrder::DEFAULT_ORDER, VariableType::VOID());
2303     *callSign = index;
2304     // 3 : 3 input parameters
2305     std::array<VariableType, 3> params = {
2306         VariableType::NATIVE_POINTER(),
2307         VariableType::JS_POINTER(),
2308         VariableType::NATIVE_POINTER(),
2309     };
2310     callSign->SetParameters(params.data());
2311     callSign->SetGCLeafFunction(true);
2312     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
2313 }
2314 
DEF_CALL_SIGNATURE(InsertLocalToShareRSet)2315 DEF_CALL_SIGNATURE(InsertLocalToShareRSet)
2316 {
2317     // 3 : 3 input parameters
2318     CallSignature index("InsertLocalToShareRSet", 0, 3, ArgumentsOrder::DEFAULT_ORDER, VariableType::VOID());
2319     *callSign = index;
2320     // 3 : 3 input parameters
2321     std::array<VariableType, 3> params = {
2322         VariableType::NATIVE_POINTER(),
2323         VariableType::JS_POINTER(),
2324         VariableType::NATIVE_POINTER(),
2325     };
2326     callSign->SetParameters(params.data());
2327     callSign->SetGCLeafFunction(true);
2328     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
2329 }
2330 
DEF_CALL_SIGNATURE(SetBitAtomic)2331 DEF_CALL_SIGNATURE(SetBitAtomic)
2332 {
2333     // 3 : 3 input parameters
2334     CallSignature index("SetBitAtomic", 0, 3, ArgumentsOrder::DEFAULT_ORDER, VariableType::VOID());
2335     *callSign = index;
2336     // 3 : 3 input parameters
2337     std::array<VariableType, 3> params = {
2338         VariableType::NATIVE_POINTER(),
2339         VariableType::INT32(),
2340         VariableType::INT32()
2341     };
2342     callSign->SetParameters(params.data());
2343     callSign->SetGCLeafFunction(true);
2344     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
2345 }
2346 
2347 #define DEF_FLOAT_UNARY_CALL_SIGNATURE_BY_NAME(NAME)                                               \
2348     DEF_CALL_SIGNATURE(NAME)                                                                       \
2349     {                                                                                              \
2350         /* 1 : 1 input parameters */                                                               \
2351         CallSignature index(#NAME, 0, 1, ArgumentsOrder::DEFAULT_ORDER, VariableType::FLOAT64());  \
2352         *callSign = index;                                                                         \
2353         /* 1 : 1 input parameters */                                                               \
2354         std::array<VariableType, 1> params = {                                                     \
2355             VariableType::FLOAT64(),                                                               \
2356         };                                                                                         \
2357         callSign->SetParameters(params.data());                                                    \
2358         callSign->SetGCLeafFunction(true);                                                         \
2359         callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);                    \
2360     }
2361 
2362 DEF_FLOAT_UNARY_CALL_SIGNATURE_BY_NAME(FloatAcos)
2363 DEF_FLOAT_UNARY_CALL_SIGNATURE_BY_NAME(FloatAcosh)
2364 DEF_FLOAT_UNARY_CALL_SIGNATURE_BY_NAME(FloatAsin)
2365 DEF_FLOAT_UNARY_CALL_SIGNATURE_BY_NAME(FloatAsinh)
2366 DEF_FLOAT_UNARY_CALL_SIGNATURE_BY_NAME(FloatAtan)
2367 DEF_FLOAT_UNARY_CALL_SIGNATURE_BY_NAME(FloatAtanh)
2368 DEF_FLOAT_UNARY_CALL_SIGNATURE_BY_NAME(FloatCos)
2369 DEF_FLOAT_UNARY_CALL_SIGNATURE_BY_NAME(FloatCosh)
2370 DEF_FLOAT_UNARY_CALL_SIGNATURE_BY_NAME(FloatSin)
2371 DEF_FLOAT_UNARY_CALL_SIGNATURE_BY_NAME(FloatSinh)
2372 DEF_FLOAT_UNARY_CALL_SIGNATURE_BY_NAME(FloatTan)
2373 DEF_FLOAT_UNARY_CALL_SIGNATURE_BY_NAME(FloatTanh)
2374 DEF_FLOAT_UNARY_CALL_SIGNATURE_BY_NAME(FloatExp)
2375 DEF_FLOAT_UNARY_CALL_SIGNATURE_BY_NAME(FloatExpm1)
2376 DEF_FLOAT_UNARY_CALL_SIGNATURE_BY_NAME(FloatTrunc)
2377 DEF_FLOAT_UNARY_CALL_SIGNATURE_BY_NAME(FloatFloor)
2378 DEF_FLOAT_UNARY_CALL_SIGNATURE_BY_NAME(FloatLog)
2379 DEF_FLOAT_UNARY_CALL_SIGNATURE_BY_NAME(FloatLog2)
2380 DEF_FLOAT_UNARY_CALL_SIGNATURE_BY_NAME(FloatLog10)
2381 DEF_FLOAT_UNARY_CALL_SIGNATURE_BY_NAME(FloatLog1p)
2382 DEF_FLOAT_UNARY_CALL_SIGNATURE_BY_NAME(FloatCbrt)
2383 DEF_FLOAT_UNARY_CALL_SIGNATURE_BY_NAME(FloatClz32)
2384 DEF_FLOAT_UNARY_CALL_SIGNATURE_BY_NAME(FloatCeil)
2385 
2386 #undef DEF_FLOAT_UNARY_CALL_SIGNATURE_BY_NAME
2387 
2388 #define DEF_FLOAT_BINARY_CALL_SIGNATURE_BY_NAME(NAME)                                              \
2389     DEF_CALL_SIGNATURE(NAME)                                                                       \
2390     {                                                                                              \
2391         /* 2 : 2 input parameters */                                                               \
2392         CallSignature index(#NAME, 0, 2, ArgumentsOrder::DEFAULT_ORDER, VariableType::FLOAT64());  \
2393         *callSign = index;                                                                         \
2394         /* 2 : 2 input parameters */                                                               \
2395         std::array<VariableType, 2> params = {                                                     \
2396             VariableType::FLOAT64(),                                                               \
2397             VariableType::FLOAT64(),                                                               \
2398         };                                                                                         \
2399         callSign->SetParameters(params.data());                                                    \
2400         callSign->SetGCLeafFunction(true);                                                         \
2401         callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);                    \
2402     }
2403 
2404 DEF_FLOAT_BINARY_CALL_SIGNATURE_BY_NAME(FloatMod)
2405 DEF_FLOAT_BINARY_CALL_SIGNATURE_BY_NAME(FloatAtan2)
2406 DEF_FLOAT_BINARY_CALL_SIGNATURE_BY_NAME(FloatPow)
2407 
2408 #undef DEF_FLOAT_BINARY_CALL_SIGNATURE_BY_NAME
2409 
DEF_CALL_SIGNATURE(CallDateNow)2410 DEF_CALL_SIGNATURE(CallDateNow)
2411 {
2412     CallSignature signature("CallDateNow", 0, 0, ArgumentsOrder::DEFAULT_ORDER,
2413         VariableType::FLOAT64());
2414     *callSign = signature;
2415     callSign->SetGCLeafFunction(true);
2416     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
2417 }
2418 
DEF_CALL_SIGNATURE(FindElementWithCache)2419 DEF_CALL_SIGNATURE(FindElementWithCache)
2420 {
2421     // 4 : 4 input parameters
2422     CallSignature index("FindElementWithCache", 0, 4, ArgumentsOrder::DEFAULT_ORDER, VariableType::INT32());
2423     *callSign = index;
2424     // 4 : 4 input parameters
2425     std::array<VariableType, 4> params = {
2426         VariableType::NATIVE_POINTER(),
2427         VariableType::JS_ANY(),
2428         VariableType::JS_ANY(),
2429         VariableType::INT32(),
2430     };
2431     callSign->SetParameters(params.data());
2432     callSign->SetGCLeafFunction(true);
2433     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
2434 }
2435 
DEF_CALL_SIGNATURE(UpdateFieldType)2436 DEF_CALL_SIGNATURE(UpdateFieldType)
2437 {
2438     // 2 : 2 input parameters
2439     CallSignature index("UpdateFieldType", 0, 2, ArgumentsOrder::DEFAULT_ORDER, VariableType::INT32());
2440     *callSign = index;
2441     // 2 : 2 input parameters
2442     std::array<VariableType, 2> params = {
2443         VariableType::JS_ANY(),
2444         VariableType::INT64(),
2445     };
2446     callSign->SetParameters(params.data());
2447     callSign->SetGCLeafFunction(true);
2448     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
2449 }
2450 
DEF_CALL_SIGNATURE(NumberIsFinite)2451 DEF_CALL_SIGNATURE(NumberIsFinite)
2452 {
2453     // 1 : 1 input parameters
2454     CallSignature index("NumberIsFinite", 0, 1, ArgumentsOrder::DEFAULT_ORDER, VariableType::BOOL());
2455     *callSign = index;
2456     // 1 : 1 input parameters
2457     std::array<VariableType, 1> params = {
2458         VariableType::FLOAT64(),
2459     };
2460     callSign->SetParameters(params.data());
2461     callSign->SetGCLeafFunction(true);
2462     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
2463 }
2464 
DEF_CALL_SIGNATURE(DoubleToInt)2465 DEF_CALL_SIGNATURE(DoubleToInt)
2466 {
2467     // 2 : 2 input parameters
2468     CallSignature index("DoubleToInt", 0, 2, ArgumentsOrder::DEFAULT_ORDER, VariableType::INT32());
2469     *callSign = index;
2470     // 2 : 2 input parameters
2471     std::array<VariableType, 2> params = {
2472         VariableType::FLOAT64(),
2473         VariableType::NATIVE_POINTER(),
2474     };
2475     callSign->SetParameters(params.data());
2476     callSign->SetGCLeafFunction(true);
2477     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
2478 }
2479 
DEF_CALL_SIGNATURE(DoubleToLength)2480 DEF_CALL_SIGNATURE(DoubleToLength)
2481 {
2482     // 1 : 1 input parameters
2483     CallSignature index("DoubleToLength", 0, 1, ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
2484     *callSign = index;
2485     // 1 : 1 input parameters
2486     std::array<VariableType, 1> params = {
2487         VariableType::FLOAT64(),
2488     };
2489     callSign->SetParameters(params.data());
2490     callSign->SetGCLeafFunction(true);
2491     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
2492 }
2493 
DEF_CALL_SIGNATURE(MarkingBarrier)2494 DEF_CALL_SIGNATURE(MarkingBarrier)
2495 {
2496     // 4 : 4 input parameters
2497     CallSignature index("MarkingBarrier", 0, 4, ArgumentsOrder::DEFAULT_ORDER, VariableType::VOID());
2498     *callSign = index;
2499     // 4 : 4 input parameters
2500     std::array<VariableType, 4> params = {
2501         VariableType::NATIVE_POINTER(),
2502         VariableType::JS_POINTER(),
2503         VariableType::NATIVE_POINTER(),
2504         VariableType::JS_POINTER()
2505     };
2506     callSign->SetParameters(params.data());
2507     callSign->SetGCLeafFunction(true);
2508     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
2509 }
2510 
DEF_CALL_SIGNATURE(MarkingBarrierWithEden)2511 DEF_CALL_SIGNATURE(MarkingBarrierWithEden)
2512 {
2513     // 4 : 4 input parameters
2514     CallSignature index("MarkingBarrierWithEden", 0, 4, ArgumentsOrder::DEFAULT_ORDER, VariableType::VOID());
2515     *callSign = index;
2516     // 4 : 4 input parameters
2517     std::array<VariableType, 4> params = {
2518         VariableType::NATIVE_POINTER(),
2519         VariableType::JS_POINTER(),
2520         VariableType::NATIVE_POINTER(),
2521         VariableType::JS_POINTER()
2522     };
2523     callSign->SetParameters(params.data());
2524     callSign->SetGCLeafFunction(true);
2525     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
2526 }
2527 
DEF_CALL_SIGNATURE(SharedGCMarkingBarrier)2528 DEF_CALL_SIGNATURE(SharedGCMarkingBarrier)
2529 {
2530     // 2 : 2 input parameters
2531     CallSignature index("SharedGCMarkingBarrier", 0, 2, ArgumentsOrder::DEFAULT_ORDER, VariableType::VOID());
2532     *callSign = index;
2533     // 2 : 2 input parameters
2534     std::array<VariableType, 2> params = {
2535         VariableType::NATIVE_POINTER(),
2536         VariableType::JS_POINTER(),
2537     };
2538     callSign->SetParameters(params.data());
2539     callSign->SetGCLeafFunction(true);
2540     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
2541 }
2542 
DEF_CALL_SIGNATURE(StoreBarrier)2543 DEF_CALL_SIGNATURE(StoreBarrier)
2544 {
2545     // 4 : 4 input parameters
2546     CallSignature index("StoreBarrier", 0, 4, ArgumentsOrder::DEFAULT_ORDER, VariableType::VOID());
2547     *callSign = index;
2548     // 4 : 4 input parameters
2549     std::array<VariableType, 4> params = {
2550         VariableType::NATIVE_POINTER(),
2551         VariableType::JS_POINTER(),
2552         VariableType::NATIVE_POINTER(),
2553         VariableType::JS_POINTER()
2554     };
2555     callSign->SetParameters(params.data());
2556     callSign->SetGCLeafFunction(true);
2557     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
2558 }
2559 
DEF_CALL_SIGNATURE(CallArg0)2560 DEF_CALL_SIGNATURE(CallArg0)
2561 {
2562     // 2 : 2 input parameters
2563     CallSignature callArg0("callArg0", 0, 2,
2564         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
2565     *callSign = callArg0;
2566     // 2 : 2 input parameters
2567     std::array<VariableType, 2> params = {
2568         VariableType::NATIVE_POINTER(),
2569         VariableType::JS_ANY()
2570     };
2571     callSign->SetParameters(params.data());
2572     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB);
2573 }
2574 
DEF_CALL_SIGNATURE(CallArg1)2575 DEF_CALL_SIGNATURE(CallArg1)
2576 {
2577     // 3 : 3 input parameters
2578     CallSignature callArg1("callArg1", 0, 3,
2579         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
2580     *callSign = callArg1;
2581     // 3 : 3 input parameters
2582     std::array<VariableType, 3> params = {
2583         VariableType::NATIVE_POINTER(),
2584         VariableType::JS_ANY(),
2585         VariableType::JS_ANY()
2586     };
2587     callSign->SetParameters(params.data());
2588     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB);
2589 }
2590 
DEF_CALL_SIGNATURE(CallArgs2)2591 DEF_CALL_SIGNATURE(CallArgs2)
2592 {
2593     // 4 : 4 input parameters
2594     CallSignature callArgs2("callArgs2", 0, 4,
2595         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
2596     *callSign = callArgs2;
2597     // 4 : 4 input parameters
2598     std::array<VariableType, 4> params = {
2599         VariableType::NATIVE_POINTER(),
2600         VariableType::JS_ANY(),
2601         VariableType::JS_ANY(),
2602         VariableType::JS_ANY()
2603     };
2604     callSign->SetParameters(params.data());
2605     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB);
2606 }
2607 
DEF_CALL_SIGNATURE(CallArgs3)2608 DEF_CALL_SIGNATURE(CallArgs3)
2609 {
2610     // 5 : 5 input parameters
2611     CallSignature callArgs3("callArgs3", 0, 5,
2612         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
2613     *callSign = callArgs3;
2614     // 5 : 5 input parameters
2615     std::array<VariableType, 5> params = {
2616         VariableType::NATIVE_POINTER(),
2617         VariableType::JS_ANY(),
2618         VariableType::JS_ANY(),
2619         VariableType::JS_ANY(),
2620         VariableType::JS_ANY()
2621     };
2622     callSign->SetParameters(params.data());
2623     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB);
2624 }
2625 
DEF_CALL_SIGNATURE(CallThisRange)2626 DEF_CALL_SIGNATURE(CallThisRange)
2627 {
2628     // 3 : 3 input parameters
2629     CallSignature callThisRange("callThisRange", 0, 3,
2630         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
2631     *callSign = callThisRange;
2632     // 3 : 3 input parameters
2633     std::array<VariableType, 3> params = {
2634         VariableType::NATIVE_POINTER(),
2635         VariableType::JS_ANY(),
2636         VariableType::JS_ANY()
2637     };
2638     callSign->SetVariadicArgs(true);
2639     callSign->SetParameters(params.data());
2640     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB);
2641 }
2642 
DEF_CALL_SIGNATURE(CallRange)2643 DEF_CALL_SIGNATURE(CallRange)
2644 {
2645     // 2 : 2 input parameters
2646     CallSignature callRange("callRange", 0, 2,
2647         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
2648     *callSign = callRange;
2649     // 2 : 2 input parameters
2650     std::array<VariableType, 2> params = {
2651         VariableType::NATIVE_POINTER(),
2652         VariableType::JS_ANY()
2653     };
2654     callSign->SetVariadicArgs(true);
2655     callSign->SetParameters(params.data());
2656     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB);
2657 }
2658 
DEF_CALL_SIGNATURE(JsProxyCallInternal)2659 DEF_CALL_SIGNATURE(JsProxyCallInternal)
2660 {
2661     // 4 : 4 input parameters
2662     CallSignature proxyCallInternal("JsProxyCallInternal", 0, 4,
2663         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_POINTER());
2664     *callSign = proxyCallInternal;
2665     // 4 : 4 input parameters
2666     std::array<VariableType, 4> params = {
2667         VariableType::NATIVE_POINTER(),    // glue
2668         VariableType::INT64(),      // actual argC
2669         VariableType::JS_POINTER(), // callTarget
2670         VariableType::NATIVE_POINTER(),    // argv
2671     };
2672     callSign->SetVariadicArgs(false);
2673     callSign->SetParameters(params.data());
2674     callSign->SetTailCall(true);
2675     callSign->SetGCLeafFunction(true);
2676     callSign->SetTargetKind(CallSignature::TargetKind::COMMON_STUB);
2677     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
2678 }
2679 
DEF_CALL_SIGNATURE(JsBoundCallInternal)2680 DEF_CALL_SIGNATURE(JsBoundCallInternal)
2681 {
2682     // 6 : 6 input parameters
2683     CallSignature boundCallInternal("JsBoundCallInternal", 0, 6,
2684         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_POINTER());
2685     *callSign = boundCallInternal;
2686     // 6 : 6 input parameters
2687     std::array<VariableType, 6> params = {
2688         VariableType::NATIVE_POINTER(),    // glue
2689         VariableType::INT64(),      // actual argC
2690         VariableType::JS_POINTER(), // callTarget
2691         VariableType::NATIVE_POINTER(),    // argv
2692         VariableType::JS_POINTER(), // this
2693         VariableType::JS_POINTER(), // new
2694     };
2695     callSign->SetVariadicArgs(false);
2696     callSign->SetParameters(params.data());
2697     callSign->SetTailCall(true);
2698     callSign->SetGCLeafFunction(true);
2699     callSign->SetTargetKind(CallSignature::TargetKind::COMMON_STUB);
2700     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
2701 }
2702 
DEF_CALL_SIGNATURE(CreateArrayFromList)2703 DEF_CALL_SIGNATURE(CreateArrayFromList)
2704 {
2705     // 3 : 3 input parameters
2706     CallSignature createArrayFromList("CreateArrayFromList", 0, 3, ArgumentsOrder::DEFAULT_ORDER,
2707                                      VariableType::JS_POINTER());
2708     *callSign = createArrayFromList;
2709     // 3 : 3 input parameters
2710     std::array<VariableType, 3> params = {
2711         VariableType::NATIVE_POINTER(),
2712         VariableType::INT32(),
2713         VariableType::NATIVE_POINTER(),
2714     };
2715 
2716     callSign->SetParameters(params.data());
2717     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_VARARGS);
2718 }
2719 
DEF_CALL_SIGNATURE(DeoptHandlerAsm)2720 DEF_CALL_SIGNATURE(DeoptHandlerAsm)
2721 {
2722     // 1 : 1 input parameters
2723     CallSignature deoptHandlerAsm("DeoptHandlerAsm", 0, 3,
2724         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
2725     *callSign = deoptHandlerAsm;
2726     std::array<VariableType, 3> params = { // 3 : 3 input parameters
2727         VariableType::NATIVE_POINTER(),     // glue
2728         VariableType::NATIVE_POINTER(),     // deoptType
2729         VariableType::NATIVE_POINTER(),     // depth
2730     };
2731     callSign->SetVariadicArgs(false);
2732     callSign->SetParameters(params.data());
2733     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
2734     callSign->SetTargetKind(CallSignature::TargetKind::DEOPT_STUB);
2735 }
2736 
DEF_CALL_SIGNATURE(TimeClip)2737 DEF_CALL_SIGNATURE(TimeClip)
2738 {
2739     // 1 : 1 input parameters
2740     CallSignature index("TimeClip", 0, 1, ArgumentsOrder::DEFAULT_ORDER, VariableType::FLOAT64());
2741     *callSign = index;
2742     // 1 : 1 input parameters
2743     std::array<VariableType, 1> params = {
2744         VariableType::FLOAT64(),
2745     };
2746     callSign->SetParameters(params.data());
2747     callSign->SetGCLeafFunction(true);
2748     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
2749 }
2750 
DEF_CALL_SIGNATURE(SetDateValues)2751 DEF_CALL_SIGNATURE(SetDateValues)
2752 {
2753     // 3 : 3 input parameters
2754     CallSignature index("SetDateValues", 0, 3, ArgumentsOrder::DEFAULT_ORDER, VariableType::FLOAT64());
2755     *callSign = index;
2756     // 3 : 3 input parameters
2757     std::array<VariableType, 3> params = {
2758         VariableType::FLOAT64(),
2759         VariableType::FLOAT64(),
2760         VariableType::FLOAT64(),
2761     };
2762     callSign->SetParameters(params.data());
2763     callSign->SetGCLeafFunction(true);
2764     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
2765 }
2766 
DEF_CALL_SIGNATURE(StartCallTimer)2767 DEF_CALL_SIGNATURE(StartCallTimer)
2768 {
2769     CallSignature index("StartCallTimer", 0, 3, ArgumentsOrder::DEFAULT_ORDER, VariableType::VOID());
2770     *callSign = index;
2771     // 3 : 3 input parameters
2772     std::array<VariableType, 3> params = {
2773         VariableType::NATIVE_POINTER(),
2774         VariableType::JS_ANY(),
2775         VariableType::BOOL()
2776     };
2777     callSign->SetParameters(params.data());
2778     callSign->SetGCLeafFunction(true);
2779     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
2780 }
2781 
DEF_CALL_SIGNATURE(EndCallTimer)2782 DEF_CALL_SIGNATURE(EndCallTimer)
2783 {
2784     CallSignature index("EndCallTimer", 0, 2, ArgumentsOrder::DEFAULT_ORDER, VariableType::VOID());
2785     *callSign = index;
2786     // 2 : 2 input parameters
2787     std::array<VariableType, 2> params = {
2788         VariableType::NATIVE_POINTER(),
2789         VariableType::JS_ANY()
2790     };
2791     callSign->SetParameters(params.data());
2792     callSign->SetGCLeafFunction(true);
2793     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
2794 }
2795 
DEF_CALL_SIGNATURE(GetSingleCharCodeByIndex)2796 DEF_CALL_SIGNATURE(GetSingleCharCodeByIndex)
2797 {
2798     // 3 : 3 input parameters
2799     CallSignature signature("GetSingleCharCodeByIndex", 0, 3,
2800         ArgumentsOrder::DEFAULT_ORDER, VariableType::INT32());
2801     *callSign = signature;
2802     // 3 : 3 input parameters
2803     std::array<VariableType, 3> params = {
2804         VariableType::NATIVE_POINTER(),  // glue
2805         VariableType::JS_ANY(),          // ecmaString
2806         VariableType::INT32(),           // index
2807     };
2808     callSign->SetParameters(params.data());
2809     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
2810 }
2811 
DEF_CALL_SIGNATURE(CreateStringBySingleCharCode)2812 DEF_CALL_SIGNATURE(CreateStringBySingleCharCode)
2813 {
2814     // 2 : 2 input parameters
2815     CallSignature signature("CreateStringByCharCode", 0, 2,
2816         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
2817     *callSign = signature;
2818     // 2 : 2 input parameters
2819     std::array<VariableType, 2> params = {
2820         VariableType::NATIVE_POINTER(),  // glue
2821         VariableType::INT32(),           // charcode
2822     };
2823     callSign->SetParameters(params.data());
2824     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
2825 }
2826 
DEF_CALL_SIGNATURE(Getpropiterator)2827 DEF_CALL_SIGNATURE(Getpropiterator)
2828 {
2829     // 2 : 2 input parameters
2830     CallSignature signature("Getpropiterator", 0, 2,
2831         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
2832     *callSign = signature;
2833     // 2 : 2 input parameters
2834     std::array<VariableType, 2> params = {
2835         VariableType::NATIVE_POINTER(),  // glue
2836         VariableType::JS_ANY(),          // object
2837     };
2838     callSign->SetParameters(params.data());
2839     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
2840 }
2841 
DEF_CALL_SIGNATURE(Getnextpropname)2842 DEF_CALL_SIGNATURE(Getnextpropname)
2843 {
2844     // 2 : 2 input parameters
2845     CallSignature signature("Getnextpropname", 0, 2,
2846         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
2847     *callSign = signature;
2848     // 2 : 2 input parameters
2849     std::array<VariableType, 2> params = {
2850         VariableType::NATIVE_POINTER(),  // glue
2851         VariableType::JS_ANY(),          // iter
2852     };
2853     callSign->SetParameters(params.data());
2854     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
2855 }
2856 
DEF_CALL_SIGNATURE(CreateJSSetIterator)2857 DEF_CALL_SIGNATURE(CreateJSSetIterator)
2858 {
2859     UNARY_CALL_SIGNATURE(CreateJSSetIterator)
2860 }
2861 
DEF_CALL_SIGNATURE(JSSetEntries)2862 DEF_CALL_SIGNATURE(JSSetEntries)
2863 {
2864     UNARY_CALL_SIGNATURE(JSSetEntries)
2865 }
2866 
DEF_CALL_SIGNATURE(CreateJSMapIterator)2867 DEF_CALL_SIGNATURE(CreateJSMapIterator)
2868 {
2869     UNARY_CALL_SIGNATURE(CreateJSMapIterator)
2870 }
2871 
DEF_CALL_SIGNATURE(JSMapKeys)2872 DEF_CALL_SIGNATURE(JSMapKeys)
2873 {
2874     UNARY_CALL_SIGNATURE(JSMapKeys)
2875 }
2876 
DEF_CALL_SIGNATURE(JSMapValues)2877 DEF_CALL_SIGNATURE(JSMapValues)
2878 {
2879     UNARY_CALL_SIGNATURE(JSMapValues)
2880 }
2881 
DEF_CALL_SIGNATURE(JSMapGet)2882 DEF_CALL_SIGNATURE(JSMapGet)
2883 {
2884     BINARY_CALL_SIGNATURE(JSMapGet)
2885 }
2886 
DEF_CALL_SIGNATURE(StringIteratorNext)2887 DEF_CALL_SIGNATURE(StringIteratorNext)
2888 {
2889     UNARY_CALL_SIGNATURE(StringIteratorNext)
2890 }
2891 
DEF_CALL_SIGNATURE(JSMapHas)2892 DEF_CALL_SIGNATURE(JSMapHas)
2893 {
2894     *callSign = CallSignature("JSMapHas", 0, ArgumentsOrder::DEFAULT_ORDER, VariableType::BOOL(),
2895         {
2896             VariableType::NATIVE_POINTER(),  // glue
2897             VariableType::JS_ANY(),          // obj
2898             VariableType::JS_ANY(),          // key
2899         });
2900 }
2901 
DEF_CALL_SIGNATURE(JSSetHas)2902 DEF_CALL_SIGNATURE(JSSetHas)
2903 {
2904     *callSign = CallSignature("JSSetHas", 0, ArgumentsOrder::DEFAULT_ORDER, VariableType::BOOL(),
2905         {
2906             VariableType::NATIVE_POINTER(),  // glue
2907             VariableType::JS_ANY(),          // obj
2908             VariableType::JS_ANY(),          // key
2909         });
2910 }
2911 
DEF_CALL_SIGNATURE(JSMapDelete)2912 DEF_CALL_SIGNATURE(JSMapDelete)
2913 {
2914     *callSign = CallSignature("JSMapDelete", 0, ArgumentsOrder::DEFAULT_ORDER, VariableType::BOOL(),
2915         {
2916             VariableType::NATIVE_POINTER(),  // glue
2917             VariableType::JS_ANY(),          // obj
2918             VariableType::JS_ANY(),          // key
2919         });
2920 }
2921 
DEF_CALL_SIGNATURE(JSSetDelete)2922 DEF_CALL_SIGNATURE(JSSetDelete)
2923 {
2924     *callSign = CallSignature("JSSetDelete", 0, ArgumentsOrder::DEFAULT_ORDER, VariableType::BOOL(),
2925         {
2926             VariableType::NATIVE_POINTER(),  // glue
2927             VariableType::JS_ANY(),          // obj
2928             VariableType::JS_ANY(),          // key
2929         });
2930 }
2931 
DEF_CALL_SIGNATURE(JSSetAdd)2932 DEF_CALL_SIGNATURE(JSSetAdd)
2933 {
2934     *callSign = CallSignature("JSSetAdd", 0, ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY(),
2935         {
2936             VariableType::NATIVE_POINTER(),  // glue
2937             VariableType::JS_ANY(),          // obj
2938             VariableType::JS_ANY(),          // key
2939         });
2940 }
2941 
DEF_CALL_SIGNATURE(FastStringEqual)2942 DEF_CALL_SIGNATURE(FastStringEqual)
2943 {
2944     // 3 : 3 input parameters
2945     CallSignature signature("FastStringEqual", 0, 3,
2946         ArgumentsOrder::DEFAULT_ORDER, VariableType::BOOL());
2947     *callSign = signature;
2948     // 3 : 3 input parameters
2949     std::array<VariableType, 3> params = {
2950         VariableType::NATIVE_POINTER(),  // glue
2951         VariableType::JS_ANY(),          // ecmaString1
2952         VariableType::JS_ANY(),          // ecmaString2
2953     };
2954     callSign->SetParameters(params.data());
2955 }
2956 
DEF_CALL_SIGNATURE(FastStringAdd)2957 DEF_CALL_SIGNATURE(FastStringAdd)
2958 {
2959     // 3 : 3 input parameters
2960     CallSignature signature("FastStringAdd", 0, 3,
2961         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
2962     *callSign = signature;
2963     // 3 : 3 input parameters
2964     std::array<VariableType, 3> params = {
2965         VariableType::NATIVE_POINTER(),  // glue
2966         VariableType::JS_ANY(),          // ecmaString1
2967         VariableType::JS_ANY(),          // ecmaString2
2968     };
2969     callSign->SetParameters(params.data());
2970     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
2971 }
2972 
DEF_CALL_SIGNATURE(DeleteObjectProperty)2973 DEF_CALL_SIGNATURE(DeleteObjectProperty)
2974 {
2975     // 3 : 3 input parameters
2976     CallSignature signature("DeleteObjectProperty", 0, 3,
2977         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
2978     *callSign = signature;
2979     // 3 : 3 input parameters
2980     std::array<VariableType, 3> params = {
2981         VariableType::NATIVE_POINTER(),  // glue
2982         VariableType::JS_ANY(),          // object
2983         VariableType::JS_ANY(),          // prop
2984     };
2985     callSign->SetParameters(params.data());
2986     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
2987 }
2988 
DEF_CALL_SIGNATURE(CopyTypedArrayBuffer)2989 DEF_CALL_SIGNATURE(CopyTypedArrayBuffer)
2990 {
2991     // 6 : 6 input parameters
2992     CallSignature CopyTypedArrayBuffer("CopyTypedArrayBuffer", 0, 6,
2993         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
2994     *callSign = CopyTypedArrayBuffer;
2995     // 6 : 6 input parameters
2996     std::array<VariableType, 6 > params = {
2997         VariableType::JS_POINTER(),
2998         VariableType::JS_POINTER(),
2999         VariableType::INT32(),
3000         VariableType::INT32(),
3001         VariableType::INT32(),
3002         VariableType::INT32()
3003     };
3004     callSign->SetParameters(params.data());
3005     callSign->SetGCLeafFunction(true);
3006     callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
3007 }
3008 
DEF_CALL_SIGNATURE(CreateJSTypedArrayEntries)3009 DEF_CALL_SIGNATURE(CreateJSTypedArrayEntries)
3010 {
3011     // 2 : 2 input parameters
3012     CallSignature signature("CreateJSTypedArrayEntries", 0, 2,
3013         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
3014     *callSign = signature;
3015     // 2 : 2 input parameters
3016     std::array<VariableType, 2> params = {
3017         VariableType::NATIVE_POINTER(),  // glue
3018         VariableType::JS_ANY(),          // obj
3019     };
3020     callSign->SetParameters(params.data());
3021     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
3022 }
3023 
DEF_CALL_SIGNATURE(SameValue)3024 DEF_CALL_SIGNATURE(SameValue)
3025 {
3026     // 3 : 3 input parameters
3027     CallSignature signature("SameValue", 0, 3,
3028         ArgumentsOrder::DEFAULT_ORDER, VariableType::BOOL());
3029     *callSign = signature;
3030     // 3 : 3 input parameters
3031     std::array<VariableType, 3> params = {
3032         VariableType::NATIVE_POINTER(),  // glue
3033         VariableType::JS_ANY(),          // left
3034         VariableType::JS_ANY(),          // right
3035     };
3036     callSign->SetParameters(params.data());
3037     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
3038 }
3039 
DEF_CALL_SIGNATURE(CreateJSTypedArrayKeys)3040 DEF_CALL_SIGNATURE(CreateJSTypedArrayKeys)
3041 {
3042     // 2 : 2 input parameters
3043     CallSignature signature("CreateJSTypedArrayKeys", 0, 2,
3044         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
3045     *callSign = signature;
3046     // 2 : 2 input parameters
3047     std::array<VariableType, 2> params = {
3048         VariableType::NATIVE_POINTER(),  // glue
3049         VariableType::JS_ANY(),          // obj
3050     };
3051     callSign->SetParameters(params.data());
3052     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
3053 }
3054 
DEF_CALL_SIGNATURE(CreateJSTypedArrayValues)3055 DEF_CALL_SIGNATURE(CreateJSTypedArrayValues)
3056 {
3057     // 2 : 2 input parameters
3058     CallSignature signature("CreateJSTypedArrayValues", 0, 2,
3059         ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
3060     *callSign = signature;
3061     // 2 : 2 input parameters
3062     std::array<VariableType, 2> params = {
3063         VariableType::NATIVE_POINTER(),  // glue
3064         VariableType::JS_ANY(),          // obj
3065     };
3066     callSign->SetParameters(params.data());
3067     callSign->SetCallConv(CallSignature::CallConv::CCallConv);
3068 }
3069 }  // namespace panda::ecmascript::kungfu
3070