brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.5 KiB · 6299197 Raw
166 lines · cpp
1//===-- PlatformTest.cpp --------------------------------------------------===//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-exception6//7//===----------------------------------------------------------------------===//8 9#include "gtest/gtest.h"10 11#include "Plugins/Platform/POSIX/PlatformPOSIX.h"12#include "TestingSupport/SubsystemRAII.h"13#include "lldb/Core/PluginManager.h"14#include "lldb/Host/FileSystem.h"15#include "lldb/Host/HostInfo.h"16#include "lldb/Target/Platform.h"17 18using namespace lldb;19using namespace lldb_private;20 21class TestPlatform : public PlatformPOSIX {22public:23  TestPlatform() : PlatformPOSIX(false) {}24};25 26class PlatformArm : public TestPlatform {27public:28  PlatformArm() = default;29 30  std::vector<ArchSpec>31  GetSupportedArchitectures(const ArchSpec &process_host_arch) override {32    return {ArchSpec("arm64-apple-ps4")};33  }34 35  llvm::StringRef GetPluginName() override { return "arm"; }36  llvm::StringRef GetDescription() override { return "arm"; }37};38 39class PlatformIntel : public TestPlatform {40public:41  PlatformIntel() = default;42 43  std::vector<ArchSpec>44  GetSupportedArchitectures(const ArchSpec &process_host_arch) override {45    return {ArchSpec("x86_64-apple-ps4")};46  }47 48  llvm::StringRef GetPluginName() override { return "intel"; }49  llvm::StringRef GetDescription() override { return "intel"; }50};51 52class PlatformThumb : public TestPlatform {53public:54  static void Initialize() {55    PluginManager::RegisterPlugin("thumb", "thumb",56                                  PlatformThumb::CreateInstance);57  }58  static void Terminate() {59    PluginManager::UnregisterPlugin(PlatformThumb::CreateInstance);60  }61 62  static PlatformSP CreateInstance(bool force, const ArchSpec *arch) {63    return std::make_shared<PlatformThumb>();64  }65 66  std::vector<ArchSpec>67  GetSupportedArchitectures(const ArchSpec &process_host_arch) override {68    return {ArchSpec("thumbv7-apple-ps4"), ArchSpec("thumbv7f-apple-ps4")};69  }70 71  llvm::StringRef GetPluginName() override { return "thumb"; }72  llvm::StringRef GetDescription() override { return "thumb"; }73};74 75class PlatformTest : public ::testing::Test {76  SubsystemRAII<FileSystem, HostInfo> subsystems;77 78protected:79  PlatformList list;80 81  void SetHostPlatform(const PlatformSP &platform_sp) {82    Platform::SetHostPlatform(platform_sp);83    ASSERT_EQ(Platform::GetHostPlatform(), platform_sp);84    list.Append(platform_sp, /*set_selected=*/true);85  }86};87 88TEST_F(PlatformTest, GetPlatformForArchitecturesHost) {89  SetHostPlatform(std::make_shared<PlatformArm>());90 91  const std::vector<ArchSpec> archs = {ArchSpec("arm64-apple-ps4"),92                                       ArchSpec("arm64e-apple-ps4")};93  std::vector<PlatformSP> candidates;94 95  // The host platform matches all architectures.96  PlatformSP platform_sp = list.GetOrCreate(archs, {}, candidates);97  ASSERT_TRUE(platform_sp);98  EXPECT_EQ(platform_sp, Platform::GetHostPlatform());99}100 101TEST_F(PlatformTest, GetPlatformForArchitecturesSelected) {102  SetHostPlatform(std::make_shared<PlatformIntel>());103 104  const std::vector<ArchSpec> archs = {ArchSpec("arm64-apple-ps4"),105                                       ArchSpec("arm64e-apple-ps4")};106  std::vector<PlatformSP> candidates;107 108  // The host platform matches no architectures.109  PlatformSP platform_sp = list.GetOrCreate(archs, {}, candidates);110  ASSERT_FALSE(platform_sp);111 112  // The selected platform matches all architectures.113  const PlatformSP selected_platform_sp = std::make_shared<PlatformArm>();114  list.Append(selected_platform_sp, /*set_selected=*/true);115  platform_sp = list.GetOrCreate(archs, {}, candidates);116  ASSERT_TRUE(platform_sp);117  EXPECT_EQ(platform_sp, selected_platform_sp);118}119 120TEST_F(PlatformTest, GetPlatformForArchitecturesSelectedOverHost) {121  SetHostPlatform(std::make_shared<PlatformIntel>());122 123  const std::vector<ArchSpec> archs = {ArchSpec("arm64-apple-ps4"),124                                       ArchSpec("x86_64-apple-ps4")};125  std::vector<PlatformSP> candidates;126 127  // The host platform matches one architecture.128  PlatformSP platform_sp = list.GetOrCreate(archs, {}, candidates);129  ASSERT_TRUE(platform_sp);130  EXPECT_EQ(platform_sp, Platform::GetHostPlatform());131 132  // The selected and host platform each match one architecture.133  // The selected platform is preferred.134  const PlatformSP selected_platform_sp = std::make_shared<PlatformArm>();135  list.Append(selected_platform_sp, /*set_selected=*/true);136  platform_sp = list.GetOrCreate(archs, {}, candidates);137  ASSERT_TRUE(platform_sp);138  EXPECT_EQ(platform_sp, selected_platform_sp);139}140 141TEST_F(PlatformTest, GetPlatformForArchitecturesCandidates) {142  PlatformThumb::Initialize();143 144  SetHostPlatform(std::make_shared<PlatformIntel>());145 146  const PlatformSP selected_platform_sp = std::make_shared<PlatformArm>();147  list.Append(selected_platform_sp, /*set_selected=*/true);148 149  const std::vector<ArchSpec> archs = {ArchSpec("thumbv7-apple-ps4"),150                                       ArchSpec("thumbv7f-apple-ps4")};151  std::vector<PlatformSP> candidates;152 153  // The host platform matches one architecture.154  PlatformSP platform_sp = list.GetOrCreate(archs, {}, candidates);155  ASSERT_TRUE(platform_sp);156  EXPECT_EQ(platform_sp->GetName(), "thumb");157 158  PlatformThumb::Terminate();159}160 161TEST_F(PlatformTest, CreateUnknown) {162  SetHostPlatform(std::make_shared<PlatformIntel>());163  ASSERT_EQ(list.Create("unknown-platform-name"), nullptr);164  ASSERT_EQ(list.GetOrCreate("dummy"), nullptr);165}166