OSDN Git Service

* tlink.c (scan_linker_output): Parse linker messages from
authormrs <mrs@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 24 Feb 2007 00:30:30 +0000 (00:30 +0000)
committermrs <mrs@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 24 Feb 2007 00:30:30 +0000 (00:30 +0000)
darwin9's linker better.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@122283 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/tlink.c

index cb4e098..bdec047 100644 (file)
@@ -1,3 +1,8 @@
+2007-02-23  Mike Stump  <mrs@apple.com>
+
+       * tlink.c (scan_linker_output): Parse linker messages from
+       darwin9's linker better.
+
 2007-02-23  Steve Ellcey  <sje@cup.hp.com>
 
        PR debug/29614
 2007-02-23  Steve Ellcey  <sje@cup.hp.com>
 
        PR debug/29614
index 1689ddb..8e10eeb 100644 (file)
@@ -607,12 +607,17 @@ scan_linker_output (const char *fname)
 {
   FILE *stream = fopen (fname, "r");
   char *line;
 {
   FILE *stream = fopen (fname, "r");
   char *line;
+  int skip_next_line = 0;
 
   while ((line = tfgets (stream)) != NULL)
     {
       char *p = line, *q;
       symbol *sym;
       int end;
 
   while ((line = tfgets (stream)) != NULL)
     {
       char *p = line, *q;
       symbol *sym;
       int end;
+      int ok = 0;
+
+      if (skip_next_line)
+       continue;
 
       while (*p && ISSPACE ((unsigned char) *p))
        ++p;
 
       while (*p && ISSPACE ((unsigned char) *p))
        ++p;
@@ -654,6 +659,19 @@ scan_linker_output (const char *fname)
          demangled *dem = 0;
          q = 0;
 
          demangled *dem = 0;
          q = 0;
 
+         /* On darwin9, we look for "foo" referenced from:\n.*\n  */
+         if (strcmp (oldq, "referenced from:") == 0)
+           {
+             /* We have to remember that we found a symbol to tweak.  */
+             ok = 1;
+
+             /* We actually want to start from the first word on the line.  */
+             oldq = p;
+
+             /* Since the format is multiline, we have to skip the next line.  */
+             skip_next_line = 1;
+           }
+
          /* First try `GNU style'.  */
          p = strchr (oldq, '`');
          if (p)
          /* First try `GNU style'.  */
          p = strchr (oldq, '`');
          if (p)
@@ -681,7 +699,8 @@ scan_linker_output (const char *fname)
 
          /* We need to check for certain error keywords here, or we would
             mistakenly use GNU ld's "In function `foo':" message.  */
 
          /* We need to check for certain error keywords here, or we would
             mistakenly use GNU ld's "In function `foo':" message.  */
-         if (q && (strstr (oldq, "ndefined")
+         if (q && (ok
+                   || strstr (oldq, "ndefined")
                    || strstr (oldq, "nresolved")
                    || strstr (oldq, "nsatisfied")
                    || strstr (oldq, "ultiple")))
                    || strstr (oldq, "nresolved")
                    || strstr (oldq, "nsatisfied")
                    || strstr (oldq, "ultiple")))