Materializer.h 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. //===-- Materializer.h ------------------------------------------*- C++ -*-===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. #ifndef LLDB_EXPRESSION_MATERIALIZER_H
  9. #define LLDB_EXPRESSION_MATERIALIZER_H
  10. #include <memory>
  11. #include <vector>
  12. #include "lldb/Expression/IRMemoryMap.h"
  13. #include "lldb/Symbol/TaggedASTType.h"
  14. #include "lldb/Target/StackFrame.h"
  15. #include "lldb/Utility/Status.h"
  16. #include "lldb/lldb-private-types.h"
  17. namespace lldb_private {
  18. class Materializer {
  19. public:
  20. Materializer() = default;
  21. ~Materializer();
  22. class Dematerializer {
  23. public:
  24. Dematerializer() = default;
  25. ~Dematerializer() { Wipe(); }
  26. void Dematerialize(Status &err, lldb::addr_t frame_top,
  27. lldb::addr_t frame_bottom);
  28. void Wipe();
  29. bool IsValid() {
  30. return m_materializer && m_map &&
  31. (m_process_address != LLDB_INVALID_ADDRESS);
  32. }
  33. private:
  34. friend class Materializer;
  35. Dematerializer(Materializer &materializer, lldb::StackFrameSP &frame_sp,
  36. IRMemoryMap &map, lldb::addr_t process_address)
  37. : m_materializer(&materializer), m_map(&map),
  38. m_process_address(process_address) {
  39. if (frame_sp) {
  40. m_thread_wp = frame_sp->GetThread();
  41. m_stack_id = frame_sp->GetStackID();
  42. }
  43. }
  44. Materializer *m_materializer = nullptr;
  45. lldb::ThreadWP m_thread_wp;
  46. StackID m_stack_id;
  47. IRMemoryMap *m_map = nullptr;
  48. lldb::addr_t m_process_address = LLDB_INVALID_ADDRESS;
  49. };
  50. typedef std::shared_ptr<Dematerializer> DematerializerSP;
  51. typedef std::weak_ptr<Dematerializer> DematerializerWP;
  52. DematerializerSP Materialize(lldb::StackFrameSP &frame_sp, IRMemoryMap &map,
  53. lldb::addr_t process_address, Status &err);
  54. class PersistentVariableDelegate {
  55. public:
  56. virtual ~PersistentVariableDelegate();
  57. virtual ConstString GetName() = 0;
  58. virtual void DidDematerialize(lldb::ExpressionVariableSP &variable) = 0;
  59. };
  60. uint32_t
  61. AddPersistentVariable(lldb::ExpressionVariableSP &persistent_variable_sp,
  62. PersistentVariableDelegate *delegate, Status &err);
  63. uint32_t AddVariable(lldb::VariableSP &variable_sp, Status &err);
  64. uint32_t AddResultVariable(const CompilerType &type, bool is_lvalue,
  65. bool keep_in_memory,
  66. PersistentVariableDelegate *delegate, Status &err);
  67. uint32_t AddSymbol(const Symbol &symbol_sp, Status &err);
  68. uint32_t AddRegister(const RegisterInfo &register_info, Status &err);
  69. uint32_t GetStructAlignment() { return m_struct_alignment; }
  70. uint32_t GetStructByteSize() { return m_current_offset; }
  71. class Entity {
  72. public:
  73. Entity() : m_alignment(1), m_size(0), m_offset(0) {}
  74. virtual ~Entity() = default;
  75. virtual void Materialize(lldb::StackFrameSP &frame_sp, IRMemoryMap &map,
  76. lldb::addr_t process_address, Status &err) = 0;
  77. virtual void Dematerialize(lldb::StackFrameSP &frame_sp, IRMemoryMap &map,
  78. lldb::addr_t process_address,
  79. lldb::addr_t frame_top,
  80. lldb::addr_t frame_bottom, Status &err) = 0;
  81. virtual void DumpToLog(IRMemoryMap &map, lldb::addr_t process_address,
  82. Log *log) = 0;
  83. virtual void Wipe(IRMemoryMap &map, lldb::addr_t process_address) = 0;
  84. uint32_t GetAlignment() { return m_alignment; }
  85. uint32_t GetSize() { return m_size; }
  86. uint32_t GetOffset() { return m_offset; }
  87. void SetOffset(uint32_t offset) { m_offset = offset; }
  88. protected:
  89. uint32_t m_alignment;
  90. uint32_t m_size;
  91. uint32_t m_offset;
  92. };
  93. private:
  94. uint32_t AddStructMember(Entity &entity);
  95. typedef std::unique_ptr<Entity> EntityUP;
  96. typedef std::vector<EntityUP> EntityVector;
  97. DematerializerWP m_dematerializer_wp;
  98. EntityVector m_entities;
  99. uint32_t m_current_offset = 0;
  100. uint32_t m_struct_alignment = 8;
  101. };
  102. } // namespace lldb_private
  103. #endif // LLDB_EXPRESSION_MATERIALIZER_H