<div dir="ltr">Hi,
<div><br></div><div>I've been having some trouble implementing a new intrinsic for LLVM and I was wondering if someone might know the answer.</div><div><br></div><div><div>LLVM has an llvm.returnaddress intrinsic, but for a specific project, I need to be able to modify the return address of a function as well, so I'm implementing a new intrinsic:</div>


<div><font face="courier new, monospace">def int_setreturnaddress     : Intrinsic<[], [llvm_i32_ty, llvm_ptr_ty], []>;</font><br></div><div><br></div><div>And I'm using it as follows:</div><div><div><font face="courier new, monospace">B.CreateCall2(</font></div>


<div><font face="courier new, monospace">  Intrinsic::getDeclaration(M, Intrinsic::setreturnaddress),</font></div><div><font face="courier new, monospace">  ConstantInt::get(Type::getInt32Ty(RI->getContext()), 0),</font></div>


<div><font face="courier new, monospace">  B.CreateIntToPtr(</font><span style="font-family:'courier new',monospace">ConstantInt::get(IntPtrTy, 0 /* testing */)</span><span style="font-family:'courier new',monospace">), </span><span style="font-family:'courier new',monospace">RA->getReturnType()));</span></div>


</div><div><br></div><div>The problem I'm facing is that for some reason, my following line inside <font face="courier new, monospace">X86TargetLowering::LowerOperation</font> is never getting called:<br></div><div><font face="courier new, monospace">case ISD::SETRETURNADDR:      return LowerSETRETURNADDR(Op, DAG);</font><br>


</div><div><br></div><div>This is despite the fact that I can confirm the following line inside <font face="courier new, monospace">SelectionDAGBuilder::visitIntrinsicCall</font> <b>is</b> getting called:</div><div><div>

<font face="courier new, monospace">case Intrinsic::setreturnaddress:</font></div>
<div><font face="courier new, monospace">    setValue(&I, DAG.getNode(ISD::SETRETURNADDR, sdl, TLI->getPointerTy(),</font></div><div><font face="courier new, monospace">                             getValue(I.getArgOperand(0)),</font></div>


<div><font face="courier new, monospace">                             getValue(I.getArgOperand(1))));</font></div></div><div><font face="courier new, monospace">    return 0;</font></div><div><br></div><div>My best guess is that my code is being optimized out -- but I'm not sure where or why.</div>


</div><div><br></div><div>Does anyone know why this might be happening?</div><div><br></div><div>Thank you!<br>Mehrdad</div></div>