mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-08-06 06:45:56 +08:00
2010-04-15 Andrew Haley <aph@redhat.com>
* emultempl/armelf.em (merge_exidx_entries): New variable. (OPTION_NO_MERGE_EXIDX_ENTRIES): New definition. ("no-merge-exidx-entries"): New option. * ld.texinfo (merge-exidx-entries): Document this option. 2010-04-15 Andrew Haley <aph@redhat.com> * bfd-in.h (elf32_arm_fix_exidx_coverage): Add new flag: merge_exidx_entries. * bfd-in2.h: Likewise. * elf32-arm.c (elf32_arm_fix_exidx_coverage): Likewise. Use it to control merging of exidx entries. 2010-04-15 Andrew Haley <aph@redhat.com> * options.h (merge_exidx_entries): New option. * arm.cc (class Arm_exidx_fixup): Add new arg, merge_exidx_entries. (class Arm_exidx_fixup::merge_exidx_entries_): New member. (Output_section::fix_exidx_coverage): Add new arg, merge_exidx_entries. (Target_arm::merge_exidx_entries): New function. (process_exidx_entry): Don't merge if merge_exidx_entries_ is false. (Arm_output_section::fix_exidx_coverage): Pass merge_exidx_entries to Arm_exidx_fixup constructor. Add new arg, merge_exidx_entries. (Target_arm::fix_exidx_coverage): pass merge_exidx_entries to Arm_output_section::fix_exidx_coverage.
This commit is contained in:
27
gold/arm.cc
27
gold/arm.cc
@ -1226,10 +1226,12 @@ class Arm_input_section : public Output_relaxed_input_section
|
||||
class Arm_exidx_fixup
|
||||
{
|
||||
public:
|
||||
Arm_exidx_fixup(Output_section* exidx_output_section)
|
||||
Arm_exidx_fixup(Output_section* exidx_output_section,
|
||||
bool merge_exidx_entries = true)
|
||||
: exidx_output_section_(exidx_output_section), last_unwind_type_(UT_NONE),
|
||||
last_inlined_entry_(0), last_input_section_(NULL),
|
||||
section_offset_map_(NULL), first_output_text_section_(NULL)
|
||||
section_offset_map_(NULL), first_output_text_section_(NULL),
|
||||
merge_exidx_entries_(merge_exidx_entries)
|
||||
{ }
|
||||
|
||||
~Arm_exidx_fixup()
|
||||
@ -1301,6 +1303,8 @@ class Arm_exidx_fixup
|
||||
// Output section for the text section which is linked to the first exidx
|
||||
// input in output.
|
||||
Output_section* first_output_text_section_;
|
||||
|
||||
bool merge_exidx_entries_;
|
||||
};
|
||||
|
||||
// Arm output section class. This is defined mainly to add a number of
|
||||
@ -1340,7 +1344,8 @@ class Arm_output_section : public Output_section
|
||||
void
|
||||
fix_exidx_coverage(Layout* layout,
|
||||
const Text_section_list& sorted_text_section,
|
||||
Symbol_table* symtab);
|
||||
Symbol_table* symtab,
|
||||
bool merge_exidx_entries);
|
||||
|
||||
private:
|
||||
// For convenience.
|
||||
@ -2261,6 +2266,11 @@ class Target_arm : public Sized_target<32, big_endian>
|
||||
fix_cortex_a8() const
|
||||
{ return this->fix_cortex_a8_; }
|
||||
|
||||
// Whether we merge exidx entries in debuginfo.
|
||||
bool
|
||||
merge_exidx_entries() const
|
||||
{ return parameters->options().merge_exidx_entries(); }
|
||||
|
||||
// Whether we fix R_ARM_V4BX relocation.
|
||||
// 0 - do not fix
|
||||
// 1 - replace with MOV instruction (armv4 target)
|
||||
@ -5186,7 +5196,8 @@ Arm_exidx_fixup::process_exidx_entry(uint32_t second_word)
|
||||
else if ((second_word & 0x80000000) != 0)
|
||||
{
|
||||
// Inlined unwinding data. Merge if equal to previous.
|
||||
delete_entry = (this->last_unwind_type_ == UT_INLINED_ENTRY
|
||||
delete_entry = (merge_exidx_entries_
|
||||
&& this->last_unwind_type_ == UT_INLINED_ENTRY
|
||||
&& this->last_inlined_entry_ == second_word);
|
||||
this->last_unwind_type_ = UT_INLINED_ENTRY;
|
||||
this->last_inlined_entry_ = second_word;
|
||||
@ -5553,7 +5564,8 @@ void
|
||||
Arm_output_section<big_endian>::fix_exidx_coverage(
|
||||
Layout* layout,
|
||||
const Text_section_list& sorted_text_sections,
|
||||
Symbol_table* symtab)
|
||||
Symbol_table* symtab,
|
||||
bool merge_exidx_entries)
|
||||
{
|
||||
// We should only do this for the EXIDX output section.
|
||||
gold_assert(this->type() == elfcpp::SHT_ARM_EXIDX);
|
||||
@ -5585,7 +5597,7 @@ Arm_output_section<big_endian>::fix_exidx_coverage(
|
||||
known_input_sections.insert(Section_id(p->relobj(), p->shndx()));
|
||||
}
|
||||
|
||||
Arm_exidx_fixup exidx_fixup(this);
|
||||
Arm_exidx_fixup exidx_fixup(this, merge_exidx_entries);
|
||||
|
||||
// Go over the sorted text sections.
|
||||
Section_id_set processed_input_sections;
|
||||
@ -10884,7 +10896,8 @@ Target_arm<big_endian>::fix_exidx_coverage(
|
||||
arm_output_section->append_text_sections_to_list(&sorted_text_sections);
|
||||
}
|
||||
|
||||
exidx_section->fix_exidx_coverage(layout, sorted_text_sections, symtab);
|
||||
exidx_section->fix_exidx_coverage(layout, sorted_text_sections, symtab,
|
||||
merge_exidx_entries());
|
||||
}
|
||||
|
||||
Target_selector_arm<false> target_selector_arm;
|
||||
|
Reference in New Issue
Block a user