radeonsi/sid_tables: store offset into global fields table instead of pointer
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Sun, 8 May 2016 23:48:16 +0000 (18:48 -0500)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Fri, 13 May 2016 06:03:39 +0000 (01:03 -0500)
This avoids relocations in the final binary.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
src/gallium/drivers/radeonsi/si_debug.c
src/gallium/drivers/radeonsi/sid_tables.py

index 3f87fd35473390cd492a168d6670214fafd6aa20..daa934f950d4bf9ea28c7e5834e878eb1508b248 100644 (file)
@@ -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 = &reg->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);
index 59954c55dfb9984284ac27061ac176a0f3797926..0ca24ae5ffae6f6b514e912c72798e957e602a31 100755 (executable)
@@ -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 '};'