Improve IRDumper (#1135)
* Improve IRDumper * Make Symbols.Add(ulong, ulong, ulong, string) thread safe * Use a StringBuilder for MemoryOperand * Add #if M_DEBUG guards * Fix JMP_TABLE typo * Fix using in Symbols * Use Conditional("M_DEBUG") instead Address gdkchan's feedback * Use a struct instead of 4-tuple Address gdkchan's feedback * Place symbols in comments instead Address gdkchan's feedback * Use StringBuilder throughout * Handle offsetted symbols * Fix naming convention of Builder * Avoid ArgumentException * Remove unnecessary using * Use switch expression instead * Turn into a class * Clean up * Remove unnecessary using
This commit is contained in:
parent
53369e79bd
commit
180ad8605d
4 changed files with 333 additions and 128 deletions
84
ARMeilleure/Diagnostics/Symbols.cs
Normal file
84
ARMeilleure/Diagnostics/Symbols.cs
Normal file
|
@ -0,0 +1,84 @@
|
|||
using System.Collections.Concurrent;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
|
||||
namespace ARMeilleure.Diagnostics
|
||||
{
|
||||
static class Symbols
|
||||
{
|
||||
private struct RangedSymbol
|
||||
{
|
||||
public readonly ulong Start;
|
||||
public readonly ulong End;
|
||||
public readonly ulong ElementSize;
|
||||
public readonly string Name;
|
||||
|
||||
public RangedSymbol(ulong start, ulong end, ulong elemSize, string name)
|
||||
{
|
||||
Start = start;
|
||||
End = end;
|
||||
ElementSize = elemSize;
|
||||
Name = name;
|
||||
}
|
||||
}
|
||||
|
||||
private static readonly ConcurrentDictionary<ulong, string> _symbols;
|
||||
private static readonly List<RangedSymbol> _rangedSymbols;
|
||||
|
||||
static Symbols()
|
||||
{
|
||||
_symbols = new ConcurrentDictionary<ulong, string>();
|
||||
_rangedSymbols = new List<RangedSymbol>();
|
||||
}
|
||||
|
||||
public static string Get(ulong address)
|
||||
{
|
||||
string result;
|
||||
|
||||
if (_symbols.TryGetValue(address, out result))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
lock (_rangedSymbols)
|
||||
{
|
||||
foreach (RangedSymbol symbol in _rangedSymbols)
|
||||
{
|
||||
if (address >= symbol.Start && address <= symbol.End)
|
||||
{
|
||||
ulong diff = address - symbol.Start;
|
||||
ulong rem = diff % symbol.ElementSize;
|
||||
|
||||
result = symbol.Name + "_" + diff / symbol.ElementSize;
|
||||
|
||||
if (rem != 0)
|
||||
{
|
||||
result += "+" + rem;
|
||||
}
|
||||
|
||||
_symbols.TryAdd(address, result);
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
[Conditional("M_DEBUG")]
|
||||
public static void Add(ulong address, string name)
|
||||
{
|
||||
_symbols.TryAdd(address, name);
|
||||
}
|
||||
|
||||
[Conditional("M_DEBUG")]
|
||||
public static void Add(ulong address, ulong size, ulong elemSize, string name)
|
||||
{
|
||||
lock (_rangedSymbols)
|
||||
{
|
||||
_rangedSymbols.Add(new RangedSymbol(address, address + size, elemSize, name));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue