On Tue, Feb 23, 2021 at 10:42 AM Martin Liška <mli...@suse.cz> wrote: > > Hello. > > The patch is about confusion that brings ICF when it merged 2 variables > with different alignments (when ASAN is used). > > Patch can bootstrap on x86_64-linux-gnu and survives regression tests. > > Ready to be installed?
Can't we fix the asan runtime? Does the same issue happen when merging two comdat with different alignment and LTO? > Thanks, > Martin > > gcc/ChangeLog: > > PR sanitizer/99168 > * ipa-icf.c (sem_variable::merge): Do not merge 2 variables > with different alignment. That leads to an invalid red zone > size allocated in runtime. > > gcc/testsuite/ChangeLog: > > PR sanitizer/99168 > * c-c++-common/asan/pr99168.c: New test. > --- > gcc/ipa-icf.c | 13 ++++++++++++ > gcc/testsuite/c-c++-common/asan/pr99168.c | 26 +++++++++++++++++++++++ > 2 files changed, 39 insertions(+) > create mode 100644 gcc/testsuite/c-c++-common/asan/pr99168.c > > diff --git a/gcc/ipa-icf.c b/gcc/ipa-icf.c > index 687ad8d45b7..5dd33a75c3a 100644 > --- a/gcc/ipa-icf.c > +++ b/gcc/ipa-icf.c > @@ -88,6 +88,7 @@ along with GCC; see the file COPYING3. If not see > #include "tree-vector-builder.h" > #include "symtab-thunks.h" > #include "alias.h" > +#include "asan.h" > > using namespace ipa_icf_gimple; > > @@ -2022,6 +2023,18 @@ sem_variable::merge (sem_item *alias_item) > return false; > } > > + if (DECL_ALIGN (original->decl) != DECL_ALIGN (alias->decl) > + && (sanitize_flags_p (SANITIZE_ADDRESS, original->decl) > + || sanitize_flags_p (SANITIZE_ADDRESS, alias->decl))) > + { > + if (dump_enabled_p ()) > + dump_printf (MSG_MISSED_OPTIMIZATION, > + "Not unifying; " > + "ASAN requires equal alignments for original and > alias\n"); > + > + return false; > + } > + > if (DECL_ALIGN (original->decl) < DECL_ALIGN (alias->decl)) > { > if (dump_enabled_p ()) > diff --git a/gcc/testsuite/c-c++-common/asan/pr99168.c > b/gcc/testsuite/c-c++-common/asan/pr99168.c > new file mode 100644 > index 00000000000..ed59ffb3d48 > --- /dev/null > +++ b/gcc/testsuite/c-c++-common/asan/pr99168.c > @@ -0,0 +1,26 @@ > +/* PR sanitizer/99168 */ > +/* { dg-do run } */ > + > +struct my_struct > +{ > + unsigned long volatile x; > +} __attribute__((aligned(128))); > + > +static int variablek[5][6] = {}; > +static struct my_struct variables1 = {0UL}; > +static struct my_struct variables2 __attribute__((aligned(32))) = {0UL}; > + > +int main() { > + int i, j; > + for (i = 0; i < 5; i++) { > + for (j = 0; j < 6; j++) { > + __builtin_printf("%d ", variablek[i][j]); > + } > + } > + __builtin_printf("\n"); > + > + __builtin_printf("%lu\n", variables1.x); > + __builtin_printf("%lu\n", variables2.x); > + > + return 0; > +} > -- > 2.30.1 >