Michael137 wrote:

> @Michael137, probably we should return finding and adding specialization in 
> DWARFASTParserClang.cpp?

That would be equivalent to the way your current version handles this right? I 
don't see how that would change anything.

I now realize this is trickier than expected. E.g., the infinite recursion 
actually reproduces with valid DWARF. Consider:
```
template <typename T> struct Foo;

template <> struct Foo<__bf16> {};

template <> struct Foo<_Float16> : Foo<__bf16> {};

int main() {
  Foo<_Float16> f1;
  return 0;
}
```

This will crash:
```
clang++ main.cpp -g
lldb a.out -o "br se -p return -X main" -o run -o "expr f1"
```

I haven't stepped through LLDB in this case but what I suspect is happening is 
that `__bf16` and `_Float16` both are floating point types with the same 
bit-size we just pretend they both are `__fp16` (via 
`GetBuiltinTypeForEncodingAndBitSize` most likely). So we have the same issue 
as your malformed DWARF case where a template specialization derives from 
another specialization but in the AST that LLDB creates the base specialization 
has the same template parameter types as the derived class.

There are some defensive checks against creating duplicate decls which relies 
on typenames: 
https://github.com/llvm/llvm-project/blob/39572f5e9168b1b44c2f9078494616fed8752086/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp#L1934-L1944

However, in my reproducer it doesn't work because in DWARF the typenames differ:
```
                DW_AT_name      ("Foo<_Float16>")
...
                DW_AT_name      ("Foo<__bf16>")
```
It's just that in the LLDB AST, the template parameter types don't match what 
we encoded in the structure's name in DWARF.

My first instinct is that we might need to adjust the heuristics of the 
`GetUniqueDWARFASTTypeMap` to account for this. But I haven't thought this 
through enough to know whether this is possible/desirable.

https://github.com/llvm/llvm-project/pull/154123
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to