dblaikie added a comment.

('scuse the delay)

Baseline: I'm still not really sure this is the right direction. Is there a 
sound argument for why this change is suitable for lambdas, but not for other 
types? I believe all the situations that can happen with other types can happen 
with lambdas (& the other way around) with sufficiently interestingly crafted 
inputs.

In D123319#3439146 <https://reviews.llvm.org/D123319#3439146>, @probinson wrote:

> In D123319#3437250 <https://reviews.llvm.org/D123319#3437250>, @dblaikie 
> wrote:
>
>> (@probinson as someone I've disagreed with about this before)
>>
>> Personally I think there's limited value in expressing 'auto' in DWARF at 
>> all - we could omit function declarations if the return type is not known 
>> (undeduced auto) and wouldn't lose much - basically treating them the same 
>> as templates that aren't instantiated yet.
>
> The problem there is that then the CU where the function is defined is the 
> only one where the type description would include that function; and if we 
> are doing e.g. ctor homing, and that CU doesn't happen to construct any 
> instances, then the function will still exist but not be described anywhere.

Type homing in the non-homed CUs works more like how your private Sony 
minimizing feature works - the member functions are included in those 
translation units where they're defined (eg: if you have a type homed in one 
CU, but a member function template instantiated in another - you get a 
declaration of the type with a member function declared over in that second CU) 
- so it is described.

> If you're not doing ctor homing, then only one CU's description will mention 
> the auto function; so, whether the debugger knows about the auto function 
> will randomly depend on which CU's description the debugger decided to keep.

True - though in CUs without the definition of the function instantiated - it's 
of limited value to know the function exists. Unlike an uninstantiated member 
function template (which we just can't adequately describe in DWARF), at least 
knowing the auto-returning function exists, what it's name is, and what its 
parameters are - would allow a consumer to include it when performing overload 
resolution. But once resolved, the consumer couldn't produce a call to the 
function - without knowing the return type you couldn't implement the necessary 
calling convention (eg: it could depend on whether the type is non-trivially 
copyable, which you couldn't know).

> I do understand the analogy to templates.  The difference I see is that DWARF 
> actually has a way to describe auto function declarations, where it does not 
> have a way to describe template declarations.

Describing a function without its return type limits the value - not zero 
value, but not hugely valuable either.

(whereas a function where you know the return type (and the parameters) you 
might be able to determine the mangled name of the function and produce a valid 
call to the function - even if the function's definition has no DWARF)

>> (& I believe Sony does this for all functions anyway - only including them 
>> when they're defined, not including an exhaustive list of member functions 
>> in class definitions)
>
> We have a private feature that (if you're not doing something like ctor 
> homing, or using type units) will suppress mention of _unused_ functions, 
> which works for us because our debugger will merge type descriptions from 
> different units.  Most debuggers don't do that, generally keeping just 
> whichever one they found first, and assuming the rest are duplicates.  
> Including auto functions only when defined means the various descriptions 
> aren't actually duplicates, and so the debugger will randomly know or not 
> know about the function depending on which description it picks.
>
> It's true that omitting auto function declarations wouldn't affect Sony 
> because we know how to merge descriptions anyway, but OTOH we never 
> upstreamed the suppress-unused-declarations feature because AFAIK no other 
> debugger understands how to handle the situation.  Deliberately introducing 
> omitted declarations seems kinda wrong.  With templates we don't have a 
> choice, but with auto functions we do.
>
> I mean, if you're willing to omit auto functions, why wouldn't you be willing 
> to omit other unused functions?  The argument that "we don't know the whole 
> type" seems a bit weak, given that DWARF gives you a way to describe what's 
> missing.

I think the major difference is a consumer can call a function if it knows the 
whole signature, it can't if it doesn't know the return value. (at least on any 
ABI I can think of - maybe there are some ABIs where not knowing the return 
type would still be viable to call)


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D123319/new/

https://reviews.llvm.org/D123319

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to