From 45872079672a4fb500fdcb9c77b23e3e550c8f97 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Thu, 7 Aug 2003 05:38:11 +0000 Subject: 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 --- utils/TableGen/CodeGenTarget.cpp | 66 ++++++++++++++++++++++++++++++++++++++ utils/TableGen/CodeGenTarget.h | 52 ++++++++++++++++++++++++++++++ utils/TableGen/CodeGenWrappers.cpp | 66 ++++++++++++++++++++++++++++++++++++++ utils/TableGen/CodeGenWrappers.h | 52 ++++++++++++++++++++++++++++++ 4 files changed, 236 insertions(+) create mode 100644 utils/TableGen/CodeGenTarget.cpp create mode 100644 utils/TableGen/CodeGenTarget.h create mode 100644 utils/TableGen/CodeGenWrappers.cpp create mode 100644 utils/TableGen/CodeGenWrappers.h (limited to 'utils') 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 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(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"); +} diff --git a/utils/TableGen/CodeGenTarget.h b/utils/TableGen/CodeGenTarget.h new file mode 100644 index 0000000000..c50d0576e8 --- /dev/null +++ b/utils/TableGen/CodeGenTarget.h @@ -0,0 +1,52 @@ +//===- CodeGenWrappers.h - 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. +// +//===----------------------------------------------------------------------===// + +#ifndef CODEGENWRAPPERS_H +#define CODEGENWRAPPERS_H + +#include "llvm/CodeGen/ValueTypes.h" +#include +#include +class Record; +class RecordKeeper; + +/// getValueType - Return the MVT::ValueType that the specified TableGen record +/// corresponds to. +MVT::ValueType getValueType(Record *Rec); + +std::ostream &operator<<(std::ostream &OS, MVT::ValueType T); + + + +/// CodeGenTarget - This class corresponds to the Target class in the .td files. +/// +class CodeGenTarget { + Record *TargetRec; + std::vector CalleeSavedRegisters; + MVT::ValueType PointerType; + +public: + CodeGenTarget(); + + Record *getTargetRecord() const { return TargetRec; } + const std::string &getName() const; + + const std::vector &getCalleeSavedRegisters() const { + return CalleeSavedRegisters; + } + + // getInstructionSet - Return the InstructionSet object... + Record *getInstructionSet() const; + + // getInstructionSet - Return the CodeGenInstructionSet object for this + // target, lazily reading it from the record keeper as needed. + // CodeGenInstructionSet *getInstructionSet - +}; + +#endif diff --git a/utils/TableGen/CodeGenWrappers.cpp b/utils/TableGen/CodeGenWrappers.cpp new file mode 100644 index 0000000000..4987aeb76c --- /dev/null +++ b/utils/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 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(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"); +} diff --git a/utils/TableGen/CodeGenWrappers.h b/utils/TableGen/CodeGenWrappers.h new file mode 100644 index 0000000000..c50d0576e8 --- /dev/null +++ b/utils/TableGen/CodeGenWrappers.h @@ -0,0 +1,52 @@ +//===- CodeGenWrappers.h - 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. +// +//===----------------------------------------------------------------------===// + +#ifndef CODEGENWRAPPERS_H +#define CODEGENWRAPPERS_H + +#include "llvm/CodeGen/ValueTypes.h" +#include +#include +class Record; +class RecordKeeper; + +/// getValueType - Return the MVT::ValueType that the specified TableGen record +/// corresponds to. +MVT::ValueType getValueType(Record *Rec); + +std::ostream &operator<<(std::ostream &OS, MVT::ValueType T); + + + +/// CodeGenTarget - This class corresponds to the Target class in the .td files. +/// +class CodeGenTarget { + Record *TargetRec; + std::vector CalleeSavedRegisters; + MVT::ValueType PointerType; + +public: + CodeGenTarget(); + + Record *getTargetRecord() const { return TargetRec; } + const std::string &getName() const; + + const std::vector &getCalleeSavedRegisters() const { + return CalleeSavedRegisters; + } + + // getInstructionSet - Return the InstructionSet object... + Record *getInstructionSet() const; + + // getInstructionSet - Return the CodeGenInstructionSet object for this + // target, lazily reading it from the record keeper as needed. + // CodeGenInstructionSet *getInstructionSet - +}; + +#endif -- cgit v1.2.3