libdw: Update DW_LANG codes

Message ID 20241122173305.1070058-1-mark@klomp.org
State Committed
Headers
Series libdw: Update DW_LANG codes |

Commit Message

Mark Wielaard Nov. 22, 2024, 5:33 p.m. UTC
  Pick up the language codes published after DWARF5 was published.
The are listed at https://dwarfstd.org/languages.html

Also adjust C language dectection in dwarf_getfuncs and update the
dwarf_default_lower_bound function to return the default lower bounds
for the new langauge codes.

There is one small change in dwarf_default_lower_bound. We now return
zero instead of an error when called for DW_LANG_Mips_Assembler. Since
there is now an "official" DW_LANG_Assembly which is explicitly
defined as having a default lower bound of zero. It seems better to do
the same for the vendor code too.

    * libdw/dwarf.h: Add new DW_LANG codes.
    * libdw/dwarf_default_lower_bound.c (dwarf_default_lower_bound):
    Handle new language codes and add a special case for
    DW_LANG_Mips_Assembler.
    * libdw/dwarf_getfuncs.c (dwarf_getfuncs): Check against
    DW_LANG_C17 and DW_LANG_C23.
    * tests/dwarf_default_lower_bound.c: Also check for
    DW_LANG_Mips_Assembler.

Signed-off-by: Mark Wielaard <mark@klomp.org>
---
 libdw/dwarf.h                     | 36 ++++++++++++++++++++++++++++++-
 libdw/dwarf_default_lower_bound.c | 34 +++++++++++++++++++++++++++++
 libdw/dwarf_getfuncs.c            |  5 ++++-
 tests/dwarf_default_lower_bound.c | 13 +----------
 4 files changed, 74 insertions(+), 14 deletions(-)
  

Comments

Mark Wielaard Dec. 2, 2024, 6:14 p.m. UTC | #1
Hi,

On Fri, 2024-11-22 at 18:33 +0100, Mark Wielaard wrote:
> Pick up the language codes published after DWARF5 was published.
> The are listed at https://dwarfstd.org/languages.html
> 
> Also adjust C language dectection in dwarf_getfuncs and update the
> dwarf_default_lower_bound function to return the default lower bounds
> for the new langauge codes.
> 
> There is one small change in dwarf_default_lower_bound. We now return
> zero instead of an error when called for DW_LANG_Mips_Assembler. Since
> there is now an "official" DW_LANG_Assembly which is explicitly
> defined as having a default lower bound of zero. It seems better to do
> the same for the vendor code too.
> 
>     * libdw/dwarf.h: Add new DW_LANG codes.
>     * libdw/dwarf_default_lower_bound.c (dwarf_default_lower_bound):
>     Handle new language codes and add a special case for
>     DW_LANG_Mips_Assembler.
>     * libdw/dwarf_getfuncs.c (dwarf_getfuncs): Check against
>     DW_LANG_C17 and DW_LANG_C23.
>     * tests/dwarf_default_lower_bound.c: Also check for
>     DW_LANG_Mips_Assembler.

On irc Aaron said this looked fine except for the "add a special case"
which should be "remove a special case".

Pushed with that change in the ChangeLog.

Cheers,

Mark
  

Patch

