From: Peter Johnson Date: Wed, 21 Mar 2007 04:23:59 +0000 (-0000) Subject: Massive update of directive handling, including handling of extern, global, X-Git-Tag: v0.6.1~15^2~11 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=decb27eaa2b0e2777276077d88eacef5cc0ceb28;p=yasm Massive update of directive handling, including handling of extern, global, and common declare. The latter no longer passes through objfmt at parse time; instead the objfmt must handle them at output time (objfmt-specific extensions are parsed & stored by the parser). Directives are now handled using a list (with function pointers) rather than a single function entry point. svn path=/trunk/yasm/; revision=1819 --- diff --git a/frontends/yasm/yasm.c b/frontends/yasm/yasm.c index 4a315bda..effe0e99 100644 --- a/frontends/yasm/yasm.c +++ b/frontends/yasm/yasm.c @@ -453,7 +453,7 @@ do_assemble(FILE *in) yasm_symtab_parser_finalize(object->symtab, strcmp(cur_parser_module->keyword, "gas")==0 || strcmp(cur_parser_module->keyword, "gnu")==0, - object, errwarns); + errwarns); check_errors(errwarns, object, linemap); /* Finalize parse */ @@ -604,7 +604,7 @@ main(int argc, char *argv[]) /* Check for arch help */ if (machine_name && strcmp(machine_name, "help") == 0) { - yasm_arch_machine *m = cur_arch_module->machines; + const yasm_arch_machine *m = cur_arch_module->machines; printf(_("Available %s for %s `%s':\n"), _("machines"), _("architecture"), cur_arch_module->keyword); while (m->keyword && m->name) { diff --git a/libyasm/arch.h b/libyasm/arch.h index 4a12884d..6ee9cdd9 100644 --- a/libyasm/arch.h +++ b/libyasm/arch.h @@ -106,6 +106,9 @@ typedef struct yasm_arch_module { */ const char *keyword; + /** NULL-terminated list of directives. NULL if none. */ + /*@null@*/ const yasm_directive *directives; + /** Create architecture. * Module-level implementation of yasm_arch_create(). * Call yasm_arch_create() instead of calling this function. @@ -133,11 +136,6 @@ typedef struct yasm_arch_module { */ int (*set_var) (yasm_arch *arch, const char *var, unsigned long val); - /** Module-level implementation of yasm_arch_parse_cpu(). - * Call yasm_arch_parse_cpu() instead of calling this function. - */ - void (*parse_cpu) (yasm_arch *arch, const char *cpuid, size_t cpuid_len); - /** Module-level implementation of yasm_arch_parse_check_insnprefix(). * Call yasm_arch_parse_check_insnprefix() instead of calling this function. */ @@ -152,14 +150,6 @@ typedef struct yasm_arch_module { (yasm_arch *arch, /*@out@*/ uintptr_t *data, const char *id, size_t id_len); - /** Module-level implementation of yasm_arch_parse_directive(). - * Call yasm_arch_parse_directive() instead of calling this function. - */ - int (*parse_directive) (yasm_arch *arch, const char *name, - /*@null@*/ yasm_valparamhead *valparams, - /*@null@*/ yasm_valparamhead *objext_valparams, - yasm_object *object, unsigned long line); - /** Module-level implementation of yasm_arch_get_fill(). * Call yasm_arch_get_fill() instead of calling this function. */ @@ -219,7 +209,7 @@ typedef struct yasm_arch_module { * Call yasm_arch_get_machine() to get the active machine of a particular * #yasm_arch. */ - yasm_arch_machine *machines; + const yasm_arch_machine *machines; /** Default machine keyword. * Call yasm_arch_get_machine() to get the active machine of a particular @@ -352,15 +342,6 @@ unsigned int yasm_arch_get_address_size(const yasm_arch *arch); */ int yasm_arch_set_var(yasm_arch *arch, const char *var, unsigned long val); -/** Switch available instructions/registers/etc based on a user-specified - * CPU identifier. Should modify behavior ONLY of parse_* functions! The - * bytecode and output functions should be able to handle any CPU. - * \param arch architecture - * \param cpuid cpu identifier as in the input file - * \param cpuid_len length of cpu identifier string - */ -void yasm_arch_parse_cpu(yasm_arch *arch, const char *cpuid, size_t cpuid_len); - /** Check an generic identifier to see if it matches architecture specific * names for instructions or instruction prefixes. Unrecognized identifiers * should return #YASM_ARCH_NOTINSNPREFIX so they can be treated as normal @@ -393,23 +374,6 @@ yasm_arch_regtmod yasm_arch_parse_check_regtmod (yasm_arch *arch, /*@out@*/ uintptr_t *data, const char *id, size_t id_len); -/** Handle architecture-specific directives. - * Should modify behavior ONLY of parse functions, much like parse_cpu(). - * \param arch architecture - * \param name directive name - * \param valparams value/parameters - * \param objext_valparams object format extensions - * value/parameters - * \param object object - * \param line virtual line (as from yasm_linemap) - * \return Nonzero if directive was not recognized; 0 if directive was - * recognized, even if it wasn't valid. - */ -int yasm_arch_parse_directive(yasm_arch *arch, const char *name, - /*@null@*/ yasm_valparamhead *valparams, - /*@null@*/ yasm_valparamhead *objext_valparams, - yasm_object *object, unsigned long line); - /** Get NOP fill patterns for 1-15 bytes of fill. * \param arch architecture * \return 16-entry array of arrays; [0] is unused, [1] - [15] point to arrays @@ -542,18 +506,12 @@ yasm_effaddr *yasm_arch_ea_create(yasm_arch *arch, /*@keep@*/ yasm_expr *e); ((yasm_arch_base *)arch)->module->get_address_size(arch) #define yasm_arch_set_var(arch, var, val) \ ((yasm_arch_base *)arch)->module->set_var(arch, var, val) -#define yasm_arch_parse_cpu(arch, cpuid, cpuid_len) \ - ((yasm_arch_base *)arch)->module->parse_cpu(arch, cpuid, cpuid_len) #define yasm_arch_parse_check_insnprefix(arch, data, id, id_len) \ ((yasm_arch_base *)arch)->module->parse_check_insnprefix(arch, data, id, \ id_len) #define yasm_arch_parse_check_regtmod(arch, data, id, id_len) \ ((yasm_arch_base *)arch)->module->parse_check_regtmod(arch, data, id, \ id_len) -#define yasm_arch_parse_directive(arch, name, valparams, objext_valparams, \ - object, line) \ - ((yasm_arch_base *)arch)->module->parse_directive \ - (arch, name, valparams, objext_valparams, object, line) #define yasm_arch_get_fill(arch) \ ((yasm_arch_base *)arch)->module->get_fill(arch) #define yasm_arch_finalize_insn(arch, bc, prev_bc, data, num_operands, \ diff --git a/libyasm/coretype.h b/libyasm/coretype.h index 3f5e3a79..b07d8d68 100644 --- a/libyasm/coretype.h +++ b/libyasm/coretype.h @@ -187,6 +187,10 @@ typedef struct yasm_valparam yasm_valparam; * \see valparam.h for related functions. */ typedef struct yasm_valparamhead yasm_valparamhead; +/** Directive list entry. + * \see valparam.h for details and related functions. + */ +typedef struct yasm_directive yasm_directive; /** A list of instruction operands (opaque type). * The list goes from left-to-right as parsed. @@ -232,18 +236,6 @@ typedef enum yasm_expr_op { YASM_EXPR_SEGOFF /**< The ':' in segment:offset. */ } yasm_expr_op; -/** Symbol record visibility. - * \see symrec.h for related functions. - * \note YASM_SYM_EXTERN and YASM_SYM_COMMON are mutually exclusive. - */ -typedef enum yasm_sym_vis { - YASM_SYM_LOCAL = 0, /**< Default, local only */ - YASM_SYM_GLOBAL = 1 << 0, /**< If symbol is declared GLOBAL */ - YASM_SYM_COMMON = 1 << 1, /**< If symbol is declared COMMON */ - YASM_SYM_EXTERN = 1 << 2, /**< If symbol is declared EXTERN */ - YASM_SYM_DLOCAL = 1 << 3 /**< If symbol is explicitly declared LOCAL */ -} yasm_sym_vis; - /** Convert yasm_value to its byte representation. Usually implemented by * object formats to keep track of relocations and verify legal expressions. * Must put the value into the least significant bits of the destination, diff --git a/libyasm/dbgfmt.h b/libyasm/dbgfmt.h index acf357a6..021127e7 100644 --- a/libyasm/dbgfmt.h +++ b/libyasm/dbgfmt.h @@ -52,6 +52,9 @@ struct yasm_dbgfmt_module { /** Keyword used to select debug format. */ const char *keyword; + /** NULL-terminated list of directives. NULL if none. */ + /*@null@*/ const yasm_directive *directives; + /** Create debug format. * Module-level implementation of yasm_dbgfmt_create(). * The filenames are provided solely for informational purposes. @@ -65,13 +68,6 @@ struct yasm_dbgfmt_module { */ void (*destroy) (/*@only@*/ yasm_dbgfmt *dbgfmt); - /** Module-level implementation of yasm_dbgfmt_directive(). - * Call yasm_dbgfmt_directive() instead of calling this function. - */ - int (*directive) (yasm_object *object, const char *name, - /*@null@*/ yasm_valparamhead *valparams, - unsigned long line); - /** Module-level implementation of yasm_dbgfmt_generate(). * Call yasm_dbgfmt_generate() instead of calling this function. */ @@ -100,18 +96,6 @@ const char *yasm_dbgfmt_keyword(const yasm_dbgfmt *dbgfmt); */ void yasm_dbgfmt_destroy(/*@only@*/ yasm_dbgfmt *dbgfmt); -/** DEBUG directive support. - * \param object object - * \param name directive name - * \param valparams value/parameters - * \param line virtual line (from yasm_linemap) - * \return Nonzero if directive was not recognized; 0 if directive was - * recognized even if it wasn't valid. - */ -int yasm_dbgfmt_directive(yasm_object *object, const char *name, - /*@null@*/ yasm_valparamhead *valparams, - unsigned long line); - /** Generate debugging information bytecodes. * \param object object * \param linemap virtual/physical line mapping @@ -133,9 +117,6 @@ void yasm_dbgfmt_generate(yasm_object *object, yasm_linemap *linemap, #define yasm_dbgfmt_destroy(dbgfmt) \ ((yasm_dbgfmt_base *)dbgfmt)->module->destroy(dbgfmt) -#define yasm_dbgfmt_directive(object, name, valparams, line) \ - ((yasm_dbgfmt_base *)((object)->dbgfmt))->module->directive \ - (object, name, valparams, line) #define yasm_dbgfmt_generate(object, linemap, ews) \ ((yasm_dbgfmt_base *)((object)->dbgfmt))->module->generate \ (object, linemap, ews) diff --git a/libyasm/hamt.c b/libyasm/hamt.c index 6eee0586..c6617b6d 100644 --- a/libyasm/hamt.c +++ b/libyasm/hamt.c @@ -33,6 +33,8 @@ #include "util.h" /*@unused@*/ RCSID("$Id$"); +#include + #include "libyasm-stdint.h" #include "coretype.h" #include "hamt.h" @@ -53,6 +55,8 @@ struct HAMT { HAMTNode *root; /*@exits@*/ void (*error_func) (const char *file, unsigned int line, const char *message); + unsigned long (*HashKey) (const char *key); + unsigned long (*ReHashKey) (const char *key, int Level); }; /* XXX make a portable version of this. This depends on the pointer being @@ -92,8 +96,26 @@ ReHashKey(const char *key, int Level) return vHash; } +static unsigned long +HashKey_nocase(const char *key) +{ + unsigned long a=31415, b=27183, vHash; + for (vHash=0; *key; key++, a*=b) + vHash = a*vHash + tolower(*key); + return vHash; +} + +static unsigned long +ReHashKey_nocase(const char *key, int Level) +{ + unsigned long a=31415, b=27183, vHash; + for (vHash=0; *key; key++, a*=b) + vHash = a*vHash*(unsigned long)Level + tolower(*key); + return vHash; +} + HAMT * -HAMT_create(/*@exits@*/ void (*error_func) +HAMT_create(int nocase, /*@exits@*/ void (*error_func) (const char *file, unsigned int line, const char *message)) { /*@out@*/ HAMT *hamt = yasm_xmalloc(sizeof(HAMT)); @@ -108,6 +130,13 @@ HAMT_create(/*@exits@*/ void (*error_func) } hamt->error_func = error_func; + if (nocase) { + hamt->HashKey = HashKey_nocase; + hamt->ReHashKey = ReHashKey_nocase; + } else { + hamt->HashKey = HashKey; + hamt->ReHashKey = ReHashKey; + } return hamt; } @@ -195,7 +224,7 @@ HAMT_insert(HAMT *hamt, const char *str, void *data, int *replace, int keypartbits = 0; int level = 0; - key = HashKey(str); + key = hamt->HashKey(str); keypart = key & 0x1F; node = &hamt->root[keypart]; @@ -236,9 +265,9 @@ HAMT_insert(HAMT *hamt, const char *str, void *data, int *replace, keypartbits += 5; if (keypartbits > 30) { /* Exceeded 32 bits: rehash */ - key = ReHashKey(str, level); - key2 = ReHashKey(((HAMTEntry *)(node->BaseValue))->str, - level); + key = hamt->ReHashKey(str, level); + key2 = hamt->ReHashKey( + ((HAMTEntry *)(node->BaseValue))->str, level); keypartbits = 0; } keypart = (key >> keypartbits) & 0x1F; @@ -288,7 +317,7 @@ HAMT_insert(HAMT *hamt, const char *str, void *data, int *replace, keypartbits += 5; if (keypartbits > 30) { /* Exceeded 32 bits of current key: rehash */ - key = ReHashKey(str, level); + key = hamt->ReHashKey(str, level); keypartbits = 0; } keypart = (key >> keypartbits) & 0x1F; @@ -347,7 +376,7 @@ HAMT_search(HAMT *hamt, const char *str) int keypartbits = 0; int level = 0; - key = HashKey(str); + key = hamt->HashKey(str); keypart = key & 0x1F; node = &hamt->root[keypart]; @@ -366,7 +395,7 @@ HAMT_search(HAMT *hamt, const char *str) keypartbits += 5; if (keypartbits > 30) { /* Exceeded 32 bits of current key: rehash */ - key = ReHashKey(str, level); + key = hamt->ReHashKey(str, level); keypartbits = 0; } keypart = (key >> keypartbits) & 0x1F; diff --git a/libyasm/hamt.h b/libyasm/hamt.h index 865844ca..88204eda 100644 --- a/libyasm/hamt.h +++ b/libyasm/hamt.h @@ -41,10 +41,11 @@ typedef struct HAMTEntry HAMTEntry; /** Create new, empty, HAMT. error_func() is called when an internal error is * encountered--it should NOT return to the calling function. + * \param nocase nonzero if HAMT should be case-insensitive * \param error_func function called on internal error * \return New, empty, hash array mapped trie. */ -HAMT *HAMT_create(/*@exits@*/ void (*error_func) +HAMT *HAMT_create(int nocase, /*@exits@*/ void (*error_func) (const char *file, unsigned int line, const char *message)); /** Delete HAMT and all data associated with it. Uses deletefunc() to delete diff --git a/libyasm/linemap.c b/libyasm/linemap.c index 08ad385b..bf28cb49 100644 --- a/libyasm/linemap.c +++ b/libyasm/linemap.c @@ -151,7 +151,7 @@ yasm_linemap_create(void) size_t i; yasm_linemap *linemap = yasm_xmalloc(sizeof(yasm_linemap)); - linemap->filenames = HAMT_create(yasm_internal_error_); + linemap->filenames = HAMT_create(0, yasm_internal_error_); linemap->current = 1; diff --git a/libyasm/objfmt.h b/libyasm/objfmt.h index 9ada7d2c..ce610b06 100644 --- a/libyasm/objfmt.h +++ b/libyasm/objfmt.h @@ -74,6 +74,9 @@ struct yasm_objfmt_module { */ const char *default_dbgfmt_keyword; + /** NULL-terminated list of directives. NULL if none. */ + /*@null@*/ const yasm_directive *directives; + /** Create object format. * Module-level implementation of yasm_objfmt_create(). * Call yasm_objfmt_create() instead of calling this function. @@ -106,35 +109,6 @@ struct yasm_objfmt_module { (*section_switch)(yasm_object *object, yasm_valparamhead *valparams, /*@null@*/ yasm_valparamhead *objext_valparams, unsigned long line); - - /** Module-level implementation of yasm_objfmt_extern_declare(). - * Call yasm_objfmt_extern_declare() instead of calling this function. - */ - yasm_symrec * (*extern_declare) - (yasm_object *object, const char *name, - /*@null@*/ yasm_valparamhead *objext_valparams, unsigned long line); - - /** Module-level implementation of yasm_objfmt_global_declare(). - * Call yasm_objfmt_global_declare() instead of calling this function. - */ - yasm_symrec * (*global_declare) - (yasm_object *object, const char *name, - /*@null@*/ yasm_valparamhead *objext_valparams, unsigned long line); - - /** Module-level implementation of yasm_objfmt_common_declare(). - * Call yasm_objfmt_common_declare() instead of calling this function. - */ - yasm_symrec * (*common_declare) - (yasm_object *object, const char *name, /*@only@*/ yasm_expr *size, - /*@null@*/ yasm_valparamhead *objext_valparams, unsigned long line); - - /** Module-level implementation of yasm_objfmt_directive(). - * Call yasm_objfmt_directive() instead of calling this function. - */ - int (*directive) (yasm_object *object, const char *name, - /*@null@*/ yasm_valparamhead *valparams, - /*@null@*/ yasm_valparamhead *objext_valparams, - unsigned long line); }; /** Create object format. @@ -182,58 +156,6 @@ yasm_section *yasm_objfmt_add_default_section(yasm_object *object); (yasm_object *object, yasm_valparamhead *valparams, /*@null@*/ yasm_valparamhead *objext_valparams, unsigned long line); -/** Declare an "extern" (importing from another module) symbol. Should - * call yasm_symtab_declare(). - * \param object object - * \param name symbol name - * \param objext_valparams object format-specific value/paramaters - * \param line virtual line (from yasm_linemap) - * \return Declared symbol. - */ -yasm_symrec *yasm_objfmt_extern_declare - (yasm_object *object, const char *name, - /*@null@*/ yasm_valparamhead *objext_valparams, unsigned long line); - -/** Declare a "global" (exporting to other modules) symbol. Should call - * yasm_symtab_declare(). - * \param object object - * \param name symbol name - * \param objext_valparams object format-specific value/paramaters - * \param line virtual line (from yasm_linemap) - * \return Declared symbol. - */ -yasm_symrec *yasm_objfmt_global_declare - (yasm_object *object, const char *name, - /*@null@*/ yasm_valparamhead *objext_valparams, unsigned long line); - -/** Declare a "common" (shared space with other modules) symbol. Should - * call yasm_symtab_declare(). - * declaration. - * \param object object - * \param name symbol name - * \param size common data size - * \param objext_valparams object format-specific value/paramaters - * \param line virtual line (from yasm_linemap) - * \return Declared symbol. - */ -yasm_symrec *yasm_objfmt_common_declare - (yasm_object *object, const char *name, /*@only@*/ yasm_expr *size, - /*@null@*/ yasm_valparamhead *objext_valparams, unsigned long line); - -/** Handle object format-specific directives. - * \param object object - * \param name directive name - * \param valparams value/parameters - * \param objext_valparams object format-specific value/parameters - * \param line virtual line (from yasm_linemap) - * \return Nonzero if directive was not recognized; 0 if directive was - * recognized, even if it wasn't valid. - */ -int yasm_objfmt_directive(yasm_object *object, const char *name, - /*@null@*/ yasm_valparamhead *valparams, - /*@null@*/ yasm_valparamhead *objext_valparams, - unsigned long line); - #ifndef YASM_DOXYGEN /* Inline macro implementations for objfmt functions */ @@ -248,18 +170,6 @@ int yasm_objfmt_directive(yasm_object *object, const char *name, #define yasm_objfmt_section_switch(object, vpms, oe_vpms, line) \ ((yasm_objfmt_base *)((object)->objfmt))->module->section_switch \ (object, vpms, oe_vpms, line) -#define yasm_objfmt_extern_declare(object, name, oe_vpms, line) \ - ((yasm_objfmt_base *)((object)->objfmt))->module->extern_declare \ - (object, name, oe_vpms, line) -#define yasm_objfmt_global_declare(object, name, oe_vpms, line) \ - ((yasm_objfmt_base *)((object)->objfmt))->module->global_declare \ - (object, name, oe_vpms, line) -#define yasm_objfmt_common_declare(object, name, size, oe_vpms, line) \ - ((yasm_objfmt_base *)((object)->objfmt))->module->common_declare \ - (object, name, size, oe_vpms, line) -#define yasm_objfmt_directive(object, name, vpms, oe_vpms, line) \ - ((yasm_objfmt_base *)((object)->objfmt))->module->directive \ - (object, name, vpms, oe_vpms, line) #define yasm_objfmt_add_default_section(object) \ ((yasm_objfmt_base *)((object)->objfmt))->module->add_default_section \ (object) diff --git a/libyasm/section.c b/libyasm/section.c index 812218ac..02b6741d 100644 --- a/libyasm/section.c +++ b/libyasm/section.c @@ -32,6 +32,7 @@ #include "libyasm-stdint.h" #include "coretype.h" +#include "hamt.h" #include "valparam.h" #include "assocdat.h" @@ -101,6 +102,130 @@ struct yasm_section { static void yasm_section_destroy(/*@only@*/ yasm_section *sect); +/* Wrapper around directive for HAMT insertion */ +typedef struct yasm_directive_wrap { + const yasm_directive *directive; +} yasm_directive_wrap; + +/* + * Standard "builtin" object directives. + */ + +static void +dir_extern(yasm_object *object, yasm_valparamhead *valparams, + yasm_valparamhead *objext_valparams, unsigned long line) +{ + yasm_valparam *vp = yasm_vps_first(valparams); + yasm_symrec *sym; + sym = yasm_symtab_declare(object->symtab, vp->val, YASM_SYM_EXTERN, line); + if (objext_valparams) { + yasm_valparamhead *vps = yasm_vps_create(); + *vps = *objext_valparams; /* structure copy */ + yasm_vps_initialize(objext_valparams); /* don't double-free */ + yasm_symrec_set_objext_valparams(sym, vps); + } +} + +static void +dir_global(yasm_object *object, yasm_valparamhead *valparams, + yasm_valparamhead *objext_valparams, unsigned long line) +{ + yasm_valparam *vp = yasm_vps_first(valparams); + yasm_symrec *sym; + sym = yasm_symtab_declare(object->symtab, vp->val, YASM_SYM_GLOBAL, line); + if (objext_valparams) { + yasm_valparamhead *vps = yasm_vps_create(); + *vps = *objext_valparams; /* structure copy */ + yasm_vps_initialize(objext_valparams); /* don't double-free */ + yasm_symrec_set_objext_valparams(sym, vps); + } +} + +static void +dir_common(yasm_object *object, yasm_valparamhead *valparams, + yasm_valparamhead *objext_valparams, unsigned long line) +{ + yasm_valparam *vp = yasm_vps_first(valparams); + yasm_valparam *vp2 = yasm_vps_next(vp); + yasm_expr *size = yasm_vp_expr(vp2, object->symtab, line); + yasm_symrec *sym; + + if (!size) { + yasm_error_set(YASM_ERROR_SYNTAX, + N_("no size specified in %s declaration"), "COMMON"); + return; + } + sym = yasm_symtab_declare(object->symtab, vp->val, YASM_SYM_COMMON, line); + yasm_symrec_set_common_size(sym, size); + if (objext_valparams) { + yasm_valparamhead *vps = yasm_vps_create(); + *vps = *objext_valparams; /* structure copy */ + yasm_vps_initialize(objext_valparams); /* don't double-free */ + yasm_symrec_set_objext_valparams(sym, vps); + } +} + +static void +dir_section(yasm_object *object, yasm_valparamhead *valparams, + yasm_valparamhead *objext_valparams, unsigned long line) +{ + yasm_section *new_section = + yasm_objfmt_section_switch(object, valparams, objext_valparams, line); + if (new_section) + object->cur_section = new_section; + else + yasm_error_set(YASM_ERROR_SYNTAX, + N_("invalid argument to directive `%s'"), "SECTION"); +} + +static const yasm_directive object_directives[] = { + { ".extern", "gas", dir_extern, YASM_DIR_ID_REQUIRED }, + { ".global", "gas", dir_global, YASM_DIR_ID_REQUIRED }, + { ".globl", "gas", dir_global, YASM_DIR_ID_REQUIRED }, + { "extern", "nasm", dir_extern, YASM_DIR_ID_REQUIRED }, + { "global", "nasm", dir_global, YASM_DIR_ID_REQUIRED }, + { "common", "nasm", dir_common, YASM_DIR_ID_REQUIRED }, + { "section", "nasm", dir_section, YASM_DIR_ARG_REQUIRED }, + { "segment", "nasm", dir_section, YASM_DIR_ARG_REQUIRED }, + { NULL, NULL, NULL, 0 } +}; + +static void +directive_level2_delete(/*@only@*/ void *data) +{ + yasm_xfree(data); +} + +static void +directive_level1_delete(/*@only@*/ void *data) +{ + HAMT_destroy(data, directive_level2_delete); +} + +static void +directives_add(yasm_object *object, /*@null@*/ const yasm_directive *dir) +{ + if (!dir) + return; + + while (dir->name) { + HAMT *level2 = HAMT_search(object->directives, dir->parser); + int replace; + yasm_directive_wrap *wrap = yasm_xmalloc(sizeof(yasm_directive_wrap)); + + if (!level2) { + replace = 0; + level2 = HAMT_insert(object->directives, dir->parser, + HAMT_create(1, yasm_internal_error_), + &replace, directive_level1_delete); + } + replace = 0; + wrap->directive = dir; + HAMT_insert(level2, dir->name, wrap, &replace, + directive_level2_delete); + dir++; + } +} /*@-compdestroy@*/ yasm_object * @@ -121,6 +246,9 @@ yasm_object_create(const char *src_filename, const char *obj_filename, /* Initialize sections linked list */ STAILQ_INIT(&object->sections); + /* Create directives HAMT */ + object->directives = HAMT_create(1, yasm_internal_error_); + /* Initialize the target architecture */ object->arch = arch; @@ -167,6 +295,15 @@ yasm_object_create(const char *src_filename, const char *obj_filename, goto error; } + /* Add directives to HAMT. Note ordering here determines priority. */ + directives_add(object, + ((yasm_objfmt_base *)object->objfmt)->module->directives); + directives_add(object, + ((yasm_dbgfmt_base *)object->dbgfmt)->module->directives); + directives_add(object, + ((yasm_arch_base *)object->arch)->module->directives); + directives_add(object, object_directives); + return object; error: @@ -274,6 +411,28 @@ yasm_object_create_absolute(yasm_object *object, yasm_expr *start, } /*@=onlytrans@*/ +int +yasm_object_directive(yasm_object *object, const char *name, + const char *parser, yasm_valparamhead *valparams, + yasm_valparamhead *objext_valparams, + unsigned long line) +{ + HAMT *level2; + yasm_directive_wrap *wrap; + + level2 = HAMT_search(object->directives, parser); + if (!level2) + return 1; + + wrap = HAMT_search(level2, name); + if (!wrap) + return 1; + + yasm_call_directive(wrap->directive, object, valparams, objext_valparams, + line); + return 0; +} + void yasm_object_set_source_fn(yasm_object *object, const char *src_filename) { @@ -358,6 +517,9 @@ yasm_object_destroy(yasm_object *object) cur = next; } + /* Delete directives HAMT */ + HAMT_destroy(object->directives, directive_level1_delete); + /* Delete associated filenames */ yasm_xfree(object->src_filename); yasm_xfree(object->obj_filename); diff --git a/libyasm/section.h b/libyasm/section.h index 07db95ff..1b1b18f3 100644 --- a/libyasm/section.h +++ b/libyasm/section.h @@ -61,7 +61,13 @@ struct yasm_object { /*@dependent@*/ yasm_section *cur_section; #ifdef YASM_LIB_INTERNAL + /** Linked list of sections. */ /*@reldef@*/ STAILQ_HEAD(yasm_sectionhead, yasm_section) sections; + + /** Directives, organized as two level HAMT; first level is parser, + * second level is directive name. + */ + /*@owned@*/ struct HAMT *directives; #endif }; @@ -112,6 +118,21 @@ struct yasm_object { /*@dependent@*/ yasm_section *yasm_object_create_absolute (yasm_object *object, /*@keep@*/ yasm_expr *start, unsigned long line); +/** Handle a directive. Passed down to object format, debug format, or + * architecture as appropriate. + * \param object object + * \param name directive name + * \param parser parser keyword + * \param valparams value/parameters + * \param objext_valparams "object format-specific" value/parameters + * \param line virtual line (from yasm_linemap) + * \return 0 if directive recognized, nonzero if unrecognized. + */ +int yasm_object_directive(yasm_object *object, const char *name, + const char *parser, yasm_valparamhead *valparams, + yasm_valparamhead *objext_valparams, + unsigned long line); + /** Delete (free allocated memory for) an object. All sections in the * object and all bytecodes within those sections are also deleted. * \param object object diff --git a/libyasm/symrec.c b/libyasm/symrec.c index 1b8e7219..30b6c91f 100644 --- a/libyasm/symrec.c +++ b/libyasm/symrec.c @@ -34,6 +34,7 @@ #include "libyasm-stdint.h" #include "coretype.h" +#include "valparam.h" #include "hamt.h" #include "assocdat.h" @@ -64,7 +65,9 @@ struct yasm_symrec { sym_type type; yasm_sym_status status; yasm_sym_vis visibility; - unsigned long line; /* symbol was first declared or used on */ + unsigned long def_line; /* line where symbol was first defined */ + unsigned long decl_line; /* line where symbol was first declared */ + unsigned long use_line; /* line where symbol was first used */ union { yasm_expr *expn; /* equ value */ @@ -89,12 +92,48 @@ struct yasm_symtab { SLIST_HEAD(nontablesymhead_s, non_table_symrec_s) non_table_syms; }; +static void +objext_valparams_destroy(void *data) +{ + yasm_vps_destroy((yasm_valparamhead *)data); +} + +static void +objext_valparams_print(void *data, FILE *f, int indent_level) +{ + yasm_vps_print((yasm_valparamhead *)data, f); +} + +static yasm_assoc_data_callback objext_valparams_cb = { + objext_valparams_destroy, + objext_valparams_print +}; + +static void +common_size_destroy(void *data) +{ + yasm_expr **e = (yasm_expr **)data; + yasm_expr_destroy(*e); + yasm_xfree(data); +} + +static void +common_size_print(void *data, FILE *f, int indent_level) +{ + yasm_expr **e = (yasm_expr **)data; + yasm_expr_print(*e, f); +} + +static yasm_assoc_data_callback common_size_cb = { + common_size_destroy, + common_size_print +}; yasm_symtab * yasm_symtab_create(void) { yasm_symtab *symtab = yasm_xmalloc(sizeof(yasm_symtab)); - symtab->sym_table = HAMT_create(yasm_internal_error_); + symtab->sym_table = HAMT_create(0, yasm_internal_error_); SLIST_INIT(&symtab->non_table_syms); return symtab; } @@ -116,7 +155,9 @@ symrec_new_common(/*@keep@*/ char *name) yasm_symrec *rec = yasm_xmalloc(sizeof(yasm_symrec)); rec->name = name; rec->type = SYM_UNKNOWN; - rec->line = 0; + rec->def_line = 0; + rec->decl_line = 0; + rec->use_line = 0; rec->visibility = YASM_SYM_LOCAL; rec->assoc_data = NULL; return rec; @@ -190,7 +231,9 @@ yasm_symrec * yasm_symtab_abs_sym(yasm_symtab *symtab) { yasm_symrec *rec = symtab_get_or_new(symtab, "", 1); - rec->line = 0; + rec->def_line = 0; + rec->decl_line = 0; + rec->use_line = 0; rec->type = SYM_EQU; rec->value.expn = yasm_expr_create_ident(yasm_expr_int(yasm_intnum_create_uint(0)), 0); @@ -202,8 +245,8 @@ yasm_symrec * yasm_symtab_use(yasm_symtab *symtab, const char *name, unsigned long line) { yasm_symrec *rec = symtab_get_or_new(symtab, name, 1); - if (rec->line == 0) - rec->line = line; /* set line number of first use */ + if (rec->use_line == 0) + rec->use_line = line; /* set line number of first use */ rec->status |= YASM_SYM_USED; return rec; } @@ -222,15 +265,15 @@ symtab_define(yasm_symtab *symtab, const char *name, sym_type type, /* Has it been defined before (either by DEFINED or COMMON/EXTERN)? */ if (rec->status & YASM_SYM_DEFINED) { - yasm_error_set_xref(rec->line, N_("`%s' previously defined here"), - name); + yasm_error_set_xref(rec->def_line!=0 ? rec->def_line : rec->decl_line, + N_("`%s' previously defined here"), name); yasm_error_set(YASM_ERROR_GENERAL, N_("redefinition of `%s'"), name); } else { if (rec->visibility & YASM_SYM_EXTERN) yasm_warn_set(YASM_WARN_GENERAL, N_("`%s' both defined and declared extern"), name); - rec->line = line; /* set line number of definition */ + rec->def_line = line; /* set line number of definition */ rec->type = type; rec->status |= YASM_SYM_DEFINED; } @@ -313,18 +356,18 @@ yasm_symrec_declare(yasm_symrec *rec, yasm_sym_vis vis, unsigned long line) (!(rec->status & YASM_SYM_DEFINED) && (!(rec->visibility & (YASM_SYM_COMMON | YASM_SYM_EXTERN)) || ((rec->visibility & YASM_SYM_COMMON) && (vis == YASM_SYM_COMMON)) || - ((rec->visibility & YASM_SYM_EXTERN) && (vis == YASM_SYM_EXTERN))))) + ((rec->visibility & YASM_SYM_EXTERN) && (vis == YASM_SYM_EXTERN))))) { + rec->decl_line = line; rec->visibility |= vis; - else + } else yasm_error_set(YASM_ERROR_GENERAL, N_("duplicate definition of `%s'; first defined on line %lu"), - rec->name, rec->line); + rec->name, rec->def_line!=0 ? rec->def_line : rec->decl_line); } typedef struct symtab_finalize_info { unsigned long firstundef_line; int undef_extern; - /*@null@*/ yasm_object *object; yasm_errwarns *errwarns; } symtab_finalize_info; @@ -337,14 +380,14 @@ symtab_parser_finalize_checksym(yasm_symrec *sym, /*@null@*/ void *d) /* error if a symbol is used but never defined or extern/common declared */ if ((sym->status & YASM_SYM_USED) && !(sym->status & YASM_SYM_DEFINED) && !(sym->visibility & (YASM_SYM_EXTERN | YASM_SYM_COMMON))) { - if (info->undef_extern && info->object) - yasm_objfmt_extern_declare(info->object, sym->name, NULL, 1); + if (info->undef_extern) + sym->visibility |= YASM_SYM_EXTERN; else { yasm_error_set(YASM_ERROR_GENERAL, N_("undefined symbol `%s' (first use)"), sym->name); - yasm_errwarn_propagate(info->errwarns, sym->line); - if (sym->line < info->firstundef_line) - info->firstundef_line = sym->line; + yasm_errwarn_propagate(info->errwarns, sym->use_line); + if (sym->use_line < info->firstundef_line) + info->firstundef_line = sym->use_line; } } @@ -361,10 +404,10 @@ symtab_parser_finalize_checksym(yasm_symrec *sym, /*@null@*/ void *d) yasm_expr_create(YASM_EXPR_SUB, yasm_expr_precbc(sym->value.precbc), yasm_expr_precbc(yasm_section_bcs_first(sect)), - sym->line), + sym->def_line), YASM_EXPR_ADD, yasm_expr_copy(yasm_section_get_start(sect)), - sym->line); + sym->def_line); sym->status |= YASM_SYM_VALUED; } @@ -373,12 +416,11 @@ symtab_parser_finalize_checksym(yasm_symrec *sym, /*@null@*/ void *d) void yasm_symtab_parser_finalize(yasm_symtab *symtab, int undef_extern, - yasm_object *object, yasm_errwarns *errwarns) + yasm_errwarns *errwarns) { symtab_finalize_info info; info.firstundef_line = ULONG_MAX; info.undef_extern = undef_extern; - info.object = object; info.errwarns = errwarns; yasm_symtab_traverse(symtab, &info, symtab_parser_finalize_checksym); if (info.firstundef_line < ULONG_MAX) { @@ -448,9 +490,21 @@ yasm_symrec_get_status(const yasm_symrec *sym) } unsigned long -yasm_symrec_get_line(const yasm_symrec *sym) +yasm_symrec_get_def_line(const yasm_symrec *sym) +{ + return sym->def_line; +} + +unsigned long +yasm_symrec_get_decl_line(const yasm_symrec *sym) { - return sym->line; + return sym->decl_line; +} + +unsigned long +yasm_symrec_get_use_line(const yasm_symrec *sym) +{ + return sym->use_line; } const yasm_expr * @@ -477,7 +531,8 @@ yasm_symrec_get_label(const yasm_symrec *sym, int yasm_symrec_is_abs(const yasm_symrec *sym) { - return (sym->line == 0 && sym->type == SYM_EQU && sym->name[0] == '\0'); + return (sym->def_line == 0 && sym->type == SYM_EQU && + sym->name[0] == '\0'); } int @@ -492,6 +547,34 @@ yasm_symrec_is_curpos(const yasm_symrec *sym) return (sym->type == SYM_CURPOS); } +void +yasm_symrec_set_objext_valparams(yasm_symrec *sym, + /*@only@*/ yasm_valparamhead *objext_valparams) +{ + yasm_symrec_add_data(sym, &objext_valparams_cb, objext_valparams); +} + +yasm_valparamhead * +yasm_symrec_get_objext_valparams(yasm_symrec *sym) +{ + return yasm_symrec_get_data(sym, &objext_valparams_cb); +} + +void +yasm_symrec_set_common_size(yasm_symrec *sym, + /*@only@*/ yasm_expr *common_size) +{ + yasm_expr **ep = yasm_xmalloc(sizeof(yasm_expr *)); + *ep = common_size; + yasm_symrec_add_data(sym, &common_size_cb, ep); +} + +yasm_expr ** +yasm_symrec_get_common_size(yasm_symrec *sym) +{ + return (yasm_expr **)yasm_symrec_get_data(sym, &common_size_cb); +} + void * yasm_symrec_get_data(yasm_symrec *sym, const yasm_assoc_data_callback *callback) @@ -570,5 +653,9 @@ yasm_symrec_print(const yasm_symrec *sym, FILE *f, int indent_level) yasm__assoc_data_print(sym->assoc_data, f, indent_level+1); } - fprintf(f, "%*sLine Index=%lu\n", indent_level, "", sym->line); + fprintf(f, "%*sLine Index (Defined)=%lu\n", indent_level, "", + sym->def_line); + fprintf(f, "%*sLine Index (Declared)=%lu\n", indent_level, "", + sym->decl_line); + fprintf(f, "%*sLine Index (Used)=%lu\n", indent_level, "", sym->use_line); } diff --git a/libyasm/symrec.h b/libyasm/symrec.h index 6cf97559..624a3e98 100644 --- a/libyasm/symrec.h +++ b/libyasm/symrec.h @@ -46,6 +46,16 @@ typedef enum yasm_sym_status { YASM_SYM_NOTINTABLE = 1 << 3 /**< if it's not in sym_table (ex. '$') */ } yasm_sym_status; +/** Symbol record visibility. + * \note YASM_SYM_EXTERN and YASM_SYM_COMMON are mutually exclusive. + */ +typedef enum yasm_sym_vis { + YASM_SYM_LOCAL = 0, /**< Default, local only */ + YASM_SYM_GLOBAL = 1 << 0, /**< If symbol is declared GLOBAL */ + YASM_SYM_COMMON = 1 << 1, /**< If symbol is declared COMMON */ + YASM_SYM_EXTERN = 1 << 2, /**< If symbol is declared EXTERN */ + YASM_SYM_DLOCAL = 1 << 3 /**< If symbol is explicitly declared LOCAL */ +} yasm_sym_vis; /** Create a new symbol table. */ yasm_symtab *yasm_symtab_create(void); @@ -202,13 +212,10 @@ yasm_symrec *yasm_symtab_iter_value(const yasm_symtab_iter *cur); * used but never defined or declared #YASM_SYM_EXTERN or #YASM_SYM_COMMON. * \param symtab symbol table * \param undef_extern if nonzero, all undef syms should be declared extern - * \param object object to notify about new extern decls - * (may be NULL if undef_extern is 0) * \param errwarns error/warning set * \note Errors/warnings are stored into errwarns. */ void yasm_symtab_parser_finalize(yasm_symtab *symtab, int undef_extern, - /*@null@*/ yasm_object *object, yasm_errwarns *errwarns); /** Print the symbol table. For debugging purposes. @@ -236,11 +243,23 @@ yasm_sym_vis yasm_symrec_get_visibility(const yasm_symrec *sym); */ yasm_sym_status yasm_symrec_get_status(const yasm_symrec *sym); -/** Get the virtual line of a symbol (where it was first declared or used). +/** Get the virtual line of where a symbol was first defined. + * \param sym symbol + * \return line virtual line + */ +unsigned long yasm_symrec_get_def_line(const yasm_symrec *sym); + +/** Get the virtual line of where a symbol was first declared. * \param sym symbol * \return line virtual line */ -unsigned long yasm_symrec_get_line(const yasm_symrec *sym); +unsigned long yasm_symrec_get_decl_line(const yasm_symrec *sym); + +/** Get the virtual line of where a symbol was first used. + * \param sym symbol + * \return line virtual line + */ +unsigned long yasm_symrec_get_use_line(const yasm_symrec *sym); /** Get EQU value of a symbol. * \param sym symbol @@ -280,6 +299,36 @@ int yasm_symrec_is_special(const yasm_symrec *sym); */ int yasm_symrec_is_curpos(const yasm_symrec *sym); +/** Set object-extended valparams. + * \param sym symbol + * \param objext_valparams object-extended valparams + */ +void yasm_symrec_set_objext_valparams + (yasm_symrec *sym, /*@only@*/ yasm_valparamhead *objext_valparams); + +/** Get object-extended valparams, if any, associated with symbol's + * declaration. + * \param sym symbol + * \return Object-extended valparams (NULL if none). + */ +/*@null@*/ /*@dependent@*/ yasm_valparamhead *yasm_symrec_get_objext_valparams + (yasm_symrec *sym); + +/** Set common size of symbol. + * \param sym symbol + * \param common_size common size expression + */ +void yasm_symrec_set_common_size + (yasm_symrec *sym, /*@only@*/ yasm_expr *common_size); + +/** Get common size of symbol, if symbol is declared COMMON and a size was set + * for it. + * \param sym symbol + * \return Common size (NULL if none). + */ +/*@dependent@*/ /*@null@*/ yasm_expr **yasm_symrec_get_common_size + (yasm_symrec *sym); + /** Get associated data for a symbol and data callback. * \param sym symbol * \param callback callback used when adding data diff --git a/libyasm/valparam.c b/libyasm/valparam.c index 7513b148..ee3acd54 100644 --- a/libyasm/valparam.c +++ b/libyasm/valparam.c @@ -32,9 +32,37 @@ #include "coretype.h" #include "valparam.h" +#include "errwarn.h" #include "expr.h" +#include "symrec.h" +void +yasm_call_directive(const yasm_directive *directive, yasm_object *object, + yasm_valparamhead *valparams, + yasm_valparamhead *objext_valparams, unsigned long line) +{ + yasm_valparam *vp; + + if ((directive->flags & (YASM_DIR_ARG_REQUIRED|YASM_DIR_ID_REQUIRED)) && + (!valparams || !yasm_vps_first(valparams))) { + yasm_error_set(YASM_ERROR_SYNTAX, + N_("directive `%s' requires an argument"), + directive->name); + return; + } + if (valparams) { + vp = yasm_vps_first(valparams); + if ((directive->flags & YASM_DIR_ID_REQUIRED) && !vp->val) { + yasm_error_set(YASM_ERROR_SYNTAX, + N_("directive `%s' requires an identifier parameter"), + directive->name); + return; + } + } + directive->handler(object, valparams, objext_valparams, line); +} + yasm_valparam * yasm_vp_create(/*@keep@*/ char *v, /*@keep@*/ yasm_expr *p) { @@ -44,6 +72,22 @@ yasm_vp_create(/*@keep@*/ char *v, /*@keep@*/ yasm_expr *p) return r; } +/*@null@*/ /*@only@*/ yasm_expr * +yasm_vp_expr(yasm_valparam *vp, yasm_symtab *symtab, unsigned long line) +{ + if (!vp) + return NULL; + if (vp->val) { + return yasm_expr_create_ident(yasm_expr_sym( + yasm_symtab_use(symtab, vp->val, line)), line); + } else if (vp->param) { + yasm_expr *e = vp->param; + vp->param = NULL; /* to avoid double-free */ + return e; + } else + return NULL; +} + void yasm_vps_delete(yasm_valparamhead *headp) { diff --git a/libyasm/valparam.h b/libyasm/valparam.h index eef1989a..a288d052 100644 --- a/libyasm/valparam.h +++ b/libyasm/valparam.h @@ -46,6 +46,47 @@ struct yasm_valparam { /*@reldef@*/ STAILQ_HEAD(yasm_valparamhead, yasm_valparam); #endif +/** Directive list entry structure. */ +struct yasm_directive { + /** Directive name. GAS directives should include the ".", NASM + * directives should just be the raw name (not including the []). + * NULL entry required to terminate list of directives. + */ + /*@null@*/ const char *name; + + const char *parser; /**< Parser keyword */ + + /** Handler callback function for the directive. + * \param object object + * \param valparams value/parameters + * \param objext_valparams object format-specific value/parameters + * \param line virtual line (from yasm_linemap) + */ + void (*handler) (yasm_object *object, yasm_valparamhead *valparams, + yasm_valparamhead *objext_valparams, unsigned long line); + + /* Flags for pre-handler parameter checking. */ + enum yasm_directive_flags { + YASM_DIR_ANY = 0, /**< Any valparams accepted */ + YASM_DIR_ARG_REQUIRED = 1, /**< Require at least 1 valparam */ + YASM_DIR_ID_REQUIRED = 2 /**< First valparam must be ID */ + } flags; +}; + +/** Call a directive. Performs any valparam checks asked for by the + * directive prior to call. Note that for a variety of reasons, a directive + * can generate an error. + * \param directive directive + * \param object object + * \param valparams value/parameters + * \param objext_valparams object format-specific value/parameters + * \param line virtual line (from yasm_linemap) + */ +void yasm_call_directive(const yasm_directive *directive, yasm_object *object, + yasm_valparamhead *valparams, + yasm_valparamhead *objext_valparams, + unsigned long line); + /** Create a new valparam. * \param v value * \param p parameter @@ -53,6 +94,17 @@ struct yasm_valparam { */ yasm_valparam *yasm_vp_create(/*@keep@*/ char *v, /*@keep@*/ yasm_expr *p); +/** Get a valparam as an expr. If the valparam is a value, it's treated + * as a symbol (yasm_symtab_use() is called to convert it). The valparam + * is modified as necessary to avoid double-frees. + * \param vp valparam + * \param symtab symbol table + * \param line virtual line + * \return Expression, or NULL if vp is NULL or if val and param are both NULL. + */ +/*@null@*/ /*@only@*/ yasm_expr *yasm_vp_expr + (yasm_valparam *vp, yasm_symtab *symtab, unsigned long line); + /** Create a new linked list of valparams. * \return Newly allocated valparam list. */ diff --git a/modules/arch/x86/x86arch.c b/modules/arch/x86/x86arch.c index 645c0b98..387c7e5d 100644 --- a/modules/arch/x86/x86arch.c +++ b/modules/arch/x86/x86arch.c @@ -118,35 +118,72 @@ x86_set_var(yasm_arch *arch, const char *var, unsigned long val) return 0; } -static int -x86_parse_directive(yasm_arch *arch, const char *name, - /*@null@*/ yasm_valparamhead *valparams, - /*@unused@*/ /*@null@*/ - yasm_valparamhead *objext_valparams, - /*@unused@*/ yasm_object *object, - /*@unused@*/ unsigned long line) +static void +x86_dir_cpu(yasm_object *object, yasm_valparamhead *valparams, + yasm_valparamhead *objext_valparams, unsigned long line) { - yasm_arch_x86 *arch_x86 = (yasm_arch_x86 *)arch; + yasm_arch_x86 *arch_x86 = (yasm_arch_x86 *)object->arch; + + yasm_valparam *vp; + yasm_vps_foreach(vp, valparams) { + if (vp->val) + yasm_x86__parse_cpu(arch_x86, vp->val, strlen(vp->val)); + else if (vp->param) { + const yasm_intnum *intcpu; + intcpu = yasm_expr_get_intnum(&vp->param, 0); + if (!intcpu) + yasm_error_set(YASM_ERROR_SYNTAX, + N_("invalid argument to [%s]"), "CPU"); + else { + char strcpu[16]; + sprintf(strcpu, "%lu", yasm_intnum_get_uint(intcpu)); + yasm_x86__parse_cpu(arch_x86, strcpu, strlen(strcpu)); + } + } + } +} + +static void +x86_dir_bits(yasm_object *object, yasm_valparamhead *valparams, + yasm_valparamhead *objext_valparams, unsigned long line) +{ + yasm_arch_x86 *arch_x86 = (yasm_arch_x86 *)object->arch; yasm_valparam *vp; const yasm_intnum *intn; long lval; - if (yasm__strcasecmp(name, "bits") == 0) { - if (!valparams) - yasm_error_set(YASM_ERROR_VALUE, N_("[%s] requires an argument"), - "BITS"); - else if ((vp = yasm_vps_first(valparams)) && !vp->val && - vp->param != NULL && - (intn = yasm_expr_get_intnum(&vp->param, 0)) != NULL && - (lval = yasm_intnum_get_int(intn)) && - (lval == 16 || lval == 32 || lval == 64)) - arch_x86->mode_bits = (unsigned char)lval; - else - yasm_error_set(YASM_ERROR_VALUE, N_("invalid argument to [%s]"), - "BITS"); - return 0; - } else - return 1; + if ((vp = yasm_vps_first(valparams)) && !vp->val && vp->param != NULL && + (intn = yasm_expr_get_intnum(&vp->param, 0)) != NULL && + (lval = yasm_intnum_get_int(intn)) && + (lval == 16 || lval == 32 || lval == 64)) + arch_x86->mode_bits = (unsigned char)lval; + else + yasm_error_set(YASM_ERROR_VALUE, N_("invalid argument to [%s]"), + "BITS"); +} + +static void +x86_dir_code16(yasm_object *object, yasm_valparamhead *valparams, + yasm_valparamhead *objext_valparams, unsigned long line) +{ + yasm_arch_x86 *arch_x86 = (yasm_arch_x86 *)object->arch; + arch_x86->mode_bits = 16; +} + +static void +x86_dir_code32(yasm_object *object, yasm_valparamhead *valparams, + yasm_valparamhead *objext_valparams, unsigned long line) +{ + yasm_arch_x86 *arch_x86 = (yasm_arch_x86 *)object->arch; + arch_x86->mode_bits = 32; +} + +static void +x86_dir_code64(yasm_object *object, yasm_valparamhead *valparams, + yasm_valparamhead *objext_valparams, unsigned long line) +{ + yasm_arch_x86 *arch_x86 = (yasm_arch_x86 *)object->arch; + arch_x86->mode_bits = 64; } static const unsigned char ** @@ -438,25 +475,33 @@ x86_segreg_print(yasm_arch *arch, uintptr_t segreg, FILE *f) } /* Define x86 machines -- see arch.h for details */ -static yasm_arch_machine x86_machines[] = { +static const yasm_arch_machine x86_machines[] = { { "IA-32 and derivatives", "x86" }, { "AMD64", "amd64" }, { NULL, NULL } }; +static const yasm_directive x86_directives[] = { + { "cpu", "nasm", x86_dir_cpu, YASM_DIR_ARG_REQUIRED }, + { "bits", "nasm", x86_dir_bits, YASM_DIR_ARG_REQUIRED }, + { ".code16", "gas", x86_dir_code16, YASM_DIR_ANY }, + { ".code32", "gas", x86_dir_code32, YASM_DIR_ANY }, + { ".code64", "gas", x86_dir_code64, YASM_DIR_ANY }, + { NULL, NULL, NULL, 0 } +}; + /* Define arch structure -- see arch.h for details */ yasm_arch_module yasm_x86_LTX_arch = { "x86 (IA-32 and derivatives), AMD64", "x86", + x86_directives, x86_create, x86_destroy, x86_get_machine, x86_get_address_size, x86_set_var, - yasm_x86__parse_cpu, yasm_x86__parse_check_insnprefix, yasm_x86__parse_check_regtmod, - x86_parse_directive, x86_get_fill, yasm_x86__finalize_insn, yasm_x86__floatnum_tobytes, diff --git a/modules/arch/x86/x86arch.h b/modules/arch/x86/x86arch.h index 24b39bd6..95fe775e 100644 --- a/modules/arch/x86/x86arch.h +++ b/modules/arch/x86/x86arch.h @@ -259,7 +259,8 @@ int yasm_x86__expr_checkea (x86_effaddr *x86_ea, unsigned char *addrsize, unsigned int bits, int address16_op, unsigned char *rex, yasm_bytecode *bc); -void yasm_x86__parse_cpu(yasm_arch *arch, const char *cpuid, size_t cpuid_len); +void yasm_x86__parse_cpu(yasm_arch_x86 *arch_x86, const char *cpuid, + size_t cpuid_len); yasm_arch_insnprefix yasm_x86__parse_check_insnprefix (yasm_arch *arch, /*@out@*/ uintptr_t data[4], const char *id, diff --git a/modules/arch/x86/x86id.c b/modules/arch/x86/x86id.c index 93c48b45..977c5928 100644 --- a/modules/arch/x86/x86id.c +++ b/modules/arch/x86/x86id.c @@ -3295,9 +3295,9 @@ yasm_x86__parse_check_insnprefix(yasm_arch *arch, uintptr_t data[4], } void -yasm_x86__parse_cpu(yasm_arch *arch, const char *cpuid, size_t cpuid_len) +yasm_x86__parse_cpu(yasm_arch_x86 *arch_x86, const char *cpuid, + size_t cpuid_len) { - yasm_arch_x86 *arch_x86 = (yasm_arch_x86 *)arch; /*@null@*/ const cpu_parse_data *pdata; size_t i; static char lcaseid[16]; diff --git a/modules/dbgfmts/codeview/cv-dbgfmt.c b/modules/dbgfmts/codeview/cv-dbgfmt.c index 1b045fcf..6ec6407d 100644 --- a/modules/dbgfmts/codeview/cv-dbgfmt.c +++ b/modules/dbgfmts/codeview/cv-dbgfmt.c @@ -99,19 +99,12 @@ cv_dbgfmt_generate(yasm_object *object, yasm_linemap *linemap, yasm_cv__generate_type(object); } -static int -cv_dbgfmt_directive(yasm_object *object, const char *name, - yasm_valparamhead *valparams, unsigned long line) -{ - return 1; /* TODO */ -} - /* Define dbgfmt structure -- see dbgfmt.h for details */ yasm_dbgfmt_module yasm_cv8_LTX_dbgfmt = { "CodeView debugging format for VC8", "cv8", + NULL, /* no directives */ cv8_dbgfmt_create, cv_dbgfmt_destroy, - cv_dbgfmt_directive, cv_dbgfmt_generate }; diff --git a/modules/dbgfmts/dwarf2/dwarf2-dbgfmt.c b/modules/dbgfmts/dwarf2/dwarf2-dbgfmt.c index eb76fa30..e498f0d1 100644 --- a/modules/dbgfmts/dwarf2/dwarf2-dbgfmt.c +++ b/modules/dbgfmts/dwarf2/dwarf2-dbgfmt.c @@ -330,19 +330,20 @@ dwarf2_section_data_print(void *data, FILE *f, int indent_level) /* TODO */ } -static int -dwarf2_dbgfmt_directive(yasm_object *object, const char *name, - yasm_valparamhead *valparams, unsigned long line) -{ - return yasm_dwarf2__line_directive(object, name, valparams, line); -} +static const yasm_directive dwarf2_directives[] = { + { ".loc", "gas", yasm_dwarf2__dir_loc, YASM_DIR_ARG_REQUIRED }, + { ".file", "gas", yasm_dwarf2__dir_file, YASM_DIR_ARG_REQUIRED }, + { "loc", "nasm", yasm_dwarf2__dir_loc, YASM_DIR_ARG_REQUIRED }, + { "file", "nasm", yasm_dwarf2__dir_file, YASM_DIR_ARG_REQUIRED }, + { NULL, NULL, NULL, 0 } +}; /* Define dbgfmt structure -- see dbgfmt.h for details */ yasm_dbgfmt_module yasm_dwarf2_LTX_dbgfmt = { "DWARF2 debugging format", "dwarf2", + dwarf2_directives, dwarf2_dbgfmt_create, dwarf2_dbgfmt_destroy, - dwarf2_dbgfmt_directive, dwarf2_dbgfmt_generate }; diff --git a/modules/dbgfmts/dwarf2/dwarf2-dbgfmt.h b/modules/dbgfmts/dwarf2/dwarf2-dbgfmt.h index 1c361b0c..eeba0a19 100644 --- a/modules/dbgfmts/dwarf2/dwarf2-dbgfmt.h +++ b/modules/dbgfmts/dwarf2/dwarf2-dbgfmt.h @@ -107,9 +107,12 @@ yasm_section *yasm_dwarf2__generate_line (yasm_object *object, yasm_linemap *linemap, yasm_errwarns *errwarns, int asm_source, /*@out@*/ yasm_section **main_code, /*@out@*/ size_t *num_line_sections); -int yasm_dwarf2__line_directive - (yasm_object *object, const char *name, yasm_valparamhead *valparams, - unsigned long line); +void yasm_dwarf2__dir_loc(yasm_object *object, yasm_valparamhead *valparams, + yasm_valparamhead *objext_valparams, + unsigned long line); +void yasm_dwarf2__dir_file(yasm_object *object, yasm_valparamhead *valparams, + yasm_valparamhead *objext_valparams, + unsigned long line); /* Address range table functions */ yasm_section *yasm_dwarf2__generate_aranges(yasm_object *object, diff --git a/modules/dbgfmts/dwarf2/dwarf2-line.c b/modules/dbgfmts/dwarf2/dwarf2-line.c index c38fda4c..6b80ac31 100644 --- a/modules/dbgfmts/dwarf2/dwarf2-line.c +++ b/modules/dbgfmts/dwarf2/dwarf2-line.c @@ -826,188 +826,187 @@ dwarf2_line_op_bc_tobytes(yasm_bytecode *bc, unsigned char **bufp, void *d, return 0; } -int -yasm_dwarf2__line_directive(yasm_object *object, const char *name, - yasm_valparamhead *valparams, unsigned long line) +void +yasm_dwarf2__dir_loc(yasm_object *object, yasm_valparamhead *valparams, + yasm_valparamhead *objext_valparams, unsigned long line) { - yasm_dbgfmt_dwarf2 *dbgfmt_dwarf2 = (yasm_dbgfmt_dwarf2 *)object->dbgfmt; yasm_valparam *vp; - if (yasm__strcasecmp(name, "loc") == 0) { - /*@dependent@*/ /*@null@*/ const yasm_intnum *intn; - dwarf2_section_data *dsd; - dwarf2_loc *loc = yasm_xmalloc(sizeof(dwarf2_loc)); - - /* File number (required) */ - if (!valparams || !(vp = yasm_vps_first(valparams)) || !vp->param) { - yasm_error_set(YASM_ERROR_SYNTAX, N_("file number required")); - yasm_xfree(loc); - return 0; - } - intn = yasm_expr_get_intnum(&vp->param, 0); - if (!intn) { - yasm_error_set(YASM_ERROR_NOT_CONSTANT, - N_("file number is not a constant")); - yasm_xfree(loc); - return 0; - } - if (yasm_intnum_sign(intn) != 1) { - yasm_error_set(YASM_ERROR_VALUE, - N_("file number less than one")); - yasm_xfree(loc); - return 0; - } - loc->file = yasm_intnum_get_uint(intn); - /* Line number (required) */ - vp = yasm_vps_next(vp); - if (!vp || !vp->param) { - yasm_error_set(YASM_ERROR_SYNTAX, N_("line number required")); - yasm_xfree(loc); - return 0; - } + /*@dependent@*/ /*@null@*/ const yasm_intnum *intn; + dwarf2_section_data *dsd; + dwarf2_loc *loc = yasm_xmalloc(sizeof(dwarf2_loc)); + + /* File number (required) */ + if (!valparams || !(vp = yasm_vps_first(valparams)) || !vp->param) { + yasm_error_set(YASM_ERROR_SYNTAX, N_("file number required")); + yasm_xfree(loc); + return; + } + intn = yasm_expr_get_intnum(&vp->param, 0); + if (!intn) { + yasm_error_set(YASM_ERROR_NOT_CONSTANT, + N_("file number is not a constant")); + yasm_xfree(loc); + return; + } + if (yasm_intnum_sign(intn) != 1) { + yasm_error_set(YASM_ERROR_VALUE, N_("file number less than one")); + yasm_xfree(loc); + return; + } + loc->file = yasm_intnum_get_uint(intn); + + /* Line number (required) */ + vp = yasm_vps_next(vp); + if (!vp || !vp->param) { + yasm_error_set(YASM_ERROR_SYNTAX, N_("line number required")); + yasm_xfree(loc); + return; + } + intn = yasm_expr_get_intnum(&vp->param, 0); + if (!intn) { + yasm_error_set(YASM_ERROR_NOT_CONSTANT, + N_("file number is not a constant")); + yasm_xfree(loc); + return; + } + loc->line = yasm_intnum_get_uint(intn); + + /* Generate new section data if it doesn't already exist */ + dsd = yasm_section_get_data(object->cur_section, + &yasm_dwarf2__section_data_cb); + if (!dsd) { + dsd = yasm_xmalloc(sizeof(dwarf2_section_data)); + STAILQ_INIT(&dsd->locs); + yasm_section_add_data(object->cur_section, + &yasm_dwarf2__section_data_cb, dsd); + } + + /* Defaults for optional settings */ + loc->column = 0; + loc->isa_change = 0; + loc->isa = 0; + loc->is_stmt = IS_STMT_NOCHANGE; + loc->basic_block = 0; + loc->prologue_end = 0; + loc->epilogue_begin = 0; + + /* Optional column number */ + vp = yasm_vps_next(vp); + if (vp && vp->param) { intn = yasm_expr_get_intnum(&vp->param, 0); if (!intn) { yasm_error_set(YASM_ERROR_NOT_CONSTANT, - N_("file number is not a constant")); + N_("column number is not a constant")); yasm_xfree(loc); - return 0; - } - loc->line = yasm_intnum_get_uint(intn); - - /* Generate new section data if it doesn't already exist */ - dsd = yasm_section_get_data(object->cur_section, - &yasm_dwarf2__section_data_cb); - if (!dsd) { - dsd = yasm_xmalloc(sizeof(dwarf2_section_data)); - STAILQ_INIT(&dsd->locs); - yasm_section_add_data(object->cur_section, - &yasm_dwarf2__section_data_cb, dsd); + return; } - - /* Defaults for optional settings */ - loc->column = 0; - loc->isa_change = 0; - loc->isa = 0; - loc->is_stmt = IS_STMT_NOCHANGE; - loc->basic_block = 0; - loc->prologue_end = 0; - loc->epilogue_begin = 0; - - /* Optional column number */ + loc->column = yasm_intnum_get_uint(intn); vp = yasm_vps_next(vp); - if (vp && vp->param) { + } + + /* Other options */ + while (vp && vp->val) { + if (yasm__strcasecmp(vp->val, "basic_block") == 0) + loc->basic_block = 1; + else if (yasm__strcasecmp(vp->val, "prologue_end") == 0) + loc->prologue_end = 1; + else if (yasm__strcasecmp(vp->val, "epilogue_begin") == 0) + loc->epilogue_begin = 1; + else if (yasm__strcasecmp(vp->val, "is_stmt") == 0) { + if (!vp->param) { + yasm_error_set(YASM_ERROR_SYNTAX, + N_("is_stmt requires value")); + yasm_xfree(loc); + return; + } intn = yasm_expr_get_intnum(&vp->param, 0); if (!intn) { yasm_error_set(YASM_ERROR_NOT_CONSTANT, - N_("column number is not a constant")); + N_("is_stmt value is not a constant")); yasm_xfree(loc); - return 0; + return; } - loc->column = yasm_intnum_get_uint(intn); - vp = yasm_vps_next(vp); - } - - /* Other options */ - while (vp && vp->val) { - if (yasm__strcasecmp(vp->val, "basic_block") == 0) - loc->basic_block = 1; - else if (yasm__strcasecmp(vp->val, "prologue_end") == 0) - loc->prologue_end = 1; - else if (yasm__strcasecmp(vp->val, "epilogue_begin") == 0) - loc->epilogue_begin = 1; - else if (yasm__strcasecmp(vp->val, "is_stmt") == 0) { - if (!vp->param) { - yasm_error_set(YASM_ERROR_SYNTAX, - N_("is_stmt requires value")); - yasm_xfree(loc); - return 0; - } - intn = yasm_expr_get_intnum(&vp->param, 0); - if (!intn) { - yasm_error_set(YASM_ERROR_NOT_CONSTANT, - N_("is_stmt value is not a constant")); - yasm_xfree(loc); - return 0; - } - if (yasm_intnum_is_zero(intn)) - loc->is_stmt = IS_STMT_SET; - else if (yasm_intnum_is_pos1(intn)) - loc->is_stmt = IS_STMT_CLEAR; - else { - yasm_error_set(YASM_ERROR_VALUE, - N_("is_stmt value not 0 or 1")); - yasm_xfree(loc); - return 0; - } - } else if (yasm__strcasecmp(vp->val, "isa") == 0) { - if (!vp->param) { - yasm_error_set(YASM_ERROR_SYNTAX, N_("isa requires value")); - yasm_xfree(loc); - return 0; - } - intn = yasm_expr_get_intnum(&vp->param, 0); - if (!intn) { - yasm_error_set(YASM_ERROR_NOT_CONSTANT, - N_("isa value is not a constant")); - yasm_xfree(loc); - return 0; - } - if (yasm_intnum_sign(intn) < 0) { - yasm_error_set(YASM_ERROR_VALUE, - N_("isa value less than zero")); - yasm_xfree(loc); - return 0; - } - loc->isa_change = 1; - loc->isa = yasm_intnum_get_uint(intn); - } else - yasm_warn_set(YASM_WARN_GENERAL, - N_("unrecognized loc option `%s'"), vp->val); - } + if (yasm_intnum_is_zero(intn)) + loc->is_stmt = IS_STMT_SET; + else if (yasm_intnum_is_pos1(intn)) + loc->is_stmt = IS_STMT_CLEAR; + else { + yasm_error_set(YASM_ERROR_VALUE, + N_("is_stmt value not 0 or 1")); + yasm_xfree(loc); + return; + } + } else if (yasm__strcasecmp(vp->val, "isa") == 0) { + if (!vp->param) { + yasm_error_set(YASM_ERROR_SYNTAX, N_("isa requires value")); + yasm_xfree(loc); + return; + } + intn = yasm_expr_get_intnum(&vp->param, 0); + if (!intn) { + yasm_error_set(YASM_ERROR_NOT_CONSTANT, + N_("isa value is not a constant")); + yasm_xfree(loc); + return; + } + if (yasm_intnum_sign(intn) < 0) { + yasm_error_set(YASM_ERROR_VALUE, + N_("isa value less than zero")); + yasm_xfree(loc); + return; + } + loc->isa_change = 1; + loc->isa = yasm_intnum_get_uint(intn); + } else + yasm_warn_set(YASM_WARN_GENERAL, + N_("unrecognized loc option `%s'"), vp->val); + } - /* Append new location */ - loc->vline = line; - loc->bc = NULL; - loc->sym = NULL; - STAILQ_INSERT_TAIL(&dsd->locs, loc, link); + /* Append new location */ + loc->vline = line; + loc->bc = NULL; + loc->sym = NULL; + STAILQ_INSERT_TAIL(&dsd->locs, loc, link); +} - return 0; - } else if (yasm__strcasecmp(name, "file") == 0) { - /*@dependent@*/ /*@null@*/ const yasm_intnum *file_intn; - unsigned long filenum; - - if (!valparams) { - yasm_error_set(YASM_ERROR_SYNTAX, N_("[%s] requires an argument"), - "FILE"); - return 0; - } +void +yasm_dwarf2__dir_file(yasm_object *object, yasm_valparamhead *valparams, + yasm_valparamhead *objext_valparams, unsigned long line) +{ + yasm_dbgfmt_dwarf2 *dbgfmt_dwarf2 = (yasm_dbgfmt_dwarf2 *)object->dbgfmt; + yasm_valparam *vp; + /*@dependent@*/ /*@null@*/ const yasm_intnum *file_intn; + unsigned long filenum; - vp = yasm_vps_first(valparams); - if (vp->val) { - /* Just a bare filename */ - yasm_object_set_source_fn(object, vp->val); - return 0; - } + if (!valparams) { + yasm_error_set(YASM_ERROR_SYNTAX, N_("[%s] requires an argument"), + "FILE"); + return; + } - /* Otherwise.. first vp is the file number */ - file_intn = yasm_expr_get_intnum(&vp->param, 0); - if (!file_intn) { - yasm_error_set(YASM_ERROR_NOT_CONSTANT, - N_("file number is not a constant")); - return 0; - } - filenum = yasm_intnum_get_uint(file_intn); + vp = yasm_vps_first(valparams); + if (vp->val) { + /* Just a bare filename */ + yasm_object_set_source_fn(object, vp->val); + return; + } - vp = yasm_vps_next(vp); - if (!vp || !vp->val) { - yasm_error_set(YASM_ERROR_SYNTAX, - N_("file number given but no filename")); - return 0; - } + /* Otherwise.. first vp is the file number */ + file_intn = yasm_expr_get_intnum(&vp->param, 0); + if (!file_intn) { + yasm_error_set(YASM_ERROR_NOT_CONSTANT, + N_("file number is not a constant")); + return; + } + filenum = yasm_intnum_get_uint(file_intn); - dwarf2_dbgfmt_add_file(dbgfmt_dwarf2, filenum, vp->val); - return 0; + vp = yasm_vps_next(vp); + if (!vp || !vp->val) { + yasm_error_set(YASM_ERROR_SYNTAX, + N_("file number given but no filename")); + return; } - return 1; -} + dwarf2_dbgfmt_add_file(dbgfmt_dwarf2, filenum, vp->val); +} diff --git a/modules/dbgfmts/dwarf2/tests/pass32/dwarf32_testhd.hex b/modules/dbgfmts/dwarf2/tests/pass32/dwarf32_testhd.hex index c145c87f..e73e882a 100644 --- a/modules/dbgfmts/dwarf2/tests/pass32/dwarf32_testhd.hex +++ b/modules/dbgfmts/dwarf2/tests/pass32/dwarf32_testhd.hex @@ -3038,70 +3038,6 @@ e3 69 6e 00 -5f -5f -73 -74 -64 -65 -72 -72 -70 -00 -66 -70 -72 -69 -6e -74 -66 -00 -66 -6f -70 -65 -6e -00 -70 -72 -69 -6e -74 -66 -00 -66 -67 -65 -74 -63 -00 -5f -5f -69 -73 -74 -68 -72 -65 -61 -64 -65 -64 -00 -66 -65 -72 -72 -6f -72 -00 -66 -63 -6c -6f -73 -65 -00 2e 4c 64 @@ -3217,6 +3153,16 @@ e3 4c 32 00 +5f +5f +73 +74 +64 +65 +72 +72 +70 +00 2e 4c 43 @@ -3224,10 +3170,24 @@ e3 49 34 00 +66 +70 +72 +69 +6e +74 +66 +00 2e 4c 31 00 +66 +6f +70 +65 +6e +00 2e 4c 34 @@ -3236,6 +3196,32 @@ e3 4c 36 00 +70 +72 +69 +6e +74 +66 +00 +66 +67 +65 +74 +63 +00 +5f +5f +69 +73 +74 +68 +72 +65 +61 +64 +65 +64 +00 2e 4c 38 @@ -3248,6 +3234,20 @@ e3 4c 37 00 +66 +65 +72 +72 +6f +72 +00 +66 +63 +6c +6f +73 +65 +00 2e 4c 46 @@ -4554,7 +4554,7 @@ e3 00 04 00 -de +d0 00 00 00 @@ -4570,7 +4570,7 @@ cc 00 04 00 -da +cc 00 00 00 @@ -4586,7 +4586,7 @@ af 00 04 00 -d6 +c8 00 00 00 @@ -4602,7 +4602,7 @@ d6 00 04 00 -d2 +aa 00 00 00 @@ -4618,7 +4618,7 @@ d2 00 04 00 -ce +a6 00 00 00 @@ -4634,7 +4634,7 @@ ce 00 04 00 -ca +9c 00 00 00 @@ -4650,7 +4650,7 @@ dc 00 04 00 -c3 +8d 00 00 00 @@ -4666,7 +4666,7 @@ c3 00 04 00 -bf +7f 00 00 00 @@ -4682,7 +4682,7 @@ bf 00 04 00 -b8 +78 00 00 00 @@ -4698,7 +4698,7 @@ b8 00 04 00 -b1 +71 00 00 00 @@ -4714,7 +4714,7 @@ b1 00 04 00 -aa +6a 00 00 00 @@ -4730,7 +4730,7 @@ aa 00 04 00 -a3 +63 00 00 00 @@ -4746,7 +4746,7 @@ a3 00 04 00 -9d +5d 00 00 00 @@ -4762,7 +4762,7 @@ a3 00 04 00 -98 +58 00 00 00 @@ -4778,7 +4778,7 @@ a3 00 0b 00 -93 +53 00 00 00 @@ -4794,7 +4794,7 @@ a3 00 0b 00 -8e +4e 00 00 00 @@ -4810,7 +4810,7 @@ a3 00 0b 00 -89 +49 00 00 00 @@ -4826,7 +4826,7 @@ a3 00 0b 00 -84 +44 00 00 00 @@ -4858,7 +4858,7 @@ a3 00 0b 00 -7c +3c 00 00 00 @@ -4874,7 +4874,7 @@ a3 00 04 00 -6e +2e 00 00 00 @@ -4906,7 +4906,7 @@ a3 00 09 00 -60 +20 00 00 00 @@ -4938,7 +4938,7 @@ a3 00 07 00 -50 +10 00 00 00 @@ -5002,7 +5002,7 @@ e3 00 04 00 -10 +83 00 00 00 @@ -5018,7 +5018,7 @@ e3 00 00 00 -1a +94 00 00 00 @@ -5034,7 +5034,7 @@ e3 00 00 00 -22 +a0 00 00 00 @@ -5050,7 +5050,7 @@ e3 00 00 00 -28 +ae 00 00 00 @@ -5066,7 +5066,7 @@ e3 00 00 00 -2f +b5 00 00 00 @@ -5082,7 +5082,7 @@ e3 00 00 00 -35 +bb 00 00 00 @@ -5098,7 +5098,7 @@ e3 00 00 00 -42 +d4 00 00 00 @@ -5114,7 +5114,7 @@ e3 00 00 00 -49 +db 00 00 00 diff --git a/modules/dbgfmts/dwarf2/tests/pass64/dwarf64_leb128.hex b/modules/dbgfmts/dwarf2/tests/pass64/dwarf64_leb128.hex index 178ae19f..af09833c 100644 --- a/modules/dbgfmts/dwarf2/tests/pass64/dwarf64_leb128.hex +++ b/modules/dbgfmts/dwarf2/tests/pass64/dwarf64_leb128.hex @@ -6246,7 +6246,7 @@ ff 00 00 00 -b6 +9e 04 00 00 @@ -6294,7 +6294,7 @@ ff 00 00 00 -b6 +9e 04 00 00 @@ -6342,7 +6342,7 @@ ff 00 00 00 -b6 +9e 04 00 00 @@ -6390,7 +6390,7 @@ ff 00 00 00 -b6 +9e 04 00 00 @@ -6438,7 +6438,7 @@ ff 00 00 00 -b6 +9e 04 00 00 @@ -6486,7 +6486,7 @@ ff 00 00 00 -b7 +9f 04 00 00 @@ -6558,7 +6558,7 @@ ff 00 00 00 -b8 +a1 04 00 00 @@ -6606,7 +6606,7 @@ ff 00 00 00 -b9 +a2 04 00 00 @@ -6654,7 +6654,7 @@ a4 00 00 00 -b9 +a2 04 00 00 @@ -6702,7 +6702,7 @@ b0 00 00 00 -b9 +a2 04 00 00 @@ -6750,7 +6750,7 @@ bc 00 00 00 -b9 +a2 04 00 00 @@ -6798,7 +6798,7 @@ cc 00 00 00 -b9 +a2 04 00 00 @@ -6822,7 +6822,7 @@ f0 00 00 00 -ba +a4 04 00 00 @@ -6894,7 +6894,7 @@ ff 00 00 00 -bb +a5 04 00 00 @@ -6942,7 +6942,7 @@ ff 00 00 00 -bc +a6 04 00 00 @@ -6990,7 +6990,7 @@ ff 00 00 00 -bd +a7 04 00 00 @@ -7038,7 +7038,7 @@ ff 00 00 00 -be +a8 04 00 00 @@ -7086,7 +7086,7 @@ ff 00 00 00 -bf +a9 04 00 00 @@ -7110,7 +7110,7 @@ d0 00 00 00 -ba +a4 04 00 00 @@ -7134,7 +7134,7 @@ db 00 00 00 -c0 +ab 04 00 00 @@ -7182,7 +7182,7 @@ f5 00 00 00 -c1 +ac 04 00 00 @@ -7230,7 +7230,7 @@ ff 00 00 00 -bc +a6 04 00 00 @@ -7278,7 +7278,7 @@ ff 00 00 00 -bd +a7 04 00 00 @@ -7326,7 +7326,7 @@ ff 00 00 00 -be +a8 04 00 00 @@ -7374,7 +7374,7 @@ ff 00 00 00 -bf +a9 04 00 00 @@ -7398,7 +7398,7 @@ b0 00 00 00 -ba +a4 04 00 00 @@ -7422,7 +7422,7 @@ bb 00 00 00 -c0 +ab 04 00 00 @@ -7470,7 +7470,7 @@ d9 00 00 00 -c2 +ae 04 00 00 @@ -7518,7 +7518,7 @@ e5 00 00 00 -bc +a6 04 00 00 @@ -7566,7 +7566,7 @@ ff 00 00 00 -bd +a7 04 00 00 @@ -7614,7 +7614,7 @@ ff 00 00 00 -be +a8 04 00 00 @@ -7662,7 +7662,7 @@ ff 00 00 00 -bf +a9 04 00 00 @@ -7686,7 +7686,7 @@ ff 00 00 00 -ba +a4 04 00 00 @@ -7710,7 +7710,7 @@ ff 00 00 00 -c0 +ab 04 00 00 @@ -7758,7 +7758,7 @@ b9 00 00 00 -c3 +b0 04 00 00 @@ -7806,7 +7806,7 @@ c5 00 00 00 -bc +a6 04 00 00 @@ -7854,7 +7854,7 @@ e5 00 00 00 -bd +a7 04 00 00 @@ -7902,7 +7902,7 @@ ff 00 00 00 -be +a8 04 00 00 @@ -7950,7 +7950,7 @@ ff 00 00 00 -bf +a9 04 00 00 @@ -7974,7 +7974,7 @@ ff 00 00 00 -ba +a4 04 00 00 @@ -7998,7 +7998,7 @@ ff 00 00 00 -c0 +ab 04 00 00 @@ -8070,7 +8070,7 @@ ff 00 00 00 -be +a8 04 00 00 @@ -8118,7 +8118,7 @@ ff 00 00 00 -c4 +b2 04 00 00 @@ -8166,7 +8166,7 @@ ff 00 00 00 -bf +a9 04 00 00 @@ -8214,7 +8214,7 @@ ff 00 00 00 -c5 +b3 04 00 00 @@ -8262,7 +8262,7 @@ ff 00 00 00 -c6 +b4 04 00 00 @@ -8310,7 +8310,7 @@ ac 00 00 00 -be +a8 04 00 00 @@ -8334,7 +8334,7 @@ eb 00 00 00 -ba +a4 04 00 00 @@ -8382,7 +8382,7 @@ ff 00 00 00 -c4 +b2 04 00 00 @@ -8430,7 +8430,7 @@ ff 00 00 00 -c6 +b4 04 00 00 @@ -8478,7 +8478,7 @@ ff 00 00 00 -c7 +b7 04 00 00 @@ -8502,7 +8502,7 @@ ff 00 00 00 -ba +a4 04 00 00 @@ -8550,7 +8550,7 @@ ff 00 00 00 -be +a8 04 00 00 @@ -8574,7 +8574,7 @@ ff 00 00 00 -ba +a4 04 00 00 @@ -8598,7 +8598,7 @@ f5 00 00 00 -be +a8 04 00 00 @@ -8622,7 +8622,7 @@ ff 00 00 00 -c8 +ba 04 00 00 @@ -8646,7 +8646,7 @@ ff 00 00 00 -b9 +a2 04 00 00 @@ -8670,7 +8670,7 @@ ff 00 00 00 -c8 +ba 04 00 00 @@ -8718,7 +8718,7 @@ ff 00 00 00 -c4 +b2 04 00 00 @@ -8742,7 +8742,7 @@ ac 00 00 00 -c6 +b4 04 00 00 @@ -8790,7 +8790,7 @@ cd 00 00 00 -c4 +b2 04 00 00 @@ -8814,7 +8814,7 @@ df 00 00 00 -c6 +b4 04 00 00 @@ -8910,7 +8910,7 @@ ff 00 00 00 -c9 +bc 04 00 00 @@ -8958,7 +8958,7 @@ ff 00 00 00 -bc +a6 04 00 00 @@ -9006,7 +9006,7 @@ ff 00 00 00 -bd +a7 04 00 00 @@ -9054,7 +9054,7 @@ ff 00 00 00 -be +a8 04 00 00 @@ -9126,7 +9126,7 @@ c6 00 00 00 -c9 +bc 04 00 00 @@ -9174,7 +9174,7 @@ db 00 00 00 -ca +bd 04 00 00 @@ -9198,7 +9198,7 @@ e8 00 00 00 -b9 +a2 04 00 00 @@ -9270,7 +9270,7 @@ ff 00 00 00 -cb +be 04 00 00 @@ -9342,7 +9342,7 @@ ff 00 00 00 -cb +be 04 00 00 @@ -9390,7 +9390,7 @@ ff 00 00 00 -c4 +b2 04 00 00 @@ -9414,7 +9414,7 @@ ff 00 00 00 -cc +bf 04 00 00 @@ -9462,7 +9462,7 @@ ff 00 00 00 -cd +c0 04 00 00 @@ -9510,7 +9510,7 @@ ff 00 00 00 -c4 +b2 04 00 00 @@ -9534,7 +9534,7 @@ ff 00 00 00 -ce +c1 04 00 00 @@ -9582,7 +9582,7 @@ ff 00 00 00 -cd +c0 04 00 00 @@ -9630,7 +9630,7 @@ ff 00 00 00 -c4 +b2 04 00 00 @@ -9654,7 +9654,7 @@ ff 00 00 00 -ce +c1 04 00 00 @@ -9702,7 +9702,7 @@ b0 00 00 00 -cd +c0 04 00 00 @@ -9750,7 +9750,7 @@ c1 00 00 00 -c4 +b2 04 00 00 @@ -9774,7 +9774,7 @@ cc 00 00 00 -cf +c2 04 00 00 @@ -9846,7 +9846,7 @@ e7 00 00 00 -d0 +c3 04 00 00 @@ -9918,7 +9918,7 @@ f6 00 00 00 -d0 +c3 04 00 00 @@ -9966,7 +9966,7 @@ ff 00 00 00 -c7 +b7 04 00 00 @@ -10014,7 +10014,7 @@ ff 00 00 00 -ca +bd 04 00 00 @@ -10062,7 +10062,7 @@ ff 00 00 00 -c4 +b2 04 00 00 @@ -10086,7 +10086,7 @@ ff 00 00 00 -cc +bf 04 00 00 @@ -10134,7 +10134,7 @@ ff 00 00 00 -d1 +c4 04 00 00 @@ -10182,7 +10182,7 @@ ff 00 00 00 -d2 +c5 04 00 00 @@ -10230,7 +10230,7 @@ a3 00 00 00 -d3 +c6 04 00 00 @@ -10278,7 +10278,7 @@ ba 00 00 00 -d4 +c7 04 00 00 @@ -10326,7 +10326,7 @@ d1 00 00 00 -d5 +c8 04 00 00 @@ -10374,7 +10374,7 @@ e8 00 00 00 -d6 +c9 04 00 00 @@ -10422,7 +10422,7 @@ ff 00 00 00 -d4 +c7 04 00 00 @@ -10470,7 +10470,7 @@ ff 00 00 00 -d7 +ca 04 00 00 @@ -10518,7 +10518,7 @@ ff 00 00 00 -ca +bd 04 00 00 @@ -10566,7 +10566,7 @@ ff 00 00 00 -c5 +b3 04 00 00 @@ -10614,7 +10614,7 @@ ff 00 00 00 -ca +bd 04 00 00 @@ -10662,7 +10662,7 @@ ff 00 00 00 -d8 +cb 04 00 00 @@ -10710,7 +10710,7 @@ ff 00 00 00 -c4 +b2 04 00 00 @@ -10734,7 +10734,7 @@ ff 00 00 00 -cc +bf 04 00 00 @@ -10782,7 +10782,7 @@ a5 00 00 00 -c4 +b2 04 00 00 @@ -10806,7 +10806,7 @@ b0 00 00 00 -ce +c1 04 00 00 @@ -10854,7 +10854,7 @@ c4 00 00 00 -cd +c0 04 00 00 @@ -10902,7 +10902,7 @@ d5 00 00 00 -c4 +b2 04 00 00 @@ -10926,7 +10926,7 @@ e0 00 00 00 -ce +c1 04 00 00 @@ -10974,7 +10974,7 @@ f3 00 00 00 -cd +c0 04 00 00 @@ -11022,7 +11022,7 @@ ff 00 00 00 -c4 +b2 04 00 00 @@ -11046,7 +11046,7 @@ ff 00 00 00 -cf +c2 04 00 00 @@ -11094,7 +11094,7 @@ ff 00 00 00 -cd +c0 04 00 00 @@ -11166,7 +11166,7 @@ ff 00 00 00 -d0 +c3 04 00 00 @@ -11214,7 +11214,7 @@ ff 00 00 00 -d7 +ca 04 00 00 @@ -11238,7 +11238,7 @@ ff 00 00 00 -cc +bf 04 00 00 @@ -11262,7 +11262,7 @@ ff 00 00 00 -cc +bf 04 00 00 @@ -11310,7 +11310,7 @@ ff 00 00 00 -c4 +b2 04 00 00 @@ -11334,7 +11334,7 @@ c7 00 00 00 -b9 +a2 04 00 00 @@ -11358,7 +11358,7 @@ ff 00 00 00 -d9 +d0 04 00 00 @@ -11382,7 +11382,7 @@ ff 00 00 00 -da +d2 04 00 00 @@ -11454,7 +11454,7 @@ ff 00 00 00 -c9 +bc 04 00 00 @@ -11478,7 +11478,7 @@ b7 00 00 00 -bd +a7 04 00 00 @@ -11550,7 +11550,7 @@ e0 00 00 00 -c9 +bc 04 00 00 @@ -11574,7 +11574,7 @@ ff 00 00 00 -db +d5 04 00 00 @@ -11622,7 +11622,7 @@ ff 00 00 00 -c7 +b7 04 00 00 @@ -11670,7 +11670,7 @@ ff 00 00 00 -bc +a6 04 00 00 @@ -11718,7 +11718,7 @@ ff 00 00 00 -bd +a7 04 00 00 @@ -11766,7 +11766,7 @@ a3 00 00 00 -c4 +b2 04 00 00 @@ -11790,7 +11790,7 @@ b5 00 00 00 -c6 +b4 04 00 00 @@ -11814,7 +11814,7 @@ d2 00 00 00 -db +d5 04 00 00 @@ -11838,7 +11838,7 @@ ea 00 00 00 -bc +a6 04 00 00 @@ -11862,7 +11862,7 @@ ff 00 00 00 -db +d5 04 00 00 @@ -11886,7 +11886,7 @@ ff 00 00 00 -dc +d7 04 00 00 @@ -11934,7 +11934,7 @@ ff 00 00 00 -c7 +b7 04 00 00 @@ -11982,7 +11982,7 @@ ff 00 00 00 -dd +d8 04 00 00 @@ -12030,7 +12030,7 @@ ff 00 00 00 -bc +a6 04 00 00 @@ -12078,7 +12078,7 @@ ff 00 00 00 -ca +bd 04 00 00 @@ -12174,7 +12174,7 @@ a6 00 00 00 -c9 +bc 04 00 00 @@ -12222,7 +12222,7 @@ ff 00 00 00 -c4 +b2 04 00 00 @@ -12246,7 +12246,7 @@ ff 00 00 00 -c6 +b4 04 00 00 @@ -12270,7 +12270,7 @@ ff 00 00 00 -de +da 04 00 00 @@ -12294,7 +12294,7 @@ aa 00 00 00 -df +db 04 00 00 @@ -12366,7 +12366,7 @@ d0 00 00 00 -c9 +bc 04 00 00 @@ -12390,7 +12390,7 @@ d9 00 00 00 -c8 +ba 04 00 00 @@ -12414,7 +12414,7 @@ ff 00 00 00 -e0 +dc 04 00 00 @@ -12462,7 +12462,7 @@ ff 00 00 00 -ca +bd 04 00 00 @@ -12510,7 +12510,7 @@ ff 00 00 00 -c5 +b3 04 00 00 @@ -12558,7 +12558,7 @@ ff 00 00 00 -cc +bf 04 00 00 @@ -12606,7 +12606,7 @@ b8 00 00 00 -bf +a9 04 00 00 @@ -12630,7 +12630,7 @@ ff 00 00 00 -e1 +dd 04 00 00 @@ -12678,7 +12678,7 @@ c7 00 00 00 -bf +a9 04 00 00 @@ -12750,7 +12750,7 @@ e1 00 00 00 -c9 +bc 04 00 00 @@ -12774,7 +12774,7 @@ f4 00 00 00 -db +d5 04 00 00 @@ -12798,7 +12798,7 @@ ff 00 00 00 -dc +d7 04 00 00 @@ -12846,7 +12846,7 @@ ff 00 00 00 -c4 +b2 04 00 00 @@ -12870,7 +12870,7 @@ ff 00 00 00 -c6 +b4 04 00 00 @@ -12894,7 +12894,7 @@ ff 00 00 00 -bc +a6 04 00 00 @@ -12918,7 +12918,7 @@ d4 00 00 00 -db +d5 04 00 00 @@ -12942,7 +12942,7 @@ e3 00 00 00 -bc +a6 04 00 00 @@ -12966,7 +12966,7 @@ ff 00 00 00 -bd +a7 04 00 00 @@ -13014,7 +13014,7 @@ ff 00 00 00 -c7 +b7 04 00 00 @@ -13062,7 +13062,7 @@ ff 00 00 00 -bc +a6 04 00 00 @@ -13110,7 +13110,7 @@ ff 00 00 00 -c4 +b2 04 00 00 @@ -13134,7 +13134,7 @@ ac 00 00 00 -c6 +b4 04 00 00 @@ -13158,7 +13158,7 @@ b9 00 00 00 -db +d5 04 00 00 @@ -13206,7 +13206,7 @@ cd 00 00 00 -c7 +b7 04 00 00 @@ -13254,7 +13254,7 @@ d9 00 00 00 -bc +a6 04 00 00 @@ -13278,7 +13278,7 @@ ff 00 00 00 -bc +a6 04 00 00 @@ -13302,7 +13302,7 @@ ff 00 00 00 -bc +a6 04 00 00 @@ -13350,7 +13350,7 @@ ab 00 00 00 -e2 +e1 04 00 00 @@ -13374,7 +13374,7 @@ b4 00 00 00 -e3 +e2 04 00 00 @@ -13422,7 +13422,7 @@ cd 00 00 00 -e2 +e1 04 00 00 @@ -13446,7 +13446,7 @@ d7 00 00 00 -c8 +ba 04 00 00 @@ -13902,7 +13902,7 @@ ff 00 00 00 -c8 +ba 04 00 00 @@ -49347,6 +49347,188 @@ d6 69 6e 00 +2e +4c +64 +65 +62 +75 +67 +5f +61 +62 +62 +72 +65 +76 +30 +00 +2e +4c +64 +65 +62 +75 +67 +5f +69 +6e +66 +6f +30 +00 +2e +4c +64 +65 +62 +75 +67 +5f +6c +69 +6e +65 +30 +00 +2e +4c +74 +65 +78 +74 +30 +00 +2e +4c +43 +30 +00 +2e +4c +43 +31 +00 +2e +4c +43 +32 +00 +2e +4c +43 +33 +00 +2e +4c +43 +34 +00 +2e +4c +43 +35 +00 +2e +4c +43 +36 +00 +2e +4c +43 +37 +00 +2e +4c +43 +38 +00 +2e +4c +43 +39 +00 +2e +4c +43 +31 +30 +00 +2e +4c +43 +31 +31 +00 +2e +4c +43 +31 +32 +00 +2e +4c +43 +31 +33 +00 +2e +4c +43 +31 +34 +00 +2e +4c +43 +31 +35 +00 +2e +4c +43 +31 +36 +00 +2e +4c +43 +31 +37 +00 +2e +4c +43 +31 +38 +00 +2e +4c +46 +42 +32 +35 +00 +2e +4c +56 +4c +30 +00 +2e +4c +43 +46 +49 +30 +00 +2e +4c +56 +4c +31 +00 42 69 74 @@ -49364,6 +49546,47 @@ d6 74 65 00 +63 +6f +6e +76 +5f +62 +76 +00 +72 +65 +73 +75 +6c +74 +00 +73 +70 +61 +72 +65 +00 +6f +70 +31 +73 +74 +61 +74 +69 +63 +00 +6f +70 +32 +73 +74 +61 +74 +69 +63 +00 42 69 74 @@ -49395,278 +49618,58 @@ d6 6f 74 00 -42 -69 -74 -56 -65 -63 -74 -6f -72 -5f 66 72 6f 6d 5f -44 -65 -63 -5f -73 -74 -61 -74 -69 -63 -5f -53 -68 -75 -74 64 -6f -77 -6e -00 -42 -69 -74 -56 -65 -63 -74 -6f -72 -5f -44 -65 -73 -74 -72 -6f -79 -00 -79 -61 -73 -6d -5f -78 -6d -61 -6c -6c -6f -63 -00 -42 -69 -74 -56 65 63 -74 -6f -72 -5f -66 -72 -6f -6d -5f -44 -65 -63 -5f -73 -74 -61 -74 -69 -63 -00 -53 -65 -74 -5f -4d -61 -78 -00 -42 -69 -74 -56 -65 -63 -74 -6f -72 -5f -43 -68 -75 -6e -6b 5f -52 -65 -61 64 -00 -42 -69 -74 -56 -65 -63 -74 -6f -72 -5f -43 -6c -6f -6e -65 -00 -79 61 -73 -6d -5f -5f -77 -61 -72 -6e -69 -6e -67 -00 -73 74 -72 -6c -65 -6e +61 00 -42 -69 -74 +2e +4c 56 -65 -63 -74 -6f -72 -5f -66 -72 -6f -6d -5f -42 -69 -6e +4c +32 00 -42 -69 -74 -56 -65 -63 -74 -6f -72 -5f -66 -72 -6f -6d -5f -4f -63 -74 +2e +4c +46 +45 +32 +35 00 +2e +4c +46 42 -69 -74 -56 -65 -63 -74 -6f -72 -5f -66 -72 -6f -6d -5f -48 -65 -78 +32 +36 00 -42 -69 -74 +2e +4c 56 -65 -63 -74 -6f -72 -5f -45 -6d -70 -74 -79 +4c +33 00 -42 -69 -74 -56 -65 -63 -74 -6f -72 -5f -4d -6f -76 -65 -5f +2e 4c -65 -66 -74 +43 +46 +49 +31 00 -42 -69 -74 +2e +4c 56 -65 -63 -74 -6f -72 -5f -43 -68 -75 -6e -6b -5f -53 -74 -6f -72 -65 +4c +34 00 42 69 @@ -49678,192 +49681,30 @@ d6 6f 72 5f -4e -65 -67 -61 -74 -65 -00 -79 -61 -73 -6d -5f -78 66 72 -65 -65 -00 -79 -61 -73 -6d -5f -69 -6e -74 -65 -72 -6e -61 -6c -5f -65 -72 -72 -6f -72 -5f -00 -42 -69 -74 -56 -65 -63 -74 -6f -72 -5f -43 -6f -70 -79 -00 -42 -69 -74 -56 -65 -63 -74 6f -72 +6d 5f 44 -69 -76 -69 -64 -65 -00 -42 -69 -74 -56 65 63 -74 -6f -72 5f -69 73 -5f -65 -6d -70 -74 -79 -00 -42 -69 -74 -56 -65 -63 -74 -6f -72 -5f -4c -53 -42 -00 -42 -69 74 -56 -65 -63 -74 -6f -72 -5f -4c -65 -78 -69 -63 -6f -6d -70 61 -72 -65 -00 -42 -69 -74 -56 -65 -63 74 -6f -72 -5f -65 -71 -75 -61 -6c -00 -79 -61 -73 -6d -5f -5f -65 -72 -72 -6f -72 -00 -42 69 -74 -56 -65 63 -74 -6f -72 5f -4d +53 +68 75 -6c 74 -69 -70 -6c -79 -00 -42 -69 -74 -56 -65 -63 -74 -6f -72 -5f -61 -64 64 +6f +77 +6e 00 42 69 @@ -49875,614 +49716,14 @@ d6 6f 72 5f -73 -75 -62 -00 -53 -65 -74 -5f -55 -6e -69 -6f -6e -00 -53 -65 -74 -5f -49 -6e -74 +44 65 -72 73 -65 -63 -74 -69 -6f -6e -00 -53 -65 74 -5f -45 -78 -63 -6c -75 -73 -69 -76 -65 -4f 72 -00 -53 -65 -74 -5f -43 6f -6d -70 -6c -65 -6d -65 -6e -74 -00 -42 -69 -74 -56 -65 -63 -74 -6f -72 -5f -4d -6f -76 -65 -5f -52 -69 -67 -68 -74 -00 -42 -69 -74 -56 -65 -63 -74 -6f -72 -5f -69 -73 -5f -66 -75 -6c -6c -00 -42 -69 -74 -56 -65 -63 -74 -6f -72 -5f -53 -69 -67 -6e -00 -42 -69 -74 -56 -65 -63 -74 -6f -72 -5f -6d -73 -62 -5f -00 -42 -69 -74 -56 -65 -63 -74 -6f -72 -5f -73 -68 -69 -66 -74 -5f -72 -69 -67 -68 -74 -00 -42 -69 -74 -56 -65 -63 -74 -6f -72 -5f -64 -65 -63 -00 -42 -69 -74 -56 -65 -63 -74 -6f -72 -5f -49 -6e -74 -65 -72 -76 -61 -6c -5f -43 -6f -70 79 00 -42 -69 -74 -56 -65 -63 -74 -6f -72 -5f -42 -6c -6f -63 -6b -5f -52 -65 -61 -64 -00 -42 -69 -74 -56 -65 -63 -74 -6f -72 -5f -42 -6c -6f -63 -6b -5f -53 -74 -6f -72 -65 -00 -6d -65 -6d -63 -70 -79 -00 -66 -70 -72 -69 -6e -74 -66 -00 -42 -69 -74 -56 -65 -63 -74 -6f -72 -5f -74 -6f -5f -48 -65 -78 -00 -42 -69 -74 -56 -65 -63 -74 -6f -72 -5f -42 -6f -6f -74 -00 -70 -72 -69 -6e -74 -66 -00 -73 -70 -72 -69 -6e -74 -66 -00 -70 -75 -74 -63 -68 -61 -72 -00 -73 -74 -64 -6f -75 -74 -00 -66 -66 -6c -75 -73 -68 -00 -79 -61 -73 -6d -5f -5f -78 -73 -74 -72 -64 -75 -70 -00 -2e -4c -64 -65 -62 -75 -67 -5f -61 -62 -62 -72 -65 -76 -30 -00 -2e -4c -64 -65 -62 -75 -67 -5f -69 -6e -66 -6f -30 -00 -2e -4c -64 -65 -62 -75 -67 -5f -6c -69 -6e -65 -30 -00 -2e -4c -74 -65 -78 -74 -30 -00 -2e -4c -43 -30 -00 -2e -4c -43 -31 -00 -2e -4c -43 -32 -00 -2e -4c -43 -33 -00 -2e -4c -43 -34 -00 -2e -4c -43 -35 -00 -2e -4c -43 -36 -00 -2e -4c -43 -37 -00 -2e -4c -43 -38 -00 -2e -4c -43 -39 -00 -2e -4c -43 -31 -30 -00 -2e -4c -43 -31 -31 -00 -2e -4c -43 -31 -32 -00 -2e -4c -43 -31 -33 -00 -2e -4c -43 -31 -34 -00 -2e -4c -43 -31 -35 -00 -2e -4c -43 -31 -36 -00 -2e -4c -43 -31 -37 -00 -2e -4c -43 -31 -38 -00 -2e -4c -46 -42 -32 -35 -00 -2e -4c -56 -4c -30 -00 -2e -4c -43 -46 -49 -30 -00 -2e -4c -56 -4c -31 -00 -63 -6f -6e -76 -5f -62 -76 -00 -72 -65 -73 -75 -6c -74 -00 -73 -70 -61 -72 -65 -00 -6f -70 -31 -73 -74 -61 -74 -69 -63 -00 -6f -70 -32 -73 -74 -61 -74 -69 -63 -00 -66 -72 -6f -6d -5f -64 -65 -63 -5f -64 -61 -74 -61 -00 -2e -4c -56 -4c -32 -00 -2e -4c -46 -45 -32 -35 -00 -2e -4c -46 -42 -32 -36 -00 -2e -4c -56 -4c -33 -00 -2e -4c -43 -46 -49 -31 -00 -2e -4c -56 -4c -34 -00 2e 4c 56 @@ -50555,6 +49796,19 @@ d6 4c 38 00 +79 +61 +73 +6d +5f +78 +6d +61 +6c +6c +6f +63 +00 2e 4c 56 @@ -50582,6 +49836,32 @@ d6 31 32 00 +42 +69 +74 +56 +65 +63 +74 +6f +72 +5f +66 +72 +6f +6d +5f +44 +65 +63 +5f +73 +74 +61 +74 +69 +63 +00 2e 4c 31 @@ -50591,10 +49871,39 @@ d6 4c 36 00 +53 +65 +74 +5f +4d +61 +78 +00 2e 4c 38 00 +42 +69 +74 +56 +65 +63 +74 +6f +72 +5f +43 +68 +75 +6e +6b +5f +52 +65 +61 +64 +00 2e 4c 56 @@ -50630,6 +49939,22 @@ d6 31 37 00 +42 +69 +74 +56 +65 +63 +74 +6f +72 +5f +43 +6c +6f +6e +65 +00 2e 4c 56 @@ -50665,6 +49990,20 @@ d6 32 32 00 +79 +61 +73 +6d +5f +5f +77 +61 +72 +6e +69 +6e +67 +00 2e 4c 46 @@ -50742,6 +50081,13 @@ d6 32 37 00 +73 +74 +72 +6c +65 +6e +00 2e 4c 32 @@ -50752,6 +50098,25 @@ d6 31 35 00 +42 +69 +74 +56 +65 +63 +74 +6f +72 +5f +66 +72 +6f +6d +5f +42 +69 +6e +00 2e 4c 31 @@ -50918,6 +50283,25 @@ d6 32 33 00 +42 +69 +74 +56 +65 +63 +74 +6f +72 +5f +66 +72 +6f +6d +5f +4f +63 +74 +00 2e 4c 32 @@ -51084,6 +50468,25 @@ d6 33 31 00 +42 +69 +74 +56 +65 +63 +74 +6f +72 +5f +66 +72 +6f +6d +5f +48 +65 +78 +00 2e 4c 33 @@ -51420,6 +50823,22 @@ d6 36 31 00 +42 +69 +74 +56 +65 +63 +74 +6f +72 +5f +45 +6d +70 +74 +79 +00 2e 4c 56 @@ -51439,6 +50858,48 @@ d6 35 31 00 +42 +69 +74 +56 +65 +63 +74 +6f +72 +5f +4d +6f +76 +65 +5f +4c +65 +66 +74 +00 +42 +69 +74 +56 +65 +63 +74 +6f +72 +5f +43 +68 +75 +6e +6b +5f +53 +74 +6f +72 +65 +00 2e 4c 56 @@ -51558,6 +51019,23 @@ d6 39 37 00 +42 +69 +74 +56 +65 +63 +74 +6f +72 +5f +4e +65 +67 +61 +74 +65 +00 2e 4c 56 @@ -51791,6 +51269,17 @@ d6 31 37 00 +79 +61 +73 +6d +5f +78 +66 +72 +65 +65 +00 2e 4c 56 @@ -52210,6 +51699,27 @@ d6 32 30 00 +79 +61 +73 +6d +5f +69 +6e +74 +65 +72 +6e +61 +6c +5f +65 +72 +72 +6f +72 +5f +00 2e 4c 56 @@ -52350,6 +51860,21 @@ d6 34 34 00 +42 +69 +74 +56 +65 +63 +74 +6f +72 +5f +43 +6f +70 +79 +00 2e 4c 56 @@ -52358,6 +51883,23 @@ d6 34 35 00 +42 +69 +74 +56 +65 +63 +74 +6f +72 +5f +44 +69 +76 +69 +64 +65 +00 2e 4c 56 @@ -52398,12 +51940,45 @@ d6 35 30 00 +42 +69 +74 +56 +65 +63 +74 +6f +72 +5f +69 +73 +5f +65 +6d +70 +74 +79 +00 2e 4c 31 34 35 00 +42 +69 +74 +56 +65 +63 +74 +6f +72 +5f +4c +53 +42 +00 2e 4c 56 @@ -52420,6 +51995,28 @@ d6 35 32 00 +42 +69 +74 +56 +65 +63 +74 +6f +72 +5f +4c +65 +78 +69 +63 +6f +6d +70 +61 +72 +65 +00 2e 4c 56 @@ -52452,6 +52049,22 @@ d6 35 36 00 +42 +69 +74 +56 +65 +63 +74 +6f +72 +5f +65 +71 +75 +61 +6c +00 2e 4c 56 @@ -52468,6 +52081,18 @@ d6 35 38 00 +79 +61 +73 +6d +5f +5f +65 +72 +72 +6f +72 +00 2e 4c 56 @@ -52546,6 +52171,25 @@ d6 36 37 00 +42 +69 +74 +56 +65 +63 +74 +6f +72 +5f +4d +75 +6c +74 +69 +70 +6c +79 +00 2e 4c 56 @@ -52562,6 +52206,20 @@ d6 36 39 00 +42 +69 +74 +56 +65 +63 +74 +6f +72 +5f +61 +64 +64 +00 2e 4c 56 @@ -52578,6 +52236,20 @@ d6 37 31 00 +42 +69 +74 +56 +65 +63 +74 +6f +72 +5f +73 +75 +62 +00 2e 4c 56 @@ -52594,6 +52266,16 @@ d6 37 33 00 +53 +65 +74 +5f +55 +6e +69 +6f +6e +00 2e 4c 56 @@ -52610,6 +52292,23 @@ d6 37 35 00 +53 +65 +74 +5f +49 +6e +74 +65 +72 +73 +65 +63 +74 +69 +6f +6e +00 2e 4c 56 @@ -52626,6 +52325,22 @@ d6 37 37 00 +53 +65 +74 +5f +45 +78 +63 +6c +75 +73 +69 +76 +65 +4f +72 +00 2e 4c 56 @@ -52650,6 +52365,21 @@ d6 38 30 00 +53 +65 +74 +5f +43 +6f +6d +70 +6c +65 +6d +65 +6e +74 +00 2e 4c 56 @@ -52688,6 +52418,27 @@ d6 38 34 00 +42 +69 +74 +56 +65 +63 +74 +6f +72 +5f +4d +6f +76 +65 +5f +52 +69 +67 +68 +74 +00 2e 4c 56 @@ -53010,6 +52761,24 @@ d6 31 30 00 +42 +69 +74 +56 +65 +63 +74 +6f +72 +5f +69 +73 +5f +66 +75 +6c +6c +00 2e 4c 56 @@ -53054,6 +52823,21 @@ d6 31 33 00 +42 +69 +74 +56 +65 +63 +74 +6f +72 +5f +53 +69 +67 +6e +00 2e 4c 46 @@ -53276,6 +53060,21 @@ d6 33 30 00 +42 +69 +74 +56 +65 +63 +74 +6f +72 +5f +6d +73 +62 +5f +00 2e 4c 42 @@ -53664,6 +53463,28 @@ d6 32 32 00 +42 +69 +74 +56 +65 +63 +74 +6f +72 +5f +73 +68 +69 +66 +74 +5f +72 +69 +67 +68 +74 +00 2e 4c 56 @@ -53714,6 +53535,20 @@ d6 42 36 00 +42 +69 +74 +56 +65 +63 +74 +6f +72 +5f +64 +65 +63 +00 2e 4c 56 @@ -53996,6 +53831,51 @@ d6 35 34 00 +42 +69 +74 +56 +65 +63 +74 +6f +72 +5f +49 +6e +74 +65 +72 +76 +61 +6c +5f +43 +6f +70 +79 +00 +42 +69 +74 +56 +65 +63 +74 +6f +72 +5f +42 +6c +6f +63 +6b +5f +52 +65 +61 +64 +00 2e 4c 56 @@ -54088,6 +53968,28 @@ d6 38 34 00 +42 +69 +74 +56 +65 +63 +74 +6f +72 +5f +42 +6c +6f +63 +6b +5f +53 +74 +6f +72 +65 +00 2e 4c 56 @@ -54112,6 +54014,13 @@ d6 38 37 00 +6d +65 +6d +63 +70 +79 +00 2e 4c 56 @@ -54834,6 +54743,14 @@ d6 34 30 00 +66 +70 +72 +69 +6e +74 +66 +00 2e 4c 56 @@ -54850,6 +54767,23 @@ d6 34 32 00 +42 +69 +74 +56 +65 +63 +74 +6f +72 +5f +74 +6f +5f +48 +65 +78 +00 2e 4c 56 @@ -55086,6 +55020,21 @@ d6 35 36 00 +42 +69 +74 +56 +65 +63 +74 +6f +72 +5f +42 +6f +6f +74 +00 2e 4c 33 @@ -55171,6 +55120,13 @@ d6 65 64 00 +70 +72 +69 +6e +74 +66 +00 2e 4c 56 @@ -55247,6 +55203,14 @@ d6 36 39 00 +73 +70 +72 +69 +6e +74 +66 +00 2e 4c 33 @@ -55265,6 +55229,28 @@ d6 45 38 00 +70 +75 +74 +63 +68 +61 +72 +00 +73 +74 +64 +6f +75 +74 +00 +66 +66 +6c +75 +73 +68 +00 2e 4c 33 @@ -55318,6 +55304,20 @@ d6 31 33 00 +79 +61 +73 +6d +5f +5f +78 +73 +74 +72 +64 +75 +70 +00 2e 4c 56 @@ -70014,7 +70014,7 @@ c0 00 00 00 -69 +5b 19 00 00 @@ -70038,7 +70038,7 @@ fd 00 00 00 -62 +54 19 00 00 @@ -70062,7 +70062,7 @@ fd 00 00 00 -5b +4d 19 00 00 @@ -70086,7 +70086,7 @@ fd 00 00 00 -55 +47 19 00 00 @@ -70110,7 +70110,7 @@ fd 00 00 00 -4e +40 19 00 00 @@ -70134,7 +70134,7 @@ df 00 00 00 -47 +39 19 00 00 @@ -70158,7 +70158,7 @@ db 00 00 00 -41 +33 19 00 00 @@ -70182,7 +70182,7 @@ d8 00 00 00 -3b +2d 19 00 00 @@ -70206,7 +70206,7 @@ d6 00 00 00 -35 +11 19 00 00 @@ -70230,7 +70230,7 @@ bf 00 00 00 -2f +0b 19 00 00 @@ -70254,7 +70254,7 @@ bf 00 00 00 -29 +05 19 00 00 @@ -70278,8 +70278,8 @@ bf 00 00 00 -21 -19 +f5 +18 00 00 00 @@ -70302,8 +70302,8 @@ b5 00 00 00 -19 -19 +ed +18 00 00 00 @@ -70326,8 +70326,8 @@ b5 00 00 00 -13 -19 +e7 +18 00 00 00 @@ -70350,8 +70350,8 @@ a9 00 00 00 -0b -19 +df +18 00 00 00 @@ -70374,8 +70374,8 @@ a9 00 00 00 -05 -19 +d9 +18 00 00 00 @@ -70398,7 +70398,7 @@ a9 00 00 00 -ff +d3 18 00 00 @@ -70422,7 +70422,7 @@ ff 00 00 00 -f9 +cd 18 00 00 @@ -70446,7 +70446,7 @@ f9 00 00 00 -f3 +c7 18 00 00 @@ -70470,7 +70470,7 @@ f3 00 00 00 -eb +bf 18 00 00 @@ -70494,7 +70494,7 @@ eb 00 00 00 -e5 +b9 18 00 00 @@ -70518,7 +70518,7 @@ fd 00 00 00 -dd +b1 18 00 00 @@ -70542,7 +70542,7 @@ dd 00 00 00 -d6 +a3 18 00 00 @@ -70566,7 +70566,7 @@ d6 00 00 00 -ce +9b 18 00 00 @@ -70590,7 +70590,7 @@ ce 00 00 00 -c6 +93 18 00 00 @@ -70614,7 +70614,7 @@ c6 00 00 00 -be +8b 18 00 00 @@ -70638,7 +70638,7 @@ be 00 00 00 -b6 +83 18 00 00 @@ -70662,7 +70662,7 @@ b6 00 00 00 -ae +7b 18 00 00 @@ -70686,7 +70686,7 @@ ae 00 00 00 -a6 +73 18 00 00 @@ -70710,7 +70710,7 @@ a6 00 00 00 -9e +6b 18 00 00 @@ -70734,7 +70734,7 @@ a6 00 00 00 -96 +63 18 00 00 @@ -70758,7 +70758,7 @@ a6 00 00 00 -8e +5b 18 00 00 @@ -70782,7 +70782,7 @@ a6 00 00 00 -88 +55 18 00 00 @@ -70806,7 +70806,7 @@ a6 00 00 00 -80 +3e 18 00 00 @@ -70830,7 +70830,7 @@ a6 00 00 00 -78 +36 18 00 00 @@ -70854,7 +70854,7 @@ a6 00 00 00 -70 +2e 18 00 00 @@ -70878,7 +70878,7 @@ fa 00 00 00 -68 +26 18 00 00 @@ -70902,7 +70902,7 @@ fa 00 00 00 -60 +1e 18 00 00 @@ -70926,7 +70926,7 @@ f9 00 00 00 -58 +16 18 00 00 @@ -70950,7 +70950,7 @@ f9 00 00 00 -50 +0e 18 00 00 @@ -70974,7 +70974,7 @@ f8 00 00 00 -48 +06 18 00 00 @@ -70998,8 +70998,8 @@ f8 00 00 00 -40 -18 +fe +17 00 00 00 @@ -71022,8 +71022,8 @@ f6 00 00 00 -38 -18 +f6 +17 00 00 00 @@ -71046,8 +71046,8 @@ f6 00 00 00 -30 -18 +ee +17 00 00 00 @@ -71070,8 +71070,8 @@ f4 00 00 00 -28 -18 +e6 +17 00 00 00 @@ -71094,8 +71094,8 @@ f4 00 00 00 -20 -18 +de +17 00 00 00 @@ -71118,8 +71118,8 @@ f2 00 00 00 -18 -18 +d6 +17 00 00 00 @@ -71142,8 +71142,8 @@ f2 00 00 00 -10 -18 +ce +17 00 00 00 @@ -71166,8 +71166,8 @@ f0 00 00 00 -09 -18 +c7 +17 00 00 00 @@ -71190,8 +71190,8 @@ f0 00 00 00 -03 -18 +c1 +17 00 00 00 @@ -71214,7 +71214,7 @@ f8 00 00 00 -fd +bb 17 00 00 @@ -71238,7 +71238,7 @@ eb 00 00 00 -f7 +b5 17 00 00 @@ -71262,7 +71262,7 @@ f7 00 00 00 -f1 +af 17 00 00 @@ -71286,7 +71286,7 @@ f1 00 00 00 -eb +a9 17 00 00 @@ -71310,7 +71310,7 @@ e8 00 00 00 -e5 +a3 17 00 00 @@ -71334,7 +71334,7 @@ e8 00 00 00 -df +9d 17 00 00 @@ -71358,7 +71358,7 @@ e7 00 00 00 -d9 +97 17 00 00 @@ -71382,7 +71382,7 @@ e5 00 00 00 -d3 +91 17 00 00 @@ -71406,7 +71406,7 @@ d2 00 00 00 -cc +8a 17 00 00 @@ -71430,7 +71430,7 @@ f0 00 00 00 -c4 +82 17 00 00 @@ -71454,7 +71454,7 @@ f0 00 00 00 -bc +7a 17 00 00 @@ -71478,7 +71478,7 @@ ed 00 00 00 -b4 +72 17 00 00 @@ -71502,7 +71502,7 @@ e9 00 00 00 -ac +6a 17 00 00 @@ -71526,7 +71526,7 @@ e4 00 00 00 -a4 +62 17 00 00 @@ -71550,7 +71550,7 @@ df 00 00 00 -9c +5a 17 00 00 @@ -71574,7 +71574,7 @@ bf 00 00 00 -94 +41 17 00 00 @@ -71598,7 +71598,7 @@ b3 00 00 00 -8c +39 17 00 00 @@ -71622,7 +71622,7 @@ af 00 00 00 -84 +29 17 00 00 @@ -71646,7 +71646,7 @@ aa 00 00 00 -7c +21 17 00 00 @@ -71670,7 +71670,7 @@ a4 00 00 00 -74 +19 17 00 00 @@ -71694,7 +71694,7 @@ a4 00 00 00 -6c +11 17 00 00 @@ -71718,7 +71718,7 @@ a4 00 00 00 -64 +09 17 00 00 @@ -71742,7 +71742,7 @@ a4 00 00 00 -5c +01 17 00 00 @@ -71766,8 +71766,8 @@ a4 00 00 00 -54 -17 +f9 +16 00 00 00 @@ -71790,8 +71790,8 @@ a4 00 00 00 -4e -17 +f3 +16 00 00 00 @@ -71814,8 +71814,8 @@ b0 00 00 00 -46 -17 +eb +16 00 00 00 @@ -71838,8 +71838,8 @@ b0 00 00 00 -40 -17 +e5 +16 00 00 00 @@ -71862,8 +71862,8 @@ b0 00 00 00 -38 -17 +dd +16 00 00 00 @@ -71886,8 +71886,8 @@ b0 00 00 00 -30 -17 +d5 +16 00 00 00 @@ -71910,8 +71910,8 @@ b0 00 00 00 -28 -17 +cd +16 00 00 00 @@ -71934,8 +71934,8 @@ b0 00 00 00 -20 -17 +c5 +16 00 00 00 @@ -71958,8 +71958,8 @@ b0 00 00 00 -18 -17 +bd +16 00 00 00 @@ -71982,8 +71982,8 @@ b0 00 00 00 -10 -17 +b5 +16 00 00 00 @@ -72006,8 +72006,8 @@ b0 00 00 00 -09 -17 +ae +16 00 00 00 @@ -72030,8 +72030,8 @@ b0 00 00 00 -03 -17 +a8 +16 00 00 00 @@ -72054,7 +72054,7 @@ ca 00 00 00 -fd +a2 16 00 00 @@ -72078,7 +72078,7 @@ c1 00 00 00 -f6 +9b 16 00 00 @@ -72102,7 +72102,7 @@ f6 00 00 00 -ee +93 16 00 00 @@ -72126,7 +72126,7 @@ ee 00 00 00 -e6 +8b 16 00 00 @@ -72150,7 +72150,7 @@ e6 00 00 00 -de +83 16 00 00 @@ -72174,7 +72174,7 @@ de 00 00 00 -d6 +7b 16 00 00 @@ -72198,7 +72198,7 @@ d6 00 00 00 -ce +73 16 00 00 @@ -72222,7 +72222,7 @@ ce 00 00 00 -c6 +6b 16 00 00 @@ -72246,7 +72246,7 @@ c6 00 00 00 -be +63 16 00 00 @@ -72270,7 +72270,7 @@ fe 00 00 00 -b8 +5d 16 00 00 @@ -72294,7 +72294,7 @@ e1 00 00 00 -b2 +57 16 00 00 @@ -72318,7 +72318,7 @@ b2 00 00 00 -ac +51 16 00 00 @@ -72342,7 +72342,7 @@ b5 00 00 00 -a4 +49 16 00 00 @@ -72366,7 +72366,7 @@ b5 00 00 00 -9e +43 16 00 00 @@ -72390,7 +72390,7 @@ b5 00 00 00 -96 +3b 16 00 00 @@ -72414,7 +72414,7 @@ b5 00 00 00 -90 +35 16 00 00 @@ -72438,7 +72438,7 @@ b5 00 00 00 -8a +2f 16 00 00 @@ -72462,7 +72462,7 @@ fe 00 00 00 -82 +27 16 00 00 @@ -72486,7 +72486,7 @@ fe 00 00 00 -7c +21 16 00 00 @@ -72510,7 +72510,7 @@ fe 00 00 00 -74 +19 16 00 00 @@ -72534,7 +72534,7 @@ fe 00 00 00 -6c +11 16 00 00 @@ -72558,7 +72558,7 @@ fe 00 00 00 -64 +09 16 00 00 @@ -72582,7 +72582,7 @@ fe 00 00 00 -5c +01 16 00 00 @@ -72606,8 +72606,8 @@ fe 00 00 00 -54 -16 +f9 +15 00 00 00 @@ -72630,8 +72630,8 @@ fe 00 00 00 -4c -16 +f1 +15 00 00 00 @@ -72654,8 +72654,8 @@ fe 00 00 00 -44 -16 +e9 +15 00 00 00 @@ -72678,8 +72678,8 @@ fe 00 00 00 -3d -16 +e2 +15 00 00 00 @@ -72702,8 +72702,8 @@ fe 00 00 00 -36 -16 +db +15 00 00 00 @@ -72726,8 +72726,8 @@ fe 00 00 00 -2e -16 +d3 +15 00 00 00 @@ -72750,8 +72750,8 @@ fe 00 00 00 -26 -16 +cb +15 00 00 00 @@ -72774,8 +72774,8 @@ fe 00 00 00 -1e -16 +c3 +15 00 00 00 @@ -72798,8 +72798,8 @@ fe 00 00 00 -18 -16 +bd +15 00 00 00 @@ -72822,8 +72822,8 @@ f4 00 00 00 -10 -16 +b5 +15 00 00 00 @@ -72846,8 +72846,8 @@ f4 00 00 00 -08 -16 +ad +15 00 00 00 @@ -72870,8 +72870,8 @@ eb 00 00 00 -00 -16 +a5 +15 00 00 00 @@ -72894,7 +72894,7 @@ e2 00 00 00 -fa +9f 15 00 00 @@ -72918,7 +72918,7 @@ fa 00 00 00 -f2 +97 15 00 00 @@ -72942,7 +72942,7 @@ cd 00 00 00 -ea +8f 15 00 00 @@ -72966,7 +72966,7 @@ c2 00 00 00 -e2 +87 15 00 00 @@ -72990,7 +72990,7 @@ c1 00 00 00 -da +7f 15 00 00 @@ -73014,7 +73014,7 @@ bd 00 00 00 -d2 +77 15 00 00 @@ -73038,7 +73038,7 @@ b8 00 00 00 -ca +6f 15 00 00 @@ -73062,7 +73062,7 @@ b3 00 00 00 -c2 +67 15 00 00 @@ -73086,7 +73086,7 @@ ae 00 00 00 -ba +5f 15 00 00 @@ -73110,7 +73110,7 @@ a9 00 00 00 -b4 +59 15 00 00 @@ -73134,7 +73134,7 @@ a5 00 00 00 -ac +51 15 00 00 @@ -73158,7 +73158,7 @@ a5 00 00 00 -a6 +4b 15 00 00 @@ -73182,7 +73182,7 @@ a1 00 00 00 -9e +43 15 00 00 @@ -73206,7 +73206,7 @@ a1 00 00 00 -98 +3d 15 00 00 @@ -73230,7 +73230,7 @@ f2 00 00 00 -90 +35 15 00 00 @@ -73254,7 +73254,7 @@ f2 00 00 00 -8a +2f 15 00 00 @@ -73278,7 +73278,7 @@ f2 00 00 00 -82 +27 15 00 00 @@ -73302,7 +73302,7 @@ f2 00 00 00 -7c +21 15 00 00 @@ -73326,7 +73326,7 @@ f2 00 00 00 -74 +19 15 00 00 @@ -73350,7 +73350,7 @@ f2 00 00 00 -6e +13 15 00 00 @@ -73374,7 +73374,7 @@ d0 00 00 00 -66 +0b 15 00 00 @@ -73398,7 +73398,7 @@ d0 00 00 00 -60 +05 15 00 00 @@ -73422,8 +73422,8 @@ d0 00 00 00 -5a -15 +ff +14 00 00 00 @@ -73446,8 +73446,8 @@ d0 00 00 00 -52 -15 +f7 +14 00 00 00 @@ -73470,8 +73470,8 @@ d0 00 00 00 -4c -15 +f1 +14 00 00 00 @@ -73494,8 +73494,8 @@ c2 00 00 00 -44 -15 +e9 +14 00 00 00 @@ -73518,8 +73518,8 @@ c2 00 00 00 -3c -15 +e1 +14 00 00 00 @@ -73542,8 +73542,8 @@ c2 00 00 00 -34 -15 +d9 +14 00 00 00 @@ -73566,8 +73566,8 @@ c2 00 00 00 -2c -15 +d1 +14 00 00 00 @@ -73590,8 +73590,8 @@ c2 00 00 00 -24 -15 +c9 +14 00 00 00 @@ -73614,8 +73614,8 @@ c2 00 00 00 -1c -15 +c1 +14 00 00 00 @@ -73638,8 +73638,8 @@ c2 00 00 00 +b9 14 -15 00 00 00 @@ -73662,8 +73662,8 @@ c2 00 00 00 -0c -15 +b1 +14 00 00 00 @@ -73686,8 +73686,8 @@ c2 00 00 00 -04 -15 +a9 +14 00 00 00 @@ -73710,7 +73710,7 @@ c2 00 00 00 -fd +a2 14 00 00 @@ -73734,7 +73734,7 @@ fd 00 00 00 -f6 +9b 14 00 00 @@ -73758,7 +73758,7 @@ f6 00 00 00 -ee +93 14 00 00 @@ -73782,7 +73782,7 @@ ee 00 00 00 -e8 +8d 14 00 00 @@ -73806,7 +73806,7 @@ e8 00 00 00 -e2 +87 14 00 00 @@ -73830,7 +73830,7 @@ e2 00 00 00 -da +7f 14 00 00 @@ -73854,7 +73854,7 @@ fe 00 00 00 -d2 +77 14 00 00 @@ -73878,7 +73878,7 @@ ea 00 00 00 -ca +6f 14 00 00 @@ -73902,7 +73902,7 @@ e5 00 00 00 -c2 +67 14 00 00 @@ -73926,7 +73926,7 @@ d0 00 00 00 -ba +5f 14 00 00 @@ -73950,7 +73950,7 @@ ba 00 00 00 -b2 +50 14 00 00 @@ -73974,7 +73974,7 @@ b2 00 00 00 -aa +48 14 00 00 @@ -73998,7 +73998,7 @@ aa 00 00 00 -a2 +40 14 00 00 @@ -74022,7 +74022,7 @@ a2 00 00 00 -9a +22 14 00 00 @@ -74046,7 +74046,7 @@ a2 00 00 00 -92 +1a 14 00 00 @@ -74070,7 +74070,7 @@ ff 00 00 00 -8a +12 14 00 00 @@ -74094,7 +74094,7 @@ fb 00 00 00 -82 +0a 14 00 00 @@ -74118,7 +74118,7 @@ f6 00 00 00 -7a +02 14 00 00 @@ -74142,8 +74142,8 @@ f1 00 00 00 -72 -14 +fa +13 00 00 00 @@ -74166,8 +74166,8 @@ ec 00 00 00 -6a -14 +f2 +13 00 00 00 @@ -74190,8 +74190,8 @@ e7 00 00 00 -62 -14 +ea +13 00 00 00 @@ -74214,8 +74214,8 @@ e2 00 00 00 -5c -14 +e4 +13 00 00 00 @@ -74238,8 +74238,8 @@ d4 00 00 00 -54 -14 +dc +13 00 00 00 @@ -74262,8 +74262,8 @@ bf 00 00 00 -4e -14 +d6 +13 00 00 00 @@ -74286,8 +74286,8 @@ bf 00 00 00 -46 -14 +ce +13 00 00 00 @@ -74310,8 +74310,8 @@ b6 00 00 00 -40 -14 +9b +13 00 00 00 @@ -74334,8 +74334,8 @@ b6 00 00 00 -3a -14 +95 +13 00 00 00 @@ -74358,8 +74358,8 @@ f0 00 00 00 -34 -14 +8f +13 00 00 00 @@ -74382,8 +74382,8 @@ f0 00 00 00 -2e -14 +89 +13 00 00 00 @@ -74406,8 +74406,8 @@ f0 00 00 00 -26 -14 +81 +13 00 00 00 @@ -74430,8 +74430,8 @@ f0 00 00 00 -1e -14 +79 +13 00 00 00 @@ -74454,8 +74454,8 @@ f0 00 00 00 -18 -14 +73 +13 00 00 00 @@ -74478,8 +74478,8 @@ f0 00 00 00 -12 -14 +6d +13 00 00 00 @@ -74502,8 +74502,8 @@ f0 00 00 00 -0c -14 +67 +13 00 00 00 @@ -74526,8 +74526,8 @@ f0 00 00 00 -06 -14 +61 +13 00 00 00 @@ -74550,8 +74550,8 @@ f0 00 00 00 -00 -14 +5b +13 00 00 00 @@ -74574,7 +74574,7 @@ f0 00 00 00 -fa +55 13 00 00 @@ -74598,7 +74598,7 @@ fa 00 00 00 -f2 +4d 13 00 00 @@ -74622,7 +74622,7 @@ f2 00 00 00 -ec +47 13 00 00 @@ -74646,7 +74646,7 @@ d0 00 00 00 -e6 +41 13 00 00 @@ -74670,7 +74670,7 @@ fd 00 00 00 -de +39 13 00 00 @@ -74694,7 +74694,7 @@ fd 00 00 00 -d8 +33 13 00 00 @@ -74718,7 +74718,7 @@ d8 00 00 00 -d0 +2b 13 00 00 @@ -74742,7 +74742,7 @@ f7 00 00 00 -c8 +23 13 00 00 @@ -74766,7 +74766,7 @@ db 00 00 00 -c0 +1b 13 00 00 @@ -74790,7 +74790,7 @@ db 00 00 00 -b8 +13 13 00 00 @@ -74814,7 +74814,7 @@ d7 00 00 00 -b0 +0b 13 00 00 @@ -74838,7 +74838,7 @@ d4 00 00 00 -a8 +03 13 00 00 @@ -74862,8 +74862,8 @@ cf 00 00 00 -a0 -13 +fb +12 00 00 00 @@ -74886,8 +74886,8 @@ c7 00 00 00 -98 -13 +f3 +12 00 00 00 @@ -74910,8 +74910,8 @@ c2 00 00 00 -90 -13 +eb +12 00 00 00 @@ -74934,8 +74934,8 @@ ba 00 00 00 -88 -13 +e3 +12 00 00 00 @@ -74958,8 +74958,8 @@ b5 00 00 00 -80 -13 +db +12 00 00 00 @@ -74982,8 +74982,8 @@ b0 00 00 00 -79 -13 +d4 +12 00 00 00 @@ -75006,8 +75006,8 @@ b0 00 00 00 -73 -13 +ce +12 00 00 00 @@ -75030,8 +75030,8 @@ b8 00 00 00 -6d -13 +c8 +12 00 00 00 @@ -75054,8 +75054,8 @@ a6 00 00 00 -67 -13 +c2 +12 00 00 00 @@ -75078,8 +75078,8 @@ a6 00 00 00 -61 -13 +bc +12 00 00 00 @@ -75102,8 +75102,8 @@ a6 00 00 00 -5a -13 +b5 +12 00 00 00 @@ -75126,8 +75126,8 @@ a8 00 00 00 -52 -13 +ad +12 00 00 00 @@ -75150,8 +75150,8 @@ a3 00 00 00 -4a -13 +a5 +12 00 00 00 @@ -75174,8 +75174,8 @@ a3 00 00 00 -42 -13 +9d +12 00 00 00 @@ -75198,8 +75198,8 @@ a3 00 00 00 -3c -13 +97 +12 00 00 00 @@ -75222,8 +75222,8 @@ a3 00 00 00 -34 -13 +8f +12 00 00 00 @@ -75246,8 +75246,8 @@ a3 00 00 00 -2c -13 +87 +12 00 00 00 @@ -75270,8 +75270,8 @@ a3 00 00 00 -26 -13 +73 +12 00 00 00 @@ -75294,8 +75294,8 @@ a3 00 00 00 -1e -13 +6b +12 00 00 00 @@ -75318,8 +75318,8 @@ a3 00 00 00 -16 -13 +63 +12 00 00 00 @@ -75342,8 +75342,8 @@ a3 00 00 00 -0e -13 +5b +12 00 00 00 @@ -75366,8 +75366,8 @@ a3 00 00 00 -08 -13 +55 +12 00 00 00 @@ -75390,8 +75390,8 @@ a3 00 00 00 -02 -13 +4f +12 00 00 00 @@ -75414,7 +75414,7 @@ a3 00 00 00 -fa +47 12 00 00 @@ -75438,7 +75438,7 @@ fa 00 00 00 -f4 +2b 12 00 00 @@ -75462,7 +75462,7 @@ f4 00 00 00 -ec +23 12 00 00 @@ -75486,7 +75486,7 @@ ec 00 00 00 -e4 +1b 12 00 00 @@ -75510,7 +75510,7 @@ e4 00 00 00 -de +15 12 00 00 @@ -75534,7 +75534,7 @@ de 00 00 00 -d6 +0d 12 00 00 @@ -75558,7 +75558,7 @@ d6 00 00 00 -ce +05 12 00 00 @@ -75582,8 +75582,8 @@ ce 00 00 00 -c6 -12 +fd +11 00 00 00 @@ -75606,8 +75606,8 @@ c6 00 00 00 -be -12 +f5 +11 00 00 00 @@ -75630,8 +75630,8 @@ be 00 00 00 -b6 -12 +ed +11 00 00 00 @@ -75654,8 +75654,8 @@ b6 00 00 00 -ae -12 +e5 +11 00 00 00 @@ -75678,8 +75678,8 @@ ae 00 00 00 -a6 -12 +dd +11 00 00 00 @@ -75702,8 +75702,8 @@ fc 00 00 00 -9e -12 +d5 +11 00 00 00 @@ -75726,8 +75726,8 @@ f7 00 00 00 -96 -12 +cd +11 00 00 00 @@ -75750,8 +75750,8 @@ ee 00 00 00 -8e -12 +c5 +11 00 00 00 @@ -75774,8 +75774,8 @@ e6 00 00 00 -88 -12 +bf +11 00 00 00 @@ -75798,8 +75798,8 @@ e6 00 00 00 -80 -12 +b7 +11 00 00 00 @@ -75822,8 +75822,8 @@ d6 00 00 00 -7a -12 +b1 +11 00 00 00 @@ -75846,8 +75846,8 @@ e6 00 00 00 -74 -12 +ab +11 00 00 00 @@ -75870,8 +75870,8 @@ c9 00 00 00 -6e -12 +a5 +11 00 00 00 @@ -75894,8 +75894,8 @@ c9 00 00 00 -68 -12 +9f +11 00 00 00 @@ -75918,8 +75918,8 @@ f7 00 00 00 -60 -12 +97 +11 00 00 00 @@ -75942,8 +75942,8 @@ c2 00 00 00 -5a -12 +91 +11 00 00 00 @@ -75966,8 +75966,8 @@ b9 00 00 00 -52 -12 +89 +11 00 00 00 @@ -75990,8 +75990,8 @@ b9 00 00 00 -4a -12 +81 +11 00 00 00 @@ -76014,8 +76014,8 @@ a2 00 00 00 -42 -12 +79 +11 00 00 00 @@ -76038,8 +76038,8 @@ a2 00 00 00 -3a -12 +71 +11 00 00 00 @@ -76062,8 +76062,8 @@ a2 00 00 00 -34 -12 +6b +11 00 00 00 @@ -76086,8 +76086,8 @@ a2 00 00 00 -2c -12 +63 +11 00 00 00 @@ -76110,8 +76110,8 @@ a2 00 00 00 -24 -12 +5b +11 00 00 00 @@ -76134,8 +76134,8 @@ a2 00 00 00 -1c -12 +53 +11 00 00 00 @@ -76158,8 +76158,8 @@ a2 00 00 00 -14 -12 +4b +11 00 00 00 @@ -76182,8 +76182,8 @@ a2 00 00 00 -0c -12 +43 +11 00 00 00 @@ -76206,8 +76206,8 @@ a2 00 00 00 -04 -12 +3b +11 00 00 00 @@ -76230,7 +76230,7 @@ a2 00 00 00 -fc +33 11 00 00 @@ -76254,7 +76254,7 @@ fc 00 00 00 -f4 +2b 11 00 00 @@ -76278,7 +76278,7 @@ f4 00 00 00 -ec +23 11 00 00 @@ -76302,7 +76302,7 @@ ec 00 00 00 -e5 +1c 11 00 00 @@ -76326,7 +76326,7 @@ e5 00 00 00 -de +15 11 00 00 @@ -76350,7 +76350,7 @@ de 00 00 00 -d8 +0f 11 00 00 @@ -76374,7 +76374,7 @@ d8 00 00 00 -d0 +07 11 00 00 @@ -76398,7 +76398,7 @@ d0 00 00 00 -ca +01 11 00 00 @@ -76422,8 +76422,8 @@ ca 00 00 00 -c2 -11 +f9 +10 00 00 00 @@ -76446,8 +76446,8 @@ c2 00 00 00 -bc -11 +f3 +10 00 00 00 @@ -76470,8 +76470,8 @@ bc 00 00 00 -b4 -11 +eb +10 00 00 00 @@ -76494,8 +76494,8 @@ b4 00 00 00 -ae -11 +e5 +10 00 00 00 @@ -76518,8 +76518,8 @@ ae 00 00 00 -a6 -11 +dd +10 00 00 00 @@ -76542,8 +76542,8 @@ a6 00 00 00 -9e -11 +d5 +10 00 00 00 @@ -76566,8 +76566,8 @@ a6 00 00 00 -96 -11 +cd +10 00 00 00 @@ -76590,8 +76590,8 @@ a6 00 00 00 -90 -11 +c7 +10 00 00 00 @@ -76614,8 +76614,8 @@ a6 00 00 00 -8a -11 +c1 +10 00 00 00 @@ -76638,8 +76638,8 @@ a6 00 00 00 -82 -11 +b9 +10 00 00 00 @@ -76662,8 +76662,8 @@ a6 00 00 00 -7c -11 +b3 +10 00 00 00 @@ -76686,8 +76686,8 @@ a6 00 00 00 -76 -11 +ad +10 00 00 00 @@ -76710,8 +76710,8 @@ a6 00 00 00 -6e -11 +96 +10 00 00 00 @@ -76734,8 +76734,8 @@ fb 00 00 00 -66 -11 +8e +10 00 00 00 @@ -76758,8 +76758,8 @@ f0 00 00 00 -60 -11 +88 +10 00 00 00 @@ -76782,8 +76782,8 @@ ef 00 00 00 -58 -11 +80 +10 00 00 00 @@ -76806,8 +76806,8 @@ e8 00 00 00 -50 -11 +78 +10 00 00 00 @@ -76830,8 +76830,8 @@ e7 00 00 00 -4a -11 +72 +10 00 00 00 @@ -76854,8 +76854,8 @@ e6 00 00 00 -42 -11 +6a +10 00 00 00 @@ -76878,8 +76878,8 @@ e6 00 00 00 -3c -11 +64 +10 00 00 00 @@ -76902,8 +76902,8 @@ e6 00 00 00 -34 -11 +5c +10 00 00 00 @@ -76926,8 +76926,8 @@ cb 00 00 00 -2e -11 +56 +10 00 00 00 @@ -76950,8 +76950,8 @@ e8 00 00 00 -26 -11 +4e +10 00 00 00 @@ -76974,8 +76974,8 @@ c1 00 00 00 -1e -11 +46 +10 00 00 00 @@ -76998,8 +76998,8 @@ c1 00 00 00 -16 -11 +3e +10 00 00 00 @@ -77022,8 +77022,8 @@ c0 00 00 00 -0f -11 +37 +10 00 00 00 @@ -77046,8 +77046,8 @@ c0 00 00 00 -08 -11 +30 +10 00 00 00 @@ -77070,8 +77070,8 @@ bb 00 00 00 -00 -11 +28 +10 00 00 00 @@ -77094,7 +77094,7 @@ b6 00 00 00 -f8 +20 10 00 00 @@ -77118,7 +77118,7 @@ ab 00 00 00 -f0 +18 10 00 00 @@ -77142,7 +77142,7 @@ a8 00 00 00 -e8 +10 10 00 00 @@ -77166,7 +77166,7 @@ a7 00 00 00 -e0 +08 10 00 00 @@ -77190,7 +77190,7 @@ e0 00 00 00 -d8 +00 10 00 00 @@ -77214,8 +77214,8 @@ d8 00 00 00 -d0 -10 +f8 +0f 00 00 00 @@ -77238,8 +77238,8 @@ d0 00 00 00 -ca -10 +f2 +0f 00 00 00 @@ -77262,8 +77262,8 @@ a8 00 00 00 -c4 -10 +ec +0f 00 00 00 @@ -77286,8 +77286,8 @@ a0 00 00 00 -bc -10 +e4 +0f 00 00 00 @@ -77310,8 +77310,8 @@ bc 00 00 00 -b4 -10 +dc +0f 00 00 00 @@ -77334,8 +77334,8 @@ b4 00 00 00 -ac -10 +d4 +0f 00 00 00 @@ -77358,8 +77358,8 @@ ac 00 00 00 -a5 -10 +cd +0f 00 00 00 @@ -77382,8 +77382,8 @@ a5 00 00 00 -9f -10 +c7 +0f 00 00 00 @@ -77406,8 +77406,8 @@ a5 00 00 00 -98 -10 +c0 +0f 00 00 00 @@ -77430,8 +77430,8 @@ a5 00 00 00 -90 -10 +a9 +0f 00 00 00 @@ -77454,8 +77454,8 @@ a5 00 00 00 -8a -10 +a3 +0f 00 00 00 @@ -77478,8 +77478,8 @@ a5 00 00 00 -82 -10 +9b +0f 00 00 00 @@ -77502,8 +77502,8 @@ a5 00 00 00 -7b -10 +94 +0f 00 00 00 @@ -77526,8 +77526,8 @@ a5 00 00 00 -74 -10 +8d +0f 00 00 00 @@ -77550,8 +77550,8 @@ a5 00 00 00 -6c -10 +85 +0f 00 00 00 @@ -77574,8 +77574,8 @@ a5 00 00 00 -64 -10 +6b +0f 00 00 00 @@ -77598,8 +77598,8 @@ a5 00 00 00 -5c -10 +63 +0f 00 00 00 @@ -77622,8 +77622,8 @@ a5 00 00 00 -54 -10 +5b +0f 00 00 00 @@ -77646,8 +77646,8 @@ a5 00 00 00 -4e -10 +55 +0f 00 00 00 @@ -77670,8 +77670,8 @@ a5 00 00 00 -48 -10 +4f +0f 00 00 00 @@ -77694,8 +77694,8 @@ a5 00 00 00 -40 -10 +47 +0f 00 00 00 @@ -77718,8 +77718,8 @@ a5 00 00 00 -38 -10 +3f +0f 00 00 00 @@ -77742,8 +77742,8 @@ a5 00 00 00 -30 -10 +37 +0f 00 00 00 @@ -77766,8 +77766,8 @@ a5 00 00 00 -29 -10 +30 +0f 00 00 00 @@ -77790,8 +77790,8 @@ a5 00 00 00 -22 -10 +29 +0f 00 00 00 @@ -77814,8 +77814,8 @@ a5 00 00 00 -1c -10 +23 +0f 00 00 00 @@ -77838,8 +77838,8 @@ a5 00 00 00 -16 -10 +1d +0f 00 00 00 @@ -77862,8 +77862,8 @@ a5 00 00 00 -0e -10 +15 +0f 00 00 00 @@ -77886,8 +77886,8 @@ a5 00 00 00 -07 -10 +0e +0f 00 00 00 @@ -77910,8 +77910,8 @@ a5 00 00 00 -00 -10 +07 +0f 00 00 00 @@ -77934,7 +77934,7 @@ f7 00 00 00 -fa +01 0f 00 00 @@ -77958,8 +77958,8 @@ f4 00 00 00 -f2 -0f +f9 +0e 00 00 00 @@ -77982,8 +77982,8 @@ e0 00 00 00 -eb -0f +f2 +0e 00 00 00 @@ -78006,8 +78006,8 @@ e0 00 00 00 -e4 -0f +eb +0e 00 00 00 @@ -78030,8 +78030,8 @@ db 00 00 00 -dc -0f +e3 +0e 00 00 00 @@ -78054,8 +78054,8 @@ da 00 00 00 -d4 -0f +db +0e 00 00 00 @@ -78078,8 +78078,8 @@ c3 00 00 00 -cc -0f +d3 +0e 00 00 00 @@ -78102,8 +78102,8 @@ c2 00 00 00 -c4 -0f +cb +0e 00 00 00 @@ -78126,8 +78126,8 @@ ba 00 00 00 -be -0f +c5 +0e 00 00 00 @@ -78150,8 +78150,8 @@ c3 00 00 00 -b6 -0f +bd +0e 00 00 00 @@ -78174,8 +78174,8 @@ b1 00 00 00 -ae -0f +b5 +0e 00 00 00 @@ -78198,8 +78198,8 @@ b1 00 00 00 -a6 -0f +ad +0e 00 00 00 @@ -78222,8 +78222,8 @@ b0 00 00 00 -9f -0f +a6 +0e 00 00 00 @@ -78246,8 +78246,8 @@ b0 00 00 00 -98 -0f +9f +0e 00 00 00 @@ -78270,8 +78270,8 @@ a2 00 00 00 -90 -0f +97 +0e 00 00 00 @@ -78294,8 +78294,8 @@ a2 00 00 00 -88 -0f +8f +0e 00 00 00 @@ -78318,8 +78318,8 @@ a2 00 00 00 -80 -0f +87 +0e 00 00 00 @@ -78342,8 +78342,8 @@ a2 00 00 00 -78 -0f +7f +0e 00 00 00 @@ -78366,8 +78366,8 @@ a2 00 00 00 -70 -0f +77 +0e 00 00 00 @@ -78390,8 +78390,8 @@ a2 00 00 00 -68 -0f +6f +0e 00 00 00 @@ -78414,8 +78414,8 @@ a2 00 00 00 -60 -0f +67 +0e 00 00 00 @@ -78438,8 +78438,8 @@ fc 00 00 00 -58 -0f +5f +0e 00 00 00 @@ -78462,8 +78462,8 @@ d9 00 00 00 -50 -0f +57 +0e 00 00 00 @@ -78486,8 +78486,8 @@ cd 00 00 00 -48 -0f +4f +0e 00 00 00 @@ -78510,8 +78510,8 @@ a9 00 00 00 -40 -0f +47 +0e 00 00 00 @@ -78534,8 +78534,8 @@ a9 00 00 00 -3a -0f +41 +0e 00 00 00 @@ -78558,8 +78558,8 @@ a9 00 00 00 -32 -0f +39 +0e 00 00 00 @@ -78582,8 +78582,8 @@ a9 00 00 00 -2a -0f +31 +0e 00 00 00 @@ -78606,8 +78606,8 @@ a9 00 00 00 -22 -0f +14 +0e 00 00 00 @@ -78630,8 +78630,8 @@ a9 00 00 00 -1a -0f +0c +0e 00 00 00 @@ -78654,8 +78654,8 @@ a9 00 00 00 -12 -0f +04 +0e 00 00 00 @@ -78678,8 +78678,8 @@ a9 00 00 00 -0c -0f +fe +0d 00 00 00 @@ -78702,8 +78702,8 @@ a9 00 00 00 -04 -0f +f6 +0d 00 00 00 @@ -78726,8 +78726,8 @@ a9 00 00 00 -fc -0e +df +0d 00 00 00 @@ -78750,8 +78750,8 @@ fc 00 00 00 -f4 -0e +d7 +0d 00 00 00 @@ -78774,8 +78774,8 @@ f1 00 00 00 -ec -0e +cf +0d 00 00 00 @@ -78798,8 +78798,8 @@ ec 00 00 00 -e4 -0e +b7 +0d 00 00 00 @@ -78822,8 +78822,8 @@ da 00 00 00 -dc -0e +af +0d 00 00 00 @@ -78846,8 +78846,8 @@ d5 00 00 00 -d4 -0e +96 +0d 00 00 00 @@ -78870,8 +78870,8 @@ c3 00 00 00 -cc -0e +8e +0d 00 00 00 @@ -78894,8 +78894,8 @@ be 00 00 00 -c4 -0e +7c +0d 00 00 00 @@ -78918,8 +78918,8 @@ ac 00 00 00 -bc -0e +74 +0d 00 00 00 @@ -78942,8 +78942,8 @@ a7 00 00 00 -b4 -0e +5e +0d 00 00 00 @@ -78966,8 +78966,8 @@ b4 00 00 00 -ac -0e +56 +0d 00 00 00 @@ -78990,8 +78990,8 @@ ac 00 00 00 -a4 -0e +40 +0d 00 00 00 @@ -79014,8 +79014,8 @@ a4 00 00 00 -9c -0e +38 +0d 00 00 00 @@ -79038,8 +79038,8 @@ a4 00 00 00 -94 -0e +1d +0d 00 00 00 @@ -79062,8 +79062,8 @@ a4 00 00 00 -8e -0e +17 +0d 00 00 00 @@ -79086,8 +79086,8 @@ a4 00 00 00 -86 -0e +0f +0d 00 00 00 @@ -79110,8 +79110,8 @@ a4 00 00 00 -7e -0e +07 +0d 00 00 00 @@ -79134,8 +79134,8 @@ a4 00 00 00 -76 -0e +ff +0c 00 00 00 @@ -79158,8 +79158,8 @@ a4 00 00 00 -6e -0e +f7 +0c 00 00 00 @@ -79182,8 +79182,8 @@ a4 00 00 00 -66 -0e +ef +0c 00 00 00 @@ -79206,8 +79206,8 @@ a4 00 00 00 -5e -0e +e7 +0c 00 00 00 @@ -79230,8 +79230,8 @@ a4 00 00 00 -56 -0e +df +0c 00 00 00 @@ -79254,8 +79254,8 @@ ff 00 00 00 -4e -0e +d7 +0c 00 00 00 @@ -79278,8 +79278,8 @@ f0 00 00 00 -46 -0e +c3 +0c 00 00 00 @@ -79302,8 +79302,8 @@ e6 00 00 00 -3e -0e +bb +0c 00 00 00 @@ -79326,8 +79326,8 @@ d7 00 00 00 -36 -0e +a3 +0c 00 00 00 @@ -79350,8 +79350,8 @@ c5 00 00 00 -2e -0e +9b +0c 00 00 00 @@ -79374,8 +79374,8 @@ b9 00 00 00 -26 -0e +93 +0c 00 00 00 @@ -79398,8 +79398,8 @@ b9 00 00 00 -1e -0e +8b +0c 00 00 00 @@ -79422,8 +79422,8 @@ b9 00 00 00 -16 -0e +6d +0c 00 00 00 @@ -79446,8 +79446,8 @@ b9 00 00 00 -0e -0e +65 +0c 00 00 00 @@ -79470,8 +79470,8 @@ b9 00 00 00 -08 -0e +51 +0c 00 00 00 @@ -79494,8 +79494,8 @@ b9 00 00 00 -00 -0e +36 +0c 00 00 00 @@ -79518,8 +79518,8 @@ b9 00 00 00 -f8 -0d +2e +0c 00 00 00 @@ -79542,8 +79542,8 @@ f8 00 00 00 -f0 -0d +26 +0c 00 00 00 @@ -79566,8 +79566,8 @@ f0 00 00 00 -e8 -0d +1e +0c 00 00 00 @@ -79590,8 +79590,8 @@ e8 00 00 00 -e0 -0d +16 +0c 00 00 00 @@ -79614,8 +79614,8 @@ e0 00 00 00 -d8 -0d +fd +0b 00 00 00 @@ -79638,8 +79638,8 @@ f9 00 00 00 -d0 -0d +e6 +0b 00 00 00 @@ -79662,8 +79662,8 @@ b5 00 00 00 -c8 -0d +de +0b 00 00 00 @@ -79686,8 +79686,8 @@ ab 00 00 00 -c0 -0d +d6 +0b 00 00 00 @@ -79710,8 +79710,8 @@ a8 00 00 00 -b8 -0d +ce +0b 00 00 00 @@ -79734,8 +79734,8 @@ a0 00 00 00 -b2 -0d +c8 +0b 00 00 00 @@ -79758,8 +79758,8 @@ d0 00 00 00 -aa -0d +c0 +0b 00 00 00 @@ -79782,8 +79782,8 @@ aa 00 00 00 -a2 -0d +b8 +0b 00 00 00 @@ -79806,8 +79806,8 @@ a2 00 00 00 -9a -0d +b0 +0b 00 00 00 @@ -79830,8 +79830,8 @@ a2 00 00 00 -92 -0d +a8 +0b 00 00 00 @@ -79854,8 +79854,8 @@ a2 00 00 00 -8a -0d +a0 +0b 00 00 00 @@ -79878,8 +79878,8 @@ a2 00 00 00 -82 -0d +98 +0b 00 00 00 @@ -79902,8 +79902,8 @@ a2 00 00 00 -7a -0d +90 +0b 00 00 00 @@ -79926,8 +79926,8 @@ a2 00 00 00 -72 -0d +88 +0b 00 00 00 @@ -79950,8 +79950,8 @@ a2 00 00 00 -6c -0d +82 +0b 00 00 00 @@ -79974,8 +79974,8 @@ a2 00 00 00 -66 -0d +7c +0b 00 00 00 @@ -79998,8 +79998,8 @@ a2 00 00 00 -60 -0d +76 +0b 00 00 00 @@ -80022,8 +80022,8 @@ e4 00 00 00 -5a -0d +70 +0b 00 00 00 @@ -80046,8 +80046,8 @@ e4 00 00 00 -54 -0d +6a +0b 00 00 00 @@ -80070,8 +80070,8 @@ e4 00 00 00 -4c -0d +62 +0b 00 00 00 @@ -80094,8 +80094,8 @@ e4 00 00 00 -46 -0d +47 +0b 00 00 00 @@ -80118,8 +80118,8 @@ f0 00 00 00 -40 -0d +41 +0b 00 00 00 @@ -80142,8 +80142,8 @@ d7 00 00 00 -3a -0d +3b +0b 00 00 00 @@ -80166,8 +80166,8 @@ d7 00 00 00 -34 -0d +35 +0b 00 00 00 @@ -80190,8 +80190,8 @@ fc 00 00 00 -2e -0d +2f +0b 00 00 00 @@ -80214,8 +80214,8 @@ cd 00 00 00 -28 -0d +29 +0b 00 00 00 @@ -80238,8 +80238,8 @@ cd 00 00 00 -22 -0d +23 +0b 00 00 00 @@ -80262,8 +80262,8 @@ b9 00 00 00 -1c -0d +1d +0b 00 00 00 @@ -80286,8 +80286,8 @@ b9 00 00 00 -16 -0d +17 +0b 00 00 00 @@ -80310,8 +80310,8 @@ b9 00 00 00 -10 -0d +11 +0b 00 00 00 @@ -80334,8 +80334,8 @@ b9 00 00 00 -0a -0d +0b +0b 00 00 00 @@ -80358,8 +80358,8 @@ b9 00 00 00 -04 -0d +05 +0b 00 00 00 @@ -80382,8 +80382,8 @@ b9 00 00 00 -fe -0c +ff +0a 00 00 00 @@ -80406,8 +80406,8 @@ fe 00 00 00 -f8 -0c +f9 +0a 00 00 00 @@ -80430,8 +80430,8 @@ f8 00 00 00 -f2 -0c +f3 +0a 00 00 00 @@ -80454,8 +80454,8 @@ f1 00 00 00 -ec -0c +ed +0a 00 00 00 @@ -80478,8 +80478,8 @@ da 00 00 00 -e6 -0c +e7 +0a 00 00 00 @@ -80502,8 +80502,8 @@ c3 00 00 00 -e0 -0c +e1 +0a 00 00 00 @@ -80526,8 +80526,8 @@ ac 00 00 00 -da -0c +db +0a 00 00 00 @@ -80550,8 +80550,8 @@ da 00 00 00 -d4 -0c +d5 +0a 00 00 00 @@ -80574,8 +80574,8 @@ d4 00 00 00 -ce -0c +cf +0a 00 00 00 @@ -80598,8 +80598,8 @@ f9 00 00 00 -c9 -0c +ca +0a 00 00 00 @@ -80622,8 +80622,8 @@ c9 00 00 00 -c4 -0c +c5 +0a 00 00 00 @@ -80646,8 +80646,8 @@ c4 00 00 00 -bf -0c +c0 +0a 00 00 00 @@ -80670,8 +80670,8 @@ bf 00 00 00 -ba -0c +bb +0a 00 00 00 @@ -80694,8 +80694,8 @@ ba 00 00 00 -b5 -0c +b6 +0a 00 00 00 @@ -80718,8 +80718,8 @@ b5 00 00 00 -af -0c +b0 +0a 00 00 00 @@ -80742,8 +80742,8 @@ af 00 00 00 -aa -0c +ab +0a 00 00 00 @@ -80766,8 +80766,8 @@ aa 00 00 00 -a4 -0c +a5 +0a 00 00 00 @@ -80790,8 +80790,8 @@ b5 00 00 00 -9f -0c +a0 +0a 00 00 00 @@ -80814,8 +80814,8 @@ b5 00 00 00 -97 -0c +98 +0a 00 00 00 @@ -80838,8 +80838,8 @@ e3 00 00 00 -91 -0c +92 +0a 00 00 00 @@ -80862,8 +80862,8 @@ a0 00 00 00 -8c -0c +8d +0a 00 00 00 @@ -80886,8 +80886,8 @@ e3 00 00 00 -84 -0c +85 +0a 00 00 00 @@ -80910,8 +80910,8 @@ b3 00 00 00 -7f -0c +80 +0a 00 00 00 @@ -80934,8 +80934,8 @@ b0 00 00 00 -77 -0c +78 +0a 00 00 00 @@ -80958,8 +80958,8 @@ b0 00 00 00 -6f -0c +70 +0a 00 00 00 @@ -80982,8 +80982,8 @@ b0 00 00 00 -67 -0c +68 +0a 00 00 00 @@ -81006,8 +81006,8 @@ b0 00 00 00 -5f -0c +60 +0a 00 00 00 @@ -81030,8 +81030,8 @@ b0 00 00 00 -59 -0c +5a +0a 00 00 00 @@ -81054,8 +81054,8 @@ a8 00 00 00 -51 -0c +52 +0a 00 00 00 @@ -81078,8 +81078,8 @@ a8 00 00 00 -49 -0c +4a +0a 00 00 00 @@ -81102,8 +81102,8 @@ a8 00 00 00 -41 -0c +42 +0a 00 00 00 @@ -81126,8 +81126,8 @@ a8 00 00 00 -39 -0c +3a +0a 00 00 00 @@ -81150,8 +81150,8 @@ a8 00 00 00 -31 -0c +32 +0a 00 00 00 @@ -81174,8 +81174,8 @@ a8 00 00 00 -29 -0c +2a +0a 00 00 00 @@ -81198,8 +81198,8 @@ a8 00 00 00 -21 -0c +22 +0a 00 00 00 @@ -81222,8 +81222,8 @@ a8 00 00 00 -19 -0c +1a +0a 00 00 00 @@ -81246,8 +81246,8 @@ a8 00 00 00 -11 -0c +12 +0a 00 00 00 @@ -81270,8 +81270,8 @@ a8 00 00 00 -09 -0c +0a +0a 00 00 00 @@ -81294,8 +81294,8 @@ a8 00 00 00 -02 -0c +03 +0a 00 00 00 @@ -81318,8 +81318,8 @@ a8 00 00 00 -fc -0b +fd +09 00 00 00 @@ -81342,8 +81342,8 @@ fc 00 00 00 -f6 -0b +f7 +09 00 00 00 @@ -81366,8 +81366,8 @@ f6 00 00 00 -f0 -0b +f1 +09 00 00 00 @@ -81390,8 +81390,8 @@ f0 00 00 00 -ea -0b +eb +09 00 00 00 @@ -81414,8 +81414,8 @@ ea 00 00 00 -e4 -0b +e5 +09 00 00 00 @@ -81438,8 +81438,8 @@ e4 00 00 00 -de -0b +df +09 00 00 00 @@ -81462,8 +81462,8 @@ de 00 00 00 -d8 -0b +d9 +09 00 00 00 @@ -81486,8 +81486,8 @@ d8 00 00 00 -d1 -0b +d2 +09 00 00 00 @@ -81510,8 +81510,8 @@ d1 00 00 00 -c9 -0b +ca +09 00 00 00 @@ -81534,8 +81534,8 @@ c9 00 00 00 -c1 -0b +c2 +09 00 00 00 @@ -81558,8 +81558,8 @@ c1 00 00 00 -b9 -0b +ba +09 00 00 00 @@ -81582,8 +81582,8 @@ b9 00 00 00 -b1 -0b +b2 +09 00 00 00 @@ -81606,8 +81606,8 @@ b1 00 00 00 -a9 -0b +aa +09 00 00 00 @@ -81630,8 +81630,8 @@ a9 00 00 00 -a1 -0b +97 +09 00 00 00 @@ -81654,8 +81654,8 @@ a1 00 00 00 -9c -0b +92 +09 00 00 00 @@ -81678,8 +81678,8 @@ a1 00 00 00 -94 -0b +8a +09 00 00 00 @@ -81702,8 +81702,8 @@ a1 00 00 00 -8c -0b +82 +09 00 00 00 @@ -81726,8 +81726,8 @@ a1 00 00 00 -84 -0b +7a +09 00 00 00 @@ -81750,8 +81750,8 @@ a1 00 00 00 -7d -0b +73 +09 00 00 00 @@ -81774,8 +81774,8 @@ a1 00 00 00 -76 -0b +6c +09 00 00 00 @@ -81798,8 +81798,8 @@ a1 00 00 00 -6e -0b +64 +09 00 00 00 @@ -81822,8 +81822,8 @@ a1 00 00 00 -66 -0b +5c +09 00 00 00 @@ -81846,8 +81846,8 @@ a1 00 00 00 -5e -0b +54 +09 00 00 00 @@ -81870,8 +81870,8 @@ a1 00 00 00 -56 -0b +4c +09 00 00 00 @@ -81894,8 +81894,8 @@ ea 00 00 00 -4e -0b +44 +09 00 00 00 @@ -81918,8 +81918,8 @@ e9 00 00 00 -46 -0b +3c +09 00 00 00 @@ -81942,8 +81942,8 @@ e5 00 00 00 -3e -0b +34 +09 00 00 00 @@ -81966,8 +81966,8 @@ e0 00 00 00 -36 -0b +2c +09 00 00 00 @@ -81990,8 +81990,8 @@ c7 00 00 00 -2e -0b +24 +09 00 00 00 @@ -82014,8 +82014,8 @@ c6 00 00 00 -26 -0b +1c +09 00 00 00 @@ -82038,8 +82038,8 @@ c2 00 00 00 -1e -0b +14 +09 00 00 00 @@ -82062,8 +82062,8 @@ bd 00 00 00 -19 -0b +0f +09 00 00 00 @@ -82086,8 +82086,8 @@ f0 00 00 00 -14 -0b +0a +09 00 00 00 @@ -82110,8 +82110,8 @@ c7 00 00 00 -0c -0b +02 +09 00 00 00 @@ -82134,8 +82134,8 @@ a2 00 00 00 -04 -0b +fa +08 00 00 00 @@ -82158,8 +82158,8 @@ a2 00 00 00 -fc -0a +f2 +08 00 00 00 @@ -82182,8 +82182,8 @@ fc 00 00 00 -f4 -0a +ea +08 00 00 00 @@ -82206,8 +82206,8 @@ f4 00 00 00 -ec -0a +e2 +08 00 00 00 @@ -82230,8 +82230,8 @@ ec 00 00 00 -e4 -0a +da +08 00 00 00 @@ -82254,8 +82254,8 @@ e4 00 00 00 -dc -0a +d2 +08 00 00 00 @@ -82278,8 +82278,8 @@ dc 00 00 00 -d5 -0a +cb +08 00 00 00 @@ -82302,8 +82302,8 @@ d5 00 00 00 -ce -0a +c4 +08 00 00 00 @@ -82326,8 +82326,8 @@ ce 00 00 00 -c7 -0a +bd +08 00 00 00 @@ -82350,8 +82350,8 @@ c7 00 00 00 -c0 -0a +b6 +08 00 00 00 @@ -82374,8 +82374,8 @@ c0 00 00 00 -b9 -0a +9e +08 00 00 00 @@ -82398,8 +82398,8 @@ b9 00 00 00 -b2 -0a +97 +08 00 00 00 @@ -82422,8 +82422,8 @@ b2 00 00 00 -ab -0a +90 +08 00 00 00 @@ -82446,8 +82446,8 @@ ab 00 00 00 -a6 -0a +8b +08 00 00 00 @@ -82470,8 +82470,8 @@ a6 00 00 00 -9f -0a +84 +08 00 00 00 @@ -82494,8 +82494,8 @@ a6 00 00 00 -97 -0a +7c +08 00 00 00 @@ -82518,8 +82518,8 @@ a6 00 00 00 -90 -0a +75 +08 00 00 00 @@ -82542,8 +82542,8 @@ a6 00 00 00 -89 -0a +6e +08 00 00 00 @@ -82566,8 +82566,8 @@ a6 00 00 00 -82 -0a +67 +08 00 00 00 @@ -82590,8 +82590,8 @@ ff 00 00 00 -7b -0a +60 +08 00 00 00 @@ -82614,8 +82614,8 @@ fe 00 00 00 -74 -0a +59 +08 00 00 00 @@ -82638,8 +82638,8 @@ e9 00 00 00 -6d -0a +52 +08 00 00 00 @@ -82662,8 +82662,8 @@ e1 00 00 00 -65 -0a +4a +08 00 00 00 @@ -82686,8 +82686,8 @@ e1 00 00 00 -5e -0a +43 +08 00 00 00 @@ -82710,8 +82710,8 @@ e0 00 00 00 -57 -0a +3c +08 00 00 00 @@ -82734,8 +82734,8 @@ e0 00 00 00 -50 -0a +35 +08 00 00 00 @@ -82758,8 +82758,8 @@ d5 00 00 00 -49 -0a +2e +08 00 00 00 @@ -82782,8 +82782,8 @@ b9 00 00 00 -44 -0a +ff +07 00 00 00 @@ -82806,8 +82806,8 @@ b9 00 00 00 -3d -0a +f8 +07 00 00 00 @@ -82830,8 +82830,8 @@ b9 00 00 00 -36 -0a +f1 +07 00 00 00 @@ -82854,8 +82854,8 @@ b9 00 00 00 -31 -0a +dc +07 00 00 00 @@ -82878,8 +82878,8 @@ b9 00 00 00 -2a -0a +d5 +07 00 00 00 @@ -82902,8 +82902,8 @@ b9 00 00 00 -23 -0a +ce +07 00 00 00 @@ -82926,8 +82926,8 @@ b9 00 00 00 -1c -0a +c7 +07 00 00 00 @@ -82950,8 +82950,8 @@ b9 00 00 00 -15 -0a +c0 +07 00 00 00 @@ -82974,8 +82974,8 @@ b9 00 00 00 -0e -0a +b9 +07 00 00 00 @@ -82998,8 +82998,8 @@ b9 00 00 00 +b2 07 -0a 00 00 00 @@ -83022,8 +83022,8 @@ b9 00 00 00 -00 -0a +ab +07 00 00 00 @@ -83046,8 +83046,8 @@ b9 00 00 00 -f9 -09 +a4 +07 00 00 00 @@ -83070,8 +83070,8 @@ fa 00 00 00 -f4 -09 +9f +07 00 00 00 @@ -83094,8 +83094,8 @@ f6 00 00 00 -ed -09 +98 +07 00 00 00 @@ -83118,8 +83118,8 @@ f6 00 00 00 -e6 -09 +91 +07 00 00 00 @@ -83142,8 +83142,8 @@ eb 00 00 00 -e1 -09 +8c +07 00 00 00 @@ -83166,8 +83166,8 @@ e6 00 00 00 -da -09 +85 +07 00 00 00 @@ -83190,8 +83190,8 @@ e6 00 00 00 -d3 -09 +7e +07 00 00 00 @@ -83214,8 +83214,8 @@ db 00 00 00 -ce -09 +79 +07 00 00 00 @@ -83238,8 +83238,8 @@ d6 00 00 00 -c9 -09 +74 +07 00 00 00 @@ -83262,8 +83262,8 @@ c5 00 00 00 -c4 -09 +6f +07 00 00 00 @@ -83286,8 +83286,8 @@ b9 00 00 00 -bf -09 +6a +07 00 00 00 @@ -83310,8 +83310,8 @@ c2 00 00 00 -ba -09 +65 +07 00 00 00 @@ -83334,8 +83334,8 @@ cb 00 00 00 -b5 -09 +60 +07 00 00 00 @@ -83358,8 +83358,8 @@ b5 00 00 00 -b0 -09 +5b +07 00 00 00 @@ -83382,8 +83382,8 @@ b0 00 00 00 -a9 -09 +54 +07 00 00 00 @@ -83406,8 +83406,8 @@ be 00 00 00 -a4 -09 +4f +07 00 00 00 @@ -83430,8 +83430,8 @@ a4 00 00 00 -9f -09 +4a +07 00 00 00 @@ -83454,8 +83454,8 @@ b5 00 00 00 -9a -09 +45 +07 00 00 00 @@ -83478,8 +83478,8 @@ b5 00 00 00 -95 -09 +40 +07 00 00 00 @@ -83502,8 +83502,8 @@ b5 00 00 00 -90 -09 +3b +07 00 00 00 @@ -83526,8 +83526,8 @@ b5 00 00 00 -89 -09 +34 +07 00 00 00 @@ -83550,8 +83550,8 @@ b5 00 00 00 -82 -09 +2d +07 00 00 00 @@ -83574,8 +83574,8 @@ b5 00 00 00 -7b -09 +26 +07 00 00 00 @@ -83598,8 +83598,8 @@ b5 00 00 00 -74 -09 +1f +07 00 00 00 @@ -83622,8 +83622,8 @@ b5 00 00 00 -6c -09 +17 +07 00 00 00 @@ -83646,8 +83646,8 @@ b5 00 00 00 -64 -09 +0f +07 00 00 00 @@ -83670,8 +83670,8 @@ b5 00 00 00 -5c -09 +07 +07 00 00 00 @@ -83694,8 +83694,8 @@ b5 00 00 00 -54 -09 +ff +06 00 00 00 @@ -83718,8 +83718,8 @@ b5 00 00 00 -4c -09 +f7 +06 00 00 00 @@ -83742,8 +83742,8 @@ b5 00 00 00 -45 -09 +f0 +06 00 00 00 @@ -83766,8 +83766,8 @@ b5 00 00 00 -3e -09 +e9 +06 00 00 00 @@ -83790,8 +83790,8 @@ b5 00 00 00 -38 -09 +e3 +06 00 00 00 @@ -83814,8 +83814,8 @@ b5 00 00 00 -31 -09 +dc +06 00 00 00 @@ -83838,8 +83838,8 @@ b5 00 00 00 -2a -09 +d5 +06 00 00 00 @@ -83862,8 +83862,8 @@ b5 00 00 00 -23 -09 +ce +06 00 00 00 @@ -83886,8 +83886,8 @@ b5 00 00 00 -1c -09 +c7 +06 00 00 00 @@ -83910,8 +83910,8 @@ b5 00 00 00 -15 -09 +c0 +06 00 00 00 @@ -83934,8 +83934,8 @@ b5 00 00 00 -0e -09 +b9 +06 00 00 00 @@ -83958,8 +83958,8 @@ b5 00 00 00 -07 -09 +b2 +06 00 00 00 @@ -83982,8 +83982,8 @@ b5 00 00 00 -00 -09 +ab +06 00 00 00 @@ -84006,8 +84006,8 @@ b5 00 00 00 -f9 -08 +a4 +06 00 00 00 @@ -84030,8 +84030,8 @@ fd 00 00 00 -f2 -08 +9d +06 00 00 00 @@ -84054,8 +84054,8 @@ f8 00 00 00 -eb -08 +96 +06 00 00 00 @@ -84078,8 +84078,8 @@ f4 00 00 00 -e6 -08 +91 +06 00 00 00 @@ -84102,8 +84102,8 @@ e6 00 00 00 -e1 -08 +79 +06 00 00 00 @@ -84126,8 +84126,8 @@ ae 00 00 00 -dc -08 +74 +06 00 00 00 @@ -84150,8 +84150,8 @@ dc 00 00 00 -d5 -08 +6d +06 00 00 00 @@ -84174,8 +84174,8 @@ d5 00 00 00 -ce -08 +66 +06 00 00 00 @@ -84198,8 +84198,8 @@ ce 00 00 00 -c7 -08 +5f +06 00 00 00 @@ -84222,8 +84222,8 @@ c7 00 00 00 -bf -08 +57 +06 00 00 00 @@ -84246,8 +84246,8 @@ bf 00 00 00 -b8 -08 +50 +06 00 00 00 @@ -84270,8 +84270,8 @@ b8 00 00 00 -b0 -08 +48 +06 00 00 00 @@ -84294,8 +84294,8 @@ b0 00 00 00 -a8 -08 +40 +06 00 00 00 @@ -84318,8 +84318,8 @@ a8 00 00 00 -a0 -08 +38 +06 00 00 00 @@ -84342,8 +84342,8 @@ a0 00 00 00 -99 -08 +31 +06 00 00 00 @@ -84366,8 +84366,8 @@ a0 00 00 00 -92 -08 +2a +06 00 00 00 @@ -84390,8 +84390,8 @@ a0 00 00 00 -8b -08 +23 +06 00 00 00 @@ -84414,8 +84414,8 @@ a0 00 00 00 -84 -08 +1c +06 00 00 00 @@ -84438,8 +84438,8 @@ a0 00 00 00 -7d -08 +15 +06 00 00 00 @@ -84462,8 +84462,8 @@ a0 00 00 00 -76 -08 +0e +06 00 00 00 @@ -84486,8 +84486,8 @@ a0 00 00 00 -6f -08 +07 +06 00 00 00 @@ -84510,8 +84510,8 @@ a0 00 00 00 -68 -08 +00 +06 00 00 00 @@ -84534,8 +84534,8 @@ a0 00 00 00 -61 -08 +f9 +05 00 00 00 @@ -84558,8 +84558,8 @@ a0 00 00 00 -5a -08 +f2 +05 00 00 00 @@ -84582,8 +84582,8 @@ a0 00 00 00 -53 -08 +eb +05 00 00 00 @@ -84606,8 +84606,8 @@ a0 00 00 00 -4c -08 +e4 +05 00 00 00 @@ -84630,8 +84630,8 @@ a0 00 00 00 -45 -08 +dd +05 00 00 00 @@ -84654,8 +84654,8 @@ a0 00 00 00 -40 -08 +d8 +05 00 00 00 @@ -84678,8 +84678,8 @@ a0 00 00 00 -3b -08 +c0 +05 00 00 00 @@ -84702,8 +84702,8 @@ ce 00 00 00 -36 -08 +bb +05 00 00 00 @@ -84726,8 +84726,8 @@ ce 00 00 00 -2f -08 +b4 +05 00 00 00 @@ -84750,8 +84750,8 @@ ba 00 00 00 -28 -08 +ad +05 00 00 00 @@ -84774,8 +84774,8 @@ b4 00 00 00 -21 -08 +a6 +05 00 00 00 @@ -84798,8 +84798,8 @@ ab 00 00 00 -19 -08 +9e +05 00 00 00 @@ -84822,8 +84822,8 @@ ab 00 00 00 -12 -08 +97 +05 00 00 00 @@ -84846,8 +84846,8 @@ a7 00 00 00 -0a -08 +8f +05 00 00 00 @@ -84870,8 +84870,8 @@ a2 00 00 00 -02 -08 +87 +05 00 00 00 @@ -84894,8 +84894,8 @@ a2 00 00 00 -fa -07 +7f +05 00 00 00 @@ -84918,8 +84918,8 @@ fa 00 00 00 -f3 -07 +78 +05 00 00 00 @@ -84942,8 +84942,8 @@ f3 00 00 00 -ec -07 +71 +05 00 00 00 @@ -84966,8 +84966,8 @@ ec 00 00 00 -e5 -07 +6a +05 00 00 00 @@ -84990,8 +84990,8 @@ e5 00 00 00 -de -07 +63 +05 00 00 00 @@ -85014,8 +85014,8 @@ de 00 00 00 -d7 -07 +5c +05 00 00 00 @@ -85038,8 +85038,8 @@ d7 00 00 00 -d0 -07 +55 +05 00 00 00 @@ -85062,8 +85062,8 @@ d0 00 00 00 -c9 -07 +4e +05 00 00 00 @@ -85086,8 +85086,8 @@ c9 00 00 00 -c2 -07 +47 +05 00 00 00 @@ -85110,8 +85110,8 @@ c2 00 00 00 -bb -07 +40 +05 00 00 00 @@ -85134,8 +85134,8 @@ bb 00 00 00 -b4 -07 +39 +05 00 00 00 @@ -85158,8 +85158,8 @@ b4 00 00 00 -ad -07 +32 +05 00 00 00 @@ -85182,8 +85182,8 @@ ad 00 00 00 -a6 -07 +2b +05 00 00 00 @@ -85206,8 +85206,8 @@ a6 00 00 00 -9f -07 +24 +05 00 00 00 @@ -85230,8 +85230,8 @@ a6 00 00 00 -9a -07 +1f +05 00 00 00 @@ -85254,8 +85254,8 @@ a6 00 00 00 -95 07 +05 00 00 00 @@ -85278,8 +85278,8 @@ ea 00 00 00 -90 -07 +02 +05 00 00 00 @@ -85302,8 +85302,8 @@ ea 00 00 00 -89 -07 +f4 +04 00 00 00 @@ -85326,8 +85326,8 @@ da 00 00 00 -82 -07 +ed +04 00 00 00 @@ -85350,8 +85350,8 @@ d4 00 00 00 -7b -07 +e6 +04 00 00 00 @@ -85374,8 +85374,8 @@ cb 00 00 00 -74 -07 +df +04 00 00 00 @@ -85398,8 +85398,8 @@ cb 00 00 00 -6d -07 +d8 +04 00 00 00 @@ -85422,8 +85422,8 @@ c7 00 00 00 -66 -07 +d1 +04 00 00 00 @@ -85446,8 +85446,8 @@ c2 00 00 00 -5f -07 +ca +04 00 00 00 @@ -85470,8 +85470,8 @@ bd 00 00 00 -58 -07 +c3 +04 00 00 00 @@ -85494,8 +85494,8 @@ b5 00 00 00 -51 -07 +bc +04 00 00 00 @@ -85518,8 +85518,8 @@ b0 00 00 00 -4a -07 +b5 +04 00 00 00 @@ -85542,8 +85542,8 @@ b0 00 00 00 -43 -07 +ae +04 00 00 00 @@ -85566,8 +85566,8 @@ a6 00 00 00 -3c -07 +99 +04 00 00 00 @@ -85590,8 +85590,8 @@ a6 00 00 00 -35 -07 +92 +04 00 00 00 @@ -85614,8 +85614,8 @@ a6 00 00 00 -2e -07 +8b +04 00 00 00 @@ -85638,8 +85638,8 @@ a6 00 00 00 -27 -07 +84 +04 00 00 00 @@ -85662,8 +85662,8 @@ a6 00 00 00 -20 -07 +7d +04 00 00 00 @@ -85686,8 +85686,8 @@ a6 00 00 00 -19 -07 +66 +04 00 00 00 @@ -85710,8 +85710,8 @@ a6 00 00 00 -12 -07 +5f +04 00 00 00 @@ -85734,8 +85734,8 @@ a6 00 00 00 -0b -07 +58 +04 00 00 00 @@ -85758,8 +85758,8 @@ a6 00 00 00 +51 04 -07 00 00 00 @@ -85782,8 +85782,8 @@ a6 00 00 00 -fd -06 +4a +04 00 00 00 @@ -85806,8 +85806,8 @@ fd 00 00 00 -f9 -06 +31 +04 00 00 00 @@ -85830,8 +85830,8 @@ f9 00 00 00 -f5 -06 +25 +04 00 00 00 @@ -85854,8 +85854,8 @@ f5 00 00 00 -f0 -06 +20 +04 00 00 00 @@ -85878,8 +85878,8 @@ f0 00 00 00 -e9 -06 +ff +03 00 00 00 @@ -85902,8 +85902,8 @@ e9 00 00 00 -e2 -06 +f8 +03 00 00 00 @@ -85926,8 +85926,8 @@ e2 00 00 00 -db -06 +f1 +03 00 00 00 @@ -85950,8 +85950,8 @@ f4 00 00 00 -d5 -06 +eb +03 00 00 00 @@ -85974,8 +85974,8 @@ f4 00 00 00 -cf -06 +d8 +03 00 00 00 @@ -85998,8 +85998,8 @@ eb 00 00 00 -c8 -06 +d1 +03 00 00 00 @@ -86022,8 +86022,8 @@ eb 00 00 00 -c2 -06 +cb +03 00 00 00 @@ -86046,8 +86046,8 @@ e7 00 00 00 -bb -06 +c4 +03 00 00 00 @@ -86070,8 +86070,8 @@ e2 00 00 00 -b4 -06 +bd +03 00 00 00 @@ -86094,8 +86094,8 @@ da 00 00 00 -ad -06 +b6 +03 00 00 00 @@ -86118,8 +86118,8 @@ d5 00 00 00 -a7 -06 +b0 +03 00 00 00 @@ -86142,8 +86142,8 @@ d0 00 00 00 -a0 -06 +a9 +03 00 00 00 @@ -86166,8 +86166,8 @@ d0 00 00 00 -9a -06 +a3 +03 00 00 00 @@ -86214,8 +86214,8 @@ d0 00 00 00 -93 -06 +9c +03 00 00 00 @@ -86238,8 +86238,8 @@ d0 00 00 00 -8d -06 +96 +03 00 00 00 @@ -86262,8 +86262,8 @@ cb 00 00 00 -87 -06 +5b +03 00 00 00 @@ -86286,8 +86286,8 @@ cb 00 00 00 -80 -06 +54 +03 00 00 00 @@ -86310,8 +86310,8 @@ cb 00 00 00 -7a -06 +4e +03 00 00 00 @@ -86334,8 +86334,8 @@ cb 00 00 00 -73 -06 +47 +03 00 00 00 @@ -86358,8 +86358,8 @@ cb 00 00 00 -6c -06 +40 +03 00 00 00 @@ -86382,8 +86382,8 @@ cb 00 00 00 -66 -06 +3a +03 00 00 00 @@ -86406,8 +86406,8 @@ cb 00 00 00 -58 -06 +2c +03 00 00 00 @@ -86430,8 +86430,8 @@ cb 00 00 00 -4e -06 +03 +03 00 00 00 @@ -86454,8 +86454,8 @@ cb 00 00 00 -44 -06 +f9 +02 00 00 00 @@ -86478,8 +86478,8 @@ cb 00 00 00 -3e -06 +f3 +02 00 00 00 @@ -86502,8 +86502,8 @@ cb 00 00 00 -37 -06 +ec +02 00 00 00 @@ -86526,8 +86526,8 @@ cb 00 00 00 -2f -06 +e4 +02 00 00 00 @@ -86550,8 +86550,8 @@ cb 00 00 00 -29 -06 +cd +02 00 00 00 @@ -86574,8 +86574,8 @@ cb 00 00 00 -22 -06 +c6 +02 00 00 00 @@ -86598,8 +86598,8 @@ cb 00 00 00 -1c -06 +c0 +02 00 00 00 @@ -86622,8 +86622,8 @@ cb 00 00 00 -15 -06 +b9 +02 00 00 00 @@ -86694,8 +86694,8 @@ cb 00 00 00 -0f -06 +b3 +02 00 00 00 @@ -86718,8 +86718,8 @@ cb 00 00 00 -09 -06 +ad +02 00 00 00 @@ -86742,8 +86742,8 @@ cb 00 00 00 -03 -06 +a7 +02 00 00 00 @@ -86766,8 +86766,8 @@ cb 00 00 00 -fd -05 +a1 +02 00 00 00 @@ -86790,8 +86790,8 @@ fd 00 00 00 -f7 -05 +9b +02 00 00 00 @@ -86814,8 +86814,8 @@ f7 00 00 00 -f1 -05 +95 +02 00 00 00 @@ -86838,8 +86838,8 @@ f1 00 00 00 -eb -05 +8f +02 00 00 00 @@ -86862,8 +86862,8 @@ eb 00 00 00 -e5 -05 +89 +02 00 00 00 @@ -86886,8 +86886,8 @@ e5 00 00 00 -df -05 +83 +02 00 00 00 @@ -86910,8 +86910,8 @@ df 00 00 00 -da -05 +7e +02 00 00 00 @@ -86934,8 +86934,8 @@ da 00 00 00 -d5 -05 +79 +02 00 00 00 @@ -86958,8 +86958,8 @@ d5 00 00 00 -d0 -05 +74 +02 00 00 00 @@ -86982,8 +86982,8 @@ d0 00 00 00 -cb -05 +6f +02 00 00 00 @@ -87006,8 +87006,8 @@ cb 00 00 00 -c6 -05 +6a +02 00 00 00 @@ -87030,8 +87030,8 @@ c6 00 00 00 -c1 -05 +65 +02 00 00 00 @@ -87054,8 +87054,8 @@ c1 00 00 00 -bc -05 +60 +02 00 00 00 @@ -87078,8 +87078,8 @@ bc 00 00 00 -b7 -05 +5b +02 00 00 00 @@ -87102,8 +87102,8 @@ b7 00 00 00 -b2 -05 +56 +02 00 00 00 @@ -87150,8 +87150,8 @@ b2 00 00 00 -ad -05 +51 +02 00 00 00 @@ -87222,8 +87222,8 @@ ad 00 00 00 -a5 -05 +49 +02 00 00 00 @@ -87246,8 +87246,8 @@ a5 00 00 00 -97 -05 +3b +02 00 00 00 @@ -87294,8 +87294,8 @@ a5 00 00 00 -89 -05 +2d +02 00 00 00 @@ -87342,8 +87342,8 @@ a5 00 00 00 -79 -05 +1d +02 00 00 00 @@ -87438,6 +87438,54 @@ a5 00 00 00 +d3 +02 +00 +00 +10 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +0d +03 +00 +00 +10 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 2c 00 00 @@ -87462,6 +87510,54 @@ a5 00 00 00 +61 +03 +00 +00 +10 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +84 +03 +00 +00 +10 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 40 00 00 @@ -87486,23 +87582,20 @@ d6 00 00 00 -57 +de +03 00 00 +10 00 -12 00 -04 00 -b0 -01 00 00 00 00 00 00 -d6 00 00 00 @@ -87510,23 +87603,19 @@ d6 00 00 00 -6e 00 00 00 -12 -00 +06 04 00 -90 -02 00 +10 00 00 00 00 00 -d6 00 00 00 @@ -87534,23 +87623,20 @@ d6 00 00 00 -85 00 00 00 -12 00 -04 00 -70 -03 00 00 +29 +04 00 00 +10 00 00 -d6 00 00 00 @@ -87558,95 +87644,80 @@ d6 00 00 00 -9c 00 00 00 -12 00 -04 00 -50 -04 00 00 00 00 00 +35 +04 00 -85 -01 00 +10 00 00 00 00 00 -be 00 00 00 -12 00 -04 00 -e0 -05 00 00 00 00 00 00 -1f 00 00 00 +6d +04 00 00 +10 00 00 -d6 00 00 00 -12 00 -04 00 00 -06 00 00 00 00 00 00 -71 00 00 00 00 00 +a0 +04 00 00 -ed +10 00 00 00 -12 00 -04 00 -80 -06 00 00 00 00 00 00 -9b 00 00 00 @@ -87654,7 +87725,8 @@ ed 00 00 00 -fe +00 +57 00 00 00 @@ -87662,63 +87734,51 @@ fe 00 04 00 -20 -07 -00 -00 +b0 +01 00 00 00 00 -2e 00 00 +d6 00 00 00 00 00 -12 -01 00 00 -12 -00 +fb 04 00 -50 -07 00 +10 00 00 00 00 00 -52 -05 00 00 00 00 00 00 -23 -01 00 00 -12 00 -04 00 -b0 -0c 00 00 00 00 +0c +05 00 00 -2b +10 00 00 00 @@ -87726,47 +87786,35 @@ b0 00 00 00 -34 -01 -00 -00 -12 -00 -04 -00 -e0 -0c 00 00 00 00 00 00 -17 00 00 00 00 00 00 +6e 00 -48 -01 00 00 12 00 04 00 -00 -0d +90 +02 00 00 00 00 00 00 -16 +d6 00 00 00 @@ -87774,23 +87822,19 @@ e0 00 00 00 -5c -01 +c5 +05 00 00 -12 +10 00 -04 00 -20 -0d 00 00 00 00 00 00 -2b 00 00 00 @@ -87798,95 +87842,75 @@ e0 00 00 00 -70 -01 00 00 -12 00 -04 -00 -50 -0d -00 -00 -00 -00 -00 -00 -1b 00 +85 00 00 00 +12 00 +04 00 +70 +03 00 -81 -01 00 00 -12 00 -04 00 -70 -0d 00 +d6 00 00 00 00 00 -4b 00 00 +7e +06 00 00 +10 00 00 00 -96 -01 00 00 -12 00 -04 00 -c0 -0d 00 00 00 00 00 00 -95 00 00 00 00 00 00 +9c 00 -aa -01 00 00 12 00 04 00 -60 -0e +50 +04 00 00 00 00 00 00 -48 +85 01 00 00 @@ -87894,143 +87918,119 @@ aa 00 00 00 -c1 -01 -00 +e1 +07 00 -12 00 -04 +10 00 -b0 -0f 00 00 00 00 00 00 -7d -02 00 00 00 00 00 00 -d7 -01 00 00 -12 -00 -04 00 -30 -12 00 00 00 +04 +08 00 00 +10 00 -21 -01 00 00 00 00 00 00 -ee -01 00 00 -12 00 -04 00 -60 -13 00 00 00 00 00 00 -e2 00 00 +18 +08 00 00 +10 00 00 00 -06 -02 00 00 -12 00 -04 00 -50 -14 00 00 00 00 00 00 -a0 00 00 00 00 00 00 +be 00 -18 -02 00 00 12 00 04 00 -f0 -14 +e0 +05 00 00 00 00 00 00 -2b -03 -00 +1f 00 00 00 00 00 -1d -02 00 00 -10 +d6 00 00 00 +12 00 +04 00 00 +06 00 00 00 00 00 00 +71 00 00 00 @@ -88038,8 +88038,8 @@ f0 00 00 00 -2e -02 +a5 +08 00 00 10 @@ -88062,47 +88062,47 @@ f0 00 00 00 -4d -02 -00 -00 -10 -00 -00 -00 -00 +ed 00 00 00 +12 00 +04 00 +80 +06 00 00 00 00 00 00 +9b 00 00 00 00 -70 -02 00 00 -10 00 +fe 00 00 00 +12 00 +04 00 +20 +07 00 00 00 00 00 00 +2e 00 00 00 @@ -88110,8 +88110,8 @@ f0 00 00 00 -82 -02 +9f +09 00 00 10 @@ -88134,32 +88134,32 @@ f0 00 00 00 -8f -02 -00 -00 -10 -00 -00 -00 +12 +01 00 00 +12 00 +04 00 +50 +07 00 00 00 00 00 00 +52 +05 00 00 00 00 00 00 -a9 -02 +4d +0b 00 00 10 @@ -88182,8 +88182,8 @@ a9 00 00 00 -b1 -02 +ee +0b 00 00 10 @@ -88206,8 +88206,8 @@ b1 00 00 00 -c6 -02 +05 +0c 00 00 10 @@ -88230,8 +88230,8 @@ c6 00 00 00 -d6 -02 +3e +0c 00 00 10 @@ -88254,8 +88254,8 @@ d6 00 00 00 -e4 -02 +57 +0c 00 00 10 @@ -88278,8 +88278,8 @@ e4 00 00 00 -eb -02 +75 +0c 00 00 10 @@ -88302,8 +88302,8 @@ eb 00 00 00 -fe -02 +ab +0c 00 00 10 @@ -88326,8 +88326,8 @@ fe 00 00 00 -11 -03 +cb +0c 00 00 10 @@ -88350,8 +88350,8 @@ fe 00 00 00 -24 -03 +25 +0d 00 00 10 @@ -88374,8 +88374,8 @@ fe 00 00 00 -34 -03 +48 +0d 00 00 10 @@ -88398,8 +88398,8 @@ fe 00 00 00 -48 -03 +66 +0d 00 00 10 @@ -88422,8 +88422,8 @@ fe 00 00 00 -5e -03 +84 +0d 00 00 10 @@ -88446,8 +88446,8 @@ fe 00 00 00 -6f -03 +9e +0d 00 00 10 @@ -88470,8 +88470,8 @@ fe 00 00 00 -7a -03 +bf +0d 00 00 10 @@ -88494,8 +88494,8 @@ fe 00 00 00 -8f -03 +e7 +0d 00 00 10 @@ -88518,8 +88518,8 @@ fe 00 00 00 -9e -03 +1c +0e 00 00 10 @@ -88542,37 +88542,23 @@ fe 00 00 00 -af -03 -00 -00 -10 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 +23 +01 00 00 +12 00 +04 00 +b0 +0c 00 00 -c2 -03 00 00 -10 00 00 +2b 00 00 00 @@ -88580,57 +88566,71 @@ c2 00 00 00 +34 +01 00 00 +12 00 +04 00 +e0 +0c 00 00 00 00 00 00 -d0 -03 +17 00 00 -10 00 00 00 00 00 +48 +01 00 00 +12 00 +04 00 00 +0d 00 00 00 00 00 00 +16 00 00 00 -e6 -03 00 00 -10 00 00 +5c +01 00 00 +12 00 +04 00 +20 +0d 00 00 00 00 00 00 +2b 00 00 00 @@ -88638,8 +88638,8 @@ e6 00 00 00 -f6 -03 +73 +0f 00 00 10 @@ -88662,23 +88662,23 @@ f6 00 00 00 -02 -04 -00 -00 -10 -00 -00 +70 +01 00 00 +12 00 +04 00 +50 +0d 00 00 00 00 00 00 +1b 00 00 00 @@ -88686,8 +88686,8 @@ f6 00 00 00 -15 -04 +b1 +0f 00 00 10 @@ -88710,20 +88710,23 @@ f6 00 00 00 -23 -04 -00 +81 +01 00 -10 00 +12 00 +04 00 +70 +0d 00 00 00 00 00 00 +4b 00 00 00 @@ -88731,40 +88734,35 @@ f6 00 00 00 +96 +01 00 00 +12 00 -31 04 00 -00 -10 -00 -00 -00 -00 -00 -00 -00 -00 +c0 +0d 00 00 00 00 00 00 +95 00 00 00 00 00 -3b -04 00 00 +9e 10 00 00 +10 00 00 00 @@ -88782,32 +88780,34 @@ f6 00 00 00 -4c -04 -00 -00 -10 -00 00 00 +aa +01 00 00 +12 00 +04 00 +60 +0e 00 00 00 00 00 00 +48 +01 00 00 00 00 00 00 -5c -04 +31 +12 00 00 10 @@ -88830,8 +88830,8 @@ f6 00 00 00 -6b -04 +79 +12 00 00 10 @@ -88854,32 +88854,32 @@ f6 00 00 00 -80 -04 -00 -00 -10 -00 -00 -00 +c1 +01 00 00 +12 00 +04 00 +b0 +0f 00 00 00 00 00 00 +7d +02 00 00 00 00 00 00 -92 -04 +a1 +13 00 00 10 @@ -88902,8 +88902,8 @@ f6 00 00 00 -a1 -04 +b9 +13 00 00 10 @@ -88926,8 +88926,8 @@ a1 00 00 00 -b0 -04 +2a +14 00 00 10 @@ -88950,8 +88950,8 @@ b0 00 00 00 -c6 -04 +58 +14 00 00 10 @@ -88974,71 +88974,71 @@ c6 00 00 00 -d4 -04 -00 -00 -10 +d7 +01 00 00 +12 00 +04 00 +30 +12 00 00 00 00 00 00 +21 +01 00 00 00 00 00 00 +ee +01 00 00 +12 00 -ec 04 00 -00 -10 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 +60 +13 00 00 00 00 00 00 +e2 00 00 00 -01 -05 00 00 -10 00 00 +06 +02 00 00 +12 00 +04 00 +50 +14 00 00 00 00 00 00 +a0 00 00 00 @@ -89046,8 +89046,8 @@ ec 00 00 00 +31 17 -05 00 00 10 @@ -89070,8 +89070,8 @@ ec 00 00 00 -1e -05 +49 +17 00 00 10 @@ -89094,32 +89094,32 @@ ec 00 00 00 -26 -05 -00 -00 -10 -00 -00 -00 +18 +02 00 00 +12 00 +04 00 +f0 +14 00 00 00 00 00 00 +2b +03 00 00 00 00 00 00 -37 -05 +46 +18 00 00 10 @@ -89142,8 +89142,8 @@ ec 00 00 00 -46 -05 +aa +18 00 00 10 @@ -89166,8 +89166,8 @@ ec 00 00 00 -4d -05 +fd +18 00 00 10 @@ -89190,8 +89190,8 @@ ec 00 00 00 -55 -05 +17 +19 00 00 10 @@ -89214,8 +89214,8 @@ ec 00 00 00 -5d -05 +1f +19 00 00 10 @@ -89238,8 +89238,8 @@ ec 00 00 00 -64 -05 +26 +19 00 00 10 @@ -89262,8 +89262,8 @@ ec 00 00 00 -6b -05 +62 +19 00 00 10 diff --git a/modules/dbgfmts/dwarf2/tests/passwin64/dwarfwin64_testhd.errwarn b/modules/dbgfmts/dwarf2/tests/passwin64/dwarfwin64_testhd.errwarn index c00bbe1e..d383da2a 100644 --- a/modules/dbgfmts/dwarf2/tests/passwin64/dwarfwin64_testhd.errwarn +++ b/modules/dbgfmts/dwarf2/tests/passwin64/dwarfwin64_testhd.errwarn @@ -4,6 +4,8 @@ -:10: warning: unrecognized section attribute: `M' -:10: warning: unrecognized section attribute: `S' -:10: warning: Unrecognized qualifier `progbits' +-:24: warning: directive `.type' not recognized +-:152: warning: directive `.size' not recognized -:153: warning: Unrecognized qualifier `progbits' -:190: warning: Unrecognized qualifier `progbits' -:232: warning: Unrecognized qualifier `progbits' diff --git a/modules/dbgfmts/null/null-dbgfmt.c b/modules/dbgfmts/null/null-dbgfmt.c index 9ddf776d..44766934 100644 --- a/modules/dbgfmts/null/null-dbgfmt.c +++ b/modules/dbgfmts/null/null-dbgfmt.c @@ -48,13 +48,6 @@ null_dbgfmt_destroy(/*@only@*/ yasm_dbgfmt *dbgfmt) yasm_xfree(dbgfmt); } -static int -null_dbgfmt_directive(yasm_object *object, const char *name, - yasm_valparamhead *valparams, unsigned long line) -{ - return 1; -} - static void null_dbgfmt_generate(yasm_object *object, yasm_linemap *linemap, yasm_errwarns *errwarns) @@ -66,8 +59,8 @@ null_dbgfmt_generate(yasm_object *object, yasm_linemap *linemap, yasm_dbgfmt_module yasm_null_LTX_dbgfmt = { "No debugging info", "null", + NULL, /* no directives */ null_dbgfmt_create, null_dbgfmt_destroy, - null_dbgfmt_directive, null_dbgfmt_generate }; diff --git a/modules/dbgfmts/stabs/stabs-dbgfmt.c b/modules/dbgfmts/stabs/stabs-dbgfmt.c index 5bf6b8ad..1942d4b1 100644 --- a/modules/dbgfmts/stabs/stabs-dbgfmt.c +++ b/modules/dbgfmts/stabs/stabs-dbgfmt.c @@ -499,19 +499,12 @@ stabs_bc_str_calc_len(yasm_bytecode *bc, yasm_bc_add_span_func add_span, return 0; } -static int -stabs_dbgfmt_directive(yasm_object *object, const char *name, - yasm_valparamhead *valparams, unsigned long line) -{ - return 1; -} - /* Define dbgfmt structure -- see dbgfmt.h for details */ yasm_dbgfmt_module yasm_stabs_LTX_dbgfmt = { "Stabs debugging format", "stabs", + NULL, /* no directives */ stabs_dbgfmt_create, stabs_dbgfmt_destroy, - stabs_dbgfmt_directive, stabs_dbgfmt_generate }; diff --git a/modules/objfmts/bin/bin-objfmt.c b/modules/objfmts/bin/bin-objfmt.c index b98ac63a..b3b12628 100644 --- a/modules/objfmts/bin/bin-objfmt.c +++ b/modules/objfmts/bin/bin-objfmt.c @@ -85,6 +85,7 @@ bin_objfmt_align_section(yasm_section *sect, yasm_section *prevsect, typedef struct bin_objfmt_output_info { yasm_object *object; + yasm_errwarns *errwarns; /*@dependent@*/ FILE *f; /*@only@*/ unsigned char *buf; /*@observer@*/ const yasm_section *sect; @@ -252,6 +253,29 @@ bin_objfmt_output_bytecode(yasm_bytecode *bc, /*@null@*/ void *d) return 0; } +static int +bin_objfmt_check_sym(yasm_symrec *sym, /*@null@*/ void *d) +{ + /*@null@*/ bin_objfmt_output_info *info = (bin_objfmt_output_info *)d; + yasm_sym_vis vis = yasm_symrec_get_visibility(sym); + assert(info != NULL); + + if (vis & YASM_SYM_EXTERN) { + yasm_warn_set(YASM_WARN_GENERAL, + N_("binary object format does not support extern variables")); + yasm_errwarn_propagate(info->errwarns, yasm_symrec_get_decl_line(sym)); + } else if (vis & YASM_SYM_GLOBAL) { + yasm_warn_set(YASM_WARN_GENERAL, + N_("binary object format does not support global variables")); + yasm_errwarn_propagate(info->errwarns, yasm_symrec_get_decl_line(sym)); + } else if (vis & YASM_SYM_COMMON) { + yasm_error_set(YASM_ERROR_TYPE, + N_("binary object format does not support common variables")); + yasm_errwarn_propagate(info->errwarns, yasm_symrec_get_decl_line(sym)); + } + return 0; +} + static void bin_objfmt_output(yasm_object *object, FILE *f, /*@unused@*/ int all_syms, yasm_errwarns *errwarns) @@ -266,9 +290,13 @@ bin_objfmt_output(yasm_object *object, FILE *f, /*@unused@*/ int all_syms, bin_objfmt_output_info info; info.object = object; + info.errwarns = errwarns; info.f = f; info.buf = yasm_xmalloc(REGULAR_OUTBUF_SIZE); + /* Check symbol table */ + yasm_symtab_traverse(object->symtab, &info, bin_objfmt_check_sym); + text = yasm_object_find_general(object, ".text"); data = yasm_object_find_general(object, ".data"); bss = yasm_object_find_general(object, ".bss"); @@ -467,96 +495,45 @@ bin_objfmt_section_switch(yasm_object *object, yasm_valparamhead *valparams, return NULL; } -static yasm_symrec * -bin_objfmt_extern_declare(yasm_object *object, const char *name, - /*@unused@*/ /*@null@*/ - yasm_valparamhead *objext_valparams, - unsigned long line) -{ - yasm_symrec *sym; - - yasm_warn_set(YASM_WARN_GENERAL, - N_("binary object format does not support extern variables")); - - sym = yasm_symtab_declare(object->symtab, name, YASM_SYM_EXTERN, line); - return sym; -} - -static yasm_symrec * -bin_objfmt_global_declare(yasm_object *object, const char *name, - /*@unused@*/ /*@null@*/ - yasm_valparamhead *objext_valparams, - unsigned long line) -{ - yasm_symrec *sym; - - yasm_warn_set(YASM_WARN_GENERAL, - N_("binary object format does not support global variables")); - - sym = yasm_symtab_declare(object->symtab, name, YASM_SYM_GLOBAL, line); - return sym; -} - -static yasm_symrec * -bin_objfmt_common_declare(yasm_object *object, const char *name, - /*@only@*/ yasm_expr *size, /*@unused@*/ /*@null@*/ - yasm_valparamhead *objext_valparams, - unsigned long line) -{ - yasm_symrec *sym; - - yasm_expr_destroy(size); - yasm_error_set(YASM_ERROR_TYPE, - N_("binary object format does not support common variables")); - - sym = yasm_symtab_declare(object->symtab, name, YASM_SYM_COMMON, line); - return sym; -} - -static int -bin_objfmt_directive(yasm_object *object, const char *name, - /*@null@*/ yasm_valparamhead *valparams, - /*@unused@*/ /*@null@*/ - yasm_valparamhead *objext_valparams, unsigned long line) +static void +bin_objfmt_dir_org(yasm_object *object, + /*@null@*/ yasm_valparamhead *valparams, + /*@unused@*/ /*@null@*/ + yasm_valparamhead *objext_valparams, unsigned long line) { yasm_section *sect; yasm_valparam *vp; - if (yasm__strcasecmp(name, "org") == 0) { - /*@null@*/ yasm_expr *start = NULL; - - if (!valparams) { - yasm_error_set(YASM_ERROR_SYNTAX, N_("[%s] requires an argument"), - "ORG"); - return 0; - } + /*@null@*/ yasm_expr *start = NULL; - /* ORG takes just a simple integer as param */ - vp = yasm_vps_first(valparams); - if (vp->val) - start = yasm_expr_create_ident(yasm_expr_sym(yasm_symtab_use( - object->symtab, vp->val, line)), line); - else if (vp->param) { - start = vp->param; - vp->param = NULL; /* Don't let valparams delete it */ - } + if (!valparams) { + yasm_error_set(YASM_ERROR_SYNTAX, N_("[%s] requires an argument"), + "ORG"); + return; + } - if (!start) { - yasm_error_set(YASM_ERROR_SYNTAX, - N_("argument to ORG must be expression")); - return 0; - } + /* ORG takes just a simple integer as param */ + vp = yasm_vps_first(valparams); + if (vp->val) + start = yasm_expr_create_ident(yasm_expr_sym(yasm_symtab_use( + object->symtab, vp->val, line)), line); + else if (vp->param) { + start = vp->param; + vp->param = NULL; /* Don't let valparams delete it */ + } - /* ORG changes the start of the .text section */ - sect = yasm_object_find_general(object, ".text"); - if (!sect) - yasm_internal_error( - N_("bin objfmt: .text section does not exist before ORG is called?")); - yasm_section_set_start(sect, start, line); + if (!start) { + yasm_error_set(YASM_ERROR_SYNTAX, + N_("argument to ORG must be expression")); + return; + } - return 0; /* directive recognized */ - } else - return 1; /* directive unrecognized */ + /* ORG changes the start of the .text section */ + sect = yasm_object_find_general(object, ".text"); + if (!sect) + yasm_internal_error( + N_("bin objfmt: .text section does not exist before ORG is called?")); + yasm_section_set_start(sect, start, line); } @@ -566,6 +543,11 @@ static const char *bin_objfmt_dbgfmt_keywords[] = { NULL }; +static const yasm_directive bin_objfmt_directives[] = { + { "org", "nasm", bin_objfmt_dir_org, YASM_DIR_ARG_REQUIRED }, + { NULL, NULL, NULL, 0 } +}; + /* Define objfmt structure -- see objfmt.h for details */ yasm_objfmt_module yasm_bin_LTX_objfmt = { "Flat format binary", @@ -574,13 +556,10 @@ yasm_objfmt_module yasm_bin_LTX_objfmt = { 16, bin_objfmt_dbgfmt_keywords, "null", + bin_objfmt_directives, bin_objfmt_create, bin_objfmt_output, bin_objfmt_destroy, bin_objfmt_add_default_section, - bin_objfmt_section_switch, - bin_objfmt_extern_declare, - bin_objfmt_global_declare, - bin_objfmt_common_declare, - bin_objfmt_directive + bin_objfmt_section_switch }; diff --git a/modules/objfmts/coff/coff-objfmt.c b/modules/objfmts/coff/coff-objfmt.c index feb790af..c93e8eaf 100644 --- a/modules/objfmts/coff/coff-objfmt.c +++ b/modules/objfmts/coff/coff-objfmt.c @@ -168,8 +168,6 @@ typedef struct coff_symrec_data { unsigned long index; /* assigned COFF symbol table index */ coff_symrec_sclass sclass; /* storage class */ - /*@owned@*/ /*@null@*/ yasm_expr *size; /* size if COMMON declaration */ - int numaux; /* number of auxiliary entries */ coff_symtab_auxtype auxtype; /* type of aux entries */ coff_symtab_auxent aux[1]; /* actually may be any size (including 0) */ @@ -230,8 +228,7 @@ yasm_objfmt_module yasm_win64_LTX_objfmt; static /*@dependent@*/ coff_symrec_data * coff_objfmt_sym_set_data(yasm_symrec *sym, coff_symrec_sclass sclass, - /*@only@*/ /*@null@*/ yasm_expr *size, int numaux, - coff_symtab_auxtype auxtype) + int numaux, coff_symtab_auxtype auxtype) { coff_symrec_data *sym_data; @@ -239,7 +236,6 @@ coff_objfmt_sym_set_data(yasm_symrec *sym, coff_symrec_sclass sclass, (numaux-1)*sizeof(coff_symtab_auxent)); sym_data->index = 0; sym_data->sclass = sclass; - sym_data->size = size; sym_data->numaux = numaux; sym_data->auxtype = auxtype; @@ -266,7 +262,7 @@ coff_common_create(yasm_object *object) filesym = yasm_symtab_define_special(object->symtab, ".file", YASM_SYM_GLOBAL); objfmt_coff->filesym_data = - coff_objfmt_sym_set_data(filesym, COFF_SCL_FILE, NULL, 1, + coff_objfmt_sym_set_data(filesym, COFF_SCL_FILE, 1, COFF_SYMTAB_AUX_FILE); /* Filename is set in coff_objfmt_output */ objfmt_coff->filesym_data->aux[0].fname = NULL; @@ -376,8 +372,7 @@ coff_objfmt_init_new_section(yasm_object *object, yasm_section *sect, sym = yasm_symtab_define_label(object->symtab, sectname, yasm_section_bcs_first(sect), 1, line); yasm_symrec_declare(sym, YASM_SYM_GLOBAL, line); - coff_objfmt_sym_set_data(sym, COFF_SCL_STAT, NULL, 1, - COFF_SYMTAB_AUX_SECT); + coff_objfmt_sym_set_data(sym, COFF_SCL_STAT, 1, COFF_SYMTAB_AUX_SECT); data->sym = sym; return data; } @@ -506,11 +501,14 @@ coff_objfmt_output_value(yasm_value *value, unsigned char *buf, /* In standard COFF, COMMON symbols have their length added in */ if (!objfmt_coff->win32) { /*@dependent@*/ /*@null@*/ coff_symrec_data *csymd; + /*@dependent@*/ /*@null@*/ yasm_expr **csize_expr; /*@dependent@*/ /*@null@*/ yasm_intnum *common_size; csymd = yasm_symrec_get_data(sym, &coff_symrec_data_cb); assert(csymd != NULL); - common_size = yasm_expr_get_intnum(&csymd->size, 1); + csize_expr = yasm_symrec_get_common_size(sym); + assert(csize_expr != NULL); + common_size = yasm_expr_get_intnum(csize_expr, 1); if (!common_size) { yasm_error_set(YASM_ERROR_TOO_COMPLEX, N_("coff: common size too complex")); @@ -942,13 +940,20 @@ static int coff_objfmt_count_sym(yasm_symrec *sym, /*@null@*/ void *d) { /*@null@*/ coff_objfmt_output_info *info = (coff_objfmt_output_info *)d; + yasm_sym_vis vis = yasm_symrec_get_visibility(sym); + coff_symrec_data *sym_data; + assert(info != NULL); - if (info->all_syms || yasm_symrec_get_visibility(sym) != YASM_SYM_LOCAL) { + + sym_data = yasm_symrec_get_data(sym, &coff_symrec_data_cb); + if ((vis & (YASM_SYM_EXTERN|YASM_SYM_GLOBAL|YASM_SYM_COMMON)) && !sym_data) + sym_data = coff_objfmt_sym_set_data(sym, COFF_SCL_EXT, 0, + COFF_SYMTAB_AUX_NONE); + + if (info->all_syms || vis != YASM_SYM_LOCAL) { /* Save index in symrec data */ - coff_symrec_data *sym_data = - yasm_symrec_get_data(sym, &coff_symrec_data_cb); if (!sym_data) { - sym_data = coff_objfmt_sym_set_data(sym, COFF_SCL_STAT, NULL, 0, + sym_data = coff_objfmt_sym_set_data(sym, COFF_SCL_STAT, 0, COFF_SYMTAB_AUX_NONE); } sym_data->index = info->indx; @@ -1042,11 +1047,15 @@ coff_objfmt_output_sym(yasm_symrec *sym, /*@null@*/ void *d) scnum = 0xffff; /* -1 = absolute symbol */ } else { if (vis & YASM_SYM_COMMON) { - intn = yasm_expr_get_intnum(&csymd->size, 1); + /*@dependent@*/ /*@null@*/ yasm_expr **csize_expr; + csize_expr = yasm_symrec_get_common_size(sym); + assert(csize_expr != NULL); + intn = yasm_expr_get_intnum(csize_expr, 1); if (!intn) { yasm_error_set(YASM_ERROR_NOT_CONSTANT, N_("COMMON data size not an integer expression")); - yasm_errwarn_propagate(info->errwarns, csymd->size->line); + yasm_errwarn_propagate(info->errwarns, + (*csize_expr)->line); } else value = yasm_intnum_get_uint(intn); scnum = 0; @@ -1630,55 +1639,9 @@ coff_section_data_print(void *data, FILE *f, int indent_level) fprintf(f, "%*srelocs:\n", indent_level, ""); } -static yasm_symrec * -coff_objfmt_extern_declare(yasm_object *object, const char *name, /*@unused@*/ - /*@null@*/ yasm_valparamhead *objext_valparams, - unsigned long line) -{ - yasm_symrec *sym; - - sym = yasm_symtab_declare(object->symtab, name, YASM_SYM_EXTERN, line); - coff_objfmt_sym_set_data(sym, COFF_SCL_EXT, NULL, 0, - COFF_SYMTAB_AUX_NONE); - - return sym; -} - -static yasm_symrec * -coff_objfmt_global_declare(yasm_object *object, const char *name, /*@unused@*/ - /*@null@*/ yasm_valparamhead *objext_valparams, - unsigned long line) -{ - yasm_symrec *sym; - - sym = yasm_symtab_declare(object->symtab, name, YASM_SYM_GLOBAL, line); - coff_objfmt_sym_set_data(sym, COFF_SCL_EXT, NULL, 0, - COFF_SYMTAB_AUX_NONE); - - return sym; -} - -static yasm_symrec * -coff_objfmt_common_declare(yasm_object *object, const char *name, - /*@only@*/ yasm_expr *size, /*@unused@*/ /*@null@*/ - yasm_valparamhead *objext_valparams, - unsigned long line) -{ - yasm_symrec *sym; - - sym = yasm_symtab_declare(object->symtab, name, YASM_SYM_COMMON, line); - coff_objfmt_sym_set_data(sym, COFF_SCL_EXT, size, 0, - COFF_SYMTAB_AUX_NONE); - - return sym; -} - static void coff_symrec_data_destroy(void *data) { - coff_symrec_data *csymd = (coff_symrec_data *)data; - if (csymd->size) - yasm_expr_destroy(csymd->size); yasm_xfree(data); } @@ -1689,17 +1652,11 @@ coff_symrec_data_print(void *data, FILE *f, int indent_level) fprintf(f, "%*ssymtab index=%lu\n", indent_level, "", csd->index); fprintf(f, "%*ssclass=%d\n", indent_level, "", csd->sclass); - fprintf(f, "%*ssize=", indent_level, ""); - if (csd->size) - yasm_expr_print(csd->size, f); - else - fprintf(f, "nil"); - fprintf(f, "\n"); } static void dir_export(yasm_object *object, yasm_valparamhead *valparams, - unsigned long line) + yasm_valparamhead *objext_valparams, unsigned long line) { yasm_valparam *vp; int isnew; @@ -1740,7 +1697,7 @@ dir_export(yasm_object *object, yasm_valparamhead *valparams, static void dir_ident(yasm_object *object, yasm_valparamhead *valparams, - unsigned long line) + yasm_valparamhead *objext_valparams, unsigned long line) { yasm_objfmt_coff *objfmt_coff = (yasm_objfmt_coff *)object->objfmt; yasm_valparamhead sect_vps; @@ -1749,7 +1706,13 @@ dir_ident(yasm_object *object, yasm_valparamhead *valparams, const char *sectname; yasm_valparam *vp, *vp2; + /* Accept, but do nothing with empty ident */ + if (!valparams) + return; + vp = yasm_vps_first(valparams); + if (!vp) + return; if (objfmt_coff->win32) { /* Put ident data into .comment section for COFF, or .rdata$zzz @@ -1788,59 +1751,9 @@ dir_ident(yasm_object *object, yasm_valparamhead *valparams, yasm_bc_create_data(&dvs, 1, 1, object->arch, line)); } -static int -coff_objfmt_directive(yasm_object *object, const char *name, - /*@null@*/ yasm_valparamhead *valparams, - /*@unused@*/ /*@null@*/ - yasm_valparamhead *objext_valparams, - unsigned long line) -{ - if (yasm__strcasecmp(name, "IDENT") == 0) { - if (!valparams) { - yasm_error_set(YASM_ERROR_SYNTAX, N_("[%s] requires an argument"), - "IDENT"); - return 0; - } - dir_ident(object, valparams, line); - return 0; - } - return 1; -} - -static int -win32_objfmt_directive(yasm_object *object, const char *name, - /*@null@*/ yasm_valparamhead *valparams, - /*@unused@*/ /*@null@*/ - yasm_valparamhead *objext_valparams, - unsigned long line) -{ - static const struct { - const char *name; - int required_arg; - void (*func) (yasm_object *, yasm_valparamhead *, unsigned long); - } dirs[] = { - {"EXPORT", 1, dir_export}, - {"IDENT", 1, dir_ident} - }; - size_t i; - - for (i=0; iobjfmt; yasm_valparam *vp = yasm_vps_first(valparams); @@ -1902,7 +1815,7 @@ get_curpos(yasm_object *object, unsigned long line) static void dir_pushreg(yasm_object *object, yasm_valparamhead *valparams, - unsigned long line) + yasm_valparamhead *objext_valparams, unsigned long line) { yasm_objfmt_coff *objfmt_coff = (yasm_objfmt_coff *)object->objfmt; yasm_valparam *vp = yasm_vps_first(valparams); @@ -1931,7 +1844,7 @@ dir_pushreg(yasm_object *object, yasm_valparamhead *valparams, static void dir_setframe(yasm_object *object, yasm_valparamhead *valparams, - unsigned long line) + yasm_valparamhead *objext_valparams, unsigned long line) { yasm_objfmt_coff *objfmt_coff = (yasm_objfmt_coff *)object->objfmt; yasm_valparam *vp = yasm_vps_first(valparams); @@ -1971,7 +1884,7 @@ dir_setframe(yasm_object *object, yasm_valparamhead *valparams, static void dir_allocstack(yasm_object *object, yasm_valparamhead *valparams, - unsigned long line) + yasm_valparamhead *objext_valparams, unsigned long line) { yasm_objfmt_coff *objfmt_coff = (yasm_objfmt_coff *)object->objfmt; yasm_valparam *vp = yasm_vps_first(valparams); @@ -2054,21 +1967,21 @@ dir_save_common(yasm_object *object, yasm_valparamhead *valparams, static void dir_savereg(yasm_object *object, yasm_valparamhead *valparams, - unsigned long line) + yasm_valparamhead *objext_valparams, unsigned long line) { dir_save_common(object, valparams, line, "SAVEREG", UWOP_SAVE_NONVOL); } static void dir_savexmm128(yasm_object *object, yasm_valparamhead *valparams, - unsigned long line) + yasm_valparamhead *objext_valparams, unsigned long line) { dir_save_common(object, valparams, line, "SAVEXMM128", UWOP_SAVE_XMM128); } static void dir_pushframe(yasm_object *object, /*@null@*/ yasm_valparamhead *valparams, - unsigned long line) + yasm_valparamhead *objext_valparams, unsigned long line) { yasm_objfmt_coff *objfmt_coff = (yasm_objfmt_coff *)object->objfmt; yasm_valparam *vp = yasm_vps_first(valparams); @@ -2091,7 +2004,7 @@ dir_pushframe(yasm_object *object, /*@null@*/ yasm_valparamhead *valparams, static void dir_endprolog(yasm_object *object, /*@null@*/ yasm_valparamhead *valparams, - unsigned long line) + yasm_valparamhead *objext_valparams, unsigned long line) { yasm_objfmt_coff *objfmt_coff = (yasm_objfmt_coff *)object->objfmt; if (!procframe_checkstate(objfmt_coff, "ENDPROLOG")) @@ -2103,7 +2016,7 @@ dir_endprolog(yasm_object *object, /*@null@*/ yasm_valparamhead *valparams, static void dir_endproc_frame(yasm_object *object, /*@null@*/ yasm_valparamhead *valparams, - unsigned long line) + yasm_valparamhead *objext_valparams, unsigned long line) { yasm_objfmt_coff *objfmt_coff = (yasm_objfmt_coff *)object->objfmt; yasm_section *sect; @@ -2191,47 +2104,6 @@ dir_endproc_frame(yasm_object *object, /*@null@*/ yasm_valparamhead *valparams, objfmt_coff->done_prolog = 0; } -static int -win64_objfmt_directive(yasm_object *object, const char *name, - /*@null@*/ yasm_valparamhead *valparams, - /*@unused@*/ /*@null@*/ - yasm_valparamhead *objext_valparams, - unsigned long line) -{ - static const struct { - const char *name; - int required_arg; - void (*func) (yasm_object *, yasm_valparamhead *, unsigned long); - } dirs[] = { - {"EXPORT", 1, dir_export}, - {"IDENT", 1, dir_ident}, - {"PROC_FRAME", 0, dir_proc_frame}, - {"PUSHREG", 1, dir_pushreg}, - {"SETFRAME", 1, dir_setframe}, - {"ALLOCSTACK", 1, dir_allocstack}, - {"SAVEREG", 1, dir_savereg}, - {"SAVEXMM128", 1, dir_savexmm128}, - {"PUSHFRAME", 0, dir_pushframe}, - {"ENDPROLOG", 0, dir_endprolog}, - {"ENDPROC_FRAME", 0, dir_endproc_frame} - }; - size_t i; - - for (i=0; icodes, link) { codebc = yasm_bc_create_common(&win64_uwcode_bc_callback, code, - yasm_symrec_get_line(code->loc)); + yasm_symrec_get_def_line(code->loc)); yasm_section_bcs_append(xdata, codebc); } @@ -259,7 +259,7 @@ win64_uwinfo_bc_expand(yasm_bytecode *bc, int span, long old_val, long new_val, coff_unwind_info *info = (coff_unwind_info *)bc->contents; switch (span) { case 1: - yasm_error_set_xref(yasm_symrec_get_line(info->prolog), + yasm_error_set_xref(yasm_symrec_get_def_line(info->prolog), N_("prologue ended here")); yasm_error_set(YASM_ERROR_VALUE, N_("prologue %ld bytes, must be <256"), new_val); diff --git a/modules/objfmts/dbg/dbg-objfmt.c b/modules/objfmts/dbg/dbg-objfmt.c index e65c2510..5017cb85 100644 --- a/modules/objfmts/dbg/dbg-objfmt.c +++ b/modules/objfmts/dbg/dbg-objfmt.c @@ -144,79 +144,6 @@ dbg_objfmt_section_switch(yasm_object *object, yasm_valparamhead *valparams, } } -static yasm_symrec * -dbg_objfmt_extern_declare(yasm_object *object, const char *name, - /*@unused@*/ /*@null@*/ - yasm_valparamhead *objext_valparams, - unsigned long line) -{ - yasm_objfmt_dbg *objfmt_dbg = (yasm_objfmt_dbg *)object->objfmt; - yasm_symrec *sym; - - fprintf(objfmt_dbg->dbgfile, "extern_declare(\"%s\", ", name); - yasm_vps_print(objext_valparams, objfmt_dbg->dbgfile); - fprintf(objfmt_dbg->dbgfile, ", %lu), returning sym\n", line); - - sym = yasm_symtab_declare(object->symtab, name, YASM_SYM_EXTERN, line); - return sym; -} - -static yasm_symrec * -dbg_objfmt_global_declare(yasm_object *object, const char *name, - /*@unused@*/ /*@null@*/ - yasm_valparamhead *objext_valparams, - unsigned long line) -{ - yasm_objfmt_dbg *objfmt_dbg = (yasm_objfmt_dbg *)object->objfmt; - yasm_symrec *sym; - - fprintf(objfmt_dbg->dbgfile, "global_declare(\"%s\", ", name); - yasm_vps_print(objext_valparams, objfmt_dbg->dbgfile); - fprintf(objfmt_dbg->dbgfile, ", %lu), returning sym\n", line); - - sym = yasm_symtab_declare(object->symtab, name, YASM_SYM_GLOBAL, line); - return sym; -} - -static yasm_symrec * -dbg_objfmt_common_declare(yasm_object *object, const char *name, - /*@only@*/ yasm_expr *size, - /*@unused@*/ /*@null@*/ - yasm_valparamhead *objext_valparams, - unsigned long line) -{ - yasm_objfmt_dbg *objfmt_dbg = (yasm_objfmt_dbg *)object->objfmt; - yasm_symrec *sym; - - assert(objfmt_dbg->dbgfile != NULL); - fprintf(objfmt_dbg->dbgfile, "common_declare(\"%s\", ", name); - yasm_expr_print(size, objfmt_dbg->dbgfile); - fprintf(objfmt_dbg->dbgfile, ", "); - yasm_vps_print(objext_valparams, objfmt_dbg->dbgfile); - fprintf(objfmt_dbg->dbgfile, ", %lu), returning sym\n", line); - yasm_expr_destroy(size); - - - sym = yasm_symtab_declare(object->symtab, name, YASM_SYM_COMMON, line); - return sym; -} - -static int -dbg_objfmt_directive(yasm_object *object, const char *name, - /*@null@*/ yasm_valparamhead *valparams, - /*@null@*/ yasm_valparamhead *objext_valparams, - unsigned long line) -{ - yasm_objfmt_dbg *objfmt_dbg = (yasm_objfmt_dbg *)object->objfmt; - fprintf(objfmt_dbg->dbgfile, "directive(\"%s\", ", name); - yasm_vps_print(valparams, objfmt_dbg->dbgfile); - fprintf(objfmt_dbg->dbgfile, ", "); - yasm_vps_print(objext_valparams, objfmt_dbg->dbgfile); - fprintf(objfmt_dbg->dbgfile, ", %lu), returning 0 (recognized)\n", line); - return 0; /* dbg format "recognizes" all directives */ -} - - /* Define valid debug formats to use with this object format */ static const char *dbg_objfmt_dbgfmt_keywords[] = { "null", @@ -231,13 +158,10 @@ yasm_objfmt_module yasm_dbg_LTX_objfmt = { 32, dbg_objfmt_dbgfmt_keywords, "null", + NULL, /* no directives */ dbg_objfmt_create, dbg_objfmt_output, dbg_objfmt_destroy, dbg_objfmt_add_default_section, - dbg_objfmt_section_switch, - dbg_objfmt_extern_declare, - dbg_objfmt_global_declare, - dbg_objfmt_common_declare, - dbg_objfmt_directive + dbg_objfmt_section_switch }; diff --git a/modules/objfmts/elf/elf-objfmt.c b/modules/objfmts/elf/elf-objfmt.c index 19dc5996..70b0f835 100644 --- a/modules/objfmts/elf/elf-objfmt.c +++ b/modules/objfmts/elf/elf-objfmt.c @@ -75,8 +75,9 @@ typedef struct { typedef struct { yasm_objfmt_elf *objfmt_elf; + yasm_errwarns *errwarns; int local_names; -} append_local_sym_info; +} build_symtab_info; yasm_objfmt_module yasm_elf_LTX_objfmt; yasm_objfmt_module yasm_elf32_LTX_objfmt; @@ -89,38 +90,170 @@ elf_objfmt_symtab_append(yasm_objfmt_elf *objfmt_elf, yasm_symrec *sym, elf_symbol_type type, elf_symbol_vis vis, yasm_expr *size, elf_address *value) { - /* Only append to table if not already appended */ elf_symtab_entry *entry = yasm_symrec_get_data(sym, &elf_symrec_data); - if (!entry || !elf_sym_in_table(entry)) { - if (!entry) { - elf_strtab_entry *name = - elf_strtab_append_str(objfmt_elf->strtab, - yasm_symrec_get_name(sym)); - entry = elf_symtab_entry_create(name, sym); - } - elf_symtab_append_entry(objfmt_elf->elf_symtab, entry); + + if (!entry) { + elf_strtab_entry *name = + elf_strtab_append_str(objfmt_elf->strtab, + yasm_symrec_get_name(sym)); + entry = elf_symtab_entry_create(name, sym); yasm_symrec_add_data(sym, &elf_symrec_data, entry); } + /* Only append to table if not already appended */ + if (!elf_sym_in_table(entry)) + elf_symtab_append_entry(objfmt_elf->elf_symtab, entry); + elf_symtab_set_nonzero(entry, NULL, sectidx, bind, type, size, value); elf_sym_set_visibility(entry, vis); return entry; } +static elf_symtab_entry * +build_extern(yasm_objfmt_elf *objfmt_elf, yasm_symrec *sym) +{ + yasm_valparamhead *objext_valparams = + yasm_symrec_get_objext_valparams(sym); + + if (objext_valparams) { + yasm_valparam *vp = yasm_vps_first(objext_valparams); + for (; vp; vp = yasm_vps_next(vp)) { + if (vp->val) + yasm_error_set(YASM_ERROR_TYPE, + N_("unrecognized symbol type `%s'"), vp->val); + } + } + + return elf_objfmt_symtab_append(objfmt_elf, sym, SHN_UNDEF, STB_GLOBAL, 0, + STV_DEFAULT, NULL, NULL); +} + +static elf_symtab_entry * +build_global(yasm_objfmt_elf *objfmt_elf, yasm_symrec *sym) +{ + yasm_valparamhead *objext_valparams = + yasm_symrec_get_objext_valparams(sym); + elf_symbol_type type = 0; + yasm_expr *size = NULL; + elf_symbol_vis vis = STV_DEFAULT; + unsigned int vis_overrides = 0; + + if (objext_valparams) { + yasm_valparam *vp = yasm_vps_first(objext_valparams); + for (; vp; vp = yasm_vps_next(vp)) + { + if (vp->val) { + if (yasm__strcasecmp(vp->val, "function") == 0) + type = STT_FUNC; + else if (yasm__strcasecmp(vp->val, "data") == 0 || + yasm__strcasecmp(vp->val, "object") == 0) + type = STT_OBJECT; + else if (yasm__strcasecmp(vp->val, "internal") == 0) { + vis = STV_INTERNAL; + vis_overrides++; + } + else if (yasm__strcasecmp(vp->val, "hidden") == 0) { + vis = STV_HIDDEN; + vis_overrides++; + } + else if (yasm__strcasecmp(vp->val, "protected") == 0) { + vis = STV_PROTECTED; + vis_overrides++; + } + else + yasm_error_set(YASM_ERROR_TYPE, + N_("unrecognized symbol type `%s'"), + vp->val); + } + else if (vp->param && !size) { + size = vp->param; + vp->param = NULL; /* to avoid double-free of expr */ + } + } + if (vis_overrides > 1) { + yasm_warn_set(YASM_WARN_GENERAL, + N_("More than one symbol visibility provided; using last")); + } + } + + return elf_objfmt_symtab_append(objfmt_elf, sym, SHN_UNDEF, STB_GLOBAL, + type, vis, size, NULL); +} + +static /*@null@*/ elf_symtab_entry * +build_common(yasm_objfmt_elf *objfmt_elf, yasm_symrec *sym) +{ + yasm_expr **size = yasm_symrec_get_common_size(sym); + yasm_valparamhead *objext_valparams = + yasm_symrec_get_objext_valparams(sym); + unsigned long addralign = 0; + + if (objext_valparams) { + yasm_valparam *vp = yasm_vps_first(objext_valparams); + for (; vp; vp = yasm_vps_next(vp)) { + if (!vp->val && vp->param) { + /*@dependent@*/ /*@null@*/ const yasm_intnum *align_expr; + + align_expr = yasm_expr_get_intnum(&vp->param, 0); + if (!align_expr) { + yasm_error_set(YASM_ERROR_VALUE, + N_("alignment constraint is not an integer")); + return NULL; + } + addralign = yasm_intnum_get_uint(align_expr); + + /* Alignments must be a power of two. */ + if (!is_exp2(addralign)) { + yasm_error_set(YASM_ERROR_VALUE, + N_("alignment constraint is not a power of two")); + return NULL; + } + } else if (vp->val) + yasm_warn_set(YASM_WARN_GENERAL, + N_("Unrecognized qualifier `%s'"), vp->val); + } + } + + return elf_objfmt_symtab_append(objfmt_elf, sym, SHN_COMMON, STB_GLOBAL, + 0, STV_DEFAULT, *size, &addralign); +} + static int -elf_objfmt_append_local_sym(yasm_symrec *sym, /*@null@*/ void *d) +elf_objfmt_build_symtab(yasm_symrec *sym, /*@null@*/ void *d) { - append_local_sym_info *info = (append_local_sym_info *)d; - elf_symtab_entry *entry; + build_symtab_info *info = (build_symtab_info *)d; + yasm_sym_vis vis = yasm_symrec_get_visibility(sym); + yasm_sym_status status = yasm_symrec_get_status(sym); + elf_symtab_entry *entry = yasm_symrec_get_data(sym, &elf_symrec_data); elf_address value=0; yasm_section *sect=NULL; yasm_bytecode *precbc=NULL; assert(info != NULL); + if (vis & YASM_SYM_EXTERN) { + entry = build_extern(info->objfmt_elf, sym); + yasm_errwarn_propagate(info->errwarns, + yasm_symrec_get_decl_line(sym)); + return 0; + } + + if (vis & YASM_SYM_COMMON) { + entry = build_common(info->objfmt_elf, sym); + yasm_errwarn_propagate(info->errwarns, + yasm_symrec_get_decl_line(sym)); + /* If the COMMON variable was actually defined, fall through. */ + if (!(status & YASM_SYM_DEFINED)) + return 0; + } + + /* Ignore any undefined at this point. */ + if (!(status & YASM_SYM_DEFINED)) + return 0; + if (!yasm_symrec_get_label(sym, &precbc)) { - if (!yasm_symrec_is_abs(sym)) /* let absolute symbol into output */ + if (!yasm_symrec_get_equ(sym) && !yasm_symrec_is_abs(sym)) return 0; precbc = NULL; } @@ -128,25 +261,44 @@ elf_objfmt_append_local_sym(yasm_symrec *sym, /*@null@*/ void *d) if (precbc) sect = yasm_bc_get_section(precbc); - entry = yasm_symrec_get_data(sym, &elf_symrec_data); - if (!entry || !elf_sym_in_table(entry)) { + if (entry && elf_sym_in_table(entry)) + ; + else if (vis & YASM_SYM_GLOBAL) { + entry = build_global(info->objfmt_elf, sym); + yasm_errwarn_propagate(info->errwarns, yasm_symrec_get_decl_line(sym)); + } else { int is_sect = 0; + + /* Locals (except when debugging) do not need to be + * in the symbol table, unless they're a section. + */ if (sect && !yasm_section_is_absolute(sect) && strcmp(yasm_symrec_get_name(sym), yasm_section_get_name(sect))==0) is_sect = 1; - - /* neither sections nor locals (except when debugging) need names */ +#if 0 + /* FIXME: to enable this we must have handling in place for special + * symbols. + */ + if (!info->local_names && !is_sect) + return 0; +#else + if (yasm_symrec_get_equ(sym) && !yasm_symrec_is_abs(sym)) + return 0; +#endif + entry = yasm_symrec_get_data(sym, &elf_symrec_data); if (!entry) { - elf_strtab_entry *name = info->local_names && !is_sect - ? elf_strtab_append_str(info->objfmt_elf->strtab, - yasm_symrec_get_name(sym)) - : NULL; + elf_strtab_entry *name = !info->local_names || is_sect ? NULL : + elf_strtab_append_str(info->objfmt_elf->strtab, + yasm_symrec_get_name(sym)); entry = elf_symtab_entry_create(name, sym); + yasm_symrec_add_data(sym, &elf_symrec_data, entry); } - elf_symtab_insert_local_sym(info->objfmt_elf->elf_symtab, entry); + + if (!elf_sym_in_table(entry)) + elf_symtab_insert_local_sym(info->objfmt_elf->elf_symtab, entry); + elf_symtab_set_nonzero(entry, sect, 0, STB_LOCAL, is_sect ? STT_SECTION : 0, NULL, 0); - yasm_symrec_add_data(sym, &elf_symrec_data, entry); if (is_sect) return 0; @@ -588,7 +740,7 @@ elf_objfmt_output(yasm_object *object, FILE *f, int all_syms, { yasm_objfmt_elf *objfmt_elf = (yasm_objfmt_elf *)object->objfmt; elf_objfmt_output_info info; - append_local_sym_info localsym_info; + build_symtab_info buildsym_info; long pos; unsigned long elf_shead_addr; elf_secthead *esdn; @@ -614,16 +766,17 @@ elf_objfmt_output(yasm_object *object, FILE *f, int all_syms, } /* Create missing section headers */ - localsym_info.objfmt_elf = objfmt_elf; if (yasm_object_sections_traverse(object, &info, elf_objfmt_create_dbg_secthead)) return; /* add all (local) syms to symtab because relocation needs a symtab index * if all_syms, register them by name. if not, use strtab entry 0 */ - localsym_info.local_names = all_syms; - yasm_symtab_traverse(object->symtab, &localsym_info, - elf_objfmt_append_local_sym); + buildsym_info.objfmt_elf = objfmt_elf; + buildsym_info.errwarns = errwarns; + buildsym_info.local_names = all_syms; + yasm_symtab_traverse(object->symtab, &buildsym_info, + elf_objfmt_build_symtab); elf_symtab_nlocal = elf_symtab_assign_indices(objfmt_elf->elf_symtab); /* output known sections - includes reloc sections which aren't in yasm's @@ -959,135 +1112,11 @@ elf_objfmt_section_switch(yasm_object *object, yasm_valparamhead *valparams, return retval; } -static yasm_symrec * -elf_objfmt_extern_declare(yasm_object *object, const char *name, /*@unused@*/ - /*@null@*/ yasm_valparamhead *objext_valparams, - unsigned long line) -{ - yasm_objfmt_elf *objfmt_elf = (yasm_objfmt_elf *)object->objfmt; - yasm_symrec *sym; - - sym = yasm_symtab_declare(object->symtab, name, YASM_SYM_EXTERN, line); - elf_objfmt_symtab_append(objfmt_elf, sym, SHN_UNDEF, STB_GLOBAL, - 0, STV_DEFAULT, NULL, NULL); - - if (objext_valparams) { - yasm_valparam *vp = yasm_vps_first(objext_valparams); - for (; vp; vp = yasm_vps_next(vp)) - { - if (vp->val) - yasm_error_set(YASM_ERROR_TYPE, - N_("unrecognized symbol type `%s'"), vp->val); - } - } - return sym; -} - -static yasm_symrec * -elf_objfmt_global_declare(yasm_object *object, const char *name, - /*@null@*/ yasm_valparamhead *objext_valparams, - unsigned long line) -{ - yasm_objfmt_elf *objfmt_elf = (yasm_objfmt_elf *)object->objfmt; - yasm_symrec *sym; - elf_symbol_type type = 0; - yasm_expr *size = NULL; - elf_symbol_vis vis = STV_DEFAULT; - unsigned int vis_overrides = 0; - - sym = yasm_symtab_declare(object->symtab, name, YASM_SYM_GLOBAL, line); - - if (objext_valparams) { - yasm_valparam *vp = yasm_vps_first(objext_valparams); - for (; vp; vp = yasm_vps_next(vp)) - { - if (vp->val) { - if (yasm__strcasecmp(vp->val, "function") == 0) - type = STT_FUNC; - else if (yasm__strcasecmp(vp->val, "data") == 0 || - yasm__strcasecmp(vp->val, "object") == 0) - type = STT_OBJECT; - else if (yasm__strcasecmp(vp->val, "internal") == 0) { - vis = STV_INTERNAL; - vis_overrides++; - } - else if (yasm__strcasecmp(vp->val, "hidden") == 0) { - vis = STV_HIDDEN; - vis_overrides++; - } - else if (yasm__strcasecmp(vp->val, "protected") == 0) { - vis = STV_PROTECTED; - vis_overrides++; - } - else - yasm_error_set(YASM_ERROR_TYPE, - N_("unrecognized symbol type `%s'"), - vp->val); - } - else if (vp->param && !size) { - size = vp->param; - vp->param = NULL; /* to avoid deleting the expr */ - } - } - if (vis_overrides > 1) { - yasm_warn_set(YASM_WARN_GENERAL, - N_("More than one symbol visibility provided; using last")); - } - } - - elf_objfmt_symtab_append(objfmt_elf, sym, SHN_UNDEF, STB_GLOBAL, - type, vis, size, NULL); - - return sym; -} - -static yasm_symrec * -elf_objfmt_common_declare(yasm_object *object, const char *name, - /*@only@*/ yasm_expr *size, /*@null@*/ - yasm_valparamhead *objext_valparams, - unsigned long line) -{ - yasm_objfmt_elf *objfmt_elf = (yasm_objfmt_elf *)object->objfmt; - yasm_symrec *sym; - unsigned long addralign = 0; - - sym = yasm_symtab_declare(object->symtab, name, YASM_SYM_COMMON, line); - - if (objext_valparams) { - yasm_valparam *vp = yasm_vps_first(objext_valparams); - for (; vp; vp = yasm_vps_next(vp)) { - if (!vp->val && vp->param) { - /*@dependent@*/ /*@null@*/ const yasm_intnum *align_expr; - - align_expr = yasm_expr_get_intnum(&vp->param, 0); - if (!align_expr) { - yasm_error_set(YASM_ERROR_VALUE, - N_("alignment constraint is not an integer")); - return sym; - } - addralign = yasm_intnum_get_uint(align_expr); - - /* Alignments must be a power of two. */ - if (!is_exp2(addralign)) { - yasm_error_set(YASM_ERROR_VALUE, - N_("alignment constraint is not a power of two")); - return sym; - } - } else if (vp->val) - yasm_warn_set(YASM_WARN_GENERAL, - N_("Unrecognized qualifier `%s'"), vp->val); - } - } - - elf_objfmt_symtab_append(objfmt_elf, sym, SHN_COMMON, STB_GLOBAL, - 0, STV_DEFAULT, size, &addralign); - - return sym; -} - static void -dir_type(yasm_object *object, yasm_valparam *vp, unsigned long line) +dir_type(yasm_object *object, yasm_valparamhead *valparams, + yasm_valparamhead *objext_valparams, unsigned long line) { + yasm_valparam *vp = yasm_vps_first(valparams); yasm_objfmt_elf *objfmt_elf = (yasm_objfmt_elf *)object->objfmt; char *symname = vp->val; /* Get symbol elf data */ @@ -1116,8 +1145,10 @@ dir_type(yasm_object *object, yasm_valparam *vp, unsigned long line) } static void -dir_size(yasm_object *object, yasm_valparam *vp, unsigned long line) +dir_size(yasm_object *object, yasm_valparamhead *valparams, + yasm_valparamhead *objext_valparams, unsigned long line) { + yasm_valparam *vp = yasm_vps_first(valparams); yasm_objfmt_elf *objfmt_elf = (yasm_objfmt_elf *)object->objfmt; char *symname = vp->val; /* Get symbol elf data */ @@ -1144,8 +1175,10 @@ dir_size(yasm_object *object, yasm_valparam *vp, unsigned long line) } static void -dir_weak(yasm_object *object, yasm_valparam *vp, unsigned long line) +dir_weak(yasm_object *object, yasm_valparamhead *valparams, + yasm_valparamhead *objext_valparams, unsigned long line) { + yasm_valparam *vp = yasm_vps_first(valparams); yasm_objfmt_elf *objfmt_elf = (yasm_objfmt_elf *)object->objfmt; char *symname = vp->val; yasm_symrec *sym = yasm_symtab_declare(object->symtab, symname, @@ -1155,11 +1188,13 @@ dir_weak(yasm_object *object, yasm_valparam *vp, unsigned long line) } static void -dir_ident(yasm_object *object, yasm_valparam *vp, unsigned long line) +dir_ident(yasm_object *object, yasm_valparamhead *valparams, + yasm_valparamhead *objext_valparams, unsigned long line) { yasm_valparamhead sect_vps; yasm_datavalhead dvs; yasm_section *comment; + yasm_valparam *vp = yasm_vps_first(valparams); yasm_valparam *vp2; /* Put ident data into .comment section */ @@ -1191,40 +1226,6 @@ dir_ident(yasm_object *object, yasm_valparam *vp, unsigned long line) yasm_bc_create_data(&dvs, 1, 1, object->arch, line)); } -static int -elf_objfmt_directive(yasm_object *object, const char *name, - /*@null@*/ yasm_valparamhead *valparams, - /*@unused@*/ /*@null@*/ - yasm_valparamhead *objext_valparams, - unsigned long line) -{ - static const struct { - const char *name; - void (*func) (yasm_object *, yasm_valparam *, unsigned long); - } dirs[] = { - {"TYPE", dir_type}, - {"SIZE", dir_size}, - {"WEAK", dir_weak}, - {"IDENT", dir_ident} - }; - size_t i; - - for (i=0; ival) { - yasm_error_set(YASM_ERROR_SYNTAX, - N_("Symbol name not specified")); - return 0; - } - dirs[i].func(object, vp, line); - return 0; - } - } - return 1; /* unrecognized */ -} - - /* Define valid debug formats to use with this object format */ static const char *elf_objfmt_dbgfmt_keywords[] = { "null", @@ -1233,6 +1234,18 @@ static const char *elf_objfmt_dbgfmt_keywords[] = { NULL }; +static const yasm_directive elf_objfmt_directives[] = { + { ".type", "gas", dir_type, YASM_DIR_ID_REQUIRED }, + { ".size", "gas", dir_size, YASM_DIR_ID_REQUIRED }, + { ".weak", "gas", dir_weak, YASM_DIR_ID_REQUIRED }, + { ".ident", "gas", dir_ident, YASM_DIR_ARG_REQUIRED }, + { "type", "nasm", dir_type, YASM_DIR_ID_REQUIRED }, + { "size", "nasm", dir_size, YASM_DIR_ID_REQUIRED }, + { "weak", "nasm", dir_weak, YASM_DIR_ID_REQUIRED }, + { "ident", "nasm", dir_ident, YASM_DIR_ARG_REQUIRED }, + { NULL, NULL, NULL, 0 } +}; + /* Define objfmt structure -- see objfmt.h for details */ yasm_objfmt_module yasm_elf_LTX_objfmt = { "ELF", @@ -1241,15 +1254,12 @@ yasm_objfmt_module yasm_elf_LTX_objfmt = { 32, elf_objfmt_dbgfmt_keywords, "null", + elf_objfmt_directives, elf_objfmt_create, elf_objfmt_output, elf_objfmt_destroy, elf_objfmt_add_default_section, - elf_objfmt_section_switch, - elf_objfmt_extern_declare, - elf_objfmt_global_declare, - elf_objfmt_common_declare, - elf_objfmt_directive + elf_objfmt_section_switch }; yasm_objfmt_module yasm_elf32_LTX_objfmt = { @@ -1259,15 +1269,12 @@ yasm_objfmt_module yasm_elf32_LTX_objfmt = { 32, elf_objfmt_dbgfmt_keywords, "null", + elf_objfmt_directives, elf32_objfmt_create, elf_objfmt_output, elf_objfmt_destroy, elf_objfmt_add_default_section, - elf_objfmt_section_switch, - elf_objfmt_extern_declare, - elf_objfmt_global_declare, - elf_objfmt_common_declare, - elf_objfmt_directive + elf_objfmt_section_switch }; yasm_objfmt_module yasm_elf64_LTX_objfmt = { @@ -1277,13 +1284,10 @@ yasm_objfmt_module yasm_elf64_LTX_objfmt = { 64, elf_objfmt_dbgfmt_keywords, "null", + elf_objfmt_directives, elf64_objfmt_create, elf_objfmt_output, elf_objfmt_destroy, elf_objfmt_add_default_section, - elf_objfmt_section_switch, - elf_objfmt_extern_declare, - elf_objfmt_global_declare, - elf_objfmt_common_declare, - elf_objfmt_directive + elf_objfmt_section_switch }; diff --git a/modules/objfmts/elf/elf.c b/modules/objfmts/elf/elf.c index 12fc58a9..52b69ec8 100644 --- a/modules/objfmts/elf/elf.c +++ b/modules/objfmts/elf/elf.c @@ -283,8 +283,6 @@ elf_symtab_entry_destroy(elf_symtab_entry *entry) if (entry == NULL) yasm_internal_error("symtab entry is null"); - if (entry->xsize) - yasm_expr_destroy(entry->xsize); yasm_xfree(entry); } diff --git a/modules/objfmts/elf/elf.h b/modules/objfmts/elf/elf.h index 1a75f91a..c78c5f9b 100644 --- a/modules/objfmts/elf/elf.h +++ b/modules/objfmts/elf/elf.h @@ -391,7 +391,7 @@ struct elf_symtab_entry { yasm_section *sect; elf_strtab_entry *name; elf_address value; - yasm_expr *xsize; + /*@dependent@*/ yasm_expr *xsize; elf_size size; elf_section_index index; elf_symbol_binding bind; diff --git a/modules/objfmts/elf/tests/elfmanysym.hex b/modules/objfmts/elf/tests/elfmanysym.hex index a5f6e1ad..f185d3d0 100644 --- a/modules/objfmts/elf/tests/elfmanysym.hex +++ b/modules/objfmts/elf/tests/elfmanysym.hex @@ -30,7 +30,7 @@ 00 00 00 -b0 +80 10 00 00 @@ -445,37 +445,6 @@ aa 70 63 5f -65 -66 -66 -65 -63 -74 -69 -76 -65 -5f -74 -6f -5f -70 -68 -79 -73 -69 -63 -61 -6c -5f -64 -61 -74 -61 -00 -70 -70 -63 -5f 77 72 69 @@ -993,7 +962,6 @@ aa 00 00 00 -00 01 00 00 @@ -3958,22 +3926,6 @@ e9 01 00 00 -00 -00 -00 -00 -00 -00 -00 -00 -10 -00 -00 -00 -5e -01 -00 -00 05 00 00 @@ -3986,7 +3938,7 @@ e9 00 04 00 -7b +5c 01 00 00 @@ -4002,7 +3954,7 @@ e9 00 04 00 -98 +79 01 00 00 @@ -4018,7 +3970,7 @@ e9 00 04 00 -b5 +96 01 00 00 @@ -4034,7 +3986,7 @@ b5 00 04 00 -d3 +b4 01 00 00 @@ -4050,7 +4002,7 @@ d3 00 04 00 -f1 +d2 01 00 00 @@ -4066,8 +4018,8 @@ f1 00 04 00 -13 -02 +f4 +01 00 00 05 @@ -4082,7 +4034,7 @@ f1 00 04 00 -2f +10 02 00 00 @@ -4098,7 +4050,7 @@ f1 00 04 00 -4d +2e 02 00 00 @@ -4114,7 +4066,7 @@ f1 00 04 00 -6b +4c 02 00 00 @@ -4130,7 +4082,7 @@ f1 00 04 00 -87 +68 02 00 00 @@ -4146,7 +4098,7 @@ f1 00 04 00 -a4 +85 02 00 00 @@ -4162,7 +4114,7 @@ a4 00 04 00 -c1 +a2 02 00 00 @@ -4178,7 +4130,7 @@ c1 00 04 00 -e2 +c3 02 00 00 @@ -4194,8 +4146,8 @@ e2 00 04 00 -01 -03 +e2 +02 00 00 05 @@ -4210,7 +4162,7 @@ e2 00 04 00 -22 +03 03 00 00 @@ -4226,7 +4178,7 @@ e2 00 04 00 -33 +14 03 00 00 @@ -4242,7 +4194,7 @@ e2 00 04 00 -45 +26 03 00 00 @@ -4370,7 +4322,7 @@ e2 00 00 00 -56 +37 03 00 00 @@ -4406,11 +4358,11 @@ e2 00 00 00 -d4 +b4 03 00 00 -d0 +c0 0c 00 00 diff --git a/modules/objfmts/elf/tests/elfvisibility.asm b/modules/objfmts/elf/tests/elfvisibility.asm index 13203106..32d20722 100644 --- a/modules/objfmts/elf/tests/elfvisibility.asm +++ b/modules/objfmts/elf/tests/elfvisibility.asm @@ -4,3 +4,8 @@ global ghidden:hidden global ginternal:internal global gprotected:protected global gtoomany:hidden internal + +ghidden: +ginternal: +gprotected: +gtoomany: diff --git a/modules/objfmts/elf/tests/elfvisibility.hex b/modules/objfmts/elf/tests/elfvisibility.hex index c4ace91f..8da06880 100644 --- a/modules/objfmts/elf/tests/elfvisibility.hex +++ b/modules/objfmts/elf/tests/elfvisibility.hex @@ -204,7 +204,7 @@ ff 00 10 02 -00 +04 00 0b 00 @@ -220,7 +220,7 @@ ff 00 10 01 -00 +04 00 15 00 @@ -236,7 +236,7 @@ ff 00 10 03 -00 +04 00 20 00 @@ -252,7 +252,7 @@ ff 00 10 01 -00 +04 00 00 00 diff --git a/modules/objfmts/elf/tests/gas64/elf_gas64_reloc.hex b/modules/objfmts/elf/tests/gas64/elf_gas64_reloc.hex index c4dc66fb..906cce87 100644 --- a/modules/objfmts/elf/tests/gas64/elf_gas64_reloc.hex +++ b/modules/objfmts/elf/tests/gas64/elf_gas64_reloc.hex @@ -730,15 +730,15 @@ ff 2d 00 5f -5a -45 -52 -4f 56 41 52 00 5f +5a +45 +52 +4f 56 41 52 @@ -870,7 +870,7 @@ c0 00 00 00 -03 +08 00 00 00 @@ -894,7 +894,7 @@ c0 00 00 00 -0c +03 00 00 00 diff --git a/modules/objfmts/macho/macho-objfmt.c b/modules/objfmts/macho/macho-objfmt.c index ac7eacce..b07bbe0b 100644 --- a/modules/objfmts/macho/macho-objfmt.c +++ b/modules/objfmts/macho/macho-objfmt.c @@ -293,7 +293,6 @@ typedef struct macho_section_data { typedef struct macho_symrec_data { - /*@owned@*/ /*@null@*/ yasm_expr *size; /* size if COMMON declaration */ unsigned long index; /* index in output order */ yasm_intnum *value; /* valid after writing symtable to file */ unsigned long length; /* length + 1 (plus auto underscore) */ @@ -948,13 +947,14 @@ macho_objfmt_output_symtable(yasm_symrec *sym, /*@null@*/ void *d) scnum = -1; /*n_desc = REFERENCE_FLAG_UNDEFINED_LAZY; * FIXME: see definition of REFERENCE_FLAG_* above */ } else if (vis & YASM_SYM_COMMON) { + yasm_expr **csize = yasm_symrec_get_common_size(sym); n_type = N_UNDF | N_EXT; - if (symd) { - intn = yasm_expr_get_intnum(&symd->size, 1); + if (csize) { + intn = yasm_expr_get_intnum(csize, 1); if (!intn) { yasm_error_set(YASM_ERROR_NOT_CONSTANT, N_("COMMON data size not an integer expression")); - yasm_errwarn_propagate(info->errwarns, symd->size->line); + yasm_errwarn_propagate(info->errwarns, (*csize)->line); } else yasm_intnum_set_uint(val, yasm_intnum_get_uint(intn)); } @@ -1500,48 +1500,9 @@ macho_section_data_print(void *data, FILE *f, int indent_level) fprintf(f, "%*soffset=%ld\n", indent_level, "", msd->offset); } -static yasm_symrec * -macho_objfmt_extern_declare(yasm_object *object, const char *name, /*@unused@*/ - /*@null@*/ yasm_valparamhead *objext_valparams, - unsigned long line) -{ - return yasm_symtab_declare(object->symtab, name, YASM_SYM_EXTERN, line); -} - -static yasm_symrec * -macho_objfmt_global_declare(yasm_object *object, const char *name, /*@unused@*/ - /*@null@*/ yasm_valparamhead *objext_valparams, - unsigned long line) -{ - return yasm_symtab_declare(object->symtab, name, YASM_SYM_GLOBAL, line); -} - -static yasm_symrec * -macho_objfmt_common_declare(yasm_object *object, const char *name, - /*@only@*/ yasm_expr *size, - /*@unused@*/ /*@null@*/ - yasm_valparamhead *objext_valparams, - unsigned long line) -{ - yasm_symrec *sym; - macho_symrec_data *sym_data; - - sym = yasm_symtab_declare(object->symtab, name, YASM_SYM_COMMON, line); - - sym_data = yasm_xmalloc(sizeof(macho_symrec_data)); - - sym_data->size = size; - yasm_symrec_add_data(sym, &macho_symrec_data_cb, sym_data); - return sym; -} - static void macho_symrec_data_destroy(void *data) { - macho_symrec_data *csymd = (macho_symrec_data *)data; - - if (csymd->size) - yasm_expr_destroy(csymd->size); yasm_xfree(data); } @@ -1550,12 +1511,6 @@ macho_symrec_data_print(void *data, FILE *f, int indent_level) { macho_symrec_data *msd = (macho_symrec_data *)data; - fprintf(f, "%*ssize=", indent_level, ""); - if (msd->size) - yasm_expr_print(msd->size, f); - else - fprintf(f, "nil"); - fprintf(f, "\n"); fprintf(f, "%*sindex=%ld\n", indent_level, "", msd->index); fprintf(f, "%*svalue=", indent_level, ""); if (msd->value) @@ -1565,18 +1520,6 @@ macho_symrec_data_print(void *data, FILE *f, int indent_level) } -static int -macho_objfmt_directive(/*@unused@*/ yasm_object *object, - /*@unused@*/ const char *name, - /*@unused@*/ /*@null@*/ yasm_valparamhead *valparams, - /*@unused@*/ /*@null@*/ - yasm_valparamhead *objext_valparams, - /*@unused@*/ unsigned long line) -{ - return 1; /* no objfmt directives */ -} - - /* Define valid debug formats to use with this object format */ static const char *macho_objfmt_dbgfmt_keywords[] = { "null", @@ -1591,15 +1534,12 @@ yasm_objfmt_module yasm_macho_LTX_objfmt = { 32, macho_objfmt_dbgfmt_keywords, "null", + NULL, /* no directives */ macho_objfmt_create, macho_objfmt_output, macho_objfmt_destroy, macho_objfmt_add_default_section, - macho_objfmt_section_switch, - macho_objfmt_extern_declare, - macho_objfmt_global_declare, - macho_objfmt_common_declare, - macho_objfmt_directive + macho_objfmt_section_switch }; yasm_objfmt_module yasm_macho32_LTX_objfmt = { @@ -1609,15 +1549,12 @@ yasm_objfmt_module yasm_macho32_LTX_objfmt = { 32, macho_objfmt_dbgfmt_keywords, "null", + NULL, /* no directives */ macho32_objfmt_create, macho_objfmt_output, macho_objfmt_destroy, macho_objfmt_add_default_section, - macho_objfmt_section_switch, - macho_objfmt_extern_declare, - macho_objfmt_global_declare, - macho_objfmt_common_declare, - macho_objfmt_directive + macho_objfmt_section_switch }; yasm_objfmt_module yasm_macho64_LTX_objfmt = { @@ -1627,13 +1564,10 @@ yasm_objfmt_module yasm_macho64_LTX_objfmt = { 64, macho_objfmt_dbgfmt_keywords, "null", + NULL, /* no directives */ macho64_objfmt_create, macho_objfmt_output, macho_objfmt_destroy, macho_objfmt_add_default_section, - macho_objfmt_section_switch, - macho_objfmt_extern_declare, - macho_objfmt_global_declare, - macho_objfmt_common_declare, - macho_objfmt_directive + macho_objfmt_section_switch }; diff --git a/modules/objfmts/rdf/rdf-objfmt.c b/modules/objfmts/rdf/rdf-objfmt.c index 5d7eace7..541935de 100644 --- a/modules/objfmts/rdf/rdf-objfmt.c +++ b/modules/objfmts/rdf/rdf-objfmt.c @@ -100,10 +100,6 @@ typedef struct rdf_section_data { } rdf_section_data; typedef struct rdf_symrec_data { - /*@owned@*/ /*@null@*/ yasm_expr *size; /* size if COMMON declaration */ - unsigned long align; /* alignment if COMMON declaration */ - - unsigned int flags; /* import/export/type flags */ unsigned int segment; /* assigned RDF "segment" index */ } rdf_symrec_data; @@ -156,16 +152,11 @@ yasm_objfmt_module yasm_rdf_LTX_objfmt; static /*@dependent@*/ rdf_symrec_data * -rdf_objfmt_sym_set_data(yasm_symrec *sym, - /*@only@*/ /*@null@*/ yasm_expr *size, - unsigned long align, unsigned int flags) +rdf_objfmt_sym_set_data(yasm_symrec *sym, unsigned int segment) { rdf_symrec_data *rsymd = yasm_xmalloc(sizeof(rdf_symrec_data)); - rsymd->size = size; - rsymd->align = align; - rsymd->flags = flags; - rsymd->segment = 0; + rsymd->segment = segment; yasm_symrec_add_data(sym, &rdf_symrec_data_cb, rsymd); return rsymd; @@ -484,6 +475,72 @@ rdf_objfmt_output_section_file(yasm_section *sect, /*@null@*/ void *d) return 0; } +static unsigned int +rdf_parse_flags(yasm_symrec *sym) +{ + yasm_sym_vis vis = yasm_symrec_get_visibility(sym); + /*@dependent@*/ /*@null@*/ yasm_valparamhead *objext_valparams = + yasm_symrec_get_objext_valparams(sym); + yasm_valparam *vp; + unsigned int flags = 0; + + static const struct { + enum { + FLAG_EXT = 1, + FLAG_GLOB = 2 + } type; + enum { + FLAG_SET = 1, + FLAG_CLR = 2 + } action; + const char *name; + unsigned int flags; + } flagtbl[] = { + { FLAG_EXT|FLAG_GLOB, FLAG_SET, "data", SYM_DATA }, + { FLAG_EXT|FLAG_GLOB, FLAG_SET, "object", SYM_DATA }, + { FLAG_EXT|FLAG_GLOB, FLAG_SET, "proc", SYM_FUNCTION }, + { FLAG_EXT|FLAG_GLOB, FLAG_SET, "function", SYM_FUNCTION }, + { FLAG_EXT, FLAG_SET, "import", SYM_IMPORT }, + { FLAG_GLOB, FLAG_SET, "export", SYM_GLOBAL }, + { FLAG_EXT, FLAG_SET, "far", SYM_FAR }, + { FLAG_EXT, FLAG_CLR, "near", SYM_FAR }, + }; + + if (!objext_valparams) + return 0; + + vp = yasm_vps_first(objext_valparams); + for (; vp; vp = yasm_vps_next(vp)) { + size_t i; + int match; + + if (!vp->val) { + yasm_warn_set(YASM_WARN_GENERAL, + N_("Unrecognized numeric qualifier")); + continue; + } + + match = 0; + for (i=0; ival, flagtbl[i].name) == 0) { + if (flagtbl[i].action == FLAG_SET) + flags |= flagtbl[i].flags; + else if (flagtbl[i].action == FLAG_CLR) + flags &= ~flagtbl[i].flags; + match = 1; + } + } + + if (!match) + yasm_warn_set(YASM_WARN_GENERAL, N_("Unrecognized qualifier `%s'"), + vp->val); + } + + return flags; +} + static int rdf_objfmt_output_sym(yasm_symrec *sym, /*@null@*/ void *d) { @@ -496,7 +553,6 @@ rdf_objfmt_output_sym(yasm_symrec *sym, /*@null@*/ void *d) /*@dependent@*/ /*@null@*/ yasm_section *sect; /*@dependent@*/ /*@null@*/ yasm_bytecode *precbc; unsigned char *localbuf; - rdf_symrec_data *rsymd; assert(info != NULL); @@ -521,15 +577,16 @@ rdf_objfmt_output_sym(yasm_symrec *sym, /*@null@*/ void *d) } else if (yasm_section_is_absolute(sect)) { yasm_warn_set(YASM_WARN_GENERAL, N_("rdf does not support exporting absolutes")); - yasm_errwarn_propagate(info->errwarns, yasm_symrec_get_line(sym)); + yasm_errwarn_propagate(info->errwarns, + yasm_symrec_get_decl_line(sym)); return 0; } else yasm_internal_error(N_("didn't understand section")); value = yasm_bc_next_offset(precbc); } else if (yasm_symrec_get_equ(sym)) { yasm_warn_set(YASM_WARN_GENERAL, - N_("rdf does not support exporting EQU/absolute values")); - yasm_errwarn_propagate(info->errwarns, yasm_symrec_get_line(sym)); + N_("rdf does not support exporting EQU/absolute values")); + yasm_errwarn_propagate(info->errwarns, yasm_symrec_get_decl_line(sym)); return 0; } @@ -540,50 +597,72 @@ rdf_objfmt_output_sym(yasm_symrec *sym, /*@null@*/ void *d) yasm_warn_set(YASM_WARN_GENERAL, N_("label name too long, truncating to %d bytes"), EXIM_LABEL_MAX); - yasm_errwarn_propagate(info->errwarns, yasm_symrec_get_line(sym)); len = EXIM_LABEL_MAX-1; } localbuf = info->buf; if (vis & YASM_SYM_GLOBAL) { - rsymd = yasm_symrec_get_data(sym, &rdf_symrec_data_cb); - if (!rsymd) - yasm_internal_error(N_("rdf: no symbol data for global symbol")); YASM_WRITE_8(localbuf, RDFREC_GLOBAL); YASM_WRITE_8(localbuf, 6+len+1); /* record length */ - YASM_WRITE_8(localbuf, rsymd->flags); /* flags */ + YASM_WRITE_8(localbuf, rdf_parse_flags(sym)); /* flags */ YASM_WRITE_8(localbuf, scnum); /* segment referred to */ YASM_WRITE_32_L(localbuf, value); /* offset */ } else { - /* Create new symrec data if it doesn't already exist */ - rsymd = yasm_symrec_get_data(sym, &rdf_symrec_data_cb); - if (!rsymd) - rsymd = rdf_objfmt_sym_set_data(sym, NULL, 0, 0); - /* Save symbol segment in symrec data (for later reloc gen) */ - rsymd->segment = info->indx++; - scnum = rsymd->segment; + scnum = info->indx++; + rdf_objfmt_sym_set_data(sym, scnum); if (vis & YASM_SYM_COMMON) { + /*@dependent@*/ /*@null@*/ yasm_expr **csize_expr; const yasm_intnum *intn; + /*@dependent@*/ /*@null@*/ yasm_valparamhead *objext_valparams = + yasm_symrec_get_objext_valparams(sym); + unsigned long addralign = 0; YASM_WRITE_8(localbuf, RDFREC_COMMON); YASM_WRITE_8(localbuf, 8+len+1); /* record length */ YASM_WRITE_16_L(localbuf, scnum); /* segment allocated */ /* size */ - intn = yasm_expr_get_intnum(&rsymd->size, 1); + csize_expr = yasm_symrec_get_common_size(sym); + assert(csize_expr != NULL); + intn = yasm_expr_get_intnum(csize_expr, 1); if (!intn) { yasm_error_set(YASM_ERROR_NOT_CONSTANT, N_("COMMON data size not an integer expression")); - yasm_errwarn_propagate(info->errwarns, - yasm_symrec_get_line(sym)); } else value = yasm_intnum_get_uint(intn); YASM_WRITE_32_L(localbuf, value); - YASM_WRITE_16_L(localbuf, rsymd->align); /* alignment */ + + /* alignment */ + if (objext_valparams) { + yasm_valparam *vp = yasm_vps_first(objext_valparams); + for (; vp; vp = yasm_vps_next(vp)) { + if (!vp->val && vp->param) { + /*@null@*/ const yasm_intnum *align_expr; + + align_expr = yasm_expr_get_intnum(&vp->param, 0); + if (!align_expr) { + yasm_error_set(YASM_ERROR_VALUE, + N_("alignment constraint is not an integer")); + continue; + } + addralign = yasm_intnum_get_uint(align_expr); + + /* Alignments must be a power of two. */ + if (!is_exp2(addralign)) { + yasm_error_set(YASM_ERROR_VALUE, + N_("alignment constraint is not a power of two")); + continue; + } + } else if (vp->val) + yasm_warn_set(YASM_WARN_GENERAL, + N_("Unrecognized qualifier `%s'"), vp->val); + } + } + YASM_WRITE_16_L(localbuf, addralign); } else if (vis & YASM_SYM_EXTERN) { - unsigned int flags = rsymd->flags; + unsigned int flags = rdf_parse_flags(sym); if (flags & SYM_FAR) { YASM_WRITE_8(localbuf, RDFREC_FARIMPORT); flags &= ~SYM_FAR; @@ -601,6 +680,8 @@ rdf_objfmt_output_sym(yasm_symrec *sym, /*@null@*/ void *d) YASM_WRITE_8(localbuf, 0); /* 0-terminated name */ fwrite(info->buf, (unsigned long)(localbuf-info->buf), 1, info->f); + + yasm_errwarn_propagate(info->errwarns, yasm_symrec_get_decl_line(sym)); return 0; } @@ -917,163 +998,9 @@ rdf_section_data_print(void *data, FILE *f, int indent_level) fprintf(f, "%*ssize=%ld\n", indent_level, "", rsd->size); } -static yasm_symrec * -rdf_objfmt_extern_declare(yasm_object *object, const char *name, /*@unused@*/ - /*@null@*/ yasm_valparamhead *objext_valparams, - unsigned long line) -{ - yasm_symrec *sym; - unsigned int flags = 0; - - static const struct { - const char *name; - unsigned int flags; - } flagnames[] = { - { "data", SYM_DATA }, - { "object", SYM_DATA }, - { "proc", SYM_FUNCTION }, - { "function", SYM_FUNCTION }, - { "import", SYM_IMPORT }, - { "far", SYM_FAR }, - }; - - sym = yasm_symtab_declare(object->symtab, name, YASM_SYM_EXTERN, line); - - if (objext_valparams) { - yasm_valparam *vp = yasm_vps_first(objext_valparams); - for (; vp; vp = yasm_vps_next(vp)) { - size_t i; - int match; - - if (!vp->val) { - yasm_warn_set(YASM_WARN_GENERAL, - N_("Unrecognized numeric qualifier")); - continue; - } - - match = 0; - for (i=0; ival, flagnames[i].name) == 0) { - flags |= flagnames[i].flags; - match = 1; - } - } - - if (yasm__strcasecmp(vp->val, "near") == 0) { - flags &= ~SYM_FAR; - match = 1; - } - - if (!match) - yasm_warn_set(YASM_WARN_GENERAL, - N_("Unrecognized qualifier `%s'"), vp->val); - } - } - - /* Remember flags */ - rdf_objfmt_sym_set_data(sym, NULL, 0, flags); - return sym; -} - -static yasm_symrec * -rdf_objfmt_global_declare(yasm_object *object, const char *name, /*@unused@*/ - /*@null@*/ yasm_valparamhead *objext_valparams, - unsigned long line) -{ - yasm_symrec *sym; - unsigned int flags = 0; - - static const struct { - const char *name; - unsigned int flags; - } flagnames[] = { - { "data", SYM_DATA }, - { "object", SYM_DATA }, - { "proc", SYM_FUNCTION }, - { "function", SYM_FUNCTION }, - { "export", SYM_GLOBAL }, - }; - - sym = yasm_symtab_declare(object->symtab, name, YASM_SYM_GLOBAL, line); - - if (objext_valparams) { - yasm_valparam *vp = yasm_vps_first(objext_valparams); - for (; vp; vp = yasm_vps_next(vp)) { - size_t i; - int match; - - if (!vp->val) { - yasm_warn_set(YASM_WARN_GENERAL, - N_("Unrecognized numeric qualifier")); - continue; - } - - match = 0; - for (i=0; ival, flagnames[i].name) == 0) { - flags |= flagnames[i].flags; - match = 1; - } - } - if (!match) - yasm_warn_set(YASM_WARN_GENERAL, - N_("Unrecognized qualifier `%s'"), vp->val); - } - } - - /* Remember flags */ - rdf_objfmt_sym_set_data(sym, NULL, 0, flags); - return sym; -} - -static yasm_symrec * -rdf_objfmt_common_declare(yasm_object *object, const char *name, - /*@only@*/ yasm_expr *size, - yasm_valparamhead *objext_valparams, - unsigned long line) -{ - yasm_symrec *sym; - unsigned long addralign = 0; - - sym = yasm_symtab_declare(object->symtab, name, YASM_SYM_COMMON, line); - - if (objext_valparams) { - yasm_valparam *vp = yasm_vps_first(objext_valparams); - for (; vp; vp = yasm_vps_next(vp)) { - if (!vp->val && vp->param) { - /*@dependent@*/ /*@null@*/ const yasm_intnum *align_expr; - - align_expr = yasm_expr_get_intnum(&vp->param, 0); - if (!align_expr) { - yasm_error_set(YASM_ERROR_VALUE, - N_("alignment constraint is not an integer")); - return sym; - } - addralign = yasm_intnum_get_uint(align_expr); - - /* Alignments must be a power of two. */ - if (!is_exp2(addralign)) { - yasm_error_set(YASM_ERROR_VALUE, - N_("alignment constraint is not a power of two")); - return sym; - } - } else if (vp->val) - yasm_warn_set(YASM_WARN_GENERAL, - N_("Unrecognized qualifier `%s'"), vp->val); - } - } - - /* Remember size and alignment */ - rdf_objfmt_sym_set_data(sym, size, addralign, 0); - return sym; -} - static void rdf_symrec_data_destroy(void *data) { - rdf_symrec_data *rsymd = (rdf_symrec_data *)data; - if (rsymd->size) - yasm_expr_destroy(rsymd->size); yasm_xfree(data); } @@ -1083,47 +1010,17 @@ rdf_symrec_data_print(void *data, FILE *f, int indent_level) rdf_symrec_data *rsymd = (rdf_symrec_data *)data; fprintf(f, "%*ssymtab segment=%u\n", indent_level, "", rsymd->segment); - fprintf(f, "%*ssize=", indent_level, ""); - if (rsymd->size) - yasm_expr_print(rsymd->size, f); - else - fprintf(f, "nil"); - fprintf(f, "%*salign=%lu\n", indent_level, "", rsymd->align); } -static int -rdf_objfmt_directive(yasm_object *object, const char *name, - /*@null@*/ yasm_valparamhead *valparams, - /*@unused@*/ /*@null@*/ - yasm_valparamhead *objext_valparams, unsigned long line) +static void +rdf_objfmt_add_libmodule(yasm_object *object, char *name, int lib) { yasm_objfmt_rdf *objfmt_rdf = (yasm_objfmt_rdf *)object->objfmt; - int lib; - yasm_valparam *vp; xdf_str *str; - if (yasm__strcasecmp(name, "library") == 0) - lib = 1; - else if (yasm__strcasecmp(name, "module") == 0) - lib = 0; - else - return 1; - - if (!valparams) { - yasm_error_set(YASM_ERROR_SYNTAX, N_("[%s] requires an argument"), - name); - return 0; - } - vp = yasm_vps_first(valparams); - if (!vp->val) { - yasm_error_set(YASM_ERROR_SYNTAX, N_("argument to [%s] must be name"), - name); - return 0; - } - /* Add to list */ str = yasm_xmalloc(sizeof(xdf_str)); - str->str = vp->val; + str->str = name; if (lib) STAILQ_INSERT_TAIL(&objfmt_rdf->library_names, str, link); else @@ -1135,11 +1032,25 @@ rdf_objfmt_directive(yasm_object *object, const char *name, MODLIB_NAME_MAX); str->str[MODLIB_NAME_MAX-1] = '\0'; } +} +static void +dir_library(yasm_object *object, yasm_valparamhead *valparams, + yasm_valparamhead *objext_valparams, unsigned long line) +{ + yasm_valparam *vp = yasm_vps_first(valparams); + rdf_objfmt_add_libmodule(object, vp->val, 1); vp->val = NULL; /* don't free it */ - return 0; } +static void +dir_module(yasm_object *object, yasm_valparamhead *valparams, + yasm_valparamhead *objext_valparams, unsigned long line) +{ + yasm_valparam *vp = yasm_vps_first(valparams); + rdf_objfmt_add_libmodule(object, vp->val, 0); + vp->val = NULL; /* don't free it */ +} /* Define valid debug formats to use with this object format */ static const char *rdf_objfmt_dbgfmt_keywords[] = { @@ -1147,6 +1058,12 @@ static const char *rdf_objfmt_dbgfmt_keywords[] = { NULL }; +static const yasm_directive rdf_objfmt_directives[] = { + { "library", "nasm", dir_library, YASM_DIR_ID_REQUIRED }, + { "module", "nasm", dir_module, YASM_DIR_ID_REQUIRED }, + { NULL, NULL, NULL, 0 } +}; + /* Define objfmt structure -- see objfmt.h for details */ yasm_objfmt_module yasm_rdf_LTX_objfmt = { "Relocatable Dynamic Object File Format (RDOFF) v2.0", @@ -1155,13 +1072,10 @@ yasm_objfmt_module yasm_rdf_LTX_objfmt = { 32, rdf_objfmt_dbgfmt_keywords, "null", + rdf_objfmt_directives, rdf_objfmt_create, rdf_objfmt_output, rdf_objfmt_destroy, rdf_objfmt_add_default_section, - rdf_objfmt_section_switch, - rdf_objfmt_extern_declare, - rdf_objfmt_global_declare, - rdf_objfmt_common_declare, - rdf_objfmt_directive + rdf_objfmt_section_switch }; diff --git a/modules/objfmts/rdf/tests/rdfabs.errwarn b/modules/objfmts/rdf/tests/rdfabs.errwarn index 19ecde39..ecaaa3b5 100644 --- a/modules/objfmts/rdf/tests/rdfabs.errwarn +++ b/modules/objfmts/rdf/tests/rdfabs.errwarn @@ -1,2 +1,2 @@ --:2: warning: rdf does not support exporting EQU/absolute values --:4: warning: rdf does not support exporting EQU/absolute values +-:6: warning: rdf does not support exporting EQU/absolute values +-:7: warning: rdf does not support exporting EQU/absolute values diff --git a/modules/objfmts/xdf/xdf-objfmt.c b/modules/objfmts/xdf/xdf-objfmt.c index 9e852216..48bcae38 100644 --- a/modules/objfmts/xdf/xdf-objfmt.c +++ b/modules/objfmts/xdf/xdf-objfmt.c @@ -434,8 +434,16 @@ static int xdf_objfmt_count_sym(yasm_symrec *sym, /*@null@*/ void *d) { /*@null@*/ xdf_objfmt_output_info *info = (xdf_objfmt_output_info *)d; + yasm_sym_vis vis = yasm_symrec_get_visibility(sym); assert(info != NULL); - if (info->all_syms || yasm_symrec_get_visibility(sym) != YASM_SYM_LOCAL) { + if (vis & YASM_SYM_COMMON) { + yasm_error_set(YASM_ERROR_GENERAL, + N_("XDF object format does not support common variables")); + yasm_errwarn_propagate(info->errwarns, yasm_symrec_get_decl_line(sym)); + return 0; + } + if (info->all_syms || + (vis != YASM_SYM_LOCAL && !(vis & YASM_SYM_DLOCAL))) { /* Save index in symrec data */ xdf_symrec_data *sym_data = yasm_xmalloc(sizeof(xdf_symrec_data)); sym_data->index = info->indx; @@ -813,35 +821,6 @@ xdf_section_data_print(void *data, FILE *f, int indent_level) fprintf(f, "%*snreloc=%ld\n", indent_level, "", xsd->nreloc); } -static yasm_symrec * -xdf_objfmt_extern_declare(yasm_object *object, const char *name, /*@unused@*/ - /*@null@*/ yasm_valparamhead *objext_valparams, - unsigned long line) -{ - return yasm_symtab_declare(object->symtab, name, YASM_SYM_EXTERN, line); -} - -static yasm_symrec * -xdf_objfmt_global_declare(yasm_object *object, const char *name, /*@unused@*/ - /*@null@*/ yasm_valparamhead *objext_valparams, - unsigned long line) -{ - return yasm_symtab_declare(object->symtab, name, YASM_SYM_GLOBAL, line); -} - -static yasm_symrec * -xdf_objfmt_common_declare(yasm_object *object, const char *name, - /*@only@*/ yasm_expr *size, /*@unused@*/ /*@null@*/ - yasm_valparamhead *objext_valparams, - unsigned long line) -{ - yasm_expr_destroy(size); - yasm_error_set(YASM_ERROR_GENERAL, - N_("XDF object format does not support common variables")); - - return yasm_symtab_declare(object->symtab, name, YASM_SYM_COMMON, line); -} - static void xdf_symrec_data_destroy(void *data) { @@ -856,18 +835,6 @@ xdf_symrec_data_print(void *data, FILE *f, int indent_level) fprintf(f, "%*ssymtab index=%lu\n", indent_level, "", xsd->index); } -static int -xdf_objfmt_directive(/*@unused@*/ yasm_object *object, - /*@unused@*/ const char *name, - /*@unused@*/ /*@null@*/ yasm_valparamhead *valparams, - /*@unused@*/ /*@null@*/ - yasm_valparamhead *objext_valparams, - /*@unused@*/ unsigned long line) -{ - return 1; /* no objfmt directives */ -} - - /* Define valid debug formats to use with this object format */ static const char *xdf_objfmt_dbgfmt_keywords[] = { "null", @@ -882,13 +849,10 @@ yasm_objfmt_module yasm_xdf_LTX_objfmt = { 32, xdf_objfmt_dbgfmt_keywords, "null", + NULL, /* no directives */ xdf_objfmt_create, xdf_objfmt_output, xdf_objfmt_destroy, xdf_objfmt_add_default_section, - xdf_objfmt_section_switch, - xdf_objfmt_extern_declare, - xdf_objfmt_global_declare, - xdf_objfmt_common_declare, - xdf_objfmt_directive + xdf_objfmt_section_switch }; diff --git a/modules/parsers/gas/gas-parse.c b/modules/parsers/gas/gas-parse.c index 0ece9747..67a572e3 100644 --- a/modules/parsers/gas/gas-parse.c +++ b/modules/parsers/gas/gas-parse.c @@ -42,8 +42,6 @@ RCSID("$Id$"); static yasm_bytecode *parse_line(yasm_parser_gas *parser_gas); static yasm_bytecode *parse_instr(yasm_parser_gas *parser_gas); static int parse_dirvals(yasm_parser_gas *parser_gas, yasm_valparamhead *vps); -static int parse_dirstrvals(yasm_parser_gas *parser_gas, - yasm_valparamhead *vps); static int parse_datavals(yasm_parser_gas *parser_gas, yasm_datavalhead *dvs); static int parse_strvals(yasm_parser_gas *parser_gas, yasm_datavalhead *dvs); static yasm_effaddr *parse_memaddr(yasm_parser_gas *parser_gas); @@ -171,25 +169,18 @@ expect_(yasm_parser_gas *parser_gas, int token) case DIR_COMM: case DIR_DATA: case DIR_ENDR: - case DIR_EXTERN: case DIR_EQU: case DIR_FILE: case DIR_FILL: - case DIR_GLOBAL: - case DIR_IDENT: case DIR_LEB128: case DIR_LINE: - case DIR_LOC: case DIR_LOCAL: case DIR_LCOMM: case DIR_ORG: case DIR_REPT: case DIR_SECTION: case DIR_SECTNAME: - case DIR_SIZE: case DIR_SKIP: - case DIR_TYPE: - case DIR_WEAK: case DIR_ZERO: str = "expected directive"; break; @@ -253,14 +244,18 @@ parse_line(yasm_parser_gas *parser_gas) switch (curtok) { case ID: id = ID_val; + parser_gas->state = INSTDIR; get_next_token(); /* ID */ if (curtok == ':') { /* Label */ + parser_gas->state = INITIAL; get_next_token(); /* : */ define_label(parser_gas, id, 0); return parse_line(parser_gas); } else if (curtok == '=') { /* EQU */ + /* TODO: allow redefinition, assigning to . (same as .org) */ + parser_gas->state = INITIAL; get_next_token(); /* = */ e = parse_expr(parser_gas); if (e) @@ -271,7 +266,16 @@ parse_line(yasm_parser_gas *parser_gas) yasm_xfree(id); return NULL; } - /* must be an error at this point */ + + /* possibly a directive; try to parse it */ + parse_dirvals(parser_gas, &vps); + if (!yasm_object_directive(p_object, id, "gas", &vps, NULL, + cur_line)) { + yasm_vps_delete(&vps); + yasm_xfree(id); + return NULL; + } + yasm_vps_delete(&vps); if (id[0] == '.') yasm_warn_set(YASM_WARN_GENERAL, N_("directive `%s' not recognized"), id); @@ -399,13 +403,6 @@ parse_line(yasm_parser_gas *parser_gas) yasm_xfree(ID_val); get_next_token(); /* ID */ return NULL; - case DIR_GLOBAL: - get_next_token(); /* DIR_GLOBAL */ - if (!expect(ID)) return NULL; - yasm_objfmt_global_declare(p_object, ID_val, NULL, cur_line); - yasm_xfree(ID_val); - get_next_token(); /* ID */ - return NULL; case DIR_COMM: case DIR_LCOMM: { @@ -441,41 +438,24 @@ parse_line(yasm_parser_gas *parser_gas) define_lcomm(parser_gas, id, e, align); } else if (align) { /* Give third parameter as objext valparam */ - yasm_vps_initialize(&vps); + yasm_valparamhead *extvps = yasm_vps_create(); vp = yasm_vp_create(NULL, align); - yasm_vps_append(&vps, vp); + yasm_vps_append(extvps, vp); - yasm_objfmt_common_declare(p_object, id, e, &vps, cur_line); + sym = yasm_symtab_declare(p_symtab, id, YASM_SYM_COMMON, + cur_line); + yasm_symrec_set_common_size(sym, e); + yasm_symrec_set_objext_valparams(sym, extvps); - yasm_vps_delete(&vps); yasm_xfree(id); } else { - yasm_objfmt_common_declare(p_object, id, e, NULL, cur_line); + sym = yasm_symtab_declare(p_symtab, id, YASM_SYM_COMMON, + cur_line); + yasm_symrec_set_common_size(sym, e); yasm_xfree(id); } return NULL; } - case DIR_EXTERN: - get_next_token(); /* DIR_EXTERN */ - if (!expect(ID)) return NULL; - /* Go ahead and do it, even though all undef become extern */ - yasm_objfmt_extern_declare(p_object, ID_val, NULL, cur_line); - yasm_xfree(ID_val); - get_next_token(); /* ID */ - return NULL; - case DIR_WEAK: - get_next_token(); /* DIR_EXTERN */ - if (!expect(ID)) return NULL; - - yasm_vps_initialize(&vps); - vp = yasm_vp_create(ID_val, NULL); - yasm_vps_append(&vps, vp); - get_next_token(); /* ID */ - - yasm_objfmt_directive(p_object, "weak", &vps, NULL, cur_line); - - yasm_vps_delete(&vps); - return NULL; /* Integer data definition directives */ case DIR_ASCII: @@ -620,13 +600,6 @@ parse_line(yasm_parser_gas *parser_gas) } /* Other directives */ - case DIR_IDENT: - get_next_token(); /* DIR_IDENT */ - if (!parse_dirstrvals(parser_gas, &vps)) - return NULL; - yasm_objfmt_directive(p_object, "ident", &vps, NULL, cur_line); - yasm_vps_delete(&vps); - return NULL; case DIR_FILE: get_next_token(); /* DIR_FILE */ if (curtok == STRING) { @@ -662,7 +635,8 @@ parse_line(yasm_parser_gas *parser_gas) vp = yasm_vp_create(filename, NULL); yasm_vps_append(&vps, vp); - yasm_dbgfmt_directive(p_object, "file", &vps, cur_line); + yasm_object_directive(p_object, ".file", "gas", &vps, NULL, + cur_line); yasm_vps_delete(&vps); return NULL; @@ -685,104 +659,8 @@ parse_line(yasm_parser_gas *parser_gas) yasm_vps_append(&vps, vp); get_next_token(); /* STRING */ - yasm_dbgfmt_directive(p_object, "file", &vps, cur_line); - - yasm_vps_delete(&vps); - return NULL; - case DIR_LOC: - /* INTNUM INTNUM INTNUM */ - get_next_token(); /* DIR_LOC */ - yasm_vps_initialize(&vps); - - if (!expect(INTNUM)) return NULL; - vp = yasm_vp_create(NULL, - p_expr_new_ident(yasm_expr_int(INTNUM_val))); - yasm_vps_append(&vps, vp); - get_next_token(); /* INTNUM */ - - if (!expect(INTNUM)) { - yasm_vps_delete(&vps); - return NULL; - } - vp = yasm_vp_create(NULL, - p_expr_new_ident(yasm_expr_int(INTNUM_val))); - yasm_vps_append(&vps, vp); - get_next_token(); /* INTNUM */ - - if (!expect(INTNUM)) { - yasm_vps_delete(&vps); - return NULL; - } - vp = yasm_vp_create(NULL, - p_expr_new_ident(yasm_expr_int(INTNUM_val))); - yasm_vps_append(&vps, vp); - get_next_token(); /* INTNUM */ - - yasm_dbgfmt_directive(p_object, "loc", &vps, cur_line); - - yasm_vps_delete(&vps); - return NULL; - case DIR_TYPE: - /* ID ',' '@' ID */ - get_next_token(); /* DIR_TYPE */ - yasm_vps_initialize(&vps); - - if (!expect(ID)) return NULL; - vp = yasm_vp_create(ID_val, NULL); - yasm_vps_append(&vps, vp); - get_next_token(); /* ID */ - - if (!expect(',')) { - yasm_vps_delete(&vps); - return NULL; - } - get_next_token(); /* ',' */ - - if (!expect('@')) { - yasm_vps_delete(&vps); - return NULL; - } - get_next_token(); /* '@' */ - - if (!expect(ID)) { - yasm_vps_delete(&vps); - return NULL; - } - vp = yasm_vp_create(ID_val, NULL); - yasm_vps_append(&vps, vp); - get_next_token(); /* ID */ - - yasm_objfmt_directive(p_object, "type", &vps, NULL, cur_line); - - yasm_vps_delete(&vps); - return NULL; - case DIR_SIZE: - /* ID ',' expr */ - get_next_token(); /* DIR_SIZE */ - yasm_vps_initialize(&vps); - - if (!expect(ID)) return NULL; - vp = yasm_vp_create(ID_val, NULL); - yasm_vps_append(&vps, vp); - get_next_token(); /* ID */ - - if (!expect(',')) { - yasm_vps_delete(&vps); - return NULL; - } - get_next_token(); /* ',' */ - - e = parse_expr(parser_gas); - if (!e) { - yasm_error_set(YASM_ERROR_SYNTAX, - N_("expression expected for `.size'")); - yasm_vps_delete(&vps); - return NULL; - } - vp = yasm_vp_create(NULL, e); - yasm_vps_append(&vps, vp); - - yasm_objfmt_directive(p_object, "size", &vps, NULL, cur_line); + yasm_object_directive(p_object, ".file", "gas", &vps, NULL, + cur_line); yasm_vps_delete(&vps); return NULL; @@ -862,46 +740,46 @@ parse_instr(yasm_parser_gas *parser_gas) static int parse_dirvals(yasm_parser_gas *parser_gas, yasm_valparamhead *vps) -{ - yasm_expr *e; - yasm_valparam *vp; - int num = 0; - - yasm_vps_initialize(vps); - - for (;;) { - e = parse_expr(parser_gas); - vp = yasm_vp_create(NULL, e); - yasm_vps_append(vps, vp); - num++; - if (curtok != ',') - break; - get_next_token(); /* ',' */ - } - return num; -} - -static int -parse_dirstrvals(yasm_parser_gas *parser_gas, yasm_valparamhead *vps) { yasm_valparam *vp; + yasm_expr *e; int num = 0; yasm_vps_initialize(vps); for (;;) { - if (!expect(STRING)) { - yasm_vps_delete(vps); - yasm_vps_initialize(vps); - return 0; + switch (curtok) { + case ID: + get_peek_token(parser_gas); + if (parser_gas->peek_token == ',' || + is_eol_tok(parser_gas->peek_token)) { + /* Just an ID */ + vp = yasm_vp_create(ID_val, NULL); + get_next_token(); /* ID */ + } else { + e = parse_expr(parser_gas); + vp = yasm_vp_create(NULL, e); + } + break; + case STRING: + vp = yasm_vp_create(STRING_val.contents, NULL); + get_next_token(); /* STRING */ + break; + case '@': + /* XXX: is throwing it away *really* the right thing? */ + get_next_token(); /* @ */ + continue; + default: + e = parse_expr(parser_gas); + if (!e) + return num; + vp = yasm_vp_create(NULL, e); + break; } - vp = yasm_vp_create(STRING_val.contents, NULL); yasm_vps_append(vps, vp); - get_next_token(); /* STRING */ num++; - if (curtok != ',') - break; - get_next_token(); /* ',' */ + if (curtok == ',') + get_next_token(); /* ',' */ } return num; } diff --git a/modules/parsers/gas/gas-parser.h b/modules/parsers/gas/gas-parser.h index 71b293f2..b9661689 100644 --- a/modules/parsers/gas/gas-parser.h +++ b/modules/parsers/gas/gas-parser.h @@ -54,25 +54,18 @@ enum tokentype { DIR_COMM, DIR_DATA, DIR_ENDR, - DIR_EXTERN, DIR_EQU, DIR_FILE, DIR_FILL, - DIR_GLOBAL, - DIR_IDENT, DIR_LEB128, DIR_LINE, - DIR_LOC, DIR_LOCAL, DIR_LCOMM, DIR_ORG, DIR_REPT, DIR_SECTION, DIR_SECTNAME, - DIR_SIZE, DIR_SKIP, - DIR_TYPE, - DIR_WEAK, DIR_ZERO, NONE }; diff --git a/modules/parsers/gas/gas-token.re b/modules/parsers/gas/gas-token.re index b1742bd5..52b331c3 100644 --- a/modules/parsers/gas/gas-token.re +++ b/modules/parsers/gas/gas-token.re @@ -362,12 +362,8 @@ scan: '.org' { parser_gas->state = INSTDIR; RETURN(DIR_ORG); } /* data visibility directives */ '.local' { parser_gas->state = INSTDIR; RETURN(DIR_LOCAL); } - '.global' { parser_gas->state = INSTDIR; RETURN(DIR_GLOBAL); } - '.globl' { parser_gas->state = INSTDIR; RETURN(DIR_GLOBAL); } '.comm' { parser_gas->state = INSTDIR; RETURN(DIR_COMM); } '.lcomm' { parser_gas->state = INSTDIR; RETURN(DIR_LCOMM); } - '.extern' { parser_gas->state = INSTDIR; RETURN(DIR_EXTERN); } - '.weak' { parser_gas->state = INSTDIR; RETURN(DIR_WEAK); } /* integer data declaration directives */ '.byte' { lvalp->int_info = 1; @@ -486,26 +482,10 @@ scan: '.fill' { parser_gas->state = INSTDIR; RETURN(DIR_FILL); } '.zero' { parser_gas->state = INSTDIR; RETURN(DIR_ZERO); } /* other directives */ - '.code16' { - yasm_arch_set_var(p_object->arch, "mode_bits", 16); - goto scan; - } - '.code32' { - yasm_arch_set_var(p_object->arch, "mode_bits", 32); - goto scan; - } - '.code64' { - yasm_arch_set_var(p_object->arch, "mode_bits", 64); - goto scan; - } '.equ' { parser_gas->state = INSTDIR; RETURN(DIR_EQU); } '.file' { parser_gas->state = INSTDIR; RETURN(DIR_FILE); } - '.ident' { parser_gas->state = INSTDIR; RETURN(DIR_IDENT); } '.line' { parser_gas->state = INSTDIR; RETURN(DIR_LINE); } - '.loc' { parser_gas->state = INSTDIR; RETURN(DIR_LOC); } '.set' { parser_gas->state = INSTDIR; RETURN(DIR_EQU); } - '.size' { parser_gas->state = INSTDIR; RETURN(DIR_SIZE); } - '.type' { parser_gas->state = INSTDIR; RETURN(DIR_TYPE); } /* label or maybe directive */ [_.][a-zA-Z0-9_$.]* { diff --git a/modules/parsers/nasm/nasm-parse.c b/modules/parsers/nasm/nasm-parse.c index 7d4d7d35..ab2625e9 100644 --- a/modules/parsers/nasm/nasm-parse.c +++ b/modules/parsers/nasm/nasm-parse.c @@ -1074,98 +1074,22 @@ fix_directive_symrec(yasm_expr__item *ei, void *d) } static void -dir_extern(yasm_parser_nasm *parser_nasm, yasm_valparamhead *valparams, - yasm_valparamhead *objext_valparams) +dir_absolute(yasm_object *object, yasm_valparamhead *valparams, + yasm_valparamhead *objext_valparams, unsigned long line) { yasm_valparam *vp = yasm_vps_first(valparams); - yasm_objfmt_extern_declare(p_object, vp->val, objext_valparams, cur_line); -} - -static void -dir_global(yasm_parser_nasm *parser_nasm, yasm_valparamhead *valparams, - yasm_valparamhead *objext_valparams) -{ - yasm_valparam *vp = yasm_vps_first(valparams); - yasm_objfmt_global_declare(p_object, vp->val, objext_valparams, cur_line); -} - -static void -dir_common(yasm_parser_nasm *parser_nasm, yasm_valparamhead *valparams, - yasm_valparamhead *objext_valparams) -{ - yasm_valparam *vp = yasm_vps_first(valparams); - yasm_valparam *vp2 = yasm_vps_next(vp); - unsigned long line = cur_line; - - if (!vp2 || (!vp2->val && !vp2->param)) { - yasm_error_set(YASM_ERROR_SYNTAX, - N_("no size specified in %s declaration"), "COMMON"); - return; - } - if (vp2->val) { - yasm_objfmt_common_declare(p_object, vp->val, - p_expr_new_ident(yasm_expr_sym( - yasm_symtab_use(p_symtab, vp2->val, line))), - objext_valparams, line); - } else if (vp2->param) { - yasm_objfmt_common_declare(p_object, vp->val, vp2->param, - objext_valparams, line); - vp2->param = NULL; - } -} + yasm_expr *start = yasm_vp_expr(vp, object->symtab, line); -static void -dir_section(yasm_parser_nasm *parser_nasm, yasm_valparamhead *valparams, - yasm_valparamhead *objext_valparams) -{ - yasm_section *new_section = - yasm_objfmt_section_switch(p_object, valparams, objext_valparams, - cur_line); - if (new_section) { - cursect = new_section; - parser_nasm->prev_bc = yasm_section_bcs_last(new_section); - } else - yasm_error_set(YASM_ERROR_SYNTAX, N_("invalid argument to [%s]"), - "SECTION"); + object->cur_section = yasm_object_create_absolute(object, start, line); } static void -dir_absolute(yasm_parser_nasm *parser_nasm, yasm_valparamhead *valparams, - yasm_valparamhead *objext_valparams) +dir_align(yasm_object *object, yasm_valparamhead *valparams, + yasm_valparamhead *objext_valparams, unsigned long line) { yasm_valparam *vp = yasm_vps_first(valparams); - unsigned long line = cur_line; - /* it can be just an ID or a complete expression, so handle both. */ - if (vp->val) - cursect = - yasm_object_create_absolute(p_object, - p_expr_new_ident(yasm_expr_sym( - yasm_symtab_use(p_symtab, vp->val, line))), line); - else if (vp->param) { - cursect = - yasm_object_create_absolute(p_object, vp->param, line); - vp->param = NULL; - } - parser_nasm->prev_bc = yasm_section_bcs_last(cursect); -} - -static void -dir_align(yasm_parser_nasm *parser_nasm, yasm_valparamhead *valparams, - yasm_valparamhead *objext_valparams) -{ - /*@only@*/ yasm_expr *boundval; + yasm_expr *boundval = yasm_vp_expr(vp, object->symtab, line); /*@depedent@*/ yasm_intnum *boundintn; - yasm_valparam *vp = yasm_vps_first(valparams); - - /* it can be just an ID or a complete expression, so handle both. */ - vp = yasm_vps_first(valparams); - if (vp->val) - boundval = p_expr_new_ident(yasm_expr_sym( - yasm_symtab_use(p_symtab, vp->val, cur_line))); - else if (vp->param) { - boundval = vp->param; - vp->param = NULL; - } /* Largest .align in the section specifies section alignment. * Note: this doesn't match NASM behavior, but is a lot more @@ -1177,43 +1101,19 @@ dir_align(yasm_parser_nasm *parser_nasm, yasm_valparamhead *valparams, /* Alignments must be a power of two. */ if (is_exp2(boundint)) { - if (boundint > yasm_section_get_align(cursect)) - yasm_section_set_align(cursect, boundint, cur_line); + if (boundint > yasm_section_get_align(object->cur_section)) + yasm_section_set_align(object->cur_section, boundint, line); } } /* As this directive is called only when nop is used as fill, always * use arch (nop) fill. */ - parser_nasm->prev_bc = - yasm_section_bcs_append(cursect, - yasm_bc_create_align(boundval, NULL, NULL, - /*yasm_section_is_code(cursect) ?*/ - yasm_arch_get_fill(p_object->arch)/* : NULL*/, - cur_line)); -} - -static void -dir_cpu(yasm_parser_nasm *parser_nasm, yasm_valparamhead *valparams, - yasm_valparamhead *objext_valparams) -{ - yasm_valparam *vp; - yasm_vps_foreach(vp, valparams) { - if (vp->val) - yasm_arch_parse_cpu(p_object->arch, vp->val, strlen(vp->val)); - else if (vp->param) { - const yasm_intnum *intcpu; - intcpu = yasm_expr_get_intnum(&vp->param, 0); - if (!intcpu) - yasm_error_set(YASM_ERROR_SYNTAX, - N_("invalid argument to [%s]"), "CPU"); - else { - char strcpu[16]; - sprintf(strcpu, "%lu", yasm_intnum_get_uint(intcpu)); - yasm_arch_parse_cpu(p_object->arch, strcpu, strlen(strcpu)); - } - } - } + yasm_section_bcs_append(object->cur_section, + yasm_bc_create_align(boundval, NULL, NULL, + /*yasm_section_is_code(object->cur_section) ?*/ + yasm_arch_get_fill(object->arch)/* : NULL*/, + line)); } static void @@ -1221,57 +1121,21 @@ nasm_parser_directive(yasm_parser_nasm *parser_nasm, const char *name, yasm_valparamhead *valparams, yasm_valparamhead *objext_valparams) { - yasm_valparam *vp; unsigned long line = cur_line; - static const struct { - const char *name; - unsigned int required_arg:1; - unsigned int id_only:1; - void (*func) (yasm_parser_nasm *, yasm_valparamhead *, - yasm_valparamhead *); - } dirs[] = { - {"EXTERN", 1, 1, dir_extern}, - {"GLOBAL", 1, 1, dir_global}, - {"COMMON", 1, 1, dir_common}, - {"SECTION", 1, 0, dir_section}, - {"SEGMENT", 1, 0, dir_section}, - {"ABSOLUTE", 1, 0, dir_absolute}, - {"ALIGN", 1, 0, dir_align}, - {"CPU", 1, 0, dir_cpu} - }; - size_t i; - - /* Handle (mostly) output-format independent directives here */ - for (i=0; ival) { - yasm_error_set(YASM_ERROR_SYNTAX, - N_("invalid argument to [%s]"), dirs[i].name); - break; - } - dirs[i].func(parser_nasm, valparams, objext_valparams); - break; - } - } - if (i != NELEMS(dirs)) { - ; - } else if (!yasm_arch_parse_directive(p_object->arch, name, valparams, - objext_valparams, p_object, line)) { - ; - } else if (!yasm_dbgfmt_directive(p_object, name, valparams, line)) { + if (!yasm_object_directive(p_object, name, "nasm", valparams, + objext_valparams, line)) ; - } else if (yasm_objfmt_directive(p_object, name, valparams, - objext_valparams, line)) { - yasm_error_set(YASM_ERROR_SYNTAX, N_("unrecognized directive [%s]"), + else if (strcasecmp(name, "absolute") == 0) + dir_absolute(p_object, valparams, objext_valparams, line); + else if (strcasecmp(name, "align") == 0) + dir_align(p_object, valparams, objext_valparams, line); + else + yasm_error_set(YASM_ERROR_SYNTAX, N_("unrecognized directive `%s'"), name); - } + + /* In case cursect changed or a bytecode was added, update prev_bc. */ + parser_nasm->prev_bc = yasm_section_bcs_last(cursect); if (valparams) yasm_vps_delete(valparams);