diff mbox series

btf: fix PR debug/112768

Message ID 20231130221727.3044519-1-indu.bhagat@oracle.com
State New
Headers show
Series btf: fix PR debug/112768 | expand

Commit Message

Indu Bhagat Nov. 30, 2023, 10:17 p.m. UTC
PR debug/112768 - btf: fix asm comment output for BTF_KIND_FUNC* kinds

The patch adds a small function to abstract out the detail and return
the name of the type.  The patch also fixes the issue of BTF_KIND_FUNC
appearing in the comments with a 'null' string.

For btf-function-6.c testcase, after the patch:

        .long   0       # TYPE 2 BTF_KIND_FUNC_PROTO ''
        .long   0xd000002       # btt_info: kind=13, kflag=0, vlen=2
        .long   0x1     # btt_type: (BTF_KIND_INT 'int')
        .long   0       # farg_name
        .long   0x1     # farg_type: (BTF_KIND_INT 'int')
        .long   0       # farg_name
        .long   0x1     # farg_type: (BTF_KIND_INT 'int')
        .long   0       # TYPE 3 BTF_KIND_FUNC_PROTO ''
        .long   0xd000001       # btt_info: kind=13, kflag=0, vlen=1
        .long   0x1     # btt_type: (BTF_KIND_INT 'int')
        .long   0x68    # farg_name
        .long   0x1     # farg_type: (BTF_KIND_INT 'int')
        .long   0x5     # TYPE 4 BTF_KIND_FUNC 'extfunc'
        .long   0xc000002       # btt_info: kind=12, kflag=0, linkage=2
        .long   0x2     # btt_type: (BTF_KIND_FUNC_PROTO '')
        .long   0xd     # TYPE 5 BTF_KIND_FUNC 'foo'
        .long   0xc000001       # btt_info: kind=12, kflag=0, linkage=1
        .long   0x3     # btt_type: (BTF_KIND_FUNC_PROTO '')

gcc/ChangeLog:

	PR debug/112768
	* btfout.cc (get_btf_type_name): New definition.
	(btf_collect_datasec): Update dtd_name to the original type name
	string.
	(btf_asm_type_ref): Use the new get_btf_type_name function
	instead.
	(btf_asm_type): Likewise.
	(btf_asm_func_type): Likewise.

gcc/testsuite/ChangeLog:

	PR debug/112768
	* gcc.dg/debug/btf/btf-function-6.c: Empty string expected with
	BTF_KIND_FUNC_PROTO.

Testing notes:
  - bootstrapped and reg tested on x86_64
  - No regressions in btf.exp on BPF target

---
 gcc/btfout.cc                                 | 22 +++++++++++++++----
 .../gcc.dg/debug/btf/btf-function-6.c         |  4 ++--
 2 files changed, 20 insertions(+), 6 deletions(-)

Comments

David Faust Dec. 1, 2023, 4:31 p.m. UTC | #1
On 11/30/23 14:17, Indu Bhagat wrote:
> PR debug/112768 - btf: fix asm comment output for BTF_KIND_FUNC* kinds
> 
> The patch adds a small function to abstract out the detail and return
> the name of the type.  The patch also fixes the issue of BTF_KIND_FUNC
> appearing in the comments with a 'null' string.

OK, thanks.

> 
> For btf-function-6.c testcase, after the patch:
> 
>         .long   0       # TYPE 2 BTF_KIND_FUNC_PROTO ''
>         .long   0xd000002       # btt_info: kind=13, kflag=0, vlen=2
>         .long   0x1     # btt_type: (BTF_KIND_INT 'int')
>         .long   0       # farg_name
>         .long   0x1     # farg_type: (BTF_KIND_INT 'int')
>         .long   0       # farg_name
>         .long   0x1     # farg_type: (BTF_KIND_INT 'int')
>         .long   0       # TYPE 3 BTF_KIND_FUNC_PROTO ''
>         .long   0xd000001       # btt_info: kind=13, kflag=0, vlen=1
>         .long   0x1     # btt_type: (BTF_KIND_INT 'int')
>         .long   0x68    # farg_name
>         .long   0x1     # farg_type: (BTF_KIND_INT 'int')
>         .long   0x5     # TYPE 4 BTF_KIND_FUNC 'extfunc'
>         .long   0xc000002       # btt_info: kind=12, kflag=0, linkage=2
>         .long   0x2     # btt_type: (BTF_KIND_FUNC_PROTO '')
>         .long   0xd     # TYPE 5 BTF_KIND_FUNC 'foo'
>         .long   0xc000001       # btt_info: kind=12, kflag=0, linkage=1
>         .long   0x3     # btt_type: (BTF_KIND_FUNC_PROTO '')
> 
> gcc/ChangeLog:
> 
> 	PR debug/112768
> 	* btfout.cc (get_btf_type_name): New definition.
> 	(btf_collect_datasec): Update dtd_name to the original type name
> 	string.
> 	(btf_asm_type_ref): Use the new get_btf_type_name function
> 	instead.
> 	(btf_asm_type): Likewise.
> 	(btf_asm_func_type): Likewise.
> 
> gcc/testsuite/ChangeLog:
> 
> 	PR debug/112768
> 	* gcc.dg/debug/btf/btf-function-6.c: Empty string expected with
> 	BTF_KIND_FUNC_PROTO.
> 
> Testing notes:
>   - bootstrapped and reg tested on x86_64
>   - No regressions in btf.exp on BPF target
> 
> ---
>  gcc/btfout.cc                                 | 22 +++++++++++++++----
>  .../gcc.dg/debug/btf/btf-function-6.c         |  4 ++--
>  2 files changed, 20 insertions(+), 6 deletions(-)
> 
> diff --git a/gcc/btfout.cc b/gcc/btfout.cc
> index 5f2e99ce472..1c25404b2c0 100644
> --- a/gcc/btfout.cc
> +++ b/gcc/btfout.cc
> @@ -158,6 +158,19 @@ get_btf_kind (uint32_t ctf_kind)
>    return BTF_KIND_UNKN;
>  }
>  
> +/* Some BTF types, like BTF_KIND_FUNC_PROTO, are anonymous.  The machinery
> +   in btfout to emit BTF, may reset dtd_data->ctti_name, but does not update
> +   the name in the ctf_dtdef_ref type object (deliberate choice).  This
> +   interface helps abstract out that state of affairs, while giving access to
> +   the name of the type as intended.  */
> +
> +static const char *
> +get_btf_type_name (ctf_dtdef_ref dtd)
> +{
> +  const char *anon = "";
> +  return (dtd->dtd_data.ctti_name) ? dtd->dtd_name : anon;
> +}
> +
>  /* Helper routines to map between 'relative' and 'absolute' IDs.
>  
>     In BTF all records (including variables) are output in one long list, and all
> @@ -425,6 +438,7 @@ btf_collect_datasec (ctf_container_ref ctfc)
>        func_dtd->dtd_data = dtd->dtd_data;
>        func_dtd->dtd_data.ctti_type = dtd->dtd_type;
>        func_dtd->linkage = dtd->linkage;
> +      func_dtd->dtd_name = dtd->dtd_name;
>        func_dtd->dtd_type = num_types_added + num_types_created;
>  
>        /* Only the BTF_KIND_FUNC type actually references the name. The
> @@ -722,7 +736,7 @@ btf_asm_type_ref (const char *prefix, ctf_container_ref ctfc, ctf_id_t ref_id)
>        size_t func_id = btf_relative_func_id (ref_id);
>        ctf_dtdef_ref ref_type = (*funcs)[func_id];
>        dw2_asm_output_data (4, ref_id, "%s: (BTF_KIND_FUNC '%s')",
> -			   prefix, ref_type->dtd_name);
> +			   prefix, get_btf_type_name (ref_type));
>      }
>    else
>      {
> @@ -733,7 +747,7 @@ btf_asm_type_ref (const char *prefix, ctf_container_ref ctfc, ctf_id_t ref_id)
>  
>        dw2_asm_output_data (4, ref_id, "%s: (BTF_KIND_%s '%s')",
>  			   prefix, btf_kind_name (ref_kind),
> -			   ref_type->dtd_name);
> +			   get_btf_type_name (ref_type));
>      }
>  }
>  
> @@ -809,7 +823,7 @@ btf_asm_type (ctf_container_ref ctfc, ctf_dtdef_ref dtd)
>    dw2_asm_output_data (4, dtd->dtd_data.ctti_name,
>  		       "TYPE %" PRIu64 " BTF_KIND_%s '%s'",
>  		       get_btf_id (dtd->dtd_type), btf_kind_name (btf_kind),
> -		       dtd->dtd_name);
> +		       get_btf_type_name (dtd));
>    dw2_asm_output_data (4, BTF_TYPE_INFO (btf_kind, btf_kflag, btf_vlen),
>  		       "btt_info: kind=%u, kflag=%u, vlen=%u",
>  		       btf_kind, btf_kflag, btf_vlen);
> @@ -950,7 +964,7 @@ btf_asm_func_type (ctf_container_ref ctfc, ctf_dtdef_ref dtd, ctf_id_t id)
>    ctf_id_t ref_id = dtd->dtd_data.ctti_type;
>    dw2_asm_output_data (4, dtd->dtd_data.ctti_name,
>  		       "TYPE %" PRIu64 " BTF_KIND_FUNC '%s'",
> -		       btf_absolute_func_id (id), dtd->dtd_name);
> +		       btf_absolute_func_id (id), get_btf_type_name (dtd));
>    dw2_asm_output_data (4, BTF_TYPE_INFO (BTF_KIND_FUNC, 0, dtd->linkage),
>  		       "btt_info: kind=%u, kflag=%u, linkage=%u",
>  		       BTF_KIND_FUNC, 0, dtd->linkage);
> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-function-6.c b/gcc/testsuite/gcc.dg/debug/btf/btf-function-6.c
> index e014d9990a9..802bc6d1c74 100644
> --- a/gcc/testsuite/gcc.dg/debug/btf/btf-function-6.c
> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-function-6.c
> @@ -6,8 +6,8 @@
>  /* { dg-do compile } */
>  /* { dg-options "-O0 -gbtf -dA" } */
>  
> -/* { dg-final { scan-assembler-times " BTF_KIND_FUNC\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*linkage=2\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_FUNC_PROTO 'extfunc'" 1 } } */
> -/* { dg-final { scan-assembler-times " BTF_KIND_FUNC\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*linkage=1\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_FUNC_PROTO 'foo'" 1 } } */
> +/* { dg-final { scan-assembler-times " BTF_KIND_FUNC\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*linkage=2\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_FUNC_PROTO ''" 1 } } */
> +/* { dg-final { scan-assembler-times " BTF_KIND_FUNC\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*linkage=1\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_FUNC_PROTO ''" 1 } } */
>  
>  extern int extfunc(int a, int b);
>
diff mbox series

