aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/ChangeLog5
-rw-r--r--include/simple-object.h13
-rw-r--r--libiberty/ChangeLog19
-rw-r--r--libiberty/simple-object-coff.c15
-rw-r--r--libiberty/simple-object-common.h8
-rw-r--r--libiberty/simple-object-elf.c57
-rw-r--r--libiberty/simple-object-mach-o.c20
-rw-r--r--libiberty/simple-object.c13
8 files changed, 105 insertions, 45 deletions
diff --git a/include/ChangeLog b/include/ChangeLog
index 56314cb..bcaf5f2 100644
--- a/include/ChangeLog
+++ b/include/ChangeLog
@@ -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-16 Jie Zhang <jie.zhang@analog.com>
* elf/bfin.h (EF_BFIN_CODE_IN_L1): Define.
diff --git a/include/simple-object.h b/include/simple-object.h
index a72e4a1..c478675 100644
--- a/include/simple-object.h
+++ b/include/simple-object.h
@@ -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. */
diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog
index 488fd2d..ed0d055 100644
--- a/libiberty/ChangeLog
+++ b/libiberty/ChangeLog
@@ -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
diff --git a/libiberty/simple-object-coff.c b/libiberty/simple-object-coff.c
index ff8fee4..a7802a5 100644
--- a/libiberty/simple-object-coff.c
+++ b/libiberty/simple-object-coff.c
@@ -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,
diff --git a/libiberty/simple-object-common.h b/libiberty/simple-object-common.h
index 8f74390..264b179 100644
--- a/libiberty/simple-object-common.h
+++ b/libiberty/simple-object-common.h
@@ -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 *);
diff --git a/libiberty/simple-object-elf.c b/libiberty/simple-object-elf.c
index 5b8cfba..4196c53 100644
--- a/libiberty/simple-object-elf.c
+++ b/libiberty/simple-object-elf.c
@@ -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,
diff --git a/libiberty/simple-object-mach-o.c b/libiberty/simple-object-mach-o.c
index 4067b16..bbbbd09 100644
--- a/libiberty/simple-object-mach-o.c
+++ b/libiberty/simple-object-mach-o.c
@@ -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,
diff --git a/libiberty/simple-object.c b/libiberty/simple-object.c
index c9bd82f..d000cfc 100644
--- a/libiberty/simple-object.c
+++ b/libiberty/simple-object.c
@@ -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. */