summaryrefslogtreecommitdiff
path: root/llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp')
-rw-r--r--llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp188
1 files changed, 105 insertions, 83 deletions
diff --git a/llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp b/llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp
index 69ab49de1dac..5ad09ae7290f 100644
--- a/llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp
+++ b/llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp
@@ -86,7 +86,11 @@ public:
const char *ExtraCode, raw_ostream &OS) override;
// Returns whether Inst is compressed.
- bool EmitToStreamer(MCStreamer &S, const MCInst &Inst);
+ bool EmitToStreamer(MCStreamer &S, const MCInst &Inst,
+ const MCSubtargetInfo &SubtargetInfo);
+ bool EmitToStreamer(MCStreamer &S, const MCInst &Inst) {
+ return EmitToStreamer(S, Inst, *STI);
+ }
bool lowerPseudoInstExpansion(const MachineInstr *MI, MCInst &Inst);
@@ -242,12 +246,13 @@ void RISCVAsmPrinter::LowerSTATEPOINT(MCStreamer &OutStreamer, StackMaps &SM,
SM.recordStatepoint(*MILabel, MI);
}
-bool RISCVAsmPrinter::EmitToStreamer(MCStreamer &S, const MCInst &Inst) {
+bool RISCVAsmPrinter::EmitToStreamer(MCStreamer &S, const MCInst &Inst,
+ const MCSubtargetInfo &SubtargetInfo) {
MCInst CInst;
- bool Res = RISCVRVC::compress(CInst, Inst, *STI);
+ bool Res = RISCVRVC::compress(CInst, Inst, SubtargetInfo);
if (Res)
++RISCVNumInstrsCompressed;
- AsmPrinter::EmitToStreamer(*OutStreamer, Res ? CInst : Inst);
+ S.emitInstruction(Res ? CInst : Inst, SubtargetInfo);
return Res;
}
@@ -662,87 +667,100 @@ void RISCVAsmPrinter::EmitHwasanMemaccessSymbols(Module &M) {
OutStreamer->emitLabel(Sym);
// Extract shadow offset from ptr
- OutStreamer->emitInstruction(
+ EmitToStreamer(
+ *OutStreamer,
MCInstBuilder(RISCV::SLLI).addReg(RISCV::X6).addReg(Reg).addImm(8),
MCSTI);
- OutStreamer->emitInstruction(MCInstBuilder(RISCV::SRLI)
- .addReg(RISCV::X6)
- .addReg(RISCV::X6)
- .addImm(12),
- MCSTI);
+ EmitToStreamer(*OutStreamer,
+ MCInstBuilder(RISCV::SRLI)
+ .addReg(RISCV::X6)
+ .addReg(RISCV::X6)
+ .addImm(12),
+ MCSTI);
// load shadow tag in X6, X5 contains shadow base
- OutStreamer->emitInstruction(MCInstBuilder(RISCV::ADD)
- .addReg(RISCV::X6)
- .addReg(RISCV::X5)
- .addReg(RISCV::X6),
- MCSTI);
- OutStreamer->emitInstruction(
+ EmitToStreamer(*OutStreamer,
+ MCInstBuilder(RISCV::ADD)
+ .addReg(RISCV::X6)
+ .addReg(RISCV::X5)
+ .addReg(RISCV::X6),
+ MCSTI);
+ EmitToStreamer(
+ *OutStreamer,
MCInstBuilder(RISCV::LBU).addReg(RISCV::X6).addReg(RISCV::X6).addImm(0),
MCSTI);
- // Extract tag from X5 and compare it with loaded tag from shadow
- OutStreamer->emitInstruction(
+ // Extract tag from pointer and compare it with loaded tag from shadow
+ EmitToStreamer(
+ *OutStreamer,
MCInstBuilder(RISCV::SRLI).addReg(RISCV::X7).addReg(Reg).addImm(56),
MCSTI);
MCSymbol *HandleMismatchOrPartialSym = OutContext.createTempSymbol();
- // X7 contains tag from memory, while X6 contains tag from the pointer
- OutStreamer->emitInstruction(
- MCInstBuilder(RISCV::BNE)
- .addReg(RISCV::X7)
- .addReg(RISCV::X6)
- .addExpr(MCSymbolRefExpr::create(HandleMismatchOrPartialSym,
- OutContext)),
- MCSTI);
+ // X7 contains tag from the pointer, while X6 contains tag from memory
+ EmitToStreamer(*OutStreamer,
+ MCInstBuilder(RISCV::BNE)
+ .addReg(RISCV::X7)
+ .addReg(RISCV::X6)
+ .addExpr(MCSymbolRefExpr::create(
+ HandleMismatchOrPartialSym, OutContext)),
+ MCSTI);
MCSymbol *ReturnSym = OutContext.createTempSymbol();
OutStreamer->emitLabel(ReturnSym);
- OutStreamer->emitInstruction(MCInstBuilder(RISCV::JALR)
- .addReg(RISCV::X0)
- .addReg(RISCV::X1)
- .addImm(0),
- MCSTI);
+ EmitToStreamer(*OutStreamer,
+ MCInstBuilder(RISCV::JALR)
+ .addReg(RISCV::X0)
+ .addReg(RISCV::X1)
+ .addImm(0),
+ MCSTI);
OutStreamer->emitLabel(HandleMismatchOrPartialSym);
- OutStreamer->emitInstruction(MCInstBuilder(RISCV::ADDI)
- .addReg(RISCV::X28)
- .addReg(RISCV::X0)
- .addImm(16),
- MCSTI);
+ EmitToStreamer(*OutStreamer,
+ MCInstBuilder(RISCV::ADDI)
+ .addReg(RISCV::X28)
+ .addReg(RISCV::X0)
+ .addImm(16),
+ MCSTI);
MCSymbol *HandleMismatchSym = OutContext.createTempSymbol();
- OutStreamer->emitInstruction(
+ EmitToStreamer(
+ *OutStreamer,
MCInstBuilder(RISCV::BGEU)
.addReg(RISCV::X6)
.addReg(RISCV::X28)
.addExpr(MCSymbolRefExpr::create(HandleMismatchSym, OutContext)),
MCSTI);
- OutStreamer->emitInstruction(
+ EmitToStreamer(
+ *OutStreamer,
MCInstBuilder(RISCV::ANDI).addReg(RISCV::X28).addReg(Reg).addImm(0xF),
MCSTI);
if (Size != 1)
- OutStreamer->emitInstruction(MCInstBuilder(RISCV::ADDI)
- .addReg(RISCV::X28)
- .addReg(RISCV::X28)
- .addImm(Size - 1),
- MCSTI);
- OutStreamer->emitInstruction(
+ EmitToStreamer(*OutStreamer,
+ MCInstBuilder(RISCV::ADDI)
+ .addReg(RISCV::X28)
+ .addReg(RISCV::X28)
+ .addImm(Size - 1),
+ MCSTI);
+ EmitToStreamer(
+ *OutStreamer,
MCInstBuilder(RISCV::BGE)
.addReg(RISCV::X28)
.addReg(RISCV::X6)
.addExpr(MCSymbolRefExpr::create(HandleMismatchSym, OutContext)),
MCSTI);
- OutStreamer->emitInstruction(
+ EmitToStreamer(
+ *OutStreamer,
MCInstBuilder(RISCV::ORI).addReg(RISCV::X6).addReg(Reg).addImm(0xF),
MCSTI);
- OutStreamer->emitInstruction(
+ EmitToStreamer(
+ *OutStreamer,
MCInstBuilder(RISCV::LBU).addReg(RISCV::X6).addReg(RISCV::X6).addImm(0),
MCSTI);
- OutStreamer->emitInstruction(
- MCInstBuilder(RISCV::BEQ)
- .addReg(RISCV::X6)
- .addReg(RISCV::X7)
- .addExpr(MCSymbolRefExpr::create(ReturnSym, OutContext)),
- MCSTI);
+ EmitToStreamer(*OutStreamer,
+ MCInstBuilder(RISCV::BEQ)
+ .addReg(RISCV::X6)
+ .addReg(RISCV::X7)
+ .addExpr(MCSymbolRefExpr::create(ReturnSym, OutContext)),
+ MCSTI);
OutStreamer->emitLabel(HandleMismatchSym);
@@ -781,50 +799,54 @@ void RISCVAsmPrinter::EmitHwasanMemaccessSymbols(Module &M) {
// +---------------------------------+ <-- [x2 / SP]
// Adjust sp
- OutStreamer->emitInstruction(MCInstBuilder(RISCV::ADDI)
- .addReg(RISCV::X2)
- .addReg(RISCV::X2)
- .addImm(-256),
- MCSTI);
+ EmitToStreamer(*OutStreamer,
+ MCInstBuilder(RISCV::ADDI)
+ .addReg(RISCV::X2)
+ .addReg(RISCV::X2)
+ .addImm(-256),
+ MCSTI);
// store x10(arg0) by new sp
- OutStreamer->emitInstruction(MCInstBuilder(RISCV::SD)
- .addReg(RISCV::X10)
- .addReg(RISCV::X2)
- .addImm(8 * 10),
- MCSTI);
+ EmitToStreamer(*OutStreamer,
+ MCInstBuilder(RISCV::SD)
+ .addReg(RISCV::X10)
+ .addReg(RISCV::X2)
+ .addImm(8 * 10),
+ MCSTI);
// store x11(arg1) by new sp
- OutStreamer->emitInstruction(MCInstBuilder(RISCV::SD)
- .addReg(RISCV::X11)
- .addReg(RISCV::X2)
- .addImm(8 * 11),
- MCSTI);
+ EmitToStreamer(*OutStreamer,
+ MCInstBuilder(RISCV::SD)
+ .addReg(RISCV::X11)
+ .addReg(RISCV::X2)
+ .addImm(8 * 11),
+ MCSTI);
// store x8(fp) by new sp
- OutStreamer->emitInstruction(
+ EmitToStreamer(
+ *OutStreamer,
MCInstBuilder(RISCV::SD).addReg(RISCV::X8).addReg(RISCV::X2).addImm(8 *
8),
MCSTI);
// store x1(ra) by new sp
- OutStreamer->emitInstruction(
+ EmitToStreamer(
+ *OutStreamer,
MCInstBuilder(RISCV::SD).addReg(RISCV::X1).addReg(RISCV::X2).addImm(1 *
8),
MCSTI);
if (Reg != RISCV::X10)
- OutStreamer->emitInstruction(MCInstBuilder(RISCV::ADDI)
- .addReg(RISCV::X10)
- .addReg(Reg)
- .addImm(0),
- MCSTI);
- OutStreamer->emitInstruction(
- MCInstBuilder(RISCV::ADDI)
- .addReg(RISCV::X11)
- .addReg(RISCV::X0)
- .addImm(AccessInfo & HWASanAccessInfo::RuntimeMask),
- MCSTI);
-
- OutStreamer->emitInstruction(MCInstBuilder(RISCV::PseudoCALL).addExpr(Expr),
- MCSTI);
+ EmitToStreamer(
+ *OutStreamer,
+ MCInstBuilder(RISCV::ADDI).addReg(RISCV::X10).addReg(Reg).addImm(0),
+ MCSTI);
+ EmitToStreamer(*OutStreamer,
+ MCInstBuilder(RISCV::ADDI)
+ .addReg(RISCV::X11)
+ .addReg(RISCV::X0)
+ .addImm(AccessInfo & HWASanAccessInfo::RuntimeMask),
+ MCSTI);
+
+ EmitToStreamer(*OutStreamer, MCInstBuilder(RISCV::PseudoCALL).addExpr(Expr),
+ MCSTI);
}
}