]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Assume DW_AT_decl_line is unsigned
authorTom Tromey <tromey@adacore.com>
Thu, 6 Feb 2025 17:49:16 +0000 (10:49 -0700)
committerTom Tromey <tromey@adacore.com>
Tue, 18 Mar 2025 18:40:58 +0000 (12:40 -0600)
This changes read_decl_line and new_symbol to assume that
DW_AT_decl_line should refer to an unsigned value.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
gdb/dwarf2/read.c

index ab6832056dd4e7255145a04baccabff7a205841a..e5744ebac9c823b991aa2d454f0e848152977183 100644 (file)
@@ -5947,17 +5947,14 @@ read_decl_line (struct die_info *die, struct dwarf2_cu *cu)
   struct attribute *decl_line = dwarf2_attr (die, DW_AT_decl_line, cu);
   if (decl_line == nullptr)
     return 0;
-  if (decl_line->form_is_constant ())
-    {
-      LONGEST val = decl_line->constant_value (0);
-      if (0 <= val && val <= UINT_MAX)
-       return (unsigned int) val;
 
+  std::optional<ULONGEST> val = decl_line->unsigned_constant ();
+  if (val.has_value ())
+    {
+      if (*val <= UINT_MAX)
+       return (unsigned int) *val;
       complaint (_("Declared line for using directive is too large"));
-      return 0;
     }
-
-  complaint (_("Declared line for using directive is of incorrect format"));
   return 0;
 }
 
@@ -17001,7 +16998,7 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu,
                          inlined_func ? DW_AT_call_line : DW_AT_decl_line,
                          cu);
       if (attr != nullptr)
-       sym->set_line (attr->constant_value (0));
+       sym->set_line (attr->unsigned_constant ().value_or (0));
 
       struct dwarf2_cu *file_cu = cu;
       attr = dwarf2_attr (die,