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 | static void dwarf_file(TCCState *s1) | 569 | static void dwarf_file(TCCState *s1) |
| 570 | { | 570 | { |
| 571 | int i; | 571 | int i, j; |
| 572 | char *filename; | 572 | char *filename; |
| 573 | 573 | ||
| 574 | filename = strrchr(file->filename, '/'); | 574 | filename = strrchr(file->filename, '/'); |
| @@ -580,14 +580,16 @@ static void dwarf_file(TCCState *s1) · 5 unmodified lines | |||
| 580 | dwarf_line.cur_file = i; | 580 | dwarf_line.cur_file = i; |
| 581 | return; | 581 | return; |
| 582 | } | 582 | } |
| 583 | i = 0; | ||
| 584 | filename = file->filename; | ||
| 583 | } | 585 | } |
| 584 | else { | 586 | else { |
| 585 | int j; | ||
| 586 | char *undo = filename; | 587 | char *undo = filename; |
| 588 | char *dir = file->filename; | ||
| 587 | 589 | ||
| 588 | *filename++ = '\0'; | 590 | *filename++ = '\0'; |
| 589 | for (i = 0; i < dwarf_line.dir_size; i++) | 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 | for (j = 1; j < dwarf_line.filename_size; j++) | 593 | for (j = 1; j < dwarf_line.filename_size; j++) |
| 592 | if (dwarf_line.filename_table[j].dir_entry == i && | 594 | if (dwarf_line.filename_table[j].dir_entry == i && |
| 593 | strcmp(dwarf_line.filename_table[j].name, | 595 | strcmp(dwarf_line.filename_table[j].name, |
| @@ -596,8 +598,33 @@ static void dwarf_file(TCCState *s1) · 2 unmodified lines | |||
| 596 | dwarf_line.cur_file = j; | 598 | dwarf_line.cur_file = j; |
| 597 | return; | 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 | *undo = '/'; | 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 | return; | 628 | return; |
| 602 | } | 629 | } |
| 603 | 630 | ||
| @@ -1028,49 +1055,8 @@ ST_FUNC void tcc_debug_bincl(TCCState *s1) · 424 unmodified lines | |||
| 1028 | if (!s1->do_debug) | 1055 | if (!s1->do_debug) |
| 1029 | return; | 1056 | return; |
| 1030 | if (s1->dwarf) { | 1057 | if (s1->dwarf) { |
| 1031 | int i, j; | 1058 | if (strcmp(file->filename, "<command line>")) |
| 1032 | char *filename = strrchr(file->filename, '/'); | 1059 | dwarf_file(s1); |
| 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); | ||
| 1074 | } | 1060 | } |
| 1075 | else | 1061 | else |
| 1076 | { | 1062 | { |