R_PPC64_ADDR16_HI represents bits 16-31 of a 32-bit value
R_PPC64_ADDR16_HIGH represents bits 16-31 of a 64-bit value.
In the Linux kernel, `LOAD_REG_IMMEDIATE_SYM` defined in `arch/powerpc/include/asm/ppc_asm.h`
uses @l, @high, @higher, @highest to load the 64-bit value of a symbol.
Fixes https://github.com/ClangBuiltLinux/linux/issues/1260
case R_PPC64_ADDR16_DS:
case R_PPC64_ADDR16_HA:
case R_PPC64_ADDR16_HI:
+ case R_PPC64_ADDR16_HIGH:
case R_PPC64_ADDR16_HIGHER:
case R_PPC64_ADDR16_HIGHERA:
case R_PPC64_ADDR16_HIGHEST:
checkInt(loc, val, 32, rel);
write16(loc, hi(val));
break;
+ case R_PPC64_ADDR16_HIGH:
+ write16(loc, hi(val));
+ break;
case R_PPC64_ADDR16_HIGHER:
case R_PPC64_TPREL16_HIGHER:
write16(loc, higher(val));
.section .R_PPC64_ADDR16_HA,"ax",@progbits
lis 4, b@ha
+# CHECK-LABEL: <.R_PPC64_ADDR16_HIGH>:
+# CHECK-NEXT: lis 4, -30293
+.section .R_PPC64_ADDR16_HIGH,"ax",@progbits
+ lis 4, a@high
+
# CHECK-LABEL: <.R_PPC64_ADDR16_HIGHER>:
# CHECK-NEXT: li 3, 17767
.section .R_PPC64_ADDR16_HIGHER,"ax",@progbits
.ifdef HA
lis 4, a@ha # R_PPC64_ADDR16_HA
.endif
+
+lis 4, a@high # R_PPC64_ADDR16_HIGH