DWARFv5: Info address command error in gdb with DWARFfv5.
authornitachra <Nitika.Achra@amd.com>
Tue, 7 Apr 2020 13:06:00 +0000 (18:36 +0530)
committerTom Tromey <tromey@adacore.com>
Tue, 7 Apr 2020 15:55:35 +0000 (09:55 -0600)
GDB throws the error 'Unrecognized DWARF opcode 0x02 at 2' when running
Info address command with the executable file compiled with -gdwarf-5 flag.
This patch fixes this error.

Tested by running the testsuite before and after the patch and there is
no increase in the number of test cases that fails. Tested with both
-gdwarf-4 and -gdwarf-5 flags. Also tested -gslit-dwarf along with
-gdwarf-4 as well as -gdwarf-5 flags. Used clang version 10.0.0.
This is the test case used-

void bar(int arr[], int l, int m, int r) {
    int i, j, k, n1= m - l + 1, n2= r - m, L[n1], R[n2];
    for (i = 0; i < n1; i++)
        L[i] = arr[l + i];
    for (j = 0; j < n2; j++)
        R[j] = arr[m + 1+ j];
}

int main()
{
    int arr[] = {12, 11};
    bar(arr,0,1,2);
    return 0;
}

clang -gdwarf-5 test.c -o test.out

gdb test.out
gdb> start
gdb> step
gdb> step
gdb> step
gdb> step
gdb> info address L
Symbol "L" is multi-location:
  Range 0x7c04007902bc5084-0x67fb876440700: a complex DWARF expression:
     0: DW_OP_breg16 1 [$rip]
Unrecognized DWARF opcode 0x02 at 2

gdb/ChangeLog:
2020-04-07  Nitika Achra  <Nitika.Achra@amd.com>

* dwarf2/loc.c (loclist_describe_location): Call the function decode_debug_loclists_
addresses if DWARF version is 5 or more because DW_LLE_start* or DW_LLE_offset_pair
with DW_LLE_base_addressx are being emitted in DWARFv5.
Add the newly added kind DW_LOC_OFFSET_PAIR also.
The length of location description is an unsigned ULEB integer in DWARFv5 instead of
unsigned integer.

gdb/ChangeLog
gdb/dwarf2/loc.c

index 4d3c70bf9e68c0c2e1efafc272666075e83fea4a..019b4d3e1d77eecd9c6a5aafb1b5f60f9ebc06bc 100644 (file)
@@ -1,3 +1,12 @@
+2020-04-07  Nitika Achra  <Nitika.Achra@amd.com>
+
+       * dwarf2/loc.c (loclist_describe_location): Call the function decode_debug_loclists_
+       addresses if DWARF version is 5 or more because DW_LLE_start* or DW_LLE_offset_pair
+       with DW_LLE_base_addressx are being emitted in DWARFv5.
+       Add the newly added kind DW_LOC_OFFSET_PAIR also.
+       The length of location description is an unsigned ULEB integer in DWARFv5 instead of
+       unsigned integer.
+
 2020-04-07  Nitika Achra  <Nitika.Achra@amd.com>
 
        * dwarf2/loc.c (enum debug_loc_kind): Add a new kind DEBUG_LOC_OFFSET_PAIR.
index ecd83ec4b9c38320785c4cf66767a738936b4374..2ec4626b17cc7e5a57c4357ab67bf2ef1d1944e0 100644 (file)
@@ -4459,15 +4459,20 @@ loclist_describe_location (struct symbol *symbol, CORE_ADDR addr,
       enum debug_loc_kind kind;
       const gdb_byte *new_ptr = NULL; /* init for gcc -Wall */
 
-      if (dlbaton->from_dwo)
+      if (dlbaton->per_cu->version () < 5 && dlbaton->from_dwo)
        kind = decode_debug_loc_dwo_addresses (dlbaton->per_cu,
                                               loc_ptr, buf_end, &new_ptr,
                                               &low, &high, byte_order);
-      else
+      else if (dlbaton->per_cu->version () < 5)
        kind = decode_debug_loc_addresses (loc_ptr, buf_end, &new_ptr,
                                           &low, &high,
                                           byte_order, addr_size,
                                           signed_addr_p);
+      else
+       kind = decode_debug_loclists_addresses (dlbaton->per_cu,
+                                               loc_ptr, buf_end, &new_ptr,
+                                               &low, &high, byte_order,
+                                               addr_size, signed_addr_p);
       loc_ptr = new_ptr;
       switch (kind)
        {
@@ -4481,6 +4486,7 @@ loclist_describe_location (struct symbol *symbol, CORE_ADDR addr,
          continue;
        case DEBUG_LOC_START_END:
        case DEBUG_LOC_START_LENGTH:
+       case DEBUG_LOC_OFFSET_PAIR:
          break;
        case DEBUG_LOC_BUFFER_OVERFLOW:
        case DEBUG_LOC_INVALID_ENTRY:
@@ -4497,8 +4503,17 @@ loclist_describe_location (struct symbol *symbol, CORE_ADDR addr,
       low = gdbarch_adjust_dwarf2_addr (gdbarch, low);
       high = gdbarch_adjust_dwarf2_addr (gdbarch, high);
 
-      length = extract_unsigned_integer (loc_ptr, 2, byte_order);
-      loc_ptr += 2;
+      if (dlbaton->per_cu->version () < 5)
+        {
+          length = extract_unsigned_integer (loc_ptr, 2, byte_order);
+          loc_ptr += 2;
+        }
+      else
+        {
+          unsigned int bytes_read;
+          length = read_unsigned_leb128 (NULL, loc_ptr, &bytes_read);
+          loc_ptr += bytes_read;
+        }
 
       /* (It would improve readability to print only the minimum
         necessary digits of the second number of the range.)  */