Squashed 'third_party/elfutils/' content from commit 555e15e

Change-Id: I61cde98949e47e5c8c09c33260de17f30921be79
git-subtree-dir: third_party/elfutils
git-subtree-split: 555e15ebe8bf1eb33d00747173cfc80cc65648a4
diff --git a/libasm/libasmP.h b/libasm/libasmP.h
new file mode 100644
index 0000000..54460cf
--- /dev/null
+++ b/libasm/libasmP.h
@@ -0,0 +1,309 @@
+/* Internal definitions for libasm.
+   Copyright (C) 2002, 2004, 2005, 2016 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/>.  */
+
+#ifndef _LIBASMP_H
+#define _LIBASMP_H 1
+
+#include <stdio.h>
+
+#include <libasm.h>
+
+#include "libdwelf.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.  */
+      Dwelf_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.  */
+  Dwelf_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.  */
+  Dwelf_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.  */
+  Dwelf_Strent *strent;
+};
+
+
+/* Descriptor for section group.  */
+struct AsmScnGrp
+{
+  /* Entry in the section header string table.  */
+  Dwelf_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 */