localalias.c: New testcase.
* gcc.dg/localalias.c: New testcase. * gcc.dg/localalias-2.c: New testcase. * gcc.dg/globalalias.c: New testcase. * gcc.dg/globalalias-2.c: New testcase. * ipa-visibility.c (function_and_variable_visibility): Disable temporarily local aliases for some targets. From-SVN: r211864
This commit is contained in:
parent
d9ff14ea9b
commit
b48972129f
@ -1,3 +1,8 @@
|
||||
2014-06-20 Jan Hubicka <hubicka@ucw.cz>
|
||||
|
||||
* ipa-visibility.c (function_and_variable_visibility): Disable
|
||||
temporarily local aliases for some targets.
|
||||
|
||||
2014-06-20 Marek Polacek <polacek@redhat.com>
|
||||
|
||||
* asan.c (pass_sanopt::execute): Handle IFN_UBSAN_BOUNDS.
|
||||
|
@ -566,7 +566,11 @@ function_and_variable_visibility (bool whole_program)
|
||||
cheaper and enable more optimization.
|
||||
|
||||
TODO: We can also update virtual tables. */
|
||||
if (node->callers && can_replace_by_local_alias (node))
|
||||
if (node->callers
|
||||
/* FIXME: currently this optimization breaks on AIX. Disable it for targets
|
||||
without comdat support for now. */
|
||||
&& SUPPORTS_ONE_ONLY
|
||||
&& can_replace_by_local_alias (node))
|
||||
{
|
||||
struct cgraph_node *alias = cgraph (symtab_nonoverwritable_alias (node));
|
||||
|
||||
|
@ -1,3 +1,10 @@
|
||||
2014-06-20 Jan Hubicka <hubicka@ucw.cz>
|
||||
|
||||
* gcc.dg/localalias.c: New testcase.
|
||||
* gcc.dg/localalias-2.c: New testcase.
|
||||
* gcc.dg/globalalias.c: New testcase.
|
||||
* gcc.dg/globalalias-2.c: New testcase.
|
||||
|
||||
2014-06-20 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* gcc.target/arm/lto/lto.exp: Exit immediately if not arm*-*-* target.
|
||||
|
20
gcc/testsuite/gcc.dg/globalalias-2.c
Normal file
20
gcc/testsuite/gcc.dg/globalalias-2.c
Normal file
@ -0,0 +1,20 @@
|
||||
int test2count;
|
||||
extern void abort (void);
|
||||
static
|
||||
void test(void)
|
||||
{
|
||||
test2count++;
|
||||
}
|
||||
__attribute__ ((weak,noinline))
|
||||
__attribute ((alias("test")))
|
||||
void test2(void);
|
||||
|
||||
void tt()
|
||||
{
|
||||
int prev = test2count;
|
||||
/* This call must bind locally. */
|
||||
test();
|
||||
if (test2count == prev)
|
||||
abort();
|
||||
test2();
|
||||
}
|
42
gcc/testsuite/gcc.dg/globalalias.c
Normal file
42
gcc/testsuite/gcc.dg/globalalias.c
Normal file
@ -0,0 +1,42 @@
|
||||
/* This test checks that local aliases behave sanely. This is necessary for code correctness
|
||||
of aliases introduced by ipa-visibility pass.
|
||||
|
||||
This test expose weird behaviour of AIX's .set pseudo-op where the global symbol is created,
|
||||
but all uses of the alias are syntactically replaced by uses of the target. This means that
|
||||
both counters are increased to 2. */
|
||||
|
||||
/* { dg-do run }
|
||||
{ dg-options "-O2" }
|
||||
{ dg-require-alias "" }
|
||||
{ dg-xfail-if "" { powerpc-ibm-aix* } { "*" } { "" } }
|
||||
{ dg-additional-sources "globalalias-2.c" } */
|
||||
extern int test2count;
|
||||
extern void abort (void);
|
||||
int testcount;
|
||||
static
|
||||
void test(void)
|
||||
{
|
||||
testcount++;
|
||||
}
|
||||
__attribute__ ((weak,noinline))
|
||||
__attribute ((alias("test")))
|
||||
void test2(void);
|
||||
|
||||
void main()
|
||||
{
|
||||
test();
|
||||
/* This call must bind locally. */
|
||||
if (!testcount)
|
||||
abort ();
|
||||
test2();
|
||||
/* Depending on linker choice, this one may bind locally
|
||||
or to the other unit. */
|
||||
if (!testcount && !test2count)
|
||||
abort();
|
||||
tt();
|
||||
|
||||
if ((testcount != 1 || test2count != 3)
|
||||
&& (testcount != 3 || test2count != 1))
|
||||
abort ();
|
||||
return 0;
|
||||
}
|
19
gcc/testsuite/gcc.dg/localalias-2.c
Normal file
19
gcc/testsuite/gcc.dg/localalias-2.c
Normal file
@ -0,0 +1,19 @@
|
||||
extern void abort (void);
|
||||
int test2count;
|
||||
__attribute__ ((weak,noinline))
|
||||
void test(void)
|
||||
{
|
||||
test2count++;
|
||||
}
|
||||
__attribute ((alias("test")))
|
||||
static void test2(void);
|
||||
|
||||
void tt()
|
||||
{
|
||||
int prev = test2count;
|
||||
/* This call must bind locally. */
|
||||
test2();
|
||||
if (test2count == prev)
|
||||
abort();
|
||||
test();
|
||||
}
|
42
gcc/testsuite/gcc.dg/localalias.c
Normal file
42
gcc/testsuite/gcc.dg/localalias.c
Normal file
@ -0,0 +1,42 @@
|
||||
/* This test checks that local aliases behave sanely. This is necessary for code correctness
|
||||
of aliases introduced by ipa-visibility pass.
|
||||
|
||||
If this test fails either aliases needs to be disabled on given target on aliases with
|
||||
proper semantic needs to be implemented. This is problem with e.g. AIX .set pseudo-op
|
||||
that implementes alias syntactically (by substituting in assembler) rather as alternative
|
||||
symbol defined on a target's location. */
|
||||
|
||||
/* { dg-do run }
|
||||
{ dg-options "-Wstrict-aliasing=2 -fstrict-aliasing" }
|
||||
{ dg-require-alias "" }
|
||||
{ dg-xfail-if "" { powerpc-ibm-aix* } { "*" } { "" } }
|
||||
{ dg-additional-sources "localalias-2.c" } */
|
||||
extern void abort (void);
|
||||
extern int test2count;
|
||||
int testcount;
|
||||
__attribute__ ((weak,noinline))
|
||||
void test(void)
|
||||
{
|
||||
testcount++;
|
||||
}
|
||||
__attribute ((alias("test")))
|
||||
static void test2(void);
|
||||
|
||||
void main()
|
||||
{
|
||||
test2();
|
||||
/* This call must bind locally. */
|
||||
if (!testcount)
|
||||
abort ();
|
||||
test();
|
||||
/* Depending on linker choice, this one may bind locally
|
||||
or to the other unit. */
|
||||
if (!testcount && !test2count)
|
||||
abort();
|
||||
tt();
|
||||
|
||||
if ((testcount != 1 || test2count != 3)
|
||||
&& (testcount != 3 || test2count != 1))
|
||||
abort ();
|
||||
reutrn 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user