David Faust writes:

> On 3/26/24 07:28, Cupertino Miranda wrote:
>> Hi everyone,
>>
>> This patch is an expected fix for the issue reported by systemd in:
>> https://github.com/systemd/systemd/issues/31888
>> Also, Jose Marchesi opened the following bugzilla to report it:
>> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114431
>>
>> Please notice that the function created was inspired by existing code
>> in the function btf_asm_type_ref.
>>
>> Looking forward to your comments.
>
> OK, LGTM.
> Thanks for the fix!

Pushed! Thanks!

>>
>> Cupertino
>>
>>
>> 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
>> ---
>>  gcc/btfout.cc                                 | 30 ++++++++++++++++++-
>>  .../gcc.dg/debug/btf/btf-datasec-1.c          |  6 ++--
>>  .../gcc.dg/debug/btf/btf-datasec-2.c          |  7 +++--
>>  gcc/testsuite/gcc.dg/debug/btf/btf-pr106773.c |  2 +-
>>  4 files changed, 39 insertions(+), 6 deletions(-)
>>
>> diff --git a/gcc/btfout.cc b/gcc/btfout.cc
>> index e63289bc554..5f708630e04 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");
>>  }
>>
>> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-datasec-1.c 
>> b/gcc/testsuite/gcc.dg/debug/btf/btf-datasec-1.c
>> index 77df88648c5..8557c38c20d 100644
>> --- a/gcc/testsuite/gcc.dg/debug/btf/btf-datasec-1.c
>> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-datasec-1.c
>> @@ -19,8 +19,10 @@
>>  /* { dg-final { scan-assembler-times "0xf000003\[\t \]+\[^\n\]*btt_info" 2 
>> } } */
>>  /* { dg-final { scan-assembler-times "0xf000001\[\t \]+\[^\n\]*btt_info" 1 
>> } } */
>>
>> -/* The offset entry for each variable in a DATSEC should be 0 at compile 
>> time.  */
>> -/* { dg-final { scan-assembler-times "0\[\t \]+\[^\n\]*bts_offset" 7 } } */
>> +/* The offset entry for each variable in a DATSEC should contain a label.  
>> */
>> +/* { dg-final { scan-assembler-times ".4byte\[\t \]\[a-e\]\[\t 
>> \]+\[^\n\]*bts_offset" 5 } } */
>> +/* { dg-final { scan-assembler-times "my_cstruct\[\t \]+\[^\n\]*bts_offset" 
>> 1 } } */
>> +/* { dg-final { scan-assembler-times "bigarr\[\t \]+\[^\n\]*bts_offset" 1 } 
>> } */
>>
>>  /* Check that strings for each DATASEC have been added to the BTF string 
>> table.  */
>>  /* { dg-final { scan-assembler-times "ascii \".data.0\"\[\t 
>> \]+\[^\n\]*btf_aux_string" 1 } } */
>> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-datasec-2.c 
>> b/gcc/testsuite/gcc.dg/debug/btf/btf-datasec-2.c
>> index d6f3358d6fb..857d830e446 100644
>> --- a/gcc/testsuite/gcc.dg/debug/btf/btf-datasec-2.c
>> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-datasec-2.c
>> @@ -9,8 +9,11 @@
>>  /* { dg-final { scan-assembler-times " BTF_KIND_DATASEC 
>> '.foo_sec'\[\\r\\n\]+\[^\\r\\n\]*0xf000001\[\t \]+\[^\n\]*btt_info" 1 } } */
>>  /* { dg-final { scan-assembler-times " BTF_KIND_DATASEC 
>> '.bar_sec'\[\\r\\n\]+\[^\\r\\n\]*0xf000002\[\t \]+\[^\n\]*btt_info" 1 } } */
>>
>> -/* Function entries should have offset and size of 0 at compile time.  */
>> -/* { dg-final { scan-assembler-times "0\[\t \]+\[^\n\]*bts_offset" 3 } } */
>> +/* Function entries should have offset with a label and size of 0 at 
>> compile time.  */
>> +/* { dg-final { scan-assembler-times "chacha\[\t \]+\[^\n\]*bts_offset" 1 } 
>> } */
>> +/* { dg-final { scan-assembler-times "bar\[\t \]+\[^\n\]*bts_offset" 1 } } 
>> */
>> +/* { dg-final { scan-assembler-times "foo\[\t \]+\[^\n\]*bts_offset" 1 } } 
>> */
>> +
>>  /* { dg-final { scan-assembler-times "0\[\t \]+\[^\n\]*bts_size" 3 } } */
>>
>>  extern int foo (int a) __attribute__((section(".foo_sec")));
>> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-pr106773.c 
>> b/gcc/testsuite/gcc.dg/debug/btf/btf-pr106773.c
>> index 940f129408d..c06220eb520 100644
>> --- a/gcc/testsuite/gcc.dg/debug/btf/btf-pr106773.c
>> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-pr106773.c
>> @@ -11,7 +11,7 @@
>>
>>  /* { dg-final { scan-assembler-times "ascii \"foo.0\"\[\t 
>> \]+\[^\n\]*btf_string" 1 } } */
>>
>> -/* { dg-final { scan-assembler-times "0\[\t \]+\[^\n\]*bts_offset" 1 } } */
>> +/* { dg-final { scan-assembler-times "foo\[\t \]+\[^\n\]*bts_offset" 1 } } 
>> */
>>  /* { dg-final { scan-assembler-times "1\[\t \]+\[^\n\]*bts_size" 1 } } */
>>
>>  extern const void foo __attribute__((weak)) __attribute__((section 
>> (".ksyms")));

Reply via email to