<div dir="ltr">Is it enough to compute the set of all possible return addresses, or do you need to limit the set to only C++ method calls? If you just need the full set of return addresses for a given DSO, I'd recommend disassembling the object after linking, scraping the output for "callq" instructions, and taking the address of the next instruction. This will give you the return address "VA" (I think, in ELF parlance), which is the address of the instruction assuming the ELF binary is loaded at the address listed in its program headers. You can compute the possible return addresses at runtime by adding the difference between the on-disk p_vaddr values and the actual addresses that the loader used at runtime. You can probably discover the load addresses with dl_iterate_phdr.<div><br></div><div>If you need only some specific annotated list of return addresses, you will probably have to make complicated changes to LLVM that insert labels after certain CALL instructions and emit some object file section with relocations against those labels. This is doable but complicated. You can follow the EH label machinery to see how to insert labels into the instruction stream and create relocations against them from read-only data sections.</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Jul 5, 2017 at 9:22 AM, Paul Muntean via llvm-dev <span dir="ltr"><<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="m_-4400195901339444270gmail_signature"><div dir="ltr"><div><span style="font-family:Arial,Helvetica,sans-serif;font-size:13px">Hi guys,</span><p style="margin:1em 0px;padding:0px;border:0px;line-height:normal;font-family:Arial,Helvetica,sans-serif;font-size:13px">maybe you can help with an issue which I have.</p><p style="margin:1em 0px;padding:0px;border:0px;line-height:normal;font-family:Arial,Helvetica,sans-serif;font-size:13px">I want to recuperate for a C++ program compiled with Clang/LLVM on an<br>Ubuntu CPU x86_64 bit architecture all the addresses of the call<br>instructions (C++ object dispatches) or directly the return address<br>which are just the next address after a call instruction.</p><p style="margin:1em 0px;padding:0px;border:0px;line-height:normal;font-family:Arial,Helvetica,sans-serif;font-size:13px">I think that this information is not obtainable during link time since<br>we have at that moment only IR code. Please corect me if I am wrong.<br>So my assumption is that in the compiler back end after the IR code is<br>lowered to machine code and the addresses for the call instructions<br>and the addresses next to the call instructions are available.</p><p style="margin:1em 0px;padding:0px;border:0px;line-height:normal;font-family:Arial,Helvetica,sans-serif;font-size:13px">Has anybody a suggestion where are the possible places in the compiler<br>where I should look for?</p><p style="margin:1em 0px;padding:0px;border:0px;line-height:normal;font-family:Arial,Helvetica,sans-serif;font-size:13px">Since I am new to this topic suggestions or solutions are highly welcome.</p><span class="HOEnZb"><font color="#888888"><p style="margin:1em 0px;padding:0px;border:0px;line-height:normal;font-family:Arial,Helvetica,sans-serif;font-size:13px">-Paul</p><div><div><div><div><div></div></div></div></div></div></font></span></div></div></div>
</div>
<br>______________________________<wbr>_________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-dev</a><br>
<br></blockquote></div><br></div>