Browse Source
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.binutils-2_33-branch
committed by
Cary Coutant
9 changed files with 438 additions and 34 deletions
@ -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; |
|||
} |
|||
@ -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" |
|||
Loading…
Reference in new issue