<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><br class=""><div><br class=""><blockquote type="cite" class=""><div class="">On Sep 4, 2018, at 10:16 PM, PenYiWang via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" class="">llvm-dev@lists.llvm.org</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class=""><div dir="ltr" class=""><div dir="ltr" class=""><div dir="ltr" class=""><div dir="ltr" class=""><div dir="ltr" class=""><div dir="ltr" class="">Hi<div class=""><br class=""></div><div class="">I want to write a FunctionPass to insert some code before return.</div><div class=""><br class=""></div><div class="">Funcion:</div><div class="">..</div><div class="">..</div><div class="">..</div><div class="">mov eax,[esp]</div><div class="">cmp eax,0x12345678</div><div class="">je 0x12345678</div><div class="">ret</div><div class="">(maybe stack will not balance)</div><div class=""><br class=""></div><div class="">I wonder that can I get the return address at llvm ir level?</div></div></div></div></div></div></div></div></div></blockquote><div><br class=""></div><div>Short answer: You can’t </div><div><br class=""></div><div>Long answer: LLVM IR is a high level description, in comparison to assembly code, of a program.</div><div>It “tries" to describe programs in a platform-independent fashion. However, return address, even how a function pass its return data, is really platform and architecture specific. </div><div><br class=""></div><div>Nevertheless, your goal can still be achieved easily in LLVM. In your cases, just iterates over all the instructions in a Function, find the return instructions(i.e. those who are ReturnInst class instances), and insert the desired things before them.</div><div>Of course, taking care of the data dependencies and/or control dependencies when you insert instructions</div><div><br class=""></div><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div dir="ltr" class=""><div dir="ltr" class=""><div dir="ltr" class=""><div dir="ltr" class=""><div dir="ltr" class=""><div dir="ltr" class=""><div class=""><br class=""></div><div class="">I use IRBuilder to CreateICmpEQ and CreateCondBr.</div></div></div></div></div></div></div></div></div></blockquote><div><br class=""></div><div>This combination is for branches between BasicBlocks, not function returns.</div><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div dir="ltr" class=""><div dir="ltr" class=""><div dir="ltr" class=""><div dir="ltr" class=""><div dir="ltr" class=""><div dir="ltr" class=""><div class=""><br class=""></div><div class="">but I don't how to get the value of return addrss.</div><div class=""><br class=""></div><div class="">I have found there is a  Intrinsic::returnaddress.<br class=""></div><div class=""><br class=""></div><div class="">Is Intrinsic::returnaddress can help me?</div></div></div></div></div></div></div></div></div></blockquote><div><br class=""></div><div>Intrinsic functions in LLVM are usually used for special purposes. I’m certainly sure that this Intrinsic::returnaddress is not what you want. Since it won’t be generated by normal compiler frontend, and it would only place a function call in IR without invoking it and gives you return address **when you’re doing code optimizations**</div><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div dir="ltr" class=""><div dir="ltr" class=""><div dir="ltr" class=""><div dir="ltr" class=""><div dir="ltr" class=""><div dir="ltr" class=""><div class=""><br class=""></div><div class="">I don't konw how to use Intrinsic::returnaddress because few files use this intrinsic.</div></div></div></div></div></div></div></div></div></blockquote><div><br class=""></div><div>LLVM IR is neither (machine) assembly code nor something with the same role as assembly code - It's a representation for, and should only be used for compiler optimizations.</div><div>My suggestion is to read the official documents about [what is LLVM IR](<a href="https://llvm.org/docs/LangRef.html#abstract" class="">https://llvm.org/docs/LangRef.html#abstract</a> ). It’s a nice introduction and it’s not long.</div><div><br class=""></div><div>Best,</div><div>Bekket</div><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div dir="ltr" class=""><div dir="ltr" class=""><div dir="ltr" class=""><div dir="ltr" class=""><div dir="ltr" class=""><div dir="ltr" class=""><div class=""><br class=""></div><div class="">Thanks</div><div class=""><br class=""></div><div class=""><br class=""></div></div></div></div></div></div></div></div>
_______________________________________________<br class="">LLVM Developers mailing list<br class=""><a href="mailto:llvm-dev@lists.llvm.org" class="">llvm-dev@lists.llvm.org</a><br class="">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev<br class=""></div></blockquote></div><br class=""></body></html>