Blame libdw/dwarf_error.c

Packit Service 97d2fb
/* Retrieve ELF descriptor used for DWARF access.
Packit Service 97d2fb
   Copyright (C) 2002-2005, 2009, 2014, 2015, 2017, 2018 Red Hat, Inc.
Packit Service 97d2fb
   This file is part of elfutils.
Packit Service 97d2fb
Packit Service 97d2fb
   This file is free software; you can redistribute it and/or modify
Packit Service 97d2fb
   it under the terms of either
Packit Service 97d2fb
Packit Service 97d2fb
     * the GNU Lesser General Public License as published by the Free
Packit Service 97d2fb
       Software Foundation; either version 3 of the License, or (at
Packit Service 97d2fb
       your option) any later version
Packit Service 97d2fb
Packit Service 97d2fb
   or
Packit Service 97d2fb
Packit Service 97d2fb
     * the GNU General Public License as published by the Free
Packit Service 97d2fb
       Software Foundation; either version 2 of the License, or (at
Packit Service 97d2fb
       your option) any later version
Packit Service 97d2fb
Packit Service 97d2fb
   or both in parallel, as here.
Packit Service 97d2fb
Packit Service 97d2fb
   elfutils is distributed in the hope that it will be useful, but
Packit Service 97d2fb
   WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 97d2fb
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 97d2fb
   General Public License for more details.
Packit Service 97d2fb
Packit Service 97d2fb
   You should have received copies of the GNU General Public License and
Packit Service 97d2fb
   the GNU Lesser General Public License along with this program.  If
Packit Service 97d2fb
   not, see <http://www.gnu.org/licenses/>.  */
Packit Service 97d2fb
Packit Service 97d2fb
#ifdef HAVE_CONFIG_H
Packit Service 97d2fb
# include <config.h>
Packit Service 97d2fb
#endif
Packit Service 97d2fb
Packit Service 97d2fb
#include <assert.h>
Packit Service 97d2fb
#include <stddef.h>
Packit Service 97d2fb
Packit Service 97d2fb
#include "libdwP.h"
Packit Service 97d2fb
Packit Service 97d2fb
Packit Service 97d2fb
/* The error number.  */
Packit Service 97d2fb
static __thread int global_error;
Packit Service 97d2fb
Packit Service 97d2fb
Packit Service 97d2fb
int
Packit Service 97d2fb
dwarf_errno (void)
Packit Service 97d2fb
{
Packit Service 97d2fb
  int result = global_error;
Packit Service 97d2fb
  global_error = DWARF_E_NOERROR;
Packit Service 97d2fb
  return result;
Packit Service 97d2fb
}
Packit Service 97d2fb
INTDEF(dwarf_errno)
Packit Service 97d2fb
Packit Service 97d2fb
Packit Service 97d2fb
/* XXX For now we use string pointers.  Once the table stablelizes
Packit Service 97d2fb
   make it more DSO-friendly.  */
