192 lines · cpp
1//===- MCInstrAnalysisTest.cpp - AArch64MCInstrAnalysis unit tests --------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "llvm/MC/MCInstrAnalysis.h"10#include "MCTargetDesc/AArch64MCTargetDesc.h"11#include "Utils/AArch64BaseInfo.h"12#include "llvm/MC/MCInstBuilder.h"13#include "llvm/MC/TargetRegistry.h"14#include "llvm/Support/TargetSelect.h"15 16#include "gtest/gtest.h"17 18#include <memory>19 20using namespace llvm;21 22namespace {23 24class InstrAnalysisTest : public testing::TestWithParam<const char *> {25protected:26 std::unique_ptr<const MCInstrInfo> Info;27 std::unique_ptr<const MCInstrAnalysis> Analysis;28 29 static void SetUpTestSuite() {30 LLVMInitializeAArch64TargetInfo();31 LLVMInitializeAArch64Target();32 LLVMInitializeAArch64TargetMC();33 }34 35 InstrAnalysisTest() {36 std::string Error;37 Triple TT(Triple::normalize(GetParam()));38 const Target *TheTarget = TargetRegistry::lookupTarget(TT, Error);39 Info = std::unique_ptr<const MCInstrInfo>(TheTarget->createMCInstrInfo());40 Analysis = std::unique_ptr<const MCInstrAnalysis>(41 TheTarget->createMCInstrAnalysis(Info.get()));42 }43};44 45} // namespace46 47static MCInst beq() {48 return MCInstBuilder(AArch64::Bcc).addImm(AArch64CC::EQ).addReg(AArch64::X0);49}50static MCInst tbz(unsigned Rt = AArch64::X0, unsigned Imm = 0,51 unsigned Label = 32) {52 return MCInstBuilder(AArch64::TBZX).addReg(Rt).addImm(Imm).addImm(Label);53}54static MCInst cbz(unsigned Rt = AArch64::X0, unsigned Label = 32) {55 return MCInstBuilder(AArch64::CBZX).addReg(Rt).addImm(Label);56}57static MCInst b() { return MCInstBuilder(AArch64::B).addImm(32); }58static MCInst bl() { return MCInstBuilder(AArch64::BL).addImm(32); }59static MCInst br(unsigned Rn = AArch64::X0) {60 return MCInstBuilder(AArch64::BR).addReg(Rn);61}62static MCInst blr(unsigned Rn = AArch64::X0) {63 return MCInstBuilder(AArch64::BLR).addReg(Rn);64}65static MCInst ret(unsigned Rn = AArch64::LR) {66 return MCInstBuilder(AArch64::RET).addReg(Rn);67}68static MCInst retaa() { return MCInstBuilder(AArch64::RETAA); }69static MCInst eret() { return MCInstBuilder(AArch64::ERET); }70static MCInst hlt() { return MCInstBuilder(AArch64::HLT); }71static MCInst brk() { return MCInstBuilder(AArch64::BRK); }72static MCInst svc() { return MCInstBuilder(AArch64::SVC); }73static MCInst hvc() { return MCInstBuilder(AArch64::HVC); }74static MCInst smc() { return MCInstBuilder(AArch64::SMC); }75 76TEST_P(InstrAnalysisTest, IsTerminator) {77 EXPECT_TRUE(Analysis->isTerminator(beq()));78 EXPECT_TRUE(Analysis->isTerminator(tbz()));79 EXPECT_TRUE(Analysis->isTerminator(cbz()));80 EXPECT_TRUE(Analysis->isTerminator(b()));81 EXPECT_FALSE(Analysis->isTerminator(bl()));82 EXPECT_FALSE(Analysis->isTerminator(blr()));83 EXPECT_TRUE(Analysis->isTerminator(br()));84 EXPECT_TRUE(Analysis->isTerminator(ret()));85 EXPECT_TRUE(Analysis->isTerminator(retaa()));86 EXPECT_TRUE(Analysis->isTerminator(eret()));87 EXPECT_FALSE(Analysis->isTerminator(hlt()));88 EXPECT_FALSE(Analysis->isTerminator(brk()));89 EXPECT_FALSE(Analysis->isTerminator(svc()));90 EXPECT_FALSE(Analysis->isTerminator(hvc()));91 EXPECT_FALSE(Analysis->isTerminator(smc()));92}93 94TEST_P(InstrAnalysisTest, IsBarrier) {95 EXPECT_FALSE(Analysis->isBarrier(beq()));96 EXPECT_FALSE(Analysis->isBarrier(tbz()));97 EXPECT_FALSE(Analysis->isBarrier(cbz()));98 EXPECT_TRUE(Analysis->isBarrier(b()));99 EXPECT_FALSE(Analysis->isBarrier(bl()));100 EXPECT_FALSE(Analysis->isBarrier(blr()));101 EXPECT_TRUE(Analysis->isBarrier(br()));102 EXPECT_TRUE(Analysis->isBarrier(ret()));103 EXPECT_TRUE(Analysis->isBarrier(retaa()));104 EXPECT_TRUE(Analysis->isBarrier(eret()));105 EXPECT_FALSE(Analysis->isBarrier(hlt()));106 EXPECT_FALSE(Analysis->isBarrier(brk()));107 EXPECT_FALSE(Analysis->isBarrier(svc()));108 EXPECT_FALSE(Analysis->isBarrier(hvc()));109 EXPECT_FALSE(Analysis->isBarrier(smc()));110}111 112TEST_P(InstrAnalysisTest, IsCall) {113 EXPECT_FALSE(Analysis->isCall(beq()));114 EXPECT_FALSE(Analysis->isCall(tbz()));115 EXPECT_FALSE(Analysis->isCall(cbz()));116 EXPECT_FALSE(Analysis->isCall(b()));117 EXPECT_TRUE(Analysis->isCall(bl()));118 EXPECT_TRUE(Analysis->isCall(blr()));119 EXPECT_FALSE(Analysis->isCall(br()));120 EXPECT_FALSE(Analysis->isCall(ret()));121 EXPECT_FALSE(Analysis->isCall(retaa()));122 EXPECT_FALSE(Analysis->isCall(eret()));123}124 125TEST_P(InstrAnalysisTest, IsReturn) {126 EXPECT_FALSE(Analysis->isReturn(beq()));127 EXPECT_FALSE(Analysis->isReturn(tbz()));128 EXPECT_FALSE(Analysis->isReturn(cbz()));129 EXPECT_FALSE(Analysis->isReturn(b()));130 EXPECT_FALSE(Analysis->isReturn(bl()));131 EXPECT_FALSE(Analysis->isReturn(br()));132 EXPECT_FALSE(Analysis->isReturn(blr()));133 EXPECT_FALSE(Analysis->isReturn(br(AArch64::LR)));134 EXPECT_TRUE(Analysis->isReturn(ret()));135 EXPECT_TRUE(Analysis->isReturn(retaa()));136 EXPECT_TRUE(Analysis->isReturn(eret()));137}138 139TEST_P(InstrAnalysisTest, IsBranch) {140 EXPECT_TRUE(Analysis->isBranch(beq()));141 EXPECT_TRUE(Analysis->isBranch(tbz()));142 EXPECT_TRUE(Analysis->isBranch(cbz()));143 EXPECT_TRUE(Analysis->isBranch(b()));144 EXPECT_FALSE(Analysis->isBranch(bl()));145 EXPECT_FALSE(Analysis->isBranch(blr()));146 EXPECT_TRUE(Analysis->isBranch(br()));147 EXPECT_FALSE(Analysis->isBranch(ret()));148 EXPECT_FALSE(Analysis->isBranch(retaa()));149 EXPECT_FALSE(Analysis->isBranch(eret()));150}151 152TEST_P(InstrAnalysisTest, IsConditionalBranch) {153 EXPECT_TRUE(Analysis->isConditionalBranch(beq()));154 EXPECT_TRUE(Analysis->isConditionalBranch(tbz()));155 EXPECT_TRUE(Analysis->isConditionalBranch(cbz()));156 EXPECT_FALSE(Analysis->isConditionalBranch(b()));157 EXPECT_FALSE(Analysis->isConditionalBranch(bl()));158 EXPECT_FALSE(Analysis->isConditionalBranch(blr()));159 EXPECT_FALSE(Analysis->isConditionalBranch(ret()));160 EXPECT_FALSE(Analysis->isConditionalBranch(retaa()));161 EXPECT_FALSE(Analysis->isConditionalBranch(eret()));162}163 164TEST_P(InstrAnalysisTest, IsUnconditionalBranch) {165 EXPECT_FALSE(Analysis->isUnconditionalBranch(beq()));166 EXPECT_FALSE(Analysis->isUnconditionalBranch(tbz()));167 EXPECT_FALSE(Analysis->isUnconditionalBranch(cbz()));168 EXPECT_TRUE(Analysis->isUnconditionalBranch(b()));169 EXPECT_FALSE(Analysis->isUnconditionalBranch(bl()));170 EXPECT_FALSE(Analysis->isUnconditionalBranch(blr()));171 EXPECT_FALSE(Analysis->isUnconditionalBranch(br()));172 EXPECT_FALSE(Analysis->isUnconditionalBranch(ret()));173 EXPECT_FALSE(Analysis->isUnconditionalBranch(retaa()));174 EXPECT_FALSE(Analysis->isUnconditionalBranch(eret()));175}176 177TEST_P(InstrAnalysisTest, IsIndirectBranch) {178 EXPECT_FALSE(Analysis->isIndirectBranch(beq()));179 EXPECT_FALSE(Analysis->isIndirectBranch(tbz()));180 EXPECT_FALSE(Analysis->isIndirectBranch(cbz()));181 EXPECT_FALSE(Analysis->isIndirectBranch(b()));182 EXPECT_FALSE(Analysis->isIndirectBranch(bl()));183 EXPECT_FALSE(Analysis->isIndirectBranch(blr()));184 EXPECT_TRUE(Analysis->isIndirectBranch(br()));185 EXPECT_FALSE(Analysis->isIndirectBranch(ret()));186 EXPECT_FALSE(Analysis->isIndirectBranch(retaa()));187 EXPECT_FALSE(Analysis->isIndirectBranch(eret()));188}189 190INSTANTIATE_TEST_SUITE_P(AArch64, InstrAnalysisTest,191 testing::Values("aarch64"));192