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