scripts/kallsyms: skip ignored symbols very early

Unless the address range matters, symbols can be ignored earlier,
which avoids unneeded memory allocation.

Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
This commit is contained in:
Masahiro Yamada 2019-11-24 01:04:39 +09:00
parent 4bfe2b7816
commit a41333e06a
1 changed files with 62 additions and 51 deletions

View File

@ -18,6 +18,7 @@
*
*/
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@ -79,6 +80,64 @@ static char *sym_name(const struct sym_entry *s)
return (char *)s->sym + 1;
}
static bool is_ignored_symbol(const char *name, char type)
{
static const char * const ignored_symbols[] = {
/*
* Symbols which vary between passes. Passes 1 and 2 must have
* identical symbol lists. The kallsyms_* symbols below are
* only added after pass 1, they would be included in pass 2
* when --all-symbols is specified so exclude them to get a
* stable symbol list.
*/
"kallsyms_addresses",
"kallsyms_offsets",
"kallsyms_relative_base",
"kallsyms_num_syms",
"kallsyms_names",
"kallsyms_markers",
"kallsyms_token_table",
"kallsyms_token_index",
/* Exclude linker generated symbols which vary between passes */
"_SDA_BASE_", /* ppc */
"_SDA2_BASE_", /* ppc */
NULL
};
static const char * const ignored_prefixes[] = {
"__crc_", /* modversions */
"__efistub_", /* arm64 EFI stub namespace */
NULL
};
static const char * const ignored_suffixes[] = {
"_from_arm", /* arm */
"_from_thumb", /* arm */
"_veneer", /* arm */
NULL
};
const char * const *p;
/* Exclude symbols which vary between passes. */
for (p = ignored_symbols; *p; p++)
if (!strcmp(name, *p))
return true;
for (p = ignored_prefixes; *p; p++)
if (!strncmp(name, *p, strlen(*p)))
return true;
for (p = ignored_suffixes; *p; p++) {
int l = strlen(name) - strlen(*p);
if (l >= 0 && !strcmp(name + l, *p))
return true;
}
return false;
}
static int check_symbol_range(const char *sym, unsigned long long addr,
struct addr_range *ranges, int entries)
{
@ -118,6 +177,9 @@ static int read_symbol(FILE *in, struct sym_entry *s)
return -1;
}
if (is_ignored_symbol(sym, stype))
return -1;
/* Ignore most absolute/undefined (?) symbols. */
if (strcmp(sym, "_text") == 0)
_text = s->addr;
@ -188,38 +250,6 @@ static int symbol_in_range(const struct sym_entry *s,
static int symbol_valid(const struct sym_entry *s)
{
/* Symbols which vary between passes. Passes 1 and 2 must have
* identical symbol lists. The kallsyms_* symbols below are only added
* after pass 1, they would be included in pass 2 when --all-symbols is
* specified so exclude them to get a stable symbol list.
*/
static const char * const special_symbols[] = {
"kallsyms_addresses",
"kallsyms_offsets",
"kallsyms_relative_base",
"kallsyms_num_syms",
"kallsyms_names",
"kallsyms_markers",
"kallsyms_token_table",
"kallsyms_token_index",
/* Exclude linker generated symbols which vary between passes */
"_SDA_BASE_", /* ppc */
"_SDA2_BASE_", /* ppc */
NULL };
static const char * const special_prefixes[] = {
"__crc_", /* modversions */
"__efistub_", /* arm64 EFI stub namespace */
NULL };
static const char * const special_suffixes[] = {
"_veneer", /* arm */
"_from_arm", /* arm */
"_from_thumb", /* arm */
NULL };
int i;
const char *name = sym_name(s);
/* if --all-symbols is not specified, then symbols outside the text
@ -241,25 +271,6 @@ static int symbol_valid(const struct sym_entry *s)
return 0;
}
/* Exclude symbols which vary between passes. */
for (i = 0; special_symbols[i]; i++)
if (strcmp(name, special_symbols[i]) == 0)
return 0;
for (i = 0; special_prefixes[i]; i++) {
int l = strlen(special_prefixes[i]);
if (strncmp(name, special_prefixes[i], l) == 0)
return 0;
}
for (i = 0; special_suffixes[i]; i++) {
int l = strlen(name) - strlen(special_suffixes[i]);
if (l >= 0 && strcmp(name + l, special_suffixes[i]) == 0)
return 0;
}
return 1;
}