[llvm-commits] [llvm] r108822 - in /llvm/trunk/lib/CodeGen: RenderMachineFunction.cpp RenderMachineFunction.h
Lang Hames
lhames at gmail.com
Tue Jul 20 02:13:29 PDT 2010
Author: lhames
Date: Tue Jul 20 04:13:29 2010
New Revision: 108822
URL: http://llvm.org/viewvc/llvm-project?rev=108822&view=rev
Log:
Added support for turning HTML indentation on and off (indentation off by default).
Reduces output file size ~20% on my test cases.
Modified:
llvm/trunk/lib/CodeGen/RenderMachineFunction.cpp
llvm/trunk/lib/CodeGen/RenderMachineFunction.h
Modified: llvm/trunk/lib/CodeGen/RenderMachineFunction.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/RenderMachineFunction.cpp?rev=108822&r1=108821&r2=108822&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/RenderMachineFunction.cpp (original)
+++ llvm/trunk/lib/CodeGen/RenderMachineFunction.cpp Tue Jul 20 04:13:29 2010
@@ -66,6 +66,12 @@
cl::desc("Use SVG for vertical text."),
cl::init(true), cl::Hidden);
+static cl::opt<bool>
+prettyHTML("rmf-pretty-html",
+ cl::desc("Pretty print HTML. For debugging the renderer only.."),
+ cl::init(false), cl::Hidden);
+
+
namespace llvm {
bool MFRenderingOptions::renderingOptionsProcessed;
@@ -493,6 +499,25 @@
// ---------- MachineFunctionRenderer implementation ----------
+ template <typename OStream>
+ void RenderMachineFunction::Spacer::print(OStream &os) const {
+ if (!prettyHTML)
+ return;
+ for (unsigned i = 0; i < ns; ++i) {
+ os << " ";
+ }
+ }
+
+ RenderMachineFunction::Spacer RenderMachineFunction::s(unsigned ns) const {
+ return Spacer(ns);
+ }
+
+ template <typename OStream>
+ OStream& operator<<(OStream &os, const RenderMachineFunction::Spacer &s) {
+ s.print(os);
+ return os;
+ }
+
template <typename Iterator>
std::string RenderMachineFunction::escapeChars(Iterator sBegin, Iterator sEnd) const {
std::string r;
@@ -558,22 +583,23 @@
}
template <typename OStream, typename T>
- void RenderMachineFunction::renderVertical(const std::string &indent,
+ void RenderMachineFunction::renderVertical(const Spacer &indent,
OStream &os,
const T &t) const {
if (ro.fancyVerticals()) {
os << indent << "<object\n"
- << indent << " class=\"obj\"\n"
- << indent << " type=\"image/svg+xml\"\n"
- << indent << " width=\"14px\"\n"
- << indent << " height=\"55px\"\n"
- << indent << " data=\"data:image/svg+xml,\n"
- << indent << " <svg xmlns='http://www.w3.org/2000/svg'>\n"
- << indent << " <text x='-55' y='10' "
- "font-family='Courier' font-size='12' "
- "transform='rotate(-90)' text-rendering='optimizeSpeed' "
- "fill='#000'>" << t << "</text>\n"
- << indent << " </svg>\">\n"
+ << indent + s(2) << "class=\"obj\"\n"
+ << indent + s(2) << "type=\"image/svg+xml\"\n"
+ << indent + s(2) << "width=\"14px\"\n"
+ << indent + s(2) << "height=\"55px\"\n"
+ << indent + s(2) << "data=\"data:image/svg+xml,\n"
+ << indent + s(4) << "<svg xmlns='http://www.w3.org/2000/svg'>\n"
+ << indent + s(6) << "<text x='-55' y='10' "
+ "font-family='Courier' font-size='12' "
+ "transform='rotate(-90)' "
+ "text-rendering='optimizeSpeed' "
+ "fill='#000'>" << t << "</text>\n"
+ << indent + s(4) << "</svg>\">\n"
<< indent << "</object>\n";
} else {
std::ostringstream oss;
@@ -583,36 +609,36 @@
os << indent;
for (std::string::iterator tStrItr = tStr.begin(), tStrEnd = tStr.end();
tStrItr != tStrEnd; ++tStrItr) {
- os << *tStrItr << "<br/> ";
+ os << *tStrItr << "<br/>";
}
os << "\n";
}
}
template <typename OStream>
- void RenderMachineFunction::insertCSS(const std::string &indent,
+ void RenderMachineFunction::insertCSS(const Spacer &indent,
OStream &os) const {
os << indent << "<style type=\"text/css\">\n"
- << indent << " body { font-color: black; }\n"
- << indent << " table.code td { font-family: monospace; "
+ << indent + s(2) << "body { font-color: black; }\n"
+ << indent + s(2) << "table.code td { font-family: monospace; "
"border-width: 0px; border-style: solid; "
"border-bottom: 1px solid #dddddd; white-space: nowrap; }\n"
- << indent << " table.code td.s-zp { background-color: #000000; }\n"
- << indent << " table.code td.s-up { background-color: #00ff00; }\n"
- << indent << " table.code td.s-op { background-color: #ff0000; }\n"
- << indent << " table.code td.l-na { background-color: #ffffff; }\n"
- << indent << " table.code td.l-def { background-color: #ff0000; }\n"
- << indent << " table.code td.l-use { background-color: #ffff00; }\n"
- << indent << " table.code td.l-sar { background-color: #000000; }\n"
- << indent << " table.code td.l-sas { background-color: #770000; }\n"
- << indent << " table.code th { border-width: 0px; "
+ << indent + s(2) << "table.code td.s-zp { background-color: #000000; }\n"
+ << indent + s(2) << "table.code td.s-up { background-color: #00ff00; }\n"
+ << indent + s(2) << "table.code td.s-op { background-color: #ff0000; }\n"
+ << indent + s(2) << "table.code td.l-na { background-color: #ffffff; }\n"
+ << indent + s(2) << "table.code td.l-def { background-color: #ff0000; }\n"
+ << indent + s(2) << "table.code td.l-use { background-color: #ffff00; }\n"
+ << indent + s(2) << "table.code td.l-sar { background-color: #000000; }\n"
+ << indent + s(2) << "table.code td.l-sas { background-color: #770000; }\n"
+ << indent + s(2) << "table.code th { border-width: 0px; "
"border-style: solid; }\n"
<< indent << "</style>\n";
}
template <typename OStream>
void RenderMachineFunction::renderFunctionSummary(
- const std::string &indent, OStream &os,
+ const Spacer &indent, OStream &os,
const char * const renderContextStr) const {
os << indent << "<h1>Function: " << mf->getFunction()->getName()
<< "</h1>\n"
@@ -622,40 +648,40 @@
template <typename OStream>
void RenderMachineFunction::renderPressureTableLegend(
- const std::string &indent,
+ const Spacer &indent,
OStream &os) const {
os << indent << "<h2>Rendering Pressure Legend:</h2>\n"
<< indent << "<table class=\"code\">\n"
- << indent << " <tr>\n"
- << indent << " <th>Pressure</th><th>Description</th>"
+ << indent + s(2) << "<tr>\n"
+ << indent + s(4) << "<th>Pressure</th><th>Description</th>"
"<th>Appearance</th>\n"
- << indent << " </tr>\n"
- << indent << " <tr>\n"
- << indent << " <td>No Pressure</td>"
- " <td>No physical registers of this class requested.</td>"
- " <td class=\"s-zp\"> </td>\n"
- << indent << " </tr>\n"
- << indent << " <tr>\n"
- << indent << " <td>Low Pressure</td>"
- " <td>Sufficient physical registers to meet demand.</td>"
- " <td class=\"s-up\"> </td>\n"
- << indent << " </tr>\n"
- << indent << " <tr>\n"
- << indent << " <td>High Pressure</td>"
- " <td>Potentially insufficient physical registers to meet demand.</td>"
- " <td class=\"s-op\"> </td>\n"
- << indent << " </tr>\n"
+ << indent + s(2) << "</tr>\n"
+ << indent + s(2) << "<tr>\n"
+ << indent + s(4) << "<td>No Pressure</td>"
+ "<td>No physical registers of this class requested.</td>"
+ "<td class=\"s-zp\"> </td>\n"
+ << indent + s(2) << "</tr>\n"
+ << indent + s(2) << "<tr>\n"
+ << indent + s(4) << "<td>Low Pressure</td>"
+ "<td>Sufficient physical registers to meet demand.</td>"
+ "<td class=\"s-up\"> </td>\n"
+ << indent + s(2) << "</tr>\n"
+ << indent + s(2) << "<tr>\n"
+ << indent + s(4) << "<td>High Pressure</td>"
+ "<td>Potentially insufficient physical registers to meet demand.</td>"
+ "<td class=\"s-op\"> </td>\n"
+ << indent + s(2) << "</tr>\n"
<< indent << "</table>\n";
}
template <typename OStream>
- void RenderMachineFunction::renderCodeTablePlusPI(const std::string & indent,
+ void RenderMachineFunction::renderCodeTablePlusPI(const Spacer &indent,
OStream &os) const {
os << indent << "<table cellpadding=0 cellspacing=0 class=\"code\">\n"
- << indent << " <tr>\n"
- << indent << " <th>index</th>\n"
- << indent << " <th>instr</th>\n";
+ << indent + s(2) << "<tr>\n"
+ << indent + s(4) << "<th>index</th>\n"
+ << indent + s(4) << "<th>instr</th>\n";
// Header row:
@@ -665,15 +691,15 @@
rcEnd = ro.regClasses().end();
rcItr != rcEnd; ++rcItr) {
const TargetRegisterClass *trc = *rcItr;
- os << indent << " <th>\n";
- renderVertical(indent + " ", os, trc->getName());
- os << indent << " </th>\n";
+ os << indent + s(4) << "<th>\n";
+ renderVertical(indent + s(6), os, trc->getName());
+ os << indent + s(4) << "</th>\n";
}
}
// FIXME: Is there a nicer way to insert space between columns in HTML?
if (!ro.regClasses().empty() && !ro.intervals().empty())
- os << indent << " <th> </th>\n";
+ os << indent + s(4) << "<th> </th>\n";
if (!ro.intervals().empty()) {
for (MFRenderingOptions::IntervalSet::const_iterator
@@ -682,13 +708,13 @@
liItr != liEnd; ++liItr) {
const LiveInterval *li = *liItr;
- os << indent << " <th>\n";
- renderVertical(indent + " ", os, li->reg);
- os << indent << " </th>\n";
+ os << indent + s(4) << "<th>\n";
+ renderVertical(indent + s(6), os, li->reg);
+ os << indent + s(4) << "</th>\n";
}
}
- os << indent << " </tr>\n";
+ os << indent + s(2) << "</tr>\n";
MachineInstr *mi = 0;
@@ -696,7 +722,7 @@
for (SlotIndex i = sis->getZeroIndex(); i != sis->getLastIndex();
i = i.getNextSlot()) {
- os << indent << " <tr height=6ex>\n";
+ os << indent + s(2) << "<tr height=6ex>\n";
if (i.getSlot() == SlotIndex::LOAD) {
MachineBasicBlock *mbb = sis->getMBBFromIndex(i);
@@ -704,19 +730,18 @@
if (i == sis->getMBBStartIdx(mbb) || mi != 0 ||
ro.renderEmptyIndexes()) {
- os << indent << " <td rowspan=4>" << i << " </td>\n"
- << indent << " <td rowspan=4>\n";
+ os << indent + s(4) << "<td rowspan=4>" << i << " </td>\n"
+ << indent + s(4) << "<td rowspan=4>\n";
if (i == sis->getMBBStartIdx(mbb)) {
- os << indent << " BB#" << mbb->getNumber() << ": \n";
+ os << indent + s(6) << "BB#" << mbb->getNumber() << ": \n";
} else if (mi != 0) {
- os << indent << " ";
+ os << indent + s(6) << " ";
renderMachineInstr(os, mi);
- os << "\n";
} else {
- os << indent << " \n";
+ os << indent + s(6) << " \n";
}
- os << indent << " </td>\n";
+ os << indent + s(4) << "</td>\n";
} else {
i = i.getStoreIndex(); // <- Will be incremented to the next index.
continue;
@@ -730,7 +755,7 @@
rcItr != rcEnd; ++rcItr) {
const TargetRegisterClass *trc = *rcItr;
- os << indent << " <td class=\"";
+ os << indent + s(4) << "<td class=\"";
if (trei.getPressureAtSlot(trc, i) == 0) {
os << "s-zp";
@@ -746,7 +771,7 @@
// FIXME: Is there a nicer way to insert space between columns in HTML?
if (!ro.regClasses().empty() && !ro.intervals().empty())
- os << indent << " <td width=2em></td>\n";
+ os << indent + s(4) << "<td width=2em></td>\n";
if (!ro.intervals().empty()) {
for (MFRenderingOptions::IntervalSet::const_iterator
@@ -754,7 +779,7 @@
liEnd = ro.intervals().end();
liItr != liEnd; ++liItr) {
const LiveInterval *li = *liItr;
- os << indent << " <td class=\"";
+ os << indent + s(4) << "<td class=\"";
switch (getLiveStateAt(li, i)) {
case Dead: os << "l-na"; break;
case Defined: os << "l-def"; break;
@@ -766,7 +791,7 @@
os << "\"></td>\n";
}
}
- os << indent << " </tr>\n";
+ os << indent + s(2) << "</tr>\n";
}
os << indent << "</table>\n";
@@ -776,7 +801,7 @@
}
template <typename OStream>
- void RenderMachineFunction::renderWarnings(const std::string &indent,
+ void RenderMachineFunction::renderWarnings(const Spacer &indent,
OStream &os) const {
}
@@ -785,25 +810,25 @@
OStream &os,
const char * const renderContextStr) const {
os << "<html>\n"
- << " <head>\n"
- << " <title>" << fqn << "</title>\n";
+ << s(2) << "<head>\n"
+ << s(4) << "<title>" << fqn << "</title>\n";
- insertCSS(" ", os);
+ insertCSS(s(4), os);
- os << " <head>\n"
- << " <body >\n";
+ os << s(2) << "<head>\n"
+ << s(2) << "<body >\n";
- renderFunctionSummary(" ", os, renderContextStr);
+ renderFunctionSummary(s(4), os, renderContextStr);
- os << " <br/><br/><br/>\n";
+ os << s(4) << "<br/><br/><br/>\n";
//renderLiveIntervalInfoTable(" ", os);
- os << " <br/><br/><br/>\n";
+ os << s(4) << "<br/><br/><br/>\n";
- renderCodeTablePlusPI(" ", os);
+ renderCodeTablePlusPI(s(4), os);
- os << " </body>\n"
+ os << s(2) << "</body>\n"
<< "</html>\n";
}
Modified: llvm/trunk/lib/CodeGen/RenderMachineFunction.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/RenderMachineFunction.h?rev=108822&r1=108821&r2=108822&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/RenderMachineFunction.h (original)
+++ llvm/trunk/lib/CodeGen/RenderMachineFunction.h Tue Jul 20 04:13:29 2010
@@ -243,6 +243,18 @@
// ---------- Rendering methods ----------
+ /// For inserting spaces when pretty printing.
+ class Spacer {
+ public:
+ explicit Spacer(unsigned numSpaces) : ns(numSpaces) {}
+ Spacer operator+(const Spacer &o) const { return Spacer(ns + o.ns); }
+ template <typename OStream> void print(OStream &os) const;
+ private:
+ unsigned ns;
+ };
+
+ Spacer s(unsigned ns) const;
+
template <typename Iterator>
std::string escapeChars(Iterator sBegin, Iterator sEnd) const;
@@ -253,38 +265,38 @@
/// \brief Render vertical text.
template <typename OStream, typename T>
- void renderVertical(const std::string &indent,
+ void renderVertical(const Spacer &indent,
OStream &os,
const T &t) const;
/// \brief Insert CSS layout info.
template <typename OStream>
- void insertCSS(const std::string &indent,
+ void insertCSS(const Spacer &indent,
OStream &os) const;
/// \brief Render a brief summary of the function (including rendering
/// context).
template <typename OStream>
- void renderFunctionSummary(const std::string &indent,
+ void renderFunctionSummary(const Spacer &indent,
OStream &os,
const char * const renderContextStr) const;
/// \brief Render a legend for the pressure table.
template <typename OStream>
- void renderPressureTableLegend(const std::string &indent,
+ void renderPressureTableLegend(const Spacer &indent,
OStream &os) const;
/// \brief Render code listing, potentially with register pressure
/// and live intervals shown alongside.
template <typename OStream>
- void renderCodeTablePlusPI(const std::string &indent,
+ void renderCodeTablePlusPI(const Spacer &indent,
OStream &os) const;
/// \brief Render warnings about the machine function, or weird rendering
/// parameter combinations (e.g. rendering specified live intervals
/// over more than one machine function).
template <typename OStream>
- void renderWarnings(const std::string &indent,
+ void renderWarnings(const Spacer &indent,
OStream &os) const;
/// \brief Render the HTML page representing the MachineFunction.
More information about the llvm-commits
mailing list