git: 7bb441c86678 - main - libdwarf: Add some constants from DWARF 5

From: Mark Johnston <markj_at_FreeBSD.org>
Date: Tue, 07 Feb 2023 20:11:45 UTC
The branch main has been updated by markj:

URL: https://cgit.FreeBSD.org/src/commit/?id=7bb441c866781ec14b3e79a4f3e95fd319ab7ff9

commit 7bb441c866781ec14b3e79a4f3e95fd319ab7ff9
Author:     Mark Johnston <markj@FreeBSD.org>
AuthorDate: 2023-02-07 19:33:27 +0000
Commit:     Mark Johnston <markj@FreeBSD.org>
CommitDate: 2023-02-07 20:10:24 +0000

    libdwarf: Add some constants from DWARF 5
    
    This is not exhaustive - DWARF 5 has some new enumeration types not
    implemented here - but I think I caught all the ones that are extended
    in DWARF 5, plus the new compilation unit type (DW_UT_*), needed when
    parsing .debug_info headers.
    
    These were useful when extending libdwarf/ctfconvert/readelf to handle
    DWARF generated by gcc 12, which is version 5 by default.
    
    Reviewed by:    emaste
    MFC after:      3 weeks
    Sponsored by:   The FreeBSD Foundation
    Differential Revision:  https://reviews.freebsd.org/D38273
---
 contrib/elftoolchain/libdwarf/Version.map         |   1 +
 contrib/elftoolchain/libdwarf/dwarf.h             |  83 +++++++++++
 contrib/elftoolchain/libdwarf/dwarf_dump.c        | 168 +++++++++++++++++++++-
 contrib/elftoolchain/libdwarf/dwarf_get_AT_name.3 |  11 +-
 contrib/elftoolchain/libdwarf/libdwarf.h          |   1 +
 lib/libdwarf/Makefile                             |   1 +
 6 files changed, 263 insertions(+), 2 deletions(-)

diff --git a/contrib/elftoolchain/libdwarf/Version.map b/contrib/elftoolchain/libdwarf/Version.map
index 669f70e44dac..6714457e7ede 100644
--- a/contrib/elftoolchain/libdwarf/Version.map
+++ b/contrib/elftoolchain/libdwarf/Version.map
@@ -100,6 +100,7 @@ global:
 	dwarf_get_OP_name;
 	dwarf_get_ORD_name;
 	dwarf_get_TAG_name;
+	dwarf_get_UT_name;
 	dwarf_get_VIRTUALITY_name;
 	dwarf_get_VIS_name;
 	dwarf_get_abbrev;
diff --git a/contrib/elftoolchain/libdwarf/dwarf.h b/contrib/elftoolchain/libdwarf/dwarf.h
index 8f3733566527..99e934078e7d 100644
--- a/contrib/elftoolchain/libdwarf/dwarf.h
+++ b/contrib/elftoolchain/libdwarf/dwarf.h
@@ -90,6 +90,14 @@
 #define DW_TAG_type_unit		0x41
 #define DW_TAG_rvalue_reference_type	0x42
 #define DW_TAG_template_alias		0x43
+#define DW_TAG_coarray_type		0x44
+#define DW_TAG_generic_subrange		0x45
+#define DW_TAG_dynamic_type		0x46
+#define DW_TAG_atomic_type		0x47
+#define DW_TAG_call_site		0x48
+#define DW_TAG_call_site_parameter	0x49
+#define DW_TAG_skeleton_unit		0x4a
+#define DW_TAG_immutable_type		0x4b
 #define DW_TAG_lo_user			0x4080
 #define DW_TAG_hi_user			0xffff
 
@@ -205,6 +213,35 @@
 #define DW_AT_const_expr		0x6c
 #define DW_AT_enum_class		0x6d
 #define DW_AT_linkage_name		0x6e
