Index: llvm/include/llvm/CodeGen/MachineFunction.h =================================================================== --- llvm/include/llvm/CodeGen/MachineFunction.h +++ llvm/include/llvm/CodeGen/MachineFunction.h @@ -429,6 +429,17 @@ using CallSiteInfo = SmallVector; using CallSiteInfoImpl = SmallVectorImpl; + struct ArgStackOffsetPair { + uint64_t Offset; + uint16_t ArgNo; + ArgStackOffsetPair(unsigned O, unsigned Arg) : Offset(O), ArgNo(Arg) { + assert(Arg < (1 << 16) && "Arg out of range"); + } + }; + /// Vector of call argument and its forwarding stack offset. + using CallSiteInfoStackFwd = SmallVector; + using CallSiteInfoStackFwdImpl = SmallVectorImpl; + private: Delegate *TheDelegate = nullptr; GISelChangeObserver *Observer = nullptr; @@ -437,6 +448,12 @@ /// Map a call instruction to call site arguments forwarding info. CallSiteInfoMap CallSitesInfo; + using CallSiteInfoStackFwdMap = + DenseMap; + + /// Map a call instruction to call site arguments stack forwarding info. + CallSiteInfoStackFwdMap CallSitesInfoStackFwd; + /// A helper function that returns call site info for a give call /// instruction if debug entry value support is enabled. CallSiteInfoMap::iterator getCallSiteInfo(const MachineInstr *MI); @@ -1208,6 +1225,20 @@ return CallSitesInfo; } + /// Start tracking the arguments passed on the stack to the call \p CallI. + void addCallArgsForwardingStackOffsets(const MachineInstr *CallI, + CallSiteInfoStackFwdImpl &&CallInfo) { + assert(CallI->isCandidateForCallSiteEntry()); + bool Inserted = + CallSitesInfoStackFwd.try_emplace(CallI, std::move(CallInfo)).second; + (void)Inserted; + assert(Inserted && "Call site info not unique"); + } + + const CallSiteInfoStackFwdMap &getCallSitesInfoStackFwd() const { + return CallSitesInfoStackFwd; + } + /// Following functions update call site info. They should be called before /// removing, replacing or copying call instruction. Index: llvm/include/llvm/CodeGen/SelectionDAG.h =================================================================== --- llvm/include/llvm/CodeGen/SelectionDAG.h +++ llvm/include/llvm/CodeGen/SelectionDAG.h @@ -268,6 +268,11 @@ using CallSiteInfo = MachineFunction::CallSiteInfo; using CallSiteInfoImpl = MachineFunction::CallSiteInfoImpl; + using CallSiteInfoStackFwd = MachineFunction::CallSiteInfoStackFwd; + using CallSiteInfoStackFwdImpl = MachineFunction::CallSiteInfoStackFwdImpl; + + DenseMap SDCallSiteInfoStackFwd; + struct CallSiteDbgInfo { CallSiteInfo CSInfo; MDNode *HeapAllocSite = nullptr; @@ -2051,6 +2056,18 @@ return CallSiteInfo(); } + void addCallSiteInfoStackFwd(const SDNode *CallNode, + CallSiteInfoStackFwdImpl &&CallInfo) { + SDCallSiteInfoStackFwd[CallNode] = std::move(CallInfo); + } + + CallSiteInfoStackFwd getSDCallSiteInfoStackFwd(const SDNode *CallNode) { + auto I = SDCallSiteInfoStackFwd.find(CallNode); + if (I != SDCallSiteInfoStackFwd.end()) + return std::move(I->second); + return CallSiteInfoStackFwd(); + } + void addHeapAllocSite(const SDNode *Node, MDNode *MD) { SDCallSiteDbgInfo[Node].HeapAllocSite = MD; } Index: llvm/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp =================================================================== --- llvm/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp +++ llvm/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp @@ -883,8 +883,11 @@ } if (MI->isCandidateForCallSiteEntry() && - DAG->getTarget().Options.EmitCallSiteInfo) + DAG->getTarget().Options.EmitCallSiteInfo) { MF.addCallArgsForwardingRegs(MI, DAG->getSDCallSiteInfo(Node)); + MF.addCallArgsForwardingStackOffsets( + MI, DAG->getSDCallSiteInfoStackFwd(Node)); + } if (DAG->getNoMergeSiteInfo(Node)) { MI->setFlag(MachineInstr::MIFlag::NoMerge);