I could be wrong here, but AFAICT, the implementation is allowed to elide initialisation/allocation if it can prove that the allocation is not observable. In this case, I would look at the generated IR and whether the call to ‘new’ turns into a ‘malloc’ that gets elided later. -O0 and/or other optimisation levels might do different things too.<br><br>If you change this to return the pointer and print it, do you get the destructor code-gen’ed?<br><div class="gmail_quote"><div dir="ltr">On Wed, 2 May 2018 at 4:40 pm, Keith Wyss via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hmmm... It seems like I should check out how the UseList on Value (and its child BasicBlock) work.</div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, May 1, 2018 at 8:34 PM, Keith Wyss <span dir="ltr"><<a href="mailto:wyssman@gmail.com" target="_blank">wyssman@gmail.com</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">Hi,<div><br></div><div>I'm trying to understand how clang keeps track of which declarations are called within a translation unit and decides to codegen their definitions.</div><div><br></div><div>DeclBase.h has a markUsed to keep track of ODR use, and I think that the decl can be found from the symbol table via ASTContext.h (for example looking up a template via GetQualifiedTemplateName -> getAsTemplateDecl -> setIsUsed ). This is just a result of fumbling around in the dark, I could be totally wrong.</div><div><br></div><div>I'd like to know what part of the system is responsible for tracking usage, and whether that's the same mechanism that decides whether to CodeGen basic blocks with function definitions.</div><div><br></div><div>Particularly, I'm curious about how the decision should be made whether to emit a definition for a destructor that it is only called in a cleanup block that's only invoked during unwinding. I don't actually understand how or whether the control flow for unwinding is expressed in the AST at all. I can't see anything related to unwinding control flow with -ast-dump for instance.</div><div><br></div><div>I've been spending some time debugging a particular test program at <a href="https://bugs.llvm.org/show_bug.cgi?id=33778" target="_blank">bug 33778</a> that fails to link because a block only referenced from an LSDA contains a call instruction to a destructor that has no generated definition. I'm hitting a wall because I'm pretty ignorant of the structure of the codebase and any guidance would be appreciated.</div><div><br></div><div>Any general guidance or documentation to help find my way around clang would be awesome too.</div><div><br></div><div>Thanks,</div><div>Keith</div><div><br></div><div>P.S. The program that doesn't link without -fno-exceptions:</div><div><br></div><div>#include <functional></div><div><br></div><div>struct X {</div><div>   std::function<int()> F;</div><div>   std::function<int()> G;</div><div>};</div><div><br></div><div>void foo(const std::function<int()>& a) {</div><div>   new X{a, a};</div><div>}</div><div><br></div><div>int main() {</div><div>  return 0;</div><div>}</div></div>
</blockquote></div><br></div>
_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">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 dir="ltr" class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr">-- Dean</div></div>