[clang][DebugInfo] Emit DW_AT_type of preferred name if available
authorMichael Buch <michaelbuch12@gmail.com>
Fri, 10 Mar 2023 16:46:47 +0000 (16:46 +0000)
committerMichael Buch <michaelbuch12@gmail.com>
Fri, 7 Apr 2023 00:37:36 +0000 (01:37 +0100)
commit711a64412749ae73709562b591ab1609a3ee7751
tree8fe1a2cf9f0a9d9adb3565890d908805a1fac84e
parentb04bc87c9edca0e93330948b88292ebcde891ce2
[clang][DebugInfo] Emit DW_AT_type of preferred name if available

With this patch, whenever we emit a `DW_AT_type` for some declaration
and the type is a template class with a `clang::PreferredNameAttr`, we
will emit the typedef that the attribute refers to instead. I.e.,

```
0x123 DW_TAG_variable
        DW_AT_name "var"
        DW_AT_type (0x123 "basic_string<char>")

0x124 DW_TAG_structure_type
        DW_AT_name "basic_string<char>"
```
...becomes
```
0x123 DW_TAG_variable
        DW_AT_name "var"
        DW_AT_type (0x124 "std::string")

0x124 DW_TAG_structure_type
        DW_AT_name "basic_string<char>"

0x125 DW_TAG_typedef
        DW_AT_name "std::string"
        DW_AT_type (0x124 "basic_string<char>")
```

We do this by returning the preferred name typedef `DIType` when
we create a structure definition. In some cases, e.g., with `-gmodules`,
we don't complete the structure definition immediately but do so later
via `completeClassData`, which overwrites the `TypeCache`. In such cases
we don't actually want to rewrite the cache with the preferred name. We
handle this by returning both the definition and the preferred typedef
from `CreateTypeDefinition` and let the callee decide what to do with
it.

Essentially we set up the types as:
```
TypeCache[Record] => DICompositeType
ReplaceMap[Record] => DIDerivedType(baseType: DICompositeType)
```

For now we keep this behind LLDB tuning.

**Testing**

- Added clang unit-test
- `check-llvm`, `check-clang` pass
- Confirmed that this change correctly repoints
  `basic_string` references in some of my test programs.
- Will add follow-up LLDB API tests

Differential Revision: https://reviews.llvm.org/D145803
12 files changed:
clang/lib/CodeGen/CGDebugInfo.cpp
clang/lib/CodeGen/CGDebugInfo.h
clang/test/CodeGen/preferred_name-chain.cpp [new file with mode: 0644]
clang/test/CodeGen/preferred_name.cpp [new file with mode: 0644]
clang/test/Modules/Inputs/gmodules-preferred-name-alias.h [new file with mode: 0644]
clang/test/Modules/Inputs/gmodules-preferred-name-alias.modulemap [new file with mode: 0644]
clang/test/Modules/Inputs/gmodules-preferred-name-typedef.h [new file with mode: 0644]
clang/test/Modules/Inputs/gmodules-preferred-name-typedef.modulemap [new file with mode: 0644]
clang/test/Modules/gmodules-preferred-name-alias.cpp [new file with mode: 0644]
clang/test/Modules/gmodules-preferred-name-typedef.cpp [new file with mode: 0644]
lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/shared_ptr/TestDataFormatterLibcxxSharedPtr.py
lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/unique_ptr/TestDataFormatterLibcxxUniquePtr.py