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