diff options
author | Daniel Jacobowitz <drow@false.org> | 2007-06-04 12:34:11 +0000 |
---|---|---|
committer | Daniel Jacobowitz <drow@false.org> | 2007-06-04 12:34:11 +0000 |
commit | e1024ff1ddc5fdc00175c3fa2bdfdea412d6687f (patch) | |
tree | 2925881313e29580ac614cb86abcf39825df9d57 | |
parent | 9dfacfd20b2906ee57cfbca7ee11631c0d82c1d5 (diff) | |
download | gdb-e1024ff1ddc5fdc00175c3fa2bdfdea412d6687f.zip gdb-e1024ff1ddc5fdc00175c3fa2bdfdea412d6687f.tar.gz gdb-e1024ff1ddc5fdc00175c3fa2bdfdea412d6687f.tar.bz2 |
* 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.
-rw-r--r-- | gdb/ChangeLog | 8 | ||||
-rw-r--r-- | gdb/defs.h | 2 | ||||
-rw-r--r-- | gdb/dwarf2read.c | 28 | ||||
-rw-r--r-- | gdb/utils.c | 28 | ||||
-rw-r--r-- | gdb/xml-tdesc.c | 26 |
5 files changed, 59 insertions, 33 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 55a5b73..dfa0426 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2007-06-04 Daniel Jacobowitz <dan@codesourcery.com> + + * 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 <uweigand@de.ibm.com> * spu-tdep.c (spu_push_dummy_call): Store stack back chain. @@ -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 2cb455e..6314c4c 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 = "<unknown>"; + 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 <machine>.: 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 <machine>.: 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 = "<unknown>"; + attr = dwarf2_attr (die, DW_AT_language, cu); if (attr) { diff --git a/gdb/utils.c b/gdb/utils.c index 4caa272..f5325f6 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 a4e1fe9..31db9c3 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); |