@@ -211,7 +211,8 @@ void MIPS<ELFT>::writeGotPlt(uint8_t *buf, const Symbol &) const {
211
211
write32 (ctx, buf, va);
212
212
}
213
213
214
- template <endianness E> static uint32_t readShuffle (const uint8_t *loc) {
214
+ template <endianness E>
215
+ static uint32_t readShuffle (Ctx &ctx, const uint8_t *loc) {
215
216
// The major opcode of a microMIPS instruction needs to appear
216
217
// in the first 16-bit word (lowest address) for efficient hardware
217
218
// decode so that it knows if the instruction is 16-bit or 32-bit
@@ -224,7 +225,7 @@ template <endianness E> static uint32_t readShuffle(const uint8_t *loc) {
224
225
return v;
225
226
}
226
227
227
- static void writeValue (uint8_t *loc, uint64_t v, uint8_t bitsSize,
228
+ static void writeValue (Ctx &ctx, uint8_t *loc, uint64_t v, uint8_t bitsSize,
228
229
uint8_t shift) {
229
230
uint32_t instr = read32 (ctx, loc);
230
231
uint32_t mask = 0xffffffff >> (32 - bitsSize);
@@ -233,14 +234,14 @@ static void writeValue(uint8_t *loc, uint64_t v, uint8_t bitsSize,
233
234
}
234
235
235
236
template <endianness E>
236
- static void writeShuffleValue ( uint8_t *loc, uint64_t v, uint8_t bitsSize,
237
- uint8_t shift) {
237
+ static void writeShuffle (Ctx &ctx, uint8_t *loc, uint64_t v, uint8_t bitsSize,
238
+ uint8_t shift) {
238
239
// See comments in readShuffle for purpose of this code.
239
240
uint16_t *words = (uint16_t *)loc;
240
241
if (E == llvm::endianness::little)
241
242
std::swap (words[0 ], words[1 ]);
242
243
243
- writeValue (loc, v, bitsSize, shift);
244
+ writeValue (ctx, loc, v, bitsSize, shift);
244
245
245
246
if (E == llvm::endianness::little)
246
247
std::swap (words[0 ], words[1 ]);
@@ -312,9 +313,9 @@ template <class ELFT> void MIPS<ELFT>::writePltHeader(uint8_t *buf) const {
312
313
write32 (ctx, buf + 28 , 0x2718fffe ); // subu $24, $24, 2
313
314
314
315
uint64_t gotPlt = ctx.in .gotPlt ->getVA ();
315
- writeValue (buf, gotPlt + 0x8000 , 16 , 16 );
316
- writeValue (buf + 4 , gotPlt, 16 , 0 );
317
- writeValue (buf + 8 , gotPlt, 16 , 0 );
316
+ writeValue (ctx, buf, gotPlt + 0x8000 , 16 , 16 );
317
+ writeValue (ctx, buf + 4 , gotPlt, 16 , 0 );
318
+ writeValue (ctx, buf + 8 , gotPlt, 16 , 0 );
318
319
}
319
320
320
321
template <class ELFT >
@@ -351,9 +352,9 @@ void MIPS<ELFT>::writePlt(uint8_t *buf, const Symbol &sym,
351
352
write32 (ctx, buf + 4 , loadInst); // l[wd] $25, %lo(.got.plt entry)($15)
352
353
write32 (ctx, buf + 8 , jrInst); // jr $25 / jr.hb $25
353
354
write32 (ctx, buf + 12 , addInst); // [d]addiu $24, $15, %lo(.got.plt entry)
354
- writeValue (buf, gotPltEntryAddr + 0x8000 , 16 , 16 );
355
- writeValue (buf + 4 , gotPltEntryAddr, 16 , 0 );
356
- writeValue (buf + 12 , gotPltEntryAddr, 16 , 0 );
355
+ writeValue (ctx, buf, gotPltEntryAddr + 0x8000 , 16 , 16 );
356
+ writeValue (ctx, buf + 4 , gotPltEntryAddr, 16 , 0 );
357
+ writeValue (ctx, buf + 12 , gotPltEntryAddr, 16 , 0 );
357
358
}
358
359
359
360
template <class ELFT >
@@ -418,7 +419,7 @@ int64_t MIPS<ELFT>::getImplicitAddend(const uint8_t *buf, RelType type) const {
418
419
return SignExtend64<16 >(read32 (ctx, buf));
419
420
case R_MICROMIPS_GOT16:
420
421
case R_MICROMIPS_HI16:
421
- return SignExtend64<16 >(readShuffle<e>(buf)) << 16 ;
422
+ return SignExtend64<16 >(readShuffle<e>(ctx, buf)) << 16 ;
422
423
case R_MICROMIPS_CALL16:
423
424
case R_MICROMIPS_GPREL16:
424
425
case R_MICROMIPS_LO16:
@@ -429,9 +430,9 @@ int64_t MIPS<ELFT>::getImplicitAddend(const uint8_t *buf, RelType type) const {
429
430
case R_MICROMIPS_TLS_LDM:
430
431
case R_MICROMIPS_TLS_TPREL_HI16:
431
432
case R_MICROMIPS_TLS_TPREL_LO16:
432
- return SignExtend64<16 >(readShuffle<e>(buf));
433
+ return SignExtend64<16 >(readShuffle<e>(ctx, buf));
433
434
case R_MICROMIPS_GPREL7_S2:
434
- return SignExtend64<9 >(readShuffle<e>(buf) << 2 );
435
+ return SignExtend64<9 >(readShuffle<e>(ctx, buf) << 2 );
435
436
case R_MIPS_PC16:
436
437
return SignExtend64<18 >(read32 (ctx, buf) << 2 );
437
438
case R_MIPS_PC19_S2:
@@ -443,23 +444,23 @@ int64_t MIPS<ELFT>::getImplicitAddend(const uint8_t *buf, RelType type) const {
443
444
case R_MIPS_PC32:
444
445
return SignExtend64<32 >(read32 (ctx, buf));
445
446
case R_MICROMIPS_26_S1:
446
- return SignExtend64<27 >(readShuffle<e>(buf) << 1 );
447
+ return SignExtend64<27 >(readShuffle<e>(ctx, buf) << 1 );
447
448
case R_MICROMIPS_PC7_S1:
448
449
return SignExtend64<8 >(read16 (ctx, buf) << 1 );
449
450
case R_MICROMIPS_PC10_S1:
450
451
return SignExtend64<11 >(read16 (ctx, buf) << 1 );
451
452
case R_MICROMIPS_PC16_S1:
452
- return SignExtend64<17 >(readShuffle<e>(buf) << 1 );
453
+ return SignExtend64<17 >(readShuffle<e>(ctx, buf) << 1 );
453
454
case R_MICROMIPS_PC18_S3:
454
- return SignExtend64<21 >(readShuffle<e>(buf) << 3 );
455
+ return SignExtend64<21 >(readShuffle<e>(ctx, buf) << 3 );
455
456
case R_MICROMIPS_PC19_S2:
456
- return SignExtend64<21 >(readShuffle<e>(buf) << 2 );
457
+ return SignExtend64<21 >(readShuffle<e>(ctx, buf) << 2 );
457
458
case R_MICROMIPS_PC21_S1:
458
- return SignExtend64<22 >(readShuffle<e>(buf) << 1 );
459
+ return SignExtend64<22 >(readShuffle<e>(ctx, buf) << 1 );
459
460
case R_MICROMIPS_PC23_S2:
460
- return SignExtend64<25 >(readShuffle<e>(buf) << 2 );
461
+ return SignExtend64<25 >(readShuffle<e>(ctx, buf) << 2 );
461
462
case R_MICROMIPS_PC26_S1:
462
- return SignExtend64<27 >(readShuffle<e>(buf) << 1 );
463
+ return SignExtend64<27 >(readShuffle<e>(ctx, buf) << 1 );
463
464
case R_MIPS_64:
464
465
case R_MIPS_TLS_DTPMOD64:
465
466
case R_MIPS_TLS_DTPREL64:
@@ -534,16 +535,16 @@ static uint64_t fixupCrossModeJump(uint8_t *loc, RelType type, uint64_t val) {
534
535
case R_MIPS_26: {
535
536
uint32_t inst = read32 (ctx, loc) >> 26 ;
536
537
if (inst == 0x3 || inst == 0x1d ) { // JAL or JALX
537
- writeValue (loc, 0x1d << 26 , 32 , 0 );
538
+ writeValue (ctx, loc, 0x1d << 26 , 32 , 0 );
538
539
return val;
539
540
}
540
541
break ;
541
542
}
542
543
case R_MICROMIPS_26_S1: {
543
- uint32_t inst = readShuffle<e>(loc) >> 26 ;
544
+ uint32_t inst = readShuffle<e>(ctx, loc) >> 26 ;
544
545
if (inst == 0x3d || inst == 0x3c ) { // JAL32 or JALX32
545
546
val >>= 1 ;
546
- writeShuffleValue <e>(loc, 0x3c << 26 , 32 , 0 );
547
+ writeShuffle <e>(ctx, loc, 0x3c << 26 , 32 , 0 );
547
548
return val;
548
549
}
549
550
break ;
@@ -600,25 +601,25 @@ void MIPS<ELFT>::relocate(uint8_t *loc, const Relocation &rel,
600
601
write64 (ctx, loc, val);
601
602
break ;
602
603
case R_MIPS_26:
603
- writeValue (loc, val, 26 , 2 );
604
+ writeValue (ctx, loc, val, 26 , 2 );
604
605
break ;
605
606
case R_MIPS_GOT16:
606
607
// The R_MIPS_GOT16 relocation's value in "relocatable" linking mode
607
608
// is updated addend (not a GOT index). In that case write high 16 bits
608
609
// to store a correct addend value.
609
610
if (ctx.arg .relocatable ) {
610
- writeValue (loc, val + 0x8000 , 16 , 16 );
611
+ writeValue (ctx, loc, val + 0x8000 , 16 , 16 );
611
612
} else {
612
613
checkInt (loc, val, 16 , rel);
613
- writeValue (loc, val, 16 , 0 );
614
+ writeValue (ctx, loc, val, 16 , 0 );
614
615
}
615
616
break ;
616
617
case R_MICROMIPS_GOT16:
617
618
if (ctx.arg .relocatable ) {
618
- writeShuffleValue <e>(loc, val + 0x8000 , 16 , 16 );
619
+ writeShuffle <e>(ctx, loc, val + 0x8000 , 16 , 16 );
619
620
} else {
620
621
checkInt (loc, val, 16 , rel);
621
- writeShuffleValue <e>(loc, val, 16 , 0 );
622
+ writeShuffle <e>(ctx, loc, val, 16 , 0 );
622
623
}
623
624
break ;
624
625
case R_MIPS_CALL16:
@@ -637,46 +638,46 @@ void MIPS<ELFT>::relocate(uint8_t *loc, const Relocation &rel,
637
638
case R_MIPS_PCLO16:
638
639
case R_MIPS_TLS_DTPREL_LO16:
639
640
case R_MIPS_TLS_TPREL_LO16:
640
- writeValue (loc, val, 16 , 0 );
641
+ writeValue (ctx, loc, val, 16 , 0 );
641
642
break ;
642
643
case R_MICROMIPS_GPREL16:
643
644
case R_MICROMIPS_TLS_GD:
644
645
case R_MICROMIPS_TLS_LDM:
645
646
checkInt (loc, val, 16 , rel);
646
- writeShuffleValue <e>(loc, val, 16 , 0 );
647
+ writeShuffle <e>(ctx, loc, val, 16 , 0 );
647
648
break ;
648
649
case R_MICROMIPS_CALL16:
649
650
case R_MICROMIPS_CALL_LO16:
650
651
case R_MICROMIPS_LO16:
651
652
case R_MICROMIPS_TLS_DTPREL_LO16:
652
653
case R_MICROMIPS_TLS_GOTTPREL:
653
654
case R_MICROMIPS_TLS_TPREL_LO16:
654
- writeShuffleValue <e>(loc, val, 16 , 0 );
655
+ writeShuffle <e>(ctx, loc, val, 16 , 0 );
655
656
break ;
656
657
case R_MICROMIPS_GPREL7_S2:
657
658
checkInt (loc, val, 7 , rel);
658
- writeShuffleValue <e>(loc, val, 7 , 2 );
659
+ writeShuffle <e>(ctx, loc, val, 7 , 2 );
659
660
break ;
660
661
case R_MIPS_CALL_HI16:
661
662
case R_MIPS_GOT_HI16:
662
663
case R_MIPS_HI16:
663
664
case R_MIPS_PCHI16:
664
665
case R_MIPS_TLS_DTPREL_HI16:
665
666
case R_MIPS_TLS_TPREL_HI16:
666
- writeValue (loc, val + 0x8000 , 16 , 16 );
667
+ writeValue (ctx, loc, val + 0x8000 , 16 , 16 );
667
668
break ;
668
669
case R_MICROMIPS_CALL_HI16:
669
670
case R_MICROMIPS_GOT_HI16:
670
671
case R_MICROMIPS_HI16:
671
672
case R_MICROMIPS_TLS_DTPREL_HI16:
672
673
case R_MICROMIPS_TLS_TPREL_HI16:
673
- writeShuffleValue <e>(loc, val + 0x8000 , 16 , 16 );
674
+ writeShuffle <e>(ctx, loc, val + 0x8000 , 16 , 16 );
674
675
break ;
675
676
case R_MIPS_HIGHER:
676
- writeValue (loc, val + 0x80008000 , 16 , 32 );
677
+ writeValue (ctx, loc, val + 0x80008000 , 16 , 32 );
677
678
break ;
678
679
case R_MIPS_HIGHEST:
679
- writeValue (loc, val + 0x800080008000 , 16 , 48 );
680
+ writeValue (ctx, loc, val + 0x800080008000 , 16 , 48 );
680
681
break ;
681
682
case R_MIPS_JALR:
682
683
val -= 4 ;
@@ -699,30 +700,30 @@ void MIPS<ELFT>::relocate(uint8_t *loc, const Relocation &rel,
699
700
case R_MIPS_PC16:
700
701
checkAlignment (loc, val, 4 , rel);
701
702
checkInt (loc, val, 18 , rel);
702
- writeValue (loc, val, 16 , 2 );
703
+ writeValue (ctx, loc, val, 16 , 2 );
703
704
break ;
704
705
case R_MIPS_PC19_S2:
705
706
checkAlignment (loc, val, 4 , rel);
706
707
checkInt (loc, val, 21 , rel);
707
- writeValue (loc, val, 19 , 2 );
708
+ writeValue (ctx, loc, val, 19 , 2 );
708
709
break ;
709
710
case R_MIPS_PC21_S2:
710
711
checkAlignment (loc, val, 4 , rel);
711
712
checkInt (loc, val, 23 , rel);
712
- writeValue (loc, val, 21 , 2 );
713
+ writeValue (ctx, loc, val, 21 , 2 );
713
714
break ;
714
715
case R_MIPS_PC26_S2:
715
716
checkAlignment (loc, val, 4 , rel);
716
717
checkInt (loc, val, 28 , rel);
717
- writeValue (loc, val, 26 , 2 );
718
+ writeValue (ctx, loc, val, 26 , 2 );
718
719
break ;
719
720
case R_MIPS_PC32:
720
- writeValue (loc, val, 32 , 0 );
721
+ writeValue (ctx, loc, val, 32 , 0 );
721
722
break ;
722
723
case R_MICROMIPS_26_S1:
723
724
case R_MICROMIPS_PC26_S1:
724
725
checkInt (loc, val, 27 , rel);
725
- writeShuffleValue <e>(loc, val, 26 , 1 );
726
+ writeShuffle <e>(ctx, loc, val, 26 , 1 );
726
727
break ;
727
728
case R_MICROMIPS_PC7_S1:
728
729
checkInt (loc, val, 8 , rel);
@@ -734,23 +735,23 @@ void MIPS<ELFT>::relocate(uint8_t *loc, const Relocation &rel,
734
735
break ;
735
736
case R_MICROMIPS_PC16_S1:
736
737
checkInt (loc, val, 17 , rel);
737
- writeShuffleValue <e>(loc, val, 16 , 1 );
738
+ writeShuffle <e>(ctx, loc, val, 16 , 1 );
738
739
break ;
739
740
case R_MICROMIPS_PC18_S3:
740
741
checkInt (loc, val, 21 , rel);
741
- writeShuffleValue <e>(loc, val, 18 , 3 );
742
+ writeShuffle <e>(ctx, loc, val, 18 , 3 );
742
743
break ;
743
744
case R_MICROMIPS_PC19_S2:
744
745
checkInt (loc, val, 21 , rel);
745
- writeShuffleValue <e>(loc, val, 19 , 2 );
746
+ writeShuffle <e>(ctx, loc, val, 19 , 2 );
746
747
break ;
747
748
case R_MICROMIPS_PC21_S1:
748
749
checkInt (loc, val, 22 , rel);
749
- writeShuffleValue <e>(loc, val, 21 , 1 );
750
+ writeShuffle <e>(ctx, loc, val, 21 , 1 );
750
751
break ;
751
752
case R_MICROMIPS_PC23_S2:
752
753
checkInt (loc, val, 25 , rel);
753
- writeShuffleValue <e>(loc, val, 23 , 2 );
754
+ writeShuffle <e>(ctx, loc, val, 23 , 2 );
754
755
break ;
755
756
default :
756
757
llvm_unreachable (" unknown relocation" );
0 commit comments