This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: ARM enum sizes diagnostic


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]