9 #include "../runner/common/Platform.h"
10 #include "../runner/common/FileFormat.h"
11 #include "../runner/common/Memory.h"
12 #include "../runner/common/Noncopyable.h"
34 void Add(
const T value);
51 std::unique_ptr<void, decltype(&std::free)>
Copy()
const;
58 static T
Raw(
const void* program,
const address_t address);
65 void Replace(
const address_t address,
const T value);
76 : mCode(
static_cast<uint8_t
>(code))
77 , mNextCommand(nextCommand)
81 Command(
const uint8_t data,
const address_t nextCommand) noexcept
83 , mNextCommand(nextCommand)
89 mCode =
static_cast<uint8_t
>(code);
92 void Replace(
const uint8_t data) noexcept
98 std::vector<Command> mCommand;
101 template <
typename T>
107 for (uint_fast8_t i = 0; i < static_cast<uint_fast8_t>(
sizeof(T)); ++i)
108 AddCommand(
reinterpret_cast<const uint8_t*
>(&value)[i], InvalidAddress);
112 for (int_fast8_t i =
static_cast<uint_fast8_t
>(
sizeof(T) - 1); i >= 0; --i)
113 AddCommand(
reinterpret_cast<const uint8_t*
>(&value)[i], InvalidAddress);
117 template <
typename T>
118 void CodeBuffer::Replace(
const address_t address,
const T value){
119 const uint8_t* pointer =
reinterpret_cast<const uint8_t*
>(&value);
123 for (uint_fast8_t i = 0; i < static_cast<uint_fast8_t>(
sizeof(T)); ++i)
124 mCommand[address + i].mCode = pointer[i];
128 for (uint_fast8_t i = 0; i < static_cast<uint_fast8_t>(
sizeof(T)); ++i)
129 mCommand[address + i].mCode = pointer[
static_cast<uint_fast8_t
>(
sizeof(T) - 1) - i];
136 template <
typename T>
140 uint8_t* pointer =
reinterpret_cast<uint8_t*
>(&value);
144 for (uint_fast8_t i = 0; i < static_cast<uint_fast8_t>(
sizeof(T)); ++i)
145 pointer[i] = mCommand[address + i].mCode;
149 for (uint_fast8_t i = 0; i < static_cast<uint_fast8_t>(
sizeof(T)); ++i)
150 pointer[i] = mCommand[address +
static_cast<uint_fast8_t
>(
sizeof(T) - 1) - i].mCode;
155 template <
typename T>
159 uint8_t* pointer =
reinterpret_cast<uint8_t*
>(&value);
160 const uint8_t* source =
static_cast<const uint8_t*
>(program) + address;
164 for (uint_fast8_t i = 0; i < static_cast<uint_fast8_t>(
sizeof(T)); ++i)
165 pointer[i] = source[i];
169 for (uint_fast8_t i = 0; i < static_cast<uint_fast8_t>(
sizeof(T)); ++i)
170 pointer[i] = source[
static_cast<int_fast16_t
>(
sizeof(T) - 1) - i];
Definition: CodeBuffer.h:26
void AddOpecode(const IntermediateLanguage code)
Definition: CodeBuffer.cpp:18
std::unique_ptr< void, decltype(&std::free)> Copy() const
Definition: CodeBuffer.cpp:62
void Reduce(const address_t reduceSize)
Definition: CodeBuffer.cpp:13
static T Raw(const void *program, const address_t address)
Definition: CodeBuffer.h:156
void ReplaceOpecode(const address_t address, const IntermediateLanguage code)
Definition: CodeBuffer.cpp:40
address_t GetSize() const
Definition: CodeBuffer.cpp:76
address_t AddOpecodeAndTwoOperands(const IntermediateLanguage code, const address_t address, const address_t size)
Definition: CodeBuffer.cpp:31
void ReplaceAddressAll(const address_t baseAddress, const address_t newAddress)
Definition: CodeBuffer.cpp:50
void ReplaceAddress(const address_t address, const address_t newAddress)
Definition: CodeBuffer.cpp:45
void Add(const T value)
Definition: CodeBuffer.h:102
address_t AddOpecodeAndOperand(const IntermediateLanguage code, const address_t address=InvalidAddress)
Definition: CodeBuffer.cpp:23
T Get(const address_t address) const
Definition: CodeBuffer.h:137
void Write(OutputStream &stream) const
Definition: CodeBuffer.cpp:81
Definition: OutputStream.h:15
Definition: CodeBuffer.cpp:12
std::uint32_t address_t
Definition: Type.h:31
IntermediateLanguage
Definition: FileFormat.h:80
bool IsBigEndian()
Definition: Memory.h:17
Definition: Noncopyable.h:18