PIC Jump Table Support (#120)

* Support for $gp relative jump table calls
This commit is contained in:
Ethan Lafrenais 2025-01-16 00:40:50 -05:00 committed by GitHub
parent 916d16417e
commit 36b5d9ae33
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 88 additions and 6 deletions

View file

@ -9,6 +9,7 @@
#include <unordered_map>
#include <unordered_set>
#include <filesystem>
#include <optional>
#ifdef _MSC_VER
inline uint32_t byteswap(uint32_t val) {
@ -45,10 +46,11 @@ namespace N64Recomp {
uint32_t addu_vram;
uint32_t jr_vram;
uint16_t section_index;
std::optional<uint32_t> got_offset;
std::vector<uint32_t> entries;
JumpTable(uint32_t vram, uint32_t addend_reg, uint32_t rom, uint32_t lw_vram, uint32_t addu_vram, uint32_t jr_vram, uint16_t section_index, std::vector<uint32_t>&& entries)
: vram(vram), addend_reg(addend_reg), rom(rom), lw_vram(lw_vram), addu_vram(addu_vram), jr_vram(jr_vram), section_index(section_index), entries(std::move(entries)) {}
JumpTable(uint32_t vram, uint32_t addend_reg, uint32_t rom, uint32_t lw_vram, uint32_t addu_vram, uint32_t jr_vram, uint16_t section_index, std::optional<uint32_t> got_offset, std::vector<uint32_t>&& entries)
: vram(vram), addend_reg(addend_reg), rom(rom), lw_vram(lw_vram), addu_vram(addu_vram), jr_vram(jr_vram), section_index(section_index), got_offset(got_offset), entries(std::move(entries)) {}
};
enum class RelocType : uint8_t {
@ -100,6 +102,7 @@ namespace N64Recomp {
bool executable = false;
bool relocatable = false; // TODO is this needed? relocs being non-empty should be an equivalent check.
bool has_mips32_relocs = false;
std::optional<uint32_t> got_ram_addr = std::nullopt;
};
struct ReferenceSection {