* expression.cc (eval): Replace dummy argument with NULL.
(eval_maybe_dot): Check for a NULL result section pointer. (Symbol_expression::value): Likewise. (Dot_expression::value): Likewise. (BINARY_EXPRESSION): Likewise. (Max_expression::value): Likewise. (Min_expression::value): Likewise. (Absolute_expression::value): Likewise. (Addr_expression::value_from_output_section): Likewise. (Loaddddr_expression::value_from_output_section): Likewise. (Segment_start_expression::value): Likewise. * script-sections.cc (Sections_elememt_dot_assignment::finalize_symbols): Replace dummy argument with NULL. (Sections_elememt_dot_assignment::set_section_addresses): Likewise. (Output_data_expression::do_write_to_buffer): Likewise. (Output_section_definition::finalize_symbols): Likewise. (Output_section_definition::set_section_addresses): Likewise.
This commit is contained in:
parent
f6d250ce5c
commit
bacff3ab9c
3 changed files with 60 additions and 35 deletions
|
@ -1,3 +1,25 @@
|
||||||
|
2010-10-01 Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
|
* expression.cc (eval): Replace dummy argument with NULL.
|
||||||
|
(eval_maybe_dot): Check for a NULL result section pointer.
|
||||||
|
(Symbol_expression::value): Likewise.
|
||||||
|
(Dot_expression::value): Likewise.
|
||||||
|
(BINARY_EXPRESSION): Likewise.
|
||||||
|
(Max_expression::value): Likewise.
|
||||||
|
(Min_expression::value): Likewise.
|
||||||
|
(Absolute_expression::value): Likewise.
|
||||||
|
(Addr_expression::value_from_output_section): Likewise.
|
||||||
|
(Loaddddr_expression::value_from_output_section): Likewise.
|
||||||
|
(Segment_start_expression::value): Likewise.
|
||||||
|
* script-sections.cc
|
||||||
|
(Sections_elememt_dot_assignment::finalize_symbols): Replace dummy
|
||||||
|
argument with NULL.
|
||||||
|
(Sections_elememt_dot_assignment::set_section_addresses):
|
||||||
|
Likewise.
|
||||||
|
(Output_data_expression::do_write_to_buffer): Likewise.
|
||||||
|
(Output_section_definition::finalize_symbols): Likewise.
|
||||||
|
(Output_section_definition::set_section_addresses): Likewise.
|
||||||
|
|
||||||
2010-09-30 Doug Kwan <dougkwan@google.com>
|
2010-09-30 Doug Kwan <dougkwan@google.com>
|
||||||
|
|
||||||
* gold/testsuite/arm_branch_out_of_range.sh: Fix broken tests.
|
* gold/testsuite/arm_branch_out_of_range.sh: Fix broken tests.
|
||||||
|
@ -5,7 +27,7 @@
|
||||||
2010-09-28 Sriraman Tallam <tmsriram@google.com>
|
2010-09-28 Sriraman Tallam <tmsriram@google.com>
|
||||||
|
|
||||||
* target.h (Target::can_icf_inline_merge_sections): New virtual
|
* target.h (Target::can_icf_inline_merge_sections): New virtual
|
||||||
function.
|
function.
|
||||||
* x86_64.cc (Target__x86_64::can_icf_inline_merge_sections): New
|
* x86_64.cc (Target__x86_64::can_icf_inline_merge_sections): New
|
||||||
virtual function.
|
virtual function.
|
||||||
* i386.cc (Target_i386::can_icf_inline_merge_sections): New
|
* i386.cc (Target_i386::can_icf_inline_merge_sections): New
|
||||||
|
|
|
@ -76,9 +76,8 @@ uint64_t
|
||||||
Expression::eval(const Symbol_table* symtab, const Layout* layout,
|
Expression::eval(const Symbol_table* symtab, const Layout* layout,
|
||||||
bool check_assertions)
|
bool check_assertions)
|
||||||
{
|
{
|
||||||
Output_section* dummy;
|
|
||||||
return this->eval_maybe_dot(symtab, layout, check_assertions,
|
return this->eval_maybe_dot(symtab, layout, check_assertions,
|
||||||
false, 0, NULL, &dummy, NULL);
|
false, 0, NULL, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Evaluate an expression which may refer to the dot symbol.
|
// Evaluate an expression which may refer to the dot symbol.
|
||||||
|
@ -115,7 +114,8 @@ Expression::eval_maybe_dot(const Symbol_table* symtab, const Layout* layout,
|
||||||
|
|
||||||
// We assume the value is absolute, and only set this to a section
|
// We assume the value is absolute, and only set this to a section
|
||||||
// if we find a section relative reference.
|
// if we find a section relative reference.
|
||||||
*result_section_pointer = NULL;
|
if (result_section_pointer != NULL)
|
||||||
|
*result_section_pointer = NULL;
|
||||||
eei.result_section_pointer = result_section_pointer;
|
eei.result_section_pointer = result_section_pointer;
|
||||||
|
|
||||||
eei.result_alignment_pointer = result_alignment_pointer;
|
eei.result_alignment_pointer = result_alignment_pointer;
|
||||||
|
@ -181,7 +181,8 @@ Symbol_expression::value(const Expression_eval_info* eei)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
*eei->result_section_pointer = sym->output_section();
|
if (eei->result_section_pointer != NULL)
|
||||||
|
*eei->result_section_pointer = sym->output_section();
|
||||||
|
|
||||||
if (parameters->target().get_size() == 32)
|
if (parameters->target().get_size() == 32)
|
||||||
return eei->symtab->get_sized_symbol<32>(sym)->value();
|
return eei->symtab->get_sized_symbol<32>(sym)->value();
|
||||||
|
@ -217,7 +218,8 @@ Dot_expression::value(const Expression_eval_info* eei)
|
||||||
"SECTIONS clause"));
|
"SECTIONS clause"));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
*eei->result_section_pointer = eei->dot_section;
|
if (eei->result_section_pointer != NULL)
|
||||||
|
*eei->result_section_pointer = eei->dot_section;
|
||||||
return eei->dot_value;
|
return eei->dot_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -406,7 +408,8 @@ class Binary_expression : public Expression
|
||||||
&right_alignment); \
|
&right_alignment); \
|
||||||
if (KEEP_RIGHT && left_section == NULL && right_section != NULL) \
|
if (KEEP_RIGHT && left_section == NULL && right_section != NULL) \
|
||||||
{ \
|
{ \
|
||||||
*eei->result_section_pointer = right_section; \
|
if (eei->result_section_pointer != NULL) \
|
||||||
|
*eei->result_section_pointer = right_section; \
|
||||||
if (eei->result_alignment_pointer != NULL) \
|
if (eei->result_alignment_pointer != NULL) \
|
||||||
*eei->result_alignment_pointer = right_alignment; \
|
*eei->result_alignment_pointer = right_alignment; \
|
||||||
} \
|
} \
|
||||||
|
@ -414,7 +417,8 @@ class Binary_expression : public Expression
|
||||||
&& left_section != NULL \
|
&& left_section != NULL \
|
||||||
&& right_section == NULL) \
|
&& right_section == NULL) \
|
||||||
{ \
|
{ \
|
||||||
*eei->result_section_pointer = left_section; \
|
if (eei->result_section_pointer != NULL) \
|
||||||
|
*eei->result_section_pointer = left_section; \
|
||||||
if (eei->result_alignment_pointer != NULL) \
|
if (eei->result_alignment_pointer != NULL) \
|
||||||
*eei->result_alignment_pointer = right_alignment; \
|
*eei->result_alignment_pointer = right_alignment; \
|
||||||
} \
|
} \
|
||||||
|
@ -602,7 +606,10 @@ class Max_expression : public Binary_expression
|
||||||
uint64_t right_alignment;
|
uint64_t right_alignment;
|
||||||
uint64_t right = this->right_value(eei, &right_section, &right_alignment);
|
uint64_t right = this->right_value(eei, &right_section, &right_alignment);
|
||||||
if (left_section == right_section)
|
if (left_section == right_section)
|
||||||
*eei->result_section_pointer = left_section;
|
{
|
||||||
|
if (eei->result_section_pointer != NULL)
|
||||||
|
*eei->result_section_pointer = left_section;
|
||||||
|
}
|
||||||
else if ((left_section != NULL || right_section != NULL)
|
else if ((left_section != NULL || right_section != NULL)
|
||||||
&& parameters->options().relocatable())
|
&& parameters->options().relocatable())
|
||||||
gold_warning(_("max applied to section relative value"));
|
gold_warning(_("max applied to section relative value"));
|
||||||
|
@ -650,7 +657,10 @@ class Min_expression : public Binary_expression
|
||||||
uint64_t right_alignment;
|
uint64_t right_alignment;
|
||||||
uint64_t right = this->right_value(eei, &right_section, &right_alignment);
|
uint64_t right = this->right_value(eei, &right_section, &right_alignment);
|
||||||
if (left_section == right_section)
|
if (left_section == right_section)
|
||||||
*eei->result_section_pointer = left_section;
|
{
|
||||||
|
if (eei->result_section_pointer != NULL)
|
||||||
|
*eei->result_section_pointer = left_section;
|
||||||
|
}
|
||||||
else if ((left_section != NULL || right_section != NULL)
|
else if ((left_section != NULL || right_section != NULL)
|
||||||
&& parameters->options().relocatable())
|
&& parameters->options().relocatable())
|
||||||
gold_warning(_("min applied to section relative value"));
|
gold_warning(_("min applied to section relative value"));
|
||||||
|
@ -756,10 +766,10 @@ class Absolute_expression : public Unary_expression
|
||||||
uint64_t
|
uint64_t
|
||||||
value(const Expression_eval_info* eei)
|
value(const Expression_eval_info* eei)
|
||||||
{
|
{
|
||||||
Output_section* dummy;
|
uint64_t ret = this->arg_value(eei, NULL);
|
||||||
uint64_t ret = this->arg_value(eei, &dummy);
|
|
||||||
// Force the value to be absolute.
|
// Force the value to be absolute.
|
||||||
*eei->result_section_pointer = NULL;
|
if (eei->result_section_pointer != NULL)
|
||||||
|
*eei->result_section_pointer = NULL;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -873,7 +883,8 @@ class Addr_expression : public Section_expression
|
||||||
value_from_output_section(const Expression_eval_info* eei,
|
value_from_output_section(const Expression_eval_info* eei,
|
||||||
Output_section* os)
|
Output_section* os)
|
||||||
{
|
{
|
||||||
*eei->result_section_pointer = os;
|
if (eei->result_section_pointer != NULL)
|
||||||
|
*eei->result_section_pointer = os;
|
||||||
return os->address();
|
return os->address();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1078,7 +1089,8 @@ class Loadaddr_expression : public Section_expression
|
||||||
return os->load_address();
|
return os->load_address();
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
*eei->result_section_pointer = os;
|
if (eei->result_section_pointer != NULL)
|
||||||
|
*eei->result_section_pointer = os;
|
||||||
return os->address();
|
return os->address();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1220,10 +1232,10 @@ Segment_start_expression::value(const Expression_eval_info* eei)
|
||||||
return parameters->options().Tbss();
|
return parameters->options().Tbss();
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Output_section* dummy;
|
uint64_t ret = this->arg_value(eei, NULL);
|
||||||
uint64_t ret = this->arg_value(eei, &dummy);
|
|
||||||
// Force the value to be absolute.
|
// Force the value to be absolute.
|
||||||
*eei->result_section_pointer = NULL;
|
if (eei->result_section_pointer != NULL)
|
||||||
|
*eei->result_section_pointer = NULL;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -656,9 +656,8 @@ class Sections_element_dot_assignment : public Sections_element
|
||||||
// We ignore the section of the result because outside of an
|
// We ignore the section of the result because outside of an
|
||||||
// output section definition the dot symbol is always considered
|
// output section definition the dot symbol is always considered
|
||||||
// to be absolute.
|
// to be absolute.
|
||||||
Output_section* dummy;
|
|
||||||
*dot_value = this->val_->eval_with_dot(symtab, layout, true, *dot_value,
|
*dot_value = this->val_->eval_with_dot(symtab, layout, true, *dot_value,
|
||||||
NULL, &dummy, NULL);
|
NULL, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update the dot symbol while setting section addresses.
|
// Update the dot symbol while setting section addresses.
|
||||||
|
@ -667,9 +666,8 @@ class Sections_element_dot_assignment : public Sections_element
|
||||||
uint64_t* dot_value, uint64_t* dot_alignment,
|
uint64_t* dot_value, uint64_t* dot_alignment,
|
||||||
uint64_t* load_address)
|
uint64_t* load_address)
|
||||||
{
|
{
|
||||||
Output_section* dummy;
|
|
||||||
*dot_value = this->val_->eval_with_dot(symtab, layout, false, *dot_value,
|
*dot_value = this->val_->eval_with_dot(symtab, layout, false, *dot_value,
|
||||||
NULL, &dummy, dot_alignment);
|
NULL, NULL, dot_alignment);
|
||||||
*load_address = *dot_value;
|
*load_address = *dot_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -980,10 +978,9 @@ Output_data_expression::do_write(Output_file* of)
|
||||||
void
|
void
|
||||||
Output_data_expression::do_write_to_buffer(unsigned char* buf)
|
Output_data_expression::do_write_to_buffer(unsigned char* buf)
|
||||||
{
|
{
|
||||||
Output_section* dummy;
|
|
||||||
uint64_t val = this->val_->eval_with_dot(this->symtab_, this->layout_,
|
uint64_t val = this->val_->eval_with_dot(this->symtab_, this->layout_,
|
||||||
true, this->dot_value_,
|
true, this->dot_value_,
|
||||||
this->dot_section_, &dummy, NULL);
|
this->dot_section_, NULL, NULL);
|
||||||
|
|
||||||
if (parameters->target().is_big_endian())
|
if (parameters->target().is_big_endian())
|
||||||
this->endian_write_to_buffer<true>(val, buf);
|
this->endian_write_to_buffer<true>(val, buf);
|
||||||
|
@ -2052,18 +2049,15 @@ Output_section_definition::finalize_symbols(Symbol_table* symtab,
|
||||||
uint64_t address = *dot_value;
|
uint64_t address = *dot_value;
|
||||||
if (this->address_ != NULL)
|
if (this->address_ != NULL)
|
||||||
{
|
{
|
||||||
Output_section* dummy;
|
|
||||||
address = this->address_->eval_with_dot(symtab, layout, true,
|
address = this->address_->eval_with_dot(symtab, layout, true,
|
||||||
*dot_value, NULL,
|
*dot_value, NULL,
|
||||||
&dummy, NULL);
|
NULL, NULL);
|
||||||
}
|
}
|
||||||
if (this->align_ != NULL)
|
if (this->align_ != NULL)
|
||||||
{
|
{
|
||||||
Output_section* dummy;
|
|
||||||
uint64_t align = this->align_->eval_with_dot(symtab, layout, true,
|
uint64_t align = this->align_->eval_with_dot(symtab, layout, true,
|
||||||
*dot_value,
|
*dot_value, NULL,
|
||||||
NULL,
|
NULL, NULL);
|
||||||
&dummy, NULL);
|
|
||||||
address = align_address(address, align);
|
address = align_address(address, align);
|
||||||
}
|
}
|
||||||
*dot_value = address;
|
*dot_value = address;
|
||||||
|
@ -2131,9 +2125,8 @@ Output_section_definition::set_section_addresses(Symbol_table* symtab,
|
||||||
address = *dot_value;
|
address = *dot_value;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Output_section* dummy;
|
|
||||||
address = this->address_->eval_with_dot(symtab, layout, true,
|
address = this->address_->eval_with_dot(symtab, layout, true,
|
||||||
*dot_value, NULL, &dummy,
|
*dot_value, NULL, NULL,
|
||||||
dot_alignment);
|
dot_alignment);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2178,11 +2171,9 @@ Output_section_definition::set_section_addresses(Symbol_table* symtab,
|
||||||
this->evaluated_load_address_ = address;
|
this->evaluated_load_address_ = address;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Output_section* dummy;
|
|
||||||
uint64_t laddr =
|
uint64_t laddr =
|
||||||
this->load_address_->eval_with_dot(symtab, layout, true, *dot_value,
|
this->load_address_->eval_with_dot(symtab, layout, true, *dot_value,
|
||||||
this->output_section_, &dummy,
|
this->output_section_, NULL, NULL);
|
||||||
NULL);
|
|
||||||
if (this->output_section_ != NULL)
|
if (this->output_section_ != NULL)
|
||||||
this->output_section_->set_load_address(laddr);
|
this->output_section_->set_load_address(laddr);
|
||||||
this->evaluated_load_address_ = laddr;
|
this->evaluated_load_address_ = laddr;
|
||||||
|
|
Loading…
Reference in a new issue