[llvm] [DebugInfo] Lower DW_OP_LLVM_implicit_pointer to DWARF (PR #186763)
Shivam Kunwar via llvm-commits
llvm-commits at lists.llvm.org
Wed Mar 25 22:06:23 PDT 2026
================
@@ -776,8 +776,125 @@ DIE *DwarfCompileUnit::constructVariableDIE(DbgVariable &DV, bool Abstract) {
return VariableDie;
}
+static const DIType *resolveTypeQualifiers(const DIType *Ty) {
+ while (const auto *DT = dyn_cast_or_null<DIDerivedType>(Ty)) {
+ switch (DT->getTag()) {
+ case dwarf::DW_TAG_typedef:
+ case dwarf::DW_TAG_const_type:
+ case dwarf::DW_TAG_volatile_type:
+ case dwarf::DW_TAG_restrict_type:
+ case dwarf::DW_TAG_atomic_type:
+ Ty = DT->getBaseType();
+ continue;
+ default:
+ return Ty;
+ }
+ }
+ return Ty;
+}
+
+bool DwarfCompileUnit::emitImplicitPointerLocation(const Loc::Single &Single,
+ const DbgVariable &DV,
+ DIE &VariableDie) {
+ const auto *Expr = Single.getExpr();
+ if (!Expr)
+ return false;
+
+ // Only handle the simple case where DW_OP_LLVM_implicit_pointer is the
+ // sole operation (or followed only by DW_OP_LLVM_fragment).
+ //
+ // Multi-level implicit pointers (e.g., int **pp where both levels are
+ // optimized away) would require stacking multiple implicit_pointer ops
+ // in one expression and unwinding them into a chain of artificial DIEs.
+ // This is left for future work.
+ //
+ // Location list support (Loc::Multi) is not yet handled.
+ auto ExprOps = Expr->expr_ops();
+ auto FirstOp = ExprOps.begin();
+ if (FirstOp == ExprOps.end() ||
+ FirstOp->getOp() != dwarf::DW_OP_LLVM_implicit_pointer)
+ return false;
+
+ if (DD->getDwarfVersion() < 4)
+ return false;
+
+ const auto &DVal = Single.getValueLoc();
+ if (DVal.isVariadic())
+ return false;
+
+ const auto &Entry = DVal.getLocEntries()[0];
----------------
phyBrackets wrote:
Yes, non-variadic values always have exactly one entry. The isVariadic() check above guarantees this. Added an assert to make it explicit.
https://github.com/llvm/llvm-project/pull/186763
More information about the llvm-commits
mailing list