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");
}
/* { 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 } } */
/* { 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")));
/* { 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")));