[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>
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.
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.
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.