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