[llvm-dev] Generating function definition for function that's only called during unwinding
Friedman, Eli via llvm-dev
llvm-dev at lists.llvm.org
Wed May 2 11:50:19 PDT 2018
You're probably barking up the wrong tree; the problem has nothing to do
with code generation. Consider the following testcase:
template<typename T> struct Z {
T t;
Z(const Z&) { throw 1; }
~Z() { *t = 10; }
};
struct X {
Z<int> x;
Z<int> y;
};
void foo(Z<int>& a) {
new X{a, a};
}
This should emit an error because "t" can't be dereferenced. gcc
correctly the error; clang doesn't.
Not exactly sure why the destructor doesn't get marked odr-used, but I'd
start with Sema::BuildCXXNew.
-Eli
On 5/1/2018 11:40 PM, Keith Wyss via llvm-dev wrote:
> Hmmm... It seems like I should check out how the UseList on Value (and
> its child BasicBlock) work.
>
> On Tue, May 1, 2018 at 8:34 PM, Keith Wyss <wyssman at gmail.com
> <mailto:wyssman at gmail.com>> wrote:
>
> Hi,
>
> I'm trying to understand how clang keeps track of which
> declarations are called within a translation unit and decides to
> codegen their definitions.
>
> 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.
>
> 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.
>
> 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.
>
> I've been spending some time debugging a particular test program
> at bug 33778 <https://bugs.llvm.org/show_bug.cgi?id=33778> 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.
>
> Any general guidance or documentation to help find my way around
> clang would be awesome too.
>
> Thanks,
> Keith
>
> P.S. The program that doesn't link without -fno-exceptions:
>
> #include <functional>
>
> struct X {
> std::function<int()> F;
> std::function<int()> G;
> };
>
> void foo(const std::function<int()>& a) {
> new X{a, a};
> }
>
> int main() {
> return 0;
> }
>
>
>
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
--
Employee of Qualcomm Innovation Center, Inc.
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20180502/fd29e58d/attachment.html>
More information about the llvm-dev
mailing list