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 | 45872079672a4fb500fdcb9c77b23e3e550c8f97 (patch) | |
tree | 40f77aa329cfc00e7055ec2367f21f835920d7cb /utils/TableGen/CodeGenTarget.cpp | |
parent | 1a737c836676da675345805b7b3c117db34ca3f7 (diff) |
Initial checkin of useful wrappers around the Target classes, for now, only ValueType and
Target are wrapped
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7665 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils/TableGen/CodeGenTarget.cpp')
-rw-r--r-- | utils/TableGen/CodeGenTarget.cpp | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/utils/TableGen/CodeGenTarget.cpp b/utils/TableGen/CodeGenTarget.cpp new file mode 100644 index 0000000000..4987aeb76c --- /dev/null +++ b/utils/TableGen/CodeGenTarget.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"); +} |