diff options
author | Richard Sandiford <rsandifo@linux.vnet.ibm.com> | 2013-10-31 12:14:17 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@linux.vnet.ibm.com> | 2013-10-31 12:14:17 +0000 |
commit | 793ce99ea79b2a51a9ace18adcae60678efaae9e (patch) | |
tree | 9db9d8bfdd4739b5beffb57093e91d28dfe7825f /lib/Support | |
parent | c2884320feebc543d2ce51151d5418dfc18da9e4 (diff) | |
download | llvm-793ce99ea79b2a51a9ace18adcae60678efaae9e.tar.gz llvm-793ce99ea79b2a51a9ace18adcae60678efaae9e.tar.bz2 llvm-793ce99ea79b2a51a9ace18adcae60678efaae9e.tar.xz |
[SystemZ] Automatically detect zEC12 and z196 hosts
As on other hosts, the CPU identification instruction is priveleged,
so we need to look through /proc/cpuinfo. I copied the PowerPC way of
handling "generic".
Several tests were implicitly assuming z10 and so failed on z196.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@193742 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Support')
-rw-r--r-- | lib/Support/Host.cpp | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/lib/Support/Host.cpp b/lib/Support/Host.cpp index 12df08c6c0..6a5d4d28a9 100644 --- a/lib/Support/Host.cpp +++ b/lib/Support/Host.cpp @@ -535,6 +535,48 @@ std::string sys::getHostCPUName() { return "generic"; } +#elif defined(__linux__) && defined(__s390x__) +std::string sys::getHostCPUName() { + // STIDP is a privileged operation, so use /proc/cpuinfo instead. + // Note: We cannot mmap /proc/cpuinfo here and then process the resulting + // memory buffer because the 'file' has 0 size (it can be read from only + // as a stream). + + std::string Err; + DataStreamer *DS = getDataFileStreamer("/proc/cpuinfo", &Err); + if (!DS) { + DEBUG(dbgs() << "Unable to open /proc/cpuinfo: " << Err << "\n"); + return "generic"; + } + + // The "processor 0:" line comes after a fair amount of other information, + // including a cache breakdown, but this should be plenty. + char buffer[2048]; + size_t CPUInfoSize = DS->GetBytes((unsigned char*) buffer, sizeof(buffer)); + delete DS; + + StringRef Str(buffer, CPUInfoSize); + SmallVector<StringRef, 32> Lines; + Str.split(Lines, "\n"); + for (unsigned I = 0, E = Lines.size(); I != E; ++I) { + if (Lines[I].startswith("processor ")) { + size_t Pos = Lines[I].find("machine = "); + if (Pos != StringRef::npos) { + Pos += sizeof("machine = ") - 1; + unsigned int Id; + if (!Lines[I].drop_front(Pos).getAsInteger(10, Id)) { + if (Id >= 2827) + return "zEC12"; + if (Id >= 2817) + return "z196"; + } + } + break; + } + } + + return "generic"; +} #else std::string sys::getHostCPUName() { return "generic"; |