Blame libasm/libasmP.h.libasm-ebl

Packit 5f0dbf
/* Internal definitions for libasm.
Packit 5f0dbf
   Copyright (C) 2002, 2004, 2005, 2016 Red Hat, Inc.
Packit 5f0dbf
   This file is part of elfutils.
Packit 5f0dbf
Packit 5f0dbf
   This file is free software; you can redistribute it and/or modify
Packit 5f0dbf
   it under the terms of either
Packit 5f0dbf
Packit 5f0dbf
     * the GNU Lesser General Public License as published by the Free
Packit 5f0dbf
       Software Foundation; either version 3 of the License, or (at
Packit 5f0dbf
       your option) any later version
Packit 5f0dbf
Packit 5f0dbf
   or
Packit 5f0dbf
Packit 5f0dbf
     * the GNU General Public License as published by the Free
Packit 5f0dbf
       Software Foundation; either version 2 of the License, or (at
Packit 5f0dbf
       your option) any later version
Packit 5f0dbf
Packit 5f0dbf
   or both in parallel, as here.
Packit 5f0dbf
Packit 5f0dbf
   elfutils is distributed in the hope that it will be useful, but
Packit 5f0dbf
   WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 5f0dbf
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 5f0dbf
   General Public License for more details.
Packit 5f0dbf
Packit 5f0dbf
   You should have received copies of the GNU General Public License and
Packit 5f0dbf
   the GNU Lesser General Public License along with this program.  If
Packit 5f0dbf
   not, see <http://www.gnu.org/licenses/>.  */
Packit 5f0dbf
Packit 5f0dbf
#ifndef _LIBASMP_H
Packit 5f0dbf
#define _LIBASMP_H 1
Packit 5f0dbf
Packit 5f0dbf
#include <stdio.h>
Packit 5f0dbf
Packit 5f0dbf
#include <libasm.h>
Packit 5f0dbf
Packit 5f0dbf
#include "libdwelf.h"
Packit 5f0dbf
Packit 5f0dbf
/* gettext helper macros.  */
Packit 5f0dbf
#define _(Str) dgettext ("elfutils", Str)
Packit 5f0dbf
Packit 5f0dbf
Packit 5f0dbf
/* Known error codes.  */
Packit 5f0dbf
enum
Packit 5f0dbf
  {
Packit 5f0dbf
    ASM_E_NOERROR,
Packit 5f0dbf
    ASM_E_NOMEM,		/* No more memory.  */
Packit 5f0dbf
    ASM_E_CANNOT_CREATE,	/* Output file cannot be created.  */
Packit 5f0dbf
    ASM_E_INVALID,		/* Invalid parameters.  */
Packit 5f0dbf
    ASM_E_CANNOT_CHMOD,		/* Cannot change mode of output file.  */
Packit 5f0dbf
    ASM_E_CANNOT_RENAME,	/* Cannot rename output file.  */
Packit 5f0dbf
    ASM_E_DUPLSYM,		/* Duplicate symbol definition.  */
Packit 5f0dbf
    ASM_E_LIBELF,		/* Refer to error in libelf.  */
Packit 5f0dbf
    ASM_E_TYPE,			/* Invalid section type for operation.  */
Packit 5f0dbf
    ASM_E_IOERROR,		/* Error during output of data.  */
Packit 5f0dbf
    ASM_E_ENOSUP,		/* No backend support.  */
Packit 5f0dbf
    ASM_E_NUM			/* Keep this entry as the last.  */
Packit 5f0dbf
  };
