1da0c48c4Sopenharmony_ci/* Internal definitions for libasm.
2da0c48c4Sopenharmony_ci   Copyright (C) 2002, 2004, 2005, 2016 Red Hat, Inc.
3da0c48c4Sopenharmony_ci   This file is part of elfutils.
4da0c48c4Sopenharmony_ci
5da0c48c4Sopenharmony_ci   This file is free software; you can redistribute it and/or modify
6da0c48c4Sopenharmony_ci   it under the terms of either
7da0c48c4Sopenharmony_ci
8da0c48c4Sopenharmony_ci     * the GNU Lesser General Public License as published by the Free
9da0c48c4Sopenharmony_ci       Software Foundation; either version 3 of the License, or (at
10da0c48c4Sopenharmony_ci       your option) any later version
11da0c48c4Sopenharmony_ci
12da0c48c4Sopenharmony_ci   or
13da0c48c4Sopenharmony_ci
14da0c48c4Sopenharmony_ci     * the GNU General Public License as published by the Free
15da0c48c4Sopenharmony_ci       Software Foundation; either version 2 of the License, or (at
16da0c48c4Sopenharmony_ci       your option) any later version
17da0c48c4Sopenharmony_ci
18da0c48c4Sopenharmony_ci   or both in parallel, as here.
19da0c48c4Sopenharmony_ci
20da0c48c4Sopenharmony_ci   elfutils is distributed in the hope that it will be useful, but
21da0c48c4Sopenharmony_ci   WITHOUT ANY WARRANTY; without even the implied warranty of
22da0c48c4Sopenharmony_ci   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
23da0c48c4Sopenharmony_ci   General Public License for more details.
24da0c48c4Sopenharmony_ci
25da0c48c4Sopenharmony_ci   You should have received copies of the GNU General Public License and
26da0c48c4Sopenharmony_ci   the GNU Lesser General Public License along with this program.  If
27da0c48c4Sopenharmony_ci   not, see <http://www.gnu.org/licenses/>.  */
28da0c48c4Sopenharmony_ci
29da0c48c4Sopenharmony_ci#ifndef _LIBASMP_H
30da0c48c4Sopenharmony_ci#define _LIBASMP_H 1
31da0c48c4Sopenharmony_ci
32da0c48c4Sopenharmony_ci#include <stdio.h>
33da0c48c4Sopenharmony_ci
34da0c48c4Sopenharmony_ci#include <libasm.h>
35da0c48c4Sopenharmony_ci
36da0c48c4Sopenharmony_ci#include <system.h>
37da0c48c4Sopenharmony_ci
38da0c48c4Sopenharmony_ci#include "libebl.h"
39da0c48c4Sopenharmony_ci
40da0c48c4Sopenharmony_ci#include "libdwelf.h"
41da0c48c4Sopenharmony_ci
42da0c48c4Sopenharmony_ci
43da0c48c4Sopenharmony_ci/* Known error codes.  */
44da0c48c4Sopenharmony_cienum
45da0c48c4Sopenharmony_ci  {
46da0c48c4Sopenharmony_ci    ASM_E_NOERROR,
47da0c48c4Sopenharmony_ci    ASM_E_NOMEM,		/* No more memory.  */
48da0c48c4Sopenharmony_ci    ASM_E_CANNOT_CREATE,	/* Output file cannot be created.  */
49da0c48c4Sopenharmony_ci    ASM_E_INVALID,		/* Invalid parameters.  */
50da0c48c4Sopenharmony_ci    ASM_E_CANNOT_CHMOD,		/* Cannot change mode of output file.  */
51da0c48c4Sopenharmony_ci    ASM_E_CANNOT_RENAME,	/* Cannot rename output file.  */
52da0c48c4Sopenharmony_ci    ASM_E_DUPLSYM,		/* Duplicate symbol definition.  */
53da0c48c4Sopenharmony_ci    ASM_E_LIBELF,		/* Refer to error in libelf.  */
54da0c48c4Sopenharmony_ci    ASM_E_TYPE,			/* Invalid section type for operation.  */
55da0c48c4Sopenharmony_ci    ASM_E_IOERROR,		/* Error during output of data.  */
56da0c48c4Sopenharmony_ci    ASM_E_ENOSUP,		/* No backend support.  */
57da0c48c4Sopenharmony_ci    ASM_E_NUM			/* Keep this entry as the last.  */
58da0c48c4Sopenharmony_ci  };
59da0c48c4Sopenharmony_ci
60da0c48c4Sopenharmony_ci
61da0c48c4Sopenharmony_ci/* Special sections.  */
62da0c48c4Sopenharmony_ci#define ASM_ABS_SCN ((Elf_Scn *) 1)
63da0c48c4Sopenharmony_ci#define ASM_COM_SCN ((Elf_Scn *) 2)
64da0c48c4Sopenharmony_ci
65da0c48c4Sopenharmony_ci
66da0c48c4Sopenharmony_ci/* And the hash table for symbols.  */
67da0c48c4Sopenharmony_ci#include <symbolhash.h>
68da0c48c4Sopenharmony_ci
69da0c48c4Sopenharmony_ci
70da0c48c4Sopenharmony_ci/* Descriptor for a section.  */
71da0c48c4Sopenharmony_cistruct AsmScn
72da0c48c4Sopenharmony_ci{
73da0c48c4Sopenharmony_ci  /* The underlying assembler context.  */
74da0c48c4Sopenharmony_ci  AsmCtx_t *ctx;
75da0c48c4Sopenharmony_ci
76da0c48c4Sopenharmony_ci  /* Subsection ID.  */
77da0c48c4Sopenharmony_ci  unsigned int subsection_id;
78da0c48c4Sopenharmony_ci
79da0c48c4Sopenharmony_ci  /* Section type.  */
80da0c48c4Sopenharmony_ci  GElf_Word type;
81da0c48c4Sopenharmony_ci
82da0c48c4Sopenharmony_ci  union
83da0c48c4Sopenharmony_ci  {
84da0c48c4Sopenharmony_ci    /* Data only stored in the record for subsection zero.  */
85da0c48c4Sopenharmony_ci    struct
86da0c48c4Sopenharmony_ci    {
87da0c48c4Sopenharmony_ci      /* The ELF section.  */
88da0c48c4Sopenharmony_ci      Elf_Scn *scn;
89da0c48c4Sopenharmony_ci
90da0c48c4Sopenharmony_ci      /* Entry in the section header string table.  */
91da0c48c4Sopenharmony_ci      Dwelf_Strent *strent;
92da0c48c4Sopenharmony_ci
93da0c48c4Sopenharmony_ci      /* Next member of group.  */
94da0c48c4Sopenharmony_ci      struct AsmScn *next_in_group;
95da0c48c4Sopenharmony_ci    } main;
96da0c48c4Sopenharmony_ci
97da0c48c4Sopenharmony_ci    /* Pointer to the record for subsection zero.  */
98da0c48c4Sopenharmony_ci    AsmScn_t *up;
99da0c48c4Sopenharmony_ci  } data;
100da0c48c4Sopenharmony_ci
101da0c48c4Sopenharmony_ci  /* Current offset in the (sub)section.  */
102da0c48c4Sopenharmony_ci  GElf_Off offset;
103da0c48c4Sopenharmony_ci  /* Maximum alignment of the section so far.  */
104da0c48c4Sopenharmony_ci  GElf_Word max_align;
105da0c48c4Sopenharmony_ci
106da0c48c4Sopenharmony_ci  /* Section content.  */
107da0c48c4Sopenharmony_ci  struct AsmData
108da0c48c4Sopenharmony_ci  {
109da0c48c4Sopenharmony_ci    /* Currently used number of bytes in the block.  */
110da0c48c4Sopenharmony_ci    size_t len;
111da0c48c4Sopenharmony_ci
112da0c48c4Sopenharmony_ci    /* Number of bytes allocated.  */
113da0c48c4Sopenharmony_ci    size_t maxlen;
114da0c48c4Sopenharmony_ci
115da0c48c4Sopenharmony_ci    /* Pointer to the next block.  */
116da0c48c4Sopenharmony_ci    struct AsmData *next;
117da0c48c4Sopenharmony_ci
118da0c48c4Sopenharmony_ci    /* The actual data.  */
119da0c48c4Sopenharmony_ci    char data[flexarr_size];
120da0c48c4Sopenharmony_ci  } *content;
121da0c48c4Sopenharmony_ci
122da0c48c4Sopenharmony_ci  /* Fill pattern.  */
123da0c48c4Sopenharmony_ci  struct FillPattern
124da0c48c4Sopenharmony_ci  {
125da0c48c4Sopenharmony_ci    size_t len;
126da0c48c4Sopenharmony_ci    char bytes[flexarr_size];
127da0c48c4Sopenharmony_ci  } *pattern;
128da0c48c4Sopenharmony_ci
129da0c48c4Sopenharmony_ci  /* Next subsection.  */
130da0c48c4Sopenharmony_ci  AsmScn_t *subnext;
131da0c48c4Sopenharmony_ci
132da0c48c4Sopenharmony_ci  /* List of all allocated sections.  */
133da0c48c4Sopenharmony_ci  AsmScn_t *allnext;
134da0c48c4Sopenharmony_ci
135da0c48c4Sopenharmony_ci  /* Name of the section.  */
136da0c48c4Sopenharmony_ci  char name[flexarr_size];
137da0c48c4Sopenharmony_ci};
138da0c48c4Sopenharmony_ci
139da0c48c4Sopenharmony_ci
140da0c48c4Sopenharmony_ci/* Descriptor used for the assembling session.  */
141da0c48c4Sopenharmony_cistruct AsmCtx
142da0c48c4Sopenharmony_ci{
143da0c48c4Sopenharmony_ci  /* File descriptor of the temporary file.  */
144da0c48c4Sopenharmony_ci  int fd;
145da0c48c4Sopenharmony_ci
146da0c48c4Sopenharmony_ci  /* True if text output is wanted.  */
147da0c48c4Sopenharmony_ci  bool textp;
148da0c48c4Sopenharmony_ci
149da0c48c4Sopenharmony_ci  /* Output file handle.  */
150da0c48c4Sopenharmony_ci  union
151da0c48c4Sopenharmony_ci  {
152da0c48c4Sopenharmony_ci    /* ELF descriptor of the temporary file.  */
153da0c48c4Sopenharmony_ci    Elf *elf;
154da0c48c4Sopenharmony_ci    /* I/O stream for text output.  */
155da0c48c4Sopenharmony_ci    FILE *file;
156da0c48c4Sopenharmony_ci  } out;
157da0c48c4Sopenharmony_ci
158da0c48c4Sopenharmony_ci
159da0c48c4Sopenharmony_ci  /* List with defined sections.  */
160da0c48c4Sopenharmony_ci  AsmScn_t *section_list;
161da0c48c4Sopenharmony_ci  /* Section header string table.  */
162da0c48c4Sopenharmony_ci  Dwelf_Strtab *section_strtab;
163da0c48c4Sopenharmony_ci
164da0c48c4Sopenharmony_ci  /* Table with defined symbols.  */
165da0c48c4Sopenharmony_ci  asm_symbol_tab symbol_tab;
166da0c48c4Sopenharmony_ci  /* Number of symbols in the table.  */
167da0c48c4Sopenharmony_ci  unsigned int nsymbol_tab;
168da0c48c4Sopenharmony_ci  /* Symbol string table.  */
169da0c48c4Sopenharmony_ci  Dwelf_Strtab *symbol_strtab;
170da0c48c4Sopenharmony_ci
171da0c48c4Sopenharmony_ci  /* List of section groups.  */
172da0c48c4Sopenharmony_ci  struct AsmScnGrp *groups;
173da0c48c4Sopenharmony_ci  /* Number of section groups.  */
174da0c48c4Sopenharmony_ci  size_t ngroups;
175da0c48c4Sopenharmony_ci
176da0c48c4Sopenharmony_ci  /* Current required alignment for common symbols.  */
177da0c48c4Sopenharmony_ci  GElf_Word common_align;
178da0c48c4Sopenharmony_ci
179da0c48c4Sopenharmony_ci  /* Lock to handle multithreaded programs.  */
180da0c48c4Sopenharmony_ci  rwlock_define (,lock);
181da0c48c4Sopenharmony_ci
182da0c48c4Sopenharmony_ci  /* Counter for temporary symbols.  */
183da0c48c4Sopenharmony_ci  unsigned int tempsym_count;
184da0c48c4Sopenharmony_ci
185da0c48c4Sopenharmony_ci  /* Name of the output file.  */
186da0c48c4Sopenharmony_ci  char *fname;
187da0c48c4Sopenharmony_ci  /* The name of the temporary file.  */
188da0c48c4Sopenharmony_ci  char tmp_fname[flexarr_size];
189da0c48c4Sopenharmony_ci};
190da0c48c4Sopenharmony_ci
191da0c48c4Sopenharmony_ci
192da0c48c4Sopenharmony_ci/* Descriptor for a symbol.  */
193da0c48c4Sopenharmony_cistruct AsmSym
194da0c48c4Sopenharmony_ci{
195da0c48c4Sopenharmony_ci  /* Reference to the section which contains the symbol.  */
196da0c48c4Sopenharmony_ci  AsmScn_t *scn;
197da0c48c4Sopenharmony_ci
198da0c48c4Sopenharmony_ci  /* Type of the symbol.  */
199da0c48c4Sopenharmony_ci  int8_t type;
200da0c48c4Sopenharmony_ci  /* Binding of the symbol.  */
201da0c48c4Sopenharmony_ci  int8_t binding;
202da0c48c4Sopenharmony_ci
203da0c48c4Sopenharmony_ci  /* Size of the symbol.  */
204da0c48c4Sopenharmony_ci  GElf_Xword size;
205da0c48c4Sopenharmony_ci
206da0c48c4Sopenharmony_ci  /* Offset in the section.  */
207da0c48c4Sopenharmony_ci  GElf_Off offset;
208da0c48c4Sopenharmony_ci
209da0c48c4Sopenharmony_ci  /* Symbol table index of the symbol in the symbol table.  */
210da0c48c4Sopenharmony_ci  size_t symidx;
211da0c48c4Sopenharmony_ci
212da0c48c4Sopenharmony_ci  /* Reference to name of the symbol.  */
213da0c48c4Sopenharmony_ci  Dwelf_Strent *strent;
214da0c48c4Sopenharmony_ci};
215da0c48c4Sopenharmony_ci
216da0c48c4Sopenharmony_ci
217da0c48c4Sopenharmony_ci/* Descriptor for section group.  */
218da0c48c4Sopenharmony_cistruct AsmScnGrp
219da0c48c4Sopenharmony_ci{
220da0c48c4Sopenharmony_ci  /* Entry in the section header string table.  */
221da0c48c4Sopenharmony_ci  Dwelf_Strent *strent;
222da0c48c4Sopenharmony_ci
223da0c48c4Sopenharmony_ci  /* The ELF section.  */
224da0c48c4Sopenharmony_ci  Elf_Scn *scn;
225da0c48c4Sopenharmony_ci
226da0c48c4Sopenharmony_ci  /* The signature.  */
227da0c48c4Sopenharmony_ci  struct AsmSym *signature;
228da0c48c4Sopenharmony_ci
229da0c48c4Sopenharmony_ci  /* First member.  */
230da0c48c4Sopenharmony_ci  struct AsmScn *members;
231da0c48c4Sopenharmony_ci  /* Number of members.  */
232da0c48c4Sopenharmony_ci  size_t nmembers;
233da0c48c4Sopenharmony_ci
234da0c48c4Sopenharmony_ci  /* Flags.  */
235da0c48c4Sopenharmony_ci  Elf32_Word flags;
236da0c48c4Sopenharmony_ci
237da0c48c4Sopenharmony_ci  /* Next group.  */
238da0c48c4Sopenharmony_ci  struct AsmScnGrp *next;
239da0c48c4Sopenharmony_ci
240da0c48c4Sopenharmony_ci  /* Name of the section group.  */
241da0c48c4Sopenharmony_ci  char name[flexarr_size];
242da0c48c4Sopenharmony_ci};
243da0c48c4Sopenharmony_ci
244da0c48c4Sopenharmony_ci
245da0c48c4Sopenharmony_ci/* Descriptor for disassembler.   */
246da0c48c4Sopenharmony_cistruct DisasmCtx
247da0c48c4Sopenharmony_ci{
248da0c48c4Sopenharmony_ci  /* Handle for the backend library with the disassembler routine.  */
249da0c48c4Sopenharmony_ci  Ebl *ebl;
250da0c48c4Sopenharmony_ci
251da0c48c4Sopenharmony_ci  /* ELF file containing all the data passed to the function.  This
252da0c48c4Sopenharmony_ci     allows to look up symbols.  */
253da0c48c4Sopenharmony_ci  Elf *elf;
254da0c48c4Sopenharmony_ci
255da0c48c4Sopenharmony_ci  /* Callback function to determine symbol names.  */
256da0c48c4Sopenharmony_ci  DisasmGetSymCB_t symcb;
257da0c48c4Sopenharmony_ci};
258da0c48c4Sopenharmony_ci
259da0c48c4Sopenharmony_ci
260da0c48c4Sopenharmony_ci/* The default fill pattern: one zero byte.  */
261da0c48c4Sopenharmony_ciextern const struct FillPattern *__libasm_default_pattern
262da0c48c4Sopenharmony_ci     attribute_hidden;
263da0c48c4Sopenharmony_ci
264da0c48c4Sopenharmony_ci
265da0c48c4Sopenharmony_ci/* Ensure there are at least LEN bytes available in the output buffer
266da0c48c4Sopenharmony_ci   for ASMSCN.  */
267da0c48c4Sopenharmony_ciextern int __libasm_ensure_section_space (AsmScn_t *asmscn, size_t len)
268da0c48c4Sopenharmony_ci     internal_function;
269da0c48c4Sopenharmony_ci
270da0c48c4Sopenharmony_ci/* Free all resources associated with the assembler context.  */
271da0c48c4Sopenharmony_ciextern void __libasm_finictx (AsmCtx_t *ctx) internal_function;
272da0c48c4Sopenharmony_ci
273da0c48c4Sopenharmony_ci/* Set error code.  */
274da0c48c4Sopenharmony_ciextern void __libasm_seterrno (int err) internal_function;
275da0c48c4Sopenharmony_ci
276da0c48c4Sopenharmony_ci/* Return handle for the named section.  If it was not used before
277da0c48c4Sopenharmony_ci   create it.  */
278da0c48c4Sopenharmony_ciextern AsmScn_t *__asm_newscn_internal (AsmCtx_t *ctx, const char *scnname,
279da0c48c4Sopenharmony_ci					GElf_Word type, GElf_Xword flags)
280da0c48c4Sopenharmony_ci     attribute_hidden;
281da0c48c4Sopenharmony_ci
282da0c48c4Sopenharmony_ci
283da0c48c4Sopenharmony_ci/* Internal aliases of the asm_addintXX functions.  */
284da0c48c4Sopenharmony_ciextern int __asm_addint8_internal (AsmScn_t *asmscn, int8_t num)
285da0c48c4Sopenharmony_ci     attribute_hidden;
286da0c48c4Sopenharmony_ciextern int __asm_addint16_internal (AsmScn_t *asmscn, int16_t num)
287da0c48c4Sopenharmony_ci     attribute_hidden;
288da0c48c4Sopenharmony_ciextern int __asm_addint32_internal (AsmScn_t *asmscn, int32_t num)
289da0c48c4Sopenharmony_ci     attribute_hidden;
290da0c48c4Sopenharmony_ciextern int __asm_addint64_internal (AsmScn_t *asmscn, int64_t num)
291da0c48c4Sopenharmony_ci     attribute_hidden;
292da0c48c4Sopenharmony_ci
293da0c48c4Sopenharmony_ci
294da0c48c4Sopenharmony_ci/* Produce disassembly output for given memory and output it using the
295da0c48c4Sopenharmony_ci   given callback functions.  */
296da0c48c4Sopenharmony_ciextern int __disasm_cb_internal (DisasmCtx_t *ctx, const uint8_t **startp,
297da0c48c4Sopenharmony_ci				 const uint8_t *end, GElf_Addr addr,
298da0c48c4Sopenharmony_ci				 const char *fmt, DisasmOutputCB_t outcb,
299da0c48c4Sopenharmony_ci				 void *outcbarp, void *symcbarg)
300da0c48c4Sopenharmony_ci     attribute_hidden;
301da0c48c4Sopenharmony_ci
302da0c48c4Sopenharmony_ci
303da0c48c4Sopenharmony_ci/* Test whether given symbol is an internal symbol and if yes, whether
304da0c48c4Sopenharmony_ci   we should nevertheless emit it in the symbol table.  */
305da0c48c4Sopenharmony_ci// XXX The second part should probably be controlled by an option which
306da0c48c4Sopenharmony_ci// isn't implemented yet
307da0c48c4Sopenharmony_ci// XXX Also, the format will change with the backend.
308da0c48c4Sopenharmony_ci#define asm_emit_symbol_p(name) (!startswith (name, ".L"))
309da0c48c4Sopenharmony_ci
310da0c48c4Sopenharmony_ci#endif	/* libasmP.h */
311