mirror of git://gcc.gnu.org/git/gcc.git
![]() 2011-03-28 Vladimir Makarov <vmakarov@redhat.com> * ira-color.c (update_left_conflict_sizes_p): Don't assume that conflict object hard regset nodes have intersecting hard reg sets. * regmove.c (regmove_optimize): Move ira_set_pseudo_classes call after regstat_init_n_sets_and_refs. * ira.c: Add more comments at the top. (setup_stack_reg_pressure_class, setup_pressure_classes): Add comments how we compute the register pressure classes. (setup_allocno_and_important_classes): Add more comments. (setup_class_translate_array, reorder_important_classes) (setup_reg_class_relations): Add comments. * ira-emit.c: Add 2011 to the Copyright line. Add comments at the start of the file. * ira-color.c: Add 2011 to the Copyright line. (assign_hard_reg): Add more comments. (improve_allocation): Ditto. * ira-costs.c: Add 2011 to the Copyright line. (setup_cost_classes, setup_regno_cost_classes_by_aclass): Add more comments. (setup_regno_cost_classes_by_mode): Ditto. Initial patches from ira-improv branch: 2010-08-13 Vladimir Makarov <vmakarov@redhat.com> * ira-build.c: (ira_create_object): Remove initialization of OBJECT_PROFITABLE_HARD_REGS. Initialize OBJECT_ADD_DATA. (ira_create_allocno): Remove initialization of ALLOCNO_MEM_OPTIMIZED_DEST, ALLOCNO_MEM_OPTIMIZED_DEST_P, ALLOCNO_SOMEWHERE_RENAMED_P, ALLOCNO_CHILD_RENAMED_P, ALLOCNO_IN_GRAPH_P, ALLOCNO_MAY_BE_SPILLED_P, ALLOCNO_COLORABLE_P, ALLOCNO_NEXT_BUCKET_ALLOCNO, ALLOCNO_PREV_BUCKET_ALLOCNO, ALLOCNO_FIRST_COALESCED_ALLOCNO, ALLOCNO_NEXT_COALESCED_ALLOCNO. Initialize ALLOCNO_ADD_DATA. (copy_info_to_removed_store_destinations): Use ALLOCNO_EMIT_DATA and allocno_emit_reg instead of ALLOCNO_MEM_OPTIMIZED_DEST_P and ALLOCNO_REG. (ira_flattening): Ditto. Use ALLOCNO_EMIT_DATA instead of ALLOCNO_MEM_OPTIMIZED_DEST and ALLOCNO_SOMEWHERE_RENAMED_P. * ira.c (ira_reallocate): Remove. (setup_pressure_classes): Call ira_init_register_move_cost_if_necessary. Use ira_register_move_cost instead of ira_get_register_move_cost. (setup_allocno_assignment_flags): Use ALLOCNO_EMIT_DATA. (ira): Call ira_initiate_emit_data and ira_finish_emit_data. * ira-color.c: Use ALLOCNO_COLOR_DATA instead of ALLOCNO_IN_GRAPH_P, ALLOCNO_MAY_BE_SPILLED_P, ALLOCNO_COLORABLE_P, ALLOCNO_AVAILABLE_REGS_NUM, ALLOCNO_NEXT_BUCKET_ALLOCNO, ALLOCNO_PREV_BUCKET_ALLOCNO. ALLOCNO_TEMP. Use OBJECT_COLOR_DATA instead of OBJECT_PROFITABLE_HARD_REGS, OBJECT_HARD_REGS_NODE, OBJECT_HARD_REGS_SUBNODES_START, OBJECT_HARD_REGS_SUBNODES_NUM. Fix formatting. (object_hard_regs_t, object_hard_regs_node_t): Move from ira-int.h. (struct object_hard_regs, struct object_hard_regs_node): Ditto. (struct allocno_color_data): New. (allocno_color_data_t): New typedef. (allocno_color_data): New definition. (ALLOCNO_COLOR_DATA): New macro. (struct object_color_data): New. (object_color_data_t): New typedef. (object_color_data): New definition. (OBJECT_COLOR_DATA): New macro. (update_copy_costs, calculate_allocno_spill_cost): Call ira_init_register_move_cost_if_necessary. Use ira_register_move_cost instead of ira_get_register_move_cost. (move_spill_restore, update_curr_costs): Ditto. (allocno_spill_priority): Make it inline. (color_pass): Allocate and free allocno_color_dat and object_color_data. (struct coalesce_data, coalesce_data_t): New. (allocno_coalesce_data): New definition. (ALLOCNO_COALESCE_DATA): New macro. (merge_allocnos, coalesced_allocno_conflict_p): Use ALLOCNO_COALESCED_DATA instead of ALLOCNO_FIRST_COALESCED_ALLOCNO, ALLOCNO_NEXT_COALESCED_ALLOCNO, ALLOCNO_TEMP. (coalesce_allocnos): Ditto. (setup_coalesced_allocno_costs_and_nums): Ditto. (collect_spilled_coalesced_allocnos): Ditto. (slot_coalesced_allocno_live_ranges_intersect_p): Ditto. (setup_slot_coalesced_allocno_live_ranges): Ditto. (coalesce_spill_slots): Ditto. (ira_sort_regnos_for_alter_reg): Ditto. Allocate, initialize and free allocno_coalesce_data. * ira-conflicts.c: Fix formatting. (process_regs_for_copy): Call ira_init_register_move_cost_if_necessary. Use ira_register_move_cost instead of ira_get_register_move_cost. (build_object_conflicts): Optimize. * ira-costs.c (record_reg_classes): Optimize. Call ira_init_register_move_cost_if_necessary. Use ira_register_move_cost, ira_may_move_in_cost, and ira_may_move_out_cost instead of ira_get_register_move_cost and ira_get_may_move_cost. (record_address_regs): Ditto. (scan_one_insn): Optimize. (find_costs_and_classes): Optimize. (process_bb_node_for_hard_reg_moves): Call ira_init_register_move_cost_if_necessary. Use ira_register_move_cost instead of ira_get_register_move_cost. * ira-emit.c: Use allocno_emit_reg, ALLOCNO_EMIT_DATA instead of ALLOCNO_REG, ALLOCNO_CHILD_RENAMED_P, ALLOCNO_MEM_OPTIMIZED_DEST, ALLOCNO_MEM_OPTIMIZED_DEST_P, and ALLOCNO_SOMEWHERE_RENAMED_P. (ira_allocno_emit_data, void_p, new_allocno_emit_data_vec): New definitions. (ira_initiate_emit_data, ira_finish_emit_data) (create_new_allocno): New functions. (modify_move_list): Call create_new_alloc instead of ira_create_allocno. (emit_move_list): Call ira_init_register_move_cost_if_necessary. Use ira_register_move_cost instead of ira_get_register_move_cost. * ira-int.h: Fix some comments. (object_hard_regs_t, object_hard_regs_node_t): Move to ira-color.c. (struct object_hard_regs, struct object_hard_regs_node): Ditto. (struct ira_object): Remove profitable_hard_regs, hard_regs_node, hard_regs_subnodes_start, hard_regs_subnodes_num. Add new member add_data. (struct ira_allocno): Make mode and aclass a bitfield. Move other bitfield after mode. Make hard_regno a short int. Make hard_regno short. Remove first_coalesced_allocno and next_coalesced_allocno. Move mem_optimized_dest_p, somewhere_renamed_p, child_renamed_p, reg, and mem_optimized_dest into struct ira_emit_data. Remove in_graph_p, may_be_spilled_p, available_regs_num, next_bucket_allocno, prev_bucket_allocno, temp, colorable_p. Add new member add_data. (ALLOCNO_IN_GRAPH_P, ALLOCNO_MAY_BE_SPILLED_P): Remove. (ALLOCNO_COLORABLE_P, ALLOCNO_AVAILABLE_REGS_NUM): Remove. (ALLOCNO_NEXT_BUCKET_ALLOCNO, ALLOCNO_PREV_BUCKET_ALLOCNO): Remove. (ALLOCNO_TEMP, ALLOCNO_FIRST_COALESCED_ALLOCNO): Remove. (ALLOCNO_NEXT_COALESCED_ALLOCNO): Remove. (ALLOCNO_ADD_DATA): New macro. (ira_emit_data_t): New typedef. (struct ira_emit_data): New. Move mem_optimized_dest_p, somewhere_renamed_p, child_renamed_p, reg, mem_optimized_dest from struct ira_allocno. (ALLOCNO_EMIT_DATA): New macro. (ira_allocno_emit_data, allocno_emit_reg): New. (ALLOCNO_PROFITABLE_HARD_REGS, OBJECT_HARD_REGS_NODE): Remove. (OBJECT_HARD_REGS_SUBNODES_STAR, OBJECT_HARD_REGS_SUBNODES_NUM): Remove. (OBJECT_ADD_DATA): New macro. (ira_reallocate): Remove. (ira_initiate_emit_data, ira_finish_emit_data): New. (ira_get_register_move_cost, ira_get_may_move_cost): Remove. (ira_init_register_move_cost_if_necessary): New. (ira_object_conflict_iter_next): Merge into ira_object_conflict_iter_cond. (FOR_EACH_OBJECT_CONFLICT): Don't use ira_object_conflict_iter_next. * ira-live.c: (process_single_reg_class_operands): Call ira_init_register_move_cost_if_necessary. Use ira_register_move_cost instead of ira_get_register_move_cost. 2010-08-13 Vladimir Makarov <vmakarov@redhat.com> * ira-int.h (struct target_ira_int): Remove x_cost_classes. * ira-costs.c: Fix formatting. (cost_classes, cost_classes_num): Remove. (struct cost_classes, cost_classes_t, const_cost_classes_t): New. (regno_cost_classes, cost_classes_hash, cost_classes_eq): New. (cost_classes_del, cost_classes_htab): New. (cost_classes_aclass_cache, cost_classes_mode_cache): New. (initiate_regno_cost_classes, setup_cost_classes): New. (setup_regno_cost_classes_by_aclass): New. (setup_regno_cost_classes_by_mode, finish_regno_cost_classes): New. (record_reg_classes): Use regno_cost_classes instead of cost_classes. Move checking opposite operand up. (record_address_regs): Use regno_cost_classes instead of cost_classes. (scan_one_insn): Ditto. Use always general register. (print_allocno_costs): Use regno_cost_classes instead of cost_classes. (print_pseudo_costs): Ditto. Use Reg_N_REFS. (find_costs_and_classes): Set up cost classes for each registers. Use also their mode for this. Use regno_cost_classes instead of cost_classes. (setup_allocno_class_and_costs): Use regno_cost_classes instead of cost_classes. (free_ira_costs, ira_init_costs): Don't use cost_classes. (ira_costs, ira_set_pseudo_classes): Call initiate_regno_cost_classes and finish_regno_cost_classes. 2010-10-04 Vladimir Makarov <vmakarov@redhat.com> * target-def.h (TARGET_IRA_COVER_CLASSES): Remove. * target.def (ira_cover_classes): Remove. * doc/tm.texi: Remove TARGET_IRA_COVER_CLASSES and IRA_COVER_CLASSES. * doc/tm.texi.in: Ditto. * ira-conflicts.c: Remove mentioning cover classes from the file. Use ALLOCNO_CLASS instead of ALLOCNO_COVER_CLASS. Use ALLOCNO_COVER_CLASS_COST instead of ALLOCNO_CLASS_COST. Fix formatting. * targhooks.c (default_ira_cover_classes): Remove. * targhooks.h (default_ira_cover_classes): Ditto. * haifa-sched.c: Remove mentioning cover classes from the file. Use ira_reg_pressure_cover instead of ira_reg_class_cover. Use ira_pressure_classes and ira_pressure_classes_num instead of ira_reg_class_cover_size and ira_reg_class_cover. Use sched_regno_pressure_class instead of sched_regno_cover_class. (mark_regno_birth_or_death, setup_insn_reg_pressure_info): Use ira_reg_class_max_nregs instead of ira_reg_class_nregs. * ira-int.h: Add 2010 to Copyright. Remove mentioning cover classes from the file. (object_hard_regs_t, object_hard_regs_node_t): New typedefs. (struct object_hard_regs, struct object_hard_regs_node): New. (struct ira_object): New members profitable_hard_regs, hard_regs_node, hard_regs_subnodes_start, hard_regs_subnodes_num. (struct ira_allocno): Rename cover_class to aclass. Rename cover_class_cost and updated_cover_class_cost to class_cost and updated_class_cost. Remove splay_removed_p and left_conflict_size. Add new members colorable_p. (ALLOCNO_SPLAY_REMOVED_P, ALLOCNO_LEFT_CONFLICTS_SIZE): Remove. (ALLOCNO_COLORABLE_P): New macro. (ALLOCNO_COVER_CLASS): Rename to ALLOCNO_CLASS. (ALLOCNO_COVER_CLASS_COST, ALLOCNO_UPDATED_COVER_CLASS_COST): Rename to ALLOCNO_CLASS_COST and ALLOCNO_UPDATED__CLASS_COST. (OBJECT_...): Rename parameter C to O. (OBJECT_PROFITABLE_HARD_REGS): New macro. (OBJECT_HARD_REGS_NODE, OBJECT_HARD_REGS_SUBNODES_START) (OBJECT_HARD_REGS_SUBNODES_NUM): New macros. (struct target_ira_int): New members x_ira_max_memory_move_cost, x_ira_max_register_move_cost, x_ira_max_may_move_in_cost, x_ira_max_may_move_out_cost, x_ira_reg_allocno_class_p, x_ira_reg_pressure_class_p, x_ira_important_class_nums, x_ira_reg_class_superunion. Rename x_prohibited_class_mode_reg to x_ira_prohibited_class_mode_reg. Rename x_ira_reg_class_union to x_ira_reg_class_subunion. (ira_max_memory_move_cost, ira_max_register_move_cost) (ira_max_may_move_in_cost, ira_max_may_move_out_cost) (ira_reg_allocno_class_p, ira_reg_pressure_class_p) (ira_important_class_nums, ira_reg_class_superunion): New macros. (prohibited_class_mode_regs): Rename to ira_prohibited_class_mode_regs. (ira_reg_class_union): Rename to ira_reg_class_subunion. (ira_debug_class_cover): Rename to ira_debug_allocno_classes. (ira_set_allocno_cover_class): Rename to ira_set_allocno_class. (ira_tune_allocno_costs_and_cover_classes): Rename to ira_tune_allocno_costs. (ira_debug_hard_regs_forest): New. (ira_object_conflict_iter_init, ira_object_conflict_iter_cond) (ira_object_conflict_iter_next): Fix comments. (ira_hard_reg_set_intersection_p, hard_reg_set_size): New functions. (ira_allocate_and_set_costs, ira_allocate_and_copy_costs): Rename cover_class to aclass. (ira_allocate_and_accumulate_costs): Ditto. (ira_allocate_and_set_or_copy_costs): Ditto. * opts.c (decode_options): Remove ira_cover_class check. * ira-color.c: Remove mentioning cover classes from the file. Use ALLOCNO_CLASS, ALLOCNO_CLASS_COST, and ALLOCNO_UPDATED_CLASS_COST instead of ALLOCNO_COVER_CLASS, ALLOCNO_COVER_CLASS_COST, and ALLOCNO_UPDATED_COVER_CLASS_COST. Fix formatting. (splay-tree.h): Remove include. (allocno_coalesced_p, processed_coalesced_allocno_bitmap): Move before copy_freq_compare_func. (allocnos_for_spilling, removed_splay_allocno_vec): Remove. (object_hard_regs_vec, object_hard_regs_htab, node_check_tick): New definitions. (hard_regs_roots, hard_regs_node_vec): Ditto. (object_hard_regs_hash, object_hard_regs_eq, find_hard_regs): Ditto. (insert_hard_regs, init_object_hard_regs, add_object_hard_regs): Ditto. (finish_object_hard_regs, object_hard_regs_compare): Ditto. (create_new_object_hard_regs_node): Ditto. (add_new_object_hard_regs_node_to_forest): Ditto. (add_object_hard_regs_to_forest, collect_object_hard_regs_cover): Ditto. (setup_object_hard_regs_nodes_parent, first_common_ancestor_node): Ditto. (print_hard_reg_set, print_hard_regs_subforest): Ditto. (print_hard_regs_forest, ira_debug_hard_regs_forest): Ditto. (remove_unused_object_hard_regs_nodes): Ditto. (enumerate_object_hard_regs_nodes): Ditto. (object_hard_regs_nodes_num, object_hard_regs_nodes): Ditto. (object_hard_regs_subnode_t): Ditto. (struct object_hard_regs_subnode): Ditto. (object_hard_regs_subnodes, object_hard_regs_subnode_index): Ditto. (setup_object_hard_regs_subnode_index): Ditto. (get_object_hard_regs_subnodes_num): Ditto. (form_object_hard_regs_nodes_forest): Ditto. (finish_object_hard_regs_nodes_tree): Ditto. (finish_object_hard_regs_nodes_forest): Ditto. (allocnos_have_intersected_live_ranges_p): Rename to allocnos_conflict_by_live_ranges_p. Move before copy_freq_compare_func. (pseudos_have_intersected_live_ranges_p): Rename to conflict_by_live_ranges_p. Move before copy_freq_compare_func. (setup_left_conflict_sizes_p, update_left_conflict_sizes_p): Ditto. (empty_profitable_hard_regs, setup_profitable_hard_regs): Ditto. (update_copy_costs): Remove assert. Skip cost update if the hard reg does not belong the class. (assign_hard_reg): Process only profitable hard regs. (uncolorable_allocnos_num): Make it scalar. (allocno_spill_priority): Use ALLOCNO_EXCESS_PRESSURE_POINTS_NUM and ira_reg_class_max_nregs instead of ALLOCNO_LEFT_CONFLICTS_SIZE and ira_reg_class_max_nregs. (bucket_allocno_compare_func): Check frequency first. (sort_bucket): Add compare function as a parameter. (add_allocno_to_ordered_bucket): Assume no coalesced allocnos. (uncolorable_allocnos_splay_tree, USE_SPLAY_P): Remove. (push_allocno_to_stack): Rewrite for checking new allocno colorability. (remove_allocno_from_bucket_and_push): Print cost too. Remove assert. (push_only_colorable): Pass new parameter to sort_bucket. (push_allocno_to_spill): Remove. (allocno_spill_priority_compare): Make it inline and rewrite. (splay_tree_allocate, splay_tree_free): Remove. (allocno_spill_sort_compare): New function. (push_allocnos_to_stack): Sort allocnos for spilling once. Don't build and use splay tree. Choose first allocno in uncolorable allocno bucket to spill. Remove setting spill cost. (all_conflicting_hard_regs): Remove. (setup_allocno_available_regs_num): Check only profitable hard regs. Print info about hard regs nodes. (setup_allocno_left_conflicts_size): Remove. (put_allocno_into_bucket): Don't call setup_allocno_left_conflicts_size. Use setup_left_conflict_sizes_p. (improve_allocation): New. (color_allocnos): Call setup_profitable_hard_regs, form_object_hard_regs_nodes_forest, improve_allocation, finish_object_hard_regs_nodes_forest. Setup spill cost. (print_loop_title): Use pressure classes. (color_allocnso): Ditto. (do_coloring): Remove allocation and freeing splay_tree_node_pool and allocnos_for_spilling. (ira_sort_regnos_for_alter_reg): Don't setup members {first,next}_coalesced_allocno. (color): Remove allocating and freeing removed_splay_allocno_vec. (fast_allocation): Use ira_prohibited_class_mode_regs instead of prohibited_class_mode_regs. * ira-lives.c: Remove mentioning cover classes from the file. Fix formatting. (update_allocno_pressure_excess_length): Use pressure classes. (inc_register_pressure, dec_register_pressure): Check for pressure class. (mark_pseudo_regno_live, mark_pseudo_regno_subword_live): Use pressure class. Use ira_reg_class_nregs instead of ira_reg_class_max_nregs. (mark_pseudo_regno_dead, mark_pseudo_regno_subword_dead): Ditto. (mark_hard_reg_live, mark_hard_reg_dead): Use pressure class. (single_reg_class): Use ira_reg_class_nregs instead of ira_reg_class_max_nregs. (process_bb_node_lives): Use pressure classes. * ira-emit.c: Remove mentioning cover classes from the file. Use ALLOCNO_CLASS instead of ALLOCNO_COVER_CLASS. Fix formatting. (change_loop): Use pressure classes. (modify_move_list): Call ira_set_allocno_class instead of ira_set_allocno_cover_class. * ira-build.c: Remove mentioning cover classes from the file. Use ALLOCNO_CLASS and ALLOCNO_CLASS_COST instead of ALLOCNO_COVER_CLASS and ALLOCNO_COVER_CLASS_COST. Use ALLOCNO_UPDATED_CLASS_COST instead of ALLOCNO_UPDATED_COVER_CLASS_COST. Fix formatting. (ira_create_object): Initiate OBJECT_PROFITABLE_HARD_REGS. (ira_create_allocno): Remove initialization of ALLOCNO_SPLAY_REMOVED_P, ALLOCNO_LEFT_CONFLICT_SIZE. Initialize ALLOCNO_COLORABLE_P. (ira_set_allocno_cover_class): Rename to ira_set_allocno_class. Update conflict regs for the objects. (create_cap_allocno): Remove assert. Don't propagate ALLOCNO_AVAILABLE_REGS_NUM. (ira_free_allocno_costs): New function. (finish_allocno): Change a part of code into call of ira_free_allocno_costs. (low_pressure_loop_node_p): Use pressure classes. (object_range_compare_func): Don't compare classes. (setup_min_max_conflict_allocno_ids): Ditto. * loop-invariant.c: Remove mentioning cover classes from the file. Use ira_pressure_classes and ira_pressure_classes_num instead of ira_reg_class_cover_size and ira_reg_class_cover. Fix formatting. (get_cover_class_and_nregs): Rename to get_cover_pressure_and_nregs. Use ira_reg_class_max_nregs instead of ira_reg_class_nregs. Use reg_allocno_class instead of reg_cover_class. (get_inv_cost): Use instead ira_stack_reg_pressure_class of STACK_REG_COVER_CLASS. (get_regno_cover_class): Rename to get_regno_pressure_class. (move_loop_invariants): Initialize and finalize regstat. * ira.c: Remove mentioning cover classes from the file. Add comments about coloring without cover classes. Use ALLOCNO_CLASS instead of ALLOCNO_COVER_CLASS. Fix formatting. (alloc_reg_class_subclasses, setup_reg_subclasses): Move it before setup_class_subset_and_memory_move_costs. (setup_stack_reg_pressure_class, setup_pressure_classes): New. (setup_cover_and_important_classes): Rename to setup_allocno_and_important_classes. (setup_class_translate_array): New. (setup_class_translate): Call it for allocno and pressure classes. (cover_class_order): Rename to allocno_class_order. (comp_reg_classes_func): Use ira_allocno_class_translate instead of ira_class_translate. (reorder_important_classes): Set up ira_important_class_nums. (setup_reg_class_relations): Set up ira_reg_class_superunion. (print_class_cover): Rename to print_classes. Add parameter. (ira_debug_class_cover): Rename to ira_debug_allocno_classes. Print pressure classes too. (find_reg_class_closure): Rename to find_reg_classes. Don't call setup_reg_subclasses. (ira_hard_regno_cover_class): Rename to ira_hard_regno_allocno_class. (ira_reg_class_nregs): Rename to ira_reg_class_max_nregs. (setup_prohibited_class_mode_regs): Use ira_prohibited_class_mode_regs instead of prohibited_class_mode_regs. (clarify_prohibited_class_mode_regs): New function. (ira_init_register_move_cost): Set up ira_max_register_move_cost, ira_max_may_move_in_cost, and ira_max_may_move_out_cost. (ira_init_once): Initialize them. (free_register_move_costs): Process them. (ira_init): Move calls of find_reg_classes and setup_hard_regno_aclass after setup_prohibited_class_mode_regs. Call clarify_prohibited_class_mode_regs. (ira_no_alloc_reg): Remove. (too_high_register_pressure_p): Use pressure classes. * sched-deps.c: Remove mentioning cover classes from the file. Use ira_reg_pressure_cover instead of ira_reg_class_cover. Use ira_pressure_classes and ira_pressure_classes_num instead of ira_reg_class_cover_size and ira_reg_class_cover. (mark_insn_hard_regno_birth, mark_hard_regno_death): Use sched_regno_pressure_class instead of sched_regno_cover_class. (mark_insn_pseudo_birth, mark_pseudo_death): Ditto. Use ira_reg_class_max_nregs instead of ira_reg_class_nregs. * ira.h: Add 2010 to Copyright. (ira_no_alloc_reg): Remove external. (struct target_ira): Rename x_ira_hard_regno_cover_class, x_ira_reg_class_cover_size, x_ira_reg_class_cover, and x_ira_class_translate to x_ira_hard_regno_allocno_class, x_ira_allocno_classes_num, x_ira_allocno_classes, and x_ira_allocno_class_translate. Add x_ira_pressure_classes_num, x_ira_pressure_classes, x_ira_pressure_class_translate, and x_ira_stack_reg_pressure_class. Rename x_ira_reg_class_nregs to x_ira_reg_class_max_nregs. Add x_ira_reg_class_min_nregs and x_ira_no_alloc_regs. (ira_hard_regno_cover_class): Rename to ira_hard_regno_allocno_class. (ira_reg_class_cover_size, ira_reg_class_cover): Rename to ira_allocno_classes_num and ira_allocno_classes. (ira_class_translate): Rename to ira_allocno_class_translate. (ira_pressure_classes_num, ira_pressure_classes): New definitions. (ira_pressure_class_translate, ira_stack_reg_pressure_class): Ditto. (ira_reg_class_nregs): Rename to ira_reg_class_max_nregs. (ira_reg_class_min_nregs, ira_stack_reg_pressure_class): New (ira_no_alloc_regs): New. * ira-costs.c: Add 2010 to Copyright. Remove mentioning cover classes from the file. Use ALLOCNO_CLASS instead of ALLOCNO_COVER_CLASS. Use ALLOCNO_CLASS_COST instead of ALLOCNO_COVER_CLASS_COST. (regno_cover_class): Rename to regno_aclass. (record_reg_classes): Use ira_reg_class_subunion instead of ira_reg_class_union. (record_address_regs): Check overflow. (scan_one_insn): Ditto. (print_allocno_costs): Print total mem cost fore regional allocation. (print_pseudo_costs): Use REG_N_REFS. (find_costs_and_classes): Use classes intersected with them on the 1st pass. Check overflow. Use ira_reg_class_subunion instead of ira_reg_class_union. Use ira_allocno_class_translate and regno_aclass instead of ira_class_translate and regno_cover_class. Modify code for finding regno_aclass. Setup preferred classes for the next pass. (setup_allocno_cover_class_and_costs): Rename to setup_allocno_class_and_costs. Use regno_aclass instead of regno_cover_class. Use ira_set_allocno_class instead of ira_set_allocno_cover_class. (init_costs, finish_costs): Use regno_aclass instead of regno_cover_class. (ira_costs): Use setup_allocno_class_and_costs instead of setup_allocno_cover_class_and_costs. (ira_tune_allocno_costs_and_cover_classes): Rename to ira_tune_allocno_costs. Check overflow. Skip conflict hard regs by processing objects. Use ira_reg_class_max_nregs instead of ira_reg_class_nregs. * rtl.h (reg_cover_class): Rename to reg_allocno_class. * sched-int.h: Remove mentioning cover classes from the file. (sched_regno_cover_class): Rename to sched_regno_pressure_class. * reginfo.c: Add 2010 to Copyright. Remove mentioning cover classes from the file. (struct reg_pref): Rename coverclass into allocnoclass. (reg_cover_class): Rename to reg_allocno_class. * Makefile.in (ira-color.o): Remove SPLAY_TREE_H from dependencies. * config/alpha/alpha.h (IRA_COVER_CLASSES): Remove. * config/arm/arm.h (IRA_COVER_CLASSES): Ditto. * config/avr/avr.h (IRA_COVER_CLASSES): Ditto. * config/bfin/bfin.h (IRA_COVER_CLASSES): Ditto. * config/cris/cris.h (IRA_COVER_CLASSES): Ditto. * config/fr30/fr30.h (IRA_COVER_CLASSES): Ditto. * config/frv/frv.h (IRA_COVER_CLASSES): Ditto. * config/h8300/h8300.h (IRA_COVER_CLASSES): Ditto. * config/i386/i386.h (STACK_REG_COVER_CLASS): Ditto. * config/i386/i386.c (TARGET_IRA_COVER_CLASSES) (i386_ira_cover_classes): Ditto. * config/ia64/ia64.h (IRA_COVER_CLASSES): Ditto. * config/iq2000/iq2000.h (IRA_COVER_CLASSES): Ditto. * config/m32r/m32r.h (IRA_COVER_CLASSES): Ditto. * config/m68k/m68k.h (IRA_COVER_CLASSES): Ditto. * config/mcore/mcore.h (IRA_COVER_CLASSES): Ditto. * config/mep/mep.h (IRA_COVER_CLASSES): Ditto. * config/mips/mips.c (TARGET_IRA_COVER_CLASSES) (mips_ira_cover_classes): Ditto. * config/mn10300/mn10300.h (IRA_COVER_CLASSES): Ditto. * config/moxie/moxie.h (IRA_COVER_CLASSES): Ditto. * config/pa/pa64-regs.h (IRA_COVER_CLASSES): Ditto. * config/pa/pa32-regs.h (IRA_COVER_CLASSES): Ditto. * config/picochip/picochip.h (IRA_COVER_CLASSES): Ditto. * config/rs6000/rs6000.h (IRA_COVER_CLASSES_PRE_VSX) (IRA_COVER_CLASSES_VSX): Ditto. * config/rs6000/rs6000.c (TARGET_IRA_COVER_CLASSES) (rs6000_ira_cover_classes): Ditto. * config/rx/rx.h (IRA_COVER_CLASSES): Ditto. * config/s390/s390.h (IRA_COVER_CLASSES): Ditto. * config/score/score.h (IRA_COVER_CLASSES): Ditto. * config/sh/sh.h (IRA_COVER_CLASSES): Ditto. * config/sparc/sparc.h (IRA_COVER_CLASSES): Ditto. * config/spu/spu.h (IRA_COVER_CLASSES): Ditto. * config/stormy16/stormy16.h (IRA_COVER_CLASSES): Ditto. * config/v850/v850.h (IRA_COVER_CLASSES): Ditto. * config/vax/vax.h (IRA_COVER_CLASSES): Ditto. * config/xtensa/xtensa.h (IRA_COVER_CLASSES): Ditto. From-SVN: r171649 |
||
---|---|---|
.. | ||
ada | ||
c-family | ||
config | ||
cp | ||
doc | ||
fortran | ||
ginclude | ||
go | ||
java | ||
lto | ||
objc | ||
objcp | ||
po | ||
testsuite | ||
ABOUT-GCC-NLS | ||
BASE-VER | ||
COPYING | ||
COPYING.LIB | ||
COPYING3 | ||
COPYING3.LIB | ||
ChangeLog | ||
ChangeLog-1997 | ||
ChangeLog-1998 | ||
ChangeLog-1999 | ||
ChangeLog-2000 | ||
ChangeLog-2001 | ||
ChangeLog-2002 | ||
ChangeLog-2003 | ||
ChangeLog-2004 | ||
ChangeLog-2005 | ||
ChangeLog-2006 | ||
ChangeLog-2007 | ||
ChangeLog-2008 | ||
ChangeLog-2009 | ||
ChangeLog-2010 | ||
ChangeLog.dataflow | ||
ChangeLog.graphite | ||
ChangeLog.lib | ||
ChangeLog.ptr | ||
ChangeLog.tree-ssa | ||
ChangeLog.tuples | ||
DATESTAMP | ||
DEV-PHASE | ||
FSFChangeLog | ||
FSFChangeLog.10 | ||
FSFChangeLog.11 | ||
LANGUAGES | ||
Makefile.in | ||
ONEWS | ||
README.Portability | ||
acinclude.m4 | ||
aclocal.m4 | ||
addresses.h | ||
alias.c | ||
alias.h | ||
alloc-pool.c | ||
alloc-pool.h | ||
attribs.c | ||
auto-inc-dec.c | ||
basic-block.h | ||
bb-reorder.c | ||
bb-reorder.h | ||
bitmap.c | ||
bitmap.h | ||
bt-load.c | ||
builtin-attrs.def | ||
builtin-types.def | ||
builtins.c | ||
builtins.def | ||
builtins.h | ||
c-aux-info.c | ||
c-config-lang.in | ||
c-convert.c | ||
c-decl.c | ||
c-errors.c | ||
c-lang.c | ||
c-lang.h | ||
c-objc-common.c | ||
c-objc-common.h | ||
c-parser.c | ||
c-tree.h | ||
c-typeck.c | ||
caller-save.c | ||
calls.c | ||
cfg.c | ||
cfganal.c | ||
cfgbuild.c | ||
cfgcleanup.c | ||
cfgexpand.c | ||
cfghooks.c | ||
cfghooks.h | ||
cfglayout.c | ||
cfglayout.h | ||
cfgloop.c | ||
cfgloop.h | ||
cfgloopanal.c | ||
cfgloopmanip.c | ||
cfgrtl.c | ||
cgraph.c | ||
cgraph.h | ||
cgraphbuild.c | ||
cgraphunit.c | ||
cif-code.def | ||
collect2-aix.c | ||
collect2-aix.h | ||
collect2.c | ||
collect2.h | ||
combine-stack-adj.c | ||
combine.c | ||
common.opt | ||
compare-elim.c | ||
conditions.h | ||
config.build | ||
config.gcc | ||
config.host | ||
config.in | ||
configure | ||
configure.ac | ||
convert.c | ||
convert.h | ||
coretypes.h | ||
coverage.c | ||
coverage.h | ||
cppbuiltin.c | ||
cppbuiltin.h | ||
cppdefault.c | ||
cppdefault.h | ||
cppspec.c | ||
cprop.c | ||
crtstuff.c | ||
cse.c | ||
cselib.c | ||
cselib.h | ||
cstamp-h.in | ||
dbgcnt.c | ||
dbgcnt.def | ||
dbgcnt.h | ||
dbxout.c | ||
dbxout.h | ||
dce.c | ||
dce.h | ||
ddg.c | ||
ddg.h | ||
debug.c | ||
debug.h | ||
defaults.h | ||
df-core.c | ||
df-problems.c | ||
df-scan.c | ||
df.h | ||
dfp.c | ||
dfp.h | ||
diagnostic-core.h | ||
diagnostic.c | ||
diagnostic.def | ||
diagnostic.h | ||
dojump.c | ||
dominance.c | ||
domwalk.c | ||
domwalk.h | ||
double-int.c | ||
double-int.h | ||
dse.c | ||
dse.h | ||
dwarf2asm.c | ||
dwarf2asm.h | ||
dwarf2out.c | ||
dwarf2out.h | ||
ebitmap.c | ||
ebitmap.h | ||
emit-rtl.c | ||
emit-rtl.h | ||
emutls.c | ||
errors.c | ||
errors.h | ||
et-forest.c | ||
et-forest.h | ||
except.c | ||
except.h | ||
exec-tool.in | ||
explow.c | ||
expmed.c | ||
expmed.h | ||
expr.c | ||
expr.h | ||
final.c | ||
fixed-value.c | ||
fixed-value.h | ||
flag-types.h | ||
flags.h | ||
fold-const.c | ||
fp-test.c | ||
function.c | ||
function.h | ||
fwprop.c | ||
gbl-ctors.h | ||
gcc-plugin.h | ||
gcc.c | ||
gcc.h | ||
gccspec.c | ||
gcov-dump.c | ||
gcov-io.c | ||
gcov-io.h | ||
gcov-iov.c | ||
gcov.c | ||
gcse.c | ||
gcse.h | ||
gdbinit.in | ||
genattr.c | ||
genattrtab.c | ||
genautomata.c | ||
gencheck.c | ||
genchecksum.c | ||
gencodes.c | ||
genconditions.c | ||
genconfig.c | ||
genconstants.c | ||
genemit.c | ||
genenums.c | ||
genextract.c | ||
genflags.c | ||
gengenrtl.c | ||
gengtype-lex.l | ||
gengtype-parse.c | ||
gengtype-state.c | ||
gengtype.c | ||
gengtype.h | ||
genhooks.c | ||
genmddeps.c | ||
genmodes.c | ||
genmultilib | ||
genopinit.c | ||
genoutput.c | ||
genpeep.c | ||
genpreds.c | ||
genrecog.c | ||
gensupport.c | ||
gensupport.h | ||
ggc-common.c | ||
ggc-internal.h | ||
ggc-none.c | ||
ggc-page.c | ||
ggc-zone.c | ||
ggc.h | ||
gimple-fold.c | ||
gimple-fold.h | ||
gimple-iterator.c | ||
gimple-low.c | ||
gimple-pretty-print.c | ||
gimple-pretty-print.h | ||
gimple.c | ||
gimple.def | ||
gimple.h | ||
gimplify.c | ||
glimits.h | ||
godump.c | ||
graph.c | ||
graph.h | ||
graphds.c | ||
graphds.h | ||
graphite-blocking.c | ||
graphite-clast-to-gimple.c | ||
graphite-clast-to-gimple.h | ||
graphite-cloog-compat.h | ||
graphite-cloog-util.c | ||
graphite-cloog-util.h | ||
graphite-dependences.c | ||
graphite-dependences.h | ||
graphite-flattening.c | ||
graphite-interchange.c | ||
graphite-poly.c | ||
graphite-poly.h | ||
graphite-ppl.c | ||
graphite-ppl.h | ||
graphite-scop-detection.c | ||
graphite-scop-detection.h | ||
graphite-sese-to-poly.c | ||
graphite-sese-to-poly.h | ||
graphite.c | ||
gsstruct.def | ||
gstab.h | ||
gsyms.h | ||
gsyslimits.h | ||
gthr-aix.h | ||
gthr-dce.h | ||
gthr-gnat.c | ||
gthr-gnat.h | ||
gthr-lynx.h | ||
gthr-mipssde.h | ||
gthr-nks.h | ||
gthr-posix.c | ||
gthr-posix.h | ||
gthr-posix95.h | ||
gthr-rtems.h | ||
gthr-single.h | ||
gthr-tpf.h | ||
gthr-vxworks.h | ||
gthr-win32.h | ||
gthr.h | ||
haifa-sched.c | ||
hard-reg-set.h | ||
highlev-plugin-common.h | ||
hooks.c | ||
hooks.h | ||
host-default.c | ||
hosthooks-def.h | ||
hosthooks.h | ||
hwint.c | ||
hwint.h | ||
ifcvt.c | ||
implicit-zee.c | ||
incpath.c | ||
incpath.h | ||
init-regs.c | ||
input.c | ||
input.h | ||
insn-addr.h | ||
insn-notes.def | ||
integrate.c | ||
integrate.h | ||
intl.c | ||
intl.h | ||
ipa-cp.c | ||
ipa-inline.c | ||
ipa-prop.c | ||
ipa-prop.h | ||
ipa-pure-const.c | ||
ipa-ref-inline.h | ||
ipa-ref.c | ||
ipa-ref.h | ||
ipa-reference.c | ||
ipa-reference.h | ||
ipa-split.c | ||
ipa-utils.c | ||
ipa-utils.h | ||
ipa.c | ||
ira-build.c | ||
ira-color.c | ||
ira-conflicts.c | ||
ira-costs.c | ||
ira-emit.c | ||
ira-int.h | ||
ira-lives.c | ||
ira.c | ||
ira.h | ||
jump.c | ||
langhooks-def.h | ||
langhooks.c | ||
langhooks.h | ||
lcm.c | ||
libfuncs.h | ||
libgcc-libsystem.ver | ||
libgcc-std.ver | ||
libgcc2.c | ||
libgcc2.h | ||
libgcov.c | ||
limitx.h | ||
limity.h | ||
lists.c | ||
longlong.h | ||
loop-doloop.c | ||
loop-init.c | ||
loop-invariant.c | ||
loop-iv.c | ||
loop-unroll.c | ||
loop-unswitch.c | ||
lower-subreg.c | ||
lto-cgraph.c | ||
lto-compress.c | ||
lto-compress.h | ||
lto-opts.c | ||
lto-section-in.c | ||
lto-section-out.c | ||
lto-streamer-in.c | ||
lto-streamer-out.c | ||
lto-streamer.c | ||
lto-streamer.h | ||
lto-symtab.c | ||
lto-wrapper.c | ||
machmode.def | ||
machmode.h | ||
main.c | ||
matrix-reorg.c | ||
mcf.c | ||
mips-tdump.c | ||
mips-tfile.c | ||
mkconfig.sh | ||
mkmap-flat.awk | ||
mkmap-symver.awk | ||
mode-classes.def | ||
mode-switching.c | ||
modulo-sched.c | ||
omega.c | ||
omega.h | ||
omp-builtins.def | ||
omp-low.c | ||
opt-functions.awk | ||
opt-gather.awk | ||
opt-include.awk | ||
optabs.c | ||
optabs.h | ||
optc-gen.awk | ||
opth-gen.awk | ||
opts-common.c | ||
opts-diagnostic.h | ||
opts-global.c | ||
opts.c | ||
opts.h | ||
output.h | ||
params.c | ||
params.def | ||
params.h | ||
passes.c | ||
plugin.c | ||
plugin.def | ||
plugin.h | ||
pointer-set.c | ||
pointer-set.h | ||
postreload-gcse.c | ||
postreload.c | ||
predict.c | ||
predict.def | ||
predict.h | ||
prefix.c | ||
prefix.h | ||
pretty-print.c | ||
pretty-print.h | ||
print-rtl.c | ||
print-tree.c | ||
profile.c | ||
profile.h | ||
read-md.c | ||
read-md.h | ||
read-rtl.c | ||
real.c | ||
real.h | ||
realmpfr.c | ||
realmpfr.h | ||
recog.c | ||
recog.h | ||
reg-notes.def | ||
reg-stack.c | ||
regcprop.c | ||
reginfo.c | ||
regmove.c | ||
regrename.c | ||
regs.h | ||
regset.h | ||
regstat.c | ||
reload.c | ||
reload.h | ||
reload1.c | ||
reorg.c | ||
resource.c | ||
resource.h | ||
rtl-error.c | ||
rtl-error.h | ||
rtl.c | ||
rtl.def | ||
rtl.h | ||
rtlanal.c | ||
rtlhooks-def.h | ||
rtlhooks.c | ||
sbitmap.c | ||
sbitmap.h | ||
sched-deps.c | ||
sched-ebb.c | ||
sched-int.h | ||
sched-rgn.c | ||
sched-vis.c | ||
sdbout.c | ||
sdbout.h | ||
sel-sched-dump.c | ||
sel-sched-dump.h | ||
sel-sched-ir.c | ||
sel-sched-ir.h | ||
sel-sched.c | ||
sel-sched.h | ||
sese.c | ||
sese.h | ||
simplify-rtx.c | ||
sparseset.c | ||
sparseset.h | ||
sreal.c | ||
sreal.h | ||
ssaexpand.h | ||
stab.def | ||
stack-ptr-mod.c | ||
statistics.c | ||
statistics.h | ||
stmt.c | ||
stor-layout.c | ||
store-motion.c | ||
stringpool.c | ||
sync-builtins.def | ||
system.h | ||
target-def.h | ||
target-globals.c | ||
target-globals.h | ||
target.def | ||
target.h | ||
targhooks.c | ||
targhooks.h | ||
timevar.c | ||
timevar.def | ||
timevar.h | ||
tlink.c | ||
toplev.c | ||
toplev.h | ||
tracer.c | ||
tree-affine.c | ||
tree-affine.h | ||
tree-browser.c | ||
tree-browser.def | ||
tree-call-cdce.c | ||
tree-cfg.c | ||
tree-cfgcleanup.c | ||
tree-chrec.c | ||
tree-chrec.h | ||
tree-complex.c | ||
tree-data-ref.c | ||
tree-data-ref.h | ||
tree-dfa.c | ||
tree-diagnostic.c | ||
tree-diagnostic.h | ||
tree-dump.c | ||
tree-dump.h | ||
tree-eh.c | ||
tree-emutls.c | ||
tree-flow-inline.h | ||
tree-flow.h | ||
tree-if-conv.c | ||
tree-inline.c | ||
tree-inline.h | ||
tree-into-ssa.c | ||
tree-iterator.c | ||
tree-iterator.h | ||
tree-loop-distribution.c | ||
tree-mudflap.c | ||
tree-mudflap.h | ||
tree-nested.c | ||
tree-nomudflap.c | ||
tree-nrv.c | ||
tree-object-size.c | ||
tree-optimize.c | ||
tree-outof-ssa.c | ||
tree-parloops.c | ||
tree-pass.h | ||
tree-phinodes.c | ||
tree-predcom.c | ||
tree-pretty-print.c | ||
tree-pretty-print.h | ||
tree-profile.c | ||
tree-scalar-evolution.c | ||
tree-scalar-evolution.h | ||
tree-sra.c | ||
tree-ssa-address.c | ||
tree-ssa-alias.c | ||
tree-ssa-alias.h | ||
tree-ssa-ccp.c | ||
tree-ssa-coalesce.c | ||
tree-ssa-copy.c | ||
tree-ssa-copyrename.c | ||
tree-ssa-dce.c | ||
tree-ssa-dom.c | ||
tree-ssa-dse.c | ||
tree-ssa-forwprop.c | ||
tree-ssa-ifcombine.c | ||
tree-ssa-live.c | ||
tree-ssa-live.h | ||
tree-ssa-loop-ch.c | ||
tree-ssa-loop-im.c | ||
tree-ssa-loop-ivcanon.c | ||
tree-ssa-loop-ivopts.c | ||
tree-ssa-loop-manip.c | ||
tree-ssa-loop-niter.c | ||
tree-ssa-loop-prefetch.c | ||
tree-ssa-loop-unswitch.c | ||
tree-ssa-loop.c | ||
tree-ssa-math-opts.c | ||
tree-ssa-operands.c | ||
tree-ssa-operands.h | ||
tree-ssa-phiopt.c | ||
tree-ssa-phiprop.c | ||
tree-ssa-pre.c | ||
tree-ssa-propagate.c | ||
tree-ssa-propagate.h | ||
tree-ssa-reassoc.c | ||
tree-ssa-sccvn.c | ||
tree-ssa-sccvn.h | ||
tree-ssa-sink.c | ||
tree-ssa-structalias.c | ||
tree-ssa-ter.c | ||
tree-ssa-threadedge.c | ||
tree-ssa-threadupdate.c | ||
tree-ssa-uncprop.c | ||
tree-ssa-uninit.c | ||
tree-ssa.c | ||
tree-ssanames.c | ||
tree-stdarg.c | ||
tree-stdarg.h | ||
tree-switch-conversion.c | ||
tree-tailcall.c | ||
tree-vect-data-refs.c | ||
tree-vect-generic.c | ||
tree-vect-loop-manip.c | ||
tree-vect-loop.c | ||
tree-vect-patterns.c | ||
tree-vect-slp.c | ||
tree-vect-stmts.c | ||
tree-vectorizer.c | ||
tree-vectorizer.h | ||
tree-vrp.c | ||
tree.c | ||
tree.def | ||
tree.h | ||
treestruct.def | ||
tsystem.h | ||
typeclass.h | ||
unwind-c.c | ||
unwind-compat.c | ||
unwind-compat.h | ||
unwind-dw2-fde-compat.c | ||
unwind-dw2-fde-darwin.c | ||
unwind-dw2-fde-glibc.c | ||
unwind-dw2-fde.c | ||
unwind-dw2-fde.h | ||
unwind-dw2.c | ||
unwind-dw2.h | ||
unwind-generic.h | ||
unwind-pe.h | ||
unwind-sjlj.c | ||
unwind.inc | ||
value-prof.c | ||
value-prof.h | ||
var-tracking.c | ||
varasm.c | ||
varpool.c | ||
vec.c | ||
vec.h | ||
vecir.h | ||
vecprim.h | ||
version.c | ||
version.h | ||
vmsdbg.h | ||
vmsdbgout.c | ||
web.c | ||
xcoff.h | ||
xcoffout.c | ||
xcoffout.h |
README.Portability
Copyright (C) 2000, 2003 Free Software Foundation, Inc. This file is intended to contain a few notes about writing C code within GCC so that it compiles without error on the full range of compilers GCC needs to be able to compile on. The problem is that many ISO-standard constructs are not accepted by either old or buggy compilers, and we keep getting bitten by them. This knowledge until know has been sparsely spread around, so I thought I'd collect it in one useful place. Please add and correct any problems as you come across them. I'm going to start from a base of the ISO C90 standard, since that is probably what most people code to naturally. Obviously using constructs introduced after that is not a good idea. For the complete coding style conventions used in GCC, please read http://gcc.gnu.org/codingconventions.html String literals --------------- Irix6 "cc -n32" and OSF4 "cc" have problems with constant string initializers with parens around it, e.g. const char string[] = ("A string"); This is unfortunate since this is what the GNU gettext macro N_ produces. You need to find a different way to code it. Some compilers like MSVC++ have fairly low limits on the maximum length of a string literal; 509 is the lowest we've come across. You may need to break up a long printf statement into many smaller ones. Empty macro arguments --------------------- ISO C (6.8.3 in the 1990 standard) specifies the following: If (before argument substitution) any argument consists of no preprocessing tokens, the behavior is undefined. This was relaxed by ISO C99, but some older compilers emit an error, so code like #define foo(x, y) x y foo (bar, ) needs to be coded in some other way. free and realloc ---------------- Some implementations crash upon attempts to free or realloc the null pointer. Thus if mem might be null, you need to write if (mem) free (mem); Trigraphs --------- You weren't going to use them anyway, but some otherwise ISO C compliant compilers do not accept trigraphs. Suffixes on Integer Constants ----------------------------- You should never use a 'l' suffix on integer constants ('L' is fine), since it can easily be confused with the number '1'. Common Coding Pitfalls ====================== errno ----- errno might be declared as a macro. Implicit int ------------ In C, the 'int' keyword can often be omitted from type declarations. For instance, you can write unsigned variable; as shorthand for unsigned int variable; There are several places where this can cause trouble. First, suppose 'variable' is a long; then you might think (unsigned) variable would convert it to unsigned long. It does not. It converts to unsigned int. This mostly causes problems on 64-bit platforms, where long and int are not the same size. Second, if you write a function definition with no return type at all: operate (int a, int b) { ... } that function is expected to return int, *not* void. GCC will warn about this. Implicit function declarations always have return type int. So if you correct the above definition to void operate (int a, int b) ... but operate() is called above its definition, you will get an error about a "type mismatch with previous implicit declaration". The cure is to prototype all functions at the top of the file, or in an appropriate header. Char vs unsigned char vs int ---------------------------- In C, unqualified 'char' may be either signed or unsigned; it is the implementation's choice. When you are processing 7-bit ASCII, it does not matter. But when your program must handle arbitrary binary data, or fully 8-bit character sets, you have a problem. The most obvious issue is if you have a look-up table indexed by characters. For instance, the character '\341' in ISO Latin 1 is SMALL LETTER A WITH ACUTE ACCENT. In the proper locale, isalpha('\341') will be true. But if you read '\341' from a file and store it in a plain char, isalpha(c) may look up character 225, or it may look up character -31. And the ctype table has no entry at offset -31, so your program will crash. (If you're lucky.) It is wise to use unsigned char everywhere you possibly can. This avoids all these problems. Unfortunately, the routines in <string.h> take plain char arguments, so you have to remember to cast them back and forth - or avoid the use of strxxx() functions, which is probably a good idea anyway. Another common mistake is to use either char or unsigned char to receive the result of getc() or related stdio functions. They may return EOF, which is outside the range of values representable by char. If you use char, some legal character value may be confused with EOF, such as '\377' (SMALL LETTER Y WITH UMLAUT, in Latin-1). The correct choice is int. A more subtle version of the same mistake might look like this: unsigned char pushback[NPUSHBACK]; int pbidx; #define unget(c) (assert(pbidx < NPUSHBACK), pushback[pbidx++] = (c)) #define get(c) (pbidx ? pushback[--pbidx] : getchar()) ... unget(EOF); which will mysteriously turn a pushed-back EOF into a SMALL LETTER Y WITH UMLAUT. Other common pitfalls --------------------- o Expecting 'plain' char to be either sign or unsigned extending. o Shifting an item by a negative amount or by greater than or equal to the number of bits in a type (expecting shifts by 32 to be sensible has caused quite a number of bugs at least in the early days). o Expecting ints shifted right to be sign extended. o Modifying the same value twice within one sequence point. o Host vs. target floating point representation, including emitting NaNs and Infinities in a form that the assembler handles. o qsort being an unstable sort function (unstable in the sense that multiple items that sort the same may be sorted in different orders by different qsort functions). o Passing incorrect types to fprintf and friends. o Adding a function declaration for a module declared in another file to a .c file instead of to a .h file.