diff options
author | Chris Lattner <sabre@nondot.org> | 2004-08-01 04:04:35 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2004-08-01 04:04:35 +0000 |
commit | fce96033878a6f36944905e9c40badf4ae10d96b (patch) | |
tree | 74346a9cbe3bf293130ba6cb140888578b5198dc /llvm/utils/TableGen/CodeGenTarget.cpp | |
parent | 684786640000a5597d50a2d6d6b9652d6881df64 (diff) | |
download | bcm5719-llvm-fce96033878a6f36944905e9c40badf4ae10d96b.tar.gz bcm5719-llvm-fce96033878a6f36944905e9c40badf4ae10d96b.zip |
Rename CodeGenWrappers.(cpp|h) -> CodeGenTarget.(cpp|h)
llvm-svn: 15382
Diffstat (limited to 'llvm/utils/TableGen/CodeGenTarget.cpp')
-rw-r--r-- | llvm/utils/TableGen/CodeGenTarget.cpp | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/llvm/utils/TableGen/CodeGenTarget.cpp b/llvm/utils/TableGen/CodeGenTarget.cpp new file mode 100644 index 00000000000..eef94db0b99 --- /dev/null +++ b/llvm/utils/TableGen/CodeGenTarget.cpp @@ -0,0 +1,99 @@ +//===- CodeGenTarget.cpp - CodeGen Target Class Wrapper ---------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file was developed by the LLVM research group and is distributed under +// the University of Illinois Open Source License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This class 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 "CodeGenTarget.h" +#include "Record.h" +using namespace llvm; + +/// getValueType - Return the MCV::ValueType that the specified TableGen record +/// corresponds to. +MVT::ValueType llvm::getValueType(Record *Rec) { + return (MVT::ValueType)Rec->getValueAsInt("Value"); +} + +std::string llvm::getName(MVT::ValueType T) { + switch (T) { + case MVT::Other: return "UNKNOWN"; + case MVT::i1: return "i1"; + case MVT::i8: return "i8"; + case MVT::i16: return "i16"; + case MVT::i32: return "i32"; + case MVT::i64: return "i64"; + case MVT::i128: return "i128"; + case MVT::f32: return "f32"; + case MVT::f64: return "f64"; + case MVT::f80: return "f80"; + case MVT::f128: return "f128"; + case MVT::isVoid:return "void"; + default: assert(0 && "ILLEGAL VALUE TYPE!"); return ""; + } +} + +std::string llvm::getEnumName(MVT::ValueType T) { + switch (T) { + case MVT::Other: return "Other"; + case MVT::i1: return "i1"; + case MVT::i8: return "i8"; + case MVT::i16: return "i16"; + case MVT::i32: return "i32"; + case MVT::i64: return "i64"; + case MVT::i128: return "i128"; + case MVT::f32: return "f32"; + case MVT::f64: return "f64"; + case MVT::f80: return "f80"; + case MVT::f128: return "f128"; + case MVT::isVoid:return "isVoid"; + default: assert(0 && "ILLEGAL VALUE TYPE!"); return ""; + } +} + + +std::ostream &llvm::operator<<(std::ostream &OS, MVT::ValueType T) { + return OS << getName(T); +} + + +/// getTarget - Return the current instance of the Target class. +/// +CodeGenTarget::CodeGenTarget() : PointerType(MVT::Other) { + std::vector<Record*> Targets = Records.getAllDerivedDefinitions("Target"); + if (Targets.size() == 0) + throw std::string("ERROR: No 'Target' subclasses defined!"); + 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"); +} + |