aboutsummaryrefslogtreecommitdiff
path: root/gold/script.h
diff options
context:
space:
mode:
authorCary Coutant <ccoutant@google.com>2011-10-31 22:51:03 +0000
committerCary Coutant <ccoutant@google.com>2011-10-31 22:51:03 +0000
commit286adcf4f8c8bb15d46dca29dd7e9a8c935f5e3e (patch)
tree906b1740ca3a14e1c98515db9662b67fc532b2ca /gold/script.h
parent9634ed06a66c3693045bb8b3bf86b43942239dd8 (diff)
downloadgdb-286adcf4f8c8bb15d46dca29dd7e9a8c935f5e3e.zip
gdb-286adcf4f8c8bb15d46dca29dd7e9a8c935f5e3e.tar.gz
gdb-286adcf4f8c8bb15d46dca29dd7e9a8c935f5e3e.tar.bz2
PR gold/13023
* expression.cc (Expression::eval_with_dot): Add is_section_dot_assignment parameter. (Expression::eval_maybe_dot): Likewise. Adjust value when rhs is absolute and assigning to dot within a section. * script-sections.cc (Output_section_element_assignment::set_section_addresses): Pass dot_section to set_if_absolute. (Output_section_element_dot_assignment::finalize_symbols): Pass TRUE as is_section_dot_assignment flag to eval_with_dot. (Output_section_element_dot_assignment::set_section_addresses): Likewise. * script.cc (Symbol_assignment::set_if_absolute): Add dot_section parameter. Also set value if relative to dot_section; set the symbol's output_section. * script.h (Expression::eval_with_dot): Add is_section_dot_assignment parameter. Adjust all callers. (Expression::eval_maybe_dot): Likewise. (Symbol_assignment::set_if_absolute): Add dot_section parameter. Adjust all callers. * testsuite/script_test_2.t: Test assignment of an absolute value to dot within an output section element.
Diffstat (limited to 'gold/script.h')
-rw-r--r--gold/script.h24
1 files changed, 16 insertions, 8 deletions
diff --git a/gold/script.h b/gold/script.h
index 73079a4..f41f438 100644
--- a/gold/script.h
+++ b/gold/script.h
@@ -90,20 +90,28 @@ class Expression
// the section address. If RESULT_ALIGNMENT is not NULL, this sets
// *RESULT_ALIGNMENT to the alignment of the value of that alignment
// is larger than *RESULT_ALIGNMENT; this will only be non-zero if
- // this is an ALIGN expression.
+ // this is an ALIGN expression. If IS_SECTION_DOT_ASSIGMENT is true,
+ // we are evaluating an assignment to dot within an output section,
+ // and an absolute value should be interpreted as an offset within
+ // the section.
uint64_t
eval_with_dot(const Symbol_table*, const Layout*, bool check_assertions,
uint64_t dot_value, Output_section* dot_section,
- Output_section** result_section, uint64_t* result_alignment);
+ Output_section** result_section, uint64_t* result_alignment,
+ bool is_section_dot_assignment);
// Return the value of an expression which may or may not be
// permitted to refer to the dot symbol, depending on
- // is_dot_available.
+ // is_dot_available. If IS_SECTION_DOT_ASSIGMENT is true,
+ // we are evaluating an assignment to dot within an output section,
+ // and an absolute value should be interpreted as an offset within
+ // the section.
uint64_t
eval_maybe_dot(const Symbol_table*, const Layout*, bool check_assertions,
bool is_dot_available, uint64_t dot_value,
Output_section* dot_section,
- Output_section** result_section, uint64_t* result_alignment);
+ Output_section** result_section, uint64_t* result_alignment,
+ bool is_section_dot_assignment);
// Print the expression to the FILE. This is for debugging.
virtual void
@@ -339,12 +347,12 @@ class Symbol_assignment
finalize_with_dot(Symbol_table*, const Layout*, uint64_t dot_value,
Output_section* dot_section);
- // Set the symbol value, but only if the value is absolute. This is
- // used while processing a SECTIONS clause. We assume that dot is
- // an absolute value here. We do not check assertions.
+ // Set the symbol value, but only if the value is absolute or relative to
+ // DOT_SECTION. This is used while processing a SECTIONS clause.
+ // We assume that dot is an absolute value here. We do not check assertions.
void
set_if_absolute(Symbol_table*, const Layout*, bool is_dot_available,
- uint64_t dot_value);
+ uint64_t dot_value, Output_section* dot_section);
const std::string&
name() const