* ldlex.l: now parses comment correctly, added ~ to acceptable
authorSteve Chamberlain <sac@cygnus>
Thu, 13 Aug 1992 19:16:49 +0000 (19:16 +0000)
committerSteve Chamberlain <sac@cygnus>
Thu, 13 Aug 1992 19:16:49 +0000 (19:16 +0000)
chars in filenames

* ldexp.c (exp_unop): pass down abs_output_section - now can have
unary -ve constants.

* ldlang.c (lang_finish): warn when an entry symbol supplied on
the command line can't be found.

ld/ChangeLog
ld/ldlex.l
ld/ldmisc.c

index e65f345052eb128b09d7c7da45079610440b0c82..37745056577681b63a25a49caabae26563a2791f 100644 (file)
@@ -1,3 +1,14 @@
+Thu Aug 13 11:49:34 1992  Steve Chamberlain  (sac@thepub.cygnus.com)
+
+       * ldlex.l: now parses comment correctly, added ~ to acceptable
+       chars in filenames
+       
+       * ldexp.c (exp_unop): pass down abs_output_section - now can have
+       unary -ve constants.
+
+       * ldlang.c (lang_finish): warn when an entry symbol supplied on
+       the command line can't be found.
+
 Fri Aug  7 12:31:10 1992  Steve Chamberlain  (sac@thepub.cygnus.com)
 
        * ldlang.h: add new field "loadable" to output_section_statement.
index 2c21a5898f0fca1510dd8888581e358287ccf80d..f98e8fd2e61b4b711e234e9b4af7a2cde0a80079 100644 (file)
@@ -43,6 +43,37 @@ char *buystring();
 unsigned int lineno = 1;
 int old;
 
+comment()
+{
+  int c;
+  while (1)
+  {
+    c = input();
+    while (c !='*' && c != EOF) 
+    {
+      if (c == '\n') lineno++;
+      c = input();
+    }
+
+
+    if (c == '*')
+    {
+      c = input();
+      while ( c == '*')
+       c = input();
+      if ( c == '/' )
+       break;                  /* found the end */
+    }
+
+    if ( c == EOF )
+    {
+      einfo( "%F%P :EOF in comment");
+      break;
+    }
+  }
+}
+
+
 #undef YY_INPUT
 #define YY_INPUT(buf,result,max_size) yy_input(buf, &result, max_size)
 #undef YY_FATAL_ERROR
@@ -66,11 +97,11 @@ unsigned int include_stack_ptr = 0;
 %a 4000
 %o 5000
 
-CMDFILENAMECHAR   [_a-zA-Z0-9\/\.\\_\+\$\:\[\]\\\,\=\&\!\<\>\-]
-CMDFILENAMECHAR1  [_a-zA-Z0-9\/\.\\_\+\$\:\[\]\\\,\=\&\!\<\>]
-FILENAMECHAR1  [_a-zA-Z\/\.\\]
+CMDFILENAMECHAR   [_a-zA-Z0-9\/\.\\_\+\$\:\[\]\\\,\=\&\!\<\>\-\~]
+CMDFILENAMECHAR1  [_a-zA-Z0-9\/\.\\_\+\$\:\[\]\\\,\=\&\!\<\>\~]
+FILENAMECHAR1  [_a-zA-Z\/\.\\\$\_\~]
 SYMBOLCHARN     [_a-zA-Z\/\.\\0-9]
-FILENAMECHAR   [_a-zA-Z0-9\/\.\-\_\+\=\$\:\[\]\\]
+FILENAMECHAR   [_a-zA-Z0-9\/\.\-\_\+\=\$\:\[\]\\\,\~]
 FILENAME       {FILENAMECHAR}+
 WHITE          [ \t\n]+ 
 
@@ -83,6 +114,10 @@ WHITE               [ \t\n]+
 %s MRI
 %%
 
+
+<BOTH,SCRIPT,EXPRESSION,COMMAND>"/*"   { comment(); }
+
+
 <DEFSYMEXP>"-"                  { RTOKEN('-');}
 <DEFSYMEXP>"+"                  { RTOKEN('+');}
 <DEFSYMEXP>{FILENAMECHAR1}{SYMBOLCHARN}*   { yylval.name = buystring(yytext); return NAME; }
