PDBImage.h 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #pragma once
  2. #include "RawImageBase.h"
  3. namespace hybridclr
  4. {
  5. namespace metadata
  6. {
  7. struct ILMapper
  8. {
  9. uint32_t irOffset;
  10. uint32_t ilOffset;
  11. };
  12. class PDBImage : public RawImageBase
  13. {
  14. public:
  15. PDBImage() : RawImageBase()
  16. {
  17. }
  18. LoadImageErrorCode LoadCLIHeader(uint32_t& entryPointToken, uint32_t& metadataRva, uint32_t& metadataSize) override;
  19. Il2CppString* GetUserStringBlogByIndex(uint32_t index) const override
  20. {
  21. RaiseExecutionEngineException("PDBImage::GetUserStringBlogByIndex Not implemented");
  22. return nullptr;
  23. }
  24. void SetupStackFrameInfo(const MethodInfo* method, const void* ip, Il2CppStackFrameInfo& stackFrame);
  25. void SetMethodDebugInfo(const MethodInfo* method, const il2cpp::utils::dynamic_array<ILMapper>& ilMapper);
  26. private:
  27. struct SymbolDocumentData
  28. {
  29. const char* sourceFiles;
  30. };
  31. struct SymbolSequencePoint
  32. {
  33. uint32_t document;
  34. uint32_t ilOffset;
  35. uint32_t line;
  36. uint32_t column;
  37. uint32_t endLine;
  38. uint32_t endColumn;
  39. };
  40. struct SymbolMethodDefData
  41. {
  42. uint32_t document;
  43. il2cpp::utils::dynamic_array<SymbolSequencePoint> sequencePoints;
  44. };
  45. struct SymbolMethodInfoData
  46. {
  47. SymbolMethodDefData* methodData;
  48. il2cpp::utils::dynamic_array<ILMapper> ilMapper;
  49. };
  50. SymbolMethodDefData* GetMethodDataFromCache(uint32_t methodToken);
  51. static uint32_t FindILOffsetByIROffset(const il2cpp::utils::dynamic_array<ILMapper>& ilMapper, uint32_t irOffset);
  52. static const SymbolSequencePoint* FindSequencePoint(const il2cpp::utils::dynamic_array<SymbolSequencePoint>& sequencePoints, uint32_t ilOffset);
  53. const SymbolDocumentData* GetDocument(uint32_t documentToken);
  54. const char* GetDocumentName(uint32_t documentToken)
  55. {
  56. const SymbolDocumentData* document = GetDocument(documentToken);
  57. return document ? document->sourceFiles : nullptr;
  58. }
  59. typedef Il2CppHashMap<uint32_t, SymbolMethodDefData*, il2cpp::utils::PassThroughHash<uint32_t>> SymbolMethodDataMap;
  60. SymbolMethodDataMap _methods;
  61. typedef Il2CppHashMap<uint32_t, SymbolDocumentData*, il2cpp::utils::PassThroughHash<uint32_t>> SymbolDocumentDataMap;
  62. SymbolDocumentDataMap _documents;
  63. typedef Il2CppHashMap<const MethodInfo*, SymbolMethodInfoData*, il2cpp::utils::PassThroughHash<const MethodInfo*>> SymbolMethodInfoDataMap;
  64. SymbolMethodInfoDataMap _methodInfos;
  65. };
  66. }
  67. }