diff options
author | Sean Callanan <scallanan@apple.com> | 2013-04-05 02:22:57 +0000 |
---|---|---|
committer | Sean Callanan <scallanan@apple.com> | 2013-04-05 02:22:57 +0000 |
commit | 5a1af4e63a068efed4ab3218a63d2147404cc0fc (patch) | |
tree | 2efca166de2c880075a495d354beb12d7bcec8bc /lldb/source/Expression/IRExecutionUnit.cpp | |
parent | 2f91004b64d360e80f244ab0a5e35f975c4e3c76 (diff) | |
download | bcm5719-llvm-5a1af4e63a068efed4ab3218a63d2147404cc0fc.tar.gz bcm5719-llvm-5a1af4e63a068efed4ab3218a63d2147404cc0fc.zip |
Factored out memory access into the target process
from IRExecutionUnit into a superclass called
IRMemoryMap. IRMemoryMap handles all reading and
writing, ensuring that areas are kept track of and
memory is properly cached (and deleted).
Also fixed several cases where we would simply leak
binary data in the target process over time. Now
the expression objects explicitly own their
IRExecutionUnit and delete it when they go away. This
is why I had to modify ClangUserExpression,
ClangUtilityFunction, and ClangFunction.
As a side effect of this, I am removing the JIT
mutex for an IRMemoryMap. If it turns out that we
need this mutex, I'll add it in then, but right now
it's just adding complexity.
This is part of a more general project to make
expressions fully reusable. The next step is to
make materialization and dematerialization use
the IRMemoryMap API rather than writing and
reading directly from the process's memory.
This will allow the IR interpreter to use the
same data, but in the host's memory, without having
to use a different set of pointers.
llvm-svn: 178832
Diffstat (limited to 'lldb/source/Expression/IRExecutionUnit.cpp')
-rw-r--r-- | lldb/source/Expression/IRExecutionUnit.cpp | 536 |
1 files changed, 224 insertions, 312 deletions
diff --git a/lldb/source/Expression/IRExecutionUnit.cpp b/lldb/source/Expression/IRExecutionUnit.cpp index 25fb157040c..dba361bd525 100644 --- a/lldb/source/Expression/IRExecutionUnit.cpp +++ b/lldb/source/Expression/IRExecutionUnit.cpp @@ -1,4 +1,4 @@ -//===-- IRExecutionUnit.cpp ------------------------------*- C++ -*-===// +//===-- IRExecutionUnit.cpp -------------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // @@ -29,7 +29,7 @@ IRExecutionUnit::IRExecutionUnit (std::auto_ptr<llvm::Module> &module_ap, ConstString &name, lldb::ProcessSP process_sp, std::vector<std::string> &cpu_features) : - m_process_wp(process_sp), + IRMemoryMap(process_sp), m_module_ap(module_ap), m_module(m_module_ap.get()), m_cpu_features(cpu_features), @@ -45,89 +45,55 @@ IRExecutionUnit::WriteNow (const uint8_t *bytes, size_t size, Error &error) { - Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); - - auto iter = m_allocations.insert(m_allocations.end(), Allocation()); - - Allocation &allocation(*iter); - - allocation.m_size = size; - allocation.m_alignment = 8; - allocation.m_data.reset(new DataBufferHeap(bytes, size)); - allocation.m_local_start = (uintptr_t)allocation.m_data->GetBytes(); - allocation.m_section_id = Allocation::eSectionIDNone; - - lldb_private::Error err; - - size_t allocation_size = (allocation.m_size ? allocation.m_size : 1) + allocation.m_alignment - 1; - - if (allocation_size == 0) - allocation_size = 1; - - lldb::ProcessSP process_sp = m_process_wp.lock(); - - if (!process_sp) - { - err.SetErrorToGenericError(); - err.SetErrorString("Couldn't find the process"); - return LLDB_INVALID_ADDRESS; - } - - allocation.m_remote_allocation = process_sp->AllocateMemory(allocation_size, - (lldb::ePermissionsReadable | lldb::ePermissionsWritable), - err); + lldb::addr_t allocation_process_addr = Malloc (size, + 8, + lldb::ePermissionsWritable | lldb::ePermissionsReadable, + eAllocationPolicyMirror, + error); - if (!err.Success()) + if (!error.Success()) return LLDB_INVALID_ADDRESS; - process_sp->WriteMemory(allocation.m_remote_allocation, bytes, size, err); + WriteMemory(allocation_process_addr, bytes, size, error); - if (!err.Success()) + if (!error.Success()) { - process_sp->DeallocateMemory(allocation.m_remote_allocation); - allocation.m_remote_allocation = LLDB_INVALID_ADDRESS; + Error err; + Free (allocation_process_addr, err); + return LLDB_INVALID_ADDRESS; } - uint64_t mask = allocation.m_alignment - 1; - - allocation.m_remote_start = (allocation.m_remote_allocation + mask) & (~mask); - - allocation.m_allocated = true; - - if (log) + if (Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)) { - log->Printf("IRExecutionUnit::WriteNow() wrote to 0x%llx", allocation.m_remote_start); - allocation.dump(log); - } + DataBufferHeap my_buffer(size, 0); + Error err; + ReadMemory(my_buffer.GetBytes(), allocation_process_addr, size, err); - return allocation.m_remote_start; + if (err.Success()) + { + DataExtractor my_extractor(my_buffer.GetBytes(), my_buffer.GetByteSize(), lldb::eByteOrderBig, 8); + + StreamString ss; + + my_extractor.Dump(&ss, 0, lldb::eFormatBytesWithASCII, 1, my_buffer.GetByteSize(), 32, allocation_process_addr, 0, 0); + + log->PutCString(ss.GetData()); + } + } + + return allocation_process_addr; } void IRExecutionUnit::FreeNow (lldb::addr_t allocation) { - Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); - if (allocation == LLDB_INVALID_ADDRESS) return; - lldb::ProcessSP process_sp = m_process_wp.lock(); - - if (!process_sp) - return; + Error err; - for (auto ai = m_allocations.begin(), ae = m_allocations.end(); - ai != ae; - ++ai) - { - if (ai->m_remote_allocation == allocation) - { - m_allocations.erase(ai); - log->Printf("IRExecutionUnit::FreeNow() freed 0x%llx", allocation); - return; - } - } + Free(allocation, err); } Error @@ -271,7 +237,7 @@ IRExecutionUnit::GetRunnableInfo(Error &error, lldb::addr_t &func_addr, lldb::addr_t &func_end) { - lldb::ProcessSP process_sp(m_process_wp.lock()); + lldb::ProcessSP process_sp(GetProcessWP().lock()); func_addr = LLDB_INVALID_ADDRESS; func_end = LLDB_INVALID_ADDRESS; @@ -289,159 +255,147 @@ IRExecutionUnit::GetRunnableInfo(Error &error, func_end = m_function_end_load_addr; return; - }; // someone else may have gotten the mutex first + }; + + m_did_jit = true; + + Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); + + std::string error_string; + if (log) { - Mutex::Locker jit_mutex_locker(m_jit_mutex); - - if (m_did_jit) - { - func_addr = m_function_load_addr; - func_end = m_function_end_load_addr; - - return; - }; // someone else may have gotten the mutex first + std::string s; + llvm::raw_string_ostream oss(s); - m_did_jit = true; + m_module->print(oss, NULL); - Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); + oss.flush(); - std::string error_string; - - if (log) - { - std::string s; - llvm::raw_string_ostream oss(s); - - m_module->print(oss, NULL); - - oss.flush(); + log->Printf ("Module being sent to JIT: \n%s", s.c_str()); + } + + llvm::Triple triple(m_module->getTargetTriple()); + llvm::Function *function = m_module->getFunction (m_name.AsCString()); + llvm::Reloc::Model relocModel; + llvm::CodeModel::Model codeModel; + + if (triple.isOSBinFormatELF()) + { + relocModel = llvm::Reloc::Static; + // This will be small for 32-bit and large for 64-bit. + codeModel = llvm::CodeModel::JITDefault; + } + else + { + relocModel = llvm::Reloc::PIC_; + codeModel = llvm::CodeModel::Small; + } + + m_module_ap->getContext().setInlineAsmDiagnosticHandler(ReportInlineAsmError, &error); + + llvm::EngineBuilder builder(m_module_ap.get()); + + builder.setEngineKind(llvm::EngineKind::JIT) + .setErrorStr(&error_string) + .setRelocationModel(relocModel) + .setJITMemoryManager(new MemoryManager(*this)) + .setOptLevel(llvm::CodeGenOpt::Less) + .setAllocateGVsWithCode(true) + .setCodeModel(codeModel) + .setUseMCJIT(true); + + llvm::StringRef mArch; + llvm::StringRef mCPU; + llvm::SmallVector<std::string, 0> mAttrs; + + for (std::string &feature : m_cpu_features) + mAttrs.push_back(feature); + + llvm::TargetMachine *target_machine = builder.selectTarget(triple, + mArch, + mCPU, + mAttrs); + + m_execution_engine_ap.reset(builder.create(target_machine)); + + if (!m_execution_engine_ap.get()) + { + error.SetErrorToGenericError(); + error.SetErrorStringWithFormat("Couldn't JIT the function: %s", error_string.c_str()); + return; + } + else + { + m_module_ap.release(); // ownership was transferred + } + + m_execution_engine_ap->DisableLazyCompilation(); + + // We don't actually need the function pointer here, this just forces it to get resolved. + + void *fun_ptr = m_execution_engine_ap->getPointerToFunction(function); + + if (!error.Success()) + { + // We got an error through our callback! + return; + } + + if (!function) + { + error.SetErrorToGenericError(); + error.SetErrorStringWithFormat("Couldn't find '%s' in the JITted module", m_name.AsCString()); + return; + } + + if (!fun_ptr) + { + error.SetErrorToGenericError(); + error.SetErrorStringWithFormat("'%s' was in the JITted module but wasn't lowered", m_name.AsCString()); + return; + } + + m_jitted_functions.push_back (JittedFunction(m_name.AsCString(), (lldb::addr_t)fun_ptr)); + + CommitAllocations(process_sp); + ReportAllocations(*m_execution_engine_ap); + WriteData(process_sp); - log->Printf ("Module being sent to JIT: \n%s", s.c_str()); - } - - llvm::Triple triple(m_module->getTargetTriple()); - llvm::Function *function = m_module->getFunction (m_name.AsCString()); - llvm::Reloc::Model relocModel; - llvm::CodeModel::Model codeModel; + for (JittedFunction &jitted_function : m_jitted_functions) + { + jitted_function.m_remote_addr = GetRemoteAddressForLocal (jitted_function.m_local_addr); - if (triple.isOSBinFormatELF()) + if (!jitted_function.m_name.compare(m_name.AsCString())) { - relocModel = llvm::Reloc::Static; - // This will be small for 32-bit and large for 64-bit. - codeModel = llvm::CodeModel::JITDefault; + AddrRange func_range = GetRemoteRangeForLocal(jitted_function.m_local_addr); + m_function_end_load_addr = func_range.first + func_range.second; + m_function_load_addr = jitted_function.m_remote_addr; } - else - { - relocModel = llvm::Reloc::PIC_; - codeModel = llvm::CodeModel::Small; - } - - m_module_ap->getContext().setInlineAsmDiagnosticHandler(ReportInlineAsmError, &error); - - llvm::EngineBuilder builder(m_module_ap.get()); - - builder.setEngineKind(llvm::EngineKind::JIT) - .setErrorStr(&error_string) - .setRelocationModel(relocModel) - .setJITMemoryManager(new MemoryManager(*this)) - .setOptLevel(llvm::CodeGenOpt::Less) - .setAllocateGVsWithCode(true) - .setCodeModel(codeModel) - .setUseMCJIT(true); - - llvm::StringRef mArch; - llvm::StringRef mCPU; - llvm::SmallVector<std::string, 0> mAttrs; - - for (std::string &feature : m_cpu_features) - mAttrs.push_back(feature); + } + + if (log) + { + log->Printf("Code can be run in the target."); - llvm::TargetMachine *target_machine = builder.selectTarget(triple, - mArch, - mCPU, - mAttrs); + StreamString disassembly_stream; - m_execution_engine_ap.reset(builder.create(target_machine)); + Error err = DisassembleFunction(disassembly_stream, process_sp); - if (!m_execution_engine_ap.get()) + if (!err.Success()) { - error.SetErrorToGenericError(); - error.SetErrorStringWithFormat("Couldn't JIT the function: %s", error_string.c_str()); - return; + log->Printf("Couldn't disassemble function : %s", err.AsCString("unknown error")); } else { - m_module_ap.release(); // ownership was transferred - } - - m_execution_engine_ap->DisableLazyCompilation(); - - // We don't actually need the function pointer here, this just forces it to get resolved. - - void *fun_ptr = m_execution_engine_ap->getPointerToFunction(function); - - if (!error.Success()) - { - // We got an error through our callback! - return; - } - - if (!function) - { - error.SetErrorToGenericError(); - error.SetErrorStringWithFormat("Couldn't find '%s' in the JITted module", m_name.AsCString()); - return; + log->Printf("Function disassembly:\n%s", disassembly_stream.GetData()); } - - if (!fun_ptr) - { - error.SetErrorToGenericError(); - error.SetErrorStringWithFormat("'%s' was in the JITted module but wasn't lowered", m_name.AsCString()); - return; - } - - m_jitted_functions.push_back (JittedFunction(m_name.AsCString(), (lldb::addr_t)fun_ptr)); - - CommitAllocations(process_sp); - ReportAllocations(*m_execution_engine_ap); - WriteData(process_sp); - - for (JittedFunction &jitted_function : m_jitted_functions) - { - jitted_function.m_remote_addr = GetRemoteAddressForLocal (jitted_function.m_local_addr); - - if (!jitted_function.m_name.compare(m_name.AsCString())) - { - AddrRange func_range = GetRemoteRangeForLocal(jitted_function.m_local_addr); - m_function_end_load_addr = func_range.first + func_range.second; - m_function_load_addr = jitted_function.m_remote_addr; - } - } - - if (log) - { - log->Printf("Code can be run in the target."); - - StreamString disassembly_stream; - - Error err = DisassembleFunction(disassembly_stream, process_sp); - - if (!err.Success()) - { - log->Printf("Couldn't disassemble function : %s", err.AsCString("unknown error")); - } - else - { - log->Printf("Function disassembly:\n%s", disassembly_stream.GetData()); - } - } - - func_addr = m_function_load_addr; - func_end = m_function_end_load_addr; - - return; } + + func_addr = m_function_load_addr; + func_end = m_function_end_load_addr; + + return; } IRExecutionUnit::~IRExecutionUnit () @@ -482,20 +436,16 @@ IRExecutionUnit::MemoryManager::allocateStub(const llvm::GlobalValue* F, Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); uint8_t *return_value = m_default_mm_ap->allocateStub(F, StubSize, Alignment); - - auto iter = m_parent.m_allocations.insert(m_parent.m_allocations.end(), Allocation()); - - Allocation &allocation(*iter); - - allocation.m_size = StubSize; - allocation.m_alignment = Alignment; - allocation.m_local_start = (uintptr_t)return_value; + + m_parent.m_records.push_back(AllocationRecord((uintptr_t)return_value, + lldb::ePermissionsReadable | lldb::ePermissionsWritable, + StubSize, + Alignment)); if (log) { log->Printf("IRExecutionUnit::allocateStub (F=%p, StubSize=%u, Alignment=%u) = %p", F, StubSize, Alignment, return_value); - allocation.dump(log); } return return_value; @@ -516,19 +466,15 @@ IRExecutionUnit::MemoryManager::allocateSpace(intptr_t Size, unsigned Alignment) uint8_t *return_value = m_default_mm_ap->allocateSpace(Size, Alignment); - auto iter = m_parent.m_allocations.insert(m_parent.m_allocations.end(), Allocation()); - - Allocation &allocation(*iter); - - allocation.m_size = Size; - allocation.m_alignment = Alignment; - allocation.m_local_start = (uintptr_t)return_value; + m_parent.m_records.push_back(AllocationRecord((uintptr_t)return_value, + lldb::ePermissionsReadable | lldb::ePermissionsWritable, + Size, + Alignment)); if (log) { log->Printf("IRExecutionUnit::allocateSpace(Size=%" PRIu64 ", Alignment=%u) = %p", (uint64_t)Size, Alignment, return_value); - allocation.dump(log); } return return_value; @@ -543,21 +489,16 @@ IRExecutionUnit::MemoryManager::allocateCodeSection(uintptr_t Size, uint8_t *return_value = m_default_mm_ap->allocateCodeSection(Size, Alignment, SectionID); - auto iter = m_parent.m_allocations.insert(m_parent.m_allocations.end(), Allocation()); - - Allocation &allocation(*iter); - - allocation.m_size = Size; - allocation.m_alignment = Alignment; - allocation.m_local_start = (uintptr_t)return_value; - allocation.m_section_id = SectionID; - allocation.m_executable = true; + m_parent.m_records.push_back(AllocationRecord((uintptr_t)return_value, + lldb::ePermissionsReadable | lldb::ePermissionsWritable | lldb::ePermissionsExecutable, + Size, + Alignment, + SectionID)); if (log) { log->Printf("IRExecutionUnit::allocateCodeSection(Size=0x%" PRIx64 ", Alignment=%u, SectionID=%u) = %p", (uint64_t)Size, Alignment, SectionID, return_value); - allocation.dump(log); } return return_value; @@ -573,20 +514,15 @@ IRExecutionUnit::MemoryManager::allocateDataSection(uintptr_t Size, uint8_t *return_value = m_default_mm_ap->allocateDataSection(Size, Alignment, SectionID, IsReadOnly); - auto iter = m_parent.m_allocations.insert(m_parent.m_allocations.end(), Allocation()); - - Allocation &allocation(*iter); - - allocation.m_size = Size; - allocation.m_alignment = Alignment; - allocation.m_local_start = (uintptr_t)return_value; - allocation.m_section_id = SectionID; - + m_parent.m_records.push_back(AllocationRecord((uintptr_t)return_value, + lldb::ePermissionsReadable | lldb::ePermissionsWritable, + Size, + Alignment, + SectionID)); if (log) { log->Printf("IRExecutionUnit::allocateDataSection(Size=0x%" PRIx64 ", Alignment=%u, SectionID=%u) = %p", (uint64_t)Size, Alignment, SectionID, return_value); - allocation.dump(log); } return return_value; @@ -600,19 +536,15 @@ IRExecutionUnit::MemoryManager::allocateGlobal(uintptr_t Size, uint8_t *return_value = m_default_mm_ap->allocateGlobal(Size, Alignment); - auto iter = m_parent.m_allocations.insert(m_parent.m_allocations.end(), Allocation()); - - Allocation &allocation(*iter); - - allocation.m_size = Size; - allocation.m_alignment = Alignment; - allocation.m_local_start = (uintptr_t)return_value; + m_parent.m_records.push_back(AllocationRecord((uintptr_t)return_value, + lldb::ePermissionsReadable | lldb::ePermissionsWritable, + Size, + Alignment)); if (log) { log->Printf("IRExecutionUnit::allocateGlobal(Size=0x%" PRIx64 ", Alignment=%u) = %p", (uint64_t)Size, Alignment, return_value); - allocation.dump(log); } return return_value; @@ -649,11 +581,16 @@ IRExecutionUnit::MemoryManager::deallocateExceptionTable(void *ET) lldb::addr_t IRExecutionUnit::GetRemoteAddressForLocal (lldb::addr_t local_address) { - for (Allocation &allocation : m_allocations) + for (AllocationRecord &record : m_records) { - if (local_address >= allocation.m_local_start && - local_address < allocation.m_local_start + allocation.m_size) - return allocation.m_remote_start + (local_address - allocation.m_local_start); + if (local_address >= record.m_host_address && + local_address < record.m_host_address + record.m_size) + { + if (record.m_process_address == LLDB_INVALID_ADDRESS) + return LLDB_INVALID_ADDRESS; + } + + return record.m_process_address + (local_address - record.m_host_address); } return LLDB_INVALID_ADDRESS; @@ -662,11 +599,16 @@ IRExecutionUnit::GetRemoteAddressForLocal (lldb::addr_t local_address) IRExecutionUnit::AddrRange IRExecutionUnit::GetRemoteRangeForLocal (lldb::addr_t local_address) { - for (Allocation &allocation : m_allocations) + for (AllocationRecord &record : m_records) { - if (local_address >= allocation.m_local_start && - local_address < allocation.m_local_start + allocation.m_size) - return AddrRange(allocation.m_remote_start, allocation.m_size); + if (local_address >= record.m_host_address && + local_address < record.m_host_address + record.m_size) + { + if (record.m_process_address == LLDB_INVALID_ADDRESS) + return AddrRange(0, 0); + + return AddrRange(record.m_process_address, record.m_size); + } } return AddrRange (0, 0); @@ -675,53 +617,38 @@ IRExecutionUnit::GetRemoteRangeForLocal (lldb::addr_t local_address) bool IRExecutionUnit::CommitAllocations (lldb::ProcessSP &process_sp) { - Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); - bool ret = true; - for (Allocation &allocation : m_allocations) + lldb_private::Error err; + + for (AllocationRecord &record : m_records) { - if (allocation.m_allocated) + if (record.m_process_address != LLDB_INVALID_ADDRESS) continue; - lldb_private::Error err; - - size_t allocation_size = (allocation.m_size ? allocation.m_size : 1) + allocation.m_alignment - 1; - - if (allocation_size == 0) - allocation_size = 1; - - allocation.m_remote_allocation = process_sp->AllocateMemory( - allocation_size, - allocation.m_executable ? (lldb::ePermissionsReadable | lldb::ePermissionsExecutable) - : (lldb::ePermissionsReadable | lldb::ePermissionsWritable), - err); - - uint64_t mask = allocation.m_alignment - 1; - allocation.m_remote_start = (allocation.m_remote_allocation + mask) & (~mask); + record.m_process_address = Malloc(record.m_size, + record.m_alignment, + record.m_permissions, + eAllocationPolicyProcessOnly, + err); if (!err.Success()) { ret = false; break; } - - allocation.m_allocated = true; - - if (log) - { - log->Printf("IRExecutionUnit::CommitAllocations() committed an allocation"); - allocation.dump(log); - } } if (!ret) { - for (Allocation &allocation : m_allocations) + for (AllocationRecord &record : m_records) { - if (allocation.m_allocated) - process_sp->DeallocateMemory(allocation.m_remote_start); + if (record.m_process_address != LLDB_INVALID_ADDRESS) + { + Free(record.m_process_address, err); + record.m_process_address = LLDB_INVALID_ADDRESS; + } } } @@ -731,16 +658,17 @@ IRExecutionUnit::CommitAllocations (lldb::ProcessSP &process_sp) void IRExecutionUnit::ReportAllocations (llvm::ExecutionEngine &engine) { - for (Allocation &allocation : m_allocations) + for (AllocationRecord &record : m_records) { - if (!allocation.m_allocated) + if (record.m_process_address == LLDB_INVALID_ADDRESS) continue; - if (allocation.m_section_id == Allocation::eSectionIDNone) + if (record.m_section_id == eSectionIDInvalid) continue; - engine.mapSectionAddress((void*)allocation.m_local_start, allocation.m_remote_start); + engine.mapSectionAddress((void*)record.m_host_address, record.m_process_address); } + // Trigger re-application of relocations. engine.finalizeObject(); } @@ -748,45 +676,29 @@ IRExecutionUnit::ReportAllocations (llvm::ExecutionEngine &engine) bool IRExecutionUnit::WriteData (lldb::ProcessSP &process_sp) { - Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); - - for (Allocation &allocation : m_allocations) + for (AllocationRecord &record : m_records) { - if (!allocation.m_allocated) + if (record.m_process_address == LLDB_INVALID_ADDRESS) return false; - if (allocation.m_local_start == LLDB_INVALID_ADDRESS) - continue; - lldb_private::Error err; - - if (process_sp->WriteMemory(allocation.m_remote_start, - (void*)allocation.m_local_start, - allocation.m_size, - err) != allocation.m_size || - !err.Success()) - return false; - - if (log) - { - log->Printf("IRExecutionUnit::CommitAllocations() wrote an allocation"); - allocation.dump(log); - } + + WriteMemory (record.m_process_address, (uint8_t*)record.m_host_address, record.m_size, err); } return true; } void -IRExecutionUnit::Allocation::dump (Log *log) +IRExecutionUnit::AllocationRecord::dump (Log *log) { if (!log) return; log->Printf("[0x%llx+0x%llx]->0x%llx (alignment %d, section ID %d)", - (unsigned long long)m_local_start, + (unsigned long long)m_host_address, (unsigned long long)m_size, - (unsigned long long)m_remote_start, + (unsigned long long)m_process_address, (unsigned)m_alignment, (unsigned)m_section_id); } |