Dwarf_CIE abi_info;
if (ebl_abi_cfi (ebl, &abi_info) != 0)
{
- __libdwfl_seterrno (DWFL_E_UNKNOWN_ERROR);
+ __libdwfl_seterrno (DWFL_E_LIBEBL);
return false;
}
unsigned ra = abi_info.return_address_register;
/* dwarf_frame_state_reg_is_set is not applied here. */
if (ra >= ebl_frame_state_nregs (ebl))
{
- __libdwfl_seterrno (DWFL_E_UNKNOWN_ERROR);
+ __libdwfl_seterrno (DWFL_E_LIBEBL_BAD);
return false;
}
state->pc = state->regs[ra];
*result = *(const uint32_t *) data->d_buf;
return true;
}
- __libdwfl_seterrno (DWFL_E_UNKNOWN_ERROR);
+ __libdwfl_seterrno (DWFL_E_CORE_MISSING);
return false;
}
if (thread == NULL)
{
__libdwfl_process_free (process);
- __libdwfl_seterrno (DWFL_E_UNKNOWN_ERROR);
+ __libdwfl_seterrno (DWFL_E_NOMEM);
return NULL;
}
}
}
if (ebl == NULL || nregs > ebl_frame_state_nregs (ebl))
{
- __libdwfl_seterrno (DWFL_E_UNKNOWN_ERROR);
+ __libdwfl_seterrno (DWFL_E_LIBEBL_BAD);
return NULL;
}
Dwfl_Frame_State_Process *process;
if (thread == NULL)
{
__libdwfl_process_free (process);
- __libdwfl_seterrno (DWFL_E_UNKNOWN_ERROR);
+ __libdwfl_seterrno (DWFL_E_NOMEM);
return NULL;
}
Dwfl_Frame_State *state = thread->unwound;
&& ! dwfl_frame_state_reg_set (state, regno, regs[regno]))
{
__libdwfl_process_free (process);
- __libdwfl_seterrno (DWFL_E_UNKNOWN_ERROR);
+ __libdwfl_seterrno (DWFL_E_INVALID_REGISTER);
return NULL;
}
- if (! ebl_frame_state (state) || ! __libdwfl_state_fetch_pc (state))
+ if (! ebl_frame_state (state))
+ {
+ __libdwfl_process_free (process);
+ __libdwfl_seterrno (DWFL_E_LIBEBL);
+ return NULL;
+ }
+ if (! __libdwfl_state_fetch_pc (state))
{
__libdwfl_process_free (process);
- __libdwfl_seterrno (DWFL_E_UNKNOWN_ERROR);
return NULL;
}
return process->thread->unwound;
(void *) (uintptr_t) addr, NULL);
if (errno != 0)
{
- __libdwfl_seterrno (DWFL_E_UNKNOWN_ERROR);
+ __libdwfl_seterrno (DWFL_E_PROCESS_MEMORY_READ);
return false;
}
return true;
(void *) (uintptr_t) addr, NULL);
if (errno != 0)
{
- __libdwfl_seterrno (DWFL_E_UNKNOWN_ERROR);
+ __libdwfl_seterrno (DWFL_E_PROCESS_MEMORY_READ);
return false;
}
#if SIZEOF_LONG == 8
}
if (process->ebl == NULL)
{
- /* Not idenified EBL from any of the modules. */
+ /* Not identified EBL from any of the modules. */
__libdwfl_process_free (process);
- __libdwfl_seterrno (DWFL_E_UNKNOWN_ERROR);
+ __libdwfl_seterrno (DWFL_E_PROCESS_NO_ARCH);
return NULL;
}
DIR *dir = opendir (dirname);
if (dir == NULL)
{
__libdwfl_process_free (process);
- __libdwfl_seterrno (DWFL_E_ERRNO);
+ __libdwfl_seterrno (DWFL_E_PARSE_PROC);
return NULL;
}
for (;;)
if (errno == 0)
break;
__libdwfl_process_free (process);
- __libdwfl_seterrno (DWFL_E_ERRNO);
+ __libdwfl_seterrno (DWFL_E_PARSE_PROC);
return NULL;
}
if (strcmp (dirent->d_name, ".") == 0
if (errno != 0)
{
__libdwfl_process_free (process);
- __libdwfl_seterrno (DWFL_E_ERRNO);
+ __libdwfl_seterrno (DWFL_E_PARSE_PROC);
return NULL;
}
pid_t tid = tidl;
if (tidl <= 0 || (end && *end) || tid != tidl)
{
__libdwfl_process_free (process);
- __libdwfl_seterrno (DWFL_E_UNKNOWN_ERROR);
+ __libdwfl_seterrno (DWFL_E_PARSE_PROC);
return NULL;
}
Dwfl_Frame_State_Thread *thread = __libdwfl_thread_alloc (process, tid);
if (thread == NULL)
{
__libdwfl_process_free (process);
- __libdwfl_seterrno (DWFL_E_UNKNOWN_ERROR);
+ __libdwfl_seterrno (DWFL_E_NOMEM);
return NULL;
}
if (! tid_is_attached (dwfl, thread->tid))
if (closedir (dir) != 0)
{
__libdwfl_process_free (process);
- __libdwfl_seterrno (DWFL_E_ERRNO);
+ __libdwfl_seterrno (DWFL_E_PARSE_PROC);
return NULL;
}
if (process->thread == NULL)
{
/* No valid threads recognized. */
__libdwfl_process_free (process);
- __libdwfl_seterrno (DWFL_E_UNKNOWN_ERROR);
+ __libdwfl_seterrno (DWFL_E_NO_THREAD);
return NULL;
}
return process->thread->unwound;
{
if (! dwfl_frame_state_reg_get (state, regno, val))
{
- __libdwfl_seterrno (DWFL_E_UNKNOWN_ERROR);
+ __libdwfl_seterrno (DWFL_E_INVALID_REGISTER);
return false;
}
return true;
Dwfl_Frame_State_Process *process = state->thread->process;
if (nops == 0)
{
- __libdwfl_seterrno (DWFL_E_UNKNOWN_ERROR);
+ __libdwfl_seterrno (DWFL_E_INVALID_DWARF);
return false;
}
Dwarf_Addr *stack = NULL;
Dwarf_Addr *stack_new = realloc (stack, stack_allocated * sizeof (*stack));
if (stack_new == NULL)
{
- __libdwfl_seterrno (DWFL_E_UNKNOWN_ERROR);
+ __libdwfl_seterrno (DWFL_E_NOMEM);
return false;
}
stack = stack_new;
{
if (stack_used == 0)
{
- __libdwfl_seterrno (DWFL_E_UNKNOWN_ERROR);
+ __libdwfl_seterrno (DWFL_E_INVALID_DWARF);
return false;
}
*val = stack[--stack_used];
{
free (stack);
/* PPC32 vDSO has such invalid operations. */
- __libdwfl_seterrno (DWFL_E_UNKNOWN_ERROR);
+ __libdwfl_seterrno (DWFL_E_INVALID_DWARF);
return false;
}
/* Undo the 'for' statement increment. */
BINOP_SIGNED (DW_OP_ne, !=)
#undef BINOP_SIGNED
default:
- __libdwfl_seterrno (DWFL_E_UNKNOWN_ERROR);
+ __libdwfl_seterrno (DWFL_E_UNSUPPORTED_DWARF);
return false;
}
if (! pop (result))
switch (unwound->pc_state)
{
case DWFL_FRAME_STATE_ERROR:
- __libdwfl_seterrno (DWFL_E_UNKNOWN_ERROR);
+ __libdwfl_seterrno (DWFL_E_INVALID_DWARF);
*statep = NULL;
return false;
case DWFL_FRAME_STATE_PC_SET:
const char *symname = INTUSE(dwfl_module_addrsym) (mod, pc, &sym, NULL);
if (symname == NULL)
{
- __libdwfl_seterrno (DWFL_E_UNKNOWN_ERROR);
+ __libdwfl_seterrno (DWFL_E_NO_DWARF);
return false;
}
/* It has no FDE on PPC64; it can be still unwound via the stack frame. */
}
if (pc < ehdr->e_entry + bias)
{
- __libdwfl_seterrno (DWFL_E_UNKNOWN_ERROR);
+ __libdwfl_seterrno (DWFL_E_NO_DWARF);
return false;
}
/* "_start" is size-less. Search for PC, if the closest symbol is the one
if (sym.st_value != ehdr->e_entry + bias
|| (sym.st_size != 0 && pc >= sym.st_value + sym.st_size))
{
- __libdwfl_seterrno (DWFL_E_UNKNOWN_ERROR);
+ __libdwfl_seterrno (DWFL_E_NO_DWARF);
return false;
}
return true;
}
else
{
- __libdwfl_seterrno (DWFL_E_UNKNOWN_ERROR);
+ __libdwfl_seterrno (DWFL_E_INVALID_DWARF);
continue;
}
}
}
if (! dwfl_frame_state_reg_set (unwound, regno, regval))
{
- __libdwfl_seterrno (DWFL_E_UNKNOWN_ERROR);
+ __libdwfl_seterrno (DWFL_E_INVALID_REGISTER);
continue;
}
}
DWFL_ERROR (BADELF, N_("not a valid ELF file")) \
DWFL_ERROR (WEIRD_TYPE, N_("cannot handle DWARF type description")) \
DWFL_ERROR (WRONG_ID_ELF, N_("ELF file does not match build ID")) \
- DWFL_ERROR (BAD_PRELINK, N_("corrupt .gnu.prelink_undo section data"))
+ DWFL_ERROR (BAD_PRELINK, N_("corrupt .gnu.prelink_undo section data")) \
+ DWFL_ERROR (LIBEBL_BAD, N_("Internal error due to ebl")) \
+ DWFL_ERROR (CORE_MISSING, N_("Missing data in core file")) \
+ DWFL_ERROR (INVALID_REGISTER, N_("Invalid register")) \
+ DWFL_ERROR (PROCESS_MEMORY_READ, N_("Error reading process memory")) \
+ DWFL_ERROR (PROCESS_NO_ARCH, N_("Have not found ELF module in a process")) \
+ DWFL_ERROR (PARSE_PROC, N_("Error parsing /proc filesystem")) \
+ DWFL_ERROR (NO_THREAD, N_("No thread found")) \
+ DWFL_ERROR (INVALID_DWARF, N_("Invalid DWARF")) \
+ DWFL_ERROR (UNSUPPORTED_DWARF, N_("Unsupported DWARF"))
#define DWFL_ERROR(name, text) DWFL_E_##name,
typedef enum { DWFL_ERRORS DWFL_E_NUM } Dwfl_Error;