public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* [PATCH] Binutils support for DWARF-5 DW_OP_addrx
@ 2022-04-28 10:14 Natarajan, Kavitha
  2022-04-29 14:21 ` Nick Clifton
  0 siblings, 1 reply; 12+ messages in thread
From: Natarajan, Kavitha @ 2022-04-28 10:14 UTC (permalink / raw)
  To: binutils; +Cc: George, Jini Susan

[-- Attachment #1: Type: text/plain, Size: 26933 bytes --]

[Public]

Hi,

When an executable is compiled with -gdwarf-5 option, bintools such as objdump, readelf
do not recognize some of the new DWARF-5 tags. The below binutils patch is to support one
of the new DWARF-5 operation encoding tag DW_OP_addrx.

Before patch:
<1><86>: Abbrev Number: 3 (DW_TAG_variable)
    <87>   DW_AT_name        : (indexed string: 0xc): uni_lang_p
    <88>   DW_AT_type        : <0x4a>
    <8c>   DW_AT_external    : 1
    <8c>   DW_AT_decl_file   : 0
    <8d>   DW_AT_decl_line   : 64
    <8e>   DW_AT_location    : 2 byte block: a1 4       ((Unknown location op 0xa1))

After patch:
<1><86>: Abbrev Number: 3 (DW_TAG_variable)
    <87>   DW_AT_name        : (indexed string: 0xc): uni_lang_p
    <88>   DW_AT_type        : <0x4a>
    <8c>   DW_AT_external    : 1
    <8c>   DW_AT_decl_file   : 0
    <8d>   DW_AT_decl_line   : 64
    <8e>   DW_AT_location    :  (DW_OP_addrx <0x4>)

Generated .s file with clang to test this feature as gcc does not emit this tag.

Please review.

Regards,
Kavitha

======================================================================
Binutils tools objdump and readelf to support new dwarf-5
operation encoding, such as, DW_OP_addrx.

Added test points in objdump.exp and readlef.exp.

---
binutils/dwarf.c                            |  11 +-
binutils/testsuite/binutils-all/objdump.exp |  48 ++-
binutils/testsuite/binutils-all/readelf.exp |  62 +++
binutils/testsuite/binutils-all/testprog.s  | 426 ++++++++++++++++++++
4 files changed, 543 insertions(+), 4 deletions(-)
create mode 100644 binutils/testsuite/binutils-all/testprog.s

diff --git a/binutils/dwarf.c b/binutils/dwarf.c
index bc862f77c04..fc754f4f73d 100644
--- a/binutils/dwarf.c
+++ b/binutils/dwarf.c
@@ -1721,6 +1721,10 @@ decode_location_expression (unsigned char * data,
      printf ("DW_OP_GNU_parameter_ref: <0x%s>",
            dwarf_vmatoa ("x", cu_offset + uvalue));
      break;
+    case DW_OP_addrx:
+      READ_ULEB (uvalue, data, end);
+      printf ("DW_OP_addrx <0x%s>", dwarf_vmatoa ("x", uvalue));
+      break;
    case DW_OP_GNU_addr_index:
      READ_ULEB (uvalue, data, end);
      printf ("DW_OP_GNU_addr_index <0x%s>", dwarf_vmatoa ("x", uvalue));
@@ -2661,9 +2665,10 @@ read_and_display_attr_value (unsigned long           attribute,

       uvalue = check_uvalue (block_start, uvalue, end);

-      if (do_loc)
-    data = block_start + uvalue;
-      else
+      data = block_start + uvalue;
+
+      /* DW_OP_addrx has only the index and not address.  */
+      if (!do_loc && ((unsigned)(*block_start) != DW_OP_addrx))
    data = display_block (block_start, uvalue, end, delimiter);
       break;

diff --git a/binutils/testsuite/binutils-all/objdump.exp b/binutils/testsuite/binutils-all/objdump.exp
index 0f160ae5a06..f0a4611dd1f 100644
--- a/binutils/testsuite/binutils-all/objdump.exp
+++ b/binutils/testsuite/binutils-all/objdump.exp
@@ -513,6 +513,52 @@ if { ![is_elf_format] } then {
     }
}

+# Test objdump -Wi on a file containing dwarf-5 encodings information.
+
+if { ![is_elf_format] } then {
+    unsupported "objdump DW_OP_addrx test"
+} elseif { ![binutils_assemble $srcdir/$subdir/testprog.s tmpdir/testprog.${obj}] } then {
+    fail "objdump DW_OP_addrx test"
+} else {
+    if [is_remote host] {
+    set op_testfile [remote_download host tmpdir/testprog.${obj}]
+    } else {
+    set op_testfile tmpdir/testprog.${obj}
+    }
+
+    set got [remote_exec host "$OBJDUMP $OBJDUMPFLAGS -Wi $op_testfile" "" "/dev/null" "objdump.out"]
+
+    if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
+    fail "objdump -Wi (reason: unexpected output)"
+    send_log $got
+    send_log "\n"
+    }
+
+    set output [remote_upload host objdump.out]
+
+    if ![file size $output] then {
+    # If the output file is empty, then this target does not
+    # generate dwarf2 output.  This is not a failure.
+    verbose "No output from 'objdump -wi'"
+    untested "objdump -wi"
+    return
+    }
+
+    # Search for strings that should be in the output.
+    set sought ".*\(DW_OP_addrx <0\).*"
+
+    set lines [grep $output $sought]
+    if ![llength $lines] then {
+    fail "objdump -Wi: missing: $sought"
+    send_log objdump.out
+    return
+    } else {
+    pass "objdump -Wi for DW_OP_addrx"
+    }
+
+    file_on_host delete $output
+}
+
proc test_build_id_debuglink {} {
     global srcdir
     global subdir
@@ -522,7 +568,7 @@ proc test_build_id_debuglink {} {
     global OBJDUMP
     global CFLAGS_FOR_TARGET
     global exe
-
+
     set test "build-id-debuglink"

     # Use a fixed build-id.
diff --git a/binutils/testsuite/binutils-all/readelf.exp b/binutils/testsuite/binutils-all/readelf.exp
index 8ff756e506f..db0fe88cef7 100644
--- a/binutils/testsuite/binutils-all/readelf.exp
+++ b/binutils/testsuite/binutils-all/readelf.exp
@@ -214,6 +214,67 @@ proc readelf_wi_test {} {
     pass "readelf -wi"
}

+# Testing the "readelf -wi" option for dwarf-5 specific information.
+# readelf_wi_test_5{} can be merged to readelf_wi_test{} once gcc
+# supports dwarf-5 encodings.
+
+proc readelf_wi_test_5 {} {
+    global READELF
+    global READELFFLAGS
+    global srcdir
+    global subdir
+
+    # Compile the second test file.
+    if {![binutils_assemble $srcdir/$subdir/testprog.s tmpdir/testprog.o]} {
+    verbose "Unable to assemble test file."
+    untested "readelf -wi (dwarf-5)"
+    return
+    }
+
+    # Download it.
+    set tempfile [remote_download host tmpdir/testprog.o]
+
+    # Run "readelf -wi" on it.
+    set got [remote_exec host "$READELF $READELFFLAGS -wi $tempfile" "" "/dev/null" "readelf.out"]
+
+    # Upload the results.
+    set output [remote_upload host readelf.out]
+
+    file_on_host delete $tempfile
+
+    # Strip any superflous warnings.
+    set got [prune_readelf_wi_warnings [lindex $got 1]]
+
+    if ![string match "" $got] then {
+    fail "readelf $READELFFLAGS -wi (dwarf-5) (reason: unexpected output)"
+    send_log $got
+    send_log "\n"
+    return
+    }
+
+    if ![file size $output] then {
+    # If the output file is empty, then this target does not
+    # generate dwarf2 output.  This is not a failure.
+    verbose "No output from 'readelf -wi (dwarf-5)'"
+    untested "readelf -wi (dwarf-5)"
+    return
+    }
+
+    # Search for strings that should be in the output.
+    set sought ".*\(DW_OP_addrx <0\).*"
+
+    set lines [grep $output $sought]
+    if ![llength $lines] then {
+    fail "readelf -wi (dwarf-5): missing: $sought"
+    send_log readelf.out
+    return
+    } else {
+    pass "readelf -wi (dwarf-5)"
+    }
+
+    file_on_host delete $output
+}
+
# This tests "readelf -wa", but on a file with a compressed
# .debug_abbrev section.

@@ -390,6 +451,7 @@ if {![binutils_assemble $srcdir/$subdir/mangled.s tmpdir/mangled.o]} then {
}

 readelf_wi_test
+readelf_wi_test_5
readelf_compressed_wa_test

 readelf_dump_test
diff --git a/binutils/testsuite/binutils-all/testprog.s b/binutils/testsuite/binutils-all/testprog.s
new file mode 100644
index 00000000000..9db95e24ac2
--- /dev/null
+++ b/binutils/testsuite/binutils-all/testprog.s
@@ -0,0 +1,426 @@
+# Generated from testprog.c
+# clang -gdwarf-5 -S testprog.c -fno-addrsig
+
+    .text
+    .file "testprog.c"
+    .file 0 "/home/kavitha/workarea/binutils-gdb-amd/binutils/testsuite/binutils-all" "testprog.c" md5 0x1a2591dc3647301324c8184161bb46ff
+    .globl     fn                              # -- Begin function fn
+    .p2align   4, 0x90
+    .type fn,@function
+fn:                                     # @fn
+.Lfunc_begin0:
+    .loc 0 13 0                          # testprog.c:13:0
+    .cfi_startproc
+# %bb.0:
+    pushq %rbp
+    .cfi_def_cfa_offset 16
+    .cfi_offset %rbp, -16
+    movq %rsp, %rbp
+    .cfi_def_cfa_register %rbp
+.Ltmp0:
+    .loc 0 14 3 prologue_end             # testprog.c:14:3
+    movl $3, %eax
+    popq %rbp
+    .cfi_def_cfa %rsp, 8
+    retq
+.Ltmp1:
+.Lfunc_end0:
+    .size fn, .Lfunc_end0-fn
+    .cfi_endproc
+                                        # -- End function
+    .globl     main                            # -- Begin function main
+    .p2align   4, 0x90
+    .type main,@function
+main:                                   # @main
+.Lfunc_begin1:
+    .loc 0 19 0                          # testprog.c:19:0
+    .cfi_startproc
+# %bb.0:
+    pushq %rbp
+    .cfi_def_cfa_offset 16
+    .cfi_offset %rbp, -16
+    movq %rsp, %rbp
+    .cfi_def_cfa_register %rbp
+    subq $16, %rsp
+    movl $0, -4(%rbp)
+.Ltmp2:
+    .loc 0 20 14 prologue_end            # testprog.c:20:14
+    cmpl $0, common
+    .loc 0 21 7                          # testprog.c:21:7
+    jne  .LBB1_4
+# %bb.1:
+    .loc 0 21 17 is_stmt 0               # testprog.c:21:17
+    cmpl $1, global
+    .loc 0 22 7 is_stmt 1                # testprog.c:22:7
+    jne  .LBB1_4
+# %bb.2:
+    .loc 0 22 16 is_stmt 0               # testprog.c:22:16
+    cmpl $2, local
+    .loc 0 23 7 is_stmt 1                # testprog.c:23:7
+    jne  .LBB1_4
+# %bb.3:
+    .loc 0 23 10 is_stmt 0               # testprog.c:23:10
+    movl $string, %edi
+    movl $.L.str, %esi
+    callq strcmp
+    .loc 0 23 36                         # testprog.c:23:36
+    cmpl $0, %eax
+.Ltmp3:
+    .loc 0 20 7 is_stmt 1                # testprog.c:20:7
+    je   .LBB1_5
+.LBB1_4:
+.Ltmp4:
+    .loc 0 25 7                          # testprog.c:25:7
+    movabsq    $.L.str.1, %rdi
+    movb $0, %al
+    callq printf
+    .loc 0 26 7                          # testprog.c:26:7
+    movl $1, -4(%rbp)
+    jmp  .LBB1_6
+.Ltmp5:
+.LBB1_5:
+    .loc 0 29 3                          # testprog.c:29:3
+    movabsq    $.L.str.2, %rdi
+    movb $0, %al
+    callq printf
+    .loc 0 30 3                          # testprog.c:30:3
+    movl $0, -4(%rbp)
+.LBB1_6:
+    .loc 0 31 1                          # testprog.c:31:1
+    movl -4(%rbp), %eax
+    addq $16, %rsp
+    popq %rbp
+    .cfi_def_cfa %rsp, 8
+    retq
+.Ltmp6:
+.Lfunc_end1:
+    .size main, .Lfunc_end1-main
+    .cfi_endproc
+                                        # -- End function
+    .type global,@object                  # @global
+    .data
+    .globl     global
+    .p2align   2
+global:
+    .long 1                               # 0x1
+    .size global, 4
+
+    .type common,@object                  # @common
+    .bss
+    .globl     common
+    .p2align   2
+common:
+    .long 0                               # 0x0
+    .size common, 4
+
+    .type local,@object                   # @local
+    .data
+    .p2align   2
+local:
+    .long 2                               # 0x2
+    .size local, 4
+
+    .type string,@object                  # @string
+    .section   .rodata,"a",@progbits
+string:
+    .asciz     "string"
+    .size string, 7
+
+    .type .L.str,@object                  # @.str
+    .section   .rodata.str1.1,"aMS",@progbits,1
+.L.str:
+    .asciz     "string"
+    .size .L.str, 7
+
+    .type .L.str.1,@object                # @.str.1
+.L.str.1:
+    .asciz     "failed\n"
+    .size .L.str.1, 8
+
+    .type .L.str.2,@object                # @.str.2
+.L.str.2:
+    .asciz     "ok\n"
+    .size .L.str.2, 4
+
+    .section   .debug_abbrev,"",@progbits
+    .byte 1                               # Abbreviation Code
+    .byte 17                              # DW_TAG_compile_unit
+    .byte 1                               # DW_CHILDREN_yes
+    .byte 37                              # DW_AT_producer
+    .byte 37                              # DW_FORM_strx1
+    .byte 19                              # DW_AT_language
+    .byte 5                               # DW_FORM_data2
+    .byte 3                               # DW_AT_name
+    .byte 37                              # DW_FORM_strx1
+    .byte 114                             # DW_AT_str_offsets_base
+    .byte 23                              # DW_FORM_sec_offset
+    .byte 16                              # DW_AT_stmt_list
+    .byte 23                              # DW_FORM_sec_offset
+    .byte 27                              # DW_AT_comp_dir
+    .byte 37                              # DW_FORM_strx1
+    .byte 17                              # DW_AT_low_pc
+    .byte 27                              # DW_FORM_addrx
+    .byte 18                              # DW_AT_high_pc
+    .byte 6                               # DW_FORM_data4
+    .byte 115                             # DW_AT_addr_base
+    .byte 23                              # DW_FORM_sec_offset
+    .byte 0                               # EOM(1)
+    .byte 0                               # EOM(2)
+    .byte 2                               # Abbreviation Code
+    .byte 52                              # DW_TAG_variable
+    .byte 0                               # DW_CHILDREN_no
+    .byte 3                               # DW_AT_name
+    .byte 37                              # DW_FORM_strx1
+    .byte 73                              # DW_AT_type
+    .byte 19                              # DW_FORM_ref4
+    .byte 63                              # DW_AT_external
+    .byte 25                              # DW_FORM_flag_present
+    .byte 58                              # DW_AT_decl_file
+    .byte 11                              # DW_FORM_data1
+    .byte 59                              # DW_AT_decl_line
+    .byte 11                              # DW_FORM_data1
+    .byte 2                               # DW_AT_location
+    .byte 24                              # DW_FORM_exprloc
+    .byte 0                               # EOM(1)
+    .byte 0                               # EOM(2)
+    .byte 3                               # Abbreviation Code
+    .byte 36                              # DW_TAG_base_type
+    .byte 0                               # DW_CHILDREN_no
+    .byte 3                               # DW_AT_name
+    .byte 37                              # DW_FORM_strx1
+    .byte 62                              # DW_AT_encoding
+    .byte 11                              # DW_FORM_data1
+    .byte 11                              # DW_AT_byte_size
+    .byte 11                              # DW_FORM_data1
+    .byte 0                               # EOM(1)
+    .byte 0                               # EOM(2)
+    .byte 4                               # Abbreviation Code
+    .byte 52                              # DW_TAG_variable
+    .byte 0                               # DW_CHILDREN_no
+    .byte 3                               # DW_AT_name
+    .byte 37                              # DW_FORM_strx1
+    .byte 73                              # DW_AT_type
+    .byte 19                              # DW_FORM_ref4
+    .byte 58                              # DW_AT_decl_file
+    .byte 11                              # DW_FORM_data1
+    .byte 59                              # DW_AT_decl_line
+    .byte 11                              # DW_FORM_data1
+    .byte 2                               # DW_AT_location
+    .byte 24                              # DW_FORM_exprloc
+    .byte 0                               # EOM(1)
+    .byte 0                               # EOM(2)
+    .byte 5                               # Abbreviation Code
+    .byte 1                               # DW_TAG_array_type
+    .byte 1                               # DW_CHILDREN_yes
+    .byte 73                              # DW_AT_type
+    .byte 19                              # DW_FORM_ref4
+    .byte 0                               # EOM(1)
+    .byte 0                               # EOM(2)
+    .byte 6                               # Abbreviation Code
+    .byte 33                              # DW_TAG_subrange_type
+    .byte 0                               # DW_CHILDREN_no
+    .byte 73                              # DW_AT_type
+    .byte 19                              # DW_FORM_ref4
+    .byte 55                              # DW_AT_count
+    .byte 11                              # DW_FORM_data1
+    .byte 0                               # EOM(1)
+    .byte 0                               # EOM(2)
+    .byte 7                               # Abbreviation Code
+    .byte 38                              # DW_TAG_const_type
+    .byte 0                               # DW_CHILDREN_no
+    .byte 73                              # DW_AT_type
+    .byte 19                              # DW_FORM_ref4
+    .byte 0                               # EOM(1)
+    .byte 0                               # EOM(2)
+    .byte 8                               # Abbreviation Code
+    .byte 36                              # DW_TAG_base_type
+    .byte 0                               # DW_CHILDREN_no
+    .byte 3                               # DW_AT_name
+    .byte 37                              # DW_FORM_strx1
+    .byte 11                              # DW_AT_byte_size
+    .byte 11                              # DW_FORM_data1
+    .byte 62                              # DW_AT_encoding
+    .byte 11                              # DW_FORM_data1
+    .byte 0                               # EOM(1)
+    .byte 0                               # EOM(2)
+    .byte 9                               # Abbreviation Code
+    .byte 46                              # DW_TAG_subprogram
+    .byte 0                               # DW_CHILDREN_no
+    .byte 17                              # DW_AT_low_pc
+    .byte 27                              # DW_FORM_addrx
+    .byte 18                              # DW_AT_high_pc
+    .byte 6                               # DW_FORM_data4
+    .byte 64                              # DW_AT_frame_base
+    .byte 24                              # DW_FORM_exprloc
+    .byte 3                               # DW_AT_name
+    .byte 37                              # DW_FORM_strx1
+    .byte 58                              # DW_AT_decl_file
+    .byte 11                              # DW_FORM_data1
+    .byte 59                              # DW_AT_decl_line
+    .byte 11                              # DW_FORM_data1
+    .byte 39                              # DW_AT_prototyped
+    .byte 25                              # DW_FORM_flag_present
+    .byte 73                              # DW_AT_type
+    .byte 19                              # DW_FORM_ref4
+    .byte 63                              # DW_AT_external
+    .byte 25                              # DW_FORM_flag_present
+    .byte 0                               # EOM(1)
+    .byte 0                               # EOM(2)
+    .byte 0                               # EOM(3)
+    .section   .debug_info,"",@progbits
+.Lcu_begin0:
+    .long .Ldebug_info_end0-.Ldebug_info_start0 # Length of Unit
+.Ldebug_info_start0:
+    .short     5                               # DWARF version number
+    .byte 1                               # DWARF Unit Type
+    .byte 8                               # Address Size (in bytes)
+    .long .debug_abbrev                   # Offset Into Abbrev. Section
+    .byte 1                               # Abbrev [1] 0xc:0x7f DW_TAG_compile_unit
+    .byte 0                               # DW_AT_producer
+    .short     12                              # DW_AT_language
+    .byte 1                               # DW_AT_name
+    .long .Lstr_offsets_base0             # DW_AT_str_offsets_base
+    .long .Lline_table_start0             # DW_AT_stmt_list
+    .byte 2                               # DW_AT_comp_dir
+    .byte 4                               # DW_AT_low_pc
+    .long .Lfunc_end1-.Lfunc_begin0       # DW_AT_high_pc
+    .long .Laddr_table_base0              # DW_AT_addr_base
+    .byte 2                               # Abbrev [2] 0x23:0xb DW_TAG_variable
+    .byte 3                               # DW_AT_name
+    .long 46                              # DW_AT_type
+                                        # DW_AT_external
+    .byte 0                               # DW_AT_decl_file
+    .byte 7                               # DW_AT_decl_line
+    .byte 2                               # DW_AT_location
+    .byte 161
+    .byte 0
+    .byte 3                               # Abbrev [3] 0x2e:0x4 DW_TAG_base_type
+    .byte 4                               # DW_AT_name
+    .byte 5                               # DW_AT_encoding
+    .byte 4                               # DW_AT_byte_size
+    .byte 2                               # Abbrev [2] 0x32:0xb DW_TAG_variable
+    .byte 5                               # DW_AT_name
+    .long 46                              # DW_AT_type
+                                        # DW_AT_external
+    .byte 0                               # DW_AT_decl_file
+    .byte 6                               # DW_AT_decl_line
+    .byte 2                               # DW_AT_location
+    .byte 161
+    .byte 1
+    .byte 4                               # Abbrev [4] 0x3d:0xb DW_TAG_variable
+    .byte 6                               # DW_AT_name
+    .long 46                              # DW_AT_type
+    .byte 0                               # DW_AT_decl_file
+    .byte 8                               # DW_AT_decl_line
+    .byte 2                               # DW_AT_location
+    .byte 161
+    .byte 2
+    .byte 4                               # Abbrev [4] 0x48:0xb DW_TAG_variable
+    .byte 7                               # DW_AT_name
+    .long 83                              # DW_AT_type
+    .byte 0                               # DW_AT_decl_file
+    .byte 9                               # DW_AT_decl_line
+    .byte 2                               # DW_AT_location
+    .byte 161
+    .byte 3
+    .byte 5                               # Abbrev [5] 0x53:0xc DW_TAG_array_type
+    .long 95                              # DW_AT_type
+    .byte 6                               # Abbrev [6] 0x58:0x6 DW_TAG_subrange_type
+    .long 104                             # DW_AT_type
+    .byte 7                               # DW_AT_count
+    .byte 0                               # End Of Children Mark
+    .byte 7                               # Abbrev [7] 0x5f:0x5 DW_TAG_const_type
+    .long 100                             # DW_AT_type
+    .byte 3                               # Abbrev [3] 0x64:0x4 DW_TAG_base_type
+    .byte 8                               # DW_AT_name
+    .byte 6                               # DW_AT_encoding
+    .byte 1                               # DW_AT_byte_size
+    .byte 8                               # Abbrev [8] 0x68:0x4 DW_TAG_base_type
+    .byte 9                               # DW_AT_name
+    .byte 8                               # DW_AT_byte_size
+    .byte 7                               # DW_AT_encoding
+    .byte 9                               # Abbrev [9] 0x6c:0xf DW_TAG_subprogram
+    .byte 4                               # DW_AT_low_pc
+    .long .Lfunc_end0-.Lfunc_begin0       # DW_AT_high_pc
+    .byte 1                               # DW_AT_frame_base
+    .byte 86
+    .byte 10                              # DW_AT_name
+    .byte 0                               # DW_AT_decl_file
+    .byte 12                              # DW_AT_decl_line
+                                        # DW_AT_prototyped
+    .long 46                              # DW_AT_type
+                                        # DW_AT_external
+    .byte 9                               # Abbrev [9] 0x7b:0xf DW_TAG_subprogram
+    .byte 5                               # DW_AT_low_pc
+    .long .Lfunc_end1-.Lfunc_begin1       # DW_AT_high_pc
+    .byte 1                               # DW_AT_frame_base
+    .byte 86
+    .byte 11                              # DW_AT_name
+    .byte 0                               # DW_AT_decl_file
+    .byte 18                              # DW_AT_decl_line
+                                        # DW_AT_prototyped
+    .long 46                              # DW_AT_type
+                                        # DW_AT_external
+    .byte 0                               # End Of Children Mark
+.Ldebug_info_end0:
+    .section   .debug_str_offsets,"",@progbits
+    .long 52                              # Length of String Offsets Set
+    .short     5
+    .short     0
+.Lstr_offsets_base0:
+    .section   .debug_str,"MS",@progbits,1
+.Linfo_string0:
+    .asciz     "Ubuntu clang version 12.0.0-3ubuntu1~20.04.5" # string offset=0
+.Linfo_string1:
+    .asciz     "testprog.c"                    # string offset=45
+.Linfo_string2:
+    .asciz     "/home/kavitha/workarea/binutils-gdb-amd/binutils/testsuite/binutils-all" # string offset=56
+.Linfo_string3:
+    .asciz     "global"                        # string offset=128
+.Linfo_string4:
+    .asciz     "int"                           # string offset=135
+.Linfo_string5:
+    .asciz     "common"                        # string offset=139
+.Linfo_string6:
+    .asciz     "local"                         # string offset=146
+.Linfo_string7:
+    .asciz     "string"                        # string offset=152
+.Linfo_string8:
+    .asciz     "char"                          # string offset=159
+.Linfo_string9:
+    .asciz     "__ARRAY_SIZE_TYPE__"           # string offset=164
+.Linfo_string10:
+    .asciz     "fn"                            # string offset=184
+.Linfo_string11:
+    .asciz     "main"                          # string offset=187
+    .section   .debug_str_offsets,"",@progbits
+    .long .Linfo_string0
+    .long .Linfo_string1
+    .long .Linfo_string2
+    .long .Linfo_string3
+    .long .Linfo_string4
+    .long .Linfo_string5
+    .long .Linfo_string6
+    .long .Linfo_string7
+    .long .Linfo_string8
+    .long .Linfo_string9
+    .long .Linfo_string10
+    .long .Linfo_string11
+    .section   .debug_addr,"",@progbits
+    .long .Ldebug_addr_end0-.Ldebug_addr_start0 # Length of contribution
+.Ldebug_addr_start0:
+    .short     5                               # DWARF version number
+    .byte 8                               # Address size
+    .byte 0                               # Segment selector size
+.Laddr_table_base0:
+    .quad global
+    .quad common
+    .quad local
+    .quad string
+    .quad .Lfunc_begin0
+    .quad .Lfunc_begin1
+.Ldebug_addr_end0:
+    .ident     "Ubuntu clang version 12.0.0-3ubuntu1~20.04.5"
+    .section   ".note.GNU-stack","",@progbits
+    .section   .debug_line,"",@progbits
+.Lline_table_start0:
--

[-- Attachment #2: 0001-Binutils support for DWARF-5 DW_OP_addrx.patch --]
[-- Type: application/octet-stream, Size: 24490 bytes --]

Binutils tools objdump and readelf to support new dwarf-5
operation encoding, such as, DW_OP_addrx.

Added test points in objdump.exp and readlef.exp.

---
 binutils/dwarf.c                            |  11 +-
 binutils/testsuite/binutils-all/objdump.exp |  48 ++-
 binutils/testsuite/binutils-all/readelf.exp |  62 +++
 binutils/testsuite/binutils-all/testprog.s  | 426 ++++++++++++++++++++
 4 files changed, 543 insertions(+), 4 deletions(-)
 create mode 100644 binutils/testsuite/binutils-all/testprog.s

diff --git a/binutils/dwarf.c b/binutils/dwarf.c
index bc862f77c04..fc754f4f73d 100644
--- a/binutils/dwarf.c
+++ b/binutils/dwarf.c
@@ -1721,6 +1721,10 @@ decode_location_expression (unsigned char * data,
 	  printf ("DW_OP_GNU_parameter_ref: <0x%s>",
 		  dwarf_vmatoa ("x", cu_offset + uvalue));
 	  break;
+	case DW_OP_addrx:
+	  READ_ULEB (uvalue, data, end);
+	  printf ("DW_OP_addrx <0x%s>", dwarf_vmatoa ("x", uvalue));
+	  break;
 	case DW_OP_GNU_addr_index:
 	  READ_ULEB (uvalue, data, end);
 	  printf ("DW_OP_GNU_addr_index <0x%s>", dwarf_vmatoa ("x", uvalue));
@@ -2661,9 +2665,10 @@ read_and_display_attr_value (unsigned long           attribute,
 
       uvalue = check_uvalue (block_start, uvalue, end);
 
-      if (do_loc)
-	data = block_start + uvalue;
-      else
+      data = block_start + uvalue;
+
+      /* DW_OP_addrx has only the index and not address.  */
+      if (!do_loc && ((unsigned)(*block_start) != DW_OP_addrx))
 	data = display_block (block_start, uvalue, end, delimiter);
       break;
 
diff --git a/binutils/testsuite/binutils-all/objdump.exp b/binutils/testsuite/binutils-all/objdump.exp
index 0f160ae5a06..f0a4611dd1f 100644
--- a/binutils/testsuite/binutils-all/objdump.exp
+++ b/binutils/testsuite/binutils-all/objdump.exp
@@ -513,6 +513,52 @@ if { ![is_elf_format] } then {
     }
 }
 
+# Test objdump -Wi on a file containing dwarf-5 encodings information.
+
+if { ![is_elf_format] } then {
+    unsupported "objdump DW_OP_addrx test"
+} elseif { ![binutils_assemble $srcdir/$subdir/testprog.s tmpdir/testprog.${obj}] } then {
+    fail "objdump DW_OP_addrx test"
+} else {
+    if [is_remote host] {
+	set op_testfile [remote_download host tmpdir/testprog.${obj}]
+    } else {
+	set op_testfile tmpdir/testprog.${obj}
+    }
+
+    set got [remote_exec host "$OBJDUMP $OBJDUMPFLAGS -Wi $op_testfile" "" "/dev/null" "objdump.out"]
+
+    if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
+	fail "objdump -Wi (reason: unexpected output)"
+	send_log $got
+	send_log "\n"
+    }
+
+    set output [remote_upload host objdump.out]
+
+    if ![file size $output] then {
+	# If the output file is empty, then this target does not
+	# generate dwarf2 output.  This is not a failure.
+	verbose "No output from 'objdump -wi'"
+	untested "objdump -wi"
+	return
+    }
+
+    # Search for strings that should be in the output.
+    set sought ".*\(DW_OP_addrx <0\).*"
+
+    set lines [grep $output $sought]
+    if ![llength $lines] then {
+	fail "objdump -Wi: missing: $sought"
+	send_log objdump.out
+	return
+    } else {
+	pass "objdump -Wi for DW_OP_addrx"
+    }
+
+    file_on_host delete $output
+}
+
 proc test_build_id_debuglink {} {
     global srcdir
     global subdir
@@ -522,7 +568,7 @@ proc test_build_id_debuglink {} {
     global OBJDUMP
     global CFLAGS_FOR_TARGET
     global exe
-    
+
     set test "build-id-debuglink"
 
     # Use a fixed build-id.
diff --git a/binutils/testsuite/binutils-all/readelf.exp b/binutils/testsuite/binutils-all/readelf.exp
index 8ff756e506f..db0fe88cef7 100644
--- a/binutils/testsuite/binutils-all/readelf.exp
+++ b/binutils/testsuite/binutils-all/readelf.exp
@@ -214,6 +214,67 @@ proc readelf_wi_test {} {
     pass "readelf -wi"
 }
 
+# Testing the "readelf -wi" option for dwarf-5 specific information.
+# readelf_wi_test_5{} can be merged to readelf_wi_test{} once gcc
+# supports dwarf-5 encodings.
+
+proc readelf_wi_test_5 {} {
+    global READELF
+    global READELFFLAGS
+    global srcdir
+    global subdir
+
+    # Compile the second test file.
+    if {![binutils_assemble $srcdir/$subdir/testprog.s tmpdir/testprog.o]} {
+	verbose "Unable to assemble test file."
+	untested "readelf -wi (dwarf-5)"
+	return
+    }
+
+    # Download it.
+    set tempfile [remote_download host tmpdir/testprog.o]
+
+    # Run "readelf -wi" on it.
+    set got [remote_exec host "$READELF $READELFFLAGS -wi $tempfile" "" "/dev/null" "readelf.out"]
+
+    # Upload the results.
+    set output [remote_upload host readelf.out]
+
+    file_on_host delete $tempfile
+
+    # Strip any superflous warnings.
+    set got [prune_readelf_wi_warnings [lindex $got 1]]
+
+    if ![string match "" $got] then {
+	fail "readelf $READELFFLAGS -wi (dwarf-5) (reason: unexpected output)"
+	send_log $got
+	send_log "\n"
+	return
+    }
+
+    if ![file size $output] then {
+	# If the output file is empty, then this target does not
+	# generate dwarf2 output.  This is not a failure.
+	verbose "No output from 'readelf -wi (dwarf-5)'"
+	untested "readelf -wi (dwarf-5)"
+	return
+    }
+
+    # Search for strings that should be in the output.
+    set sought ".*\(DW_OP_addrx <0\).*"
+
+    set lines [grep $output $sought]
+    if ![llength $lines] then {
+	fail "readelf -wi (dwarf-5): missing: $sought"
+	send_log readelf.out
+	return
+    } else {
+	pass "readelf -wi (dwarf-5)"
+    }
+
+    file_on_host delete $output
+}
+
 # This tests "readelf -wa", but on a file with a compressed
 # .debug_abbrev section.
 
@@ -390,6 +451,7 @@ if {![binutils_assemble $srcdir/$subdir/mangled.s tmpdir/mangled.o]} then {
 }
 
 readelf_wi_test
+readelf_wi_test_5
 readelf_compressed_wa_test
 
 readelf_dump_test
diff --git a/binutils/testsuite/binutils-all/testprog.s b/binutils/testsuite/binutils-all/testprog.s
new file mode 100644
index 00000000000..9db95e24ac2
--- /dev/null
+++ b/binutils/testsuite/binutils-all/testprog.s
@@ -0,0 +1,426 @@
+# Generated from testprog.c
+# clang -gdwarf-5 -S testprog.c -fno-addrsig
+
+	.text
+	.file	"testprog.c"
+	.file	0 "/home/kavitha/workarea/binutils-gdb-amd/binutils/testsuite/binutils-all" "testprog.c" md5 0x1a2591dc3647301324c8184161bb46ff
+	.globl	fn                              # -- Begin function fn
+	.p2align	4, 0x90
+	.type	fn,@function
+fn:                                     # @fn
+.Lfunc_begin0:
+	.loc	0 13 0                          # testprog.c:13:0
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+.Ltmp0:
+	.loc	0 14 3 prologue_end             # testprog.c:14:3
+	movl	$3, %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Ltmp1:
+.Lfunc_end0:
+	.size	fn, .Lfunc_end0-fn
+	.cfi_endproc
+                                        # -- End function
+	.globl	main                            # -- Begin function main
+	.p2align	4, 0x90
+	.type	main,@function
+main:                                   # @main
+.Lfunc_begin1:
+	.loc	0 19 0                          # testprog.c:19:0
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	subq	$16, %rsp
+	movl	$0, -4(%rbp)
+.Ltmp2:
+	.loc	0 20 14 prologue_end            # testprog.c:20:14
+	cmpl	$0, common
+	.loc	0 21 7                          # testprog.c:21:7
+	jne	.LBB1_4
+# %bb.1:
+	.loc	0 21 17 is_stmt 0               # testprog.c:21:17
+	cmpl	$1, global
+	.loc	0 22 7 is_stmt 1                # testprog.c:22:7
+	jne	.LBB1_4
+# %bb.2:
+	.loc	0 22 16 is_stmt 0               # testprog.c:22:16
+	cmpl	$2, local
+	.loc	0 23 7 is_stmt 1                # testprog.c:23:7
+	jne	.LBB1_4
+# %bb.3:
+	.loc	0 23 10 is_stmt 0               # testprog.c:23:10
+	movl	$string, %edi
+	movl	$.L.str, %esi
+	callq	strcmp
+	.loc	0 23 36                         # testprog.c:23:36
+	cmpl	$0, %eax
+.Ltmp3:
+	.loc	0 20 7 is_stmt 1                # testprog.c:20:7
+	je	.LBB1_5
+.LBB1_4:
+.Ltmp4:
+	.loc	0 25 7                          # testprog.c:25:7
+	movabsq	$.L.str.1, %rdi
+	movb	$0, %al
+	callq	printf
+	.loc	0 26 7                          # testprog.c:26:7
+	movl	$1, -4(%rbp)
+	jmp	.LBB1_6
+.Ltmp5:
+.LBB1_5:
+	.loc	0 29 3                          # testprog.c:29:3
+	movabsq	$.L.str.2, %rdi
+	movb	$0, %al
+	callq	printf
+	.loc	0 30 3                          # testprog.c:30:3
+	movl	$0, -4(%rbp)
+.LBB1_6:
+	.loc	0 31 1                          # testprog.c:31:1
+	movl	-4(%rbp), %eax
+	addq	$16, %rsp
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Ltmp6:
+.Lfunc_end1:
+	.size	main, .Lfunc_end1-main
+	.cfi_endproc
+                                        # -- End function
+	.type	global,@object                  # @global
+	.data
+	.globl	global
+	.p2align	2
+global:
+	.long	1                               # 0x1
+	.size	global, 4
+
+	.type	common,@object                  # @common
+	.bss
+	.globl	common
+	.p2align	2
+common:
+	.long	0                               # 0x0
+	.size	common, 4
+
+	.type	local,@object                   # @local
+	.data
+	.p2align	2
+local:
+	.long	2                               # 0x2
+	.size	local, 4
+
+	.type	string,@object                  # @string
+	.section	.rodata,"a",@progbits
+string:
+	.asciz	"string"
+	.size	string, 7
+
+	.type	.L.str,@object                  # @.str
+	.section	.rodata.str1.1,"aMS",@progbits,1
+.L.str:
+	.asciz	"string"
+	.size	.L.str, 7
+
+	.type	.L.str.1,@object                # @.str.1
+.L.str.1:
+	.asciz	"failed\n"
+	.size	.L.str.1, 8
+
+	.type	.L.str.2,@object                # @.str.2
+.L.str.2:
+	.asciz	"ok\n"
+	.size	.L.str.2, 4
+
+	.section	.debug_abbrev,"",@progbits
+	.byte	1                               # Abbreviation Code
+	.byte	17                              # DW_TAG_compile_unit
+	.byte	1                               # DW_CHILDREN_yes
+	.byte	37                              # DW_AT_producer
+	.byte	37                              # DW_FORM_strx1
+	.byte	19                              # DW_AT_language
+	.byte	5                               # DW_FORM_data2
+	.byte	3                               # DW_AT_name
+	.byte	37                              # DW_FORM_strx1
+	.byte	114                             # DW_AT_str_offsets_base
+	.byte	23                              # DW_FORM_sec_offset
+	.byte	16                              # DW_AT_stmt_list
+	.byte	23                              # DW_FORM_sec_offset
+	.byte	27                              # DW_AT_comp_dir
+	.byte	37                              # DW_FORM_strx1
+	.byte	17                              # DW_AT_low_pc
+	.byte	27                              # DW_FORM_addrx
+	.byte	18                              # DW_AT_high_pc
+	.byte	6                               # DW_FORM_data4
+	.byte	115                             # DW_AT_addr_base
+	.byte	23                              # DW_FORM_sec_offset
+	.byte	0                               # EOM(1)
+	.byte	0                               # EOM(2)
+	.byte	2                               # Abbreviation Code
+	.byte	52                              # DW_TAG_variable
+	.byte	0                               # DW_CHILDREN_no
+	.byte	3                               # DW_AT_name
+	.byte	37                              # DW_FORM_strx1
+	.byte	73                              # DW_AT_type
+	.byte	19                              # DW_FORM_ref4
+	.byte	63                              # DW_AT_external
+	.byte	25                              # DW_FORM_flag_present
+	.byte	58                              # DW_AT_decl_file
+	.byte	11                              # DW_FORM_data1
+	.byte	59                              # DW_AT_decl_line
+	.byte	11                              # DW_FORM_data1
+	.byte	2                               # DW_AT_location
+	.byte	24                              # DW_FORM_exprloc
+	.byte	0                               # EOM(1)
+	.byte	0                               # EOM(2)
+	.byte	3                               # Abbreviation Code
+	.byte	36                              # DW_TAG_base_type
+	.byte	0                               # DW_CHILDREN_no
+	.byte	3                               # DW_AT_name
+	.byte	37                              # DW_FORM_strx1
+	.byte	62                              # DW_AT_encoding
+	.byte	11                              # DW_FORM_data1
+	.byte	11                              # DW_AT_byte_size
+	.byte	11                              # DW_FORM_data1
+	.byte	0                               # EOM(1)
+	.byte	0                               # EOM(2)
+	.byte	4                               # Abbreviation Code
+	.byte	52                              # DW_TAG_variable
+	.byte	0                               # DW_CHILDREN_no
+	.byte	3                               # DW_AT_name
+	.byte	37                              # DW_FORM_strx1
+	.byte	73                              # DW_AT_type
+	.byte	19                              # DW_FORM_ref4
+	.byte	58                              # DW_AT_decl_file
+	.byte	11                              # DW_FORM_data1
+	.byte	59                              # DW_AT_decl_line
+	.byte	11                              # DW_FORM_data1
+	.byte	2                               # DW_AT_location
+	.byte	24                              # DW_FORM_exprloc
+	.byte	0                               # EOM(1)
+	.byte	0                               # EOM(2)
+	.byte	5                               # Abbreviation Code
+	.byte	1                               # DW_TAG_array_type
+	.byte	1                               # DW_CHILDREN_yes
+	.byte	73                              # DW_AT_type
+	.byte	19                              # DW_FORM_ref4
+	.byte	0                               # EOM(1)
+	.byte	0                               # EOM(2)
+	.byte	6                               # Abbreviation Code
+	.byte	33                              # DW_TAG_subrange_type
+	.byte	0                               # DW_CHILDREN_no
+	.byte	73                              # DW_AT_type
+	.byte	19                              # DW_FORM_ref4
+	.byte	55                              # DW_AT_count
+	.byte	11                              # DW_FORM_data1
+	.byte	0                               # EOM(1)
+	.byte	0                               # EOM(2)
+	.byte	7                               # Abbreviation Code
+	.byte	38                              # DW_TAG_const_type
+	.byte	0                               # DW_CHILDREN_no
+	.byte	73                              # DW_AT_type
+	.byte	19                              # DW_FORM_ref4
+	.byte	0                               # EOM(1)
+	.byte	0                               # EOM(2)
+	.byte	8                               # Abbreviation Code
+	.byte	36                              # DW_TAG_base_type
+	.byte	0                               # DW_CHILDREN_no
+	.byte	3                               # DW_AT_name
+	.byte	37                              # DW_FORM_strx1
+	.byte	11                              # DW_AT_byte_size
+	.byte	11                              # DW_FORM_data1
+	.byte	62                              # DW_AT_encoding
+	.byte	11                              # DW_FORM_data1
+	.byte	0                               # EOM(1)
+	.byte	0                               # EOM(2)
+	.byte	9                               # Abbreviation Code
+	.byte	46                              # DW_TAG_subprogram
+	.byte	0                               # DW_CHILDREN_no
+	.byte	17                              # DW_AT_low_pc
+	.byte	27                              # DW_FORM_addrx
+	.byte	18                              # DW_AT_high_pc
+	.byte	6                               # DW_FORM_data4
+	.byte	64                              # DW_AT_frame_base
+	.byte	24                              # DW_FORM_exprloc
+	.byte	3                               # DW_AT_name
+	.byte	37                              # DW_FORM_strx1
+	.byte	58                              # DW_AT_decl_file
+	.byte	11                              # DW_FORM_data1
+	.byte	59                              # DW_AT_decl_line
+	.byte	11                              # DW_FORM_data1
+	.byte	39                              # DW_AT_prototyped
+	.byte	25                              # DW_FORM_flag_present
+	.byte	73                              # DW_AT_type
+	.byte	19                              # DW_FORM_ref4
+	.byte	63                              # DW_AT_external
+	.byte	25                              # DW_FORM_flag_present
+	.byte	0                               # EOM(1)
+	.byte	0                               # EOM(2)
+	.byte	0                               # EOM(3)
+	.section	.debug_info,"",@progbits
+.Lcu_begin0:
+	.long	.Ldebug_info_end0-.Ldebug_info_start0 # Length of Unit
+.Ldebug_info_start0:
+	.short	5                               # DWARF version number
+	.byte	1                               # DWARF Unit Type
+	.byte	8                               # Address Size (in bytes)
+	.long	.debug_abbrev                   # Offset Into Abbrev. Section
+	.byte	1                               # Abbrev [1] 0xc:0x7f DW_TAG_compile_unit
+	.byte	0                               # DW_AT_producer
+	.short	12                              # DW_AT_language
+	.byte	1                               # DW_AT_name
+	.long	.Lstr_offsets_base0             # DW_AT_str_offsets_base
+	.long	.Lline_table_start0             # DW_AT_stmt_list
+	.byte	2                               # DW_AT_comp_dir
+	.byte	4                               # DW_AT_low_pc
+	.long	.Lfunc_end1-.Lfunc_begin0       # DW_AT_high_pc
+	.long	.Laddr_table_base0              # DW_AT_addr_base
+	.byte	2                               # Abbrev [2] 0x23:0xb DW_TAG_variable
+	.byte	3                               # DW_AT_name
+	.long	46                              # DW_AT_type
+                                        # DW_AT_external
+	.byte	0                               # DW_AT_decl_file
+	.byte	7                               # DW_AT_decl_line
+	.byte	2                               # DW_AT_location
+	.byte	161
+	.byte	0
+	.byte	3                               # Abbrev [3] 0x2e:0x4 DW_TAG_base_type
+	.byte	4                               # DW_AT_name
+	.byte	5                               # DW_AT_encoding
+	.byte	4                               # DW_AT_byte_size
+	.byte	2                               # Abbrev [2] 0x32:0xb DW_TAG_variable
+	.byte	5                               # DW_AT_name
+	.long	46                              # DW_AT_type
+                                        # DW_AT_external
+	.byte	0                               # DW_AT_decl_file
+	.byte	6                               # DW_AT_decl_line
+	.byte	2                               # DW_AT_location
+	.byte	161
+	.byte	1
+	.byte	4                               # Abbrev [4] 0x3d:0xb DW_TAG_variable
+	.byte	6                               # DW_AT_name
+	.long	46                              # DW_AT_type
+	.byte	0                               # DW_AT_decl_file
+	.byte	8                               # DW_AT_decl_line
+	.byte	2                               # DW_AT_location
+	.byte	161
+	.byte	2
+	.byte	4                               # Abbrev [4] 0x48:0xb DW_TAG_variable
+	.byte	7                               # DW_AT_name
+	.long	83                              # DW_AT_type
+	.byte	0                               # DW_AT_decl_file
+	.byte	9                               # DW_AT_decl_line
+	.byte	2                               # DW_AT_location
+	.byte	161
+	.byte	3
+	.byte	5                               # Abbrev [5] 0x53:0xc DW_TAG_array_type
+	.long	95                              # DW_AT_type
+	.byte	6                               # Abbrev [6] 0x58:0x6 DW_TAG_subrange_type
+	.long	104                             # DW_AT_type
+	.byte	7                               # DW_AT_count
+	.byte	0                               # End Of Children Mark
+	.byte	7                               # Abbrev [7] 0x5f:0x5 DW_TAG_const_type
+	.long	100                             # DW_AT_type
+	.byte	3                               # Abbrev [3] 0x64:0x4 DW_TAG_base_type
+	.byte	8                               # DW_AT_name
+	.byte	6                               # DW_AT_encoding
+	.byte	1                               # DW_AT_byte_size
+	.byte	8                               # Abbrev [8] 0x68:0x4 DW_TAG_base_type
+	.byte	9                               # DW_AT_name
+	.byte	8                               # DW_AT_byte_size
+	.byte	7                               # DW_AT_encoding
+	.byte	9                               # Abbrev [9] 0x6c:0xf DW_TAG_subprogram
+	.byte	4                               # DW_AT_low_pc
+	.long	.Lfunc_end0-.Lfunc_begin0       # DW_AT_high_pc
+	.byte	1                               # DW_AT_frame_base
+	.byte	86
+	.byte	10                              # DW_AT_name
+	.byte	0                               # DW_AT_decl_file
+	.byte	12                              # DW_AT_decl_line
+                                        # DW_AT_prototyped
+	.long	46                              # DW_AT_type
+                                        # DW_AT_external
+	.byte	9                               # Abbrev [9] 0x7b:0xf DW_TAG_subprogram
+	.byte	5                               # DW_AT_low_pc
+	.long	.Lfunc_end1-.Lfunc_begin1       # DW_AT_high_pc
+	.byte	1                               # DW_AT_frame_base
+	.byte	86
+	.byte	11                              # DW_AT_name
+	.byte	0                               # DW_AT_decl_file
+	.byte	18                              # DW_AT_decl_line
+                                        # DW_AT_prototyped
+	.long	46                              # DW_AT_type
+                                        # DW_AT_external
+	.byte	0                               # End Of Children Mark
+.Ldebug_info_end0:
+	.section	.debug_str_offsets,"",@progbits
+	.long	52                              # Length of String Offsets Set
+	.short	5
+	.short	0
+.Lstr_offsets_base0:
+	.section	.debug_str,"MS",@progbits,1
+.Linfo_string0:
+	.asciz	"Ubuntu clang version 12.0.0-3ubuntu1~20.04.5" # string offset=0
+.Linfo_string1:
+	.asciz	"testprog.c"                    # string offset=45
+.Linfo_string2:
+	.asciz	"/home/kavitha/workarea/binutils-gdb-amd/binutils/testsuite/binutils-all" # string offset=56
+.Linfo_string3:
+	.asciz	"global"                        # string offset=128
+.Linfo_string4:
+	.asciz	"int"                           # string offset=135
+.Linfo_string5:
+	.asciz	"common"                        # string offset=139
+.Linfo_string6:
+	.asciz	"local"                         # string offset=146
+.Linfo_string7:
+	.asciz	"string"                        # string offset=152
+.Linfo_string8:
+	.asciz	"char"                          # string offset=159
+.Linfo_string9:
+	.asciz	"__ARRAY_SIZE_TYPE__"           # string offset=164
+.Linfo_string10:
+	.asciz	"fn"                            # string offset=184
+.Linfo_string11:
+	.asciz	"main"                          # string offset=187
+	.section	.debug_str_offsets,"",@progbits
+	.long	.Linfo_string0
+	.long	.Linfo_string1
+	.long	.Linfo_string2
+	.long	.Linfo_string3
+	.long	.Linfo_string4
+	.long	.Linfo_string5
+	.long	.Linfo_string6
+	.long	.Linfo_string7
+	.long	.Linfo_string8
+	.long	.Linfo_string9
+	.long	.Linfo_string10
+	.long	.Linfo_string11
+	.section	.debug_addr,"",@progbits
+	.long	.Ldebug_addr_end0-.Ldebug_addr_start0 # Length of contribution
+.Ldebug_addr_start0:
+	.short	5                               # DWARF version number
+	.byte	8                               # Address size
+	.byte	0                               # Segment selector size
+.Laddr_table_base0:
+	.quad	global
+	.quad	common
+	.quad	local
+	.quad	string
+	.quad	.Lfunc_begin0
+	.quad	.Lfunc_begin1
+.Ldebug_addr_end0:
+	.ident	"Ubuntu clang version 12.0.0-3ubuntu1~20.04.5"
+	.section	".note.GNU-stack","",@progbits
+	.section	.debug_line,"",@progbits
+.Lline_table_start0:
-- 
2.25.1


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] Binutils support for DWARF-5 DW_OP_addrx
  2022-04-28 10:14 [PATCH] Binutils support for DWARF-5 DW_OP_addrx Natarajan, Kavitha
@ 2022-04-29 14:21 ` Nick Clifton
  2022-05-20 10:38   ` Natarajan, Kavitha
  0 siblings, 1 reply; 12+ messages in thread
From: Nick Clifton @ 2022-04-29 14:21 UTC (permalink / raw)
  To: Natarajan, Kavitha, binutils; +Cc: George, Jini Susan

Hi Natarajan,

> [Public]

(Thanks for re-posting).

> Please review.

The patch introduced some new failures into the binutils testsuite.  For example
the new testprog.s source file fails to assemble on most architectures because it
contains x86_64 instructions...


> @@ -2661,9 +2665,10 @@ read_and_display_attr_value (unsigned long           attribute,
> 
>         uvalue = check_uvalue (block_start, uvalue, end);
> 
> -      if (do_loc)
> -    data = block_start + uvalue;
> -      else
> +      data = block_start + uvalue;
> +
> +      /* DW_OP_addrx has only the index and not address.  */
> +      if (!do_loc && ((unsigned)(*block_start) != DW_OP_addrx))

This looks wrong to me.  Why are you testing the first word of
the block for a DW_OP_addrx op ?  At this point the code is just
displaying the contents of the block, not interpreting them.  Plus
you do not check to see that there are enough bytes present in the
block to make up a word.

Cheers
   Nick


^ permalink raw reply	[flat|nested] 12+ messages in thread

* RE: [PATCH] Binutils support for DWARF-5 DW_OP_addrx
  2022-04-29 14:21 ` Nick Clifton
