[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
================
@@ -2490,20 +2598,47 @@ void X86AsmPrinter::emitInstruction(const MachineInstr *MI) {
MCInst TmpInst;
MCInstLowering.Lower(MI, TmpInst);
- // Stackmap shadows cannot include branch targets, so we can count the bytes
- // in a call towards the shadow, but must ensure that the no thread returns
- // in to the stackmap shadow. The only way to achieve this is if the call
- // is at the end of the shadow.
if (MI->isCall()) {
- // Count then size of the call towards the shadow
- SMShadowTracker.count(TmpInst, getSubtargetInfo(), CodeEmitter.get());
- // Then flush the shadow so that we fill with nops before the call, not
- // after it.
- SMShadowTracker.emitShadowPadding(*OutStreamer, getSubtargetInfo());
- // Then emit the call
- OutStreamer->emitInstruction(TmpInst, getSubtargetInfo());
+ emitCallInstruction(TmpInst);
return;
}
EmitAndCountInstruction(TmpInst);
}
+
+void X86AsmPrinter::emitCallInstruction(const llvm::MCInst &MCI) {
+ // Stackmap shadows cannot include branch targets, so we can count the bytes
+ // in a call towards the shadow, but must ensure that the no thread returns
+ // in to the stackmap shadow. The only way to achieve this is if the call
+ // is at the end of the shadow.
+
+ // Count then size of the call towards the shadow
+ SMShadowTracker.count(MCI, getSubtargetInfo(), CodeEmitter.get());
+ // Then flush the shadow so that we fill with nops before the call, not
+ // after it.
+ SMShadowTracker.emitShadowPadding(*OutStreamer, getSubtargetInfo());
+ // Then emit the call
+ OutStreamer->emitInstruction(MCI, getSubtargetInfo());
+}
+
+void X86AsmPrinter::emitLabelAndRecordForImportCallOptimization(
+ ImportCallKind Kind) {
+ assert(EnableImportCallOptimization);
+
+ MCSymbol *CallSiteSymbol = MMI->getContext().createNamedTempSymbol("impcall");
+ OutStreamer->emitLabel(CallSiteSymbol);
+
+ SectionToImportedFunctionCalls[OutStreamer->getCurrentSectionOnly()]
+ .push_back({CallSiteSymbol, Kind});
+}
+
+void X86AsmPrinter::ensureRaxUsedForOperand(MCInst &TmpInst) {
----------------
efriedma-quic wrote:
This seems like a weird way to handle this... why not use a call pseudo-instruction that constrains the input register, so the rest of the compiler is aware of what's happening here?
What happens if a parameter needs to be in RAX? That shouldn't happen for the C calling convention, but it can happen for alternative calling conventions.
https://github.com/llvm/llvm-project/pull/126631
More information about the llvm-commits
mailing list