Add a testfile using GCC 15 (experimental).

         * libdw/dwarf.h: Add DW_LNAME_lo_user and DW_LNAME_hi_user.
         * src/readelf.c (dwarf_lname_string): New function.
         (dwarf_lname_name): Likewise.
         (attr_callback): Handle DW_AT_language_name by calling
         dwarf_lname_name.

         * run-readelf-lnames.sh: New test.
         * testfile-lnames.bz2: New testfile.
         * tests/Makefile.am (TESTS): Add run-readelf-lnames.sh.
         (EXTRA_DIST): Add run-readelf-lnames.sh and
         testfile-lnames.bz2.

Signed-off-by: Mark Wielaard <m...@klomp.org>
---
 libdw/dwarf.h               |   5 +-
 src/readelf.c               |  26 ++++++++++
 tests/Makefile.am           |   2 +
 tests/run-readelf-lnames.sh |  92 ++++++++++++++++++++++++++++++++++++
 tests/testfile-lnames.bz2   | Bin 0 -> 2717 bytes
 5 files changed, 124 insertions(+), 1 deletion(-)
 create mode 100755 tests/run-readelf-lnames.sh
 create mode 100755 tests/testfile-lnames.bz2

diff --git a/libdw/dwarf.h b/libdw/dwarf.h
index 66017c1518dd..5c8563128644 100644
--- a/libdw/dwarf.h
+++ b/libdw/dwarf.h
@@ -834,7 +834,10 @@ enum
     DW_LNAME_P4 = 0x002b,
     DW_LNAME_Metal = 0x002c,
     DW_LNAME_V = 0x002d,
-    DW_LNAME_Algol68 = 0x002e
+    DW_LNAME_Algol68 = 0x002e,
+
+    DW_LNAME_lo_user = 0x8000,
+    DW_LNAME_hi_user = 0xffff
   };
 
 /* DWARF identifier case encodings.  */
diff --git a/src/readelf.c b/src/readelf.c
index 12d85472cef1..e5bc16a5bc43 100644
--- a/src/readelf.c
+++ b/src/readelf.c
@@ -4371,6 +4371,20 @@ dwarf_lang_string (unsigned int lang)
 }
 
 
+static const char *
+dwarf_lname_string (unsigned int lname)
+{
+  switch (lname)
+    {
+#define DWARF_ONE_KNOWN_DW_LNAME(NAME, CODE) case CODE: return #NAME;
+      DWARF_ALL_KNOWN_DW_LNAME
+#undef DWARF_ONE_KNOWN_DW_LNAME
+    default:
+      return NULL;
+    }
+}
+
+
 static const char *
 dwarf_inline_string (unsigned int code)
 {
@@ -4678,6 +4692,15 @@ dwarf_lang_name (unsigned int lang)
 }
 
 
