From 4dc7662a0735c39c5221badf6cd8f8c68a262565 Mon Sep 17 00:00:00 2001 From: herman ten brugge Date: Tue, 17 Jan 2023 20:08:14 +0100 Subject: [PATCH] Fix preprocessor line directive update The last commit was not a problem with macos. The problem was that dwarf version < 5 uses different indexes for files and directories. They start at 1 for dwarf version < 5 and 0 for dwarf version >= 5. --- tccdbg.c | 19 +++++++++---------- tccrun.c | 4 +--- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/tccdbg.c b/tccdbg.c index d5bfbb77..9a4b26a2 100644 --- a/tccdbg.c +++ b/tccdbg.c @@ -570,6 +570,7 @@ static void dwarf_file(TCCState *s1) { int i, j; char *filename; + int index_offset = s1->dwarf < 5; if (!strcmp(file->filename, "")) { dwarf_line.cur_file = 1; @@ -581,10 +582,10 @@ static void dwarf_file(TCCState *s1) if (dwarf_line.filename_table[i].dir_entry == 0 && strcmp(dwarf_line.filename_table[i].name, file->filename) == 0) { - dwarf_line.cur_file = i; + dwarf_line.cur_file = i + index_offset; return; } - i = 0; + i = -index_offset; filename = file->filename; } else { @@ -595,11 +596,12 @@ static void dwarf_file(TCCState *s1) for (i = 0; i < dwarf_line.dir_size; i++) 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 && + if (dwarf_line.filename_table[j].dir_entry - index_offset + == i && strcmp(dwarf_line.filename_table[j].name, filename) == 0) { *undo = '/'; - dwarf_line.cur_file = j; + dwarf_line.cur_file = j + index_offset; return; } break; @@ -619,10 +621,11 @@ static void dwarf_file(TCCState *s1) 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].dir_entry = + i + index_offset; dwarf_line.filename_table[dwarf_line.filename_size].name = tcc_strdup(filename); - dwarf_line.cur_file = dwarf_line.filename_size++; + dwarf_line.cur_file = dwarf_line.filename_size++ + index_offset; return; } @@ -1095,11 +1098,7 @@ ST_FUNC void tcc_debug_line(TCCState *s1) if (dwarf_line.cur_file != dwarf_line.last_file) { dwarf_line.last_file = dwarf_line.cur_file; dwarf_line_op(s1, DW_LNS_set_file); -#ifdef TCC_TARGET_MACHO - dwarf_uleb128_op(s1, dwarf_line.cur_file + 1); -#else dwarf_uleb128_op(s1, dwarf_line.cur_file); -#endif } if (len_pc && len_line >= DWARF_LINE_BASE && len_line <= (DWARF_OPCODE_BASE + DWARF_LINE_BASE) && diff --git a/tccrun.c b/tccrun.c index d7420092..8e851ee2 100644 --- a/tccrun.c +++ b/tccrun.c @@ -975,9 +975,7 @@ check_pc: break; case DW_LNS_set_file: i = dwarf_read_uleb128(&ln, end); -#ifdef TCC_TARGET_MACHO - i--; -#endif + i -= i > 0 && version < 5; if (i < FILE_TABLE_SIZE && i < filename_size) filename = filename_table[i].name; break;