@ 2022-05-20 10:38   ` Natarajan, Kavitha
  2022-05-25 15:13     ` Nick Clifton
  0 siblings, 1 reply; 12+ messages in thread
From: Natarajan, Kavitha @ 2022-05-20 10:38 UTC (permalink / raw)
  To: Nick Clifton, binutils; +Cc: George, Jini Susan

[Public]

Hi Nick,

Thanks for your comments.

> The patch introduced some new failures into the binutils testsuite.  For
> example the new testprog.s source file fails to assemble on most
> architectures because it contains x86_64 instructions...

Modified test cases.

>
> > @@ -2661,9 +2665,10 @@ read_and_display_attr_value (unsigned long
> attribute,
> >
> >         uvalue = check_uvalue (block_start, uvalue, end);
> >
> > -      if (do_loc)
> > -    data = block_start + uvalue;
> > -      else
> > +      data = block_start + uvalue;
> > +
> > +      /* DW_OP_addrx has only the index and not address.  */
> > +      if (!do_loc && ((unsigned)(*block_start) != DW_OP_addrx))
>
> This looks wrong to me.  Why are you testing the first word of the block for a
> DW_OP_addrx op ?  At this point the code is just displaying the contents of
> the block, not interpreting them.  Plus you do not check to see that there are
> enough bytes present in the block to make up a word.

Safe byte read is done now. The code checks for encodings after displaying
the block in decode_location_expression(), reading the next word. As DW_OP_addrx
is an index, checking ahead if it is DW_OP_addrx op and avoid displaying the
incorrect block data. Attaching the updated patch.

Regards,
Kavitha
========================================================================
Binutils tools such as objdump and readelf to support new dwarf-5
operation encoding, such as, DW_OP_addrx.

Added test points in objdump.exp and readlef.exp.

---
 binutils/dwarf.c                            |  16 ++-
 binutils/testsuite/binutils-all/dw5-op.S    | 134 ++++++++++++++++++++
 binutils/testsuite/binutils-all/dw5-op.W    |  35 +++++
 binutils/testsuite/binutils-all/objdump.exp |  43 ++++++-
 binutils/testsuite/binutils-all/readelf.exp |  19 +++
 5 files changed, 242 insertions(+), 5 deletions(-)
 create mode 100644 binutils/testsuite/binutils-all/dw5-op.S
 create mode 100644 binutils/testsuite/binutils-all/dw5-op.W

diff --git a/binutils/dwarf.c b/binutils/dwarf.c
index e61c63a0601..698b8fc62d2 100644
--- a/binutils/dwarf.c
+++ b/binutils/dwarf.c
@@ -1721,6 +1721,10 @@ decode_location_expression (unsigned char * data,
          printf ("DW_OP_GNU_parameter_ref: <0x%s>",
                  dwarf_vmatoa ("x", cu_offset + uvalue));
          break;
+       case DW_OP_addrx:
+         READ_ULEB (uvalue, data, end);
+         printf ("DW_OP_addrx <0x%s>", dwarf_vmatoa ("x", uvalue));
+         break;
        case DW_OP_GNU_addr_index:
          READ_ULEB (uvalue, data, end);
          printf ("DW_OP_GNU_addr_index <0x%s>", dwarf_vmatoa ("x", uvalue));
@@ -2661,10 +2665,14 @@ read_and_display_attr_value (unsigned long           attribute,

       uvalue = check_uvalue (block_start, uvalue, end);

-      if (do_loc)
-       data = block_start + uvalue;
-      else
-       data = display_block (block_start, uvalue, end, delimiter);
+      data = block_start + uvalue;
+
+      if (!do_loc) {
+       unsigned char op;
+       SAFE_BYTE_GET (op, block_start, sizeof(unsigned char), end);
+       if (op != DW_OP_addrx)
+         data = display_block (block_start, uvalue, end, delimiter);
+      }
       break;

     case DW_FORM_block1:
diff --git a/binutils/testsuite/binutils-all/dw5-op.S b/binutils/testsuite/binutils-all/dw5-op.S
new file mode 100644
index 00000000000..ba4037786d4
--- /dev/null
+++ b/binutils/testsuite/binutils-all/dw5-op.S
@@ -0,0 +1,134 @@
+/* Copyright (C) 2017-2022 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+       .file   "main.c"
+       .text
+.Letext0:
+       .section        .debug_info,"",%progbits
+.Ldebug_info0:
+       .4byte  0x4e    /* Length of Compilation Unit Info */
+       .2byte  0x5     /* DWARF version number */
+       .byte   0x1     /* DW_UT_compile */
+       .byte   0x8     /* Pointer Size (in bytes) */
+       .4byte  .Ldebug_abbrev0 /* Offset Into Abbrev. Section */
+       .uleb128 0x3    /* (DIE (0xc) DW_TAG_compile_unit) */
+       .4byte  .LASF21 /* DW_AT_producer: "GNU C11 7.0.1 20170218 (experimental) -mtune=generic -march=x86-64 -gdwarf-5 -O2" */
+       .byte   0x1d    /* DW_AT_language */
+       .4byte  .LASF0  /* DW_AT_name: "main.c" */
+       .4byte  .LASF1  /* DW_AT_comp_dir: "" */
+       .4byte  .LLRL2  /* DW_AT_ranges */
+       .8byte  0       /* DW_AT_low_pc */
+       .4byte  .Ldebug_line0   /* DW_AT_stmt_list */
+       .uleb128 0x1    /* (DIE (0x2a) DW_TAG_base_type) */
+       .byte   0x4     /* DW_AT_byte_size */
+       .byte   0x5     /* DW_AT_encoding */
+       .4byte  .LASF2  /* DW_AT_name: "short int" */
+       .uleb128 0x2    /* (DIE (0x31) DW_TAG_variable) */
+       .4byte  .LASF16 /* DW_AT_name: "xvar" */
+                       /* DW_AT_decl_file (1, main.c) */
+       .byte   0x2     /* DW_AT_decl_line */
+       .4byte  0x2a    /* DW_AT_type */
+                       /* DW_AT_external */
+       .uleb128 0x9    /* DW_AT_location */
+       .byte   0x3     /* DW_OP_addr */
+       .8byte  0x1234
+       .uleb128 0x2    /* (DIE (0x45) DW_TAG_variable) */
+       .4byte  .LASF17 /* DW_AT_name: "yvar" */
+                       /* DW_AT_decl_file (1, main.c) */
+       .byte   0x3     /* DW_AT_decl_line */
+       .4byte  0x2a    /* DW_AT_type */
+                       /* DW_AT_external */
+       .uleb128 0x2    /* DW_AT_location */
+       .byte   0xa1    /* DW_OP_addrx */
+       .byte   0x0
+       .section        .debug_abbrev,"",%progbits
+.Ldebug_abbrev0:
+       .uleb128 0x1    /* (abbrev code) */
+       .uleb128 0x24   /* (TAG: DW_TAG_base_type) */
+       .byte   0       /* DW_children_no */
+       .uleb128 0xb    /* (DW_AT_byte_size) */
+       .uleb128 0xb    /* (DW_FORM_data1) */
+       .uleb128 0x3e   /* (DW_AT_encoding) */
+       .uleb128 0xb    /* (DW_FORM_data1) */
+       .uleb128 0x3    /* (DW_AT_name) */
+       .uleb128 0xe    /* (DW_FORM_strp) */
+       .byte   0
+       .byte   0
+       .uleb128 0x2    /* (abbrev code) */
+       .uleb128 0x34   /* (TAG: DW_TAG_variable) */
+       .byte   0       /* DW_children_no */
+       .uleb128 0x3    /* (DW_AT_name) */
+       .uleb128 0xe    /* (DW_FORM_strp) */
+       .uleb128 0x3a   /* (DW_AT_decl_file) */
+       .uleb128 0x21   /* (DW_FORM_implicit_const) */
+       .sleb128 1      /* (main.c) */
+       .uleb128 0x3b   /* (DW_AT_decl_line) */
+       .uleb128 0xb    /* (DW_FORM_data1) */
+       .uleb128 0x49   /* (DW_AT_type) */
+       .uleb128 0x13   /* (DW_FORM_ref4) */
+       .uleb128 0x3f   /* (DW_AT_external) */
+       .uleb128 0x19   /* (DW_FORM_flag_present) */
+       .uleb128 0x2    /* (DW_AT_location) */
+       .uleb128 0x18   /* (DW_FORM_exprloc) */
+       .byte   0
+       .byte   0
+       .uleb128 0x3    /* (abbrev code) */
+       .uleb128 0x11   /* (TAG: DW_TAG_compile_unit) */
+       .byte   0x1     /* DW_children_yes */
+       .uleb128 0x25   /* (DW_AT_producer) */
+       .uleb128 0xe    /* (DW_FORM_strp) */
+       .uleb128 0x13   /* (DW_AT_language) */
+       .uleb128 0xb    /* (DW_FORM_data1) */
+       .uleb128 0x3    /* (DW_AT_name) */
+       .uleb128 0x1f   /* (DW_FORM_line_strp) */
+       .uleb128 0x1b   /* (DW_AT_comp_dir) */
+       .uleb128 0x1f   /* (DW_FORM_line_strp) */
+       .uleb128 0x55   /* (DW_AT_ranges) */
+       .uleb128 0x17   /* (DW_FORM_sec_offset) */
+       .uleb128 0x11   /* (DW_AT_low_pc) */
+       .uleb128 0x1    /* (DW_FORM_addr) */
+       .uleb128 0x10   /* (DW_AT_stmt_list) */
+       .uleb128 0x17   /* (DW_FORM_sec_offset) */
+       .byte   0
+       .byte   0
+       .byte   0
+       .section        .debug_line,"",%progbits
+.Ldebug_line0:
+       .4byte  .LELT0-.LSLT0   /* Length of Source Line Info */
+.LSLT0:
+       .2byte  0x5     /* DWARF Version */
+       .byte   0x8     /* Address Size */
+       .byte   0       /* Segment Size */
+       .4byte  .LASF0  /* File Entry: 0: "main.c" */
+       .byte   0
+.LELT0:
+       .section        .debug_str,"MS",%progbits,1
+.LASF22:
+       .asciz  "main"
+.LASF16:
+       .asciz  "xvar"
+.LASF21:
+       .asciz  "GNU C11 7.0.1 20170218 (experimental) -mtune=generic -march=x86-64 -gdwarf-5 -O2"
+.LASF17:
+       .asciz  "yvar"
+.LASF7:
+       .asciz  "short int"
+       .section        .debug_line_str,"MS",%progbits,1
+.LASF1:
+       .asciz  ""
+.LASF25:
+       .asciz  ""
+.LASF0:
+       .asciz  "main.c"
diff --git a/binutils/testsuite/binutils-all/dw5-op.W b/binutils/testsuite/binutils-all/dw5-op.W
new file mode 100644
index 00000000000..6acb9dbd9b8
--- /dev/null
+++ b/binutils/testsuite/binutils-all/dw5-op.W
@@ -0,0 +1,35 @@
+Contents of the .debug_info section:
+
+  Compilation Unit @ offset 0x0:
+   Length:        0x4e \(32-bit\)
+   Version:       5
+   Unit Type:     DW_UT_compile \(1\)
+   Abbrev Offset: 0x0
+   Pointer Size:  8
+ <0><c>: Abbrev Number: 3 \(DW_TAG_compile_unit\)
+    <d>   DW_AT_producer    : \(indirect string, offset: 0xa\): GNU C11 7.0.1 20170218 \(experimental\) -mtune=generic -march=x86-64 -gdwarf-5 -O2
+    <11>   DW_AT_language    : 29      \(C11\)
+    <12>   DW_AT_name        : \(indirect line string, offset: 0x2\): main.c
+    <16>   DW_AT_comp_dir    : \(indirect line string, offset: 0x0\):
+    <1a>   DW_AT_ranges      : 0x0
+    <1e>   DW_AT_low_pc      : 0x0
+    <26>   DW_AT_stmt_list   : 0x0
+ <1><2a>: Abbrev Number: 1 \(DW_TAG_base_type\)
+    <2b>   DW_AT_byte_size   : 4
+    <2c>   DW_AT_encoding    : 5       \(signed\)
+    <2d>   DW_AT_name        : \(indirect string, offset: 0x0\): main
+ <1><31>: Abbrev Number: 2 \(DW_TAG_variable\)
+    <32>   DW_AT_name        : \(indirect string, offset: 0x5\): xvar
+    <36>   DW_AT_decl_file   : 1
+    <36>   DW_AT_decl_line   : 2
+    <37>   DW_AT_type        : <0x2a>
+    <3b>   DW_AT_external    : 1
+    <3b>   DW_AT_location    : 9 byte block: 3 34 12 0 0 0 0 0 0       \(DW_OP_addr: 1234\)
+ <1><45>: Abbrev Number: 2 \(DW_TAG_variable\)
+    <46>   DW_AT_name        : \(indirect string, offset: 0x5b\): yvar
+    <4a>   DW_AT_decl_file   : 1
+    <4a>   DW_AT_decl_line   : 3
+    <4b>   DW_AT_type        : <0x2a>
+    <4f>   DW_AT_external    : 1
+    <4f>   DW_AT_location    : \(DW_OP_addrx <0x0>\)
+
diff --git a/binutils/testsuite/binutils-all/objdump.exp b/binutils/testsuite/binutils-all/objdump.exp
index 0f160ae5a06..8df09533f7a 100644
--- a/binutils/testsuite/binutils-all/objdump.exp
+++ b/binutils/testsuite/binutils-all/objdump.exp
@@ -513,6 +513,47 @@ if { ![is_elf_format] } then {
     }
 }

+# Test objdump -Wi on a file containing dwarf-5 encodings information.
+
+if { ![is_elf_format] } then {
+    unsupported "objdump DW_OP_* test"
+} elseif { ![binutils_assemble $srcdir/$subdir/dw5-op.S tmpdir/dw5-op.${obj}] } then {
+    fail "objdump DW_OP_* test"
+} else {
+    if [is_remote host] {
+       set op_testfile [remote_download host tmpdir/dw5-op.${obj}]
+    } else {
+       set op_testfile tmpdir/dw5-op.${obj}
+    }
+
+    set got [remote_exec host "$OBJDUMP $OBJDUMPFLAGS -Wi $op_testfile" "" "/dev/null" "objdump.out"]
+
+    if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
+       fail "objdump -Wi (reason: unexpected output)"
+       send_log $got
+       send_log "\n"
+    }
+
+    set got [remote_exec host "tail -n +4 objdump.out" "" "/dev/null" "objdump.out"]
+    set output [remote_upload host objdump.out]
+
+    if ![file size $output] then {
+       # If the output file is empty, then this target does not
+       # generate dwarf2 output.  This is not a failure.
+       verbose "No output from 'objdump -Wi'"
+       untested "objdump -Wi"
+       return
+    }
+
+    if { [regexp_diff objdump.out $srcdir/$subdir/dw5-op.W] } then {
+       fail "objdump -Wi for DW_OP_*"
+    } else {
+       pass "objdump -Wi for DW_OP_*"
+    }
+
+    file_on_host delete $output
+}
+
 proc test_build_id_debuglink {} {
     global srcdir
     global subdir
@@ -522,7 +563,7 @@ proc test_build_id_debuglink {} {
     global OBJDUMP
     global CFLAGS_FOR_TARGET
     global exe
-
+
     set test "build-id-debuglink"

     # Use a fixed build-id.
diff --git a/binutils/testsuite/binutils-all/readelf.exp b/binutils/testsuite/binutils-all/readelf.exp
index 8ff756e506f..96b59f958ba 100644
--- a/binutils/testsuite/binutils-all/readelf.exp
+++ b/binutils/testsuite/binutils-all/readelf.exp
@@ -596,3 +596,22 @@ if ![is_remote host] {
        readelf_test {--debug-dump=macro -wN} $tempfile pr26112.r
     }
 }
+
+# Check dwarf-5 support for DW_OP_addrx.
+if {![binutils_assemble_flags $srcdir/$subdir/dw5-op.S tmpdir/dw5-op.o $hpux]} then {
+    unsupported "readelf -wi dw5-op (failed to assemble)"
+} else {
+
+# Download it.
+if ![is_remote host] {
+    set tempfile tmpdir/dw5-op.o
+} else {
+    set tempfile [remote_download host tmpdir/dw5-op.o]
+}
+
+# First, determine the size, so specific output matchers can be used.
+readelf_find_size $tempfile 2
+
+# Make sure that readelf can decode the contents.
+readelf_test -wi $tempfile dw5-op.W
+}
--


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] Binutils support for DWARF-5 DW_OP_addrx
  2022-05-20 10:38   ` Natarajan, Kavitha
@ 2022-05-25 15:13     ` Nick Clifton
  2022-05-25 23:42       ` Alan Modra
  0 siblings, 1 reply; 12+ messages in thread
From: Nick Clifton @ 2022-05-25 15:13 UTC (permalink / raw)
  To: Natarajan, Kavitha, binutils; +Cc: George, Jini Susan

Hi Kavitha,

   Thanks for the revised patch.  I have gone ahead and
   applied it to the sources.

Cheers
   Nick


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] Binutils support for DWARF-5 DW_OP_addrx
  2022-05-25 15:13     ` Nick Clifton
@ 2022-05-25 23:42       ` Alan Modra
  2022-05-26  4:35         ` Natarajan, Kavitha
  2022-05-26  7:19         ` Luis Machado
  0 siblings, 2 replies; 12+ messages in thread
From: Alan Modra @ 2022-05-25 23:42 UTC (permalink / raw)
  To: Nick Clifton, Kavitha.Natarajan; +Cc: binutils

On Wed, May 25, 2022 at 04:13:31PM +0100, Nick Clifton wrote:
> Hi Kavitha,
> 
>    Thanks for the revised patch.  I have gone ahead and
>    applied it to the sources.

And now with the missing testsuite files committed, which needed
editing to fix whitespace.  (Presumably Kavitha's email client
"helpfully" expanded tabs.)

I also fixed the endian issue in dw5-op.W that caused the following:
aarch64_be-linux-gnu_ilp32  +FAIL: objdump -Wi for DW_OP_*
aarch64_be-linux-gnu_ilp32  +FAIL: readelf -wi dw5-op
armeb-linuxeabi  +FAIL: objdump -Wi for DW_OP_*
armeb-linuxeabi  +FAIL: readelf -wi dw5-op
d10v-elf  +FAIL: objdump -Wi for DW_OP_*
d10v-elf  +FAIL: readelf -wi dw5-op
d30v-elf  +FAIL: objdump -Wi for DW_OP_*
d30v-elf  +FAIL: readelf -wi dw5-op
dlx-elf  +FAIL: objdump -Wi for DW_OP_*
dlx-elf  +FAIL: readelf -wi dw5-op
fr30-elf  +FAIL: objdump -Wi for DW_OP_*
fr30-elf  +FAIL: readelf -wi dw5-op
frv-elf  +FAIL: objdump -Wi for DW_OP_*
frv-elf  +FAIL: readelf -wi dw5-op
frv-linux  +FAIL: objdump -Wi for DW_OP_*
frv-linux  +FAIL: readelf -wi dw5-op
h8300-elf  +FAIL: objdump -Wi for DW_OP_*
h8300-elf  +FAIL: readelf -wi dw5-op
h8300-linux  +FAIL: objdump -Wi for DW_OP_*
h8300-linux  +FAIL: readelf -wi dw5-op
hppa64-hp-hpux11.23  +FAIL: objdump -Wi for DW_OP_*
hppa64-hp-hpux11.23  +FAIL: readelf -wi dw5-op
hppa64-linux  +FAIL: objdump -Wi for DW_OP_*
hppa64-linux  +FAIL: readelf -wi dw5-op
hppa-linux  +FAIL: objdump -Wi for DW_OP_*
hppa-linux  +FAIL: readelf -wi dw5-op
ia64-hpux  +FAIL: objdump -Wi for DW_OP_*
ia64-hpux  +FAIL: readelf -wi dw5-op
ip2k-elf  +FAIL: objdump -Wi for DW_OP_*
ip2k-elf  +FAIL: readelf -wi dw5-op
iq2000-elf  +FAIL: objdump -Wi for DW_OP_*
iq2000-elf  +FAIL: readelf -wi dw5-op
lm32-elf  +FAIL: objdump -Wi for DW_OP_*
lm32-elf  +FAIL: readelf -wi dw5-op
lm32-linux  +FAIL: objdump -Wi for DW_OP_*
lm32-linux  +FAIL: readelf -wi dw5-op
m32r-elf  +FAIL: objdump -Wi for DW_OP_*
m32r-elf  +FAIL: readelf -wi dw5-op
m32r-linux  +FAIL: objdump -Wi for DW_OP_*
m32r-linux  +FAIL: readelf -wi dw5-op
m68hc11-elf  +FAIL: objdump -Wi for DW_OP_*
m68hc11-elf  +FAIL: readelf -wi dw5-op
m68hc12-elf  +FAIL: objdump -Wi for DW_OP_*
m68hc12-elf  +FAIL: readelf -wi dw5-op
m68k-elf  +FAIL: objdump -Wi for DW_OP_*
m68k-elf  +FAIL: readelf -wi dw5-op
m68k-linux  +FAIL: objdump -Wi for DW_OP_*
m68k-linux  +FAIL: readelf -wi dw5-op
microblaze-elf  +FAIL: objdump -Wi for DW_OP_*
microblaze-elf  +FAIL: readelf -wi dw5-op
microblaze-linux  +FAIL: objdump -Wi for DW_OP_*
microblaze-linux  +FAIL: readelf -wi dw5-op
mips64-linux  +FAIL: objdump -Wi for DW_OP_*
mips64-linux  +FAIL: readelf -wi dw5-op
mips64-openbsd  +FAIL: objdump -Wi for DW_OP_*
mips64-openbsd  +FAIL: readelf -wi dw5-op
mips-linux  +FAIL: objdump -Wi for DW_OP_*
mips-linux  +FAIL: readelf -wi dw5-op
mips-sgi-irix6  +FAIL: objdump -Wi for DW_OP_*
mips-sgi-irix6  +FAIL: readelf -wi dw5-op
mipstx39-elf  +FAIL: objdump -Wi for DW_OP_*
mipstx39-elf  +FAIL: readelf -wi dw5-op
moxie-elf  +FAIL: objdump -Wi for DW_OP_*
moxie-elf  +FAIL: readelf -wi dw5-op
mt-elf  +FAIL: objdump -Wi for DW_OP_*
mt-elf  +FAIL: readelf -wi dw5-op
nds32be-elf  +FAIL: objdump -Wi for DW_OP_*
nds32be-elf  +FAIL: readelf -wi dw5-op
or1k-elf  +FAIL: objdump -Wi for DW_OP_*
or1k-elf  +FAIL: readelf -wi dw5-op
or1k-linux  +FAIL: objdump -Wi for DW_OP_*
or1k-linux  +FAIL: readelf -wi dw5-op
pj-elf  +FAIL: objdump -Wi for DW_OP_*
pj-elf  +FAIL: readelf -wi dw5-op
powerpc64-freebsd  +FAIL: objdump -Wi for DW_OP_*
powerpc64-freebsd  +FAIL: readelf -wi dw5-op
powerpc64-linux  +FAIL: objdump -Wi for DW_OP_*
powerpc64-linux  +FAIL: readelf -wi dw5-op
powerpc-eabisim  +FAIL: objdump -Wi for DW_OP_*
powerpc-eabisim  +FAIL: readelf -wi dw5-op
powerpc-eabivle  +FAIL: objdump -Wi for DW_OP_*
powerpc-eabivle  +FAIL: readelf -wi dw5-op
powerpc-freebsd  +FAIL: objdump -Wi for DW_OP_*
powerpc-freebsd  +FAIL: readelf -wi dw5-op
powerpc-linux  +FAIL: objdump -Wi for DW_OP_*
powerpc-linux  +FAIL: readelf -wi dw5-op
powerpc-nto  +FAIL: objdump -Wi for DW_OP_*
powerpc-nto  +FAIL: readelf -wi dw5-op
s12z-elf  +FAIL: objdump -Wi for DW_OP_*
s12z-elf  +FAIL: readelf -wi dw5-op
s390-linux  +FAIL: objdump -Wi for DW_OP_*
s390-linux  +FAIL: readelf -wi dw5-op
s390x-linux  +FAIL: objdump -Wi for DW_OP_*
s390x-linux  +FAIL: readelf -wi dw5-op
score-elf  +FAIL: objdump -Wi for DW_OP_*
score-elf  +FAIL: readelf -wi dw5-op
sh-nto  +FAIL: objdump -Wi for DW_OP_*
sh-nto  +FAIL: readelf -wi dw5-op
sh-rtems  +FAIL: objdump -Wi for DW_OP_*
sh-rtems  +FAIL: readelf -wi dw5-op
sparc64-linux  +FAIL: objdump -Wi for DW_OP_*
sparc64-linux  +FAIL: readelf -wi dw5-op
sparc-elf  +FAIL: objdump -Wi for DW_OP_*
sparc-elf  +FAIL: readelf -wi dw5-op
sparc-linux  +FAIL: objdump -Wi for DW_OP_*
sparc-linux  +FAIL: readelf -wi dw5-op
sparc-sun-solaris2  +FAIL: objdump -Wi for DW_OP_*
sparc-sun-solaris2  +FAIL: readelf -wi dw5-op
spu-elf  +FAIL: objdump -Wi for DW_OP_*
spu-elf  +FAIL: readelf -wi dw5-op
visium-elf  +FAIL: objdump -Wi for DW_OP_*
visium-elf  +FAIL: readelf -wi dw5-op
xgate-elf  +FAIL: objdump -Wi for DW_OP_*
xgate-elf  +FAIL: readelf -wi dw5-op
xtensa-elf  +FAIL: objdump -Wi for DW_OP_*
xtensa-elf  +FAIL: readelf -wi dw5-op

-- 
Alan Modra
Australia Development Lab, IBM

^ permalink raw reply	[flat|nested] 12+ messages in thread

* RE: [PATCH] Binutils support for DWARF-5 DW_OP_addrx
  2022-05-25 23:42       ` Alan Modra
@ 2022-05-26  4:35         ` Natarajan, Kavitha
  2022-05-26  7:19         ` Luis Machado
  1 sibling, 0 replies; 12+ messages in thread
From: Natarajan, Kavitha @ 2022-05-26  4:35 UTC (permalink / raw)
  To: Alan Modra, Nick Clifton; +Cc: binutils

[Public]

Thank you Nick for the review and taking care of the commit.
Thank you Mark and Alan for fixing the testcase issues.

Regards,
Kavitha

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] Binutils support for DWARF-5 DW_OP_addrx
  2022-05-25 23:42       ` Alan Modra
  2022-05-26  4:35         ` Natarajan, Kavitha
