20
20
21
21
#include " swift/SwiftReflection/MemoryReaderInterface.h"
22
22
23
+ #include < dlfcn.h>
23
24
#include < cstdint>
24
25
#include < memory>
25
26
#include < vector>
@@ -60,12 +61,52 @@ class ReflectionSection {
60
61
};
61
62
62
63
class MemoryReader {
64
+ public:
65
+ virtual uint8_t getPointerSize () = 0;
66
+ virtual uint8_t getSizeSize () = 0;
67
+ virtual addr_t getSymbolAddress (const std::string &Name) = 0;
68
+ virtual std::string readString (addr_t Address) = 0;
69
+ virtual bool readBytes (addr_t Address, uint8_t *Dest, uint64_t Size) = 0;
70
+
71
+ template <typename IntegerType>
72
+ bool readInteger (addr_t Address, IntegerType *Dest) {
73
+ return readBytes (Address, (uint8_t *)Dest, sizeof (IntegerType));
74
+ }
75
+
76
+ virtual ~MemoryReader () = default ;
77
+ };
78
+
79
+ class InProcessMemoryReader final : public MemoryReader {
80
+ uint8_t getPointerSize () override {
81
+ return sizeof (uintptr_t );
82
+ }
83
+
84
+ uint8_t getSizeSize () override {
85
+ return sizeof (size_t );
86
+ }
87
+
88
+ addr_t getSymbolAddress (const std::string &Name) override {
89
+ auto Symbol = dlsym (RTLD_DEFAULT, Name.c_str ());
90
+ auto Pointer = reinterpret_cast <uintptr_t >(Symbol);
91
+ return static_cast <addr_t >(Pointer);
92
+ }
93
+
94
+ std::string readString (addr_t Address) override {
95
+ return std::string ((char *)Address);
96
+ }
97
+
98
+ bool readBytes (addr_t Address, uint8_t *Dest, uint64_t Size) override {
99
+ return memmove (Dest, reinterpret_cast <const void *>(Address), Size);
100
+ }
101
+ };
102
+
103
+ class CMemoryReader final : public MemoryReader {
63
104
std::unique_ptr<MemoryReaderImpl> Impl;
64
105
65
106
public:
66
- MemoryReader () : Impl(nullptr ) {}
107
+ CMemoryReader () : Impl(nullptr ) {}
67
108
68
- MemoryReader (std::unique_ptr<MemoryReaderImpl> &&Impl)
109
+ CMemoryReader (std::unique_ptr<MemoryReaderImpl> &&Impl)
69
110
: Impl(std::move(Impl)) {
70
111
assert (this ->Impl && " No Memory reader implementation given!" );
71
112
assert (this ->Impl ->getPointerSize && " No getPointerSize implementation" );
@@ -75,32 +116,24 @@ class MemoryReader {
75
116
assert (this ->Impl ->getPointerSize () != 0 && " Invalid target pointer size" );
76
117
}
77
118
78
- uint8_t getPointerSize () {
119
+ uint8_t getPointerSize () override {
79
120
return Impl->getPointerSize ();
80
121
}
81
122
82
- template <typename IntegerType>
83
- bool readInteger (addr_t Address, IntegerType *Dest,
84
- size_t Size = sizeof (IntegerType)) {
85
- assert (sizeof (IntegerType) == Size);
86
- uint64_t Temp;
87
- if (Impl->readInteger (Address, &Temp, Size)) {
88
- *Dest = (IntegerType)Temp;
89
- return true ;
90
- }
91
- return false ;
92
- }
93
-
94
- addr_t getSymbolAddress (std::string Name) {
123
+ uint8_t getSizeSize () override {
124
+ return Impl->getSizeSize ();
125
+ }
126
+
127
+ addr_t getSymbolAddress (const std::string &Name) override {
95
128
auto Address = Impl->getSymbolAddress (Name.c_str (), Name.size ());
96
129
return static_cast <addr_t >(Address);
97
130
}
98
131
99
- size_t getStringLength (addr_t Address) {
132
+ uint64_t getStringLength (addr_t Address) {
100
133
return Impl->getStringLength (Address);
101
134
}
102
135
103
- std::string readString (addr_t Address) {
136
+ std::string readString (addr_t Address) override {
104
137
auto NameSize = getStringLength (Address);
105
138
if (!NameSize)
106
139
return " " ;
@@ -111,10 +144,9 @@ class MemoryReader {
111
144
return std::string (reinterpret_cast <const char *>(NameBuffer.get ()));
112
145
}
113
146
114
- bool readBytes (addr_t Address, uint8_t *Dest, uint64_t Size) {
147
+ bool readBytes (addr_t Address, uint8_t *Dest, uint64_t Size) override {
115
148
return Impl->readBytes (Address, Dest, Size);
116
149
}
117
-
118
150
};
119
151
120
152
} // end namespace reflection
0 commit comments