PtcInfo.cs 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. using ARMeilleure.CodeGen.Unwinding;
  2. using System;
  3. using System.IO;
  4. namespace ARMeilleure.Translation.PTC
  5. {
  6. class PtcInfo : IDisposable
  7. {
  8. private readonly BinaryWriter _relocWriter;
  9. private readonly BinaryWriter _unwindInfoWriter;
  10. public byte[] Code { get; set; }
  11. public MemoryStream RelocStream { get; }
  12. public MemoryStream UnwindInfoStream { get; }
  13. public int RelocEntriesCount { get; private set; }
  14. public PtcInfo()
  15. {
  16. RelocStream = new MemoryStream();
  17. UnwindInfoStream = new MemoryStream();
  18. _relocWriter = new BinaryWriter(RelocStream, EncodingCache.UTF8NoBOM, true);
  19. _unwindInfoWriter = new BinaryWriter(UnwindInfoStream, EncodingCache.UTF8NoBOM, true);
  20. RelocEntriesCount = 0;
  21. }
  22. public void WriteRelocEntry(RelocEntry relocEntry)
  23. {
  24. _relocWriter.Write((int)relocEntry.Position);
  25. _relocWriter.Write((byte)relocEntry.Symbol.Type);
  26. _relocWriter.Write((ulong)relocEntry.Symbol.Value);
  27. RelocEntriesCount++;
  28. }
  29. public void WriteUnwindInfo(UnwindInfo unwindInfo)
  30. {
  31. _unwindInfoWriter.Write((int)unwindInfo.PushEntries.Length);
  32. foreach (UnwindPushEntry unwindPushEntry in unwindInfo.PushEntries)
  33. {
  34. _unwindInfoWriter.Write((int)unwindPushEntry.PseudoOp);
  35. _unwindInfoWriter.Write((int)unwindPushEntry.PrologOffset);
  36. _unwindInfoWriter.Write((int)unwindPushEntry.RegIndex);
  37. _unwindInfoWriter.Write((int)unwindPushEntry.StackOffsetOrAllocSize);
  38. }
  39. _unwindInfoWriter.Write((int)unwindInfo.PrologSize);
  40. }
  41. public void Dispose()
  42. {
  43. _relocWriter.Dispose();
  44. _unwindInfoWriter.Dispose();
  45. RelocStream.Dispose();
  46. UnwindInfoStream.Dispose();
  47. }
  48. }
  49. }