<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Nov 30, 2015 at 7:13 PM, Gao, Yunzhong 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:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Hi,<br>
I am trying to understand what should be the expected behavior of __builtin_return_address(0)<br>
when inlining has happened.<br>
<br>
So, the GCC doc from <a href="https://gcc.gnu.org/onlinedocs/gcc/Return-Address.html" rel="noreferrer" target="_blank">https://gcc.gnu.org/onlinedocs/gcc/Return-Address.html</a> says:<br>
(I used GCC doc because I could not find equivalent Clang/LLVM builtin doc)<br>
  When inlining the expected behavior is that the function returns the address of the function<br>
  that is returned to. To work around this behavior use the noinline function attribute.<br>
<br>
I wrote the following test case to verify this behavior:<br>
  /* test.c */<br>
  long foo() {<br>
    return (long)__builtin_return_address(0);<br>
  }<br>
  inline long bar() {<br>
    return foo();<br>
  }<br>
  long foobar() {<br>
    return bar();<br>
  }<br>
  /* end test.c */<br>
<br>
My interpretation of the GCC doc is that, if foo() is inlined into bar(), then __builtin_return_address(0)<br>
will return &bar, instead of the instruction address of the call to foo().<br></blockquote><div><br></div><div>I think the wording "the function that is returned to" is referring to the function that is dynamically returned to, not anything at source level. It's more like "if you were to say `asm("ret")`, where would you return to"</div><div><br></div><div>Also see: See <a href="http://llvm.org/docs/LangRef.html#llvm-returnaddress-intrinsic">http://llvm.org/docs/LangRef.html#llvm-returnaddress-intrinsic</a><div><br></div><div>The "current function" is pretty much "whatever the backend sees". That seems like the only reasonable way to define it.</div><div><br></div><div>-- Sean Silva</div></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<br>
I compiled with GCC 4.8.2 and Clang 3.8.0, and I got the following result:<br>
<br>
  # clang 3.8.0 trunk 253253<br>
  # clang -S -O2 test.c<br>
  foo:<br>
    movq    (%rsp), %rax<br>
    retq<br>
  foobar:<br>
    movq    (%rsp), %rax<br>
    retq<br>
  # end assembly<br>
<br>
  # GCC 4.8.2-19ubuntu1<br>
  # gcc -S -O2 test.c<br>
  foo:<br>
    movq    (%rsp), %rax<br>
    ret<br>
  bar:<br>
    movq    (%rsp), %rax<br>
    ret<br>
  foobar:<br>
    movq    (%rsp), %rax<br>
    ret<br>
  # end assembly<br>
<br>
So with both compilers, an inlined __builtin_return_address(0) seems to produce the return address of the<br>
function containing the callsite where the inlined function is expanded.<br>
<br>
Maybe I misunderstood the documentation regarding the inlined __builtin_return_address()? Please help,<br>
<br>
- Gao<br>
_______________________________________________<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/mailman/listinfo/llvm-dev</a><br>
</blockquote></div><br></div></div>