[llvm-commits] CVS: llvm/utils/TableGen/InstrInfoEmitter.cpp InstrInfoEmitter.h
Chris Lattner
lattner at cs.uiuc.edu
Mon Aug 4 00:03:53 PDT 2003
Changes in directory llvm/utils/TableGen:
InstrInfoEmitter.cpp added (r1.1)
InstrInfoEmitter.h added (r1.1)
---
Log message:
Initial checkin of Instruction emitter, which just produces enum values so far
---
Diffs of the changes:
Index: llvm/utils/TableGen/InstrInfoEmitter.cpp
diff -c /dev/null llvm/utils/TableGen/InstrInfoEmitter.cpp:1.1
*** /dev/null Sun Aug 3 12:24:20 2003
--- llvm/utils/TableGen/InstrInfoEmitter.cpp Sun Aug 3 12:24:10 2003
***************
*** 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<Record*> 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<Record*> 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";
+ }
Index: llvm/utils/TableGen/InstrInfoEmitter.h
diff -c /dev/null llvm/utils/TableGen/InstrInfoEmitter.h:1.1
*** /dev/null Sun Aug 3 12:24:20 2003
--- llvm/utils/TableGen/InstrInfoEmitter.h Sun Aug 3 12:24:10 2003
***************
*** 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 <iosfwd>
+ 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
More information about the llvm-commits
mailing list