Commit d82f74d3 by Ian Lance Taylor Committed by Ian Lance Taylor

simple-object.h (simple_object_attributes_merge): Declare, replacing…

simple-object.h (simple_object_attributes_merge): Declare, replacing simple_object_attributes_compare.

include/:
	* 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.

From-SVN: r166848
parent 354d8ce1
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> 2010-11-12 Joseph Myers <joseph@codesourcery.com>
* Make-lang.in (lto/lto.o): Use $(OPTS_H). * Make-lang.in (lto/lto.o): Use $(OPTS_H).
......
...@@ -138,7 +138,7 @@ lto_obj_file_open (const char *filename, bool writable) ...@@ -138,7 +138,7 @@ lto_obj_file_open (const char *filename, bool writable)
saved_attributes = attrs; saved_attributes = attrs;
else else
{ {
errmsg = simple_object_attributes_compare (saved_attributes, attrs, errmsg = simple_object_attributes_merge (saved_attributes, attrs,
&err); &err);
if (errmsg != NULL) if (errmsg != NULL)
goto fail_errmsg; goto fail_errmsg;
......
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> 2010-11-04 Ian Lance Taylor <iant@google.com>
* dwarf2.h (enum dwarf_source_language): Add DW_LANG_Go. * dwarf2.h (enum dwarf_source_language): Add DW_LANG_Go.
......
...@@ -117,13 +117,14 @@ extern simple_object_attributes * ...@@ -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. */
......
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
......
...@@ -457,15 +457,14 @@ simple_object_coff_release_read (void *data) ...@@ -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 = ...@@ -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,
......
...@@ -123,10 +123,10 @@ struct simple_object_functions ...@@ -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 *);
......
...@@ -115,6 +115,11 @@ typedef struct { ...@@ -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) ...@@ -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 = ...@@ -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,
......
...@@ -624,16 +624,16 @@ simple_object_mach_o_release_read (void *data) ...@@ -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 = ...@@ -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,
......
...@@ -257,20 +257,19 @@ simple_object_release_read (simple_object_read *sobj) ...@@ -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. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment