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();
|
||||
_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));
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue