@@ -86,7 +86,11 @@ class RISCVAsmPrinter : public AsmPrinter {
86
86
const char *ExtraCode, raw_ostream &OS) override ;
87
87
88
88
// Returns whether Inst is compressed.
89
- bool EmitToStreamer (MCStreamer &S, const MCInst &Inst);
89
+ bool EmitToStreamer (MCStreamer &S, const MCInst &Inst,
90
+ const MCSubtargetInfo &SubtargetInfo);
91
+ bool EmitToStreamer (MCStreamer &S, const MCInst &Inst) {
92
+ return EmitToStreamer (S, Inst, *STI);
93
+ }
90
94
91
95
bool lowerPseudoInstExpansion (const MachineInstr *MI, MCInst &Inst);
92
96
@@ -242,12 +246,13 @@ void RISCVAsmPrinter::LowerSTATEPOINT(MCStreamer &OutStreamer, StackMaps &SM,
242
246
SM.recordStatepoint (*MILabel, MI);
243
247
}
244
248
245
- bool RISCVAsmPrinter::EmitToStreamer (MCStreamer &S, const MCInst &Inst) {
249
+ bool RISCVAsmPrinter::EmitToStreamer (MCStreamer &S, const MCInst &Inst,
250
+ const MCSubtargetInfo &SubtargetInfo) {
246
251
MCInst CInst;
247
- bool Res = RISCVRVC::compress (CInst, Inst, *STI );
252
+ bool Res = RISCVRVC::compress (CInst, Inst, SubtargetInfo );
248
253
if (Res)
249
254
++RISCVNumInstrsCompressed;
250
- S.emitInstruction (Res ? CInst : Inst, *STI );
255
+ S.emitInstruction (Res ? CInst : Inst, SubtargetInfo );
251
256
return Res;
252
257
}
253
258
@@ -662,87 +667,100 @@ void RISCVAsmPrinter::EmitHwasanMemaccessSymbols(Module &M) {
662
667
OutStreamer->emitLabel (Sym);
663
668
664
669
// Extract shadow offset from ptr
665
- OutStreamer->emitInstruction (
670
+ EmitToStreamer (
671
+ *OutStreamer,
666
672
MCInstBuilder (RISCV::SLLI).addReg (RISCV::X6).addReg (Reg).addImm (8 ),
667
673
MCSTI);
668
- OutStreamer->emitInstruction (MCInstBuilder (RISCV::SRLI)
669
- .addReg (RISCV::X6)
670
- .addReg (RISCV::X6)
671
- .addImm (12 ),
672
- MCSTI);
674
+ EmitToStreamer (*OutStreamer,
675
+ MCInstBuilder (RISCV::SRLI)
676
+ .addReg (RISCV::X6)
677
+ .addReg (RISCV::X6)
678
+ .addImm (12 ),
679
+ MCSTI);
673
680
// load shadow tag in X6, X5 contains shadow base
674
- OutStreamer->emitInstruction (MCInstBuilder (RISCV::ADD)
675
- .addReg (RISCV::X6)
676
- .addReg (RISCV::X5)
677
- .addReg (RISCV::X6),
678
- MCSTI);
679
- OutStreamer->emitInstruction (
681
+ EmitToStreamer (*OutStreamer,
682
+ MCInstBuilder (RISCV::ADD)
683
+ .addReg (RISCV::X6)
684
+ .addReg (RISCV::X5)
685
+ .addReg (RISCV::X6),
686
+ MCSTI);
687
+ EmitToStreamer (
688
+ *OutStreamer,
680
689
MCInstBuilder (RISCV::LBU).addReg (RISCV::X6).addReg (RISCV::X6).addImm (0 ),
681
690
MCSTI);
682
691
// Extract tag from pointer and compare it with loaded tag from shadow
683
- OutStreamer->emitInstruction (
692
+ EmitToStreamer (
693
+ *OutStreamer,
684
694
MCInstBuilder (RISCV::SRLI).addReg (RISCV::X7).addReg (Reg).addImm (56 ),
685
695
MCSTI);
686
696
MCSymbol *HandleMismatchOrPartialSym = OutContext.createTempSymbol ();
687
697
// X7 contains tag from the pointer, while X6 contains tag from memory
688
- OutStreamer-> emitInstruction (
689
- MCInstBuilder (RISCV::BNE)
690
- .addReg (RISCV::X7)
691
- .addReg (RISCV::X6)
692
- .addExpr (MCSymbolRefExpr::create (HandleMismatchOrPartialSym,
693
- OutContext)),
694
- MCSTI);
698
+ EmitToStreamer (*OutStreamer,
699
+ MCInstBuilder (RISCV::BNE)
700
+ .addReg (RISCV::X7)
701
+ .addReg (RISCV::X6)
702
+ .addExpr (MCSymbolRefExpr::create (
703
+ HandleMismatchOrPartialSym, OutContext)),
704
+ MCSTI);
695
705
MCSymbol *ReturnSym = OutContext.createTempSymbol ();
696
706
OutStreamer->emitLabel (ReturnSym);
697
- OutStreamer->emitInstruction (MCInstBuilder (RISCV::JALR)
698
- .addReg (RISCV::X0)
699
- .addReg (RISCV::X1)
700
- .addImm (0 ),
701
- MCSTI);
707
+ EmitToStreamer (*OutStreamer,
708
+ MCInstBuilder (RISCV::JALR)
709
+ .addReg (RISCV::X0)
710
+ .addReg (RISCV::X1)
711
+ .addImm (0 ),
712
+ MCSTI);
702
713
OutStreamer->emitLabel (HandleMismatchOrPartialSym);
703
714
704
- OutStreamer->emitInstruction (MCInstBuilder (RISCV::ADDI)
705
- .addReg (RISCV::X28)
706
- .addReg (RISCV::X0)
707
- .addImm (16 ),
708
- MCSTI);
715
+ EmitToStreamer (*OutStreamer,
716
+ MCInstBuilder (RISCV::ADDI)
717
+ .addReg (RISCV::X28)
718
+ .addReg (RISCV::X0)
719
+ .addImm (16 ),
720
+ MCSTI);
709
721
MCSymbol *HandleMismatchSym = OutContext.createTempSymbol ();
710
- OutStreamer->emitInstruction (
722
+ EmitToStreamer (
723
+ *OutStreamer,
711
724
MCInstBuilder (RISCV::BGEU)
712
725
.addReg (RISCV::X6)
713
726
.addReg (RISCV::X28)
714
727
.addExpr (MCSymbolRefExpr::create (HandleMismatchSym, OutContext)),
715
728
MCSTI);
716
729
717
- OutStreamer->emitInstruction (
730
+ EmitToStreamer (
731
+ *OutStreamer,
718
732
MCInstBuilder (RISCV::ANDI).addReg (RISCV::X28).addReg (Reg).addImm (0xF ),
719
733
MCSTI);
720
734
721
735
if (Size != 1 )
722
- OutStreamer->emitInstruction (MCInstBuilder (RISCV::ADDI)
723
- .addReg (RISCV::X28)
724
- .addReg (RISCV::X28)
725
- .addImm (Size - 1 ),
726
- MCSTI);
727
- OutStreamer->emitInstruction (
736
+ EmitToStreamer (*OutStreamer,
737
+ MCInstBuilder (RISCV::ADDI)
738
+ .addReg (RISCV::X28)
739
+ .addReg (RISCV::X28)
740
+ .addImm (Size - 1 ),
741
+ MCSTI);
742
+ EmitToStreamer (
743
+ *OutStreamer,
728
744
MCInstBuilder (RISCV::BGE)
729
745
.addReg (RISCV::X28)
730
746
.addReg (RISCV::X6)
731
747
.addExpr (MCSymbolRefExpr::create (HandleMismatchSym, OutContext)),
732
748
MCSTI);
733
749
734
- OutStreamer->emitInstruction (
750
+ EmitToStreamer (
751
+ *OutStreamer,
735
752
MCInstBuilder (RISCV::ORI).addReg (RISCV::X6).addReg (Reg).addImm (0xF ),
736
753
MCSTI);
737
- OutStreamer->emitInstruction (
754
+ EmitToStreamer (
755
+ *OutStreamer,
738
756
MCInstBuilder (RISCV::LBU).addReg (RISCV::X6).addReg (RISCV::X6).addImm (0 ),
739
757
MCSTI);
740
- OutStreamer-> emitInstruction (
741
- MCInstBuilder (RISCV::BEQ)
742
- .addReg (RISCV::X6)
743
- .addReg (RISCV::X7)
744
- .addExpr (MCSymbolRefExpr::create (ReturnSym, OutContext)),
745
- MCSTI);
758
+ EmitToStreamer (*OutStreamer,
759
+ MCInstBuilder (RISCV::BEQ)
760
+ .addReg (RISCV::X6)
761
+ .addReg (RISCV::X7)
762
+ .addExpr (MCSymbolRefExpr::create (ReturnSym, OutContext)),
763
+ MCSTI);
746
764
747
765
OutStreamer->emitLabel (HandleMismatchSym);
748
766
@@ -781,50 +799,54 @@ void RISCVAsmPrinter::EmitHwasanMemaccessSymbols(Module &M) {
781
799
// +---------------------------------+ <-- [x2 / SP]
782
800
783
801
// Adjust sp
784
- OutStreamer->emitInstruction (MCInstBuilder (RISCV::ADDI)
785
- .addReg (RISCV::X2)
786
- .addReg (RISCV::X2)
787
- .addImm (-256 ),
788
- MCSTI);
802
+ EmitToStreamer (*OutStreamer,
803
+ MCInstBuilder (RISCV::ADDI)
804
+ .addReg (RISCV::X2)
805
+ .addReg (RISCV::X2)
806
+ .addImm (-256 ),
807
+ MCSTI);
789
808
790
809
// store x10(arg0) by new sp
791
- OutStreamer->emitInstruction (MCInstBuilder (RISCV::SD)
792
- .addReg (RISCV::X10)
793
- .addReg (RISCV::X2)
794
- .addImm (8 * 10 ),
795
- MCSTI);
810
+ EmitToStreamer (*OutStreamer,
811
+ MCInstBuilder (RISCV::SD)
812
+ .addReg (RISCV::X10)
813
+ .addReg (RISCV::X2)
814
+ .addImm (8 * 10 ),
815
+ MCSTI);
796
816
// store x11(arg1) by new sp
797
- OutStreamer->emitInstruction (MCInstBuilder (RISCV::SD)
798
- .addReg (RISCV::X11)
799
- .addReg (RISCV::X2)
800
- .addImm (8 * 11 ),
801
- MCSTI);
817
+ EmitToStreamer (*OutStreamer,
818
+ MCInstBuilder (RISCV::SD)
819
+ .addReg (RISCV::X11)
820
+ .addReg (RISCV::X2)
821
+ .addImm (8 * 11 ),
822
+ MCSTI);
802
823
803
824
// store x8(fp) by new sp
804
- OutStreamer->emitInstruction (
825
+ EmitToStreamer (
826
+ *OutStreamer,
805
827
MCInstBuilder (RISCV::SD).addReg (RISCV::X8).addReg (RISCV::X2).addImm (8 *
806
828
8 ),
807
829
MCSTI);
808
830
// store x1(ra) by new sp
809
- OutStreamer->emitInstruction (
831
+ EmitToStreamer (
832
+ *OutStreamer,
810
833
MCInstBuilder (RISCV::SD).addReg (RISCV::X1).addReg (RISCV::X2).addImm (1 *
811
834
8 ),
812
835
MCSTI);
813
836
if (Reg != RISCV::X10)
814
- OutStreamer->emitInstruction (MCInstBuilder (RISCV::ADDI)
815
- .addReg (RISCV::X10)
816
- .addReg (Reg)
817
- .addImm (0 ),
818
- MCSTI);
819
- OutStreamer->emitInstruction (
820
- MCInstBuilder (RISCV::ADDI)
821
- .addReg (RISCV::X11)
822
- .addReg (RISCV::X0)
823
- .addImm (AccessInfo & HWASanAccessInfo::RuntimeMask),
824
- MCSTI);
825
-
826
- OutStreamer->emitInstruction (MCInstBuilder (RISCV::PseudoCALL).addExpr (Expr),
827
- MCSTI);
837
+ EmitToStreamer (
838
+ *OutStreamer,
839
+ MCInstBuilder (RISCV::ADDI).addReg (RISCV::X10).addReg (Reg).addImm (0 ),
840
+ MCSTI);
841
+ EmitToStreamer (*OutStreamer,
842
+ MCInstBuilder (RISCV::ADDI)
843
+ .addReg (RISCV::X11)
844
+ .addReg (RISCV::X0)
845
+ .addImm (AccessInfo & HWASanAccessInfo::RuntimeMask),
846
+ MCSTI);
847
+
848
+ EmitToStreamer (*OutStreamer, MCInstBuilder (RISCV::PseudoCALL).addExpr (Expr),
849
+ MCSTI);
828
850
}
829
851
}
830
852
0 commit comments