mirror of
https://github.com/geode-sdk/geode.git
synced 2024-12-18 20:02:37 -05:00
47 lines
1.5 KiB
C++
47 lines
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;
|
||
|
}
|