blob: b3066df4dfe0b827b0c08b2b4b45699ccede495e [file] [log] [blame]
John Brawnc4ed6002018-07-03 10:10:29 +00001#include "Target.h"
2
3#include <cassert>
4#include <memory>
5
6#include "MCTargetDesc/AArch64MCTargetDesc.h"
John Brawnb371ccc2018-07-03 10:52:20 +00007#include "llvm/Support/TargetRegistry.h"
8#include "llvm/Support/TargetSelect.h"
John Brawnc4ed6002018-07-03 10:10:29 +00009#include "gmock/gmock.h"
10#include "gtest/gtest.h"
11
12namespace exegesis {
13
14void InitializeAArch64ExegesisTarget();
15
16namespace {
17
Guillaume Chateletc96a97b2018-09-20 12:22:18 +000018using llvm::APInt;
19using llvm::MCInst;
John Brawnc4ed6002018-07-03 10:10:29 +000020using testing::Gt;
Guillaume Chateletc96a97b2018-09-20 12:22:18 +000021using testing::IsEmpty;
22using testing::Not;
John Brawnc4ed6002018-07-03 10:10:29 +000023using testing::NotNull;
John Brawnc4ed6002018-07-03 10:10:29 +000024
Guillaume Chateletc96a97b2018-09-20 12:22:18 +000025static const char kTriple[] = "aarch64-unknown-linux";
26static const char kGenericCpu[] = "generic";
27static const char kNoFeatures[] = "";
John Brawnb371ccc2018-07-03 10:52:20 +000028
John Brawnc4ed6002018-07-03 10:10:29 +000029class AArch64TargetTest : public ::testing::Test {
30protected:
31 AArch64TargetTest()
John Brawnb371ccc2018-07-03 10:52:20 +000032 : ExegesisTarget_(ExegesisTarget::lookup(llvm::Triple(kTriple))) {
33 EXPECT_THAT(ExegesisTarget_, NotNull());
34 std::string error;
35 Target_ = llvm::TargetRegistry::lookupTarget(kTriple, error);
John Brawnc4ed6002018-07-03 10:10:29 +000036 EXPECT_THAT(Target_, NotNull());
Guillaume Chateletc96a97b2018-09-20 12:22:18 +000037 STI_.reset(
38 Target_->createMCSubtargetInfo(kTriple, kGenericCpu, kNoFeatures));
John Brawnc4ed6002018-07-03 10:10:29 +000039 }
Guillaume Chateletc96a97b2018-09-20 12:22:18 +000040
John Brawnb371ccc2018-07-03 10:52:20 +000041 static void SetUpTestCase() {
42 LLVMInitializeAArch64TargetInfo();
43 LLVMInitializeAArch64Target();
44 LLVMInitializeAArch64TargetMC();
45 InitializeAArch64ExegesisTarget();
46 }
John Brawnc4ed6002018-07-03 10:10:29 +000047
Guillaume Chateletc96a97b2018-09-20 12:22:18 +000048 std::vector<MCInst> setRegTo(unsigned Reg, const APInt &Value) {
49 return ExegesisTarget_->setRegTo(*STI_, Reg, Value);
50 }
51
John Brawnb371ccc2018-07-03 10:52:20 +000052 const llvm::Target *Target_;
53 const ExegesisTarget *const ExegesisTarget_;
Guillaume Chateletc96a97b2018-09-20 12:22:18 +000054 std::unique_ptr<llvm::MCSubtargetInfo> STI_;
John Brawnc4ed6002018-07-03 10:10:29 +000055};
56
Guillaume Chateletc96a97b2018-09-20 12:22:18 +000057TEST_F(AArch64TargetTest, SetRegToConstant) {
58 // The AArch64 target currently doesn't know how to set register values.
59 const auto Insts = setRegTo(llvm::AArch64::X0, llvm::APInt());
60 EXPECT_THAT(Insts, Not(IsEmpty()));
61}
62
John Brawnc4ed6002018-07-03 10:10:29 +000063} // namespace
64} // namespace exegesis