@ 2022-05-26  7:19         ` Luis Machado
  2022-05-26  8:04           ` Alan Modra
  1 sibling, 1 reply; 12+ messages in thread
From: Luis Machado @ 2022-05-26  7:19 UTC (permalink / raw)
  To: Alan Modra, Nick Clifton, Kavitha.Natarajan; +Cc: binutils

On 5/26/22 00:42, Alan Modra via Binutils wrote:
> On Wed, May 25, 2022 at 04:13:31PM +0100, Nick Clifton wrote:
>> Hi Kavitha,
>>
>>     Thanks for the revised patch.  I have gone ahead and
>>     applied it to the sources.
> 
> And now with the missing testsuite files committed, which needed
> editing to fix whitespace.  (Presumably Kavitha's email client
> "helpfully" expanded tabs.)
> 
> I also fixed the endian issue in dw5-op.W that caused the following:
> aarch64_be-linux-gnu_ilp32  +FAIL: objdump -Wi for DW_OP_*
> aarch64_be-linux-gnu_ilp32  +FAIL: readelf -wi dw5-op
> armeb-linuxeabi  +FAIL: objdump -Wi for DW_OP_*
> armeb-linuxeabi  +FAIL: readelf -wi dw5-op
> d10v-elf  +FAIL: objdump -Wi for DW_OP_*
> d10v-elf  +FAIL: readelf -wi dw5-op
> d30v-elf  +FAIL: objdump -Wi for DW_OP_*
> d30v-elf  +FAIL: readelf -wi dw5-op
> dlx-elf  +FAIL: objdump -Wi for DW_OP_*
> dlx-elf  +FAIL: readelf -wi dw5-op
> fr30-elf  +FAIL: objdump -Wi for DW_OP_*
> fr30-elf  +FAIL: readelf -wi dw5-op
> frv-elf  +FAIL: objdump -Wi for DW_OP_*
> frv-elf  +FAIL: readelf -wi dw5-op
> frv-linux  +FAIL: objdump -Wi for DW_OP_*
> frv-linux  +FAIL: readelf -wi dw5-op
> h8300-elf  +FAIL: objdump -Wi for DW_OP_*
> h8300-elf  +FAIL: readelf -wi dw5-op
> h8300-linux  +FAIL: objdump -Wi for DW_OP_*
> h8300-linux  +FAIL: readelf -wi dw5-op
> hppa64-hp-hpux11.23  +FAIL: objdump -Wi for DW_OP_*
> hppa64-hp-hpux11.23  +FAIL: readelf -wi dw5-op
> hppa64-linux  +FAIL: objdump -Wi for DW_OP_*
> hppa64-linux  +FAIL: readelf -wi dw5-op
> hppa-linux  +FAIL: objdump -Wi for DW_OP_*
> hppa-linux  +FAIL: readelf -wi dw5-op
> ia64-hpux  +FAIL: objdump -Wi for DW_OP_*
> ia64-hpux  +FAIL: readelf -wi dw5-op
> ip2k-elf  +FAIL: objdump -Wi for DW_OP_*
> ip2k-elf  +FAIL: readelf -wi dw5-op
> iq2000-elf  +FAIL: objdump -Wi for DW_OP_*
> iq2000-elf  +FAIL: readelf -wi dw5-op
> lm32-elf  +FAIL: objdump -Wi for DW_OP_*
> lm32-elf  +FAIL: readelf -wi dw5-op
> lm32-linux  +FAIL: objdump -Wi for DW_OP_*
> lm32-linux  +FAIL: readelf -wi dw5-op
> m32r-elf  +FAIL: objdump -Wi for DW_OP_*
> m32r-elf  +FAIL: readelf -wi dw5-op
> m32r-linux  +FAIL: objdump -Wi for DW_OP_*
> m32r-linux  +FAIL: readelf -wi dw5-op
> m68hc11-elf  +FAIL: objdump -Wi for DW_OP_*
> m68hc11-elf  +FAIL: readelf -wi dw5-op
> m68hc12-elf  +FAIL: objdump -Wi for DW_OP_*
> m68hc12-elf  +FAIL: readelf -wi dw5-op
> m68k-elf  +FAIL: objdump -Wi for DW_OP_*
> m68k-elf  +FAIL: readelf -wi dw5-op
> m68k-linux  +FAIL: objdump -Wi for DW_OP_*
> m68k-linux  +FAIL: readelf -wi dw5-op
> microblaze-elf  +FAIL: objdump -Wi for DW_OP_*
> microblaze-elf  +FAIL: readelf -wi dw5-op
> microblaze-linux  +FAIL: objdump -Wi for DW_OP_*
> microblaze-linux  +FAIL: readelf -wi dw5-op
> mips64-linux  +FAIL: objdump -Wi for DW_OP_*
> mips64-linux  +FAIL: readelf -wi dw5-op
> mips64-openbsd  +FAIL: objdump -Wi for DW_OP_*
> mips64-openbsd  +FAIL: readelf -wi dw5-op
> mips-linux  +FAIL: objdump -Wi for DW_OP_*
> mips-linux  +FAIL: readelf -wi dw5-op
> mips-sgi-irix6  +FAIL: objdump -Wi for DW_OP_*
> mips-sgi-irix6  +FAIL: readelf -wi dw5-op
> mipstx39-elf  +FAIL: objdump -Wi for DW_OP_*
> mipstx39-elf  +FAIL: readelf -wi dw5-op
> moxie-elf  +FAIL: objdump -Wi for DW_OP_*
> moxie-elf  +FAIL: readelf -wi dw5-op
> mt-elf  +FAIL: objdump -Wi for DW_OP_*
> mt-elf  +FAIL: readelf -wi dw5-op
> nds32be-elf  +FAIL: objdump -Wi for DW_OP_*
> nds32be-elf  +FAIL: readelf -wi dw5-op
> or1k-elf  +FAIL: objdump -Wi for DW_OP_*
> or1k-elf  +FAIL: readelf -wi dw5-op
> or1k-linux  +FAIL: objdump -Wi for DW_OP_*
> or1k-linux  +FAIL: readelf -wi dw5-op
> pj-elf  +FAIL: objdump -Wi for DW_OP_*
> pj-elf  +FAIL: readelf -wi dw5-op
> powerpc64-freebsd  +FAIL: objdump -Wi for DW_OP_*
> powerpc64-freebsd  +FAIL: readelf -wi dw5-op
> powerpc64-linux  +FAIL: objdump -Wi for DW_OP_*
> powerpc64-linux  +FAIL: readelf -wi dw5-op
> powerpc-eabisim  +FAIL: objdump -Wi for DW_OP_*
> powerpc-eabisim  +FAIL: readelf -wi dw5-op
> powerpc-eabivle  +FAIL: objdump -Wi for DW_OP_*
> powerpc-eabivle  +FAIL: readelf -wi dw5-op
> powerpc-freebsd  +FAIL: objdump -Wi for DW_OP_*
> powerpc-freebsd  +FAIL: readelf -wi dw5-op
> powerpc-linux  +FAIL: objdump -Wi for DW_OP_*
> powerpc-linux  +FAIL: readelf -wi dw5-op
> powerpc-nto  +FAIL: objdump -Wi for DW_OP_*
> powerpc-nto  +FAIL: readelf -wi dw5-op
> s12z-elf  +FAIL: objdump -Wi for DW_OP_*
> s12z-elf  +FAIL: readelf -wi dw5-op
> s390-linux  +FAIL: objdump -Wi for DW_OP_*
> s390-linux  +FAIL: readelf -wi dw5-op
> s390x-linux  +FAIL: objdump -Wi for DW_OP_*
> s390x-linux  +FAIL: readelf -wi dw5-op
> score-elf  +FAIL: objdump -Wi for DW_OP_*
> score-elf  +FAIL: readelf -wi dw5-op
> sh-nto  +FAIL: objdump -Wi for DW_OP_*
> sh-nto  +FAIL: readelf -wi dw5-op
> sh-rtems  +FAIL: objdump -Wi for DW_OP_*
> sh-rtems  +FAIL: readelf -wi dw5-op
> sparc64-linux  +FAIL: objdump -Wi for DW_OP_*
> sparc64-linux  +FAIL: readelf -wi dw5-op
> sparc-elf  +FAIL: objdump -Wi for DW_OP_*
> sparc-elf  +FAIL: readelf -wi dw5-op
> sparc-linux  +FAIL: objdump -Wi for DW_OP_*
> sparc-linux  +FAIL: readelf -wi dw5-op
> sparc-sun-solaris2  +FAIL: objdump -Wi for DW_OP_*
> sparc-sun-solaris2  +FAIL: readelf -wi dw5-op
> spu-elf  +FAIL: objdump -Wi for DW_OP_*
> spu-elf  +FAIL: readelf -wi dw5-op
> visium-elf  +FAIL: objdump -Wi for DW_OP_*
> visium-elf  +FAIL: readelf -wi dw5-op
> xgate-elf  +FAIL: objdump -Wi for DW_OP_*
> xgate-elf  +FAIL: readelf -wi dw5-op
> xtensa-elf  +FAIL: objdump -Wi for DW_OP_*
> xtensa-elf  +FAIL: readelf -wi dw5-op
> 