@@ -300,7 +335,7 @@ WHITE               [ \t\n]+
 <MRI>"FORMAT"                   { RTOKEN(FORMAT); }
 <MRI>"LIST".*                   { RTOKEN(LIST); /* LIST and ignore to end of line */ }
 <MRI>"SECT"                    { RTOKEN(SECT); }
-<MRI>"ABSOLUTE"                        { RTOKEN(ABSOLUTE); }
+<EXPRESSION,BOTH,SCRIPT,MRI>"ABSOLUTE"                 { RTOKEN(ABSOLUTE); }
 <MRI>"end"                      { RTOKEN(ENDWORD); }
 <MRI>"chip"                     { RTOKEN(CHIP); }
 <MRI>"load"                     { RTOKEN(LOAD); }
@@ -309,7 +344,7 @@ WHITE               [ \t\n]+
 <MRI>"format"                   { RTOKEN(FORMAT); }
 <MRI>"list".*                   { RTOKEN(LIST); /* LIST and ignore to end of line */ }
 <MRI>"sect"                    { RTOKEN(SECT); }
-<MRI>"absolute"                        { RTOKEN(ABSOLUTE); }
+<EXPRESSION,BOTH,SCRIPT,MRI>"absolute"                 { RTOKEN(ABSOLUTE); }
 
 <COMMAND>{CMDFILENAMECHAR1}{CMDFILENAMECHAR}*  {
                                 yylval.name = buystring(yytext); 
@@ -335,16 +370,6 @@ WHITE              [ \t\n]+
 <BOTH,SCRIPT,EXPRESSION>"\n"           { lineno++;}
 <MRI,COMMAND,BOTH,SCRIPT,EXPRESSION>[ \t]
 
-"/*"                           { old = INITIAL; BEGIN(COMMENT); }
-<COMMAND>"/*"                  { old = COMMAND; BEGIN(COMMENT); }
-<BOTH>"/*"                     { old =BOTH; BEGIN(COMMENT); }
-<SCRIPT>"/*"                   { old = EXPRESSION; BEGIN(COMMENT); }
-<EXPRESSION>"/*"               { old = SCRIPT; BEGIN(COMMENT); }
-"/*"                           { old = INITIAL; BEGIN(COMMENT); }
-<COMMENT>[^*\\n]*
-<COMMENT>"*"+[^*/\\n]*
-<COMMENT>\\n                   { ++lineno;}
-<COMMENT>"*"+"/"               { BEGIN(old); }
 <<EOF>> {
     include_stack_ptr--;
     
@@ -501,3 +526,4 @@ int max_size;
       YY_FATAL_ERROR( "read() in flex scanner failed" );
   }
 }
+
index 87a91c9f7bdcece0c4485116ebf8f81a50979171..9a70af92e003eaacb818c333ba467e37c92fe20a 100644 (file)
@@ -19,12 +19,6 @@ You should have received a copy of the GNU General Public License
 along with GLD; see the file COPYING.  If not, write to
 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
-/*
-$Id$ 
-
-
- */
-
 #include "bfd.h"
 #include "sysdep.h"
 #include <varargs.h>
@@ -41,12 +35,6 @@ extern FILE *ldlex_input_stack;
 extern char *ldfile_input_filename;
 extern ld_config_type config;
 
-void
-yyerror(arg) 
-char *arg;
-{ 
-  einfo("%P%F: %S %s\n",arg);
-}
 
 extern int errno;
 extern   int  sys_nerr;
@@ -86,67 +74,67 @@ vfinfo(fp, fmt, arg)
       fmt ++;
       switch (*fmt++) 
       {
-      case 'X':
+       case 'X':
        config.make_executable = false;
        break;
-      case 'V':
-      {
-       bfd_vma value = va_arg(arg, bfd_vma);
-       fprintf_vma(fp, value);
-      }
+       case 'V':
+       {
+        bfd_vma value = va_arg(arg, bfd_vma);
+        fprintf_vma(fp, value);
+       }
        break;
-      case 'T':
-      {
-       asymbol *symbol = va_arg(arg, asymbol *);
-       if (symbol) 
-       {
+       case 'T':
+       {
+        asymbol *symbol = va_arg(arg, asymbol *);
+        if (symbol) 
+        {
 
            
-         asection *section = symbol->section;
-         char *cplusname = cplus_demangle(symbol->name, 1);
-         CONST char *section_name =  section->name;
-         if (section != &bfd_und_section) 
-         {
-           fprintf(fp,"%s (%s)", cplusname ? cplusname :
-                   symbol->name, section_name);
-         }
-         else 
-         {
-           fprintf(fp,"%s", cplusname ? cplusname : symbol->name);
-         }
+          asection *section = symbol->section;
+          char *cplusname = cplus_demangle(symbol->name, 1);
+          CONST char *section_name =  section->name;
+          if (section != &bfd_und_section) 
+          {
+            fprintf(fp,"%s (%s)", cplusname ? cplusname :
+                    symbol->name, section_name);
+          }
+          else 
+          {
+            fprintf(fp,"%s", cplusname ? cplusname : symbol->name);
+          }
            
-         if (cplusname) 
-         {
-           free(cplusname);
-         }
+          if (cplusname) 
+          {
+            free(cplusname);
+          }
            
-       }
-       else 
-       {
-         fprintf(fp,"no symbol");
-       }
-      }
+        }
+        else 
+        {
+          fprintf(fp,"no symbol");
+        }
+       }
        break;
-      case 'B':
-      { 
-       bfd *abfd = va_arg(arg, bfd *);
-       if (abfd->my_archive) {
-           fprintf(fp,"%s(%s)", abfd->my_archive->filename,
-                   abfd->filename);
-         }
-       else {
-           fprintf(fp,"%s", abfd->filename);
-
-         }
-      }
+       case 'B':
+       
+        bfd *abfd = va_arg(arg, bfd *);
+        if (abfd->my_archive) {
+          fprintf(fp,"%s(%s)", abfd->my_archive->filename,
+                  abfd->filename);
+        }
+        else {
+          fprintf(fp,"%s", abfd->filename);
+
+        }
+       }
        break;
-      case 'F':
+       case 'F':
        fatal = true;
        break;
-      case 'P':
+       case 'P':
        fprintf(fp,"%s", program_name);
        break;
-      case 'E':
+       case 'E':
        /* Replace with the most recent errno explanation */
 
 
@@ -154,115 +142,124 @@ vfinfo(fp, fmt, arg)
 
 
        break;
-      case 'I':
-      {
-       lang_input_statement_type *i =
-        va_arg(arg,lang_input_statement_type *);
+       case 'I':
+       {
+        lang_input_statement_type *i =
+         va_arg(arg,lang_input_statement_type *);
        
-       fprintf(fp,"%s", i->local_sym_name);
-      }
+        fprintf(fp,"%s", i->local_sym_name);
+       }
        break;
-      case 'S':
+       case 'S':
        /* Print source script file and line number */
 
-      {
+       {
        
         
-           extern unsigned int lineno;
-           if (ldfile_input_filename == (char *)NULL) {
-               fprintf(fp,"command line");
-             }
-           else {
-               fprintf(fp,"%s:%u", ldfile_input_filename, lineno );
-             }
-         }
+        extern unsigned int lineno;
+        if (ldfile_input_filename == (char *)NULL) {
+          fprintf(fp,"command line");
+        }
+        else {
+          fprintf(fp,"%s:%u", ldfile_input_filename, lineno );
+        }
+       }
        
        break;
 
-      case 'R':
+       case 'R':
        /* Print all that's interesting about a relent */
-      {
-       arelent *relent = va_arg(arg, arelent *);
+       {
+        arelent *relent = va_arg(arg, arelent *);
        
-       fprintf(fp,"%s+0x%x (type %s)",
-               (*(relent->sym_ptr_ptr))->name,
-               relent->addend,
-               relent->howto->name);
+        fprintf(fp,"%s+0x%x (type %s)",
+                (*(relent->sym_ptr_ptr))->name,
+                relent->addend,
+                relent->howto->name);
        
 
-      }
+       }
        break;
        
 
 
        
