ARM enum sizes diagnostic
Mark Shinwell
shinwell@codesourcery.com
Sun Mar 18 22:22:00 GMT 2007
More information about the Binutils mailing list
Sun Mar 18 22:22:00 GMT 2007
- Previous message (by thread): Format of ld error message
- Next message (by thread): ARM enum sizes diagnostic
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Nick Clifton wrote: >> The diagnostic seen below should be marked as a warning rather >> than an error; it is possible for the diagnostic to arise when compiling >> with GCC and -fshort-enums in a situation where the values of such >> short enumerations cannot escape the compilation unit. It is in >> fact already treated as a warning rather than an error as seen below. > > This is OK, but if you are going to fix this message then you might as > well go the whole hog. Specifically: > > * Report the two enum sizes. > * Explain to the user why this might not be a problem. > > So maybe something like this: > > warning: <foo.o> places 'enum' values into <N> bytes whereas > <bar.o> places them into <M> bytes. This will cause problems > if the two files attempt to share enum values. > > You may also want to think about having a way of disabling this warning > message for users that do not want it. The following (which has taken rather more time than it was worth, I think :-) is about as good as we can do, since we can't pinpoint N and M precisely. It behaves as expected in manual testing. OK to apply? Mark -- 2007-03-18 Mark Shinwell <shinwell@codesourcery.com> bfd/ * 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. ld/ * 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. Index: bfd/bfd-in.h =================================================================== RCS file: /cvs/src/src/bfd/bfd-in.h,v retrieving revision 1.123 diff -U3 -p -r1.123 bfd-in.h --- bfd/bfd-in.h 29 Jan 2007 16:29:21 -0000 1.123 +++ bfd/bfd-in.h 18 Mar 2007 22:14:55 -0000 @@ -895,7 +895,8 @@ extern bfd_boolean bfd_elf32_arm_process (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 *); Index: bfd/bfd-in2.h =================================================================== RCS file: /cvs/src/src/bfd/bfd-in2.h,v retrieving revision 1.414 diff -U3 -p -r1.414 bfd-in2.h --- bfd/bfd-in2.h 5 Feb 2007 19:50:11 -0000 1.414 +++ bfd/bfd-in2.h 18 Mar 2007 22:14:55 -0000 @@ -902,7 +902,8 @@ extern bfd_boolean bfd_elf32_arm_process (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 *); Index: bfd/elf32-arm.c =================================================================== RCS file: /cvs/src/src/bfd/elf32-arm.c,v retrieving revision 1.105 diff -U3 -p -r1.105 elf32-arm.c --- bfd/elf32-arm.c 22 Feb 2007 17:03:59 -0000 1.105 +++ bfd/elf32-arm.c 18 Mar 2007 22:14:55 -0000 @@ -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 /* 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 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 @@ -7198,10 +7205,15 @@ elf32_arm_merge_eabi_attributes (bfd *ib 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; Index: ld/ld.texinfo =================================================================== RCS file: /cvs/src/src/ld/ld.texinfo,v retrieving revision 1.184 diff -U3 -p -r1.184 ld.texinfo --- ld/ld.texinfo 29 Jan 2007 16:28:40 -0000 1.184 +++ ld/ld.texinfo 18 Mar 2007 22:14:56 -0000 @@ -5519,6 +5519,15 @@ instruction. The original instruction is 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 Index: ld/emultempl/armelf.em =================================================================== RCS file: /cvs/src/src/ld/emultempl/armelf.em,v retrieving revision 1.53 diff -U3 -p -r1.53 armelf.em --- ld/emultempl/armelf.em 29 Jan 2007 16:28:40 -0000 1.53 +++ ld/emultempl/armelf.em 18 Mar 2007 22:14:56 -0000 @@ -36,6 +36,7 @@ static char *target2_type = "${TARGET2_T 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
- Previous message (by thread): Format of ld error message
- Next message (by thread): ARM enum sizes diagnostic
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Binutils mailing list