added disasm debugger features to remove and add functions

This commit is contained in:
Peter Tissen 2013-10-30 16:13:18 +01:00
parent f3d9ef6564
commit d8b4ec6680
5 changed files with 92 additions and 1 deletions

View file

@ -122,6 +122,16 @@ void SymbolMap::AddSymbol(const char *symbolname, unsigned int vaddress, size_t
}
}
void SymbolMap::RemoveSymbolNum(int symbolnum){
lock_guard guard(lock_);
MapEntry &toRemove = entries[symbolnum];
uniqueEntries.erase((const MapEntryUniqueInfo) toRemove);
entryRanges.erase(toRemove.vaddress + toRemove.size);
entries.erase(entries.begin() + symbolnum);
}
bool SymbolMap::LoadSymbolMap(const char *filename)
{
lock_guard guard(lock_);
@ -488,6 +498,23 @@ void SymbolMap::SetSymbolName(int i, const char *newname)
strncpy(entries[i].name, newname, sizeof(entries[i].name));
}
void SymbolMap::SetSymbolSize(int i, int newSize){
lock_guard guard(lock_);
MapEntry &e = entries[i];
std::set<MapEntryUniqueInfo>::iterator it = uniqueEntries.find((const MapEntryUniqueInfo) e);
if (it != uniqueEntries.end()){
MapEntryUniqueInfo temp = *it;
temp.size = newSize;
uniqueEntries.erase(it);
uniqueEntries.insert(temp);
}
entryRanges.erase(e.vaddress + e.size);
entryRanges.insert(std::pair<u32,u32>(e.vaddress+newSize,e.vaddress));
e.size = newSize;
}
u32 SymbolMap::GetSymbolAddr(int i) const
{
return entries[i].vaddress;

View file

@ -45,6 +45,7 @@ public:
void SaveSymbolMap(const char *filename) const;
bool LoadNocashSym(const char *ilename);
void AddSymbol(const char *symbolname, unsigned int vaddress, size_t size, SymbolType symbol);
void RemoveSymbolNum(int symbolnum);
void Clear();
void AnalyzeBackwards();
int GetSymbolNum(unsigned int address, SymbolType symmask=ST_FUNCTION) const;
@ -58,6 +59,7 @@ public:
int GetNumSymbols() const;
const char *GetSymbolName(int i) const;
void SetSymbolName(int i, const char *newname);
void SetSymbolSize(int i, int newSize);
u32 GetSymbolSize(int i) const;
u32 GetSymbolAddr(int i) const;
SymbolType GetSymbolType(int i) const;

View file

@ -1048,6 +1048,63 @@ void CtrlDisAsmView::onMouseUp(WPARAM wParam, LPARAM lParam, int button)
}
}
break;
case ID_DISASM_REMOVEFUNCTION:
{
char statusBarTextBuff[256];
int sym = symbolMap.GetSymbolNum(curAddress);
if (sym != -1)
{
u32 funcBegin = symbolMap.GetAddress(sym);
int prev = symbolMap.GetSymbolNum(funcBegin - 1);
if (prev != -1)
{
int expandedSize = symbolMap.GetSymbolSize(prev) + symbolMap.GetSymbolSize(sym);
symbolMap.SetSymbolSize(prev, expandedSize);
}
symbolMap.RemoveSymbolNum(sym);
SendMessage(GetParent(wnd), WM_DEB_MAPLOADED, 0, 0);
}
else
{
snprintf(statusBarTextBuff,256, "WARNING: unable to find function symbol here");
SendMessage(GetParent(wnd), WM_DEB_SETSTATUSBARTEXT, 0, (LPARAM) statusBarTextBuff);
}
redraw();
}
break;
case ID_DISASM_ADDFUNCTION:
{
char statusBarTextBuff[256];
int sym = symbolMap.GetSymbolNum(curAddress);
if (sym != -1)
{
if (symbolMap.GetAddress(sym) == curAddress)
{
snprintf(statusBarTextBuff,256, "WARNING: There's already a function entry point at this adress");
SendMessage(GetParent(wnd), WM_DEB_SETSTATUSBARTEXT, 0, (LPARAM) statusBarTextBuff);
}
else
{
char symname[128];
int prevSize = symbolMap.GetSymbolSize(sym);
u32 prevAddr = symbolMap.GetSymbolAddr(sym);
int newSize = curAddress - prevAddr;
symbolMap.SetSymbolSize(sym, newSize);
newSize = prevSize - newSize;
snprintf(symname,128,"u_un_%08X",curAddress);
symbolMap.AddSymbol(symname, curAddress, newSize, ST_FUNCTION);
symbolMap.SortSymbols();
SendMessage(GetParent(wnd), WM_DEB_MAPLOADED, 0, 0);
}
}
else
{
snprintf(statusBarTextBuff, 256, "WARNING: unable to add function symbol here");
SendMessage(GetParent(wnd), WM_DEB_SETSTATUSBARTEXT, 0, (LPARAM) statusBarTextBuff);
}
redraw();
}
break;
case ID_DISASM_DISASSEMBLETOFILE:
disassembleToFile();
break;

View file

@ -524,7 +524,9 @@ BEGIN
MENUITEM SEPARATOR
MENUITEM "Kill Function", ID_DISASM_ADDHLE
MENUITEM "Rename Function...", ID_DISASM_RENAMEFUNCTION
END
MENUITEM "Remove Function", ID_DISASM_REMOVEFUNCTION
MENUITEM "Add Function here", ID_DISASM_ADDFUNCTION
END
POPUP "funclist"
BEGIN
MENUITEM "Kill Function", ID_FUNCLIST_KILLFUNCTION

View file

@ -297,6 +297,9 @@
#define ID_OPTIONS_PAUSE_FOCUS 40136
#define ID_TEXTURESCALING_AUTO 40137
#define IDC_GEDBG_STEPPRIM 40138
#define ID_DISASM_ADDFUNCTION 40139
#define ID_DISASM_REMOVEFUNCTION 40140
// Dummy option to let the buffered rendering hotkey cycle through all the options.
#define ID_OPTIONS_BUFFEREDRENDERINGDUMMY 40500