Encoder.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft. All rights reserved.
  3. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. //-------------------------------------------------------------------------------------------------------
  5. #include "EncoderMD.h"
  6. #include "Backend.h"
  7. ///---------------------------------------------------------------------------
  8. ///
  9. /// class Encoder
  10. ///
  11. ///---------------------------------------------------------------------------
  12. typedef JsUtil::List<NativeOffsetInlineeFramePair, ArenaAllocator> InlineeFrameMap;
  13. typedef JsUtil::List<IR::PragmaInstr*, ArenaAllocator> PragmaInstrList;
  14. typedef JsUtil::List<uint32, ArenaAllocator> OffsetList;
  15. typedef JsUtil::List<BranchJumpTableWrapper*, ArenaAllocator> JmpTableList;
  16. class Encoder
  17. {
  18. friend class EncoderMD;
  19. public:
  20. Encoder(Func * func) : m_func(func), m_encoderMD(func), m_inlineeFrameMap(nullptr) {}
  21. void Encode();
  22. void RecordInlineeFrame(Func* inlinee, uint32 currentOffset);
  23. void RecordBailout(IR::Instr* instr, uint32 currentOffset);
  24. private:
  25. bool DoTrackAllStatementBoundary() const;
  26. Func * m_func;
  27. EncoderMD m_encoderMD;
  28. BYTE * m_encodeBuffer;
  29. BYTE * m_pc;
  30. uint32 m_encodeBufferSize;
  31. ArenaAllocator *m_tempAlloc;
  32. InlineeFrameMap* m_inlineeFrameMap;
  33. typedef JsUtil::List<LazyBailOutRecord, ArenaAllocator> BailoutRecordMap;
  34. BailoutRecordMap* m_bailoutRecordMap;
  35. #if DBG_DUMP
  36. void DumpInlineeFrameMap(size_t baseAddress);
  37. uint32 * m_offsetBuffer;
  38. uint32 m_instrNumber;
  39. #endif
  40. PragmaInstrList *m_pragmaInstrToRecordOffset;
  41. PragmaInstrList *m_pragmaInstrToRecordMap;
  42. #if defined(_M_IX86) || defined(_M_X64)
  43. InlineeFrameRecords *m_inlineeFrameRecords;
  44. BOOL ShortenBranchesAndLabelAlign(BYTE **codeStart, ptrdiff_t *codeSize);
  45. void revertRelocList();
  46. template <bool restore> void CopyMaps(OffsetList **m_origInlineeFrameRecords, OffsetList **m_origInlineeFrameMap, OffsetList **m_origPragmaInstrToRecordOffset, OffsetList **m_origOffsetBuffer);
  47. #endif
  48. void InsertNopsForLabelAlignment(int nopCount, BYTE ** pDstBuffer);
  49. void CopyPartialBuffer(BYTE ** ptrDstBuffer, size_t &dstSize, BYTE * srcStart, BYTE * srcEnd);
  50. BYTE FindNopCountFor16byteAlignment(size_t address);
  51. uint32 GetCurrentOffset() const;
  52. void TryCopyAndAddRelocRecordsForSwitchJumpTableEntries(BYTE *codeStart, size_t codeSize, JmpTableList * jumpTableListForSwitchStatement, size_t totalJmpTableSizeInBytes);
  53. };