#include "config.h"#include "system.h"#include "coretypes.h"#include "tm.h"#include "hard-reg-set.h"#include "rtl.h"#include "expr.h"#include "tm_p.h"#include "flags.h"#include "basic-block.h"#include "regs.h"#include "function.h"#include "insn-config.h"#include "recog.h"#include "reload.h"#include "real.h"#include "toplev.h"#include "output.h"#include "ggc.h"#include "timevar.h"#include "hashtab.h"#include "gt-regclass.h"

Go to the source code of this file.
Data Types | |
| type | costs |
| type | reg_pref |
Defines | |
| #define | CALL_REALLY_USED_REGNO_P(X) call_used_regs[X] |
| #define | N_REG_INTS ((FIRST_PSEUDO_REGISTER + (32 - 1)) / 32) |
Functions/Subroutines | |
| static void | init_reg_sets_1 (void) |
| static void | init_reg_autoinc (void) |
| static | GTY (()) |
| void | init_reg_sets (void) |
| void | init_reg_modes_once (void) |
| void | init_regs (void) |
| void | init_fake_stack_mems (void) |
| enum machine_mode | choose_hard_reg_mode (unsigned int regno ATTRIBUTE_UNUSED, unsigned int nregs, bool call_saved) |
| void | fix_register (const char *name, int fixed, int call_used) |
| void | globalize_reg (int i) |
| static rtx | scan_one_insn (rtx, int) |
| static void | record_operand_costs (rtx, struct costs *, struct reg_pref *) |
| static void | dump_regclass (FILE *) |
| static void | record_reg_classes (int, int, rtx *, enum machine_mode *, const char **, rtx, struct costs *, struct reg_pref *) |
| static int | copy_cost (rtx, enum machine_mode, enum reg_class, int) |
| static void | record_address_regs (rtx, enum reg_class, int) |
| static void | reg_scan_mark_refs (rtx, rtx, int, unsigned int) |
| enum reg_class | reg_preferred_class (int regno) |
| enum reg_class | reg_alternate_class (int regno) |
| void | regclass_init (void) |
| void | regclass (rtx f, int nregs, FILE *dump) |
| static int | copy_cost (rtx x, enum machine_mode mode ATTRIBUTE_UNUSED, enum reg_class class, int to_p ATTRIBUTE_UNUSED) |
| void | allocate_reg_info (size_t num_regs, int new_p, int renumber_p) |
| void | free_reg_info (void) |
| void | reg_scan (rtx f, unsigned int nregs) |
| void | reg_scan_update (rtx first, rtx last, unsigned int old_max_regno) |
| int | reg_class_subset_p (enum reg_class c1, enum reg_class c2) |
| int | reg_classes_intersect_p (enum reg_class c1, enum reg_class c2) |
Variables | |
| char | fixed_regs [FIRST_PSEUDO_REGISTER] |
| HARD_REG_SET | fixed_reg_set |
| static const char | initial_fixed_regs [] = FIXED_REGISTERS |
| char | call_used_regs [FIRST_PSEUDO_REGISTER] |
| HARD_REG_SET | call_used_reg_set |
| HARD_REG_SET | losing_caller_save_reg_set |
| static const char | initial_call_used_regs [] = CALL_USED_REGISTERS |
| char | call_fixed_regs [FIRST_PSEUDO_REGISTER] |
| HARD_REG_SET | call_fixed_reg_set |
| int | n_non_fixed_regs |
| char | global_regs [FIRST_PSEUDO_REGISTER] |
| HARD_REG_SET | regs_invalidated_by_call |
| HARD_REG_SET | reg_class_contents [N_REG_CLASSES] |
| static const unsigned | int_reg_class_contents [N_REG_CLASSES][N_REG_INTS] = REG_CLASS_CONTENTS |
| unsigned int | reg_class_size [N_REG_CLASSES] |
| enum reg_class | reg_class_superclasses [N_REG_CLASSES][N_REG_CLASSES] |
| enum reg_class | reg_class_subclasses [N_REG_CLASSES][N_REG_CLASSES] |
| enum reg_class | reg_class_subunion [N_REG_CLASSES][N_REG_CLASSES] |
| enum reg_class | reg_class_superunion [N_REG_CLASSES][N_REG_CLASSES] |
| const char * | reg_names [] = REGISTER_NAMES |
| const char * | reg_class_names [] = REG_CLASS_NAMES |
| enum machine_mode | reg_raw_mode [FIRST_PSEUDO_REGISTER] |
| bool | have_regs_of_mode [MAX_MACHINE_MODE] |
| static char | contains_reg_of_mode [N_REG_CLASSES][MAX_MACHINE_MODE] |
| static int | move_cost [MAX_MACHINE_MODE][N_REG_CLASSES][N_REG_CLASSES] |
| static int | may_move_in_cost [MAX_MACHINE_MODE][N_REG_CLASSES][N_REG_CLASSES] |
| static int | may_move_out_cost [MAX_MACHINE_MODE][N_REG_CLASSES][N_REG_CLASSES] |
| static struct reg_info_data * | reg_info_head |
| static int | no_global_reg_vars = 0 |
| unsigned char | hard_regno_nregs [FIRST_PSEUDO_REGISTER][MAX_MACHINE_MODE] |
| static struct costs * | costs |
| static struct costs | init_cost |
| static struct reg_pref * | reg_pref |
| static struct reg_pref * | reg_pref_buffer |
| static int | frequency |
| static short * | renumber |
| static size_t | regno_allocated |
| static unsigned int | reg_n_max |
| int | max_parallel |
| static int | max_set_parallel |
| #define CALL_REALLY_USED_REGNO_P | ( | X | ) | call_used_regs[X] |
| #define N_REG_INTS ((FIRST_PSEUDO_REGISTER + (32 - 1)) / 32) |
Definition at line 163 of file regclass.c.
Definition at line 2162 of file regclass.c.
References reg_pref::altclass, char, free(), i, max, memset, MIN, min, NO_REGS, reg_pref::prefclass, REG_BASIC_BLOCK, REG_BLOCK_UNKNOWN, reg_n_info, reg_renumber, short, VARRAY_GROW, VARRAY_REG, VARRAY_REG_INIT, xcalloc(), xmalloc(), and xrealloc().
| enum machine_mode choose_hard_reg_mode | ( | unsigned int regno | ATTRIBUTE_UNUSED, | |
| unsigned int | nregs, | |||
| bool | call_saved | |||
| ) |
Definition at line 671 of file regclass.c.
References GET_CLASS_NARROWEST_MODE, GET_MODE_WIDER_MODE, HARD_REGNO_CALL_PART_CLOBBERED, HARD_REGNO_MODE_OK, MODE_FLOAT, MODE_INT, MODE_VECTOR_FLOAT, MODE_VECTOR_INT, and NUM_MACHINE_MODES.
| static int copy_cost | ( | rtx | x, | |
| enum machine_mode mode | ATTRIBUTE_UNUSED, | |||
| enum reg_class | class, | |||
| int to_p | ATTRIBUTE_UNUSED | |||
| ) | [static] |
Definition at line 1881 of file regclass.c.
References copy_cost, COSTS_N_INSNS, GET_CODE, int, MEM_P, MEMORY_MOVE_COST, move_cost, NO_REGS, PREFERRED_RELOAD_CLASS, REG_P, REGNO, REGNO_REG_CLASS, SECONDARY_INPUT_RELOAD_CLASS, and SECONDARY_OUTPUT_RELOAD_CLASS.
| static int copy_cost | ( | rtx | , | |
| enum | machine_mode, | |||
| enum | reg_class, | |||
| int | ||||
| ) | [static] |
Definition at line 930 of file regclass.c.
References CANNOT_CHANGE_MODE_CLASS, contains_reg_of_mode, FIRST_PSEUDO_REGISTER, fprintf(), i, int, invalid_mode_change_p(), max_regno, PSEUDO_REGNO_MODE, reg_class_names, and REG_N_REFS.
| void fix_register | ( | const char * | name, | |
| int | fixed, | |||
| int | call_used | |||
| ) |
Definition at line 744 of file regclass.c.
| void globalize_reg | ( | int | i | ) |
Definition at line 788 of file regclass.c.
References call_fixed_reg_set, call_fixed_regs, call_used_reg_set, call_used_regs, error(), fixed_reg_set, fixed_regs, global_regs, n_non_fixed_regs, regs_invalidated_by_call, SET_HARD_REG_BIT, STACK_POINTER_REGNUM, and warning.
| static GTY | ( | () | ) | [static] |
Definition at line 1158 of file regclass.c.
References FIRST_PSEUDO_REGISTER, gen_rtx_raw_REG, HARD_REGNO_MODE_OK, i, int, MODE_BASE_REG_CLASS, N_REG_CLASSES, NO_REGS, PUT_MODE, r, reg_class_contents, REGNO, SECONDARY_INPUT_RELOAD_CLASS, SECONDARY_OUTPUT_RELOAD_CLASS, SECONDARY_RELOAD_CLASS, and TEST_HARD_REG_BIT.
Definition at line 273 of file regclass.c.
References call_used_regs, CLEAR_HARD_REG_SET, FIRST_PSEUDO_REGISTER, fixed_regs, gcc_assert, global_regs, i, initial_call_used_regs, initial_fixed_regs, int_reg_class_contents, memcpy, memset, N_REG_CLASSES, reg_class_contents, and SET_HARD_REG_BIT.
Definition at line 310 of file regclass.c.
References ARG_POINTER_REGNUM, c, call_fixed_reg_set, call_fixed_regs, CALL_REALLY_USED_REGNO_P, call_used_reg_set, call_used_regs, CLASS_LIKELY_SPILLED_P, CLASS_MAX_NREGS, CLEAR_HARD_REG_SET, CONDITIONAL_REGISTER_USAGE, contains_reg_of_mode, COPY_HARD_REG_SET, FIRST_PSEUDO_REGISTER, fixed_reg_set, fixed_regs, FRAME_POINTER_REGNUM, gcc_assert, global_regs, GO_IF_HARD_REG_SUBSET, HARD_FRAME_POINTER_REGNUM, HARD_REG_SET, HARD_REGNO_MODE_OK, have_regs_of_mode, i, int, IOR_HARD_REG_SET, LIM_REG_CLASSES, losing_caller_save_reg_set, MAX, may_move_in_cost, may_move_out_cost, memcpy, memset, move_cost, n_non_fixed_regs, N_REG_CLASSES, NO_REGS, p, p1, p2, PIC_OFFSET_TABLE_REGNUM, reg_class_contents, reg_class_size, reg_class_subclasses, reg_class_subset_p(), reg_class_subunion, reg_class_superclasses, reg_class_superunion, REGISTER_MOVE_COST, REGNO_REG_CLASS, regs_invalidated_by_call, SET_HARD_REG_BIT, STACK_POINTER_REGNUM, and TEST_HARD_REG_BIT.
Definition at line 1943 of file regclass.c.
References CONST, CONSTANT_P, costs::cost, FIRST_PSEUDO_REGISTER, GET_CODE, GET_RTX_FORMAT, GET_RTX_LENGTH, i, INDEX_REG_CLASS, MAX_REGS_PER_ADDRESS, may_move_in_cost, costs::mem_cost, MEMORY_MOVE_COST, MODE_BASE_REG_CLASS, MODE_BASE_REG_REG_CLASS, N_REG_CLASSES, PC, PLUS, Pmode, record_address_regs(), REG, REG_MODE_OK_FOR_REG_BASE_P, REG_OK_FOR_INDEX_P, REG_P, REG_POINTER, REGNO, SUBREG_REG, and XEXP.
| static void record_operand_costs | ( | rtx | insn, | |
| struct costs * | op_costs, | |||
| struct reg_pref * | reg_pref | |||
| ) | [static] |
Definition at line 961 of file regclass.c.
References EXTRA_ADDRESS_CONSTRAINT, GET_CODE, i, init_cost, int, MAX_RECOG_OPERANDS, MEM_P, MODE_BASE_REG_CLASS, modes, record_address_regs(), record_reg_classes(), SUBREG_REG, and XEXP.
| static void record_reg_classes | ( | int | n_alts, | |
| int | n_ops, | |||
| rtx * | ops, | |||
| enum machine_mode * | modes, | |||
| const char ** | constraints, | |||
| rtx | insn, | |||
| struct costs * | op_costs, | |||
| struct reg_pref * | reg_pref | |||
| ) | [static] |
Definition at line 1402 of file regclass.c.
References address_operand(), c, char, CLASS_MAX_NREGS, CONST_DOUBLE_OK_FOR_CONSTRAINT_P, CONST_OK_FOR_CONSTRAINT_P, CONSTANT_P, CONSTRAINT_LEN, copy_cost, costs::cost, EXTRA_ADDRESS_CONSTRAINT, EXTRA_CONSTRAINT_STR, EXTRA_MEMORY_CONSTRAINT, find_reg_note(), find_regno_note(), FIRST_PSEUDO_REGISTER, flag_pic, GENERAL_REGS, GET_CODE, GET_MODE, GET_MODE_CLASS, i, int, INTVAL, LEGITIMATE_PIC_OPERAND_P, may_move_in_cost, may_move_out_cost, costs::mem_cost, MEM_P, MEMORY_MOVE_COST, memset, MIN, MODE_BASE_REG_CLASS, MODE_VECTOR_FLOAT, N_REG_CLASSES, NO_REGS, nr, OP_IN, OP_INOUT, OP_OUT, p, reg_pref::prefclass, reg_class_contents, REG_CLASS_FROM_CONSTRAINT, reg_class_size, reg_class_subunion, REG_DEAD, reg_fits_class_p(), REG_P, REGISTER_MOVE_COST, REGNO, rtx_equal_p(), SET_DEST, SET_SRC, single_set, TEST_HARD_REG_BIT, unsigned, and XEXP.
| enum reg_class reg_alternate_class | ( | int | regno | ) |
Definition at line 2546 of file regclass.c.
References ALL_REGS, GO_IF_HARD_REG_SUBSET, and reg_class_contents.
Definition at line 2562 of file regclass.c.
References ALL_REGS, AND_HARD_REG_SET, c, COPY_HARD_REG_SET, GO_IF_HARD_REG_SUBSET, HARD_REG_SET, NO_REGS, and reg_class_contents.
| enum reg_class reg_preferred_class | ( | int | regno | ) |
Definition at line 2308 of file regclass.c.
Definition at line 2368 of file regclass.c.
References CONST, dest, find_reg_note(), FIRST_PSEUDO_REGISTER, GET_CODE, GET_RTX_FORMAT, GET_RTX_LENGTH, i, INSN_UID, MAX, MEM_P, PC, PLUS, REG, REG_ATTRS, REG_EQUAL, REG_N_REFS, REG_N_SETS, REG_P, REG_POINTER, reg_scan_mark_refs(), REG_USERVAR_P, REGNO, REGNO_FIRST_UID, REGNO_LAST_UID, SET, SET_DEST, set_reg_attrs_from_mem(), SET_SRC, SIGN_EXTEND, src, subreg_lowpart_p(), TRUNCATE, XEXP, XVEC, XVECEXP, and XVECLEN.
Definition at line 2342 of file regclass.c.
References allocate_reg_info(), FALSE, GET_CODE, insn, INSN_P, max_reg_num(), NEXT_INSN, PATTERN, REG_NOTES, reg_scan_mark_refs(), and XVECLEN.
Definition at line 1214 of file regclass.c.
References ALL_REGS, reg_pref::altclass, BB_END, BB_HEAD, CANNOT_CHANGE_MODE_CLASS, contains_reg_of_mode, costs::cost, dump_regclass(), basic_block_def::end, FIRST_PSEUDO_REGISTER, flag_expensive_optimizations, FOR_EACH_BB, fprintf(), free(), basic_block_def::head, HOST_BITS_PER_INT, i, init_recog(), insn, int, invalid_mode_change_p(), costs::mem_cost, memset, N_REG_CLASSES, NEXT_INSN, NO_REGS, optimize, p, reg_pref::prefclass, PSEUDO_REGNO_MODE, reg_class_names, REG_CLASS_NAMES, reg_class_size, reg_class_subunion, REG_FREQ_FROM_BB, REG_FREQ_MAX, REG_N_REFS, REG_N_SETS, scan_one_insn(), and xmalloc().
Definition at line 912 of file regclass.c.
References costs::cost, i, init_cost, costs::mem_cost, N_REG_CLASSES, and NULL.
Definition at line 1032 of file regclass.c.
References b, BB_HEAD, CONSTANT_P, costs::cost, dest, emit_insn_before(), extract_insn(), find_reg_note(), FIRST_PSEUDO_REGISTER, FOR_EACH_BB, gen_lowpart, gen_move_insn(), GENERAL_REGS, GET_CODE, GET_MODE, i, INSN_P, JUMP_P, costs::mem_cost, MEM_P, MEMORY_MOVE_COST, MODE_BASE_REG_CLASS, MODES_TIEABLE_P, N_REG_CLASSES, NULL_RTX, optimize, p, PATTERN, PREV_INSN, prev_real_insn(), q, record_address_regs(), record_operand_costs(), REG_EQUIV, REG_FREQ, REG_N_REFS, REG_N_SETS, REG_P, REGNO, rtx_equal_p(), SET_DEST, SET_SRC, single_set, USE, and XEXP.
| HARD_REG_SET call_fixed_reg_set |
Definition at line 124 of file regclass.c.
| char call_fixed_regs[FIRST_PSEUDO_REGISTER] |
Definition at line 120 of file regclass.c.
| HARD_REG_SET call_used_reg_set |
Definition at line 90 of file regclass.c.
| char call_used_regs[FIRST_PSEUDO_REGISTER] |
Definition at line 86 of file regclass.c.
char contains_reg_of_mode[N_REG_CLASSES][MAX_MACHINE_MODE] [static] |
Definition at line 212 of file regclass.c.
Definition at line 856 of file regclass.c.
| HARD_REG_SET fixed_reg_set |
Definition at line 74 of file regclass.c.
| char fixed_regs[FIRST_PSEUDO_REGISTER] |
Definition at line 70 of file regclass.c.
int frequency [static] |
Definition at line 873 of file regclass.c.
| char global_regs[FIRST_PSEUDO_REGISTER] |
Definition at line 135 of file regclass.c.
| unsigned char hard_regno_nregs[FIRST_PSEUDO_REGISTER][MAX_MACHINE_MODE] |
Definition at line 267 of file regclass.c.
Referenced by add_stored_regs(), aggregate_value_p(), allocate_reload_reg(), assign_parm_setup_block(), assign_reg_reg_set(), can_change_dest_mode(), choose_reload_regs(), clear_dead_regs(), clear_reload_reg_in_use(), combine_regs(), combine_reloads(), compute_use_by_pseudos(), copy_value(), copyprop_hardreg_forward_1(), count_or_remove_death_notes_bb(), count_pseudo(), count_spilled_pseudo(), covers_regno_no_parallel_p(), cse_insn(), cselib_invalidate_regno(), cselib_lookup(), cselib_record_set(), dead_or_set_p(), decl_conflicts_with_clobbers_p(), decl_overlaps_hard_reg_set_p(), decompose(), delete_output_reload(), delete_prior_computation(), df_insn_refs_record(), df_lr_bb_local_compute(), df_mark_reg(), df_ref_record(), df_urec_mark_reg_change(), distribute_notes(), dump_def_use_chain(), emit_note_insn_var_location(), emit_reload_insns(), exp_equiv_p(), find_btr_reference(), find_dummy_reload(), find_dying_inputs(), find_equiv_reg(), find_free_reg(), find_oldest_value_reg(), find_reg(), find_reg_fusage(), find_regno_fusage(), find_regno_note(), find_reload_regs(), find_reloads(), forget_old_reloads_1(), free_for_value_p(), get_last_value_validate(), global_alloc(), hard_reg_set_here_p(), insert(), insert_one_insn(), insert_restore(), insert_save(), insn_dead_p(), invalidate(), invalidate_for_call(), kill_value(), kill_value_regno(), likely_spilled_retval_1(), likely_spilled_retval_p(), make_decl_rtl(), mark_effect(), mark_flags_life_zones(), mark_home_live(), mark_killed_regs(), mark_life(), mark_referenced_regs(), mark_referenced_resources(), mark_reg(), mark_reg_conflicts(), mark_reg_death(), mark_reg_gr_used_mask(), mark_reg_live_nc(), mark_reg_store(), mark_reload_reg_in_use(), mark_set_1(), mark_set_regs(), mark_set_resources(), mark_target_live_regs(), mark_used_reg(), mark_used_regs_combine(), maybe_mode_change(), mention_regs(), mentions_nonequal_regs(), move2add_note_store(), move_deaths(), note_btr_set(), note_local_live(), note_sets(), operands_match_p(), post_mark_life(), push_reload(), read_complex_part(), record_dead_and_set_regs(), record_set(), record_value_for_reg(), refers_to_regno_p(), reg_becomes_live(), reg_bitfield_target_p(), reg_dead_at_p(), reg_dead_at_p_1(), reg_dies(), reg_fits_class_p(), reg_overlap_mentioned_for_reload_p(), reg_overlap_mentioned_p(), regno_clobbered_p(), regrename_optimize(), reload_adjust_reg_for_mode(), reload_adjust_reg_for_temp(), reload_combine(), reload_combine_note_store(), reload_combine_note_use(), reload_cse_move2add(), reload_inner_reg_of_subreg(), reload_reg_free_for_value_p(), rs6000_memory_move_cost(), rs6000_register_move_cost(), rs6000_split_multireg_move(), rtx_equiv_p(), save_call_clobbered_regs(), scan_rtx_reg(), sched_analyze_1(), sched_analyze_2(), sched_analyze_reg(), set_preference(), set_value_regno(), setup_save_areas(), spill_hard_reg(), subreg_offset_representable_p(), subreg_regno_offset(), update_live_status(), update_table_tick(), use_crosses_set_p(), and write_complex_part().
| bool have_regs_of_mode[MAX_MACHINE_MODE] |
Definition at line 860 of file regclass.c.
const char initial_call_used_regs[] = CALL_USED_REGISTERS [static] |
Definition at line 97 of file regclass.c.
const char initial_fixed_regs[] = FIXED_REGISTERS [static] |
Definition at line 78 of file regclass.c.
const unsigned int_reg_class_contents[N_REG_CLASSES][N_REG_INTS] = REG_CLASS_CONTENTS [static] |
Definition at line 167 of file regclass.c.
| HARD_REG_SET losing_caller_save_reg_set |
Definition at line 93 of file regclass.c.
| int max_parallel |
Definition at line 2300 of file regclass.c.
int max_set_parallel [static] |
Definition at line 2305 of file regclass.c.
int may_move_in_cost[MAX_MACHINE_MODE][N_REG_CLASSES][N_REG_CLASSES] [static] |
Definition at line 222 of file regclass.c.
int may_move_out_cost[MAX_MACHINE_MODE][N_REG_CLASSES][N_REG_CLASSES] [static] |
Definition at line 227 of file regclass.c.
int move_cost[MAX_MACHINE_MODE][N_REG_CLASSES][N_REG_CLASSES] [static] |
Definition at line 217 of file regclass.c.
| int n_non_fixed_regs |
Definition at line 128 of file regclass.c.
Referenced by globalize_reg(), init_reg_sets_1(), preserve_subexpressions_p(), scan_loop(), and strength_reduce().
int no_global_reg_vars = 0 [static] |
Definition at line 264 of file regclass.c.
| HARD_REG_SET reg_class_contents[N_REG_CLASSES] |
Definition at line 156 of file regclass.c.
| const char* reg_class_names[] = REG_CLASS_NAMES |
Definition at line 197 of file regclass.c.
| unsigned int reg_class_size[N_REG_CLASSES] |
Definition at line 171 of file regclass.c.
| enum reg_class reg_class_subclasses[N_REG_CLASSES][N_REG_CLASSES] |
| enum reg_class reg_class_subunion[N_REG_CLASSES][N_REG_CLASSES] |
Definition at line 184 of file regclass.c.
| enum reg_class reg_class_superclasses[N_REG_CLASSES][N_REG_CLASSES] |
| enum reg_class reg_class_superunion[N_REG_CLASSES][N_REG_CLASSES] |
Definition at line 189 of file regclass.c.
struct reg_info_data* reg_info_head [static] |
Definition at line 259 of file regclass.c.
unsigned int reg_n_max [static] |
Definition at line 2152 of file regclass.c.
| const char* reg_names[] = REGISTER_NAMES |
Definition at line 193 of file regclass.c.
Definition at line 865 of file regclass.c.
struct reg_pref* reg_pref_buffer [static] |
Definition at line 869 of file regclass.c.
| enum machine_mode reg_raw_mode[FIRST_PSEUDO_REGISTER] |
Definition at line 204 of file regclass.c.
size_t regno_allocated [static] |
Definition at line 2151 of file regclass.c.
| HARD_REG_SET regs_invalidated_by_call |
Definition at line 144 of file regclass.c.
short* renumber [static] |
Definition at line 2150 of file regclass.c.
1.5.6