File: small-structs-64-bit-pass-return-direct-in-c.swift

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (137 lines) | stat: -rw-r--r-- 6,296 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
// RUN: %empty-directory(%t)
// RUN: %target-swift-frontend %s -typecheck -module-name Structs -clang-header-expose-decls=all-public -emit-clang-header-path %t/structs.h
// RUN: %FileCheck %s < %t/structs.h

// RUN: %check-interop-c-header-in-clang(%t/structs.h -Wno-unused-function)

// REQUIRES: PTRSIZE=64

public struct StructTwoI32 {
    let x, y: Int32
}

public struct StructOneI16AndOneStruct {
    let x: Int16
    let y: StructTwoI32
}

public struct StructI8AndU32AndI16 {
    let x: Int8
    let y: UInt32
    let z: Int16
}

// CHECK:      struct Structs_StructI8AndU32AndI16 {
// CHECK-NEXT:   _Alignas(4) char _storage[10];
// CHECK-NEXT: };

// CHECK:      struct Structs_StructOneI16AndOneStruct {
// CHECK-NEXT:   _Alignas(4) char _storage[12];
// CHECK-NEXT: };

// CHECK:      struct Structs_StructTwoI32 {
// CHECK-NEXT:   _Alignas(4) char _storage[8];
// CHECK-NEXT: };

public func returnNewStructTwoI32(_ x: Int32) -> StructTwoI32 { return StructTwoI32(x: x, y: x * 2) }

public func passThroughStructTwoI32(_ i: Int32, _ x: StructTwoI32, _ j: Int32) -> StructTwoI32 {
    return StructTwoI32(x: x.x + i, y: x.y + j)
}

public func printStructTwoI32(_ x: StructTwoI32) {
    print("StructTwoI32.x = \(x.x), y = \(x.y)")
}

public func returnNewStructOneI16AndOneStruct() -> StructOneI16AndOneStruct {
    return StructOneI16AndOneStruct(x: 0xFF, y: StructTwoI32(x: 5, y: 72))
}

public func printStructStructTwoI32_and_OneI16AndOneStruct(_ y: StructTwoI32, _ x: StructOneI16AndOneStruct) {
    printStructTwoI32(y)
    print("StructOneI16AndOneStruct.x = \(x.x), y.x = \(x.y.x), y.y = \(x.y.y)")
}

public func returnNewStructI8AndU32AndI16() -> StructI8AndU32AndI16 {
    return StructI8AndU32AndI16(x: -100, y: 123456, z: -3456)
}

public func printStructI8AndU32AndI16(_ x: StructI8AndU32AndI16) {
    print("StructI8AndU32AndI16.x = \(x.x), y = \(x.y), z = \(x.z)")
}

// CHECK:      struct swift_interop_returnStub_Structs_uint64_t_0_8 {
// CHECK-NEXT:  uint64_t _1;
// CHECK-NEXT: };

// CHECK:      static SWIFT_C_INLINE_THUNK void swift_interop_returnDirect_Structs_uint64_t_0_8(char * _Nonnull result, struct swift_interop_returnStub_Structs_uint64_t_0_8 value) {
// CHECK-NEXT:  memcpy(result + 0, &value._1, 8);
// CHECK-NEXT: }

// CHECK:      struct swift_interop_passStub_Structs_uint64_t_0_8 {
// CHECK-NEXT:  uint64_t _1;
// CHECK-NEXT: };

// CHECK:      static SWIFT_C_INLINE_THUNK struct swift_interop_passStub_Structs_uint64_t_0_8 swift_interop_passDirect_Structs_uint64_t_0_8(const char * _Nonnull value) {
// CHECK-NEXT:  struct swift_interop_passStub_Structs_uint64_t_0_8 result;
// CHECK-NEXT:  memcpy(&result._1, value + 0, 8);
// CHECK-NEXT:  return result;
// CHECK-NEXT: }

// CHECK:      SWIFT_EXTERN struct swift_interop_returnStub_Structs_uint64_t_0_8 $s7Structs23passThroughStructTwoI32yAA0deF0Vs5Int32V_AdFtF(int32_t i, struct swift_interop_passStub_Structs_uint64_t_0_8 x, int32_t j) SWIFT_NOEXCEPT SWIFT_CALL;

// CHECK:      struct swift_interop_passStub_Structs_uint64_t_0_8_uint16_t_8_10 {
// CHECK-NEXT:  uint64_t _1;
// CHECK-NEXT:  uint16_t _2;
// CHECK-NEXT: };

