Skip to content

Commit 23abbdd

Browse files
Fix a bit-rotted Interpreter::dumpRegisters() and make it more robust.
https://bugs.webkit.org/show_bug.cgi?id=179699 <rdar://problem/35462346> Reviewed by Michael Saboff. * interpreter/Interpreter.cpp: (JSC::Interpreter::dumpRegisters): - Need to skip the callee saved registers git-svn-id: http://svn.webkit.org/repository/webkit/trunk@224862 268f45cc-cd09-0410-ab3c-d52691b4dbfc
1 parent 315f71c commit 23abbdd

File tree

2 files changed

+39
-14
lines changed

2 files changed

+39
-14
lines changed

Source/JavaScriptCore/ChangeLog

+12
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,15 @@
1+
2017-11-14 Mark Lam <[email protected]>
2+
3+
Fix a bit-rotted Interpreter::dumpRegisters() and make it more robust.
4+
https://bugs.webkit.org/show_bug.cgi?id=179699
5+
<rdar://problem/35462346>
6+
7+
Reviewed by Michael Saboff.
8+
9+
* interpreter/Interpreter.cpp:
10+
(JSC::Interpreter::dumpRegisters):
11+
- Need to skip the callee saved registers
12+
113
2017-11-14 Guillaume Emont <[email protected]>
214

315
REGRESSION(r224623) [MIPS] branchTruncateDoubleToInt32() doesn't set return register when branching

Source/JavaScriptCore/interpreter/Interpreter.cpp

+27-14
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@
7474
#include "Symbol.h"
7575
#include "VMEntryScope.h"
7676
#include "VMInlines.h"
77+
#include "VMInspector.h"
7778
#include "VirtualRegister.h"
7879

7980
#include <limits.h>
@@ -395,7 +396,6 @@ class DumpReturnVirtualPCFunctor {
395396
unsigned unusedColumn = 0;
396397
visitor->computeLineAndColumn(line, unusedColumn);
397398
dataLogF("[ReturnVPC] | %10p | %d (line %d)\n", m_it, visitor->bytecodeOffset(), line);
398-
--m_it;
399399
return StackVisitor::Done;
400400
}
401401

@@ -406,12 +406,18 @@ class DumpReturnVirtualPCFunctor {
406406

407407
void Interpreter::dumpRegisters(CallFrame* callFrame)
408408
{
409+
CodeBlock* codeBlock = callFrame->codeBlock();
410+
if (!codeBlock) {
411+
dataLog("Dumping host frame registers not supported.\n");
412+
return;
413+
}
414+
VM& vm = *codeBlock->vm();
415+
409416
dataLogF("Register frame: \n\n");
410417
dataLogF("-----------------------------------------------------------------------------\n");
411418
dataLogF(" use | address | value \n");
412419
dataLogF("-----------------------------------------------------------------------------\n");
413420

414-
CodeBlock* codeBlock = callFrame->codeBlock();
415421
const Register* it;
416422
const Register* end;
417423

@@ -427,33 +433,36 @@ void Interpreter::dumpRegisters(CallFrame* callFrame)
427433

428434
dataLogF("-----------------------------------------------------------------------------\n");
429435
dataLogF("[ArgumentCount] | %10p | %lu \n", it, (unsigned long) callFrame->argumentCount());
430-
--it;
431-
dataLogF("[CallerFrame] | %10p | %p \n", it, callFrame->callerFrame());
436+
DumpReturnVirtualPCFunctor functor(it);
437+
callFrame->iterate(functor);
432438
--it;
433439
dataLogF("[Callee] | %10p | %p \n", it, callFrame->jsCallee());
434440
--it;
435-
// FIXME: Remove the next decrement when the ScopeChain slot is removed from the call header
441+
dataLogF("[CodeBlock] | %10p | %p \n", it, callFrame->codeBlock());
436442
--it;
437443
#if ENABLE(JIT)
438444
AbstractPC pc = callFrame->abstractReturnPC(callFrame->vm());
439445
if (pc.hasJITReturnAddress())
440-
dataLogF("[ReturnJITPC] | %10p | %p \n", it, pc.jitReturnAddress().value());
446+
dataLogF("[ReturnPC] | %10p | %p \n", it, pc.jitReturnAddress().value());
447+
--it;
441448
#endif
442-
443-
DumpReturnVirtualPCFunctor functor(it);
444-
callFrame->iterate(functor);
445-
446-
dataLogF("[CodeBlock] | %10p | %p \n", it, callFrame->codeBlock());
449+
dataLogF("[CallerFrame] | %10p | %p \n", it, callFrame->callerFrame());
447450
--it;
448451
dataLogF("-----------------------------------------------------------------------------\n");
449452

453+
size_t numberOfCalleeSaveSlots = codeBlock->calleeSaveSpaceAsVirtualRegisters();
454+
const Register* endOfCalleeSaves = it - numberOfCalleeSaveSlots;
455+
450456
end = it - codeBlock->m_numVars;
451457
if (it != end) {
452458
do {
453459
JSValue v = it->jsValue();
454460
int registerNumber = it - callFrame->registers();
455-
String name = codeBlock->nameForRegister(VirtualRegister(registerNumber));
456-
dataLogF("[r% 3d %14s] | %10p | %-16s 0x%lld \n", registerNumber, name.ascii().data(), it, toCString(v).data(), (long long)JSValue::encode(v));
461+
String name = (it > endOfCalleeSaves)
462+
? "CalleeSaveReg"
463+
: codeBlock->nameForRegister(VirtualRegister(registerNumber));
464+
CString valueString = (it > endOfCalleeSaves) ? "" : toCString(v);
465+
dataLogF("[r% 3d %14s] | %10p | %-16s 0x%lld \n", registerNumber, name.ascii().data(), it, valueString.data(), (long long)JSValue::encode(v));
457466
--it;
458467
} while (it != end);
459468
}
@@ -464,7 +473,11 @@ void Interpreter::dumpRegisters(CallFrame* callFrame)
464473
do {
465474
JSValue v = (*it).jsValue();
466475
int registerNumber = it - callFrame->registers();
467-
dataLogF("[r% 3d] | %10p | %-16s 0x%lld \n", registerNumber, it, toCString(v).data(), (long long)JSValue::encode(v));
476+
CString valueString =
477+
(v.isCell() && !VMInspector::isValidCell(&vm.heap, reinterpret_cast<JSCell*>(JSValue::encode(v))))
478+
? "INVALID"
479+
: toCString(v);
480+
dataLogF("[r% 3d] | %10p | %-16s 0x%lld \n", registerNumber, it, valueString.data(), (long long)JSValue::encode(v));
468481
--it;
469482
} while (it != end);
470483
}

0 commit comments

Comments
 (0)