* [PATCH V2] btf: emit linkage information in BTF_KIND_FUNC entries
@ 2022-07-12 15:13 Jose E. Marchesi
2022-07-12 23:11 ` Indu Bhagat
2022-07-27 18:33 ` David Faust
0 siblings, 2 replies; 4+ messages in thread
From: Jose E. Marchesi @ 2022-07-12 15:13 UTC (permalink / raw)
To: gcc-patches
The kernel bpftool expects BTF_KIND_FUNC entries in BTF to include an
annotation reflecting the linkage of functions (static, global). For
whatever reason they abuse the `vlen' field of the BTF_KIND_FUNC entry
instead of adding a variable-part to the record like it is done with
other entry kinds.
This patch makes GCC to include this linkage info in BTF_KIND_FUNC
entries.
Tested in bpf-unknown-none target.
gcc/ChangeLog:
PR debug/106263
* ctfc.h (struct ctf_dtdef): Add field linkage.
* ctfc.cc (ctf_add_function): Set ctti_linkage.
* dwarf2ctf.cc (gen_ctf_function_type): Pass a linkage for
function types and subprograms.
* btfout.cc (btf_asm_func_type): Emit linkage information for the
function.
(btf_dtd_emit_preprocess_cb): Propagate the linkage information
for functions.
gcc/testsuite/ChangeLog:
PR debug/106263
* gcc.dg/debug/btf/btf-function-4.c: New test.
* gcc.dg/debug/btf/btf-function-5.c: Likewise.
---
gcc/btfout.cc | 6 +++++-
gcc/ctfc.cc | 3 ++-
gcc/ctfc.h | 3 ++-
gcc/dwarf2ctf.cc | 4 +++-
gcc/testsuite/gcc.dg/debug/btf/btf-function-4.c | 14 ++++++++++++++
gcc/testsuite/gcc.dg/debug/btf/btf-function-5.c | 14 ++++++++++++++
6 files changed, 40 insertions(+), 4 deletions(-)
create mode 100644 gcc/testsuite/gcc.dg/debug/btf/btf-function-4.c
create mode 100644 gcc/testsuite/gcc.dg/debug/btf/btf-function-5.c
diff --git a/gcc/btfout.cc b/gcc/btfout.cc
index 31af50521da..594cba84910 100644
--- a/gcc/btfout.cc
+++ b/gcc/btfout.cc
@@ -463,6 +463,7 @@ btf_dtd_emit_preprocess_cb (ctf_container_ref ctfc, ctf_dtdef_ref dtd)
ctf_dtdef_ref func_dtd = ggc_cleared_alloc<ctf_dtdef_t> ();
func_dtd->dtd_data = dtd->dtd_data;
func_dtd->dtd_data.ctti_type = dtd->dtd_type;
+ func_dtd->linkage = dtd->linkage;
vec_safe_push (funcs, func_dtd);
num_types_created++;
@@ -740,7 +741,10 @@ static void
btf_asm_func_type (ctf_dtdef_ref dtd)
{
dw2_asm_output_data (4, dtd->dtd_data.ctti_name, "btt_name");
- dw2_asm_output_data (4, BTF_TYPE_INFO (BTF_KIND_FUNC, 0, 0), "btt_info");
+ 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);
dw2_asm_output_data (4, get_btf_id (dtd->dtd_data.ctti_type), "btt_type");
}
diff --git a/gcc/ctfc.cc b/gcc/ctfc.cc
index f24e7bff948..9773358a475 100644
--- a/gcc/ctfc.cc
+++ b/gcc/ctfc.cc
@@ -777,7 +777,7 @@ ctf_add_function_arg (ctf_container_ref ctfc, dw_die_ref func,
ctf_id_t
ctf_add_function (ctf_container_ref ctfc, uint32_t flag, const char * name,
const ctf_funcinfo_t * ctc, dw_die_ref die,
- bool from_global_func)
+ bool from_global_func, int linkage)
{
ctf_dtdef_ref dtd;
ctf_id_t type;
@@ -791,6 +791,7 @@ ctf_add_function (ctf_container_ref ctfc, uint32_t flag, const char * name,
type = ctf_add_generic (ctfc, flag, name, &dtd, die);
dtd->from_global_func = from_global_func;
+ dtd->linkage = linkage;
dtd->dtd_data.ctti_info = CTF_TYPE_INFO (CTF_K_FUNCTION, flag, vlen);
/* Caller must make sure CTF types for ctc->ctc_return are already added. */
dtd->dtd_data.ctti_type = (uint32_t) ctc->ctc_return;
diff --git a/gcc/ctfc.h b/gcc/ctfc.h
index 001e544ef08..bcf3a43ae1b 100644
--- a/gcc/ctfc.h
+++ b/gcc/ctfc.h
@@ -161,6 +161,7 @@ struct GTY ((for_user)) ctf_dtdef
ctf_itype_t dtd_data; /* Type node. */
bool from_global_func; /* Whether this type was added from a global
function. */
+ uint32_t linkage; /* Used in function types. 0=local, 1=global. */
union GTY ((desc ("ctf_dtu_d_union_selector (&%1)")))
{
/* struct, union, or enum. */
@@ -423,7 +424,7 @@ extern ctf_id_t ctf_add_forward (ctf_container_ref, uint32_t, const char *,
extern ctf_id_t ctf_add_typedef (ctf_container_ref, uint32_t, const char *,
ctf_id_t, dw_die_ref);
extern ctf_id_t ctf_add_function (ctf_container_ref, uint32_t, const char *,
- const ctf_funcinfo_t *, dw_die_ref, bool);
+ const ctf_funcinfo_t *, dw_die_ref, bool, int);
extern ctf_id_t ctf_add_sou (ctf_container_ref, uint32_t, const char *,
uint32_t, size_t, dw_die_ref);
diff --git a/gcc/dwarf2ctf.cc b/gcc/dwarf2ctf.cc
index a6329ab6ee4..397100004c2 100644
--- a/gcc/dwarf2ctf.cc
+++ b/gcc/dwarf2ctf.cc
@@ -644,6 +644,7 @@ gen_ctf_function_type (ctf_container_ref ctfc, dw_die_ref function,
ctf_funcinfo_t func_info;
uint32_t num_args = 0;
+ int linkage = get_AT_flag (function, DW_AT_external);
ctf_id_t return_type_id;
ctf_id_t function_type_id;
@@ -687,7 +688,8 @@ gen_ctf_function_type (ctf_container_ref ctfc, dw_die_ref function,
function_name,
(const ctf_funcinfo_t *)&func_info,
function,
- from_global_func);
+ from_global_func,
+ linkage);
/* Second pass on formals: generate the CTF types corresponding to
them and add them as CTF function args. */
diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-function-4.c b/gcc/testsuite/gcc.dg/debug/btf/btf-function-4.c
new file mode 100644
index 00000000000..fd3124488f5
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/debug/btf/btf-function-4.c
@@ -0,0 +1,14 @@
+/* Test BTF linkage for functions.
+
+ We expect to see one BTF_KIND_FUNC type with static linkage encoded in the
+ BTF type's vlen field. */
+
+/* { dg-do compile } */
+/* { dg-options "-O0 -gbtf -dA" } */
+
+/* { dg-final { scan-assembler-times "btt_info: kind=12, kflag=0, linkage=0" 1 } } */
+
+static int funfoo (void)
+{
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-function-5.c b/gcc/testsuite/gcc.dg/debug/btf/btf-function-5.c
new file mode 100644
index 00000000000..12ee97fb5e3
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/debug/btf/btf-function-5.c
@@ -0,0 +1,14 @@
+/* Test BTF linkage for functions.
+
+ We expect to see one BTF_KIND_FUNC type with global linkage encoded in the
+ BTF type's vlen field. */
+
+/* { dg-do compile } */
+/* { dg-options "-O0 -gbtf -dA" } */
+
+/* { dg-final { scan-assembler-times "btt_info: kind=12, kflag=0, linkage=1" 1 } } */
+
+int funfoo (void)
+{
+ return 0;
+}
--
2.11.0
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH V2] btf: emit linkage information in BTF_KIND_FUNC entries
2022-07-12 15:13 [PATCH V2] btf: emit linkage information in BTF_KIND_FUNC entries Jose E. Marchesi
@ 2022-07-12 23:11 ` Indu Bhagat
2022-07-27 18:33 ` David Faust
1 sibling, 0 replies; 4+ messages in thread
From: Indu Bhagat @ 2022-07-12 23:11 UTC (permalink / raw)
To: Jose E. Marchesi, gcc-patches
On 7/12/22 8:13 AM, Jose E. Marchesi via Gcc-patches wrote:
>
> The kernel bpftool expects BTF_KIND_FUNC entries in BTF to include an
> annotation reflecting the linkage of functions (static, global). For
> whatever reason they abuse the `vlen' field of the BTF_KIND_FUNC entry
> instead of adding a variable-part to the record like it is done with
> other entry kinds.
>
> This patch makes GCC to include this linkage info in BTF_KIND_FUNC
> entries.
>
> Tested in bpf-unknown-none target.
>
I am not the maintainer of this functionality, but this version looks OK
to me.
Thanks
> gcc/ChangeLog:
>
> PR debug/106263
> * ctfc.h (struct ctf_dtdef): Add field linkage.
> * ctfc.cc (ctf_add_function): Set ctti_linkage.
> * dwarf2ctf.cc (gen_ctf_function_type): Pass a linkage for
> function types and subprograms.
> * btfout.cc (btf_asm_func_type): Emit linkage information for the
> function.
> (btf_dtd_emit_preprocess_cb): Propagate the linkage information
> for functions.
>
> gcc/testsuite/ChangeLog:
>
> PR debug/106263
> * gcc.dg/debug/btf/btf-function-4.c: New test.
> * gcc.dg/debug/btf/btf-function-5.c: Likewise.
> ---
> gcc/btfout.cc | 6 +++++-
> gcc/ctfc.cc | 3 ++-
> gcc/ctfc.h | 3 ++-
> gcc/dwarf2ctf.cc | 4 +++-
> gcc/testsuite/gcc.dg/debug/btf/btf-function-4.c | 14 ++++++++++++++
> gcc/testsuite/gcc.dg/debug/btf/btf-function-5.c | 14 ++++++++++++++
> 6 files changed, 40 insertions(+), 4 deletions(-)
> create mode 100644 gcc/testsuite/gcc.dg/debug/btf/btf-function-4.c
> create mode 100644 gcc/testsuite/gcc.dg/debug/btf/btf-function-5.c
>
> diff --git a/gcc/btfout.cc b/gcc/btfout.cc
> index 31af50521da..594cba84910 100644
> --- a/gcc/btfout.cc
> +++ b/gcc/btfout.cc
> @@ -463,6 +463,7 @@ btf_dtd_emit_preprocess_cb (ctf_container_ref ctfc, ctf_dtdef_ref dtd)
> ctf_dtdef_ref func_dtd = ggc_cleared_alloc<ctf_dtdef_t> ();
> func_dtd->dtd_data = dtd->dtd_data;
> func_dtd->dtd_data.ctti_type = dtd->dtd_type;
> + func_dtd->linkage = dtd->linkage;
>
> vec_safe_push (funcs, func_dtd);
> num_types_created++;
> @@ -740,7 +741,10 @@ static void
> btf_asm_func_type (ctf_dtdef_ref dtd)
> {
> dw2_asm_output_data (4, dtd->dtd_data.ctti_name, "btt_name");
> - dw2_asm_output_data (4, BTF_TYPE_INFO (BTF_KIND_FUNC, 0, 0), "btt_info");
> + 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);
> dw2_asm_output_data (4, get_btf_id (dtd->dtd_data.ctti_type), "btt_type");
> }
>
> diff --git a/gcc/ctfc.cc b/gcc/ctfc.cc
> index f24e7bff948..9773358a475 100644
> --- a/gcc/ctfc.cc
> +++ b/gcc/ctfc.cc
> @@ -777,7 +777,7 @@ ctf_add_function_arg (ctf_container_ref ctfc, dw_die_ref func,
> ctf_id_t
> ctf_add_function (ctf_container_ref ctfc, uint32_t flag, const char * name,
> const ctf_funcinfo_t * ctc, dw_die_ref die,
> - bool from_global_func)
> + bool from_global_func, int linkage)
> {
> ctf_dtdef_ref dtd;
> ctf_id_t type;
> @@ -791,6 +791,7 @@ ctf_add_function (ctf_container_ref ctfc, uint32_t flag, const char * name,
> type = ctf_add_generic (ctfc, flag, name, &dtd, die);
>
> dtd->from_global_func = from_global_func;
> + dtd->linkage = linkage;
> dtd->dtd_data.ctti_info = CTF_TYPE_INFO (CTF_K_FUNCTION, flag, vlen);
> /* Caller must make sure CTF types for ctc->ctc_return are already added. */
> dtd->dtd_data.ctti_type = (uint32_t) ctc->ctc_return;
> diff --git a/gcc/ctfc.h b/gcc/ctfc.h
> index 001e544ef08..bcf3a43ae1b 100644
> --- a/gcc/ctfc.h
> +++ b/gcc/ctfc.h
> @@ -161,6 +161,7 @@ struct GTY ((for_user)) ctf_dtdef
> ctf_itype_t dtd_data; /* Type node. */
> bool from_global_func; /* Whether this type was added from a global
> function. */
> + uint32_t linkage; /* Used in function types. 0=local, 1=global. */
> union GTY ((desc ("ctf_dtu_d_union_selector (&%1)")))
> {
> /* struct, union, or enum. */
> @@ -423,7 +424,7 @@ extern ctf_id_t ctf_add_forward (ctf_container_ref, uint32_t, const char *,
> extern ctf_id_t ctf_add_typedef (ctf_container_ref, uint32_t, const char *,
> ctf_id_t, dw_die_ref);
> extern ctf_id_t ctf_add_function (ctf_container_ref, uint32_t, const char *,
> - const ctf_funcinfo_t *, dw_die_ref, bool);
> + const ctf_funcinfo_t *, dw_die_ref, bool, int);
> extern ctf_id_t ctf_add_sou (ctf_container_ref, uint32_t, const char *,
> uint32_t, size_t, dw_die_ref);
>
> diff --git a/gcc/dwarf2ctf.cc b/gcc/dwarf2ctf.cc
> index a6329ab6ee4..397100004c2 100644
> --- a/gcc/dwarf2ctf.cc
> +++ b/gcc/dwarf2ctf.cc
> @@ -644,6 +644,7 @@ gen_ctf_function_type (ctf_container_ref ctfc, dw_die_ref function,
>
> ctf_funcinfo_t func_info;
> uint32_t num_args = 0;
> + int linkage = get_AT_flag (function, DW_AT_external);
>
> ctf_id_t return_type_id;
> ctf_id_t function_type_id;
> @@ -687,7 +688,8 @@ gen_ctf_function_type (ctf_container_ref ctfc, dw_die_ref function,
> function_name,
> (const ctf_funcinfo_t *)&func_info,
> function,
> - from_global_func);
> + from_global_func,
> + linkage);
>
> /* Second pass on formals: generate the CTF types corresponding to
> them and add them as CTF function args. */
> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-function-4.c b/gcc/testsuite/gcc.dg/debug/btf/btf-function-4.c
> new file mode 100644
> index 00000000000..fd3124488f5
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-function-4.c
> @@ -0,0 +1,14 @@
> +/* Test BTF linkage for functions.
> +
> + We expect to see one BTF_KIND_FUNC type with static linkage encoded in the
> + BTF type's vlen field. */
> +
> +/* { dg-do compile } */
> +/* { dg-options "-O0 -gbtf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "btt_info: kind=12, kflag=0, linkage=0" 1 } } */
> +
> +static int funfoo (void)
> +{
> + return 0;
> +}
> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-function-5.c b/gcc/testsuite/gcc.dg/debug/btf/btf-function-5.c
> new file mode 100644
> index 00000000000..12ee97fb5e3
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-function-5.c
> @@ -0,0 +1,14 @@
> +/* Test BTF linkage for functions.
> +
> + We expect to see one BTF_KIND_FUNC type with global linkage encoded in the
> + BTF type's vlen field. */
> +
> +/* { dg-do compile } */
> +/* { dg-options "-O0 -gbtf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "btt_info: kind=12, kflag=0, linkage=1" 1 } } */
> +
> +int funfoo (void)
> +{
> + return 0;
> +}
>
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH V2] btf: emit linkage information in BTF_KIND_FUNC entries
2022-07-12 15:13 [PATCH V2] btf: emit linkage information in BTF_KIND_FUNC entries Jose E. Marchesi
2022-07-12 23:11 ` Indu Bhagat
@ 2022-07-27 18:33 ` David Faust
2022-08-01 17:47 ` Jose E. Marchesi
1 sibling, 1 reply; 4+ messages in thread
From: David Faust @ 2022-07-27 18:33 UTC (permalink / raw)
To: Jose E. Marchesi; +Cc: gcc-patches
On 7/12/22 08:13, Jose E. Marchesi via Gcc-patches wrote:
>
> The kernel bpftool expects BTF_KIND_FUNC entries in BTF to include an
> annotation reflecting the linkage of functions (static, global). For
> whatever reason they abuse the `vlen' field of the BTF_KIND_FUNC entry
> instead of adding a variable-part to the record like it is done with
> other entry kinds.
>
> This patch makes GCC to include this linkage info in BTF_KIND_FUNC
> entries.
>
> Tested in bpf-unknown-none target.
LGTM
Thanks.
>
> gcc/ChangeLog:
>
> PR debug/106263
> * ctfc.h (struct ctf_dtdef): Add field linkage.
> * ctfc.cc (ctf_add_function): Set ctti_linkage.
> * dwarf2ctf.cc (gen_ctf_function_type): Pass a linkage for
> function types and subprograms.
> * btfout.cc (btf_asm_func_type): Emit linkage information for the
> function.
> (btf_dtd_emit_preprocess_cb): Propagate the linkage information
> for functions.
>
> gcc/testsuite/ChangeLog:
>
> PR debug/106263
> * gcc.dg/debug/btf/btf-function-4.c: New test.
> * gcc.dg/debug/btf/btf-function-5.c: Likewise.
> ---
> gcc/btfout.cc | 6 +++++-
> gcc/ctfc.cc | 3 ++-
> gcc/ctfc.h | 3 ++-
> gcc/dwarf2ctf.cc | 4 +++-
> gcc/testsuite/gcc.dg/debug/btf/btf-function-4.c | 14 ++++++++++++++
> gcc/testsuite/gcc.dg/debug/btf/btf-function-5.c | 14 ++++++++++++++
> 6 files changed, 40 insertions(+), 4 deletions(-)
> create mode 100644 gcc/testsuite/gcc.dg/debug/btf/btf-function-4.c
> create mode 100644 gcc/testsuite/gcc.dg/debug/btf/btf-function-5.c
>
> diff --git a/gcc/btfout.cc b/gcc/btfout.cc
> index 31af50521da..594cba84910 100644
> --- a/gcc/btfout.cc
> +++ b/gcc/btfout.cc
> @@ -463,6 +463,7 @@ btf_dtd_emit_preprocess_cb (ctf_container_ref ctfc, ctf_dtdef_ref dtd)
> ctf_dtdef_ref func_dtd = ggc_cleared_alloc<ctf_dtdef_t> ();
> func_dtd->dtd_data = dtd->dtd_data;
> func_dtd->dtd_data.ctti_type = dtd->dtd_type;
> + func_dtd->linkage = dtd->linkage;
>
> vec_safe_push (funcs, func_dtd);
> num_types_created++;
> @@ -740,7 +741,10 @@ static void
> btf_asm_func_type (ctf_dtdef_ref dtd)
> {
> dw2_asm_output_data (4, dtd->dtd_data.ctti_name, "btt_name");
> - dw2_asm_output_data (4, BTF_TYPE_INFO (BTF_KIND_FUNC, 0, 0), "btt_info");
> + 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);
> dw2_asm_output_data (4, get_btf_id (dtd->dtd_data.ctti_type), "btt_type");
> }
>
> diff --git a/gcc/ctfc.cc b/gcc/ctfc.cc
> index f24e7bff948..9773358a475 100644
> --- a/gcc/ctfc.cc
> +++ b/gcc/ctfc.cc
> @@ -777,7 +777,7 @@ ctf_add_function_arg (ctf_container_ref ctfc, dw_die_ref func,
> ctf_id_t
> ctf_add_function (ctf_container_ref ctfc, uint32_t flag, const char * name,
> const ctf_funcinfo_t * ctc, dw_die_ref die,
> - bool from_global_func)
> + bool from_global_func, int linkage)
> {
> ctf_dtdef_ref dtd;
> ctf_id_t type;
> @@ -791,6 +791,7 @@ ctf_add_function (ctf_container_ref ctfc, uint32_t flag, const char * name,
> type = ctf_add_generic (ctfc, flag, name, &dtd, die);
>
> dtd->from_global_func = from_global_func;
> + dtd->linkage = linkage;
> dtd->dtd_data.ctti_info = CTF_TYPE_INFO (CTF_K_FUNCTION, flag, vlen);
> /* Caller must make sure CTF types for ctc->ctc_return are already added. */
> dtd->dtd_data.ctti_type = (uint32_t) ctc->ctc_return;
> diff --git a/gcc/ctfc.h b/gcc/ctfc.h
> index 001e544ef08..bcf3a43ae1b 100644
> --- a/gcc/ctfc.h
> +++ b/gcc/ctfc.h
> @@ -161,6 +161,7 @@ struct GTY ((for_user)) ctf_dtdef
> ctf_itype_t dtd_data; /* Type node. */
> bool from_global_func; /* Whether this type was added from a global
> function. */
> + uint32_t linkage; /* Used in function types. 0=local, 1=global. */
> union GTY ((desc ("ctf_dtu_d_union_selector (&%1)")))
> {
> /* struct, union, or enum. */
> @@ -423,7 +424,7 @@ extern ctf_id_t ctf_add_forward (ctf_container_ref, uint32_t, const char *,
> extern ctf_id_t ctf_add_typedef (ctf_container_ref, uint32_t, const char *,
> ctf_id_t, dw_die_ref);
> extern ctf_id_t ctf_add_function (ctf_container_ref, uint32_t, const char *,
> - const ctf_funcinfo_t *, dw_die_ref, bool);
> + const ctf_funcinfo_t *, dw_die_ref, bool, int);
> extern ctf_id_t ctf_add_sou (ctf_container_ref, uint32_t, const char *,
> uint32_t, size_t, dw_die_ref);
>
> diff --git a/gcc/dwarf2ctf.cc b/gcc/dwarf2ctf.cc
> index a6329ab6ee4..397100004c2 100644
> --- a/gcc/dwarf2ctf.cc
> +++ b/gcc/dwarf2ctf.cc
> @@ -644,6 +644,7 @@ gen_ctf_function_type (ctf_container_ref ctfc, dw_die_ref function,
>
> ctf_funcinfo_t func_info;
> uint32_t num_args = 0;
> + int linkage = get_AT_flag (function, DW_AT_external);
>
> ctf_id_t return_type_id;
> ctf_id_t function_type_id;
> @@ -687,7 +688,8 @@ gen_ctf_function_type (ctf_container_ref ctfc, dw_die_ref function,
> function_name,
> (const ctf_funcinfo_t *)&func_info,
> function,
> - from_global_func);
> + from_global_func,
> + linkage);
>
> /* Second pass on formals: generate the CTF types corresponding to
> them and add them as CTF function args. */
> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-function-4.c b/gcc/testsuite/gcc.dg/debug/btf/btf-function-4.c
> new file mode 100644
> index 00000000000..fd3124488f5
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-function-4.c
> @@ -0,0 +1,14 @@
> +/* Test BTF linkage for functions.
> +
> + We expect to see one BTF_KIND_FUNC type with static linkage encoded in the
> + BTF type's vlen field. */
> +
> +/* { dg-do compile } */
> +/* { dg-options "-O0 -gbtf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "btt_info: kind=12, kflag=0, linkage=0" 1 } } */
> +
> +static int funfoo (void)
> +{
> + return 0;
> +}
> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-function-5.c b/gcc/testsuite/gcc.dg/debug/btf/btf-function-5.c
> new file mode 100644
> index 00000000000..12ee97fb5e3
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-function-5.c
> @@ -0,0 +1,14 @@
> +/* Test BTF linkage for functions.
> +
> + We expect to see one BTF_KIND_FUNC type with global linkage encoded in the
> + BTF type's vlen field. */
> +
> +/* { dg-do compile } */
> +/* { dg-options "-O0 -gbtf -dA" } */
> +
> +/* { dg-final { scan-assembler-times "btt_info: kind=12, kflag=0, linkage=1" 1 } } */
> +
> +int funfoo (void)
> +{
> + return 0;
> +}
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH V2] btf: emit linkage information in BTF_KIND_FUNC entries
2022-07-27 18:33 ` David Faust
@ 2022-08-01 17:47 ` Jose E. Marchesi
0 siblings, 0 replies; 4+ messages in thread
From: Jose E. Marchesi @ 2022-08-01 17:47 UTC (permalink / raw)
To: David Faust; +Cc: gcc-patches
> On 7/12/22 08:13, Jose E. Marchesi via Gcc-patches wrote:
>>
>> The kernel bpftool expects BTF_KIND_FUNC entries in BTF to include an
>> annotation reflecting the linkage of functions (static, global). For
>> whatever reason they abuse the `vlen' field of the BTF_KIND_FUNC entry
>> instead of adding a variable-part to the record like it is done with
>> other entry kinds.
>>
>> This patch makes GCC to include this linkage info in BTF_KIND_FUNC
>> entries.
>>
>> Tested in bpf-unknown-none target.
>
> LGTM
> Thanks.
Pushed to master.
Thanks.
>>
>> gcc/ChangeLog:
>>
>> PR debug/106263
>> * ctfc.h (struct ctf_dtdef): Add field linkage.
>> * ctfc.cc (ctf_add_function): Set ctti_linkage.
>> * dwarf2ctf.cc (gen_ctf_function_type): Pass a linkage for
>> function types and subprograms.
>> * btfout.cc (btf_asm_func_type): Emit linkage information for the
>> function.
>> (btf_dtd_emit_preprocess_cb): Propagate the linkage information
>> for functions.
>>
>> gcc/testsuite/ChangeLog:
>>
>> PR debug/106263
>> * gcc.dg/debug/btf/btf-function-4.c: New test.
>> * gcc.dg/debug/btf/btf-function-5.c: Likewise.
>> ---
>> gcc/btfout.cc | 6 +++++-
>> gcc/ctfc.cc | 3 ++-
>> gcc/ctfc.h | 3 ++-
>> gcc/dwarf2ctf.cc | 4 +++-
>> gcc/testsuite/gcc.dg/debug/btf/btf-function-4.c | 14 ++++++++++++++
>> gcc/testsuite/gcc.dg/debug/btf/btf-function-5.c | 14 ++++++++++++++
>> 6 files changed, 40 insertions(+), 4 deletions(-)
>> create mode 100644 gcc/testsuite/gcc.dg/debug/btf/btf-function-4.c
>> create mode 100644 gcc/testsuite/gcc.dg/debug/btf/btf-function-5.c
>>
>> diff --git a/gcc/btfout.cc b/gcc/btfout.cc
>> index 31af50521da..594cba84910 100644
>> --- a/gcc/btfout.cc
>> +++ b/gcc/btfout.cc
>> @@ -463,6 +463,7 @@ btf_dtd_emit_preprocess_cb (ctf_container_ref ctfc, ctf_dtdef_ref dtd)
>> ctf_dtdef_ref func_dtd = ggc_cleared_alloc<ctf_dtdef_t> ();
>> func_dtd->dtd_data = dtd->dtd_data;
>> func_dtd->dtd_data.ctti_type = dtd->dtd_type;
>> + func_dtd->linkage = dtd->linkage;
>>
>> vec_safe_push (funcs, func_dtd);
>> num_types_created++;
>> @@ -740,7 +741,10 @@ static void
>> btf_asm_func_type (ctf_dtdef_ref dtd)
>> {
>> dw2_asm_output_data (4, dtd->dtd_data.ctti_name, "btt_name");
>> - dw2_asm_output_data (4, BTF_TYPE_INFO (BTF_KIND_FUNC, 0, 0), "btt_info");
>> + 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);
>> dw2_asm_output_data (4, get_btf_id (dtd->dtd_data.ctti_type), "btt_type");
>> }
>>
>> diff --git a/gcc/ctfc.cc b/gcc/ctfc.cc
>> index f24e7bff948..9773358a475 100644
>> --- a/gcc/ctfc.cc
>> +++ b/gcc/ctfc.cc
>> @@ -777,7 +777,7 @@ ctf_add_function_arg (ctf_container_ref ctfc, dw_die_ref func,
>> ctf_id_t
>> ctf_add_function (ctf_container_ref ctfc, uint32_t flag, const char * name,
>> const ctf_funcinfo_t * ctc, dw_die_ref die,
>> - bool from_global_func)
>> + bool from_global_func, int linkage)
>> {
>> ctf_dtdef_ref dtd;
>> ctf_id_t type;
>> @@ -791,6 +791,7 @@ ctf_add_function (ctf_container_ref ctfc, uint32_t flag, const char * name,
>> type = ctf_add_generic (ctfc, flag, name, &dtd, die);
>>
>> dtd->from_global_func = from_global_func;
>> + dtd->linkage = linkage;
>> dtd->dtd_data.ctti_info = CTF_TYPE_INFO (CTF_K_FUNCTION, flag, vlen);
>> /* Caller must make sure CTF types for ctc->ctc_return are already added. */
>> dtd->dtd_data.ctti_type = (uint32_t) ctc->ctc_return;
>> diff --git a/gcc/ctfc.h b/gcc/ctfc.h
>> index 001e544ef08..bcf3a43ae1b 100644
>> --- a/gcc/ctfc.h
>> +++ b/gcc/ctfc.h
>> @@ -161,6 +161,7 @@ struct GTY ((for_user)) ctf_dtdef
>> ctf_itype_t dtd_data; /* Type node. */
>> bool from_global_func; /* Whether this type was added from a global
>> function. */
>> + uint32_t linkage; /* Used in function types. 0=local, 1=global. */
>> union GTY ((desc ("ctf_dtu_d_union_selector (&%1)")))
>> {
>> /* struct, union, or enum. */
>> @@ -423,7 +424,7 @@ extern ctf_id_t ctf_add_forward (ctf_container_ref, uint32_t, const char *,
>> extern ctf_id_t ctf_add_typedef (ctf_container_ref, uint32_t, const char *,
>> ctf_id_t, dw_die_ref);
>> extern ctf_id_t ctf_add_function (ctf_container_ref, uint32_t, const char *,
>> - const ctf_funcinfo_t *, dw_die_ref, bool);
>> + const ctf_funcinfo_t *, dw_die_ref, bool, int);
>> extern ctf_id_t ctf_add_sou (ctf_container_ref, uint32_t, const char *,
>> uint32_t, size_t, dw_die_ref);
>>
>> diff --git a/gcc/dwarf2ctf.cc b/gcc/dwarf2ctf.cc
>> index a6329ab6ee4..397100004c2 100644
>> --- a/gcc/dwarf2ctf.cc
>> +++ b/gcc/dwarf2ctf.cc
>> @@ -644,6 +644,7 @@ gen_ctf_function_type (ctf_container_ref ctfc, dw_die_ref function,
>>
>> ctf_funcinfo_t func_info;
>> uint32_t num_args = 0;
>> + int linkage = get_AT_flag (function, DW_AT_external);
>>
>> ctf_id_t return_type_id;
>> ctf_id_t function_type_id;
>> @@ -687,7 +688,8 @@ gen_ctf_function_type (ctf_container_ref ctfc, dw_die_ref function,
>> function_name,
>> (const ctf_funcinfo_t *)&func_info,
>> function,
>> - from_global_func);
>> + from_global_func,
>> + linkage);
>>
>> /* Second pass on formals: generate the CTF types corresponding to
>> them and add them as CTF function args. */
>> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-function-4.c b/gcc/testsuite/gcc.dg/debug/btf/btf-function-4.c
>> new file mode 100644
>> index 00000000000..fd3124488f5
>> --- /dev/null
>> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-function-4.c
>> @@ -0,0 +1,14 @@
>> +/* Test BTF linkage for functions.
>> +
>> + We expect to see one BTF_KIND_FUNC type with static linkage encoded in the
>> + BTF type's vlen field. */
>> +
>> +/* { dg-do compile } */
>> +/* { dg-options "-O0 -gbtf -dA" } */
>> +
>> +/* { dg-final { scan-assembler-times "btt_info: kind=12, kflag=0, linkage=0" 1 } } */
>> +
>> +static int funfoo (void)
>> +{
>> + return 0;
>> +}
>> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-function-5.c b/gcc/testsuite/gcc.dg/debug/btf/btf-function-5.c
>> new file mode 100644
>> index 00000000000..12ee97fb5e3
>> --- /dev/null
>> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-function-5.c
>> @@ -0,0 +1,14 @@
>> +/* Test BTF linkage for functions.
>> +
>> + We expect to see one BTF_KIND_FUNC type with global linkage encoded in the
>> + BTF type's vlen field. */
>> +
>> +/* { dg-do compile } */
>> +/* { dg-options "-O0 -gbtf -dA" } */
>> +
>> +/* { dg-final { scan-assembler-times "btt_info: kind=12, kflag=0, linkage=1" 1 } } */
>> +
>> +int funfoo (void)
>> +{
>> + return 0;
>> +}
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2022-08-01 17:48 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-07-12 15:13 [PATCH V2] btf: emit linkage information in BTF_KIND_FUNC entries Jose E. Marchesi
2022-07-12 23:11 ` Indu Bhagat
2022-07-27 18:33 ` David Faust
2022-08-01 17:47 ` Jose E. Marchesi
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).