// CHECK:      static SWIFT_C_INLINE_THUNK struct swift_interop_passStub_Structs_uint64_t_0_8_uint16_t_8_10 swift_interop_passDirect_Structs_uint64_t_0_8_uint16_t_8_10(const char * _Nonnull value) {
// CHECK-NEXT:  struct swift_interop_passStub_Structs_uint64_t_0_8_uint16_t_8_10 result;
// CHECK-NEXT:  memcpy(&result._1, value + 0, 8);
// CHECK-NEXT:  memcpy(&result._2, value + 8, 2);
// CHECK-NEXT:  return result;
// CHECK-NEXT: }

// CHECK:      SWIFT_EXTERN void $s7Structs019printStructI8AndU32E3I16yyAA0cdefeG0VF(struct swift_interop_passStub_Structs_uint64_t_0_8_uint16_t_8_10 x) SWIFT_NOEXCEPT SWIFT_CALL;

// CHECK:      struct swift_interop_passStub_Structs_uint64_t_0_8_uint32_t_8_12 {
// CHECK-NEXT:  uint64_t _1;
// CHECK-NEXT:  uint32_t _2;
// CHECK-NEXT: };

// CHECK:      static SWIFT_C_INLINE_THUNK struct swift_interop_passStub_Structs_uint64_t_0_8_uint32_t_8_12 swift_interop_passDirect_Structs_uint64_t_0_8_uint32_t_8_12(const char * _Nonnull value) {
// CHECK-NEXT:  struct swift_interop_passStub_Structs_uint64_t_0_8_uint32_t_8_12 result;
// CHECK-NEXT:  memcpy(&result._1, value + 0, 8);
// CHECK-NEXT:  memcpy(&result._2, value + 8, 4);
// CHECK-NEXT:  return result;
// CHECK-NEXT: }

// CHECK:      SWIFT_EXTERN void $s7Structs011printStructc20TwoI32_and_OneI16AndgC0yyAA0cdE0V_AA0cghigC0VtF(struct swift_interop_passStub_Structs_uint64_t_0_8 y, struct swift_interop_passStub_Structs_uint64_t_0_8_uint32_t_8_12 x) SWIFT_NOEXCEPT SWIFT_CALL;

// CHECK:      SWIFT_EXTERN void $s7Structs17printStructTwoI32yyAA0cdE0VF(struct swift_interop_passStub_Structs_uint64_t_0_8 x) SWIFT_NOEXCEPT SWIFT_CALL;

// CHECK: struct swift_interop_returnStub_Structs_uint64_t_0_8_uint16_t_8_10 {
// CHECK-NEXT:   uint64_t _1;
// CHECK-NEXT:   uint16_t _2;
// CHECK-NEXT: };
// CHECK-EMPTY:
// CHECK-NEXT: static SWIFT_C_INLINE_THUNK void swift_interop_returnDirect_Structs_uint64_t_0_8_uint16_t_8_10(char * _Nonnull result, struct swift_interop_returnStub_Structs_uint64_t_0_8_uint16_t_8_10 value) {
// CHECK-NEXT:   memcpy(result + 0, &value._1, 8);
// CHECK-NEXT:   memcpy(result + 8, &value._2, 2);
// CHECK-NEXT: }
// CHECK-EMPTY:
// CHECK:      SWIFT_EXTERN struct swift_interop_returnStub_Structs_uint64_t_0_8_uint16_t_8_10 $s7Structs023returnNewStructI8AndU32F3I16AA0defgfH0VyF(void) SWIFT_NOEXCEPT SWIFT_CALL;

// CHECK: struct swift_interop_returnStub_Structs_uint64_t_0_8_uint32_t_8_12 {
// CHECK-NEXT:   uint64_t _1;
// CHECK-NEXT:   uint32_t _2;
// CHECK-NEXT: };

// CHECK: static SWIFT_C_INLINE_THUNK void swift_interop_returnDirect_Structs_uint64_t_0_8_uint32_t_8_12(char * _Nonnull result, struct swift_interop_returnStub_Structs_uint64_t_0_8_uint32_t_8_12 value) {
// CHECK-NEXT:   memcpy(result + 0, &value._1, 8);
// CHECK-NEXT:   memcpy(result + 8, &value._2, 4);
// CHECK-NEXT: }

// CHECK:      SWIFT_EXTERN struct swift_interop_returnStub_Structs_uint64_t_0_8_uint32_t_8_12 $s7Structs024returnNewStructOneI16AndeD0AA0defgeD0VyF(void) SWIFT_NOEXCEPT SWIFT_CALL;

// CHECK:      SWIFT_EXTERN struct swift_interop_returnStub_Structs_uint64_t_0_8 $s7Structs21returnNewStructTwoI32yAA0deF0Vs5Int32VF(int32_t x) SWIFT_NOEXCEPT SWIFT_CALL;