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 | |
20 | namespace llvm { |
21 | |
22 | class MCSubtargetInfo; |
23 | |
24 | //--------------------------------------------------------------------------- |
25 | /// Interface to description of machine instruction set. |
26 | class MCInstrInfo { |
27 | public: |
28 | using ComplexDeprecationPredicate = bool (*)(MCInst &, |
29 | const MCSubtargetInfo &, |
30 | std::string &); |
31 | |
32 | private: |
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 | |
45 | public: |
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 | |