Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[cris-mirror.git] / tools / lib / symbol / kallsyms.c
blob914cb8e3d40b7e1be5717b385e9f92a33d19aed1
1 // SPDX-License-Identifier: GPL-2.0
2 #include <ctype.h>
3 #include "symbol/kallsyms.h"
4 #include <stdio.h>
5 #include <stdlib.h>
7 u8 kallsyms2elf_type(char type)
9 type = tolower(type);
10 return (type == 't' || type == 'w') ? STT_FUNC : STT_OBJECT;
13 int kallsyms__parse(const char *filename, void *arg,
14 int (*process_symbol)(void *arg, const char *name,
15 char type, u64 start))
17 char *line = NULL;
18 size_t n;
19 int err = -1;
20 FILE *file = fopen(filename, "r");
22 if (file == NULL)
23 goto out_failure;
25 err = 0;
27 while (!feof(file)) {
28 u64 start;
29 int line_len, len;
30 char symbol_type;
31 char *symbol_name;
33 line_len = getline(&line, &n, file);
34 if (line_len < 0 || !line)
35 break;
37 line[--line_len] = '\0'; /* \n */
39 len = hex2u64(line, &start);
41 len++;
42 if (len + 2 >= line_len)
43 continue;
45 symbol_type = line[len];
46 len += 2;
47 symbol_name = line + len;
48 len = line_len - len;
50 if (len >= KSYM_NAME_LEN) {
51 err = -1;
52 break;
55 err = process_symbol(arg, symbol_name, symbol_type, start);
56 if (err)
57 break;
60 free(line);
61 fclose(file);
62 return err;
64 out_failure:
65 return -1;