<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>