Skip to content

Commit ee73651

Browse files
fanbo-mengredstar
andauthored
[z/OS] Implement shared memory handling for JIT (#89933)
Fix 'use of undeclared identifier' build errors for shm_ functions on z/OS by implementing the functionality using shmget(), shmat(), and shmdt(). Use the BLAKE3 hash to map the name of the shared memory to a key. --------- Co-authored-by: Kai Nacke <[email protected]>
1 parent deafb36 commit ee73651

File tree

2 files changed

+63
-0
lines changed

2 files changed

+63
-0
lines changed

llvm/lib/ExecutionEngine/Orc/MemoryMapper.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@
1616
#if defined(LLVM_ON_UNIX) && !defined(__ANDROID__)
1717
#include <fcntl.h>
1818
#include <sys/mman.h>
19+
#if defined(__MVS__)
20+
#include "llvm/Support/BLAKE3.h"
21+
#include <sys/shm.h>
22+
#endif
1923
#include <unistd.h>
2024
#elif defined(_WIN32)
2125
#include <windows.h>
@@ -239,6 +243,24 @@ void SharedMemoryMapper::reserve(size_t NumBytes,
239243

240244
#if defined(LLVM_ON_UNIX)
241245

246+
#if defined(__MVS__)
247+
ArrayRef<uint8_t> Data(
248+
reinterpret_cast<const uint8_t *>(SharedMemoryName.c_str()),
249+
SharedMemoryName.size());
250+
auto HashedName = BLAKE3::hash<sizeof(key_t)>(Data);
251+
key_t Key = *reinterpret_cast<key_t *>(HashedName.data());
252+
int SharedMemoryId =
253+
shmget(Key, NumBytes, IPC_CREAT | __IPC_SHAREAS | 0700);
254+
if (SharedMemoryId < 0) {
255+
return OnReserved(errorCodeToError(
256+
std::error_code(errno, std::generic_category())));
257+
}
258+
LocalAddr = shmat(SharedMemoryId, nullptr, 0);
259+
if (LocalAddr == reinterpret_cast<void *>(-1)) {
260+
return OnReserved(errorCodeToError(
261+
std::error_code(errno, std::generic_category())));
262+
}
263+
#else
242264
int SharedMemoryFile = shm_open(SharedMemoryName.c_str(), O_RDWR, 0700);
243265
if (SharedMemoryFile < 0) {
244266
return OnReserved(errorCodeToError(errnoAsErrorCode()));
@@ -254,6 +276,7 @@ void SharedMemoryMapper::reserve(size_t NumBytes,
254276
}
255277

256278
close(SharedMemoryFile);
279+
#endif
257280

258281
#elif defined(_WIN32)
259282

@@ -373,8 +396,13 @@ void SharedMemoryMapper::release(ArrayRef<ExecutorAddr> Bases,
373396

374397
#if defined(LLVM_ON_UNIX)
375398

399+
#if defined(__MVS__)
400+
if (shmdt(Reservations[Base].LocalAddr) < 0)
401+
Err = joinErrors(std::move(Err), errorCodeToError(errnoAsErrorCode()));
402+
#else
376403
if (munmap(Reservations[Base].LocalAddr, Reservations[Base].Size) != 0)
377404
Err = joinErrors(std::move(Err), errorCodeToError(errnoAsErrorCode()));
405+
#endif
378406

379407
#elif defined(_WIN32)
380408

@@ -415,7 +443,11 @@ SharedMemoryMapper::~SharedMemoryMapper() {
415443

416444
#if defined(LLVM_ON_UNIX) && !defined(__ANDROID__)
417445

446+
#if defined(__MVS__)
447+
shmdt(R.second.LocalAddr);
448+
#else
418449
munmap(R.second.LocalAddr, R.second.Size);
450+
#endif
419451

420452
#elif defined(_WIN32)
421453

llvm/lib/ExecutionEngine/Orc/TargetProcess/ExecutorSharedMemoryMapperService.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@
1818
#include <errno.h>
1919
#include <fcntl.h>
2020
#include <sys/mman.h>
21+
#if defined(__MVS__)
22+
#include "llvm/Support/BLAKE3.h"
23+
#include <sys/shm.h>
24+
#endif
2125
#include <unistd.h>
2226
#endif
2327

@@ -59,6 +63,21 @@ ExecutorSharedMemoryMapperService::reserve(uint64_t Size) {
5963
SharedMemoryName = SharedMemoryNameStream.str();
6064
}
6165

66+
#if defined(__MVS__)
67+
ArrayRef<uint8_t> Data(
68+
reinterpret_cast<const uint8_t *>(SharedMemoryName.c_str()),
69+
SharedMemoryName.size());
70+
auto HashedName = BLAKE3::hash<sizeof(key_t)>(Data);
71+
key_t Key = *reinterpret_cast<key_t *>(HashedName.data());
72+
int SharedMemoryId =
73+
shmget(Key, Size, IPC_CREAT | IPC_EXCL | __IPC_SHAREAS | 0700);
74+
if (SharedMemoryId < 0)
75+
return errorCodeToError(errnoAsErrorCode());
76+
77+
void *Addr = shmat(SharedMemoryId, nullptr, 0);
78+
if (Addr == reinterpret_cast<void *>(-1))
79+
return errorCodeToError(errnoAsErrorCode());
80+
#else
6281
int SharedMemoryFile =
6382
shm_open(SharedMemoryName.c_str(), O_RDWR | O_CREAT | O_EXCL, 0700);
6483
if (SharedMemoryFile < 0)
@@ -73,6 +92,7 @@ ExecutorSharedMemoryMapperService::reserve(uint64_t Size) {
7392
return errorCodeToError(errnoAsErrorCode());
7493

7594
close(SharedMemoryFile);
95+
#endif
7696

7797
#elif defined(_WIN32)
7898

@@ -131,6 +151,9 @@ Expected<ExecutorAddr> ExecutorSharedMemoryMapperService::initialize(
131151

132152
#if defined(LLVM_ON_UNIX)
133153

154+
#if defined(__MVS__)
155+
// TODO Is it possible to change the protection level?
156+
#else
134157
int NativeProt = 0;
135158
if ((Segment.RAG.Prot & MemProt::Read) == MemProt::Read)
136159
NativeProt |= PROT_READ;
@@ -141,6 +164,7 @@ Expected<ExecutorAddr> ExecutorSharedMemoryMapperService::initialize(
141164

142165
if (mprotect(Segment.Addr.toPtr<void *>(), Segment.Size, NativeProt))
143166
return errorCodeToError(errnoAsErrorCode());
167+
#endif
144168

145169
#elif defined(_WIN32)
146170

@@ -239,8 +263,15 @@ Error ExecutorSharedMemoryMapperService::release(
239263

240264
#if defined(LLVM_ON_UNIX)
241265

266+
#if defined(__MVS__)
267+
(void)Size;
268+
269+
if (shmdt(Base.toPtr<void *>()) < 0)
270+
Err = joinErrors(std::move(Err), errorCodeToError(errnoAsErrorCode()));
271+
#else
242272
if (munmap(Base.toPtr<void *>(), Size) != 0)
243273
Err = joinErrors(std::move(Err), errorCodeToError(errnoAsErrorCode()));
274+
#endif
244275

245276
#elif defined(_WIN32)
246277
(void)Size;

0 commit comments

Comments
 (0)