I suppose that's the hiccup the buildbot caught?

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] Binutils support for DWARF-5 DW_OP_addrx
  2022-05-26  7:19         ` Luis Machado
@ 2022-05-26  8:04           ` Alan Modra
  2022-05-26  8:06             ` Luis Machado
  0 siblings, 1 reply; 12+ messages in thread
From: Alan Modra @ 2022-05-26  8:04 UTC (permalink / raw)
  To: Luis Machado; +Cc: Nick Clifton, Kavitha.Natarajan, binutils

On Thu, May 26, 2022 at 08:19:57AM +0100, Luis Machado wrote:
> I suppose that's the hiccup the buildbot caught?

Right.

-- 
Alan Modra
Australia Development Lab, IBM

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] Binutils support for DWARF-5 DW_OP_addrx
  2022-05-26  8:04           ` Alan Modra
@ 2022-05-26  8:06             ` Luis Machado
  0 siblings, 0 replies; 12+ messages in thread
From: Luis Machado @ 2022-05-26  8:06 UTC (permalink / raw)
  To: Alan Modra; +Cc: Nick Clifton, Kavitha.Natarajan, binutils

On 5/26/22 09:04, Alan Modra wrote:
> On Thu, May 26, 2022 at 08:19:57AM +0100, Luis Machado wrote:
>> I suppose that's the hiccup the buildbot caught?
> 
> Right.
> 

I was going to take a look at it this morning. Thanks for fixing it.

^ permalink raw reply	[flat|nested] 12+ messages in thread

* RE: [PATCH] Binutils support for DWARF-5 DW_OP_addrx
  2022-04-28  9:54 ` Nick Clifton
