mirror of
https://github.com/mirror/tinycc.git
synced 2025-03-08 08:40:08 +08:00
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:
parent
79d439ee4f
commit
ee3fef2ce2
78
tccdbg.c
78
tccdbg.c
@ -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
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user