Commit 5e5c4fa7 authored by Masahiro Yamada's avatar Masahiro Yamada
Browse files

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: default avatarMasahiro Yamada <yamada.masahiro@socionext.com>
parent 21915eca
Loading
Loading
Loading
Loading
+29 −20
Original line number Diff line number Diff line
@@ -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)