static void
lto_input_ts_translation_unit_decl_tree_pointers (struct lto_input_block *ib,
						  struct data_in *data_in,
						  tree expr)
{
  TRANSLATION_UNIT_LANGUAGE (expr) = xstrdup (streamer_read_string (data_in, ib));
  VEC_safe_push (tree, gc, all_translation_units, expr);
}
Esempio n. 2
0
tree
streamer_get_builtin_tree (struct lto_input_block *ib, struct data_in *data_in)
{
  enum built_in_class fclass;
  enum built_in_function fcode;
  const char *asmname;
  tree result;

  fclass = streamer_read_enum (ib, built_in_class, BUILT_IN_LAST);
  gcc_assert (fclass == BUILT_IN_NORMAL || fclass == BUILT_IN_MD);

  fcode = (enum built_in_function) streamer_read_uhwi (ib);

  if (fclass == BUILT_IN_NORMAL)
    {
      if (fcode >= END_BUILTINS)
	fatal_error (input_location,
		     "machine independent builtin code out of range");
      result = builtin_decl_explicit (fcode);
      if (!result)
	{
	  if (fcode > BEGIN_CHKP_BUILTINS && fcode < END_CHKP_BUILTINS)
	    {
	      fcode = (enum built_in_function)
		      (fcode - BEGIN_CHKP_BUILTINS - 1);
	      result = builtin_decl_explicit (fcode);
	      result = chkp_maybe_clone_builtin_fndecl (result);
	    }
	  else if (fcode > BEGIN_SANITIZER_BUILTINS
		   && fcode < END_SANITIZER_BUILTINS)
	    {
	      initialize_sanitizer_builtins ();
	      result = builtin_decl_explicit (fcode);
	    }
	}
      gcc_assert (result);
    }
  else if (fclass == BUILT_IN_MD)
    {
      result = targetm.builtin_decl (fcode, true);
      if (!result || result == error_mark_node)
	fatal_error (input_location, "target specific builtin not available");
    }
  else
    gcc_unreachable ();

  asmname = streamer_read_string (data_in, ib);
  if (asmname)
    set_builtin_user_assembler_name (result, asmname);

  streamer_tree_cache_append (data_in->reader_cache, result, 0);

  return result;
}