+#define DW_AT_string_length_bit_size	0x6f
+#define DW_AT_string_length_byte_size	0x70
+#define DW_AT_rank			0x71
+#define DW_AT_str_offsets_base		0x72
+#define DW_AT_addr_base			0x73
+#define DW_AT_rnglists_base		0x74
+#define DW_AT_dwo_name			0x76
+#define DW_AT_reference			0x77
+#define DW_AT_rvalue_reference		0x78
+#define DW_AT_macros			0x79
+#define DW_AT_call_all_calls		0x7a
+#define DW_AT_call_all_source_calls	0x7b
+#define DW_AT_call_all_tail_calls	0x7c
+#define DW_AT_call_return_pc		0x7d
+#define DW_AT_call_value		0x7e
+#define DW_AT_call_origin		0x7f
+#define DW_AT_call_parameter		0x80
+#define DW_AT_call_pc			0x81
+#define DW_AT_call_tail_call		0x82
+#define DW_AT_call_target		0x83
+#define DW_AT_call_target_clobbered	0x84
+#define DW_AT_call_data_location	0x85
+#define DW_AT_call_data_value		0x86
+#define DW_AT_noreturn			0x87
+#define DW_AT_alignment			0x88
+#define DW_AT_export_symbols		0x89
+#define DW_AT_deleted			0x8a
+#define DW_AT_defaulted			0x8b
+#define DW_AT_loclists_base		0x8c
 #define DW_AT_lo_user			0x2000
 #define DW_AT_hi_user			0x3fff
 
@@ -292,7 +329,25 @@
 #define DW_FORM_sec_offset		0x17
 #define DW_FORM_exprloc			0x18
 #define DW_FORM_flag_present		0x19
+#define DW_FORM_strx			0x1a
+#define DW_FORM_addrx			0x1b
+#define DW_FORM_ref_sup4		0x1c
+#define DW_FORM_strp_sup		0x1d
+#define DW_FORM_data16			0x1e
+#define DW_FORM_line_strp		0x1f
 #define DW_FORM_ref_sig8		0x20
+#define DW_FORM_implicit_const		0x21
+#define DW_FORM_loclistx		0x22
+#define DW_FORM_rnglistx		0x23
+#define DW_FORM_ref_sup8		0x24
+#define DW_FORM_ref_strx1		0x25
+#define DW_FORM_ref_strx2		0x26
+#define DW_FORM_ref_strx3		0x27
+#define DW_FORM_ref_strx4		0x28
+#define DW_FORM_ref_addrx1		0x29
+#define DW_FORM_ref_addrx2		0x2a
+#define DW_FORM_ref_addrx3		0x2b
+#define DW_FORM_ref_addrx4		0x2c
 #define	DW_FORM_GNU_ref_alt		0x1f20
 #define	DW_FORM_GNU_strp_alt		0x1f21
 
@@ -450,6 +505,16 @@
 #define DW_OP_bit_piece			0x9d
 #define DW_OP_implicit_value		0x9e
 #define DW_OP_stack_value		0x9f
+#define DW_OP_implicit_pointer		0xa0
+#define DW_OP_addrx			0xa1
+#define DW_OP_constx			0xa2
+#define DW_OP_entry_value		0xa3
+#define DW_OP_const_type		0xa4
+#define DW_OP_regval_type		0xa5
+#define DW_OP_deref_type		0xa6
+#define DW_OP_xderef_type		0xa7
+#define DW_OP_convert			0xa8
+#define DW_OP_reinterpret		0xa9
 #define DW_OP_lo_user		 	0xe0
 #define DW_OP_hi_user		 	0xff
 
@@ -483,6 +548,9 @@
 #define DW_ATE_signed_fixed	 	0xd
 #define DW_ATE_unsigned_fixed	 	0xe
 #define DW_ATE_decimal_float	 	0xf
+#define DW_ATE_UTF			0x10
+#define DW_ATE_UCS			0x11
+#define DW_ATE_ASCII			0x12
 #define DW_ATE_lo_user		 	0x80
 #define DW_ATE_hi_user		 	0xff
 
