* ldlang.c (entry_symbol): Make static.
authorIan Lance Taylor <ian@airs.com>
Fri, 27 May 1994 15:39:11 +0000 (15:39 +0000)
committerIan Lance Taylor <ian@airs.com>
Fri, 27 May 1994 15:39:11 +0000 (15:39 +0000)
(lang_add_entry): Add cmdline argument.
* ldlang.h (lang_add_entry): Change prototype.
* ldgram.y (statement_anywhere): Change lang_add_entry call.
* lexsup.c (parse_args): Likewise.

ld/ChangeLog
ld/ldgram.y
ld/ldlang.c
ld/ldlang.h
ld/lexsup.c

index 54cea0e..70a81a4 100644 (file)
@@ -1,7 +1,10 @@
 Fri May 27 01:08:14 1994  Ian Lance Taylor  (ian@tweedledumb.cygnus.com)
 
-       * ldlang.c (lang_add_entry): Only set the entry symbol if it has
-       not been set already.
+       * ldlang.c (entry_symbol): Make static.
+       (lang_add_entry): Add cmdline argument.
+       * ldlang.h (lang_add_entry): Change prototype.
+       * ldgram.y (statement_anywhere): Change lang_add_entry call.
+       * lexsup.c (parse_args): Likewise.
 
 Tue May 24 16:13:43 1994  Ian Lance Taylor  (ian@tweedledumb.cygnus.com)
 
index 0640afe..4789b7c 100644 (file)
@@ -155,7 +155,6 @@ mri_script_command:
                        einfo("%P%F: unrecognised keyword in MRI style script '%s'\n",$1);
                        }
        |       LIST    {
-                       write_map = true;
                        config.map_filename = "-";
                        }
         |       ORDER ordernamelist
@@ -282,7 +281,7 @@ sec_or_group_p1:
 
 statement_anywhere:
                ENTRY '(' NAME ')'
-               { lang_add_entry($3); }
+               { lang_add_entry ($3, 0); }
        |       assignment end
        ;
 
index 3ad4ac6..b4a3850 100644 (file)
@@ -143,7 +143,7 @@ lang_output_section_statement_type *abs_output_section;
 lang_statement_list_type *stat_ptr = &statement_list;
 lang_statement_list_type file_chain =
 {0};
-CONST char *entry_symbol = 0;
+static const char *entry_symbol = 0;
 boolean lang_has_input_file = false;
 boolean had_output_filename = false;
 boolean lang_float_flag = false;
@@ -2621,12 +2621,25 @@ lang_section_start (name, address)
   ad->address = address;
 }
 
+/* Set the start symbol to NAME.  CMDLINE is nonzero if this is called
+   because of a -e argument on the command line, or zero if this is
+   called by ENTRY in a linker script.  Command line arguments take
+   precedence.  */
+
 void
-lang_add_entry (name)
+lang_add_entry (name, cmdline)
      CONST char *name;
+     int cmdline;
 {
-  if (entry_symbol == NULL)
-    entry_symbol = name;
+  static int from_cmdline;
+
+  if (entry_symbol == NULL
+      || cmdline
+      || ! from_cmdline)
+    {
+      entry_symbol = name;
+      from_cmdline = cmdline;
+    }
 }
 
 void
index 1e7e36a..a3a98e5 100644 (file)
@@ -64,6 +64,7 @@ typedef struct lang_statement_header_struct
       lang_object_symbols_statement_enum,
       lang_fill_statement_enum,
       lang_data_statement_enum,
+      lang_reloc_statement_enum,
       lang_target_statement_enum,
       lang_output_statement_enum,
       lang_padding_statement_enum,
@@ -148,8 +149,38 @@ typedef struct
   bfd_vma output_vma;
 } lang_data_statement_type;
 
+/* Generate a reloc in the output file.  */
 
