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 + -
显示快捷键?