]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
gdb: Support DW_OP_constx (the standardized version of DW_OP_GNU_const_index).
authorKyle Huey <me@kylehuey.com>
Sat, 7 Sep 2024 15:20:05 +0000 (08:20 -0700)
committerTom Tromey <tromey@adacore.com>
Wed, 11 Sep 2024 15:07:37 +0000 (09:07 -0600)
Approved-By: Tom Tromey <tom@tromey.com>
gdb/dwarf2/expr.c
gdb/dwarf2/loc.c
gdb/dwarf2/read.c

index cb80dbf60b1f2ea4390dbf342aced3b18e6116ba..5ad17eaaaff89b2d7f6f678e6e5b7e73e320f81c 100644 (file)
@@ -1593,8 +1593,9 @@ dwarf_expr_context::execute_stack_op (const gdb_byte *op_ptr,
                                             uoffset)));
          result_val = value_from_ulongest (address_type, result);
          break;
+       case DW_OP_constx:
        case DW_OP_GNU_const_index:
-         ensure_have_per_cu (this->m_per_cu, "DW_OP_GNU_const_index");
+         ensure_have_per_cu (this->m_per_cu, "DW_OP_constx");
 
          op_ptr = safe_read_uleb128 (op_ptr, op_end, &uoffset);
          result = (ULONGEST) dwarf2_read_addr_index (this->m_per_cu,
index 3a47805ab3ad01fae7c66b3dcbf23269fddc32b6..5d1a557cb987c788df39c9dd081c4928132f1585 100644 (file)
@@ -1967,6 +1967,7 @@ dwarf2_get_symbol_read_needs (gdb::array_view<const gdb_byte> expr,
        case DW_OP_GNU_reinterpret:
        case DW_OP_addrx:
        case DW_OP_GNU_addr_index:
+       case DW_OP_constx:
        case DW_OP_GNU_const_index:
        case DW_OP_constu:
        case DW_OP_plus_uconst:
@@ -3265,10 +3266,13 @@ locexpr_describe_location_piece (struct symbol *symbol, struct ui_file *stream,
   /* With -gsplit-dwarf a TLS variable can also look like this:
      DW_AT_location    : 3 byte block: fc 4 e0
                        (DW_OP_GNU_const_index: 4;
-                        DW_OP_GNU_push_tls_address)  */
+                        DW_OP_GNU_push_tls_address) |
+                        3 byte block a2 4 e0
+                       (DW_OP_constx: 4;
+                        DW_OP_form_tls_address)  */
   else if (data + 3 <= end
           && data + 1 + (leb128_size = skip_leb128 (data + 1, end)) < end
-          && data[0] == DW_OP_GNU_const_index
+          && (data[0] == DW_OP_constx || data[0] == DW_OP_GNU_const_index)
           && leb128_size > 0
           && (data[1 + leb128_size] == DW_OP_GNU_push_tls_address
               || data[1 + leb128_size] == DW_OP_form_tls_address)
@@ -3675,6 +3679,7 @@ disassemble_dwarf_expression (struct ui_file *stream,
          gdb_printf (stream, " 0x%s", phex_nz (ul, addr_size));
          break;
 
+       case DW_OP_constx:
        case DW_OP_GNU_const_index:
          data = safe_read_uleb128 (data, end, &ul);
          ul = (uint64_t) dwarf2_read_addr_index (per_cu, per_objfile, ul);
index 769ca91faccf3d4efcf08eaf0a213e0436935760..e0dcf94040202cbe441bd5b5e6dd9e34dde53d26 100644 (file)
@@ -21142,6 +21142,7 @@ decode_locdesc (struct dwarf_block *blk, struct dwarf2_cu *cu,
 
        case DW_OP_addrx:
        case DW_OP_GNU_addr_index:
+       case DW_OP_constx:
        case DW_OP_GNU_const_index:
          stack[++stacki]
            = (CORE_ADDR) read_addr_index_from_leb128 (cu, &data[i],