82 lines
2.3 KiB
C++
82 lines
2.3 KiB
C++
//===- ExecutorProcessInfo.cpp --------------------------------------------===//
|
|
//
|
|
// 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Contains the implementation of APIs in the orc-rt/ExecutorProcessInfo.h
|
|
// header.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "orc-rt/ExecutorProcessInfo.h"
|
|
#include "orc-rt/Math.h"
|
|
|
|
#include <cassert>
|
|
#include <cstring>
|
|
#include <unistd.h>
|
|
|
|
namespace orc_rt {
|
|
|
|
ExecutorProcessInfo::ExecutorProcessInfo(std::string Triple,
|
|
size_t PageSize) noexcept
|
|
: Triple(std::move(Triple)), PageSize(PageSize) {
|
|
assert(!this->Triple.empty() && "triple cannot be empty");
|
|
assert(isPowerOf2(this->PageSize) && "page-size is not a power of two");
|
|
}
|
|
|
|
/// Create an ExecutorProcessInfo, auto-detecting property values.
|
|
Expected<ExecutorProcessInfo> ExecutorProcessInfo::Detect() noexcept {
|
|
auto Triple = detectTargetTriple();
|
|
auto PageSize = detectPageSize();
|
|
if (!PageSize)
|
|
return PageSize.takeError();
|
|
return ExecutorProcessInfo(std::move(Triple), std::move(*PageSize));
|
|
}
|
|
|
|
std::string ExecutorProcessInfo::detectTargetTriple() noexcept {
|
|
std::string Triple;
|
|
|
|
// Arch
|
|
#if defined(__x86_64__) || defined(_M_X64)
|
|
Triple += "x86_64";
|
|
#elif defined(__aarch64__) || defined(_M_ARM64)
|
|
Triple += "aarch64";
|
|
#else
|
|
#error "Unsupported architecture"
|
|
#endif
|
|
|
|
// Vendor
|
|
#if defined(__APPLE__)
|
|
Triple += "-apple";
|
|
#else
|
|
Triple += "-unknown";
|
|
#endif
|
|
|
|
// OS
|
|
#if defined(__APPLE__)
|
|
Triple += "-darwin";
|
|
#elif defined(__linux__)
|
|
Triple += "-linux";
|
|
#else
|
|
#error "Unsupported OS"
|
|
#endif
|
|
|
|
return Triple;
|
|
}
|
|
|
|
Expected<size_t> ExecutorProcessInfo::detectPageSize() noexcept {
|
|
long PageSize = sysconf(_SC_PAGESIZE);
|
|
if (PageSize == -1)
|
|
return make_error<StringError>(strerror(errno));
|
|
if (!isPowerOf2(PageSize))
|
|
return make_error<StringError>("reported page size " +
|
|
std::to_string(PageSize) +
|
|
" is not a power of two");
|
|
return static_cast<size_t>(PageSize);
|
|
}
|
|
|
|
} // namespace orc_rt
|