1 //===- CodeGenTarget.h - Target Class Wrapper -------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file was developed by the LLVM research group and is distributed under 6 // the University of Illinois Open Source License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file defines wrappers for the Target class and related global 11 // functionality. This makes it easier to access the data and provides a single 12 // place that needs to check it for validity. All of these classes throw 13 // exceptions on error conditions. 14 // 15 //===----------------------------------------------------------------------===// 16 17 #ifndef CODEGEN_TARGET_H 18 #define CODEGEN_TARGET_H 19 20 #include "CodeGenRegisters.h" 21 #include "CodeGenInstruction.h" 22 #include <iosfwd> 23 #include <map> 24 25 namespace llvm { 26 27 class Record; 28 class RecordKeeper; 29 struct CodeGenRegister; 30 31 /// getValueType - Return the MVT::ValueType that the specified TableGen record 32 /// corresponds to. 33 MVT::ValueType getValueType(Record *Rec); 34 35 std::ostream &operator<<(std::ostream &OS, MVT::ValueType T); 36 std::string getName(MVT::ValueType T); 37 std::string getEnumName(MVT::ValueType T); 38 39 40 /// CodeGenTarget - This class corresponds to the Target class in the .td files. 41 /// 42 class CodeGenTarget { 43 Record *TargetRec; 44 std::vector<Record*> CalleeSavedRegisters; 45 MVT::ValueType PointerType; 46 47 mutable std::map<std::string, CodeGenInstruction> Instructions; 48 mutable std::vector<CodeGenRegister> Registers; 49 mutable std::vector<CodeGenRegisterClass> RegisterClasses; 50 void ReadRegisters() const; 51 void ReadRegisterClasses() const; 52 void ReadInstructions() const; 53 public: 54 CodeGenTarget(); 55 56 Record *getTargetRecord() const { return TargetRec; } 57 const std::string &getName() const; 58 59 const std::vector<Record*> &getCalleeSavedRegisters() const { 60 return CalleeSavedRegisters; 61 } 62 63 MVT::ValueType getPointerType() const { return PointerType; } 64 65 /// getInstructionSet - Return the InstructionSet object. 66 /// 67 Record *getInstructionSet() const; 68 69 /// getAsmWriter - Return the AssemblyWriter definition for this target. 70 /// 71 Record *getAsmWriter() const; 72 73 const std::vector<CodeGenRegister> &getRegisters() { 74 if (Registers.empty()) ReadRegisters(); 75 return Registers; 76 } 77 78 const std::vector<CodeGenRegisterClass> getRegisterClasses() { 79 if (RegisterClasses.empty()) ReadRegisterClasses(); 80 return RegisterClasses; 81 } 82 83 84 /// getInstructions - Return all of the instructions defined for this target. 85 /// 86 const std::map<std::string, CodeGenInstruction> &getInstructions() const { 87 if (Instructions.empty()) ReadInstructions(); 88 return Instructions; 89 } 90 91 typedef std::map<std::string, 92 CodeGenInstruction>::const_iterator inst_iterator; 93 inst_iterator inst_begin() const { return getInstructions().begin(); } 94 inst_iterator inst_end() const { return Instructions.end(); } 95 96 /// getInstructionsByEnumValue - Return all of the instructions defined by the 97 /// target, ordered by their enum value. 98 void getInstructionsByEnumValue(std::vector<const CodeGenInstruction*> 99 &NumberedInstructions); 100 101 102 /// getPHIInstruction - Return the designated PHI instruction. 103 /// 104 const CodeGenInstruction &getPHIInstruction() const; 105 106 /// isLittleEndianEncoding - are instruction bit patterns defined as [0..n]? 107 /// 108 bool isLittleEndianEncoding() const; 109 }; 110 111 } // End llvm namespace 112 113 #endif 114