srconv.c
来自「基于4个mips核的noc设计」· C语言 代码 · 共 2,032 行 · 第 1/3 页
C
2,032 行
case T_FLOAT: dbt.btype = BTYPE_FLOAT; dbt.fptype = FPTYPE_SINGLE; break; case T_DOUBLE: dbt.btype = BTYPE_FLOAT; dbt.fptype = FPTYPE_DOUBLE; break; case T_LNGDBL: dbt.btype = BTYPE_FLOAT; dbt.fptype = FPTYPE_EXTENDED; break; case T_UCHAR: dbt.btype = BTYPE_CHAR; dbt.sign = SIGN_UNSIGNED; dbt.fptype = FPTYPE_NOTSPEC; break; case T_USHORT: case T_UINT: case T_ULONG: dbt.btype = BTYPE_INT; dbt.sign = SIGN_UNSIGNED; dbt.fptype = FPTYPE_NOTSPEC; break; } dbt.bitsize = type->size; dbt.neg = 0x1001; sysroff_swap_dbt_out (file, &dbt); break; } case coff_pointer_type: { struct IT_dpt dpt; walk_tree_type_1 (sfile, symbol, type->u.pointer.points_to, nest + 1); dpt.neg = 0x1001; sysroff_swap_dpt_out (file, &dpt); break; } case coff_function_type: { struct IT_dfp dfp; struct coff_symbol *param; dfp.end = 0; dfp.spare = 0; dfp.nparams = type->u.function.parameters->nvars; dfp.neg = 0x1001; walk_tree_type_1 (sfile, symbol, type->u.function.function_returns, nest + 1); sysroff_swap_dfp_out (file, &dfp); for (param = type->u.function.parameters->vars_head; param; param = param->next) { walk_tree_symbol (sfile, 0, param, nest); } dfp.end = 1; sysroff_swap_dfp_out (file, &dfp); break; } case coff_structdef_type: { struct IT_dbt dbt; struct IT_dds dds; struct coff_symbol *member; dds.spare = 0; dbt.btype = BTYPE_STRUCT; dbt.bitsize = type->size; dbt.sign = SIGN_UNSPEC; dbt.fptype = FPTYPE_NOTSPEC; dbt.sid = get_member_id (type->u.astructdef.idx); dbt.neg = 0x1001; sysroff_swap_dbt_out (file, &dbt); dds.end = 0; dds.neg = 0x1001; sysroff_swap_dds_out (file, &dds); for (member = type->u.astructdef.elements->vars_head; member; member = member->next) { walk_tree_symbol (sfile, 0, member, nest + 1); } dds.end = 1; sysroff_swap_dds_out (file, &dds); } break; case coff_structref_type: { struct IT_dbt dbt; dbt.btype = BTYPE_TAG; dbt.bitsize = type->size; dbt.sign = SIGN_UNSPEC; dbt.fptype = FPTYPE_NOTSPEC; if (type->u.astructref.ref) { dbt.sid = get_member_id (type->u.astructref.ref->number); } else { dbt.sid = 0; } dbt.neg = 0x1001; sysroff_swap_dbt_out (file, &dbt); } break; case coff_array_type: { struct IT_dar dar; int j; int dims = 1; /* Only output one dimension at a time */ dar.dims = dims; dar.variable = nints (dims); dar.subtype = nints (dims); dar.spare = nints (dims); dar.max_variable = nints (dims); dar.maxspare = nints (dims); dar.max = nints (dims); dar.min_variable = nints (dims); dar.min = nints (dims); dar.minspare = nints (dims); dar.neg = 0x1001; dar.length = type->size / type->u.array.dim; for (j = 0; j < dims; j++) { dar.variable[j] = VARIABLE_FIXED; dar.subtype[j] = SUB_INTEGER; dar.spare[j] = 0; dar.max_variable[j] = 0; dar.max[j] = type->u.array.dim; dar.min_variable[j] = 0; dar.min[j] = 1; /* Why isn't this 0 ? */ } walk_tree_type_1 (sfile, symbol, type->u.array.array_of, nest + 1); sysroff_swap_dar_out (file, &dar); } break; case coff_enumdef_type: { struct IT_dbt dbt; struct IT_den den; struct coff_symbol *member; dbt.btype = BTYPE_ENUM; dbt.bitsize = type->size; dbt.sign = SIGN_UNSPEC; dbt.fptype = FPTYPE_NOTSPEC; dbt.sid = get_member_id (type->u.aenumdef.idx); dbt.neg = 0x1001; sysroff_swap_dbt_out (file, &dbt); den.end = 0; den.neg = 0x1001; den.spare = 0; sysroff_swap_den_out (file, &den); for (member = type->u.aenumdef.elements->vars_head; member; member = member->next) { walk_tree_symbol (sfile, 0, member, nest + 1); } den.end = 1; sysroff_swap_den_out (file, &den); } break; break; case coff_enumref_type: { struct IT_dbt dbt; dbt.btype = BTYPE_TAG; dbt.bitsize = type->size; dbt.sign = SIGN_UNSPEC; dbt.fptype = FPTYPE_NOTSPEC; dbt.sid = get_member_id (type->u.aenumref.ref->number); dbt.neg = 0x1001; sysroff_swap_dbt_out (file, &dbt); } break; default: abort (); }}/* Obsolete ? static void dty_start () { struct IT_dty dty; dty.end = 0; dty.neg = 0x1001; dty.spare = 0; sysroff_swap_dty_out (file, &dty); } static void dty_stop () { struct IT_dty dty; dty.end = 0; dty.neg = 0x1001; dty.end = 1; sysroff_swap_dty_out (file, &dty); } static void dump_tree_structure (sfile, symbol, type, nest) struct coff_sfile *sfile; struct coff_symbol *symbol; struct coff_type *type; int nest; { if (symbol->type->type == coff_function_type) { } } */static voidwalk_tree_type (sfile, symbol, type, nest) struct coff_sfile *sfile; struct coff_symbol *symbol; struct coff_type *type; int nest;{ if (symbol->type->type == coff_function_type) { struct IT_dty dty; dty.end = 0; dty.neg = 0x1001; sysroff_swap_dty_out (file, &dty); walk_tree_type_1 (sfile, symbol, type, nest); dty.end = 1; sysroff_swap_dty_out (file, &dty); wr_dps_start (sfile, symbol->where->section, symbol->type->u.function.code, BLOCK_TYPE_FUNCTION, nest); wr_dps_start (sfile, symbol->where->section, symbol->type->u.function.code, BLOCK_TYPE_BLOCK, nest); walk_tree_scope (symbol->where->section, sfile, symbol->type->u.function.code, nest + 1, BLOCK_TYPE_BLOCK); wr_dps_end (symbol->where->section, symbol->type->u.function.code, BLOCK_TYPE_BLOCK); wr_dps_end (symbol->where->section, symbol->type->u.function.code, BLOCK_TYPE_FUNCTION); } else { struct IT_dty dty; dty.end = 0; dty.neg = 0x1001; sysroff_swap_dty_out (file, &dty); walk_tree_type_1 (sfile, symbol, type, nest); dty.end = 1; sysroff_swap_dty_out (file, &dty); }}static voidwalk_tree_symbol (sfile, section, symbol, nest) struct coff_sfile *sfile; struct coff_section *section ATTRIBUTE_UNUSED; struct coff_symbol *symbol; int nest;{ struct IT_dsy dsy; memset(&dsy, 0, sizeof(dsy)); dsy.nesting = nest; switch (symbol->type->type) { case coff_function_type: dsy.type = STYPE_FUNC; dsy.assign = 1; break; case coff_structref_type: case coff_pointer_type: case coff_array_type: case coff_basic_type: case coff_enumref_type: dsy.type = STYPE_VAR; dsy.assign = 1; break; case coff_enumdef_type: dsy.type = STYPE_TAG; dsy.assign = 0; dsy.magic = 2; break; case coff_structdef_type: dsy.type = STYPE_TAG; dsy.assign = 0; dsy.magic = symbol->type->u.astructdef.isstruct ? 0 : 1; break; case coff_secdef_type: return; default: abort (); } if (symbol->where->where == coff_where_member_of_struct) { dsy.assign = 0; dsy.type = STYPE_MEMBER; } if (symbol->where->where == coff_where_member_of_enum) { dsy.type = STYPE_ENUM; dsy.assign = 0; dsy.evallen = 4; dsy.evalue = symbol->where->offset; } if (symbol->type->type == coff_structdef_type || symbol->where->where == coff_where_entag || symbol->where->where == coff_where_strtag) { dsy.snumber = get_member_id (symbol->number); } else { dsy.snumber = get_ordinary_id (symbol->number); } dsy.sname = symbol->name[0] == '_' ? symbol->name + 1 : symbol->name; switch (symbol->visible->type) { case coff_vis_common: case coff_vis_ext_def: dsy.ainfo = AINFO_STATIC_EXT_DEF; break; case coff_vis_ext_ref: dsy.ainfo = AINFO_STATIC_EXT_REF; break; case coff_vis_int_def: dsy.ainfo = AINFO_STATIC_INT; break; case coff_vis_auto: case coff_vis_autoparam: dsy.ainfo = AINFO_AUTO; break; case coff_vis_register: case coff_vis_regparam: dsy.ainfo = AINFO_REG; break; break; case coff_vis_tag: case coff_vis_member_of_struct: case coff_vis_member_of_enum: break; default: abort (); } dsy.dlength = symbol->type->size; switch (symbol->where->where) { case coff_where_memory: dsy.section = symbol->where->section->number;#ifdef FOOP dsy.section = 0;#endif break; case coff_where_member_of_struct: case coff_where_member_of_enum: case coff_where_stack: case coff_where_register: case coff_where_unknown: case coff_where_strtag: case coff_where_entag: case coff_where_typedef: break; default: abort (); } switch (symbol->where->where) { case coff_where_memory: dsy.address = symbol->where->offset - find_base (sfile, symbol->where->section); break; case coff_where_stack: dsy.address = symbol->where->offset; break; case coff_where_member_of_struct: if (symbol->where->bitsize) { int bits = (symbol->where->offset * 8 + symbol->where->bitoffset); dsy.bitunit = 1; dsy.field_len = symbol->where->bitsize; dsy.field_off = (bits / 32) * 4; dsy.field_bitoff = bits % 32; } else { dsy.bitunit = 0; dsy.field_len = symbol->type->size; dsy.field_off = symbol->where->offset; } break; case coff_where_member_of_enum: /* dsy.bitunit = 0; dsy.field_len = symbol->type->size; dsy.field_off = symbol->where->offset; */ break; case coff_where_register: case coff_where_unknown: case coff_where_strtag: case coff_where_entag: case coff_where_typedef: break; default: abort (); } if (symbol->where->where == coff_where_register) dsy.reg = rnames[symbol->where->offset]; switch (symbol->visible->type) { case coff_vis_common: /* We do this 'cause common C symbols are treated as extdefs */ case coff_vis_ext_def: case coff_vis_ext_ref: dsy.ename = symbol->name; break; case coff_vis_regparam: case coff_vis_autoparam: dsy.type = STYPE_PARAMETER; break; case coff_vis_int_def: case coff_vis_auto: case coff_vis_register: case coff_vis_tag: case coff_vis_member_of_struct: case coff_vis_member_of_enum: break; default: abort (); } dsy.sfn = 0; dsy.sln = 2; dsy.neg = 0x1001; sysroff_swap_dsy_out (file, &dsy); walk_tree_type (sfile, symbol, symbol->type, nest);}static voidwalk_tree_scope (section, sfile, scope, nest, type) struct coff_section *section; struct coff_sfile *sfile; struct coff_scope *scope; int nest; int type;{ struct coff_symbol *vars; struct coff_scope *child; if (scope->vars_head || (scope->list_head && scope->list_head->vars_head)) { wr_dps_start (sfile, section, scope, type, nest); if (nest == 0) wr_globals (tree, sfile, nest + 1); for (vars = scope->vars_head; vars; vars = vars->next) { walk_tree_symbol (sfile, section, vars, nest); } for (child = scope->list_head; child; child = child->next) { walk_tree_scope (section, sfile, child, nest + 1, BLOCK_TYPE_BLOCK); } wr_dps_end (section, scope, type); }}static voidwalk_tree_sfile (section, sfile) struct coff_section *section; struct coff_sfile *sfile;{ walk_tree_scope (section, sfile, sfile->scope, 0, BLOCK_TYPE_COMPUNIT);}static voidwr_program_structure (p, sfile) struct coff_ofile *p; struct coff_sfile *sfile;{ walk_tree_sfile (p->sections + 4, sfile);}static voidwr_du (p, sfile, n) struct coff_ofile *p; struct coff_sfile *sfile; int n;{ struct IT_du du; int lim;#if 0 struct coff_symbol *symbol; static int incit = 0x500000; int used = 0;#endif int i; int j; unsigned int *lowest = (unsigned *) nints (p->nsections); unsigned int *highest = (unsigned *) nints (p->nsections); du.format = bfd_get_file_flags (abfd) & EXEC_P ? 0 : 1; du.optimized = 0; du.stackfrmt = 0; du.spare = 0; du.unit = n; du.sections = p->nsections - 1; du.san = (int *) xcalloc (sizeof (int), du.sections); du.address = nints (du.sections); du.length = nints (du.sections); for (i = 0; i < du.sections; i++) { lowest[i] = ~0; highest[i] = 0; } /* Look through all the symbols and try and work out the extents in this source file */#if 0 for (symbol = sfile->scope->vars_head; symbol; symbol = symbol->next) { if (symbol->type->type == coff_secdef_type) { unsigned int low = symbol->where->offset; unsigned int high = symbol->where->offset + symbol->type->size - 1; struct coff_section *section = symbol->where->section; int sn = section->number; if (low < lowest[sn]) lowest[sn] = low; if (high > highest[sn]) highest[sn] = high; } } for (i = 0; i < du.sections; i++) { if (highest[i] == 0) { lowest[i] = highest[i] = incit; } du.san[used] = i; du.length[used] = highest[i] - lowest[i]; du.address[used] = bfd_get_file_flags (abfd) & EXEC_P ? lowest[i] : 0; if (debug) { printf (" section %6s 0x%08x..0x%08x\n", p->sections[i + 1].name, lowest[i], highest[i]); } used++; }#endif lim = du.sections; for (j = 0; j < lim; j++) { int src = j; int dst = j; du.san[dst] = dst; if (sfile->section[src].init) { du.length[dst] = sfile->section[src].high - sfile->section[src].low + 1; du.address[dst] = sfile->section[src].low; } else { du.length[dst] = 0; du.address[dst] = 0; } if (debug) { if (sfile->section[src].parent) { printf (" section %6s 0x%08x..0x%08x\n", sfile->section[src].parent->name, du.address[dst], du.address[dst] + du.length[dst] - 1); } } du.sections = dst + 1; } du.tool = "c_gcc"; du.date = DATE; sysroff_swap_du_out (file, &du);}static voidwr_dus (p, sfile) struct coff_ofile *p ATTRIBUTE_UNUSED; struct coff_sfile *sfile;{ struct IT_dus dus; dus.efn = 0x1001; dus.ns = 1; /* p->nsources; sac 14 jul 94 */ dus.drb = nints (dus.ns); dus.fname = (char **) xcalloc (sizeof (char *), dus.ns); dus.spare = nints (dus.ns); dus.ndir = 0; /* Find the filenames */#if 0 i = 0; for (sfile = p->source_head; sfile; sfile = sfile->next) { dus.drb[i] = 0; dus.spare[i] = 0; dus.fname[i] = sfile->name; i++;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?