This is the mail archive of the
gdb-prs@sources.redhat.com
mailing list for the GDB project.
Re: symtab/1877: gdb says that tthere is no information for a macrowhen readelf clearly identifies the macro
- From: Claus-Justus Heine <ch at dot-heine dot de>
- To: nobody at sources dot redhat dot com
- Cc: gdb-prs at sources dot redhat dot com,
- Date: 27 Feb 2005 16:18:01 -0000
- Subject: Re: symtab/1877: gdb says that tthere is no information for a macrowhen readelf clearly identifies the macro
- Reply-to: Claus-Justus Heine <ch at dot-heine dot de>
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--