1 /**
2  * \file libyasm/section.h
3  * \brief YASM section interface.
4  *
5  * \license
6  *  Copyright (C) 2001-2007  Peter Johnson
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  *  - Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  *  - Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND OTHER CONTRIBUTORS ``AS IS''
18  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR OTHER CONTRIBUTORS BE
21  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27  * POSSIBILITY OF SUCH DAMAGE.
28  * \endlicense
29  */
30 #ifndef YASM_SECTION_H
31 #define YASM_SECTION_H
32 
33 #ifndef YASM_LIB_DECL
34 #define YASM_LIB_DECL
35 #endif
36 
37 /** Basic YASM relocation.  Object formats will need to extend this
38  * structure with additional fields for relocation type, etc.
39  */
40 typedef struct yasm_reloc yasm_reloc;
41 
42 struct yasm_reloc {
43     /*@reldef@*/ STAILQ_ENTRY(yasm_reloc) link; /**< Link to next reloc */
44     yasm_intnum *addr;          /**< Offset (address) within section */
45     /*@dependent@*/ yasm_symrec *sym;       /**< Relocated symbol */
46 };
47 
48 /** An object.  This is the internal representation of an object file. */
49 struct yasm_object {
50     /*@owned@*/ char *src_filename;     /**< Source filename */
51     /*@owned@*/ char *obj_filename;     /**< Object filename */
52 
53     /*@owned@*/ yasm_symtab *symtab;    /**< Symbol table */
54     /*@owned@*/ yasm_arch *arch;        /**< Target architecture */
55     /*@owned@*/ yasm_objfmt *objfmt;    /**< Object format */
56     /*@owned@*/ yasm_dbgfmt *dbgfmt;    /**< Debug format */
57 
58     /** Currently active section.  Used by some directives.  NULL if no
59      * section active.
60      */
61     /*@dependent@*/ /*@null@*/ yasm_section *cur_section;
62 
63     /** Linked list of sections. */
64     /*@reldef@*/ STAILQ_HEAD(yasm_sectionhead, yasm_section) sections;
65 
66     /** Directives, organized as two level HAMT; first level is parser,
67      * second level is directive name.
68      */
69     /*@owned@*/ struct HAMT *directives;
70 
71     /** Prefix prepended to externally-visible symbols (empty string if none) */
72     /*@owned@*/ char *global_prefix;
73 
74     /** Suffix appended to externally-visible symbols (empty string if none) */
75     /*@owned@*/ char *global_suffix;
76 };
77 
78 /** Create a new object.  A default section is created as the first section.
79  * An empty symbol table (yasm_symtab) and line mapping (yasm_linemap) are
80  * automatically created.
81  * \param src_filename  source filename (e.g. "file.asm")
82  * \param obj_filename  object filename (e.g. "file.o")
83  * \param arch          architecture
84  * \param objfmt_module object format module
85  * \param dbgfmt_module debug format module
86  * \return Newly allocated object, or NULL on error.
87  */
88 YASM_LIB_DECL
89 /*@null@*/ /*@only@*/ yasm_object *yasm_object_create
90     (const char *src_filename, const char *obj_filename,
91      /*@kept@*/ yasm_arch *arch,
92      const yasm_objfmt_module *objfmt_module,
93      const yasm_dbgfmt_module *dbgfmt_module);
94 
95 /** Create a new, or continue an existing, general section.  The section is
96  * added to the object if there's not already a section by that name.
97  * \param object    object
98  * \param name      section name
99  * \param align     alignment in bytes (0 if none)
100  * \param code      if nonzero, section is intended to contain code
101  *                  (e.g. alignment should be made with NOP instructions, not 0)
102  * \param res_only  if nonzero, only space-reserving bytecodes are allowed in
103  *                  the section (ignored if section already exists)
104  * \param isnew     output; set to nonzero if section did not already exist
105  * \param line      virtual line of section declaration (ignored if section
106  *                  already exists)
107  * \return New section.
108  */
109 YASM_LIB_DECL
110 /*@dependent@*/ yasm_section *yasm_object_get_general
111     (yasm_object *object, const char *name, unsigned long align, int code,
112      int res_only, /*@out@*/ int *isnew, unsigned long line);
113 
114 /** Handle a directive.  Passed down to object format, debug format, or
115  * architecture as appropriate.
116  * \param object                object
117  * \param name                  directive name
118  * \param parser                parser keyword
119  * \param valparams             value/parameters
120  * \param objext_valparams      "object format-specific" value/parameters
121  * \param line                  virtual line (from yasm_linemap)
122  * \return 0 if directive recognized, nonzero if unrecognized.
123  */
124 YASM_LIB_DECL
125 int yasm_object_directive(yasm_object *object, const char *name,
126                           const char *parser, yasm_valparamhead *valparams,
127                           yasm_valparamhead *objext_valparams,
128                           unsigned long line);
129 
130 /** Delete (free allocated memory for) an object.  All sections in the
131  * object and all bytecodes within those sections are also deleted.
132  * \param object        object
133  */
134 YASM_LIB_DECL
135 void yasm_object_destroy(/*@only@*/ yasm_object *object);
136 
137 /** Print an object.  For debugging purposes.
138  * \param object        object
139  * \param f             file
140  * \param indent_level  indentation level
141  */
142 YASM_LIB_DECL
143 void yasm_object_print(const yasm_object *object, FILE *f, int indent_level);
144 
145 /** Finalize an object after parsing.
146  * \param object        object
147  * \param errwarns      error/warning set
148  * \note Errors/warnings are stored into errwarns.
149  */
150 YASM_LIB_DECL
151 void yasm_object_finalize(yasm_object *object, yasm_errwarns *errwarns);
152 
153 /** Traverses all sections in an object, calling a function on each section.
154  * \param object        object
155  * \param d             data pointer passed to func on each call
156  * \param func          function
157  * \return Stops early (and returns func's return value) if func returns a
158  *         nonzero value; otherwise 0.
159  */
160 YASM_LIB_DECL
161 int yasm_object_sections_traverse
162     (yasm_object *object, /*@null@*/ void *d,
163      int (*func) (yasm_section *sect, /*@null@*/ void *d));
164 
165 /** Find a general section in an object, based on its name.
166  * \param object        object
167  * \param name          section name
168  * \return Section matching name, or NULL if no match found.
169  */
170 YASM_LIB_DECL
171 /*@dependent@*/ /*@null@*/ yasm_section *yasm_object_find_general
172     (yasm_object *object, const char *name);
173 
174 /** Change the source filename for an object.
175  * \param object        object
176  * \param src_filename  new source filename (e.g. "file.asm")
177  */
178 YASM_LIB_DECL
179 void yasm_object_set_source_fn(yasm_object *object, const char *src_filename);
180 
181 /** Change the prefix used for externally-visible symbols.
182  * \param object        object
183  * \param prefix        new prefix
184  */
185 YASM_LIB_DECL
186 void yasm_object_set_global_prefix(yasm_object *object, const char *prefix);
187 
188 /** Change the suffix used for externally-visible symbols.
189  * \param object        object
190  * \param suffix        new suffix
191  */
192 YASM_LIB_DECL
193 void yasm_object_set_global_suffix(yasm_object *object, const char *suffix);
194 
195 /** Optimize an object.  Takes the unoptimized object and optimizes it.
196  * If successful, the object is ready for output to an object file.
197  * \param object        object
198  * \param errwarns      error/warning set
199  * \note Optimization failures are stored into errwarns.
200  */
201 YASM_LIB_DECL
202 void yasm_object_optimize(yasm_object *object, yasm_errwarns *errwarns);
203 
204 /** Determine if a section is flagged to contain code.
205  * \param sect      section
206  * \return Nonzero if section is flagged to contain code.
207  */
208 YASM_LIB_DECL
209 int yasm_section_is_code(yasm_section *sect);
210 
211 /** Get yasm_optimizer-specific flags.  For yasm_optimizer use only.
212  * \param sect      section
213  * \return Optimizer-specific flags.
214  */
215 YASM_LIB_DECL
216 unsigned long yasm_section_get_opt_flags(const yasm_section *sect);
217 
218 /** Set yasm_optimizer-specific flags.  For yasm_optimizer use only.
219  * \param sect      section
220  * \param opt_flags optimizer-specific flags.
221  */
222 YASM_LIB_DECL
223 void yasm_section_set_opt_flags(yasm_section *sect, unsigned long opt_flags);
224 
225 /** Determine if a section was declared as the "default" section (e.g. not
226  * created through a section directive).
227  * \param sect      section
228  * \return Nonzero if section was declared as default.
229  */
230 YASM_LIB_DECL
231 int yasm_section_is_default(const yasm_section *sect);
232 
233 /** Set section "default" flag to a new value.
234  * \param sect      section
235  * \param def       new value of default flag
236  */
237 YASM_LIB_DECL
238 void yasm_section_set_default(yasm_section *sect, int def);
239 
240 /** Get object owner of a section.
241  * \param sect      section
242  * \return Object this section is a part of.
243  */
244 YASM_LIB_DECL
245 yasm_object *yasm_section_get_object(const yasm_section *sect);
246 
247 /** Get assocated data for a section and data callback.
248  * \param sect      section
249  * \param callback  callback used when adding data
250  * \return Associated data (NULL if none).
251  */
252 YASM_LIB_DECL
253 /*@dependent@*/ /*@null@*/ void *yasm_section_get_data
254     (yasm_section *sect, const yasm_assoc_data_callback *callback);
255 
256 /** Add associated data to a section.
257  * \attention Deletes any existing associated data for that data callback.
258  * \param sect      section
259  * \param callback  callback
260  * \param data      data to associate
261  */
262 YASM_LIB_DECL
263 void yasm_section_add_data(yasm_section *sect,
264                            const yasm_assoc_data_callback *callback,
265                            /*@null@*/ /*@only@*/ void *data);
266 
267 /** Add a relocation to a section.
268  * \param sect          section
269  * \param reloc         relocation
270  * \param destroy_func  function that can destroy the relocation
271  * \note Does not make a copy of reloc.  The same destroy_func must be
272  * used for all relocations in a section or an internal error will occur.
273  * The section will destroy the relocation address; it is the caller's
274  * responsibility to destroy any other allocated data.
275  */
276 YASM_LIB_DECL
277 void yasm_section_add_reloc(yasm_section *sect, yasm_reloc *reloc,
278     void (*destroy_func) (/*@only@*/ void *reloc));
279 
280 /** Get the first relocation for a section.
281  * \param sect          section
282  * \return First relocation for section.  NULL if no relocations.
283  */
284 YASM_LIB_DECL
285 /*@null@*/ yasm_reloc *yasm_section_relocs_first(yasm_section *sect);
286 
287 /** Get the next relocation for a section.
288  * \param reloc         previous relocation
289  * \return Next relocation for section.  NULL if no more relocations.
290  */
291 /*@null@*/ yasm_reloc *yasm_section_reloc_next(yasm_reloc *reloc);
292 #ifndef YASM_DOXYGEN
293 #define yasm_section_reloc_next(x)      STAILQ_NEXT((x), link)
294 #endif
295 
296 /** Get the basic relocation information for a relocation.
297  * \param reloc         relocation
298  * \param addrp         address of relocation within section (returned)
299  * \param symp          relocated symbol (returned)
300  */
301 YASM_LIB_DECL
302 void yasm_reloc_get(yasm_reloc *reloc, yasm_intnum **addrp,
303                     /*@dependent@*/ yasm_symrec **symp);
304 
305 /** Get the first bytecode in a section.
306  * \param sect          section
307  * \return First bytecode in section (at least one empty bytecode is always
308  *         present).
309  */
310 YASM_LIB_DECL
311 yasm_bytecode *yasm_section_bcs_first(yasm_section *sect);
312 
313 /** Get the last bytecode in a section.
314  * \param sect          section
315  * \return Last bytecode in section (at least one empty bytecode is always
316  *         present).
317  */
318 YASM_LIB_DECL
319 yasm_bytecode *yasm_section_bcs_last(yasm_section *sect);
320 
321 /** Add bytecode to the end of a section.
322  * \note Does not make a copy of bc; so don't pass this function static or
323  *       local variables, and discard the bc pointer after calling this
324  *       function.
325  * \param sect          section
326  * \param bc            bytecode (may be NULL)
327  * \return If bytecode was actually appended (it wasn't NULL or empty), the
328  *         bytecode; otherwise NULL.
329  */
330 YASM_LIB_DECL
331 /*@only@*/ /*@null@*/ yasm_bytecode *yasm_section_bcs_append
332     (yasm_section *sect,
333      /*@returned@*/ /*@only@*/ /*@null@*/ yasm_bytecode *bc);
334 
335 /** Traverses all bytecodes in a section, calling a function on each bytecode.
336  * \param sect      section
337  * \param errwarns  error/warning set (may be NULL)
338  * \param d         data pointer passed to func on each call (may be NULL)
339  * \param func      function
340  * \return Stops early (and returns func's return value) if func returns a
341  *         nonzero value; otherwise 0.
342  * \note If errwarns is non-NULL, yasm_errwarn_propagate() is called after
343  *       each call to func (with the bytecode's line number).
344  */
345 YASM_LIB_DECL
346 int yasm_section_bcs_traverse
347     (yasm_section *sect, /*@null@*/ yasm_errwarns *errwarns,
348      /*@null@*/ void *d, int (*func) (yasm_bytecode *bc, /*@null@*/ void *d));
349 
350 /** Get name of a section.
351  * \param   sect    section
352  * \return Section name.
353  */
354 YASM_LIB_DECL
355 /*@observer@*/ const char *yasm_section_get_name(const yasm_section *sect);
356 
357 /** Change alignment of a section.
358  * \param sect      section
359  * \param align     alignment in bytes
360  * \param line      virtual line
361  */
362 YASM_LIB_DECL
363 void yasm_section_set_align(yasm_section *sect, unsigned long align,
364                             unsigned long line);
365 
366 /** Get alignment of a section.
367  * \param sect      section
368  * \return Alignment in bytes (0 if none).
369  */
370 YASM_LIB_DECL
371 unsigned long yasm_section_get_align(const yasm_section *sect);
372 
373 /** Print a section.  For debugging purposes.
374  * \param f             file
375  * \param indent_level  indentation level
376  * \param sect          section
377  * \param print_bcs     if nonzero, print bytecodes within section
378  */
379 YASM_LIB_DECL
380 void yasm_section_print(/*@null@*/ const yasm_section *sect, FILE *f,
381                         int indent_level, int print_bcs);
382 
383 #endif
384