- //===-- llvm/MC/MCInstrInfo.h - Target Instruction Info ---------*- C++ -*-===// 
- // 
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 
- // See https://llvm.org/LICENSE.txt for license information. 
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 
- // 
- //===----------------------------------------------------------------------===// 
- // 
- // This file describes the target machine instruction set. 
- // 
- //===----------------------------------------------------------------------===// 
-   
- #ifndef LLVM_MC_MCINSTRINFO_H 
- #define LLVM_MC_MCINSTRINFO_H 
-   
- #include "llvm/ADT/StringRef.h" 
- #include "llvm/MC/MCInstrDesc.h" 
- #include <cassert> 
-   
- namespace llvm { 
-   
- class MCSubtargetInfo; 
-   
- //--------------------------------------------------------------------------- 
- /// Interface to description of machine instruction set. 
- class MCInstrInfo { 
- public: 
-   using ComplexDeprecationPredicate = bool (*)(MCInst &, 
-                                                const MCSubtargetInfo &, 
-                                                std::string &); 
-   
- private: 
-   const MCInstrDesc *LastDesc;      // Raw array to allow static init'n 
-   const unsigned *InstrNameIndices; // Array for name indices in InstrNameData 
-   const char *InstrNameData;        // Instruction name string pool 
-   // Subtarget feature that an instruction is deprecated on, if any 
-   // -1 implies this is not deprecated by any single feature. It may still be 
-   // deprecated due to a "complex" reason, below. 
-   const uint8_t *DeprecatedFeatures; 
-   // A complex method to determine if a certain instruction is deprecated or 
-   // not, and return the reason for deprecation. 
-   const ComplexDeprecationPredicate *ComplexDeprecationInfos; 
-   unsigned NumOpcodes;              // Number of entries in the desc array 
-   
- public: 
-   /// Initialize MCInstrInfo, called by TableGen auto-generated routines. 
-   /// *DO NOT USE*. 
-   void InitMCInstrInfo(const MCInstrDesc *D, const unsigned *NI, const char *ND, 
-                        const uint8_t *DF, 
-                        const ComplexDeprecationPredicate *CDI, unsigned NO) { 
-     LastDesc = D + NO - 1; 
-     InstrNameIndices = NI; 
-     InstrNameData = ND; 
-     DeprecatedFeatures = DF; 
-     ComplexDeprecationInfos = CDI; 
-     NumOpcodes = NO; 
-   } 
-   
-   unsigned getNumOpcodes() const { return NumOpcodes; } 
-   
-   /// Return the machine instruction descriptor that corresponds to the 
-   /// specified instruction opcode. 
-   const MCInstrDesc &get(unsigned Opcode) const { 
-     assert(Opcode < NumOpcodes && "Invalid opcode!"); 
-     // The table is indexed backwards from the last entry. 
-     return *(LastDesc - Opcode); 
-   } 
-   
-   /// Returns the name for the instructions with the given opcode. 
-   StringRef getName(unsigned Opcode) const { 
-     assert(Opcode < NumOpcodes && "Invalid opcode!"); 
-     return StringRef(&InstrNameData[InstrNameIndices[Opcode]]); 
-   } 
-   
-   /// Returns true if a certain instruction is deprecated and if so 
-   /// returns the reason in \p Info. 
-   bool getDeprecatedInfo(MCInst &MI, const MCSubtargetInfo &STI, 
-                          std::string &Info) const; 
- }; 
-   
- } // End llvm namespace 
-   
- #endif 
-