diff options
author | Joshua Oreman <oremanj@hudson-trading.com> | 2019-05-11 07:27:10 +0800 |
---|---|---|
committer | Cary Coutant <ccoutant@gmail.com> | 2019-05-11 07:27:10 +0800 |
commit | e173ea00c2941af42ea4e2267446d6039a70da6e (patch) | |
tree | c4e71d797a234be5ce51cc9e18c3d922384e7a7e /gold/testsuite | |
parent | 1367480341749b1498a6c5e7a7b79c7a4ab4ed34 (diff) | |
download | gdb-e173ea00c2941af42ea4e2267446d6039a70da6e.zip gdb-e173ea00c2941af42ea4e2267446d6039a70da6e.tar.gz gdb-e173ea00c2941af42ea4e2267446d6039a70da6e.tar.bz2 |
Fix problem with ICF where diffs in EH frame info is ignored.
PR gold/21066
* gc.h (gc_process_relocs): Track relocations in .eh_frame sections
when ICF is enabled, even though the .eh_frame sections themselves
are not foldable.
* icf.cc (get_section_contents): Change arguments to permit operation
on just part of a section. Include extra identity regions in the
referring section's contents recursively.
(match_sections): Lock object here instead of in get_section_contents
so that get_section_contents can operate recursively.
(Icf::add_ehframe_links): New method.
(Icf::find_identical_sections): Pass .eh_frame sections to
add_ehframe_links(). Increase default iteration count from 2 to 3
because handling exception info typically requires one extra iteration.
* icf.h (Icf::extra_identity_list_): New data member with accessor.
(is_section_foldable_candidate): Include .gcc_except_table sections.
* options.h: Update documentation for new default ICF iteration count.
* testsuite/Makefile.am (icf_test_pr21066): New test case.
* testsuite/Makefile.in: Regenerate.
* testsuite/icf_test_pr21066.cc: New source file.
* testsuite/icf_test_pr21066.sh: New test script.
Diffstat (limited to 'gold/testsuite')
-rw-r--r-- | gold/testsuite/Makefile.am | 10 | ||||
-rw-r--r-- | gold/testsuite/Makefile.in | 19 | ||||
-rw-r--r-- | gold/testsuite/icf_test_pr21066.cc | 67 | ||||
-rwxr-xr-x | gold/testsuite/icf_test_pr21066.sh | 48 |
4 files changed, 143 insertions, 1 deletions
diff --git a/gold/testsuite/Makefile.am b/gold/testsuite/Makefile.am index e499177..4c26f33 100644 --- a/gold/testsuite/Makefile.am +++ b/gold/testsuite/Makefile.am @@ -278,6 +278,16 @@ icf_test: icf_test.o gcctestdir/ld icf_test.map: icf_test @touch icf_test.map +check_SCRIPTS += icf_test_pr21066.sh +check_DATA += icf_test_pr21066.map +MOSTLYCLEANFILES += icf_test_pr21066 icf_test_pr21066.map +icf_test_pr21066.o: icf_test_pr21066.cc + $(CXXCOMPILE) -O0 -c -ffunction-sections -g -o $@ $< +icf_test_pr21066: icf_test_pr21066.o gcctestdir/ld + $(CXXLINK) -o icf_test_pr21066 -Bgcctestdir/ -Wl,--icf=all,-Map,icf_test_pr21066.map icf_test_pr21066.o +icf_test_pr21066.map: icf_test_pr21066 + @touch icf_test_pr21066.map + check_SCRIPTS += icf_keep_unique_test.sh check_DATA += icf_keep_unique_test.stdout MOSTLYCLEANFILES += icf_keep_unique_test diff --git a/gold/testsuite/Makefile.in b/gold/testsuite/Makefile.in index a5b109b..dac0db2 100644 --- a/gold/testsuite/Makefile.in +++ b/gold/testsuite/Makefile.in @@ -129,7 +129,7 @@ check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ gc_orphan_section_test.sh \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ pr14265.sh pr20717.sh \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ gc_dynamic_list_test.sh \ -@GCC_TRUE@@NATIVE_LINKER_TRUE@ icf_test.sh \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ icf_test.sh icf_test_pr21066.sh \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ icf_keep_unique_test.sh \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ icf_safe_test.sh \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ icf_safe_pie_test.sh \ @@ -152,6 +152,7 @@ check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ pr14265.stdout pr20717.stdout \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ gc_dynamic_list_test.stdout \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ icf_test.map \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ icf_test_pr21066.map \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ icf_keep_unique_test.stdout \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ icf_safe_test_1.stdout \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ icf_safe_test_2.stdout \ @@ -182,6 +183,8 @@ check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ gc_orphan_section_test pr14265 \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ pr20717 gc_dynamic_list_test \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ icf_test icf_test.map \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ icf_test_pr21066 \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ icf_test_pr21066.map \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ icf_keep_unique_test \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ icf_safe_test icf_safe_test.map \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ icf_safe_pie_test \ @@ -2705,6 +2708,7 @@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -5517,6 +5521,13 @@ icf_test.sh.log: icf_test.sh --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) +icf_test_pr21066.sh.log: icf_test_pr21066.sh + @p='icf_test_pr21066.sh'; \ + b='icf_test_pr21066.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) icf_keep_unique_test.sh.log: icf_keep_unique_test.sh @p='icf_keep_unique_test.sh'; \ b='icf_keep_unique_test.sh'; \ @@ -7935,6 +7946,12 @@ uninstall-am: @GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXLINK) -o icf_test -Wl,--icf=all,-Map,icf_test.map icf_test.o @GCC_TRUE@@NATIVE_LINKER_TRUE@icf_test.map: icf_test @GCC_TRUE@@NATIVE_LINKER_TRUE@ @touch icf_test.map +@GCC_TRUE@@NATIVE_LINKER_TRUE@icf_test_pr21066.o: icf_test_pr21066.cc +@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXCOMPILE) -O0 -c -ffunction-sections -g -o $@ $< +@GCC_TRUE@@NATIVE_LINKER_TRUE@icf_test_pr21066: icf_test_pr21066.o gcctestdir/ld +@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXLINK) -o icf_test_pr21066 -Bgcctestdir/ -Wl,--icf=all,-Map,icf_test_pr21066.map icf_test_pr21066.o +@GCC_TRUE@@NATIVE_LINKER_TRUE@icf_test_pr21066.map: icf_test_pr21066 +@GCC_TRUE@@NATIVE_LINKER_TRUE@ @touch icf_test_pr21066.map @GCC_TRUE@@NATIVE_LINKER_TRUE@icf_keep_unique_test.o: icf_keep_unique_test.cc @GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXCOMPILE) -O0 -c -ffunction-sections -g -o $@ $< @GCC_TRUE@@NATIVE_LINKER_TRUE@icf_keep_unique_test: icf_keep_unique_test.o gcctestdir/ld diff --git a/gold/testsuite/icf_test_pr21066.cc b/gold/testsuite/icf_test_pr21066.cc new file mode 100644 index 0000000..568873d --- /dev/null +++ b/gold/testsuite/icf_test_pr21066.cc @@ -0,0 +1,67 @@ +// icf_test.cc -- a test case for gold + +// Copyright (C) 2009-2018 Free Software Foundation, Inc. +// Test case from PR 21066 submitted by Gandhi Shaheen + +// This file is part of gold. + +// 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 3 of the License, or +// (at your option) any later version. + +// 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 this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, +// MA 02110-1301, USA. + +// The goal of this program is to verify if identical code folding +// correctly identifies and folds functions. folded_func must be +// folded into kept_func. + +// Written by Sriraman Tallam <tmsriram@google.com>. + +#include <stdio.h> + +struct first_exception { +}; + +struct second_exception { +}; + +typedef void (*callback_fn_t)(); + +void raise_first_exception() +{ + throw first_exception(); +} + +void raise_second_exception() +{ + throw second_exception(); +} + +template<typename E> +void capture_exception_of_type(volatile callback_fn_t f) +{ + try { + f(); + } catch (E& e) { + puts("caught expected exception"); + } catch (...) { + puts("ERROR: caught unexpected exception"); + throw; + } +} + +int main() +{ + capture_exception_of_type<first_exception>(raise_first_exception); + capture_exception_of_type<second_exception>(raise_second_exception); + return 0; +} diff --git a/gold/testsuite/icf_test_pr21066.sh b/gold/testsuite/icf_test_pr21066.sh new file mode 100755 index 0000000..2f3e85d --- /dev/null +++ b/gold/testsuite/icf_test_pr21066.sh @@ -0,0 +1,48 @@ +#!/bin/sh + +# icf_test_pr21066.sh -- regression test for ICF tracking exception handling +# metadata differences + +# Copyright (C) 2009-2018 Free Software Foundation, Inc. +# Written by Joshua Oreman <oremanj@hudson-trading.com>, based on icf_test.sh + +# This file is part of gold. + +# 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 3 of the License, or +# (at your option) any later version. + +# 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 this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, +# MA 02110-1301, USA. + +set -e + +check() +{ + awk " +BEGIN { discard = 0; } +/^Discarded input/ { discard = 1; } +/^Memory map/ { discard = 0; } +/.*\\.text\\..*capture_exception_of_type.*($2|$3).*/ { + act[discard] = act[discard] \" \" \$0; +} +END { + # printf \"kept\" act[0] \"\\nfolded\" act[1] \"\\n\"; + if (length(act[0]) != 0 && length(act[1]) != 0) + { + printf \"Identical Code Folding improperly folded functions\\n\" + printf \"with same code but different .gcc_except_table\\n\" + exit 1; + } + }" $1 +} + +check icf_test_pr21066.map "first_exception" "second_exception" |