+const char *Graph::opName(NodeType op)
+{
+ return dfgOpNames[op];
+}
+
+const char* Graph::nameOfVariableAccessData(VariableAccessData* variableAccessData)
+{
+ // Variables are already numbered. For readability of IR dumps, this returns
+ // an alphabetic name for the variable access data, so that you don't have to
+ // reason about two numbers (variable number and live range number), but instead
+ // a number and a letter.
+
+ unsigned index = std::numeric_limits<unsigned>::max();
+ for (unsigned i = 0; i < m_variableAccessData.size(); ++i) {
+ if (&m_variableAccessData[i] == variableAccessData) {
+ index = i;
+ break;
+ }
+ }
+
+ ASSERT(index != std::numeric_limits<unsigned>::max());
+
+ if (!index)
+ return "A";
+
+ static char buf[10];
+ BoundsCheckedPointer<char> ptr(buf, sizeof(buf));
+
+ while (index) {
+ *ptr++ = 'A' + (index % 26);
+ index /= 26;
+ }
+
+ *ptr++ = 0;
+
+ return buf;
+}
+
+static void printWhiteSpace(unsigned amount)
+{
+ while (amount-- > 0)
+ dataLog(" ");
+}
+
+void Graph::dumpCodeOrigin(NodeIndex prevNodeIndex, NodeIndex nodeIndex)
+{
+ if (prevNodeIndex == NoNode)
+ return;
+
+ Node& currentNode = at(nodeIndex);
+ Node& previousNode = at(prevNodeIndex);
+ if (previousNode.codeOrigin.inlineCallFrame == currentNode.codeOrigin.inlineCallFrame)
+ return;
+
+ Vector<CodeOrigin> previousInlineStack = previousNode.codeOrigin.inlineStack();
+ Vector<CodeOrigin> currentInlineStack = currentNode.codeOrigin.inlineStack();
+ unsigned commonSize = std::min(previousInlineStack.size(), currentInlineStack.size());
+ unsigned indexOfDivergence = commonSize;
+ for (unsigned i = 0; i < commonSize; ++i) {
+ if (previousInlineStack[i].inlineCallFrame != currentInlineStack[i].inlineCallFrame) {
+ indexOfDivergence = i;
+ break;
+ }
+ }
+
+ // Print the pops.
+ for (unsigned i = previousInlineStack.size(); i-- > indexOfDivergence;) {
+ printWhiteSpace(i * 2);
+ dataLog("<-- %p\n", previousInlineStack[i].inlineCallFrame->executable.get());
+ }
+
+ // Print the pushes.
+ for (unsigned i = indexOfDivergence; i < currentInlineStack.size(); ++i) {
+ printWhiteSpace(i * 2);
+ dataLog("--> %p\n", currentInlineStack[i].inlineCallFrame->executable.get());
+ }
+}
+
+void Graph::dump(NodeIndex nodeIndex)