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
1 changed files with 32 additions and 46 deletions
76
tccdbg.c
76
tccdbg.c
|
@ -568,7 +568,7 @@ static void dwarf_line_op(TCCState *s1, unsigned char op)
|
||||||
|
|
||||||
static void dwarf_file(TCCState *s1)
|
static void dwarf_file(TCCState *s1)
|
||||||
{
|
{
|
||||||
int i;
|
int i, j;
|
||||||
char *filename;
|
char *filename;
|
||||||
|
|
||||||
filename = strrchr(file->filename, '/');
|
filename = strrchr(file->filename, '/');
|
||||||
|
@ -580,14 +580,16 @@ static void dwarf_file(TCCState *s1)
|
||||||
dwarf_line.cur_file = i;
|
dwarf_line.cur_file = i;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
i = 0;
|
||||||
|
filename = file->filename;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
int j;
|
|
||||||
char *undo = filename;
|
char *undo = filename;
|
||||||
|
char *dir = file->filename;
|
||||||
|
|
||||||
*filename++ = '\0';
|
*filename++ = '\0';
|
||||||
for (i = 0; i < dwarf_line.dir_size; i++)
|
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++)
|
for (j = 1; j < dwarf_line.filename_size; j++)
|
||||||
if (dwarf_line.filename_table[j].dir_entry == i &&
|
if (dwarf_line.filename_table[j].dir_entry == i &&
|
||||||
strcmp(dwarf_line.filename_table[j].name,
|
strcmp(dwarf_line.filename_table[j].name,
|
||||||
|
@ -596,8 +598,33 @@ static void dwarf_file(TCCState *s1)
|
||||||
dwarf_line.cur_file = j;
|
dwarf_line.cur_file = j;
|
||||||
return;
|
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 = '/';
|
*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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1028,48 +1055,7 @@ ST_FUNC void tcc_debug_bincl(TCCState *s1)
|
||||||
if (!s1->do_debug)
|
if (!s1->do_debug)
|
||||||
return;
|
return;
|
||||||
if (s1->dwarf) {
|
if (s1->dwarf) {
|
||||||
int i, j;
|
if (strcmp(file->filename, "<command line>"))
|
||||||
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);
|
dwarf_file(s1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in a new issue