Home | History | Annotate | Line # | Download | only in gcc
gimple-streamer-out.cc revision 1.1
      1  1.1  mrg /* Routines for emitting GIMPLE to a file stream.
      2  1.1  mrg 
      3  1.1  mrg    Copyright (C) 2011-2022 Free Software Foundation, Inc.
      4  1.1  mrg    Contributed by Diego Novillo <dnovillo (at) google.com>
      5  1.1  mrg 
      6  1.1  mrg This file is part of GCC.
      7  1.1  mrg 
      8  1.1  mrg GCC is free software; you can redistribute it and/or modify it under
      9  1.1  mrg the terms of the GNU General Public License as published by the Free
     10  1.1  mrg Software Foundation; either version 3, or (at your option) any later
     11  1.1  mrg version.
     12  1.1  mrg 
     13  1.1  mrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
     14  1.1  mrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
     15  1.1  mrg FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     16  1.1  mrg for more details.
     17  1.1  mrg 
     18  1.1  mrg You should have received a copy of the GNU General Public License
     19  1.1  mrg along with GCC; see the file COPYING3.  If not see
     20  1.1  mrg <http://www.gnu.org/licenses/>.  */
     21  1.1  mrg 
     22  1.1  mrg #include "config.h"
     23  1.1  mrg #include "system.h"
     24  1.1  mrg #include "coretypes.h"
     25  1.1  mrg #include "backend.h"
     26  1.1  mrg #include "tree.h"
     27  1.1  mrg #include "gimple.h"
     28  1.1  mrg #include "gimple-ssa.h"
     29  1.1  mrg #include "gimple-streamer.h"
     30  1.1  mrg #include "tree-eh.h"
     31  1.1  mrg #include "gimple-iterator.h"
     32  1.1  mrg #include "cgraph.h"
     33  1.1  mrg #include "value-prof.h"
     34  1.1  mrg #include "gimple-pretty-print.h"
     35  1.1  mrg 
     36  1.1  mrg /* Output PHI function PHI to the main stream in OB.  */
     37  1.1  mrg 
     38  1.1  mrg static void
     39  1.1  mrg output_phi (struct output_block *ob, gphi *phi)
     40  1.1  mrg {
     41  1.1  mrg   unsigned i, len = gimple_phi_num_args (phi);
     42  1.1  mrg 
     43  1.1  mrg   streamer_write_record_start (ob, lto_gimple_code_to_tag (GIMPLE_PHI));
     44  1.1  mrg   streamer_write_uhwi (ob, SSA_NAME_VERSION (PHI_RESULT (phi)));
     45  1.1  mrg 
     46  1.1  mrg   for (i = 0; i < len; i++)
     47  1.1  mrg     {
     48  1.1  mrg       stream_write_tree (ob, gimple_phi_arg_def (phi, i), true);
     49  1.1  mrg       streamer_write_uhwi (ob, gimple_phi_arg_edge (phi, i)->src->index);
     50  1.1  mrg       bitpack_d bp = bitpack_create (ob->main_stream);
     51  1.1  mrg       location_t loc = gimple_phi_arg_location (phi, i);
     52  1.1  mrg       stream_output_location_and_block (ob, &bp, loc);
     53  1.1  mrg     }
     54  1.1  mrg }
     55  1.1  mrg 
     56  1.1  mrg 
     57  1.1  mrg /* Emit statement STMT on the main stream of output block OB.  */
     58  1.1  mrg 
     59  1.1  mrg static void
     60  1.1  mrg output_gimple_stmt (struct output_block *ob, struct function *fn, gimple *stmt)
     61  1.1  mrg {
     62  1.1  mrg   unsigned i;
     63  1.1  mrg   enum gimple_code code;
     64  1.1  mrg   enum LTO_tags tag;
     65  1.1  mrg   struct bitpack_d bp;
     66  1.1  mrg   histogram_value hist;
     67  1.1  mrg 
     68  1.1  mrg   /* Emit identifying tag.  */
     69  1.1  mrg   code = gimple_code (stmt);
     70  1.1  mrg   tag = lto_gimple_code_to_tag (code);
     71  1.1  mrg   streamer_write_record_start (ob, tag);
     72  1.1  mrg 
     73  1.1  mrg   /* Emit the tuple header.  */
     74  1.1  mrg   bp = bitpack_create (ob->main_stream);
     75  1.1  mrg   bp_pack_var_len_unsigned (&bp, gimple_num_ops (stmt));
     76  1.1  mrg   bp_pack_value (&bp, gimple_no_warning_p (stmt), 1);
     77  1.1  mrg   if (is_gimple_assign (stmt))
     78  1.1  mrg     bp_pack_value (&bp,
     79  1.1  mrg 		   gimple_assign_nontemporal_move_p (
     80  1.1  mrg 		     as_a <gassign *> (stmt)),
     81  1.1  mrg 		   1);
     82  1.1  mrg   bp_pack_value (&bp, gimple_has_volatile_ops (stmt), 1);
     83  1.1  mrg   hist = gimple_histogram_value (fn, stmt);
     84  1.1  mrg   bp_pack_value (&bp, hist != NULL, 1);
     85  1.1  mrg   bp_pack_var_len_unsigned (&bp, stmt->subcode);
     86  1.1  mrg 
     87  1.1  mrg   /* Emit location information for the statement, including gimple_block.  */
     88  1.1  mrg   stream_output_location_and_block (ob, &bp, gimple_location (stmt));
     89  1.1  mrg 
     90  1.1  mrg   /* Emit the operands.  */
     91  1.1  mrg   switch (gimple_code (stmt))
     92  1.1  mrg     {
     93  1.1  mrg     case GIMPLE_RESX:
     94  1.1  mrg       streamer_write_hwi (ob, gimple_resx_region (as_a <gresx *> (stmt)));
     95  1.1  mrg       break;
     96  1.1  mrg 
     97  1.1  mrg     case GIMPLE_EH_MUST_NOT_THROW:
     98  1.1  mrg       stream_write_tree (ob,
     99  1.1  mrg 			 gimple_eh_must_not_throw_fndecl (
    100  1.1  mrg 			   as_a <geh_mnt *> (stmt)),
    101  1.1  mrg 			 true);
    102  1.1  mrg       break;
    103  1.1  mrg 
    104  1.1  mrg     case GIMPLE_EH_DISPATCH:
    105  1.1  mrg       streamer_write_hwi (ob,
    106  1.1  mrg 			  gimple_eh_dispatch_region (
    107  1.1  mrg 			    as_a <geh_dispatch *> (stmt)));
    108  1.1  mrg       break;
    109  1.1  mrg 
    110  1.1  mrg     case GIMPLE_ASM:
    111  1.1  mrg       {
    112  1.1  mrg 	gasm *asm_stmt = as_a <gasm *> (stmt);
    113  1.1  mrg 	streamer_write_uhwi (ob, gimple_asm_ninputs (asm_stmt));
    114  1.1  mrg 	streamer_write_uhwi (ob, gimple_asm_noutputs (asm_stmt));
    115  1.1  mrg 	streamer_write_uhwi (ob, gimple_asm_nclobbers (asm_stmt));
    116  1.1  mrg 	streamer_write_uhwi (ob, gimple_asm_nlabels (asm_stmt));
    117  1.1  mrg 	streamer_write_string (ob, ob->main_stream,
    118  1.1  mrg 			       gimple_asm_string (asm_stmt), true);
    119  1.1  mrg       }
    120  1.1  mrg       /* Fallthru  */
    121  1.1  mrg 
    122  1.1  mrg     case GIMPLE_ASSIGN:
    123  1.1  mrg     case GIMPLE_CALL:
    124  1.1  mrg     case GIMPLE_RETURN:
    125  1.1  mrg     case GIMPLE_SWITCH:
    126  1.1  mrg     case GIMPLE_LABEL:
    127  1.1  mrg     case GIMPLE_COND:
    128  1.1  mrg     case GIMPLE_GOTO:
    129  1.1  mrg     case GIMPLE_DEBUG:
    130  1.1  mrg       for (i = 0; i < gimple_num_ops (stmt); i++)
    131  1.1  mrg 	{
    132  1.1  mrg 	  tree op = gimple_op (stmt, i);
    133  1.1  mrg 	  tree *basep = NULL;
    134  1.1  mrg 	  /* Wrap all uses of non-automatic variables inside MEM_REFs
    135  1.1  mrg 	     so that we do not have to deal with type mismatches on
    136  1.1  mrg 	     merged symbols during IL read in.  The first operand
    137  1.1  mrg 	     of GIMPLE_DEBUG must be a decl, not MEM_REF, though.  */
    138  1.1  mrg 	  if (!flag_wpa && op && (i || !is_gimple_debug (stmt)))
    139  1.1  mrg 	    {
    140  1.1  mrg 	      basep = &op;
    141  1.1  mrg 	      if (TREE_CODE (*basep) == ADDR_EXPR)
    142  1.1  mrg 		basep = &TREE_OPERAND (*basep, 0);
    143  1.1  mrg 	      while (handled_component_p (*basep))
    144  1.1  mrg 		basep = &TREE_OPERAND (*basep, 0);
    145  1.1  mrg 	      if (VAR_P (*basep)
    146  1.1  mrg 		  && !auto_var_in_fn_p (*basep, fn->decl)
    147  1.1  mrg 		  && !DECL_REGISTER (*basep))
    148  1.1  mrg 		{
    149  1.1  mrg 		  bool volatilep = TREE_THIS_VOLATILE (*basep);
    150  1.1  mrg 		  tree ptrtype = build_pointer_type (TREE_TYPE (*basep));
    151  1.1  mrg 		  *basep = build2 (MEM_REF, TREE_TYPE (*basep),
    152  1.1  mrg 				   build1 (ADDR_EXPR, ptrtype, *basep),
    153  1.1  mrg 				   build_int_cst (ptrtype, 0));
    154  1.1  mrg 		  TREE_THIS_VOLATILE (*basep) = volatilep;
    155  1.1  mrg 		}
    156  1.1  mrg 	      else
    157  1.1  mrg 		basep = NULL;
    158  1.1  mrg 	    }
    159  1.1  mrg 	  stream_write_tree (ob, op, true);
    160  1.1  mrg 	  /* Restore the original base if we wrapped it inside a MEM_REF.  */
    161  1.1  mrg 	  if (basep)
    162  1.1  mrg 	    *basep = TREE_OPERAND (TREE_OPERAND (*basep, 0), 0);
    163  1.1  mrg 	}
    164  1.1  mrg       if (is_gimple_call (stmt))
    165  1.1  mrg 	{
    166  1.1  mrg 	  if (gimple_call_internal_p (stmt))
    167  1.1  mrg 	    streamer_write_enum (ob->main_stream, internal_fn,
    168  1.1  mrg 				 IFN_LAST, gimple_call_internal_fn (stmt));
    169  1.1  mrg 	  else
    170  1.1  mrg 	    stream_write_tree (ob, gimple_call_fntype (stmt), true);
    171  1.1  mrg 	}
    172  1.1  mrg       break;
    173  1.1  mrg 
    174  1.1  mrg     case GIMPLE_NOP:
    175  1.1  mrg     case GIMPLE_PREDICT:
    176  1.1  mrg       break;
    177  1.1  mrg 
    178  1.1  mrg     case GIMPLE_TRANSACTION:
    179  1.1  mrg       {
    180  1.1  mrg 	gtransaction *txn = as_a <gtransaction *> (stmt);
    181  1.1  mrg 	gcc_assert (gimple_transaction_body (txn) == NULL);
    182  1.1  mrg 	stream_write_tree (ob, gimple_transaction_label_norm (txn), true);
    183  1.1  mrg 	stream_write_tree (ob, gimple_transaction_label_uninst (txn), true);
    184  1.1  mrg 	stream_write_tree (ob, gimple_transaction_label_over (txn), true);
    185  1.1  mrg       }
    186  1.1  mrg       break;
    187  1.1  mrg 
    188  1.1  mrg     default:
    189  1.1  mrg       gcc_unreachable ();
    190  1.1  mrg     }
    191  1.1  mrg   if (hist)
    192  1.1  mrg     stream_out_histogram_value (ob, hist);
    193  1.1  mrg }
    194  1.1  mrg 
    195  1.1  mrg 
    196  1.1  mrg /* Output a basic block BB to the main stream in OB for this FN.  */
    197  1.1  mrg 
    198  1.1  mrg void
    199  1.1  mrg output_bb (struct output_block *ob, basic_block bb, struct function *fn)
    200  1.1  mrg {
    201  1.1  mrg   gimple_stmt_iterator bsi = gsi_start_bb (bb);
    202  1.1  mrg 
    203  1.1  mrg   streamer_write_record_start (ob,
    204  1.1  mrg 			       (!gsi_end_p (bsi)) || phi_nodes (bb)
    205  1.1  mrg 			        ? LTO_bb1
    206  1.1  mrg 				: LTO_bb0);
    207  1.1  mrg 
    208  1.1  mrg   streamer_write_uhwi (ob, bb->index);
    209  1.1  mrg   bb->count.stream_out (ob);
    210  1.1  mrg   streamer_write_hwi (ob, bb->flags);
    211  1.1  mrg   streamer_write_hwi (ob, bb->discriminator);
    212  1.1  mrg 
    213  1.1  mrg   if (!gsi_end_p (bsi) || phi_nodes (bb))
    214  1.1  mrg     {
    215  1.1  mrg       /* Output the statements.  The list of statements is terminated
    216  1.1  mrg 	 with a zero.  */
    217  1.1  mrg       for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
    218  1.1  mrg 	{
    219  1.1  mrg 	  int region;
    220  1.1  mrg 	  gimple *stmt = gsi_stmt (bsi);
    221  1.1  mrg 	  if (streamer_dump_file)
    222  1.1  mrg 	    {
    223  1.1  mrg 	      fprintf (streamer_dump_file, "  Streaming gimple stmt ");
    224  1.1  mrg 	      print_gimple_stmt (streamer_dump_file, stmt, 0, TDF_SLIM);
    225  1.1  mrg 	    }
    226  1.1  mrg 
    227  1.1  mrg 	  output_gimple_stmt (ob, fn, stmt);
    228  1.1  mrg 
    229  1.1  mrg 	  /* Emit the EH region holding STMT.  */
    230  1.1  mrg 	  region = lookup_stmt_eh_lp_fn (fn, stmt);
    231  1.1  mrg 	  if (region != 0)
    232  1.1  mrg 	    {
    233  1.1  mrg 	      streamer_write_record_start (ob, LTO_eh_region);
    234  1.1  mrg 	      streamer_write_hwi (ob, region);
    235  1.1  mrg 	    }
    236  1.1  mrg 	  else
    237  1.1  mrg 	    streamer_write_record_start (ob, LTO_null);
    238  1.1  mrg 	}
    239  1.1  mrg 
    240  1.1  mrg       streamer_write_record_start (ob, LTO_null);
    241  1.1  mrg 
    242  1.1  mrg       for (gphi_iterator psi = gsi_start_phis (bb);
    243  1.1  mrg 	   !gsi_end_p (psi);
    244  1.1  mrg 	   gsi_next (&psi))
    245  1.1  mrg 	{
    246  1.1  mrg 	  gphi *phi = psi.phi ();
    247  1.1  mrg 
    248  1.1  mrg 	  /* Only emit PHIs for gimple registers.  PHI nodes for .MEM
    249  1.1  mrg 	     will be filled in on reading when the SSA form is
    250  1.1  mrg 	     updated.  */
    251  1.1  mrg 	  if (!virtual_operand_p (gimple_phi_result (phi)))
    252  1.1  mrg 	    output_phi (ob, phi);
    253  1.1  mrg 	}
    254  1.1  mrg 
    255  1.1  mrg       streamer_write_record_start (ob, LTO_null);
    256  1.1  mrg     }
    257  1.1  mrg }
    258