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 exegesis { 13 14 void InitializeAArch64ExegesisTarget(); 15 16 namespace { 17 18 using llvm::APInt; 19 using llvm::MCInst; 20 using testing::Gt; 21 using testing::IsEmpty; 22 using testing::Not; 23 using testing::NotNull; 24 25 constexpr const char kTriple[] = "aarch64-unknown-linux"; 26 27 class AArch64TargetTest : public ::testing::Test { 28 protected: 29 AArch64TargetTest() 30 : ExegesisTarget_(ExegesisTarget::lookup(llvm::Triple(kTriple))) { 31 EXPECT_THAT(ExegesisTarget_, NotNull()); 32 std::string error; 33 Target_ = llvm::TargetRegistry::lookupTarget(kTriple, error); 34 EXPECT_THAT(Target_, NotNull()); 35 STI_.reset( 36 Target_->createMCSubtargetInfo(kTriple, "generic", /*no features*/ "")); 37 } 38 39 static void SetUpTestCase() { 40 LLVMInitializeAArch64TargetInfo(); 41 LLVMInitializeAArch64Target(); 42 LLVMInitializeAArch64TargetMC(); 43 InitializeAArch64ExegesisTarget(); 44 } 45 46 std::vector<MCInst> setRegTo(unsigned Reg, const APInt &Value) { 47 return ExegesisTarget_->setRegTo(*STI_, Reg, Value); 48 } 49 50 const llvm::Target *Target_; 51 const ExegesisTarget *const ExegesisTarget_; 52 std::unique_ptr<llvm::MCSubtargetInfo> STI_; 53 }; 54 55 TEST_F(AArch64TargetTest, SetRegToConstant) { 56 // The AArch64 target currently doesn't know how to set register values. 57 const auto Insts = setRegTo(llvm::AArch64::X0, llvm::APInt()); 58 EXPECT_THAT(Insts, Not(IsEmpty())); 59 } 60 61 } // namespace 62 } // namespace exegesis 63