Home | History | Annotate | Download | only in MC
      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 <vector>
     22 #include "llvm/ADT/Triple.h"
     23 #include "llvm/Support/DataTypes.h"
     24 
     25 namespace llvm {
     26   class raw_ostream;
     27   class StringRef;
     28 
     29 //===----------------------------------------------------------------------===//
     30 ///
     31 /// SubtargetFeatureKV - Used to provide key value pairs for feature and
     32 /// CPU bit flags.
     33 //
     34 struct SubtargetFeatureKV {
     35   const char *Key;                      // K-V key string
     36   const char *Desc;                     // Help descriptor
     37   uint64_t Value;                       // K-V integer value
     38   uint64_t Implies;                     // K-V bit mask
     39 
     40   // Compare routine for std binary search
     41   bool operator<(const SubtargetFeatureKV &S) const {
     42     return strcmp(Key, S.Key) < 0;
     43   }
     44 };
     45 
     46 //===----------------------------------------------------------------------===//
     47 ///
     48 /// SubtargetInfoKV - Used to provide key value pairs for CPU and arbitrary
     49 /// pointers.
     50 //
     51 struct SubtargetInfoKV {
     52   const char *Key;                      // K-V key string
     53   void *Value;                          // K-V pointer value
     54 
     55   // Compare routine for std binary search
     56   bool operator<(const SubtargetInfoKV &S) const {
     57     return strcmp(Key, S.Key) < 0;
     58   }
     59 };
     60 
     61 //===----------------------------------------------------------------------===//
     62 ///
     63 /// SubtargetFeatures - Manages the enabling and disabling of subtarget
     64 /// specific features.  Features are encoded as a string of the form
     65 ///   "cpu,+attr1,+attr2,-attr3,...,+attrN"
     66 /// A comma separates each feature from the next (all lowercase.)
     67 /// The first feature is always the CPU subtype (eg. pentiumm).  If the CPU
     68 /// value is "generic" then the CPU subtype should be generic for the target.
     69 /// Each of the remaining features is prefixed with + or - indicating whether
     70 /// that feature should be enabled or disabled contrary to the cpu
     71 /// specification.
     72 ///
     73 
     74 class SubtargetFeatures {
     75   std::vector<std::string> Features;    // Subtarget features as a vector
     76 public:
     77   explicit SubtargetFeatures(const StringRef Initial = "");
     78 
     79   /// Features string accessors.
     80   std::string getString() const;
     81 
     82   /// Adding Features.
     83   void AddFeature(const StringRef String, bool IsEnabled = true);
     84 
     85   /// ToggleFeature - Toggle a feature and returns the newly updated feature
     86   /// bits.
     87   uint64_t ToggleFeature(uint64_t Bits, const StringRef String,
     88                          const SubtargetFeatureKV *FeatureTable,
     89                          size_t FeatureTableSize);
     90 
     91   /// Get feature bits of a CPU.
     92   uint64_t getFeatureBits(const StringRef CPU,
     93                           const SubtargetFeatureKV *CPUTable,
     94                           size_t CPUTableSize,
     95                           const SubtargetFeatureKV *FeatureTable,
     96                           size_t FeatureTableSize);
     97 
     98   /// Get scheduling itinerary of a CPU.
     99   void *getItinerary(const StringRef CPU,
    100                      const SubtargetInfoKV *Table, size_t TableSize);
    101 
    102   /// Print feature string.
    103   void print(raw_ostream &OS) const;
    104 
    105   // Dump feature info.
    106   void dump() const;
    107 
    108   /// Retrieve a formatted string of the default features for the specified
    109   /// target triple.
    110   void getDefaultSubtargetFeatures(const Triple& Triple);
    111 };
    112 
    113 } // End namespace llvm
    114 
    115 #endif
    116