Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Vladimir Simonov <sv@sw.ru>
To: Kai Tietz <ktietz70@googlemail.com>
Cc: Mark Kettenis <mark.kettenis@xs4all.nl>,
	eliz@gnu.org,        brobecker@adacore.com,
	gdb-patches@sourceware.org
Subject: Re: [patch gdb]: Fix some DOS-path related issues in gdb
Date: Sat, 05 Mar 2011 11:38:00 -0000	[thread overview]
Message-ID: <4D721C43.1070804@sw.ru> (raw)
In-Reply-To: <AANLkTin9kOHtzuE6zmWrMQ8JTmYPn+G2GRqW-RawmaLn@mail.gmail.com>

[-- Attachment #1: Type: text/plain, Size: 2876 bytes --]

On 03/05/2011 12:13 PM, Kai Tietz wrote:
> 2011/3/4 Mark Kettenis<mark.kettenis@xs4all.nl>:
>>> Date: Fri, 4 Mar 2011 10:48:35 +0100
>>> From: Kai Tietz<ktietz70@googlemail.com>
>>>
>>> 2011/3/3 Eli Zaretskii<eliz@gnu.org>:
>>>>> Date: Thu, 3 Mar 2011 18:58:32 +0400
>>>>> From: Joel Brobecker<brobecker@adacore.com>
>>>>> Cc: Kai Tietz<ktietz70@googlemail.com>, gdb-patches@sourceware.org
>>>>>
>>>>>> I didn't know that the Windows 64bit target can use ELF debug info.
>>>>>> Can it?  With what toolchains?
>>>>>>
>>>>>> As for mdebugread.c, I always thought it was MIPS specific.  What
>>>>>> other platforms use it?
>>>>>
>>>>> These would still be pertinent in the case of cross debugging, no?
>>>>> If the files were cross-compiled on Windows, the debug info would
>>>>> contain file paths that follow the Windows convention...
>>>>
>>>> Is that use-case even practical?  Who would develop on Windows if they
>>>> have Linux or Irix?
>>>>
>>>> Anyway, if others don't mind to have DOS-ism in mdebugread.c and
>>>> elfread.c, I don't object.
>>>>
>>>
>>> I didn't saw here direct objections. So ok for apply?
>>>
>>> On a second thought about Pedros's switch for turning on
>>> case-(in)sensitive-ness by switch, it could be helpful. But the
>>> slash/backslash issue is something pretty incompatible. Windows host
>>> don't have issues in general (not for all API) to use slash and
>>> backslash, but on unix filesystem a backslash causes troubles. So we
>>> need here some path/filename normalization.
>>
>> There is no problem with backslashes in path names on Unix-like
>> systems.  Backslashes don't have a special meaning; they're just like
>> normal letters.  That's exactly why a native debugger on a Unix-like
>> system should not try to be DOS compatible at all.  And if you ask me,
>> the same is true for a cross-debugger for a Unix-like target running
>> on a Unix-like host.
>
> I didn't said that backslashes are forbidden characters in
> file/directory names, I just mentioned that they are causing problems.
> And well, you provided here the best example. A referenced filename -
> eg. 'C:\source\xyz.c" - would be treated on Unix-like filesystem as
> one file name and it wouldn't be an absolute path at all. How a user
> should be able to match such a thing? Symbolic links (as suggested
> before) won't work.
Sorry for confusing about C: link.

Yes, I've met the same problem several
years ago. The solution was - fix original names on Windows side.
For Windows names 'C:\source\xyz.c" and  'C:/source/xyz.c" are absolutely
equivalent. If we replace "\\" with "/" in gcc command line,
debug info will have records like C:/source/xyz.c

Probably gcc-dosbase it is not needed - gcc command may
converted by some external filter...

With this patches all should be ok. I mean C: link or directory
in current WD should work

Best regards
Vladimir Simonov

[-- Attachment #2: gcc-dosbase.patch --]
[-- Type: text/plain, Size: 860 bytes --]

Vladimir Simonov(sv@sw.ru) - mingw support.
Useful if you crossbuild Linux app on Windows.
- Debug info now contains C:/mydir/myfile.c (vs. C:\mydir\myfile.c).
  This permits debug such app on Linux box (just create C: dir or simlink
  and simulate appropriate path.
Index: gcc/gcc/gcc.c
===================================================================
--- gcc.orig/gcc/gcc.c
+++ gcc/gcc/gcc.c
@@ -6207,6 +6207,16 @@ main (int argc, char **argv)
   struct user_specs *uptr;
   char **old_argv = argv;
 
+#if HAVE_DOS_BASED_FILE_SYSTEM
+   if (argc > 0)
+     {
+	   char *pp;
+	   argv[0]=xstrdup (argv[0]);
+	   while ((pp = strchr (argv[0], '\\')) != NULL)
+		 *pp = '/';
+     }
+#endif
+
   /* Initialize here, not in definition.  The IRIX 6 O32 cc sometimes chokes
      on ?: in file-scope variable initializations.  */
   asm_debug = ASM_DEBUG_SPEC;

[-- Attachment #3: gcc-4.4.2-filename-normalize.patch --]
[-- Type: text/plain, Size: 3971 bytes --]

Vladimir Simonov(sv@sw.ru) - normailize filenames.
Useful if you crossbuild Linux app on Windows.
- Make filenames a bit shorter (constractions like ../dir/../ are collapced
  into ../dir). It sometimes helps to avoid Windows ascii-filenames length
  restriction (near to 160 bytes as I remenber).

--- gcc-4.4.2/include/filenames.h.orig	2010-01-28 14:58:49.000000000 +0300
+++ gcc-4.4.2/include/filenames.h	2010-01-28 16:26:23.000000000 +0300
@@ -52,6 +52,8 @@
 
 extern int filename_cmp (const char *s1, const char *s2);
 #define FILENAME_CMP(s1, s2)	filename_cmp(s1, s2)
+extern void filename_normalize (char *f);
+#define FILENAME_NORMALIZE(f)	filename_normalize(f)
 
 #ifdef __cplusplus
 }
--- gcc-4.4.2/libiberty/filename_cmp.c.orig	2010-01-28 14:59:04.000000000 +0300
+++ gcc-4.4.2/libiberty/filename_cmp.c	2010-01-28 16:23:36.000000000 +0300
@@ -76,3 +76,116 @@
 #endif
 }
 
+#ifdef HAVE_MEMMOVE
+#define memmove_left memmove
+#else
+static void *
+memmove_left (void *dest, const void *src, int n)
+{
+   char *d;
+   const char *s;
+   int i;
+   for (d = (char *)dest, s = (const char *)src, i = 0; i < n; i++)
+     *d++ = *s++;
+}
+#endif
+
+/*
+
+@deftypefn Extension void filename_normalize (char *@var{fn})
+
+This function tries to normalize file names inplace.
+
+@end deftypefn
+
+*/
+
+#ifndef HAVE_DOS_BASED_FILE_SYSTEM
+void
+filename_normalize (char *fn)
+#else
+static void
+filename_normalize_unix (char *fn)
+#endif
+{
+  char *p;
+  int rest;
+
+  rest = strlen (fn) + 1;
+  for (p = fn; *p != '\0' ; p++, rest--)
+    {
+      char *next;
+      const char *next2;
+      const char *next3;
+
+      next = p + 1;
+      if (*next == '\0')
+        break;
+      if (!IS_DIR_SEPARATOR( *p))
+          continue;
+      next2 = p + 2;
+      next3 = p + 3;
+      *p = '/';
+      /* don't handle some special cases, i.e. "//C/" on Microsoft Windows */
+      if (IS_DIR_SEPARATOR (*next))
+        {
+          memmove_left (next, next2, rest - 2);
+          p--;
+          continue;
+        }
+      if (*next != '.' || *next2 == '\0' || *next3 == '\0')
+          continue;
+      /* simplify "./" case */
+      if (IS_DIR_SEPARATOR (*next2))
+        {
+          memmove_left (next, next3, rest - 3);
+          rest--;
+          p--;
+          continue;
+        }
+      if (*next2 != '.' || ! IS_DIR_SEPARATOR (*next3))
+        continue;
+      while (--p >= fn)
+        {
+          if (*p == '/')
+            break;
+        }
+      if (p < fn)
+        {
+          if (*fn == '/')
+              memmove_left (p + 2, next3 + 1, rest - 4);
+          else if (*fn != '.')
+              memmove_left (p + 1, next3 + 1, rest - 4);
+          else
+            {
+              p = next - 1;
+              continue;
+            }
+        }
+      else if (*(p + 1) != '.')
+        {
+          memmove_left (p + 1, next3 + 1, rest - 4);
+          p--;
+        }
+      else
+        {
+          p = next - 1;
+          continue;
+        }
+      rest -= 2;
+    }
+}
+
+
+#ifdef HAVE_DOS_BASED_FILE_SYSTEM
+void
+filename_normalize (char *fn)
+{
+  if (IS_DIR_SEPARATOR (fn[0]) || ! IS_ABSOLUTE_PATH (fn))
+    /* Absolute path in Unix style or relative path */
+    filename_normalize_unix (fn);
+  else if (fn[1] != '\0')
+    filename_normalize_unix (fn + 2);
+}
+#endif
+
--- gcc-4.4.2/libcpp/directives.c.orig	2010-01-28 15:09:00.000000000 +0300
+++ gcc-4.4.2/libcpp/directives.c	2010-01-28 16:28:04.000000000 +0300
@@ -716,6 +716,7 @@
       return NULL;
     }
 
+  FILENAME_NORMALIZE (fname);
   if (pfile->directive == &dtable[T_PRAGMA])
     {
       /* This pragma allows extra tokens after the file name.  */
--- gcc-4.4.2/libcpp/files.c.orig	2010-02-12 11:47:27.886977300 +0300
+++ gcc-4.4.2/libcpp/files.c	2010-02-14 15:38:39.757260300 +0300
@@ -355,6 +355,7 @@
 
   if (path)
     {
+      FILENAME_NORMALIZE (path);
       hashval_t hv = htab_hash_string (path);
       char *copy;
       void **pp;

  reply	other threads:[~2011-03-05 11:38 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <AANLkTi=QoOiBg3XmMv+hRNe8DkT2YiVGZ=7NhaQwzCey@mail.gmail.com>
2011-03-03 12:10 ` Kai Tietz
2011-03-03 13:24   ` Eli Zaretskii
2011-03-03 13:48     ` Kai Tietz
2011-03-03 14:00       ` Eli Zaretskii
2011-03-03 14:58         ` Joel Brobecker
2011-03-03 15:25           ` Kai Tietz
2011-03-03 15:32           ` Pedro Alves
2011-03-03 15:41             ` Kai Tietz
2011-03-03 16:09               ` Pedro Alves
2011-03-03 16:19                 ` Kai Tietz
2011-03-03 16:42                   ` Pedro Alves
2011-03-03 17:32                     ` Kai Tietz
2011-03-04  7:23                       ` Vladimir Simonov
2011-03-04  8:23                         ` Joel Brobecker
2011-03-07 19:28             ` Jan Kratochvil
2011-03-07 19:28               ` Pedro Alves
2011-03-07 19:34                 ` Jan Kratochvil
2011-03-03 18:09           ` Eli Zaretskii
2011-03-04  5:12             ` Joel Brobecker
2011-03-04 13:05               ` André Pönitz
2011-03-04  9:48             ` Kai Tietz
2011-03-04 10:37               ` Mark Kettenis
2011-03-05  9:13                 ` Kai Tietz
2011-03-05 11:38                   ` Vladimir Simonov [this message]
2011-03-05 12:45                     ` Kai Tietz
2011-03-23 11:16             ` Kai Tietz
2011-03-23 12:44               ` Mark Kettenis
2011-03-23 14:07                 ` Kai Tietz
2011-03-23 14:16               ` Pedro Alves
2011-03-23 14:18                 ` Kai Tietz
2011-03-23 14:29                   ` Pierre Muller
     [not found]                   ` <-544184502231544940@unknownmsgid>
2011-03-23 14:44                     ` Kai Tietz
2011-03-23 15:29                   ` Pedro Alves
2011-03-23 15:29                     ` Kai Tietz
2011-03-23 18:24                     ` Eli Zaretskii
2011-03-23 21:11                       ` Kai Tietz
2011-03-03 17:02         ` Mark Kettenis

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4D721C43.1070804@sw.ru \
    --to=sv@sw.ru \
    --cc=brobecker@adacore.com \
    --cc=eliz@gnu.org \
    --cc=gdb-patches@sourceware.org \
    --cc=ktietz70@googlemail.com \
    --cc=mark.kettenis@xs4all.nl \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox