From 33ccf7edff6d784c7f6ea85ada2b67062272073e Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 3 Aug 2003 17:24:10 +0000 Subject: Initial checkin of Instruction emitter, which just produces enum values so far git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7515 91177308-0d34-0410-b5e6-96231b3b80d8 --- support/tools/TableGen/InstrInfoEmitter.cpp | 65 +++++++++++++++++++++++++++++ support/tools/TableGen/InstrInfoEmitter.h | 26 ++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 support/tools/TableGen/InstrInfoEmitter.cpp create mode 100644 support/tools/TableGen/InstrInfoEmitter.h (limited to 'support') diff --git a/support/tools/TableGen/InstrInfoEmitter.cpp b/support/tools/TableGen/InstrInfoEmitter.cpp new file mode 100644 index 0000000000..cc2d74fa8d --- /dev/null +++ b/support/tools/TableGen/InstrInfoEmitter.cpp @@ -0,0 +1,65 @@ +//===- InstrInfoEmitter.cpp - Generate a Instruction Set Desc. ------------===// +// +// This tablegen backend is responsible for emitting a description of the target +// instruction set for the code generator. +// +//===----------------------------------------------------------------------===// + +#include "InstrInfoEmitter.h" +#include "Record.h" + +static void EmitSourceHeader(const std::string &Desc, std::ostream &o) { + o << "//===- TableGen'erated file -------------------------------------*-" + " C++ -*-===//\n//\n// " << Desc << "\n//\n// Automatically generate" + "d file, do not edit!\n//\n//===------------------------------------" + "----------------------------------===//\n\n"; +} + +static std::string getQualifiedName(Record *R) { + std::string Namespace = R->getValueAsString("Namespace"); + if (Namespace.empty()) return R->getName(); + return Namespace + "::" + R->getName(); +} + +static Record *getTarget(RecordKeeper &RC) { + std::vector Targets = RC.getAllDerivedDefinitions("Target"); + + if (Targets.size() != 1) + throw std::string("ERROR: Multiple subclasses of Target defined!"); + return Targets[0]; +} + +// runEnums - Print out enum values for all of the instructions. +void InstrInfoEmitter::runEnums(std::ostream &OS) { + std::vector Insts = Records.getAllDerivedDefinitions("Instruction"); + + if (Insts.size() == 0) + throw std::string("No 'Instruction' subclasses defined!"); + + std::string Namespace = Insts[0]->getValueAsString("Namespace"); + + EmitSourceHeader("Target Instruction Enum Values", OS); + + if (!Namespace.empty()) + OS << "namespace " << Namespace << " {\n"; + OS << " enum {\n"; + + // We must emit the PHI and NOOP opcodes first... + Record *Target = getTarget(Records); + Record *InstrInfo = Target->getValueAsDef("InstructionSet"); + + Record *PHI = InstrInfo->getValueAsDef("PHIInst"); + Record *NOOP = InstrInfo->getValueAsDef("NOOPInst"); + + OS << " " << PHI->getName() << ", \t// 0 (fixed for all targets)\n" + << " " << NOOP->getName() << ", \t// 1 (fixed for all targets)\n"; + + // Print out the rest of the instructions now... + for (unsigned i = 0, e = Insts.size(); i != e; ++i) + if (Insts[i] != PHI && Insts[i] != NOOP) + OS << " " << Insts[i]->getName() << ", \t// " << i+2 << "\n"; + + OS << " };\n"; + if (!Namespace.empty()) + OS << "}\n"; +} diff --git a/support/tools/TableGen/InstrInfoEmitter.h b/support/tools/TableGen/InstrInfoEmitter.h new file mode 100644 index 0000000000..bf7e6758a5 --- /dev/null +++ b/support/tools/TableGen/InstrInfoEmitter.h @@ -0,0 +1,26 @@ +//===- InstrInfoEmitter.h - Generate a Instruction Set Desc. ----*- C++ -*-===// +// +// This tablegen backend is responsible for emitting a description of the target +// instruction set for the code generator. +// +//===----------------------------------------------------------------------===// + +#ifndef INSTRINFO_EMITTER_H +#define INSTRINFO_EMITTER_H + +#include +class RecordKeeper; + +class InstrInfoEmitter { + RecordKeeper &Records; +public: + InstrInfoEmitter(RecordKeeper &R) : Records(R) {} + + // run - Output the instruction set description, returning true on failure. + void run(std::ostream &o); + + // runEnums - Print out enum values for all of the instructions. + void runEnums(std::ostream &o); +}; + +#endif -- cgit v1.2.3