re PR lto/42528 (ICE with -flto and -fsigned-char)
authorRichard Guenther <rguenther@suse.de>
Fri, 8 Jan 2010 16:57:59 +0000 (16:57 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 8 Jan 2010 16:57:59 +0000 (16:57 +0000)
2010-01-08  Richard Guenther  <rguenther@suse.de>

PR lto/42528
* c.opt (fsigned-char): Also let LTO handle this option.
(funsigned-char): Likewise.

lto/
* lto-lang.c (lto_handle_option): Handle -f[un]signed-char.
(lto_init): Do not init char_type_node in a standard way
but according to flag_signed_char.

* gcc.dg/lto/20100103-1_0.c: New testcase.
* gcc.dg/lto/20100103-2_0.c: Likewise.

From-SVN: r155740

gcc/ChangeLog
gcc/c.opt
gcc/lto/ChangeLog
gcc/lto/lto-lang.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/lto/20100103-1_0.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/lto/20100103-2_0.c [new file with mode: 0644]

index 45f91b9..4f7f36f 100644 (file)
@@ -1,3 +1,9 @@
+2010-01-08  Richard Guenther  <rguenther@suse.de>
+
+       PR lto/42528
+       * c.opt (fsigned-char): Also let LTO handle this option.
+       (funsigned-char): Likewise.
+
 2010-01-07  Richard Guenther  <rguenther@suse.de>
 
        * gimple.h (gss_for_code): Wrap gcc_assert in ENABLE_CHECKING.
index 429c035..bdf9531 100644 (file)
--- a/gcc/c.opt
+++ b/gcc/c.opt
@@ -769,7 +769,7 @@ C ObjC C++ ObjC++
 When \"signed\" or \"unsigned\" is not given make the bitfield signed
 
 fsigned-char
-C ObjC C++ ObjC++
+C ObjC C++ ObjC++ LTO
 Make \"char\" signed by default
 
 fsquangle
@@ -802,7 +802,7 @@ C ObjC C++ ObjC++
 When \"signed\" or \"unsigned\" is not given make the bitfield unsigned
 
 funsigned-char
-C ObjC C++ ObjC++
+C ObjC C++ ObjC++ LTO
 Make \"char\" unsigned by default
 
 fuse-cxa-atexit
index 92e595f..5e52527 100644 (file)
@@ -1,3 +1,10 @@
+2010-01-08  Richard Guenther  <rguenther@suse.de>
+
+       PR lto/42528
+       * lto-lang.c (lto_handle_option): Handle -f[un]signed-char.
+       (lto_init): Do not init char_type_node in a standard way
+       but according to flag_signed_char.
+
 2010-01-03  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR lto/41564
index 970265c..05577a2 100644 (file)
@@ -632,6 +632,14 @@ lto_handle_option (size_t scode, const char *arg, int value ATTRIBUTE_UNUSED)
       warn_psabi = value;
       break;
 
+    case OPT_fsigned_char:
+      flag_signed_char = value;
+      break;
+
+    case OPT_funsigned_char:
+      flag_signed_char = !value;
+      break;
+
     default:
       break;
     }
@@ -1036,8 +1044,11 @@ lto_init (void)
   /* Share char_type_node with whatever would be the default for the target.
      char_type_node will be used for internal types such as
      va_list_type_node but will not be present in the lto stream.  */
+  /* ???  This breaks the more common case of consistent but non-standard
+     setting of flag_signed_char, so share according to flag_signed_char.
+     See PR42528.  */
   char_type_node
-    = DEFAULT_SIGNED_CHAR ? signed_char_type_node : unsigned_char_type_node;
+    = flag_signed_char ? signed_char_type_node : unsigned_char_type_node;
 
   /* Tell the middle end what type to use for the size of objects.  */
   if (strcmp (SIZE_TYPE, "unsigned int") == 0)
index e96fbd2..f21a583 100644 (file)
@@ -1,3 +1,9 @@
+2010-01-08  Richard Guenther  <rguenther@suse.de>
+
+       PR lto/42528
+       * gcc.dg/lto/20100103-1_0.c: New testcase.
+       * gcc.dg/lto/20100103-2_0.c: Likewise.
+
 2010-01-08  Tobias Burnus  <burnus@net-b.de
 
        PR/fortran 25829
diff --git a/gcc/testsuite/gcc.dg/lto/20100103-1_0.c b/gcc/testsuite/gcc.dg/lto/20100103-1_0.c
new file mode 100644 (file)
index 0000000..8e1b484
--- /dev/null
@@ -0,0 +1,8 @@
+/* { dg-lto-do link } */
+/* { dg-lto-options {{-funsigned-char -flto} {-fsigned-char -flto}} } */
+
+char *foo;
+int main()
+{
+  foo = "bar";
+}
diff --git a/gcc/testsuite/gcc.dg/lto/20100103-2_0.c b/gcc/testsuite/gcc.dg/lto/20100103-2_0.c
new file mode 100644 (file)
index 0000000..1fb6a7b
--- /dev/null
@@ -0,0 +1,12 @@
+/* { dg-lto-do link } */
+/* { dg-lto-options {{-O -flto -funsigned-char} {-O -flto -fsigned-char}} } */
+
+char p[32] = "";
+int main ()
+{
+  if (__builtin___strcpy_chk (p + 1, "vwxyz",
+                             __builtin_object_size (p + 1, 0)) != p + 1)
+    __builtin_abort ();
+  return 0;
+} 
+