|  | //===- SubtargetFeatureInfo.h - Helpers for subtarget features ------------===// | 
|  | // | 
|  | //                     The LLVM Compiler Infrastructure | 
|  | // | 
|  | // This file is distributed under the University of Illinois Open Source | 
|  | // License. See LICENSE.TXT for details. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #ifndef LLVM_UTIL_TABLEGEN_SUBTARGETFEATUREINFO_H | 
|  | #define LLVM_UTIL_TABLEGEN_SUBTARGETFEATUREINFO_H | 
|  |  | 
|  | #include "llvm/TableGen/Error.h" | 
|  | #include "llvm/TableGen/Record.h" | 
|  |  | 
|  | #include <map> | 
|  | #include <string> | 
|  | #include <vector> | 
|  |  | 
|  | namespace llvm { | 
|  | class Record; | 
|  | class RecordKeeper; | 
|  |  | 
|  | struct SubtargetFeatureInfo; | 
|  | using SubtargetFeatureInfoMap = std::map<Record *, SubtargetFeatureInfo, LessRecordByID>; | 
|  |  | 
|  | /// Helper class for storing information on a subtarget feature which | 
|  | /// participates in instruction matching. | 
|  | struct SubtargetFeatureInfo { | 
|  | /// The predicate record for this feature. | 
|  | Record *TheDef; | 
|  |  | 
|  | /// An unique index assigned to represent this feature. | 
|  | uint64_t Index; | 
|  |  | 
|  | SubtargetFeatureInfo(Record *D, uint64_t Idx) : TheDef(D), Index(Idx) {} | 
|  |  | 
|  | /// The name of the enumerated constant identifying this feature. | 
|  | std::string getEnumName() const { | 
|  | return "Feature_" + TheDef->getName().str(); | 
|  | } | 
|  |  | 
|  | /// The name of the enumerated constant identifying the bitnumber for | 
|  | /// this feature. | 
|  | std::string getEnumBitName() const { | 
|  | return "Feature_" + TheDef->getName().str() + "Bit"; | 
|  | } | 
|  |  | 
|  | bool mustRecomputePerFunction() const { | 
|  | return TheDef->getValueAsBit("RecomputePerFunction"); | 
|  | } | 
|  |  | 
|  | void dump() const; | 
|  | static std::vector<std::pair<Record *, SubtargetFeatureInfo>> | 
|  | getAll(const RecordKeeper &Records); | 
|  |  | 
|  | /// Emit the subtarget feature flag definitions. | 
|  | /// | 
|  | /// This version emits the bit value for the feature and is therefore limited | 
|  | /// to 64 feature bits. | 
|  | static void emitSubtargetFeatureFlagEnumeration( | 
|  | SubtargetFeatureInfoMap &SubtargetFeatures, raw_ostream &OS); | 
|  |  | 
|  | /// Emit the subtarget feature flag definitions. | 
|  | /// | 
|  | /// This version emits the bit index for the feature and can therefore support | 
|  | /// more than 64 feature bits. | 
|  | static void | 
|  | emitSubtargetFeatureBitEnumeration(SubtargetFeatureInfoMap &SubtargetFeatures, | 
|  | raw_ostream &OS); | 
|  |  | 
|  | static void emitNameTable(SubtargetFeatureInfoMap &SubtargetFeatures, | 
|  | raw_ostream &OS); | 
|  |  | 
|  | /// Emit the function to compute the list of available features given a | 
|  | /// subtarget. | 
|  | /// | 
|  | /// This version is used for subtarget features defined using Predicate<> | 
|  | /// and supports more than 64 feature bits. | 
|  | /// | 
|  | /// \param TargetName The name of the target as used in class prefixes (e.g. | 
|  | ///                   <TargetName>Subtarget) | 
|  | /// \param ClassName  The name of the class (without the <Target> prefix) | 
|  | ///                   that will contain the generated functions. | 
|  | /// \param FuncName   The name of the function to emit. | 
|  | /// \param SubtargetFeatures A map of TableGen records to the | 
|  | ///                          SubtargetFeatureInfo equivalent. | 
|  | /// \param ExtraParams Additional arguments to the generated function. | 
|  | static void | 
|  | emitComputeAvailableFeatures(StringRef TargetName, StringRef ClassName, | 
|  | StringRef FuncName, | 
|  | SubtargetFeatureInfoMap &SubtargetFeatures, | 
|  | raw_ostream &OS, StringRef ExtraParams = ""); | 
|  |  | 
|  | /// Emit the function to compute the list of available features given a | 
|  | /// subtarget. | 
|  | /// | 
|  | /// This version is used for subtarget features defined using | 
|  | /// AssemblerPredicate<> and supports up to 64 feature bits. | 
|  | /// | 
|  | /// \param TargetName The name of the target as used in class prefixes (e.g. | 
|  | ///                   <TargetName>Subtarget) | 
|  | /// \param ClassName  The name of the class (without the <Target> prefix) | 
|  | ///                   that will contain the generated functions. | 
|  | /// \param FuncName   The name of the function to emit. | 
|  | /// \param SubtargetFeatures A map of TableGen records to the | 
|  | ///                          SubtargetFeatureInfo equivalent. | 
|  | static void emitComputeAssemblerAvailableFeatures( | 
|  | StringRef TargetName, StringRef ClassName, StringRef FuncName, | 
|  | SubtargetFeatureInfoMap &SubtargetFeatures, raw_ostream &OS); | 
|  | }; | 
|  | } // end namespace llvm | 
|  |  | 
|  | #endif // LLVM_UTIL_TABLEGEN_SUBTARGETFEATUREINFO_H |