PtcInfo.cs 2.1 KB

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