The OS version is added to the triple with the value returned by uname. However, PASE uses different versioning from AIX, so the uname value needs to be mapped to AIX first.
108 lines
3.6 KiB
C++
108 lines
3.6 KiB
C++
//===- llvm/TargetParser/Unix/Host.inc --------------------------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file implements the UNIX Host support.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
//=== WARNING: Implementation here must contain only generic UNIX code that
|
|
//=== is guaranteed to work on *all* UNIX variants.
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/ADT/StringRef.h"
|
|
#include "llvm/Config/config.h"
|
|
#include <cctype>
|
|
#include <string>
|
|
#include <sys/utsname.h>
|
|
|
|
#ifdef HAVE_UNISTD_H
|
|
#include <unistd.h>
|
|
#endif
|
|
|
|
using namespace llvm;
|
|
|
|
static std::string getOSVersion() {
|
|
struct utsname info;
|
|
|
|
if (uname(&info))
|
|
return "";
|
|
|
|
return info.release;
|
|
}
|
|
|
|
static std::string updateTripleOSVersion(std::string TargetTripleString) {
|
|
// On darwin, we want to update the version to match that of the target.
|
|
std::string::size_type DarwinDashIdx = TargetTripleString.find("-darwin");
|
|
if (DarwinDashIdx != std::string::npos) {
|
|
TargetTripleString.resize(DarwinDashIdx + strlen("-darwin"));
|
|
TargetTripleString += getOSVersion();
|
|
return TargetTripleString;
|
|
}
|
|
std::string::size_type MacOSDashIdx = TargetTripleString.find("-macos");
|
|
if (MacOSDashIdx != std::string::npos) {
|
|
TargetTripleString.resize(MacOSDashIdx);
|
|
// Reset the OS to darwin as the OS version from `uname` doesn't use the
|
|
// macOS version scheme.
|
|
TargetTripleString += "-darwin";
|
|
TargetTripleString += getOSVersion();
|
|
}
|
|
// On AIX, the AIX version and release should be that of the current host
|
|
// unless if the version has already been specified.
|
|
if (Triple(LLVM_HOST_TRIPLE).getOS() == Triple::AIX) {
|
|
Triple TT{TargetTripleString};
|
|
if (TT.getOS() == Triple::AIX && !TT.getOSMajorVersion()) {
|
|
struct utsname name;
|
|
if (uname(&name) != -1) {
|
|
std::string release = name.release;
|
|
|
|
if (strcmp(name.sysname, "OS400") == 0) {
|
|
/*
|
|
PASE uses different versioning system than AIX.
|
|
The following table shows the currently supported PASE
|
|
releases and the corresponding AIX release:
|
|
--------------------------
|
|
PASE | AIX
|
|
--------------------------
|
|
V7R4 | 7.2 (TL2)
|
|
--------------------------
|
|
V7R5 | 7.2 (TL5)
|
|
--------------------------
|
|
V7R6 | 7.3 (TL1)
|
|
--------------------------
|
|
*/
|
|
release = (release == "4" || release == "5") ? "2" : "3";
|
|
}
|
|
|
|
std::string NewOSName = std::string(Triple::getOSTypeName(Triple::AIX));
|
|
NewOSName += name.version;
|
|
NewOSName += '.';
|
|
NewOSName += release;
|
|
NewOSName += ".0.0";
|
|
TT.setOSName(NewOSName);
|
|
return TT.str();
|
|
}
|
|
}
|
|
}
|
|
return TargetTripleString;
|
|
}
|
|
|
|
std::string sys::getDefaultTargetTriple() {
|
|
std::string TargetTripleString =
|
|
updateTripleOSVersion(LLVM_DEFAULT_TARGET_TRIPLE);
|
|
|
|
// Override the default target with an environment variable named by
|
|
// LLVM_TARGET_TRIPLE_ENV.
|
|
#if defined(LLVM_TARGET_TRIPLE_ENV)
|
|
if (const char *EnvTriple = std::getenv(LLVM_TARGET_TRIPLE_ENV))
|
|
TargetTripleString = EnvTriple;
|
|
#endif
|
|
|
|
return TargetTripleString;
|
|
}
|