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