@@ -101,6 +101,7 @@ static bool isSupportedRISCV(uint64_t Type) {
101
101
case ELF::R_RISCV_GOT_HI20:
102
102
case ELF::R_RISCV_PCREL_HI20:
103
103
case ELF::R_RISCV_PCREL_LO12_I:
104
+ case ELF::R_RISCV_PCREL_LO12_S:
104
105
case ELF::R_RISCV_RVC_JUMP:
105
106
case ELF::R_RISCV_RVC_BRANCH:
106
107
case ELF::R_RISCV_ADD32:
@@ -195,6 +196,7 @@ static size_t getSizeForTypeRISCV(uint64_t Type) {
195
196
case ELF::R_RISCV_BRANCH:
196
197
case ELF::R_RISCV_PCREL_HI20:
197
198
case ELF::R_RISCV_PCREL_LO12_I:
199
+ case ELF::R_RISCV_PCREL_LO12_S:
198
200
case ELF::R_RISCV_32_PCREL:
199
201
case ELF::R_RISCV_CALL:
200
202
case ELF::R_RISCV_CALL_PLT:
@@ -480,6 +482,10 @@ static uint64_t extractIImmRISCV(uint32_t Contents) {
480
482
return SignExtend64<12 >(Contents >> 20 );
481
483
}
482
484
485
+ static uint64_t extractSImmRISCV (uint32_t Contents) {
486
+ return SignExtend64<12 >(((Contents >> 7 ) & 0x1f ) | ((Contents >> 25 ) << 5 ));
487
+ }
488
+
483
489
static uint64_t extractJImmRISCV (uint32_t Contents) {
484
490
return SignExtend64<21 >(
485
491
(((Contents >> 21 ) & 0x3ff ) << 1 ) | (((Contents >> 20 ) & 0x1 ) << 11 ) |
@@ -516,6 +522,8 @@ static uint64_t extractValueRISCV(uint64_t Type, uint64_t Contents,
516
522
return extractUImmRISCV (Contents);
517
523
case ELF::R_RISCV_PCREL_LO12_I:
518
524
return extractIImmRISCV (Contents);
525
+ case ELF::R_RISCV_PCREL_LO12_S:
526
+ return extractSImmRISCV (Contents);
519
527
case ELF::R_RISCV_RVC_JUMP:
520
528
return SignExtend64<11 >(Contents >> 2 );
521
529
case ELF::R_RISCV_RVC_BRANCH:
@@ -692,6 +700,7 @@ static bool isPCRelativeRISCV(uint64_t Type) {
692
700
case ELF::R_RISCV_GOT_HI20:
693
701
case ELF::R_RISCV_PCREL_HI20:
694
702
case ELF::R_RISCV_PCREL_LO12_I:
703
+ case ELF::R_RISCV_PCREL_LO12_S:
695
704
case ELF::R_RISCV_RVC_JUMP:
696
705
case ELF::R_RISCV_RVC_BRANCH:
697
706
case ELF::R_RISCV_32_PCREL:
0 commit comments