Skip to content

Commit 82c33dc

Browse files
authored
Merge pull request #22590 from mikeash/remote-mirror-interop-is-swift-mask
[RemoteMirror] Add a call to the interop header to set the upcoming classIsSwiftMask value.
2 parents 13d593d + 2b89074 commit 82c33dc

File tree

3 files changed

+40
-5
lines changed

3 files changed

+40
-5
lines changed

include/swift/SwiftRemoteMirror/SwiftRemoteMirrorLegacyInterop.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,13 @@ static inline void
5555
swift_reflection_interop_destroyReflectionContext(
5656
SwiftReflectionInteropContextRef ContextRef);
5757

58+
/// Set the is-Swift mask for the stable ABI on the current system.
59+
/// NOTE: must be called after interop_addLibrary is used to add the
60+
/// stable ABI remote mirror library in order to take effect.
61+
static inline void
62+
swift_reflection_interop_setClassIsSwiftMask(
63+
SwiftReflectionInteropContextRef ContextRef, uint64_t mask);
64+
5865
static inline int
5966
swift_reflection_interop_addImage(SwiftReflectionInteropContextRef ContextRef,
6067
swift_addr_t imageStart);
@@ -175,6 +182,8 @@ typedef int (*ReadBytesFunctionLegacy)(void *reader_context, swift_addr_t addres
175182
void *dest, uint64_t size);
176183

177184
struct SwiftReflectionFunctions {
185+
unsigned long long *classIsSwiftMaskPtr;
186+
178187
uint16_t (*getSupportedMetadataVersion)(void);
179188

180189
SwiftReflectionContextRef (*createReflectionContext)(
@@ -406,6 +415,8 @@ swift_reflection_interop_loadFunctions(struct SwiftReflectionInteropContext *Con
406415
} while (0)
407416
#define LOAD(name) LOAD_NAMED(name, "swift_reflection_" #name)
408417

418+
Functions->classIsSwiftMaskPtr =
419+
(unsigned long long *)dlsym(Handle, "swift_reflection_classIsSwiftMask");
409420
LOAD(getSupportedMetadataVersion);
410421
uint16_t version = Functions->getSupportedMetadataVersion();
411422
if (version < SWIFT_LEGACY_METADATA_MIN_VERSION)
@@ -575,6 +586,15 @@ swift_reflection_interop_destroyReflectionContext(
575586
free(ContextRef);
576587
}
577588

589+
static inline void
590+
swift_reflection_interop_setClassIsSwiftMask(
591+
SwiftReflectionInteropContextRef ContextRef, uint64_t mask) {
592+
FOREACH_LIBRARY {
593+
if (Library->Functions.classIsSwiftMaskPtr)
594+
*Library->Functions.classIsSwiftMaskPtr = mask;
595+
}
596+
}
597+
578598
#ifndef __LP64__
579599
typedef const struct mach_header MachHeader;
580600
#else

unittests/Reflection/RemoteMirrorInterop/test.m

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,19 @@ int main(int argc, char **argv) {
9696
fprintf(stderr, "Failed to add library at %s\n", argv[i]);
9797
exit(1);
9898
}
99+
100+
unsigned long long *isSwiftMaskPtr = dlsym(
101+
Handle, "swift_reflection_classIsSwiftMask");
102+
if (isSwiftMaskPtr) {
103+
printf("%s has isSwiftMask. Original value is %lld\n",
104+
argv[i], *isSwiftMaskPtr);
105+
swift_reflection_interop_setClassIsSwiftMask(Context, 1);
106+
printf("Set mask to 1, value is now %lld\n", *isSwiftMaskPtr);
107+
swift_reflection_interop_setClassIsSwiftMask(Context, 2);
108+
printf("Set mask to 2, value is now %lld\n", *isSwiftMaskPtr);
109+
} else {
110+
printf("%s does not have isSwiftMask\n", argv[i]);
111+
}
99112
}
100113

101114
int hasLegacy = 0;

unittests/Reflection/RemoteMirrorInterop/test.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,10 @@
2121

2222
absoluteArgs = [os.path.abspath(arg) for arg in args]
2323
swiftcs = [os.path.join(arg, 'bin', 'swiftc') for arg in absoluteArgs]
24-
mirrorlibs = [os.path.join(arg, 'lib', 'swift', 'macosx',
25-
'libswiftRemoteMirror.dylib')
26-
for arg in absoluteArgs]
24+
swiftlibs = [os.path.join(arg, 'lib', 'swift', 'macosx')
25+
for arg in absoluteArgs]
26+
mirrorlibs = [os.path.join(lib, 'libswiftRemoteMirror.dylib')
27+
for lib in swiftlibs]
2728

2829
os.chdir(os.path.dirname(sys.argv[0]))
2930

@@ -37,10 +38,11 @@
3738
'-g', 'test.m'])
3839

3940
# Build a test library with each Swift compiler passed in.
40-
for i, swiftc in enumerate(swiftcs):
41+
for i, (swiftc, swiftlib) in enumerate(zip(swiftcs, swiftlibs)):
4142
subprocess.check_call(
4243
['xcrun', swiftc, '-emit-library', 'test.swift',
43-
'-o', os.path.join('/tmp', 'libtest' + str(i) + '.dylib')])
44+
'-o', os.path.join('/tmp', 'libtest' + str(i) + '.dylib'),
45+
'-Xlinker', '-rpath', '-Xlinker', swiftlib])
4446

4547
# Run the test harness with all combinations of the remote mirror libraries.
4648
for i in range(len(swiftcs) + 1):

0 commit comments

Comments
 (0)