This is the mail archive of the gdb-prs@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: symtab/1877: gdb says that tthere is no information for a macrowhen readelf clearly identifies the macro


The following reply was made to PR symtab/1877; it has been noted by GNATS.

From: Claus-Justus Heine <ch@dot-heine.de>
To: gdb-gnats@sources.redhat.com,  nobody@sources.redhat.com, 
 vguntaka@brocade.com,  gdb-prs@sources.redhat.com
Cc:  
Subject: Re: symtab/1877: gdb says that tthere is no information for a macro
 when readelf clearly identifies the macro
Date: Sun, 27 Feb 2005 17:07:48 +0100

 This is a multi-part message in MIME format.
 --------------080707070609070609070002
 Content-Type: text/plain; charset=us-ascii; format=flowed
 Content-Transfer-Encoding: 7bit
 
 http://sources.redhat.com/cgi-bin/gnatsweb.pl?cmd=view audit-trail
 
 Hello together,
 
 here is the reason and a bug-fix patch:
 
 The problem is that gcc (as of gcc-3.4.3) does not emit a ".file N FILENAME"
 statement for the main compilation unit. Consider the following simple example:
 
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 #include <stdio.h>
 
 #define ADD(x) (M + x)
 
 main ()
 {
 #define N 28
 #define M 42
    printf ("We're so creative: %d.\n", ADD(N));
 }
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 Now run
 
 gcc -g3 -gdwarf-2 -o sample.s -S sample.c
 
 You'll get the following:
 
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          .file   "sample.c"
          .section        .debug_abbrev,"",@progbits
 .Ldebug_abbrev0:
          .section        .debug_info,"",@progbits
 .Ldebug_info0:
          .section        .debug_line,"",@progbits
 .Ldebug_line0:
          .section        .debug_macinfo,"",@progbits
 .Ldebug_macinfo0:
          .text
 .Ltext0:
          .section        .debug_macinfo
          .byte   0x1
          .uleb128 0x1
          .string "__STDC_HOSTED__ 1"
 
 [BIG SNIP, lot's of other predefined symbols]
 
          .string "__ELF__ 1"
          .byte   0x3
          .uleb128 0x1
 ---->   .file 1 "/usr/include/stdio.h"  <----
          .uleb128 0x1
          .byte   0x1
          .uleb128 0x1b
          .string "_STDIO_H 1"
          .byte   0x3
          .uleb128 0x1c
 
 [SNIP, lot's of other stuff]
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 The point is now that gdb's macro parsing code only looks at the ".file N
 NAME" statements to assign macro definitions to source files (or rather their
 equivalent after the assembler has converted the stuff to binary). However,
 there is no such note for the main compilation unit. The result is that every
 macro definition in the main source file is ignored:
 
 (gdb) info macro ADD
 The symbol `ADD' has no definition as a C/C++ preprocessor macro
 at /var/tmp/sample.c:9
    included at /usr/include/stdio.h:749
 
 gdb even thinks that stdio.h has included sample.c (only w.r.t. macro
 definitions).
 
 FIX (patch included at end of file):
 I don't know whether gdb is right or gcc, but gdb should be able to cope with
 gcc's output.
 
 Proposal:
 - When gdb encounters a DW_MACINFO_define or DW_MACINFO_undef mac-info in
    dwarf_decode_macros() but has not yet encountered a DW_MACINFO_start_file
    mac-info, then gdb should assume that the macro belongs to the main source file. The
    main source file's name is passed down to dwarf_decode_macros() from
    read_file_scope() which has that information (at least in general).
 
 Still the question arises: is this a work-around for a gcc bug, that is: there
 should be a DW_MACINFO_start_file mac-info for the main source file (aka
 "compilation unit"), or is this a gdb bug? If it's a gcc bug then it should be
 reported to gcc's bug-tracking system.
 
 Below the patch. It's also included as attachment in case there are line-breaking issues 
 (sorry for the redundancy, but it is quite small)
 
 Oh well, the patch is for gdb-6.3, apply with
 
 cd gdb-6.3
 patch -p0 < PATCH_FILE
 
 Best regards
 
 Claus
 
 ################################## snip ######################################
 --- gdb/dwarf2read.c~	2004-10-16 02:41:00.000000000 +0200
 +++ gdb/dwarf2read.c	2005-02-27 16:23:30.464351640 +0100
 @@ -1014,7 +1014,8 @@
   static void add_to_cu_func_list (const char *, CORE_ADDR, CORE_ADDR,
   				 struct dwarf2_cu *);
 
 -static void dwarf_decode_macros (struct line_header *, unsigned int,
 +static void dwarf_decode_macros (const char *cu_name,
 +				 struct line_header *, unsigned int,
                                    char *, bfd *, struct dwarf2_cu *);
 
   static int attr_form_is_block (struct attribute *);
 @@ -2825,7 +2826,8 @@
     if (attr && line_header)
       {
         unsigned int macro_offset = DW_UNSND (attr);
 -      dwarf_decode_macros (line_header, macro_offset,
 +      dwarf_decode_macros (name /* comilation unit */,
 +			   line_header, macro_offset,
                              comp_dir, abfd, cu);
       }
     do_cleanups (back_to);
 @@ -9010,7 +9012,8 @@
 
 
   static void
 -dwarf_decode_macros (struct line_header *lh, unsigned int offset,
 +dwarf_decode_macros (const char *cu_name,
 +		     struct line_header *lh, unsigned int offset,
                        char *comp_dir, bfd *abfd,
                        struct dwarf2_cu *cu)
   {
 @@ -9061,19 +9064,29 @@
               mac_ptr += bytes_read;
 
               if (! current_file)
 -	      complaint (&symfile_complaints,
 -			 "debug info gives macro %s outside of any file: %s",
 -			 macinfo_type ==
 -			 DW_MACINFO_define ? "definition" : macinfo_type ==
 -			 DW_MACINFO_undef ? "undefinition" :
 -			 "something-or-other", body);
 -            else
 -              {
 -                if (macinfo_type == DW_MACINFO_define)
 -                  parse_macro_definition (current_file, line, body);
 -                else if (macinfo_type == DW_MACINFO_undef)
 -                  macro_undef (current_file, line, body);
 -              }
 +	      {
 +		complaint (&symfile_complaints,
 +			   "debug info gives macro %s outside of any file: %s,"
 +			   " assuming main compilation unit",
 +			   macinfo_type ==
 +			   DW_MACINFO_define ? "definition" : macinfo_type ==
 +			   DW_MACINFO_undef ? "undefinition" :
 +			   "something-or-other", body);
 +		if (! pending_macros)
 +		  pending_macros =
 +		    new_macro_table (&cu->objfile->objfile_obstack,
 +				     cu->objfile->macro_cache);
 +
 +		/* If we have no current file, then this must be the
 +		   start_file directive for the compilation unit's
 +		   main source file.  */
 +		current_file = macro_set_main (pending_macros, cu_name);
 +	      }
 +
 +	    if (macinfo_type == DW_MACINFO_define)
 +	      parse_macro_definition (current_file, line, body);
 +	    else if (macinfo_type == DW_MACINFO_undef)
 +	      macro_undef (current_file, line, body);
             }
             break;
 
 ############################## snap ##########################
 
 
 
 
 
 
 
 
 
 
 
 --------------080707070609070609070002
 Content-Type: text/x-patch;
  name="gdb-6.3-dwarf2macro.patch"
 Content-Transfer-Encoding: 7bit
 Content-Disposition: inline;
  filename="gdb-6.3-dwarf2macro.patch"
 
 --- gdb/dwarf2read.c~	2004-10-16 02:41:00.000000000 +0200
 +++ gdb/dwarf2read.c	2005-02-27 16:23:30.464351640 +0100
 @@ -1014,7 +1014,8 @@
  static void add_to_cu_func_list (const char *, CORE_ADDR, CORE_ADDR,
  				 struct dwarf2_cu *);
  
 -static void dwarf_decode_macros (struct line_header *, unsigned int,
 +static void dwarf_decode_macros (const char *cu_name,
 +				 struct line_header *, unsigned int,
                                   char *, bfd *, struct dwarf2_cu *);
  
  static int attr_form_is_block (struct attribute *);
 @@ -2825,7 +2826,8 @@
    if (attr && line_header)
      {
        unsigned int macro_offset = DW_UNSND (attr);
 -      dwarf_decode_macros (line_header, macro_offset,
 +      dwarf_decode_macros (name /* comilation unit */,
 +			   line_header, macro_offset,
                             comp_dir, abfd, cu);
      }
    do_cleanups (back_to);
 @@ -9010,7 +9012,8 @@
  
  
  static void
 -dwarf_decode_macros (struct line_header *lh, unsigned int offset,
 +dwarf_decode_macros (const char *cu_name,
 +		     struct line_header *lh, unsigned int offset,
                       char *comp_dir, bfd *abfd,
                       struct dwarf2_cu *cu)
  {
 @@ -9061,19 +9064,29 @@
              mac_ptr += bytes_read;
  
              if (! current_file)
 -	      complaint (&symfile_complaints,
 -			 "debug info gives macro %s outside of any file: %s",
 -			 macinfo_type ==
 -			 DW_MACINFO_define ? "definition" : macinfo_type ==
 -			 DW_MACINFO_undef ? "undefinition" :
 -			 "something-or-other", body);
 -            else
 -              {
 -                if (macinfo_type == DW_MACINFO_define)
 -                  parse_macro_definition (current_file, line, body);
 -                else if (macinfo_type == DW_MACINFO_undef)
 -                  macro_undef (current_file, line, body);
 -              }
 +	      {
 +		complaint (&symfile_complaints,
 +			   "debug info gives macro %s outside of any file: %s,"
 +			   " assuming main compilation unit",
 +			   macinfo_type ==
 +			   DW_MACINFO_define ? "definition" : macinfo_type ==
 +			   DW_MACINFO_undef ? "undefinition" :
 +			   "something-or-other", body);
 +		if (! pending_macros)
 +		  pending_macros =
 +		    new_macro_table (&cu->objfile->objfile_obstack,
 +				     cu->objfile->macro_cache);
 +
 +		/* If we have no current file, then this must be the
 +		   start_file directive for the compilation unit's
 +		   main source file.  */
 +		current_file = macro_set_main (pending_macros, cu_name);
 +	      }
 +
 +	    if (macinfo_type == DW_MACINFO_define)
 +	      parse_macro_definition (current_file, line, body);
 +	    else if (macinfo_type == DW_MACINFO_undef)
 +	      macro_undef (current_file, line, body);
            }
            break;
  
 
 --------------080707070609070609070002--


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]