49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Copyright (C) 2000,2002,2004 Silicon Graphics, Inc. All Rights Reserved.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe This program is free software; you can redistribute it and/or modify it
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe under the terms of version 2.1 of the GNU Lesser General Public License
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe as published by the Free Software Foundation.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe This program is distributed in the hope that it would be useful, but
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe WITHOUT ANY WARRANTY; without even the implied warranty of
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Further, this software is distributed without any warranty that it is
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe free of the rightful claim of any third person regarding infringement
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe or the like. Any license provided herein, whether implied or
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe otherwise, applies only to this software file. Patent licenses, if
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe any, provided herein do not apply to combinations of this program with
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe other software, or any other product whatsoever.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe You should have received a copy of the GNU Lesser General Public
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe License along with this program; if not, write the Free Software
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe USA.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Mountain View, CA 94043, or:
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe http://www.sgi.com
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe For further information regarding this notice, see:
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe http://oss.sgi.com/projects/GenInfo/NoticeExplan
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include "config.h"
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include "libdwarfdefs.h"
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#ifdef HAVE_ELF_H
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include <elf.h>
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#endif
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include <stdio.h>
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include <sys/stat.h>
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include <sys/types.h>
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include <stdlib.h>
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include "pro_incl.h"
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Loweextern char *_dwarf_errmsgs[];
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe This function performs error handling as described in the
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe libdwarf consumer document section 3. Dbg is the Dwarf_P_debug
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe structure being processed. Error is a pointer to the pointer
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe to the error descriptor that will be returned. Errval is an
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe error code listed in dwarf_error.h.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowevoid
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe_dwarf_p_error(Dwarf_P_Debug dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Error * error, Dwarf_Word errval)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Error errptr;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* Allow NULL dbg on entry, since sometimes that can happen and we
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe want to report the upper-level error, not this one. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if ((Dwarf_Sword) errval < 0)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe printf("ERROR VALUE: %ld - %s\n",
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (long) errval, _dwarf_errmsgs[-errval - 1]);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (error != NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe errptr = (Dwarf_Error)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_Error_s));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (errptr == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe fprintf(stderr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe "Could not allocate Dwarf_Error structure\n");
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe abort();
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe errptr->er_errval = (Dwarf_Sword) errval;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *error = errptr;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (dbg != NULL && dbg->de_errhand != NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe errptr = (Dwarf_Error)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_Error_s));
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (errptr == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe fprintf(stderr,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe "Could not allocate Dwarf_Error structure\n");
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe abort();
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe errptr->er_errval = (Dwarf_Sword) errval;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_errhand(errptr, dbg->de_errarg);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe abort();
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}