summaryrefslogtreecommitdiffstats
path: root/llvm/unittests/Support/Host.cpp
diff options
context:
space:
mode:
authorHubert Tong <hubert.reinterpretcast@gmail.com>2019-03-13 00:12:43 +0000
committerHubert Tong <hubert.reinterpretcast@gmail.com>2019-03-13 00:12:43 +0000
commit72db2abcc794feccfb482d4ae9e500c91c8bcb45 (patch)
treecfbffcbaadca3bf47a9eb10da935d89f76215f3d /llvm/unittests/Support/Host.cpp
parent22c660cc131cc6990d81d53ba3f2a8aed186f543 (diff)
downloadbcm5719-llvm-72db2abcc794feccfb482d4ae9e500c91c8bcb45.tar.gz
bcm5719-llvm-72db2abcc794feccfb482d4ae9e500c91c8bcb45.zip
Use AIX version detection at LLVM run-time
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 llvm-svn: 355995
Diffstat (limited to 'llvm/unittests/Support/Host.cpp')
-rw-r--r--llvm/unittests/Support/Host.cpp114
1 files changed, 91 insertions, 23 deletions
diff --git a/llvm/unittests/Support/Host.cpp b/llvm/unittests/Support/Host.cpp
index b8093171475..89080f350aa 100644
--- a/llvm/unittests/Support/Host.cpp
+++ b/llvm/unittests/Support/Host.cpp
@@ -7,6 +7,7 @@
//===----------------------------------------------------------------------===//
#include "llvm/Support/Host.h"
+#include "llvm/Config/llvm-config.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Triple.h"
#include "llvm/Support/FileSystem.h"
@@ -248,6 +249,46 @@ CPU part : 0x0a1
"tsv110");
}
+static bool runAndGetCommandOutput(
+ const char *ExePath, ArrayRef<llvm::StringRef> argv,
+ std::unique_ptr<char[]> &Buffer, off_t &Size) {
+ bool Success = false;
+ [ExePath, argv, &Buffer, &Size, &Success] {
+ using namespace llvm::sys;
+ SmallString<128> TestDirectory;
+ ASSERT_NO_ERROR(fs::createUniqueDirectory("host_test", TestDirectory));
+
+ SmallString<128> OutputFile(TestDirectory);
+ path::append(OutputFile, "out");
+ StringRef OutputPath = OutputFile.str();
+
+ const Optional<StringRef> Redirects[] = {
+ /*STDIN=*/None, /*STDOUT=*/OutputPath, /*STDERR=*/None};
+ int RetCode = ExecuteAndWait(ExePath, argv, /*env=*/llvm::None, Redirects);
+ ASSERT_EQ(0, RetCode);
+
+ int FD = 0;
+ ASSERT_NO_ERROR(fs::openFileForRead(OutputPath, FD));
+ Size = ::lseek(FD, 0, SEEK_END);
+ ASSERT_NE(-1, Size);
+ ::lseek(FD, 0, SEEK_SET);
+ Buffer = llvm::make_unique<char[]>(Size);
+ ASSERT_EQ(::read(FD, Buffer.get(), Size), Size);
+ ::close(FD);
+
+ ASSERT_NO_ERROR(fs::remove(OutputPath));
+ ASSERT_NO_ERROR(fs::remove(TestDirectory.str()));
+ Success = true;
+ }();
+ return Success;
+}
+
+TEST_F(HostTest, DummyRunAndGetCommandOutputUse) {
+ // Suppress defined-but-not-used warnings when the tests using the helper are
+ // disabled.
+ (void) runAndGetCommandOutput;
+}
+
#if defined(__APPLE__)
TEST_F(HostTest, getMacOSHostVersion) {
using namespace llvm::sys;
@@ -255,31 +296,14 @@ TEST_F(HostTest, getMacOSHostVersion) {
if (!HostTriple.isMacOSX())
return;
- SmallString<128> TestDirectory;
- ASSERT_NO_ERROR(fs::createUniqueDirectory("host_test", TestDirectory));
- SmallString<128> OutputFile(TestDirectory);
- path::append(OutputFile, "out");
-
const char *SwVersPath = "/usr/bin/sw_vers";
StringRef argv[] = {SwVersPath, "-productVersion"};
- StringRef OutputPath = OutputFile.str();
- const Optional<StringRef> Redirects[] = {/*STDIN=*/None,
- /*STDOUT=*/OutputPath,
- /*STDERR=*/None};
- int RetCode = ExecuteAndWait(SwVersPath, argv, /*env=*/llvm::None, Redirects);
- ASSERT_EQ(0, RetCode);
-
- int FD = 0;
- ASSERT_NO_ERROR(fs::openFileForRead(OutputPath, FD));
- off_t Size = ::lseek(FD, 0, SEEK_END);
- ASSERT_NE(-1, Size);
- ::lseek(FD, 0, SEEK_SET);
- std::unique_ptr<char[]> Buffer = llvm::make_unique<char[]>(Size);
- ASSERT_EQ(::read(FD, Buffer.get(), Size), Size);
- ::close(FD);
+ std::unique_ptr<char[]> Buffer;
+ off_t Size;
+ ASSERT_EQ(runAndGetCommandOutput(SwVersPath, argv, Buffer, Size), true);
+ StringRef SystemVersion(Buffer.get(), Size);
// Ensure that the two versions match.
- StringRef SystemVersion(Buffer.get(), Size);
unsigned SystemMajor, SystemMinor, SystemMicro;
ASSERT_EQ(llvm::Triple((Twine("x86_64-apple-macos") + SystemVersion))
.getMacOSXVersion(SystemMajor, SystemMinor, SystemMicro),
@@ -290,8 +314,52 @@ TEST_F(HostTest, getMacOSHostVersion) {
// Don't compare the 'Micro' version, as it's always '0' for the 'Darwin'
// triples.
ASSERT_EQ(std::tie(SystemMajor, SystemMinor), std::tie(HostMajor, HostMinor));
+}
+#endif
+
+#if defined(_AIX)
+TEST_F(HostTest, AIXVersionDetect) {
+ using namespace llvm::sys;
+
+ llvm::Triple HostTriple(getProcessTriple());
+ ASSERT_EQ(HostTriple.getOS(), Triple::AIX);
+
+ llvm::Triple ConfiguredHostTriple(LLVM_HOST_TRIPLE);
+ ASSERT_EQ(ConfiguredHostTriple.getOS(), Triple::AIX);
+
+ const char *ExePath = "/usr/bin/oslevel";
+ StringRef argv[] = {ExePath};
+ std::unique_ptr<char[]> Buffer;
+ off_t Size;
+ ASSERT_EQ(runAndGetCommandOutput(ExePath, argv, Buffer, Size), true);
+ StringRef SystemVersion(Buffer.get(), Size);
+
+ unsigned SystemMajor, SystemMinor, SystemMicro;
+ llvm::Triple((Twine("powerpc-ibm-aix") + SystemVersion))
+ .getOSVersion(SystemMajor, SystemMinor, SystemMicro);
+
+ // Ensure that the host triple version (major) and release (minor) numbers,
+ // unless explicitly configured, match with those of the current system.
+ if (!ConfiguredHostTriple.getOSMajorVersion()) {
+ unsigned HostMajor, HostMinor, HostMicro;
+ HostTriple.getOSVersion(HostMajor, HostMinor, HostMicro);
+ ASSERT_EQ(std::tie(SystemMajor, SystemMinor),
+ std::tie(HostMajor, HostMinor));
+ }
+
+ llvm::Triple TargetTriple(getDefaultTargetTriple());
+ if (TargetTriple.getOS() != Triple::AIX)
+ return;
+
+ // Ensure that the target triple version (major) and release (minor) numbers
+ // match with those of the current system.
+ llvm::Triple ConfiguredTargetTriple(LLVM_DEFAULT_TARGET_TRIPLE);
+ if (ConfiguredTargetTriple.getOSMajorVersion())
+ return; // The version was configured explicitly; skip.
- ASSERT_NO_ERROR(fs::remove(OutputPath));
- ASSERT_NO_ERROR(fs::remove(TestDirectory.str()));
+ unsigned TargetMajor, TargetMinor, TargetMicro;
+ TargetTriple.getOSVersion(TargetMajor, TargetMinor, TargetMicro);
+ ASSERT_EQ(std::tie(SystemMajor, SystemMinor),
+ std::tie(TargetMajor, TargetMinor));
}
#endif
OpenPOWER on IntegriCloud