summaryrefslogtreecommitdiff
path: root/lib/Support
diff options
context:
space:
mode:
authorRichard Sandiford <rsandifo@linux.vnet.ibm.com>2013-10-31 12:14:17 +0000
committerRichard Sandiford <rsandifo@linux.vnet.ibm.com>2013-10-31 12:14:17 +0000
commit793ce99ea79b2a51a9ace18adcae60678efaae9e (patch)
tree9db9d8bfdd4739b5beffb57093e91d28dfe7825f /lib/Support
parentc2884320feebc543d2ce51151d5418dfc18da9e4 (diff)
downloadllvm-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.cpp42
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";