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