summaryrefslogtreecommitdiffstats
path: root/llvm/utils
diff options
context:
space:
mode:
authorMatthias Braun <matze@braunis.de>2017-08-28 19:48:40 +0000
committerMatthias Braun <matze@braunis.de>2017-08-28 19:48:40 +0000
commit3fdc099a6d7a8fb18f6a739df78f10975e9eadef (patch)
treea8839d685634c04786455fd439dbc4765d073172 /llvm/utils
parentdacfd66dfdc15f88d1767b8c201a2e50bd0c0b30 (diff)
downloadbcm5719-llvm-3fdc099a6d7a8fb18f6a739df78f10975e9eadef.tar.gz
bcm5719-llvm-3fdc099a6d7a8fb18f6a739df78f10975e9eadef.zip
TableGen: Add -gen-register-info-debug-dump
Adds a new --gen-register-info-debug-dump mode to tablegen that dumps various register related information: - List of register classes with super and subclasses - List of subregister indexes with lanemasks - List of registers with subregisters I will use this in an upcoming commit to create a test. It may also be useful for target developers wanting to get an overview of all the register related information, esp. the things inferred by tablegen and not directly visible in the .td file. Differential Revision: https://reviews.llvm.org/D36911 llvm-svn: 311913
Diffstat (limited to 'llvm/utils')
-rw-r--r--llvm/utils/TableGen/RegisterInfoEmitter.cpp71
1 files changed, 67 insertions, 4 deletions
diff --git a/llvm/utils/TableGen/RegisterInfoEmitter.cpp b/llvm/utils/TableGen/RegisterInfoEmitter.cpp
index bebb1a183fc..410b3d9590e 100644
--- a/llvm/utils/TableGen/RegisterInfoEmitter.cpp
+++ b/llvm/utils/TableGen/RegisterInfoEmitter.cpp
@@ -26,6 +26,7 @@
#include "llvm/ADT/Twine.h"
#include "llvm/CodeGen/MachineValueType.h"
#include "llvm/Support/Casting.h"
+#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Format.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/TableGen/Error.h"
@@ -44,13 +45,24 @@
using namespace llvm;
+cl::OptionCategory RegisterInfoCat("Options for -gen-register-info");
+
+static cl::opt<bool>
+ RegisterInfoDebug("register-info-debug", cl::init(false),
+ cl::desc("Dump register information to help debugging"),
+ cl::cat(RegisterInfoCat));
+
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 +81,8 @@ public:
// 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<CodeGenRegister> &Regs,
bool isCtor);
@@ -1521,14 +1535,63 @@ RegisterInfoEmitter::runTargetDesc(raw_ostream &OS, CodeGenTarget &Target,
}
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);
+
+ if (RegisterInfoDebug)
+ debugDump(errs());
+}
+
+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<CodeGenSubRegIndex*,CodeGenRegister*> P : R.getSubRegs()) {
+ OS << "\tSubReg " << P.first->getName()
+ << " = " << P.second->getName() << '\n';
+ }
+ }
}
namespace llvm {
OpenPOWER on IntegriCloud