[PING][PATCH v2 2/2] DWARFv5: Fix for the filename complaint when printing macro

Achra, Nitika Nitika.Achra@amd.com
Mon Sep 7 07:40:42 GMT 2020


[AMD Official Use Only - Internal Distribution Only]

Just a gentle reminder.

Regards,
Nitika

-----Original Message-----
From: Achra, Nitika <Nitika.Achra@amd.com> 
Sent: Monday, August 10, 2020 8:37 PM
To: gdb-patches@sourceware.org; simark@simark.ca; tom@tromey.com
Cc: George, Jini Susan <JiniSusan.George@amd.com>; Achra, Nitika <Nitika.Achra@amd.com>
Subject: [PATCH v2 2/2] DWARFv5: Fix for the filename complaint when printing macro

GDB complaints "During symbol reading: symtab found for 'macro.c', but that file is not covered in the compilation unit's macro information.
No symbol "MAX_SIZE" in the current context" when printing the macro with the testcase file macro.c given below. This patch fixes this and prints the correct value.

When gdb reads file number from DW_MACRO_start_file data in .debug_macro section, it will do name lookup in file_names and include_directories index table of .debug_line section. Prior to DWARFv5 include_directories[0] has no info, so a lookup at that index will return NULL and we have file name "macro.c". But in dwarfv5 current directory is explicitly represented at index 0 (as shown in the snippet below), hence after lookup you get "PATH/macro.c".
A snippet of .debug_line is as follows-

include_directories[  0] = "/home/nitika/workspace"
include_directories[  1] = "/usr/include"
include_directories[  2] = "/usr/include/x86_64-linux-gnu/bits"
include_directories[  3] = "/usr/include/x86_64-linux-gnu/sys"
include_directories[  4] = "/usr/include/x86_64-linux-gnu/gnu"
include_directories[  5] = "up_llvm/llvm-project/build/lib/clang/11.0.0/include"
include_directories[  6] = "/usr/include/x86_64-linux-gnu/bits/types"

file_names[  0]:
           name: "macro.c"
      dir_index: 0
   md5_checksum: 0ee310711170f2dd9844b522e844207d

Test case used (macro.c):

 #define MAX_SIZE 10
int main(void)
{
   int size = 0;
   size = size + MAX_SIZE;

   printf("\n The value of size is [%d]\n",size);

   return 0;
}

clang -gdwarf-5 -fdebug-macro  macro.c -o macro.out

Before the patch:

gdb -q  macro.out -ex "start" -ex "set complaints 1"  -ex "p MAX_SIZE"
Reading symbols from macro.out...
Temporary breakpoint 1 at 0x4004df: file macro.c, line 7.
Starting program: /home/nitika/workspace/macro.out

Temporary breakpoint 1, main () at macro.c:7
7          int size = 0;
During symbol reading: symtab found for 'macro.c', but that file is not covered in the compilation unit's macro information No symbol "MAX_SIZE" in current context.

After the patch:

gdb -q  macro.out -ex "start" -ex "p MAX_SIZE"
Reading symbols from macro.out...
Temporary breakpoint 1 at 0x4004df: file macro.c, line 7.
Starting program: /home/nitika/workspace/macro.out

Temporary breakpoint 1, main () at macro.c:7
7          int size = 0;
$1 = 10

Tested by running the testsuite before and after the patch with
 -gdwarf-5 and there is no increase in the number of test cases that fails. Used clang 11.0.0.

gdb/ChangeLog:

	* macrotab.c (macro_lookup_inclusion): In DWARF version 5 filename includes
	the full directory path.
---
 gdb/macrotab.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/gdb/macrotab.c b/gdb/macrotab.c index 9ada436eaf..4ffb2d67cb 100644
--- a/gdb/macrotab.c
+++ b/gdb/macrotab.c
@@ -507,7 +507,8 @@ struct macro_source_file *  macro_lookup_inclusion (struct macro_source_file *source, const char *name)  {
   /* Is SOURCE itself named NAME?  */
-  if (filename_cmp (name, source->filename) == 0)
+  if (filename_cmp (name, source->filename) == 0 ||
+      filename_cmp (basename (name), basename (source->filename)) == 0)
     return source;
 
   /* It's not us.  Try all our children, and return the lowest.  */
--
2.17.1


More information about the Gdb-patches mailing list