The preprocessor line directive did not result in correct debug info when -g was used. Line directives like: #line 1 "filename" should now work.
Unified · Split
| @@ -568,7 +568,7 @@ static void dwarf_line_op(TCCState *s1, unsigned char op) · 567 unmodified lines | ||
| 568 | 568 | |
| 569 | 569 | static void dwarf_file(TCCState *s1) |
| 570 | 570 | { |
| 571 | − int i; | |
| 571 | + int i, j; | |
| 572 | 572 | char *filename; |
| 573 | 573 | |
| 574 | 574 | filename = strrchr(file->filename, '/'); |
| @@ -580,14 +580,16 @@ static void dwarf_file(TCCState *s1) · 5 unmodified lines | ||
| 580 | 580 | dwarf_line.cur_file = i; |
| 581 | 581 | return; |
| 582 | 582 | } |
| 583 | + i = 0; | |
| 584 | + filename = file->filename; | |
| 583 | 585 | } |
| 584 | 586 | else { |
| 585 | − int j; | |
| 586 | 587 | char *undo = filename; |
| 588 | + char *dir = file->filename; | |
| 587 | 589 | |
| 588 | 590 | *filename++ = '\0'; |
| 589 | 591 | for (i = 0; i < dwarf_line.dir_size; i++) |
| 590 | − if (strcmp(dwarf_line.dir_table[i], file->filename) == 0) | |
| 592 | + if (strcmp(dwarf_line.dir_table[i], dir) == 0) { | |
| 591 | 593 | for (j = 1; j < dwarf_line.filename_size; j++) |
| 592 | 594 | if (dwarf_line.filename_table[j].dir_entry == i && |
| 593 | 595 | strcmp(dwarf_line.filename_table[j].name, |
| @@ -596,8 +598,33 @@ static void dwarf_file(TCCState *s1) · 2 unmodified lines | ||
| 596 | 598 | dwarf_line.cur_file = j; |
| 597 | 599 | return; |
| 598 | 600 | } |
| 601 | + break; | |
| 602 | + } | |
| 603 | + if (i == dwarf_line.dir_size) { | |
| 604 | + dwarf_line.dir_size++; | |
| 605 | + dwarf_line.dir_table = | |
| 606 | + (char **) tcc_realloc(dwarf_line.dir_table, | |
| 607 | + dwarf_line.dir_size * | |
| 608 | + sizeof (char *)); | |
| 609 | + dwarf_line.dir_table[i] = tcc_strdup(dir); | |
| 610 | + } | |
| 599 | 611 | *undo = '/'; |
| 600 | 612 | } |
| 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 | + } | |
| 601 | 628 | return; |
| 602 | 629 | } |
| 603 | 630 | |
| @@ -1028,49 +1055,8 @@ ST_FUNC void tcc_debug_bincl(TCCState *s1) · 424 unmodified lines | ||
| 1028 | 1055 | if (!s1->do_debug) |
| 1029 | 1056 | return; |
| 1030 | 1057 | if (s1->dwarf) { |
| 1031 | − int i, j; | |
| 1032 | − char *filename = strrchr(file->filename, '/'); | |
| 1033 | − char *dir; | |
| 1034 | − | |
| 1035 | − if (filename == NULL) { | |
| 1036 | − filename = file->filename; | |
| 1037 | − i = 0; | |
| 1038 | − } | |
| 1039 | − else { | |
| 1040 | − char *undo = filename; | |
| 1041 | − | |
| 1042 | − *filename++ = '\0'; | |
| 1043 | − dir = file->filename; | |
| 1044 | − for (i = 0; i < dwarf_line.dir_size; i++) | |
| 1045 | − if (strcmp (dwarf_line.dir_table[i], dir) == 0) | |
| 1046 | − break; | |
| 1047 | − if (i == dwarf_line.dir_size) { | |
| 1048 | − dwarf_line.dir_size++; | |
| 1049 | − dwarf_line.dir_table = | |
| 1050 | − (char **) tcc_realloc(dwarf_line.dir_table, | |
| 1051 | − dwarf_line.dir_size * | |
| 1052 | − sizeof (char *)); | |
| 1053 | − dwarf_line.dir_table[i] = tcc_strdup(dir); | |
| 1054 | − } | |
| 1055 | − *undo = '/'; | |
| 1056 | − } | |
| 1057 | − if (strcmp(filename, "<command line>")) { | |
| 1058 | − for (j = 1; j < dwarf_line.filename_size; j++) | |
| 1059 | − if (dwarf_line.filename_table[j].dir_entry == i && | |
| 1060 | − strcmp (dwarf_line.filename_table[j].name, filename) == 0) | |
| 1061 | − break; | |
| 1062 | − if (j == dwarf_line.filename_size) { | |
| 1063 | − dwarf_line.filename_table = | |
| 1064 | − (struct dwarf_filename_struct *) | |
| 1065 | − tcc_realloc(dwarf_line.filename_table, | |
| 1066 | − (dwarf_line.filename_size + 1) * | |
| 1067 | − sizeof (struct dwarf_filename_struct)); | |
| 1068 | − dwarf_line.filename_table[dwarf_line.filename_size].dir_entry = i; | |
| 1069 | − dwarf_line.filename_table[dwarf_line.filename_size++].name = | |
| 1070 | − tcc_strdup(filename); | |
| 1071 | − } | |
| 1072 | − } | |
| 1073 | − dwarf_file(s1); | |
| 1058 | + if (strcmp(file->filename, "<command line>")) | |
| 1059 | + dwarf_file(s1); | |
| 1074 | 1060 | } |
| 1075 | 1061 | else |
| 1076 | 1062 | { |