OSDN Git Service

include/:
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 17 Nov 2010 01:03:06 +0000 (01:03 +0000)
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 17 Nov 2010 01:03:06 +0000 (01:03 +0000)
* simple-object.h (simple_object_attributes_merge): Declare,
replacing simple_object_attributes_compare.
libiberty/:
* simple-object.c (simple_object_attributes_merge): Rename from
simple_object_attributes_compare.  Call merge field.
* simple-object-common.h (struct simple_object_functions): Rename
attributes_compare field to attribute_merge.
* simple-object-elf.c (EM_SPARC): Define.
(EM_SPARC32PLUS): Define.
(simple_object_elf_attributes_merge): Renamed from
simple_object_elf_attributes_compare.  Permit EM_SPARC and
EM_SPARC32PLUS objects to be merged.
(simple_object_elf_functions): Update function name.
* simple-object-coff.c (simple_object_coff_attributes_merge):
Rename from simple_object_coff_attributes_compare.
(simple_object_coff_functions): Update function name.
* simple-object-mach-o.c (simple_object_mach_o_attributes_merge):
Renamed from simple_object_mach_o_attributes_compare.
(simple_object_mach_o_functions): Update function name.
gcc/lto/:
* lto-object.c (lto_obj_file_open): Call
simple_object_attributes_merge rather than
simple_object_attributes_compare.

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

gcc/lto/ChangeLog
gcc/lto/lto-object.c
include/ChangeLog
include/simple-object.h
libiberty/ChangeLog
libiberty/simple-object-coff.c
libiberty/simple-object-common.h
libiberty/simple-object-elf.c
libiberty/simple-object-mach-o.c
libiberty/simple-object.c

index 21bbeff..c254da1 100644 (file)
@@ -1,3 +1,9 @@
+2010-11-16  Ian Lance Taylor  <iant@google.com>
+
+       * lto-object.c (lto_obj_file_open): Call
+       simple_object_attributes_merge rather than
+       simple_object_attributes_compare.
+
 2010-11-12  Joseph Myers  <joseph@codesourcery.com>
 
        * Make-lang.in (lto/lto.o): Use $(OPTS_H).
index e4a9981..4a67580 100644 (file)
@@ -138,8 +138,8 @@ lto_obj_file_open (const char *filename, bool writable)
        saved_attributes = attrs;
       else
        {
-         errmsg = simple_object_attributes_compare (saved_attributes, attrs,
-                                                    &err);
+         errmsg = simple_object_attributes_merge (saved_attributes, attrs,
+                                                  &err);
          if (errmsg != NULL)
            goto fail_errmsg;
        }
index 0be337d..3a3e244 100644 (file)
@@ -1,3 +1,8 @@
+2010-11-16  Ian Lance Taylor  <iant@google.com>
+
+       * simple-object.h (simple_object_attributes_merge): Declare,
+       replacing simple_object_attributes_compare.
+
 2010-11-04  Ian Lance Taylor  <iant@google.com>
 
        * dwarf2.h (enum dwarf_source_language): Add DW_LANG_Go.
index a72e4a1..c478675 100644 (file)
@@ -117,14 +117,15 @@ extern simple_object_attributes *
 simple_object_fetch_attributes (simple_object_read *simple_object,
                                const char **errmsg, int *err);
 
-/* Compare ATTRS1 and ATTRS2.  If they could be linked together
-   without error, return NULL.  Otherwise, return an error message,
-   set *ERR to an errno value or 0 if there isn't one.  */
+/* Merge the FROM attributes into TO.  If two objects with these
+   attributes could be linked together without error, returns NULL.
+   Otherwise, returns an error message, and sets *ERR to an errno
+   value or 0 if there isn't one.  */
 
 extern const char *
-simple_object_attributes_compare (simple_object_attributes *attrs1,
-                           simple_object_attributes *attrs2,
-                           int *err);
+simple_object_attributes_merge (simple_object_attributes *to,
+                               simple_object_attributes *from,
+                               int *err);
 
 /* Release all resources associated with ATTRS.  */
 
