1 | //===- llvm/TargetParser/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 "llvm/ADT/StringRef.h" |
19 | #include "llvm/Config/config.h" |
20 | #include <cctype> |
21 | #include <string> |
22 | #include <sys/utsname.h> |
23 | |
24 | #ifdef HAVE_UNISTD_H |
25 | #include <unistd.h> |
26 | #endif |
27 | |
28 | using namespace llvm; |
29 | |
30 | static std::string getOSVersion() { |
31 | struct utsname info; |
32 | |
33 | if (uname(name: &info)) |
34 | return ""; |
35 | |
36 | return info.release; |
37 | } |
38 | |
39 | static std::string updateTripleOSVersion(std::string TargetTripleString) { |
40 | // On darwin, we want to update the version to match that of the target. |
41 | std::string::size_type DarwinDashIdx = TargetTripleString.find(s: "-darwin"); |
42 | if (DarwinDashIdx != std::string::npos) { |
43 | TargetTripleString.resize(n: DarwinDashIdx + strlen(s: "-darwin")); |
44 | TargetTripleString += getOSVersion(); |
45 | return TargetTripleString; |
46 | } |
47 | std::string::size_type MacOSDashIdx = TargetTripleString.find(s: "-macos"); |
48 | if (MacOSDashIdx != std::string::npos) { |
49 | TargetTripleString.resize(n: MacOSDashIdx); |
50 | // Reset the OS to darwin as the OS version from `uname` doesn't use the |
51 | // macOS version scheme. |
52 | TargetTripleString += "-darwin"; |
53 | TargetTripleString += getOSVersion(); |
54 | } |
55 | // On AIX, the AIX version and release should be that of the current host |
56 | // unless if the version has already been specified. |
57 | if (Triple(LLVM_HOST_TRIPLE).getOS() == Triple::AIX) { |
58 | Triple TT(TargetTripleString); |
59 | if (TT.getOS() == Triple::AIX && !TT.getOSMajorVersion()) { |
60 | struct utsname name; |
61 | if (uname(name: &name) != -1) { |
62 | std::string NewOSName = std::string(Triple::getOSTypeName(Kind: Triple::AIX)); |
63 | NewOSName += name.version; |
64 | NewOSName += '.'; |
65 | NewOSName += name.release; |
66 | NewOSName += ".0.0"; |
67 | TT.setOSName(NewOSName); |
68 | return TT.str(); |
69 | } |
70 | } |
71 | } |
72 | return TargetTripleString; |
73 | } |
74 | |
75 | std::string sys::getDefaultTargetTriple() { |
76 | std::string TargetTripleString = |
77 | updateTripleOSVersion(LLVM_DEFAULT_TARGET_TRIPLE); |
78 | |
79 | // Override the default target with an environment variable named by |
80 | // LLVM_TARGET_TRIPLE_ENV. |
81 | #if defined(LLVM_TARGET_TRIPLE_ENV) |
82 | if (const char *EnvTriple = std::getenv(LLVM_TARGET_TRIPLE_ENV)) |
83 | TargetTripleString = EnvTriple; |
84 | #endif |
85 | |
86 | return TargetTripleString; |
87 | } |
88 |