@@ -404,7 +404,7 @@ void InputSection<E>::apply_reloc_alloc(Context<E> &ctx, u8 *base) {
404
404
// pcalau12i $t0, 0
405
405
// addi.d $t0, $t0, 0
406
406
if (is_relaxable_got_load (ctx, *this , i)) {
407
- i64 dist = compute_distance (ctx, sym, * this , rel );
407
+ i64 dist = compute_distance (ctx, sym, rel, P );
408
408
if (is_int (dist, 32 )) {
409
409
u32 rd = get_rd (*(ul32 *)loc);
410
410
*(ul32 *)(loc + 4 ) = 0x02c0'0000 | (rd << 5 ) | rd; // addi.d
@@ -595,8 +595,6 @@ void InputSection<E>::apply_reloc_alloc(Context<E> &ctx, u8 *base) {
595
595
if (sym.has_tlsdesc (ctx) && removed_bytes == 0 ) {
596
596
i64 dist = sym.get_tlsdesc_addr (ctx) + A - P;
597
597
if (is_int (dist, 22 )) {
598
- // If we can directly materialize the PC-relative address
599
- // with pcaddi, do that.
600
598
*(ul32 *)loc = 0x1800'0000 | get_rd (*(ul32 *)loc); // pcaddi
601
599
write_j20 (loc, dist >> 2 );
602
600
} else {
@@ -610,8 +608,6 @@ void InputSection<E>::apply_reloc_alloc(Context<E> &ctx, u8 *base) {
610
608
} else if (sym.has_gottp (ctx)) {
611
609
*(ul32 *)loc = 0x1a00'0004 ; // pcalau12i $a0, 0
612
610
write_j20 (loc, hi20 (sym.get_gottp_addr (ctx) + A, P));
613
- } else if (i64 val = S + A - ctx.tp_addr ; 0 <= val && val < 0x1000 ) {
614
- *(ul32 *)loc = 0x0340'0000 ; // nop
615
611
} else {
616
612
*(ul32 *)loc = 0x1400'0004 ; // lu12i.w $a0, 0
617
613
write_j20 (loc, (S + A + 0x800 - ctx.tp_addr ) >> 12 );
@@ -865,6 +861,7 @@ void shrink_section(Context<E> &ctx, InputSection<E> &isec) {
865
861
for (i64 i = 0 ; i < rels.size (); i++) {
866
862
const ElfRel<E> &r = rels[i];
867
863
Symbol<E> &sym = *isec.file .symbols [r.r_sym ];
864
+ u64 P = isec.get_addr () + r.r_offset - r_delta;
868
865
869
866
auto remove = [&](i64 d) {
870
867
r_delta += d;
@@ -894,7 +891,6 @@ void shrink_section(Context<E> &ctx, InputSection<E> &isec) {
894
891
alignment = r.r_addend + 4 ;
895
892
}
896
893
897
- u64 P = isec.get_addr () + r.r_offset - r_delta;
898
894
u64 desired = align_to (P, alignment);
899
895
u64 actual = P + alignment - 4 ;
900
896
if (desired != actual)
@@ -945,7 +941,7 @@ void shrink_section(Context<E> &ctx, InputSection<E> &isec) {
945
941
rels[i + 2 ].r_type == R_LARCH_PCALA_LO12 &&
946
942
rels[i + 2 ].r_offset == rels[i].r_offset + 4 &&
947
943
rels[i + 3 ].r_type == R_LARCH_RELAX) {
948
- i64 dist = compute_distance (ctx, sym, isec, r );
944
+ i64 dist = compute_distance (ctx, sym, r, P );
949
945
u32 insn1 = *(ul32 *)(buf + rels[i].r_offset );
950
946
u32 insn2 = *(ul32 *)(buf + rels[i].r_offset + 4 );
951
947
bool is_addi_d = (insn2 & 0xffc0'0000 ) == 0x02c0'0000 ;
@@ -965,7 +961,7 @@ void shrink_section(Context<E> &ctx, InputSection<E> &isec) {
965
961
//
966
962
// If the displacement is PC ± 128 MiB, we can use B or BL instead.
967
963
// Note that $zero is $r0 and $ra is $r1.
968
- if (i64 dist = compute_distance (ctx, sym, isec, r );
964
+ if (i64 dist = compute_distance (ctx, sym, r, P );
969
965
is_int (dist, 28 ))
970
966
if (u32 jirl = *(ul32 *)(buf + rels[i].r_offset + 4 );
971
967
get_rd (jirl) == 0 || get_rd (jirl) == 1 )
@@ -983,13 +979,12 @@ void shrink_section(Context<E> &ctx, InputSection<E> &isec) {
983
979
//
984
980
// pcaddi $t0, <offset>
985
981
if (is_relaxable_got_load (ctx, isec, i))
986
- if (i64 dist = compute_distance (ctx, sym, isec, r );
982
+ if (i64 dist = compute_distance (ctx, sym, r, P );
987
983
is_int (dist, 22 ))
988
984
remove (4 );
989
985
break ;
990
986
case R_LARCH_TLS_DESC_PC_HI20:
991
987
if (sym.has_tlsdesc (ctx)) {
992
- u64 P = isec.get_addr () + r.r_offset ;
993
988
i64 dist = sym.get_tlsdesc_addr (ctx) + r.r_addend - P;
994
989
if (is_int (dist, 22 ))
995
990
remove (4 );
0 commit comments