@@ -63,7 +63,7 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
63
63
ldr .Errorf (s , "unknown symbol %s in RISCV call" , ldr .SymName (targ ))
64
64
}
65
65
su := ldr .MakeSymbolUpdater (s )
66
- su .SetRelocType (rIdx , objabi .R_RISCV_PCREL_ITYPE )
66
+ su .SetRelocType (rIdx , objabi .R_RISCV_CALL )
67
67
return true
68
68
69
69
case objabi .ElfRelocOffset + objabi .RelocType (elf .R_RISCV_GOT_HI20 ):
@@ -130,7 +130,7 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
130
130
r = relocs .At (rIdx )
131
131
132
132
switch r .Type () {
133
- case objabi .R_RISCV_PCREL_ITYPE :
133
+ case objabi .R_RISCV_CALL :
134
134
if targType != sym .SDYNIMPORT {
135
135
// nothing to do, the relocation will be laid out in reloc
136
136
return true
@@ -228,12 +228,12 @@ func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym,
228
228
}
229
229
out .Write64 (uint64 (r .Xadd ))
230
230
231
- case objabi .R_RISCV_CALL , objabi .R_RISCV_CALL_TRAMP :
231
+ case objabi .R_RISCV_JAL , objabi .R_RISCV_JAL_TRAMP :
232
232
out .Write64 (uint64 (sectoff ))
233
233
out .Write64 (uint64 (elf .R_RISCV_JAL ) | uint64 (elfsym )<< 32 )
234
234
out .Write64 (uint64 (r .Xadd ))
235
235
236
- case objabi .R_RISCV_PCREL_ITYPE , objabi .R_RISCV_PCREL_STYPE , objabi .R_RISCV_TLS_IE :
236
+ case objabi .R_RISCV_CALL , objabi . R_RISCV_PCREL_ITYPE , objabi .R_RISCV_PCREL_STYPE , objabi .R_RISCV_TLS_IE :
237
237
// Find the text symbol for the AUIPC instruction targeted
238
238
// by this relocation.
239
239
relocs := ldr .Relocs (s )
@@ -256,7 +256,7 @@ func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym,
256
256
//
257
257
var hiRel , loRel elf.R_RISCV
258
258
switch r .Type {
259
- case objabi .R_RISCV_PCREL_ITYPE :
259
+ case objabi .R_RISCV_CALL , objabi . R_RISCV_PCREL_ITYPE :
260
260
hiRel , loRel = elf .R_RISCV_PCREL_HI20 , elf .R_RISCV_PCREL_LO12_I
261
261
case objabi .R_RISCV_PCREL_STYPE :
262
262
hiRel , loRel = elf .R_RISCV_PCREL_HI20 , elf .R_RISCV_PCREL_LO12_S
@@ -399,20 +399,20 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade
399
399
// If the call points to a trampoline, see if we can reach the symbol
400
400
// directly. This situation can occur when the relocation symbol is
401
401
// not assigned an address until after the trampolines are generated.
402
- if r .Type () == objabi .R_RISCV_CALL_TRAMP {
402
+ if r .Type () == objabi .R_RISCV_JAL_TRAMP {
403
403
relocs := ldr .Relocs (rs )
404
404
if relocs .Count () != 1 {
405
405
ldr .Errorf (s , "trampoline %v has %d relocations" , ldr .SymName (rs ), relocs .Count ())
406
406
}
407
407
tr := relocs .At (0 )
408
- if tr .Type () != objabi .R_RISCV_PCREL_ITYPE {
408
+ if tr .Type () != objabi .R_RISCV_CALL {
409
409
ldr .Errorf (s , "trampoline %v has unexpected relocation %v" , ldr .SymName (rs ), tr .Type ())
410
410
}
411
411
trs := tr .Sym ()
412
412
if ldr .SymValue (trs ) != 0 && ldr .SymType (trs ) != sym .SDYNIMPORT && ldr .SymType (trs ) != sym .SUNDEFEXT {
413
413
trsOff := ldr .SymValue (trs ) + tr .Add () - pc
414
414
if trsOff >= - (1 << 20 ) && trsOff < (1 << 20 ) {
415
- r .SetType (objabi .R_RISCV_CALL )
415
+ r .SetType (objabi .R_RISCV_JAL )
416
416
r .SetSym (trs )
417
417
r .SetAdd (tr .Add ())
418
418
rs = trs
@@ -423,10 +423,10 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade
423
423
424
424
if target .IsExternal () {
425
425
switch r .Type () {
426
- case objabi .R_RISCV_CALL , objabi .R_RISCV_CALL_TRAMP :
426
+ case objabi .R_RISCV_JAL , objabi .R_RISCV_JAL_TRAMP :
427
427
return val , 1 , true
428
428
429
- case objabi .R_RISCV_PCREL_ITYPE , objabi .R_RISCV_PCREL_STYPE , objabi .R_RISCV_TLS_IE , objabi .R_RISCV_TLS_LE :
429
+ case objabi .R_RISCV_CALL , objabi . R_RISCV_PCREL_ITYPE , objabi .R_RISCV_PCREL_STYPE , objabi .R_RISCV_TLS_IE , objabi .R_RISCV_TLS_LE :
430
430
return val , 2 , true
431
431
}
432
432
@@ -436,11 +436,11 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade
436
436
off := ldr .SymValue (rs ) + r .Add () - pc
437
437
438
438
switch r .Type () {
439
- case objabi .R_RISCV_CALL , objabi .R_RISCV_CALL_TRAMP :
439
+ case objabi .R_RISCV_JAL , objabi .R_RISCV_JAL_TRAMP :
440
440
// Generate instruction immediates.
441
441
imm , err := riscv .EncodeJImmediate (off )
442
442
if err != nil {
443
- ldr .Errorf (s , "cannot encode R_RISCV_CALL relocation offset for %s: %v" , ldr .SymName (rs ), err )
443
+ ldr .Errorf (s , "cannot encode J-type instruction relocation offset for %s: %v" , ldr .SymName (rs ), err )
444
444
}
445
445
immMask := int64 (riscv .JTypeImmMask )
446
446
@@ -574,31 +574,31 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade
574
574
ins = (ins &^ immMask ) | int64 (uint32 (imm ))
575
575
return ins , 0 , true
576
576
577
- case objabi .R_RISCV_PCREL_ITYPE , objabi .R_RISCV_PCREL_STYPE :
577
+ case objabi .R_RISCV_CALL , objabi . R_RISCV_PCREL_ITYPE , objabi .R_RISCV_PCREL_STYPE :
578
578
// Generate AUIPC and second instruction immediates.
579
579
low , high , err := riscv .Split32BitImmediate (off )
580
580
if err != nil {
581
- ldr .Errorf (s , "R_RISCV_PCREL_ relocation does not fit in 32 bits: %d" , off )
581
+ ldr .Errorf (s , "pc-relative relocation does not fit in 32 bits: %d" , off )
582
582
}
583
583
584
584
auipcImm , err := riscv .EncodeUImmediate (high )
585
585
if err != nil {
586
- ldr .Errorf (s , "cannot encode R_RISCV_PCREL_ AUIPC relocation offset for %s: %v" , ldr .SymName (rs ), err )
586
+ ldr .Errorf (s , "cannot encode AUIPC relocation offset for %s: %v" , ldr .SymName (rs ), err )
587
587
}
588
588
589
589
var secondImm , secondImmMask int64
590
590
switch r .Type () {
591
- case objabi .R_RISCV_PCREL_ITYPE :
591
+ case objabi .R_RISCV_CALL , objabi . R_RISCV_PCREL_ITYPE :
592
592
secondImmMask = riscv .ITypeImmMask
593
593
secondImm , err = riscv .EncodeIImmediate (low )
594
594
if err != nil {
595
- ldr .Errorf (s , "cannot encode R_RISCV_PCREL_ITYPE I-type instruction relocation offset for %s: %v" , ldr .SymName (rs ), err )
595
+ ldr .Errorf (s , "cannot encode I-type instruction relocation offset for %s: %v" , ldr .SymName (rs ), err )
596
596
}
597
597
case objabi .R_RISCV_PCREL_STYPE :
598
598
secondImmMask = riscv .STypeImmMask
599
599
secondImm , err = riscv .EncodeSImmediate (low )
600
600
if err != nil {
601
- ldr .Errorf (s , "cannot encode R_RISCV_PCREL_STYPE S-type instruction relocation offset for %s: %v" , ldr .SymName (rs ), err )
601
+ ldr .Errorf (s , "cannot encode S-type instruction relocation offset for %s: %v" , ldr .SymName (rs ), err )
602
602
}
603
603
default :
604
604
panic (fmt .Sprintf ("unknown relocation type: %v" , r .Type ()))
@@ -623,10 +623,10 @@ func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc, sym.RelocVariant
623
623
624
624
func extreloc (target * ld.Target , ldr * loader.Loader , r loader.Reloc , s loader.Sym ) (loader.ExtReloc , bool ) {
625
625
switch r .Type () {
626
- case objabi .R_RISCV_CALL , objabi .R_RISCV_CALL_TRAMP :
626
+ case objabi .R_RISCV_JAL , objabi .R_RISCV_JAL_TRAMP :
627
627
return ld .ExtrelocSimple (ldr , r ), true
628
628
629
- case objabi .R_RISCV_PCREL_ITYPE , objabi .R_RISCV_PCREL_STYPE , objabi .R_RISCV_TLS_IE , objabi .R_RISCV_TLS_LE :
629
+ case objabi .R_RISCV_CALL , objabi . R_RISCV_PCREL_ITYPE , objabi .R_RISCV_PCREL_STYPE , objabi .R_RISCV_TLS_IE , objabi .R_RISCV_TLS_LE :
630
630
return ld .ExtrelocViaOuterSym (ldr , r , s ), true
631
631
}
632
632
return loader.ExtReloc {}, false
@@ -637,7 +637,7 @@ func trampoline(ctxt *ld.Link, ldr *loader.Loader, ri int, rs, s loader.Sym) {
637
637
r := relocs .At (ri )
638
638
639
639
switch r .Type () {
640
- case objabi .R_RISCV_CALL :
640
+ case objabi .R_RISCV_JAL :
641
641
pc := ldr .SymValue (s ) + int64 (r .Off ())
642
642
off := ldr .SymValue (rs ) + r .Add () - pc
643
643
@@ -691,13 +691,16 @@ func trampoline(ctxt *ld.Link, ldr *loader.Loader, ri int, rs, s loader.Sym) {
691
691
// address, so we have to assume a trampoline is required. Mark
692
692
// this as a call via a trampoline so that we can potentially
693
693
// switch to a direct call during relocation.
694
- sb .SetRelocType (ri , objabi .R_RISCV_CALL_TRAMP )
694
+ sb .SetRelocType (ri , objabi .R_RISCV_JAL_TRAMP )
695
695
}
696
696
relocs := sb .Relocs ()
697
697
r := relocs .At (ri )
698
698
r .SetSym (tramp )
699
699
r .SetAdd (0 )
700
700
701
+ case objabi .R_RISCV_CALL :
702
+ // Nothing to do, already using AUIPC+JALR.
703
+
701
704
default :
702
705
ctxt .Errorf (s , "trampoline called with non-jump reloc: %d (%s)" , r .Type (), sym .RelocName (ctxt .Arch , r .Type ()))
703
706
}
@@ -707,7 +710,7 @@ func genCallTramp(arch *sys.Arch, linkmode ld.LinkMode, ldr *loader.Loader, tram
707
710
tramp .AddUint32 (arch , 0x00000f97 ) // AUIPC $0, X31
708
711
tramp .AddUint32 (arch , 0x000f8067 ) // JALR X0, (X31)
709
712
710
- r , _ := tramp .AddRel (objabi .R_RISCV_PCREL_ITYPE )
713
+ r , _ := tramp .AddRel (objabi .R_RISCV_CALL )
711
714
r .SetSiz (8 )
712
715
r .SetSym (target )
713
716
r .SetAdd (offset )
0 commit comments