@@ -553,6 +621,8 @@
 #define DW_CC_normal		 	0x01
 #define DW_CC_program		 	0x02
 #define DW_CC_nocall		 	0x03
+#define DW_CC_pass_by_reference		0x04
+#define DW_CC_pass_by_value		0x05
 #define DW_CC_lo_user		 	0x40
 #define DW_CC_hi_user		 	0xff
 
@@ -649,4 +719,17 @@
 #define	DW_EH_PE_aligned		0x50
 #define	DW_EH_PE_omit			0xff
 
+/*
+ * Compilation unit types.  DWARF5 only.
+ */
+
+#define DW_UT_compile			0x01
+#define DW_UT_type			0x02
+#define DW_UT_partial			0x03
+#define DW_UT_skeleton			0x04
+#define DW_UT_split_compile		0x05
+#define DW_UT_split_type		0x06
+#define DW_UT_lo_user			0x80
+#define DW_UT_hi_user			0xff
+
 #endif /* !_DWARF_H_ */
diff --git a/contrib/elftoolchain/libdwarf/dwarf_dump.c b/contrib/elftoolchain/libdwarf/dwarf_dump.c
index fe61bffc6a17..e847d8e443f2 100644
--- a/contrib/elftoolchain/libdwarf/dwarf_dump.c
+++ b/contrib/elftoolchain/libdwarf/dwarf_dump.c
@@ -250,6 +250,64 @@ dwarf_get_AT_name(unsigned attr, const char **s)
 		*s = "DW_AT_visibility"; break;
 	case DW_AT_vtable_elem_location:
 		*s = "DW_AT_vtable_elem_location"; break;
+	case DW_AT_string_length_bit_size:
+		*s = "DW_AT_string_length_bit_size"; break;
+	case DW_AT_string_length_byte_size:
+		*s = "DW_AT_string_length_byte_size"; break;
+	case DW_AT_rank:
+		*s = "DW_AT_rank"; break;
+	case DW_AT_str_offsets_base:
+		*s = "DW_AT_str_offsets_base"; break;
+	case DW_AT_addr_base:
+		*s = "DW_AT_addr_base"; break;
+	case DW_AT_rnglists_base:
+		*s = "DW_AT_rnglists_base"; break;
+	case DW_AT_dwo_name:
+		*s = "DW_AT_dwo_name"; break;
+	case DW_AT_reference:
+		*s = "DW_AT_reference"; break;
+	case DW_AT_rvalue_reference:
+		*s = "DW_AT_rvalue_reference"; break;
+	case DW_AT_macros:
+		*s = "DW_AT_macros"; break;
+	case DW_AT_call_all_calls:
+		*s = "DW_AT_call_all_calls"; break;
+	case DW_AT_call_all_source_calls:
+		*s = "DW_AT_call_all_source_calls"; break;
+	case DW_AT_call_all_tail_calls:
+		*s = "DW_AT_call_all_tail_calls"; break;
+	case DW_AT_call_return_pc:
+		*s = "DW_AT_call_return_pc"; break;
+	case DW_AT_call_value:
+		*s = "DW_AT_call_value"; break;
+	case DW_AT_call_origin:
+		*s = "DW_AT_call_origin"; break;
+	case DW_AT_call_parameter:
+		*s = "DW_AT_call_parameter"; break;
+	case DW_AT_call_pc:
+		*s = "DW_AT_call_pc"; break;
+	case DW_AT_call_tail_call:
+		*s = "DW_AT_call_tail_call"; break;
+	case DW_AT_call_target:
+		*s = "DW_AT_call_target"; break;
+	case DW_AT_call_target_clobbered:
+		*s = "DW_AT_call_target_clobbered"; break;
+	case DW_AT_call_data_location:
+		*s = "DW_AT_call_data_location"; break;
+	case DW_AT_call_data_value:
+		*s = "DW_AT_call_data_value"; break;
+	case DW_AT_noreturn:
+		*s = "DW_AT_noreturn"; break;
+	case DW_AT_alignment:
+		*s = "DW_AT_alignment"; break;
+	case DW_AT_export_symbols:
+		*s = "DW_AT_export_symbols"; break;
+	case DW_AT_deleted:
+		*s = "DW_AT_deleted"; break;
+	case DW_AT_defaulted:
+		*s = "DW_AT_defaulted"; break;
+	case DW_AT_loclists_base:
+		*s = "DW_AT_loclists_base"; break;
 	case DW_AT_sf_names:
 		*s = "DW_AT_sf_names"; break;
 	case DW_AT_src_info:
