Debugger: Add label support for watch/breakpoints
This commit is contained in:
parent
8af2f540ec
commit
275751c486
4 changed files with 15 additions and 17 deletions
|
@ -37,10 +37,10 @@ Debugger::Debugger(shared_ptr<Console> console)
|
||||||
_settings = console->GetSettings();
|
_settings = console->GetSettings();
|
||||||
_memoryManager = console->GetMemoryManager();
|
_memoryManager = console->GetMemoryManager();
|
||||||
|
|
||||||
|
_labelManager.reset(new LabelManager(this));
|
||||||
_watchExpEval[(int)CpuType::Cpu].reset(new ExpressionEvaluator(this, CpuType::Cpu));
|
_watchExpEval[(int)CpuType::Cpu].reset(new ExpressionEvaluator(this, CpuType::Cpu));
|
||||||
_watchExpEval[(int)CpuType::Spc].reset(new ExpressionEvaluator(this, CpuType::Spc));
|
_watchExpEval[(int)CpuType::Spc].reset(new ExpressionEvaluator(this, CpuType::Spc));
|
||||||
|
|
||||||
_labelManager.reset(new LabelManager(this));
|
|
||||||
_codeDataLogger.reset(new CodeDataLogger(console->GetCartridge()->DebugGetPrgRomSize(), _memoryManager.get()));
|
_codeDataLogger.reset(new CodeDataLogger(console->GetCartridge()->DebugGetPrgRomSize(), _memoryManager.get()));
|
||||||
_disassembler.reset(new Disassembler(console, _codeDataLogger, this));
|
_disassembler.reset(new Disassembler(console, _codeDataLogger, this));
|
||||||
_traceLogger.reset(new TraceLogger(this, _console));
|
_traceLogger.reset(new TraceLogger(this, _console));
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#include "Debugger.h"
|
#include "Debugger.h"
|
||||||
#include "MemoryDumper.h"
|
#include "MemoryDumper.h"
|
||||||
#include "Disassembler.h"
|
#include "Disassembler.h"
|
||||||
|
#include "LabelManager.h"
|
||||||
#include "../Utilities/HexUtilities.h"
|
#include "../Utilities/HexUtilities.h"
|
||||||
|
|
||||||
const vector<string> ExpressionEvaluator::_binaryOperators = { { "*", "/", "%", "+", "-", "<<", ">>", "<", "<=", ">", ">=", "==", "!=", "&", "^", "|", "&&", "||" } };
|
const vector<string> ExpressionEvaluator::_binaryOperators = { { "*", "/", "%", "+", "-", "<<", ">>", "<", "<=", ">", ">=", "==", "!=", "&", "^", "|", "&&", "||" } };
|
||||||
|
@ -56,7 +57,7 @@ EvalOperators ExpressionEvaluator::GetOperator(string token, bool unaryOperator)
|
||||||
bool ExpressionEvaluator::CheckSpecialTokens(string expression, size_t &pos, string &output, ExpressionData &data)
|
bool ExpressionEvaluator::CheckSpecialTokens(string expression, size_t &pos, string &output, ExpressionData &data)
|
||||||
{
|
{
|
||||||
string token;
|
string token;
|
||||||
//size_t initialPos = pos;
|
size_t initialPos = pos;
|
||||||
size_t len = expression.size();
|
size_t len = expression.size();
|
||||||
do {
|
do {
|
||||||
char c = std::tolower(expression[pos]);
|
char c = std::tolower(expression[pos]);
|
||||||
|
@ -106,14 +107,12 @@ bool ExpressionEvaluator::CheckSpecialTokens(string expression, size_t &pos, str
|
||||||
} else if(token == "isread") {
|
} else if(token == "isread") {
|
||||||
output += std::to_string((int64_t)EvalValues::IsRead);
|
output += std::to_string((int64_t)EvalValues::IsRead);
|
||||||
} else {
|
} else {
|
||||||
return false;
|
string originalExpression = expression.substr(initialPos, pos - initialPos);
|
||||||
//TODO LABELS
|
bool validLabel = _labelManager->ContainsLabel(originalExpression);
|
||||||
/*string originalExpression = expression.substr(initialPos, pos - initialPos);
|
|
||||||
bool validLabel = _debugger->GetLabelManager()->ContainsLabel(originalExpression);
|
|
||||||
if(!validLabel) {
|
if(!validLabel) {
|
||||||
//Check if a multi-byte label exists for this name
|
//Check if a multi-byte label exists for this name
|
||||||
string label = originalExpression + "+0";
|
string label = originalExpression + "+0";
|
||||||
validLabel = _debugger->GetLabelManager()->ContainsLabel(label);
|
validLabel = _labelManager->ContainsLabel(label);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(validLabel) {
|
if(validLabel) {
|
||||||
|
@ -121,7 +120,7 @@ bool ExpressionEvaluator::CheckSpecialTokens(string expression, size_t &pos, str
|
||||||
output += std::to_string(EvalValues::FirstLabelIndex + data.Labels.size() - 1);
|
output += std::to_string(EvalValues::FirstLabelIndex + data.Labels.size() - 1);
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
}*/
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -350,17 +349,13 @@ int32_t ExpressionEvaluator::Evaluate(ExpressionData &data, DebugState &state, E
|
||||||
if(token >= EvalValues::RegA) {
|
if(token >= EvalValues::RegA) {
|
||||||
//Replace value with a special value
|
//Replace value with a special value
|
||||||
if(token >= EvalValues::FirstLabelIndex) {
|
if(token >= EvalValues::FirstLabelIndex) {
|
||||||
resultType = EvalResultType::Invalid;
|
int64_t labelIndex = token - EvalValues::FirstLabelIndex;
|
||||||
return 0;
|
|
||||||
|
|
||||||
//TODO
|
|
||||||
/*int64_t labelIndex = token - EvalValues::FirstLabelIndex;
|
|
||||||
if((size_t)labelIndex < data.Labels.size()) {
|
if((size_t)labelIndex < data.Labels.size()) {
|
||||||
token = _debugger->GetLabelManager()->GetLabelRelativeAddress(data.Labels[(uint32_t)labelIndex]);
|
token = _labelManager->GetLabelRelativeAddress(data.Labels[(uint32_t)labelIndex]);
|
||||||
if(token < -1) {
|
if(token < -1) {
|
||||||
//Label doesn't exist, try to find a matching multi-byte label
|
//Label doesn't exist, try to find a matching multi-byte label
|
||||||
string label = data.Labels[(uint32_t)labelIndex] + "+0";
|
string label = data.Labels[(uint32_t)labelIndex] + "+0";
|
||||||
token = _debugger->GetLabelManager()->GetLabelRelativeAddress(label);
|
token = _labelManager->GetLabelRelativeAddress(label);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
token = -2;
|
token = -2;
|
||||||
|
@ -369,7 +364,7 @@ int32_t ExpressionEvaluator::Evaluate(ExpressionData &data, DebugState &state, E
|
||||||
//Label is no longer valid
|
//Label is no longer valid
|
||||||
resultType = token == -1 ? EvalResultType::OutOfScope : EvalResultType::Invalid;
|
resultType = token == -1 ? EvalResultType::OutOfScope : EvalResultType::Invalid;
|
||||||
return 0;
|
return 0;
|
||||||
}*/
|
}
|
||||||
} else {
|
} else {
|
||||||
switch(token) {
|
switch(token) {
|
||||||
/*case EvalValues::RegOpPC: token = state.Cpu.DebugPC; break;*/
|
/*case EvalValues::RegOpPC: token = state.Cpu.DebugPC; break;*/
|
||||||
|
@ -469,6 +464,7 @@ int32_t ExpressionEvaluator::Evaluate(ExpressionData &data, DebugState &state, E
|
||||||
ExpressionEvaluator::ExpressionEvaluator(Debugger* debugger, CpuType cpuType)
|
ExpressionEvaluator::ExpressionEvaluator(Debugger* debugger, CpuType cpuType)
|
||||||
{
|
{
|
||||||
_debugger = debugger;
|
_debugger = debugger;
|
||||||
|
_labelManager = debugger->GetLabelManager().get();
|
||||||
_cpuType = cpuType;
|
_cpuType = cpuType;
|
||||||
_cpuMemory = cpuType == CpuType::Cpu ? SnesMemoryType::CpuMemory : SnesMemoryType::SpcMemory;
|
_cpuMemory = cpuType == CpuType::Cpu ? SnesMemoryType::CpuMemory : SnesMemoryType::SpcMemory;
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#include "../Utilities/SimpleLock.h"
|
#include "../Utilities/SimpleLock.h"
|
||||||
|
|
||||||
class Debugger;
|
class Debugger;
|
||||||
|
class LabelManager;
|
||||||
|
|
||||||
enum EvalOperators : int64_t
|
enum EvalOperators : int64_t
|
||||||
{
|
{
|
||||||
|
@ -108,6 +109,7 @@ private:
|
||||||
|
|
||||||
int64_t operandStack[1000];
|
int64_t operandStack[1000];
|
||||||
Debugger* _debugger;
|
Debugger* _debugger;
|
||||||
|
LabelManager* _labelManager;
|
||||||
CpuType _cpuType;
|
CpuType _cpuType;
|
||||||
SnesMemoryType _cpuMemory;
|
SnesMemoryType _cpuMemory;
|
||||||
|
|
||||||
|
|
|
@ -55,7 +55,7 @@ uint64_t LabelManager::GetLabelKey(uint32_t absoluteAddr, SnesMemoryType memType
|
||||||
|
|
||||||
SnesMemoryType LabelManager::GetKeyMemoryType(uint64_t key)
|
SnesMemoryType LabelManager::GetKeyMemoryType(uint64_t key)
|
||||||
{
|
{
|
||||||
switch(key & ~0xFFFFFFFF) {
|
switch(key & ~(uint64_t)0xFFFFFFFF) {
|
||||||
case ((uint64_t)1 << 32): return SnesMemoryType::PrgRom; break;
|
case ((uint64_t)1 << 32): return SnesMemoryType::PrgRom; break;
|
||||||
case ((uint64_t)2 << 32): return SnesMemoryType::WorkRam; break;
|
case ((uint64_t)2 << 32): return SnesMemoryType::WorkRam; break;
|
||||||
case ((uint64_t)3 << 32): return SnesMemoryType::SaveRam; break;
|
case ((uint64_t)3 << 32): return SnesMemoryType::SaveRam; break;
|
||||||
|
|
Loading…
Add table
Reference in a new issue