Index: utils/TableGen/RegisterInfoEmitter.cpp =================================================================== --- utils/TableGen/RegisterInfoEmitter.cpp +++ utils/TableGen/RegisterInfoEmitter.cpp @@ -47,10 +47,14 @@ namespace { class RegisterInfoEmitter { + CodeGenTarget Target; RecordKeeper &Records; public: - RegisterInfoEmitter(RecordKeeper &R) : Records(R) {} + RegisterInfoEmitter(RecordKeeper &R) : Target(R), Records(R) { + CodeGenRegBank &RegBank = Target.getRegBank(); + RegBank.computeDerivedInfo(); + } // runEnums - Print out enum values for all of the registers. void runEnums(raw_ostream &o, CodeGenTarget &Target, CodeGenRegBank &Bank); @@ -69,6 +73,8 @@ // run - Output the register file description. void run(raw_ostream &o); + void debugDump(raw_ostream &OS); + private: void EmitRegMapping(raw_ostream &o, const std::deque &Regs, bool isCtor); @@ -1521,20 +1527,70 @@ } void RegisterInfoEmitter::run(raw_ostream &OS) { - CodeGenTarget Target(Records); CodeGenRegBank &RegBank = Target.getRegBank(); - RegBank.computeDerivedInfo(); - runEnums(OS, Target, RegBank); runMCDesc(OS, Target, RegBank); runTargetHeader(OS, Target, RegBank); runTargetDesc(OS, Target, RegBank); } +void RegisterInfoEmitter::debugDump(raw_ostream &OS) { + CodeGenRegBank &RegBank = Target.getRegBank(); + + for (const CodeGenRegisterClass &RC : RegBank.getRegClasses()) { + OS << "RegisterClass " << RC.getName() << ":\n"; + OS << "\tSpillSize: " << RC.SpillSize << '\n'; + OS << "\tSpillAlignment: " << RC.SpillAlignment << '\n'; + OS << "\tNumRegs: " << RC.getMembers().size() << '\n'; + OS << "\tLaneMask: " << PrintLaneMask(RC.LaneMask) << '\n'; + OS << "\tHasDisjunctSubRegs: " << RC.HasDisjunctSubRegs << '\n'; + OS << "\tCoveredBySubRegs: " << RC.CoveredBySubRegs << '\n'; + OS << "\tRegs:"; + for (const CodeGenRegister *R : RC.getMembers()) { + OS << " " << R->getName(); + } + OS << '\n'; + OS << "\tSubClasses:"; + const BitVector &SubClasses = RC.getSubClasses(); + for (const CodeGenRegisterClass &SRC : RegBank.getRegClasses()) { + if (!SubClasses.test(SRC.EnumValue)) + continue; + OS << " " << SRC.getName(); + } + OS << '\n'; + OS << "\tSuperClasses:"; + for (const CodeGenRegisterClass *SRC : RC.getSuperClasses()) { + OS << " " << SRC->getName(); + } + OS << '\n'; + } + + for (const CodeGenSubRegIndex &SRI : RegBank.getSubRegIndices()) { + OS << "SubRegIndex " << SRI.getName() << ":\n"; + OS << "\tLaneMask: " << PrintLaneMask(SRI.LaneMask) << '\n'; + OS << "\tAllSuperRegsCovered: " << SRI.AllSuperRegsCovered << '\n'; + } + + for (const CodeGenRegister &R : RegBank.getRegisters()) { + OS << "Register " << R.getName() << ":\n"; + OS << "\tCostPerUse: " << R.CostPerUse << '\n'; + OS << "\tCoveredBySubregs: " << R.CoveredBySubRegs << '\n'; + OS << "\tHasDisjunctSubRegs: " << R.HasDisjunctSubRegs << '\n'; + for (std::pair P : R.getSubRegs()) { + OS << "\tSubReg " << P.first->getName() + << " = " << P.second->getName() << '\n'; + } + } +} + namespace llvm { void EmitRegisterInfo(RecordKeeper &RK, raw_ostream &OS) { RegisterInfoEmitter(RK).run(OS); } +void EmitRegisterInfoDebugDump(RecordKeeper &RK, raw_ostream &OS) { + RegisterInfoEmitter(RK).debugDump(OS); +} + } // end namespace llvm Index: utils/TableGen/TableGen.cpp =================================================================== --- utils/TableGen/TableGen.cpp +++ utils/TableGen/TableGen.cpp @@ -27,6 +27,7 @@ PrintRecords, GenEmitter, GenRegisterInfo, + GenRegisterInfoDebugDump, GenInstrInfo, GenAsmWriter, GenAsmMatcher, @@ -59,6 +60,9 @@ "Generate machine code emitter"), clEnumValN(GenRegisterInfo, "gen-register-info", "Generate registers and register classes info"), + clEnumValN(GenRegisterInfoDebugDump, + "gen-register-info-debug-dump", + "Generate register info debug dump"), clEnumValN(GenInstrInfo, "gen-instr-info", "Generate instruction descriptions"), clEnumValN(GenCallingConv, "gen-callingconv", @@ -118,6 +122,9 @@ case GenRegisterInfo: EmitRegisterInfo(Records, OS); break; + case GenRegisterInfoDebugDump: + EmitRegisterInfoDebugDump(Records, OS); + break; case GenInstrInfo: EmitInstrInfo(Records, OS); break; Index: utils/TableGen/TableGenBackends.h =================================================================== --- utils/TableGen/TableGenBackends.h +++ utils/TableGen/TableGenBackends.h @@ -74,6 +74,7 @@ void EmitInstrInfo(RecordKeeper &RK, raw_ostream &OS); void EmitPseudoLowering(RecordKeeper &RK, raw_ostream &OS); void EmitRegisterInfo(RecordKeeper &RK, raw_ostream &OS); +void EmitRegisterInfoDebugDump(RecordKeeper &RK, raw_ostream &OS); void EmitSubtarget(RecordKeeper &RK, raw_ostream &OS); void EmitMapTable(RecordKeeper &RK, raw_ostream &OS); void EmitOptParser(RecordKeeper &RK, raw_ostream &OS);