Packit 5f0dbf
Packit 5f0dbf
Packit 5f0dbf
/* Special sections.  */
Packit 5f0dbf
#define ASM_ABS_SCN ((Elf_Scn *) 1)
Packit 5f0dbf
#define ASM_COM_SCN ((Elf_Scn *) 2)
Packit 5f0dbf
Packit 5f0dbf
Packit 5f0dbf
/* And the hash table for symbols.  */
Packit 5f0dbf
#include <symbolhash.h>
Packit 5f0dbf
Packit 5f0dbf
Packit 5f0dbf
/* Descriptor for a section.  */
Packit 5f0dbf
struct AsmScn
Packit 5f0dbf
{
Packit 5f0dbf
  /* The underlying assembler context.  */
Packit 5f0dbf
  AsmCtx_t *ctx;
Packit 5f0dbf
Packit 5f0dbf
  /* Subsection ID.  */
Packit 5f0dbf
  unsigned int subsection_id;
Packit 5f0dbf
Packit 5f0dbf
  /* Section type.  */
Packit 5f0dbf
  GElf_Word type;
Packit 5f0dbf
Packit 5f0dbf
  union
Packit 5f0dbf
  {
Packit 5f0dbf
    /* Data only stored in the record for subsection zero.  */
Packit 5f0dbf
    struct
Packit 5f0dbf
    {
Packit 5f0dbf
      /* The ELF section.  */
Packit 5f0dbf
      Elf_Scn *scn;
Packit 5f0dbf
Packit 5f0dbf
      /* Entry in the section header string table.  */
Packit 5f0dbf
      Dwelf_Strent *strent;
Packit 5f0dbf
Packit 5f0dbf
      /* Next member of group.  */
Packit 5f0dbf
      struct AsmScn *next_in_group;
Packit 5f0dbf
    } main;
Packit 5f0dbf
Packit 5f0dbf
    /* Pointer to the record for subsection zero.  */
Packit 5f0dbf
    AsmScn_t *up;
Packit 5f0dbf
  } data;
Packit 5f0dbf
Packit 5f0dbf
  /* Current offset in the (sub)section.  */
Packit 5f0dbf
  GElf_Off offset;
Packit 5f0dbf
  /* Maximum alignment of the section so far.  */
Packit 5f0dbf
  GElf_Word max_align;
Packit 5f0dbf
Packit 5f0dbf
  /* Section content.  */
Packit 5f0dbf
  struct AsmData
Packit 5f0dbf
  {
Packit 5f0dbf
    /* Currently used number of bytes in the block.  */
Packit 5f0dbf
    size_t len;
Packit 5f0dbf
Packit 5f0dbf
    /* Number of bytes allocated.  */
Packit 5f0dbf
    size_t maxlen;
Packit 5f0dbf
Packit 5f0dbf
    /* Pointer to the next block.  */
Packit 5f0dbf
    struct AsmData *next;
Packit 5f0dbf
Packit 5f0dbf
    /* The actual data.  */
Packit 5f0dbf
    char data[flexarr_size];
Packit 5f0dbf
  } *content;
Packit 5f0dbf
Packit 5f0dbf
  /* Fill pattern.  */
Packit 5f0dbf
  struct FillPattern
Packit 5f0dbf
  {
Packit 5f0dbf
    size_t len;
Packit 5f0dbf
    char bytes[flexarr_size];
Packit 5f0dbf
  } *pattern;
Packit 5f0dbf
Packit 5f0dbf
  /* Next subsection.  */
Packit 5f0dbf
  AsmScn_t *subnext;
Packit 5f0dbf
Packit 5f0dbf
  /* List of all allocated sections.  */
Packit 5f0dbf
  AsmScn_t *allnext;
Packit 5f0dbf
Packit 5f0dbf
  /* Name of the section.  */
Packit 5f0dbf
  char name[flexarr_size];
Packit 5f0dbf
};
Packit 5f0dbf
Packit 5f0dbf
Packit 5f0dbf
/* Descriptor used for the assembling session.  */
Packit 5f0dbf
struct AsmCtx
Packit 5f0dbf
{
Packit 5f0dbf
  /* File descriptor of the temporary file.  */
Packit 5f0dbf
  int fd;
Packit 5f0dbf
Packit 5f0dbf
  /* True if text output is wanted.  */
Packit 5f0dbf
  bool textp;
Packit 5f0dbf
Packit 5f0dbf
  /* Output file handle.  */
Packit 5f0dbf
  union
Packit 5f0dbf
  {
Packit 5f0dbf
    /* ELF descriptor of the temporary file.  */
Packit 5f0dbf
    Elf *elf;
Packit 5f0dbf
    /* I/O stream for text output.  */
Packit 5f0dbf
    FILE *file;
Packit 5f0dbf
  } out;
Packit 5f0dbf
Packit 5f0dbf
Packit 5f0dbf
  /* List with defined sections.  */
Packit 5f0dbf
  AsmScn_t *section_list;
Packit 5f0dbf
  /* Section header string table.  */
Packit 5f0dbf
  Dwelf_Strtab *section_strtab;
Packit 5f0dbf
Packit 5f0dbf
  /* Table with defined symbols.  */
Packit 5f0dbf
  asm_symbol_tab symbol_tab;
Packit 5f0dbf
  /* Number of symbols in the table.  */
Packit 5f0dbf
  unsigned int nsymbol_tab;
Packit 5f0dbf
  /* Symbol string table.  */
Packit 5f0dbf
  Dwelf_Strtab *symbol_strtab;
Packit 5f0dbf
Packit 5f0dbf
  /* List of section groups.  */
Packit 5f0dbf
  struct AsmScnGrp *groups;
Packit 5f0dbf
  /* Number of section groups.  */
Packit 5f0dbf
  size_t ngroups;
Packit 5f0dbf
Packit 5f0dbf
  /* Current required alignment for common symbols.  */
Packit 5f0dbf
  GElf_Word common_align;
Packit 5f0dbf
Packit 5f0dbf
  /* Lock to handle multithreaded programs.  */
Packit 5f0dbf
  rwlock_define (,lock);
Packit 5f0dbf
Packit 5f0dbf
  /* Counter for temporary symbols.  */
Packit 5f0dbf
  unsigned int tempsym_count;
Packit 5f0dbf
Packit 5f0dbf
  /* Name of the output file.  */
Packit 5f0dbf
  char *fname;
Packit 5f0dbf
  /* The name of the temporary file.  */
Packit 5f0dbf
  char tmp_fname[flexarr_size];
Packit 5f0dbf
};
Packit 5f0dbf
Packit 5f0dbf
Packit 5f0dbf
/* Descriptor for a symbol.  */
Packit 5f0dbf
struct AsmSym
Packit 5f0dbf
{
Packit 5f0dbf
  /* Reference to the section which contains the symbol.  */
Packit 5f0dbf
  AsmScn_t *scn;
Packit 5f0dbf
Packit 5f0dbf
  /* Type of the symbol.  */
Packit 5f0dbf
  int8_t type;
Packit 5f0dbf
  /* Binding of the symbol.  */
Packit 5f0dbf
  int8_t binding;
Packit 5f0dbf
Packit 5f0dbf
  /* Size of the symbol.  */
Packit 5f0dbf
  GElf_Xword size;
Packit 5f0dbf
Packit 5f0dbf
  /* Offset in the section.  */
Packit 5f0dbf
  GElf_Off offset;
Packit 5f0dbf
Packit 5f0dbf
  /* Symbol table index of the symbol in the symbol table.  */
Packit 5f0dbf
  size_t symidx;
Packit 5f0dbf
Packit 5f0dbf
  /* Reference to name of the symbol.  */
Packit 5f0dbf
  Dwelf_Strent *strent;
Packit 5f0dbf
};
Packit 5f0dbf
Packit 5f0dbf
Packit 5f0dbf
/* Descriptor for section group.  */
Packit 5f0dbf
struct AsmScnGrp
Packit 5f0dbf
{
Packit 5f0dbf
  /* Entry in the section header string table.  */
Packit 5f0dbf
  Dwelf_Strent *strent;
Packit 5f0dbf
Packit 5f0dbf
  /* The ELF section.  */
Packit 5f0dbf
  Elf_Scn *scn;
Packit 5f0dbf
Packit 5f0dbf
  /* The signature.  */
Packit 5f0dbf
  struct AsmSym *signature;
Packit 5f0dbf
Packit 5f0dbf
  /* First member.  */
Packit 5f0dbf
  struct AsmScn *members;
Packit 5f0dbf
  /* Number of members.  */
Packit 5f0dbf
  size_t nmembers;
Packit 5f0dbf
Packit 5f0dbf
  /* Flags.  */
Packit 5f0dbf
  Elf32_Word flags;
Packit 5f0dbf
Packit 5f0dbf
  /* Next group.  */
Packit 5f0dbf
  struct AsmScnGrp *next;
Packit 5f0dbf
Packit 5f0dbf
  /* Name of the section group.  */
Packit 5f0dbf
  char name[flexarr_size];
Packit 5f0dbf
};
Packit 5f0dbf
Packit 5f0dbf
Packit 5f0dbf
/* Descriptor for disassembler.   */
Packit 5f0dbf
struct DisasmCtx
Packit 5f0dbf
{
Packit 5f0dbf
  /* Handle for the backend library with the disassembler routine.  */
Packit 5f0dbf
  Ebl *ebl;
Packit 5f0dbf
Packit 5f0dbf
  /* ELF file containing all the data passed to the function.  This
Packit 5f0dbf
     allows to look up symbols.  */
Packit 5f0dbf
  Elf *elf;
Packit 5f0dbf
Packit 5f0dbf
  /* Callback function to determine symbol names.  */
Packit 5f0dbf
  DisasmGetSymCB_t symcb;
Packit 5f0dbf
};
Packit 5f0dbf
Packit 5f0dbf
Packit 5f0dbf
/* The default fill pattern: one zero byte.  */
Packit 5f0dbf
extern const struct FillPattern *__libasm_default_pattern
Packit 5f0dbf
     attribute_hidden;
Packit 5f0dbf
Packit 5f0dbf
Packit 5f0dbf
/* Ensure there are at least LEN bytes available in the output buffer
Packit 5f0dbf
   for ASMSCN.  */
Packit 5f0dbf
extern int __libasm_ensure_section_space (AsmScn_t *asmscn, size_t len)
Packit 5f0dbf
     internal_function;
Packit 5f0dbf
Packit 5f0dbf
/* Free all resources associated with the assembler context.  */
Packit 5f0dbf
extern void __libasm_finictx (AsmCtx_t *ctx) internal_function;
Packit 5f0dbf
Packit 5f0dbf
/* Set error code.  */
Packit 5f0dbf
extern void __libasm_seterrno (int err) internal_function;
Packit 5f0dbf
Packit 5f0dbf
/* Return handle for the named section.  If it was not used before
Packit 5f0dbf
   create it.  */
Packit 5f0dbf
extern AsmScn_t *__asm_newscn_internal (AsmCtx_t *ctx, const char *scnname,
Packit 5f0dbf
					GElf_Word type, GElf_Xword flags)
Packit 5f0dbf
     attribute_hidden;
Packit 5f0dbf
Packit 5f0dbf
Packit 5f0dbf
/* Internal aliases of the asm_addintXX functions.  */
Packit 5f0dbf
extern int __asm_addint8_internal (AsmScn_t *asmscn, int8_t num)
Packit 5f0dbf
     attribute_hidden;
