---
arm64-link.c | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/arm64-link.c b/arm64-link.c
index cfdd95ea..ba970384 100644
--- a/arm64-link.c
+++ b/arm64-link.c
@@ -47,6 +47,8 @@ ST_FUNC int code_reloc (int reloc_type)
case R_AARCH64_COPY:
return 0;
+ case R_AARCH64_TSTBR14:
+ case R_AARCH64_CONDBR19:
case R_AARCH64_JUMP26:
case R_AARCH64_CALL26:
case R_AARCH64_JUMP_SLOT:
@@ -76,6 +78,8 @@ ST_FUNC int gotplt_entry_type (int reloc_type)
case R_AARCH64_GLOB_DAT:
case R_AARCH64_JUMP_SLOT:
case R_AARCH64_COPY:
+ case R_AARCH64_TSTBR14:
+ case R_AARCH64_CONDBR19:
return NO_GOTPLT_ENTRY;
case R_AARCH64_ABS32:
@@ -278,6 +282,20 @@ ST_FUNC void relocate(TCCState *s1, ElfW_Rel *rel, int
type, unsigned char *ptr,
(uint32_t)(type == R_AARCH64_CALL26) << 31 |
((val - addr) >> 2 & 0x3ffffff)));
return;
+ case R_AARCH64_TSTBR14:
+ if (((val - addr) + ((uint64_t)1 << 15)) & ~(uint64_t)0xffffffc)
+ tcc_error_noabort("R_AARCH64_TSTBR14 relocation failed"
+ " (val=%lx, addr=%lx)", (long)val, (long)addr);
+ write32le(ptr, ((read32le(ptr) & 0xfff8001f) |
+ (((val - addr) >> 2 & 0x3fff) << 5)));
+ return;
+ case R_AARCH64_CONDBR19:
+ if (((val - addr) + ((uint64_t)1 << 20)) & ~(uint64_t)0xffffffc)
+ tcc_error_noabort("R_AARCH64_CONDBR19 relocation failed"
+ " (val=%lx, addr=%lx)", (long)val, (long)addr);
+ write32le(ptr, ((read32le(ptr) & 0xff00001f) |
+ (((val - addr) >> 2 & 0x7ffff) << 5)));
+ return;
case R_AARCH64_ADR_GOT_PAGE: {
uint64_t off =
(((s1->got->sh_addr +
--
2.51.2
_______________________________________________
Tinycc-devel mailing list
[email protected]
https://lists.nongnu.org/mailman/listinfo/tinycc-devel