1//===-- llvm/MC/MCInstrInfo.h - Target Instruction Info ---------*- C++ -*-===//
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-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file describes the target machine instruction set.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_MC_MCINSTRINFO_H
14#define LLVM_MC_MCINSTRINFO_H
15
16#include "llvm/ADT/StringRef.h"
17#include "llvm/MC/MCInstrDesc.h"
18#include <cassert>
19
20namespace llvm {
21
22class MCSubtargetInfo;
23
24//---------------------------------------------------------------------------
25/// Interface to description of machine instruction set.
26class MCInstrInfo {
27public:
28  using ComplexDeprecationPredicate = bool (*)(MCInst &,
29                                               const MCSubtargetInfo &,
30                                               std::string &);
31
32private:
33  const MCInstrDesc *LastDesc;      // Raw array to allow static init'n
34  const unsigned *InstrNameIndices; // Array for name indices in InstrNameData
35  const char *InstrNameData;        // Instruction name string pool
36  // Subtarget feature that an instruction is deprecated on, if any
37  // -1 implies this is not deprecated by any single feature. It may still be
38  // deprecated due to a "complex" reason, below.
39  const uint8_t *DeprecatedFeatures;
40  // A complex method to determine if a certain instruction is deprecated or
41  // not, and return the reason for deprecation.
42  const ComplexDeprecationPredicate *ComplexDeprecationInfos;
43  unsigned NumOpcodes;              // Number of entries in the desc array
44
45public:
46  /// Initialize MCInstrInfo, called by TableGen auto-generated routines.
47  /// *DO NOT USE*.
48  void InitMCInstrInfo(const MCInstrDesc *D, const unsigned *NI, const char *ND,
49                       const uint8_t *DF,
50                       const ComplexDeprecationPredicate *CDI, unsigned NO) {
51    LastDesc = D + NO - 1;
52    InstrNameIndices = NI;
53    InstrNameData = ND;
54    DeprecatedFeatures = DF;
55    ComplexDeprecationInfos = CDI;
56    NumOpcodes = NO;
57  }
58
59  unsigned getNumOpcodes() const { return NumOpcodes; }
60
61  /// Return the machine instruction descriptor that corresponds to the
62  /// specified instruction opcode.
63  const MCInstrDesc &get(unsigned Opcode) const {
64    assert(Opcode < NumOpcodes && "Invalid opcode!");
65    // The table is indexed backwards from the last entry.
66    return *(LastDesc - Opcode);
67  }
68
69  /// Returns the name for the instructions with the given opcode.
70  StringRef getName(unsigned Opcode) const {
71    assert(Opcode < NumOpcodes && "Invalid opcode!");
72    return StringRef(&InstrNameData[InstrNameIndices[Opcode]]);
73  }
74
75  /// Returns true if a certain instruction is deprecated and if so
76  /// returns the reason in \p Info.
77  bool getDeprecatedInfo(MCInst &MI, const MCSubtargetInfo &STI,
78                         std::string &Info) const;
79};
80
81} // End llvm namespace
82
83#endif
84