/* Internal definitions for libasm.
   Copyright (C) 2002, 2004, 2005 Red Hat, Inc.
   This file is part of Red Hat elfutils.

   Red Hat elfutils is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by the
   Free Software Foundation; version 2 of the License.

   Red Hat 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 a copy of the GNU General Public License along
   with Red Hat elfutils; if not, write to the Free Software Foundation,
   Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.

   Red Hat elfutils is an included package of the Open Invention Network.
   An included package of the Open Invention Network is a package for which
   Open Invention Network licensees cross-license their patents.  No patent
   license is granted, either expressly or impliedly, by designation as an
   included package.  Should you wish to participate in the Open Invention
   Network licensing program, please visit www.openinventionnetwork.com
   <http://www.openinventionnetwork.com>.  */

#ifndef _LIBASMP_H
#define _LIBASMP_H 1

#include <stdio.h>

#include <libasm.h>

/* gettext helper macros.  */
#define _(Str) dgettext ("elfutils", Str)


/* Known error codes.  */
enum
  {
    ASM_E_NOERROR,
    ASM_E_NOMEM,		/* No more memory.  */
    ASM_E_CANNOT_CREATE,	/* Output file cannot be created.  */
    ASM_E_INVALID,		/* Invalid parameters.  */
    ASM_E_CANNOT_CHMOD,		/* Cannot change mode of output file.  */
    ASM_E_CANNOT_RENAME,	/* Cannot rename output file.  */
    ASM_E_DUPLSYM,		/* Duplicate symbol definition.  */
    ASM_E_LIBELF,		/* Refer to error in libelf.  */
    ASM_E_TYPE,			/* Invalid section type for operation.  */
    ASM_E_IOERROR,		/* Error during output of data.  */
    ASM_E_ENOSUP,		/* No backend support.  */
    ASM_E_NUM			/* Keep this entry as the last.  */
  };


/* Special sections.  */
#define ASM_ABS_SCN ((Elf_Scn *) 1)
#define ASM_COM_SCN ((Elf_Scn *) 2)


/* And the hash table for symbols.  */
#include <symbolhash.h>


/* Descriptor for a section.  */
struct AsmScn
{
  /* The underlying assembler context.  */
  AsmCtx_t *ctx;

  /* Subsection ID.  */
  unsigned int subsection_id;

  /* Section type.  */
  GElf_Word type;

  union
  {
    /* Data only stored in the record for subsection zero.  */
    struct
    {
      /* The ELF section.  */
      Elf_Scn *scn;

      /* Entry in the section header string table.  */
      struct Ebl_Strent *strent;

      /* Next member of group.  */
      struct AsmScn *next_in_group;
    } main;

    /* Pointer to the record for subsection zero.  */
    AsmScn_t *up;
  } data;

  /* Current offset in the (sub)section.  */
  GElf_Off offset;
  /* Maximum alignment of the section so far.  */
  GElf_Word max_align;

  /* Section content.  */
  struct AsmData
  {
    /* Currently used number of bytes in the block.  */
    size_t len;

    /* Number of bytes allocated.  */
    size_t maxlen;

    /* Pointer to the next block.  */
    struct AsmData *next;

    /* The actual data.  */
    char data[flexarr_size];
  } *content;

  /* Fill pattern.  */
  struct FillPattern
  {
    size_t len;
    char bytes[flexarr_size];
  } *pattern;

  /* Next subsection.  */
  AsmScn_t *subnext;

  /* List of all allocated sections.  */
  AsmScn_t *allnext;

  /* Name of the section.  */
  char name[flexarr_size];
};


/* Descriptor used for the assembling session.  */
struct AsmCtx
{
  /* File descriptor of the temporary file.  */
  int fd;

  /* True if text output is wanted.  */
  bool textp;

  /* Output file handle.  */
  union
  {
    /* ELF descriptor of the temporary file.  */
    Elf *elf;
    /* I/O stream for text output.  */
    FILE *file;
  } out;


  /* List with defined sections.  */
  AsmScn_t *section_list;
  /* Section header string table.  */
  struct Ebl_Strtab *section_strtab;