diff --git a/libdw/dwarf.h b/libdw/dwarf.h
index 4be32de5a67d..573ffd6925b2 100644
--- a/libdw/dwarf.h
+++ b/libdw/dwarf.h
@@ -1,5 +1,6 @@ 
 /* This file defines standard DWARF types, structures, and macros.
    Copyright (C) 2000-2011, 2014, 2016, 2017, 2018 Red Hat, Inc.
+   Copyright (C) 2024 Mark J. Wielaard <mark@klomp.org>
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
@@ -697,7 +698,11 @@  enum
   };
 
 
-/* DWARF language encodings.  */
+/* DWARF language encodings.
+
+   See https://dwarfstd.org/languages.html for language code published
+   after DWARF5 was published (but before DWARF6 has been released,
+   which will introduce a new DW_AT_language_name/version scheme).  */
 enum
   {
     DW_LANG_C89 = 0x0001,	     /* ISO C:1989 */
@@ -738,6 +743,35 @@  enum
     DW_LANG_RenderScript = 0x0024,   /* RenderScript Kernal Language */
     DW_LANG_BLISS = 0x0025,	     /* BLISS */
 
+    DW_LANG_Kotlin = 0x0026,	     /* Kotlin */
+    DW_LANG_Zig = 0x0027,	     /* Zig */
+    DW_LANG_Crystal = 0x0028,	     /* Crystal */
+    DW_LANG_C_plus_plus_17 = 0x002a, /* ISO C++:2017 */
+    DW_LANG_C_plus_plus_20 = 0x002b, /* ISO C++:2018 */
+    DW_LANG_C17 = 0x002c,	     /* ISO C:2017 */
+    DW_LANG_Fortran18 = 0x002d,	     /* ISO/IEC 1539-1:2018 */
+    DW_LANG_Ada2005 = 0x002e,	     /* ISO Ada:2005 */
+    DW_LANG_Ada2012 = 0x002f,	     /* ISO Ada:2005 */
+    DW_LANG_HIP = 0x0030,	     /* HIP */
+    DW_LANG_Assembly = 0x0031,	     /* Assembly */
+    DW_LANG_C_sharp = 0x0032,	     /* C# */
+    DW_LANG_Mojo = 0x0033,	     /* Mojo */
+    DW_LANG_GLSL = 0x0034,	     /* OpenGL Shading Language */
+    DW_LANG_GLSL_ES = 0x0035,	     /* OpenGL ES Shading Language */
+    DW_LANG_HLSL = 0x0036,	     /* High-Level Shading Language */
+    DW_LANG_OpenCL_CPP = 0x0037,     /* OpenCL C++ */
+    DW_LANG_CPP_for_OpenCL = 0x0038, /* C++ for OpenCL */
+    DW_LANG_SYCL = 0x0039,	     /* SYCL */
+    DW_LANG_C_plus_plus_23 = 0x003a, /* ISO C++:2023 */
+    DW_LANG_Odin = 0x003b,	     /* Odin */
+    DW_LANG_P4 = 0x003c,	     /* P4 */
+    DW_LANG_Metal = 0x003d,	     /* Metal */
+    DW_LANG_C23 = 0x003e,	     /* ISO C:2023 */
+    DW_LANG_Fortran23 = 0x003f,	     /* ISO/IEC 1539-1:2023 */
+    DW_LANG_Ruby = 0x0040,	     /* Ruby */
+    DW_LANG_Move = 0x0041,	     /* Move */
+    DW_LANG_Hylo = 0x0042,	     /* Hylo */
+
     DW_LANG_lo_user = 0x8000,
     DW_LANG_Mips_Assembler = 0x8001, /* Assembler */
     DW_LANG_hi_user = 0xffff
diff --git a/libdw/dwarf_default_lower_bound.c b/libdw/dwarf_default_lower_bound.c
index a33a34335b1b..50639e32428e 100644
--- a/libdw/dwarf_default_lower_bound.c
+++ b/libdw/dwarf_default_lower_bound.c
@@ -1,5 +1,6 @@ 
 /* Get the default subrange lower bound for a given language.
    Copyright (C) 2016 Red Hat, Inc.
+   Copyright (C) 2024 Mark J. Wielaard <mark@klomp.org>
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
@@ -63,6 +64,30 @@  dwarf_default_lower_bound (int lang, Dwarf_Sword *result)
     case DW_LANG_Dylan:
     case DW_LANG_RenderScript:
     case DW_LANG_BLISS:
+    case DW_LANG_Kotlin:
+    case DW_LANG_Zig:
+    case DW_LANG_Crystal:
+    case DW_LANG_C_plus_plus_17:
+    case DW_LANG_C_plus_plus_20:
+    case DW_LANG_C17:
+    case DW_LANG_HIP:
+    case DW_LANG_Assembly:
+    case DW_LANG_C_sharp:
+    case DW_LANG_Mojo:
+    case DW_LANG_GLSL:
+    case DW_LANG_GLSL_ES:
+    case DW_LANG_HLSL:
+    case DW_LANG_OpenCL_CPP:
+    case DW_LANG_CPP_for_OpenCL:
+    case DW_LANG_SYCL:
+    case DW_LANG_C_plus_plus_23:
+    case DW_LANG_Odin:
+    case DW_LANG_P4:
+    case DW_LANG_Metal:
+    case DW_LANG_C23:
+    case DW_LANG_Ruby:
+    case DW_LANG_Move:
+    case DW_LANG_Hylo:
       *result = 0;
       return 0;
 
@@ -80,9 +105,18 @@  dwarf_default_lower_bound (int lang, Dwarf_Sword *result)
     case DW_LANG_Modula3:
     case DW_LANG_PLI:
     case DW_LANG_Julia:
+    case DW_LANG_Fortran18:
+    case DW_LANG_Ada2005:
+    case DW_LANG_Ada2012:
+    case DW_LANG_Fortran23:
       *result = 1;
       return 0;
 
+    /* Special case vendor Assembly variant.  */
+    case DW_LANG_Mips_Assembler:
+      *result = 0;
+      return 0;
+
     default:
       __libdw_seterrno (DWARF_E_UNKNOWN_LANGUAGE);
       return -1;
diff --git a/libdw/dwarf_getfuncs.c b/libdw/dwarf_getfuncs.c
index b95f06f403d1..f6968f0081d4 100644
--- a/libdw/dwarf_getfuncs.c
+++ b/libdw/dwarf_getfuncs.c
@@ -1,5 +1,6 @@ 
 /* Get function information.
    Copyright (C) 2005, 2013, 2015 Red Hat, Inc.
+   Copyright (C) 2024 Mark J. Wielaard <mark@klomp.org>
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2005.
 
@@ -104,7 +105,9 @@  dwarf_getfuncs (Dwarf_Die *cudie, int (*callback) (Dwarf_Die *, void *),
   bool c_cu = (lang == DW_LANG_C89
 	       || lang == DW_LANG_C
 	       || lang == DW_LANG_C99
-	       || lang == DW_LANG_C11);
+	       || lang == DW_LANG_C11
+	       || lang == DW_LANG_C17
+	       || lang == DW_LANG_C23);
 
   struct visitor_info v = { callback, arg, (void *) offset, NULL, c_cu };
   struct Dwarf_Die_Chain chain = { .die = CUDIE (cudie->cu),
diff --git a/tests/dwarf_default_lower_bound.c b/tests/dwarf_default_lower_bound.c
index d57424fc77fe..46e26f885a6b 100644
--- a/tests/dwarf_default_lower_bound.c
+++ b/tests/dwarf_default_lower_bound.c
@@ -1,6 +1,7 @@ 
 /* Test all DW_LANG constants are handled by dwarf_default_lower_bound.
 
    Copyright (C) 2016 Red Hat, Inc.
+   Copyright (C) 2024 Mark J. Wielaard <mark@klomp.org>
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
@@ -34,18 +35,6 @@  test_lang (const char *name, int lang)
   Dwarf_Sword low;
   int res = dwarf_default_lower_bound (lang, &low);
 
-  /* Assembler is special, it doesn't really have arrays.  */
-  if (lang == DW_LANG_Mips_Assembler)
-    {
-      if (res == 0)
-	{
-	  printf ("%s shouldn't have a known lower bound\n", name);
-	  exit (-1);
-	}
-      printf ("%s: <unknown>\n", name);
-      return;
-    }
-
   if (res != 0)
     {
       printf ("dwarf_default_lower_bound failed (%d) for %s\n", res, name);