PtcInfo.cs 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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((int)relocEntry.Index);
  26. RelocEntriesCount++;
  27. }
  28. public void WriteUnwindInfo(UnwindInfo unwindInfo)
  29. {
  30. _unwindInfoWriter.Write((int)unwindInfo.PushEntries.Length);
  31. foreach (UnwindPushEntry unwindPushEntry in unwindInfo.PushEntries)
  32. {
  33. _unwindInfoWriter.Write((int)unwindPushEntry.PseudoOp);
  34. _unwindInfoWriter.Write((int)unwindPushEntry.PrologOffset);
  35. _unwindInfoWriter.Write((int)unwindPushEntry.RegIndex);
  36. _unwindInfoWriter.Write((int)unwindPushEntry.StackOffsetOrAllocSize);
  37. }
  38. _unwindInfoWriter.Write((int)unwindInfo.PrologSize);
  39. }
  40. public void Dispose()
  41. {
  42. _relocWriter.Dispose();
  43. _unwindInfoWriter.Dispose();
  44. RelocStream.Dispose();
  45. UnwindInfoStream.Dispose();
  46. }
  47. }
  48. }