This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC 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]

corrections to recent profile-arcs change


The patch failed on all 64-bit parts because some integral
constants had type "int" instead of "long" as expected.

I replaced "nwords" with a plain sizeof, as frankly it makes
more sense than sizeof(bb)/sizeof(int).

We were saving profile data for the profile constructor.

Tested on alphaev6-linux.


r~


        * final.c (end_final): Tidy whitespace.  Don't honor flag_pack_struct.
        Convert integers constants as needed.  Replace "nwords" field with
        "sizeof_bb".
        (final): Save profile data if cfun->arc_profile, not profile_arc_flag.
        * function.h: Fix typo in comment.
        * libgcc2.c (struct bb): Replace "nwords" with "sizeof_bb".

Index: final.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/final.c,v
retrieving revision 1.248
diff -c -p -d -r1.248 final.c
*** final.c	9 May 2002 12:54:15 -0000	1.248
--- final.c	11 May 2002 00:26:57 -0000
*************** end_final (filename)
*** 258,271 ****
        tree string_type, string_cst;
        tree structure_decl, structure_value, structure_pointer_type;
        tree field_decl, decl_chain, value_chain;
!       tree nwords_field_value, domain_type;
  
        /* Build types.  */
        string_type = build_pointer_type (char_type_node);
  
        /* Libgcc2 bb structure.  */
        structure_decl = make_node (RECORD_TYPE);
-       TYPE_PACKED (structure_decl) = flag_pack_struct;
        structure_pointer_type = build_pointer_type (structure_decl);
  
        /* Output the main header, of 7 words:
--- 258,270 ----
        tree string_type, string_cst;
        tree structure_decl, structure_value, structure_pointer_type;
        tree field_decl, decl_chain, value_chain;
!       tree sizeof_field_value, domain_type;
  
        /* Build types.  */
        string_type = build_pointer_type (char_type_node);
  
        /* Libgcc2 bb structure.  */
        structure_decl = make_node (RECORD_TYPE);
        structure_pointer_type = build_pointer_type (structure_decl);
  
        /* Output the main header, of 7 words:
*************** end_final (filename)
*** 284,379 ****
        decl_chain =
  	build_decl (FIELD_DECL, get_identifier ("zero_word"),
  		    long_integer_type_node);
!       value_chain = build_tree_list (decl_chain, integer_zero_node);
  
        /* Address of filename.  */
        {
! 	char *cwd = getpwd ();
! 	int da_filename_len = strlen (filename) + strlen (cwd) + 4 + 1;
! 	char *da_filename = (char *) alloca (da_filename_len);
  
  	strcpy (da_filename, cwd);
  	strcat (da_filename, "/");
  	strcat (da_filename, filename);
  	strip_off_ending (da_filename, da_filename_len - 3);
  	strcat (da_filename, ".da");
! 	field_decl =
! 	  build_decl (FIELD_DECL, get_identifier ("filename"), string_type);
! 	string_cst = build_string (strlen (da_filename) + 1, da_filename);
! 	domain_type = build_index_type (build_int_2 (strlen (da_filename) + 1,
! 						     0));
! 	TREE_TYPE (string_cst) =
! 	  build_array_type (char_type_node, domain_type);
  	value_chain = tree_cons (field_decl,
  				 build1 (ADDR_EXPR, string_type, string_cst),
  				 value_chain);
- 	TREE_CHAIN (field_decl) = decl_chain;
- 	decl_chain = field_decl;
        }
  
        /* Table of counts.  */
        {
  	tree gcov_type_type = make_unsigned_type (GCOV_TYPE_SIZE);
  	tree gcov_type_pointer_type = build_pointer_type (gcov_type_type);
! 	tree gcov_type_array_type, gcov_type_array_pointer_type;
! 	tree domain_tree = build_index_type (build_int_2
! 					     (profile_info.
! 					      count_instrumented_edges - 1,
! 					      0));
  	tree counts_table;
  
! 	gcov_type_array_type = build_array_type (gcov_type_type, domain_tree);
! 	gcov_type_array_pointer_type =
! 	  build_pointer_type (gcov_type_array_type);
  
  	/* No values.  */
! 	counts_table =
! 	  build (VAR_DECL, gcov_type_array_type, NULL_TREE, NULL_TREE);
  	TREE_STATIC (counts_table) = 1;
  	ASM_GENERATE_INTERNAL_LABEL (name, "LPBX", 2);
  	DECL_NAME (counts_table) = get_identifier (name);
  	assemble_variable (counts_table, 0, 0, 0);
  
- 	field_decl =
- 	  build_decl (FIELD_DECL, get_identifier ("counts"),
- 		      gcov_type_pointer_type);
  	value_chain = tree_cons (field_decl,
  				 build1 (ADDR_EXPR,
  					 gcov_type_array_pointer_type,
  					 counts_table), value_chain);
- 	TREE_CHAIN (field_decl) = decl_chain;
- 	decl_chain = field_decl;
        }
  
        /* Count of the # of instrumented arcs.  */
