ldexp.c

来自「基于4个mips核的noc设计」· C语言 代码 · 共 993 行 · 第 1/2 页

C
993
字号
    case etree_rel:      if (allocation_done != lang_final_phase_enum)	result.valid_p = false;      else	result = new_rel ((tree->rel.value			   + tree->rel.section->output_section->vma			   + tree->rel.section->output_offset),			  current_section);      break;    case etree_assert:      result = exp_fold_tree (tree->assert_s.child,			      current_section,			      allocation_done, dot, dotp);      if (result.valid_p)	{	  if (! result.value)	    einfo ("%F%P: %s\n", tree->assert_s.message);	  return result;	}      break;    case etree_unary:      result = exp_fold_tree (tree->unary.child,			      current_section,			      allocation_done, dot, dotp);      if (result.valid_p)	{	  switch (tree->type.node_code)	    {	    case ALIGN_K:	      if (allocation_done != lang_first_phase_enum)		result = new_rel_from_section (ALIGN_N (dot, result.value),					       current_section);	      else		result.valid_p = false;	      break;	    case ABSOLUTE:	      if (allocation_done != lang_first_phase_enum && result.valid_p)		{		  result.value += result.section->bfd_section->vma;		  result.section = abs_output_section;		}	      else		result.valid_p = false;	      break;	    case '~':	      make_abs (&result);	      result.value = ~result.value;	      break;	    case '!':	      make_abs (&result);	      result.value = !result.value;	      break;	    case '-':	      make_abs (&result);	      result.value = -result.value;	      break;	    case NEXT:	      /* Return next place aligned to value.  */	      if (allocation_done == lang_allocating_phase_enum)		{		  make_abs (&result);		  result.value = ALIGN_N (dot, result.value);		}	      else		result.valid_p = false;	      break;	    default:	      FAIL ();	      break;	    }	}      break;    case etree_trinary:      result = exp_fold_tree (tree->trinary.cond, current_section,			      allocation_done, dot, dotp);      if (result.valid_p)	result = exp_fold_tree ((result.value				 ? tree->trinary.lhs				 : tree->trinary.rhs),				current_section,				allocation_done, dot, dotp);      break;    case etree_binary:      result = fold_binary (tree, current_section, allocation_done,			    dot, dotp);      break;    case etree_assign:    case etree_provide:    case etree_provided:      if (tree->assign.dst[0] == '.' && tree->assign.dst[1] == 0)	{	  /* Assignment to dot can only be done during allocation */	  if (tree->type.node_class != etree_assign)	    einfo (_("%F%S can not PROVIDE assignment to location counter\n"));	  if (allocation_done == lang_allocating_phase_enum	      || (allocation_done == lang_final_phase_enum		  && current_section == abs_output_section))	    {	      result = exp_fold_tree (tree->assign.src,				      current_section,				      lang_allocating_phase_enum, dot,				      dotp);	      if (! result.valid_p)		einfo (_("%F%S invalid assignment to location counter\n"));	      else		{		  if (current_section == NULL)		    einfo (_("%F%S assignment to location counter invalid outside of SECTION\n"));		  else		    {		      bfd_vma nextdot;		      nextdot = (result.value				 + current_section->bfd_section->vma);		      if (nextdot < dot			  && current_section != abs_output_section)			{			  einfo (_("%F%S cannot move location counter backwards (from %V to %V)\n"),				 dot, nextdot);			}		      else			*dotp = nextdot;		    }		}	    }	}      else	{	  result = exp_fold_tree (tree->assign.src,				  current_section, allocation_done,				  dot, dotp);	  if (result.valid_p)	    {	      boolean create;	      struct bfd_link_hash_entry *h;	      if (tree->type.node_class == etree_assign)		create = true;	      else		create = false;	      h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,					create, false, false);	      if (h == (struct bfd_link_hash_entry *) NULL)		{		  if (tree->type.node_class == etree_assign)		    einfo (_("%P%F:%s: hash creation failed\n"),			   tree->assign.dst);		}	      else if (tree->type.node_class == etree_provide		       && h->type != bfd_link_hash_undefined		       && h->type != bfd_link_hash_common)		{		  /* Do nothing.  The symbol was defined by some		     object.  */		}	      else		{		  /* FIXME: Should we worry if the symbol is already		     defined?  */		  h->type = bfd_link_hash_defined;		  h->u.def.value = result.value;		  h->u.def.section = result.section->bfd_section;		  if (tree->type.node_class == etree_provide)		    tree->type.node_class = etree_provided;		}	    }	}      break;    case etree_name:      result = fold_name (tree, current_section, allocation_done, dot);      break;    default:      FAIL ();      break;    }  return result;}static etree_value_typeexp_fold_tree_no_dot (tree, current_section, allocation_done)     etree_type *tree;     lang_output_section_statement_type *current_section;     lang_phase_type allocation_done;{  return exp_fold_tree (tree, current_section, allocation_done,			(bfd_vma) 0, (bfd_vma *) NULL);}etree_type *exp_binop (code, lhs, rhs)     int code;     etree_type *lhs;     etree_type *rhs;{  etree_type value, *new;  etree_value_type r;  value.type.node_code = code;  value.binary.lhs = lhs;  value.binary.rhs = rhs;  value.type.node_class = etree_binary;  r = exp_fold_tree_no_dot (&value,			    abs_output_section,			    lang_first_phase_enum);  if (r.valid_p)    {      return exp_intop (r.value);    }  new = (etree_type *) stat_alloc (sizeof (new->binary));  memcpy ((char *) new, (char *) &value, sizeof (new->binary));  return new;}etree_type *exp_trinop (code, cond, lhs, rhs)     int code;     etree_type *cond;     etree_type *lhs;     etree_type *rhs;{  etree_type value, *new;  etree_value_type r;  value.type.node_code = code;  value.trinary.lhs = lhs;  value.trinary.cond = cond;  value.trinary.rhs = rhs;  value.type.node_class = etree_trinary;  r = exp_fold_tree_no_dot (&value,			    (lang_output_section_statement_type *) NULL,			    lang_first_phase_enum);  if (r.valid_p)    {      return exp_intop (r.value);    }  new = (etree_type *) stat_alloc (sizeof (new->trinary));  memcpy ((char *) new, (char *) &value, sizeof (new->trinary));  return new;}etree_type *exp_unop (code, child)     int code;     etree_type *child;{  etree_type value, *new;  etree_value_type r;  value.unary.type.node_code = code;  value.unary.child = child;  value.unary.type.node_class = etree_unary;  r = exp_fold_tree_no_dot (&value, abs_output_section,			    lang_first_phase_enum);  if (r.valid_p)    {      return exp_intop (r.value);    }  new = (etree_type *) stat_alloc (sizeof (new->unary));  memcpy ((char *) new, (char *) &value, sizeof (new->unary));  return new;}etree_type *exp_nameop (code, name)     int code;     CONST char *name;{  etree_type value, *new;  etree_value_type r;  value.name.type.node_code = code;  value.name.name = name;  value.name.type.node_class = etree_name;  r = exp_fold_tree_no_dot (&value,			    (lang_output_section_statement_type *) NULL,			    lang_first_phase_enum);  if (r.valid_p)    {      return exp_intop (r.value);    }  new = (etree_type *) stat_alloc (sizeof (new->name));  memcpy ((char *) new, (char *) &value, sizeof (new->name));  return new;}etree_type *exp_assop (code, dst, src)     int code;     CONST char *dst;     etree_type *src;{  etree_type value, *new;  value.assign.type.node_code = code;  value.assign.src = src;  value.assign.dst = dst;  value.assign.type.node_class = etree_assign;#if 0  if (exp_fold_tree_no_dot (&value, &result))    {      return exp_intop (result);    }#endif  new = (etree_type *) stat_alloc (sizeof (new->assign));  memcpy ((char *) new, (char *) &value, sizeof (new->assign));  return new;}/* Handle PROVIDE.  */etree_type *exp_provide (dst, src)     const char *dst;     etree_type *src;{  etree_type *n;  n = (etree_type *) stat_alloc (sizeof (n->assign));  n->assign.type.node_code = '=';  n->assign.type.node_class = etree_provide;  n->assign.src = src;  n->assign.dst = dst;  return n;}/* Handle ASSERT.  */etree_type *exp_assert (exp, message)     etree_type *exp;     const char *message;{  etree_type *n;  n = (etree_type *) stat_alloc (sizeof (n->assert_s));  n->assert_s.type.node_code = '!';  n->assert_s.type.node_class = etree_assert;  n->assert_s.child = exp;  n->assert_s.message = message;  return n;}voidexp_print_tree (tree)     etree_type *tree;{  switch (tree->type.node_class)    {    case etree_value:      minfo ("0x%v", tree->value.value);      return;    case etree_rel:      if (tree->rel.section->owner != NULL)	minfo ("%B:", tree->rel.section->owner);      minfo ("%s+0x%v", tree->rel.section->name, tree->rel.value);      return;    case etree_assign:#if 0      if (tree->assign.dst->sdefs != (asymbol *) NULL)	{	  fprintf (config.map_file, "%s (%x) ", tree->assign.dst->name,		   tree->assign.dst->sdefs->value);	}      else	{	  fprintf (config.map_file, "%s (UNDEFINED)", tree->assign.dst->name);	}#endif      fprintf (config.map_file, "%s", tree->assign.dst);      exp_print_token (tree->type.node_code);      exp_print_tree (tree->assign.src);      break;    case etree_provide:    case etree_provided:      fprintf (config.map_file, "PROVIDE (%s, ", tree->assign.dst);      exp_print_tree (tree->assign.src);      fprintf (config.map_file, ")");      break;    case etree_binary:      fprintf (config.map_file, "(");      exp_print_tree (tree->binary.lhs);      exp_print_token (tree->type.node_code);      exp_print_tree (tree->binary.rhs);      fprintf (config.map_file, ")");      break;    case etree_trinary:      exp_print_tree (tree->trinary.cond);      fprintf (config.map_file, "?");      exp_print_tree (tree->trinary.lhs);      fprintf (config.map_file, ":");      exp_print_tree (tree->trinary.rhs);      break;    case etree_unary:      exp_print_token (tree->unary.type.node_code);      if (tree->unary.child)	{	  fprintf (config.map_file, "(");	  exp_print_tree (tree->unary.child);	  fprintf (config.map_file, ")");	}      break;    case etree_assert:      fprintf (config.map_file, "ASSERT (");      exp_print_tree (tree->assert_s.child);      fprintf (config.map_file, ", %s)", tree->assert_s.message);      break;    case etree_undef:      fprintf (config.map_file, "????????");      break;    case etree_name:      if (tree->type.node_code == NAME)	{	  fprintf (config.map_file, "%s", tree->name.name);	}      else	{	  exp_print_token (tree->type.node_code);	  if (tree->name.name)	    fprintf (config.map_file, "(%s)", tree->name.name);	}      break;    default:      FAIL ();      break;    }}bfd_vmaexp_get_vma (tree, def, name, allocation_done)     etree_type *tree;     bfd_vma def;     char *name;     lang_phase_type allocation_done;{  etree_value_type r;  if (tree != NULL)    {      r = exp_fold_tree_no_dot (tree, abs_output_section, allocation_done);      if (! r.valid_p && name != NULL)	einfo (_("%F%S nonconstant expression for %s\n"), name);      return r.value;    }  else    return def;}intexp_get_value_int (tree, def, name, allocation_done)     etree_type *tree;     int def;     char *name;     lang_phase_type allocation_done;{  return (int) exp_get_vma (tree, (bfd_vma) def, name, allocation_done);}bfd_vmaexp_get_abs_int (tree, def, name, allocation_done)     etree_type *tree;     int def ATTRIBUTE_UNUSED;     char *name;     lang_phase_type allocation_done;{  etree_value_type res;  res = exp_fold_tree_no_dot (tree, abs_output_section, allocation_done);  if (res.valid_p)    {      res.value += res.section->bfd_section->vma;    }  else    {      einfo (_("%F%S non constant expression for %s\n"), name);    }  return res.value;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?