xref: /llvm-project/llvm/unittests/tools/llvm-exegesis/AArch64/TargetTest.cpp (revision 534c096ec9a67e7159a1ca987092532eee2c7662)
156c74cffSJinsong Ji //===-- TargetTest.cpp ------------------------------------------*- C++ -*-===//
256c74cffSJinsong Ji //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
656c74cffSJinsong Ji //
756c74cffSJinsong Ji //===----------------------------------------------------------------------===//
856c74cffSJinsong Ji 
9c4ed6004SJohn Brawn #include "Target.h"
10c4ed6004SJohn Brawn 
11c4ed6004SJohn Brawn #include <cassert>
12c4ed6004SJohn Brawn #include <memory>
13c4ed6004SJohn Brawn 
14c4ed6004SJohn Brawn #include "MCTargetDesc/AArch64MCTargetDesc.h"
15*89b57061SReid Kleckner #include "llvm/MC/TargetRegistry.h"
16b371ccc6SJohn Brawn #include "llvm/Support/TargetSelect.h"
17c4ed6004SJohn Brawn #include "gmock/gmock.h"
18c4ed6004SJohn Brawn #include "gtest/gtest.h"
19c4ed6004SJohn Brawn 
2032401afdSFangrui Song namespace llvm {
21c4ed6004SJohn Brawn namespace exegesis {
22c4ed6004SJohn Brawn 
23c4ed6004SJohn Brawn void InitializeAArch64ExegesisTarget();
24c4ed6004SJohn Brawn 
25c4ed6004SJohn Brawn namespace {
26c4ed6004SJohn Brawn 
27c96a97baSGuillaume Chatelet using testing::IsEmpty;
28c96a97baSGuillaume Chatelet using testing::Not;
29c4ed6004SJohn Brawn using testing::NotNull;
30c4ed6004SJohn Brawn 
3112ca74e5SGuillaume Chatelet constexpr const char kTriple[] = "aarch64-unknown-linux";
32b371ccc6SJohn Brawn 
33c4ed6004SJohn Brawn class AArch64TargetTest : public ::testing::Test {
34c4ed6004SJohn Brawn protected:
AArch64TargetTest()35c4ed6004SJohn Brawn   AArch64TargetTest()
36d422d3a7SClement Courbet       : ExegesisTarget_(ExegesisTarget::lookup(Triple(kTriple))) {
37b371ccc6SJohn Brawn     EXPECT_THAT(ExegesisTarget_, NotNull());
38b371ccc6SJohn Brawn     std::string error;
39d422d3a7SClement Courbet     Target_ = TargetRegistry::lookupTarget(kTriple, error);
40c4ed6004SJohn Brawn     EXPECT_THAT(Target_, NotNull());
41c96a97baSGuillaume Chatelet     STI_.reset(
4212ca74e5SGuillaume Chatelet         Target_->createMCSubtargetInfo(kTriple, "generic", /*no features*/ ""));
43c4ed6004SJohn Brawn   }
44c96a97baSGuillaume Chatelet 
SetUpTestCase()45b371ccc6SJohn Brawn   static void SetUpTestCase() {
46b371ccc6SJohn Brawn     LLVMInitializeAArch64TargetInfo();
47b371ccc6SJohn Brawn     LLVMInitializeAArch64Target();
48b371ccc6SJohn Brawn     LLVMInitializeAArch64TargetMC();
49b371ccc6SJohn Brawn     InitializeAArch64ExegesisTarget();
50b371ccc6SJohn Brawn   }
51c4ed6004SJohn Brawn 
setRegTo(unsigned Reg,const APInt & Value)52c96a97baSGuillaume Chatelet   std::vector<MCInst> setRegTo(unsigned Reg, const APInt &Value) {
53c96a97baSGuillaume Chatelet     return ExegesisTarget_->setRegTo(*STI_, Reg, Value);
54c96a97baSGuillaume Chatelet   }
55c96a97baSGuillaume Chatelet 
56d422d3a7SClement Courbet   const Target *Target_;
57b371ccc6SJohn Brawn   const ExegesisTarget *const ExegesisTarget_;
58d422d3a7SClement Courbet   std::unique_ptr<MCSubtargetInfo> STI_;
59c4ed6004SJohn Brawn };
60c4ed6004SJohn Brawn 
TEST_F(AArch64TargetTest,SetRegToConstant)61c96a97baSGuillaume Chatelet TEST_F(AArch64TargetTest, SetRegToConstant) {
62c96a97baSGuillaume Chatelet   // The AArch64 target currently doesn't know how to set register values.
63d422d3a7SClement Courbet   const auto Insts = setRegTo(AArch64::X0, APInt());
64c96a97baSGuillaume Chatelet   EXPECT_THAT(Insts, Not(IsEmpty()));
65c96a97baSGuillaume Chatelet }
66c96a97baSGuillaume Chatelet 
TEST_F(AArch64TargetTest,DefaultPfmCounters)67eee2e06eSClement Courbet TEST_F(AArch64TargetTest, DefaultPfmCounters) {
68df78bf14SClement Courbet   const std::string Expected = "CPU_CYCLES";
69df78bf14SClement Courbet   EXPECT_EQ(ExegesisTarget_->getPfmCounters("").CycleCounter, Expected);
70eee2e06eSClement Courbet   EXPECT_EQ(ExegesisTarget_->getPfmCounters("unknown_cpu").CycleCounter,
71df78bf14SClement Courbet             Expected);
72eee2e06eSClement Courbet }
73eee2e06eSClement Courbet 
74c4ed6004SJohn Brawn } // namespace
75c4ed6004SJohn Brawn } // namespace exegesis
7632401afdSFangrui Song } // namespace llvm
77