!       field_decl =
! 	build_decl (FIELD_DECL, get_identifier ("ncounts"),
! 		    long_integer_type_node);
        value_chain = tree_cons (field_decl,
  			       convert (long_integer_type_node,
  					build_int_2 (profile_info.
  						     count_instrumented_edges,
  						     0)), value_chain);
        TREE_CHAIN (field_decl) = decl_chain;
        decl_chain = field_decl;
  
-       /* Pointer to the next bb.  */
-       field_decl =
- 	build_decl (FIELD_DECL, get_identifier ("next"),
- 		    structure_pointer_type);
        value_chain = tree_cons (field_decl, null_pointer_node, value_chain);
-       TREE_CHAIN (field_decl) = decl_chain;
-       decl_chain = field_decl;
  
!       /* Number of words. We'll set this after entire structure is laid out.  */
!       field_decl =
! 	build_decl (FIELD_DECL, get_identifier ("nwords"),
! 		    long_integer_type_node);
!       value_chain = nwords_field_value =
! 	tree_cons (field_decl, NULL, value_chain);
        TREE_CHAIN (field_decl) = decl_chain;
        decl_chain = field_decl;
  
        /* struct bb_function [].  */
        {
  	struct function_list *item;
--- 283,385 ----
        decl_chain =
  	build_decl (FIELD_DECL, get_identifier ("zero_word"),
  		    long_integer_type_node);
!       value_chain = build_tree_list (decl_chain,
! 				     convert (long_integer_type_node,
! 					      integer_zero_node));
  
        /* Address of filename.  */
        {
! 	char *cwd, *da_filename;
! 	int da_filename_len;
! 
! 	field_decl =
! 	  build_decl (FIELD_DECL, get_identifier ("filename"), string_type);
! 	TREE_CHAIN (field_decl) = decl_chain;
! 	decl_chain = field_decl;
  
+ 	cwd = getpwd ();
+ 	da_filename_len = strlen (filename) + strlen (cwd) + 4 + 1;
+ 	da_filename = (char *) alloca (da_filename_len);
  	strcpy (da_filename, cwd);
  	strcat (da_filename, "/");
  	strcat (da_filename, filename);
  	strip_off_ending (da_filename, da_filename_len - 3);
  	strcat (da_filename, ".da");
! 	da_filename_len = strlen (da_filename);
! 	string_cst = build_string (da_filename_len + 1, da_filename);
! 	domain_type = build_index_type (build_int_2 (da_filename_len, 0));
! 	TREE_TYPE (string_cst)
! 	  = build_array_type (char_type_node, domain_type);
  	value_chain = tree_cons (field_decl,
  				 build1 (ADDR_EXPR, string_type, string_cst),
  				 value_chain);
        }
  
        /* Table of counts.  */
        {
  	tree gcov_type_type = make_unsigned_type (GCOV_TYPE_SIZE);
  	tree gcov_type_pointer_type = build_pointer_type (gcov_type_type);
! 	tree domain_tree
! 	  = build_index_type (build_int_2 (profile_info.
! 					   count_instrumented_edges - 1, 0));
! 	tree gcov_type_array_type
! 	  = build_array_type (gcov_type_type, domain_tree);
! 	tree gcov_type_array_pointer_type
! 	  = build_pointer_type (gcov_type_array_type);
  	tree counts_table;
  
! 	field_decl =
! 	  build_decl (FIELD_DECL, get_identifier ("counts"),
! 		      gcov_type_pointer_type);
! 	TREE_CHAIN (field_decl) = decl_chain;
! 	decl_chain = field_decl;
  
  	/* No values.  */
! 	counts_table
! 	  = build (VAR_DECL, gcov_type_array_type, NULL_TREE, NULL_TREE);
  	TREE_STATIC (counts_table) = 1;
  	ASM_GENERATE_INTERNAL_LABEL (name, "LPBX", 2);
  	DECL_NAME (counts_table) = get_identifier (name);
  	assemble_variable (counts_table, 0, 0, 0);
  
  	value_chain = tree_cons (field_decl,
  				 build1 (ADDR_EXPR,
  					 gcov_type_array_pointer_type,
  					 counts_table), value_chain);
        }
  
        /* Count of the # of instrumented arcs.  */
!       field_decl
! 	= build_decl (FIELD_DECL, get_identifier ("ncounts"),
! 		      long_integer_type_node);
!       TREE_CHAIN (field_decl) = decl_chain;
!       decl_chain = field_decl;
! 
        value_chain = tree_cons (field_decl,
  			       convert (long_integer_type_node,
  					build_int_2 (profile_info.
  						     count_instrumented_edges,
  						     0)), value_chain);
+       /* Pointer to the next bb.  */
+       field_decl
+ 	= build_decl (FIELD_DECL, get_identifier ("next"),
+ 		      structure_pointer_type);
        TREE_CHAIN (field_decl) = decl_chain;
        decl_chain = field_decl;
  
        value_chain = tree_cons (field_decl, null_pointer_node, value_chain);
  
!       /* sizeof(struct bb).  We'll set this after entire structure
! 	 is laid out.  */
!       field_decl
! 	= build_decl (FIELD_DECL, get_identifier ("sizeof_bb"),
! 		      long_integer_type_node);
        TREE_CHAIN (field_decl) = decl_chain;
        decl_chain = field_decl;
  
+       sizeof_field_value = tree_cons (field_decl, NULL, value_chain);
+       value_chain = sizeof_field_value;
+ 
        /* struct bb_function [].  */
        {
  	struct function_list *item;
*************** end_final (filename)
*** 388,403 ****
  	tree field_value, field_value_chain;
  
  	bb_fn_struct_type = make_node (RECORD_TYPE);
- 	TYPE_PACKED (bb_fn_struct_type) = flag_pack_struct;
  
  	checksum_field = build_decl (FIELD_DECL, get_identifier ("checksum"),
  				     long_integer_type_node);
! 	arc_count_field =
! 	  build_decl (FIELD_DECL, get_identifier ("arc_count"),
! 		      integer_type_node);
  	TREE_CHAIN (checksum_field) = arc_count_field;
! 	name_field =
! 	  build_decl (FIELD_DECL, get_identifier ("name"), string_type);
  	TREE_CHAIN (arc_count_field) = name_field;
  
  	TYPE_FIELDS (bb_fn_struct_type) = checksum_field;
--- 394,410 ----
  	tree field_value, field_value_chain;
  
  	bb_fn_struct_type = make_node (RECORD_TYPE);
  
  	checksum_field = build_decl (FIELD_DECL, get_identifier ("checksum"),
  				     long_integer_type_node);
! 
! 	arc_count_field
! 	  = build_decl (FIELD_DECL, get_identifier ("arc_count"),
! 		        integer_type_node);
  	TREE_CHAIN (checksum_field) = arc_count_field;
! 
! 	name_field
! 	  = build_decl (FIELD_DECL, get_identifier ("name"), string_type);
  	TREE_CHAIN (arc_count_field) = name_field;
  
  	TYPE_FIELDS (bb_fn_struct_type) = checksum_field;
*************** end_final (filename)
*** 411,420 ****
  	domain = build_index_type (build_int_2 (num_nodes, 0));
  
  	bb_fn_struct_pointer_type = build_pointer_type (bb_fn_struct_type);
! 	bb_fn_struct_array_type = build_array_type (bb_fn_struct_type,
! 						    domain);
! 	bb_fn_struct_array_pointer_type =
! 	  build_pointer_type (bb_fn_struct_array_type);
  
  	layout_type (bb_fn_struct_type);
  	layout_type (bb_fn_struct_pointer_type);
--- 418,427 ----
  	domain = build_index_type (build_int_2 (num_nodes, 0));
  
  	bb_fn_struct_pointer_type = build_pointer_type (bb_fn_struct_type);
! 	bb_fn_struct_array_type
! 	  = build_array_type (bb_fn_struct_type, domain);
! 	bb_fn_struct_array_pointer_type
! 	  = build_pointer_type (bb_fn_struct_array_type);
  
  	layout_type (bb_fn_struct_type);
  	layout_type (bb_fn_struct_pointer_type);
*************** end_final (filename)
*** 423,460 ****
  
  	for (item = functions_head; item != 0; item = item->next)
  	  {
  	    /* create constructor for structure.  */
! 	    field_value_chain = build_tree_list (checksum_field,
! 						 convert
! 						 (long_integer_type_node,
! 						  build_int_2 (item->
! 							       cfg_checksum,
! 							       0)));
! 	    field_value_chain =
! 	      tree_cons (arc_count_field,
! 			 convert (integer_type_node,
! 				  build_int_2 (item->count_edges, 0)),
! 			 field_value_chain);
  
! 	    string_cst = build_string (strlen (item->name) + 1, item->name);
! 	    domain_type = build_index_type (build_int_2 (strlen (item->name) +
! 							 1, 0));
! 	    TREE_TYPE (string_cst) = build_array_type (char_type_node,
! 						       domain_type);
  	    field_value_chain = tree_cons (name_field,
  					   build1 (ADDR_EXPR, string_type,
  						   string_cst),
  					   field_value_chain);
  
  	    /* Add to chain.  */
! 
! 	    array_value_chain = tree_cons (NULL_TREE,
! 					   build (CONSTRUCTOR,
! 						  bb_fn_struct_type,
! 						  NULL_TREE,
! 						  nreverse
! 						  (field_value_chain)),
! 					   array_value_chain);
  	  }
  
  	/* Add terminator.  */
--- 430,464 ----
  
  	for (item = functions_head; item != 0; item = item->next)
  	  {
+ 	    size_t name_len;
+ 
  	    /* create constructor for structure.  */
! 	    field_value_chain
! 	      = build_tree_list (checksum_field,
! 				 convert (long_integer_type_node,
! 					  build_int_2 (item->cfg_checksum, 0)));
! 	    field_value_chain
! 	      = tree_cons (arc_count_field,
! 			   convert (integer_type_node,
! 				    build_int_2 (item->count_edges, 0)),
! 			   field_value_chain);
  
! 	    name_len = strlen (item->name);
! 	    string_cst = build_string (name_len + 1, item->name);
! 	    domain_type = build_index_type (build_int_2 (name_len, 0));
! 	    TREE_TYPE (string_cst)
! 	      = build_array_type (char_type_node, domain_type);
  	    field_value_chain = tree_cons (name_field,
  					   build1 (ADDR_EXPR, string_type,
  						   string_cst),
  					   field_value_chain);
  
  	    /* Add to chain.  */
! 	    array_value_chain
! 	      = tree_cons (NULL_TREE, build (CONSTRUCTOR,
! 					     bb_fn_struct_type, NULL_TREE,
! 					     nreverse (field_value_chain)),
! 			   array_value_chain);
  	  }
  
  	/* Add terminator.  */
*************** end_final (filename)
*** 469,478 ****
  
  
  	/* Create constructor for array.  */
! 
! 	field_decl =
! 	  build_decl (FIELD_DECL, get_identifier ("function_infos"),
! 		      bb_fn_struct_pointer_type);
  	value_chain = tree_cons (field_decl,
  				 build1 (ADDR_EXPR,
  					 bb_fn_struct_array_pointer_type,
--- 473,481 ----
  
  
  	/* Create constructor for array.  */
! 	field_decl
! 	  = build_decl (FIELD_DECL, get_identifier ("function_infos"),
! 		        bb_fn_struct_pointer_type);
  	value_chain = tree_cons (field_decl,
  				 build1 (ADDR_EXPR,
  					 bb_fn_struct_array_pointer_type,
*************** end_final (filename)
*** 486,522 ****
  	decl_chain = field_decl;
        }
  
- 
        /* Finish structure.  */
        TYPE_FIELDS (structure_decl) = nreverse (decl_chain);
        layout_type (structure_decl);
  
!       structure_value =
! 	build (VAR_DECL, structure_decl, NULL_TREE, NULL_TREE);
!       DECL_INITIAL (structure_value) =
! 	build (CONSTRUCTOR, structure_decl, NULL_TREE,
! 	       nreverse (value_chain));
        TREE_STATIC (structure_value) = 1;
        ASM_GENERATE_INTERNAL_LABEL (name, "LPBX", 0);
        DECL_NAME (structure_value) = get_identifier (name);
  
!       /* Set number of words in this structure. */
!       TREE_VALUE (nwords_field_value) =
! 	build_int_2 (TREE_INT_CST_LOW (TYPE_SIZE_UNIT (structure_decl)) /
! 		     (INT_TYPE_SIZE / BITS_PER_UNIT), 0);
  
        /* Build structure.  */
        assemble_variable (structure_value, 0, 0, 0);
- 
-       /* Offset to table of arc counters for thread-safe profiling.  */
-       {
- 	tree table_offset_var = make_node (VAR_DECL);
- 	TREE_TYPE (table_offset_var) = build_pointer_type (integer_type_node);
- 	DECL_INITIAL (table_offset_var) = integer_zero_node;
- 	DECL_NAME (table_offset_var) = get_identifier (".LPBF0");
- 	TREE_STATIC (table_offset_var) = 1;
- 	assemble_variable (table_offset_var, 0, 0, 0);
-       }
      }
  }
  
--- 489,514 ----
  	decl_chain = field_decl;
        }
  
        /* Finish structure.  */
        TYPE_FIELDS (structure_decl) = nreverse (decl_chain);
        layout_type (structure_decl);
  
!       structure_value
! 	= build (VAR_DECL, structure_decl, NULL_TREE, NULL_TREE);
!       DECL_INITIAL (structure_value)
! 	= build (CONSTRUCTOR, structure_decl, NULL_TREE,
! 	         nreverse (value_chain));
        TREE_STATIC (structure_value) = 1;
        ASM_GENERATE_INTERNAL_LABEL (name, "LPBX", 0);
        DECL_NAME (structure_value) = get_identifier (name);
  
!       /* Size of this structure. */
!       TREE_VALUE (sizeof_field_value)
! 	= convert (long_integer_type_node,
! 		   build_int_2 (int_size_in_bytes (structure_decl), 0));
  
        /* Build structure.  */
        assemble_variable (structure_value, 0, 0, 0);
      }
  }
  
