@@ -85,7 +85,8 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
8585 }
8686 return true
8787
88- case objabi .ElfRelocOffset + objabi .RelocType (elf .R_LARCH_B26 ):
88+ case objabi .ElfRelocOffset + objabi .RelocType (elf .R_LARCH_B26 ),
89+ objabi .ElfRelocOffset + objabi .RelocType (elf .R_LARCH_CALL36 ):
8990 if targType == sym .SDYNIMPORT {
9091 addpltsym (target , ldr , syms , targ )
9192 su := ldr .MakeSymbolUpdater (s )
@@ -95,8 +96,12 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
9596 if targType == 0 || targType == sym .SXREF {
9697 ldr .Errorf (s , "unknown symbol %s in callloong64" , ldr .SymName (targ ))
9798 }
99+ relocType := objabi .R_CALLLOONG64
100+ if r .Type () == objabi .ElfRelocOffset + objabi .RelocType (elf .R_LARCH_CALL36 ) {
101+ relocType = objabi .R_LOONG64_CALL36
102+ }
98103 su := ldr .MakeSymbolUpdater (s )
99- su .SetRelocType (rIdx , objabi . R_CALLLOONG64 )
104+ su .SetRelocType (rIdx , relocType )
100105 return true
101106
102107 case objabi .ElfRelocOffset + objabi .RelocType (elf .R_LARCH_GOT_PC_HI20 ),
@@ -117,20 +122,26 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
117122 return true
118123
119124 case objabi .ElfRelocOffset + objabi .RelocType (elf .R_LARCH_PCALA_HI20 ),
120- objabi .ElfRelocOffset + objabi .RelocType (elf .R_LARCH_PCALA_LO12 ):
125+ objabi .ElfRelocOffset + objabi .RelocType (elf .R_LARCH_PCALA_LO12 ),
126+ objabi .ElfRelocOffset + objabi .RelocType (elf .R_LARCH_PCREL20_S2 ):
121127 if targType == sym .SDYNIMPORT {
122128 ldr .Errorf (s , "unexpected relocation for dynamic symbol %s" , ldr .SymName (targ ))
123129 }
124130 if targType == 0 || targType == sym .SXREF {
125131 ldr .Errorf (s , "unknown symbol %s" , ldr .SymName (targ ))
126132 }
127133
128- su := ldr .MakeSymbolUpdater (s )
129- if r .Type () == objabi .ElfRelocOffset + objabi .RelocType (elf .R_LARCH_PCALA_HI20 ) {
130- su .SetRelocType (rIdx , objabi .R_LOONG64_ADDR_HI )
131- } else {
132- su .SetRelocType (rIdx , objabi .R_LOONG64_ADDR_LO )
134+ var relocType objabi.RelocType
135+ switch r .Type () - objabi .ElfRelocOffset {
136+ case objabi .RelocType (elf .R_LARCH_PCALA_HI20 ):
137+ relocType = objabi .R_LOONG64_ADDR_HI
138+ case objabi .RelocType (elf .R_LARCH_PCALA_LO12 ):
139+ relocType = objabi .R_LOONG64_ADDR_LO
140+ case objabi .RelocType (elf .R_LARCH_PCREL20_S2 ):
141+ relocType = objabi .R_LOONG64_ADDR_PCREL20_S2
133142 }
143+ su := ldr .MakeSymbolUpdater (s )
144+ su .SetRelocType (rIdx , relocType )
134145 return true
135146
136147 case objabi .ElfRelocOffset + objabi .RelocType (elf .R_LARCH_ADD64 ),
@@ -418,6 +429,11 @@ func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym,
418429 out .Write64 (uint64 (elf .R_LARCH_B26 ) | uint64 (elfsym )<< 32 )
419430 out .Write64 (uint64 (r .Xadd ))
420431
432+ case objabi .R_LOONG64_CALL36 :
433+ out .Write64 (uint64 (sectoff ))
434+ out .Write64 (uint64 (elf .R_LARCH_CALL36 ) | uint64 (elfsym )<< 32 )
435+ out .Write64 (uint64 (r .Xadd ))
436+
421437 case objabi .R_LOONG64_TLS_IE_HI :
422438 out .Write64 (uint64 (sectoff ))
423439 out .Write64 (uint64 (elf .R_LARCH_TLS_IE_PC_HI20 ) | uint64 (elfsym )<< 32 )
@@ -438,6 +454,11 @@ func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym,
438454 out .Write64 (uint64 (elf .R_LARCH_PCALA_HI20 ) | uint64 (elfsym )<< 32 )
439455 out .Write64 (uint64 (r .Xadd ))
440456
457+ case objabi .R_LOONG64_ADDR_PCREL20_S2 :
458+ out .Write64 (uint64 (sectoff ))
459+ out .Write64 (uint64 (elf .R_LARCH_PCREL20_S2 ) | uint64 (elfsym )<< 32 )
460+ out .Write64 (uint64 (r .Xadd ))
461+
441462 case objabi .R_LOONG64_GOT_HI :
442463 out .Write64 (uint64 (sectoff ))
443464 out .Write64 (uint64 (elf .R_LARCH_GOT_PC_HI20 ) | uint64 (elfsym )<< 32 )
@@ -463,7 +484,8 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade
463484 default :
464485 return val , 0 , false
465486 case objabi .R_LOONG64_ADDR_HI ,
466- objabi .R_LOONG64_ADDR_LO :
487+ objabi .R_LOONG64_ADDR_LO ,
488+ objabi .R_LOONG64_ADDR_PCREL20_S2 :
467489 // set up addend for eventual relocation via outer symbol.
468490 rs , _ := ld .FoldSubSymbolOffset (ldr , rs )
469491 rst := ldr .SymType (rs )
@@ -474,6 +496,7 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade
474496 case objabi .R_LOONG64_TLS_LE_HI ,
475497 objabi .R_LOONG64_TLS_LE_LO ,
476498 objabi .R_CALLLOONG64 ,
499+ objabi .R_LOONG64_CALL36 ,
477500 objabi .R_JMPLOONG64 ,
478501 objabi .R_LOONG64_TLS_IE_HI ,
479502 objabi .R_LOONG64_TLS_IE_LO ,
@@ -499,6 +522,10 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade
499522 return val & 0xffc003ff | (t << 10 ), noExtReloc , isOk
500523 }
501524 return val & 0xfe00001f | (t << 5 ), noExtReloc , isOk
525+ case objabi .R_LOONG64_ADDR_PCREL20_S2 :
526+ pc := ldr .SymValue (s ) + int64 (r .Off ())
527+ t := (ldr .SymAddr (rs ) + r .Add () - pc ) >> 2
528+ return val & 0xfe00001f | ((t & 0xfffff ) << 5 ), noExtReloc , isOk
502529 case objabi .R_LOONG64_TLS_LE_HI ,
503530 objabi .R_LOONG64_TLS_LE_LO :
504531 t := ldr .SymAddr (rs ) + r .Add ()
@@ -512,6 +539,14 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade
512539 t := ldr .SymAddr (rs ) + r .Add () - pc
513540 return val & 0xfc000000 | (((t >> 2 ) & 0xffff ) << 10 ) | (((t >> 2 ) & 0x3ff0000 ) >> 16 ), noExtReloc , isOk
514541
542+ case objabi .R_LOONG64_CALL36 :
543+ pc := ldr .SymValue (s ) + int64 (r .Off ())
544+ t := (ldr .SymAddr (rs ) + r .Add () - pc ) >> 2
545+ // val is pcaddu18i (lower half) + jirl (upper half)
546+ pcaddu18i := (val & 0xfe00001f ) | (((t + 0x8000 ) >> 16 ) << 5 )
547+ jirl := ((val >> 32 ) & 0xfc0003ff ) | ((t & 0xffff ) << 10 )
548+ return pcaddu18i | (jirl << 32 ), noExtReloc , isOk
549+
515550 case objabi .R_JMP16LOONG64 ,
516551 objabi .R_JMP21LOONG64 :
517552 pc := ldr .SymValue (s ) + int64 (r .Off ())
0 commit comments