blob: 2e4954f6e27bf8813edbd6cb035398623c0e341b [file] [log] [blame]
Ulrich Drepperb08d5a82005-07-26 05:00:05 +00001/* Internal definitions for libasm.
2 Copyright (C) 2002, 2004 Red Hat, Inc.
3
4 This program is Open Source software; you can redistribute it and/or
5 modify it under the terms of the Open Software License version 1.0 as
6 published by the Open Source Initiative.
7
8 You should have received a copy of the Open Software License along
9 with this program; if not, you may obtain a copy of the Open Software
10 License version 1.0 from http://www.opensource.org/licenses/osl.php or
11 by writing the Open Source Initiative c/o Lawrence Rosen, Esq.,
12 3001 King Ranch Road, Ukiah, CA 95482. */
13
14#ifndef _LIBASMP_H
15#define _LIBASMP_H 1
16
17#include <stdio.h>
18
19#include <libasm.h>
20#include <libebl.h>
21
22/* gettext helper macros. */
23#define _(Str) dgettext ("elfutils", Str)
24
25
26/* Known error codes. */
27enum
28 {
29 ASM_E_NOERROR,
30 ASM_E_NOMEM, /* No more memory. */
31 ASM_E_CANNOT_CREATE, /* Output file cannot be created. */
32 ASM_E_INVALID, /* Invalid parameters. */
33 ASM_E_CANNOT_CHMOD, /* Cannot change mode of output file. */
34 ASM_E_CANNOT_RENAME, /* Cannot rename output file. */
35 ASM_E_DUPLSYM, /* Duplicate symbol definition. */
36 ASM_E_LIBELF, /* Refer to error in libelf. */
37 ASM_E_TYPE, /* Invalid section type for operation. */
38 ASM_E_NUM /* Keep this entry as the last. */
39 };
40
41
42/* Special sections. */
43#define ASM_ABS_SCN ((Elf_Scn *) 1)
44#define ASM_COM_SCN ((Elf_Scn *) 2)
45
46
47/* And the hash table for symbols. */
48#include <symbolhash.h>
49
50
51/* Descriptor for a section. */
52struct AsmScn
53{
54 /* The underlying assembler context. */
55 AsmCtx_t *ctx;
56
57 /* Subsection ID. */
58 unsigned int subsection_id;
59
60 /* Section type. */
61 GElf_Word type;
62
63 union
64 {
65 /* Data only stored in the record for subsection zero. */
66 struct
67 {
68 /* The ELF section. */
69 Elf_Scn *scn;
70
71 /* Entry in the section header string table. */
72 struct Ebl_Strent *strent;
73
74 /* Next member of group. */
75 struct AsmScn *next_in_group;
76 } main;
77
78 /* Pointer to the record for subsection zero. */
79 AsmScn_t *up;
80 } data;
81
82 /* Current offset in the (sub)section. */
83 GElf_Off offset;
84 /* Maximum alignment of the section so far. */
85 GElf_Word max_align;
86
87 /* Section content. */
88 struct AsmData
89 {
90 /* Currently used number of bytes in the block. */
91 size_t len;
92
93 /* Number of bytes allocated. */
94 size_t maxlen;
95
96 /* Pointer to the next block. */
97 struct AsmData *next;
98
99 /* The actual data. */
100 char data[flexarr_size];
101 } *content;
102
103 /* Fill pattern. */
104 struct FillPattern
105 {
106 size_t len;
107 char bytes[flexarr_size];
108 } *pattern;
109
110 /* Next subsection. */
111 AsmScn_t *subnext;
112
113 /* List of all allocated sections. */
114 AsmScn_t *allnext;
115
116 /* Name of the section. */
117 char name[flexarr_size];
118};
119
120
121/* Descriptor used for the assembling session. */
122struct AsmCtx
123{
124 /* File descriptor of the temporary file. */
125 int fd;
126
127 /* True if text output is wanted. */
128 bool textp;
129
130 /* Output file handle. */
131 union
132 {
133 /* ELF descriptor of the temporary file. */
134 Elf *elf;
135 /* I/O stream for text output. */
136 FILE *file;
137 } out;
138
139
140 /* List with defined sections. */
141 AsmScn_t *section_list;
142 /* Section header string table. */
143 struct Ebl_Strtab *section_strtab;
144
145 /* Table with defined symbols. */
146 asm_symbol_tab symbol_tab;
147 /* Number of symbols in the table. */
148 unsigned int nsymbol_tab;
149 /* Symbol string table. */
150 struct Ebl_Strtab *symbol_strtab;
151
152 /* List of section groups. */
153 struct AsmScnGrp *groups;
154 /* Number of section groups. */
155 size_t ngroups;
156
157 /* Current required alignment for common symbols. */
158 GElf_Word common_align;
159
160 /* Lock to handle multithreaded programs. */
161 rwlock_define (,lock);
162
163 /* Counter for temporary symbols. */
164 unsigned int tempsym_count;
165
166 /* Name of the output file. */
167 char *fname;
168 /* The name of the temporary file. */
169 char tmp_fname[flexarr_size];
170};
171
172
173/* Descriptor for a symbol. */
174struct AsmSym
175{
176 /* Reference to the section which contains the symbol. */
177 AsmScn_t *scn;
178
179 /* Type of the symbol. */
180 int8_t type;
181 /* Binding of the symbol. */
182 int8_t binding;
183
184 /* Size of the symbol. */
185 GElf_Xword size;
186
187 /* Offset in the section. */
188 GElf_Off offset;
189
190 /* Symbol table index of the symbol in the symbol table. */
191 size_t symidx;
192
193 /* Reference to name of the symbol. */
194 struct Ebl_Strent *strent;
195};
196
197
198/* Descriptor for section group. */
199struct AsmScnGrp
200{
201 /* Entry in the section header string table. */
202 struct Ebl_Strent *strent;
203
204 /* The ELF section. */
205 Elf_Scn *scn;
206
207 /* The signature. */
208 struct AsmSym *signature;
209
210 /* First member. */
211 struct AsmScn *members;
212 /* Number of members. */
213 size_t nmembers;
214
215 /* Flags. */
216 Elf32_Word flags;
217
218 /* Next group. */
219 struct AsmScnGrp *next;
220
221 /* Name of the section group. */
222 char name[flexarr_size];
223};
224
225
226/* The default fill pattern: one zero byte. */
227extern const struct FillPattern *__libasm_default_pattern
228 attribute_hidden;
229
230
231/* Ensure there are at least LEN bytes available in the output buffer
232 for ASMSCN. */
233extern int __libasm_ensure_section_space (AsmScn_t *asmscn, size_t len)
234 internal_function;
235
236/* Free all resources associated with the assembler context. */
237extern void __libasm_finictx (AsmCtx_t *ctx) internal_function;
238
239/* Set error code. */
240extern void __libasm_seterrno (int err) internal_function;
241
242/* Return handle for the named section. If it was not used before
243 create it. */
244extern AsmScn_t *__asm_newscn_internal (AsmCtx_t *ctx, const char *scnname,
245 GElf_Word type, GElf_Xword flags)
246 attribute_hidden;
247
248
249/* Internal aliases of the asm_addintXX functions. */
250extern int __asm_addint8_internal (AsmScn_t *asmscn, int8_t num)
251 attribute_hidden;
252extern int __asm_addint16_internal (AsmScn_t *asmscn, int16_t num)
253 attribute_hidden;
254extern int __asm_addint32_internal (AsmScn_t *asmscn, int32_t num)
255 attribute_hidden;
256extern int __asm_addint64_internal (AsmScn_t *asmscn, int64_t num)
257 attribute_hidden;
258
259
260
261/* Test whether given symbol is an internal symbol and if yes, whether
262 we should nevertheless emit it in the symbol table. */
263// XXX The second part should probably be controlled by an option which
264// isn't implemented yet
265// XXX Also, the format will change with the backend.
266#define asm_emit_symbol_p(name) (strncmp (name, ".L", 2) != 0)
267
268#endif /* libasmP.h */