merge from gcc

This commit is contained in:
DJ Delorie 2010-11-17 02:03:43 +00:00
parent ab8056e082
commit f9e6589d87
8 changed files with 103 additions and 43 deletions

View 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-16 Jie Zhang <jie.zhang@analog.com> 2010-11-16 Jie Zhang <jie.zhang@analog.com>
* elf/bfin.h (EF_BFIN_CODE_IN_L1): Define. * elf/bfin.h (EF_BFIN_CODE_IN_L1): Define.

View File

@ -117,13 +117,14 @@ extern simple_object_attributes *
simple_object_fetch_attributes (simple_object_read *simple_object, simple_object_fetch_attributes (simple_object_read *simple_object,
const char **errmsg, int *err); const char **errmsg, int *err);
/* Compare ATTRS1 and ATTRS2. If they could be linked together /* Merge the FROM attributes into TO. If two objects with these
without error, return NULL. Otherwise, return an error message, attributes could be linked together without error, returns NULL.
set *ERR to an errno value or 0 if there isn't one. */ Otherwise, returns an error message, and sets *ERR to an errno
value or 0 if there isn't one. */
extern const char * extern const char *
simple_object_attributes_compare (simple_object_attributes *attrs1, simple_object_attributes_merge (simple_object_attributes *to,
simple_object_attributes *attrs2, simple_object_attributes *from,
int *err); int *err);
/* Release all resources associated with ATTRS. */ /* Release all resources associated with ATTRS. */

View 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> 2010-11-16 H.J. Lu <hongjiu.lu@intel.com>
PR other/42670 PR other/42670

View File

@ -457,15 +457,14 @@ simple_object_coff_release_read (void *data)
/* Compare two attributes structures. */ /* Compare two attributes structures. */
static const char * 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 *to =
(struct simple_object_coff_attributes *) data1; (struct simple_object_coff_attributes *) todata;
struct simple_object_coff_attributes *attrs2 = struct simple_object_coff_attributes *from =
(struct simple_object_coff_attributes *) data2; (struct simple_object_coff_attributes *) fromdata;
if (attrs1->magic != attrs2->magic if (to->magic != from->magic || to->is_big_endian != from->is_big_endian)
|| attrs1->is_big_endian != attrs2->is_big_endian)
{ {
*err = 0; *err = 0;
return "COFF object format mismatch"; 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_find_sections,
simple_object_coff_fetch_attributes, simple_object_coff_fetch_attributes,
simple_object_coff_release_read, simple_object_coff_release_read,
simple_object_coff_attributes_compare, simple_object_coff_attributes_merge,
simple_object_coff_release_attributes, simple_object_coff_release_attributes,
simple_object_coff_start_write, simple_object_coff_start_write,
simple_object_coff_write_to_file, simple_object_coff_write_to_file,

View File

@ -123,10 +123,10 @@ struct simple_object_functions
/* Release the private data for an simple_object_read. */ /* Release the private data for an simple_object_read. */
void (*release_read) (void *); void (*release_read) (void *);
/* Compare the private data for the attributes of two files. If /* Merge the private data for the attributes of two files. If they
they are the same, in the sense that they could be linked could be linked together, return NULL. Otherwise return an error
together, return NULL. Otherwise return an error message. */ message. */
const char *(*attributes_compare) (void *, void *, int *err); const char *(*attributes_merge) (void *, void *, int *err);
/* Release the private data for an simple_object_attributes. */ /* Release the private data for an simple_object_attributes. */
void (*release_attributes) (void *); void (*release_attributes) (void *);

View File

@ -115,6 +115,11 @@ typedef struct {
#define ET_REL 1 /* Relocatable file */ #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. */ /* Special section index values. */
#define SHN_LORESERVE 0xFF00 /* Begin range of reserved indices */ #define SHN_LORESERVE 0xFF00 /* Begin range of reserved indices */
@ -604,20 +609,52 @@ simple_object_elf_release_read (void *data)
/* Compare two attributes structures. */ /* Compare two attributes structures. */
static const char * 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 *to =
(struct simple_object_elf_attributes *) data1; (struct simple_object_elf_attributes *) todata;
struct simple_object_elf_attributes *attrs2 = struct simple_object_elf_attributes *from =
(struct simple_object_elf_attributes *) data2; (struct simple_object_elf_attributes *) fromdata;
if (attrs1->ei_data != attrs2->ei_data if (to->ei_data != from->ei_data || to->ei_class != from->ei_class)
|| attrs1->ei_class != attrs2->ei_class
|| attrs1->machine != attrs2->machine)
{ {
*err = 0; *err = 0;
return "ELF object format mismatch"; 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; return NULL;
} }
@ -908,7 +945,7 @@ const struct simple_object_functions simple_object_elf_functions =
simple_object_elf_find_sections, simple_object_elf_find_sections,
simple_object_elf_fetch_attributes, simple_object_elf_fetch_attributes,
simple_object_elf_release_read, simple_object_elf_release_read,
simple_object_elf_attributes_compare, simple_object_elf_attributes_merge,
simple_object_elf_release_attributes, simple_object_elf_release_attributes,
simple_object_elf_start_write, simple_object_elf_start_write,
simple_object_elf_write_to_file, simple_object_elf_write_to_file,

View File

@ -624,16 +624,16 @@ simple_object_mach_o_release_read (void *data)
/* Compare two attributes structures. */ /* Compare two attributes structures. */
static const char * 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 *to =
(struct simple_object_mach_o_attributes *) data1; (struct simple_object_mach_o_attributes *) todata;
struct simple_object_mach_o_attributes *attrs2 = struct simple_object_mach_o_attributes *from =
(struct simple_object_mach_o_attributes *) data2; (struct simple_object_mach_o_attributes *) fromdata;
if (attrs1->magic != attrs2->magic if (to->magic != from->magic
|| attrs1->is_big_endian != attrs2->is_big_endian || to->is_big_endian != from->is_big_endian
|| attrs1->cputype != attrs2->cputype) || to->cputype != from->cputype)
{ {
*err = 0; *err = 0;
return "Mach-O object format mismatch"; 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_find_sections,
simple_object_mach_o_fetch_attributes, simple_object_mach_o_fetch_attributes,
simple_object_mach_o_release_read, 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_release_attributes,
simple_object_mach_o_start_write, simple_object_mach_o_start_write,
simple_object_mach_o_write_to_file, simple_object_mach_o_write_to_file,

View File

@ -257,20 +257,19 @@ simple_object_release_read (simple_object_read *sobj)
XDELETE (sobj); XDELETE (sobj);
} }
/* Compare attributes. */ /* Merge attributes. */
const char * const char *
simple_object_attributes_compare (simple_object_attributes *attrs1, simple_object_attributes_merge (simple_object_attributes *to,
simple_object_attributes *attrs2, simple_object_attributes *from,
int *err) int *err)
{ {
if (attrs1->functions != attrs2->functions) if (to->functions != from->functions)
{ {
*err = 0; *err = 0;
return "different object file format"; return "different object file format";
} }
return attrs1->functions->attributes_compare (attrs1->data, attrs2->data, return to->functions->attributes_merge (to->data, from->data, err);
err);
} }
/* Release an attributes structure. */ /* Release an attributes structure. */