Out of symbol_type__is_a(type, MAP__FUNCTION), which is the only variant used so far, useful in a kallsyms library and one more step in ditching the MAP__FUNCTION/VARIABLE split. Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: David Ahern <dsahern@gmail.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Wang Nan <wangnan0@huawei.com> Link: https://lkml.kernel.org/n/tip-faonqs76n5808z9mq77edr94@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
		
			
				
	
	
		
			77 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| // SPDX-License-Identifier: GPL-2.0
 | |
| #include <ctype.h>
 | |
| #include "symbol/kallsyms.h"
 | |
| #include <stdio.h>
 | |
| #include <stdlib.h>
 | |
| 
 | |
| u8 kallsyms2elf_type(char type)
 | |
| {
 | |
| 	type = tolower(type);
 | |
| 	return (type == 't' || type == 'w') ? STT_FUNC : STT_OBJECT;
 | |
| }
 | |
| 
 | |
| bool kallsyms__is_function(char symbol_type)
 | |
| {
 | |
| 	symbol_type = toupper(symbol_type);
 | |
| 	return symbol_type == 'T' || symbol_type == 'W';
 | |
| }
 | |
| 
 | |
| int kallsyms__parse(const char *filename, void *arg,
 | |
| 		    int (*process_symbol)(void *arg, const char *name,
 | |
| 					  char type, u64 start))
 | |
| {
 | |
| 	char *line = NULL;
 | |
| 	size_t n;
 | |
| 	int err = -1;
 | |
| 	FILE *file = fopen(filename, "r");
 | |
| 
 | |
| 	if (file == NULL)
 | |
| 		goto out_failure;
 | |
| 
 | |
| 	err = 0;
 | |
| 
 | |
| 	while (!feof(file)) {
 | |
| 		u64 start;
 | |
| 		int line_len, len;
 | |
| 		char symbol_type;
 | |
| 		char *symbol_name;
 | |
| 
 | |
| 		line_len = getline(&line, &n, file);
 | |
| 		if (line_len < 0 || !line)
 | |
| 			break;
 | |
| 
 | |
| 		line[--line_len] = '\0'; /* \n */
 | |
| 
 | |
| 		len = hex2u64(line, &start);
 | |
| 
 | |
| 		/* Skip the line if we failed to parse the address. */
 | |
| 		if (!len)
 | |
| 			continue;
 | |
| 
 | |
| 		len++;
 | |
| 		if (len + 2 >= line_len)
 | |
| 			continue;
 | |
| 
 | |
| 		symbol_type = line[len];
 | |
| 		len += 2;
 | |
| 		symbol_name = line + len;
 | |
| 		len = line_len - len;
 | |
| 
 | |
| 		if (len >= KSYM_NAME_LEN) {
 | |
| 			err = -1;
 | |
| 			break;
 | |
| 		}
 | |
| 
 | |
| 		err = process_symbol(arg, symbol_name, symbol_type, start);
 | |
| 		if (err)
 | |
| 			break;
 | |
| 	}
 | |
| 
 | |
| 	free(line);
 | |
| 	fclose(file);
 | |
| 	return err;
 | |
| 
 | |
| out_failure:
 | |
| 	return -1;
 | |
| }
 |