* defs.h (ldirname): New prototype.
authorDaniel Jacobowitz <drow@false.org>
Mon, 4 Jun 2007 12:34:11 +0000 (12:34 +0000)
committerDaniel Jacobowitz <drow@false.org>
Mon, 4 Jun 2007 12:34:11 +0000 (12:34 +0000)
* 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
gdb/defs.h
gdb/dwarf2read.c
gdb/utils.c
gdb/xml-tdesc.c

index 55a5b73ad3b2e799c249174bd21997bd490e83a5..dfa0426e422b1ae65a8c604c15871065381a6c6f 100644 (file)
@@ -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.
index 1ce9184db2845be67a70a4e753500d75c5be9710..4e2d1c0b51fd29e29cbf982e228438c1bb9dc29a 100644 (file)
@@ -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 *);
index 2cb455e03dd39124dceebf335d0fdfa6bb710b3f..6314c4c63f006789abade8fac50eb738f860a868 100644 (file)
@@ -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)
     {
index 4caa272b67108bedfacc8c462771b911e75cb7c6..f5325f692fbc3a9a0a1a88c26688859f7ac2051e 100644 (file)
@@ -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;
+}
index a4e1fe9a72e3afe8c60d3f4fd2ed67fb64fdd914..31db9c35bda4ed2e80d2da43ce3ef3c19df40a38 100644 (file)
@@ -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);