@@ -101,6 +101,7 @@ static bool isSupportedRISCV(uint64_t Type) {
101101 case ELF::R_RISCV_GOT_HI20:
102102 case ELF::R_RISCV_PCREL_HI20:
103103 case ELF::R_RISCV_PCREL_LO12_I:
104+ case ELF::R_RISCV_PCREL_LO12_S:
104105 case ELF::R_RISCV_RVC_JUMP:
105106 case ELF::R_RISCV_RVC_BRANCH:
106107 case ELF::R_RISCV_ADD32:
@@ -195,6 +196,7 @@ static size_t getSizeForTypeRISCV(uint64_t Type) {
195196 case ELF::R_RISCV_BRANCH:
196197 case ELF::R_RISCV_PCREL_HI20:
197198 case ELF::R_RISCV_PCREL_LO12_I:
199+ case ELF::R_RISCV_PCREL_LO12_S:
198200 case ELF::R_RISCV_32_PCREL:
199201 case ELF::R_RISCV_CALL:
200202 case ELF::R_RISCV_CALL_PLT:
@@ -480,6 +482,10 @@ static uint64_t extractIImmRISCV(uint32_t Contents) {
480482 return SignExtend64<12 >(Contents >> 20 );
481483}
482484
485+ static uint64_t extractSImmRISCV (uint32_t Contents) {
486+ return SignExtend64<12 >(((Contents >> 7 ) & 0x1f ) | ((Contents >> 25 ) << 5 ));
487+ }
488+
483489static uint64_t extractJImmRISCV (uint32_t Contents) {
484490 return SignExtend64<21 >(
485491 (((Contents >> 21 ) & 0x3ff ) << 1 ) | (((Contents >> 20 ) & 0x1 ) << 11 ) |
@@ -516,6 +522,8 @@ static uint64_t extractValueRISCV(uint64_t Type, uint64_t Contents,
516522 return extractUImmRISCV (Contents);
517523 case ELF::R_RISCV_PCREL_LO12_I:
518524 return extractIImmRISCV (Contents);
525+ case ELF::R_RISCV_PCREL_LO12_S:
526+ return extractSImmRISCV (Contents);
519527 case ELF::R_RISCV_RVC_JUMP:
520528 return SignExtend64<11 >(Contents >> 2 );
521529 case ELF::R_RISCV_RVC_BRANCH:
@@ -692,6 +700,7 @@ static bool isPCRelativeRISCV(uint64_t Type) {
692700 case ELF::R_RISCV_GOT_HI20:
693701 case ELF::R_RISCV_PCREL_HI20:
694702 case ELF::R_RISCV_PCREL_LO12_I:
703+ case ELF::R_RISCV_PCREL_LO12_S:
695704 case ELF::R_RISCV_RVC_JUMP:
696705 case ELF::R_RISCV_RVC_BRANCH:
697706 case ELF::R_RISCV_32_PCREL:
0 commit comments