+static const char *
+dwarf_lname_name (unsigned int lname)
+{
+  const char *ret = dwarf_lname_string (lname);
+  return string_or_unknown (ret, lname, DW_LNAME_lo_user, DW_LNAME_hi_user,
+                           false);
+}
+
+
 static const char *
 dwarf_inline_name (unsigned int code)
 {
@@ -7938,6 +7961,9 @@ attr_callback (Dwarf_Attribute *attrp, void *arg)
        case DW_AT_language:
          valuestr = dwarf_lang_name (num);
          break;
+       case DW_AT_language_name:
+         valuestr = dwarf_lname_name (num);
+         break;
        case DW_AT_encoding:
          valuestr = dwarf_encoding_name (num);
          break;
diff --git a/tests/Makefile.am b/tests/Makefile.am
index bf5a9b228126..f53fd92662e3 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -165,6 +165,7 @@ TESTS = run-arextract.sh run-arsymtest.sh run-ar.sh newfile 
test-nlist \
        run-test-flag-nobits.sh run-prelink-addr-test.sh \
        run-dwarf-getstring.sh run-rerequest_tag.sh run-typeiter.sh \
        run-readelf-d.sh run-readelf-gdb_index.sh run-unstrip-n.sh \
+       run-readelf-lnames.sh \
        run-low_high_pc.sh run-macro-test.sh run-elf_cntl_gelf_getshdr.sh \
        run-test-archive64.sh run-readelf-vmcoreinfo.sh \
        run-readelf-mixed-corenote.sh run-dwfllines.sh \
@@ -451,6 +452,7 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh run-ar.sh \
             run-typeiter.sh testfile59.bz2 \
             run-readelf-d.sh testlib_dynseg.so.bz2 \
             run-readelf-Dd.sh \
+            run-readelf-lnames.sh testfile-lnames.bz2 \
             testfile-s390x-hash-both.bz2 \
             run-readelf-gdb_index.sh testfilegdbindex5.bz2 \
             testfilegdbindex7.bz2 testfilegdbindex9.bz2 \
diff --git a/tests/run-readelf-lnames.sh b/tests/run-readelf-lnames.sh
new file mode 100755
index 000000000000..0f5d874d0dee
--- /dev/null
+++ b/tests/run-readelf-lnames.sh
@@ -0,0 +1,92 @@
+#! /bin/sh
+# Copyright (C) 2025 Mark J. Wielaard <m...@klomp.org>
+# This file is part of elfutils.
+#
+# This file 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.
+#
+# elfutils 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/>.
+
+. $srcdir/test-subr.sh
+
+# Using GCC 15.0.1 20250310 (experimental)
+#
+# echo "void foo () { }" | g++ -g -c -x c++ -std=c++20 - -o cpp.o
+# echo "int main () { }" | gcc -g -c -x c -std=c23 - -o c.o
+# gcc -g  -o testfile-lnames cpp.o c.o
+#
+# Note this version outputs an older DW_AT_language you need to
+# see the DW_AT_language_version to see the real std used.
+
+testfiles testfile-lnames
+
+testrun_compare ${abs_top_builddir}/src/readelf --debug-dump=info 
testfile-lnames <<\EOF
+
+DWARF section [28] '.debug_info' at offset 0x3314:
+ [Offset]
+ Compilation unit at offset 0:
+ Version: 5, Abbreviation section offset: 0, Address size: 8, Offset size: 4
+ Unit type: compile (1)
+ [     c]  compile_unit         abbrev: 1
+           producer             (strp) "GNU C++20 15.0.1 20250310 
(experimental) -mtune=generic -march=x86-64 -g -std=c++20"
+           language             (data1) C_plus_plus_14 (33)
+           language_name        (data1) C_plus_plus (4)
+           language_version     (data4) 202002
+           name                 (line_strp) "<stdin>"
+           comp_dir             (line_strp) "/tmp"
+           low_pc               (addr) 0x0000000000401106 <_Z3foov>
+           high_pc              (data8) 7 (0x000000000040110d <main>)
+           stmt_list            (sec_offset) 0
+ [    33]    subprogram           abbrev: 2
+             external             (flag_present) yes
+             name                 (string) "foo"
+             decl_file            (data1) <stdin> (1)
+             decl_line            (data1) 1
+             decl_column          (data1) 6
+             linkage_name         (strp) "_Z3foov"
+             low_pc               (addr) 0x0000000000401106 <_Z3foov>
+             high_pc              (data8) 7 (0x000000000040110d <main>)
+             frame_base           (exprloc) 
+              [ 0] call_frame_cfa
+             call_all_calls       (flag_present) yes
+ Compilation unit at offset 82:
+ Version: 5, Abbreviation section offset: 51, Address size: 8, Offset size: 4
+ Unit type: compile (1)
+ [    5e]  compile_unit         abbrev: 1
+           producer             (strp) "GNU C23 15.0.1 20250310 (experimental) 
-mtune=generic -march=x86-64 -g -std=c23"
+           language             (data1) C11 (29)
+           language_name        (data1) C (3)
+           language_version     (data4) 202311
+           name                 (line_strp) "<stdin>"
+           comp_dir             (line_strp) "/tmp"
+           low_pc               (addr) 0x000000000040110d <main>
+           high_pc              (data8) 11 (0x0000000000401118 <_fini>)
+           stmt_list            (sec_offset) 76
+ [    85]    subprogram           abbrev: 2
+             external             (flag_present) yes
+             name                 (strp) "main"
+             decl_file            (data1) <stdin> (1)
+             decl_line            (data1) 1
+             decl_column          (data1) 5
+             prototyped           (flag_present) yes
+             type                 (ref4) [    a3]
+             low_pc               (addr) 0x000000000040110d <main>
+             high_pc              (data8) 11 (0x0000000000401118 <_fini>)
+             frame_base           (exprloc) 
+              [ 0] call_frame_cfa
+             call_all_calls       (flag_present) yes
+ [    a3]    base_type            abbrev: 3
+             byte_size            (data1) 4
+             encoding             (data1) signed (5)
+             name                 (string) "int"
+EOF
+
+exit 0
diff --git a/tests/testfile-lnames.bz2 b/tests/testfile-lnames.bz2
new file mode 100755
index 
0000000000000000000000000000000000000000..4ce4d179a9d27128bd90f1038df8a8bd8b8485bc
GIT binary patch
literal 2717
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
XhUF*x#l-iC|BJaIoG3^*iYEquiMHiL

literal 0
HcmV?d00001

-- 
2.48.1

Reply via email to