  /* Table with defined symbols.  */
  asm_symbol_tab symbol_tab;
  /* Number of symbols in the table.  */
  unsigned int nsymbol_tab;
  /* Symbol string table.  */
  struct Ebl_Strtab *symbol_strtab;

  /* List of section groups.  */
  struct AsmScnGrp *groups;
  /* Number of section groups.  */
  size_t ngroups;

  /* Current required alignment for common symbols.  */
  GElf_Word common_align;

  /* Lock to handle multithreaded programs.  */
  rwlock_define (,lock);

  /* Counter for temporary symbols.  */
  unsigned int tempsym_count;

  /* Name of the output file.  */
  char *fname;
  /* The name of the temporary file.  */
  char tmp_fname[flexarr_size];
};


/* Descriptor for a symbol.  */
struct AsmSym
{
  /* Reference to the section which contains the symbol.  */
  AsmScn_t *scn;

  /* Type of the symbol.  */
  int8_t type;
  /* Binding of the symbol.  */
  int8_t binding;

  /* Size of the symbol.  */
  GElf_Xword size;

  /* Offset in the section.  */
  GElf_Off offset;

  /* Symbol table index of the symbol in the symbol table.  */
  size_t symidx;

  /* Reference to name of the symbol.  */
  struct Ebl_Strent *strent;
};


/* Descriptor for section group.  */
struct AsmScnGrp
{
  /* Entry in the section header string table.  */
  struct Ebl_Strent *strent;

  /* The ELF section.  */
  Elf_Scn *scn;

  /* The signature.  */
  struct AsmSym *signature;

  /* First member.  */
  struct AsmScn *members;
  /* Number of members.  */
  size_t nmembers;

  /* Flags.  */
  Elf32_Word flags;

  /* Next group.  */
  struct AsmScnGrp *next;

  /* Name of the section group.  */
  char name[flexarr_size];
};


/* Descriptor for disassembler.   */
struct DisasmCtx
{
  /* Handle for the backend library with the disassembler routine.  */
  Ebl *ebl;

  /* ELF file containing all the data passed to the function.  This
     allows to look up symbols.  */
  Elf *elf;

  /* Callback function to determine symbol names.  */
  DisasmGetSymCB_t symcb;
};


/* The default fill pattern: one zero byte.  */
extern const struct FillPattern *__libasm_default_pattern
     attribute_hidden;


/* Ensure there are at least LEN bytes available in the output buffer
   for ASMSCN.  */
extern int __libasm_ensure_section_space (AsmScn_t *asmscn, size_t len)
     internal_function;

/* Free all resources associated with the assembler context.  */
extern void __libasm_finictx (AsmCtx_t *ctx) internal_function;

/* Set error code.  */
extern void __libasm_seterrno (int err) internal_function;

/* Return handle for the named section.  If it was not used before
   create it.  */
extern AsmScn_t *__asm_newscn_internal (AsmCtx_t *ctx, const char *scnname,
					GElf_Word type, GElf_Xword flags)
     attribute_hidden;


/* Internal aliases of the asm_addintXX functions.  */
extern int __asm_addint8_internal (AsmScn_t *asmscn, int8_t num)
     attribute_hidden;
extern int __asm_addint16_internal (AsmScn_t *asmscn, int16_t num)
     attribute_hidden;
extern int __asm_addint32_internal (AsmScn_t *asmscn, int32_t num)
     attribute_hidden;
extern int __asm_addint64_internal (AsmScn_t *asmscn, int64_t num)
     attribute_hidden;


/* Produce disassembly output for given memory and output it using the
   given callback functions.  */
extern int __disasm_cb_internal (DisasmCtx_t *ctx, const uint8_t **startp,
				 const uint8_t *end, GElf_Addr addr,
				 const char *fmt, DisasmOutputCB_t outcb,
				 void *outcbarp, void *symcbarg)
     attribute_hidden;


/* Test whether given symbol is an internal symbol and if yes, whether
   we should nevertheless emit it in the symbol table.  */
// XXX The second part should probably be controlled by an option which
// isn't implemented yet
// XXX Also, the format will change with the backend.
#define asm_emit_symbol_p(name) (strncmp (name, ".L", 2) != 0)

#endif	/* libasmP.h */
