Skip to content

Commit 1d705ca

Browse files
committed
[ABI] Fix metadata accessors for 32-bit remote AST/remote mirrors.
The use of sizeof(void*) in TargetStructMetadata and TargetEnumMetadata's accessors is incorrect when (e.g.) reading metadata from a 32-bit process in a 64-bit host. Use sizeof(StoredPointer) instead to properly account for the runtime pointer size. Fixes rdar://problem/47305557.
1 parent 1e824b0 commit 1d705ca

File tree

1 file changed

+4
-4
lines changed

1 file changed

+4
-4
lines changed

include/swift/ABI/Metadata.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1321,7 +1321,7 @@ struct TargetStructMetadata : public TargetValueMetadata<Runtime> {
13211321
}
13221322

13231323
static constexpr int32_t getGenericArgumentOffset() {
1324-
return sizeof(TargetStructMetadata<Runtime>) / sizeof(void*);
1324+
return sizeof(TargetStructMetadata<Runtime>) / sizeof(StoredPointer);
13251325
}
13261326

13271327
static bool classof(const TargetMetadata<Runtime> *metadata) {
@@ -1369,7 +1369,7 @@ struct TargetEnumMetadata : public TargetValueMetadata<Runtime> {
13691369
}
13701370

13711371
static constexpr int32_t getGenericArgumentOffset() {
1372-
return sizeof(TargetEnumMetadata<Runtime>) / sizeof(void*);
1372+
return sizeof(TargetEnumMetadata<Runtime>) / sizeof(StoredPointer);
13731373
}
13741374

13751375
static bool classof(const TargetMetadata<Runtime> *metadata) {
@@ -3537,11 +3537,11 @@ class TargetTypeContextDescriptor
35373537
llvm::ArrayRef<GenericParamDescriptor> getGenericParams() const;
35383538

35393539
/// Return the offset of the start of generic arguments in the nominal
3540-
/// type's metadata. The returned value is measured in sizeof(void*).
3540+
/// type's metadata. The returned value is measured in sizeof(StoredPointer).
35413541
int32_t getGenericArgumentOffset() const;
35423542

35433543
/// Return the start of the generic arguments array in the nominal
3544-
/// type's metadata. The returned value is measured in sizeof(void*).
3544+
/// type's metadata. The returned value is measured in sizeof(StoredPointer).
35453545
const TargetMetadata<Runtime> * const *getGenericArguments(
35463546
const TargetMetadata<Runtime> *metadata) const {
35473547
auto offset = getGenericArgumentOffset();

0 commit comments

Comments
 (0)