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