[llvm] [LFI][X86] Add control-flow rewrites (PR #210913)
Zachary Yedidia via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 23 00:34:35 PDT 2026
================
@@ -81,43 +113,158 @@ void X86::X86MCLFIRewriter::rewriteSyscall(const MCInst &Inst, MCStreamer &Out,
MCSymbol *Symbol = Out.getContext().createTempSymbol();
// leaq .Ltmp(%rip), %r11
- MCInst Lea;
- Lea.setOpcode(X86::LEA64r);
- Lea.addOperand(MCOperand::createReg(LFIScratchReg));
- Lea.addOperand(MCOperand::createReg(X86::RIP));
- Lea.addOperand(MCOperand::createImm(1));
- Lea.addOperand(MCOperand::createReg(X86::NoRegister));
- Lea.addOperand(
- MCOperand::createExpr(MCSymbolRefExpr::create(Symbol, Out.getContext())));
- Lea.addOperand(MCOperand::createReg(X86::NoRegister));
- Out.emitInstruction(Lea, STI);
-
- // jmpq *(%r14)
- MCInst Jmp;
- Jmp.setOpcode(X86::JMP64m);
- Jmp.addOperand(MCOperand::createReg(LFIBaseReg));
- Jmp.addOperand(MCOperand::createImm(1));
- Jmp.addOperand(MCOperand::createReg(X86::NoRegister));
- Jmp.addOperand(MCOperand::createImm(-8));
- Jmp.addOperand(MCOperand::createReg(X86::NoRegister));
- Out.emitInstruction(Jmp, STI);
+ Out.emitInstruction(
+ MCInstBuilder(X86::LEA64r)
+ .addReg(LFIScratchReg)
+ .addReg(X86::RIP)
+ .addImm(1)
+ .addReg(X86::NoRegister)
+ .addExpr(MCSymbolRefExpr::create(Symbol, Out.getContext()))
+ .addReg(X86::NoRegister),
+ STI);
+
+ // jmpq *-8(%r14)
+ Out.emitInstruction(MCInstBuilder(X86::JMP64m)
+ .addReg(LFIBaseReg)
+ .addImm(1)
+ .addReg(X86::NoRegister)
+ .addImm(-8)
+ .addReg(X86::NoRegister),
+ STI);
Out.emitLabel(Symbol);
Out.emitBundleUnlock(STI);
}
+// andl $-LFIBundleSize, %eX
+// addq %r14, %rX
+void X86::X86MCLFIRewriter::emitSandboxBranchReg(MCRegister Reg,
+ MCStreamer &Out,
+ const MCSubtargetInfo &STI) {
+ MCRegister Reg32 = RegInfo->getSubReg(Reg, X86::sub_32bit);
+
+ Out.emitInstruction(MCInstBuilder(X86::AND32ri8)
+ .addReg(Reg32)
+ .addReg(Reg32)
+ .addImm(-static_cast<int64_t>(LFIBundleSize)),
----------------
zyedidia wrote:
The cast is for the textual output rather than the encoding. `LFIBundleSize` is unsigned, so `-LFIBundleSize` is emitted as 4294967264 which I think is more confusing. We could switch `LFIBundleSize` to a signed type though if that is preferred.
https://github.com/llvm/llvm-project/pull/210913
More information about the llvm-commits
mailing list