From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 18796 invoked by alias); 4 Jun 2007 12:36:47 -0000 Received: (qmail 18786 invoked by uid 22791); 4 Jun 2007 12:36:46 -0000 X-Spam-Check-By: sourceware.org Received: from NaN.false.org (HELO nan.false.org) (208.75.86.248) by sourceware.org (qpsmtpd/0.31) with ESMTP; Mon, 04 Jun 2007 12:36:43 +0000 Received: from nan.false.org (localhost [127.0.0.1]) by nan.false.org (Postfix) with ESMTP id ED403982E3 for ; Mon, 4 Jun 2007 12:36:40 +0000 (GMT) Received: from caradoc.them.org (dsl093-172-095.pit1.dsl.speakeasy.net [66.93.172.95]) by nan.false.org (Postfix) with ESMTP id 9AA24982E2 for ; Mon, 4 Jun 2007 12:36:40 +0000 (GMT) Received: from drow by caradoc.them.org with local (Exim 4.67) (envelope-from ) id 1HvBnD-00067l-Ho for gdb-patches@sourceware.org; Mon, 04 Jun 2007 08:36:15 -0400 Date: Mon, 04 Jun 2007 12:36:00 -0000 From: Daniel Jacobowitz To: gdb-patches@sourceware.org Subject: [commit] Handle files without DW_AT_comp_dir Message-ID: <20070604123615.GA22533@caradoc.them.org> Mail-Followup-To: gdb-patches@sourceware.org MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.15 (2007-04-09) X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2007-06/txt/msg00031.txt.bz2 Joseph Myers discovered a case where GCC emits an absolute path in DW_AT_name, no DW_AT_comp_dir, and relative pathnames in the directory table. GDB could not handle this, and failed to locate header files in the correct paths. The GCC behavior is a bug, and I think Joseph's working on a fix for it. But it's been around for a long time, so I think it's worthwhile to handle it in GDB. I tested the patch below on x86_64-linux and checked it in. -- Daniel Jacobowitz CodeSourcery 2007-06-04 Daniel Jacobowitz * defs.h (ldirname): New prototype. * dwarf2read.c (read_file_scope): Use DW_AT_name if DW_AT_comp_dir is missing. * utils.c (ldirname): New function. * xml-tdesc.c (file_read_description_xml): Use ldirname. Index: defs.h =================================================================== RCS file: /cvs/src/src/gdb/defs.h,v retrieving revision 1.206 diff -u -p -r1.206 defs.h --- defs.h 31 May 2007 17:00:06 -0000 1.206 +++ defs.h 4 Jun 2007 12:32:21 -0000 @@ -417,6 +417,8 @@ extern unsigned long gnu_debuglink_crc32 ULONGEST strtoulst (const char *num, const char **trailer, int base); +char *ldirname (const char *filename); + /* From demangle.c */ extern void set_demangling_style (char *); Index: dwarf2read.c =================================================================== RCS file: /cvs/src/src/gdb/dwarf2read.c,v retrieving revision 1.220 diff -u -p -r1.220 dwarf2read.c --- dwarf2read.c 18 May 2007 19:42:42 -0000 1.220 +++ dwarf2read.c 4 Jun 2007 12:32:23 -0000 @@ -2783,7 +2783,7 @@ read_file_scope (struct die_info *die, s CORE_ADDR lowpc = ((CORE_ADDR) -1); CORE_ADDR highpc = ((CORE_ADDR) 0); struct attribute *attr; - char *name = ""; + char *name = NULL; char *comp_dir = NULL; struct die_info *child_die; bfd *abfd = objfile->obfd; @@ -2806,21 +2806,29 @@ read_file_scope (struct die_info *die, s { name = DW_STRING (attr); } + attr = dwarf2_attr (die, DW_AT_comp_dir, cu); if (attr) + comp_dir = DW_STRING (attr); + else if (name != NULL && IS_ABSOLUTE_PATH (name)) { - comp_dir = DW_STRING (attr); - if (comp_dir) - { - /* Irix 6.2 native cc prepends .: to the compilation - directory, get rid of it. */ - char *cp = strchr (comp_dir, ':'); + comp_dir = ldirname (name); + if (comp_dir != NULL) + make_cleanup (xfree, comp_dir); + } + if (comp_dir != NULL) + { + /* Irix 6.2 native cc prepends .: to the compilation + directory, get rid of it. */ + char *cp = strchr (comp_dir, ':'); - if (cp && cp != comp_dir && cp[-1] == '.' && cp[1] == '/') - comp_dir = cp + 1; - } + if (cp && cp != comp_dir && cp[-1] == '.' && cp[1] == '/') + comp_dir = cp + 1; } + if (name == NULL) + name = ""; + attr = dwarf2_attr (die, DW_AT_language, cu); if (attr) { Index: utils.c =================================================================== RCS file: /cvs/src/src/gdb/utils.c,v retrieving revision 1.176 diff -u -p -r1.176 utils.c --- utils.c 30 Mar 2007 09:31:31 -0000 1.176 +++ utils.c 4 Jun 2007 12:32:23 -0000 @@ -3195,3 +3195,31 @@ strtoulst (const char *num, const char * else return result; } + +/* Simple, portable version of dirname that does not modify its + argument. */ + +char * +ldirname (const char *filename) +{ + const char *base = lbasename (filename); + char *dirname; + + while (base > filename && IS_DIR_SEPARATOR (base[-1])) + --base; + + if (base == filename) + return NULL; + + dirname = xmalloc (base - filename + 2); + memcpy (dirname, filename, base - filename); + + /* On DOS based file systems, convert "d:foo" to "d:.", so that we + create "d:./bar" later instead of the (different) "d:/bar". */ + if (base - filename == 2 && IS_ABSOLUTE_PATH (base) + && !IS_DIR_SEPARATOR (filename[0])) + dirname[base++ - filename] = '.'; + + dirname[base - filename] = '\0'; + return dirname; +} Index: xml-tdesc.c =================================================================== RCS file: /cvs/src/src/gdb/xml-tdesc.c,v retrieving revision 1.5 diff -u -p -r1.5 xml-tdesc.c --- xml-tdesc.c 13 Feb 2007 15:48:05 -0000 1.5 +++ xml-tdesc.c 4 Jun 2007 12:32:23 -0000 @@ -487,7 +487,6 @@ file_read_description_xml (const char *f struct target_desc *tdesc; char *tdesc_str; struct cleanup *back_to; - const char *base; char *dirname; tdesc_str = fetch_xml_from_file (filename, NULL); @@ -499,28 +498,9 @@ file_read_description_xml (const char *f back_to = make_cleanup (xfree, tdesc_str); - /* Simple, portable version of dirname that does not modify its - argument. */ - base = lbasename (filename); - while (base > filename && IS_DIR_SEPARATOR (base[-1])) - --base; - if (base > filename) - { - dirname = xmalloc (base - filename + 2); - memcpy (dirname, filename, base - filename); - - /* On DOS based file systems, convert "d:foo" to "d:.", so that - we create "d:./bar" later instead of the (different) - "d:/bar". */ - if (base - filename == 2 && IS_ABSOLUTE_PATH (base) - && !IS_DIR_SEPARATOR (filename[0])) - dirname[base++ - filename] = '.'; - - dirname[base - filename] = '\0'; - make_cleanup (xfree, dirname); - } - else - dirname = NULL; + dirname = ldirname (filename); + if (dirname != NULL) + make_cleanup (xfree, dirname); tdesc = tdesc_parse_xml (tdesc_str, fetch_xml_from_file, dirname); do_cleanups (back_to);