Skip to content

Commit 3d3dafb

Browse files
authored
Merge pull request #22534 from slavapestov/remoteast-fixes-part-1
Small RemoteAST fixes
2 parents 552dcd8 + 94a6ca3 commit 3d3dafb

File tree

3 files changed

+44
-25
lines changed

3 files changed

+44
-25
lines changed

include/swift/Remote/MetadataReader.h

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@ class MetadataReader {
202202
StoredPointer TaggedPointerExtendedSlotShift;
203203
StoredPointer TaggedPointerExtendedSlotMask;
204204
StoredPointer TaggedPointerExtendedClasses;
205+
StoredPointer TaggedPointerObfuscator;
205206

206207
Demangle::NodeFactory Factory;
207208

@@ -502,14 +503,14 @@ class MetadataReader {
502503
if (!readObjCClassName(MetadataAddress, className))
503504
return BuiltType();
504505

505-
auto BuiltObjCClass = Builder.createObjCClassType(std::move(className));
506+
BuiltType BuiltObjCClass = Builder.createObjCClassType(std::move(className));
506507
if (!BuiltObjCClass) {
507508
// Try the superclass.
508509
if (!classMeta->Superclass)
509510
return BuiltType();
510511

511-
return readTypeFromMetadata(classMeta->Superclass,
512-
skipArtificialSubclasses);
512+
BuiltObjCClass = readTypeFromMetadata(classMeta->Superclass,
513+
skipArtificialSubclasses);
513514
}
514515

515516
TypeCache[MetadataAddress] = BuiltObjCClass;
@@ -711,7 +712,7 @@ class MetadataReader {
711712
if (getTaggedPointerEncoding() != TaggedPointerEncodingKind::Extended)
712713
return false;
713714

714-
return objectAddress & TaggedPointerMask;
715+
return (objectAddress ^ TaggedPointerObfuscator) & TaggedPointerMask;
715716
}
716717

717718
/// Read the isa pointer of an Object-C tagged pointer value.
@@ -728,8 +729,8 @@ class MetadataReader {
728729

729730
// Extended pointers have a tag of 0b111, using 8 additional bits
730731
// to specify the class.
731-
if (TaggedPointerExtendedMask != 0 &&
732-
((objectAddress & TaggedPointerExtendedMask)
732+
if (TaggedPointerExtendedMask != 0 &&
733+
(((objectAddress ^ TaggedPointerObfuscator) & TaggedPointerExtendedMask)
733734
== TaggedPointerExtendedMask)) {
734735
auto tag = ((objectAddress >> TaggedPointerExtendedSlotShift) &
735736
TaggedPointerExtendedSlotMask);
@@ -2436,6 +2437,9 @@ class MetadataReader {
24362437
TaggedPointerExtendedClasses =
24372438
TaggedPointerExtendedClassesAddr.getAddressData();
24382439

2440+
tryFindAndReadSymbol(TaggedPointerObfuscator,
2441+
"objc_debug_taggedpointer_obfuscator");
2442+
24392443
# undef tryFindSymbol
24402444
# undef tryReadSymbol
24412445
# undef tryFindAndReadSymbol

test/RemoteAST/existentials_objc.swift

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,22 @@ func printDynamicTypeAndAddressForExistential<T>(_: T)
1212
// CHECK: NSObject
1313
printDynamicTypeAndAddressForExistential(NSObject() as AnyObject)
1414

15+
// Print tagged pointer types three times to ensure the caching works.
16+
17+
// CHECK: NSNumber
18+
printDynamicTypeAndAddressForExistential(NSNumber(123) as AnyObject)
19+
20+
// CHECK: NSNumber
21+
printDynamicTypeAndAddressForExistential(NSNumber(123) as AnyObject)
22+
1523
// CHECK: NSNumber
1624
printDynamicTypeAndAddressForExistential(NSNumber(123) as AnyObject)
25+
26+
// CHECK: NSString
27+
printDynamicTypeAndAddressForExistential(NSString("hello") as AnyObject)
28+
29+
// CHECK: NSString
30+
printDynamicTypeAndAddressForExistential(NSString("hello") as AnyObject)
31+
32+
// CHECK: NSString
33+
printDynamicTypeAndAddressForExistential(NSString("hello") as AnyObject)

tools/swift-remoteast-test/swift-remoteast-test.cpp

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,24 @@ using namespace swift::remoteAST;
4040
/// The context for the code we're running. Set by the observer.
4141
static ASTContext *Context = nullptr;
4242

43+
/// The RemoteAST for the code we're running.
44+
std::shared_ptr<MemoryReader> reader;
45+
std::unique_ptr<RemoteASTContext> remoteContext;
46+
47+
static RemoteASTContext &getRemoteASTContext() {
48+
if (remoteContext)
49+
return *remoteContext;
50+
51+
std::shared_ptr<MemoryReader> reader(new InProcessMemoryReader());
52+
remoteContext.reset(new RemoteASTContext(*Context, std::move(reader)));
53+
return *remoteContext;
54+
}
55+
4356
// FIXME: swiftcall
4457
/// func printType(forMetadata: Any.Type)
4558
LLVM_ATTRIBUTE_USED extern "C" void SWIFT_REMOTEAST_TEST_ABI
4659
printMetadataType(const Metadata *typeMetadata) {
47-
assert(Context && "context was not set");
48-
49-
std::shared_ptr<MemoryReader> reader(new InProcessMemoryReader());
50-
RemoteASTContext remoteAST(*Context, std::move(reader));
51-
60+
auto &remoteAST = getRemoteASTContext();
5261
auto &out = llvm::outs();
5362

5463
auto result =
@@ -66,11 +75,7 @@ printMetadataType(const Metadata *typeMetadata) {
6675
/// func printDynamicType(_: AnyObject)
6776
LLVM_ATTRIBUTE_USED extern "C" void SWIFT_REMOTEAST_TEST_ABI
6877
printHeapMetadataType(void *object) {
69-
assert(Context && "context was not set");
70-
71-
std::shared_ptr<MemoryReader> reader(new InProcessMemoryReader());
72-
RemoteASTContext remoteAST(*Context, std::move(reader));
73-
78+
auto &remoteAST = getRemoteASTContext();
7479
auto &out = llvm::outs();
7580

7681
auto metadataResult =
@@ -94,11 +99,7 @@ printHeapMetadataType(void *object) {
9499

95100
static void printMemberOffset(const Metadata *typeMetadata,
96101
StringRef memberName, bool passMetadata) {
97-
assert(Context && "context was not set");
98-
99-
std::shared_ptr<MemoryReader> reader(new InProcessMemoryReader());
100-
RemoteASTContext remoteAST(*Context, std::move(reader));
101-
102+
auto &remoteAST = getRemoteASTContext();
102103
auto &out = llvm::outs();
103104

104105
// The first thing we have to do is get the type.
@@ -147,10 +148,7 @@ printTypeMetadataMemberOffset(const Metadata *typeMetadata,
147148
LLVM_ATTRIBUTE_USED extern "C" void SWIFT_REMOTEAST_TEST_ABI
148149
printDynamicTypeAndAddressForExistential(void *object,
149150
const Metadata *typeMetadata) {
150-
assert(Context && "context was not set");
151-
std::shared_ptr<MemoryReader> reader(new InProcessMemoryReader());
152-
RemoteASTContext remoteAST(*Context, std::move(reader));
153-
151+
auto &remoteAST = getRemoteASTContext();
154152
auto &out = llvm::outs();
155153

156154
// First, retrieve the static type of the existential, so we can understand

0 commit comments

Comments
 (0)