18 const auto& native_calling_convention =
21 const char* test_result =
22 native_calling_convention.ToCString(zone,
true);
24 const int kFilePathLength = 100;
25 char expectation_file_path[kFilePathLength];
27 "runtime/vm/compiler/ffi/unit_tests/%s/%s_%s.expect",
name,
28 kTargetArchitectureName,
kOs);
35 char* expectation_file_contents =
nullptr;
36 ReadFromFile(expectation_file_path, &expectation_file_contents);
37 EXPECT_NOTNULL(expectation_file_contents);
38 if (expectation_file_contents !=
nullptr) {
39 EXPECT_STREQ(expectation_file_contents, test_result);
40 free(expectation_file_contents);
43 return native_calling_convention;
51 const auto& native_signature =
61 arguments.Add(&int8type);
62 arguments.Add(&int8type);
63 arguments.Add(&int8type);
64 arguments.Add(&int8type);
65 arguments.Add(&int8type);
66 arguments.Add(&int8type);
67 arguments.Add(&int8type);
68 arguments.Add(&int8type);
69 arguments.Add(&int8type);
70 arguments.Add(&int8type);
79 arguments.Add(&floatType);
80 arguments.Add(&floatType);
81 arguments.Add(&floatType);
82 arguments.Add(&floatType);
83 arguments.Add(&floatType);
84 arguments.Add(&floatType);
85 arguments.Add(&floatType);
86 arguments.Add(&floatType);
87 arguments.Add(&floatType);
88 arguments.Add(&floatType);
89 arguments.Add(&floatType);
90 arguments.Add(&floatType);
91 arguments.Add(&floatType);
92 arguments.Add(&floatType);
93 arguments.Add(&floatType);
94 arguments.Add(&floatType);
95 arguments.Add(&floatType);
96 arguments.Add(&floatType);
97 arguments.Add(&floatType);
98 arguments.Add(&floatType);
107 arguments.Add(&doubleType);
108 arguments.Add(&doubleType);
109 arguments.Add(&doubleType);
110 arguments.Add(&doubleType);
111 arguments.Add(&doubleType);
112 arguments.Add(&doubleType);
113 arguments.Add(&doubleType);
114 arguments.Add(&doubleType);
115 arguments.Add(&doubleType);
116 arguments.Add(&doubleType);
117 arguments.Add(&doubleType);
118 arguments.Add(&doubleType);
119 arguments.Add(&doubleType);
120 arguments.Add(&doubleType);
121 arguments.Add(&doubleType);
122 arguments.Add(&doubleType);
123 arguments.Add(&doubleType);
124 arguments.Add(&doubleType);
125 arguments.Add(&doubleType);
126 arguments.Add(&doubleType);
132#if defined(TARGET_ARCH_IS_32_BIT)
134#elif defined(TARGET_ARCH_IS_64_BIT)
141 arguments.Add(&intptrType);
142 arguments.Add(&floatType);
143 arguments.Add(&intptrType);
144 arguments.Add(&doubleType);
145 arguments.Add(&intptrType);
146 arguments.Add(&floatType);
147 arguments.Add(&intptrType);
148 arguments.Add(&doubleType);
149 arguments.Add(&intptrType);
150 arguments.Add(&floatType);
151 arguments.Add(&intptrType);
152 arguments.Add(&doubleType);
153 arguments.Add(&intptrType);
154 arguments.Add(&floatType);
155 arguments.Add(&intptrType);
156 arguments.Add(&doubleType);
157 arguments.Add(&intptrType);
158 arguments.Add(&floatType);
159 arguments.Add(&intptrType);
160 arguments.Add(&doubleType);
177 member_types.Add(&int8type);
178 member_types.Add(&int8type);
179 member_types.Add(&int8type);
183 arguments.Add(&struct_type);
184 arguments.Add(&struct_type);
185 arguments.Add(&struct_type);
186 arguments.Add(&struct_type);
187 arguments.Add(&struct_type);
188 arguments.Add(&struct_type);
189 arguments.Add(&struct_type);
190 arguments.Add(&struct_type);
191 arguments.Add(&struct_type);
192 arguments.Add(&struct_type);
218 member_types.Add(&float_type);
219 member_types.Add(&float_type);
220 member_types.Add(&float_type);
221 member_types.Add(&float_type);
225 arguments.Add(&struct_type);
226 arguments.Add(&float_type);
227 arguments.Add(&struct_type);
228 arguments.Add(&struct_type);
229 arguments.Add(&struct_type);
230 arguments.Add(&struct_type);
231 arguments.Add(&struct_type);
232 arguments.Add(&struct_type);
233 arguments.Add(&struct_type);
234 arguments.Add(&struct_type);
235 arguments.Add(&float_type);
236 arguments.Add(&int8type);
237 arguments.Add(&struct_type);
255 full_float_member_types.Add(&float_2_array_type);
256 const auto& float_array_struct_type =
260 member_types.Add(&float_1_array_type);
261 member_types.Add(&float_array_struct_type);
262 member_types.Add(&float_type);
266 arguments.Add(&struct_type);
267 arguments.Add(&float_type);
268 arguments.Add(&struct_type);
269 arguments.Add(&struct_type);
270 arguments.Add(&struct_type);
271 arguments.Add(&struct_type);
272 arguments.Add(&struct_type);
273 arguments.Add(&struct_type);
274 arguments.Add(&struct_type);
275 arguments.Add(&struct_type);
276 arguments.Add(&float_type);
277 arguments.Add(&int8type);
278 arguments.Add(&struct_type);
301 struct_member_types.Add(&float_type);
302 struct_member_types.Add(&float_type);
303 struct_member_types.Add(&float_type);
304 struct_member_types.Add(&float_type);
305 const auto& struct_type =
309 member_types.Add(&float_array_type);
310 member_types.Add(&struct_type);
313 EXPECT_EQ(16, union_type.SizeInBytes());
314 EXPECT(union_type.ContainsHomogeneousFloats());
317 arguments.Add(&union_type);
318 arguments.Add(&union_type);
319 arguments.Add(&union_type);
320 arguments.Add(&union_type);
321 arguments.Add(&union_type);
322 arguments.Add(&union_type);
323 arguments.Add(&union_type);
324 arguments.Add(&union_type);
325 arguments.Add(&union_type);
326 arguments.Add(&int8type);
327 arguments.Add(&union_type);
352 member_types.Add(&int64_type);
353 member_types.Add(&int64_type);
354 member_types.Add(&int64_type);
355 member_types.Add(&int64_type);
356 member_types.Add(&int64_type);
357 member_types.Add(&int64_type);
358 member_types.Add(&int64_type);
359 member_types.Add(&int64_type);
360 member_types.Add(&int64_type);
361 member_types.Add(&int64_type);
362 member_types.Add(&int64_type);
363 member_types.Add(&int64_type);
364 member_types.Add(&int64_type);
365 member_types.Add(&int64_type);
366 member_types.Add(&int64_type);
367 member_types.Add(&int64_type);
371 arguments.Add(&struct_type);
372 arguments.Add(&int32_type);
377#if defined(TARGET_ARCH_X64)
382 const auto& float_type = *
new (
Z) NativePrimitiveType(
kFloat);
383 const auto& int32_type = *
new (
Z) NativePrimitiveType(
kInt32);
386 member_types.Add(&float_type);
387 member_types.Add(&float_type);
388 member_types.Add(&int32_type);
389 member_types.Add(&int32_type);
393 arguments.Add(&struct_type);
394 arguments.Add(&struct_type);
395 arguments.Add(&struct_type);
396 arguments.Add(&struct_type);
397 arguments.Add(&struct_type);
398 arguments.Add(&struct_type);
399 arguments.Add(&struct_type);
400 arguments.Add(&struct_type);
401 arguments.Add(&struct_type);
402 arguments.Add(&struct_type);
403 arguments.Add(&float_type);
412 const auto& float_type = *
new (
Z) NativePrimitiveType(
kFloat);
413 const auto& int32_type = *
new (
Z) NativePrimitiveType(
kInt32);
416 member_types.Add(&float_type);
417 member_types.Add(&float_type);
418 member_types.Add(&int32_type);
419 member_types.Add(&int32_type);
423 arguments.Add(&float_type);
424 arguments.Add(&float_type);
425 arguments.Add(&float_type);
426 arguments.Add(&float_type);
427 arguments.Add(&struct_type);
428 arguments.Add(&struct_type);
429 arguments.Add(&struct_type);
430 arguments.Add(&struct_type);
431 arguments.Add(&struct_type);
432 arguments.Add(&struct_type);
433 arguments.Add(&struct_type);
434 arguments.Add(&struct_type);
435 arguments.Add(&struct_type);
436 arguments.Add(&struct_type);
437 arguments.Add(&int32_type);
463 const auto& float_type = *
new (
Z) NativePrimitiveType(
kFloat);
464 const auto& int32_type = *
new (
Z) NativePrimitiveType(
kInt32);
467 half_float_member_types.Add(&int32_type);
468 half_float_member_types.Add(&float_type);
469 const auto& half_float_type =
472 const auto& float_array_type = *
new (
Z) NativeArrayType(float_type, 1);
474 full_float_member_types.Add(&float_array_type);
475 const auto& full_float_type =
479 member_types.Add(&int32_type);
480 member_types.Add(&half_float_type);
481 member_types.Add(&full_float_type);
485 arguments.Add(&struct_type);
486 arguments.Add(&struct_type);
487 arguments.Add(&struct_type);
488 arguments.Add(&struct_type);
489 arguments.Add(&struct_type);
490 arguments.Add(&struct_type);
491 arguments.Add(&struct_type);
492 arguments.Add(&struct_type);
493 arguments.Add(&struct_type);
494 arguments.Add(&struct_type);
495 arguments.Add(&float_type);
508 member_types.Add(&int8type);
509 member_types.Add(&int8type);
510 member_types.Add(&int8type);
511 member_types.Add(&int8type);
512 member_types.Add(&int8type);
513 member_types.Add(&int8type);
514 member_types.Add(&int8type);
515 member_types.Add(&int8type);
519 arguments.Add(&struct_type);
538 member_types.Add(&int8_type);
539 member_types.Add(&int32_type);
540 member_types.Add(&int8_type);
541 member_types.Add(&int8_type);
542 member_types.Add(&int8_type);
543 const auto& struct_type =
545 EXPECT_EQ(8, struct_type.SizeInBytes());
546 EXPECT(struct_type.ContainsUnalignedMembers());
549 arguments.Add(&struct_type);
550 arguments.Add(&struct_type);
551 arguments.Add(&struct_type);
552 arguments.Add(&struct_type);
553 arguments.Add(&struct_type);
554 arguments.Add(&struct_type);
555 arguments.Add(&struct_type);
556 arguments.Add(&struct_type);
557 arguments.Add(&struct_type);
558 arguments.Add(&struct_type);
580 member_types.Add(&int8_type);
581 member_types.Add(&double_type);
582 const auto& struct_type =
584 EXPECT_EQ(9, struct_type.SizeInBytes());
585 EXPECT(struct_type.ContainsUnalignedMembers());
588 arguments.Add(&struct_type);
589 arguments.Add(&struct_type);
590 arguments.Add(&struct_type);
591 arguments.Add(&struct_type);
592 arguments.Add(&struct_type);
593 arguments.Add(&struct_type);
594 arguments.Add(&struct_type);
595 arguments.Add(&struct_type);
596 arguments.Add(&struct_type);
597 arguments.Add(&struct_type);
598 arguments.Add(&double_type);
599 arguments.Add(&int32_type);
600 arguments.Add(&int32_type);
619 inner_members.Add(&uint8_type);
620 inner_members.Add(&uint32_type);
621 const intptr_t packing = 1;
622 const auto& struct_type =
629 member_types.Add(&struct_type);
632 EXPECT_EQ(5, union_type.SizeInBytes());
633 EXPECT_EQ(1, union_type.AlignmentInBytesField());
636 arguments.Add(&union_type);
637 arguments.Add(&union_type);
638 arguments.Add(&union_type);
639 arguments.Add(&union_type);
640 arguments.Add(&union_type);
641 arguments.Add(&union_type);
642 arguments.Add(&union_type);
643 arguments.Add(&union_type);
644 arguments.Add(&union_type);
645 arguments.Add(&union_type);
657 member_types.Add(&uint64_type);
660 EXPECT_EQ(8, struct_type.SizeInBytes());
664 const auto& native_calling_convention =
667#if defined(TARGET_ARCH_IA32) && \
668 (defined(DART_TARGET_OS_ANDROID) || defined(DART_TARGET_OS_LINUX))
670 EXPECT_EQ(4, native_calling_convention.StackTopInBytes());
672 EXPECT_EQ(0, native_calling_convention.StackTopInBytes());
686 member_types.Add(&float_type);
687 member_types.Add(&float_type);
688 member_types.Add(&float_type);
691#if defined(TARGET_ARCH_ARM64) && \
692 (defined(DART_TARGET_OS_MACOS) || defined(DART_TARGET_OS_MACOS_IOS))
693 EXPECT_EQ(4, struct_type.AlignmentInBytesStack());
697 arguments.Add(&struct_type);
698 arguments.Add(&struct_type);
699 arguments.Add(&struct_type);
700 arguments.Add(&struct_type);
701 arguments.Add(&struct_type);
702 arguments.Add(&struct_type);
718#if defined(TARGET_ARCH_IS_32_BIT)
720#elif defined(TARGET_ARCH_IS_64_BIT)
728 arguments.Add(&intptr_type);
729 arguments.Add(&double_type);
730 arguments.Add(&int32_type);
731 arguments.Add(&double_type);
732 arguments.Add(&int32_type);
733 arguments.Add(&intptr_type);
734 arguments.Add(&intptr_type);
744#if defined(TARGET_ARCH_IS_32_BIT)
746#elif defined(TARGET_ARCH_IS_64_BIT)
751 arguments.Add(&intptr_type);
752 arguments.Add(&intptr_type);
753 arguments.Add(&intptr_type);
754 arguments.Add(&intptr_type);
755 arguments.Add(&intptr_type);
758 arguments, intptr_type, 1);
771 arguments.Add(&double_type);
772 arguments.Add(&double_type);
773 arguments.Add(&double_type);
774 arguments.Add(&double_type);
775 arguments.Add(&double_type);
778 arguments, double_type, 1);
792 member_types.Add(&float_type);
793 member_types.Add(&float_type);
794 member_types.Add(&float_type);
795 member_types.Add(&float_type);
796 member_types.Add(&float_type);
800 arguments.Add(&double_type);
801 arguments.Add(&struct_type);
802 arguments.Add(&double_type);
805 arguments, double_type, 1);
816 NativeCallingConvention_variadic_with_homogenous_struct) {
823 member_types.Add(&float_type);
824 member_types.Add(&float_type);
825 member_types.Add(&float_type);
829 arguments.Add(&double_type);
830 arguments.Add(&double_type);
831 arguments.Add(&double_type);
832 arguments.Add(&double_type);
833 arguments.Add(&double_type);
834 arguments.Add(&double_type);
835 arguments.Add(&double_type);
836 arguments.Add(&double_type);
837 arguments.Add(&float_type);
840 arguments.Add(&int64_type);
841 arguments.Add(&int32_type);
846 arguments, double_type, 11);
860 member_types.Add(&double_type);
861 member_types.Add(&double_type);
862 member_types.Add(&double_type);
863 member_types.Add(&double_type);
867 arguments.Add(&double_type);
868 arguments.Add(&double_type);
875 arguments, double_type, 1);
892#if defined(TARGET_ARCH_IS_32_BIT)
894#elif defined(TARGET_ARCH_IS_64_BIT)
899 arguments.Add(&int32_type);
900 arguments.Add(&int64_type);
901 arguments.Add(&intptr_type);
904 arguments, int32_type, 2);
914#if defined(TARGET_ARCH_IS_32_BIT)
917#elif defined(TARGET_ARCH_IS_64_BIT)
923 member_types.Add(&halfptr_type);
924 member_types.Add(&halfptr_type);
925 member_types.Add(&halfptr_type);
930 arguments.Add(&intptr_type);
932 arguments.Add(&struct_type);
934 const auto& native_signature =
945 NativeCallingConvention_variadic_stradle_last_register) {
946#if defined(TARGET_ARCH_IS_32_BIT)
949#elif defined(TARGET_ARCH_IS_64_BIT)
955 member_types.Add(&halfptr_type);
956 member_types.Add(&halfptr_type);
957 member_types.Add(&halfptr_type);
962 arguments.Add(&intptr_type);
964 arguments.Add(&struct_type);
967 arguments, intptr_type, 1);
977#if defined(TARGET_ARCH_IS_32_BIT)
979#elif defined(TARGET_ARCH_IS_64_BIT)
984 for (intptr_t
i = 0;
i < 12;
i++) {
985 arguments.Add(&halfptr_type);
989 arguments, halfptr_type, 1);
static constexpr intptr_t kNumArgRegs
static void Print(const char *format,...) PRINTF_ATTRIBUTE(1
static int SNPrint(char *str, size_t size, const char *format,...) PRINTF_ATTRIBUTE(3
static const NativeCallingConvention & FromSignature(Zone *zone, const NativeFunctionType &signature)
static NativeStructType & FromNativeTypes(Zone *zone, const NativeTypes &members, intptr_t member_packing=kMaxInt32)
static NativeUnionType & FromNativeTypes(Zone *zone, const NativeTypes &members)
static bool update_expectations
UNIT_TEST_CASE_WITH_ZONE(NativeCallingConvention_int8x10)
void WriteToFile(char *path, const char *contents)
const NativeCallingConvention & RunSignatureTest(dart::Zone *zone, const char *name, const NativeFunctionType &native_signature)
ZoneGrowableArray< const NativeType * > NativeTypes
void ReadFromFile(char *path, char **buffer_pointer)
def array_type(data_type)