dblaikie added a comment.

In D123319#3506745 <https://reviews.llvm.org/D123319#3506745>, @shafik wrote:

>> Any update/further details here?
>
> David, apologies for not getting back to you sooner. The context is D105564 
> <https://reviews.llvm.org/D105564> which I started working on again recently. 
> I was having difficulties finding a solution that also worked for local 
> lambdas.

But what I don't understand is what makes local lambdas special. You can 
produce the same DWARF (so far as I can think of - maybe there's some 
distinction I'm missing?) without lambdas:

  void f1() {
    auto x = [](){ return 3; };
    x();
  }
  void f2() {
    struct t1 {
      auto operator()() {
        return 3;
      }
    };
    t1 v1;
    v1();
  }

  $ clang++-tot test.cpp -g -c && llvm-dwarfdump-tot test.o | grep 
"DW_TAG\|DW_AT_type\|DW_AT_name" | sed -e "s/^...........//"
  ...
     DW_TAG_subprogram
       DW_AT_name ("f1")
       DW_TAG_variable
         DW_AT_name       ("x")
         DW_AT_type       (0x0000003a "class ")
       DW_TAG_class_type
         DW_TAG_subprogram
           DW_AT_name     ("operator()")
           DW_AT_type     (0x00000050 "int")
           DW_TAG_formal_parameter
             DW_AT_type   (0x00000054 "const class  *")
  ...
     DW_TAG_subprogram
       DW_AT_specification        (0x0000003f "operator()")
       DW_TAG_formal_parameter
         DW_AT_name       ("this")
         DW_AT_type       (0x000000cc "const class  *")
     DW_TAG_subprogram
       DW_AT_name ("f2")
       DW_TAG_variable
         DW_AT_name       ("v1")
         DW_AT_type       (0x00000090 "t1")
       DW_TAG_structure_type
         DW_AT_name       ("t1")
         DW_TAG_subprogram
           DW_AT_name     ("operator()")
           DW_AT_type     (0x000000a6 "auto")
           DW_TAG_formal_parameter
             DW_AT_type   (0x000000a8 "t1 *")
     DW_TAG_subprogram
       DW_AT_type (0x00000050 "int")
       DW_AT_specification        (0x00000096 "operator()")
       DW_TAG_formal_parameter
         DW_AT_name       ("this")
         DW_AT_type       (0x000000d1 "t1 *")
     DW_TAG_pointer_type
       DW_AT_type (0x00000059 "const class ")
     DW_TAG_pointer_type
       DW_AT_type (0x00000090 "t1")

So if there's particularly an issue with lambdas, it's probably also with the 
above local type example.

> I discovered eventually that what I had worked with debug-info that gcc 
> generated

Yep, at least testing GCC 11 just now - it seems GCC doesn't use "auto" for 
local types, be they named or unnamed.

> and realized that gcc was not emitting `auto` for lambdas and decided to 
> match gcc's behavior here since we often do that.

I think that's only a really sound argument when it's GDB 
compatibility/somewhat outside our control on the consumer side. I'm not sure 
there's a good argument for doing this for lldb when we can fix lldb to handle 
the right DWARF instead.

> I think an alternative approach would have been to emit `DW_AT_linkage_name` 
> for local lambdas but when I dug into that it looked like we were dropping 
> the linkage name several step before where would emit `DW_AT_linkage_name` 
> and it was not clear to me how easy a fix that was.

What does the linkage name do for your use case? Which cases are missing 
linkage names/where do they go missing?

> I am happy to consider other approaches as well to solving lookup for local 
> lambdas for D105564 <https://reviews.llvm.org/D105564>. Let me know what you 
> think.

Why does the return type help perform lookup? What kind of lookup?

(again, my take is that "auto" return types probably shouldn't be described at 
all - we should just not describe functions where we don't know their return 
types because they're not very useful to know about (overload resolution, yes, 
but then you can't call them anyway) - but that's a broader argument to 
make/change to make)


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