/// Extract call from statepoint, lower it and return pointer to the /// call node. Also update NodeMap so that getValue(statepoint) will /// reference lowered call result static std::pair<SDValue, SDNode *> lowerCallFromStatepointLoweringInfo( SelectionDAGBuilder::StatepointLoweringInfo &SI, SelectionDAGBuilder &Builder, SmallVectorImpl<SDValue> &PendingExports) { SDValue ReturnValue, CallEndVal; std::tie(ReturnValue, CallEndVal) = Builder.lowerInvokable(SI.CLI, SI.EHPadBB); SDNode *CallEnd = CallEndVal.getNode(); // Get a call instruction from the call sequence chain. Tail calls are not // allowed. The following code is essentially reverse engineering X86's // LowerCallTo. // // We are expecting DAG to have the following form: // // ch = eh_label (only in case of invoke statepoint) // ch, glue = callseq_start ch // ch, glue = X86::Call ch, glue // ch, glue = callseq_end ch, glue // get_return_value ch, glue // // get_return_value can either be a sequence of CopyFromReg instructions // to grab the return value from the return register(s), or it can be a LOAD // to load a value returned by reference via a stack slot. bool HasDef = !SI.CLI.RetTy->isVoidTy(); if (HasDef) { if (CallEnd->getOpcode() == ISD::LOAD) CallEnd = CallEnd->getOperand(0).getNode(); else while (CallEnd->getOpcode() == ISD::CopyFromReg) CallEnd = CallEnd->getOperand(0).getNode(); } assert(CallEnd->getOpcode() == ISD::CALLSEQ_END && "expected!"); return std::make_pair(ReturnValue, CallEnd->getOperand(0).getNode()); }