[llvm] [BOLT][RISCV] Fix AUIPC/JALR call rewriting (PR #216882)

via llvm-commits llvm-commits at lists.llvm.org
Tue Aug 25 00:58:04 PDT 2026


================
@@ -275,7 +303,20 @@ class RISCVMCPlusBuilder : public MCPlusBuilder {
 
   void createCall(MCInst &Inst, const MCSymbol *Target,
                   MCContext *Ctx) override {
-    return createCall(RISCV::PseudoCALL, Inst, Target, Ctx);
+    MCRegister Link = RISCV::X1;
+    if ((Inst.getOpcode() == RISCV::JAL || Inst.getOpcode() == RISCV::JALR ||
+         Inst.getOpcode() == RISCV::PseudoCALLReg) &&
+        Inst.getNumOperands() && Inst.getOperand(0).isReg())
+      Link = Inst.getOperand(0).getReg();
+
+    if (Link == RISCV::X1)
+      return createCall(RISCV::PseudoCALL, Inst, Target, Ctx);
+
+    Inst.setOpcode(RISCV::PseudoCALLReg);
+    Inst.clear();
+    Inst.addOperand(MCOperand::createReg(Link));
+    Inst.addOperand(MCOperand::createExpr(MCSpecifierExpr::create(
+        MCSymbolRefExpr::create(Target, *Ctx), RISCV::S_CALL_PLT, *Ctx)));
----------------
Thrrreeee wrote:

This may conflict with https://github.com/llvm/llvm-project/pull/218408

https://github.com/llvm/llvm-project/pull/216882


More information about the llvm-commits mailing list