From 624f881062a90cbd4675e7b826225c232c39050e Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Mon, 7 Apr 2008 22:46:17 +0000 Subject: [PATCH] * output.cc (Output_reloc::local_section_offset): Add addend parameter. Change caller. Handle merge sections. (Output_reloc::symbol_value): Change parameter type from Address to Addend. Don't add in the result of local_section_offset, pass down the addend and use the returned value. * output.h (class Output_reloc): Add Addend typedef. Update declarations of local_section_offset and symbol_value. * testsuite/two_file_test_1.cc (t18): New function. * testsuite/two_file_test_2.cc (f18): New function. * testsuite/two_file_test_main.cc (main): Call t18. * testsuite/two_file_test.h (t18, f18): Declare. --- gold/ChangeLog | 13 +++++++++++++ gold/output.cc | 21 +++++++++++++++------ gold/output.h | 8 +++++--- gold/testsuite/two_file_test.h | 3 +++ gold/testsuite/two_file_test_1.cc | 17 +++++++++++++++++ gold/testsuite/two_file_test_2.cc | 22 ++++++++++++++++++++++ gold/testsuite/two_file_test_main.cc | 1 + 7 files changed, 76 insertions(+), 9 deletions(-) diff --git a/gold/ChangeLog b/gold/ChangeLog index 38f8c3dfc36..6df30ff8db6 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,5 +1,18 @@ 2008-04-07 Ian Lance Taylor + * output.cc (Output_reloc::local_section_offset): Add + addend parameter. Change caller. Handle merge sections. + (Output_reloc::symbol_value): Change parameter type from + Address to Addend. Don't add in the result of + local_section_offset, pass down the addend and use the returned + value. + * output.h (class Output_reloc): Add Addend typedef. + Update declarations of local_section_offset and symbol_value. + * testsuite/two_file_test_1.cc (t18): New function. + * testsuite/two_file_test_2.cc (f18): New function. + * testsuite/two_file_test_main.cc (main): Call t18. + * testsuite/two_file_test.h (t18, f18): Declare. + * configure.ac: Don't test for objdump, c++filt, or readelf. * testsuite/Makefile.am: Remove READELF and OBJDUMP_AND_CPPFILT conditionals. diff --git a/gold/output.cc b/gold/output.cc index f3ae6784074..7a76f79377c 100644 --- a/gold/output.cc +++ b/gold/output.cc @@ -790,18 +790,27 @@ Output_reloc::get_symbol_index() return index; } -// For a local section symbol, get the section offset of the input -// section within the output section. +// For a local section symbol, get the address of the offset ADDEND +// within the input section. template section_offset_type Output_reloc:: - local_section_offset() const + local_section_offset(Addend addend) const { + gold_assert(this->local_sym_index_ != GSYM_CODE + && this->local_sym_index_ != SECTION_CODE + && this->local_sym_index_ != INVALID_CODE + && this->is_section_symbol_); const unsigned int lsi = this->local_sym_index_; section_offset_type offset; Output_section* os = this->u1_.relobj->output_section(lsi, &offset); - gold_assert(os != NULL && offset != -1); + gold_assert(os != NULL); + if (offset != -1) + return offset + addend; + // This is a merge section. + offset = os->output_address(this->u1_.relobj, lsi, addend); + gold_assert(offset != -1); return offset; } @@ -853,7 +862,7 @@ Output_reloc::write( template typename elfcpp::Elf_types::Elf_Addr Output_reloc::symbol_value( - Address addend) const + Addend addend) const { if (this->local_sym_index_ == GSYM_CODE) { @@ -882,7 +891,7 @@ Output_reloc::write( if (this->rel_.is_relative()) addend = this->rel_.symbol_value(addend); else if (this->rel_.is_local_section_symbol()) - addend += this->rel_.local_section_offset(); + addend = this->rel_.local_section_offset(addend); orel.put_r_addend(addend); } diff --git a/gold/output.h b/gold/output.h index 5a95748762a..e6977755493 100644 --- a/gold/output.h +++ b/gold/output.h @@ -779,6 +779,7 @@ class Output_reloc { public: typedef typename elfcpp::Elf_types::Elf_Addr Address; + typedef typename elfcpp::Elf_types::Elf_Addr Addend; // An uninitialized entry. We need this because we want to put // instances of this class into an STL container. @@ -835,14 +836,15 @@ class Output_reloc } // For a local section symbol, return the offset of the input - // section within the output section. + // section within the output section. ADDEND is the addend being + // applied to the input section. section_offset_type - local_section_offset() const; + local_section_offset(Addend addend) const; // Get the value of the symbol referred to by a Rel relocation when // we are adding the given ADDEND. Address - symbol_value(Address addend) const; + symbol_value(Addend addend) const; // Write the reloc entry to an output view. void diff --git a/gold/testsuite/two_file_test.h b/gold/testsuite/two_file_test.h index 32a247f1929..d89f050cd7b 100644 --- a/gold/testsuite/two_file_test.h +++ b/gold/testsuite/two_file_test.h @@ -73,3 +73,6 @@ extern bool t16a(); extern bool t17(); extern const char* t17data[]; #define T17_COUNT 5 + +extern bool t18(); +extern const char* f18(int); diff --git a/gold/testsuite/two_file_test_1.cc b/gold/testsuite/two_file_test_1.cc index 7646838cdb7..8b4c8ad4aaf 100644 --- a/gold/testsuite/two_file_test_1.cc +++ b/gold/testsuite/two_file_test_1.cc @@ -48,6 +48,7 @@ // 15 Compare wide string constants in file 1 and file 2. // 16 Call a function directly after its address has been taken. // 17 File 1 checks array of string constants defined in file 2. +// 18 File 1 checks string constants referenced in code in file 2. #include "two_file_test.h" @@ -219,3 +220,19 @@ t17() } return true; } + +// 18 File 1 checks string constants referenced in code in file 2. + +bool +t18() +{ + char c = 'a'; + for (int i = 0; i < T17_COUNT; ++i) + { + const char* s = f18(i); + if (s[0] != c || s[1] != '\0') + return false; + ++c; + } + return true; +} diff --git a/gold/testsuite/two_file_test_2.cc b/gold/testsuite/two_file_test_2.cc index 3888befb732..e1aeaf4883c 100644 --- a/gold/testsuite/two_file_test_2.cc +++ b/gold/testsuite/two_file_test_2.cc @@ -121,3 +121,25 @@ const char* t17data[T17_COUNT] = { "a", "b", "c", "d", "e" }; + +// 18 File 1 checks string constants referenced directly in file 2. + +const char* +f18(int i) +{ + switch (i) + { + case 0: + return "a"; + case 1: + return "b"; + case 2: + return "c"; + case 3: + return "d"; + case 4: + return "e"; + default: + return 0; + } +} diff --git a/gold/testsuite/two_file_test_main.cc b/gold/testsuite/two_file_test_main.cc index c69d6e0970e..b7e38385da5 100644 --- a/gold/testsuite/two_file_test_main.cc +++ b/gold/testsuite/two_file_test_main.cc @@ -52,5 +52,6 @@ main() assert(t16()); assert(t16a()); assert(t17()); + assert(t18()); return 0; } -- 2.30.2