diff gcc/lto-streamer-in.c @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children 1830386684a0
line wrap: on
line diff
--- a/gcc/lto-streamer-in.c	Fri Oct 27 22:46:09 2017 +0900
+++ b/gcc/lto-streamer-in.c	Thu Oct 25 07:37:49 2018 +0900
@@ -1,6 +1,6 @@
 /* Read the GIMPLE representation from a file stream.
 
-   Copyright (C) 2009-2017 Free Software Foundation, Inc.
+   Copyright (C) 2009-2018 Free Software Foundation, Inc.
    Contributed by Kenneth Zadeck <zadeck@naturalbridge.com>
    Re-implemented by Diego Novillo <dnovillo@google.com>
 
@@ -825,6 +825,7 @@
 
       /* Read OMP SIMD related info.  */
       loop->safelen = streamer_read_hwi (ib);
+      loop->unroll = streamer_read_hwi (ib);
       loop->dont_vectorize = streamer_read_hwi (ib);
       loop->force_vectorize = streamer_read_hwi (ib);
       loop->simduid = stream_read_tree (ib, data_in);
@@ -1012,6 +1013,14 @@
   /* Input the function start and end loci.  */
   fn->function_start_locus = stream_input_location_now (&bp, data_in);
   fn->function_end_locus = stream_input_location_now (&bp, data_in);
+
+  /* Restore the instance discriminators if present.  */
+  int instance_number = bp_unpack_value (&bp, 1);
+  if (instance_number)
+    {
+      instance_number = bp_unpack_value (&bp, sizeof (int) * CHAR_BIT);
+      maybe_create_decl_to_instance_map ()->put (fn->decl, instance_number);
+    }
 }
 
 
@@ -1125,46 +1134,55 @@
 	     Similarly remove all IFN_*SAN_* internal calls   */
 	  if (!flag_wpa)
 	    {
-	      if (!MAY_HAVE_DEBUG_STMTS && is_gimple_debug (stmt))
+	      if (is_gimple_debug (stmt)
+		  && (gimple_debug_nonbind_marker_p (stmt)
+		      ? !MAY_HAVE_DEBUG_MARKER_STMTS
+		      : !MAY_HAVE_DEBUG_BIND_STMTS))
 		remove = true;
 	      if (is_gimple_call (stmt)
 		  && gimple_call_internal_p (stmt))
 		{
+		  bool replace = false;
 		  switch (gimple_call_internal_fn (stmt))
 		    {
 		    case IFN_UBSAN_NULL:
 		      if ((flag_sanitize
 			  & (SANITIZE_NULL | SANITIZE_ALIGNMENT)) == 0)
-			remove = true;
+			replace = true;
 		      break;
 		    case IFN_UBSAN_BOUNDS:
 		      if ((flag_sanitize & SANITIZE_BOUNDS) == 0)
-			remove = true;
+			replace = true;
 		      break;
 		    case IFN_UBSAN_VPTR:
 		      if ((flag_sanitize & SANITIZE_VPTR) == 0)
-			remove = true;
+			replace = true;
 		      break;
 		    case IFN_UBSAN_OBJECT_SIZE:
 		      if ((flag_sanitize & SANITIZE_OBJECT_SIZE) == 0)
-			remove = true;
+			replace = true;
 		      break;
 		    case IFN_UBSAN_PTR:
 		      if ((flag_sanitize & SANITIZE_POINTER_OVERFLOW) == 0)
-			remove = true;
+			replace = true;
 		      break;
 		    case IFN_ASAN_MARK:
 		      if ((flag_sanitize & SANITIZE_ADDRESS) == 0)
-			remove = true;
+			replace = true;
 		      break;
 		    case IFN_TSAN_FUNC_EXIT:
 		      if ((flag_sanitize & SANITIZE_THREAD) == 0)
-			remove = true;
+			replace = true;
 		      break;
 		    default:
 		      break;
 		    }
-		  gcc_assert (!remove || gimple_call_lhs (stmt) == NULL_TREE);
+		  if (replace)
+		    {
+		      gimple_call_set_internal_fn (as_a <gcall *> (stmt),
+						   IFN_NOP);
+		      update_stmt (stmt);
+		    }
 		}
 	    }
 	  if (remove)
@@ -1179,6 +1197,13 @@
 	    {
 	      gsi_next (&bsi);
 	      stmts[gimple_uid (stmt)] = stmt;
+
+	      /* Remember that the input function has begin stmt
+		 markers, so that we know to expect them when emitting
+		 debug info.  */
+	      if (!cfun->debug_nonbind_markers
+		  && gimple_debug_nonbind_marker_p (stmt))
+		cfun->debug_nonbind_markers = true;
 	    }
 	}
     }
@@ -1192,6 +1217,7 @@
     gimple_set_body (fn_decl, bb_seq (ei_edge (ei)->dest));
   }
 
+  update_max_bb_count ();
   fixup_call_stmt_edges (node, stmts);
   execute_all_ipa_stmt_fixups (node, stmts);
 
@@ -1599,10 +1625,10 @@
     {
       enum mode_class mclass
 	= bp_unpack_enum (&bp, mode_class, MAX_MODE_CLASS);
-      unsigned int size = bp_unpack_value (&bp, 8);
-      unsigned int prec = bp_unpack_value (&bp, 16);
+      poly_uint16 size = bp_unpack_poly_value (&bp, 16);
+      poly_uint16 prec = bp_unpack_poly_value (&bp, 16);
       machine_mode inner = (machine_mode) bp_unpack_value (&bp, 8);
-      unsigned int nunits = bp_unpack_value (&bp, 8);
+      poly_uint16 nunits = bp_unpack_poly_value (&bp, 16);
       unsigned int ibit = 0, fbit = 0;
       unsigned int real_fmt_len = 0;
       const char *real_fmt_name = NULL;
@@ -1633,14 +1659,14 @@
 	     pass ? mr = (machine_mode) (mr + 1)
 		  : mr = GET_MODE_WIDER_MODE (mr).else_void ())
 	  if (GET_MODE_CLASS (mr) != mclass
-	      || GET_MODE_SIZE (mr) != size
-	      || GET_MODE_PRECISION (mr) != prec
+	      || maybe_ne (GET_MODE_SIZE (mr), size)
+	      || maybe_ne (GET_MODE_PRECISION (mr), prec)
 	      || (inner == m
 		  ? GET_MODE_INNER (mr) != mr
 		  : GET_MODE_INNER (mr) != table[(int) inner])
 	      || GET_MODE_IBIT (mr) != ibit
 	      || GET_MODE_FBIT (mr) != fbit
-	      || GET_MODE_NUNITS (mr) != nunits)
+	      || maybe_ne (GET_MODE_NUNITS (mr), nunits))
 	    continue;
 	  else if ((mclass == MODE_FLOAT || mclass == MODE_DECIMAL_FLOAT)
 		   && strcmp (REAL_MODE_FORMAT (mr)->name, real_fmt_name) != 0)
@@ -1657,6 +1683,7 @@
 	{
 	  switch (mclass)
 	    {
+	    case MODE_VECTOR_BOOL:
 	    case MODE_VECTOR_INT:
 	    case MODE_VECTOR_FLOAT:
 	    case MODE_VECTOR_FRACT: