[llvm] [x64][win] Add compiler support for x64 import call optimization (equivalent to MSVC /d2guardretpoline) (PR #126631)
Eli Friedman via llvm-commits
llvm-commits at lists.llvm.org
Thu Feb 13 14:56:34 PST 2025
================
@@ -2469,7 +2535,49 @@ void X86AsmPrinter::emitInstruction(const MachineInstr *MI) {
case X86::CALL64pcrel32:
if (IndCSPrefix && MI->hasRegisterImplicitUseOperand(X86::R11))
EmitAndCountInstruction(MCInstBuilder(X86::CS_PREFIX));
+
+ if (EnableImportCallOptimization && isImportedFunction(MI->getOperand(0))) {
+ emitLabelAndRecordForImportCallOptimization(
+ IMAGE_RETPOLINE_AMD64_IMPORT_CALL);
+
+ MCInst TmpInst;
+ MCInstLowering.Lower(MI, TmpInst);
+
+ // For Import Call Optimization to work, we need a the call instruction
+ // with a rex prefix, and a 5-byte nop after the call instruction.
+ EmitAndCountInstruction(MCInstBuilder(X86::REX64_PREFIX));
+ emitCallInstruction(TmpInst);
+ emitNop(*OutStreamer, 5, Subtarget);
+ return;
+ }
+
break;
+ case X86::CALL64r:
+ if (EnableImportCallOptimization) {
+ MCInst TmpInst;
+ MCInstLowering.Lower(MI, TmpInst);
+
+ // Import call optimization requires all indirect calls go via RAX.
+ ensureRaxUsedForOperand(TmpInst);
+
+ emitLabelAndRecordForImportCallOptimization(
+ IMAGE_RETPOLINE_AMD64_INDIR_CALL);
+ emitCallInstruction(TmpInst);
+
+ // For Import Call Optimization to work, we a 3-byte nop after the call
----------------
efriedma-quic wrote:
```suggestion
// For Import Call Optimization to work, we need a 3-byte nop after the call
```
https://github.com/llvm/llvm-project/pull/126631
More information about the llvm-commits
mailing list