*************** final (first, file, optimize, prescan)
*** 1931,1952 ****
      }
  
    /* Store function names for edge-profiling.  */
  
!   if (profile_arc_flag)
!   {
!     struct function_list *new_item = xmalloc (sizeof (struct function_list));
  
!     /* Add function to linked list.  */
!     new_item->next = 0;
!     *functions_tail = new_item;
!     functions_tail = &new_item->next;
  
!     /* Set values.  */
!     new_item->cfg_checksum = profile_info.current_function_cfg_checksum;
!     new_item->count_edges = profile_info.count_edges_instrumented_now;
!     new_item->name = xstrdup (current_function_name);
!     
!   }
    
    free (line_note_exists);
    line_note_exists = NULL;
--- 1923,1942 ----
      }
  
    /* Store function names for edge-profiling.  */
+   /* ??? Probably should re-use the existing struct function.  */
  
!   if (cfun->arc_profile)
!     {
!       struct function_list *new_item = xmalloc (sizeof (struct function_list));
  
!       *functions_tail = new_item;
!       functions_tail = &new_item->next;
  
!       new_item->next = 0;
!       new_item->name = xstrdup (current_function_name);
!       new_item->cfg_checksum = profile_info.current_function_cfg_checksum;
!       new_item->count_edges = profile_info.count_edges_instrumented_now;
!     }
    
    free (line_note_exists);
    line_note_exists = NULL;
