diff options
-rw-r--r-- | bfd/ChangeLog | 12 | ||||
-rw-r--r-- | bfd/bfd-in.h | 3 | ||||
-rw-r--r-- | bfd/bfd-in2.h | 3 | ||||
-rw-r--r-- | bfd/elf32-arm.c | 20 | ||||
-rw-r--r-- | ld/ChangeLog | 12 | ||||
-rw-r--r-- | ld/emultempl/armelf.em | 15 | ||||
-rw-r--r-- | ld/ld.texinfo | 9 |
7 files changed, 65 insertions, 9 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 7c7ae13..863640b 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,15 @@ +2007-03-18 Mark Shinwell <shinwell@codesourcery.com> + + * bfd-in.h (bfd_elf32_arm_set_target_relocs): Add "bfd *" + argument and extra last argument. + * bfd-in2.h: Regenerate. + * elf32-arm.c (elf32_arm_obj_tdata): Add no_enum_size_warning + member. + (bfd_elf32_arm_set_target_relocs): Add "bfd *" argument and + extra last argument. Set no_enum_size_warning appropriately. + (elf32_arm_merge_eabi_attributes): Improve enum sizes + diagnostic, suppressing it when no_enum_size_warning dictates. + 2007-03-20 Nick Clifton <nickc@redhat.com> PR binutils/3535 diff --git a/bfd/bfd-in.h b/bfd/bfd-in.h index 3c67742..1e6dc12 100644 --- a/bfd/bfd-in.h +++ b/bfd/bfd-in.h @@ -902,7 +902,8 @@ extern bfd_boolean bfd_elf32_arm_process_before_allocation (bfd *, struct bfd_link_info *); void bfd_elf32_arm_set_target_relocs - (struct bfd_link_info *, int, char *, int, int, bfd_arm_vfp11_fix); + (bfd *, struct bfd_link_info *, int, char *, int, int, bfd_arm_vfp11_fix, + int); extern bfd_boolean bfd_elf32_arm_get_bfd_for_interworking (bfd *, struct bfd_link_info *); diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index e9e379b..d0af00b 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -909,7 +909,8 @@ extern bfd_boolean bfd_elf32_arm_process_before_allocation (bfd *, struct bfd_link_info *); void bfd_elf32_arm_set_target_relocs - (struct bfd_link_info *, int, char *, int, int, bfd_arm_vfp11_fix); + (bfd *, struct bfd_link_info *, int, char *, int, int, bfd_arm_vfp11_fix, + int); extern bfd_boolean bfd_elf32_arm_get_bfd_for_interworking (bfd *, struct bfd_link_info *); diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c index 4b4ff41..3be85b1 100644 --- a/bfd/elf32-arm.c +++ b/bfd/elf32-arm.c @@ -2064,6 +2064,9 @@ struct elf32_arm_obj_tdata aeabi_attribute known_eabi_attributes[NUM_KNOWN_ATTRIBUTES]; aeabi_attribute_list *other_eabi_attributes; + + /* Zero to warn when linking objects with incompatible enum sizes. */ + int no_enum_size_warning; }; #define elf32_arm_tdata(abfd) \ @@ -3858,12 +3861,14 @@ bfd_elf32_arm_vfp11_fix_veneer_locations (bfd *abfd, /* Set target relocation values needed during linking. */ void -bfd_elf32_arm_set_target_relocs (struct bfd_link_info *link_info, +bfd_elf32_arm_set_target_relocs (struct bfd *output_bfd, + struct bfd_link_info *link_info, int target1_is_rel, char * target2_type, int fix_v4bx, int use_blx, - bfd_arm_vfp11_fix vfp11_fix) + bfd_arm_vfp11_fix vfp11_fix, + int no_enum_warn) { struct elf32_arm_link_hash_table *globals; @@ -3884,6 +3889,8 @@ bfd_elf32_arm_set_target_relocs (struct bfd_link_info *link_info, globals->fix_v4bx = fix_v4bx; globals->use_blx |= use_blx; globals->vfp11_fix = vfp11_fix; + + elf32_arm_tdata (output_bfd)->no_enum_size_warning = no_enum_warn; } /* The thumb form of a long branch is a bit finicky, because the offset @@ -7193,10 +7200,15 @@ elf32_arm_merge_eabi_attributes (bfd *ibfd, bfd *obfd) out_attr[i].i = in_attr[i].i; } else if (in_attr[i].i != AEABI_enum_forced_wide - && out_attr[i].i != in_attr[i].i) + && out_attr[i].i != in_attr[i].i + && !elf32_arm_tdata (obfd)->no_enum_size_warning) { + const char *aeabi_enum_names[] = + { "", "variable-size", "32-bit", "" }; _bfd_error_handler - (_("ERROR: %B: Conflicting enum sizes"), ibfd); + (_("warning: %B uses %s enums yet the output is to use %s enums; use of enum values across objects may fail"), + ibfd, aeabi_enum_names[in_attr[i].i], + aeabi_enum_names[out_attr[i].i]); } } break; diff --git a/ld/ChangeLog b/ld/ChangeLog index 817e4e8..dbb1f2a 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,15 @@ +2007-03-18 Mark Shinwell <shinwell@codesourcery.com> + + * ld.texinfo: Document --no-enum-size-warning. + * emultempl/armelf.em (no_enum_size_warning): New. + (arm_elf_create_output_section_statements): Correct typo + in comment. Pass no_enum_size_warning to + bfd_elf32_arm_set_target_relocs. + (PARSE_AND_LIST_PROLOGUE): Define OPTION_NO_ENUM_SIZE_WARNING. + (PARSE_AND_LIST_OPTIONS): Document --no-enum-size-warning. + (PARSE_AND_LIST_ARGS_CASES): Add OPTION_NO_ENUM_SIZE_WARNING + case. + 2007-03-19 Bernd Schmidt <bernd.schmidt@analog.com> * configure.tgt (bfin-*-elf, bfin-*-uclinux*): Add targ_extra_libpath. diff --git a/ld/emultempl/armelf.em b/ld/emultempl/armelf.em index 4522a8b..f1c797b 100644 --- a/ld/emultempl/armelf.em +++ b/ld/emultempl/armelf.em @@ -36,6 +36,7 @@ static char *target2_type = "${TARGET2_TYPE}"; static int fix_v4bx = 0; static int use_blx = 0; static bfd_arm_vfp11_fix vfp11_denorm_fix = BFD_ARM_VFP11_FIX_DEFAULT; +static int no_enum_size_warning = 0; static void gld${EMULATION_NAME}_before_parse (void) @@ -233,13 +234,14 @@ arm_elf_finish (void) thumb_entry_symbol); } -/* This is a convenitent point to tell BFD about target specific flags. +/* This is a convenient point to tell BFD about target specific flags. After the output has been created, but before inputs are read. */ static void arm_elf_create_output_section_statements (void) { - bfd_elf32_arm_set_target_relocs (&link_info, target1_is_rel, target2_type, - fix_v4bx, use_blx, vfp11_denorm_fix); + bfd_elf32_arm_set_target_relocs (output_bfd, &link_info, target1_is_rel, + target2_type, fix_v4bx, use_blx, + vfp11_denorm_fix, no_enum_size_warning); } EOF @@ -256,6 +258,7 @@ PARSE_AND_LIST_PROLOGUE=' #define OPTION_FIX_V4BX 306 #define OPTION_USE_BLX 307 #define OPTION_VFP11_DENORM_FIX 308 +#define OPTION_NO_ENUM_SIZE_WARNING 309 ' PARSE_AND_LIST_SHORTOPTS=p @@ -270,6 +273,7 @@ PARSE_AND_LIST_LONGOPTS=' { "fix-v4bx", no_argument, NULL, OPTION_FIX_V4BX}, { "use-blx", no_argument, NULL, OPTION_USE_BLX}, { "vfp11-denorm-fix", required_argument, NULL, OPTION_VFP11_DENORM_FIX}, + { "no-enum-size-warning", no_argument, NULL, OPTION_NO_ENUM_SIZE_WARNING}, ' PARSE_AND_LIST_OPTIONS=' @@ -281,6 +285,7 @@ PARSE_AND_LIST_OPTIONS=' fprintf (file, _(" --fix-v4bx Rewrite BX rn as MOV pc, rn for ARMv4\n")); fprintf (file, _(" --use-blx Enable use of BLX instructions\n")); fprintf (file, _(" --vfp11-denorm-fix Specify how to fix VFP11 denorm erratum\n")); + fprintf (file, _(" --no-enum-size-warning Don'\''t warn about objects with incompatible enum sizes\n")); ' PARSE_AND_LIST_ARGS_CASES=' @@ -326,6 +331,10 @@ PARSE_AND_LIST_ARGS_CASES=' else einfo (_("Unrecognized VFP11 fix type '\''%s'\''.\n"), optarg); break; + + case OPTION_NO_ENUM_SIZE_WARNING: + no_enum_size_warning = 1; + break; ' # We have our own after_open and before_allocation functions, but they call diff --git a/ld/ld.texinfo b/ld/ld.texinfo index eb8d007..1ffabf4 100644 --- a/ld/ld.texinfo +++ b/ld/ld.texinfo @@ -5519,6 +5519,15 @@ instruction. The original instruction is then replaced with a branch to the veneer. The extra cycles required to call and return from the veneer are sufficient to avoid the erratum in both the scalar and vector cases. +@cindex NO_ENUM_SIZE_WARNING +@kindex --no-enum-size-warning +The @samp{--no-enum-size-warning} switch prevents the linker from +warning when linking object files that specify incompatible EABI +enumeration size attributes. For example, with this switch enabled, +linking of an object file using 32-bit enumeration values with another +using enumeration values fitted into the smallest possible space will +not be diagnosed. + @ifclear GENERIC @lowersections @end ifclear |