Packit 5f0dbf
extern int __asm_addint16_internal (AsmScn_t *asmscn, int16_t num)
Packit 5f0dbf
     attribute_hidden;
Packit 5f0dbf
extern int __asm_addint32_internal (AsmScn_t *asmscn, int32_t num)
Packit 5f0dbf
     attribute_hidden;
Packit 5f0dbf
extern int __asm_addint64_internal (AsmScn_t *asmscn, int64_t num)
Packit 5f0dbf
     attribute_hidden;
Packit 5f0dbf
Packit 5f0dbf
Packit 5f0dbf
/* Produce disassembly output for given memory and output it using the
Packit 5f0dbf
   given callback functions.  */
Packit 5f0dbf
extern int __disasm_cb_internal (DisasmCtx_t *ctx, const uint8_t **startp,
Packit 5f0dbf
				 const uint8_t *end, GElf_Addr addr,
Packit 5f0dbf
				 const char *fmt, DisasmOutputCB_t outcb,
Packit 5f0dbf
				 void *outcbarp, void *symcbarg)
Packit 5f0dbf
     attribute_hidden;
Packit 5f0dbf
Packit 5f0dbf
Packit 5f0dbf
/* Test whether given symbol is an internal symbol and if yes, whether
Packit 5f0dbf
   we should nevertheless emit it in the symbol table.  */
Packit 5f0dbf
// XXX The second part should probably be controlled by an option which
Packit 5f0dbf
// isn't implemented yet
Packit 5f0dbf
// XXX Also, the format will change with the backend.
Packit 5f0dbf
#define asm_emit_symbol_p(name) (strncmp (name, ".L", 2) != 0)
Packit 5f0dbf
Packit 5f0dbf
#endif	/* libasmP.h */