[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