~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/tools/objtool/include/objtool/warn.h

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  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/builtin.h>
 15 #include <objtool/elf.h>
 16 
 17 extern const char *objname;
 18 
 19 static inline char *offstr(struct section *sec, unsigned long offset)
 20 {
 21         bool is_text = (sec->sh.sh_flags & SHF_EXECINSTR);
 22         struct symbol *sym = NULL;
 23         char *str;
 24         int len;
 25 
 26         if (is_text)
 27                 sym = find_func_containing(sec, offset);
 28         if (!sym)
 29                 sym = find_symbol_containing(sec, offset);
 30 
 31         if (sym) {
 32                 str = malloc(strlen(sym->name) + strlen(sec->name) + 40);
 33                 len = sprintf(str, "%s+0x%lx", sym->name, offset - sym->offset);
 34                 if (opts.sec_address)
 35                         sprintf(str+len, " (%s+0x%lx)", sec->name, offset);
 36         } else {
 37                 str = malloc(strlen(sec->name) + 20);
 38                 sprintf(str, "%s+0x%lx", sec->name, offset);
 39         }
 40 
 41         return str;
 42 }
 43 
 44 #define WARN(format, ...)                               \
 45         fprintf(stderr,                                 \
 46                 "%s: warning: objtool: " format "\n",   \
 47                 objname, ##__VA_ARGS__)
 48 
 49 #define WARN_FUNC(format, sec, offset, ...)             \
 50 ({                                                      \
 51         char *_str = offstr(sec, offset);               \
 52         WARN("%s: " format, _str, ##__VA_ARGS__);       \
 53         free(_str);                                     \
 54 })
 55 
 56 #define WARN_INSN(insn, format, ...)                                    \
 57 ({                                                                      \
 58         struct instruction *_insn = (insn);                             \
 59         if (!_insn->sym || !_insn->sym->warned)                         \
 60                 WARN_FUNC(format, _insn->sec, _insn->offset,            \
 61                           ##__VA_ARGS__);                               \
 62         if (_insn->sym)                                                 \
 63                 _insn->sym->warned = 1;                                 \
 64 })
 65 
 66 #define BT_INSN(insn, format, ...)                              \
 67 ({                                                              \
 68         if (opts.verbose || opts.backtrace) {                   \
 69                 struct instruction *_insn = (insn);             \
 70                 char *_str = offstr(_insn->sec, _insn->offset); \
 71                 WARN("  %s: " format, _str, ##__VA_ARGS__);     \
 72                 free(_str);                                     \
 73         }                                                       \
 74 })
 75 
 76 #define WARN_ELF(format, ...)                           \
 77         WARN(format ": %s", ##__VA_ARGS__, elf_errmsg(-1))
 78 
 79 #endif /* _WARN_H */
 80 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php