btrfs-progs: don't use <execinfo.h> with uClibc
[buildroot-gz.git] / package / binutils / 2.25.1 / 908-xtensa-optimize-find_removed_literal.patch
blob96d526fe3028f9087ee54d7ee625d2b1e0c6cd15
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
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.
10 Original profile:
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 -----------------------------------------
19 Same data, after optimization:
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 -----------------------------------------
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.
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(-)
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. */
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;
55 struct removed_literal_struct
56 @@ -5841,10 +5842,19 @@ struct removed_literal_struct
57 removed_literal *next;
60 +struct removed_literal_map_entry_struct
62 + bfd_vma addr;
63 + removed_literal *literal;
64 +};
66 struct removed_literal_list_struct
68 removed_literal *head;
69 removed_literal *tail;
71 + unsigned n_map;
72 + removed_literal_map_entry *map;
76 @@ -5893,6 +5903,39 @@ add_removed_literal (removed_literal_list *removed_list,
80 +static void
81 +map_removed_literal (removed_literal_list *removed_list)
83 + unsigned n_map = 0;
84 + unsigned i;
85 + removed_literal_map_entry *map = NULL;
86 + removed_literal *r = removed_list->head;
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;
102 +static int
103 +removed_literal_compare (const void *a, const void *b)
105 + const removed_literal_map_entry *pa = a;
106 + const removed_literal_map_entry *pb = b;
108 + if (pa->addr == pb->addr)
109 + return 0;
110 + else
111 + return pa->addr < pb->addr ? -1 : 1;
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)
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;
129 + if (removed_list->map == NULL)
130 + map_removed_literal (removed_list);
132 + p = bsearch (&addr, removed_list->map, removed_list->n_map,
133 + sizeof (*removed_list->map), removed_literal_compare);
134 + if (p)
136 + while (p != removed_list->map && (p - 1)->addr == addr)
137 + --p;
138 + r = p->literal;
140 + return r;
145 1.8.1.4