Patch

diff --git a/gcc/btfout.cc b/gcc/btfout.cc
index 5f2e99ce472..1c25404b2c0 100644
--- a/gcc/btfout.cc
+++ b/gcc/btfout.cc
@@ -158,6 +158,19 @@  get_btf_kind (uint32_t ctf_kind)
   return BTF_KIND_UNKN;
 }
 
+/* Some BTF types, like BTF_KIND_FUNC_PROTO, are anonymous.  The machinery
+   in btfout to emit BTF, may reset dtd_data->ctti_name, but does not update
+   the name in the ctf_dtdef_ref type object (deliberate choice).  This
+   interface helps abstract out that state of affairs, while giving access to
+   the name of the type as intended.  */
+
+static const char *
+get_btf_type_name (ctf_dtdef_ref dtd)
+{
+  const char *anon = "";
+  return (dtd->dtd_data.ctti_name) ? dtd->dtd_name : anon;
+}
+
 /* Helper routines to map between 'relative' and 'absolute' IDs.
 
    In BTF all records (including variables) are output in one long list, and all
@@ -425,6 +438,7 @@  btf_collect_datasec (ctf_container_ref ctfc)
       func_dtd->dtd_data = dtd->dtd_data;
       func_dtd->dtd_data.ctti_type = dtd->dtd_type;
       func_dtd->linkage = dtd->linkage;
+      func_dtd->dtd_name = dtd->dtd_name;
       func_dtd->dtd_type = num_types_added + num_types_created;
 
       /* Only the BTF_KIND_FUNC type actually references the name. The
@@ -722,7 +736,7 @@  btf_asm_type_ref (const char *prefix, ctf_container_ref ctfc, ctf_id_t ref_id)
       size_t func_id = btf_relative_func_id (ref_id);
       ctf_dtdef_ref ref_type = (*funcs)[func_id];
       dw2_asm_output_data (4, ref_id, "%s: (BTF_KIND_FUNC '%s')",
-			   prefix, ref_type->dtd_name);
+			   prefix, get_btf_type_name (ref_type));
     }
   else
     {
@@ -733,7 +747,7 @@  btf_asm_type_ref (const char *prefix, ctf_container_ref ctfc, ctf_id_t ref_id)
 
       dw2_asm_output_data (4, ref_id, "%s: (BTF_KIND_%s '%s')",
 			   prefix, btf_kind_name (ref_kind),
-			   ref_type->dtd_name);
+			   get_btf_type_name (ref_type));
     }
 }
 
@@ -809,7 +823,7 @@  btf_asm_type (ctf_container_ref ctfc, ctf_dtdef_ref dtd)
   dw2_asm_output_data (4, dtd->dtd_data.ctti_name,
 		       "TYPE %" PRIu64 " BTF_KIND_%s '%s'",
 		       get_btf_id (dtd->dtd_type), btf_kind_name (btf_kind),
-		       dtd->dtd_name);
+		       get_btf_type_name (dtd));
   dw2_asm_output_data (4, BTF_TYPE_INFO (btf_kind, btf_kflag, btf_vlen),
 		       "btt_info: kind=%u, kflag=%u, vlen=%u",
 		       btf_kind, btf_kflag, btf_vlen);
@@ -950,7 +964,7 @@  btf_asm_func_type (ctf_container_ref ctfc, ctf_dtdef_ref dtd, ctf_id_t id)
   ctf_id_t ref_id = dtd->dtd_data.ctti_type;
   dw2_asm_output_data (4, dtd->dtd_data.ctti_name,
 		       "TYPE %" PRIu64 " BTF_KIND_FUNC '%s'",
-		       btf_absolute_func_id (id), dtd->dtd_name);
+		       btf_absolute_func_id (id), get_btf_type_name (dtd));
   dw2_asm_output_data (4, BTF_TYPE_INFO (BTF_KIND_FUNC, 0, dtd->linkage),
 		       "btt_info: kind=%u, kflag=%u, linkage=%u",
 		       BTF_KIND_FUNC, 0, dtd->linkage);
diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-function-6.c b/gcc/testsuite/gcc.dg/debug/btf/btf-function-6.c
index e014d9990a9..802bc6d1c74 100644
--- a/gcc/testsuite/gcc.dg/debug/btf/btf-function-6.c
+++ b/gcc/testsuite/gcc.dg/debug/btf/btf-function-6.c
@@ -6,8 +6,8 @@ 
 /* { dg-do compile } */
 /* { dg-options "-O0 -gbtf -dA" } */
 
-/* { dg-final { scan-assembler-times " BTF_KIND_FUNC\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*linkage=2\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_FUNC_PROTO 'extfunc'" 1 } } */
-/* { dg-final { scan-assembler-times " BTF_KIND_FUNC\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*linkage=1\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_FUNC_PROTO 'foo'" 1 } } */
+/* { dg-final { scan-assembler-times " BTF_KIND_FUNC\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*linkage=2\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_FUNC_PROTO ''" 1 } } */
+/* { dg-final { scan-assembler-times " BTF_KIND_FUNC\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*linkage=1\[\\r\\n\]+\[^\\r\\n\]*\\(BTF_KIND_FUNC_PROTO ''" 1 } } */
 
 extern int extfunc(int a, int b);