static void ChkParms( void ) { PARMPTR parm; PARMPTR prev_parm; SYM_HANDLE sym_handle; SYM_HANDLE prev_sym_handle; TYPEPTR typ; CurFunc->u.func.locals = SYM_NULL; CurFunc->u.func.parms = SYM_NULL; typ = *(CurFunc->sym_type->u.fn.parms); SKIP_TYPEDEFS( typ ); if( typ->decl_type != TYPE_VOID ) { prev_sym_handle = SYM_NULL; prev_parm = NULL; for( parm = ParmList; parm != NULL; parm = parm->next_parm ) { if( parm->sym.name == NULL ) { parm->sym.name = ".J"; parm->sym.flags |= SYM_REFERENCED; } if( parm->sym.name[0] == '\0' ) { parm->sym.name = ".I"; InvDecl(); } if( parm->sym.sym_type == NULL ) { parm->sym.sym_type = TypeDefault(); } /* make sure name not already defined in this SymLevel */ sym_handle = SymAdd( parm->sym.info.hash, &parm->sym ); if( prev_parm == NULL ) { CurFunc->u.func.parms = sym_handle; } else { prev_parm->sym.handle = sym_handle; SymReplace( &prev_parm->sym, prev_sym_handle ); CMemFree( prev_parm ); } prev_parm = parm; prev_sym_handle = sym_handle; parm->sym.flags |= SYM_DEFINED | SYM_ASSIGNED; parm->sym.attribs.is_parm = true; } if( prev_parm != NULL ) { #if _CPU == 370 { SYM_ENTRY var_parm; if( VarParm( CurFunc ) ) { typ = ArrayNode( GetType( TYPE_CHAR ) ); typ->u.array->dimension = 160; sym_handle = GetNewSym( &var_parm, 'V', typ, SC_AUTO ); SymReplace( &var_parm, sym_handle ); prev_parm->sym.handle = sym_handle; } } #endif SymReplace( &prev_parm->sym, prev_sym_handle ); CMemFree( prev_parm ); } } }
void StaticInit( SYMPTR sym, SYM_HANDLE sym_handle ) { TYPEPTR typ; TYPEPTR struct_typ; TYPEPTR last_array; GenStaticDataQuad( sym_handle ); CompFlags.non_zero_data = 0; struct_typ = NULL; last_array = NULL; typ = sym->sym_type; /* Follow chain of typedefs/structs/arrays */ for( ;; ) { SKIP_TYPEDEFS( typ ); if( typ->decl_type == TYPE_ARRAY ) { /* Remember innermost array type */ last_array = typ; typ = typ->object; } else if( typ->decl_type == TYPE_STRUCT ) { FIELDPTR field; /* Remember outermost structure type */ if( struct_typ == NULL ) { /* last_array cannot to be outside this struct! */ last_array = NULL; struct_typ = typ; } /* Determine the type of the last field in the struct */ field = typ->u.tag->u.field_list; if( field == NULL ) break; /* 10-sep-92 */ while( field->next_field != NULL ) field = field->next_field; typ = field->field_type; } else { break; } } typ = last_array; /* If innermost array had unspecified dimension, create new types whose * dimensions will be determined by number of initializers */ if( (typ != NULL) && typ->u.array->unspecified_dim ) { if( struct_typ == NULL ) { /* Array was not inside struct */ sym->sym_type = ArrayNode( typ->object ); /* 18-oct-88 */ sym->sym_type->u.array->unspecified_dim = TRUE; } else { typ = sym->sym_type; /* Create new structure type */ sym->sym_type = TypeNode( TYPE_STRUCT, ArrayNode( last_array->object ) ); sym->sym_type->u.tag = struct_typ->u.tag; struct_typ = sym->sym_type; /* Create new array types as necessary */ for( ;; ) { SKIP_TYPEDEFS( typ ); if( typ->decl_type != TYPE_ARRAY ) break; sym->sym_type = ArrayNode( sym->sym_type ); sym->sym_type->u.array->unspecified_dim = TRUE; typ = typ->object; } typ = last_array; } } else { struct_typ = NULL; } SymReplace( sym, sym_handle ); /* 31-aug-88 */ InitSymData( sym->sym_type, sym->sym_type, 0 ); SymGet( sym, sym_handle ); /* 31-aug-88 */ if( struct_typ != NULL ) { /* 17-mar-92 */ /* Structure contains an unspecified length array as last field */ struct_typ->object->u.array->dimension = typ->u.array->dimension; typ->u.array->unspecified_dim = TRUE; typ->u.array->dimension = 0; /* Reset back to 0 */ } if( sym->u.var.segment == 0 ) { /* 01-dec-91 */ SetFarHuge( sym, 0 ); SetSegment( sym ); SetSegAlign( sym ); /* 02-feb-92 */ } }