DBG+BRIDGE+GUI: make single loops show properly
This commit is contained in:
parent
e4efed3eaf
commit
b89fdcd3c1
|
@ -520,7 +520,9 @@ BRIDGE_IMPEXP LOOPTYPE DbgGetLoopTypeAt(duint addr, int depth)
|
|||
return LOOP_NONE;
|
||||
duint start = info.loop.start;
|
||||
duint end = info.loop.end;
|
||||
if(addr == start)
|
||||
if(start == end || info.loop.instrcount == 1)
|
||||
return LOOP_SINGLE;
|
||||
else if(addr == start)
|
||||
return LOOP_BEGIN;
|
||||
else if(addr == end)
|
||||
return LOOP_END;
|
||||
|
|
|
@ -142,7 +142,8 @@ typedef enum
|
|||
LOOP_BEGIN,
|
||||
LOOP_MIDDLE,
|
||||
LOOP_ENTRY,
|
||||
LOOP_END
|
||||
LOOP_END,
|
||||
LOOP_SINGLE
|
||||
} LOOPTYPE;
|
||||
|
||||
//order by most important type last
|
||||
|
@ -450,6 +451,7 @@ typedef struct
|
|||
int depth; //IN
|
||||
duint start; //OUT
|
||||
duint end; //OUT
|
||||
duint instrcount; //OUT
|
||||
} LOOP;
|
||||
|
||||
#ifndef _NO_ADDRINFO
|
||||
|
|
|
@ -230,7 +230,7 @@ extern "C" DLL_EXPORT bool _dbg_addrinfoget(duint addr, SEGMENTREG segment, ADDR
|
|||
}
|
||||
if(addrinfo->flags & flagloop)
|
||||
{
|
||||
if(LoopGet(addrinfo->loop.depth, addr, &addrinfo->loop.start, &addrinfo->loop.end))
|
||||
if(LoopGet(addrinfo->loop.depth, addr, &addrinfo->loop.start, &addrinfo->loop.end, &addrinfo->loop.instrcount))
|
||||
retval = true;
|
||||
}
|
||||
if(addrinfo->flags & flagargs)
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
|
||||
std::map<DepthModuleRange, LOOPSINFO, DepthModuleRangeCompare> loops;
|
||||
|
||||
bool LoopAdd(duint Start, duint End, bool Manual)
|
||||
bool LoopAdd(duint Start, duint End, bool Manual, duint instructionCount)
|
||||
{
|
||||
ASSERT_DEBUGGING("Export call");
|
||||
|
||||
|
@ -35,6 +35,7 @@ bool LoopAdd(duint Start, duint End, bool Manual)
|
|||
loopInfo.end = End - moduleBase;
|
||||
loopInfo.depth = finalDepth;
|
||||
loopInfo.manual = Manual;
|
||||
loopInfo.instructioncount = instructionCount;
|
||||
ModNameFromAddr(Start, loopInfo.mod, true);
|
||||
|
||||
// Link this to a parent loop if one does exist
|
||||
|
@ -53,7 +54,7 @@ bool LoopAdd(duint Start, duint End, bool Manual)
|
|||
}
|
||||
|
||||
// Get the start/end of a loop at a certain depth and address
|
||||
bool LoopGet(int Depth, duint Address, duint* Start, duint* End)
|
||||
bool LoopGet(int Depth, duint Address, duint* Start, duint* End, duint* InstructionCount)
|
||||
{
|
||||
ASSERT_DEBUGGING("Export call");
|
||||
|
||||
|
@ -78,6 +79,9 @@ bool LoopGet(int Depth, duint Address, duint* Start, duint* End)
|
|||
if(End)
|
||||
*End = found->second.end + moduleBase;
|
||||
|
||||
if(InstructionCount)
|
||||
*InstructionCount = found->second.instructioncount;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -183,6 +187,7 @@ void LoopCacheSave(JSON Root)
|
|||
json_object_set_new(currentJson, "end", json_hex(currentLoop.end));
|
||||
json_object_set_new(currentJson, "depth", json_integer(currentLoop.depth));
|
||||
json_object_set_new(currentJson, "parent", json_hex(currentLoop.parent));
|
||||
json_object_set_new(currentJson, "icount", json_hex(currentLoop.instructioncount));
|
||||
|
||||
if(currentLoop.manual)
|
||||
json_array_append_new(jsonLoops, currentJson);
|
||||
|
@ -228,6 +233,7 @@ void LoopCacheLoad(JSON Root)
|
|||
loopInfo.end = (duint)json_hex_value(json_object_get(value, "end"));
|
||||
loopInfo.depth = (int)json_integer_value(json_object_get(value, "depth"));
|
||||
loopInfo.parent = (duint)json_hex_value(json_object_get(value, "parent"));
|
||||
loopInfo.instructioncount = (duint)json_hex_value(json_object_get(value, "icount"));
|
||||
loopInfo.manual = Manual;
|
||||
|
||||
// Sanity check: Make sure the loop starts before it ends
|
||||
|
|
|
@ -11,10 +11,11 @@ struct LOOPSINFO
|
|||
duint parent;
|
||||
int depth;
|
||||
bool manual;
|
||||
duint instructioncount;
|
||||
};
|
||||
|
||||
bool LoopAdd(duint Start, duint End, bool Manual);
|
||||
bool LoopGet(int Depth, duint Address, duint* Start, duint* End);
|
||||
bool LoopAdd(duint Start, duint End, bool Manual, duint InstructionCount = 0);
|
||||
bool LoopGet(int Depth, duint Address, duint* Start = nullptr, duint* End = nullptr, duint* InstructionCount = nullptr);
|
||||
bool LoopOverlaps(int Depth, duint Start, duint End, int* FinalDepth);
|
||||
bool LoopDelete(int Depth, duint Address);
|
||||
void LoopCacheSave(JSON Root);
|
||||
|
|
|
@ -470,6 +470,9 @@ QString Disassembly::paintContent(QPainter* painter, dsint rowBase, int rowOffse
|
|||
Function_t funcType;
|
||||
switch(loopType)
|
||||
{
|
||||
case LOOP_SINGLE:
|
||||
funcType = Function_single;
|
||||
break;
|
||||
case LOOP_BEGIN:
|
||||
funcType = Function_start;
|
||||
break;
|
||||
|
@ -485,7 +488,7 @@ QString Disassembly::paintContent(QPainter* painter, dsint rowBase, int rowOffse
|
|||
default:
|
||||
break;
|
||||
}
|
||||
loopsize += paintFunctionGraphic(painter, x + loopsize, y, funcType, true);
|
||||
loopsize += paintFunctionGraphic(painter, x + loopsize, y, funcType, loopType != LOOP_SINGLE);
|
||||
depth++;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue