From e1024ff1ddc5fdc00175c3fa2bdfdea412d6687f Mon Sep 17 00:00:00 2001 From: Daniel Jacobowitz Date: Mon, 4 Jun 2007 12:34:11 +0000 Subject: [PATCH] * 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. --- gdb/ChangeLog | 8 ++++++++ gdb/defs.h | 2 ++ gdb/dwarf2read.c | 28 ++++++++++++++++++---------- gdb/utils.c | 28 ++++++++++++++++++++++++++++ gdb/xml-tdesc.c | 26 +++----------------------- 5 files changed, 59 insertions(+), 33 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 55a5b73ad3..dfa0426e42 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +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. + 2007-06-01 Ulrich Weigand * spu-tdep.c (spu_push_dummy_call): Store stack back chain. diff --git a/gdb/defs.h b/gdb/defs.h index 1ce9184db2..4e2d1c0b51 100644 --- a/gdb/defs.h +++ b/gdb/defs.h @@ -417,6 +417,8 @@ extern unsigned long gnu_debuglink_crc32 (unsigned long crc, ULONGEST strtoulst (const char *num, const char **trailer, int base); +char *ldirname (const char *filename); + /* From demangle.c */ extern void set_demangling_style (char *); diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 2cb455e03d..6314c4c63f 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -2783,7 +2783,7 @@ read_file_scope (struct die_info *die, struct dwarf2_cu *cu) 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, struct dwarf2_cu *cu) { 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) { diff --git a/gdb/utils.c b/gdb/utils.c index 4caa272b67..f5325f692f 100644 --- a/gdb/utils.c +++ b/gdb/utils.c @@ -3195,3 +3195,31 @@ strtoulst (const char *num, const char **trailer, int base) 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; +} diff --git a/gdb/xml-tdesc.c b/gdb/xml-tdesc.c index a4e1fe9a72..31db9c35bd 100644 --- a/gdb/xml-tdesc.c +++ b/gdb/xml-tdesc.c @@ -487,7 +487,6 @@ file_read_description_xml (const char *filename) 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 *filename) 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); -- 2.34.1