[dsymutil] Fix linker's ODR uniquing for typedefs with different underlying types (#195749)

The classic DWARF linker's `DeclContext` uniquing for `typedef` only
considers the typedef's name, file, and line — not the type it refers
to. When two `typedef` share the same name and source location but point
to different underlying types (e.g. due to clang's `preferred_name`
attribute generating a second typedef), they get the same `DeclContext`.
ODR deduplication then merges them, which can produce incorrect type
references or self-referencing typedef cycles in the output DWARF.

The self-referencing cycles are latent until a consumer follows
`DW_AT_type` chains through typedefs.
In particular, `unwrapReferencedTypedefType()` (introduced in
[#168734](https://github.com/llvm/llvm-project/pull/168734)) caused an
infinite recursion and eventual stack overflow.

Fix this by including the `DW_AT_type` target's tag and name in the
`NameForUniquing`, such that `typedef` with different underlying types
get distinct `DeclContexts`. This mirrors the parallel linker fix in
https://github.com/llvm/llvm-project/pull/166767

Added a test for validation

[Assisted-by](https://t.ly/Dkjjk): [Claude Opus
4.6](https://www.anthropic.com/news/claude-opus-4-6)

---------

Signed-off-by: Peter Rong <PeterRong@meta.com>
2 files changed
tree: 7a7b5bcea16c96c8adf229f3f97b81faaf2f7970
  1. .ci/
  2. .github/
  3. bolt/
  4. clang/
  5. clang-tools-extra/
  6. cmake/
  7. compiler-rt/
  8. cross-project-tests/
  9. flang/
  10. flang-rt/
  11. libc/
  12. libclc/
  13. libcxx/
  14. libcxxabi/
  15. libsycl/
  16. libunwind/
  17. lld/
  18. lldb/
  19. llvm/
  20. llvm-libgcc/
  21. mlir/
  22. offload/
  23. openmp/
  24. orc-rt/
  25. polly/
  26. runtimes/
  27. third-party/
  28. utils/
  29. .clang-format
  30. .clang-format-ignore
  31. .clang-tidy
  32. .git-blame-ignore-revs
  33. .gitattributes
  34. .gitignore
  35. .mailmap
  36. CODE_OF_CONDUCT.md
  37. CONTRIBUTING.md
  38. LICENSE.TXT
  39. pyproject.toml
  40. README.md
  41. SECURITY.md
README.md

The LLVM Compiler Infrastructure

OpenSSF Scorecard OpenSSF Best Practices libc++

Welcome to the LLVM project!

This repository contains the source code for LLVM, a toolkit for the construction of highly optimized compilers, optimizers, and run-time environments.

The LLVM project has multiple components. The core of the project is itself called “LLVM”. This contains all of the tools, libraries, and header files needed to process intermediate representations and convert them into object files. Tools include an assembler, disassembler, bitcode analyzer, and bitcode optimizer.

C-like languages use the Clang frontend. This component compiles C, C++, Objective-C, and Objective-C++ code into LLVM bitcode -- and from there into object files, using LLVM.

Other components include: the libc++ C++ standard library, the LLD linker, and more.

Getting the Source Code and Building LLVM

Consult the Getting Started with LLVM page for information on building and running LLVM.

For information on how to contribute to the LLVM project, please take a look at the Contributing to LLVM guide.

Getting in touch

Join the LLVM Discourse forums, Discord chat, LLVM Office Hours or Regular sync-ups.

The LLVM project has adopted a code of conduct for participants to all modes of communication within the project.