linux/tools/objtool/warn.h
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2015 Josh Poimboeuf <jpoimboe@redhat.com>
   3 *
   4 * This program is free software; you can redistribute it and/or
   5 * modify it under the terms of the GNU General Public License
   6 * as published by the Free Software Foundation; either version 2
   7 * of the License, or (at your option) any later version.
   8 *
   9 * This program is distributed in the hope that it will be useful,
  10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12 * GNU General Public License for more details.
  13 *
  14 * You should have received a copy of the GNU General Public License
  15 * along with this program; if not, see <http://www.gnu.org/licenses/>.
  16 */
  17
  18#ifndef _WARN_H
  19#define _WARN_H
  20
  21#include <stdlib.h>
  22#include <string.h>
  23#include <sys/types.h>
  24#include <sys/stat.h>
  25#include <fcntl.h>
  26#include "elf.h"
  27
  28extern const char *objname;
  29
  30static inline char *offstr(struct section *sec, unsigned long offset)
  31{
  32        struct symbol *func;
  33        char *name, *str;
  34        unsigned long name_off;
  35
  36        func = find_containing_func(sec, offset);
  37        if (func) {
  38                name = func->name;
  39                name_off = offset - func->offset;
  40        } else {
  41                name = sec->name;
  42                name_off = offset;
  43        }
  44
  45        str = malloc(strlen(name) + 20);
  46
  47        if (func)
  48                sprintf(str, "%s()+0x%lx", name, name_off);
  49        else
  50                sprintf(str, "%s+0x%lx", name, name_off);
  51
  52        return str;
  53}
  54
  55#define WARN(format, ...)                               \
  56        fprintf(stderr,                                 \
  57                "%s: warning: objtool: " format "\n",   \
  58                objname, ##__VA_ARGS__)
  59
  60#define WARN_FUNC(format, sec, offset, ...)             \
  61({                                                      \
  62        char *_str = offstr(sec, offset);               \
  63        WARN("%s: " format, _str, ##__VA_ARGS__);       \
  64        free(_str);                                     \
  65})
  66
  67#define WARN_ELF(format, ...)                           \
  68        WARN(format ": %s", ##__VA_ARGS__, elf_errmsg(-1))
  69
  70#endif /* _WARN_H */
  71