mirror of
https://github.com/RPCS3/llvm.git
synced 2024-11-27 21:50:29 +00:00
d929ec6038
Summary: AIX compilers define macros based on the version of the operating system. This patch implements updating of versionless AIX triples to include the host AIX version. Also, the host triple detection in the build system is adjusted to strip the AIX version information so that the run-time detection is preferred. Reviewers: xingxue, stefanp, nemanjai, jasonliu Reviewed By: xingxue Subscribers: mgorny, kristina, jdoerfert, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D58798 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@355995 91177308-0d34-0410-b5e6-96231b3b80d8
85 lines
2.9 KiB
C++
85 lines
2.9 KiB
C++
//===- llvm/Support/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 "Unix.h"
|
|
#include "llvm/ADT/StringRef.h"
|
|
#include "llvm/Config/config.h"
|
|
#include <cctype>
|
|
#include <string>
|
|
#include <sys/utsname.h>
|
|
|
|
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 NewOSName = Triple::getOSTypeName(Triple::AIX);
|
|
NewOSName += name.version;
|
|
NewOSName += '.';
|
|
NewOSName += name.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;
|
|
}
|