<div dir="ltr"><div dir="ltr">On Thu, 23 Jul 2020 at 17:46, David Blaikie <<a href="mailto:dblaikie@gmail.com">dblaikie@gmail.com</a>> wrote:<br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">LLVM can produce zero length functions from cases like this (when<br>
optimizations are enabled):<br>
<br>
void f1() { __builtin_unreachable(); }<br>
int f2() { /* missing return statement */ }<br>
<br>
This code is valid, so long as the functions are never called.<br>
<br>
I believe C++ requires that all functions have a distinct address (ie:<br>
&f1 != &f2) and LLVM optimizes code on this basis (assert(f1 == f2)<br>
gets optimized into an unconditional assertion failure)<br>
<br>
But these zero length functions can end up with identical addresses.<br>
<br>
I'm unaware of anything in the C++ spec (or the LLVM langref) that<br>
would indicate that would allow distinct functions to have identical<br>
addresses - so should we do something about this in the LLVM backend?<br>
add a little padding? a nop instruction? (if we're adding an<br>
instruction anyway, perhaps we might as well make it an int3?)<br>
<br>
(I came across this due to DWARF issues with zero length functions &<br>
thinking about if/how this should be supported)<br></blockquote><div><br></div><div>Yes, I think at least if the optimizer turns a non-empty function into an empty function, that's a miscompile for C and C++ source-language programs. My (possibly flawed) understanding is that LLVM is obliged to give a different address to distinct globals if neither of them is marked unnamed_addr, so it seems to me that this is a backend bug. Generating a ud2 function body in this case seems ideal to me.</div></div></div>