index 488fd2d..ed0d055 100644 (file)
@@ -1,3 +1,22 @@
+2010-11-16  Ian Lance Taylor  <iant@google.com>
+
+       * simple-object.c (simple_object_attributes_merge): Rename from
+       simple_object_attributes_compare.  Call merge field.
+       * simple-object-common.h (struct simple_object_functions): Rename
+       attributes_compare field to attribute_merge.
+       * simple-object-elf.c (EM_SPARC): Define.
+       (EM_SPARC32PLUS): Define.
+       (simple_object_elf_attributes_merge): Renamed from
+       simple_object_elf_attributes_compare.  Permit EM_SPARC and
+       EM_SPARC32PLUS objects to be merged.
+       (simple_object_elf_functions): Update function name.
+       * simple-object-coff.c (simple_object_coff_attributes_merge):
+       Rename from simple_object_coff_attributes_compare.
+       (simple_object_coff_functions): Update function name.
+       * simple-object-mach-o.c (simple_object_mach_o_attributes_merge):
+       Renamed from simple_object_mach_o_attributes_compare.
+       (simple_object_mach_o_functions): Update function name.
+
 2010-11-16  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR other/42670
index ff8fee4..a7802a5 100644 (file)
@@ -457,15 +457,14 @@ simple_object_coff_release_read (void *data)
 /* Compare two attributes structures.  */
 
 static const char *
