Debugger: Add label support for watch/breakpoints

This commit is contained in:
Sour 2019-05-03 14:16:04 -04:00
parent 8af2f540ec
commit 275751c486
4 changed files with 15 additions and 17 deletions

View file

@ -37,10 +37,10 @@ Debugger::Debugger(shared_ptr<Console> console)
_settings = console->GetSettings();
_memoryManager = console->GetMemoryManager();
_labelManager.reset(new LabelManager(this));
_watchExpEval[(int)CpuType::Cpu].reset(new ExpressionEvaluator(this, CpuType::Cpu));
_watchExpEval[(int)CpuType::Spc].reset(new ExpressionEvaluator(this, CpuType::Spc));
_labelManager.reset(new LabelManager(this));
_codeDataLogger.reset(new CodeDataLogger(console->GetCartridge()->DebugGetPrgRomSize(), _memoryManager.get()));
_disassembler.reset(new Disassembler(console, _codeDataLogger, this));
_traceLogger.reset(new TraceLogger(this, _console));

View file

@ -7,6 +7,7 @@
#include "Debugger.h"
#include "MemoryDumper.h"
#include "Disassembler.h"
#include "LabelManager.h"
#include "../Utilities/HexUtilities.h"
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)
{
string token;
//size_t initialPos = pos;
size_t initialPos = pos;
size_t len = expression.size();
do {
char c = std::tolower(expression[pos]);
@ -106,14 +107,12 @@ bool ExpressionEvaluator::CheckSpecialTokens(string expression, size_t &pos, str
} else if(token == "isread") {
output += std::to_string((int64_t)EvalValues::IsRead);
} else {
return false;
//TODO LABELS
/*string originalExpression = expression.substr(initialPos, pos - initialPos);
bool validLabel = _debugger->GetLabelManager()->ContainsLabel(originalExpression);
string originalExpression = expression.substr(initialPos, pos - initialPos);
bool validLabel = _labelManager->ContainsLabel(originalExpression);
if(!validLabel) {
//Check if a multi-byte label exists for this name
string label = originalExpression + "+0";
validLabel = _debugger->GetLabelManager()->ContainsLabel(label);
validLabel = _labelManager->ContainsLabel(label);
}
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);
} else {
return false;
}*/
}
}
return true;
@ -350,17 +349,13 @@ int32_t ExpressionEvaluator::Evaluate(ExpressionData &data, DebugState &state, E
if(token >= EvalValues::RegA) {
//Replace value with a special value
if(token >= EvalValues::FirstLabelIndex) {
resultType = EvalResultType::Invalid;
return 0;
//TODO
/*int64_t labelIndex = token - EvalValues::FirstLabelIndex;
int64_t labelIndex = token - EvalValues::FirstLabelIndex;
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) {
//Label doesn't exist, try to find a matching multi-byte label
string label = data.Labels[(uint32_t)labelIndex] + "+0";
token = _debugger->GetLabelManager()->GetLabelRelativeAddress(label);
token = _labelManager->GetLabelRelativeAddress(label);
}
} else {
token = -2;
@ -369,7 +364,7 @@ int32_t ExpressionEvaluator::Evaluate(ExpressionData &data, DebugState &state, E
//Label is no longer valid
resultType = token == -1 ? EvalResultType::OutOfScope : EvalResultType::Invalid;
return 0;
}*/
}
} else {
switch(token) {
/*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)
{
_debugger = debugger;
_labelManager = debugger->GetLabelManager().get();
_cpuType = cpuType;
_cpuMemory = cpuType == CpuType::Cpu ? SnesMemoryType::CpuMemory : SnesMemoryType::SpcMemory;
}

View file

@ -8,6 +8,7 @@
#include "../Utilities/SimpleLock.h"
class Debugger;
class LabelManager;
enum EvalOperators : int64_t
{
@ -108,6 +109,7 @@ private:
int64_t operandStack[1000];
Debugger* _debugger;
LabelManager* _labelManager;
CpuType _cpuType;
SnesMemoryType _cpuMemory;

View file

@ -55,7 +55,7 @@ uint64_t LabelManager::GetLabelKey(uint32_t absoluteAddr, SnesMemoryType memType
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)2 << 32): return SnesMemoryType::WorkRam; break;
case ((uint64_t)3 << 32): return SnesMemoryType::SaveRam; break;