/* This module handles expression trees.
Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
- 2001, 2002, 2003, 2004, 2005, 2006, 2007
+ 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
Free Software Foundation, Inc.
Written by Steve Chamberlain of Cygnus Support <sac@cygnus.com>.
- This file is part of GLD, the Gnu Linker.
+ This file is part of the GNU Binutils.
- GLD is free software; you can redistribute it and/or modify
+ This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
- GLD is distributed in the hope that it will be useful,
+ This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with GLD; see the file COPYING. If not, write to the Free
- Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
- 02110-1301, USA. */
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+ MA 02110-1301, USA. */
+
/* This module is in charge of working out the contents of expressions.
{ ADDR, "ADDR" },
{ LOADADDR, "LOADADDR" },
{ CONSTANT, "CONSTANT" },
- { MAX_K, "MAX_K" },
+ { ABSOLUTE, "ABSOLUTE" },
+ { MAX_K, "MAX" },
+ { MIN_K, "MIN" },
+ { ASSERT_K, "ASSERT" },
{ REL, "relocatable" },
{ DATA_SEGMENT_ALIGN, "DATA_SEGMENT_ALIGN" },
{ DATA_SEGMENT_RELRO_END, "DATA_SEGMENT_RELRO_END" },
exp_fold_tree_1 (tree->binary.lhs);
/* The SEGMENT_START operator is special because its first
- operand is a string, not the name of a symbol. */
+ operand is a string, not the name of a symbol. Note that the
+ operands have been swapped, so binary.lhs is second (default)
+ operand, binary.rhs is first operand. */
if (expld.result.valid_p && tree->type.node_code == SEGMENT_START)
{
const char *segment_name;
seg->used = TRUE;
expld.result.value = seg->value;
expld.result.str = NULL;
- expld.result.section = NULL;
+ expld.result.section = expld.section;
break;
}
}
return;
}
else if (expld.section != bfd_abs_section_ptr
- && expld.result.section == bfd_abs_section_ptr
- && (tree->type.node_code == '+'
- || tree->type.node_code == '-'))
+ && expld.result.section == bfd_abs_section_ptr
+ && (tree->type.node_code == '+'
+ || tree->type.node_code == '-'))
{
/* Keep the section of the lhs term. */
expld.result.section = lhs.section;
break;
case DATA_SEGMENT_ALIGN:
+ expld.dataseg.relro = exp_dataseg_relro_start;
if (expld.phase != lang_first_phase_enum
&& expld.section == bfd_abs_section_ptr
&& (expld.dataseg.phase == exp_dataseg_none
break;
case DATA_SEGMENT_RELRO_END:
+ expld.dataseg.relro = exp_dataseg_relro_end;
if (expld.phase != lang_first_phase_enum
&& (expld.dataseg.phase == exp_dataseg_align_seen
|| expld.dataseg.phase == exp_dataseg_adjust
/* Don't find the real header size if only marking sections;
The bfd function may cache incorrect data. */
if (expld.phase != lang_mark_phase_enum)
- hdr_size = bfd_sizeof_headers (output_bfd, &link_info);
+ hdr_size = bfd_sizeof_headers (link_info.output_bfd, &link_info);
new_abs (hdr_size);
}
break;
int def_iteration
= lang_symbol_definition_iteration (tree->name.name);
- h = bfd_wrapped_link_hash_lookup (output_bfd, &link_info,
+ h = bfd_wrapped_link_hash_lookup (link_info.output_bfd,
+ &link_info,
tree->name.name,
FALSE, FALSE, TRUE);
expld.result.value = (h != NULL
|| h->type == bfd_link_hash_common)
&& (def_iteration == lang_statement_iteration
|| def_iteration == -1));
- expld.result.section = bfd_abs_section_ptr;
+ expld.result.section = expld.section;
expld.result.valid_p = TRUE;
}
break;
{
struct bfd_link_hash_entry *h;
- h = bfd_wrapped_link_hash_lookup (output_bfd, &link_info,
+ h = bfd_wrapped_link_hash_lookup (link_info.output_bfd,
+ &link_info,
tree->name.name,
TRUE, FALSE, TRUE);
if (!h)
else
{
exp_fold_tree_1 (os->load_base);
- make_abs ();
+ if (expld.result.valid_p)
+ make_abs ();
}
}
}
bfd_vma val;
if (tree->type.node_code == SIZEOF)
- val = os->bfd_section->size / bfd_octets_per_byte (output_bfd);
+ val = (os->bfd_section->size
+ / bfd_octets_per_byte (link_info.output_bfd));
else
val = (bfd_vma)1 << os->bfd_section->alignment_power;
if (expld.result.valid_p)
return expld.result.value;
else if (name != NULL && expld.phase != lang_mark_phase_enum)
- einfo (_("%F%S nonconstant expression for %s\n"), name);
+ einfo (_("%F%S: nonconstant expression for %s\n"), name);
}
return def;
}
if (!expld.result.valid_p)
{
if (name != NULL && expld.phase != lang_mark_phase_enum)
- einfo (_("%F%S nonconstant expression for %s\n"), name);
+ einfo (_("%F%S: nonconstant expression for %s\n"), name);
return def;
}