@ 2022-04-28 10:19   ` Natarajan, Kavitha
  0 siblings, 0 replies; 12+ messages in thread
From: Natarajan, Kavitha @ 2022-04-28 10:19 UTC (permalink / raw)
  To: Nick Clifton, binutils; +Cc: George, Jini Susan

[AMD Official Use Only - General]

HI Nick,

I have resent the email after remove the label. Thanks for pointing this out.

Regards,
Kavitha

> -----Original Message-----
> From: Nick Clifton <nickc@redhat.com>
> Sent: Thursday, April 28, 2022 3:24 PM
> To: Natarajan, Kavitha <Kavitha.Natarajan@amd.com>;
> binutils@sourceware.org
> Cc: George, Jini Susan <JiniSusan.George@amd.com>
> Subject: Re: [PATCH] Binutils support for DWARF-5 DW_OP_addrx
>
> [CAUTION: External Email]
>
> Hi Natarajan,
>
> > [AMD Official Use Only - General]
>
> I know that this is terribly nit-picking, but please could you resend your
> email, but without the limitation above ?  Given that the Binutils project is
> not an AMD project I would hate for complications to arise because of that
> disclaimer.
>
> Cheers
>    Nick


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] Binutils support for DWARF-5 DW_OP_addrx
  2022-04-27 10:33 Natarajan, Kavitha
@ 2022-04-28  9:54 ` Nick Clifton
  2022-04-28 10:19   ` Natarajan, Kavitha
  0 siblings, 1 reply; 12+ messages in thread
From: Nick Clifton @ 2022-04-28  9:54 UTC (permalink / raw)
  To: Natarajan, Kavitha, binutils; +Cc: George, Jini Susan

Hi Natarajan,

> [AMD Official Use Only - General]

I know that this is terribly nit-picking, but please could you resend your
email, but without the limitation above ?  Given that the Binutils project
is not an AMD project I would hate for complications to arise because of
that disclaimer.

Cheers
   Nick


^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH] Binutils support for DWARF-5 DW_OP_addrx
@ 2022-04-27 10:33 Natarajan, Kavitha
  2022-04-28  9:54 ` Nick Clifton
  0 siblings, 1 reply; 12+ messages in thread
