ByteCodeDumper.h 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  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. #pragma once
  6. #if DBG_DUMP
  7. namespace Js
  8. {
  9. struct ByteCodeDumper /* All static */
  10. {
  11. public:
  12. static void DumpRecursively(FunctionBody* dumpFunction);
  13. static void Dump(FunctionBody * dumpFunction);
  14. static void DumpConstantTable(FunctionBody *dumpFunction);
  15. static void DumpOp(OpCode op, LayoutSize layoutSize, ByteCodeReader& reader, FunctionBody * dumpFunction);
  16. protected:
  17. static void DumpImplicitArgIns(FunctionBody * dumpFunction);
  18. static void DumpI4(int value);
  19. static void DumpI8(int64 value);
  20. static void DumpU4(uint32 value);
  21. static void DumpU2(uint16 value);
  22. static void DumpOffset(int byteOffset, ByteCodeReader const& reader);
  23. static void DumpAddr(void* addr);
  24. static void DumpR4(float value);
  25. static void DumpR8(double value);
  26. static void DumpReg(RegSlot registerID);
  27. static void DumpReg(RegSlot_TwoByte registerID);
  28. static void DumpReg(RegSlot_OneByte registerID);
  29. static void DumpProfileId(uint id);
  30. #define LAYOUT_TYPE(layout) \
  31. static void Dump##layout(OpCode op, const unaligned OpLayout##layout* data, FunctionBody * dumpFunction, ByteCodeReader& reader);
  32. #define LAYOUT_TYPE_WMS(layout) \
  33. template <class T> static void Dump##layout(OpCode op, const unaligned T* data, FunctionBody * dumpFunction, ByteCodeReader& reader);
  34. #define LAYOUT_TYPE_PROFILED(layout) \
  35. LAYOUT_TYPE(layout) \
  36. static void DumpProfiled##layout(OpCode op, const unaligned OpLayoutProfiled##layout * data, FunctionBody * dumpFunction, ByteCodeReader& reader) \
  37. { \
  38. Assert(OpCodeUtil::GetOpCodeLayout(op) == OpLayoutType::Profiled##layout); \
  39. Js::OpCodeUtil::ConvertOpToNonProfiled(op); \
  40. Dump##layout(op, data, dumpFunction, reader); \
  41. DumpProfileId(data->profileId); \
  42. }
  43. #define LAYOUT_TYPE_PROFILED2(layout) \
  44. LAYOUT_TYPE(layout) \
  45. static void DumpProfiled2##layout(OpCode op, const unaligned OpLayoutProfiled2##layout * data, FunctionBody * dumpFunction, ByteCodeReader& reader) \
  46. { \
  47. Assert(OpCodeUtil::GetOpCodeLayout(op) == OpLayoutType::Profiled2##layout); \
  48. Js::OpCodeUtil::ConvertOpToNonProfiled(op); \
  49. Dump##layout(op, data, dumpFunction, reader); \
  50. DumpProfileId(data->profileId); \
  51. DumpProfileId(data->profileId2); \
  52. }
  53. #define LAYOUT_TYPE_PROFILED_WMS(layout) \
  54. LAYOUT_TYPE_WMS(layout) \
  55. template <class T> \
  56. static void DumpProfiled##layout(OpCode op, const unaligned OpLayoutDynamicProfile<T> * data, FunctionBody * dumpFunction, ByteCodeReader& reader) \
  57. { \
  58. Assert(OpCodeUtil::GetOpCodeLayout(op) == OpLayoutType::Profiled##layout); \
  59. Js::OpCodeUtil::ConvertOpToNonProfiled(op); \
  60. Dump##layout<T>(op, data, dumpFunction, reader); \
  61. DumpProfileId(data->profileId); \
  62. }
  63. #define LAYOUT_TYPE_PROFILED2_WMS(layout) \
  64. LAYOUT_TYPE_PROFILED_WMS(layout) \
  65. template <class T> \
  66. static void DumpProfiled2##layout(OpCode op, const unaligned OpLayoutDynamicProfile2<T> * data, FunctionBody * dumpFunction, ByteCodeReader& reader) \
  67. { \
  68. Assert(OpCodeUtil::GetOpCodeLayout(op) == OpLayoutType::Profiled2##layout); \
  69. Js::OpCodeUtil::ConvertOpToNonProfiled(op); \
  70. Dump##layout<T>(op, data, dumpFunction, reader); \
  71. DumpProfileId(data->profileId); \
  72. DumpProfileId(data->profileId2); \
  73. }
  74. #include "LayoutTypes.h"
  75. };
  76. } // namespace Js
  77. #endif