160 lines
5.3 KiB
C++
160 lines
5.3 KiB
C++
//===-- PlatformTest.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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "gtest/gtest.h"
|
|
|
|
#include "Plugins/Platform/POSIX/PlatformPOSIX.h"
|
|
#include "TestingSupport/SubsystemRAII.h"
|
|
#include "lldb/Core/PluginManager.h"
|
|
#include "lldb/Host/FileSystem.h"
|
|
#include "lldb/Host/HostInfo.h"
|
|
#include "lldb/Target/Platform.h"
|
|
|
|
using namespace lldb;
|
|
using namespace lldb_private;
|
|
|
|
class TestPlatform : public PlatformPOSIX {
|
|
public:
|
|
TestPlatform() : PlatformPOSIX(false) {}
|
|
};
|
|
|
|
class PlatformArm : public TestPlatform {
|
|
public:
|
|
PlatformArm() = default;
|
|
|
|
std::vector<ArchSpec>
|
|
GetSupportedArchitectures(const ArchSpec &process_host_arch) override {
|
|
return {ArchSpec("arm64-apple-ps4")};
|
|
}
|
|
|
|
llvm::StringRef GetPluginName() override { return "arm"; }
|
|
llvm::StringRef GetDescription() override { return "arm"; }
|
|
};
|
|
|
|
class PlatformIntel : public TestPlatform {
|
|
public:
|
|
PlatformIntel() = default;
|
|
|
|
std::vector<ArchSpec>
|
|
GetSupportedArchitectures(const ArchSpec &process_host_arch) override {
|
|
return {ArchSpec("x86_64-apple-ps4")};
|
|
}
|
|
|
|
llvm::StringRef GetPluginName() override { return "intel"; }
|
|
llvm::StringRef GetDescription() override { return "intel"; }
|
|
};
|
|
|
|
class PlatformThumb : public TestPlatform {
|
|
public:
|
|
static void Initialize() {
|
|
PluginManager::RegisterPlugin("thumb", "thumb",
|
|
PlatformThumb::CreateInstance);
|
|
}
|
|
static void Terminate() {
|
|
PluginManager::UnregisterPlugin(PlatformThumb::CreateInstance);
|
|
}
|
|
|
|
static PlatformSP CreateInstance(bool force, const ArchSpec *arch) {
|
|
return std::make_shared<PlatformThumb>();
|
|
}
|
|
|
|
std::vector<ArchSpec>
|
|
GetSupportedArchitectures(const ArchSpec &process_host_arch) override {
|
|
return {ArchSpec("thumbv7-apple-ps4"), ArchSpec("thumbv7f-apple-ps4")};
|
|
}
|
|
|
|
llvm::StringRef GetPluginName() override { return "thumb"; }
|
|
llvm::StringRef GetDescription() override { return "thumb"; }
|
|
};
|
|
|
|
class PlatformTest : public ::testing::Test {
|
|
SubsystemRAII<FileSystem, HostInfo> subsystems;
|
|
|
|
protected:
|
|
PlatformList list;
|
|
|
|
void SetHostPlatform(const PlatformSP &platform_sp) {
|
|
Platform::SetHostPlatform(platform_sp);
|
|
ASSERT_EQ(Platform::GetHostPlatform(), platform_sp);
|
|
list.Append(platform_sp, /*set_selected=*/true);
|
|
}
|
|
};
|
|
|
|
TEST_F(PlatformTest, GetPlatformForArchitecturesHost) {
|
|
SetHostPlatform(std::make_shared<PlatformArm>());
|
|
|
|
const std::vector<ArchSpec> archs = {ArchSpec("arm64-apple-ps4"),
|
|
ArchSpec("arm64e-apple-ps4")};
|
|
std::vector<PlatformSP> candidates;
|
|
|
|
// The host platform matches all architectures.
|
|
PlatformSP platform_sp = list.GetOrCreate(archs, {}, candidates);
|
|
ASSERT_TRUE(platform_sp);
|
|
EXPECT_EQ(platform_sp, Platform::GetHostPlatform());
|
|
}
|
|
|
|
TEST_F(PlatformTest, GetPlatformForArchitecturesSelected) {
|
|
SetHostPlatform(std::make_shared<PlatformIntel>());
|
|
|
|
const std::vector<ArchSpec> archs = {ArchSpec("arm64-apple-ps4"),
|
|
ArchSpec("arm64e-apple-ps4")};
|
|
std::vector<PlatformSP> candidates;
|
|
|
|
// The host platform matches no architectures.
|
|
PlatformSP platform_sp = list.GetOrCreate(archs, {}, candidates);
|
|
ASSERT_FALSE(platform_sp);
|
|
|
|
// The selected platform matches all architectures.
|
|
const PlatformSP selected_platform_sp = std::make_shared<PlatformArm>();
|
|
list.Append(selected_platform_sp, /*set_selected=*/true);
|
|
platform_sp = list.GetOrCreate(archs, {}, candidates);
|
|
ASSERT_TRUE(platform_sp);
|
|
EXPECT_EQ(platform_sp, selected_platform_sp);
|
|
}
|
|
|
|
TEST_F(PlatformTest, GetPlatformForArchitecturesSelectedOverHost) {
|
|
SetHostPlatform(std::make_shared<PlatformIntel>());
|
|
|
|
const std::vector<ArchSpec> archs = {ArchSpec("arm64-apple-ps4"),
|
|
ArchSpec("x86_64-apple-ps4")};
|
|
std::vector<PlatformSP> candidates;
|
|
|
|
// The host platform matches one architecture.
|
|
PlatformSP platform_sp = list.GetOrCreate(archs, {}, candidates);
|
|
ASSERT_TRUE(platform_sp);
|
|
EXPECT_EQ(platform_sp, Platform::GetHostPlatform());
|
|
|
|
// The selected and host platform each match one architecture.
|
|
// The selected platform is preferred.
|
|
const PlatformSP selected_platform_sp = std::make_shared<PlatformArm>();
|
|
list.Append(selected_platform_sp, /*set_selected=*/true);
|
|
platform_sp = list.GetOrCreate(archs, {}, candidates);
|
|
ASSERT_TRUE(platform_sp);
|
|
EXPECT_EQ(platform_sp, selected_platform_sp);
|
|
}
|
|
|
|
TEST_F(PlatformTest, GetPlatformForArchitecturesCandidates) {
|
|
PlatformThumb::Initialize();
|
|
|
|
SetHostPlatform(std::make_shared<PlatformIntel>());
|
|
|
|
const PlatformSP selected_platform_sp = std::make_shared<PlatformArm>();
|
|
list.Append(selected_platform_sp, /*set_selected=*/true);
|
|
|
|
const std::vector<ArchSpec> archs = {ArchSpec("thumbv7-apple-ps4"),
|
|
ArchSpec("thumbv7f-apple-ps4")};
|
|
std::vector<PlatformSP> candidates;
|
|
|
|
// The host platform matches one architecture.
|
|
PlatformSP platform_sp = list.GetOrCreate(archs, {}, candidates);
|
|
ASSERT_TRUE(platform_sp);
|
|
EXPECT_EQ(platform_sp->GetName(), "thumb");
|
|
|
|
PlatformThumb::Terminate();
|
|
}
|