CodeGenTarget.cpp revision be7f4afe47ef87f2f6b054ea472d03719c5eb22e
1//===- CodeGenWrappers.cpp - Code Generation Class Wrappers -----*- C++ -*-===// 2// 3// These classes wrap target description classes used by the various code 4// generation TableGen backends. This makes it easier to access the data and 5// provides a single place that needs to check it for validity. All of these 6// classes throw exceptions on error conditions. 7// 8//===----------------------------------------------------------------------===// 9 10#include "CodeGenWrappers.h" 11#include "Record.h" 12 13/// getValueType - Return the MCV::ValueType that the specified TableGen record 14/// corresponds to. 15MVT::ValueType getValueType(Record *Rec) { 16 return (MVT::ValueType)Rec->getValueAsInt("Value"); 17} 18 19std::string getName(MVT::ValueType T) { 20 switch (T) { 21 case MVT::Other: return "UNKNOWN"; 22 case MVT::i1: return "i1"; 23 case MVT::i8: return "i8"; 24 case MVT::i16: return "i16"; 25 case MVT::i32: return "i32"; 26 case MVT::i64: return "i64"; 27 case MVT::i128: return "i128"; 28 case MVT::f32: return "f32"; 29 case MVT::f64: return "f64"; 30 case MVT::f80: return "f80"; 31 case MVT::f128: return "f128"; 32 case MVT::isVoid:return "void"; 33 default: assert(0 && "ILLEGAL VALUE TYPE!"); return ""; 34 } 35} 36 37std::string getEnumName(MVT::ValueType T) { 38 switch (T) { 39 case MVT::Other: return "Other"; 40 case MVT::i1: return "i1"; 41 case MVT::i8: return "i8"; 42 case MVT::i16: return "i16"; 43 case MVT::i32: return "i32"; 44 case MVT::i64: return "i64"; 45 case MVT::i128: return "i128"; 46 case MVT::f32: return "f32"; 47 case MVT::f64: return "f64"; 48 case MVT::f80: return "f80"; 49 case MVT::f128: return "f128"; 50 case MVT::isVoid:return "isVoid"; 51 default: assert(0 && "ILLEGAL VALUE TYPE!"); return ""; 52 } 53} 54 55 56std::ostream &operator<<(std::ostream &OS, MVT::ValueType T) { 57 return OS << getName(T); 58} 59 60 61 62/// getTarget - Return the current instance of the Target class. 63/// 64CodeGenTarget::CodeGenTarget() : PointerType(MVT::Other) { 65 std::vector<Record*> Targets = Records.getAllDerivedDefinitions("Target"); 66 if (Targets.size() != 1) 67 throw std::string("ERROR: Multiple subclasses of Target defined!"); 68 TargetRec = Targets[0]; 69 70 // Read in all of the CalleeSavedRegisters... 71 ListInit *LI = TargetRec->getValueAsListInit("CalleeSavedRegisters"); 72 for (unsigned i = 0, e = LI->getSize(); i != e; ++i) 73 if (DefInit *DI = dynamic_cast<DefInit*>(LI->getElement(i))) 74 CalleeSavedRegisters.push_back(DI->getDef()); 75 else 76 throw "Target: " + TargetRec->getName() + 77 " expected register definition in CalleeSavedRegisters list!"; 78 79 PointerType = getValueType(TargetRec->getValueAsDef("PointerType")); 80} 81 82 83const std::string &CodeGenTarget::getName() const { 84 return TargetRec->getName(); 85} 86 87Record *CodeGenTarget::getInstructionSet() const { 88 return TargetRec->getValueAsDef("InstructionSet"); 89} 90