Blame libebl/libebl.h

Packit Service 97d2fb
/* Interface for libebl.
Packit Service 97d2fb
   Copyright (C) 2000-2010, 2013, 2014, 2015, 2016, 2017 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
Packit Service 97d2fb
/* This is the interface for the Elfutils Backend Library.
Packit Service 97d2fb
   It is a completely UNSUPPORTED interface.  Don't use any libebl
Packit Service 97d2fb
   function directly.  These are only for internal elfutils backends
Packit Service 97d2fb
   and tools.  There is NO source or binary compatible guarantee.  */
Packit Service 97d2fb
Packit Service 97d2fb
Packit Service 97d2fb
#ifndef _LIBEBL_H
Packit Service 97d2fb
#define _LIBEBL_H 1
Packit Service 97d2fb
Packit Service 97d2fb
#include <gelf.h>
Packit Service 97d2fb
#include "libdw.h"
Packit Service 97d2fb
#include <stdbool.h>
Packit Service 97d2fb
#include <stddef.h>
Packit Service 97d2fb
#include <stdint.h>
Packit Service 97d2fb
Packit Service 97d2fb
#include "elf-knowledge.h"
Packit Service 97d2fb
Packit Service 97d2fb
Packit Service 97d2fb
/* Opaque type for the handle.  libasm.h defined the same thing.  */
Packit Service 97d2fb
#ifndef _LIBASM_H
Packit Service 97d2fb
typedef struct ebl Ebl;
Packit Service 97d2fb
#endif
Packit Service 97d2fb
Packit Service 97d2fb
Packit Service 97d2fb
#ifdef __cplusplus
Packit Service 97d2fb
extern "C" {
Packit Service 97d2fb
#endif
Packit Service 97d2fb
Packit Service 97d2fb
/* Get backend handle for object associated with ELF handle.  */
Packit Service 97d2fb
extern Ebl *ebl_openbackend (Elf *elf);
Packit Service 97d2fb
/* Similar but without underlying ELF file.  */
Packit Service 97d2fb
extern Ebl *ebl_openbackend_machine (GElf_Half machine);
Packit Service 97d2fb
/* Similar but with emulation name given.  */
Packit Service 97d2fb
extern Ebl *ebl_openbackend_emulation (const char *emulation);
Packit Service 97d2fb
Packit Service 97d2fb
/* Free resources allocated for backend handle.  */
Packit Service 97d2fb
extern void ebl_closebackend (Ebl *bh);
Packit Service 97d2fb
Packit Service 97d2fb
Packit Service 97d2fb
/* Information about the descriptor.  */
Packit Service 97d2fb
Packit Service 97d2fb
/* Get ELF machine.  */
Packit Service 97d2fb
extern int ebl_get_elfmachine (Ebl *ebl) __pure_attribute__;
Packit Service 97d2fb
Packit Service 97d2fb
/* Get ELF class.  */
Packit Service 97d2fb
extern int ebl_get_elfclass (Ebl *ebl) __pure_attribute__;
Packit Service 97d2fb
Packit Service 97d2fb
/* Get ELF data encoding.  */
Packit Service 97d2fb
extern int ebl_get_elfdata (Ebl *ebl) __pure_attribute__;
Packit Service 97d2fb
Packit Service 97d2fb
Packit Service 97d2fb
/* Function to call the callback functions including default ELF
Packit Service 97d2fb
   handling.  */
Packit Service 97d2fb
Packit Service 97d2fb
/* Return backend name.  */
Packit Service 97d2fb
extern const char *ebl_backend_name (Ebl *ebl);
Packit Service 97d2fb
Packit Service 97d2fb
/* Return relocation type name.  */
Packit Service 97d2fb
extern const char *ebl_reloc_type_name (Ebl *ebl, int reloc,
Packit Service 97d2fb
					char *buf, size_t len);
Packit Service 97d2fb
Packit Service 97d2fb
/* Check relocation type.  */
Packit Service 97d2fb
extern bool ebl_reloc_type_check (Ebl *ebl, int reloc);
Packit Service 97d2fb
Packit Service 97d2fb
/* Check relocation type use.  */
Packit Service 97d2fb
extern bool ebl_reloc_valid_use (Ebl *ebl, int reloc);
Packit Service 97d2fb
Packit Service 97d2fb
/* Check if relocation type is for simple absolute relocations.
Packit Service 97d2fb
   Return ELF_T_{BYTE,HALF,SWORD,SXWORD} for a simple type, else ELF_T_NUM.
Packit Service 97d2fb
   If the relocation type is an ADD or SUB relocation, set *ADDSUB to 1 or -1,
Packit Service 97d2fb
   resp.  */
Packit Service 97d2fb
extern Elf_Type ebl_reloc_simple_type (Ebl *ebl, int reloc, int *addsub);
Packit Service 97d2fb
Packit Service 97d2fb
/* Return true if the symbol type is that referencing the GOT.  E.g.,
Packit Service 97d2fb
   R_386_GOTPC.  */
Packit Service 97d2fb
extern bool ebl_gotpc_reloc_check (Ebl *ebl, int reloc);
Packit Service 97d2fb
Packit Service 97d2fb
/* Return segment type name.  */
Packit Service 97d2fb
extern const char *ebl_segment_type_name (Ebl *ebl, int segment,
Packit Service 97d2fb
					  char *buf, size_t len);
Packit Service 97d2fb
Packit Service 97d2fb
/* Return section type name.  */
Packit Service 97d2fb
extern const char *ebl_section_type_name (Ebl *ebl, int section,
Packit Service 97d2fb
					  char *buf, size_t len);
Packit Service 97d2fb
Packit Service 97d2fb
/* Return section name.  */
Packit Service 97d2fb
extern const char *ebl_section_name (Ebl *ebl, int section, int xsection,
Packit Service 97d2fb
				     char *buf, size_t len,
Packit Service 97d2fb
				     const char *scnnames[], size_t shnum);
Packit Service 97d2fb
Packit Service 97d2fb
/* Return machine flag names.  */
Packit Service 97d2fb
extern const char *ebl_machine_flag_name (Ebl *ebl, GElf_Word flags,
Packit Service 97d2fb
					  char *buf, size_t len);
Packit Service 97d2fb
Packit Service 97d2fb
/* Check whether machine flag is valid.  */
Packit Service 97d2fb
extern bool ebl_machine_flag_check (Ebl *ebl, GElf_Word flags);
Packit Service 97d2fb
Packit Service 97d2fb
/* Check whether SHF_MASKPROC flags are valid.  */
Packit Service 97d2fb
extern bool ebl_machine_section_flag_check (Ebl *ebl, GElf_Xword flags);
Packit Service 97d2fb
Packit Service 97d2fb
/* Check whether the section with the given index, header, and name
Packit Service 97d2fb
   is a special machine section that is valid despite a combination
Packit Service 97d2fb
   of flags or other details that are not generically valid.  */
Packit Service 97d2fb
extern bool ebl_check_special_section (Ebl *ebl, int ndx,
Packit Service 97d2fb
				       const GElf_Shdr *shdr, const char *name);
Packit Service 97d2fb
Packit Service 97d2fb
/* Return symbol type name.  */
Packit Service 97d2fb
extern const char *ebl_symbol_type_name (Ebl *ebl, int symbol,
Packit Service 97d2fb
					 char *buf, size_t len);
Packit Service 97d2fb
Packit Service 97d2fb
/* Return symbol binding name.  */
Packit Service 97d2fb
extern const char *ebl_symbol_binding_name (Ebl *ebl, int binding,
Packit Service 97d2fb
					    char *buf, size_t len);
Packit Service 97d2fb
Packit Service 97d2fb
/* Return dynamic tag name.  */
Packit Service 97d2fb
extern const char *ebl_dynamic_tag_name (Ebl *ebl, int64_t tag,
Packit Service 97d2fb
					 char *buf, size_t len);
Packit Service 97d2fb
Packit Service 97d2fb
/* Check dynamic tag.  */
Packit Service 97d2fb
extern bool ebl_dynamic_tag_check (Ebl *ebl, int64_t tag);
Packit Service 97d2fb
Packit Service 97d2fb
/* Check whether given symbol's st_value and st_size are OK despite failing
Packit Service 97d2fb
   normal checks.  */
Packit Service 97d2fb
extern bool ebl_check_special_symbol (Ebl *ebl,
Packit Service 97d2fb
				      const GElf_Sym *sym, const char *name,
Packit Service 97d2fb
				      const GElf_Shdr *destshdr);
Packit Service 97d2fb
Packit Service 97d2fb
/* Check if this is a data marker symbol.  e.g. '$d' symbols for ARM.  */
Packit Service 97d2fb
extern bool ebl_data_marker_symbol (Ebl *ebl, const GElf_Sym *sym,
Packit Service 97d2fb
				    const char *sname);
Packit Service 97d2fb
Packit Service 97d2fb
/* Check whether only valid bits are set on the st_other symbol flag.  */
Packit Service 97d2fb
extern bool ebl_check_st_other_bits (Ebl *ebl, unsigned char st_other);
Packit Service 97d2fb
Packit Service 97d2fb
/* Return symbolic representation of OS ABI.  */
Packit Service 97d2fb
extern const char *ebl_osabi_name (Ebl *ebl, int osabi, char *buf, size_t len);
Packit Service 97d2fb
Packit Service 97d2fb
Packit Service 97d2fb
/* Return name of the note section type for a core file.  */
Packit Service 97d2fb
extern const char *ebl_core_note_type_name (Ebl *ebl, uint32_t type, char *buf,
Packit Service 97d2fb
					    size_t len);
Packit Service 97d2fb
Packit Service 97d2fb
/* Return name of the note section type for an object file.  */
Packit Service 97d2fb
extern const char *ebl_object_note_type_name (Ebl *ebl, const char *name,
Packit Service 97d2fb
					      uint32_t type, GElf_Word descsz,
Packit Service 97d2fb
					      char *buf, size_t len);
Packit Service 97d2fb
Packit Service 97d2fb
/* Print information about object note if available.  */
Packit Service 97d2fb
extern void ebl_object_note (Ebl *ebl, uint32_t namesz, const char *name,
Packit Service 97d2fb
			     uint32_t type, uint32_t descsz, const char *desc);
Packit Service 97d2fb
Packit Service 97d2fb
/* Check whether an attribute in a .gnu_attributes section is recognized.
Packit Service 97d2fb
   Fills in *TAG_NAME with the name for this tag.
Packit Service 97d2fb
   If VALUE is a known value for that tag, also fills in *VALUE_NAME.  */
Packit Service 97d2fb
extern bool ebl_check_object_attribute (Ebl *ebl, const char *vendor,
Packit Service 97d2fb
					int tag, uint64_t value,
Packit Service 97d2fb
					const char **tag_name,
Packit Service 97d2fb
					const char **value_name);
Packit Service 97d2fb
Packit Service 97d2fb
/* Check whether a section type is a valid reloc target.  */
Packit Service 97d2fb
extern bool ebl_check_reloc_target_type (Ebl *ebl, Elf64_Word sh_type);
Packit Service 97d2fb
Packit Service 97d2fb
Packit Service 97d2fb
/* Check section name for being that of a debug informatino section.  */
Packit Service 97d2fb
extern bool ebl_debugscn_p (Ebl *ebl, const char *name);
Packit Service 97d2fb
Packit Service 97d2fb
/* Check whether given relocation is a copy relocation.  */
Packit Service 97d2fb
extern bool ebl_copy_reloc_p (Ebl *ebl, int reloc);
Packit Service 97d2fb
Packit Service 97d2fb
/* Check whether given relocation is a no-op relocation.  */
Packit Service 97d2fb
extern bool ebl_none_reloc_p (Ebl *ebl, int reloc);
Packit Service 97d2fb
Packit Service 97d2fb
/* Check whether given relocation is a relative relocation.  */
Packit Service 97d2fb
extern bool ebl_relative_reloc_p (Ebl *ebl, int reloc);
Packit Service 97d2fb
Packit Service 97d2fb
/* Check whether section should be stripped.  */
Packit Service 97d2fb
extern bool ebl_section_strip_p (Ebl *ebl,
Packit Service 97d2fb
				 const GElf_Shdr *shdr, const char *name,
Packit Service 97d2fb
				 bool remove_comment, bool only_remove_debug);
Packit Service 97d2fb
Packit Service 97d2fb
/* Check if backend uses a bss PLT in this file.  */
Packit Service 97d2fb
extern bool ebl_bss_plt_p (Ebl *ebl);
Packit Service 97d2fb
Packit Service 97d2fb
/* Return size of entry in SysV-style hash table.  */
Packit Service 97d2fb
extern int ebl_sysvhash_entrysize (Ebl *ebl);
Packit Service 97d2fb
Packit Service 97d2fb
/* Return location expression to find return value given a
Packit Service 97d2fb
   DW_TAG_subprogram, DW_TAG_subroutine_type, or similar DIE describing
Packit Service 97d2fb
   function itself (whose DW_AT_type attribute describes its return type).
Packit Service 97d2fb
   Returns -1 for a libdw error (see dwarf_errno).
Packit Service 97d2fb
   Returns -2 for an unrecognized type formation.
Packit Service 97d2fb
   Returns zero if the function has no return value (e.g. "void" in C).
Packit Service 97d2fb
   Otherwise, *LOCOPS gets a location expression to find the return value,
Packit Service 97d2fb
   and returns the number of operations in the expression.  The pointer is
Packit Service 97d2fb
   permanently allocated at least as long as the Ebl handle is open.  */
Packit Service 97d2fb
extern int ebl_return_value_location (Ebl *ebl,
Packit Service 97d2fb
				      Dwarf_Die *functypedie,
Packit Service 97d2fb
				      const Dwarf_Op **locops);
Packit Service 97d2fb
Packit Service 97d2fb
/* Fill in register information given DWARF register numbers.
Packit Service 97d2fb
   If NAME is null, return the maximum REGNO + 1 that has a name.
Packit Service 97d2fb
   Otherwise, store in NAME the name for DWARF register number REGNO
Packit Service 97d2fb
   and return the number of bytes written (including '\0' terminator).
Packit Service 97d2fb
   Return -1 if NAMELEN is too short or REGNO is negative or too large.
Packit Service 97d2fb
   Return 0 if REGNO is unused (a gap in the DWARF number assignment).
Packit Service 97d2fb
   On success, set *SETNAME to a description like "integer" or "FPU"
Packit Service 97d2fb
   fit for "%s registers" title display, and *PREFIX to the string
Packit Service 97d2fb
   that precedes NAME in canonical assembler syntax (e.g. "%" or "$").
Packit Service 97d2fb
   The NAME string contains identifier characters only (maybe just digits).  */
Packit Service 97d2fb
extern ssize_t ebl_register_info (Ebl *ebl,
Packit Service 97d2fb
				  int regno, char *name, size_t namelen,
Packit Service 97d2fb
				  const char **prefix, const char **setname,
Packit Service 97d2fb
				  int *bits, int *type);
Packit Service 97d2fb
Packit Service 97d2fb
/* Supply the ABI-specified state of DWARF CFI before CIE initial programs.
Packit Service 97d2fb
Packit Service 97d2fb
   The DWARF 3.0 spec says that the default initial states of all registers
Packit Service 97d2fb
   are "undefined", unless otherwise specified by the machine/compiler ABI.
Packit Service 97d2fb
Packit Service 97d2fb
   This default is wrong for every machine with the CFI generated by GCC.
Packit Service 97d2fb
   The EH unwinder does not really distinguish "same_value" and "undefined",
Packit Service 97d2fb
   since it doesn't matter for unwinding (in either case there is no change
Packit Service 97d2fb
   to make for that register).  GCC generates CFI that says nothing at all
Packit Service 97d2fb
   about registers it hasn't spilled somewhere.  For our unwinder to give
Packit Service 97d2fb
   the true story, the backend must supply an initial state that uses
Packit Service 97d2fb
   "same_value" rules for all the callee-saves registers.
Packit Service 97d2fb
Packit Service 97d2fb
   This can fill in the initial_instructions, initial_instructions_end
Packit Service 97d2fb
   members of *ABI_INFO to point at a CFI instruction stream to process
Packit Service 97d2fb
   before each CIE's initial instructions.  It should set the
Packit Service 97d2fb
   data_alignment_factor member if it affects the initial instructions.
Packit Service 97d2fb
Packit Service 97d2fb
   The callback should not use the register rules DW_CFA_expression or
Packit Service 97d2fb
   DW_CFA_val_expression.  Defining the CFA using DW_CFA_def_cfa_expression
Packit Service 97d2fb
   is allowed.  This is an implementation detail since register rules
Packit Service 97d2fb
   store expressions as offsets from the .eh_frame or .debug_frame data.
Packit Service 97d2fb
Packit Service 97d2fb
   As a shorthand for some common cases, for this instruction stream
Packit Service 97d2fb
   we overload some CFI instructions that cannot be used in a CIE:
Packit Service 97d2fb
Packit Service 97d2fb
	DW_CFA_restore		-- Change default rule for all unmentioned
Packit Service 97d2fb
				   registers from undefined to same_value.
Packit Service 97d2fb
Packit Service 97d2fb
   This function can also fill in ABI_INFO->return_address_register with the
Packit Service 97d2fb
   DWARF register number that identifies the actual PC in machine state.
Packit Service 97d2fb
   If there is no canonical DWARF register number with that meaning, it's
Packit Service 97d2fb
   left unchanged (callers usually initialize with (Dwarf_Word) -1).
Packit Service 97d2fb
   This value is not used by CFI per se.
Packit Service 97d2fb
Packit Service 97d2fb
   Function returns 0 on success and -1 for error or unsupported by the
Packit Service 97d2fb
   backend.  */
Packit Service 97d2fb
extern int ebl_abi_cfi (Ebl *ebl, Dwarf_CIE *abi_info)
Packit Service 97d2fb
  __nonnull_attribute__ (2);
Packit Service 97d2fb
Packit Service 97d2fb
/* Register map info. */
Packit Service 97d2fb
typedef struct
Packit Service 97d2fb
{
Packit Service 97d2fb
  Dwarf_Half offset;		/* Byte offset in register data block.  */
Packit Service 97d2fb
  Dwarf_Half regno;		/* DWARF register number.  */
Packit Service 97d2fb
  uint8_t bits;			/* Bits of data for one register.  */
Packit Service 97d2fb
  uint8_t pad;			/* Bytes of padding after register's data.  */
Packit Service 97d2fb
  Dwarf_Half count;		/* Consecutive register numbers here.  */
Packit Service 97d2fb
  bool pc_register;
Packit Service 97d2fb
} Ebl_Register_Location;
Packit Service 97d2fb
Packit Service 97d2fb
/* Non-register data items in core notes.  */
Packit Service 97d2fb
typedef struct
Packit Service 97d2fb
{
Packit Service 97d2fb
  const char *name;		/* Printable identifier.  */
Packit Service 97d2fb
  const char *group;		/* Identifier for category of related items.  */
Packit Service 97d2fb
  Dwarf_Half offset;		/* Byte offset in note data.  */
Packit Service 97d2fb
  Dwarf_Half count;
Packit Service 97d2fb
  Elf_Type type;
Packit Service 97d2fb
  char format;
Packit Service 97d2fb
  bool thread_identifier;
Packit Service 97d2fb
  bool pc_register;
Packit Service 97d2fb
} Ebl_Core_Item;
Packit Service 97d2fb
Packit Service 97d2fb
/* Describe the format of a core file note with the given header and NAME.
Packit Service 97d2fb
   NAME is not guaranteed terminated, it's NHDR->n_namesz raw bytes.  */
Packit Service 97d2fb
extern int ebl_core_note (Ebl *ebl, const GElf_Nhdr *nhdr,
Packit Service 97d2fb
			  const char *name, const char *desc,
Packit Service 97d2fb
			  GElf_Word *regs_offset, size_t *nregloc,
Packit Service 97d2fb
			  const Ebl_Register_Location **reglocs,
Packit Service 97d2fb
			  size_t *nitems, const Ebl_Core_Item **items)
Packit Service 97d2fb
  __nonnull_attribute__ (1, 2, 3, 4, 5, 6, 7, 8);
Packit Service 97d2fb
Packit Service 97d2fb
/* Describe the auxv type number.  */
Packit Service 97d2fb
extern int ebl_auxv_info (Ebl *ebl, GElf_Xword a_type,
Packit Service 97d2fb
			  const char **name, const char **format)
Packit Service 97d2fb
  __nonnull_attribute__ (1, 3, 4);
Packit Service 97d2fb
Packit Service 97d2fb
/* Callback type for ebl_set_initial_registers_tid.
Packit Service 97d2fb
   Register -1 is mapped to PC (if arch PC has no DWARF number).
Packit Service 97d2fb
   If FIRSTREG is -1 then NREGS has to be 1.  */
Packit Service 97d2fb
typedef bool (ebl_tid_registers_t) (int firstreg, unsigned nregs,
Packit Service 97d2fb
				    const Dwarf_Word *regs, void *arg)
Packit Service 97d2fb
  __nonnull_attribute__ (3);
Packit Service 97d2fb
Packit Service 97d2fb
/* Callback to fetch process data from live TID.
Packit Service 97d2fb
   EBL architecture has to have EBL_FRAME_NREGS > 0, otherwise the
Packit Service 97d2fb
   backend doesn't support unwinding and this function call may crash.  */
Packit Service 97d2fb
extern bool ebl_set_initial_registers_tid (Ebl *ebl,
Packit Service 97d2fb
					   pid_t tid,
Packit Service 97d2fb
					   ebl_tid_registers_t *setfunc,
Packit Service 97d2fb
					   void *arg)
Packit Service 97d2fb
  __nonnull_attribute__ (1, 3);
Packit Service 97d2fb
Packit Service 97d2fb
/* Number of registers to allocate for ebl_set_initial_registers_tid.
Packit Service 97d2fb
   EBL architecture can unwind iff EBL_FRAME_NREGS > 0.  */
Packit Service 97d2fb
extern size_t ebl_frame_nregs (Ebl *ebl)
Packit Service 97d2fb
  __nonnull_attribute__ (1);
Packit Service 97d2fb
Packit Service 97d2fb
/* Offset to apply to the value of the return_address_register, as
Packit Service 97d2fb
   fetched from a Dwarf CFI.  This is used by some backends, where the
Packit Service 97d2fb
   return_address_register actually contains the call address.  */
Packit Service 97d2fb
extern int ebl_ra_offset (Ebl *ebl)
Packit Service 97d2fb
  __nonnull_attribute__ (1);
Packit Service 97d2fb
Packit Service 97d2fb
/* Mask to use for function symbol or unwind return addresses in case
Packit Service 97d2fb
   the architecture adds some extra non-address bits to it.  This is
Packit Service 97d2fb
   different from ebl_resolve_sym_value which only works for actual
Packit Service 97d2fb
   symbol addresses (in non-ET_REL files) that might resolve to an
Packit Service 97d2fb
   address in a different section.  ebl_func_addr_mask is called to
Packit Service 97d2fb
   turn a given function value into the a real address or offset (the
Packit Service 97d2fb
   original value might not be a real address).  This works for all
Packit Service 97d2fb
   cases where an actual function address (or offset in ET_REL symbol
Packit Service 97d2fb
   tables) is needed.  */
Packit Service 97d2fb
extern GElf_Addr ebl_func_addr_mask (Ebl *ebl);
Packit Service 97d2fb
Packit Service 97d2fb
/* Convert *REGNO as is in DWARF to a lower range suitable for
Packit Service 97d2fb
   Dwarf_Frame->REGS indexing.  */
Packit Service 97d2fb
extern bool ebl_dwarf_to_regno (Ebl *ebl, unsigned *regno)
Packit Service 97d2fb
  __nonnull_attribute__ (1, 2);
Packit Service 97d2fb
Packit Service 97d2fb
/* Modify PC as fetched from inferior data into valid PC.  */
Packit Service 97d2fb
extern void ebl_normalize_pc (Ebl *ebl, Dwarf_Addr *pc)
Packit Service 97d2fb
  __nonnull_attribute__ (1, 2);
Packit Service 97d2fb
Packit Service 97d2fb
/* Callback type for ebl_unwind's parameter getfunc.  */
Packit Service 97d2fb
typedef bool (ebl_tid_registers_get_t) (int firstreg, unsigned nregs,
Packit Service 97d2fb
					Dwarf_Word *regs, void *arg)
Packit Service 97d2fb
  __nonnull_attribute__ (3);
Packit Service 97d2fb
Packit Service 97d2fb
/* Callback type for ebl_unwind's parameter readfunc.  */
Packit Service 97d2fb
typedef bool (ebl_pid_memory_read_t) (Dwarf_Addr addr, Dwarf_Word *data,
Packit Service 97d2fb
				      void *arg)
Packit Service 97d2fb
  __nonnull_attribute__ (3);
Packit Service 97d2fb
Packit Service 97d2fb
/* Get previous frame state for an existing frame state.  Method is called only
Packit Service 97d2fb
   if unwinder could not find CFI for current PC.  PC is for the
Packit Service 97d2fb
   existing frame.  SETFUNC sets register in the previous frame.  GETFUNC gets
Packit Service 97d2fb
   register from the existing frame.  Note that GETFUNC vs. SETFUNC act on
Packit Service 97d2fb
   a disjunct set of registers.  READFUNC reads memory.  ARG has to be passed
Packit Service 97d2fb
   for SETFUNC, GETFUNC and READFUNC.  *SIGNAL_FRAMEP is initialized to false,
Packit Service 97d2fb
   it can be set to true if existing frame is a signal frame.  SIGNAL_FRAMEP is
Packit Service 97d2fb
   never NULL.  */
Packit Service 97d2fb
extern bool ebl_unwind (Ebl *ebl, Dwarf_Addr pc, ebl_tid_registers_t *setfunc,
Packit Service 97d2fb
			ebl_tid_registers_get_t *getfunc,
Packit Service 97d2fb
			ebl_pid_memory_read_t *readfunc, void *arg,
Packit Service 97d2fb
			bool *signal_framep)
Packit Service 97d2fb
  __nonnull_attribute__ (1, 3, 4, 5, 7);
Packit Service 97d2fb
Packit Service 97d2fb
/* Returns true if the value can be resolved to an address in an
Packit Service 97d2fb
   allocated section, which will be returned in *ADDR
Packit Service 97d2fb
   (e.g. function descriptor resolving)  */
Packit Service 97d2fb
extern bool ebl_resolve_sym_value (Ebl *ebl, GElf_Addr *addr)
Packit Service 97d2fb
   __nonnull_attribute__ (2);
Packit Service 97d2fb
Packit Service 97d2fb
#ifdef __cplusplus
Packit Service 97d2fb
}
Packit Service 97d2fb
#endif
Packit Service 97d2fb
Packit Service 97d2fb
#endif	/* libebl.h */