1//===- llvm/Support/Unix/Host.inc -------------------------------*- C++ -*-===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8// 9// This file implements the UNIX Host support. 10// 11//===----------------------------------------------------------------------===// 12 13//===----------------------------------------------------------------------===// 14//=== WARNING: Implementation here must contain only generic UNIX code that 15//=== is guaranteed to work on *all* UNIX variants. 16//===----------------------------------------------------------------------===// 17 18#include "Unix.h" 19#include "llvm/ADT/StringRef.h" 20#include "llvm/Config/config.h" 21#include <cctype> 22#include <string> 23#include <sys/utsname.h> 24 25using namespace llvm; 26 27static std::string getOSVersion() { 28 struct utsname info; 29 30 if (uname(&info)) 31 return ""; 32 33 return info.release; 34} 35 36static std::string updateTripleOSVersion(std::string TargetTripleString) { 37 // On darwin, we want to update the version to match that of the target. 38 std::string::size_type DarwinDashIdx = TargetTripleString.find("-darwin"); 39 if (DarwinDashIdx != std::string::npos) { 40 TargetTripleString.resize(DarwinDashIdx + strlen("-darwin")); 41 TargetTripleString += getOSVersion(); 42 return TargetTripleString; 43 } 44 std::string::size_type MacOSDashIdx = TargetTripleString.find("-macos"); 45 if (MacOSDashIdx != std::string::npos) { 46 TargetTripleString.resize(MacOSDashIdx); 47 // Reset the OS to darwin as the OS version from `uname` doesn't use the 48 // macOS version scheme. 49 TargetTripleString += "-darwin"; 50 TargetTripleString += getOSVersion(); 51 } 52 // On AIX, the AIX version and release should be that of the current host 53 // unless if the version has already been specified. 54 if (Triple(LLVM_HOST_TRIPLE).getOS() == Triple::AIX) { 55 Triple TT(TargetTripleString); 56 if (TT.getOS() == Triple::AIX && !TT.getOSMajorVersion()) { 57 struct utsname name; 58 if (uname(&name) != -1) { 59 std::string NewOSName = std::string(Triple::getOSTypeName(Triple::AIX)); 60 NewOSName += name.version; 61 NewOSName += '.'; 62 NewOSName += name.release; 63 NewOSName += ".0.0"; 64 TT.setOSName(NewOSName); 65 return TT.str(); 66 } 67 } 68 } 69 return TargetTripleString; 70} 71 72std::string sys::getDefaultTargetTriple() { 73 std::string TargetTripleString = 74 updateTripleOSVersion(LLVM_DEFAULT_TARGET_TRIPLE); 75 76 // Override the default target with an environment variable named by 77 // LLVM_TARGET_TRIPLE_ENV. 78#if defined(LLVM_TARGET_TRIPLE_ENV) 79 if (const char *EnvTriple = std::getenv(LLVM_TARGET_TRIPLE_ENV)) 80 TargetTripleString = EnvTriple; 81#endif 82 83 return TargetTripleString; 84} 85