From: Natarajan, Kavitha @ 2022-04-27 10:33 UTC (permalink / raw)
  To: binutils; +Cc: George, Jini Susan

[-- Attachment #1: Type: text/plain, Size: 26946 bytes --]

[AMD Official Use Only - General]

Hi,

When an executable is compiled with -gdwarf-5 option, bintools such as objdump, readelf
do not recognize some of the new DWARF-5 tags. The below binutils patch is to support one
of the new DWARF-5 operation encoding tag DW_OP_addrx.

Before patch:
<1><86>: Abbrev Number: 3 (DW_TAG_variable)
    <87>   DW_AT_name        : (indexed string: 0xc): uni_lang_p
    <88>   DW_AT_type        : <0x4a>
    <8c>   DW_AT_external    : 1
    <8c>   DW_AT_decl_file   : 0
    <8d>   DW_AT_decl_line   : 64
    <8e>   DW_AT_location    : 2 byte block: a1 4       ((Unknown location op 0xa1))

After patch:
<1><86>: Abbrev Number: 3 (DW_TAG_variable)
    <87>   DW_AT_name        : (indexed string: 0xc): uni_lang_p
    <88>   DW_AT_type        : <0x4a>
    <8c>   DW_AT_external    : 1
    <8c>   DW_AT_decl_file   : 0
    <8d>   DW_AT_decl_line   : 64
    <8e>   DW_AT_location    :  (DW_OP_addrx <0x4>)

Generated .s file with clang to test this feature as gcc does not emit this tag.

Please review.

Regards,
Kavitha

======================================================================
Binutils tools objdump and readelf to support new dwarf-5
operation encoding, such as, DW_OP_addrx.

Added test points in objdump.exp and readlef.exp.

---
binutils/dwarf.c                            |  11 +-
binutils/testsuite/binutils-all/objdump.exp |  48 ++-
binutils/testsuite/binutils-all/readelf.exp |  62 +++
binutils/testsuite/binutils-all/testprog.s  | 426 ++++++++++++++++++++
4 files changed, 543 insertions(+), 4 deletions(-)
create mode 100644 binutils/testsuite/binutils-all/testprog.s

diff --git a/binutils/dwarf.c b/binutils/dwarf.c
index bc862f77c04..fc754f4f73d 100644
--- a/binutils/dwarf.c
+++ b/binutils/dwarf.c
@@ -1721,6 +1721,10 @@ decode_location_expression (unsigned char * data,
      printf ("DW_OP_GNU_parameter_ref: <0x%s>",
            dwarf_vmatoa ("x", cu_offset + uvalue));
      break;
+    case DW_OP_addrx:
+      READ_ULEB (uvalue, data, end);
+      printf ("DW_OP_addrx <0x%s>", dwarf_vmatoa ("x", uvalue));
+      break;
    case DW_OP_GNU_addr_index:
      READ_ULEB (uvalue, data, end);
      printf ("DW_OP_GNU_addr_index <0x%s>", dwarf_vmatoa ("x", uvalue));
@@ -2661,9 +2665,10 @@ read_and_display_attr_value (unsigned long           attribute,
       uvalue = check_uvalue (block_start, uvalue, end);
-      if (do_loc)
-    data = block_start + uvalue;
-      else
+      data = block_start + uvalue;
+
+      /* DW_OP_addrx has only the index and not address.  */
+      if (!do_loc && ((unsigned)(*block_start) != DW_OP_addrx))
    data = display_block (block_start, uvalue, end, delimiter);
       break;
diff --git a/binutils/testsuite/binutils-all/objdump.exp b/binutils/testsuite/binutils-all/objdump.exp
index 0f160ae5a06..f0a4611dd1f 100644
--- a/binutils/testsuite/binutils-all/objdump.exp
+++ b/binutils/testsuite/binutils-all/objdump.exp
@@ -513,6 +513,52 @@ if { ![is_elf_format] } then {
     }
}
+# Test objdump -Wi on a file containing dwarf-5 encodings information.
+
+if { ![is_elf_format] } then {
+    unsupported "objdump DW_OP_addrx test"
+} elseif { ![binutils_assemble $srcdir/$subdir/testprog.s tmpdir/testprog.${obj}] } then {
+    fail "objdump DW_OP_addrx test"
+} else {
+    if [is_remote host] {
+    set op_testfile [remote_download host tmpdir/testprog.${obj}]
+    } else {
+    set op_testfile tmpdir/testprog.${obj}
+    }
+
+    set got [remote_exec host "$OBJDUMP $OBJDUMPFLAGS -Wi $op_testfile" "" "/dev/null" "objdump.out"]
+
+    if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
+    fail "objdump -Wi (reason: unexpected output)"
+    send_log $got
+    send_log "\n"
+    }
+
+    set output [remote_upload host objdump.out]
+
+    if ![file size $output] then {
+    # If the output file is empty, then this target does not
+    # generate dwarf2 output.  This is not a failure.
+    verbose "No output from 'objdump -wi'"
+    untested "objdump -wi"
+    return
+    }
+
+    # Search for strings that should be in the output.
+    set sought ".*\(DW_OP_addrx <0\).*"
+
+    set lines [grep $output $sought]
+    if ![llength $lines] then {
+    fail "objdump -Wi: missing: $sought"
+    send_log objdump.out
+    return
+    } else {
+    pass "objdump -Wi for DW_OP_addrx"
+    }
+
+    file_on_host delete $output
+}
+
proc test_build_id_debuglink {} {
     global srcdir
     global subdir
@@ -522,7 +568,7 @@ proc test_build_id_debuglink {} {
     global OBJDUMP
     global CFLAGS_FOR_TARGET
     global exe
-
+
     set test "build-id-debuglink"
     # Use a fixed build-id.
diff --git a/binutils/testsuite/binutils-all/readelf.exp b/binutils/testsuite/binutils-all/readelf.exp
index 8ff756e506f..db0fe88cef7 100644
--- a/binutils/testsuite/binutils-all/readelf.exp
+++ b/binutils/testsuite/binutils-all/readelf.exp
@@ -214,6 +214,67 @@ proc readelf_wi_test {} {
     pass "readelf -wi"
}
+# Testing the "readelf -wi" option for dwarf-5 specific information.
+# readelf_wi_test_5{} can be merged to readelf_wi_test{} once gcc
+# supports dwarf-5 encodings.
+
+proc readelf_wi_test_5 {} {
+    global READELF
+    global READELFFLAGS
+    global srcdir
+    global subdir
+
+    # Compile the second test file.
+    if {![binutils_assemble $srcdir/$subdir/testprog.s tmpdir/testprog.o]} {
+    verbose "Unable to assemble test file."
+    untested "readelf -wi (dwarf-5)"
+    return
+    }
+
+    # Download it.
+    set tempfile [remote_download host tmpdir/testprog.o]
+
+    # Run "readelf -wi" on it.
+    set got [remote_exec host "$READELF $READELFFLAGS -wi $tempfile" "" "/dev/null" "readelf.out"]
+
+    # Upload the results.
+    set output [remote_upload host readelf.out]
+
+    file_on_host delete $tempfile
+
+    # Strip any superflous warnings.
+    set got [prune_readelf_wi_warnings [lindex $got 1]]
+
+    if ![string match "" $got] then {
+    fail "readelf $READELFFLAGS -wi (dwarf-5) (reason: unexpected output)"
+    send_log $got
+    send_log "\n"
+    return
+    }
+
+    if ![file size $output] then {
+    # If the output file is empty, then this target does not
+    # generate dwarf2 output.  This is not a failure.
+    verbose "No output from 'readelf -wi (dwarf-5)'"
+    untested "readelf -wi (dwarf-5)"
+    return
+    }
+
+    # Search for strings that should be in the output.
+    set sought ".*\(DW_OP_addrx <0\).*"
+
+    set lines [grep $output $sought]
+    if ![llength $lines] then {
+    fail "readelf -wi (dwarf-5): missing: $sought"
+    send_log readelf.out
+    return
+    } else {
+    pass "readelf -wi (dwarf-5)"
+    }
+
+    file_on_host delete $output
+}
+
# This tests "readelf -wa", but on a file with a compressed
# .debug_abbrev section.
@@ -390,6 +451,7 @@ if {![binutils_assemble $srcdir/$subdir/mangled.s tmpdir/mangled.o]} then {
}
 readelf_wi_test
+readelf_wi_test_5
readelf_compressed_wa_test
 readelf_dump_test
diff --git a/binutils/testsuite/binutils-all/testprog.s b/binutils/testsuite/binutils-all/testprog.s
new file mode 100644
index 00000000000..9db95e24ac2
--- /dev/null
+++ b/binutils/testsuite/binutils-all/testprog.s
@@ -0,0 +1,426 @@
+# Generated from testprog.c
+# clang -gdwarf-5 -S testprog.c -fno-addrsig
+
+    .text
+    .file "testprog.c"
+    .file 0 "/home/kavitha/workarea/binutils-gdb-amd/binutils/testsuite/binutils-all" "testprog.c" md5 0x1a2591dc3647301324c8184161bb46ff
+    .globl     fn                              # -- Begin function fn
+    .p2align   4, 0x90
+    .type fn,@function
+fn:                                     # @fn
+.Lfunc_begin0:
+    .loc 0 13 0                          # testprog.c:13:0
+    .cfi_startproc
+# %bb.0:
+    pushq %rbp
+    .cfi_def_cfa_offset 16
+    .cfi_offset %rbp, -16
+    movq %rsp, %rbp
+    .cfi_def_cfa_register %rbp
+.Ltmp0:
+    .loc 0 14 3 prologue_end             # testprog.c:14:3
+    movl $3, %eax
+    popq %rbp
+    .cfi_def_cfa %rsp, 8
+    retq
+.Ltmp1:
+.Lfunc_end0:
+    .size fn, .Lfunc_end0-fn
+    .cfi_endproc
+                                        # -- End function
+    .globl     main                            # -- Begin function main
+    .p2align   4, 0x90
+    .type main,@function
+main:                                   # @main
+.Lfunc_begin1:
+    .loc 0 19 0                          # testprog.c:19:0
+    .cfi_startproc
+# %bb.0:
+    pushq %rbp
+    .cfi_def_cfa_offset 16
+    .cfi_offset %rbp, -16
+    movq %rsp, %rbp
+    .cfi_def_cfa_register %rbp
+    subq $16, %rsp
+    movl $0, -4(%rbp)
+.Ltmp2:
+    .loc 0 20 14 prologue_end            # testprog.c:20:14
+    cmpl $0, common
+    .loc 0 21 7                          # testprog.c:21:7
+    jne  .LBB1_4
+# %bb.1:
+    .loc 0 21 17 is_stmt 0               # testprog.c:21:17
+    cmpl $1, global
+    .loc 0 22 7 is_stmt 1                # testprog.c:22:7
+    jne  .LBB1_4
+# %bb.2:
+    .loc 0 22 16 is_stmt 0               # testprog.c:22:16
+    cmpl $2, local
+    .loc 0 23 7 is_stmt 1                # testprog.c:23:7
+    jne  .LBB1_4
+# %bb.3:
+    .loc 0 23 10 is_stmt 0               # testprog.c:23:10
+    movl $string, %edi
+    movl $.L.str, %esi
+    callq strcmp
+    .loc 0 23 36                         # testprog.c:23:36
+    cmpl $0, %eax
+.Ltmp3:
+    .loc 0 20 7 is_stmt 1                # testprog.c:20:7
+    je   .LBB1_5
+.LBB1_4:
+.Ltmp4:
+    .loc 0 25 7                          # testprog.c:25:7
+    movabsq    $.L.str.1, %rdi
+    movb $0, %al
+    callq printf
+    .loc 0 26 7                          # testprog.c:26:7
+    movl $1, -4(%rbp)
+    jmp  .LBB1_6
+.Ltmp5:
+.LBB1_5:
+    .loc 0 29 3                          # testprog.c:29:3
+    movabsq    $.L.str.2, %rdi
+    movb $0, %al
+    callq printf
+    .loc 0 30 3                          # testprog.c:30:3
+    movl $0, -4(%rbp)
+.LBB1_6:
+    .loc 0 31 1                          # testprog.c:31:1
+    movl -4(%rbp), %eax
+    addq $16, %rsp
+    popq %rbp
+    .cfi_def_cfa %rsp, 8
+    retq
+.Ltmp6:
+.Lfunc_end1:
+    .size main, .Lfunc_end1-main
+    .cfi_endproc
+                                        # -- End function
+    .type global,@object                  # @global
+    .data
+    .globl     global
+    .p2align   2
+global:
+    .long 1                               # 0x1
+    .size global, 4
+
+    .type common,@object                  # @common
+    .bss
+    .globl     common
+    .p2align   2
+common:
+    .long 0                               # 0x0
+    .size common, 4
+
+    .type local,@object                   # @local
+    .data
+    .p2align   2
+local:
+    .long 2                               # 0x2
+    .size local, 4
+
+    .type string,@object                  # @string
+    .section   .rodata,"a",@progbits
+string:
+    .asciz     "string"
+    .size string, 7
+
+    .type .L.str,@object                  # @.str
+    .section   .rodata.str1.1,"aMS",@progbits,1
+.L.str:
+    .asciz     "string"
+    .size .L.str, 7
+
+    .type .L.str.1,@object                # @.str.1
+.L.str.1:
+    .asciz     "failed\n"
+    .size .L.str.1, 8
+
+    .type .L.str.2,@object                # @.str.2
+.L.str.2:
+    .asciz     "ok\n"
+    .size .L.str.2, 4
+
+    .section   .debug_abbrev,"",@progbits
+    .byte 1                               # Abbreviation Code
+    .byte 17                              # DW_TAG_compile_unit
+    .byte 1                               # DW_CHILDREN_yes
+    .byte 37                              # DW_AT_producer
+    .byte 37                              # DW_FORM_strx1
+    .byte 19                              # DW_AT_language
+    .byte 5                               # DW_FORM_data2
+    .byte 3                               # DW_AT_name
+    .byte 37                              # DW_FORM_strx1
+    .byte 114                             # DW_AT_str_offsets_base
+    .byte 23                              # DW_FORM_sec_offset
+    .byte 16                              # DW_AT_stmt_list
+    .byte 23                              # DW_FORM_sec_offset
+    .byte 27                              # DW_AT_comp_dir
+    .byte 37                              # DW_FORM_strx1
+    .byte 17                              # DW_AT_low_pc
+    .byte 27                              # DW_FORM_addrx
+    .byte 18                              # DW_AT_high_pc
+    .byte 6                               # DW_FORM_data4
+    .byte 115                             # DW_AT_addr_base
+    .byte 23                              # DW_FORM_sec_offset
+    .byte 0                               # EOM(1)
+    .byte 0                               # EOM(2)
+    .byte 2                               # Abbreviation Code
+    .byte 52                              # DW_TAG_variable
+    .byte 0                               # DW_CHILDREN_no
+    .byte 3                               # DW_AT_name
+    .byte 37                              # DW_FORM_strx1
+    .byte 73                              # DW_AT_type
+    .byte 19                              # DW_FORM_ref4
+    .byte 63                              # DW_AT_external
+    .byte 25                              # DW_FORM_flag_present
+    .byte 58                              # DW_AT_decl_file
+    .byte 11                              # DW_FORM_data1
+    .byte 59                              # DW_AT_decl_line
+    .byte 11                              # DW_FORM_data1
+    .byte 2                               # DW_AT_location
+    .byte 24                              # DW_FORM_exprloc
+    .byte 0                               # EOM(1)
+    .byte 0                               # EOM(2)
+    .byte 3                               # Abbreviation Code
+    .byte 36                              # DW_TAG_base_type
+    .byte 0                               # DW_CHILDREN_no
+    .byte 3                               # DW_AT_name
+    .byte 37                              # DW_FORM_strx1
+    .byte 62                              # DW_AT_encoding
+    .byte 11                              # DW_FORM_data1
+    .byte 11                              # DW_AT_byte_size
+    .byte 11                              # DW_FORM_data1
+    .byte 0                               # EOM(1)
+    .byte 0                               # EOM(2)
+    .byte 4                               # Abbreviation Code
+    .byte 52                              # DW_TAG_variable
+    .byte 0                               # DW_CHILDREN_no
+    .byte 3                               # DW_AT_name
+    .byte 37                              # DW_FORM_strx1
+    .byte 73                              # DW_AT_type
+    .byte 19                              # DW_FORM_ref4
+    .byte 58                              # DW_AT_decl_file
+    .byte 11                              # DW_FORM_data1
+    .byte 59                              # DW_AT_decl_line
+    .byte 11                              # DW_FORM_data1
+    .byte 2                               # DW_AT_location
+    .byte 24                              # DW_FORM_exprloc
+    .byte 0                               # EOM(1)
+    .byte 0                               # EOM(2)
+    .byte 5                               # Abbreviation Code
+    .byte 1                               # DW_TAG_array_type
+    .byte 1                               # DW_CHILDREN_yes
+    .byte 73                              # DW_AT_type
+    .byte 19                              # DW_FORM_ref4
+    .byte 0                               # EOM(1)
+    .byte 0                               # EOM(2)
+    .byte 6                               # Abbreviation Code
+    .byte 33                              # DW_TAG_subrange_type
+    .byte 0                               # DW_CHILDREN_no
+    .byte 73                              # DW_AT_type
+    .byte 19                              # DW_FORM_ref4
+    .byte 55                              # DW_AT_count
+    .byte 11                              # DW_FORM_data1
+    .byte 0                               # EOM(1)
+    .byte 0                               # EOM(2)
+    .byte 7                               # Abbreviation Code
+    .byte 38                              # DW_TAG_const_type
+    .byte 0                               # DW_CHILDREN_no
+    .byte 73                              # DW_AT_type
+    .byte 19                              # DW_FORM_ref4
+    .byte 0                               # EOM(1)
+    .byte 0                               # EOM(2)
+    .byte 8                               # Abbreviation Code
+    .byte 36                              # DW_TAG_base_type
+    .byte 0                               # DW_CHILDREN_no
+    .byte 3                               # DW_AT_name
+    .byte 37                              # DW_FORM_strx1
+    .byte 11                              # DW_AT_byte_size
+    .byte 11                              # DW_FORM_data1
+    .byte 62                              # DW_AT_encoding
+    .byte 11                              # DW_FORM_data1
+    .byte 0                               # EOM(1)
+    .byte 0                               # EOM(2)
+    .byte 9                               # Abbreviation Code
+    .byte 46                              # DW_TAG_subprogram
+    .byte 0                               # DW_CHILDREN_no
+    .byte 17                              # DW_AT_low_pc
+    .byte 27                              # DW_FORM_addrx
+    .byte 18                              # DW_AT_high_pc
+    .byte 6                               # DW_FORM_data4
+    .byte 64                              # DW_AT_frame_base
+    .byte 24                              # DW_FORM_exprloc
+    .byte 3                               # DW_AT_name
+    .byte 37                              # DW_FORM_strx1
+    .byte 58                              # DW_AT_decl_file
+    .byte 11                              # DW_FORM_data1
+    .byte 59                              # DW_AT_decl_line
+    .byte 11                              # DW_FORM_data1
+    .byte 39                              # DW_AT_prototyped
+    .byte 25                              # DW_FORM_flag_present
+    .byte 73                              # DW_AT_type
+    .byte 19                              # DW_FORM_ref4
+    .byte 63                              # DW_AT_external
+    .byte 25                              # DW_FORM_flag_present
+    .byte 0                               # EOM(1)
+    .byte 0                               # EOM(2)
+    .byte 0                               # EOM(3)
+    .section   .debug_info,"",@progbits
+.Lcu_begin0:
+    .long .Ldebug_info_end0-.Ldebug_info_start0 # Length of Unit
+.Ldebug_info_start0:
+    .short     5                               # DWARF version number
+    .byte 1                               # DWARF Unit Type
+    .byte 8                               # Address Size (in bytes)
+    .long .debug_abbrev                   # Offset Into Abbrev. Section
+    .byte 1                               # Abbrev [1] 0xc:0x7f DW_TAG_compile_unit
+    .byte 0                               # DW_AT_producer
+    .short     12                              # DW_AT_language
+    .byte 1                               # DW_AT_name
+    .long .Lstr_offsets_base0             # DW_AT_str_offsets_base
+    .long .Lline_table_start0             # DW_AT_stmt_list
+    .byte 2                               # DW_AT_comp_dir
+    .byte 4                               # DW_AT_low_pc
+    .long .Lfunc_end1-.Lfunc_begin0       # DW_AT_high_pc
+    .long .Laddr_table_base0              # DW_AT_addr_base
+    .byte 2                               # Abbrev [2] 0x23:0xb DW_TAG_variable
+    .byte 3                               # DW_AT_name
+    .long 46                              # DW_AT_type
+                                        # DW_AT_external
+    .byte 0                               # DW_AT_decl_file
+    .byte 7                               # DW_AT_decl_line
+    .byte 2                               # DW_AT_location
+    .byte 161
+    .byte 0
+    .byte 3                               # Abbrev [3] 0x2e:0x4 DW_TAG_base_type
+    .byte 4                               # DW_AT_name
+    .byte 5                               # DW_AT_encoding
+    .byte 4                               # DW_AT_byte_size
+    .byte 2                               # Abbrev [2] 0x32:0xb DW_TAG_variable
+    .byte 5                               # DW_AT_name
+    .long 46                              # DW_AT_type
+                                        # DW_AT_external
+    .byte 0                               # DW_AT_decl_file
+    .byte 6                               # DW_AT_decl_line
+    .byte 2                               # DW_AT_location
+    .byte 161
+    .byte 1
+    .byte 4                               # Abbrev [4] 0x3d:0xb DW_TAG_variable
+    .byte 6                               # DW_AT_name
+    .long 46                              # DW_AT_type
+    .byte 0                               # DW_AT_decl_file
+    .byte 8                               # DW_AT_decl_line
+    .byte 2                               # DW_AT_location
+    .byte 161
+    .byte 2
+    .byte 4                               # Abbrev [4] 0x48:0xb DW_TAG_variable
+    .byte 7                               # DW_AT_name
+    .long 83                              # DW_AT_type
+    .byte 0                               # DW_AT_decl_file
+    .byte 9                               # DW_AT_decl_line
+    .byte 2                               # DW_AT_location
+    .byte 161
+    .byte 3
+    .byte 5                               # Abbrev [5] 0x53:0xc DW_TAG_array_type
+    .long 95                              # DW_AT_type
+    .byte 6                               # Abbrev [6] 0x58:0x6 DW_TAG_subrange_type
+    .long 104                             # DW_AT_type
+    .byte 7                               # DW_AT_count
+    .byte 0                               # End Of Children Mark
+    .byte 7                               # Abbrev [7] 0x5f:0x5 DW_TAG_const_type
+    .long 100                             # DW_AT_type
+    .byte 3                               # Abbrev [3] 0x64:0x4 DW_TAG_base_type
+    .byte 8                               # DW_AT_name
+    .byte 6                               # DW_AT_encoding
+    .byte 1                               # DW_AT_byte_size
+    .byte 8                               # Abbrev [8] 0x68:0x4 DW_TAG_base_type
+    .byte 9                               # DW_AT_name
+    .byte 8                               # DW_AT_byte_size
+    .byte 7                               # DW_AT_encoding
+    .byte 9                               # Abbrev [9] 0x6c:0xf DW_TAG_subprogram
+    .byte 4                               # DW_AT_low_pc
+    .long .Lfunc_end0-.Lfunc_begin0       # DW_AT_high_pc
+    .byte 1                               # DW_AT_frame_base
+    .byte 86
+    .byte 10                              # DW_AT_name
+    .byte 0                               # DW_AT_decl_file
+    .byte 12                              # DW_AT_decl_line
+                                        # DW_AT_prototyped
+    .long 46                              # DW_AT_type
+                                        # DW_AT_external
+    .byte 9                               # Abbrev [9] 0x7b:0xf DW_TAG_subprogram
+    .byte 5                               # DW_AT_low_pc
+    .long .Lfunc_end1-.Lfunc_begin1       # DW_AT_high_pc
+    .byte 1                               # DW_AT_frame_base
+    .byte 86
+    .byte 11                              # DW_AT_name
+    .byte 0                               # DW_AT_decl_file
+    .byte 18                              # DW_AT_decl_line
+                                        # DW_AT_prototyped
+    .long 46                              # DW_AT_type
+                                        # DW_AT_external
+    .byte 0                               # End Of Children Mark
+.Ldebug_info_end0:
+    .section   .debug_str_offsets,"",@progbits
+    .long 52                              # Length of String Offsets Set
+    .short     5
+    .short     0
+.Lstr_offsets_base0:
+    .section   .debug_str,"MS",@progbits,1
+.Linfo_string0:
+    .asciz     "Ubuntu clang version 12.0.0-3ubuntu1~20.04.5" # string offset=0
+.Linfo_string1:
+    .asciz     "testprog.c"                    # string offset=45
+.Linfo_string2:
+    .asciz     "/home/kavitha/workarea/binutils-gdb-amd/binutils/testsuite/binutils-all" # string offset=56
+.Linfo_string3:
+    .asciz     "global"                        # string offset=128
+.Linfo_string4:
+    .asciz     "int"                           # string offset=135
+.Linfo_string5:
+    .asciz     "common"                        # string offset=139
+.Linfo_string6:
+    .asciz     "local"                         # string offset=146
+.Linfo_string7:
+    .asciz     "string"                        # string offset=152
+.Linfo_string8:
+    .asciz     "char"                          # string offset=159
+.Linfo_string9:
+    .asciz     "__ARRAY_SIZE_TYPE__"           # string offset=164
+.Linfo_string10:
+    .asciz     "fn"                            # string offset=184
+.Linfo_string11:
+    .asciz     "main"                          # string offset=187
+    .section   .debug_str_offsets,"",@progbits
+    .long .Linfo_string0
+    .long .Linfo_string1
+    .long .Linfo_string2
+    .long .Linfo_string3
+    .long .Linfo_string4
+    .long .Linfo_string5
+    .long .Linfo_string6
+    .long .Linfo_string7
+    .long .Linfo_string8
+    .long .Linfo_string9
+    .long .Linfo_string10
+    .long .Linfo_string11
+    .section   .debug_addr,"",@progbits
+    .long .Ldebug_addr_end0-.Ldebug_addr_start0 # Length of contribution
+.Ldebug_addr_start0:
+    .short     5                               # DWARF version number
+    .byte 8                               # Address size
+    .byte 0                               # Segment selector size
+.Laddr_table_base0:
+    .quad global
+    .quad common
+    .quad local
+    .quad string
+    .quad .Lfunc_begin0
+    .quad .Lfunc_begin1
+.Ldebug_addr_end0:
+    .ident     "Ubuntu clang version 12.0.0-3ubuntu1~20.04.5"
+    .section   ".note.GNU-stack","",@progbits
+    .section   .debug_line,"",@progbits
+.Lline_table_start0:
--




[-- Attachment #2: 0001-Binutils support for DWARF-5 DW_OP_addrx.patch --]
[-- Type: application/octet-stream, Size: 24490 bytes --]

Binutils tools objdump and readelf to support new dwarf-5
operation encoding, such as, DW_OP_addrx.

Added test points in objdump.exp and readlef.exp.

---
 binutils/dwarf.c                            |  11 +-
 binutils/testsuite/binutils-all/objdump.exp |  48 ++-
 binutils/testsuite/binutils-all/readelf.exp |  62 +++
 binutils/testsuite/binutils-all/testprog.s  | 426 ++++++++++++++++++++
 4 files changed, 543 insertions(+), 4 deletions(-)
 create mode 100644 binutils/testsuite/binutils-all/testprog.s

diff --git a/binutils/dwarf.c b/binutils/dwarf.c
index bc862f77c04..fc754f4f73d 100644
--- a/binutils/dwarf.c
+++ b/binutils/dwarf.c
@@ -1721,6 +1721,10 @@ decode_location_expression (unsigned char * data,
 	  printf ("DW_OP_GNU_parameter_ref: <0x%s>",
 		  dwarf_vmatoa ("x", cu_offset + uvalue));
 	  break;
+	case DW_OP_addrx:
+	  READ_ULEB (uvalue, data, end);
+	  printf ("DW_OP_addrx <0x%s>", dwarf_vmatoa ("x", uvalue));
+	  break;
 	case DW_OP_GNU_addr_index:
 	  READ_ULEB (uvalue, data, end);
 	  printf ("DW_OP_GNU_addr_index <0x%s>", dwarf_vmatoa ("x", uvalue));
@@ -2661,9 +2665,10 @@ read_and_display_attr_value (unsigned long           attribute,
 
       uvalue = check_uvalue (block_start, uvalue, end);
 
-      if (do_loc)
-	data = block_start + uvalue;
-      else
+      data = block_start + uvalue;
+
+      /* DW_OP_addrx has only the index and not address.  */
+      if (!do_loc && ((unsigned)(*block_start) != DW_OP_addrx))
 	data = display_block (block_start, uvalue, end, delimiter);
       break;
 
diff --git a/binutils/testsuite/binutils-all/objdump.exp b/binutils/testsuite/binutils-all/objdump.exp
index 0f160ae5a06..f0a4611dd1f 100644
--- a/binutils/testsuite/binutils-all/objdump.exp
+++ b/binutils/testsuite/binutils-all/objdump.exp
@@ -513,6 +513,52 @@ if { ![is_elf_format] } then {
     }
 }
 
+# Test objdump -Wi on a file containing dwarf-5 encodings information.
+
+if { ![is_elf_format] } then {
+    unsupported "objdump DW_OP_addrx test"
+} elseif { ![binutils_assemble $srcdir/$subdir/testprog.s tmpdir/testprog.${obj}] } then {
+    fail "objdump DW_OP_addrx test"
+} else {
+    if [is_remote host] {
+	set op_testfile [remote_download host tmpdir/testprog.${obj}]
+    } else {
+	set op_testfile tmpdir/testprog.${obj}
+    }
+
+    set got [remote_exec host "$OBJDUMP $OBJDUMPFLAGS -Wi $op_testfile" "" "/dev/null" "objdump.out"]
+
+    if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
+	fail "objdump -Wi (reason: unexpected output)"
+	send_log $got
+	send_log "\n"
+    }
+
+    set output [remote_upload host objdump.out]
+
+    if ![file size $output] then {
+	# If the output file is empty, then this target does not
+	# generate dwarf2 output.  This is not a failure.
+	verbose "No output from 'objdump -wi'"
+	untested "objdump -wi"
+	return
+    }
+
+    # Search for strings that should be in the output.
+    set sought ".*\(DW_OP_addrx <0\).*"
+
+    set lines [grep $output $sought]
+    if ![llength $lines] then {
+	fail "objdump -Wi: missing: $sought"
+	send_log objdump.out
+	return
+    } else {
+	pass "objdump -Wi for DW_OP_addrx"
+    }
+
+    file_on_host delete $output
+}
+
 proc test_build_id_debuglink {} {
     global srcdir
     global subdir
@@ -522,7 +568,7 @@ proc test_build_id_debuglink {} {
     global OBJDUMP
     global CFLAGS_FOR_TARGET
     global exe
-    
+
     set test "build-id-debuglink"
 
     # Use a fixed build-id.
diff --git a/binutils/testsuite/binutils-all/readelf.exp b/binutils/testsuite/binutils-all/readelf.exp
index 8ff756e506f..db0fe88cef7 100644
--- a/binutils/testsuite/binutils-all/readelf.exp
+++ b/binutils/testsuite/binutils-all/readelf.exp
@@ -214,6 +214,67 @@ proc readelf_wi_test {} {
     pass "readelf -wi"
 }
 
+# Testing the "readelf -wi" option for dwarf-5 specific information.
+# readelf_wi_test_5{} can be merged to readelf_wi_test{} once gcc
+# supports dwarf-5 encodings.
+
+proc readelf_wi_test_5 {} {
+    global READELF
+    global READELFFLAGS
+    global srcdir
+    global subdir
+
+    # Compile the second test file.
+    if {![binutils_assemble $srcdir/$subdir/testprog.s tmpdir/testprog.o]} {
+	verbose "Unable to assemble test file."
+	untested "readelf -wi (dwarf-5)"
+	return
+    }
+
+    # Download it.
+    set tempfile [remote_download host tmpdir/testprog.o]
+
+    # Run "readelf -wi" on it.
+    set got [remote_exec host "$READELF $READELFFLAGS -wi $tempfile" "" "/dev/null" "readelf.out"]
+
+    # Upload the results.
+    set output [remote_upload host readelf.out]
+
+    file_on_host delete $tempfile
+
+    # Strip any superflous warnings.
+    set got [prune_readelf_wi_warnings [lindex $got 1]]
+
+    if ![string match "" $got] then {
+	fail "readelf $READELFFLAGS -wi (dwarf-5) (reason: unexpected output)"
+	send_log $got
+	send_log "\n"
+	return
+    }
+
+    if ![file size $output] then {
+	# If the output file is empty, then this target does not
+	# generate dwarf2 output.  This is not a failure.
+	verbose "No output from 'readelf -wi (dwarf-5)'"
+	untested "readelf -wi (dwarf-5)"
+	return
+    }
+
+    # Search for strings that should be in the output.
+    set sought ".*\(DW_OP_addrx <0\).*"
+
+    set lines [grep $output $sought]
+    if ![llength $lines] then {
+	fail "readelf -wi (dwarf-5): missing: $sought"
+	send_log readelf.out
+	return
+    } else {
+	pass "readelf -wi (dwarf-5)"
+    }
+
+    file_on_host delete $output
+}
+
 # This tests "readelf -wa", but on a file with a compressed
 # .debug_abbrev section.
 
@@ -390,6 +451,7 @@ if {![binutils_assemble $srcdir/$subdir/mangled.s tmpdir/mangled.o]} then {
 }
 
 readelf_wi_test
+readelf_wi_test_5
 readelf_compressed_wa_test
 
 readelf_dump_test
diff --git a/binutils/testsuite/binutils-all/testprog.s b/binutils/testsuite/binutils-all/testprog.s
new file mode 100644
index 00000000000..9db95e24ac2
--- /dev/null
+++ b/binutils/testsuite/binutils-all/testprog.s
@@ -0,0 +1,426 @@
+# Generated from testprog.c
+# clang -gdwarf-5 -S testprog.c -fno-addrsig
+
+	.text
+	.file	"testprog.c"
+	.file	0 "/home/kavitha/workarea/binutils-gdb-amd/binutils/testsuite/binutils-all" "testprog.c" md5 0x1a2591dc3647301324c8184161bb46ff
+	.globl	fn                              # -- Begin function fn
+	.p2align	4, 0x90
+	.type	fn,@function
+fn:                                     # @fn
+.Lfunc_begin0:
+	.loc	0 13 0                          # testprog.c:13:0
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+.Ltmp0:
+	.loc	0 14 3 prologue_end             # testprog.c:14:3
+	movl	$3, %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Ltmp1:
+.Lfunc_end0:
+	.size	fn, .Lfunc_end0-fn
+	.cfi_endproc
+                                        # -- End function
+	.globl	main                            # -- Begin function main
+	.p2align	4, 0x90
+	.type	main,@function
+main:                                   # @main
+.Lfunc_begin1:
+	.loc	0 19 0                          # testprog.c:19:0
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	subq	$16, %rsp
+	movl	$0, -4(%rbp)
+.Ltmp2:
+	.loc	0 20 14 prologue_end            # testprog.c:20:14
+	cmpl	$0, common
+	.loc	0 21 7                          # testprog.c:21:7
+	jne	.LBB1_4
+# %bb.1:
+	.loc	0 21 17 is_stmt 0               # testprog.c:21:17
+	cmpl	$1, global
+	.loc	0 22 7 is_stmt 1                # testprog.c:22:7
+	jne	.LBB1_4
+# %bb.2:
+	.loc	0 22 16 is_stmt 0               # testprog.c:22:16
+	cmpl	$2, local
+	.loc	0 23 7 is_stmt 1                # testprog.c:23:7
+	jne	.LBB1_4
+# %bb.3:
+	.loc	0 23 10 is_stmt 0               # testprog.c:23:10
+	movl	$string, %edi
+	movl	$.L.str, %esi
+	callq	strcmp
+	.loc	0 23 36                         # testprog.c:23:36
+	cmpl	$0, %eax
+.Ltmp3:
+	.loc	0 20 7 is_stmt 1                # testprog.c:20:7
+	je	.LBB1_5
+.LBB1_4:
+.Ltmp4:
+	.loc	0 25 7                          # testprog.c:25:7
+	movabsq	$.L.str.1, %rdi
+	movb	$0, %al
+	callq	printf
+	.loc	0 26 7                          # testprog.c:26:7
+	movl	$1, -4(%rbp)
+	jmp	.LBB1_6
+.Ltmp5:
+.LBB1_5:
+	.loc	0 29 3                          # testprog.c:29:3
+	movabsq	$.L.str.2, %rdi
+	movb	$0, %al
+	callq	printf
+	.loc	0 30 3                          # testprog.c:30:3
+	movl	$0, -4(%rbp)
+.LBB1_6:
+	.loc	0 31 1                          # testprog.c:31:1
+	movl	-4(%rbp), %eax
+	addq	$16, %rsp
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Ltmp6:
+.Lfunc_end1:
+	.size	main, .Lfunc_end1-main
+	.cfi_endproc
+                                        # -- End function
+	.type	global,@object                  # @global
+	.data
+	.globl	global
+	.p2align	2
+global:
+	.long	1                               # 0x1
+	.size	global, 4
+
+	.type	common,@object                  # @common
+	.bss
+	.globl	common
+	.p2align	2
+common:
+	.long	0                               # 0x0
+	.size	common, 4
+
+	.type	local,@object                   # @local
+	.data
+	.p2align	2
+local:
+	.long	2                               # 0x2
+	.size	local, 4
+
+	.type	string,@object                  # @string
+	.section	.rodata,"a",@progbits
+string:
+	.asciz	"string"
+	.size	string, 7
+
+	.type	.L.str,@object                  # @.str
+	.section	.rodata.str1.1,"aMS",@progbits,1
+.L.str:
+	.asciz	"string"
+	.size	.L.str, 7
+
+	.type	.L.str.1,@object                # @.str.1
+.L.str.1:
+	.asciz	"failed\n"
+	.size	.L.str.1, 8
+
+	.type	.L.str.2,@object                # @.str.2
+.L.str.2:
+	.asciz	"ok\n"
+	.size	.L.str.2, 4
+
+	.section	.debug_abbrev,"",@progbits
+	.byte	1                               # Abbreviation Code
+	.byte	17                              # DW_TAG_compile_unit
+	.byte	1                               # DW_CHILDREN_yes
+	.byte	37                              # DW_AT_producer
+	.byte	37                              # DW_FORM_strx1
+	.byte	19                              # DW_AT_language
+	.byte	5                               # DW_FORM_data2
+	.byte	3                               # DW_AT_name
+	.byte	37                              # DW_FORM_strx1
+	.byte	114                             # DW_AT_str_offsets_base
+	.byte	23                              # DW_FORM_sec_offset
+	.byte	16                              # DW_AT_stmt_list
+	.byte	23                              # DW_FORM_sec_offset
+	.byte	27                              # DW_AT_comp_dir
+	.byte	37                              # DW_FORM_strx1
+	.byte	17                              # DW_AT_low_pc
+	.byte	27                              # DW_FORM_addrx
+	.byte	18                              # DW_AT_high_pc
+	.byte	6                               # DW_FORM_data4
+	.byte	115                             # DW_AT_addr_base
+	.byte	23                              # DW_FORM_sec_offset
+	.byte	0                               # EOM(1)
+	.byte	0                               # EOM(2)
+	.byte	2                               # Abbreviation Code
+	.byte	52                              # DW_TAG_variable
+	.byte	0                               # DW_CHILDREN_no
+	.byte	3                               # DW_AT_name
+	.byte	37                              # DW_FORM_strx1
+	.byte	73                              # DW_AT_type
+	.byte	19                              # DW_FORM_ref4
+	.byte	63                              # DW_AT_external
+	.byte	25                              # DW_FORM_flag_present
+	.byte	58                              # DW_AT_decl_file
+	.byte	11                              # DW_FORM_data1
+	.byte	59                              # DW_AT_decl_line
+	.byte	11                              # DW_FORM_data1
+	.byte	2                               # DW_AT_location
+	.byte	24                              # DW_FORM_exprloc
+	.byte	0                               # EOM(1)
+	.byte	0                               # EOM(2)
+	.byte	3                               # Abbreviation Code
+	.byte	36                              # DW_TAG_base_type
+	.byte	0                               # DW_CHILDREN_no
+	.byte	3                               # DW_AT_name
+	.byte	37                              # DW_FORM_strx1
+	.byte	62                              # DW_AT_encoding
+	.byte	11                              # DW_FORM_data1
+	.byte	11                              # DW_AT_byte_size
+	.byte	11                              # DW_FORM_data1
+	.byte	0                               # EOM(1)
+	.byte	0                               # EOM(2)
+	.byte	4                               # Abbreviation Code
+	.byte	52                              # DW_TAG_variable
+	.byte	0                               # DW_CHILDREN_no
+	.byte	3                               # DW_AT_name
+	.byte	37                              # DW_FORM_strx1
+	.byte	73                              # DW_AT_type
+	.byte	19                              # DW_FORM_ref4
+	.byte	58                              # DW_AT_decl_file
+	.byte	11                              # DW_FORM_data1
+	.byte	59                              # DW_AT_decl_line
+	.byte	11                              # DW_FORM_data1
+	.byte	2                               # DW_AT_location
+	.byte	24                              # DW_FORM_exprloc
+	.byte	0                               # EOM(1)
+	.byte	0                               # EOM(2)
+	.byte	5                               # Abbreviation Code
+	.byte	1                               # DW_TAG_array_type
+	.byte	1                               # DW_CHILDREN_yes
+	.byte	73                              # DW_AT_type
+	.byte	19                              # DW_FORM_ref4
+	.byte	0                               # EOM(1)
+	.byte	0                               # EOM(2)
+	.byte	6                               # Abbreviation Code
+	.byte	33                              # DW_TAG_subrange_type
+	.byte	0                               # DW_CHILDREN_no
+	.byte	73                              # DW_AT_type
+	.byte	19                              # DW_FORM_ref4
+	.byte	55                              # DW_AT_count
+	.byte	11                              # DW_FORM_data1
+	.byte	0                               # EOM(1)
+	.byte	0                               # EOM(2)
+	.byte	7                               # Abbreviation Code
+	.byte	38                              # DW_TAG_const_type
+	.byte	0                               # DW_CHILDREN_no
+	.byte	73                              # DW_AT_type
+	.byte	19                              # DW_FORM_ref4
+	.byte	0                               # EOM(1)
+	.byte	0                               # EOM(2)
+	.byte	8                               # Abbreviation Code
+	.byte	36                              # DW_TAG_base_type
+	.byte	0                               # DW_CHILDREN_no
+	.byte	3                               # DW_AT_name
+	.byte	37                              # DW_FORM_strx1
+	.byte	11                              # DW_AT_byte_size
+	.byte	11                              # DW_FORM_data1
+	.byte	62                              # DW_AT_encoding
+	.byte	11                              # DW_FORM_data1
+	.byte	0                               # EOM(1)
+	.byte	0                               # EOM(2)
+	.byte	9                               # Abbreviation Code
+	.byte	46                              # DW_TAG_subprogram
+	.byte	0                               # DW_CHILDREN_no
+	.byte	17                              # DW_AT_low_pc
+	.byte	27                              # DW_FORM_addrx
+	.byte	18                              # DW_AT_high_pc
+	.byte	6                               # DW_FORM_data4
+	.byte	64                              # DW_AT_frame_base
+	.byte	24                              # DW_FORM_exprloc
+	.byte	3                               # DW_AT_name
+	.byte	37                              # DW_FORM_strx1
+	.byte	58                              # DW_AT_decl_file
+	.byte	11                              # DW_FORM_data1
+	.byte	59                              # DW_AT_decl_line
+	.byte	11                              # DW_FORM_data1
+	.byte	39                              # DW_AT_prototyped
+	.byte	25                              # DW_FORM_flag_present
+	.byte	73                              # DW_AT_type
+	.byte	19                              # DW_FORM_ref4
+	.byte	63                              # DW_AT_external
+	.byte	25                              # DW_FORM_flag_present
+	.byte	0                               # EOM(1)
+	.byte	0                               # EOM(2)
+	.byte	0                               # EOM(3)
+	.section	.debug_info,"",@progbits
+.Lcu_begin0:
+	.long	.Ldebug_info_end0-.Ldebug_info_start0 # Length of Unit
+.Ldebug_info_start0:
+	.short	5                               # DWARF version number
+	.byte	1                               # DWARF Unit Type
+	.byte	8                               # Address Size (in bytes)
+	.long	.debug_abbrev                   # Offset Into Abbrev. Section
+	.byte	1                               # Abbrev [1] 0xc:0x7f DW_TAG_compile_unit
+	.byte	0                               # DW_AT_producer
+	.short	12                              # DW_AT_language
+	.byte	1                               # DW_AT_name
+	.long	.Lstr_offsets_base0             # DW_AT_str_offsets_base
+	.long	.Lline_table_start0             # DW_AT_stmt_list
+	.byte	2                               # DW_AT_comp_dir
+	.byte	4                               # DW_AT_low_pc
+	.long	.Lfunc_end1-.Lfunc_begin0       # DW_AT_high_pc
+	.long	.Laddr_table_base0              # DW_AT_addr_base
+	.byte	2                               # Abbrev [2] 0x23:0xb DW_TAG_variable
+	.byte	3                               # DW_AT_name
+	.long	46                              # DW_AT_type
+                                        # DW_AT_external
+	.byte	0                               # DW_AT_decl_file
+	.byte	7                               # DW_AT_decl_line
+	.byte	2                               # DW_AT_location
+	.byte	161
+	.byte	0
+	.byte	3                               # Abbrev [3] 0x2e:0x4 DW_TAG_base_type
+	.byte	4                               # DW_AT_name
+	.byte	5                               # DW_AT_encoding
+	.byte	4                               # DW_AT_byte_size
+	.byte	2                               # Abbrev [2] 0x32:0xb DW_TAG_variable
+	.byte	5                               # DW_AT_name
+	.long	46                              # DW_AT_type
+                                        # DW_AT_external
+	.byte	0                               # DW_AT_decl_file
+	.byte	6                               # DW_AT_decl_line
+	.byte	2                               # DW_AT_location
+	.byte	161
+	.byte	1
+	.byte	4                               # Abbrev [4] 0x3d:0xb DW_TAG_variable
+	.byte	6                               # DW_AT_name
+	.long	46                              # DW_AT_type
+	.byte	0                               # DW_AT_decl_file
+	.byte	8                               # DW_AT_decl_line
+	.byte	2                               # DW_AT_location
+	.byte	161
+	.byte	2
+	.byte	4                               # Abbrev [4] 0x48:0xb DW_TAG_variable
+	.byte	7                               # DW_AT_name
+	.long	83                              # DW_AT_type
+	.byte	0                               # DW_AT_decl_file
+	.byte	9                               # DW_AT_decl_line
+	.byte	2                               # DW_AT_location
+	.byte	161
+	.byte	3
+	.byte	5                               # Abbrev [5] 0x53:0xc DW_TAG_array_type
+	.long	95                              # DW_AT_type
+	.byte	6                               # Abbrev [6] 0x58:0x6 DW_TAG_subrange_type
+	.long	104                             # DW_AT_type
+	.byte	7                               # DW_AT_count
+	.byte	0                               # End Of Children Mark
+	.byte	7                               # Abbrev [7] 0x5f:0x5 DW_TAG_const_type
+	.long	100                             # DW_AT_type
+	.byte	3                               # Abbrev [3] 0x64:0x4 DW_TAG_base_type
+	.byte	8                               # DW_AT_name
+	.byte	6                               # DW_AT_encoding
+	.byte	1                               # DW_AT_byte_size
+	.byte	8                               # Abbrev [8] 0x68:0x4 DW_TAG_base_type
+	.byte	9                               # DW_AT_name
+	.byte	8                               # DW_AT_byte_size
+	.byte	7                               # DW_AT_encoding
+	.byte	9                               # Abbrev [9] 0x6c:0xf DW_TAG_subprogram
+	.byte	4                               # DW_AT_low_pc
+	.long	.Lfunc_end0-.Lfunc_begin0       # DW_AT_high_pc
+	.byte	1                               # DW_AT_frame_base
+	.byte	86
+	.byte	10                              # DW_AT_name
+	.byte	0                               # DW_AT_decl_file
+	.byte	12                              # DW_AT_decl_line
+                                        # DW_AT_prototyped
+	.long	46                              # DW_AT_type
+                                        # DW_AT_external
+	.byte	9                               # Abbrev [9] 0x7b:0xf DW_TAG_subprogram
+	.byte	5                               # DW_AT_low_pc
+	.long	.Lfunc_end1-.Lfunc_begin1       # DW_AT_high_pc
+	.byte	1                               # DW_AT_frame_base
+	.byte	86
+	.byte	11                              # DW_AT_name
+	.byte	0                               # DW_AT_decl_file
+	.byte	18                              # DW_AT_decl_line
+                                        # DW_AT_prototyped
+	.long	46                              # DW_AT_type
+                                        # DW_AT_external
+	.byte	0                               # End Of Children Mark
+.Ldebug_info_end0:
+	.section	.debug_str_offsets,"",@progbits
+	.long	52                              # Length of String Offsets Set
+	.short	5
+	.short	0
+.Lstr_offsets_base0:
+	.section	.debug_str,"MS",@progbits,1
+.Linfo_string0:
+	.asciz	"Ubuntu clang version 12.0.0-3ubuntu1~20.04.5" # string offset=0
+.Linfo_string1:
+	.asciz	"testprog.c"                    # string offset=45
+.Linfo_string2:
+	.asciz	"/home/kavitha/workarea/binutils-gdb-amd/binutils/testsuite/binutils-all" # string offset=56
+.Linfo_string3:
+	.asciz	"global"                        # string offset=128
+.Linfo_string4:
+	.asciz	"int"                           # string offset=135
+.Linfo_string5:
+	.asciz	"common"                        # string offset=139
+.Linfo_string6:
+	.asciz	"local"                         # string offset=146
+.Linfo_string7:
+	.asciz	"string"                        # string offset=152
+.Linfo_string8:
+	.asciz	"char"                          # string offset=159
+.Linfo_string9:
+	.asciz	"__ARRAY_SIZE_TYPE__"           # string offset=164
+.Linfo_string10:
+	.asciz	"fn"                            # string offset=184
+.Linfo_string11:
+	.asciz	"main"                          # string offset=187
+	.section	.debug_str_offsets,"",@progbits
+	.long	.Linfo_string0
+	.long	.Linfo_string1
+	.long	.Linfo_string2
+	.long	.Linfo_string3
+	.long	.Linfo_string4
+	.long	.Linfo_string5
+	.long	.Linfo_string6
+	.long	.Linfo_string7
+	.long	.Linfo_string8
+	.long	.Linfo_string9
+	.long	.Linfo_string10
+	.long	.Linfo_string11
+	.section	.debug_addr,"",@progbits
+	.long	.Ldebug_addr_end0-.Ldebug_addr_start0 # Length of contribution
+.Ldebug_addr_start0:
+	.short	5                               # DWARF version number
+	.byte	8                               # Address size
+	.byte	0                               # Segment selector size
+.Laddr_table_base0:
+	.quad	global
+	.quad	common
+	.quad	local
+	.quad	string
+	.quad	.Lfunc_begin0
+	.quad	.Lfunc_begin1
+.Ldebug_addr_end0:
+	.ident	"Ubuntu clang version 12.0.0-3ubuntu1~20.04.5"
+	.section	".note.GNU-stack","",@progbits
+	.section	.debug_line,"",@progbits
+.Lline_table_start0:
-- 
2.25.1


^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2022-05-26  8:06 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-04-28 10:14 [PATCH] Binutils support for DWARF-5 DW_OP_addrx Natarajan, Kavitha
2022-04-29 14:21 ` Nick Clifton
2022-05-20 10:38   ` Natarajan, Kavitha
2022-05-25 15:13     ` Nick Clifton
2022-05-25 23:42       ` Alan Modra
2022-05-26  4:35         ` Natarajan, Kavitha
2022-05-26  7:19         ` Luis Machado
2022-05-26  8:04           ` Alan Modra
2022-05-26  8:06             ` Luis Machado
  -- strict thread matches above, loose matches on Subject: below --
2022-04-27 10:33 Natarajan, Kavitha
2022-04-28  9:54 ` Nick Clifton
2022-04-28 10:19   ` Natarajan, Kavitha

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).