Strange link script support
authorSteve Chamberlain <sac@cygnus>
Wed, 15 Apr 1992 23:11:09 +0000 (23:11 +0000)
committerSteve Chamberlain <sac@cygnus>
Wed, 15 Apr 1992 23:11:09 +0000 (23:11 +0000)
ld/ChangeLog
ld/ldgram.y
ld/ldlex.l
ld/mri.c

index 4dbb78eedb6574154da495f736dee43e8db2d08c..ed5a8a651adbaf7a2959ca4b2b115bbdeea00b62 100644 (file)
@@ -1,3 +1,8 @@
+Wed Apr 15 16:09:33 1992  Steve Chamberlain  (sac@thepub.cygnus.com)
+
+       * mri.c, ldgram.y, ldlex.l: added support for minimal strange link
+       scripts.
+
 Thu Apr  9 05:52:02 1992  Ken Raeburn  (Raeburn@Cygnus.COM)
 
        * Makefile.in (install): Install second copy in $(tooldir)/bin
index d6a48300a6d5ccd3a2ec5b9c60099931d4e1ea19..9c882f781d27d85d2d604cbbaf6d326aff4cc944 100644 (file)
@@ -126,7 +126,7 @@ struct sec *section;
 
 /*%token <token> '+' '-' '*' '/' '%'*/
 %right UNARY
-%token END
+%token END 
 %left <token> '('
 %token <token> ALIGN_K BLOCK LONG SHORT BYTE
 %token SECTIONS  
@@ -152,7 +152,7 @@ struct sec *section;
 %type <name>  filename
 
 
-%token CHIP LIST SECT ABSOLUTE  LOAD
+%token CHIP LIST SECT ABSOLUTE  LOAD NEWLINE ENDWORD ORDER NAMEWORD FORMAT
 
 %{
 ld_config_type config;
@@ -345,22 +345,25 @@ mri_script_file:
        ;
 
 mri_script_lines:
-               mri_script_lines mri_script_line
-       |
+               mri_script_lines mri_script_command NEWLINE
+          |
        ;
 
-mri_script_line:
+mri_script_command:
                CHIP  exp 
        |       CHIP  exp ',' exp
        |       NAME    {
-                       einfo("%P%F: unrecognised keyword in MRI style script '%s'\n",
-                               $1);
+                       einfo("%P%F: unrecognised keyword in MRI style script '%s'\n",$1);
                        }
        |       LIST    {
                        write_map = true;
                        config.map_filename = "-";
                        }
-       |       SECT NAME ',' exp
+        |       ORDER ordernamelist
+       |       ENDWORD 
+       |       FORMAT NAME
+                       { mri_format($2); }
+       |       SECT NAME ',' exp 
                        { mri_output_section($2, $4);}
        |       SECT NAME  exp
                        { mri_output_section($2, $3);}
@@ -368,6 +371,15 @@ mri_script_line:
                        { mri_output_section($2, $4);}
        |       ABSOLUTE mri_abs_name_list
        |       LOAD     mri_load_name_list
+       |       NAMEWORD NAME 
+                       { mri_name($2); }   
+        |
+       ;
+
+ordernamelist:
+             ordernamelist ',' NAME         { mri_order($3); }
+       |     ordernamelist  NAME         { mri_order($2); }
+       |
        ;
 
 mri_load_name_list:
index c2eb5ea6a20db885b2f0a4044f9bba1a3fea58d4..f4ffc4ce6356060fe70e446974d82b5ce6cd73b5 100644 (file)
@@ -65,7 +65,7 @@ unsigned int include_stack_ptr = 0;
 %a 4000
 %o 5000
 FILENAMECHAR1  [_a-zA-Z\/\.\\]
-FILENAMECHAR   [_a-zA-Z0-9\/\.\-\_\+\=\$\:\[\]\\]
+FILENAMECHAR   [_a-zA-Z0-9\/\.\-\_\+\$\:\[\]\\]
 FILENAME       {FILENAMECHAR}+
 WHITE          [ \t\n]+ 
 
@@ -277,12 +277,15 @@ WHITE             [ \t\n]+
 <BOTH,SCRIPT>"org"                     { RTOKEN(ORIGIN);}
 <BOTH,SCRIPT>"l"                       { RTOKEN( LENGTH);}
 <BOTH,SCRIPT>"len"                     { RTOKEN( LENGTH);}
-
+<MRI>"\n"                      { ++ lineno;  RTOKEN(NEWLINE); }
 <MRI>^"*".*                    { /* Mri comment line */ }
-<MRI>\n                                { ++ lineno;  }
+<MRI>"END"                      { RTOKEN(ENDWORD); }
 <MRI>"CHIP"                     { RTOKEN(CHIP); }
 <MRI>"LOAD"                     { RTOKEN(LOAD); }
-<MRI>"LIST".*\n                 { RTOKEN(LIST); /* LIST and ignore to end of line */ }
+<MRI>"ORDER"                    { RTOKEN(ORDER); }
+<MRI>"NAME"                     { RTOKEN(NAMEWORD); }
+<MRI>"FORMAT"                   { RTOKEN(FORMAT); }
+<MRI>"LIST".*                   { RTOKEN(LIST); /* LIST and ignore to end of line */ }
 <MRI>"SECT"                    { RTOKEN(SECT); }
 <MRI>"ABSOLUTE"                        { RTOKEN(ABSOLUTE); }
 
index fd2edcf14bcf9a727defb8d466fe3fd1f2f7a29a..04ee9d29b3f568391e7f73f75c95f6342fc94d0d 100644 (file)
--- a/ld/mri.c
+++ b/ld/mri.c
@@ -47,15 +47,19 @@ DEFUN(mri_output_section, (name, vma),
 
   os->flags = 0;
   os->block_value = 0;
- }
+}
 
 /* if any ABSOLUTE <name> are in the script, only load those files
 marked thus */
 
 void DEFUN(mri_only_load,(name), CONST char *name)
- {
+{
+  lang_output_section_statement_type *os;
 
+  os =  lang_output_section_statement_lookup(name);
 
+  os->flags = 0;
+  os->block_value = 0;
 
 }
 
@@ -67,3 +71,38 @@ DEFUN(mri_load,(name),
 
   lang_add_input_file(name, lang_input_file_is_file_enum, (char *)NULL);
 }
+
+
+void
+DEFUN(mri_order,(name),
+      CONST char *name)
+{
+einfo("Ignoring ORDER %s for the moment\n", name);
+
+}
+
+void 
+DEFUN(mri_name,(name),
+      CONST char *name)
+{
+  lang_add_output(name);
+
+}
+
+
+void
+DEFUN(mri_format,(name),
+      CONST char *name)
+{
+  if (strcmp(name, "S") == 0)
+  {
+    lang_add_output_format("srec");
+  }
+  else if (strcmp(name, "IEEE") == 0)
+  {
+    lang_add_output_format("ieee");
+  }
+  else {
+    einfo("%P%F: unknown format type %s\n", name);
+  }
+}