diff --git a/llvm/lib/Support/Host.cpp b/llvm/lib/Support/Host.cpp --- a/llvm/lib/Support/Host.cpp +++ b/llvm/lib/Support/Host.cpp @@ -1311,6 +1311,28 @@ } return count; } +#elif defined(__MVS__) +int computeHostNumPhysicalCores() { + enum { + // Byte offset of the pointer to the Communications Vector Table (CVT) in + // the Prefixed Save Area (PSA). The table entry is a 31-bit pointer and + // will be zero-extended to uintptr_t. + FLCCVT = 16, + // Byte offset of the pointer to the Common System Data Area (CSD) in the + // CVT. The table entry is a 31-bit pointer and will be zero-extended to + // uintptr_t. + CVTCSD = 660, + // Byte offset to the number of live CPs in the LPAR, stored as a signed + // 32-bit value in the table. + CSD_NUMBER_ONLINE_STANDARD_CPS = 264, + }; + char *PSA = 0; + char *CVT = reinterpret_cast( + static_cast(reinterpret_cast(PSA[FLCCVT]))); + char *CSD = reinterpret_cast( + static_cast(reinterpret_cast(CVT[CVTCSD]))); + return reinterpret_cast(CSD[CSD_NUMBER_ONLINE_STANDARD_CPS]); +} #elif defined(_WIN32) && LLVM_ENABLE_THREADS != 0 // Defined in llvm/lib/Support/Windows/Threading.inc int computeHostNumPhysicalCores(); diff --git a/llvm/unittests/Support/Host.cpp b/llvm/unittests/Support/Host.cpp --- a/llvm/unittests/Support/Host.cpp +++ b/llvm/unittests/Support/Host.cpp @@ -36,13 +36,12 @@ protected: bool isSupportedArchAndOS() { // Initially this is only testing detection of the number of - // physical cores, which is currently only supported/tested for - // x86_64 Linux and Darwin. + // physical cores, which is currently only supported/tested on + // some systems. return (Host.isOSWindows() && llvm_is_multithreaded()) || - (Host.isX86() && - (Host.isOSDarwin() || Host.getOS() == Triple::Linux)) || - (Host.getOS() == Triple::Linux && - (Host.isPPC64() || Host.isSystemZ())); + (Host.isX86() && (Host.isOSDarwin() || Host.isOSLinux())) || + (Host.isPPC64() && Host.isOSLinux()) || + (Host.isSystemZ() && (Host.isOSLinux() || Host.isOSzOS())); } HostTest() : Host(Triple::normalize(sys::getProcessTriple())) {}