From ee3fef2ce2a8c46452ff44b59d5175dc90bf4f4c Mon Sep 17 00:00:00 2001 From: herman ten brugge Date: Mon, 16 Jan 2023 08:39:34 +0100 Subject: [PATCH] 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. --- tccdbg.c | 78 +++++++++++++++++++++++--------------------------------- 1 file changed, 32 insertions(+), 46 deletions(-) diff --git a/tccdbg.c b/tccdbg.c index 4a90f412..94631290 100644 --- a/tccdbg.c +++ b/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, "")) { - 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, "")) + dwarf_file(s1); } else {