[llvm] [llvm][dsymutil] Use the DW_AT_name of the uniqued DIE for insertion into .debug_names (PR #168513)
Michael Buch via llvm-commits
llvm-commits at lists.llvm.org
Sun Nov 23 06:41:57 PST 2025
================
@@ -151,22 +151,84 @@ static bool isTypeTag(uint16_t Tag) {
return false;
}
-bool DWARFLinker::DIECloner::getDIENames(const DWARFDie &Die,
- AttributesInfo &Info,
- OffsetsStringPool &StringPool,
- bool StripTemplate) {
+/// Recurse through the input DIE's canonical references until we find a
+/// DW_AT_name.
+llvm::StringRef
+DWARFLinker::DIECloner::getCanonicalDIEName(DWARFDie Die, const DWARFFile &File,
+ CompileUnit *Unit) {
+ if (!Die)
+ return {};
+
+ std::optional<DWARFFormValue> Ref;
+
+ auto GetDieName = [](const DWARFDie &D) -> llvm::StringRef {
+ auto NameForm = D.find(llvm::dwarf::DW_AT_name);
+ if (!NameForm)
+ return {};
+
+ auto NameOrErr = NameForm->getAsCString();
+ if (!NameOrErr) {
+ llvm::consumeError(NameOrErr.takeError());
+ return {};
+ }
+
+ return *NameOrErr;
+ };
+
+ llvm::StringRef Name = GetDieName(Die);
+ if (!Name.empty())
+ return Name;
+
+ while (true) {
+ if (!(Ref = Die.find(llvm::dwarf::DW_AT_specification)) &&
+ !(Ref = Die.find(llvm::dwarf::DW_AT_abstract_origin)))
+ break;
+
+ Die = Linker.resolveDIEReference(File, CompileUnits, *Ref, Die, Unit);
+ if (!Die)
+ break;
+
+ assert(Unit);
----------------
Michael137 wrote:
It's always valid if the returned `Die` is valid (which we check right beforehand). Might be misunderstanding your suggestion, but we can't hoist any of this out of the loop because both `Die` and `Unit` get set by the `Linker.resolveDIEReference` (note, `Unit` is an output parameter).
https://github.com/llvm/llvm-project/pull/168513
More information about the llvm-commits
mailing list