From 3112326c88b7090f770c4ff8a1546ef84fd2e8bb Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Fri, 1 Aug 2003 04:38:38 +0000 Subject: [PATCH] Initial checkin of register info emitter git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7465 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../tools/TableGen/RegisterInfoEmitter.cpp | 40 +++++++++++++++++++ support/tools/TableGen/RegisterInfoEmitter.h | 28 +++++++++++++ utils/TableGen/RegisterInfoEmitter.cpp | 40 +++++++++++++++++++ utils/TableGen/RegisterInfoEmitter.h | 28 +++++++++++++ 4 files changed, 136 insertions(+) create mode 100644 support/tools/TableGen/RegisterInfoEmitter.cpp create mode 100644 support/tools/TableGen/RegisterInfoEmitter.h create mode 100644 utils/TableGen/RegisterInfoEmitter.cpp create mode 100644 utils/TableGen/RegisterInfoEmitter.h diff --git a/support/tools/TableGen/RegisterInfoEmitter.cpp b/support/tools/TableGen/RegisterInfoEmitter.cpp new file mode 100644 index 00000000000..200800fae62 --- /dev/null +++ b/support/tools/TableGen/RegisterInfoEmitter.cpp @@ -0,0 +1,40 @@ +//===- RegisterInfoEmitter.cpp - Generate a Register File Desc. -*- C++ -*-===// +// +// This tablegen backend is responsible for emitting a description of a target +// register file for a code generator. It uses instances of the Register, +// RegisterAliases, and RegisterClass classes to gather this information. +// +//===----------------------------------------------------------------------===// + +#include "RegisterInfoEmitter.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"; +} + +void RegisterInfoEmitter::runHeader(std::ostream &OS) { + std::vector RegisterInfos = + Records.getAllDerivedDefinitions("RegisterInfo"); + + if (RegisterInfos.size() != 1) + throw std::string("ERROR: Multiple subclasses of RegisterInfo defined!"); + + EmitSourceHeader("Register Information Header Fragment", OS); + + std::string ClassName = RegisterInfos[0]->getValueAsString("ClassName"); + + OS << "#include \"llvm/CodeGen/MRegisterInfo.h\"\n\n"; + + OS << "struct " << ClassName << ": public MRegisterInfo {\n" + << " " << ClassName << "();\n" + << " const unsigned* getCalleeSaveRegs() const;\n" + << "};\n\n"; +} + +void RegisterInfoEmitter::run(std::ostream &o) { + +} diff --git a/support/tools/TableGen/RegisterInfoEmitter.h b/support/tools/TableGen/RegisterInfoEmitter.h new file mode 100644 index 00000000000..2a5d70a0fd7 --- /dev/null +++ b/support/tools/TableGen/RegisterInfoEmitter.h @@ -0,0 +1,28 @@ +//===- RegisterInfoEmitter.h - Generate a Register File Desc. ---*- C++ -*-===// +// +// This tablegen backend is responsible for emitting a description of a target +// register file for a code generator. It uses instances of the Register, +// RegisterAliases, and RegisterClass classes to gather this information. +// +//===----------------------------------------------------------------------===// + +#ifndef REGISTER_INFO_EMITTER_H +#define REGISTER_INFO_EMITTER_H + +#include +class RecordKeeper; + +class RegisterInfoEmitter { + RecordKeeper &Records; +public: + RegisterInfoEmitter(RecordKeeper &R) : Records(R) {} + + // run - Output the register file description, returning true on failure. + void run(std::ostream &o); + + // runHeader - Emit a header fragment for the register info emitter. + void runHeader(std::ostream &o); +private: +}; + +#endif diff --git a/utils/TableGen/RegisterInfoEmitter.cpp b/utils/TableGen/RegisterInfoEmitter.cpp new file mode 100644 index 00000000000..200800fae62 --- /dev/null +++ b/utils/TableGen/RegisterInfoEmitter.cpp @@ -0,0 +1,40 @@ +//===- RegisterInfoEmitter.cpp - Generate a Register File Desc. -*- C++ -*-===// +// +// This tablegen backend is responsible for emitting a description of a target +// register file for a code generator. It uses instances of the Register, +// RegisterAliases, and RegisterClass classes to gather this information. +// +//===----------------------------------------------------------------------===// + +#include "RegisterInfoEmitter.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"; +} + +void RegisterInfoEmitter::runHeader(std::ostream &OS) { + std::vector RegisterInfos = + Records.getAllDerivedDefinitions("RegisterInfo"); + + if (RegisterInfos.size() != 1) + throw std::string("ERROR: Multiple subclasses of RegisterInfo defined!"); + + EmitSourceHeader("Register Information Header Fragment", OS); + + std::string ClassName = RegisterInfos[0]->getValueAsString("ClassName"); + + OS << "#include \"llvm/CodeGen/MRegisterInfo.h\"\n\n"; + + OS << "struct " << ClassName << ": public MRegisterInfo {\n" + << " " << ClassName << "();\n" + << " const unsigned* getCalleeSaveRegs() const;\n" + << "};\n\n"; +} + +void RegisterInfoEmitter::run(std::ostream &o) { + +} diff --git a/utils/TableGen/RegisterInfoEmitter.h b/utils/TableGen/RegisterInfoEmitter.h new file mode 100644 index 00000000000..2a5d70a0fd7 --- /dev/null +++ b/utils/TableGen/RegisterInfoEmitter.h @@ -0,0 +1,28 @@ +//===- RegisterInfoEmitter.h - Generate a Register File Desc. ---*- C++ -*-===// +// +// This tablegen backend is responsible for emitting a description of a target +// register file for a code generator. It uses instances of the Register, +// RegisterAliases, and RegisterClass classes to gather this information. +// +//===----------------------------------------------------------------------===// + +#ifndef REGISTER_INFO_EMITTER_H +#define REGISTER_INFO_EMITTER_H + +#include +class RecordKeeper; + +class RegisterInfoEmitter { + RecordKeeper &Records; +public: + RegisterInfoEmitter(RecordKeeper &R) : Records(R) {} + + // run - Output the register file description, returning true on failure. + void run(std::ostream &o); + + // runHeader - Emit a header fragment for the register info emitter. + void runHeader(std::ostream &o); +private: +}; + +#endif