@@ -371,7 +429,7 @@ dwarf_get_ATE_name(unsigned ate, const char **s)
 
 	assert(s != NULL);
 
-	switch(ate) {
+	switch (ate) {
 	case DW_ATE_address:
 		*s = "DW_ATE_address"; break;
 	case DW_ATE_boolean:
@@ -402,6 +460,12 @@ dwarf_get_ATE_name(unsigned ate, const char **s)
 		*s = "DW_ATE_unsigned_fixed"; break;
 	case DW_ATE_decimal_float:
 		*s = "DW_ATE_decimal_float"; break;
+	case DW_ATE_UTF:
+		*s = "DW_ATE_UTF"; break;
+	case DW_ATE_UCS:
+		*s = "DW_ATE_UCS"; break;
+	case DW_ATE_ASCII:
+		*s = "DW_ATE_ASCII"; break;
 	case DW_ATE_lo_user:
 		*s = "DW_ATE_lo_user"; break;
 	case DW_ATE_hi_user:
@@ -426,6 +490,10 @@ dwarf_get_CC_name(unsigned cc, const char **s)
 		*s = "DW_CC_program"; break;
 	case DW_CC_nocall:
 		*s = "DW_CC_nocall"; break;
+	case DW_CC_pass_by_reference:
+		*s = "DW_CC_pass_by_reference"; break;
+	case DW_CC_pass_by_value:
+		*s = "DW_CC_pass_by_value"; break;
 	case DW_CC_lo_user:
 		*s = "DW_CC_lo_user"; break;
 	case DW_CC_hi_user:
@@ -582,6 +650,42 @@ dwarf_get_FORM_name(unsigned form, const char **s)
 		*s = "DW_FORM_strp"; break;
 	case DW_FORM_udata:
 		*s = "DW_FORM_udata"; break;
+	case DW_FORM_strx:
+		*s = "DW_FORM_strx"; break;
+	case DW_FORM_addrx:
+		*s = "DW_FORM_addrx"; break;
+	case DW_FORM_ref_sup4:
+		*s = "DW_FORM_ref_sup4"; break;
+	case DW_FORM_strp_sup:
+		*s = "DW_FORM_strp_sup"; break;
+	case DW_FORM_data16:
+		*s = "DW_FORM_data16"; break;
+	case DW_FORM_line_strp:
+		*s = "DW_FORM_line_strp"; break;
+	case DW_FORM_implicit_const:
+		*s = "DW_FORM_implicit_const"; break;
+	case DW_FORM_loclistx:
+		*s = "DW_FORM_loclistx"; break;
+	case DW_FORM_rnglistx:
+		*s = "DW_FORM_rnglistx"; break;
+	case DW_FORM_ref_sup8:
+		*s = "DW_FORM_ref_sup8"; break;
+	case DW_FORM_ref_strx1:
+		*s = "DW_FORM_ref_strx1"; break;
+	case DW_FORM_ref_strx2:
+		*s = "DW_FORM_ref_strx2"; break;
+	case DW_FORM_ref_strx3:
+		*s = "DW_FORM_ref_strx3"; break;
+	case DW_FORM_ref_strx4:
+		*s = "DW_FORM_ref_strx4"; break;
+	case DW_FORM_ref_addrx1:
+		*s = "DW_FORM_ref_addrx1"; break;
+	case DW_FORM_ref_addrx2:
+		*s = "DW_FORM_ref_addrx2"; break;
+	case DW_FORM_ref_addrx3:
+		*s = "DW_FORM_ref_addrx3"; break;
+	case DW_FORM_ref_addrx4:
+		*s = "DW_FORM_ref_addrx4"; break;
 	default:
 		return (DW_DLV_NO_ENTRY);
 	}
@@ -1238,6 +1342,26 @@ dwarf_get_OP_name(unsigned op, const char **s)
 		*s = "DW_OP_implicit_value"; break;
 	case DW_OP_stack_value:
 		*s = "DW_OP_stack_value"; break;
+	case DW_OP_implicit_pointer:
+		*s = "DW_OP_implicit_pointer"; break;
+	case DW_OP_addrx:
+		*s = "DW_OP_addrx"; break;
+	case DW_OP_constx:
+		*s = "DW_OP_constx"; break;
+	case DW_OP_entry_value:
+		*s = "DW_OP_entry_value"; break;
+	case DW_OP_const_type:
+		*s = "DW_OP_const_type"; break;
+	case DW_OP_regval_type:
+		*s = "DW_OP_regval_type"; break;
+	case DW_OP_deref_type:
+		*s = "DW_OP_deref_type"; break;
+	case DW_OP_xderef_type:
+		*s = "DW_OP_xderef_type"; break;
+	case DW_OP_convert:
+		*s = "DW_OP_convert"; break;
+	case DW_OP_reinterpret:
+		*s = "DW_OP_reinterpret"; break;
 	case DW_OP_GNU_push_tls_address:
 		*s = "DW_OP_GNU_push_tls_address"; break;
 	case DW_OP_GNU_uninit:
@@ -1414,6 +1538,22 @@ dwarf_get_TAG_name(unsigned tag, const char **s)
 		*s = "DW_TAG_volatile_type"; break;
 	case DW_TAG_with_stmt:
 		*s = "DW_TAG_with_stmt"; break;
+	case DW_TAG_coarray_type:
+		*s = "DW_TAG_coarray_type"; break;
+	case DW_TAG_generic_subrange:
+		*s = "DW_TAG_generic_subrange"; break;
+	case DW_TAG_dynamic_type:
+		*s = "DW_TAG_dynamic_type"; break;
+	case DW_TAG_atomic_type:
+		*s = "DW_TAG_atomic_type"; break;
+	case DW_TAG_call_site:
+		*s = "DW_TAG_call_site"; break;
+	case DW_TAG_call_site_parameter:
+		*s = "DW_TAG_call_site_parameter"; break;
+	case DW_TAG_skeleton_unit:
+		*s = "DW_TAG_skeleton_unit"; break;
+	case DW_TAG_immutable_type:
+		*s = "DW_TAG_immutable_type"; break;
 	case DW_TAG_format_label:
 		*s = "DW_TAG_format_label"; break;
 	case DW_TAG_function_template:
@@ -1441,6 +1581,32 @@ dwarf_get_TAG_name(unsigned tag, const char **s)
 	return (DW_DLV_OK);
 }
 
