Fix preprocessor line directive

The preprocessor line directive did not result in correct debug info
when -g was used.
Line directives like:
 #line 1 "filename"
should now work.
This commit is contained in:
herman ten brugge 2023-01-16 08:39:34 +01:00
parent 79d439ee4f
commit ee3fef2ce2

View File

@ -568,7 +568,7 @@ static void dwarf_line_op(TCCState *s1, unsigned char op)
static void dwarf_file(TCCState *s1)
{
int i;
int i, j;
char *filename;
filename = strrchr(file->filename, '/');
@ -580,14 +580,16 @@ static void dwarf_file(TCCState *s1)
dwarf_line.cur_file = i;
return;
}
i = 0;
filename = file->filename;
}
else {
int j;
char *undo = filename;
char *dir = file->filename;
*filename++ = '\0';
for (i = 0; i < dwarf_line.dir_size; i++)
if (strcmp(dwarf_line.dir_table[i], file->filename) == 0)
if (strcmp(dwarf_line.dir_table[i], dir) == 0) {
for (j = 1; j < dwarf_line.filename_size; j++)
if (dwarf_line.filename_table[j].dir_entry == i &&
strcmp(dwarf_line.filename_table[j].name,
@ -596,8 +598,33 @@ static void dwarf_file(TCCState *s1)
dwarf_line.cur_file = j;
return;
}
break;
}
if (i == dwarf_line.dir_size) {
dwarf_line.dir_size++;
dwarf_line.dir_table =
(char **) tcc_realloc(dwarf_line.dir_table,
dwarf_line.dir_size *
sizeof (char *));
dwarf_line.dir_table[i] = tcc_strdup(dir);
}
*undo = '/';
}
for (j = 1; j < dwarf_line.filename_size; j++)
if (dwarf_line.filename_table[j].dir_entry == i &&
strcmp (dwarf_line.filename_table[j].name, filename) == 0)
break;
if (j == dwarf_line.filename_size) {
dwarf_line.filename_table =
(struct dwarf_filename_struct *)
tcc_realloc(dwarf_line.filename_table,
(dwarf_line.filename_size + 1) *
sizeof (struct dwarf_filename_struct));
dwarf_line.filename_table[dwarf_line.filename_size].dir_entry = i;
dwarf_line.filename_table[dwarf_line.filename_size++].name =
tcc_strdup(filename);
dwarf_line.cur_file = j;
}
return;
}
@ -1028,49 +1055,8 @@ ST_FUNC void tcc_debug_bincl(TCCState *s1)
if (!s1->do_debug)
return;
if (s1->dwarf) {
int i, j;
char *filename = strrchr(file->filename, '/');
char *dir;
if (filename == NULL) {
filename = file->filename;
i = 0;
}
else {
char *undo = filename;
*filename++ = '\0';
dir = file->filename;
for (i = 0; i < dwarf_line.dir_size; i++)
if (strcmp (dwarf_line.dir_table[i], dir) == 0)
break;
if (i == dwarf_line.dir_size) {
dwarf_line.dir_size++;
dwarf_line.dir_table =
(char **) tcc_realloc(dwarf_line.dir_table,
dwarf_line.dir_size *
sizeof (char *));
dwarf_line.dir_table[i] = tcc_strdup(dir);
}
*undo = '/';
}
if (strcmp(filename, "<command line>")) {
for (j = 1; j < dwarf_line.filename_size; j++)
if (dwarf_line.filename_table[j].dir_entry == i &&
strcmp (dwarf_line.filename_table[j].name, filename) == 0)
break;
if (j == dwarf_line.filename_size) {
dwarf_line.filename_table =
(struct dwarf_filename_struct *)
tcc_realloc(dwarf_line.filename_table,
(dwarf_line.filename_size + 1) *
sizeof (struct dwarf_filename_struct));
dwarf_line.filename_table[dwarf_line.filename_size].dir_entry = i;
dwarf_line.filename_table[dwarf_line.filename_size++].name =
tcc_strdup(filename);
}
}
dwarf_file(s1);
if (strcmp(file->filename, "<command line>"))
dwarf_file(s1);
}
else
{