mirror of
https://github.com/ryujinx-mirror/ryujinx.git
synced 2024-10-02 16:50:20 -07:00

* Strings should not be concatenated using '+' in a loop * fix IDE0090 * undo GenerateLoadOrStore * prefer string interpolation * Update src/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstGen.cs Co-authored-by: Mary <thog@protonmail.com> --------- Co-authored-by: Mary <thog@protonmail.com>
86 lines
2.4 KiB
C#
86 lines
2.4 KiB
C#
using System.Collections.Concurrent;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
using System.Text;
|
|
|
|
namespace ARMeilleure.Diagnostics
|
|
{
|
|
static class Symbols
|
|
{
|
|
private readonly 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)
|
|
{
|
|
|
|
if (_symbols.TryGetValue(address, out string 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;
|
|
|
|
StringBuilder resultBuilder = new();
|
|
resultBuilder.Append($"{symbol.Name}_{diff / symbol.ElementSize}");
|
|
|
|
if (rem != 0)
|
|
{
|
|
resultBuilder.Append($"+{rem}");
|
|
}
|
|
|
|
_symbols.TryAdd(address, resultBuilder.ToString());
|
|
|
|
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));
|
|
}
|
|
}
|
|
}
|
|
}
|