-simple_object_coff_attributes_compare (void *data1, void *data2, int *err)
+simple_object_coff_attributes_merge (void *todata, void *fromdata, int *err)
 {
-  struct simple_object_coff_attributes *attrs1 =
-    (struct simple_object_coff_attributes *) data1;
-  struct simple_object_coff_attributes *attrs2 =
-    (struct simple_object_coff_attributes *) data2;
+  struct simple_object_coff_attributes *to =
+    (struct simple_object_coff_attributes *) todata;
+  struct simple_object_coff_attributes *from =
+    (struct simple_object_coff_attributes *) fromdata;
 
-  if (attrs1->magic != attrs2->magic
-      || attrs1->is_big_endian != attrs2->is_big_endian)
+  if (to->magic != from->magic || to->is_big_endian != from->is_big_endian)
     {
       *err = 0;
       return "COFF object format mismatch";
@@ -797,7 +796,7 @@ const struct simple_object_functions simple_object_coff_functions =
   simple_object_coff_find_sections,
   simple_object_coff_fetch_attributes,
   simple_object_coff_release_read,
-  simple_object_coff_attributes_compare,
+  simple_object_coff_attributes_merge,
   simple_object_coff_release_attributes,
   simple_object_coff_start_write,
   simple_object_coff_write_to_file,
index 8f74390..264b179 100644 (file)
@@ -123,10 +123,10 @@ struct simple_object_functions
   /* Release the private data for an simple_object_read.  */
   void (*release_read) (void *);
 
-  /* Compare the private data for the attributes of two files.  If
-     they are the same, in the sense that they could be linked
-     together, return NULL.  Otherwise return an error message.  */
-  const char *(*attributes_compare) (void *, void *, int *err);
+  /* Merge the private data for the attributes of two files.  If they
+     could be linked together, return NULL.  Otherwise return an error
+     message.  */
+  const char *(*attributes_merge) (void *, void *, int *err);
 
   /* Release the private data for an simple_object_attributes.  */
   void (*release_attributes) (void *);
index 5b8cfba..4196c53 100644 (file)
@@ -115,6 +115,11 @@ typedef struct {
 
 #define ET_REL         1       /* Relocatable file */
 
+/* Values for e_machine field of Ehdr.  */
+
+#define EM_SPARC         2     /* SUN SPARC */
+#define EM_SPARC32PLUS  18     /* Sun's "v8plus" */
+
 /* Special section index values.  */
 
 #define SHN_LORESERVE  0xFF00          /* Begin range of reserved indices */
@@ -604,20 +609,52 @@ simple_object_elf_release_read (void *data)
 /* Compare two attributes structures.  */
 
 static const char *
-simple_object_elf_attributes_compare (void *data1, void *data2, int *err)
+simple_object_elf_attributes_merge (void *todata, void *fromdata, int *err)
 {
-  struct simple_object_elf_attributes *attrs1 =
-    (struct simple_object_elf_attributes *) data1;
-  struct simple_object_elf_attributes *attrs2 =
-    (struct simple_object_elf_attributes *) data2;
-
-  if (attrs1->ei_data != attrs2->ei_data
-      || attrs1->ei_class != attrs2->ei_class
-      || attrs1->machine != attrs2->machine)
+  struct simple_object_elf_attributes *to =
+    (struct simple_object_elf_attributes *) todata;
+  struct simple_object_elf_attributes *from =
+    (struct simple_object_elf_attributes *) fromdata;
+
+  if (to->ei_data != from->ei_data || to->ei_class != from->ei_class)
     {
       *err = 0;
       return "ELF object format mismatch";
     }
+
+  if (to->machine != from->machine)
+    {
+      int ok;
+
+      /* EM_SPARC and EM_SPARC32PLUS are compatible and force an
+        output of EM_SPARC32PLUS.  */
+      ok = 0;
+      switch (to->machine)
+       {
+       case EM_SPARC:
+         if (from->machine == EM_SPARC32PLUS)
+           {
+             to->machine = from->machine;
+             ok = 1;
+           }
+         break;
+
+       case EM_SPARC32PLUS:
+         if (from->machine == EM_SPARC)
+           ok = 1;
+         break;
+
+       default:
+         break;
+       }
+
+      if (!ok)
+       {
+         *err = 0;
+         return "ELF machine number mismatch";
+       }
+    }
+
   return NULL;
 }
 
@@ -908,7 +945,7 @@ const struct simple_object_functions simple_object_elf_functions =
   simple_object_elf_find_sections,
   simple_object_elf_fetch_attributes,
   simple_object_elf_release_read,
-  simple_object_elf_attributes_compare,
+  simple_object_elf_attributes_merge,
   simple_object_elf_release_attributes,
   simple_object_elf_start_write,
   simple_object_elf_write_to_file,
index 4067b16..bbbbd09 100644 (file)
@@ -624,16 +624,16 @@ simple_object_mach_o_release_read (void *data)
 /* Compare two attributes structures.  */
 
 static const char *
-simple_object_mach_o_attributes_compare (void *data1, void *data2, int *err)
+simple_object_mach_o_attributes_merge (void *todata, void *fromdata, int *err)
 {
-  struct simple_object_mach_o_attributes *attrs1 =
-    (struct simple_object_mach_o_attributes *) data1;
-  struct simple_object_mach_o_attributes *attrs2 =
-    (struct simple_object_mach_o_attributes *) data2;
-
-  if (attrs1->magic != attrs2->magic
-      || attrs1->is_big_endian != attrs2->is_big_endian
-      || attrs1->cputype != attrs2->cputype)
+  struct simple_object_mach_o_attributes *to =
+    (struct simple_object_mach_o_attributes *) todata;
+  struct simple_object_mach_o_attributes *from =
+    (struct simple_object_mach_o_attributes *) fromdata;
+
+  if (to->magic != from->magic
+      || to->is_big_endian != from->is_big_endian
+      || to->cputype != from->cputype)
     {
       *err = 0;
       return "Mach-O object format mismatch";
@@ -1014,7 +1014,7 @@ const struct simple_object_functions simple_object_mach_o_functions =
   simple_object_mach_o_find_sections,
   simple_object_mach_o_fetch_attributes,
   simple_object_mach_o_release_read,
-  simple_object_mach_o_attributes_compare,
+  simple_object_mach_o_attributes_merge,
   simple_object_mach_o_release_attributes,
   simple_object_mach_o_start_write,
   simple_object_mach_o_write_to_file,
index c9bd82f..d000cfc 100644 (file)
@@ -257,20 +257,19 @@ simple_object_release_read (simple_object_read *sobj)
   XDELETE (sobj);
 }
 
-/* Compare attributes.  */
+/* Merge attributes.  */
 
 const char *
-simple_object_attributes_compare (simple_object_attributes *attrs1,
-                                 simple_object_attributes *attrs2,
-                                 int *err)
+simple_object_attributes_merge (simple_object_attributes *to,
+                               simple_object_attributes *from,
+                               int *err)
 {
-  if (attrs1->functions != attrs2->functions)
+  if (to->functions != from->functions)
     {
       *err = 0;
       return "different object file format";
     }
-  return attrs1->functions->attributes_compare (attrs1->data, attrs2->data,
-                                               err);
+  return to->functions->attributes_merge (to->data, from->data, err);
 }
 
 /* Release an attributes structure.  */