-      case 'C':
-      {
-       CONST char *filename;
-       CONST char *functionname;
-       char *cplus_name;
+       case 'C':
+       {
+        CONST char *filename;
+        CONST char *functionname;
+        char *cplus_name;
         
-       unsigned int linenumber;
-       bfd *abfd = va_arg(arg, bfd *);
-       asection *section = va_arg(arg, asection *);
-       asymbol **symbols = va_arg(arg, asymbol **);
-       bfd_vma offset = va_arg(arg, bfd_vma);
+        unsigned int linenumber;
+        bfd *abfd = va_arg(arg, bfd *);
+        asection *section = va_arg(arg, asection *);
+        asymbol **symbols = va_arg(arg, asymbol **);
+        bfd_vma offset = va_arg(arg, bfd_vma);
         
-       if (bfd_find_nearest_line(abfd,
-                                 section,
-                                 symbols,
-                                 offset,
-                                 &filename,
-                                 &functionname,
-                                 &linenumber))
-       {
-         if (filename == (char *)NULL)         
-          filename = abfd->filename;
-         if (functionname != (char *)NULL) 
-         {
-           cplus_name = cplus_demangle(functionname, 1);
-           fprintf(fp,"%s:%u: (%s)", filename, linenumber,
-                   cplus_name? cplus_name: functionname);
-           if (cplus_name) 
-            free(cplus_name);
+        if (bfd_find_nearest_line(abfd,
+                                  section,
+                                  symbols,
+                                  offset,
+                                  &filename,
+                                  &functionname,
+                                  &linenumber))
+        {
+          if (filename == (char *)NULL)        
+           filename = abfd->filename;
+          if (functionname != (char *)NULL) 
+          {
+            cplus_name = cplus_demangle(functionname, 1);
+            fprintf(fp,"%s:%u: (%s)", filename, linenumber,
+                    cplus_name? cplus_name: functionname);
+            if (cplus_name) 
+             free(cplus_name);
                  
 
-         }
+          }
                
-         else if (linenumber != 0) 
-          fprintf(fp,"%s:%u", filename, linenumber);
-         else
-          fprintf(fp,"%s(%s+%0x)", filename,
-                  section->name,
-                  offset);
-
-       }
-       else {
-           fprintf(fp,"%s(%s+%0x)", abfd->filename,
+          else if (linenumber != 0) 
+           fprintf(fp,"%s:%u", filename, linenumber);
+          else
+           fprintf(fp,"%s(%s+%0x)", filename,
                    section->name,
                    offset);
-         }
-      }
+
+        }
+        else {
+          fprintf(fp,"%s(%s+%0x)", abfd->filename,
+                  section->name,
+                  offset);
+        }
+       }
        break;
                
-      case 's':
+       case 's':
        fprintf(fp,"%s", va_arg(arg, char *));
        break;
-      case 'd':
+       case 'd':
        fprintf(fp,"%d", va_arg(arg, int));
        break;
-      default:
+       default:
        fprintf(fp,"%s", va_arg(arg, char *));
        break;
       }
     }
   }
-  if (fatal == true) {
-      extern char *output_filename;
-      if (output_filename)
-       unlink(output_filename);
-      exit(1);
+  if (fatal == true) 
+  {
+    extern char *output_filename;
+    if (output_filename) 
+    {
+      char *new = malloc(strlen(output_filename)+2);
+      extern bfd *output_bfd;
+      
+      strcpy(new, output_filename);
+      if (output_bfd && output_bfd->iostream)
+       fclose((FILE *)(output_bfd->iostream));
+      unlink(new);
     }
+    exit(1);
+  }
 }
 
 /* Format info message and print on stdout. */
@@ -325,7 +322,6 @@ DEFUN(concat, (s1, s2, s3),
 }
 
 
-
 PTR
 DEFUN(ldmalloc, (size),
 bfd_size_type size)
@@ -338,6 +334,13 @@ bfd_size_type size)
   return result;
 } 
 
+PTR
+DEFUN(xmalloc,(size),
+int size)
+{
+return ldmalloc(size);
+}
+
 
 PTR
 DEFUN(ldrealloc, (ptr, size),