void end_function_semantics (void) { int idx; int ir_idx; int new_end_idx; size_offset_type new_size; int new_start_idx; int ptr; int rslt_idx; size_offset_type result; size_offset_type size; TRACE (Func_Entry, "end_function_semantics", NULL); rslt_idx = ATP_RSLT_IDX(SCP_ATTR_IDX(curr_scp_idx)); if (!ATD_IM_A_DOPE(rslt_idx) && ATD_ARRAY_IDX(rslt_idx) == NULL_IDX && TYP_TYPE(ATD_TYPE_IDX(rslt_idx)) != Structure && TYP_TYPE(ATD_TYPE_IDX(rslt_idx)) != Character) { ir_idx = SH_IR_IDX(curr_stmt_sh_idx); # ifdef _SEPARATE_FUNCTION_RETURNS if (SCP_ALT_ENTRY_CNT(curr_scp_idx) != 0 && SCP_RETURN_LABEL(curr_scp_idx) != NULL_IDX) { /* change return to goto to multiple return code block */ IR_OPR(ir_idx) = Br_Uncond_Opr; IR_FLD_R(ir_idx) = AT_Tbl_Idx; IR_IDX_R(ir_idx) = SCP_RETURN_LABEL(curr_scp_idx); IR_LINE_NUM_R(ir_idx) = IR_LINE_NUM(ir_idx); IR_COL_NUM_R(ir_idx) = IR_COL_NUM(ir_idx); } else { IR_FLD_R(ir_idx) = AT_Tbl_Idx; IR_IDX_R(ir_idx) = rslt_idx; IR_LINE_NUM_R(ir_idx) = IR_LINE_NUM(ir_idx); IR_COL_NUM_R(ir_idx) = IR_COL_NUM(ir_idx); } # else IR_FLD_R(ir_idx) = AT_Tbl_Idx; IR_LINE_NUM_R(ir_idx) = IR_LINE_NUM(ir_idx); IR_COL_NUM_R(ir_idx) = IR_COL_NUM(ir_idx); if (SCP_ENTRY_IDX(curr_scp_idx)) { idx = SCP_ENTRY_IDX(curr_scp_idx); size = stor_bit_size_of(rslt_idx, TRUE, FALSE); /* KAY - Do not allow n$pes in alternate entry function results */ while (idx != NULL_IDX) { new_size = stor_bit_size_of(ATP_RSLT_IDX(AL_ATTR_IDX(idx)), TRUE, FALSE); size_offset_logical_calc(&new_size, &size, Gt_Opr, &result); if (THIS_IS_TRUE(result.constant, result.type_idx)) { size = new_size; rslt_idx = ATP_RSLT_IDX(AL_ATTR_IDX(idx)); } idx = AL_NEXT_IDX(idx); } } IR_IDX_R(ir_idx) = rslt_idx; # endif } else { /* Set the function result even if this ends up looking like a */ /* subroutine. This lets PDGCS get function not defined messages right.*/ ir_idx = SH_IR_IDX(curr_stmt_sh_idx); IR_FLD_R(ir_idx) = AT_Tbl_Idx; IR_LINE_NUM_R(ir_idx) = IR_LINE_NUM(ir_idx); IR_COL_NUM_R(ir_idx) = IR_COL_NUM(ir_idx); IR_IDX_R(ir_idx) = rslt_idx; } ptr = SCP_EXIT_IR_SH_IDX(curr_scp_idx); if (ptr) { while (SH_NEXT_IDX(ptr) != NULL_IDX) { ptr = SH_NEXT_IDX(ptr); } copy_entry_exit_sh_list(SCP_EXIT_IR_SH_IDX(curr_scp_idx), ptr, &new_start_idx, &new_end_idx); insert_sh_chain_before(new_start_idx); } if (opt_flags.inline_lvl > Inline_Lvl_0 || opt_flags.modinline || dump_flags.preinline) { ir_idx = gen_directive_ir(Inline_Cdir_Opr); } if (cdir_switches.bounds) { ir_idx = gen_directive_ir(Nobounds_Cdir_Opr); } TRACE (Func_Exit, "end_function_semantics", NULL); return; } /* end_function_semantics */
void gen_default_init_code(int attr_idx) { expr_arg_type expr_desc; operator_type operator; opnd_type opnd; TRACE (Func_Entry, "gen_default_init_code", NULL); if (AT_DCL_ERR(attr_idx)) { goto EXIT; } if (SB_RUNTIME_INIT(ATD_STOR_BLK_IDX(attr_idx))) { /* The var is on the stack, or is automatic, a darg or a func */ /* result. Generate runtime code for the initialization. */ operator = Asg_Opr; } else if (ATD_IN_COMMON(attr_idx)) { operator = Init_Opr; # if 0 # if defined(_TARGET_OS_SOLARIS) || (defined(_TARGET_OS_IRIX) || defined(_TARGET_OS_LINUX) || defined(_TARGET_OS_DARWIN)) func = gen_common_dv_init; # else func = gen_static_dv_whole_def; # endif # endif } else { operator = Init_Opr; } if (!ATD_IM_A_DOPE(attr_idx) && TYP_TYPE(ATD_TYPE_IDX(attr_idx)) == Structure && ATT_DEFAULT_INITIALIZED(TYP_IDX(ATD_TYPE_IDX(attr_idx))) && !AT_DCL_ERR(TYP_IDX(ATD_TYPE_IDX(attr_idx)))) { OPND_FLD(opnd) = AT_Tbl_Idx; OPND_IDX(opnd) = attr_idx; OPND_LINE_NUM(opnd) = AT_DEF_LINE(attr_idx); OPND_COL_NUM(opnd) = AT_DEF_COLUMN(attr_idx); # if defined(_F_MINUS_MINUS) if (ATD_ARRAY_IDX(attr_idx) || ATD_PE_ARRAY_IDX(attr_idx)) { # else if (ATD_ARRAY_IDX(attr_idx)) { # endif gen_whole_subscript(&opnd, &expr_desc); } process_all_initialized_cpnts(&opnd, TYP_IDX(ATD_TYPE_IDX(attr_idx)), operator); } EXIT: TRACE (Func_Exit, "gen_default_init_code", NULL); return; } /* gen_default_init_code */ /******************************************************************************\ |* *| |* Description: *| |* recursively go through all components of a structure to look for *| |* default initialization. Then call the supplied routine func for *| |* processing. *| |* *| |* Input parameters: *| |* left_opnd - current base of sub-object reference. *| |* type_idx - defined type attr. *| |* operator - Whether to use Init_Opr or Asg_Opr. *| |* *| |* Output parameters: *| |* NONE *| |* *| |* Returns: *| |* NOTHING *| |* *| \******************************************************************************/ static void process_all_initialized_cpnts(opnd_type *left_opnd, int type_idx, operator_type operator) { int attr_idx; expr_arg_type expr_desc; opnd_type expr_opnd; int init_idx; int ir_idx; int list_idx; opnd_type opnd; int sn_idx; TRACE (Func_Entry, "process_all_initialized_cpnts", NULL); sn_idx = ATT_FIRST_CPNT_IDX(type_idx); while (sn_idx != NULL_IDX) { attr_idx = SN_ATTR_IDX(sn_idx); /* A component */ if (ATD_CPNT_INIT_IDX(attr_idx) != NULL_IDX) { NTR_IR_TBL(ir_idx); IR_OPR(ir_idx) = Struct_Opr; IR_TYPE_IDX(ir_idx) = ATD_TYPE_IDX(attr_idx); IR_LINE_NUM(ir_idx) = AT_DEF_LINE(attr_idx); IR_COL_NUM(ir_idx) = AT_DEF_COLUMN(attr_idx); COPY_OPND(IR_OPND_L(ir_idx), (*left_opnd)); IR_FLD_R(ir_idx) = AT_Tbl_Idx; IR_IDX_R(ir_idx) = attr_idx; IR_LINE_NUM_R(ir_idx) = AT_DEF_LINE(attr_idx); IR_COL_NUM_R(ir_idx) = AT_DEF_COLUMN(attr_idx); if (IR_FLD_L(ir_idx) == IR_Tbl_Idx) { IR_RANK(ir_idx) = IR_RANK(IR_IDX_L(ir_idx)); } NTR_IR_TBL(init_idx); IR_OPR(init_idx) = operator; IR_LINE_NUM(init_idx) = AT_DEF_LINE(attr_idx); IR_COL_NUM(init_idx) = AT_DEF_COLUMN(attr_idx); IR_TYPE_IDX(init_idx) = TYPELESS_DEFAULT_TYPE; IR_FLD_L(init_idx) = IR_Tbl_Idx; IR_IDX_L(init_idx) = ir_idx; IR_LINE_NUM_L(init_idx)= AT_DEF_LINE(attr_idx); IR_COL_NUM_L(init_idx) = AT_DEF_COLUMN(attr_idx); if (operator == Asg_Opr) { if (ATD_FLD(attr_idx) == IR_Tbl_Idx) { /* This should be an Init_Opr */ if (IR_OPR(ATD_CPNT_INIT_IDX(attr_idx)) != Init_Opr) { PRINTMSG(AT_DEF_LINE(attr_idx), 626, Internal, AT_DEF_COLUMN(attr_idx), "An Init Opr", "process_all_initialized_cpnts"); } COPY_OPND(IR_OPND_R(init_idx), IL_OPND(IR_IDX_R(ATD_CPNT_INIT_IDX(attr_idx)))); } else { IR_IDX_R(init_idx) = ATD_CPNT_INIT_IDX(attr_idx); IR_FLD_R(init_idx) = (fld_type) ATD_FLD(attr_idx); IR_LINE_NUM_R(init_idx) = AT_DEF_LINE(attr_idx); IR_COL_NUM_R(init_idx) = AT_DEF_COLUMN(attr_idx); } if (ATD_ARRAY_IDX(attr_idx) != NULL_IDX || TYP_TYPE(ATD_TYPE_IDX(attr_idx)) == Character) { xref_state = CIF_No_Usage_Rec; expr_desc.rank = 0; OPND_FLD(expr_opnd) = IR_Tbl_Idx; OPND_IDX(expr_opnd) = ir_idx;; if (expr_semantics(&expr_opnd, &expr_desc)) { COPY_OPND(IR_OPND_L(init_idx), expr_opnd); } } gen_sh(After, Assignment_Stmt, AT_DEF_LINE(attr_idx), AT_DEF_COLUMN(attr_idx), FALSE, FALSE, TRUE); } else { /* Init_Opr */ if (ATD_FLD(attr_idx) == IR_Tbl_Idx) { /* This should be an Init_Opr */ if (IR_OPR(ATD_CPNT_INIT_IDX(attr_idx)) != Init_Opr) { PRINTMSG(AT_DEF_LINE(attr_idx), 626, Internal, AT_DEF_COLUMN(attr_idx), "An Init Opr", "process_all_initialized_cpnts"); } IR_FLD_R(init_idx) = IL_Tbl_Idx; IR_IDX_R(init_idx) = IR_IDX_R(ATD_CPNT_INIT_IDX(attr_idx)); IR_LIST_CNT_R(init_idx) = 3; } else { NTR_IR_LIST_TBL(list_idx); IR_FLD_R(init_idx) = IL_Tbl_Idx; IR_IDX_R(init_idx) = list_idx; IR_LIST_CNT_R(init_idx) = 3; IL_IDX(list_idx) = ATD_CPNT_INIT_IDX(attr_idx); IL_FLD(list_idx) = (fld_type) ATD_FLD(attr_idx); IL_LINE_NUM(list_idx) = AT_DEF_LINE(attr_idx); IL_COL_NUM(list_idx) = AT_DEF_COLUMN(attr_idx); NTR_IR_LIST_TBL(IL_NEXT_LIST_IDX(list_idx)); IL_PREV_LIST_IDX(IL_NEXT_LIST_IDX(list_idx)) = list_idx; list_idx = IL_NEXT_LIST_IDX(list_idx); IL_FLD(list_idx) = CN_Tbl_Idx; IL_IDX(list_idx) = CN_INTEGER_ONE_IDX; IL_LINE_NUM(list_idx) = AT_DEF_LINE(attr_idx); IL_COL_NUM(list_idx) = AT_DEF_COLUMN(attr_idx); NTR_IR_LIST_TBL(IL_NEXT_LIST_IDX(list_idx)); IL_PREV_LIST_IDX(IL_NEXT_LIST_IDX(list_idx)) = list_idx; list_idx = IL_NEXT_LIST_IDX(list_idx); IL_FLD(list_idx) = CN_Tbl_Idx; IL_IDX(list_idx) = CN_INTEGER_ZERO_IDX; IL_LINE_NUM(list_idx) = AT_DEF_LINE(attr_idx); IL_COL_NUM(list_idx) = AT_DEF_COLUMN(attr_idx); } gen_sh(After, Type_Init_Stmt, AT_DEF_LINE(attr_idx), AT_DEF_COLUMN(attr_idx), FALSE, FALSE, TRUE); } SH_P2_SKIP_ME(curr_stmt_sh_idx) = TRUE; SH_IR_IDX(curr_stmt_sh_idx) = init_idx; } else if (TYP_TYPE(ATD_TYPE_IDX(attr_idx)) == Structure && ATT_DEFAULT_INITIALIZED(TYP_IDX(ATD_TYPE_IDX(attr_idx)))) { NTR_IR_TBL(ir_idx); IR_OPR(ir_idx) = Struct_Opr; IR_TYPE_IDX(ir_idx) = ATD_TYPE_IDX(attr_idx); IR_LINE_NUM(ir_idx) = AT_DEF_LINE(attr_idx); IR_COL_NUM(ir_idx) = AT_DEF_COLUMN(attr_idx); COPY_OPND(IR_OPND_L(ir_idx), (*left_opnd)); IR_FLD_R(ir_idx) = AT_Tbl_Idx; IR_IDX_R(ir_idx) = attr_idx; IR_LINE_NUM_R(ir_idx) = AT_DEF_LINE(attr_idx); IR_COL_NUM_R(ir_idx) = AT_DEF_COLUMN(attr_idx); OPND_FLD(opnd) = IR_Tbl_Idx; OPND_IDX(opnd) = ir_idx; if (IR_FLD_L(ir_idx) == IR_Tbl_Idx) { IR_RANK(ir_idx) = IR_RANK(IR_IDX_L(ir_idx)); } if (ATD_ARRAY_IDX(attr_idx) != NULL_IDX) { gen_whole_subscript(&opnd, &expr_desc); } process_all_initialized_cpnts(&opnd, TYP_IDX(ATD_TYPE_IDX(attr_idx)), operator); } sn_idx = SN_SIBLING_LINK(sn_idx); } TRACE (Func_Exit, "process_all_initialized_cpnts", NULL); return; } /* process_all_initialized_cpnts */