Symbols.cs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. using System.Collections.Concurrent;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. namespace ARMeilleure.Diagnostics
  5. {
  6. static class Symbols
  7. {
  8. private struct RangedSymbol
  9. {
  10. public readonly ulong Start;
  11. public readonly ulong End;
  12. public readonly ulong ElementSize;
  13. public readonly string Name;
  14. public RangedSymbol(ulong start, ulong end, ulong elemSize, string name)
  15. {
  16. Start = start;
  17. End = end;
  18. ElementSize = elemSize;
  19. Name = name;
  20. }
  21. }
  22. private static readonly ConcurrentDictionary<ulong, string> _symbols;
  23. private static readonly List<RangedSymbol> _rangedSymbols;
  24. static Symbols()
  25. {
  26. _symbols = new ConcurrentDictionary<ulong, string>();
  27. _rangedSymbols = new List<RangedSymbol>();
  28. }
  29. public static string Get(ulong address)
  30. {
  31. string result;
  32. if (_symbols.TryGetValue(address, out result))
  33. {
  34. return result;
  35. }
  36. lock (_rangedSymbols)
  37. {
  38. foreach (RangedSymbol symbol in _rangedSymbols)
  39. {
  40. if (address >= symbol.Start && address <= symbol.End)
  41. {
  42. ulong diff = address - symbol.Start;
  43. ulong rem = diff % symbol.ElementSize;
  44. result = symbol.Name + "_" + diff / symbol.ElementSize;
  45. if (rem != 0)
  46. {
  47. result += "+" + rem;
  48. }
  49. _symbols.TryAdd(address, result);
  50. return result;
  51. }
  52. }
  53. }
  54. return null;
  55. }
  56. [Conditional("M_DEBUG")]
  57. public static void Add(ulong address, string name)
  58. {
  59. _symbols.TryAdd(address, name);
  60. }
  61. [Conditional("M_DEBUG")]
  62. public static void Add(ulong address, ulong size, ulong elemSize, string name)
  63. {
  64. lock (_rangedSymbols)
  65. {
  66. _rangedSymbols.Add(new RangedSymbol(address, address + size, elemSize, name));
  67. }
  68. }
  69. }
  70. }