1 //===- SubtargetEmitter.h - Generate subtarget enumerations -----*- 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 tablegen backend emits subtarget enumerations. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef SUBTARGET_EMITTER_H 15 #define SUBTARGET_EMITTER_H 16 17 #include "llvm/TableGen/TableGenBackend.h" 18 #include "llvm/MC/MCInstrItineraries.h" 19 #include <vector> 20 #include <map> 21 #include <string> 22 23 24 namespace llvm { 25 26 class SubtargetEmitter : public TableGenBackend { 27 28 RecordKeeper &Records; 29 std::string Target; 30 bool HasItineraries; 31 32 void Enumeration(raw_ostream &OS, const char *ClassName, bool isBits); 33 unsigned FeatureKeyValues(raw_ostream &OS); 34 unsigned CPUKeyValues(raw_ostream &OS); 35 unsigned CollectAllItinClasses(raw_ostream &OS, 36 std::map<std::string,unsigned> &ItinClassesMap, 37 std::vector<Record*> &ItinClassList); 38 void FormItineraryStageString(const std::string &Names, 39 Record *ItinData, std::string &ItinString, 40 unsigned &NStages); 41 void FormItineraryOperandCycleString(Record *ItinData, std::string &ItinString, 42 unsigned &NOperandCycles); 43 void FormItineraryBypassString(const std::string &Names, 44 Record *ItinData, 45 std::string &ItinString, unsigned NOperandCycles); 46 void EmitStageAndOperandCycleData(raw_ostream &OS, unsigned NItinClasses, 47 std::map<std::string, unsigned> &ItinClassesMap, 48 std::vector<Record*> &ItinClassList, 49 std::vector<std::vector<InstrItinerary> > &ProcList); 50 void EmitProcessorData(raw_ostream &OS, 51 std::vector<Record*> &ItinClassList, 52 std::vector<std::vector<InstrItinerary> > &ProcList); 53 void EmitProcessorLookup(raw_ostream &OS); 54 void EmitData(raw_ostream &OS); 55 void ParseFeaturesFunction(raw_ostream &OS, unsigned NumFeatures, 56 unsigned NumProcs); 57 58 public: SubtargetEmitter(RecordKeeper & R)59 SubtargetEmitter(RecordKeeper &R) : Records(R), HasItineraries(false) {} 60 61 // run - Output the subtarget enumerations, returning true on failure. 62 void run(raw_ostream &o); 63 64 }; 65 66 67 } // End llvm namespace 68 69 #endif 70 71 72 73