diff options
| author | Chris Lattner <sabre@nondot.org> | 2003-08-07 05:38:11 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2003-08-07 05:38:11 +0000 |
| commit | 9f993091eade7f4015b5710a33bd495f9fb43a8d (patch) | |
| tree | 951b43f2f45fda79c764f1ca6b81a58b97c4233c /llvm/support/tools/TableGen/CodeGenWrappers.cpp | |
| parent | 43ecb4829d1cfa55d5f5e644b951f5028d6113b7 (diff) | |
| download | bcm5719-llvm-9f993091eade7f4015b5710a33bd495f9fb43a8d.tar.gz bcm5719-llvm-9f993091eade7f4015b5710a33bd495f9fb43a8d.zip | |
Initial checkin of useful wrappers around the Target classes, for now, only ValueType and
Target are wrapped
llvm-svn: 7665
Diffstat (limited to 'llvm/support/tools/TableGen/CodeGenWrappers.cpp')
| -rw-r--r-- | llvm/support/tools/TableGen/CodeGenWrappers.cpp | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/llvm/support/tools/TableGen/CodeGenWrappers.cpp b/llvm/support/tools/TableGen/CodeGenWrappers.cpp new file mode 100644 index 00000000000..4987aeb76c1 --- /dev/null +++ b/llvm/support/tools/TableGen/CodeGenWrappers.cpp @@ -0,0 +1,66 @@ +//===- CodeGenWrappers.cpp - Code Generation Class Wrappers -----*- C++ -*-===// +// +// These classes wrap target description classes used by the various code +// generation TableGen backends. This makes it easier to access the data and +// provides a single place that needs to check it for validity. All of these +// classes throw exceptions on error conditions. +// +//===----------------------------------------------------------------------===// + +#include "CodeGenWrappers.h" +#include "Record.h" + +/// getValueType - Return the MCV::ValueType that the specified TableGen record +/// corresponds to. +MVT::ValueType getValueType(Record *Rec) { + return (MVT::ValueType)Rec->getValueAsInt("Value"); +} + +std::ostream &operator<<(std::ostream &OS, MVT::ValueType T) { + switch (T) { + case MVT::Other: return OS << "UNKNOWN"; + case MVT::i1: return OS << "i1"; + case MVT::i8: return OS << "i8"; + case MVT::i16: return OS << "i16"; + case MVT::i32: return OS << "i32"; + case MVT::i64: return OS << "i64"; + case MVT::i128: return OS << "i128"; + case MVT::f32: return OS << "f32"; + case MVT::f64: return OS << "f64"; + case MVT::f80: return OS << "f80"; + case MVT::f128: return OS << "f128"; + case MVT::isVoid:return OS << "void"; + } + return OS; +} + + + +/// getTarget - Return the current instance of the Target class. +/// +CodeGenTarget::CodeGenTarget() { + std::vector<Record*> Targets = Records.getAllDerivedDefinitions("Target"); + if (Targets.size() != 1) + throw std::string("ERROR: Multiple subclasses of Target defined!"); + TargetRec = Targets[0]; + + // Read in all of the CalleeSavedRegisters... + ListInit *LI = TargetRec->getValueAsListInit("CalleeSavedRegisters"); + for (unsigned i = 0, e = LI->getSize(); i != e; ++i) + if (DefInit *DI = dynamic_cast<DefInit*>(LI->getElement(i))) + CalleeSavedRegisters.push_back(DI->getDef()); + else + throw "Target: " + TargetRec->getName() + + " expected register definition in CalleeSavedRegisters list!"; + + PointerType = getValueType(TargetRec->getValueAsDef("PointerType")); +} + + +const std::string &CodeGenTarget::getName() const { + return TargetRec->getName(); +} + +Record *CodeGenTarget::getInstructionSet() const { + return TargetRec->getValueAsDef("InstructionSet"); +} |

