Skip to content

Commit 9fab7cb

Browse files
Gary Liujrose-apple
authored andcommitted
Fix s390x Enum load/storeMultiPayloadValue (#4461)
1 parent 8d850e5 commit 9fab7cb

File tree

1 file changed

+11
-3
lines changed

1 file changed

+11
-3
lines changed

stdlib/public/runtime/Enum.cpp

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -348,17 +348,25 @@ static void storeMultiPayloadValue(OpaqueValue *value,
348348
#if defined(__BIG_ENDIAN__)
349349
unsigned numPayloadValueBytes =
350350
std::min(layout.payloadSize, sizeof(payloadValue));
351-
memcpy(bytes,
351+
memcpy(bytes + sizeof(OpaqueValue *) - numPayloadValueBytes,
352352
reinterpret_cast<char *>(&payloadValue) + 4 - numPayloadValueBytes,
353353
numPayloadValueBytes);
354+
if (layout.payloadSize > sizeof(payloadValue) &&
355+
layout.payloadSize > sizeof(OpaqueValue *)) {
356+
memset(bytes, 0,
357+
sizeof(OpaqueValue *) - numPayloadValueBytes);
358+
memset(bytes + sizeof(OpaqueValue *), 0,
359+
layout.payloadSize - sizeof(OpaqueValue *));
360+
}
354361
#else
355362
memcpy(bytes, &payloadValue,
356363
std::min(layout.payloadSize, sizeof(payloadValue)));
357-
#endif
364+
358365
// If the payload is larger than the value, zero out the rest.
359366
if (layout.payloadSize > sizeof(payloadValue))
360367
memset(bytes + sizeof(payloadValue), 0,
361368
layout.payloadSize - sizeof(payloadValue));
369+
#endif
362370
}
363371

364372
static unsigned loadMultiPayloadTag(const OpaqueValue *value,
@@ -384,7 +392,7 @@ static unsigned loadMultiPayloadValue(const OpaqueValue *value,
384392
unsigned numPayloadValueBytes =
385393
std::min(layout.payloadSize, sizeof(payloadValue));
386394
memcpy(reinterpret_cast<char *>(&payloadValue) + 4 - numPayloadValueBytes,
387-
bytes, numPayloadValueBytes);
395+
bytes + sizeof(OpaqueValue *) - numPayloadValueBytes, numPayloadValueBytes);
388396
#else
389397
memcpy(&payloadValue, bytes,
390398
std::min(layout.payloadSize, sizeof(payloadValue)));

0 commit comments

Comments
 (0)