1 //===-- llvm/MC/SubtargetFeature.h - CPU characteristics --------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file defines and manages user or tool specified CPU characteristics. 11 // The intent is to be able to package specific features that should or should 12 // not be used on a specific target processor. A tool, such as llc, could, as 13 // as example, gather chip info from the command line, a long with features 14 // that should be used on that chip. 15 // 16 //===----------------------------------------------------------------------===// 17 18 #ifndef LLVM_MC_SUBTARGETFEATURE_H 19 #define LLVM_MC_SUBTARGETFEATURE_H 20 21 #include "llvm/ADT/Triple.h" 22 #include "llvm/Support/DataTypes.h" 23 #include <bitset> 24 #include <vector> 25 26 namespace llvm { 27 template <typename T> class ArrayRef; 28 class raw_ostream; 29 class StringRef; 30 31 // A container class for subtarget features. 32 // This is convenient because std::bitset does not have a constructor 33 // with an initializer list of set bits. 34 const unsigned MAX_SUBTARGET_FEATURES = 128; 35 class FeatureBitset : public std::bitset<MAX_SUBTARGET_FEATURES> { 36 public: 37 // Cannot inherit constructors because it's not supported by VC++.. FeatureBitset()38 FeatureBitset() : bitset() {} 39 FeatureBitset(const bitset<MAX_SUBTARGET_FEATURES> & B)40 FeatureBitset(const bitset<MAX_SUBTARGET_FEATURES>& B) : bitset(B) {} 41 FeatureBitset(std::initializer_list<unsigned> Init)42 FeatureBitset(std::initializer_list<unsigned> Init) : bitset() { 43 for (auto I : Init) 44 set(I); 45 } 46 }; 47 48 //===----------------------------------------------------------------------===// 49 /// 50 /// SubtargetFeatureKV - Used to provide key value pairs for feature and 51 /// CPU bit flags. 52 // 53 struct SubtargetFeatureKV { 54 const char *Key; // K-V key string 55 const char *Desc; // Help descriptor 56 FeatureBitset Value; // K-V integer value 57 FeatureBitset Implies; // K-V bit mask 58 59 // Compare routine for std::lower_bound 60 bool operator<(StringRef S) const { 61 return StringRef(Key) < S; 62 } 63 64 // Compare routine for std::is_sorted. 65 bool operator<(const SubtargetFeatureKV &Other) const { 66 return StringRef(Key) < StringRef(Other.Key); 67 } 68 }; 69 70 //===----------------------------------------------------------------------===// 71 /// 72 /// SubtargetInfoKV - Used to provide key value pairs for CPU and arbitrary 73 /// pointers. 74 // 75 struct SubtargetInfoKV { 76 const char *Key; // K-V key string 77 const void *Value; // K-V pointer value 78 79 // Compare routine for std::lower_bound 80 bool operator<(StringRef S) const { 81 return StringRef(Key) < S; 82 } 83 }; 84 85 //===----------------------------------------------------------------------===// 86 /// 87 /// SubtargetFeatures - Manages the enabling and disabling of subtarget 88 /// specific features. Features are encoded as a string of the form 89 /// "+attr1,+attr2,-attr3,...,+attrN" 90 /// A comma separates each feature from the next (all lowercase.) 91 /// Each of the remaining features is prefixed with + or - indicating whether 92 /// that feature should be enabled or disabled contrary to the cpu 93 /// specification. 94 /// 95 96 class SubtargetFeatures { 97 std::vector<std::string> Features; // Subtarget features as a vector 98 public: 99 explicit SubtargetFeatures(StringRef Initial = ""); 100 101 /// Features string accessors. 102 std::string getString() const; 103 104 /// Adding Features. 105 void AddFeature(StringRef String, bool Enable = true); 106 107 /// ToggleFeature - Toggle a feature and update the feature bits. 108 static void ToggleFeature(FeatureBitset &Bits, StringRef String, 109 ArrayRef<SubtargetFeatureKV> FeatureTable); 110 111 /// Apply the feature flag and update the feature bits. 112 static void ApplyFeatureFlag(FeatureBitset &Bits, StringRef Feature, 113 ArrayRef<SubtargetFeatureKV> FeatureTable); 114 115 /// Get feature bits of a CPU. 116 FeatureBitset getFeatureBits(StringRef CPU, 117 ArrayRef<SubtargetFeatureKV> CPUTable, 118 ArrayRef<SubtargetFeatureKV> FeatureTable); 119 120 /// Print feature string. 121 void print(raw_ostream &OS) const; 122 123 // Dump feature info. 124 void dump() const; 125 126 /// Adds the default features for the specified target triple. 127 void getDefaultSubtargetFeatures(const Triple& Triple); 128 }; 129 130 } // End namespace llvm 131 132 #endif 133