96d526fe3028f9087ee54d7ee625d2b1e0c6cd15
[packages/trusty/cirros-testvm.git] / cirros-testvm / src-cirros / buildroot-2015.05 / package / binutils / 2.24 / 908-xtensa-optimize-find_removed_literal.patch
1 From 288c2b709e5e6841484e1a129eaccd299db36877 Mon Sep 17 00:00:00 2001
2 From: Max Filippov <jcmvbkbc@gmail.com>
3 Date: Sat, 4 Apr 2015 14:49:42 +0300
4 Subject: [PATCH 3/4] xtensa: optimize find_removed_literal
5
6 find_removed_literal uses linear search to find removed literal by its
7 VMA. The list of literals is fixed at that point, build an ordered index
8 array and use binary search instead.
9
10 Original profile:
11
12 % time    self  children    called     name
13 -----------------------------------------
14          56.72    0.00  297578/669392      translate_reloc
15          70.86    0.00  371814/669392      relax_section
16   67.9  127.58    0.00  669392         find_removed_literal
17 -----------------------------------------
18
19 Same data, after optimization:
20
21 % time    self  children    called     name
22 -----------------------------------------
23           0.00    0.00  297578/669392      translate_reloc
24           0.00    0.00  371814/669392      relax_section
25    0.0    0.00    0.00  669392         find_removed_literal
26           0.00    0.00   23838/23838       map_removed_literal
27 -----------------------------------------
28
29 2015-04-03  Max Filippov  <jcmvbkbc@gmail.com>
30 bfd/
31         * elf32-xtensa.c (removed_literal_map_entry): new typedef.
32         (removed_literal_map_entry_struct): new structure.
33         (removed_literal_list_struct): add new fields: n_map and map.
34         (map_removed_literal, removed_literal_compare): new functions.
35         (find_removed_literal): build index array for literals ordered
36         by VMA, use binary search to find removed literal.
37
38 Backported from: 3439c466273378021821473d3fc84990e089ae34
39 Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
40 ---
41  bfd/elf32-xtensa.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++-----
42  1 file changed, 58 insertions(+), 6 deletions(-)
43
44 diff --git a/bfd/elf32-xtensa.c b/bfd/elf32-xtensa.c
45 index 21b2871..51733ad 100644
46 --- a/bfd/elf32-xtensa.c
47 +++ b/bfd/elf32-xtensa.c
48 @@ -5832,6 +5832,7 @@ print_action_list (FILE *fp, text_action_list *action_list)
49     by the "from" offset field.  */
50  
51  typedef struct removed_literal_struct removed_literal;
52 +typedef struct removed_literal_map_entry_struct removed_literal_map_entry;
53  typedef struct removed_literal_list_struct removed_literal_list;
54  
55  struct removed_literal_struct
56 @@ -5841,10 +5842,19 @@ struct removed_literal_struct
57    removed_literal *next;
58  };
59  
60 +struct removed_literal_map_entry_struct
61 +{
62 +  bfd_vma addr;
63 +  removed_literal *literal;
64 +};
65 +
66  struct removed_literal_list_struct
67  {
68    removed_literal *head;
69    removed_literal *tail;
70 +
71 +  unsigned n_map;
72 +  removed_literal_map_entry *map;
73  };
74  
75  
76 @@ -5893,6 +5903,39 @@ add_removed_literal (removed_literal_list *removed_list,
77      }
78  }
79  
80 +static void
81 +map_removed_literal (removed_literal_list *removed_list)
82 +{
83 +  unsigned n_map = 0;
84 +  unsigned i;
85 +  removed_literal_map_entry *map = NULL;
86 +  removed_literal *r = removed_list->head;
87 +
88 +  for (i = 0; r; ++i, r = r->next)
89 +    {
90 +      if (i == n_map)
91 +       {
92 +         n_map = (n_map * 2) + 2;
93 +         map = bfd_realloc (map, n_map * sizeof (*map));
94 +       }
95 +      map[i].addr = r->from.target_offset;
96 +      map[i].literal = r;
97 +    }
98 +  removed_list->map = map;
99 +  removed_list->n_map = i;
100 +}
101 +
102 +static int
103 +removed_literal_compare (const void *a, const void *b)
104 +{
105 +  const removed_literal_map_entry *pa = a;
106 +  const removed_literal_map_entry *pb = b;
107 +
108 +  if (pa->addr == pb->addr)
109 +    return 0;
110 +  else
111 +    return pa->addr < pb->addr ? -1 : 1;
112 +}
113  
114  /* Check if the list of removed literals contains an entry for the
115     given address.  Return the entry if found.  */
116 @@ -5900,12 +5943,21 @@ add_removed_literal (removed_literal_list *removed_list,
117  static removed_literal *
118  find_removed_literal (removed_literal_list *removed_list, bfd_vma addr)
119  {
120 -  removed_literal *r = removed_list->head;
121 -  while (r && r->from.target_offset < addr)
122 -    r = r->next;
123 -  if (r && r->from.target_offset == addr)
124 -    return r;
125 -  return NULL;
126 +  removed_literal_map_entry *p;
127 +  removed_literal *r = NULL;
128 +
129 +  if (removed_list->map == NULL)
130 +    map_removed_literal (removed_list);
131 +
132 +  p = bsearch (&addr, removed_list->map, removed_list->n_map,
133 +              sizeof (*removed_list->map), removed_literal_compare);
134 +  if (p)
135 +    {
136 +      while (p != removed_list->map && (p - 1)->addr == addr)
137 +       --p;
138 +      r = p->literal;
139 +    }
140 +  return r;
141  }
142  
143  
144 -- 
145 1.8.1.4
146