diff options
Diffstat (limited to 'llvm/lib/Support/Unix/Host.inc')
| -rw-r--r-- | llvm/lib/Support/Unix/Host.inc | 84 | 
1 files changed, 84 insertions, 0 deletions
| diff --git a/llvm/lib/Support/Unix/Host.inc b/llvm/lib/Support/Unix/Host.inc new file mode 100644 index 000000000000..17d78dc18be7 --- /dev/null +++ b/llvm/lib/Support/Unix/Host.inc @@ -0,0 +1,84 @@ +//===- 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; +} | 
