Macos has an offset of 1 for DW_LNS_set_file. Also rewrite dwarf_file to not scan list twice and move check for <command line> to this function.
Unified · Split
| @@ -571,12 +571,16 @@ static void dwarf_file(TCCState *s1) · 570 unmodified lines | ||
| 571 | 571 | int i, j; |
| 572 | 572 | char *filename; |
| 573 | 573 | |
| 574 | + if (!strcmp(file->filename, "<command line>")) { | |
| 575 | + dwarf_line.cur_file = 1; | |
| 576 | + return; | |
| 577 | + } | |
| 574 | 578 | filename = strrchr(file->filename, '/'); |
| 575 | 579 | if (filename == NULL) { |
| 576 | 580 | for (i = 1; i < dwarf_line.filename_size; i++) |
| 577 | 581 | if (dwarf_line.filename_table[i].dir_entry == 0 && |
| 578 | 582 | strcmp(dwarf_line.filename_table[i].name, |
| 579 | − file->filename) == 0) { | |
| 583 | + file->filename) == 0) { | |
| 580 | 584 | dwarf_line.cur_file = i; |
| 581 | 585 | return; |
| 582 | 586 | } |
| @@ -593,7 +597,7 @@ static void dwarf_file(TCCState *s1) · 10 unmodified lines | ||
| 593 | 597 | for (j = 1; j < dwarf_line.filename_size; j++) |
| 594 | 598 | if (dwarf_line.filename_table[j].dir_entry == i && |
| 595 | 599 | strcmp(dwarf_line.filename_table[j].name, |
| 596 | − filename) == 0) { | |
| 600 | + filename) == 0) { | |
| 597 | 601 | *undo = '/'; |
| 598 | 602 | dwarf_line.cur_file = j; |
| 599 | 603 | return; |
| @@ -610,21 +614,15 @@ static void dwarf_file(TCCState *s1) · 10 unmodified lines | ||
| 610 | 614 | } |
| 611 | 615 | *undo = '/'; |
| 612 | 616 | } |
| 613 | − for (j = 1; j < dwarf_line.filename_size; j++) | |
| 614 | − if (dwarf_line.filename_table[j].dir_entry == i && | |
| 615 | − strcmp (dwarf_line.filename_table[j].name, filename) == 0) | |
| 616 | − break; | |
| 617 | − if (j == dwarf_line.filename_size) { | |
| 618 | − dwarf_line.filename_table = | |
| 619 | − (struct dwarf_filename_struct *) | |
| 620 | − tcc_realloc(dwarf_line.filename_table, | |
| 621 | − (dwarf_line.filename_size + 1) * | |
| 622 | − sizeof (struct dwarf_filename_struct)); | |
| 623 | − dwarf_line.filename_table[dwarf_line.filename_size].dir_entry = i; | |
| 624 | − dwarf_line.filename_table[dwarf_line.filename_size++].name = | |
| 625 | − tcc_strdup(filename); | |
| 626 | − dwarf_line.cur_file = j; | |
| 627 | − } | |
| 617 | + dwarf_line.filename_table = | |
| 618 | + (struct dwarf_filename_struct *) | |
| 619 | + tcc_realloc(dwarf_line.filename_table, | |
| 620 | + (dwarf_line.filename_size + 1) * | |
| 621 | + sizeof (struct dwarf_filename_struct)); | |
| 622 | + dwarf_line.filename_table[dwarf_line.filename_size].dir_entry = i; | |
| 623 | + dwarf_line.filename_table[dwarf_line.filename_size].name = | |
| 624 | + tcc_strdup(filename); | |
| 625 | + dwarf_line.cur_file = dwarf_line.filename_size++; | |
| 628 | 626 | return; |
| 629 | 627 | } |
| 630 | 628 | |
| @@ -1054,14 +1052,10 @@ ST_FUNC void tcc_debug_bincl(TCCState *s1) · 423 unmodified lines | ||
| 1054 | 1052 | { |
| 1055 | 1053 | if (!s1->do_debug) |
| 1056 | 1054 | return; |
| 1057 | − if (s1->dwarf) { | |
| 1058 | − if (strcmp(file->filename, "<command line>")) | |
| 1059 | − dwarf_file(s1); | |
| 1060 | − } | |
| 1055 | + if (s1->dwarf) | |
| 1056 | + dwarf_file(s1); | |
| 1061 | 1057 | else |
| 1062 | − { | |
| 1063 | 1058 | put_stabs(s1, file->filename, N_BINCL, 0, 0, 0); |
| 1064 | − } | |
| 1065 | 1059 | new_file = 1; |
| 1066 | 1060 | } |
| 1067 | 1061 | |
| @@ -1101,7 +1095,11 @@ ST_FUNC void tcc_debug_line(TCCState *s1) · 33 unmodified lines | ||
| 1101 | 1095 | if (dwarf_line.cur_file != dwarf_line.last_file) { |
| 1102 | 1096 | dwarf_line.last_file = dwarf_line.cur_file; |
| 1103 | 1097 | dwarf_line_op(s1, DW_LNS_set_file); |
| 1098 | +#ifdef TCC_TARGET_MACHO | |
| 1099 | + dwarf_uleb128_op(s1, dwarf_line.cur_file + 1); | |
| 1100 | +#else | |
| 1104 | 1101 | dwarf_uleb128_op(s1, dwarf_line.cur_file); |
| 1102 | +#endif | |
| 1105 | 1103 | } |
| 1106 | 1104 | if (len_pc && |
| 1107 | 1105 | len_line >= DWARF_LINE_BASE && len_line <= (DWARF_OPCODE_BASE + DWARF_LINE_BASE) && |
| @@ -975,6 +975,9 @@ check_pc: · 974 unmodified lines | ||
| 975 | 975 | break; |
| 976 | 976 | case DW_LNS_set_file: |
| 977 | 977 | i = dwarf_read_uleb128(&ln, end); |
| 978 | +#ifdef TCC_TARGET_MACHO | |
| 979 | + i--; | |
| 980 | +#endif | |
| 978 | 981 | if (i < FILE_TABLE_SIZE && i < filename_size) |
| 979 | 982 | filename = filename_table[i].name; |
| 980 | 983 | break; |