diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2020-07-26 19:36:28 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2020-07-26 19:36:28 +0000 |
commit | cfca06d7963fa0909f90483b42a6d7d194d01e08 (patch) | |
tree | 209fb2a2d68f8f277793fc8df46c753d31bc853b /llvm/lib/Object/RelocationResolver.cpp | |
parent | 706b4fc47bbc608932d3b491ae19a3b9cde9497b (diff) |
Notes
Diffstat (limited to 'llvm/lib/Object/RelocationResolver.cpp')
-rw-r--r-- | llvm/lib/Object/RelocationResolver.cpp | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/llvm/lib/Object/RelocationResolver.cpp b/llvm/lib/Object/RelocationResolver.cpp index 31478be7899ed..3f3f79b0f4ff7 100644 --- a/llvm/lib/Object/RelocationResolver.cpp +++ b/llvm/lib/Object/RelocationResolver.cpp @@ -127,6 +127,27 @@ static uint64_t resolveMips64(RelocationRef R, uint64_t S, uint64_t A) { } } +static bool supportsMSP430(uint64_t Type) { + switch (Type) { + case ELF::R_MSP430_32: + case ELF::R_MSP430_16_BYTE: + return true; + default: + return false; + } +} + +static uint64_t resolveMSP430(RelocationRef R, uint64_t S, uint64_t A) { + switch (R.getType()) { + case ELF::R_MSP430_32: + return (S + getELFAddend(R)) & 0xFFFFFFFF; + case ELF::R_MSP430_16_BYTE: + return (S + getELFAddend(R)) & 0xFFFF; + default: + llvm_unreachable("Invalid relocation type"); + } +} + static bool supportsPPC64(uint64_t Type) { switch (Type) { case ELF::R_PPC64_ADDR32: @@ -498,12 +519,24 @@ static bool supportsWasm32(uint64_t Type) { case wasm::R_WASM_FUNCTION_OFFSET_I32: case wasm::R_WASM_SECTION_OFFSET_I32: case wasm::R_WASM_EVENT_INDEX_LEB: + case wasm::R_WASM_GLOBAL_INDEX_I32: return true; default: return false; } } +static bool supportsWasm64(uint64_t Type) { + switch (Type) { + case wasm::R_WASM_MEMORY_ADDR_LEB64: + case wasm::R_WASM_MEMORY_ADDR_SLEB64: + case wasm::R_WASM_MEMORY_ADDR_I64: + return true; + default: + return supportsWasm32(Type); + } +} + static uint64_t resolveWasm32(RelocationRef R, uint64_t S, uint64_t A) { switch (R.getType()) { case wasm::R_WASM_FUNCTION_INDEX_LEB: @@ -517,6 +550,7 @@ static uint64_t resolveWasm32(RelocationRef R, uint64_t S, uint64_t A) { case wasm::R_WASM_FUNCTION_OFFSET_I32: case wasm::R_WASM_SECTION_OFFSET_I32: case wasm::R_WASM_EVENT_INDEX_LEB: + case wasm::R_WASM_GLOBAL_INDEX_I32: // For wasm section, its offset at 0 -- ignoring Value return A; default: @@ -524,6 +558,18 @@ static uint64_t resolveWasm32(RelocationRef R, uint64_t S, uint64_t A) { } } +static uint64_t resolveWasm64(RelocationRef R, uint64_t S, uint64_t A) { + switch (R.getType()) { + case wasm::R_WASM_MEMORY_ADDR_LEB64: + case wasm::R_WASM_MEMORY_ADDR_SLEB64: + case wasm::R_WASM_MEMORY_ADDR_I64: + // For wasm section, its offset at 0 -- ignoring Value + return A; + default: + return resolveWasm32(R, S, A); + } +} + std::pair<bool (*)(uint64_t), RelocationResolver> getRelocationResolver(const ObjectFile &Obj) { if (Obj.isCOFF()) { @@ -589,6 +635,8 @@ getRelocationResolver(const ObjectFile &Obj) { case Triple::mipsel: case Triple::mips: return {supportsMips32, resolveMips32}; + case Triple::msp430: + return {supportsMSP430, resolveMSP430}; case Triple::sparc: return {supportsSparc32, resolveSparc32}; case Triple::hexagon: @@ -605,6 +653,8 @@ getRelocationResolver(const ObjectFile &Obj) { } else if (Obj.isWasm()) { if (Obj.getArch() == Triple::wasm32) return {supportsWasm32, resolveWasm32}; + if (Obj.getArch() == Triple::wasm64) + return {supportsWasm64, resolveWasm64}; return {nullptr, nullptr}; } |