Mehrdad Niknami
2013-Nov-04 03:08 UTC
[LLVMdev] Implementing an llvm.setreturnaddress intrinsic
Hi,
I've been having some trouble implementing a new intrinsic for LLVM and I
was wondering if someone might know the answer.
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:
def int_setreturnaddress : Intrinsic<[], [llvm_i32_ty, llvm_ptr_ty],
[]>;
And I'm using it as follows:
B.CreateCall2(
Intrinsic::getDeclaration(M, Intrinsic::setreturnaddress),
ConstantInt::get(Type::getInt32Ty(RI->getContext()), 0),
B.CreateIntToPtr(ConstantInt::get(IntPtrTy, 0 /* testing */)),
RA->getReturnType()));
The problem I'm facing is that for some reason, my following line inside
X86TargetLowering::LowerOperation is never getting called:
case ISD::SETRETURNADDR: return LowerSETRETURNADDR(Op, DAG);
This is despite the fact that I can confirm the following line inside
SelectionDAGBuilder::visitIntrinsicCall *is* getting called:
case Intrinsic::setreturnaddress:
setValue(&I, DAG.getNode(ISD::SETRETURNADDR, sdl,
TLI->getPointerTy(),
getValue(I.getArgOperand(0)),
getValue(I.getArgOperand(1))));
return 0;
My best guess is that my code is being optimized out -- but I'm not sure
where or why.
Does anyone know why this might be happening?
Thank you!
Mehrdad
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20131103/0ceafed6/attachment.html>
