From c7f73a70f042c24adf57188b2fe5c8c6a6aa8980 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Nicolai=20H=C3=A4hnle?= Date: Sun, 8 May 2016 18:48:16 -0500 Subject: [PATCH] radeonsi/sid_tables: store offset into global fields table instead of pointer MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This avoids relocations in the final binary. Reviewed-by: Marek Olšák Reviewed-by: Bas Nieuwenhuizen --- src/gallium/drivers/radeonsi/si_debug.c | 2 +- src/gallium/drivers/radeonsi/sid_tables.py | 23 ++++++++++++++-------- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_debug.c b/src/gallium/drivers/radeonsi/si_debug.c index 3f87fd35473..daa934f950d 100644 --- a/src/gallium/drivers/radeonsi/si_debug.c +++ b/src/gallium/drivers/radeonsi/si_debug.c @@ -202,7 +202,7 @@ static void si_dump_reg(FILE *file, unsigned offset, uint32_t value, } for (f = 0; f < reg->num_fields; f++) { - const struct si_field *field = ®->fields[f]; + const struct si_field *field = sid_fields_table + reg->fields_offset + f; const int *values_offsets = sid_strings_offsets + field->values_offset; uint32_t val = (value & field->mask) >> (ffs(field->mask) - 1); diff --git a/src/gallium/drivers/radeonsi/sid_tables.py b/src/gallium/drivers/radeonsi/sid_tables.py index 59954c55dfb..0ca24ae5ffa 100755 --- a/src/gallium/drivers/radeonsi/sid_tables.py +++ b/src/gallium/drivers/radeonsi/sid_tables.py @@ -139,7 +139,6 @@ class Reg: self.r_name = r_name self.name = strip_prefix(r_name) self.fields = [] - self.varname_fields = '%s__fields' % self.r_name.lower() self.own_fields = True @@ -191,7 +190,7 @@ def parse(filename): reg0 = reg_dict.get(match_number.sub('0', reg.name)) if reg0 != None: reg.fields = reg0.fields - reg.varname_fields = reg0.varname_fields + reg.fields_owner = reg0 reg.own_fields = False return (regs, packets) @@ -222,7 +221,7 @@ struct si_reg { unsigned name_offset; unsigned offset; unsigned num_fields; - const struct si_field *fields; + unsigned fields_offset; }; struct si_packet3 { @@ -237,9 +236,15 @@ struct si_packet3 { print '};' print + print 'static const struct si_field sid_fields_table[] = {' + + fields_idx = 0 for reg in regs: if len(reg.fields) and reg.own_fields: - print 'static const struct si_field %s[] = {' % (reg.varname_fields) + print '\t/* %s */' % (fields_idx) + + reg.fields_idx = fields_idx + for field in reg.fields: if len(field.values): values_offsets = [] @@ -252,14 +257,16 @@ struct si_packet3 { len(values_offsets), strings_offsets.add(values_offsets)) else: print '\t{%s, %s(~0u)},' % (strings.add(field.name), field.s_name) - print '};' - print + fields_idx += 1 + + print '};' + print print 'static const struct si_reg reg_table[] = {' for reg in regs: if len(reg.fields): - print '\t{%s, %s, ARRAY_SIZE(%s), %s},' % (strings.add(reg.name), reg.r_name, - reg.varname_fields, reg.varname_fields) + print '\t{%s, %s, %s, %s},' % (strings.add(reg.name), reg.r_name, + len(reg.fields), reg.fields_idx if reg.own_fields else reg.fields_owner.fields_idx) else: print '\t{%s, %s},' % (strings.add(reg.name), reg.r_name) print '};' -- 2.30.2