diff options
-rw-r--r-- | include/ChangeLog | 5 | ||||
-rw-r--r-- | include/simple-object.h | 13 | ||||
-rw-r--r-- | libiberty/ChangeLog | 19 | ||||
-rw-r--r-- | libiberty/simple-object-coff.c | 15 | ||||
-rw-r--r-- | libiberty/simple-object-common.h | 8 | ||||
-rw-r--r-- | libiberty/simple-object-elf.c | 57 | ||||
-rw-r--r-- | libiberty/simple-object-mach-o.c | 20 | ||||
-rw-r--r-- | libiberty/simple-object.c | 13 |
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. */ |