return TargetRec->getValueAsDef("AssemblyWriter");
}
+void CodeGenTarget::ReadRegisters() const {
+ std::vector<Record*> Regs = Records.getAllDerivedDefinitions("Register");
+ if (Regs.empty())
+ throw std::string("No 'Register' subclasses defined!");
+
+ Registers.reserve(Regs.size());
+ Registers.assign(Regs.begin(), Regs.end());
+}
+
+const std::string &CodeGenRegister::getName() const {
+ return TheDef->getName();
+}
+
void CodeGenTarget::ReadInstructions() const {
std::vector<Record*> Insts = Records.getAllDerivedDefinitions("Instruction");
- if (Insts.size() == 0)
+ if (Insts.empty())
throw std::string("No 'Instruction' subclasses defined!");
std::string InstFormatName =
#ifndef CODEGEN_TARGET_H
#define CODEGEN_TARGET_H
+#include "CodeGenRegisters.h"
#include "CodeGenInstruction.h"
#include <iosfwd>
#include <map>
class Record;
class RecordKeeper;
+class CodeGenRegister;
/// getValueType - Return the MVT::ValueType that the specified TableGen record
/// corresponds to.
MVT::ValueType PointerType;
mutable std::map<std::string, CodeGenInstruction> Instructions;
+ mutable std::vector<CodeGenRegister> Registers;
void ReadInstructions() const;
+ void ReadRegisters() const;
public:
CodeGenTarget();
///
Record *getAsmWriter() const;
- /// getPHIInstruction - Return the designated PHI instruction.
- const CodeGenInstruction &getPHIInstruction() const;
+ const std::vector<CodeGenRegister> &getRegisters() {
+ if (Registers.empty()) ReadRegisters();
+ return Registers;
+ }
/// getInstructions - Return all of the instructions defined for this target.
///
CodeGenInstruction>::const_iterator inst_iterator;
inst_iterator inst_begin() const { return getInstructions().begin(); }
inst_iterator inst_end() const { return Instructions.end(); }
+
+ /// getPHIInstruction - Return the designated PHI instruction.
+ ///
+ const CodeGenInstruction &getPHIInstruction() const;
};
} // End llvm namespace
#include "RegisterInfoEmitter.h"
#include "CodeGenTarget.h"
+#include "CodeGenRegisters.h"
#include "Record.h"
#include "Support/StringExtras.h"
#include <set>
// runEnums - Print out enum values for all of the registers.
void RegisterInfoEmitter::runEnums(std::ostream &OS) {
- std::vector<Record*> Registers = Records.getAllDerivedDefinitions("Register");
-
- if (Registers.size() == 0)
- throw std::string("No 'Register' subclasses defined!");
+ CodeGenTarget Target;
+ const std::vector<CodeGenRegister> &Registers = Target.getRegisters();
- std::string Namespace = Registers[0]->getValueAsString("Namespace");
+ std::string Namespace = Registers[0].TheDef->getValueAsString("Namespace");
EmitSourceFileHeader("Target Register Enum Values", OS);
OS << " enum {\n NoRegister,\n";
for (unsigned i = 0, e = Registers.size(); i != e; ++i)
- OS << " " << Registers[i]->getName() << ", \t// " << i+1 << "\n";
+ OS << " " << Registers[i].getName() << ", \t// " << i+1 << "\n";
OS << " };\n";
if (!Namespace.empty())
void RegisterInfoEmitter::runHeader(std::ostream &OS) {
EmitSourceFileHeader("Register Information Header Fragment", OS);
- const std::string &TargetName = CodeGenTarget().getName();
+ CodeGenTarget Target;
+ const std::string &TargetName = Target.getName();
std::string ClassName = TargetName + "GenRegisterInfo";
OS << "#include \"llvm/Target/MRegisterInfo.h\"\n\n";
//
void RegisterInfoEmitter::run(std::ostream &OS) {
CodeGenTarget Target;
-
EmitSourceFileHeader("Register Information Source Fragment", OS);
// Start out by emitting each of the register classes... to do this, we build
std::vector<Record*> RegisterClasses =
Records.getAllDerivedDefinitions("RegisterClass");
- std::vector<Record*> Registers = Records.getAllDerivedDefinitions("Register");
-
std::set<Record*> RegistersFound;
std::vector<std::string> RegClassNames;
OS << "\n const MRegisterDesc RegisterDescriptors[] = { // Descriptors\n";
OS << " { \"NOREG\",\t0,\t\t0,\t0 },\n";
+
+
// Now that register alias sets have been emitted, emit the register
// descriptors now.
+ const std::vector<CodeGenRegister> &Registers = Target.getRegisters();
for (unsigned i = 0, e = Registers.size(); i != e; ++i) {
- Record *Reg = Registers[i];
+ const CodeGenRegister &Reg = Registers[i];
OS << " { \"";
- if (!Reg->getValueAsString("Name").empty())
- OS << Reg->getValueAsString("Name");
+ if (!Reg.TheDef->getValueAsString("Name").empty())
+ OS << Reg.TheDef->getValueAsString("Name");
else
- OS << Reg->getName();
+ OS << Reg.getName();
OS << "\",\t";
- if (RegisterAliases.count(Reg))
- OS << Reg->getName() << "_AliasSet,\t";
+ if (RegisterAliases.count(Reg.TheDef))
+ OS << Reg.getName() << "_AliasSet,\t";
else
OS << "Empty_AliasSet,\t";
OS << "0, 0 },\n";