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>
|
2014-06-20 Marek Polacek <polacek@redhat.com>
|
||||||
|
|
||||||
* asan.c (pass_sanopt::execute): Handle IFN_UBSAN_BOUNDS.
|
* 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.
|
cheaper and enable more optimization.
|
||||||
|
|
||||||
TODO: We can also update virtual tables. */
|
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));
|
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>
|
2014-06-20 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
* gcc.target/arm/lto/lto.exp: Exit immediately if not arm*-*-* target.
|
* 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