Yasm Assembler mainline development tree (ffmpeg 依赖)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

459 lines
18 KiB

/**
* \file libyasm/bytecode.h
* \brief YASM bytecode interface.
*
* \rcs
* $Id$
* \endrcs
*
* \license
* Copyright (C) 2001 Peter Johnson
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND OTHER CONTRIBUTORS ``AS IS''
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR OTHER CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
* \endlicense
*/
#ifndef YASM_BYTECODE_H
#define YASM_BYTECODE_H
Massive cleanup of relocation and WRT handling. Closes #49 and lays the groundwork for further features and possible cleanups. Note: this commit changes the way in which relocations in the COFF/Win32/Win64 target can be forced to reference a different symbol than is being pointed to; instead of the ambiguous "trap+(trap.end-trap)" to get the reloc to point at trap.end but reference the trap symbol, after this commit "trap.end wrt trap" is the way to say this. This also reads a lot more clearly and is not ambiguous. This should really only affect people who write .pdata sections for Win64. See the objfmts/win64/tests/win64-dataref.asm testcase for an example of usage. This cleanup adds a new data structure, yasm_value, which is used for all expressions that can be potentially relocatable. This data structure splits the absolute portion of the expression away from the relative portion and any modifications to the relative portion (SEG, WRT, PC-relative, etc). A large amount of code in the new value module breaks a general expression into its absolute and relative parts (yasm_value_finalize_expr) and provides a common set of code for writing out non-relocated values (yasm_value_output_basic). All bytecode handling in both libyasm and the architecture modules was rewritten to use yasm_values when appropriate (e.g. data values, immediates, and effective addresses). The yasm_output_expr_func is now yasm_output_value_func and all users and implementors (mainly in object formats) have been updated to handle yasm_values. Simultaneously with this change, yasm_effaddr and yasm_immval full structure definitions have been moved from bc-int.h to bytecode.h. The data hiding provided by bc-int.h was relatively minimal and probably overkill. Also, great simplifications have been made to x86 effective address expression handling. svn path=/trunk/yasm/; revision=1419
19 years ago
/** An effective address. */
typedef struct yasm_effaddr yasm_effaddr;
Massive cleanup of relocation and WRT handling. Closes #49 and lays the groundwork for further features and possible cleanups. Note: this commit changes the way in which relocations in the COFF/Win32/Win64 target can be forced to reference a different symbol than is being pointed to; instead of the ambiguous "trap+(trap.end-trap)" to get the reloc to point at trap.end but reference the trap symbol, after this commit "trap.end wrt trap" is the way to say this. This also reads a lot more clearly and is not ambiguous. This should really only affect people who write .pdata sections for Win64. See the objfmts/win64/tests/win64-dataref.asm testcase for an example of usage. This cleanup adds a new data structure, yasm_value, which is used for all expressions that can be potentially relocatable. This data structure splits the absolute portion of the expression away from the relative portion and any modifications to the relative portion (SEG, WRT, PC-relative, etc). A large amount of code in the new value module breaks a general expression into its absolute and relative parts (yasm_value_finalize_expr) and provides a common set of code for writing out non-relocated values (yasm_value_output_basic). All bytecode handling in both libyasm and the architecture modules was rewritten to use yasm_values when appropriate (e.g. data values, immediates, and effective addresses). The yasm_output_expr_func is now yasm_output_value_func and all users and implementors (mainly in object formats) have been updated to handle yasm_values. Simultaneously with this change, yasm_effaddr and yasm_immval full structure definitions have been moved from bc-int.h to bytecode.h. The data hiding provided by bc-int.h was relatively minimal and probably overkill. Also, great simplifications have been made to x86 effective address expression handling. svn path=/trunk/yasm/; revision=1419
19 years ago
/** Callbacks for effective address implementations. */
typedef struct yasm_effaddr_callback {
/** Destroy the effective address (freeing it).
* \param ea effective address
*/
void (*destroy) (/*@only@*/ yasm_effaddr *ea);
/** Print the effective address.
* \param ea effective address
* \param f file to output to
* \param indent_level indentation level
*/
void (*print) (const yasm_effaddr *ea, FILE *f, int indent_level);
} yasm_effaddr_callback;
/** An effective address. */
struct yasm_effaddr {
const yasm_effaddr_callback *callback; /**< callback functions */
yasm_value disp; /**< address displacement */
unsigned long segreg; /**< segment register override (0 if none) */
unsigned char need_nonzero_len; /**< 1 if length of disp must be >0. */
Massive cleanup of relocation and WRT handling. Closes #49 and lays the groundwork for further features and possible cleanups. Note: this commit changes the way in which relocations in the COFF/Win32/Win64 target can be forced to reference a different symbol than is being pointed to; instead of the ambiguous "trap+(trap.end-trap)" to get the reloc to point at trap.end but reference the trap symbol, after this commit "trap.end wrt trap" is the way to say this. This also reads a lot more clearly and is not ambiguous. This should really only affect people who write .pdata sections for Win64. See the objfmts/win64/tests/win64-dataref.asm testcase for an example of usage. This cleanup adds a new data structure, yasm_value, which is used for all expressions that can be potentially relocatable. This data structure splits the absolute portion of the expression away from the relative portion and any modifications to the relative portion (SEG, WRT, PC-relative, etc). A large amount of code in the new value module breaks a general expression into its absolute and relative parts (yasm_value_finalize_expr) and provides a common set of code for writing out non-relocated values (yasm_value_output_basic). All bytecode handling in both libyasm and the architecture modules was rewritten to use yasm_values when appropriate (e.g. data values, immediates, and effective addresses). The yasm_output_expr_func is now yasm_output_value_func and all users and implementors (mainly in object formats) have been updated to handle yasm_values. Simultaneously with this change, yasm_effaddr and yasm_immval full structure definitions have been moved from bc-int.h to bytecode.h. The data hiding provided by bc-int.h was relatively minimal and probably overkill. Also, great simplifications have been made to x86 effective address expression handling. svn path=/trunk/yasm/; revision=1419
19 years ago
unsigned char need_disp; /**< 1 if a displacement should be present
* in the output.
*/
unsigned char nosplit; /**< 1 if reg*2 should not be split into
* reg+reg. (0 if not)
*/
unsigned char strong; /**< 1 if effective address is *definitely*
* an effective address, e.g. in GAS if
* expr(,1) form is used vs. just expr.
*/
};
/** An immediate value. */
typedef struct yasm_immval {
yasm_value val; /**< the immediate value itself */
unsigned char sign; /**< 1 if final imm is treated as signed */
} yasm_immval;
/** A data value (opaque type). */
typedef struct yasm_dataval yasm_dataval;
/** A list of data values (opaque type). */
typedef struct yasm_datavalhead yasm_datavalhead;
#ifdef YASM_LIB_INTERNAL
/*@reldef@*/ STAILQ_HEAD(yasm_datavalhead, yasm_dataval);
#endif
/** Create an immediate value from an expression.
* \param e expression (kept, do not free).
* \return Newly allocated immediate value.
*/
Massive libyasm / module interface update - Phase 1 As yasm has evolved, various minor additions have been made to libyasm to support the new features. These minor additions have accumulated, and some contain significant redundancies. In addition, the core focus of yasm has begun to move away from the front-end commandline program "yasm" to focusing on libyasm, a collection of reusable routines for use in all sorts of programs dealing with code at the assembly level, and the modules that provide specific features for parsing such code. This libyasm/module update focuses on cleaning up much of the cruft that has accumulated in libyasm, standardizing function names, eliminating redundancies, making many of the core objects more reusable for future extensions, and starting to make libyasm and the modules thread-safe by eliminating static variables. Specific changes include: - Making a symbol table data structure (no longer global). It follows a factory model for creating symrecs. - Label symbols now refer only to bytecodes; bytecodes have a pointer to their containing section. - Standardizing on *_create() and *_destroy() for allocation/deallocation. - Adding a standardized callback mechanism for all data structures that allow associated data. Allowed the removal of objfmt and dbgfmt-specific data callbacks in their interfaces. - Unmodularizing linemgr, but allowing multiple linemap instances (linemgr is now renamed linemap). - Remove references to lindex; all virtual lines (from linemap) are now just "line"s. - Eliminating the bytecode "type" enum, instead adding a standardized callback mechanism for custom (and standard internal) bytecode types. This will make it much easier to add new bytecodes, and eliminate the possibility of type collisions. This also allowed the removal of the of_data and df_data bytecodes, as objfmts and dbgfmts can now easily implement their own bytecodes, and the cleanup of arch's bytecode usage. - Remove the bytecodehead and sectionhead pseudo-containers, instead making true containers: section now implements all the functions of bytecodehead, and the new object data structure implements all the functions of sectionhead. - Add object data structure: it's a container that contains sections, a symbol table, and a line mapping for a single object. Every former use of sectionhead now takes an object. - Make arch interface and all standard architectures thread-safe: yasm_arch_module is the module interface; it contains a create() function that returns a yasm_arch * to store local yasm_arch data; all yasm_arch_module functions take the yasm_arch *. - Make nasm parser thread-safe. To be done in phase 2: making other module interfaces thread-safe. Note that while the module interface may be thread-safe, not all modules may be written in such a fashion (hopefully all the "standard" ones will be, but this is yet to be determined). svn path=/trunk/yasm/; revision=1058
21 years ago
/*@only@*/ yasm_immval *yasm_imm_create_expr(/*@keep@*/ yasm_expr *e);
/** Get the displacement portion of an effective address.
* \param ea effective address
* \return Expression representing the displacement (read-only).
*/
/*@observer@*/ const yasm_expr *yasm_ea_get_disp(const yasm_effaddr *ea);
/** Set the length of the displacement portion of an effective address.
* The length is specified in bits.
* \param ea effective address
* \param len length in bits
*/
void yasm_ea_set_len(yasm_effaddr *ea, unsigned int len);
/** Set/clear nosplit flag of an effective address.
* The nosplit flag indicates (for architectures that support complex effective
* addresses such as x86) if various types of complex effective addresses can
* be split into different forms in order to minimize instruction length.
* \param ea effective address
* \param nosplit nosplit flag setting (0=splits allowed, nonzero=splits
* not allowed)
*/
void yasm_ea_set_nosplit(yasm_effaddr *ea, unsigned int nosplit);
Preliminary GAS parser. Only a few instructions are supported at present. This work is being done under contract with a company that has requested to remain unnamed at the present time. * bc-int.h (yasm_effaddr): Add strong flag to indicate if the effective address is definitely an effective address; GAS does not use [] to designate effective addresses so it's otherwise impossible to tell the difference between "expr(,1)" and just "expr" (important for the relative jump instructions). * bytecode.h (yasm_ea_set_strong): New function to set the strong flag. * bytecode.c (yasm_ea_set_strong): Implementation. * x86bc.c (yasm_x86__ea_create_reg): Initialize strong flag. * arch.h (yasm_insn_operand): Add deref flag to indicate use of "*foo" in GAS syntax. * arch.c (yasm_operand_create_reg, yasm_operand_create_segreg) (yasm_operand_create_mem, yasm_operand_create_imm): Set deref flag to 0. * gas: GAS syntax lexer and parser. Not all directives are implemented yet (some will require additional core bytecodes). * elf-objfmt.c (elf_objfmt_section_switch): Add support for GAS-style section flags. * x86arch.h (yasm_arch_x86): Add parser setting. * x86arch.c (x86_create): Check for gas parser and initialize setting. * x86bc.c (yasm_x86__ea_create_expr): Transform val+RIP to val wrt RIP when using the GAS parser (this is how GAS interprets "expr(%rip)"). * x86id.re: Too many changes to enumerate in detail. Add new modifiers for GAS suffixes. Start using them in a couple instructions. Split check_id into subfunctions (still one entry point at present). (yasm_x86__finalize_insn): Support new modifiers, reverse operands, derefs. * yasm.c (main): Change all undef to extern when using GAS parser (this is default GAS behavior). svn path=/trunk/yasm/; revision=1239
19 years ago
/** Set/clear strong flag of an effective address.
* The strong flag indicates if an effective address is *definitely* an
* effective address. This is used in e.g. the GAS parser to differentiate
* between "expr" (which might or might not be an effective address) and
* "expr(,1)" (which is definitely an effective address).
* \param ea effective address
* \param strong strong flag setting (0=not strong, nonzero=strong)
*/
void yasm_ea_set_strong(yasm_effaddr *ea, unsigned int strong);
Move generation of arch instruction bytecodes from on-the-fly during the initial parse stage to a new pass between parse and optimization. This should allow for more accurate generation of arch bytecodes and other future code simplifications in arch. This change necessitated changing how bytecodes are extended from the base yasm_bytecode structure; the original method did not allow for bytecodes to be reliably changed from one type to another, as reallocation of the base structure to fit the new type could result in the entire structure being relocated on the heap, and thus all the pointer references to the original bytecode being lost. After this commit, the yasm_bytecode base structure has a void pointer to any extension data. This change rippled across all bytecode-creating source files, and comprises the majority of this commit. * bc-int.h (yasm_bytecode): Add contents pointer. (yasm_bytecode_callback): Make destroy() and print() take void *contents instead of bytecode pointer. (yasm_bc_create_common): Take a pointer to contents instead of datasize. (yasm_bc_transform): New; transforms a bytecode of any type into a different type. * bytecode.c (bytecode_data, bytecode_reserve, bytecode_incbin) (bytecode_align): Remove bc base structure. (bc_data_destroy, bc_data_print): Update to match yasm_bytecode_callback. (bc_reserve_destroy, bc_reserve_print): Likewise. (bc_incbin_destroy, bc_incbin_print): Likewise. (bc_align_destroy, bc_align_print): Likewise. (yasm_bc_create_common): Take a pointer to contents instead of datasize. (bc_data_resolve, bc_data_tobytes, yasm_bc_create_data): Update to use contents pointer. (bc_reserve_resolve, bc_reserve_tobytes, yasm_bc_create_reserve): Likewise. (bc_incbin_resolve, bc_incbin_tobytes, yasm_bc_create_incbin): Likewise. (yasm_bc_create_align): Likewise. (yasm_bc_destroy, yasm_bc_print): Update to match yasm_bytecode_callback. * section.c (yasm_object_get_general, yasm_object_create_absolute): Pass a NULL pointer instead of yasm_bytecode size to yasm_bc_create_common(). * stabs-dbgfmt.c (stabs_bc_str, stabs_bc_stab): Remove. (stabs_bc_str_destroy, stabs_bc_str_print): Update. (stabs_bc_stab_destroy, stabs_bc_stab_print): Likewise. (stabs_bc_str_callback, stabs_bc_stab_callback): Add common finalize(). (stabs_dbgfmt_append_bcstr): Update to use contents pointer. (stabs_dbgfmt_append_stab, stabs_dbgfmt_generate): Likewise. (stabs_bc_stab_tobytes, stabs_bc_str_tobytes): Likewise. * lc3barch.h (lc3b_insn): Move here from lc3bbc.c. (lc3b_new_insn_data, yasm_lc3b__bc_create_insn): Remove. (yasm_lc3b__bc_transform_insn): New. * lc3bbc.c (lc3b_insn): Remove (moved). (lc3b_bc_insn_destroy, lc3b_bc_insn_print): Update. (lc3b_bc_callback_insn): Add common finalize(). (lc3b_bc_insn_resolve, lc3b_insn_tobytes): Use contents pointer. (yasm_lc3b__bc_create_insn): Remove. (yasm_lc3b__bc_transform_insn): New. * lc3bid.re (yasm_lc3b__parse_insn): Directly create lc3b_insn. * x86arch.h (x86_insn, x86_jmp): Move here from x86bc.c (x86_new_insn_data, x86_new_jmp_data): Remove. (yasm_x86__bc_create_insn, yasm_x86__bc_create_jmp): Remove. (yasm_x86__bc_transform_insn, yasm_x86__bc_transform_jmp): New. * x86bc.c (x86_insn, x86_jmp): Remove (moved). (x86_bc_insn_destroy, x86_bc_insn_print): Update. (x86_bc_jmp_destroy, x86_bc_jmp_print): Likewise. (x86_bc_callback_insn, x86_bc_callback_jmp): Add common finalize(). (x86_bc_insn_resolve, x86_insn_tobytes): Use contents pointer. (x86_bc_jmp_resolve, x86_jmp_tobytes): Likewise. (yasm_x86__bc_create_insn, yasm_x86__bc_create_jmp): Remove. (yasm_x86__bc_transform_insn, yasm_x86__bc_transform_jmp): New. * x86id.re (yasm_x86__parse_insn, x86_parse_jmp): Directly create bytecode contents. * bc-int.h (yasm_bytecode_callback): Add new finalize() that will finalize a bytecode after the parse stage. (yasm_bc_finalize_common): New; common version of bytecode callback finalize function. * bytecode.h (yasm_bc_finalize): New wrapper around callback finalize(). * bytecode.c (yasm_bc_finalize): Implementation. (yasm_bc_finalize_common): Likewise. (bc_data_callback, bc_data_reserve_callback, bc_incbin_callback) (bc_align_callback): Add yasm_bc_finalize_common() as finalize() function. * section.h (yasm_object_finalize): New; finalizes an entire object. * section.c (yasm_object_finalize): Implementation. * yasm.c (main): Call yasm_object_finalize() after parse. * bc-int.h (yasm_effaddr): Add segreg. * bytecode.h (yasm_ea_set_segreg): New function to set segreg. * bytecode.c (yasm_ea_set_segreg): Implement. * x86bc.c (yasm_x86__ea_create_reg, x86_ea_print, x86_bc_insn_resolve) (x86_bc_insn_tobytes): Use new EA segreg location. * coretype.h: Move yasm_insn_operands definition from arch.h to here, as it is now used in prototypes in bytecode.h. * bytecode.c (bytecode_insn): New instruction bytecode. (bc_insn_destroy, bc_insn_print, bc_insn_finalize, bc_insn_resolve) (bc_insn_tobytes): New callback support functions. (bc_insn_callback): New. (yasm_bc_create_insn, yasm_bc_insn_add_prefix, yasm_bc_insn_add_seg_prefix): New parser-callable functions. * bytecode.h (yasm_bc_create_insn, yasm_bc_insn_add_prefix) (yasm_bc_insn_add_seg_prefix): Likewise. * nasm-bison.y: Call new insn bytecode functions rather than arch functions. * arch.h (YASM_ARCH_VERSION): Bump version. (yasm_arch): Rename and extend parse_insn to finalize_insn. Remove parse_prefix, parse_seg_prefix, and parse_seg_override. (yasm_arch_parse_insn): Rename to yasm_arch_finalize_insn. (yasm_arch_parse_prefix, yasm_arch_parse_seg_prefix) (yasm_arch_parse_seg_override): Remove. * lc3barch.c (yasm_lc3b_LTX_arch): Update to match new yasm_arch. * lc3barch.h (yasm_lc3b__parse_insn): Rename to yasm_lc3b__finalize_insn. * lc3bid.re (yasm_lc3b__parse_insn): Likewise. * x86arch.c (x86_parse_prefix, x86_parse_seg_prefix) (x86_parse_seg_override): Remove. (yasm_x86_LTX_arch): Update to match new yasm_arch. * x86arch.h (yasm_x86__parse_insn): Rename to yasm_x86__finalize_insn. * x86id.re (yasm_x86__parse_insn): Likewise. (x86_new_jmp): Rename to x86_finalize_jmp. * x86arch.h (yasm_x86__bc_apply_prefixes, yasm_x86__ea_init): New. * x86bc.c (yasm_x86__bc_apply_prefixes, yasm_x86__ea_init): Likewise. svn path=/trunk/yasm/; revision=1177
20 years ago
/** Set segment override for an effective address.
* Some architectures (such as x86) support segment overrides on effective
* addresses. A override of an override will result in a warning.
* \param ea effective address
* \param segreg segment register (0 if none)
*/
Revamp error/warning handling, using a model similar to Python's internal exception handling. There are now two layers an error or warning goes through before it hits the user: first an error is logged via yasm_error_set() (or yasm_warn_set() for a warning). Only one error may be set, whereas multiple warnings can be set (yasm_warn_set maintains a linked list). Then, calling yasm_errwarn_propagate() propagates any error and/or warning(s) to an errwarns structure and associates the errors/warnings with a line number at that time; this call also clears the pending errors/warnings and allows new ones to be set. The propagate function can safely be called when there are no pending error/warnings. In addition, there are some helper errwarn functions that allow clearing of an error/warning without propagating, getting it separately, etc. Still yet to be done: changing most/all uses of yasm_internal_error() into yasm_error_set(YASM_ERROR_ASSERTION). The main advantage this change has is making libyasm functions feel much more library like, and separating the user code line numbers from the inner function error handling (e.g. intnum create functions only needed the line number to trigger errors; this is no longer required). The set/propagate/etc functions use global data structures to avoid passing around a pointer to every function. This would need to be made thread-local data in a threaded app. Errwarns containers (that keep associated line numbers) are no longer global, so multiple source streams can be processed separately with no conflict (at least if there's only a single thread of execution). svn path=/trunk/yasm/; revision=1521
19 years ago
void yasm_ea_set_segreg(yasm_effaddr *ea, unsigned long segreg);
Move generation of arch instruction bytecodes from on-the-fly during the initial parse stage to a new pass between parse and optimization. This should allow for more accurate generation of arch bytecodes and other future code simplifications in arch. This change necessitated changing how bytecodes are extended from the base yasm_bytecode structure; the original method did not allow for bytecodes to be reliably changed from one type to another, as reallocation of the base structure to fit the new type could result in the entire structure being relocated on the heap, and thus all the pointer references to the original bytecode being lost. After this commit, the yasm_bytecode base structure has a void pointer to any extension data. This change rippled across all bytecode-creating source files, and comprises the majority of this commit. * bc-int.h (yasm_bytecode): Add contents pointer. (yasm_bytecode_callback): Make destroy() and print() take void *contents instead of bytecode pointer. (yasm_bc_create_common): Take a pointer to contents instead of datasize. (yasm_bc_transform): New; transforms a bytecode of any type into a different type. * bytecode.c (bytecode_data, bytecode_reserve, bytecode_incbin) (bytecode_align): Remove bc base structure. (bc_data_destroy, bc_data_print): Update to match yasm_bytecode_callback. (bc_reserve_destroy, bc_reserve_print): Likewise. (bc_incbin_destroy, bc_incbin_print): Likewise. (bc_align_destroy, bc_align_print): Likewise. (yasm_bc_create_common): Take a pointer to contents instead of datasize. (bc_data_resolve, bc_data_tobytes, yasm_bc_create_data): Update to use contents pointer. (bc_reserve_resolve, bc_reserve_tobytes, yasm_bc_create_reserve): Likewise. (bc_incbin_resolve, bc_incbin_tobytes, yasm_bc_create_incbin): Likewise. (yasm_bc_create_align): Likewise. (yasm_bc_destroy, yasm_bc_print): Update to match yasm_bytecode_callback. * section.c (yasm_object_get_general, yasm_object_create_absolute): Pass a NULL pointer instead of yasm_bytecode size to yasm_bc_create_common(). * stabs-dbgfmt.c (stabs_bc_str, stabs_bc_stab): Remove. (stabs_bc_str_destroy, stabs_bc_str_print): Update. (stabs_bc_stab_destroy, stabs_bc_stab_print): Likewise. (stabs_bc_str_callback, stabs_bc_stab_callback): Add common finalize(). (stabs_dbgfmt_append_bcstr): Update to use contents pointer. (stabs_dbgfmt_append_stab, stabs_dbgfmt_generate): Likewise. (stabs_bc_stab_tobytes, stabs_bc_str_tobytes): Likewise. * lc3barch.h (lc3b_insn): Move here from lc3bbc.c. (lc3b_new_insn_data, yasm_lc3b__bc_create_insn): Remove. (yasm_lc3b__bc_transform_insn): New. * lc3bbc.c (lc3b_insn): Remove (moved). (lc3b_bc_insn_destroy, lc3b_bc_insn_print): Update. (lc3b_bc_callback_insn): Add common finalize(). (lc3b_bc_insn_resolve, lc3b_insn_tobytes): Use contents pointer. (yasm_lc3b__bc_create_insn): Remove. (yasm_lc3b__bc_transform_insn): New. * lc3bid.re (yasm_lc3b__parse_insn): Directly create lc3b_insn. * x86arch.h (x86_insn, x86_jmp): Move here from x86bc.c (x86_new_insn_data, x86_new_jmp_data): Remove. (yasm_x86__bc_create_insn, yasm_x86__bc_create_jmp): Remove. (yasm_x86__bc_transform_insn, yasm_x86__bc_transform_jmp): New. * x86bc.c (x86_insn, x86_jmp): Remove (moved). (x86_bc_insn_destroy, x86_bc_insn_print): Update. (x86_bc_jmp_destroy, x86_bc_jmp_print): Likewise. (x86_bc_callback_insn, x86_bc_callback_jmp): Add common finalize(). (x86_bc_insn_resolve, x86_insn_tobytes): Use contents pointer. (x86_bc_jmp_resolve, x86_jmp_tobytes): Likewise. (yasm_x86__bc_create_insn, yasm_x86__bc_create_jmp): Remove. (yasm_x86__bc_transform_insn, yasm_x86__bc_transform_jmp): New. * x86id.re (yasm_x86__parse_insn, x86_parse_jmp): Directly create bytecode contents. * bc-int.h (yasm_bytecode_callback): Add new finalize() that will finalize a bytecode after the parse stage. (yasm_bc_finalize_common): New; common version of bytecode callback finalize function. * bytecode.h (yasm_bc_finalize): New wrapper around callback finalize(). * bytecode.c (yasm_bc_finalize): Implementation. (yasm_bc_finalize_common): Likewise. (bc_data_callback, bc_data_reserve_callback, bc_incbin_callback) (bc_align_callback): Add yasm_bc_finalize_common() as finalize() function. * section.h (yasm_object_finalize): New; finalizes an entire object. * section.c (yasm_object_finalize): Implementation. * yasm.c (main): Call yasm_object_finalize() after parse. * bc-int.h (yasm_effaddr): Add segreg. * bytecode.h (yasm_ea_set_segreg): New function to set segreg. * bytecode.c (yasm_ea_set_segreg): Implement. * x86bc.c (yasm_x86__ea_create_reg, x86_ea_print, x86_bc_insn_resolve) (x86_bc_insn_tobytes): Use new EA segreg location. * coretype.h: Move yasm_insn_operands definition from arch.h to here, as it is now used in prototypes in bytecode.h. * bytecode.c (bytecode_insn): New instruction bytecode. (bc_insn_destroy, bc_insn_print, bc_insn_finalize, bc_insn_resolve) (bc_insn_tobytes): New callback support functions. (bc_insn_callback): New. (yasm_bc_create_insn, yasm_bc_insn_add_prefix, yasm_bc_insn_add_seg_prefix): New parser-callable functions. * bytecode.h (yasm_bc_create_insn, yasm_bc_insn_add_prefix) (yasm_bc_insn_add_seg_prefix): Likewise. * nasm-bison.y: Call new insn bytecode functions rather than arch functions. * arch.h (YASM_ARCH_VERSION): Bump version. (yasm_arch): Rename and extend parse_insn to finalize_insn. Remove parse_prefix, parse_seg_prefix, and parse_seg_override. (yasm_arch_parse_insn): Rename to yasm_arch_finalize_insn. (yasm_arch_parse_prefix, yasm_arch_parse_seg_prefix) (yasm_arch_parse_seg_override): Remove. * lc3barch.c (yasm_lc3b_LTX_arch): Update to match new yasm_arch. * lc3barch.h (yasm_lc3b__parse_insn): Rename to yasm_lc3b__finalize_insn. * lc3bid.re (yasm_lc3b__parse_insn): Likewise. * x86arch.c (x86_parse_prefix, x86_parse_seg_prefix) (x86_parse_seg_override): Remove. (yasm_x86_LTX_arch): Update to match new yasm_arch. * x86arch.h (yasm_x86__parse_insn): Rename to yasm_x86__finalize_insn. * x86id.re (yasm_x86__parse_insn): Likewise. (x86_new_jmp): Rename to x86_finalize_jmp. * x86arch.h (yasm_x86__bc_apply_prefixes, yasm_x86__ea_init): New. * x86bc.c (yasm_x86__bc_apply_prefixes, yasm_x86__ea_init): Likewise. svn path=/trunk/yasm/; revision=1177
20 years ago
/** Delete (free allocated memory for) an effective address.
* \param ea effective address (only pointer to it).
*/
Massive libyasm / module interface update - Phase 1 As yasm has evolved, various minor additions have been made to libyasm to support the new features. These minor additions have accumulated, and some contain significant redundancies. In addition, the core focus of yasm has begun to move away from the front-end commandline program "yasm" to focusing on libyasm, a collection of reusable routines for use in all sorts of programs dealing with code at the assembly level, and the modules that provide specific features for parsing such code. This libyasm/module update focuses on cleaning up much of the cruft that has accumulated in libyasm, standardizing function names, eliminating redundancies, making many of the core objects more reusable for future extensions, and starting to make libyasm and the modules thread-safe by eliminating static variables. Specific changes include: - Making a symbol table data structure (no longer global). It follows a factory model for creating symrecs. - Label symbols now refer only to bytecodes; bytecodes have a pointer to their containing section. - Standardizing on *_create() and *_destroy() for allocation/deallocation. - Adding a standardized callback mechanism for all data structures that allow associated data. Allowed the removal of objfmt and dbgfmt-specific data callbacks in their interfaces. - Unmodularizing linemgr, but allowing multiple linemap instances (linemgr is now renamed linemap). - Remove references to lindex; all virtual lines (from linemap) are now just "line"s. - Eliminating the bytecode "type" enum, instead adding a standardized callback mechanism for custom (and standard internal) bytecode types. This will make it much easier to add new bytecodes, and eliminate the possibility of type collisions. This also allowed the removal of the of_data and df_data bytecodes, as objfmts and dbgfmts can now easily implement their own bytecodes, and the cleanup of arch's bytecode usage. - Remove the bytecodehead and sectionhead pseudo-containers, instead making true containers: section now implements all the functions of bytecodehead, and the new object data structure implements all the functions of sectionhead. - Add object data structure: it's a container that contains sections, a symbol table, and a line mapping for a single object. Every former use of sectionhead now takes an object. - Make arch interface and all standard architectures thread-safe: yasm_arch_module is the module interface; it contains a create() function that returns a yasm_arch * to store local yasm_arch data; all yasm_arch_module functions take the yasm_arch *. - Make nasm parser thread-safe. To be done in phase 2: making other module interfaces thread-safe. Note that while the module interface may be thread-safe, not all modules may be written in such a fashion (hopefully all the "standard" ones will be, but this is yet to be determined). svn path=/trunk/yasm/; revision=1058
21 years ago
void yasm_ea_destroy(/*@only@*/ yasm_effaddr *ea);
/** Print an effective address. For debugging purposes.
* \param f file
* \param indent_level indentation level
* \param ea effective address
*/
Massive libyasm / module interface update - Phase 1 As yasm has evolved, various minor additions have been made to libyasm to support the new features. These minor additions have accumulated, and some contain significant redundancies. In addition, the core focus of yasm has begun to move away from the front-end commandline program "yasm" to focusing on libyasm, a collection of reusable routines for use in all sorts of programs dealing with code at the assembly level, and the modules that provide specific features for parsing such code. This libyasm/module update focuses on cleaning up much of the cruft that has accumulated in libyasm, standardizing function names, eliminating redundancies, making many of the core objects more reusable for future extensions, and starting to make libyasm and the modules thread-safe by eliminating static variables. Specific changes include: - Making a symbol table data structure (no longer global). It follows a factory model for creating symrecs. - Label symbols now refer only to bytecodes; bytecodes have a pointer to their containing section. - Standardizing on *_create() and *_destroy() for allocation/deallocation. - Adding a standardized callback mechanism for all data structures that allow associated data. Allowed the removal of objfmt and dbgfmt-specific data callbacks in their interfaces. - Unmodularizing linemgr, but allowing multiple linemap instances (linemgr is now renamed linemap). - Remove references to lindex; all virtual lines (from linemap) are now just "line"s. - Eliminating the bytecode "type" enum, instead adding a standardized callback mechanism for custom (and standard internal) bytecode types. This will make it much easier to add new bytecodes, and eliminate the possibility of type collisions. This also allowed the removal of the of_data and df_data bytecodes, as objfmts and dbgfmts can now easily implement their own bytecodes, and the cleanup of arch's bytecode usage. - Remove the bytecodehead and sectionhead pseudo-containers, instead making true containers: section now implements all the functions of bytecodehead, and the new object data structure implements all the functions of sectionhead. - Add object data structure: it's a container that contains sections, a symbol table, and a line mapping for a single object. Every former use of sectionhead now takes an object. - Make arch interface and all standard architectures thread-safe: yasm_arch_module is the module interface; it contains a create() function that returns a yasm_arch * to store local yasm_arch data; all yasm_arch_module functions take the yasm_arch *. - Make nasm parser thread-safe. To be done in phase 2: making other module interfaces thread-safe. Note that while the module interface may be thread-safe, not all modules may be written in such a fashion (hopefully all the "standard" ones will be, but this is yet to be determined). svn path=/trunk/yasm/; revision=1058
21 years ago
void yasm_ea_print(const yasm_effaddr *ea, FILE *f, int indent_level);
/** Set multiple field of a bytecode.
* A bytecode can be repeated a number of times when output. This function
* sets that multiple.
* \param bc bytecode
* \param e multiple (kept, do not free)
*/
void yasm_bc_set_multiple(yasm_bytecode *bc, /*@keep@*/ yasm_expr *e);
/** Create a bytecode containing data value(s).
* \param datahead list of data values (kept, do not free)
* \param size storage size (in bytes) for each data value
* \param append_zero append a single zero byte after each data value
* (if non-zero)
* \param arch architecture (optional); if provided, data items
* are directly simplified to bytes if possible
Massive libyasm / module interface update - Phase 1 As yasm has evolved, various minor additions have been made to libyasm to support the new features. These minor additions have accumulated, and some contain significant redundancies. In addition, the core focus of yasm has begun to move away from the front-end commandline program "yasm" to focusing on libyasm, a collection of reusable routines for use in all sorts of programs dealing with code at the assembly level, and the modules that provide specific features for parsing such code. This libyasm/module update focuses on cleaning up much of the cruft that has accumulated in libyasm, standardizing function names, eliminating redundancies, making many of the core objects more reusable for future extensions, and starting to make libyasm and the modules thread-safe by eliminating static variables. Specific changes include: - Making a symbol table data structure (no longer global). It follows a factory model for creating symrecs. - Label symbols now refer only to bytecodes; bytecodes have a pointer to their containing section. - Standardizing on *_create() and *_destroy() for allocation/deallocation. - Adding a standardized callback mechanism for all data structures that allow associated data. Allowed the removal of objfmt and dbgfmt-specific data callbacks in their interfaces. - Unmodularizing linemgr, but allowing multiple linemap instances (linemgr is now renamed linemap). - Remove references to lindex; all virtual lines (from linemap) are now just "line"s. - Eliminating the bytecode "type" enum, instead adding a standardized callback mechanism for custom (and standard internal) bytecode types. This will make it much easier to add new bytecodes, and eliminate the possibility of type collisions. This also allowed the removal of the of_data and df_data bytecodes, as objfmts and dbgfmts can now easily implement their own bytecodes, and the cleanup of arch's bytecode usage. - Remove the bytecodehead and sectionhead pseudo-containers, instead making true containers: section now implements all the functions of bytecodehead, and the new object data structure implements all the functions of sectionhead. - Add object data structure: it's a container that contains sections, a symbol table, and a line mapping for a single object. Every former use of sectionhead now takes an object. - Make arch interface and all standard architectures thread-safe: yasm_arch_module is the module interface; it contains a create() function that returns a yasm_arch * to store local yasm_arch data; all yasm_arch_module functions take the yasm_arch *. - Make nasm parser thread-safe. To be done in phase 2: making other module interfaces thread-safe. Note that while the module interface may be thread-safe, not all modules may be written in such a fashion (hopefully all the "standard" ones will be, but this is yet to be determined). svn path=/trunk/yasm/; revision=1058
21 years ago
* \param line virtual line (from yasm_linemap)
* \return Newly allocated bytecode.
*/
Massive libyasm / module interface update - Phase 1 As yasm has evolved, various minor additions have been made to libyasm to support the new features. These minor additions have accumulated, and some contain significant redundancies. In addition, the core focus of yasm has begun to move away from the front-end commandline program "yasm" to focusing on libyasm, a collection of reusable routines for use in all sorts of programs dealing with code at the assembly level, and the modules that provide specific features for parsing such code. This libyasm/module update focuses on cleaning up much of the cruft that has accumulated in libyasm, standardizing function names, eliminating redundancies, making many of the core objects more reusable for future extensions, and starting to make libyasm and the modules thread-safe by eliminating static variables. Specific changes include: - Making a symbol table data structure (no longer global). It follows a factory model for creating symrecs. - Label symbols now refer only to bytecodes; bytecodes have a pointer to their containing section. - Standardizing on *_create() and *_destroy() for allocation/deallocation. - Adding a standardized callback mechanism for all data structures that allow associated data. Allowed the removal of objfmt and dbgfmt-specific data callbacks in their interfaces. - Unmodularizing linemgr, but allowing multiple linemap instances (linemgr is now renamed linemap). - Remove references to lindex; all virtual lines (from linemap) are now just "line"s. - Eliminating the bytecode "type" enum, instead adding a standardized callback mechanism for custom (and standard internal) bytecode types. This will make it much easier to add new bytecodes, and eliminate the possibility of type collisions. This also allowed the removal of the of_data and df_data bytecodes, as objfmts and dbgfmts can now easily implement their own bytecodes, and the cleanup of arch's bytecode usage. - Remove the bytecodehead and sectionhead pseudo-containers, instead making true containers: section now implements all the functions of bytecodehead, and the new object data structure implements all the functions of sectionhead. - Add object data structure: it's a container that contains sections, a symbol table, and a line mapping for a single object. Every former use of sectionhead now takes an object. - Make arch interface and all standard architectures thread-safe: yasm_arch_module is the module interface; it contains a create() function that returns a yasm_arch * to store local yasm_arch data; all yasm_arch_module functions take the yasm_arch *. - Make nasm parser thread-safe. To be done in phase 2: making other module interfaces thread-safe. Note that while the module interface may be thread-safe, not all modules may be written in such a fashion (hopefully all the "standard" ones will be, but this is yet to be determined). svn path=/trunk/yasm/; revision=1058
21 years ago
/*@only@*/ yasm_bytecode *yasm_bc_create_data
(yasm_datavalhead *datahead, unsigned int size, int append_zero,
/*@null@*/ yasm_arch *arch, unsigned long line);
/** Create a bytecode containing LEB128-encoded data value(s).
* \param datahead list of data values (kept, do not free)
* \param sign signedness (1=signed, 0=unsigned) of each data value
* \param line virtual line (from yasm_linemap)
* \return Newly allocated bytecode.
*/
/*@only@*/ yasm_bytecode *yasm_bc_create_leb128
(yasm_datavalhead *datahead, int sign, unsigned long line);
/** Create a bytecode reserving space.
* \param numitems number of reserve "items" (kept, do not free)
* \param itemsize reserved size (in bytes) for each item
Massive libyasm / module interface update - Phase 1 As yasm has evolved, various minor additions have been made to libyasm to support the new features. These minor additions have accumulated, and some contain significant redundancies. In addition, the core focus of yasm has begun to move away from the front-end commandline program "yasm" to focusing on libyasm, a collection of reusable routines for use in all sorts of programs dealing with code at the assembly level, and the modules that provide specific features for parsing such code. This libyasm/module update focuses on cleaning up much of the cruft that has accumulated in libyasm, standardizing function names, eliminating redundancies, making many of the core objects more reusable for future extensions, and starting to make libyasm and the modules thread-safe by eliminating static variables. Specific changes include: - Making a symbol table data structure (no longer global). It follows a factory model for creating symrecs. - Label symbols now refer only to bytecodes; bytecodes have a pointer to their containing section. - Standardizing on *_create() and *_destroy() for allocation/deallocation. - Adding a standardized callback mechanism for all data structures that allow associated data. Allowed the removal of objfmt and dbgfmt-specific data callbacks in their interfaces. - Unmodularizing linemgr, but allowing multiple linemap instances (linemgr is now renamed linemap). - Remove references to lindex; all virtual lines (from linemap) are now just "line"s. - Eliminating the bytecode "type" enum, instead adding a standardized callback mechanism for custom (and standard internal) bytecode types. This will make it much easier to add new bytecodes, and eliminate the possibility of type collisions. This also allowed the removal of the of_data and df_data bytecodes, as objfmts and dbgfmts can now easily implement their own bytecodes, and the cleanup of arch's bytecode usage. - Remove the bytecodehead and sectionhead pseudo-containers, instead making true containers: section now implements all the functions of bytecodehead, and the new object data structure implements all the functions of sectionhead. - Add object data structure: it's a container that contains sections, a symbol table, and a line mapping for a single object. Every former use of sectionhead now takes an object. - Make arch interface and all standard architectures thread-safe: yasm_arch_module is the module interface; it contains a create() function that returns a yasm_arch * to store local yasm_arch data; all yasm_arch_module functions take the yasm_arch *. - Make nasm parser thread-safe. To be done in phase 2: making other module interfaces thread-safe. Note that while the module interface may be thread-safe, not all modules may be written in such a fashion (hopefully all the "standard" ones will be, but this is yet to be determined). svn path=/trunk/yasm/; revision=1058
21 years ago
* \param line virtual line (from yasm_linemap)
* \return Newly allocated bytecode.
*/
Massive libyasm / module interface update - Phase 1 As yasm has evolved, various minor additions have been made to libyasm to support the new features. These minor additions have accumulated, and some contain significant redundancies. In addition, the core focus of yasm has begun to move away from the front-end commandline program "yasm" to focusing on libyasm, a collection of reusable routines for use in all sorts of programs dealing with code at the assembly level, and the modules that provide specific features for parsing such code. This libyasm/module update focuses on cleaning up much of the cruft that has accumulated in libyasm, standardizing function names, eliminating redundancies, making many of the core objects more reusable for future extensions, and starting to make libyasm and the modules thread-safe by eliminating static variables. Specific changes include: - Making a symbol table data structure (no longer global). It follows a factory model for creating symrecs. - Label symbols now refer only to bytecodes; bytecodes have a pointer to their containing section. - Standardizing on *_create() and *_destroy() for allocation/deallocation. - Adding a standardized callback mechanism for all data structures that allow associated data. Allowed the removal of objfmt and dbgfmt-specific data callbacks in their interfaces. - Unmodularizing linemgr, but allowing multiple linemap instances (linemgr is now renamed linemap). - Remove references to lindex; all virtual lines (from linemap) are now just "line"s. - Eliminating the bytecode "type" enum, instead adding a standardized callback mechanism for custom (and standard internal) bytecode types. This will make it much easier to add new bytecodes, and eliminate the possibility of type collisions. This also allowed the removal of the of_data and df_data bytecodes, as objfmts and dbgfmts can now easily implement their own bytecodes, and the cleanup of arch's bytecode usage. - Remove the bytecodehead and sectionhead pseudo-containers, instead making true containers: section now implements all the functions of bytecodehead, and the new object data structure implements all the functions of sectionhead. - Add object data structure: it's a container that contains sections, a symbol table, and a line mapping for a single object. Every former use of sectionhead now takes an object. - Make arch interface and all standard architectures thread-safe: yasm_arch_module is the module interface; it contains a create() function that returns a yasm_arch * to store local yasm_arch data; all yasm_arch_module functions take the yasm_arch *. - Make nasm parser thread-safe. To be done in phase 2: making other module interfaces thread-safe. Note that while the module interface may be thread-safe, not all modules may be written in such a fashion (hopefully all the "standard" ones will be, but this is yet to be determined). svn path=/trunk/yasm/; revision=1058
21 years ago
/*@only@*/ yasm_bytecode *yasm_bc_create_reserve
(/*@only@*/ yasm_expr *numitems, unsigned int itemsize,
unsigned long line);
/** Create a bytecode that includes a binary file verbatim.
* \param filename full path to binary file (kept, do not free)
* \param start starting location in file (in bytes) to read data from
* (kept, do not free); may be NULL to indicate 0
* \param maxlen maximum number of bytes to read from the file (kept, do
* do not free); may be NULL to indicate no maximum
Massive libyasm / module interface update - Phase 1 As yasm has evolved, various minor additions have been made to libyasm to support the new features. These minor additions have accumulated, and some contain significant redundancies. In addition, the core focus of yasm has begun to move away from the front-end commandline program "yasm" to focusing on libyasm, a collection of reusable routines for use in all sorts of programs dealing with code at the assembly level, and the modules that provide specific features for parsing such code. This libyasm/module update focuses on cleaning up much of the cruft that has accumulated in libyasm, standardizing function names, eliminating redundancies, making many of the core objects more reusable for future extensions, and starting to make libyasm and the modules thread-safe by eliminating static variables. Specific changes include: - Making a symbol table data structure (no longer global). It follows a factory model for creating symrecs. - Label symbols now refer only to bytecodes; bytecodes have a pointer to their containing section. - Standardizing on *_create() and *_destroy() for allocation/deallocation. - Adding a standardized callback mechanism for all data structures that allow associated data. Allowed the removal of objfmt and dbgfmt-specific data callbacks in their interfaces. - Unmodularizing linemgr, but allowing multiple linemap instances (linemgr is now renamed linemap). - Remove references to lindex; all virtual lines (from linemap) are now just "line"s. - Eliminating the bytecode "type" enum, instead adding a standardized callback mechanism for custom (and standard internal) bytecode types. This will make it much easier to add new bytecodes, and eliminate the possibility of type collisions. This also allowed the removal of the of_data and df_data bytecodes, as objfmts and dbgfmts can now easily implement their own bytecodes, and the cleanup of arch's bytecode usage. - Remove the bytecodehead and sectionhead pseudo-containers, instead making true containers: section now implements all the functions of bytecodehead, and the new object data structure implements all the functions of sectionhead. - Add object data structure: it's a container that contains sections, a symbol table, and a line mapping for a single object. Every former use of sectionhead now takes an object. - Make arch interface and all standard architectures thread-safe: yasm_arch_module is the module interface; it contains a create() function that returns a yasm_arch * to store local yasm_arch data; all yasm_arch_module functions take the yasm_arch *. - Make nasm parser thread-safe. To be done in phase 2: making other module interfaces thread-safe. Note that while the module interface may be thread-safe, not all modules may be written in such a fashion (hopefully all the "standard" ones will be, but this is yet to be determined). svn path=/trunk/yasm/; revision=1058
21 years ago
* \param line virtual line (from yasm_linemap) for the bytecode
* \return Newly allocated bytecode.
*/
Massive libyasm / module interface update - Phase 1 As yasm has evolved, various minor additions have been made to libyasm to support the new features. These minor additions have accumulated, and some contain significant redundancies. In addition, the core focus of yasm has begun to move away from the front-end commandline program "yasm" to focusing on libyasm, a collection of reusable routines for use in all sorts of programs dealing with code at the assembly level, and the modules that provide specific features for parsing such code. This libyasm/module update focuses on cleaning up much of the cruft that has accumulated in libyasm, standardizing function names, eliminating redundancies, making many of the core objects more reusable for future extensions, and starting to make libyasm and the modules thread-safe by eliminating static variables. Specific changes include: - Making a symbol table data structure (no longer global). It follows a factory model for creating symrecs. - Label symbols now refer only to bytecodes; bytecodes have a pointer to their containing section. - Standardizing on *_create() and *_destroy() for allocation/deallocation. - Adding a standardized callback mechanism for all data structures that allow associated data. Allowed the removal of objfmt and dbgfmt-specific data callbacks in their interfaces. - Unmodularizing linemgr, but allowing multiple linemap instances (linemgr is now renamed linemap). - Remove references to lindex; all virtual lines (from linemap) are now just "line"s. - Eliminating the bytecode "type" enum, instead adding a standardized callback mechanism for custom (and standard internal) bytecode types. This will make it much easier to add new bytecodes, and eliminate the possibility of type collisions. This also allowed the removal of the of_data and df_data bytecodes, as objfmts and dbgfmts can now easily implement their own bytecodes, and the cleanup of arch's bytecode usage. - Remove the bytecodehead and sectionhead pseudo-containers, instead making true containers: section now implements all the functions of bytecodehead, and the new object data structure implements all the functions of sectionhead. - Add object data structure: it's a container that contains sections, a symbol table, and a line mapping for a single object. Every former use of sectionhead now takes an object. - Make arch interface and all standard architectures thread-safe: yasm_arch_module is the module interface; it contains a create() function that returns a yasm_arch * to store local yasm_arch data; all yasm_arch_module functions take the yasm_arch *. - Make nasm parser thread-safe. To be done in phase 2: making other module interfaces thread-safe. Note that while the module interface may be thread-safe, not all modules may be written in such a fashion (hopefully all the "standard" ones will be, but this is yet to be determined). svn path=/trunk/yasm/; revision=1058
21 years ago
/*@only@*/ yasm_bytecode *yasm_bc_create_incbin
(/*@only@*/ char *filename, /*@only@*/ /*@null@*/ yasm_expr *start,
Massive libyasm / module interface update - Phase 1 As yasm has evolved, various minor additions have been made to libyasm to support the new features. These minor additions have accumulated, and some contain significant redundancies. In addition, the core focus of yasm has begun to move away from the front-end commandline program "yasm" to focusing on libyasm, a collection of reusable routines for use in all sorts of programs dealing with code at the assembly level, and the modules that provide specific features for parsing such code. This libyasm/module update focuses on cleaning up much of the cruft that has accumulated in libyasm, standardizing function names, eliminating redundancies, making many of the core objects more reusable for future extensions, and starting to make libyasm and the modules thread-safe by eliminating static variables. Specific changes include: - Making a symbol table data structure (no longer global). It follows a factory model for creating symrecs. - Label symbols now refer only to bytecodes; bytecodes have a pointer to their containing section. - Standardizing on *_create() and *_destroy() for allocation/deallocation. - Adding a standardized callback mechanism for all data structures that allow associated data. Allowed the removal of objfmt and dbgfmt-specific data callbacks in their interfaces. - Unmodularizing linemgr, but allowing multiple linemap instances (linemgr is now renamed linemap). - Remove references to lindex; all virtual lines (from linemap) are now just "line"s. - Eliminating the bytecode "type" enum, instead adding a standardized callback mechanism for custom (and standard internal) bytecode types. This will make it much easier to add new bytecodes, and eliminate the possibility of type collisions. This also allowed the removal of the of_data and df_data bytecodes, as objfmts and dbgfmts can now easily implement their own bytecodes, and the cleanup of arch's bytecode usage. - Remove the bytecodehead and sectionhead pseudo-containers, instead making true containers: section now implements all the functions of bytecodehead, and the new object data structure implements all the functions of sectionhead. - Add object data structure: it's a container that contains sections, a symbol table, and a line mapping for a single object. Every former use of sectionhead now takes an object. - Make arch interface and all standard architectures thread-safe: yasm_arch_module is the module interface; it contains a create() function that returns a yasm_arch * to store local yasm_arch data; all yasm_arch_module functions take the yasm_arch *. - Make nasm parser thread-safe. To be done in phase 2: making other module interfaces thread-safe. Note that while the module interface may be thread-safe, not all modules may be written in such a fashion (hopefully all the "standard" ones will be, but this is yet to be determined). svn path=/trunk/yasm/; revision=1058
21 years ago
/*@only@*/ /*@null@*/ yasm_expr *maxlen, unsigned long line);
/** Create a bytecode that aligns the following bytecode to a boundary.
* \param boundary byte alignment (must be a power of two)
* \param fill fill data (if NULL, code_fill or 0 is used)
* \param maxskip maximum number of bytes to skip
* \param code_fill code fill data (if NULL, 0 is used)
Massive libyasm / module interface update - Phase 1 As yasm has evolved, various minor additions have been made to libyasm to support the new features. These minor additions have accumulated, and some contain significant redundancies. In addition, the core focus of yasm has begun to move away from the front-end commandline program "yasm" to focusing on libyasm, a collection of reusable routines for use in all sorts of programs dealing with code at the assembly level, and the modules that provide specific features for parsing such code. This libyasm/module update focuses on cleaning up much of the cruft that has accumulated in libyasm, standardizing function names, eliminating redundancies, making many of the core objects more reusable for future extensions, and starting to make libyasm and the modules thread-safe by eliminating static variables. Specific changes include: - Making a symbol table data structure (no longer global). It follows a factory model for creating symrecs. - Label symbols now refer only to bytecodes; bytecodes have a pointer to their containing section. - Standardizing on *_create() and *_destroy() for allocation/deallocation. - Adding a standardized callback mechanism for all data structures that allow associated data. Allowed the removal of objfmt and dbgfmt-specific data callbacks in their interfaces. - Unmodularizing linemgr, but allowing multiple linemap instances (linemgr is now renamed linemap). - Remove references to lindex; all virtual lines (from linemap) are now just "line"s. - Eliminating the bytecode "type" enum, instead adding a standardized callback mechanism for custom (and standard internal) bytecode types. This will make it much easier to add new bytecodes, and eliminate the possibility of type collisions. This also allowed the removal of the of_data and df_data bytecodes, as objfmts and dbgfmts can now easily implement their own bytecodes, and the cleanup of arch's bytecode usage. - Remove the bytecodehead and sectionhead pseudo-containers, instead making true containers: section now implements all the functions of bytecodehead, and the new object data structure implements all the functions of sectionhead. - Add object data structure: it's a container that contains sections, a symbol table, and a line mapping for a single object. Every former use of sectionhead now takes an object. - Make arch interface and all standard architectures thread-safe: yasm_arch_module is the module interface; it contains a create() function that returns a yasm_arch * to store local yasm_arch data; all yasm_arch_module functions take the yasm_arch *. - Make nasm parser thread-safe. To be done in phase 2: making other module interfaces thread-safe. Note that while the module interface may be thread-safe, not all modules may be written in such a fashion (hopefully all the "standard" ones will be, but this is yet to be determined). svn path=/trunk/yasm/; revision=1058
21 years ago
* \param line virtual line (from yasm_linemap)
* \return Newly allocated bytecode.
* \note The precedence on generated fill is as follows:
* - from fill parameter (if not NULL)
* - from code_fill parameter (if not NULL)
* - 0
*/
Massive libyasm / module interface update - Phase 1 As yasm has evolved, various minor additions have been made to libyasm to support the new features. These minor additions have accumulated, and some contain significant redundancies. In addition, the core focus of yasm has begun to move away from the front-end commandline program "yasm" to focusing on libyasm, a collection of reusable routines for use in all sorts of programs dealing with code at the assembly level, and the modules that provide specific features for parsing such code. This libyasm/module update focuses on cleaning up much of the cruft that has accumulated in libyasm, standardizing function names, eliminating redundancies, making many of the core objects more reusable for future extensions, and starting to make libyasm and the modules thread-safe by eliminating static variables. Specific changes include: - Making a symbol table data structure (no longer global). It follows a factory model for creating symrecs. - Label symbols now refer only to bytecodes; bytecodes have a pointer to their containing section. - Standardizing on *_create() and *_destroy() for allocation/deallocation. - Adding a standardized callback mechanism for all data structures that allow associated data. Allowed the removal of objfmt and dbgfmt-specific data callbacks in their interfaces. - Unmodularizing linemgr, but allowing multiple linemap instances (linemgr is now renamed linemap). - Remove references to lindex; all virtual lines (from linemap) are now just "line"s. - Eliminating the bytecode "type" enum, instead adding a standardized callback mechanism for custom (and standard internal) bytecode types. This will make it much easier to add new bytecodes, and eliminate the possibility of type collisions. This also allowed the removal of the of_data and df_data bytecodes, as objfmts and dbgfmts can now easily implement their own bytecodes, and the cleanup of arch's bytecode usage. - Remove the bytecodehead and sectionhead pseudo-containers, instead making true containers: section now implements all the functions of bytecodehead, and the new object data structure implements all the functions of sectionhead. - Add object data structure: it's a container that contains sections, a symbol table, and a line mapping for a single object. Every former use of sectionhead now takes an object. - Make arch interface and all standard architectures thread-safe: yasm_arch_module is the module interface; it contains a create() function that returns a yasm_arch * to store local yasm_arch data; all yasm_arch_module functions take the yasm_arch *. - Make nasm parser thread-safe. To be done in phase 2: making other module interfaces thread-safe. Note that while the module interface may be thread-safe, not all modules may be written in such a fashion (hopefully all the "standard" ones will be, but this is yet to be determined). svn path=/trunk/yasm/; revision=1058
21 years ago
/*@only@*/ yasm_bytecode *yasm_bc_create_align
(/*@keep@*/ yasm_expr *boundary, /*@keep@*/ /*@null@*/ yasm_expr *fill,
/*@keep@*/ /*@null@*/ yasm_expr *maxskip,
/*@null@*/ const unsigned char **code_fill, unsigned long line);
/** Create a bytecode that puts the following bytecode at a fixed section
* offset.
* \param start section offset of following bytecode
* \param line virtual line (from yasm_linemap)
* \return Newly allocated bytecode.
*/
/*@only@*/ yasm_bytecode *yasm_bc_create_org
(unsigned long start, unsigned long line);
Move generation of arch instruction bytecodes from on-the-fly during the initial parse stage to a new pass between parse and optimization. This should allow for more accurate generation of arch bytecodes and other future code simplifications in arch. This change necessitated changing how bytecodes are extended from the base yasm_bytecode structure; the original method did not allow for bytecodes to be reliably changed from one type to another, as reallocation of the base structure to fit the new type could result in the entire structure being relocated on the heap, and thus all the pointer references to the original bytecode being lost. After this commit, the yasm_bytecode base structure has a void pointer to any extension data. This change rippled across all bytecode-creating source files, and comprises the majority of this commit. * bc-int.h (yasm_bytecode): Add contents pointer. (yasm_bytecode_callback): Make destroy() and print() take void *contents instead of bytecode pointer. (yasm_bc_create_common): Take a pointer to contents instead of datasize. (yasm_bc_transform): New; transforms a bytecode of any type into a different type. * bytecode.c (bytecode_data, bytecode_reserve, bytecode_incbin) (bytecode_align): Remove bc base structure. (bc_data_destroy, bc_data_print): Update to match yasm_bytecode_callback. (bc_reserve_destroy, bc_reserve_print): Likewise. (bc_incbin_destroy, bc_incbin_print): Likewise. (bc_align_destroy, bc_align_print): Likewise. (yasm_bc_create_common): Take a pointer to contents instead of datasize. (bc_data_resolve, bc_data_tobytes, yasm_bc_create_data): Update to use contents pointer. (bc_reserve_resolve, bc_reserve_tobytes, yasm_bc_create_reserve): Likewise. (bc_incbin_resolve, bc_incbin_tobytes, yasm_bc_create_incbin): Likewise. (yasm_bc_create_align): Likewise. (yasm_bc_destroy, yasm_bc_print): Update to match yasm_bytecode_callback. * section.c (yasm_object_get_general, yasm_object_create_absolute): Pass a NULL pointer instead of yasm_bytecode size to yasm_bc_create_common(). * stabs-dbgfmt.c (stabs_bc_str, stabs_bc_stab): Remove. (stabs_bc_str_destroy, stabs_bc_str_print): Update. (stabs_bc_stab_destroy, stabs_bc_stab_print): Likewise. (stabs_bc_str_callback, stabs_bc_stab_callback): Add common finalize(). (stabs_dbgfmt_append_bcstr): Update to use contents pointer. (stabs_dbgfmt_append_stab, stabs_dbgfmt_generate): Likewise. (stabs_bc_stab_tobytes, stabs_bc_str_tobytes): Likewise. * lc3barch.h (lc3b_insn): Move here from lc3bbc.c. (lc3b_new_insn_data, yasm_lc3b__bc_create_insn): Remove. (yasm_lc3b__bc_transform_insn): New. * lc3bbc.c (lc3b_insn): Remove (moved). (lc3b_bc_insn_destroy, lc3b_bc_insn_print): Update. (lc3b_bc_callback_insn): Add common finalize(). (lc3b_bc_insn_resolve, lc3b_insn_tobytes): Use contents pointer. (yasm_lc3b__bc_create_insn): Remove. (yasm_lc3b__bc_transform_insn): New. * lc3bid.re (yasm_lc3b__parse_insn): Directly create lc3b_insn. * x86arch.h (x86_insn, x86_jmp): Move here from x86bc.c (x86_new_insn_data, x86_new_jmp_data): Remove. (yasm_x86__bc_create_insn, yasm_x86__bc_create_jmp): Remove. (yasm_x86__bc_transform_insn, yasm_x86__bc_transform_jmp): New. * x86bc.c (x86_insn, x86_jmp): Remove (moved). (x86_bc_insn_destroy, x86_bc_insn_print): Update. (x86_bc_jmp_destroy, x86_bc_jmp_print): Likewise. (x86_bc_callback_insn, x86_bc_callback_jmp): Add common finalize(). (x86_bc_insn_resolve, x86_insn_tobytes): Use contents pointer. (x86_bc_jmp_resolve, x86_jmp_tobytes): Likewise. (yasm_x86__bc_create_insn, yasm_x86__bc_create_jmp): Remove. (yasm_x86__bc_transform_insn, yasm_x86__bc_transform_jmp): New. * x86id.re (yasm_x86__parse_insn, x86_parse_jmp): Directly create bytecode contents. * bc-int.h (yasm_bytecode_callback): Add new finalize() that will finalize a bytecode after the parse stage. (yasm_bc_finalize_common): New; common version of bytecode callback finalize function. * bytecode.h (yasm_bc_finalize): New wrapper around callback finalize(). * bytecode.c (yasm_bc_finalize): Implementation. (yasm_bc_finalize_common): Likewise. (bc_data_callback, bc_data_reserve_callback, bc_incbin_callback) (bc_align_callback): Add yasm_bc_finalize_common() as finalize() function. * section.h (yasm_object_finalize): New; finalizes an entire object. * section.c (yasm_object_finalize): Implementation. * yasm.c (main): Call yasm_object_finalize() after parse. * bc-int.h (yasm_effaddr): Add segreg. * bytecode.h (yasm_ea_set_segreg): New function to set segreg. * bytecode.c (yasm_ea_set_segreg): Implement. * x86bc.c (yasm_x86__ea_create_reg, x86_ea_print, x86_bc_insn_resolve) (x86_bc_insn_tobytes): Use new EA segreg location. * coretype.h: Move yasm_insn_operands definition from arch.h to here, as it is now used in prototypes in bytecode.h. * bytecode.c (bytecode_insn): New instruction bytecode. (bc_insn_destroy, bc_insn_print, bc_insn_finalize, bc_insn_resolve) (bc_insn_tobytes): New callback support functions. (bc_insn_callback): New. (yasm_bc_create_insn, yasm_bc_insn_add_prefix, yasm_bc_insn_add_seg_prefix): New parser-callable functions. * bytecode.h (yasm_bc_create_insn, yasm_bc_insn_add_prefix) (yasm_bc_insn_add_seg_prefix): Likewise. * nasm-bison.y: Call new insn bytecode functions rather than arch functions. * arch.h (YASM_ARCH_VERSION): Bump version. (yasm_arch): Rename and extend parse_insn to finalize_insn. Remove parse_prefix, parse_seg_prefix, and parse_seg_override. (yasm_arch_parse_insn): Rename to yasm_arch_finalize_insn. (yasm_arch_parse_prefix, yasm_arch_parse_seg_prefix) (yasm_arch_parse_seg_override): Remove. * lc3barch.c (yasm_lc3b_LTX_arch): Update to match new yasm_arch. * lc3barch.h (yasm_lc3b__parse_insn): Rename to yasm_lc3b__finalize_insn. * lc3bid.re (yasm_lc3b__parse_insn): Likewise. * x86arch.c (x86_parse_prefix, x86_parse_seg_prefix) (x86_parse_seg_override): Remove. (yasm_x86_LTX_arch): Update to match new yasm_arch. * x86arch.h (yasm_x86__parse_insn): Rename to yasm_x86__finalize_insn. * x86id.re (yasm_x86__parse_insn): Likewise. (x86_new_jmp): Rename to x86_finalize_jmp. * x86arch.h (yasm_x86__bc_apply_prefixes, yasm_x86__ea_init): New. * x86bc.c (yasm_x86__bc_apply_prefixes, yasm_x86__ea_init): Likewise. svn path=/trunk/yasm/; revision=1177
20 years ago
/** Create a bytecode that represents a single instruction.
* \param arch instruction's architecture
* \param insn_data data that identifies the type of instruction
* \param num_operands number of operands
* \param operands instruction operands (may be NULL if no operands)
* \param line virtual line (from yasm_linemap)
* \return Newly allocated bytecode.
* \note Keeps the list of operands; do not call yasm_ops_delete() after
* giving operands to this function.
*/
/*@only@*/ yasm_bytecode *yasm_bc_create_insn
(yasm_arch *arch, const unsigned long insn_data[4], int num_operands,
/*@null@*/ yasm_insn_operands *operands, unsigned long line);
/** Create a bytecode that represents a single empty (0 length) instruction.
* This is used for handling solitary prefixes.
* \param arch instruction's architecture
* \param line virtual line (from yasm_linemap)
* \return Newly allocated bytecode.
*/
/*@only@*/ yasm_bytecode *yasm_bc_create_empty_insn(yasm_arch *arch,
unsigned long line);
Move generation of arch instruction bytecodes from on-the-fly during the initial parse stage to a new pass between parse and optimization. This should allow for more accurate generation of arch bytecodes and other future code simplifications in arch. This change necessitated changing how bytecodes are extended from the base yasm_bytecode structure; the original method did not allow for bytecodes to be reliably changed from one type to another, as reallocation of the base structure to fit the new type could result in the entire structure being relocated on the heap, and thus all the pointer references to the original bytecode being lost. After this commit, the yasm_bytecode base structure has a void pointer to any extension data. This change rippled across all bytecode-creating source files, and comprises the majority of this commit. * bc-int.h (yasm_bytecode): Add contents pointer. (yasm_bytecode_callback): Make destroy() and print() take void *contents instead of bytecode pointer. (yasm_bc_create_common): Take a pointer to contents instead of datasize. (yasm_bc_transform): New; transforms a bytecode of any type into a different type. * bytecode.c (bytecode_data, bytecode_reserve, bytecode_incbin) (bytecode_align): Remove bc base structure. (bc_data_destroy, bc_data_print): Update to match yasm_bytecode_callback. (bc_reserve_destroy, bc_reserve_print): Likewise. (bc_incbin_destroy, bc_incbin_print): Likewise. (bc_align_destroy, bc_align_print): Likewise. (yasm_bc_create_common): Take a pointer to contents instead of datasize. (bc_data_resolve, bc_data_tobytes, yasm_bc_create_data): Update to use contents pointer. (bc_reserve_resolve, bc_reserve_tobytes, yasm_bc_create_reserve): Likewise. (bc_incbin_resolve, bc_incbin_tobytes, yasm_bc_create_incbin): Likewise. (yasm_bc_create_align): Likewise. (yasm_bc_destroy, yasm_bc_print): Update to match yasm_bytecode_callback. * section.c (yasm_object_get_general, yasm_object_create_absolute): Pass a NULL pointer instead of yasm_bytecode size to yasm_bc_create_common(). * stabs-dbgfmt.c (stabs_bc_str, stabs_bc_stab): Remove. (stabs_bc_str_destroy, stabs_bc_str_print): Update. (stabs_bc_stab_destroy, stabs_bc_stab_print): Likewise. (stabs_bc_str_callback, stabs_bc_stab_callback): Add common finalize(). (stabs_dbgfmt_append_bcstr): Update to use contents pointer. (stabs_dbgfmt_append_stab, stabs_dbgfmt_generate): Likewise. (stabs_bc_stab_tobytes, stabs_bc_str_tobytes): Likewise. * lc3barch.h (lc3b_insn): Move here from lc3bbc.c. (lc3b_new_insn_data, yasm_lc3b__bc_create_insn): Remove. (yasm_lc3b__bc_transform_insn): New. * lc3bbc.c (lc3b_insn): Remove (moved). (lc3b_bc_insn_destroy, lc3b_bc_insn_print): Update. (lc3b_bc_callback_insn): Add common finalize(). (lc3b_bc_insn_resolve, lc3b_insn_tobytes): Use contents pointer. (yasm_lc3b__bc_create_insn): Remove. (yasm_lc3b__bc_transform_insn): New. * lc3bid.re (yasm_lc3b__parse_insn): Directly create lc3b_insn. * x86arch.h (x86_insn, x86_jmp): Move here from x86bc.c (x86_new_insn_data, x86_new_jmp_data): Remove. (yasm_x86__bc_create_insn, yasm_x86__bc_create_jmp): Remove. (yasm_x86__bc_transform_insn, yasm_x86__bc_transform_jmp): New. * x86bc.c (x86_insn, x86_jmp): Remove (moved). (x86_bc_insn_destroy, x86_bc_insn_print): Update. (x86_bc_jmp_destroy, x86_bc_jmp_print): Likewise. (x86_bc_callback_insn, x86_bc_callback_jmp): Add common finalize(). (x86_bc_insn_resolve, x86_insn_tobytes): Use contents pointer. (x86_bc_jmp_resolve, x86_jmp_tobytes): Likewise. (yasm_x86__bc_create_insn, yasm_x86__bc_create_jmp): Remove. (yasm_x86__bc_transform_insn, yasm_x86__bc_transform_jmp): New. * x86id.re (yasm_x86__parse_insn, x86_parse_jmp): Directly create bytecode contents. * bc-int.h (yasm_bytecode_callback): Add new finalize() that will finalize a bytecode after the parse stage. (yasm_bc_finalize_common): New; common version of bytecode callback finalize function. * bytecode.h (yasm_bc_finalize): New wrapper around callback finalize(). * bytecode.c (yasm_bc_finalize): Implementation. (yasm_bc_finalize_common): Likewise. (bc_data_callback, bc_data_reserve_callback, bc_incbin_callback) (bc_align_callback): Add yasm_bc_finalize_common() as finalize() function. * section.h (yasm_object_finalize): New; finalizes an entire object. * section.c (yasm_object_finalize): Implementation. * yasm.c (main): Call yasm_object_finalize() after parse. * bc-int.h (yasm_effaddr): Add segreg. * bytecode.h (yasm_ea_set_segreg): New function to set segreg. * bytecode.c (yasm_ea_set_segreg): Implement. * x86bc.c (yasm_x86__ea_create_reg, x86_ea_print, x86_bc_insn_resolve) (x86_bc_insn_tobytes): Use new EA segreg location. * coretype.h: Move yasm_insn_operands definition from arch.h to here, as it is now used in prototypes in bytecode.h. * bytecode.c (bytecode_insn): New instruction bytecode. (bc_insn_destroy, bc_insn_print, bc_insn_finalize, bc_insn_resolve) (bc_insn_tobytes): New callback support functions. (bc_insn_callback): New. (yasm_bc_create_insn, yasm_bc_insn_add_prefix, yasm_bc_insn_add_seg_prefix): New parser-callable functions. * bytecode.h (yasm_bc_create_insn, yasm_bc_insn_add_prefix) (yasm_bc_insn_add_seg_prefix): Likewise. * nasm-bison.y: Call new insn bytecode functions rather than arch functions. * arch.h (YASM_ARCH_VERSION): Bump version. (yasm_arch): Rename and extend parse_insn to finalize_insn. Remove parse_prefix, parse_seg_prefix, and parse_seg_override. (yasm_arch_parse_insn): Rename to yasm_arch_finalize_insn. (yasm_arch_parse_prefix, yasm_arch_parse_seg_prefix) (yasm_arch_parse_seg_override): Remove. * lc3barch.c (yasm_lc3b_LTX_arch): Update to match new yasm_arch. * lc3barch.h (yasm_lc3b__parse_insn): Rename to yasm_lc3b__finalize_insn. * lc3bid.re (yasm_lc3b__parse_insn): Likewise. * x86arch.c (x86_parse_prefix, x86_parse_seg_prefix) (x86_parse_seg_override): Remove. (yasm_x86_LTX_arch): Update to match new yasm_arch. * x86arch.h (yasm_x86__parse_insn): Rename to yasm_x86__finalize_insn. * x86id.re (yasm_x86__parse_insn): Likewise. (x86_new_jmp): Rename to x86_finalize_jmp. * x86arch.h (yasm_x86__bc_apply_prefixes, yasm_x86__ea_init): New. * x86bc.c (yasm_x86__bc_apply_prefixes, yasm_x86__ea_init): Likewise. svn path=/trunk/yasm/; revision=1177
20 years ago
/** Associate a prefix with an instruction bytecode.
* \param bc instruction bytecode
* \param prefix_data data the identifies the prefix
*/
void yasm_bc_insn_add_prefix(yasm_bytecode *bc,
const unsigned long prefix_data[4]);
/** Associate a segment prefix with an instruction bytecode.
* \param bc instruction bytecode
* \param segreg data the identifies the segment register
Move generation of arch instruction bytecodes from on-the-fly during the initial parse stage to a new pass between parse and optimization. This should allow for more accurate generation of arch bytecodes and other future code simplifications in arch. This change necessitated changing how bytecodes are extended from the base yasm_bytecode structure; the original method did not allow for bytecodes to be reliably changed from one type to another, as reallocation of the base structure to fit the new type could result in the entire structure being relocated on the heap, and thus all the pointer references to the original bytecode being lost. After this commit, the yasm_bytecode base structure has a void pointer to any extension data. This change rippled across all bytecode-creating source files, and comprises the majority of this commit. * bc-int.h (yasm_bytecode): Add contents pointer. (yasm_bytecode_callback): Make destroy() and print() take void *contents instead of bytecode pointer. (yasm_bc_create_common): Take a pointer to contents instead of datasize. (yasm_bc_transform): New; transforms a bytecode of any type into a different type. * bytecode.c (bytecode_data, bytecode_reserve, bytecode_incbin) (bytecode_align): Remove bc base structure. (bc_data_destroy, bc_data_print): Update to match yasm_bytecode_callback. (bc_reserve_destroy, bc_reserve_print): Likewise. (bc_incbin_destroy, bc_incbin_print): Likewise. (bc_align_destroy, bc_align_print): Likewise. (yasm_bc_create_common): Take a pointer to contents instead of datasize. (bc_data_resolve, bc_data_tobytes, yasm_bc_create_data): Update to use contents pointer. (bc_reserve_resolve, bc_reserve_tobytes, yasm_bc_create_reserve): Likewise. (bc_incbin_resolve, bc_incbin_tobytes, yasm_bc_create_incbin): Likewise. (yasm_bc_create_align): Likewise. (yasm_bc_destroy, yasm_bc_print): Update to match yasm_bytecode_callback. * section.c (yasm_object_get_general, yasm_object_create_absolute): Pass a NULL pointer instead of yasm_bytecode size to yasm_bc_create_common(). * stabs-dbgfmt.c (stabs_bc_str, stabs_bc_stab): Remove. (stabs_bc_str_destroy, stabs_bc_str_print): Update. (stabs_bc_stab_destroy, stabs_bc_stab_print): Likewise. (stabs_bc_str_callback, stabs_bc_stab_callback): Add common finalize(). (stabs_dbgfmt_append_bcstr): Update to use contents pointer. (stabs_dbgfmt_append_stab, stabs_dbgfmt_generate): Likewise. (stabs_bc_stab_tobytes, stabs_bc_str_tobytes): Likewise. * lc3barch.h (lc3b_insn): Move here from lc3bbc.c. (lc3b_new_insn_data, yasm_lc3b__bc_create_insn): Remove. (yasm_lc3b__bc_transform_insn): New. * lc3bbc.c (lc3b_insn): Remove (moved). (lc3b_bc_insn_destroy, lc3b_bc_insn_print): Update. (lc3b_bc_callback_insn): Add common finalize(). (lc3b_bc_insn_resolve, lc3b_insn_tobytes): Use contents pointer. (yasm_lc3b__bc_create_insn): Remove. (yasm_lc3b__bc_transform_insn): New. * lc3bid.re (yasm_lc3b__parse_insn): Directly create lc3b_insn. * x86arch.h (x86_insn, x86_jmp): Move here from x86bc.c (x86_new_insn_data, x86_new_jmp_data): Remove. (yasm_x86__bc_create_insn, yasm_x86__bc_create_jmp): Remove. (yasm_x86__bc_transform_insn, yasm_x86__bc_transform_jmp): New. * x86bc.c (x86_insn, x86_jmp): Remove (moved). (x86_bc_insn_destroy, x86_bc_insn_print): Update. (x86_bc_jmp_destroy, x86_bc_jmp_print): Likewise. (x86_bc_callback_insn, x86_bc_callback_jmp): Add common finalize(). (x86_bc_insn_resolve, x86_insn_tobytes): Use contents pointer. (x86_bc_jmp_resolve, x86_jmp_tobytes): Likewise. (yasm_x86__bc_create_insn, yasm_x86__bc_create_jmp): Remove. (yasm_x86__bc_transform_insn, yasm_x86__bc_transform_jmp): New. * x86id.re (yasm_x86__parse_insn, x86_parse_jmp): Directly create bytecode contents. * bc-int.h (yasm_bytecode_callback): Add new finalize() that will finalize a bytecode after the parse stage. (yasm_bc_finalize_common): New; common version of bytecode callback finalize function. * bytecode.h (yasm_bc_finalize): New wrapper around callback finalize(). * bytecode.c (yasm_bc_finalize): Implementation. (yasm_bc_finalize_common): Likewise. (bc_data_callback, bc_data_reserve_callback, bc_incbin_callback) (bc_align_callback): Add yasm_bc_finalize_common() as finalize() function. * section.h (yasm_object_finalize): New; finalizes an entire object. * section.c (yasm_object_finalize): Implementation. * yasm.c (main): Call yasm_object_finalize() after parse. * bc-int.h (yasm_effaddr): Add segreg. * bytecode.h (yasm_ea_set_segreg): New function to set segreg. * bytecode.c (yasm_ea_set_segreg): Implement. * x86bc.c (yasm_x86__ea_create_reg, x86_ea_print, x86_bc_insn_resolve) (x86_bc_insn_tobytes): Use new EA segreg location. * coretype.h: Move yasm_insn_operands definition from arch.h to here, as it is now used in prototypes in bytecode.h. * bytecode.c (bytecode_insn): New instruction bytecode. (bc_insn_destroy, bc_insn_print, bc_insn_finalize, bc_insn_resolve) (bc_insn_tobytes): New callback support functions. (bc_insn_callback): New. (yasm_bc_create_insn, yasm_bc_insn_add_prefix, yasm_bc_insn_add_seg_prefix): New parser-callable functions. * bytecode.h (yasm_bc_create_insn, yasm_bc_insn_add_prefix) (yasm_bc_insn_add_seg_prefix): Likewise. * nasm-bison.y: Call new insn bytecode functions rather than arch functions. * arch.h (YASM_ARCH_VERSION): Bump version. (yasm_arch): Rename and extend parse_insn to finalize_insn. Remove parse_prefix, parse_seg_prefix, and parse_seg_override. (yasm_arch_parse_insn): Rename to yasm_arch_finalize_insn. (yasm_arch_parse_prefix, yasm_arch_parse_seg_prefix) (yasm_arch_parse_seg_override): Remove. * lc3barch.c (yasm_lc3b_LTX_arch): Update to match new yasm_arch. * lc3barch.h (yasm_lc3b__parse_insn): Rename to yasm_lc3b__finalize_insn. * lc3bid.re (yasm_lc3b__parse_insn): Likewise. * x86arch.c (x86_parse_prefix, x86_parse_seg_prefix) (x86_parse_seg_override): Remove. (yasm_x86_LTX_arch): Update to match new yasm_arch. * x86arch.h (yasm_x86__parse_insn): Rename to yasm_x86__finalize_insn. * x86id.re (yasm_x86__parse_insn): Likewise. (x86_new_jmp): Rename to x86_finalize_jmp. * x86arch.h (yasm_x86__bc_apply_prefixes, yasm_x86__ea_init): New. * x86bc.c (yasm_x86__bc_apply_prefixes, yasm_x86__ea_init): Likewise. svn path=/trunk/yasm/; revision=1177
20 years ago
*/
void yasm_bc_insn_add_seg_prefix(yasm_bytecode *bc, unsigned long segreg);
Massive libyasm / module interface update - Phase 1 As yasm has evolved, various minor additions have been made to libyasm to support the new features. These minor additions have accumulated, and some contain significant redundancies. In addition, the core focus of yasm has begun to move away from the front-end commandline program "yasm" to focusing on libyasm, a collection of reusable routines for use in all sorts of programs dealing with code at the assembly level, and the modules that provide specific features for parsing such code. This libyasm/module update focuses on cleaning up much of the cruft that has accumulated in libyasm, standardizing function names, eliminating redundancies, making many of the core objects more reusable for future extensions, and starting to make libyasm and the modules thread-safe by eliminating static variables. Specific changes include: - Making a symbol table data structure (no longer global). It follows a factory model for creating symrecs. - Label symbols now refer only to bytecodes; bytecodes have a pointer to their containing section. - Standardizing on *_create() and *_destroy() for allocation/deallocation. - Adding a standardized callback mechanism for all data structures that allow associated data. Allowed the removal of objfmt and dbgfmt-specific data callbacks in their interfaces. - Unmodularizing linemgr, but allowing multiple linemap instances (linemgr is now renamed linemap). - Remove references to lindex; all virtual lines (from linemap) are now just "line"s. - Eliminating the bytecode "type" enum, instead adding a standardized callback mechanism for custom (and standard internal) bytecode types. This will make it much easier to add new bytecodes, and eliminate the possibility of type collisions. This also allowed the removal of the of_data and df_data bytecodes, as objfmts and dbgfmts can now easily implement their own bytecodes, and the cleanup of arch's bytecode usage. - Remove the bytecodehead and sectionhead pseudo-containers, instead making true containers: section now implements all the functions of bytecodehead, and the new object data structure implements all the functions of sectionhead. - Add object data structure: it's a container that contains sections, a symbol table, and a line mapping for a single object. Every former use of sectionhead now takes an object. - Make arch interface and all standard architectures thread-safe: yasm_arch_module is the module interface; it contains a create() function that returns a yasm_arch * to store local yasm_arch data; all yasm_arch_module functions take the yasm_arch *. - Make nasm parser thread-safe. To be done in phase 2: making other module interfaces thread-safe. Note that while the module interface may be thread-safe, not all modules may be written in such a fashion (hopefully all the "standard" ones will be, but this is yet to be determined). svn path=/trunk/yasm/; revision=1058
21 years ago
/** Get the section that contains a particular bytecode.
* \param bc bytecode
* \return Section containing bc (can be NULL if bytecode is not part of a
* section).
*/
Massive libyasm / module interface update - Phase 1 As yasm has evolved, various minor additions have been made to libyasm to support the new features. These minor additions have accumulated, and some contain significant redundancies. In addition, the core focus of yasm has begun to move away from the front-end commandline program "yasm" to focusing on libyasm, a collection of reusable routines for use in all sorts of programs dealing with code at the assembly level, and the modules that provide specific features for parsing such code. This libyasm/module update focuses on cleaning up much of the cruft that has accumulated in libyasm, standardizing function names, eliminating redundancies, making many of the core objects more reusable for future extensions, and starting to make libyasm and the modules thread-safe by eliminating static variables. Specific changes include: - Making a symbol table data structure (no longer global). It follows a factory model for creating symrecs. - Label symbols now refer only to bytecodes; bytecodes have a pointer to their containing section. - Standardizing on *_create() and *_destroy() for allocation/deallocation. - Adding a standardized callback mechanism for all data structures that allow associated data. Allowed the removal of objfmt and dbgfmt-specific data callbacks in their interfaces. - Unmodularizing linemgr, but allowing multiple linemap instances (linemgr is now renamed linemap). - Remove references to lindex; all virtual lines (from linemap) are now just "line"s. - Eliminating the bytecode "type" enum, instead adding a standardized callback mechanism for custom (and standard internal) bytecode types. This will make it much easier to add new bytecodes, and eliminate the possibility of type collisions. This also allowed the removal of the of_data and df_data bytecodes, as objfmts and dbgfmts can now easily implement their own bytecodes, and the cleanup of arch's bytecode usage. - Remove the bytecodehead and sectionhead pseudo-containers, instead making true containers: section now implements all the functions of bytecodehead, and the new object data structure implements all the functions of sectionhead. - Add object data structure: it's a container that contains sections, a symbol table, and a line mapping for a single object. Every former use of sectionhead now takes an object. - Make arch interface and all standard architectures thread-safe: yasm_arch_module is the module interface; it contains a create() function that returns a yasm_arch * to store local yasm_arch data; all yasm_arch_module functions take the yasm_arch *. - Make nasm parser thread-safe. To be done in phase 2: making other module interfaces thread-safe. Note that while the module interface may be thread-safe, not all modules may be written in such a fashion (hopefully all the "standard" ones will be, but this is yet to be determined). svn path=/trunk/yasm/; revision=1058
21 years ago
/*@dependent@*/ /*@null@*/ yasm_section *yasm_bc_get_section
(yasm_bytecode *bc);
#ifdef YASM_LIB_INTERNAL
/** Add to the list of symrecs that reference a bytecode. For symrec use
* only.
* \param bc bytecode
* \param sym symbol
*/
void yasm_bc__add_symrec(yasm_bytecode *bc, /*@dependent@*/ yasm_symrec *sym);
#endif
Massive libyasm / module interface update - Phase 1 As yasm has evolved, various minor additions have been made to libyasm to support the new features. These minor additions have accumulated, and some contain significant redundancies. In addition, the core focus of yasm has begun to move away from the front-end commandline program "yasm" to focusing on libyasm, a collection of reusable routines for use in all sorts of programs dealing with code at the assembly level, and the modules that provide specific features for parsing such code. This libyasm/module update focuses on cleaning up much of the cruft that has accumulated in libyasm, standardizing function names, eliminating redundancies, making many of the core objects more reusable for future extensions, and starting to make libyasm and the modules thread-safe by eliminating static variables. Specific changes include: - Making a symbol table data structure (no longer global). It follows a factory model for creating symrecs. - Label symbols now refer only to bytecodes; bytecodes have a pointer to their containing section. - Standardizing on *_create() and *_destroy() for allocation/deallocation. - Adding a standardized callback mechanism for all data structures that allow associated data. Allowed the removal of objfmt and dbgfmt-specific data callbacks in their interfaces. - Unmodularizing linemgr, but allowing multiple linemap instances (linemgr is now renamed linemap). - Remove references to lindex; all virtual lines (from linemap) are now just "line"s. - Eliminating the bytecode "type" enum, instead adding a standardized callback mechanism for custom (and standard internal) bytecode types. This will make it much easier to add new bytecodes, and eliminate the possibility of type collisions. This also allowed the removal of the of_data and df_data bytecodes, as objfmts and dbgfmts can now easily implement their own bytecodes, and the cleanup of arch's bytecode usage. - Remove the bytecodehead and sectionhead pseudo-containers, instead making true containers: section now implements all the functions of bytecodehead, and the new object data structure implements all the functions of sectionhead. - Add object data structure: it's a container that contains sections, a symbol table, and a line mapping for a single object. Every former use of sectionhead now takes an object. - Make arch interface and all standard architectures thread-safe: yasm_arch_module is the module interface; it contains a create() function that returns a yasm_arch * to store local yasm_arch data; all yasm_arch_module functions take the yasm_arch *. - Make nasm parser thread-safe. To be done in phase 2: making other module interfaces thread-safe. Note that while the module interface may be thread-safe, not all modules may be written in such a fashion (hopefully all the "standard" ones will be, but this is yet to be determined). svn path=/trunk/yasm/; revision=1058
21 years ago
/** Delete (free allocated memory for) a bytecode.
* \param bc bytecode (only pointer to it); may be NULL
*/
Massive libyasm / module interface update - Phase 1 As yasm has evolved, various minor additions have been made to libyasm to support the new features. These minor additions have accumulated, and some contain significant redundancies. In addition, the core focus of yasm has begun to move away from the front-end commandline program "yasm" to focusing on libyasm, a collection of reusable routines for use in all sorts of programs dealing with code at the assembly level, and the modules that provide specific features for parsing such code. This libyasm/module update focuses on cleaning up much of the cruft that has accumulated in libyasm, standardizing function names, eliminating redundancies, making many of the core objects more reusable for future extensions, and starting to make libyasm and the modules thread-safe by eliminating static variables. Specific changes include: - Making a symbol table data structure (no longer global). It follows a factory model for creating symrecs. - Label symbols now refer only to bytecodes; bytecodes have a pointer to their containing section. - Standardizing on *_create() and *_destroy() for allocation/deallocation. - Adding a standardized callback mechanism for all data structures that allow associated data. Allowed the removal of objfmt and dbgfmt-specific data callbacks in their interfaces. - Unmodularizing linemgr, but allowing multiple linemap instances (linemgr is now renamed linemap). - Remove references to lindex; all virtual lines (from linemap) are now just "line"s. - Eliminating the bytecode "type" enum, instead adding a standardized callback mechanism for custom (and standard internal) bytecode types. This will make it much easier to add new bytecodes, and eliminate the possibility of type collisions. This also allowed the removal of the of_data and df_data bytecodes, as objfmts and dbgfmts can now easily implement their own bytecodes, and the cleanup of arch's bytecode usage. - Remove the bytecodehead and sectionhead pseudo-containers, instead making true containers: section now implements all the functions of bytecodehead, and the new object data structure implements all the functions of sectionhead. - Add object data structure: it's a container that contains sections, a symbol table, and a line mapping for a single object. Every former use of sectionhead now takes an object. - Make arch interface and all standard architectures thread-safe: yasm_arch_module is the module interface; it contains a create() function that returns a yasm_arch * to store local yasm_arch data; all yasm_arch_module functions take the yasm_arch *. - Make nasm parser thread-safe. To be done in phase 2: making other module interfaces thread-safe. Note that while the module interface may be thread-safe, not all modules may be written in such a fashion (hopefully all the "standard" ones will be, but this is yet to be determined). svn path=/trunk/yasm/; revision=1058
21 years ago
void yasm_bc_destroy(/*@only@*/ /*@null@*/ yasm_bytecode *bc);
/** Print a bytecode. For debugging purposes.
* \param f file
* \param indent_level indentation level
* \param bc bytecode
*/
Massive libyasm / module interface update - Phase 1 As yasm has evolved, various minor additions have been made to libyasm to support the new features. These minor additions have accumulated, and some contain significant redundancies. In addition, the core focus of yasm has begun to move away from the front-end commandline program "yasm" to focusing on libyasm, a collection of reusable routines for use in all sorts of programs dealing with code at the assembly level, and the modules that provide specific features for parsing such code. This libyasm/module update focuses on cleaning up much of the cruft that has accumulated in libyasm, standardizing function names, eliminating redundancies, making many of the core objects more reusable for future extensions, and starting to make libyasm and the modules thread-safe by eliminating static variables. Specific changes include: - Making a symbol table data structure (no longer global). It follows a factory model for creating symrecs. - Label symbols now refer only to bytecodes; bytecodes have a pointer to their containing section. - Standardizing on *_create() and *_destroy() for allocation/deallocation. - Adding a standardized callback mechanism for all data structures that allow associated data. Allowed the removal of objfmt and dbgfmt-specific data callbacks in their interfaces. - Unmodularizing linemgr, but allowing multiple linemap instances (linemgr is now renamed linemap). - Remove references to lindex; all virtual lines (from linemap) are now just "line"s. - Eliminating the bytecode "type" enum, instead adding a standardized callback mechanism for custom (and standard internal) bytecode types. This will make it much easier to add new bytecodes, and eliminate the possibility of type collisions. This also allowed the removal of the of_data and df_data bytecodes, as objfmts and dbgfmts can now easily implement their own bytecodes, and the cleanup of arch's bytecode usage. - Remove the bytecodehead and sectionhead pseudo-containers, instead making true containers: section now implements all the functions of bytecodehead, and the new object data structure implements all the functions of sectionhead. - Add object data structure: it's a container that contains sections, a symbol table, and a line mapping for a single object. Every former use of sectionhead now takes an object. - Make arch interface and all standard architectures thread-safe: yasm_arch_module is the module interface; it contains a create() function that returns a yasm_arch * to store local yasm_arch data; all yasm_arch_module functions take the yasm_arch *. - Make nasm parser thread-safe. To be done in phase 2: making other module interfaces thread-safe. Note that while the module interface may be thread-safe, not all modules may be written in such a fashion (hopefully all the "standard" ones will be, but this is yet to be determined). svn path=/trunk/yasm/; revision=1058
21 years ago
void yasm_bc_print(const yasm_bytecode *bc, FILE *f, int indent_level);
Move generation of arch instruction bytecodes from on-the-fly during the initial parse stage to a new pass between parse and optimization. This should allow for more accurate generation of arch bytecodes and other future code simplifications in arch. This change necessitated changing how bytecodes are extended from the base yasm_bytecode structure; the original method did not allow for bytecodes to be reliably changed from one type to another, as reallocation of the base structure to fit the new type could result in the entire structure being relocated on the heap, and thus all the pointer references to the original bytecode being lost. After this commit, the yasm_bytecode base structure has a void pointer to any extension data. This change rippled across all bytecode-creating source files, and comprises the majority of this commit. * bc-int.h (yasm_bytecode): Add contents pointer. (yasm_bytecode_callback): Make destroy() and print() take void *contents instead of bytecode pointer. (yasm_bc_create_common): Take a pointer to contents instead of datasize. (yasm_bc_transform): New; transforms a bytecode of any type into a different type. * bytecode.c (bytecode_data, bytecode_reserve, bytecode_incbin) (bytecode_align): Remove bc base structure. (bc_data_destroy, bc_data_print): Update to match yasm_bytecode_callback. (bc_reserve_destroy, bc_reserve_print): Likewise. (bc_incbin_destroy, bc_incbin_print): Likewise. (bc_align_destroy, bc_align_print): Likewise. (yasm_bc_create_common): Take a pointer to contents instead of datasize. (bc_data_resolve, bc_data_tobytes, yasm_bc_create_data): Update to use contents pointer. (bc_reserve_resolve, bc_reserve_tobytes, yasm_bc_create_reserve): Likewise. (bc_incbin_resolve, bc_incbin_tobytes, yasm_bc_create_incbin): Likewise. (yasm_bc_create_align): Likewise. (yasm_bc_destroy, yasm_bc_print): Update to match yasm_bytecode_callback. * section.c (yasm_object_get_general, yasm_object_create_absolute): Pass a NULL pointer instead of yasm_bytecode size to yasm_bc_create_common(). * stabs-dbgfmt.c (stabs_bc_str, stabs_bc_stab): Remove. (stabs_bc_str_destroy, stabs_bc_str_print): Update. (stabs_bc_stab_destroy, stabs_bc_stab_print): Likewise. (stabs_bc_str_callback, stabs_bc_stab_callback): Add common finalize(). (stabs_dbgfmt_append_bcstr): Update to use contents pointer. (stabs_dbgfmt_append_stab, stabs_dbgfmt_generate): Likewise. (stabs_bc_stab_tobytes, stabs_bc_str_tobytes): Likewise. * lc3barch.h (lc3b_insn): Move here from lc3bbc.c. (lc3b_new_insn_data, yasm_lc3b__bc_create_insn): Remove. (yasm_lc3b__bc_transform_insn): New. * lc3bbc.c (lc3b_insn): Remove (moved). (lc3b_bc_insn_destroy, lc3b_bc_insn_print): Update. (lc3b_bc_callback_insn): Add common finalize(). (lc3b_bc_insn_resolve, lc3b_insn_tobytes): Use contents pointer. (yasm_lc3b__bc_create_insn): Remove. (yasm_lc3b__bc_transform_insn): New. * lc3bid.re (yasm_lc3b__parse_insn): Directly create lc3b_insn. * x86arch.h (x86_insn, x86_jmp): Move here from x86bc.c (x86_new_insn_data, x86_new_jmp_data): Remove. (yasm_x86__bc_create_insn, yasm_x86__bc_create_jmp): Remove. (yasm_x86__bc_transform_insn, yasm_x86__bc_transform_jmp): New. * x86bc.c (x86_insn, x86_jmp): Remove (moved). (x86_bc_insn_destroy, x86_bc_insn_print): Update. (x86_bc_jmp_destroy, x86_bc_jmp_print): Likewise. (x86_bc_callback_insn, x86_bc_callback_jmp): Add common finalize(). (x86_bc_insn_resolve, x86_insn_tobytes): Use contents pointer. (x86_bc_jmp_resolve, x86_jmp_tobytes): Likewise. (yasm_x86__bc_create_insn, yasm_x86__bc_create_jmp): Remove. (yasm_x86__bc_transform_insn, yasm_x86__bc_transform_jmp): New. * x86id.re (yasm_x86__parse_insn, x86_parse_jmp): Directly create bytecode contents. * bc-int.h (yasm_bytecode_callback): Add new finalize() that will finalize a bytecode after the parse stage. (yasm_bc_finalize_common): New; common version of bytecode callback finalize function. * bytecode.h (yasm_bc_finalize): New wrapper around callback finalize(). * bytecode.c (yasm_bc_finalize): Implementation. (yasm_bc_finalize_common): Likewise. (bc_data_callback, bc_data_reserve_callback, bc_incbin_callback) (bc_align_callback): Add yasm_bc_finalize_common() as finalize() function. * section.h (yasm_object_finalize): New; finalizes an entire object. * section.c (yasm_object_finalize): Implementation. * yasm.c (main): Call yasm_object_finalize() after parse. * bc-int.h (yasm_effaddr): Add segreg. * bytecode.h (yasm_ea_set_segreg): New function to set segreg. * bytecode.c (yasm_ea_set_segreg): Implement. * x86bc.c (yasm_x86__ea_create_reg, x86_ea_print, x86_bc_insn_resolve) (x86_bc_insn_tobytes): Use new EA segreg location. * coretype.h: Move yasm_insn_operands definition from arch.h to here, as it is now used in prototypes in bytecode.h. * bytecode.c (bytecode_insn): New instruction bytecode. (bc_insn_destroy, bc_insn_print, bc_insn_finalize, bc_insn_resolve) (bc_insn_tobytes): New callback support functions. (bc_insn_callback): New. (yasm_bc_create_insn, yasm_bc_insn_add_prefix, yasm_bc_insn_add_seg_prefix): New parser-callable functions. * bytecode.h (yasm_bc_create_insn, yasm_bc_insn_add_prefix) (yasm_bc_insn_add_seg_prefix): Likewise. * nasm-bison.y: Call new insn bytecode functions rather than arch functions. * arch.h (YASM_ARCH_VERSION): Bump version. (yasm_arch): Rename and extend parse_insn to finalize_insn. Remove parse_prefix, parse_seg_prefix, and parse_seg_override. (yasm_arch_parse_insn): Rename to yasm_arch_finalize_insn. (yasm_arch_parse_prefix, yasm_arch_parse_seg_prefix) (yasm_arch_parse_seg_override): Remove. * lc3barch.c (yasm_lc3b_LTX_arch): Update to match new yasm_arch. * lc3barch.h (yasm_lc3b__parse_insn): Rename to yasm_lc3b__finalize_insn. * lc3bid.re (yasm_lc3b__parse_insn): Likewise. * x86arch.c (x86_parse_prefix, x86_parse_seg_prefix) (x86_parse_seg_override): Remove. (yasm_x86_LTX_arch): Update to match new yasm_arch. * x86arch.h (yasm_x86__parse_insn): Rename to yasm_x86__finalize_insn. * x86id.re (yasm_x86__parse_insn): Likewise. (x86_new_jmp): Rename to x86_finalize_jmp. * x86arch.h (yasm_x86__bc_apply_prefixes, yasm_x86__ea_init): New. * x86bc.c (yasm_x86__bc_apply_prefixes, yasm_x86__ea_init): Likewise. svn path=/trunk/yasm/; revision=1177
20 years ago
/** Finalize a bytecode after parsing.
* \param bc bytecode
* \param prev_bc bytecode directly preceding bc in a list of bytecodes
*/
void yasm_bc_finalize(yasm_bytecode *bc, yasm_bytecode *prev_bc);
/** Determine the distance between the starting offsets of two bytecodes.
* \param precbc1 preceding bytecode to the first bytecode
* \param precbc2 preceding bytecode to the second bytecode
* \return Distance in bytes between the two bytecodes (bc2-bc1), or NULL if
* the distance was indeterminate.
* \warning Only valid /after/ optimization.
*/
/*@null@*/ /*@only@*/ yasm_intnum *yasm_calc_bc_dist
Massive cleanup of relocation and WRT handling. Closes #49 and lays the groundwork for further features and possible cleanups. Note: this commit changes the way in which relocations in the COFF/Win32/Win64 target can be forced to reference a different symbol than is being pointed to; instead of the ambiguous "trap+(trap.end-trap)" to get the reloc to point at trap.end but reference the trap symbol, after this commit "trap.end wrt trap" is the way to say this. This also reads a lot more clearly and is not ambiguous. This should really only affect people who write .pdata sections for Win64. See the objfmts/win64/tests/win64-dataref.asm testcase for an example of usage. This cleanup adds a new data structure, yasm_value, which is used for all expressions that can be potentially relocatable. This data structure splits the absolute portion of the expression away from the relative portion and any modifications to the relative portion (SEG, WRT, PC-relative, etc). A large amount of code in the new value module breaks a general expression into its absolute and relative parts (yasm_value_finalize_expr) and provides a common set of code for writing out non-relocated values (yasm_value_output_basic). All bytecode handling in both libyasm and the architecture modules was rewritten to use yasm_values when appropriate (e.g. data values, immediates, and effective addresses). The yasm_output_expr_func is now yasm_output_value_func and all users and implementors (mainly in object formats) have been updated to handle yasm_values. Simultaneously with this change, yasm_effaddr and yasm_immval full structure definitions have been moved from bc-int.h to bytecode.h. The data hiding provided by bc-int.h was relatively minimal and probably overkill. Also, great simplifications have been made to x86 effective address expression handling. svn path=/trunk/yasm/; revision=1419
19 years ago
(yasm_bytecode *precbc1, yasm_bytecode *precbc2);
/** Get the offset of the next bytecode (the next bytecode doesn't have to
* actually exist).
* \param precbc preceding bytecode
* \return Offset of the next bytecode in bytes.
* \warning Only valid /after/ optimization.
*/
unsigned long yasm_bc_next_offset(yasm_bytecode *precbc);
/** Add a dependent span for a bytecode.
* \param add_span_data add_span_data passed into bc_calc_len()
* \param bc bytecode containing span
* \param id non-zero identifier for span; may be any non-zero value
* \param value dependent value for bytecode expansion
* \param neg_thres negative threshold for long/short decision
* \param pos_thres positive threshold for long/short decision
*/
typedef void (*yasm_bc_add_span_func)
(void *add_span_data, yasm_bytecode *bc, int id, const yasm_value *value,
long neg_thres, long pos_thres);
/** Resolve EQUs in a bytecode and calculate its minimum size.
* Generates dependent bytecode spans for cases where, if the length spanned
* increases, it could cause the bytecode size to increase.
* Any bytecode multiple is NOT included in the length or spans generation;
* this must be handled at a higher level.
* \param bc bytecode
* \param add_span function to call to add a span
* \param add_span_data extra data to be passed to add_span function
* \return 0 if no error occurred, nonzero if there was an error recognized
* (and output) during execution.
* \note May store to bytecode updated expressions and the short length.
*/
int yasm_bc_calc_len(yasm_bytecode *bc, yasm_bc_add_span_func add_span,
void *add_span_data);
/** Recalculate a bytecode's length based on an expanded span length.
* \param bc bytecode
* \param span span ID (as given to yasm_bc_add_span_func in
* yasm_bc_calc_len)
* \param old_val previous span value
* \param new_val new span value
* \param neg_thres negative threshold for long/short decision (returned)
* \param pos_thres postivie threshold for long/short decision (returned)
* \return 0 if bc no longer dependent on this span's length, negative if
* there was an error recognized (and output) during execution, and
* positive if bc size may increase for this span further based on the
* new negative and positive thresholds returned.
* \note May store to bytecode updated expressions and the updated length.
*/
int yasm_bc_expand(yasm_bytecode *bc, int span, long old_val, long new_val,
/*@out@*/ long *neg_thres, /*@out@*/ long *pos_thres);
/** Convert a bytecode into its byte representation.
* \param bc bytecode
* \param buf byte representation destination buffer
* \param bufsize size of buf (in bytes) prior to call; size of the
* generated data after call
* \param gap if nonzero, indicates the data does not really need to
* exist in the object file; if nonzero, contents of buf
* are undefined [output]
Massive cleanup of relocation and WRT handling. Closes #49 and lays the groundwork for further features and possible cleanups. Note: this commit changes the way in which relocations in the COFF/Win32/Win64 target can be forced to reference a different symbol than is being pointed to; instead of the ambiguous "trap+(trap.end-trap)" to get the reloc to point at trap.end but reference the trap symbol, after this commit "trap.end wrt trap" is the way to say this. This also reads a lot more clearly and is not ambiguous. This should really only affect people who write .pdata sections for Win64. See the objfmts/win64/tests/win64-dataref.asm testcase for an example of usage. This cleanup adds a new data structure, yasm_value, which is used for all expressions that can be potentially relocatable. This data structure splits the absolute portion of the expression away from the relative portion and any modifications to the relative portion (SEG, WRT, PC-relative, etc). A large amount of code in the new value module breaks a general expression into its absolute and relative parts (yasm_value_finalize_expr) and provides a common set of code for writing out non-relocated values (yasm_value_output_basic). All bytecode handling in both libyasm and the architecture modules was rewritten to use yasm_values when appropriate (e.g. data values, immediates, and effective addresses). The yasm_output_expr_func is now yasm_output_value_func and all users and implementors (mainly in object formats) have been updated to handle yasm_values. Simultaneously with this change, yasm_effaddr and yasm_immval full structure definitions have been moved from bc-int.h to bytecode.h. The data hiding provided by bc-int.h was relatively minimal and probably overkill. Also, great simplifications have been made to x86 effective address expression handling. svn path=/trunk/yasm/; revision=1419
19 years ago
* \param d data to pass to each call to output_value/output_reloc
* \param output_value function to call to convert values into their byte
* representation
* \param output_reloc function to call to output relocation entries
* for a single sym
* \return Newly allocated buffer that should be used instead of buf for
* reading the byte representation, or NULL if buf was big enough to
* hold the entire byte representation.
First part of list file support. This should accurately output all file bytes and offsets, but relocations are not yet indicated. Also, this outputs post-preprocessed source, so no comments, etc, are visible in the list file. * listfmt.h: New header file describing listfmt module interface. * coretype.h: Declare new yasm_listfmt typedef. * libyasm.h: Include listfmt.h. * libyasm/Makefile.inc (modinclude_HEADERS): Add listfmt.h. * yasm-module.h (module_type): Add MODULE_LISTFMT for listfmts. (load_listfmt_module, list_listfmts): New macros for listfmts. * yasm-module.c (module_type_str): Add listfmt string for MODULE_LISTFMT. (list_module_load): Add support for MODULE_LISTFMT. * bytecode.h (yasm_bc_tobytes): Comment clarification on effect of calling yasm_bc_tobytes twice on the same bytecode. * linemgr.h: Replace support for associated data with support for bytecode and source line information. (yasm_linemap_get_data): Remove. (yasm_linemap_get_source): Add. (yasm_linemap_add_data): Remove. (yasm_linemap_add_source): Add. * linemgr.c (yasm_linemap, yasm_linemap_create, yasm_linemap_destroy) (yasm_linemap_add_data, yasm_linemap_add_source, yasm_linemap_get_data) (yasm_linemap_get_source): Likewise. * nasm-token.re (fill): Save previous 2 lines instead of previous 1 line. (destroy_line, print_line, line_assoc_data): Remove. (save_line): Save line in structure instead of calling yasm_linemap_add_data. * nasm-bison.y (input rule): Call yasm_linemap_add_source here. * nasm-parser.h (yasm_parser_nasm): Add second line of storage and save_last variable to toggle between the two lines. * nasm-parser.c (nasm_parser_do_parse): Initialize save_last. * modules/Makefile.inc: Include new modules/listfmts/Makefile.inc. * modules/listfmts/Makefile.inc: New; includes modules/listfmts/nasm/Makefile.inc. * modules/listfmts/nasm/Makefile.inc: New build file for NASM-like listfmt. * nasm-listfmt.c: New NASM-like listfmt. * yasm.c: Enable use of listfmts, and default to NASM listfmt. (list_filename, cur_listfmt, cur_listfmt_module): New listfmt variables. (opt_listfmt_handler, opt_listfile_handler): New listfmt functions. (options): Add --lformat (-L) and --list (-l) options. (main): Load "nasm" listfmt as default if none selected. Enable saving of input lines if list output file enabled. Open and write to the list file. (open_obj): Rename to open_file and make more generic. (cleanup): Destroy listfmt and list filename if created. svn path=/trunk/yasm/; revision=1152
20 years ago
* \note Calling twice on the same bytecode may \em not produce the same
* results on the second call, as calling this function may result in
* non-reversible changes to the bytecode.
*/
/*@null@*/ /*@only@*/ unsigned char *yasm_bc_tobytes
(yasm_bytecode *bc, unsigned char *buf, unsigned long *bufsize,
/*@out@*/ int *gap, void *d, yasm_output_value_func output_value,
Massive libyasm / module interface update - Phase 1 As yasm has evolved, various minor additions have been made to libyasm to support the new features. These minor additions have accumulated, and some contain significant redundancies. In addition, the core focus of yasm has begun to move away from the front-end commandline program "yasm" to focusing on libyasm, a collection of reusable routines for use in all sorts of programs dealing with code at the assembly level, and the modules that provide specific features for parsing such code. This libyasm/module update focuses on cleaning up much of the cruft that has accumulated in libyasm, standardizing function names, eliminating redundancies, making many of the core objects more reusable for future extensions, and starting to make libyasm and the modules thread-safe by eliminating static variables. Specific changes include: - Making a symbol table data structure (no longer global). It follows a factory model for creating symrecs. - Label symbols now refer only to bytecodes; bytecodes have a pointer to their containing section. - Standardizing on *_create() and *_destroy() for allocation/deallocation. - Adding a standardized callback mechanism for all data structures that allow associated data. Allowed the removal of objfmt and dbgfmt-specific data callbacks in their interfaces. - Unmodularizing linemgr, but allowing multiple linemap instances (linemgr is now renamed linemap). - Remove references to lindex; all virtual lines (from linemap) are now just "line"s. - Eliminating the bytecode "type" enum, instead adding a standardized callback mechanism for custom (and standard internal) bytecode types. This will make it much easier to add new bytecodes, and eliminate the possibility of type collisions. This also allowed the removal of the of_data and df_data bytecodes, as objfmts and dbgfmts can now easily implement their own bytecodes, and the cleanup of arch's bytecode usage. - Remove the bytecodehead and sectionhead pseudo-containers, instead making true containers: section now implements all the functions of bytecodehead, and the new object data structure implements all the functions of sectionhead. - Add object data structure: it's a container that contains sections, a symbol table, and a line mapping for a single object. Every former use of sectionhead now takes an object. - Make arch interface and all standard architectures thread-safe: yasm_arch_module is the module interface; it contains a create() function that returns a yasm_arch * to store local yasm_arch data; all yasm_arch_module functions take the yasm_arch *. - Make nasm parser thread-safe. To be done in phase 2: making other module interfaces thread-safe. Note that while the module interface may be thread-safe, not all modules may be written in such a fashion (hopefully all the "standard" ones will be, but this is yet to be determined). svn path=/trunk/yasm/; revision=1058
21 years ago
/*@null@*/ yasm_output_reloc_func output_reloc)
/*@sets *buf@*/;
/** Get the bytecode multiple value as an unsigned long integer.
* \param bc bytecode
* \param multiple multiple value (output)
* \param calc_bc_dist nonzero if distances between bytecodes should be
* calculated, 0 if error should be returned in this case
* \return 1 on error (set with yasm_error_set), 0 on success.
*/
int yasm_bc_get_multiple(yasm_bytecode *bc, /*@out@*/ unsigned long *multiple,
int calc_bc_dist);
/** Create a new data value from an expression.
* \param expn expression
* \return Newly allocated data value.
*/
Massive libyasm / module interface update - Phase 1 As yasm has evolved, various minor additions have been made to libyasm to support the new features. These minor additions have accumulated, and some contain significant redundancies. In addition, the core focus of yasm has begun to move away from the front-end commandline program "yasm" to focusing on libyasm, a collection of reusable routines for use in all sorts of programs dealing with code at the assembly level, and the modules that provide specific features for parsing such code. This libyasm/module update focuses on cleaning up much of the cruft that has accumulated in libyasm, standardizing function names, eliminating redundancies, making many of the core objects more reusable for future extensions, and starting to make libyasm and the modules thread-safe by eliminating static variables. Specific changes include: - Making a symbol table data structure (no longer global). It follows a factory model for creating symrecs. - Label symbols now refer only to bytecodes; bytecodes have a pointer to their containing section. - Standardizing on *_create() and *_destroy() for allocation/deallocation. - Adding a standardized callback mechanism for all data structures that allow associated data. Allowed the removal of objfmt and dbgfmt-specific data callbacks in their interfaces. - Unmodularizing linemgr, but allowing multiple linemap instances (linemgr is now renamed linemap). - Remove references to lindex; all virtual lines (from linemap) are now just "line"s. - Eliminating the bytecode "type" enum, instead adding a standardized callback mechanism for custom (and standard internal) bytecode types. This will make it much easier to add new bytecodes, and eliminate the possibility of type collisions. This also allowed the removal of the of_data and df_data bytecodes, as objfmts and dbgfmts can now easily implement their own bytecodes, and the cleanup of arch's bytecode usage. - Remove the bytecodehead and sectionhead pseudo-containers, instead making true containers: section now implements all the functions of bytecodehead, and the new object data structure implements all the functions of sectionhead. - Add object data structure: it's a container that contains sections, a symbol table, and a line mapping for a single object. Every former use of sectionhead now takes an object. - Make arch interface and all standard architectures thread-safe: yasm_arch_module is the module interface; it contains a create() function that returns a yasm_arch * to store local yasm_arch data; all yasm_arch_module functions take the yasm_arch *. - Make nasm parser thread-safe. To be done in phase 2: making other module interfaces thread-safe. Note that while the module interface may be thread-safe, not all modules may be written in such a fashion (hopefully all the "standard" ones will be, but this is yet to be determined). svn path=/trunk/yasm/; revision=1058
21 years ago
yasm_dataval *yasm_dv_create_expr(/*@keep@*/ yasm_expr *expn);
/** Create a new data value from a string.
* \param contents string (may contain NULs)
* \param len length of string
* \return Newly allocated data value.
*/
yasm_dataval *yasm_dv_create_string(/*@keep@*/ char *contents, size_t len);
/** Create a new data value from raw bytes data.
* \param contents raw data (may contain NULs)
* \param len length
* \return Newly allocated data value.
*/
yasm_dataval *yasm_dv_create_raw(/*@keep@*/ unsigned char *contents,
unsigned long len);
#ifndef YASM_DOXYGEN
#define yasm_dv_create_string(s, l) yasm_dv_create_raw((unsigned char *)(s), \
(unsigned long)(l))
#endif
/** Initialize a list of data values.
* \param headp list of data values
*/
void yasm_dvs_initialize(yasm_datavalhead *headp);
#ifdef YASM_LIB_INTERNAL
#define yasm_dvs_initialize(headp) STAILQ_INIT(headp)
#endif
/** Delete (free allocated memory for) a list of data values.
* \param headp list of data values
*/
Massive libyasm / module interface update - Phase 1 As yasm has evolved, various minor additions have been made to libyasm to support the new features. These minor additions have accumulated, and some contain significant redundancies. In addition, the core focus of yasm has begun to move away from the front-end commandline program "yasm" to focusing on libyasm, a collection of reusable routines for use in all sorts of programs dealing with code at the assembly level, and the modules that provide specific features for parsing such code. This libyasm/module update focuses on cleaning up much of the cruft that has accumulated in libyasm, standardizing function names, eliminating redundancies, making many of the core objects more reusable for future extensions, and starting to make libyasm and the modules thread-safe by eliminating static variables. Specific changes include: - Making a symbol table data structure (no longer global). It follows a factory model for creating symrecs. - Label symbols now refer only to bytecodes; bytecodes have a pointer to their containing section. - Standardizing on *_create() and *_destroy() for allocation/deallocation. - Adding a standardized callback mechanism for all data structures that allow associated data. Allowed the removal of objfmt and dbgfmt-specific data callbacks in their interfaces. - Unmodularizing linemgr, but allowing multiple linemap instances (linemgr is now renamed linemap). - Remove references to lindex; all virtual lines (from linemap) are now just "line"s. - Eliminating the bytecode "type" enum, instead adding a standardized callback mechanism for custom (and standard internal) bytecode types. This will make it much easier to add new bytecodes, and eliminate the possibility of type collisions. This also allowed the removal of the of_data and df_data bytecodes, as objfmts and dbgfmts can now easily implement their own bytecodes, and the cleanup of arch's bytecode usage. - Remove the bytecodehead and sectionhead pseudo-containers, instead making true containers: section now implements all the functions of bytecodehead, and the new object data structure implements all the functions of sectionhead. - Add object data structure: it's a container that contains sections, a symbol table, and a line mapping for a single object. Every former use of sectionhead now takes an object. - Make arch interface and all standard architectures thread-safe: yasm_arch_module is the module interface; it contains a create() function that returns a yasm_arch * to store local yasm_arch data; all yasm_arch_module functions take the yasm_arch *. - Make nasm parser thread-safe. To be done in phase 2: making other module interfaces thread-safe. Note that while the module interface may be thread-safe, not all modules may be written in such a fashion (hopefully all the "standard" ones will be, but this is yet to be determined). svn path=/trunk/yasm/; revision=1058
21 years ago
void yasm_dvs_destroy(yasm_datavalhead *headp);
/** Add data value to the end of a list of data values.
* \note Does not make a copy of the data value; so don't pass this function
* static or local variables, and discard the dv pointer after calling
* this function.
* \param headp data value list
* \param dv data value (may be NULL)
* \return If data value was actually appended (it wasn't NULL), the data
* value; otherwise NULL.
*/
/*@null@*/ yasm_dataval *yasm_dvs_append
(yasm_datavalhead *headp, /*@returned@*/ /*@null@*/ yasm_dataval *dv);
/** Print a data value list. For debugging purposes.
* \param f file
* \param indent_level indentation level
* \param headp data value list
*/
Massive libyasm / module interface update - Phase 1 As yasm has evolved, various minor additions have been made to libyasm to support the new features. These minor additions have accumulated, and some contain significant redundancies. In addition, the core focus of yasm has begun to move away from the front-end commandline program "yasm" to focusing on libyasm, a collection of reusable routines for use in all sorts of programs dealing with code at the assembly level, and the modules that provide specific features for parsing such code. This libyasm/module update focuses on cleaning up much of the cruft that has accumulated in libyasm, standardizing function names, eliminating redundancies, making many of the core objects more reusable for future extensions, and starting to make libyasm and the modules thread-safe by eliminating static variables. Specific changes include: - Making a symbol table data structure (no longer global). It follows a factory model for creating symrecs. - Label symbols now refer only to bytecodes; bytecodes have a pointer to their containing section. - Standardizing on *_create() and *_destroy() for allocation/deallocation. - Adding a standardized callback mechanism for all data structures that allow associated data. Allowed the removal of objfmt and dbgfmt-specific data callbacks in their interfaces. - Unmodularizing linemgr, but allowing multiple linemap instances (linemgr is now renamed linemap). - Remove references to lindex; all virtual lines (from linemap) are now just "line"s. - Eliminating the bytecode "type" enum, instead adding a standardized callback mechanism for custom (and standard internal) bytecode types. This will make it much easier to add new bytecodes, and eliminate the possibility of type collisions. This also allowed the removal of the of_data and df_data bytecodes, as objfmts and dbgfmts can now easily implement their own bytecodes, and the cleanup of arch's bytecode usage. - Remove the bytecodehead and sectionhead pseudo-containers, instead making true containers: section now implements all the functions of bytecodehead, and the new object data structure implements all the functions of sectionhead. - Add object data structure: it's a container that contains sections, a symbol table, and a line mapping for a single object. Every former use of sectionhead now takes an object. - Make arch interface and all standard architectures thread-safe: yasm_arch_module is the module interface; it contains a create() function that returns a yasm_arch * to store local yasm_arch data; all yasm_arch_module functions take the yasm_arch *. - Make nasm parser thread-safe. To be done in phase 2: making other module interfaces thread-safe. Note that while the module interface may be thread-safe, not all modules may be written in such a fashion (hopefully all the "standard" ones will be, but this is yet to be determined). svn path=/trunk/yasm/; revision=1058
21 years ago
void yasm_dvs_print(const yasm_datavalhead *headp, FILE *f, int indent_level);
#endif