From 2a0b0080d601d237f7977bd7de4a5e640077798f Mon Sep 17 00:00:00 2001 From: Marc Auberer Date: Tue, 3 Feb 2026 14:44:44 +0000 Subject: [PATCH] [TPDE][LLVM] Add get_mapped_range method to JITMapper This allows to obtain the address range of the allocated memor slab by the underlying ElfMapper. The allocation size is the ptrdiff between first and second of the returned pair. --- tpde-llvm/include/tpde-llvm/LLVMCompiler.hpp | 5 ++++- tpde-llvm/src/JITMapper.cpp | 6 +++++- tpde-llvm/src/JITMapper.hpp | 6 +++++- tpde/include/tpde/ElfMapper.hpp | 6 ++++-- tpde/src/ElfMapper.cpp | 10 ++++++++-- 5 files changed, 26 insertions(+), 7 deletions(-) diff --git a/tpde-llvm/include/tpde-llvm/LLVMCompiler.hpp b/tpde-llvm/include/tpde-llvm/LLVMCompiler.hpp index e403aa1e..7ffd9764 100644 --- a/tpde-llvm/include/tpde-llvm/LLVMCompiler.hpp +++ b/tpde-llvm/include/tpde-llvm/LLVMCompiler.hpp @@ -38,7 +38,10 @@ class JITMapper { /// Get the address for a global, which must be contained in the compiled /// module. - void *lookup_global(llvm::GlobalValue *); + void *lookup_global(llvm::GlobalValue *) const; + + /// Get the range, mapped to memory + std::pair get_mapped_range() const; /// Indicate whether compilation and in-memory mapping was successful. operator bool() const { return impl != nullptr; } diff --git a/tpde-llvm/src/JITMapper.cpp b/tpde-llvm/src/JITMapper.cpp index ffd20e35..26651bad 100644 --- a/tpde-llvm/src/JITMapper.cpp +++ b/tpde-llvm/src/JITMapper.cpp @@ -25,8 +25,12 @@ JITMapper::~JITMapper() = default; JITMapper::JITMapper(JITMapper &&other) = default; JITMapper &JITMapper::operator=(JITMapper &&other) = default; -void *JITMapper::lookup_global(llvm::GlobalValue *gv) { +void *JITMapper::lookup_global(llvm::GlobalValue *gv) const { return impl ? impl->lookup_global(gv) : nullptr; } +std::pair JITMapper::get_mapped_range() const { + return impl ? impl->get_mapped_range() : std::make_pair(nullptr, nullptr); +} + } // namespace tpde_llvm diff --git a/tpde-llvm/src/JITMapper.hpp b/tpde-llvm/src/JITMapper.hpp index f4c463d4..4ad99fe6 100644 --- a/tpde-llvm/src/JITMapper.hpp +++ b/tpde-llvm/src/JITMapper.hpp @@ -23,9 +23,13 @@ class JITMapperImpl { /// Map the ELF from the assembler into memory, returns true on success. bool map(tpde::elf::AssemblerElf &, tpde::elf::ElfMapper::SymbolResolver); - void *lookup_global(llvm::GlobalValue *gv) { + void *lookup_global(llvm::GlobalValue *gv) const { return mapper.get_sym_addr(globals.lookup(gv)); } + + std::pair get_mapped_range() const { + return mapper.get_mapped_range(); + } }; } // namespace tpde_llvm diff --git a/tpde/include/tpde/ElfMapper.hpp b/tpde/include/tpde/ElfMapper.hpp index 6995ec20..153c43f8 100644 --- a/tpde/include/tpde/ElfMapper.hpp +++ b/tpde/include/tpde/ElfMapper.hpp @@ -18,7 +18,7 @@ class ElfMapper { private: u8 *mapped_addr = nullptr; - size_t mapped_size; + size_t mapped_size = 0; u32 registered_frame_off = 0; u32 local_sym_count = 0; @@ -38,7 +38,9 @@ class ElfMapper { bool map(AssemblerElf &assembler, SymbolResolver resolver); - void *get_sym_addr(SymRef sym); + void *get_sym_addr(SymRef sym) const; + + std::pair get_mapped_range() const; }; } // namespace tpde::elf diff --git a/tpde/src/ElfMapper.cpp b/tpde/src/ElfMapper.cpp index 731fa1a5..bed873a1 100644 --- a/tpde/src/ElfMapper.cpp +++ b/tpde/src/ElfMapper.cpp @@ -71,6 +71,7 @@ void ElfMapper::reset() { munmap(mapped_addr, mapped_size); mapped_addr = nullptr; + mapped_size = 0; sym_addrs.clear(); } @@ -423,7 +424,7 @@ bool ElfMapper::map(AssemblerElf &assembler, SymbolResolver resolver) { return true; } -void *ElfMapper::get_sym_addr(SymRef sym) { +void *ElfMapper::get_sym_addr(SymRef sym) const { auto idx = AssemblerElf::sym_idx(sym); if (!AssemblerElf::sym_is_local(sym)) { idx += local_sym_count; @@ -432,6 +433,10 @@ void *ElfMapper::get_sym_addr(SymRef sym) { return sym_addrs[idx]; } +std::pair ElfMapper::get_mapped_range() const { + return {mapped_addr, mapped_addr + mapped_size}; +} + } // namespace tpde::elf #else @@ -445,7 +450,8 @@ void ElfMapper::reset() { (void)local_sym_count; } bool ElfMapper::map(AssemblerElf &, SymbolResolver) { return false; } -void *ElfMapper::get_sym_addr(SymRef) { return nullptr; } +void *ElfMapper::get_sym_addr(SymRef) const { return nullptr; } +std::pair ElfMapper::get_mapped_range() const { return {nullptr, nullptr}; } } // namespace tpde::elf #endif