Packit Service 97d2fb
static const char *errmsgs[] =
Packit Service 97d2fb
  {
Packit Service 97d2fb
    [DWARF_E_NOERROR] = N_("no error"),
Packit Service 97d2fb
    [DWARF_E_UNKNOWN_ERROR] = N_("unknown error"),
Packit Service 97d2fb
    [DWARF_E_INVALID_ACCESS] = N_("invalid access"),
Packit Service 97d2fb
    [DWARF_E_NO_REGFILE] = N_("no regular file"),
Packit Service 97d2fb
    [DWARF_E_IO_ERROR] = N_("I/O error"),
Packit Service 97d2fb
    [DWARF_E_INVALID_ELF] = N_("invalid ELF file"),
Packit Service 97d2fb
    [DWARF_E_NO_DWARF] = N_("no DWARF information"),
Packit Service 97d2fb
    [DWARF_E_COMPRESSED_ERROR] = N_("cannot decompress DWARF"),
Packit Service 97d2fb
    [DWARF_E_NOELF] = N_("no ELF file"),
Packit Service 97d2fb
    [DWARF_E_GETEHDR_ERROR] = N_("cannot get ELF header"),
Packit Service 97d2fb
    [DWARF_E_NOMEM] = N_("out of memory"),
Packit Service 97d2fb
    [DWARF_E_UNIMPL] = N_("not implemented"),
Packit Service 97d2fb
    [DWARF_E_INVALID_CMD] = N_("invalid command"),
Packit Service 97d2fb
    [DWARF_E_INVALID_VERSION] = N_("invalid version"),
Packit Service 97d2fb
    [DWARF_E_INVALID_FILE] = N_("invalid file"),
Packit Service 97d2fb
    [DWARF_E_NO_ENTRY] = N_("no entries found"),
Packit Service 97d2fb
    [DWARF_E_INVALID_DWARF] = N_("invalid DWARF"),
Packit Service 97d2fb
    [DWARF_E_NO_STRING] = N_("no string data"),
Packit Service 97d2fb
    [DWARF_E_NO_DEBUG_STR] = N_(".debug_str section missing"),
Packit Service 97d2fb
    [DWARF_E_NO_DEBUG_LINE_STR] = N_(".debug_line_str section missing"),
Packit Service 97d2fb
    [DWARF_E_NO_STR_OFFSETS] = N_(".debug_str_offsets section missing"),
Packit Service 97d2fb
    [DWARF_E_NO_ADDR] = N_("no address value"),
Packit Service 97d2fb
    [DWARF_E_NO_CONSTANT] = N_("no constant value"),
Packit Service 97d2fb
    [DWARF_E_NO_REFERENCE] = N_("no reference value"),
Packit Service 97d2fb
    [DWARF_E_INVALID_REFERENCE] = N_("invalid reference value"),
Packit Service 97d2fb
    [DWARF_E_NO_DEBUG_LINE] = N_(".debug_line section missing"),
Packit Service 97d2fb
    [DWARF_E_INVALID_DEBUG_LINE] = N_("invalid .debug_line section"),
Packit Service 97d2fb
    [DWARF_E_TOO_BIG] = N_("debug information too big"),
Packit Service 97d2fb
    [DWARF_E_VERSION] = N_("invalid DWARF version"),
Packit Service 97d2fb
    [DWARF_E_INVALID_DIR_IDX] = N_("invalid directory index"),
Packit Service 97d2fb
    [DWARF_E_ADDR_OUTOFRANGE] = N_("address out of range"),
Packit Service 97d2fb
    [DWARF_E_NO_DEBUG_LOC] = N_(".debug_loc section missing"),
Packit Service 97d2fb
    [DWARF_E_NO_DEBUG_LOCLISTS] = N_(".debug_loclists section missing"),
Packit Service 97d2fb
    [DWARF_E_NO_LOC_VALUE] = N_("not a location list value"),
Packit Service 97d2fb
    [DWARF_E_NO_BLOCK] = N_("no block data"),
Packit Service 97d2fb
    [DWARF_E_INVALID_LINE_IDX] = N_("invalid line index"),
Packit Service 97d2fb
    [DWARF_E_INVALID_ARANGE_IDX] = N_("invalid address range index"),
Packit Service 97d2fb
    [DWARF_E_NO_MATCH] = N_("no matching address range"),
Packit Service 97d2fb
    [DWARF_E_NO_FLAG] = N_("no flag value"),
Packit Service 97d2fb
    [DWARF_E_INVALID_OFFSET] = N_("invalid offset"),
Packit Service 97d2fb
    [DWARF_E_NO_DEBUG_RANGES] = N_(".debug_ranges section missing"),
Packit Service 97d2fb
    [DWARF_E_NO_DEBUG_RNGLISTS] = N_(".debug_rnglists section missing"),
Packit Service 97d2fb
    [DWARF_E_INVALID_CFI] = N_("invalid CFI section"),
Packit Service 97d2fb
    [DWARF_E_NO_ALT_DEBUGLINK] = N_("no alternative debug link found"),
Packit Service 97d2fb
    [DWARF_E_INVALID_OPCODE] = N_("invalid opcode"),
Packit Service 97d2fb
    [DWARF_E_NOT_CUDIE] = N_("not a CU (unit) DIE"),
Packit Service 97d2fb
    [DWARF_E_UNKNOWN_LANGUAGE] = N_("unknown language code"),
Packit Service 97d2fb
    [DWARF_E_NO_DEBUG_ADDR] = N_(".debug_addr section missing"),
Packit Service 97d2fb
  };
Packit Service 97d2fb
#define nerrmsgs (sizeof (errmsgs) / sizeof (errmsgs[0]))
Packit Service 97d2fb
Packit Service 97d2fb
Packit Service 97d2fb
void
Packit Service 97d2fb
internal_function
Packit Service 97d2fb
__libdw_seterrno (int value)
Packit Service 97d2fb
{
Packit Service 97d2fb
  global_error = (value >= 0 && value < (int) nerrmsgs
Packit Service 97d2fb
		  ? value : DWARF_E_UNKNOWN_ERROR);
Packit Service 97d2fb
}
Packit Service 97d2fb
Packit Service 97d2fb
Packit Service 97d2fb
const char *
Packit Service 97d2fb
dwarf_errmsg (int error)
Packit Service 97d2fb
{
Packit Service 97d2fb
  int last_error = global_error;
Packit Service 97d2fb
Packit Service 97d2fb
  if (error == 0)
Packit Service 97d2fb
    return last_error != 0 ? _(errmsgs[last_error]) : NULL;
Packit Service 97d2fb
  else if (error < -1 || error >= (int) nerrmsgs)
Packit Service 97d2fb
    return _(errmsgs[DWARF_E_UNKNOWN_ERROR]);
Packit Service 97d2fb
Packit Service 97d2fb
  return _(errmsgs[error == -1 ? last_error : error]);
Packit Service 97d2fb
}
Packit Service 97d2fb
INTDEF(dwarf_errmsg)