Index: function.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/function.h,v
retrieving revision 1.79
diff -c -p -d -r1.79 function.h
*** function.h	9 May 2002 12:54:16 -0000	1.79
--- function.h	11 May 2002 00:26:57 -0000
*************** struct function
*** 437,443 ****
       generated.  */
    unsigned int instrument_entry_exit : 1;
  
!   /* Nonzero if no profiling should be done for the function.  */
    unsigned int arc_profile : 1;
  
    /* Nonzero if profiling code should be generated.  */
--- 437,443 ----
       generated.  */
    unsigned int instrument_entry_exit : 1;
  
!   /* Nonzero if arc profiling should be done for the function.  */
    unsigned int arc_profile : 1;
  
    /* Nonzero if profiling code should be generated.  */
Index: libgcc2.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/libgcc2.c,v
retrieving revision 1.138
diff -c -p -d -r1.138 libgcc2.c
*** libgcc2.c	9 May 2002 12:54:17 -0000	1.138
--- libgcc2.c	11 May 2002 00:26:57 -0000
*************** struct bb
*** 1254,1260 ****
    struct bb *next;
  
    /* Older GCC's did not emit these fields.  */
!   long nwords;
    struct bb_function_info *function_infos;
  };
  
--- 1254,1260 ----
    struct bb *next;
  
    /* Older GCC's did not emit these fields.  */
!   long sizeof_bb;
    struct bb_function_info *function_infos;
  };
  


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