2005-02-22 Eric Christopher <echristo@redhat.com>
authorEric Christopher <echristo@gmail.com>
Tue, 22 Feb 2005 23:54:41 +0000 (23:54 +0000)
committerEric Christopher <echristo@gmail.com>
Tue, 22 Feb 2005 23:54:41 +0000 (23:54 +0000)
* ld-mips-elf/reloc-merge-lo16.d: Correct symbol
table size for __start.

2005-02-22  Eric Christopher  <echristo@redhat.com>

* config/tc-mips.c (struct proc): Change isym to
func_sym. New member func_end_sym.
(s_mips_ent): Update.
(s_mips_end): Ditto. Add code to compute function size.

gas/ChangeLog
gas/config/tc-mips.c
ld/testsuite/ChangeLog
ld/testsuite/ld-mips-elf/reloc-merge-lo16.d

index bd343d2..6efebf6 100644 (file)
@@ -1,3 +1,10 @@
+2005-02-22  Eric Christopher  <echristo@redhat.com>
+
+       * config/tc-mips.c (struct proc): Change isym to
+       func_sym. New member func_end_sym.
+       (s_mips_ent): Update.
+       (s_mips_end): Ditto. Add code to compute function size.
+
 2005-02-22  Alan Modra  <amodra@bigpond.net.au>
 
        * read.c: Warning fixes.
index 58536ad..ffc44cb 100644 (file)
@@ -13410,7 +13410,8 @@ mips_elf_final_processing (void)
 #endif /* OBJ_ELF || OBJ_MAYBE_ELF */
 \f
 typedef struct proc {
-  symbolS *isym;
+  symbolS *func_sym;
+  symbolS *func_end_sym;
   unsigned long reg_mask;
   unsigned long reg_offset;
   unsigned long fpreg_mask;
@@ -13594,7 +13595,7 @@ s_mips_end (int x ATTRIBUTE_UNUSED)
   if (p != NULL)
     {
       assert (S_GET_NAME (p));
-      if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->isym)))
+      if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->func_sym)))
        as_warn (_(".end symbol does not match .ent symbol."));
 
       if (debug_type == DEBUG_STABS)
@@ -13604,6 +13605,21 @@ s_mips_end (int x ATTRIBUTE_UNUSED)
   else
     as_warn (_(".end directive missing or unknown symbol"));
 
+  /* Create an expression to calculate the size of the function.  */
+  if (p && cur_proc_ptr)
+    {
+      OBJ_SYMFIELD_TYPE *obj = symbol_get_obj (p);
+      expressionS *exp = xmalloc (sizeof (expressionS));
+
+      obj->size = exp;
+      exp->X_op = O_subtract;
+      exp->X_add_symbol = symbol_temp_new_now ();
+      exp->X_op_symbol = p;
+      exp->X_add_number = 0;
+
+      cur_proc_ptr->func_end_sym = exp->X_add_symbol;
+    }
+
 #ifdef OBJ_ELF
   /* Generate a .pdr section.  */
   if (OUTPUT_FLAVOR == bfd_target_elf_flavour && ! ECOFF_DEBUGGING
@@ -13677,7 +13693,7 @@ s_mips_ent (int aent)
       cur_proc_ptr = &cur_proc;
       memset (cur_proc_ptr, '\0', sizeof (procS));
 
-      cur_proc_ptr->isym = symbolP;
+      cur_proc_ptr->func_sym = symbolP;
 
       symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
 
index bebbb15..9244d48 100644 (file)
@@ -1,3 +1,8 @@
+2005-02-22  Eric Christopher  <echristo@redhat.com>
+
+       * ld-mips-elf/reloc-merge-lo16.d: Correct symbol
+       table size for __start.
+
 2005-02-22  Daniel Jacobowitz  <dan@codesourcery.com>
 
        * ld-elfvsb/hidden2.d: Expect OBJECT.
index f6e7ef8..7cb3cfe 100644 (file)
@@ -8,7 +8,7 @@
 .*: +file format .*mips.*
 #...
 0+80fe70 l       .rodata       0+000000 g
-0+400000 g     F .text 0+000000 __start
+0+400000 g     F .text 0+00000c __start
 #...
 0+400000 <[^>]*> 3c020081      lui     v0,0x81
 0+400004 <[^>]*> 2443fe70      addiu   v1,v0,-400