| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Extended Dynamic Object format | 2 * Extended Dynamic Object format |
| 3 * | 3 * |
| 4 * Copyright (C) 2004-2007 Peter Johnson | 4 * Copyright (C) 2004-2007 Peter Johnson |
| 5 * | 5 * |
| 6 * Redistribution and use in source and binary forms, with or without | 6 * Redistribution and use in source and binary forms, with or without |
| 7 * modification, are permitted provided that the following conditions | 7 * modification, are permitted provided that the following conditions |
| 8 * are met: | 8 * are met: |
| 9 * 1. Redistributions of source code must retain the above copyright | 9 * 1. Redistributions of source code must retain the above copyright |
| 10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
| 11 * 2. Redistributions in binary form must reproduce the above copyright | 11 * 2. Redistributions in binary form must reproduce the above copyright |
| 12 * notice, this list of conditions and the following disclaimer in the | 12 * notice, this list of conditions and the following disclaimer in the |
| 13 * documentation and/or other materials provided with the distribution. | 13 * documentation and/or other materials provided with the distribution. |
| 14 * | 14 * |
| 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND OTHER CONTRIBUTORS ``AS IS'' | 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND OTHER CONTRIBUTORS ``AS IS'' |
| 16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | 16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| 18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR OTHER CONTRIBUTORS BE | 18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR OTHER CONTRIBUTORS BE |
| 19 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | 19 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| 20 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | 20 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| 21 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | 21 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| 22 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | 22 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| 23 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | 23 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| 24 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | 24 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
| 25 * POSSIBILITY OF SUCH DAMAGE. | 25 * POSSIBILITY OF SUCH DAMAGE. |
| 26 */ | 26 */ |
| 27 #include <util.h> | 27 #include <util.h> |
| 28 /*@unused@*/ RCSID("$Id: xdf-objfmt.c 2166 2009-01-02 08:33:21Z peter $"); | 28 /*@unused@*/ RCSID("$Id: xdf-objfmt.c 2310 2010-03-28 19:28:54Z peter $"); |
| 29 | 29 |
| 30 #include <libyasm.h> | 30 #include <libyasm.h> |
| 31 | 31 |
| 32 | 32 |
| 33 #define REGULAR_OUTBUF_SIZE 1024 | 33 #define REGULAR_OUTBUF_SIZE 1024 |
| 34 | 34 |
| 35 #define XDF_MAGIC 0x87654322 | 35 #define XDF_MAGIC 0x87654322 |
| 36 | 36 |
| 37 #define XDF_SYM_EXTERN 1 | 37 #define XDF_SYM_EXTERN 1 |
| 38 #define XDF_SYM_GLOBAL 2 | 38 #define XDF_SYM_GLOBAL 2 |
| (...skipping 558 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 597 | 597 |
| 598 yasm_xfree(info.buf); | 598 yasm_xfree(info.buf); |
| 599 } | 599 } |
| 600 | 600 |
| 601 static void | 601 static void |
| 602 xdf_objfmt_destroy(yasm_objfmt *objfmt) | 602 xdf_objfmt_destroy(yasm_objfmt *objfmt) |
| 603 { | 603 { |
| 604 yasm_xfree(objfmt); | 604 yasm_xfree(objfmt); |
| 605 } | 605 } |
| 606 | 606 |
| 607 static xdf_section_data * | 607 static void |
| 608 xdf_objfmt_init_new_section(yasm_object *object, yasm_section *sect, | 608 xdf_objfmt_init_new_section(yasm_section *sect, unsigned long line) |
| 609 const char *sectname, unsigned long line) | |
| 610 { | 609 { |
| 610 yasm_object *object = yasm_section_get_object(sect); |
| 611 const char *sectname = yasm_section_get_name(sect); |
| 611 yasm_objfmt_xdf *objfmt_xdf = (yasm_objfmt_xdf *)object->objfmt; | 612 yasm_objfmt_xdf *objfmt_xdf = (yasm_objfmt_xdf *)object->objfmt; |
| 612 xdf_section_data *data; | 613 xdf_section_data *data; |
| 613 yasm_symrec *sym; | 614 yasm_symrec *sym; |
| 614 | 615 |
| 615 data = yasm_xmalloc(sizeof(xdf_section_data)); | 616 data = yasm_xmalloc(sizeof(xdf_section_data)); |
| 616 data->scnum = objfmt_xdf->parse_scnum++; | 617 data->scnum = objfmt_xdf->parse_scnum++; |
| 617 data->flags = 0; | 618 data->flags = 0; |
| 618 data->addr = NULL; | 619 data->addr = NULL; |
| 619 data->vaddr = NULL; | 620 data->vaddr = NULL; |
| 620 data->scnptr = 0; | 621 data->scnptr = 0; |
| 621 data->size = 0; | 622 data->size = 0; |
| 622 data->relptr = 0; | 623 data->relptr = 0; |
| 623 data->nreloc = 0; | 624 data->nreloc = 0; |
| 624 yasm_section_add_data(sect, &xdf_section_data_cb, data); | 625 yasm_section_add_data(sect, &xdf_section_data_cb, data); |
| 625 | 626 |
| 626 sym = yasm_symtab_define_label(object->symtab, sectname, | 627 sym = yasm_symtab_define_label(object->symtab, sectname, |
| 627 yasm_section_bcs_first(sect), 1, line); | 628 yasm_section_bcs_first(sect), 1, line); |
| 628 data->sym = sym; | 629 data->sym = sym; |
| 629 return data; | |
| 630 } | 630 } |
| 631 | 631 |
| 632 static yasm_section * | 632 static yasm_section * |
| 633 xdf_objfmt_add_default_section(yasm_object *object) | 633 xdf_objfmt_add_default_section(yasm_object *object) |
| 634 { | 634 { |
| 635 yasm_section *retval; | 635 yasm_section *retval; |
| 636 xdf_section_data *xsd; | |
| 637 int isnew; | 636 int isnew; |
| 638 | 637 |
| 639 retval = yasm_object_get_general(object, ".text", 0, 1, 0, &isnew, 0); | 638 retval = yasm_object_get_general(object, ".text", 0, 1, 0, &isnew, 0); |
| 640 if (isnew) { | 639 if (isnew) |
| 641 xsd = xdf_objfmt_init_new_section(object, retval, ".text", 0); | |
| 642 yasm_section_set_default(retval, 1); | 640 yasm_section_set_default(retval, 1); |
| 643 } | |
| 644 return retval; | 641 return retval; |
| 645 } | 642 } |
| 646 | 643 |
| 647 static int | 644 static int |
| 648 xdf_helper_use(void *obj, yasm_valparam *vp, unsigned long line, void *d, | 645 xdf_helper_use(void *obj, yasm_valparam *vp, unsigned long line, void *d, |
| 649 uintptr_t bits) | 646 uintptr_t bits) |
| 650 { | 647 { |
| 651 yasm_object *object = (yasm_object *)obj; | 648 yasm_object *object = (yasm_object *)obj; |
| 652 unsigned long *flags = (unsigned long *)d; | 649 unsigned long *flags = (unsigned long *)d; |
| 653 *flags &= ~(XDF_SECT_USE_16|XDF_SECT_USE_32|XDF_SECT_USE_64); | 650 *flags &= ~(XDF_SECT_USE_16|XDF_SECT_USE_32|XDF_SECT_USE_64); |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 743 yasm_intnum_destroy(data.vaddr); | 740 yasm_intnum_destroy(data.vaddr); |
| 744 if (data.absaddr) | 741 if (data.absaddr) |
| 745 yasm_intnum_destroy(data.absaddr); | 742 yasm_intnum_destroy(data.absaddr); |
| 746 return NULL; | 743 return NULL; |
| 747 } | 744 } |
| 748 } | 745 } |
| 749 | 746 |
| 750 retval = yasm_object_get_general(object, sectname, align, 1, resonly, | 747 retval = yasm_object_get_general(object, sectname, align, 1, resonly, |
| 751 &isnew, line); | 748 &isnew, line); |
| 752 | 749 |
| 753 if (isnew) | 750 xsd = yasm_section_get_data(retval, &xdf_section_data_cb); |
| 754 xsd = xdf_objfmt_init_new_section(object, retval, sectname, line); | |
| 755 else | |
| 756 xsd = yasm_section_get_data(retval, &xdf_section_data_cb); | |
| 757 | 751 |
| 758 if (isnew || yasm_section_is_default(retval)) { | 752 if (isnew || yasm_section_is_default(retval)) { |
| 759 yasm_section_set_default(retval, 0); | 753 yasm_section_set_default(retval, 0); |
| 760 xsd->flags = data.flags; | 754 xsd->flags = data.flags; |
| 761 if (data.absaddr) { | 755 if (data.absaddr) { |
| 762 if (xsd->addr) | 756 if (xsd->addr) |
| 763 yasm_intnum_destroy(xsd->addr); | 757 yasm_intnum_destroy(xsd->addr); |
| 764 xsd->addr = data.absaddr; | 758 xsd->addr = data.absaddr; |
| 765 } | 759 } |
| 766 if (data.vaddr) { | 760 if (data.vaddr) { |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 840 32, | 834 32, |
| 841 0, | 835 0, |
| 842 xdf_objfmt_dbgfmt_keywords, | 836 xdf_objfmt_dbgfmt_keywords, |
| 843 "null", | 837 "null", |
| 844 NULL, /* no directives */ | 838 NULL, /* no directives */ |
| 845 NULL, /* no standard macros */ | 839 NULL, /* no standard macros */ |
| 846 xdf_objfmt_create, | 840 xdf_objfmt_create, |
| 847 xdf_objfmt_output, | 841 xdf_objfmt_output, |
| 848 xdf_objfmt_destroy, | 842 xdf_objfmt_destroy, |
| 849 xdf_objfmt_add_default_section, | 843 xdf_objfmt_add_default_section, |
| 844 xdf_objfmt_init_new_section, |
| 850 xdf_objfmt_section_switch, | 845 xdf_objfmt_section_switch, |
| 851 xdf_objfmt_get_special_sym | 846 xdf_objfmt_get_special_sym |
| 852 }; | 847 }; |
| OLD | NEW |