From 275751c4869286d085bb0569ea1ddbb1e7e37a52 Mon Sep 17 00:00:00 2001 From: Sour Date: Fri, 3 May 2019 14:16:04 -0400 Subject: [PATCH] Debugger: Add label support for watch/breakpoints --- Core/Debugger.cpp | 2 +- Core/ExpressionEvaluator.cpp | 26 +++++++++++--------------- Core/ExpressionEvaluator.h | 2 ++ Core/LabelManager.cpp | 2 +- 4 files changed, 15 insertions(+), 17 deletions(-) diff --git a/Core/Debugger.cpp b/Core/Debugger.cpp index 8402239..aa5d8bd 100644 --- a/Core/Debugger.cpp +++ b/Core/Debugger.cpp @@ -37,10 +37,10 @@ Debugger::Debugger(shared_ptr 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)); diff --git a/Core/ExpressionEvaluator.cpp b/Core/ExpressionEvaluator.cpp index 5b1c90c..a6f6f66 100644 --- a/Core/ExpressionEvaluator.cpp +++ b/Core/ExpressionEvaluator.cpp @@ -7,6 +7,7 @@ #include "Debugger.h" #include "MemoryDumper.h" #include "Disassembler.h" +#include "LabelManager.h" #include "../Utilities/HexUtilities.h" const vector 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; } diff --git a/Core/ExpressionEvaluator.h b/Core/ExpressionEvaluator.h index dde99cb..d8098b3 100644 --- a/Core/ExpressionEvaluator.h +++ b/Core/ExpressionEvaluator.h @@ -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; diff --git a/Core/LabelManager.cpp b/Core/LabelManager.cpp index be28cc0..d164792 100644 --- a/Core/LabelManager.cpp +++ b/Core/LabelManager.cpp @@ -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;