/* Backend hook signatures internal interface for libebl.
   Copyright (C) 2000-2011, 2013, 2014, 2016, 2017 Red Hat, Inc.
   This file is part of elfutils.

   This file is free software; you can redistribute it and/or modify
   it under the terms of either

     * the GNU Lesser General Public License as published by the Free
       Software Foundation; either version 3 of the License, or (at
       your option) any later version

   or

     * the GNU General Public License as published by the Free
       Software Foundation; either version 2 of the License, or (at
       your option) any later version

   or both in parallel, as here.

   elfutils is distributed in the hope that it will be useful, but
   WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   General Public License for more details.

   You should have received copies of the GNU General Public License and
   the GNU Lesser General Public License along with this program.  If
   not, see <http://www.gnu.org/licenses/>.  */

/* Return symbolic representation of relocation type.  */
const char *EBLHOOK(reloc_type_name) (int, char *, size_t);

/* Check relocation type.  */
bool EBLHOOK(reloc_type_check) (int);

/* Check if relocation type is for simple absolute relocations.  */
Elf_Type EBLHOOK(reloc_simple_type) (Ebl *, int);

/* Check relocation type use.  */
bool EBLHOOK(reloc_valid_use) (Elf *, int);

/* Return true if the symbol type is that referencing the GOT.  */
bool EBLHOOK(gotpc_reloc_check) (Elf *, int);

/* Return symbolic representation of segment type.  */
const char *EBLHOOK(segment_type_name) (int, char *, size_t);

/* Return symbolic representation of section type.  */
const char *EBLHOOK(section_type_name) (int, char *, size_t);

/* Return section name.  */
const char *EBLHOOK(section_name) (int, int, char *, size_t);

/* Return next machine flag name.  */
const char *EBLHOOK(machine_flag_name) (GElf_Word *);

/* Check whether machine flags are valid.  */
bool EBLHOOK(machine_flag_check) (GElf_Word);

/* Check whether SHF_MASKPROC flag bits are valid.  */
bool EBLHOOK(machine_section_flag_check) (GElf_Xword);

/* Check whether the section with the given index, header, and name
   is a special machine section that is valid despite a combination
   of flags or other details that are not generically valid.  */
bool EBLHOOK(check_special_section) (Ebl *, int,
				     const GElf_Shdr *, const char *);

/* Return symbolic representation of symbol type.  */
const char *EBLHOOK(symbol_type_name) (int, char *, size_t);

/* Return symbolic representation of symbol binding.  */
const char *EBLHOOK(symbol_binding_name) (int, char *, size_t);

/* Return symbolic representation of dynamic tag.  */
const char *EBLHOOK(dynamic_tag_name) (int64_t, char *, size_t);

/* Check dynamic tag.  */
bool EBLHOOK(dynamic_tag_check) (int64_t);

/* Return symbolic representation of OS ABI.  */
const char *EBLHOOK(osabi_name) (int, char *, size_t);

/* Name of a note entry type for core files.  */
const char *EBLHOOK(core_note_type_name) (uint32_t, char *, size_t);

/* Name of a note entry type for object files.  */
const char *EBLHOOK(object_note_type_name) (const char *, uint32_t,
					    char *, size_t);

/* Describe core note format.  */
int EBLHOOK(core_note) (const GElf_Nhdr *, const char *,
			GElf_Word *, size_t *, const Ebl_Register_Location **,
			size_t *, const Ebl_Core_Item **);

/* Handle object file note.  */
bool EBLHOOK(object_note) (const char *, uint32_t, uint32_t, const char *);

/* Check object attribute.  */
bool EBLHOOK(check_object_attribute) (Ebl *, const char *, int, uint64_t,
				      const char **, const char **);

/* Check reloc target section type.  */
bool EBLHOOK(check_reloc_target_type) (Ebl *, Elf64_Word);

/* Describe auxv element type.  */
int EBLHOOK(auxv_info) (GElf_Xword, const char **, const char **);

/* Check section name for being that of a debug informatino section.  */
bool EBLHOOK(debugscn_p) (const char *);

/* Check whether given relocation is a copy relocation.  */
bool EBLHOOK(copy_reloc_p) (int);

/* Check whether given relocation is a no-op relocation.  */
bool EBLHOOK(none_reloc_p) (int);

/* Check whether given relocation is a relative relocation.  */
bool EBLHOOK(relative_reloc_p) (int);

/* Check whether given symbol's value is ok despite normal checks.  */
bool EBLHOOK(check_special_symbol) (Elf *, GElf_Ehdr *, const GElf_Sym *,
			      const char *, const GElf_Shdr *);

/* Check if this is a data marker symbol.  e.g. '$d' symbols for ARM.  */
bool EBLHOOK(data_marker_symbol) (const GElf_Sym *sym, const char *sname);

/* Check whether only valid bits are set on the st_other symbol flag.
   Standard ST_VISIBILITY have already been masked off.  */
bool EBLHOOK(check_st_other_bits) (unsigned char st_other);

/* Check if backend uses a bss PLT in this file.  */
bool EBLHOOK(bss_plt_p) (Elf *);

/* Return location expression to find return value given the
   DW_AT_type DIE of a DW_TAG_subprogram DIE.  */
int EBLHOOK(return_value_location) (Dwarf_Die *functypedie,
				    const Dwarf_Op **locp);

/* Return register name information.  */
ssize_t EBLHOOK(register_info) (Ebl *ebl,
				int regno, char *name, size_t namelen,
				const char **prefix, const char **setname,
				int *bits, int *type);

/* Return system call ABI registers.  */
int EBLHOOK(syscall_abi) (Ebl *ebl, int *sp, int *pc,
			  int *callno, int args[6]);

/* Disassembler function.  */
int EBLHOOK(disasm) (Ebl *ebl, const uint8_t **startp, const uint8_t *end,
		     GElf_Addr addr, const char *fmt, DisasmOutputCB_t outcb,
		     DisasmGetSymCB_t symcb, void *outcbarg, void *symcbarg);

/* Supply the machine-specific state of CFI before CIE initial programs.
   Function returns 0 on success and -1 on error.  */
int EBLHOOK(abi_cfi) (Ebl *ebl, Dwarf_CIE *abi_info);

/* Fetch process data from live TID and call SETFUNC one or more times.
   Method should be present only when EBL_FRAME_NREGS > 0, otherwise the
   backend doesn't support unwinding.  */
bool EBLHOOK(set_initial_registers_tid) (pid_t tid,
					 ebl_tid_registers_t *setfunc,
					 void *arg);

/* Convert *REGNO as is in DWARF to a lower range suitable for
   Dwarf_Frame->REGS indexing.  */
bool EBLHOOK(dwarf_to_regno) (Ebl *ebl, unsigned *regno);

/* Optionally modify *PC as fetched from inferior data into valid PC
   instruction pointer.  */
void EBLHOOK(normalize_pc) (Ebl *ebl, Dwarf_Addr *pc);

/* Get previous frame state for an existing frame state.  Method is called only
   if unwinder could not find CFI for current PC.  PC is for the
   existing frame.  SETFUNC sets register in the previous frame.  GETFUNC gets
   register from the existing frame.  Note that GETFUNC vs. SETFUNC act on
   a disjunct set of registers.  READFUNC reads memory.  ARG has to be passed
   for SETFUNC, GETFUNC and READFUNC.  *SIGNAL_FRAMEP is initialized to false,
   it can be set to true if existing frame is a signal frame.  SIGNAL_FRAMEP is
   never NULL.  */
bool EBLHOOK(unwind) (Ebl *ebl, Dwarf_Addr pc, ebl_tid_registers_t *setfunc,
		      ebl_tid_registers_get_t *getfunc,
		      ebl_pid_memory_read_t *readfunc, void *arg,
		      bool *signal_framep);

/* Returns true if the value can be resolved to an address in an
   allocated section, which will be returned in *ADDR.
   (e.g. function descriptor resolving)  */
bool EBLHOOK(resolve_sym_value) (Ebl *ebl, GElf_Addr *addr);

/* Destructor for ELF backend handle.  */
void EBLHOOK(destr) (struct ebl *);
