treewide: remove redundant IS_ERR() before error code check
[linux/fpc-iii.git] / tools / lib / symbol / kallsyms.c
blob1a7a9f87709587dfc5d8d11226f1555cc4e30ad7
1 // SPDX-License-Identifier: GPL-2.0
2 #include "symbol/kallsyms.h"
3 #include <stdio.h>
4 #include <stdlib.h>
6 u8 kallsyms2elf_type(char type)
8 type = tolower(type);
9 return (type == 't' || type == 'w') ? STT_FUNC : STT_OBJECT;
12 bool kallsyms__is_function(char symbol_type)
14 symbol_type = toupper(symbol_type);
15 return symbol_type == 'T' || symbol_type == 'W';
19 * While we find nice hex chars, build a long_val.
20 * Return number of chars processed.
22 int hex2u64(const char *ptr, u64 *long_val)
24 char *p;
26 *long_val = strtoull(ptr, &p, 16);
28 return p - ptr;
31 int kallsyms__parse(const char *filename, void *arg,
32 int (*process_symbol)(void *arg, const char *name,
33 char type, u64 start))
35 char *line = NULL;
36 size_t n;
37 int err = -1;
38 FILE *file = fopen(filename, "r");
40 if (file == NULL)
41 goto out_failure;
43 err = 0;
45 while (!feof(file)) {
46 u64 start;
47 int line_len, len;
48 char symbol_type;
49 char *symbol_name;
51 line_len = getline(&line, &n, file);
52 if (line_len < 0 || !line)
53 break;
55 line[--line_len] = '\0'; /* \n */
57 len = hex2u64(line, &start);
59 /* Skip the line if we failed to parse the address. */
60 if (!len)
61 continue;
63 len++;
64 if (len + 2 >= line_len)
65 continue;
67 symbol_type = line[len];
68 len += 2;
69 symbol_name = line + len;
70 len = line_len - len;
72 if (len >= KSYM_NAME_LEN) {
73 err = -1;
74 break;
77 err = process_symbol(arg, symbol_name, symbol_type, start);
78 if (err)
79 break;
82 free(line);
83 fclose(file);
84 return err;
86 out_failure:
87 return -1;