blob: 8a519bb2e7b5fd90d8b11189f4fd549be1bd5153 [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
Fangrui Song32401af2018-10-22 17:10:47 +000012namespace llvm {
John Brawnc4ed6002018-07-03 10:10:29 +000013namespace exegesis {
14
15void InitializeAArch64ExegesisTarget();
16
17namespace {
18
Guillaume Chateletc96a97b2018-09-20 12:22:18 +000019using llvm::APInt;
20using llvm::MCInst;
John Brawnc4ed6002018-07-03 10:10:29 +000021using testing::Gt;
Guillaume Chateletc96a97b2018-09-20 12:22:18 +000022using testing::IsEmpty;
23using testing::Not;
John Brawnc4ed6002018-07-03 10:10:29 +000024using testing::NotNull;
John Brawnc4ed6002018-07-03 10:10:29 +000025
Guillaume Chatelet12ca74e2018-09-20 13:37:04 +000026constexpr const char kTriple[] = "aarch64-unknown-linux";
John Brawnb371ccc2018-07-03 10:52:20 +000027
John Brawnc4ed6002018-07-03 10:10:29 +000028class AArch64TargetTest : public ::testing::Test {
29protected:
30 AArch64TargetTest()
John Brawnb371ccc2018-07-03 10:52:20 +000031 : ExegesisTarget_(ExegesisTarget::lookup(llvm::Triple(kTriple))) {
32 EXPECT_THAT(ExegesisTarget_, NotNull());
33 std::string error;
34 Target_ = llvm::TargetRegistry::lookupTarget(kTriple, error);
John Brawnc4ed6002018-07-03 10:10:29 +000035 EXPECT_THAT(Target_, NotNull());
Guillaume Chateletc96a97b2018-09-20 12:22:18 +000036 STI_.reset(
Guillaume Chatelet12ca74e2018-09-20 13:37:04 +000037 Target_->createMCSubtargetInfo(kTriple, "generic", /*no features*/ ""));
John Brawnc4ed6002018-07-03 10:10:29 +000038 }
Guillaume Chateletc96a97b2018-09-20 12:22:18 +000039
John Brawnb371ccc2018-07-03 10:52:20 +000040 static void SetUpTestCase() {
41 LLVMInitializeAArch64TargetInfo();
42 LLVMInitializeAArch64Target();
43 LLVMInitializeAArch64TargetMC();
44 InitializeAArch64ExegesisTarget();
45 }
John Brawnc4ed6002018-07-03 10:10:29 +000046
Guillaume Chateletc96a97b2018-09-20 12:22:18 +000047 std::vector<MCInst> setRegTo(unsigned Reg, const APInt &Value) {
48 return ExegesisTarget_->setRegTo(*STI_, Reg, Value);
49 }
50
John Brawnb371ccc2018-07-03 10:52:20 +000051 const llvm::Target *Target_;
52 const ExegesisTarget *const ExegesisTarget_;
Guillaume Chateletc96a97b2018-09-20 12:22:18 +000053 std::unique_ptr<llvm::MCSubtargetInfo> STI_;
John Brawnc4ed6002018-07-03 10:10:29 +000054};
55
Guillaume Chateletc96a97b2018-09-20 12:22:18 +000056TEST_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
John Brawnc4ed6002018-07-03 10:10:29 +000062} // namespace
63} // namespace exegesis
Fangrui Song32401af2018-10-22 17:10:47 +000064} // namespace llvm