1
0
Fork 0

scripts/kallsyms: shrink table before sorting it

Currently, build_initial_tok_table() trims unused symbols, but it is
called after sort_symbols().

It is not efficient to sort the huge table that contains unused entries.
Shrink the table before sorting it.

Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
alistair/sunxi64-5.5-dsi
Masahiro Yamada 2019-11-24 01:04:31 +09:00
parent 21915eca08
commit 5e5c4fa787
1 changed files with 29 additions and 20 deletions

View File

@ -268,6 +268,30 @@ static int symbol_valid(struct sym_entry *s)
return 1;
}
/* remove all the invalid symbols from the table */
static void shrink_table(void)
{
unsigned int i, pos;
pos = 0;
for (i = 0; i < table_cnt; i++) {
if (symbol_valid(&table[i])) {
if (pos != i)
table[pos] = table[i];
pos++;
} else {
free(table[i].sym);
}
}
table_cnt = pos;
/* When valid symbol is not registered, exit to error */
if (!table_cnt) {
fprintf(stderr, "No valid symbol.\n");
exit(1);
}
}
static void read_map(FILE *in)
{
while (!feof(in)) {
@ -475,23 +499,13 @@ static void forget_symbol(unsigned char *symbol, int len)
token_profit[ symbol[i] + (symbol[i + 1] << 8) ]--;
}
/* remove all the invalid symbols from the table and do the initial token count */
/* do the initial token count */
static void build_initial_tok_table(void)
{
unsigned int i, pos;
unsigned int i;
pos = 0;
for (i = 0; i < table_cnt; i++) {
if ( symbol_valid(&table[i]) ) {
if (pos != i)
table[pos] = table[i];
learn_symbol(table[pos].sym, table[pos].len);
pos++;
} else {
free(table[i].sym);
}
}
table_cnt = pos;
for (i = 0; i < table_cnt; i++)
learn_symbol(table[i].sym, table[i].len);
}
static void *find_token(unsigned char *str, int len, unsigned char *token)
@ -614,12 +628,6 @@ static void optimize_token_table(void)
insert_real_symbols_in_table();
/* When valid symbol is not registered, exit to error */
if (!table_cnt) {
fprintf(stderr, "No valid symbol.\n");
exit(1);
}
optimize_result();
}
@ -756,6 +764,7 @@ int main(int argc, char **argv)
usage();
read_map(stdin);
shrink_table();
if (absolute_percpu)
make_percpus_absolute();
if (base_relative)