1 //===-- TargetTest.cpp ------------------------------------------*- 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 #include "Target.h" 10 11 #include <cassert> 12 #include <memory> 13 14 #include "MCTargetDesc/AArch64MCTargetDesc.h" 15 #include "llvm/Support/TargetRegistry.h" 16 #include "llvm/Support/TargetSelect.h" 17 #include "gmock/gmock.h" 18 #include "gtest/gtest.h" 19 20 namespace llvm { 21 namespace exegesis { 22 23 void InitializeAArch64ExegesisTarget(); 24 25 namespace { 26 27 using llvm::APInt; 28 using llvm::MCInst; 29 using testing::Gt; 30 using testing::IsEmpty; 31 using testing::Not; 32 using testing::NotNull; 33 34 constexpr const char kTriple[] = "aarch64-unknown-linux"; 35 36 class AArch64TargetTest : public ::testing::Test { 37 protected: 38 AArch64TargetTest() 39 : ExegesisTarget_(ExegesisTarget::lookup(llvm::Triple(kTriple))) { 40 EXPECT_THAT(ExegesisTarget_, NotNull()); 41 std::string error; 42 Target_ = llvm::TargetRegistry::lookupTarget(kTriple, error); 43 EXPECT_THAT(Target_, NotNull()); 44 STI_.reset( 45 Target_->createMCSubtargetInfo(kTriple, "generic", /*no features*/ "")); 46 } 47 48 static void SetUpTestCase() { 49 LLVMInitializeAArch64TargetInfo(); 50 LLVMInitializeAArch64Target(); 51 LLVMInitializeAArch64TargetMC(); 52 InitializeAArch64ExegesisTarget(); 53 } 54 55 std::vector<MCInst> setRegTo(unsigned Reg, const APInt &Value) { 56 return ExegesisTarget_->setRegTo(*STI_, Reg, Value); 57 } 58 59 const llvm::Target *Target_; 60 const ExegesisTarget *const ExegesisTarget_; 61 std::unique_ptr<llvm::MCSubtargetInfo> STI_; 62 }; 63 64 TEST_F(AArch64TargetTest, SetRegToConstant) { 65 // The AArch64 target currently doesn't know how to set register values. 66 const auto Insts = setRegTo(llvm::AArch64::X0, llvm::APInt()); 67 EXPECT_THAT(Insts, Not(IsEmpty())); 68 } 69 70 TEST_F(AArch64TargetTest, DefaultPfmCounters) { 71 const std::string Expected = "CPU_CYCLES"; 72 EXPECT_EQ(ExegesisTarget_->getPfmCounters("").CycleCounter, Expected); 73 EXPECT_EQ(ExegesisTarget_->getPfmCounters("unknown_cpu").CycleCounter, 74 Expected); 75 } 76 77 } // namespace 78 } // namespace exegesis 79 } // namespace llvm 80