+int
+dwarf_get_UT_name(unsigned unit_type, const char **s)
+{
+
+	assert(s != NULL);
+
+	switch (unit_type) {
+	case DW_UT_compile:
+		*s = "DW_UT_compile"; break;
+	case DW_UT_type:
+		*s = "DW_UT_type"; break;
+	case DW_UT_partial:
+		*s = "DW_UT_partial"; break;
+	case DW_UT_skeleton:
+		*s = "DW_UT_skeleton"; break;
+	case DW_UT_split_compile:
+		*s = "DW_UT_split_compile"; break;
+	case DW_UT_split_type:
+		*s = "DW_UT_split_type"; break;
+	default:
+		return (DW_DLV_NO_ENTRY);
+	}
+
+	return (DW_DLV_OK);
+}
+
 int
 dwarf_get_VIRTUALITY_name(unsigned vir, const char **s)
 {
diff --git a/contrib/elftoolchain/libdwarf/dwarf_get_AT_name.3 b/contrib/elftoolchain/libdwarf/dwarf_get_AT_name.3
index f84202664557..4beb430f6006 100644
--- a/contrib/elftoolchain/libdwarf/dwarf_get_AT_name.3
+++ b/contrib/elftoolchain/libdwarf/dwarf_get_AT_name.3
@@ -24,7 +24,7 @@
 .\"
 .\" $Id: dwarf_get_AT_name.3 3644 2018-10-15 19:55:01Z jkoshy $
 .\"
-.Dd April 22, 2011
+.Dd January 30, 2023
 .Dt DWARF_GET_AT_NAME 3
 .Os
 .Sh NAME
@@ -48,6 +48,7 @@
 .Nm dwarf_get_OP_name ,
 .Nm dwarf_get_ORD_name ,
 .Nm dwarf_get_TAG_name ,
+.Nm dwarf_get_UT_name ,
 .Nm dwarf_get_VIRTUALITY_name ,
 .Nm dwarf_get_VIS_name
 .Nd retrieve the symbolic names of DWARF constants
@@ -156,6 +157,11 @@
 .Fa "char **str"
 .Fc
 .Ft int
+.Fo dwarf_get_UT_name
+.Fa "unsigned unit_type"
+.Fa "const char **str"
+.Fc
+.Ft int
 .Fo dwarf_get_VIRTUALITY_name
 .Fa "unsigned val"
 .Fa "char **str"
@@ -241,6 +247,9 @@ constants.
 .It Fn dwarf_get_TAG_name
 .Dv DW_TAG_*
 constants.
+.It Fn dwarf_get_UT_name
+.Dv DW_UT_*
+constants.
 .It Fn dwarf_get_VIRTUALITY_name
 .Dv DW_VIRTUALITY_*
 constants.
diff --git a/contrib/elftoolchain/libdwarf/libdwarf.h b/contrib/elftoolchain/libdwarf/libdwarf.h
index b1f9e0c8abc7..0aa1857e3285 100644
--- a/contrib/elftoolchain/libdwarf/libdwarf.h
+++ b/contrib/elftoolchain/libdwarf/libdwarf.h
@@ -600,6 +600,7 @@ int		dwarf_get_MACINFO_name(unsigned, const char **);
 int		dwarf_get_OP_name(unsigned, const char **);
 int		dwarf_get_ORD_name(unsigned, const char **);
 int		dwarf_get_TAG_name(unsigned, const char **);
+int		dwarf_get_UT_name(unsigned, const char **);
 int		dwarf_get_VIRTUALITY_name(unsigned, const char **);
 int		dwarf_get_VIS_name(unsigned, const char **);
 int		dwarf_get_abbrev(Dwarf_Debug, Dwarf_Unsigned, Dwarf_Abbrev *,
diff --git a/lib/libdwarf/Makefile b/lib/libdwarf/Makefile
index 994c0bc5c1fa..f6d3f384cb15 100644
--- a/lib/libdwarf/Makefile
+++ b/lib/libdwarf/Makefile
@@ -281,6 +281,7 @@ MLINKS+= \
 	dwarf_get_AT_name.3	dwarf_get_OP_name.3	\
 	dwarf_get_AT_name.3	dwarf_get_ORD_name.3	\
 	dwarf_get_AT_name.3	dwarf_get_TAG_name.3	\
+	dwarf_get_AT_name.3	dwarf_get_UT_name.3	\
 	dwarf_get_AT_name.3	dwarf_get_VIRTUALITY_name.3 \
 	dwarf_get_AT_name.3	dwarf_get_VIS_name.3	\
 	dwarf_get_cu_die_offset.3 dwarf_get_arange_cu_header_offset.3 \