geode/loader/dobby/source/MemoryAllocator/AssemblyCodeBuilder.cc
2022-07-30 19:24:03 +03:00

47 lines
No EOL
1.5 KiB
C++

#include "MemoryAllocator/AssemblyCodeBuilder.h"
#include "dobby_internal.h"
#include "PlatformUnifiedInterface/ExecMemory/CodePatchTool.h"
AssemblyCodeChunk *AssemblyCodeBuilder::FinalizeFromAddress(addr_t address, int size) {
AssemblyCodeChunk *result = NULL;
result = new AssemblyCodeChunk;
result->init_region_range(address, size);
return result;
}
AssemblyCodeChunk *AssemblyCodeBuilder::FinalizeFromTurboAssembler(AssemblerBase *assembler) {
AssemblyCodeChunk *result = NULL;
CodeBufferBase *buffer = NULL;
buffer = (CodeBufferBase *)assembler->GetCodeBuffer();
void *realized_address = assembler->GetRealizedAddress();
if (realized_address == NULL) {
int buffer_size = 0;
{
buffer_size = buffer->getSize();
#if TARGET_ARCH_ARM64 || TARGET_ARCH_ARM
// FIXME: need it ? actually ???
// extra bytes for align needed
buffer_size += 4;
#endif
}
// assembler without specific memory address
result = MemoryArena::AllocateCodeChunk(buffer_size);
if (result == NULL)
return NULL;
realized_address = (void *)result->raw_instruction_start();
assembler->SetRealizedAddress(realized_address);
} else {
result = AssemblyCodeBuilder::FinalizeFromAddress((addr_t)realized_address, buffer->getSize());
}
// Realize(Relocate) the buffer_code to the executable_memory_address, remove the ExternalLabels, etc, the pc-relative
// instructions
CodePatch(realized_address, (uint8_t *)buffer->getRawBuffer(), buffer->getSize());
return result;
}