+typedef struct
+{
+  lang_statement_header_type header;
+
+  /* Reloc to generate.  */
+  bfd_reloc_code_real_type reloc;
 
+  /* Reloc howto structure.  */
+  const reloc_howto_type *howto;
+
+  /* Section to generate reloc against.  Exactly one of section and
+     name must be NULL.  */
+  asection *section;
+
+  /* Name of symbol to generate reloc against.  Exactly one of section
+     and name must be NULL.  */
+  const char *name;
+
+  /* Expression for addend.  */
+  union etree_union *addend_exp;
+
+  /* Resolved addend.  */
+  bfd_vma addend_value;
+
+  /* Output section where reloc should be performed.  */
+  asection *output_section;
+
+  /* VMA within output section.  */
+  bfd_vma output_vma;
+} lang_reloc_statement_type;
 
 typedef struct lang_input_statement_struct
 {
@@ -259,6 +290,7 @@ typedef union lang_statement_union
   union lang_statement_union *next;
   lang_wild_statement_type wild_statement;
   lang_data_statement_type data_statement;
+  lang_reloc_statement_type reloc_statement;
   lang_address_statement_type address_statement;
   lang_output_section_statement_type output_section_statement;
   lang_afile_asection_pair_statement_type afile_asection_pair_statement;
@@ -273,7 +305,6 @@ typedef union lang_statement_union
   lang_padding_statement_type padding_statement;
 } lang_statement_union_type;
 
-extern bfd_size_type largest_section;
 extern lang_output_section_statement_type *abs_output_section;
 extern boolean lang_has_input_file;
 extern etree_type *base;
@@ -297,7 +328,7 @@ extern void lang_enter_output_section_statement
 extern void lang_final PARAMS ((void));
 extern void lang_process PARAMS ((void));
 extern void lang_section_start PARAMS ((const char *, union etree_union *));
-extern void lang_add_entry PARAMS ((const char *));
+extern void lang_add_entry PARAMS ((const char *, int));
 extern void lang_add_target PARAMS ((const char *));
 extern void lang_add_wild PARAMS ((const char *const , const char *const));
 extern void lang_add_map PARAMS ((const char *));
@@ -324,37 +355,6 @@ extern void lang_for_each_file
        statement != (lang_input_statement_type *)NULL;         \
        statement = (lang_input_statement_type *)statement->next)\
   
-#define LANG_FOR_EACH_INPUT_SECTION(statement, abfd, section, x)       \
-  {                                                                    \
-    extern lang_statement_list_type file_chain;                                \
-    lang_input_statement_type *statement;                              \
-    for (statement = (lang_input_statement_type *)file_chain.head;     \
-        statement != (lang_input_statement_type *)NULL;                \
-        statement = (lang_input_statement_type *)statement->next)      \
-      {                                                                        \
-       asection *section;                                              \
-       bfd *abfd = statement->the_bfd;                                 \
-        for (section = abfd->sections;                                 \
-            section != (asection *)NULL;                               \
-            section = section->next)                                   \
-         {                                                             \
-           x;                                                          \
-         }                                                             \
-      }                                                                        \
-  }
-
-#define LANG_FOR_EACH_OUTPUT_SECTION(section, x)               \
-  {                                                            \
-    extern bfd *output_bfd;                                    \
-    asection *section;                                         \
-    for (section = output_bfd->sections;                       \
-        section != (asection *)NULL;                           \
-        section = section->next)                               \
-      {                                                                \
-       x;                                                      \
-      }                                                                \
-  }
-
 extern void lang_process PARAMS ((void));
 extern void ldlang_add_file PARAMS ((lang_input_statement_type *));
 extern lang_output_section_statement_type *lang_output_section_find
@@ -369,8 +369,16 @@ extern void ldlang_add_undef PARAMS ((const char *const name));
 extern void lang_add_output_format PARAMS ((const char *, int from_script));
 extern void lang_list_init PARAMS ((lang_statement_list_type*));
 extern void lang_add_data PARAMS ((int type, union etree_union *));
+extern void lang_add_reloc
+  PARAMS ((bfd_reloc_code_real_type reloc, const reloc_howto_type *howto,
+          asection *section, const char *name, union etree_union *addend));
 extern void lang_for_each_statement
   PARAMS ((void (*func) (lang_statement_union_type *)));
 extern PTR stat_alloc PARAMS ((size_t size));
+extern bfd_vma lang_size_sections
+  PARAMS ((lang_statement_union_type *s,
+          lang_output_section_statement_type *output_section_statement,
+          lang_statement_union_type **prev, fill_type fill,
+          bfd_vma dot, boolean relax));
 
 #endif
index a397574..058f546 100644 (file)
@@ -168,7 +168,7 @@ parse_args (argc, argv)
             be used to select an output format.  */
          break;
        case 'e':
-         lang_add_entry (optarg);
+         lang_add_entry (optarg, 1);
          break;
        case 'F':
          /* Ignore.  */