//===- 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 #include #include #ifdef HAVE_UNISTD_H #include #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 NewOSName = std::string(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; }