Skip to content

Commit b8ee625

Browse files
committed
[interop][SwiftToCxx] fix aligned allocation refs
1 parent 5c3b4ca commit b8ee625

File tree

4 files changed

+22
-2
lines changed

4 files changed

+22
-2
lines changed

lib/PrintAsClang/PrintAsClang.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,8 @@ static void writePrologue(raw_ostream &out, ASTContext &ctx,
103103
"#include <cstddef>\n"
104104
"#include <cstdbool>\n"
105105
"#include <cstring>\n";
106-
out << "#include <cstdlib>\n";
106+
out << "#include <stdlib.h>\n";
107+
out << "#if defined(_WIN32)\n#include <malloc.h>\n#endif\n";
107108
},
108109
[&] {
109110
out << "#include <stdint.h>\n"

lib/PrintAsClang/PrintSwiftToClangCoreScaffold.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,14 +120,22 @@ static void printTypeMetadataResponseType(SwiftToClangInteropContext &ctx,
120120

121121
static void printOpaqueAllocFee(raw_ostream &os) {
122122
os << R"text(inline void * _Nonnull opaqueAlloc(size_t size, size_t align) {
123+
#if defined(_WIN32)
124+
void *r = _aligned_malloc(size, align);
125+
#else
123126
if (align < sizeof(void *)) align = sizeof(void *);
124127
void *r = nullptr;
125128
int res = posix_memalign(&r, align, size);
126129
(void)res;
130+
#endif
127131
return r;
128132
}
129133
inline void opaqueFree(void * _Nonnull p) {
134+
#if defined(_WIN32)
135+
_aligned_free(p);
136+
#else
130137
free(p);
138+
#endif
131139
}
132140
)text";
133141
}

test/Interop/SwiftToCxx/core/swift-impl-defs-in-cxx.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,14 +52,22 @@
5252
// CHECK-NEXT: #endif
5353
// CHECK-EMPTY:
5454
// CHECK-NEXT: inline void * _Nonnull opaqueAlloc(size_t size, size_t align) {
55+
// CHECK-NEXT: #if defined(_WIN32)
56+
// CHECK-NEXT: void *r = _aligned_malloc(size, align);
57+
// CHECK-NEXT: #else
5558
// CHECK-NEXT: if (align < sizeof(void *)) align = sizeof(void *);
5659
// CHECK-NEXT: void *r = nullptr;
5760
// CHECK-NEXT: int res = posix_memalign(&r, align, size);
5861
// CHECK-NEXT: (void)res;
62+
// CHECK-NEXT: #endif
5963
// CHECK-NEXT: return r;
6064
// CHECK-NEXT: }
6165
// CHECK-NEXT: inline void opaqueFree(void * _Nonnull p) {
66+
// CHECK-NEXT: #if defined(_WIN32)
67+
// CHECK-NEXT: _aligned_free(p);
68+
// CHECK-NEXT: #else
6269
// CHECK-NEXT: free(p);
70+
// CHECK-NEXT: #endif
6371
// CHECK-NEXT: }
6472
// CHECK-EMPTY:
6573
// CHECK-NEXT: /// Container for an opaque Swift value, like resilient struct.

test/PrintAsCxx/empty.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,10 @@
2929
// CHECK-NEXT: #include <cstddef>
3030
// CHECK-NEXT: #include <cstdbool>
3131
// CHECK-NEXT: #include <cstring>
32-
// CHECK-NEXT: #include <cstdlib>
32+
// CHECK-NEXT: #include <stdlib.h>
33+
// CHECK-NEXT: #if defined(_WIN32)
34+
// CHECK-NEXT: #include <malloc.h>
35+
// CHECK-NEXT: #endif
3336
// CHECK-NEXT: #else
3437
// CHECK-NEXT: #include <stdint.h>
3538
// CHECK-NEXT: #include <stddef.h>

0 commit comments

Comments
 (0)