at v5.18-rc5 1.4 kB view raw
1/* SPDX-License-Identifier: GPL-2.0-or-later */ 2/* 3 * Copyright (C) 2015 Josh Poimboeuf <jpoimboe@redhat.com> 4 */ 5 6#ifndef _WARN_H 7#define _WARN_H 8 9#include <stdlib.h> 10#include <string.h> 11#include <sys/types.h> 12#include <sys/stat.h> 13#include <fcntl.h> 14#include <objtool/elf.h> 15 16extern const char *objname; 17 18static inline char *offstr(struct section *sec, unsigned long offset) 19{ 20 struct symbol *func; 21 char *name, *str; 22 unsigned long name_off; 23 24 func = find_func_containing(sec, offset); 25 if (!func) 26 func = find_symbol_containing(sec, offset); 27 if (func) { 28 name = func->name; 29 name_off = offset - func->offset; 30 } else { 31 name = sec->name; 32 name_off = offset; 33 } 34 35 str = malloc(strlen(name) + 20); 36 37 if (func) 38 sprintf(str, "%s()+0x%lx", name, name_off); 39 else 40 sprintf(str, "%s+0x%lx", name, name_off); 41 42 return str; 43} 44 45#define WARN(format, ...) \ 46 fprintf(stderr, \ 47 "%s: warning: objtool: " format "\n", \ 48 objname, ##__VA_ARGS__) 49 50#define WARN_FUNC(format, sec, offset, ...) \ 51({ \ 52 char *_str = offstr(sec, offset); \ 53 WARN("%s: " format, _str, ##__VA_ARGS__); \ 54 free(_str); \ 55}) 56 57#define BT_FUNC(format, insn, ...) \ 58({ \ 59 struct instruction *_insn = (insn); \ 60 char *_str = offstr(_insn->sec, _insn->offset); \ 61 WARN(" %s: " format, _str, ##__VA_ARGS__); \ 62 free(_str); \ 63}) 64 65#define WARN_ELF(format, ...) \ 66 WARN(format ": %s", ##__VA_ARGS__, elf_errmsg(-1)) 67 68#endif /* _WARN_H */