brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.2 KiB · b1cc425 Raw
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