mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
added disasm debugger features to remove and add functions
This commit is contained in:
parent
f3d9ef6564
commit
d8b4ec6680
5 changed files with 92 additions and 1 deletions
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue