diff options
author | Cupertino Miranda <cupertino.miranda@oracle.com> | 2024-03-26 11:59:47 +0000 |
---|---|---|
committer | Cupertino Miranda <cupertino.miranda@oracle.com> | 2024-03-26 16:18:00 +0000 |
commit | fa60ac549649655a3f55e69f83d2e97423d3eb5c (patch) | |
tree | 6865bd0f3e6ec4d77217186c1f23550a338591b0 /gcc/btfout.cc | |
parent | f536ea9cc3226793dc156952340f21e55b60c04e (diff) | |
download | gcc-fa60ac549649655a3f55e69f83d2e97423d3eb5c.zip gcc-fa60ac549649655a3f55e69f83d2e97423d3eb5c.tar.gz gcc-fa60ac549649655a3f55e69f83d2e97423d3eb5c.tar.bz2 |
btf: Emit labels in DATASEC bts_offset entries.
GCC was defining bts_offset entry to always contain 0.
When comparing with clang, the same entry is instead a label to the
respective variable or function. The assembler emits relocations for
those labels.
gcc/ChangeLog:
PR target/114431
* btfout.cc (get_name_for_datasec_entry): Add function.
(btf_asm_datasec_entry): Print label when possible.
gcc/testsuite/ChangeLog:
* gcc.dg/debug/btf/btf-datasec-1.c: Correct for new
implementation.
* gcc.dg/debug/btf/btf-datasec-2.c: Likewise
* gcc.dg/debug/btf/btf-pr106773.c: Likewise
Diffstat (limited to 'gcc/btfout.cc')
-rw-r--r-- | gcc/btfout.cc | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/gcc/btfout.cc b/gcc/btfout.cc index 7aabd99..2e2b352 100644 --- a/gcc/btfout.cc +++ b/gcc/btfout.cc @@ -1014,13 +1014,41 @@ btf_asm_func_type (ctf_container_ref ctfc, ctf_dtdef_ref dtd, ctf_id_t id) btf_asm_type_ref ("btt_type", ctfc, get_btf_id (ref_id)); } +/* Collect the name for the DATASEC reference required to be output as a + symbol. */ + +static const char * +get_name_for_datasec_entry (ctf_container_ref ctfc, ctf_id_t ref_id) +{ + if (ref_id >= num_types_added + 1 + && ref_id < num_types_added + num_vars_added + 1) + { + /* Ref to a variable. Should only appear in DATASEC entries. */ + ctf_id_t var_id = btf_relative_var_id (ref_id); + ctf_dvdef_ref dvd = ctfc->ctfc_vars_list[var_id]; + return dvd->dvd_name; + } + else if (ref_id >= num_types_added + num_vars_added + 1) + { + /* Ref to a FUNC record. */ + size_t func_id = btf_relative_func_id (ref_id); + ctf_dtdef_ref ref_type = (*funcs)[func_id]; + return get_btf_type_name (ref_type); + } + return NULL; +} + /* Asm'out a variable entry following a BTF_KIND_DATASEC. */ static void btf_asm_datasec_entry (ctf_container_ref ctfc, struct btf_var_secinfo info) { + const char *symbol_name = get_name_for_datasec_entry (ctfc, info.type); btf_asm_type_ref ("bts_type", ctfc, info.type); - dw2_asm_output_data (4, info.offset, "bts_offset"); + if (symbol_name == NULL) + dw2_asm_output_data (4, info.offset, "bts_offset"); + else + dw2_asm_output_offset (4, symbol_name, NULL, "bts_offset"); dw2_asm_output_data (4, info.size, "bts_size"); } |