@@ -43,26 +43,29 @@ using TypeDecoder = swift::Demangle::TypeDecoder<BuilderType>;
43
43
44
44
// / A pointer to the local buffer of an object that also remembers the
45
45
// / address at which it was stored remotely.
46
- template <typename Runtime, typename T>
46
+ template <typename T>
47
47
class RemoteRef {
48
- public:
49
- using StoredPointer = typename Runtime::StoredPointer;
50
-
51
48
private:
52
- StoredPointer Address;
49
+ uint64_t Address;
53
50
const T *LocalBuffer;
54
51
55
52
public:
56
53
/* implicit*/
57
54
RemoteRef (std::nullptr_t _)
58
55
: Address(0 ), LocalBuffer(nullptr ) {}
59
56
57
+ template <typename StoredPointer>
60
58
explicit RemoteRef (StoredPointer address, const T *localBuffer)
61
- : Address(address), LocalBuffer(localBuffer) {}
59
+ : Address(( uint64_t ) address), LocalBuffer(localBuffer) {}
62
60
63
- StoredPointer getAddress () const {
61
+ uint64_t getAddressData () const {
64
62
return Address;
65
63
}
64
+
65
+ template <typename Runtime>
66
+ typename Runtime::StoredPointer getAddress () const {
67
+ return (typename Runtime::StoredPointer)getAddressData ();
68
+ }
66
69
67
70
const T *getLocalBuffer () const {
68
71
return LocalBuffer;
@@ -76,6 +79,14 @@ class RemoteRef {
76
79
assert (LocalBuffer);
77
80
return LocalBuffer;
78
81
}
82
+
83
+ bool operator ==(RemoteRef<T> other) const {
84
+ return Address == other.Address ;
85
+ }
86
+
87
+ bool operator !=(RemoteRef<T> other) const {
88
+ return !operator ==(other);
89
+ }
79
90
};
80
91
81
92
// / A structure, designed for use with std::unique_ptr, which destroys
@@ -127,17 +138,15 @@ class MetadataReader {
127
138
// / A cache of built types, keyed by the address of the type.
128
139
std::unordered_map<StoredPointer, BuiltType> TypeCache;
129
140
130
- using MetadataRef =
131
- RemoteRef<Runtime, TargetMetadata<Runtime>>;
141
+ using MetadataRef = RemoteRef<TargetMetadata<Runtime>>;
132
142
using OwnedMetadataRef =
133
143
std::unique_ptr<const TargetMetadata<Runtime>, delete_with_free>;
134
144
135
145
// / A cache of read type metadata, keyed by the address of the metadata.
136
146
std::unordered_map<StoredPointer, OwnedMetadataRef>
137
147
MetadataCache;
138
148
139
- using ContextDescriptorRef =
140
- RemoteRef<Runtime, TargetContextDescriptor<Runtime>>;
149
+ using ContextDescriptorRef = RemoteRef<TargetContextDescriptor<Runtime>>;
141
150
using OwnedContextDescriptorRef =
142
151
std::unique_ptr<const TargetContextDescriptor<Runtime>,
143
152
delete_with_free>;
@@ -1166,7 +1175,7 @@ class MetadataReader {
1166
1175
return None;
1167
1176
1168
1177
auto addressOfGenericArgAddress =
1169
- (Meta.getAddress () +
1178
+ (Meta.template getAddress <Runtime> () +
1170
1179
*offsetToGenericArgs * sizeof (StoredPointer) +
1171
1180
index * sizeof (StoredPointer));
1172
1181
@@ -1292,29 +1301,31 @@ class MetadataReader {
1292
1301
1293
1302
template <typename Base, typename Field>
1294
1303
StoredPointer resolveRelativeField (
1295
- RemoteRef<Runtime, Base> base, const Field &field) {
1304
+ RemoteRef<Base> base, const Field &field) {
1296
1305
// Map the offset from within our local buffer to the remote address.
1297
1306
auto distance = (intptr_t )&field - (intptr_t )base.getLocalBuffer ();
1298
- return resolveRelativeOffset<int32_t >(base.getAddress () + distance);
1307
+ return resolveRelativeOffset<int32_t >(
1308
+ base.template getAddress <Runtime>() + distance);
1299
1309
}
1300
1310
1301
1311
template <typename Base, typename Field>
1302
1312
Optional<StoredPointer> resolveNullableRelativeField (
1303
- RemoteRef<Runtime, Base> base, const Field &field) {
1313
+ RemoteRef<Base> base, const Field &field) {
1304
1314
// Map the offset from within our local buffer to the remote address.
1305
1315
auto distance = (intptr_t )&field - (intptr_t )base.getLocalBuffer ();
1306
1316
1307
- return resolveNullableRelativeOffset<int32_t >(base.getAddress () + distance);
1317
+ return resolveNullableRelativeOffset<int32_t >(
1318
+ base.template getAddress <Runtime>() + distance);
1308
1319
}
1309
1320
1310
1321
template <typename Base, typename Field>
1311
1322
Optional<StoredPointer> resolveNullableRelativeIndirectableField (
1312
- RemoteRef<Runtime, Base> base, const Field &field) {
1323
+ RemoteRef<Base> base, const Field &field) {
1313
1324
// Map the offset from within our local buffer to the remote address.
1314
1325
auto distance = (intptr_t )&field - (intptr_t )base.getLocalBuffer ();
1315
1326
1316
1327
return resolveNullableRelativeIndirectableOffset<int32_t >(
1317
- base.getAddress () + distance);
1328
+ base.template getAddress <Runtime> () + distance);
1318
1329
}
1319
1330
1320
1331
// / Given a pointer to an Objective-C class, try to read its class name.
@@ -1838,7 +1849,8 @@ class MetadataReader {
1838
1849
const RelativeTargetProtocolDescriptorPointer<Runtime> &protocol) {
1839
1850
// Map the offset from within our local buffer to the remote address.
1840
1851
auto distance = (intptr_t )&protocol - (intptr_t )descriptor.getLocalBuffer ();
1841
- StoredPointer targetAddress (descriptor.getAddress () + distance);
1852
+ StoredPointer targetAddress (
1853
+ descriptor.template getAddress <Runtime>() + distance);
1842
1854
1843
1855
// Read the relative offset.
1844
1856
int32_t relative;
@@ -2071,7 +2083,8 @@ class MetadataReader {
2071
2083
// address.
2072
2084
auto distance =
2073
2085
(intptr_t )&req.Layout - (intptr_t )descriptor.getLocalBuffer ();
2074
- StoredPointer targetAddress (descriptor.getAddress () + distance);
2086
+ StoredPointer targetAddress (
2087
+ descriptor.template getAddress <Runtime>() + distance);
2075
2088
2076
2089
GenericRequirementLayoutKind kind;
2077
2090
if (!Reader->readBytes (RemoteAddress (targetAddress),
@@ -2106,7 +2119,7 @@ class MetadataReader {
2106
2119
// Use the remote address to identify the anonymous context.
2107
2120
char addressBuf[18 ];
2108
2121
snprintf (addressBuf, sizeof (addressBuf), " $%" PRIx64,
2109
- (uint64_t )descriptor.getAddress ());
2122
+ (uint64_t )descriptor.getAddressData ());
2110
2123
auto anonNode = dem.createNode (Node::Kind::AnonymousContext);
2111
2124
CharVector addressStr;
2112
2125
addressStr.append (addressBuf, dem);
@@ -2269,7 +2282,7 @@ class MetadataReader {
2269
2282
if (!offsetToGenericArgs)
2270
2283
return {};
2271
2284
2272
- auto genericArgsAddr = metadata.getAddress ()
2285
+ auto genericArgsAddr = metadata.template getAddress <Runtime> ()
2273
2286
+ sizeof (StoredPointer) * *offsetToGenericArgs;
2274
2287
2275
2288
std::vector<BuiltType> builtSubsts;
@@ -2326,9 +2339,8 @@ class MetadataReader {
2326
2339
2327
2340
// If we've skipped an artificial subclasses, check the cache at
2328
2341
// the superclass. (This also protects against recursion.)
2329
- if (skipArtificialSubclasses &&
2330
- metadata.getAddress () != origMetadata.getAddress ()) {
2331
- auto it = TypeCache.find (metadata.getAddress ());
2342
+ if (skipArtificialSubclasses && metadata != origMetadata) {
2343
+ auto it = TypeCache.find (metadata.template getAddress <Runtime>());
2332
2344
if (it != TypeCache.end ())
2333
2345
return it->second ;
2334
2346
}
@@ -2358,13 +2370,12 @@ class MetadataReader {
2358
2370
if (!nominal)
2359
2371
return BuiltType ();
2360
2372
2361
- TypeCache[metadata.getAddress ()] = nominal;
2373
+ TypeCache[metadata.template getAddress <Runtime> ()] = nominal;
2362
2374
2363
2375
// If we've skipped an artificial subclass, remove the
2364
2376
// recursion-protection entry we made for it.
2365
- if (skipArtificialSubclasses &&
2366
- metadata.getAddress () != origMetadata.getAddress ()) {
2367
- TypeCache.erase (origMetadata.getAddress ());
2377
+ if (skipArtificialSubclasses && metadata != origMetadata) {
2378
+ TypeCache.erase (origMetadata.template getAddress <Runtime>());
2368
2379
}
2369
2380
2370
2381
return nominal;
@@ -2377,7 +2388,8 @@ class MetadataReader {
2377
2388
return readNominalTypeFromMetadata (origMetadata, skipArtificialSubclasses);
2378
2389
2379
2390
std::string className;
2380
- if (!readObjCClassName (origMetadata.getAddress (), className))
2391
+ auto origMetadataPtr = origMetadata.template getAddress <Runtime>();
2392
+ if (!readObjCClassName (origMetadataPtr, className))
2381
2393
return BuiltType ();
2382
2394
2383
2395
BuiltType BuiltObjCClass = Builder.createObjCClassType (std::move (className));
@@ -2390,7 +2402,7 @@ class MetadataReader {
2390
2402
skipArtificialSubclasses);
2391
2403
}
2392
2404
2393
- TypeCache[origMetadata. getAddress () ] = BuiltObjCClass;
2405
+ TypeCache[origMetadataPtr ] = BuiltObjCClass;
2394
2406
return BuiltObjCClass;
2395
2407
}
2396
2408
@@ -2583,11 +2595,11 @@ class MetadataReader {
2583
2595
} // end namespace swift
2584
2596
2585
2597
namespace llvm {
2586
- template <typename Runtime, typename T>
2587
- struct simplify_type <swift::remote::RemoteRef<Runtime, T>> {
2598
+ template <typename T>
2599
+ struct simplify_type <swift::remote::RemoteRef<T>> {
2588
2600
using SimpleType = const T *;
2589
2601
static SimpleType
2590
- getSimplifiedValue (swift::remote::RemoteRef<Runtime, T> value) {
2602
+ getSimplifiedValue (swift::remote::RemoteRef<T> value) {
2591
2603
return value.getLocalBuffer ();
2592
2604
}
2593
2605
};
0 commit comments