Skip to content

Commit 23a823a

Browse files
committed
Remote Mirrors: Make MemoryReader a real class
Make the reader a class interface internally, with the bag-of-function pointers via the eventual C API being the special case.
1 parent 946469d commit 23a823a

File tree

2 files changed

+230
-180
lines changed

2 files changed

+230
-180
lines changed

include/swift/Reflection/Reader.h

Lines changed: 52 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
#include "swift/SwiftReflection/MemoryReaderInterface.h"
2222

23+
#include <dlfcn.h>
2324
#include <cstdint>
2425
#include <memory>
2526
#include <vector>
@@ -60,12 +61,52 @@ class ReflectionSection {
6061
};
6162

6263
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 {
63104
std::unique_ptr<MemoryReaderImpl> Impl;
64105

65106
public:
66-
MemoryReader() : Impl(nullptr) {}
107+
CMemoryReader() : Impl(nullptr) {}
67108

68-
MemoryReader(std::unique_ptr<MemoryReaderImpl> &&Impl)
109+
CMemoryReader(std::unique_ptr<MemoryReaderImpl> &&Impl)
69110
: Impl(std::move(Impl)) {
70111
assert(this->Impl && "No Memory reader implementation given!");
71112
assert(this->Impl->getPointerSize && "No getPointerSize implementation");
@@ -75,32 +116,24 @@ class MemoryReader {
75116
assert(this->Impl->getPointerSize() != 0 && "Invalid target pointer size");
76117
}
77118

78-
uint8_t getPointerSize() {
119+
uint8_t getPointerSize() override {
79120
return Impl->getPointerSize();
80121
}
81122

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 {
95128
auto Address = Impl->getSymbolAddress(Name.c_str(), Name.size());
96129
return static_cast<addr_t>(Address);
97130
}
98131

99-
size_t getStringLength(addr_t Address) {
132+
uint64_t getStringLength(addr_t Address) {
100133
return Impl->getStringLength(Address);
101134
}
102135

103-
std::string readString(addr_t Address) {
136+
std::string readString(addr_t Address) override {
104137
auto NameSize = getStringLength(Address);
105138
if (!NameSize)
106139
return "";
@@ -111,10 +144,9 @@ class MemoryReader {
111144
return std::string(reinterpret_cast<const char *>(NameBuffer.get()));
112145
}
113146

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 {
115148
return Impl->readBytes(Address, Dest, Size);
116149
}
117-
118150
};
119151

120152
} // end namespace reflection

0 commit comments

Comments
 (0)