OLD | NEW |
1 /* | 1 /* |
2 * CodeView debugging format - symbol and line information | 2 * CodeView debugging format - symbol and line information |
3 * | 3 * |
4 * Copyright (C) 2006-2007 Peter Johnson | 4 * Copyright (C) 2006-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. |
(...skipping 10 matching lines...) Expand all Loading... |
21 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR OTHER CONTRIBUTORS BE | 21 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR OTHER CONTRIBUTORS BE |
22 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | 22 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
23 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | 23 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | 24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
25 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | 25 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
26 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | 26 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | 27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
28 * POSSIBILITY OF SUCH DAMAGE. | 28 * POSSIBILITY OF SUCH DAMAGE. |
29 */ | 29 */ |
30 #include <util.h> | 30 #include <util.h> |
31 /*@unused@*/ RCSID("$Id: cv-symline.c 2258 2010-01-03 01:04:18Z peter $"); | |
32 | 31 |
33 #include <libyasm.h> | 32 #include <libyasm.h> |
34 | 33 |
35 #include "cv-dbgfmt.h" | 34 #include "cv-dbgfmt.h" |
36 | 35 |
37 enum cv8_symheadtype { | 36 enum cv8_symheadtype { |
38 CV8_DEBUG_SYMS = 0xF1, /* CV5 symbol information */ | 37 CV8_DEBUG_SYMS = 0xF1, /* CV5 symbol information */ |
39 CV8_LINE_NUMS = 0xF2, /* line numbers for a section */ | 38 CV8_LINE_NUMS = 0xF2, /* line numbers for a section */ |
40 CV8_FILE_STRTAB = 0xF3, /* filename string table */ | 39 CV8_FILE_STRTAB = 0xF3, /* filename string table */ |
41 CV8_FILE_INFO = 0xF4 /* source file info */ | 40 CV8_FILE_INFO = 0xF4 /* source file info */ |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
156 } args[10]; | 155 } args[10]; |
157 } cv_sym; | 156 } cv_sym; |
158 | 157 |
159 /* Bytecode callback function prototypes */ | 158 /* Bytecode callback function prototypes */ |
160 static void cv8_symhead_bc_destroy(void *contents); | 159 static void cv8_symhead_bc_destroy(void *contents); |
161 static void cv8_symhead_bc_print(const void *contents, FILE *f, | 160 static void cv8_symhead_bc_print(const void *contents, FILE *f, |
162 int indent_level); | 161 int indent_level); |
163 static int cv8_symhead_bc_calc_len | 162 static int cv8_symhead_bc_calc_len |
164 (yasm_bytecode *bc, yasm_bc_add_span_func add_span, void *add_span_data); | 163 (yasm_bytecode *bc, yasm_bc_add_span_func add_span, void *add_span_data); |
165 static int cv8_symhead_bc_tobytes | 164 static int cv8_symhead_bc_tobytes |
166 (yasm_bytecode *bc, unsigned char **bufp, void *d, | 165 (yasm_bytecode *bc, unsigned char **bufp, unsigned char *bufstart, void *d, |
167 yasm_output_value_func output_value, | 166 yasm_output_value_func output_value, |
168 /*@null@*/ yasm_output_reloc_func output_reloc); | 167 /*@null@*/ yasm_output_reloc_func output_reloc); |
169 | 168 |
170 static void cv8_fileinfo_bc_destroy(void *contents); | 169 static void cv8_fileinfo_bc_destroy(void *contents); |
171 static void cv8_fileinfo_bc_print(const void *contents, FILE *f, | 170 static void cv8_fileinfo_bc_print(const void *contents, FILE *f, |
172 int indent_level); | 171 int indent_level); |
173 static int cv8_fileinfo_bc_calc_len | 172 static int cv8_fileinfo_bc_calc_len |
174 (yasm_bytecode *bc, yasm_bc_add_span_func add_span, void *add_span_data); | 173 (yasm_bytecode *bc, yasm_bc_add_span_func add_span, void *add_span_data); |
175 static int cv8_fileinfo_bc_tobytes | 174 static int cv8_fileinfo_bc_tobytes |
176 (yasm_bytecode *bc, unsigned char **bufp, void *d, | 175 (yasm_bytecode *bc, unsigned char **bufp, unsigned char *bufstart, void *d, |
177 yasm_output_value_func output_value, | 176 yasm_output_value_func output_value, |
178 /*@null@*/ yasm_output_reloc_func output_reloc); | 177 /*@null@*/ yasm_output_reloc_func output_reloc); |
179 | 178 |
180 static void cv8_lineinfo_bc_destroy(void *contents); | 179 static void cv8_lineinfo_bc_destroy(void *contents); |
181 static void cv8_lineinfo_bc_print(const void *contents, FILE *f, | 180 static void cv8_lineinfo_bc_print(const void *contents, FILE *f, |
182 int indent_level); | 181 int indent_level); |
183 static int cv8_lineinfo_bc_calc_len | 182 static int cv8_lineinfo_bc_calc_len |
184 (yasm_bytecode *bc, yasm_bc_add_span_func add_span, void *add_span_data); | 183 (yasm_bytecode *bc, yasm_bc_add_span_func add_span, void *add_span_data); |
185 static int cv8_lineinfo_bc_tobytes | 184 static int cv8_lineinfo_bc_tobytes |
186 (yasm_bytecode *bc, unsigned char **bufp, void *d, | 185 (yasm_bytecode *bc, unsigned char **bufp, unsigned char *bufstart, void *d, |
187 yasm_output_value_func output_value, | 186 yasm_output_value_func output_value, |
188 /*@null@*/ yasm_output_reloc_func output_reloc); | 187 /*@null@*/ yasm_output_reloc_func output_reloc); |
189 | 188 |
190 static void cv_sym_bc_destroy(void *contents); | 189 static void cv_sym_bc_destroy(void *contents); |
191 static void cv_sym_bc_print(const void *contents, FILE *f, int indent_level); | 190 static void cv_sym_bc_print(const void *contents, FILE *f, int indent_level); |
192 static int cv_sym_bc_calc_len | 191 static int cv_sym_bc_calc_len |
193 (yasm_bytecode *bc, yasm_bc_add_span_func add_span, void *add_span_data); | 192 (yasm_bytecode *bc, yasm_bc_add_span_func add_span, void *add_span_data); |
194 static int cv_sym_bc_tobytes | 193 static int cv_sym_bc_tobytes |
195 (yasm_bytecode *bc, unsigned char **bufp, void *d, | 194 (yasm_bytecode *bc, unsigned char **bufp, unsigned char *bufstart, void *d, |
196 yasm_output_value_func output_value, | 195 yasm_output_value_func output_value, |
197 /*@null@*/ yasm_output_reloc_func output_reloc); | 196 /*@null@*/ yasm_output_reloc_func output_reloc); |
198 | 197 |
199 /* Bytecode callback structures */ | 198 /* Bytecode callback structures */ |
200 static const yasm_bytecode_callback cv8_symhead_bc_callback = { | 199 static const yasm_bytecode_callback cv8_symhead_bc_callback = { |
201 cv8_symhead_bc_destroy, | 200 cv8_symhead_bc_destroy, |
202 cv8_symhead_bc_print, | 201 cv8_symhead_bc_print, |
203 yasm_bc_finalize_common, | 202 yasm_bc_finalize_common, |
204 NULL, | 203 NULL, |
205 cv8_symhead_bc_calc_len, | 204 cv8_symhead_bc_calc_len, |
(...skipping 425 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
631 cv8_set_symhead_end(head, yasm_section_bcs_last(info.debug_symline)); | 630 cv8_set_symhead_end(head, yasm_section_bcs_last(info.debug_symline)); |
632 } | 631 } |
633 | 632 |
634 /* Already aligned 4 */ | 633 /* Already aligned 4 */ |
635 | 634 |
636 /* Output debugging symbols */ | 635 /* Output debugging symbols */ |
637 head = cv8_add_symhead(info.debug_symline, CV8_DEBUG_SYMS, 0); | 636 head = cv8_add_symhead(info.debug_symline, CV8_DEBUG_SYMS, 0); |
638 /* add object and compile flag first */ | 637 /* add object and compile flag first */ |
639 cv8_add_sym_objname(info.debug_symline, | 638 cv8_add_sym_objname(info.debug_symline, |
640 yasm__abspath(object->obj_filename)); | 639 yasm__abspath(object->obj_filename)); |
641 cv8_add_sym_compile(object, info.debug_symline, | 640 if (getenv("YASM_TEST_SUITE")) |
642 yasm__xstrdup(PACKAGE_NAME " " PACKAGE_INTVER "." | 641 cv8_add_sym_compile(object, info.debug_symline, |
643 PACKAGE_BUILD)); | 642 yasm__xstrdup("yasm HEAD")); |
| 643 else |
| 644 cv8_add_sym_compile(object, info.debug_symline, |
| 645 yasm__xstrdup(PACKAGE_STRING)); |
644 /* then iterate through symbol table */ | 646 /* then iterate through symbol table */ |
645 yasm_symtab_traverse(object->symtab, &info, cv_generate_sym); | 647 yasm_symtab_traverse(object->symtab, &info, cv_generate_sym); |
646 cv8_set_symhead_end(head, yasm_section_bcs_last(info.debug_symline)); | 648 cv8_set_symhead_end(head, yasm_section_bcs_last(info.debug_symline)); |
647 | 649 |
648 /* Align 4 at end */ | 650 /* Align 4 at end */ |
649 bc = yasm_bc_create_align | 651 bc = yasm_bc_create_align |
650 (yasm_expr_create_ident(yasm_expr_int(yasm_intnum_create_uint(4)), 0), | 652 (yasm_expr_create_ident(yasm_expr_int(yasm_intnum_create_uint(4)), 0), |
651 NULL, NULL, NULL, 0); | 653 NULL, NULL, NULL, 0); |
652 yasm_bc_finalize(bc, yasm_cv__append_bc(info.debug_symline, bc)); | 654 yasm_bc_finalize(bc, yasm_cv__append_bc(info.debug_symline, bc)); |
653 yasm_bc_calc_len(bc, NULL, NULL); | 655 yasm_bc_calc_len(bc, NULL, NULL); |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
717 static int | 719 static int |
718 cv8_symhead_bc_calc_len(yasm_bytecode *bc, yasm_bc_add_span_func add_span, | 720 cv8_symhead_bc_calc_len(yasm_bytecode *bc, yasm_bc_add_span_func add_span, |
719 void *add_span_data) | 721 void *add_span_data) |
720 { | 722 { |
721 yasm_internal_error(N_("tried to calc_len a codeview symhead bytecode")); | 723 yasm_internal_error(N_("tried to calc_len a codeview symhead bytecode")); |
722 /*@notreached@*/ | 724 /*@notreached@*/ |
723 return 0; | 725 return 0; |
724 } | 726 } |
725 | 727 |
726 static int | 728 static int |
727 cv8_symhead_bc_tobytes(yasm_bytecode *bc, unsigned char **bufp, void *d, | 729 cv8_symhead_bc_tobytes(yasm_bytecode *bc, unsigned char **bufp, |
| 730 unsigned char *bufstart, void *d, |
728 yasm_output_value_func output_value, | 731 yasm_output_value_func output_value, |
729 yasm_output_reloc_func output_reloc) | 732 yasm_output_reloc_func output_reloc) |
730 { | 733 { |
731 yasm_object *object = yasm_section_get_object(bc->section); | 734 yasm_object *object = yasm_section_get_object(bc->section); |
732 cv8_symhead *head = (cv8_symhead *)bc->contents; | 735 cv8_symhead *head = (cv8_symhead *)bc->contents; |
733 unsigned char *buf = *bufp; | 736 unsigned char *buf = *bufp; |
734 yasm_intnum *intn, *cval; | 737 yasm_intnum *intn, *cval; |
735 | 738 |
736 cval = yasm_intnum_create_uint(4); | 739 cval = yasm_intnum_create_uint(4); |
737 /* Output "version" if first */ | 740 /* Output "version" if first */ |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
790 static int | 793 static int |
791 cv8_fileinfo_bc_calc_len(yasm_bytecode *bc, yasm_bc_add_span_func add_span, | 794 cv8_fileinfo_bc_calc_len(yasm_bytecode *bc, yasm_bc_add_span_func add_span, |
792 void *add_span_data) | 795 void *add_span_data) |
793 { | 796 { |
794 yasm_internal_error(N_("tried to calc_len a codeview fileinfo bytecode")); | 797 yasm_internal_error(N_("tried to calc_len a codeview fileinfo bytecode")); |
795 /*@notreached@*/ | 798 /*@notreached@*/ |
796 return 0; | 799 return 0; |
797 } | 800 } |
798 | 801 |
799 static int | 802 static int |
800 cv8_fileinfo_bc_tobytes(yasm_bytecode *bc, unsigned char **bufp, void *d, | 803 cv8_fileinfo_bc_tobytes(yasm_bytecode *bc, unsigned char **bufp, |
| 804 unsigned char *bufstart, void *d, |
801 yasm_output_value_func output_value, | 805 yasm_output_value_func output_value, |
802 yasm_output_reloc_func output_reloc) | 806 yasm_output_reloc_func output_reloc) |
803 { | 807 { |
804 yasm_object *object = yasm_section_get_object(bc->section); | 808 yasm_object *object = yasm_section_get_object(bc->section); |
805 cv8_fileinfo *fi = (cv8_fileinfo *)bc->contents; | 809 cv8_fileinfo *fi = (cv8_fileinfo *)bc->contents; |
806 unsigned char *buf = *bufp; | 810 unsigned char *buf = *bufp; |
807 yasm_intnum *cval; | 811 yasm_intnum *cval; |
808 int i; | 812 int i; |
809 | 813 |
810 /* Offset in filename string table */ | 814 /* Offset in filename string table */ |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
857 static int | 861 static int |
858 cv8_lineinfo_bc_calc_len(yasm_bytecode *bc, yasm_bc_add_span_func add_span, | 862 cv8_lineinfo_bc_calc_len(yasm_bytecode *bc, yasm_bc_add_span_func add_span, |
859 void *add_span_data) | 863 void *add_span_data) |
860 { | 864 { |
861 yasm_internal_error(N_("tried to calc_len a codeview linehead bytecode")); | 865 yasm_internal_error(N_("tried to calc_len a codeview linehead bytecode")); |
862 /*@notreached@*/ | 866 /*@notreached@*/ |
863 return 0; | 867 return 0; |
864 } | 868 } |
865 | 869 |
866 static int | 870 static int |
867 cv8_lineinfo_bc_tobytes(yasm_bytecode *bc, unsigned char **bufp, void *d, | 871 cv8_lineinfo_bc_tobytes(yasm_bytecode *bc, unsigned char **bufp, |
| 872 unsigned char *bufstart, void *d, |
868 yasm_output_value_func output_value, | 873 yasm_output_value_func output_value, |
869 yasm_output_reloc_func output_reloc) | 874 yasm_output_reloc_func output_reloc) |
870 { | 875 { |
871 yasm_object *object = yasm_section_get_object(bc->section); | 876 yasm_object *object = yasm_section_get_object(bc->section); |
872 cv8_lineinfo *li = (cv8_lineinfo *)bc->contents; | 877 cv8_lineinfo *li = (cv8_lineinfo *)bc->contents; |
873 unsigned char *buf = *bufp; | 878 unsigned char *buf = *bufp; |
874 yasm_intnum *cval; | 879 yasm_intnum *cval; |
875 unsigned long i; | 880 unsigned long i; |
876 cv8_lineset *ls; | 881 cv8_lineset *ls; |
877 | 882 |
878 /* start offset and section */ | 883 /* start offset and section */ |
879 cv_out_sym(li->sectsym, 0, bc, &buf, d, output_value); | 884 cv_out_sym(li->sectsym, (unsigned long)(buf - bufstart), bc, &buf, |
| 885 d, output_value); |
880 | 886 |
881 /* Two bytes of pad/alignment */ | 887 /* Two bytes of pad/alignment */ |
882 YASM_WRITE_8(buf, 0); | 888 YASM_WRITE_8(buf, 0); |
883 YASM_WRITE_8(buf, 0); | 889 YASM_WRITE_8(buf, 0); |
884 | 890 |
885 /* Section length covered by line number info */ | 891 /* Section length covered by line number info */ |
886 cval = yasm_calc_bc_dist(yasm_section_bcs_first(li->sect), | 892 cval = yasm_calc_bc_dist(yasm_section_bcs_first(li->sect), |
887 yasm_section_bcs_last(li->sect)); | 893 yasm_section_bcs_last(li->sect)); |
888 yasm_arch_intnum_tobytes(object->arch, cval, buf, 4, 32, 0, bc, 0); | 894 yasm_arch_intnum_tobytes(object->arch, cval, buf, 4, 32, 0, bc, 0); |
889 buf += 4; | 895 buf += 4; |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1012 static int | 1018 static int |
1013 cv_sym_bc_calc_len(yasm_bytecode *bc, yasm_bc_add_span_func add_span, | 1019 cv_sym_bc_calc_len(yasm_bytecode *bc, yasm_bc_add_span_func add_span, |
1014 void *add_span_data) | 1020 void *add_span_data) |
1015 { | 1021 { |
1016 yasm_internal_error(N_("tried to calc_len a codeview sym bytecode")); | 1022 yasm_internal_error(N_("tried to calc_len a codeview sym bytecode")); |
1017 /*@notreached@*/ | 1023 /*@notreached@*/ |
1018 return 0; | 1024 return 0; |
1019 } | 1025 } |
1020 | 1026 |
1021 static int | 1027 static int |
1022 cv_sym_bc_tobytes(yasm_bytecode *bc, unsigned char **bufp, void *d, | 1028 cv_sym_bc_tobytes(yasm_bytecode *bc, unsigned char **bufp, |
| 1029 unsigned char *bufstart, void *d, |
1023 yasm_output_value_func output_value, | 1030 yasm_output_value_func output_value, |
1024 yasm_output_reloc_func output_reloc) | 1031 yasm_output_reloc_func output_reloc) |
1025 { | 1032 { |
1026 yasm_object *object = yasm_section_get_object(bc->section); | 1033 yasm_object *object = yasm_section_get_object(bc->section); |
1027 cv_sym *cvs = (cv_sym *)bc->contents; | 1034 cv_sym *cvs = (cv_sym *)bc->contents; |
1028 unsigned char *buf = *bufp; | 1035 unsigned char *buf = *bufp; |
1029 yasm_intnum *cval; | 1036 yasm_intnum *cval; |
1030 const char *ch = cvs->format; | 1037 const char *ch = cvs->format; |
1031 size_t len; | 1038 size_t len; |
1032 int arg = 0; | 1039 int arg = 0; |
(...skipping 21 matching lines...) Expand all Loading... |
1054 buf += 2; | 1061 buf += 2; |
1055 break; | 1062 break; |
1056 case 'w': | 1063 case 'w': |
1057 yasm_intnum_set_uint(cval, cvs->args[arg++].i); | 1064 yasm_intnum_set_uint(cval, cvs->args[arg++].i); |
1058 yasm_arch_intnum_tobytes(object->arch, cval, buf, 4, 32, 0, | 1065 yasm_arch_intnum_tobytes(object->arch, cval, buf, 4, 32, 0, |
1059 bc, 0); | 1066 bc, 0); |
1060 buf += 4; | 1067 buf += 4; |
1061 break; | 1068 break; |
1062 case 'Y': | 1069 case 'Y': |
1063 cv_out_sym((yasm_symrec *)cvs->args[arg++].p, | 1070 cv_out_sym((yasm_symrec *)cvs->args[arg++].p, |
1064 (unsigned long)(buf-(*bufp)), bc, &buf, d, | 1071 (unsigned long)(buf-bufstart), bc, &buf, d, |
1065 output_value); | 1072 output_value); |
1066 break; | 1073 break; |
1067 case 'T': | 1074 case 'T': |
1068 yasm_intnum_set_uint(cval, cvs->args[arg++].i); | 1075 yasm_intnum_set_uint(cval, cvs->args[arg++].i); |
1069 yasm_arch_intnum_tobytes(object->arch, cval, buf, 4, 32, 0, | 1076 yasm_arch_intnum_tobytes(object->arch, cval, buf, 4, 32, 0, |
1070 bc, 0); | 1077 bc, 0); |
1071 buf += 4; /* XXX: will be 2 in CV4 */ | 1078 buf += 4; /* XXX: will be 2 in CV4 */ |
1072 break; | 1079 break; |
1073 case 'S': | 1080 case 'S': |
1074 len = strlen((char *)cvs->args[arg].p); | 1081 len = strlen((char *)cvs->args[arg].p); |
(...skipping 13 matching lines...) Expand all Loading... |
1088 yasm_internal_error(N_("unknown leaf format character")); | 1095 yasm_internal_error(N_("unknown leaf format character")); |
1089 } | 1096 } |
1090 ch++; | 1097 ch++; |
1091 } | 1098 } |
1092 | 1099 |
1093 *bufp = buf; | 1100 *bufp = buf; |
1094 | 1101 |
1095 yasm_intnum_destroy(cval); | 1102 yasm_intnum_destroy(cval); |
1096 return 0; | 1103 return 0; |
1097 } | 1104 } |
OLD | NEW |